chromosomix 0.18.0 → 0.19.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/README.md +31 -6
- package/dist/THIRD-PARTY-NOTICES.txt +2 -2
- package/dist/assets/{ConnectCard-CNwlR_yV.js → ConnectCard-Cs0rIBEC.js} +1 -1
- package/dist/assets/{Tour-Dn4L7jES.js → Tour-B3qRVNiU.js} +1 -1
- package/dist/assets/analysis.worker-CC07Gv-8.js +8 -0
- package/dist/assets/{annotations.worker-Bd03nKdJ.js → annotations.worker-Dkfm4-Th.js} +26 -26
- package/dist/assets/index-CPxipgOR.js +579 -0
- package/dist/assets/index-D34Q3Ivo.css +1 -0
- package/dist/assets/{reader.worker-DKXrm0nO.js → reader.worker-BqZlpJND.js} +1 -1
- package/dist/assets/{three-BZagS2ne.js → three-Cfa_LIWm.js} +1 -1
- package/dist/assets/{tutorial-DOptkiKU.js → tutorial-DNkh-qGr.js} +1 -1
- package/dist/assets/workspace-8e1ZWdoH.js +12 -0
- package/dist/index.html +2 -2
- package/dist-cli/THIRD-PARTY-NOTICES.txt +2 -2
- package/dist-cli/chromosomix.mjs +4009 -1076
- package/package.json +5 -1
- package/dist/assets/analysis.worker-2Jx8_NWN.js +0 -8
- package/dist/assets/index-BZqg8J4S.js +0 -106
- package/dist/assets/index-Cxw-esX1.css +0 -1
- package/dist/assets/workspace-ZYKuBclx.js +0 -15
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
async function Je(t){return t.bytes?t.bytes():new Uint8Array(await t.arrayBuffer())}const rc=50;async function Ts(t,e){const n=t.headers.get("content-length"),A=n?parseInt(n,10):void 0,s=t.body;if(!s||A===void 0){const c=await Je(t);return e(c.byteLength,A??c.byteLength),c}const r=s.getReader();let o=new Uint8Array(A),i=0,a=0;e(0,A);for(let c=await r.read();!c.done;c=await r.read()){if(i+c.value.byteLength>o.length){const g=new Uint8Array(Math.max(i+c.value.byteLength,o.length*2));g.set(o.subarray(0,i)),o=g}o.set(c.value,i),i+=c.value.byteLength;const l=Date.now();l-a>=rc&&(a=l,e(i,A))}return e(i,A),i===o.length?o:o.subarray(0,i)}class oc{blob;constructor(e){this.blob=e}async read(e,n=0){return e===0?new Uint8Array(0):Je(this.blob.slice(n,n+e))}async readFile(e){const n=typeof e=="string"?e:e?.encoding;if(n==="utf8")return this.blob.text();if(n)throw new Error(`unsupported encoding: ${n}`);return Je(this.blob)}stat(){return Promise.resolve({size:this.blob.size})}close(){return Promise.resolve()}}function ic(t){return(typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"?t.message:`${t}`).replace(/\.$/,"")}class Do{url;_stat;fetchImplementation;baseHeaders;baseOverrides;constructor(e,n={}){this.url=e,this.baseHeaders=n.headers??{},this.baseOverrides=n.overrides??{},this.fetchImplementation=n.fetch??globalThis.fetch.bind(globalThis)}buildRequest(e,n){return{...this.baseOverrides,...e.overrides,headers:{...this.baseHeaders,...e.headers,...n},method:"GET",redirect:"follow",mode:"cors",signal:e.signal}}async fetch(e,n){const A=r=>new Error(`${ic(r)} fetching ${e}`,{cause:r});let s;try{s=await this.fetchImplementation(e,n)}catch(r){if(`${r}`.includes("Failed to fetch")){console.warn(`generic-filehandle: refetching ${e} to attempt to work around chrome CORS header caching bug`);try{s=await this.fetchImplementation(e,{...n,cache:"reload"})}catch(o){throw A(o)}}else throw A(r)}return s}async read(e,n,A={}){if(e===0)return new Uint8Array(0);if(Number.isNaN(e)||Number.isNaN(n))throw new TypeError(`read() called with NaN length or position (length=${e}, position=${n}). The index file may be corrupt.`);const s=await this.fetch(this.url,this.buildRequest(A,{range:`bytes=${n}-${n+e-1}`}));if(s.status===416)return new Uint8Array(0);if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(s.status===200&&n===0||s.status===206){const r=s.headers.get("content-range"),o=/\/(\d+)$/.exec(r??"");o?.[1]&&(this._stat={size:parseInt(o[1],10)});const i=A.onProgress?await Ts(s,A.onProgress):await Je(s);return!this._stat&&s.status===200&&(this._stat={size:i.byteLength}),i.byteLength<=e?i:i.subarray(0,e)}throw new Error(s.status===200?`${this.url} fetch returned status 200, expected 206`:`HTTP ${s.status} fetching ${this.url}`)}async readFile(e={}){const n=typeof e=="string"?e:e.encoding,A=typeof e=="string"?{}:e,s=await this.fetch(this.url,this.buildRequest(A));if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(n==="utf8")return s.text();if(n)throw new Error(`unsupported encoding: ${n}`);return A.onProgress?Ts(s,A.onProgress):Je(s)}async stat(){return this._stat||await this.read(10,0),this._stat??{size:0}}close(){return Promise.resolve()}}class ac{readFile(){return Promise.reject(new Error("unimplemented"))}read(){return Promise.reject(new Error("unimplemented"))}stat(){return Promise.reject(new Error("unimplemented"))}close(){return Promise.reject(new Error("unimplemented"))}}class cc{}class lc{constructor(){this.signals=new Set,this.abortController=new AbortController}addSignal(e=new cc){if(this.signal.aborted)throw new Error("cannot add a signal, already aborted!");this.signals.add(e),e.aborted?this.handleAborted(e):typeof e.addEventListener=="function"&&e.addEventListener("abort",()=>{this.handleAborted(e)})}handleAborted(e){this.signals.delete(e),this.signals.size===0&&this.abortController.abort()}get signal(){return this.abortController.signal}abort(){this.abortController.abort()}}class gc{constructor(){this.callbacks=new Set}addCallback(e=()=>{}){this.callbacks.add(e),this.currentMessage&&e(this.currentMessage)}callback(e){this.currentMessage=e;for(const n of this.callbacks)n(e)}}class Bn{constructor({fill:e,cache:n}){if(typeof e!="function")throw new TypeError("must pass a fill function");if(typeof n!="object")throw new TypeError("must pass a cache object");if(typeof n.get!="function"||typeof n.set!="function"||typeof n.delete!="function")throw new TypeError("cache must implement get(key), set(key, val), and and delete(key)");this.cache=n,this.fillCallback=e}static isAbortException(e){return e.name==="AbortError"||e.code==="ERR_ABORTED"||e.message==="AbortError: aborted"||e.message==="Error: aborted"}evict(e,n){this.cache.get(e)===n&&this.cache.delete(e)}fill(e,n,A,s){const r=new lc,o=new gc;o.addCallback(s);const i={aborter:r,promise:this.fillCallback(n,r.signal,a=>{o.callback(a)}),settled:!1,statusReporter:o,get aborted(){return this.aborter.signal.aborted}};i.aborter.addSignal(A),i.aborter.signal.addEventListener("abort",()=>{i.settled||this.evict(e,i)}),i.promise.then(()=>{i.settled=!0},()=>{i.settled=!0,this.evict(e,i)}).catch(a=>{throw console.error(a),a}),this.cache.set(e,i)}static checkSinglePromise(e,n){function A(){if(n?.aborted)throw Object.assign(new Error("aborted"),{code:"ERR_ABORTED"})}return e.then(s=>(A(),s),s=>{throw A(),s})}has(e){return this.cache.has(e)}get(e,n,A,s){if(!A&&n instanceof AbortSignal)throw new TypeError("second get argument appears to be an AbortSignal, perhaps you meant to pass `null` for the fill data?");const r=this.cache.get(e);return r?r.aborted&&!r.settled?(this.evict(e,r),this.get(e,n,A,s)):r.settled?r.promise:(r.aborter.addSignal(A),r.statusReporter.addCallback(s),Bn.checkSinglePromise(r.promise,A)):(this.fill(e,n,A,s),Bn.checkSinglePromise(this.cache.get(e).promise,A))}delete(e){const n=this.cache.get(e);n&&(n.settled||n.aborter.abort(),this.cache.delete(e))}clear(){const e=this.cache.keys();let n=0;for(let A=e.next();!A.done;A=e.next())this.delete(A.value),n+=1;return n}}var X=function(t,e,n,A,s){if(A==="m")throw new TypeError("Private method is not writable");if(A==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return A==="a"?s.call(t,n):s?s.value=n:e.set(t,n),n},M=function(t,e,n,A){if(n==="a"&&!A)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!A:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?A:n==="a"?A.call(t):A?A.value:e.get(t)},O,ot,_,W,qt,be,Ht,Xe,ut,Js,zn,Xn,Vn,$s,Ve;class fc extends Map{constructor(e={}){if(super(),O.add(this),ot.set(this,0),_.set(this,new Map),W.set(this,new Map),qt.set(this,void 0),be.set(this,void 0),Ht.set(this,void 0),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof e.maxAge=="number"&&e.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");X(this,qt,e.maxSize,"f"),X(this,be,e.maxAge||Number.POSITIVE_INFINITY,"f"),X(this,Ht,e.onEviction,"f")}get __oldCache(){return M(this,W,"f")}get(e){if(M(this,_,"f").has(e)){const n=M(this,_,"f").get(e);return M(this,O,"m",zn).call(this,e,n)}if(M(this,W,"f").has(e)){const n=M(this,W,"f").get(e);if(!M(this,O,"m",ut).call(this,e,n))return M(this,O,"m",$s).call(this,e,n),n.value}}set(e,n,{maxAge:A=M(this,be,"f")}={}){const s=typeof A=="number"&&A!==Number.POSITIVE_INFINITY?Date.now()+A:void 0;return M(this,_,"f").has(e)?M(this,_,"f").set(e,{value:n,expiry:s}):M(this,O,"m",Vn).call(this,e,{value:n,expiry:s}),this}has(e){return M(this,_,"f").has(e)?!M(this,O,"m",ut).call(this,e,M(this,_,"f").get(e)):M(this,W,"f").has(e)?!M(this,O,"m",ut).call(this,e,M(this,W,"f").get(e)):!1}peek(e){if(M(this,_,"f").has(e))return M(this,O,"m",Xn).call(this,e,M(this,_,"f"));if(M(this,W,"f").has(e))return M(this,O,"m",Xn).call(this,e,M(this,W,"f"))}expiresIn(e){const n=M(this,_,"f").get(e)??M(this,W,"f").get(e);if(n)return n.expiry?n.expiry-Date.now():Number.POSITIVE_INFINITY}delete(e){var n;const A=M(this,_,"f").delete(e);return A&&X(this,ot,(n=M(this,ot,"f"),n--,n),"f"),M(this,W,"f").delete(e)||A}clear(){M(this,_,"f").clear(),M(this,W,"f").clear(),X(this,ot,0,"f")}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");const n=[...M(this,O,"m",Ve).call(this)],A=n.length-e;A<0?(X(this,_,new Map(n),"f"),X(this,W,new Map,"f"),X(this,ot,n.length,"f")):(A>0&&M(this,O,"m",Xe).call(this,n.slice(0,A)),X(this,W,new Map(n.slice(A)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f")),X(this,qt,e,"f")}evict(e=1){const n=e;if(!n||n<=0)return;const A=[...M(this,O,"m",Ve).call(this)],s=Math.trunc(Math.min(n,Math.max(A.length-1,0)));s<=0||(M(this,O,"m",Xe).call(this,A.slice(0,s)),X(this,W,new Map(A.slice(s)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f"))}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[(ot=new WeakMap,_=new WeakMap,W=new WeakMap,qt=new WeakMap,be=new WeakMap,Ht=new WeakMap,O=new WeakSet,Xe=function(n){if(typeof M(this,Ht,"f")=="function")for(const[A,s]of n)M(this,Ht,"f").call(this,A,s.value)},ut=function(n,A){return typeof A.expiry=="number"&&A.expiry<=Date.now()?(typeof M(this,Ht,"f")=="function"&&M(this,Ht,"f").call(this,n,A.value),this.delete(n)):!1},Js=function(n,A){if(!M(this,O,"m",ut).call(this,n,A))return A.value},zn=function(n,A){return A.expiry?M(this,O,"m",Js).call(this,n,A):A.value},Xn=function(n,A){const s=A.get(n);return M(this,O,"m",zn).call(this,n,s)},Vn=function(n,A){var s;M(this,_,"f").set(n,A),X(this,ot,(s=M(this,ot,"f"),s++,s),"f"),M(this,ot,"f")>=M(this,qt,"f")&&(X(this,ot,0,"f"),M(this,O,"m",Xe).call(this,M(this,W,"f")),X(this,W,M(this,_,"f"),"f"),X(this,_,new Map,"f"))},$s=function(n,A){M(this,W,"f").delete(n),M(this,O,"m",Vn).call(this,n,A)},Ve=function*(){for(const n of M(this,W,"f")){const[A,s]=n;M(this,_,"f").has(A)||M(this,O,"m",ut).call(this,A,s)||(yield n)}for(const n of M(this,_,"f")){const[A,s]=n;M(this,O,"m",ut).call(this,A,s)||(yield n)}},Symbol.iterator)](){for(const e of M(this,_,"f")){const[n,A]=e;M(this,O,"m",ut).call(this,n,A)||(yield[n,A.value])}for(const e of M(this,W,"f")){const[n,A]=e;M(this,_,"f").has(n)||M(this,O,"m",ut).call(this,n,A)||(yield[n,A.value])}}*entriesDescending(){let e=[...M(this,_,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;M(this,O,"m",ut).call(this,s,r)||(yield[s,r.value])}e=[...M(this,W,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;M(this,_,"f").has(s)||M(this,O,"m",ut).call(this,s,r)||(yield[s,r.value])}}*entriesAscending(){for(const[e,n]of M(this,O,"m",Ve).call(this))yield[e,n.value]}get size(){if(!M(this,ot,"f"))return M(this,W,"f").size;let e=0;for(const n of M(this,W,"f").keys())M(this,_,"f").has(n)||e++;return Math.min(M(this,ot,"f")+e,M(this,qt,"f"))}get maxSize(){return M(this,qt,"f")}get maxAge(){return M(this,be,"f")}entries(){return this.entriesAscending()}forEach(e,n=this){for(const[A,s]of this.entriesAscending())e.call(n,s,A,this)}get[Symbol.toStringTag](){return"QuickLRU"}toString(){return`QuickLRU(${this.size}/${this.maxSize})`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}}function hc(t){if(t.length===0)return[];const e=t.toSorted((s,r)=>s.min-r.min),n=[];let A=e[0];for(let s=1;s<e.length;s++){const r=e[s];r.min>A.max+1?(n.push(A),A=r):r.max>A.max&&(A={min:A.min,max:r.max})}return n.push(A),n}var uc={},Ys={};function gt(t){var e=Ys[t];if(e!==void 0)return e.exports;var n=Ys[t]={exports:{}};return uc[t](n,n.exports,gt),n.exports}(()=>{var t=Object.getPrototypeOf?n=>Object.getPrototypeOf(n):n=>n.__proto__,e;gt.t=function(n,A){if(A&1&&(n=this(n)),A&8||typeof n=="object"&&n&&(A&4&&n.__esModule||A&16&&typeof n.then=="function"))return n;var s=Object.create(null);gt.r(s);var r={};e=e||[null,t({}),t([]),t(t)];for(var o=A&2&&n;(typeof o=="object"||typeof o=="function")&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach(i=>r[i]=()=>n[i]);return r.default=()=>n,gt.d(s,r),s}})();gt.d=(t,e)=>{for(var n in e)gt.o(e,n)&&!gt.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})};gt.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);gt.r=t=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var VA={};gt.r(VA);gt.d(VA,{__wbg_Error_ef53bc310eb298a0:()=>Qc,__wbg_set_wasm:()=>jA,decompress_and_parse_bigwig:()=>Fo,decompress_and_parse_summary:()=>So,inflate_raw:()=>dc,inflate_raw_batch:()=>Ro,inflate_raw_unknown_size:()=>Cc});const Mo="data:application/wasm;base64,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AkH4AXEiAkGAncAAaiEGIAJBiJ3AAGooAgAhAgsgBiAANgIIIAIgADYCDCAAIAY2AgwgACACNgIIDAELIAggAiADaiIAQQNyNgIEIAggAGoiACAAKAIEQQFyNgIECyAIQQhqIgANAQsCQAJAAkACQAJAAkBBACgCkJ9AIgAgA08NAAJAQQAoApSfQCIAIANLDQAgAUEEakG0n8AAIANBr4AEakGAgHxxECMCQCABKAIEIgYNAEEAIQAMCAsgASgCDCEFQQBBACgCoJ9AIAEoAggiCWoiADYCoJ9AQQAgAEEAKAKkn0AiAiAAIAJLGzYCpJ9AAkACQAJAQQAoApyfQCICRQ0AQfCcwAAhAANAIAYgACgCACIIIAAoAgQiB2pGDQIgACgCCCIADQAMAwsLAkACQEEAKAKsn0AiAEUNACAGIABPDQELQQAgBjYCrJ9AC0EAQf8fNgKwn0BBACAFNgL8nEBBACAJNgL0nEBBACAGNgLwnEBBAEGAncAANgKMnUBBAEGIncAANgKUnUBBAEGAncAANgKInUBBAEGQncAANgKcnUBBAEGIncAANgKQnUBBAEGYncAANgKknUBBAEGQncAANgKYnUBBAEGgncAANgKsnUBBAEGYncAANgKgnUBBAEGoncAANgK0nUBBAEGgncAANgKonUBBAEGwncAANgK8nUBBAEGoncAANgKwnUBBAEG4ncAANgLEnUBBAEGwncAANgK4nUBBAEHAncAANgLMnUBBAEG4ncAANgLAnUBBAEHAncAANgLInUBBAEHIncAANgLUnUBBAEHIncAANgLQnUBBAEHQncAANgLcnUBBAEHQncAANgLYnUBBAEHYncAANgLknUBBAEHYncAANgLgnUBBAEHgncAANgLsnUBBAEHgncAANgLonUBBAEHoncAANgL0nUBBAEHoncAANgLwnUBBAEHwncAANgL8nUBBAEHwncAANgL4nUBBAEH4ncAANgKEnkBBAEH4ncAANgKAnkBBAEGAnsAANgKMnkBBAEGInsAANgKUnkBBAEGAnsAANgKInkBBAEGQnsAANgKcnkBBAEGInsAANgKQnkBBAEGYnsAANgKknkBBAEGQnsAANgKYnkBBAEGgnsAANgKsnkBBAEGYnsAANgKgnkBBAEGonsAANgK0nkBBAEGgnsAANgKonkBBAEGwnsAANgK8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bGVkOiDAAMACOiDAAC9ydXN0Yy84YmFiMjZmNGY2OGUwZTI2ZjBiYjc5NjBiZTMzNGQ1YjUyMGVhNDUyL2xpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvcndsb2NrL25vX3RocmVhZHMucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMjIvc3JjL2V4dGVybnJlZi5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi4xMy9zcmMvZGxtYWxsb2MucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbGliZGVmbGF0ZXItMS4yNS4yL3NyYy9saWIucnMAY29tcHJlc3NlZCBibG9jayBleHRlbmRzIHBhc3QgdGhlIGlucHV0IGJ1ZmZlcmJsb2NrIG9mZnNldCBvdmVyZmxvd3NibG9jayBpcyBzaG9ydGVyIHRoYW4gdGhlIDItYnl0ZSB6bGliIGhlYWRlcgAAAM4CEAAKAAAAUQAAAAsAAADOAhAACgAAAGcAAAALAAAAzgIQAAoAAABZAAAAPQAAAM4CEAAKAAAAYgAAACsAAADOAhAACgAAAFwAAAAPAAAAZGVjb21wcmVzc2lvbiBvdXRwdXQgdG9vIGxhcmdlAADOAhAACgAAAJIAAAA9AAAAzgIQAAoAAACYAAAAHQAAAM4CEAAKAAAAAQEAAD0AAADOAhAACgAAAAcBAAAdAAAAQmFkRGF0YUluc3VmZmljaWVudFNwYWNllQEQAGcAAACEAAAAEQAAAJUBEABnAAAAkgAAABEAAABsaWJkZWZsYXRlX2RlZmxhdGVfZGVjb21wcmVzcyByZXR1cm5lZCBhbiB1bmtub3du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IG1heF9vdmVyaGVhZAAATgIQACoAAAC3BAAADQAAAHJ3bG9jayBvdmVyZmxvd2VkIHJlYWQgbG9ja3M3ARAAXQAAABUAAAAsAAAAAAAAAAgAAAAEAAAAFQAAAAkAAAAMAAAABAAAABYAAAByd2xvY2sgaGFzIG5vdCBiZWVuIGxvY2tlZCBmb3IgcmVhZGluZwAANwEQAF0AAAA+AAAACQAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/QEQAFAAAAAcAAAABQAAABcAAAAMAAAABAAAABgAAAAZAAAAGgAAAAAAAAAAAAAAAQAAABsAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdAAA7gAQAEgAAACPAgAADgAAAEVycm9yMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlSZWZDZWxsIGFscmVhZHkgYm9ycm93ZWQAQaybwAALBAQAAAAAKQRuYW1lASIBXx9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAEgJcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkCBndhbHJ1cwYwLjI2LjIMd2FzbS1iaW5kZ2VuEzAuMi4xMjIgKGRkZDMyMjUxNCk=";var Ic=gt.t(Mo);function Fo(t,e,n,A,s,r){try{const g=U.__wbindgen_add_to_stack_pointer(-16),f=qe(t,U.__wbindgen_export),h=it,u=Be(e,U.__wbindgen_export),I=it,d=Be(n,U.__wbindgen_export),C=it;U.decompress_and_parse_bigwig(g,f,h,u,I,d,C,A,s,r);var o=z().getInt32(g+0,!0),i=z().getInt32(g+4,!0),a=z().getInt32(g+8,!0),c=z().getInt32(g+12,!0);if(c)throw He(a);var l=Ke(o,i).slice();return U.__wbindgen_export2(o,i*1,1),l}finally{U.__wbindgen_add_to_stack_pointer(16)}}function So(t,e,n,A,s,r,o){try{const f=U.__wbindgen_add_to_stack_pointer(-16),h=qe(t,U.__wbindgen_export),u=it,I=Be(e,U.__wbindgen_export),d=it,C=Be(n,U.__wbindgen_export),E=it;U.decompress_and_parse_summary(f,h,u,I,d,C,E,A,s,r,o);var i=z().getInt32(f+0,!0),a=z().getInt32(f+4,!0),c=z().getInt32(f+8,!0),l=z().getInt32(f+12,!0);if(l)throw He(c);var g=Ke(i,a).slice();return U.__wbindgen_export2(i,a*1,1),g}finally{U.__wbindgen_add_to_stack_pointer(16)}}function dc(t,e){try{const i=U.__wbindgen_add_to_stack_pointer(-16),a=qe(t,U.__wbindgen_export),c=it;U.inflate_raw(i,a,c,e);var n=z().getInt32(i+0,!0),A=z().getInt32(i+4,!0),s=z().getInt32(i+8,!0),r=z().getInt32(i+12,!0);if(r)throw He(s);var o=Ke(n,A).slice();return U.__wbindgen_export2(n,A*1,1),o}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Ro(t,e,n,A){try{const c=U.__wbindgen_add_to_stack_pointer(-16),l=qe(t,U.__wbindgen_export),g=it,f=Be(e,U.__wbindgen_export),h=it,u=Be(n,U.__wbindgen_export),I=it;U.inflate_raw_batch(c,l,g,f,h,u,I,A);var s=z().getInt32(c+0,!0),r=z().getInt32(c+4,!0),o=z().getInt32(c+8,!0),i=z().getInt32(c+12,!0);if(i)throw He(o);var a=Ke(s,r).slice();return U.__wbindgen_export2(s,r*1,1),a}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Cc(t){try{const o=U.__wbindgen_add_to_stack_pointer(-16),i=qe(t,U.__wbindgen_export),a=it;U.inflate_raw_unknown_size(o,i,a);var e=z().getInt32(o+0,!0),n=z().getInt32(o+4,!0),A=z().getInt32(o+8,!0),s=z().getInt32(o+12,!0);if(s)throw He(A);var r=Ke(e,n).slice();return U.__wbindgen_export2(e,n*1,1),r}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Qc(t,e){const n=Error(mc(t,e));return Bc(n)}function Bc(t){Ue===Ft.length&&Ft.push(Ft.length+1);const e=Ue;return Ue=Ft[e],Ft[e]=t,e}function Ec(t){t<1028||(Ft[t]=Ue,Ue=t)}function Ke(t,e){return t=t>>>0,ZA().subarray(t/1,t/1+e)}let ae=null;function z(){return(ae===null||ae.buffer.detached===!0||ae.buffer.detached===void 0&&ae.buffer!==U.memory.buffer)&&(ae=new DataView(U.memory.buffer)),ae}function mc(t,e){return Nc(t>>>0,e)}let Ze=null;function wc(){return(Ze===null||Ze.byteLength===0)&&(Ze=new Uint32Array(U.memory.buffer)),Ze}let je=null;function ZA(){return(je===null||je.byteLength===0)&&(je=new Uint8Array(U.memory.buffer)),je}function pc(t){return Ft[t]}let Ft=new Array(1024).fill(void 0);Ft.push(void 0,null,!0,!1);let Ue=Ft.length;function Be(t,e){const n=e(t.length*4,4)>>>0;return wc().set(t,n/4),it=t.length,n}function qe(t,e){const n=e(t.length*1,1)>>>0;return ZA().set(t,n/1),it=t.length,n}function He(t){const e=pc(t);return Ec(t),e}let ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});ln.decode();const yc=2146435072;let Zn=0;function Nc(t,e){return Zn+=e,Zn>=yc&&(ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),ln.decode(),Zn=e),ln.decode(ZA().subarray(t,t+e))}let it=0,U;function jA(t){U=t}jA(Ic);let tn=null,jn=null;async function ts(){return tn||(jn||(jn=(async()=>{const e=await(await fetch(Mo)).arrayBuffer(),{instance:n}=await WebAssembly.instantiate(e,{"./inflate_wasm_bg.js":VA});return jA(n.exports),tn=n.exports,tn})()),jn)}async function kc(t,e,n,A){await ts();const s=Ro(t,e,n,A),r=new DataView(s.buffer,s.byteOffset,s.byteLength),o=r.getUint32(0,!0),i=4,a=i+(o+1)*4,c=new Array(o+1);for(let g=0;g<=o;g++)c[g]=r.getUint32(i+g*4,!0);return{data:s.subarray(a),offsets:c}}function bc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n)}}function Dc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0),minScores:new Float32Array(0),maxScores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4,o=r+n*4,i=o+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n),minScores:new Float32Array(t.buffer,t.byteOffset+o,n),maxScores:new Float32Array(t.buffer,t.byteOffset+i,n)}}async function Mc(t,e,n,A,s,r){await ts();const o=Fo(t,e,n,A,s,r);return bc(o)}async function Fc(t,e,n,A,s,r,o){await ts();const i=So(t,e,n,A,s,r,o);return Dc(i)}function es(t){const e=new Uint32Array(t.length),n=new Uint32Array(t.length);for(let A=0;A<t.length;A++){const s=t[A];e[A]=s.offset,n[A]=s.length}return{inputOffsets:e,inputLengths:n}}async function Sc(t,e,n){const{inputOffsets:A,inputLengths:s}=es(e);return kc(t,A,s,n)}async function Rc(t,e,n,A,s){const{inputOffsets:r,inputLengths:o}=es(e);return Mc(t,r,o,n,A,s)}async function Lc(t,e,n,A,s,r){const{inputOffsets:o,inputLengths:i}=es(e);return Fc(t,o,i,n,A,s,r)}const ns=new TextDecoder("utf8");function rt(t,e=0){return new DataView(t.buffer,t.byteOffset+e,t.length-e)}function j(t,e){return t.getUint32(e,!0)+t.getUint32(e+4,!0)*2**32}function dA(t,e,n){const A=t.indexOf(0,e),s=A!==-1&&A<e+n?A:e+n;return ns.decode(t.subarray(e,s))}function xc(t){const e=t.toSorted((s,r)=>s.offset-r.offset),n=[];let A;for(const s of e)A&&s.offset-(A.offset+A.length)<=2e3?(A.length=Math.max(A.length,s.offset+s.length-A.offset),A.blocks.push(s)):(A={blocks:[s],length:s.length,offset:s.offset},n.push(A));return n}const Os=610839776;function Gc(t,e){let n=0;for(const s of t)n+=s.length;let A=0;return e?.(0,n),s=>{A+=s,e?.(A,n)}}function Ie(t,e,n,A){return t<A&&e>n}function Lo(t,e){return e?t/e:t}function Uc(t,e){const n=[];let A=0;const s=rt(t);for(;A<t.byteLength;){const r=s.getUint32(A,!0);A+=4;const o=s.getUint32(A,!0);A+=4;const i=s.getUint32(A,!0);A+=4;const a=s.getUint32(A,!0);A+=4;const c=s.getFloat32(A,!0);A+=4;const l=s.getFloat32(A,!0);A+=4;const g=s.getFloat32(A,!0);A+=8,(!e||r===e.chrId&&Ie(o,i,e.start,e.end))&&n.push({start:o,end:i,maxScore:l,minScore:c,summary:!0,score:Lo(g,a)})}return n}function vc(t,e,n){const A=[];let s=0;const r=rt(t);for(;s<t.byteLength;){const o=s,i=r.getUint32(s,!0);s+=4;const a=r.getInt32(s,!0);s+=4;const c=r.getInt32(s,!0);s+=4;const l=t.indexOf(0,s),g=l===-1?t.length:l,f=ns.decode(t.subarray(s,g));s=g+1,(!n||i===n.chrId&&Ie(a,c,n.start,n.end))&&A.push({start:a,end:c,rest:f,uniqueId:`bb-${e}-${o}`})}return A}function Tc(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0);let a=24;const c=[];switch(o){case 1:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getInt32(a,!0);a+=4;const h=n.getFloat32(a,!0);a+=4,(!e||Ie(g,f,e.start,e.end))&&c.push({start:g,end:f,score:h})}break}case 2:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getFloat32(a,!0);a+=4;const h=g+r;(!e||Ie(g,h,e.start,e.end))&&c.push({score:f,start:g,end:h})}break}case 3:{for(let l=0;l<i;l++){const g=n.getFloat32(a,!0);a+=4;const f=A+l*s,h=f+r;(!e||Ie(f,h,e.start,e.end))&&c.push({score:g,start:f,end:h})}break}}return c}function _s(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0),a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i),g=e.start,f=e.end;let h=0;switch(o){case 1:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=n.getInt32(u+4,!0);d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+8,!0),h++),u+=12}break}case 2:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+4,!0),h++),u+=8}break}case 3:{let u=24;for(let I=0;I<i;I++){const d=A+I*s,C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u,!0),h++),u+=4}break}}return h<i?{starts:a.subarray(0,h),ends:c.subarray(0,h),scores:l.subarray(0,h)}:{starts:a,ends:c,scores:l}}function Ks(t,e){const n=rt(t),A=Math.floor(t.byteLength/32),s=new Int32Array(A),r=new Int32Array(A),o=new Float32Array(A),i=new Float32Array(A),a=new Float32Array(A);let c=0,l=0;for(;l<t.byteLength;){const g=n.getUint32(l,!0);l+=4;const f=n.getUint32(l,!0);l+=4;const h=n.getUint32(l,!0);l+=4;const u=n.getUint32(l,!0);l+=4;const I=n.getFloat32(l,!0);l+=4;const d=n.getFloat32(l,!0);l+=4;const C=n.getFloat32(l,!0);l+=8,g===e.chrId&&Ie(f,h,e.start,e.end)&&(s[c]=f,r[c]=h,o[c]=Lo(C,u),i[c]=I,a[c]=d,c++)}return c<A?{starts:s.subarray(0,c),ends:r.subarray(0,c),scores:o.subarray(0,c),minScores:i.subarray(0,c),maxScores:a.subarray(0,c)}:{starts:s,ends:r,scores:o,minScores:i,maxScores:a}}function ve(t,e,n,A){if(t.length===1)return e(t[0]);const s=new A(n);let r=0;for(const o of t){const i=e(o);s.set(i,r),r+=i.length}return s}function xo(t){let e=0;for(const n of t)e+=n.starts.length;return e}function Go(t){const e=xo(t);return{starts:ve(t,n=>n.starts,e,Int32Array),ends:ve(t,n=>n.ends,e,Int32Array),scores:ve(t,n=>n.scores,e,Float32Array),isSummary:!1}}function Jc(t){const e=xo(t),{starts:n,ends:A,scores:s}=Go(t);return{starts:n,ends:A,scores:s,minScores:ve(t,r=>r.minScores,e,Float32Array),maxScores:ve(t,r=>r.maxScores,e,Float32Array),isSummary:!0}}function Uo(t){let e=0;for(const i of t)for(const a of i)e+=a.starts.length;const n=new Int32Array(e),A=new Int32Array(e),s=new Float32Array(e),r=[0];let o=0;for(const i of t){for(const a of i)n.set(a.starts,o),A.set(a.ends,o),s.set(a.scores,o),o+=a.starts.length;r.push(o)}return{starts:n,ends:A,scores:s,regionOffsets:r,totalCount:e}}function $c(t){const{starts:e,ends:n,scores:A,regionOffsets:s}=Uo(t);return{starts:e,ends:n,scores:A,regionOffsets:s,isSummary:!1}}function Yc(t){const{starts:e,ends:n,scores:A,regionOffsets:s,totalCount:r}=Uo(t),o=new Float32Array(r),i=new Float32Array(r);let a=0;for(const c of t)for(const l of c)o.set(l.minScores,a),i.set(l.maxScores,a),a+=l.starts.length;return{starts:e,ends:n,scores:A,minScores:o,maxScores:i,regionOffsets:s,isSummary:!0}}function qs(t,e,n,A){switch(t){case"summary":return Uc(e,A);case"bigwig":return Tc(e,A);case"bigbed":return vc(e,n,A)}}class Oc{rTreePromise;rTreeNodeCache=new Bn({cache:new fc({maxSize:1e3}),fill:async({length:e,offset:n},A)=>this.bbi.read(e,n,{signal:A})});bbi;refsByName;rTreeOffset;uncompressBufSize;blockType;constructor(e,n,A,s,r){if(!(A>=0))throw new Error("invalid rTreeOffset!");this.bbi=e,this.refsByName=n,this.rTreeOffset=A,this.uncompressBufSize=s,this.blockType=r}async _collectBlocks(e,n,A,s){const r=this.refsByName[e];if(r===void 0||n>=A)return;this.rTreePromise||(this.rTreePromise=this.bbi.read(48,this.rTreeOffset,{signal:s?.signal}).catch(u=>{throw this.rTreePromise=void 0,u}));const o=await this.rTreePromise,i=rt(o),a=i.getUint32(0,!0);if(a!==Os)throw new Error(`invalid cirTree magic: 0x${a.toString(16)} (expected 0x${Os.toString(16)}) at offset ${this.rTreeOffset}, file may be corrupt or unsupported`);const l=4+i.getUint32(4,!0)*32,g=(u,I,d,C)=>(u<r||u===r&&I<A)&&(d>r||d===r&&C>n),f=[];let h=[this.rTreeOffset+48];for(;h.length>0;){const u=hc(h.map(d=>({min:d,max:d+l}))),I=[];for(const{min:d,max:C}of u){const E=C-d,B=d,Q=await this.rTreeNodeCache.get(`${E}_${B}`,{length:E,offset:B},s?.signal);for(const m of h)if(d<=m&&m<=C){const p=Q.subarray(m-B),w=rt(p),y=w.getUint8(0),N=w.getUint16(2,!0);if(y===1||y===0){const k=y===1?32:24;let b=4;for(let D=0;D<N;D++){const F=w.getUint32(b,!0),R=w.getUint32(b+4,!0),v=w.getUint32(b+8,!0),x=w.getUint32(b+12,!0);if(g(F,R,v,x)){const Y=j(w,b+16);if(y===1){const J=j(w,b+24);f.push({offset:Y,length:J})}else I.push(Y)}b+=k}}}}h=I}return{blocks:f,chrId:r}}async readWigData(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);if(!r)return[];const{blocks:o,chrId:i}=r;return this.readFeatures(o,{...s,request:{chrId:i,start:n,end:A}})}async getBlockSizeForRange(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);let o=0;if(r)for(const i of r.blocks)o+=i.length;return o}async getBlockSizeForRangeMulti(e,n={}){const{blockByOffset:A}=await this._collectBlocksMulti(e,n);let s=0;for(const r of A.values())s+=r.length;return s}async _collectBlocksMulti(e,n){const A=await Promise.all(e.map(({refName:o,start:i,end:a})=>this._collectBlocks(o,i,a,n))),s=new Map,r=new Map;for(let o=0;o<A.length;o++){const i=A[o];if(i){const{start:a,end:c}=e[o],l={chrId:i.chrId,start:a,end:c};for(const g of i.blocks){const f=r.get(g.offset);f?f.push({regionIndex:o,request:l}):(s.set(g.offset,g),r.set(g.offset,[{regionIndex:o,request:l}]))}}}return{blockByOffset:s,tagsByOffset:r}}async readWigDataMulti(e,n={}){const A=e.map(()=>[]),{blockByOffset:s,tagsByOffset:r}=await this._collectBlocksMulti(e,n),{blockType:o}=this;return await this._forEachDecodedBlock([...s.values()],n.signal,n.onProgress,(i,a)=>{const c=r.get(a);if(c)for(const{regionIndex:l,request:g}of c){const f=qs(o,i,a,g);for(const h of f)A[l].push(h)}}),A}assertNotBigBed(e){if(this.blockType==="bigbed")throw new Error(`${e} is not supported for BigBed data; use getFeatures/getFeaturesMulti instead`)}async readWigDataAsArrays(e,n,A,s){this.assertNotBigBed("getFeaturesAsArrays");const r=await this._collectBlocks(e,n,A,s),o=r?r.blocks:[],i={chrId:r?r.chrId:0,start:n,end:A};return this.blockType==="summary"?this._readSummaryFeaturesAsArrays(o,i,s):this._readBigWigFeaturesAsArrays(o,i,s)}async readWigDataAsArraysMulti(e,n={}){this.assertNotBigBed("getFeaturesAsArraysMulti");const A=await this._collectBlocksMulti(e,n);return this.blockType==="summary"?Yc(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>Ks(s,r),n)):$c(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>_s(s,r),n))}async _readBlocksAsArraysMulti(e,n,A,s){const{blockByOffset:r,tagsByOffset:o}=e,i=Array.from({length:n},()=>[]);return await this._forEachDecodedBlock([...r.values()],s.signal,s.onProgress,(a,c)=>{const l=o.get(c);if(l)for(const{regionIndex:g,request:f}of l){const h=A(a,f);h.starts.length>0&&i[g].push(h)}}),i}async _forEachBlockGroup(e,n,A,s){const r=xc(e),o=Gc(r,A);for(const i of r){const a=await this.bbi.read(i.length,i.offset,{signal:n});o(i.length),await s(a,i.blocks.map(c=>({offset:c.offset-i.offset,length:c.length})),i.offset)}}async _forEachDecodedBlock(e,n,A,s){const{uncompressBufSize:r}=this;await this._forEachBlockGroup(e,n,A,async(o,i,a)=>{if(r>0){const{data:c,offsets:l}=await Sc(o,i,r);for(let g=0;g<i.length;g++)s(c.subarray(l[g],l[g+1]),a+i[g].offset)}else for(const c of i)s(o.subarray(c.offset,c.offset+c.length),a+c.offset)})}async readFeatures(e,n={}){const{blockType:A}=this,{signal:s,request:r,onProgress:o}=n,i=[];return await this._forEachDecodedBlock(e,s,o,(a,c)=>{const l=qs(A,a,c,r);for(const g of l)i.push(g)}),i}async _readBlocksAsArrays(e,n,A,s,r){const{uncompressBufSize:o}=this,i=[],a=c=>{c.starts.length>0&&i.push(c)};return await this._forEachBlockGroup(e,n,r,async(c,l)=>{if(o>0)a(await A(c,l));else for(const g of l)a(s(c.subarray(g.offset,g.offset+g.length)))}),i}async _readBigWigFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Rc(r,o,this.uncompressBufSize,n.start,n.end),r=>_s(r,n),A.onProgress);return Go(s)}async _readSummaryFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Lc(r,o,this.uncompressBufSize,n.chrId,n.start,n.end),r=>Ks(r,n),A.onProgress);return Jc(s)}}const _c=-2003829722,Hs=-2021002517;class vo{bbi;headerP;getHeader(e){return this.headerP||(this.headerP=this._getHeader(e).catch(n=>{throw this.headerP=void 0,n})),this.headerP}constructor(e){const{filehandle:n,path:A,url:s}=e;if(n)this.bbi=n;else if(s)this.bbi=new Do(s);else if(A)this.bbi=new ac(A);else throw new Error("no file given")}async _getHeader(e){const n=await this._getMainHeader(e),A=await this._readChromosomeTree(n,e);return{...n,...A}}async _getMainHeader(e,n=2e3){const A=await this.bbi.read(n,0,e),s=rt(A);let r=0;const o=s.getInt32(r,!0);if(r+=4,o!==_c&&o!==Hs)throw new Error("not a BigWig/BigBed file");const i=s.getUint16(r,!0);r+=2;const a=s.getUint16(r,!0);r+=2;const c=j(s,r);r+=8;const l=j(s,r);r+=8;const g=j(s,r);r+=8;const f=s.getUint16(r,!0);r+=2;const h=s.getUint16(r,!0);r+=2;const u=j(s,r);r+=8;const I=j(s,r);r+=8;const d=s.getUint32(r,!0);r+=4;const C=j(s,r);r+=8;const E=[];for(let y=0;y<a;y++){const N=s.getUint32(r,!0);r+=4,r+=4;const k=j(s,r);r+=8;const b=j(s,r);r+=8,E.push({reductionLevel:N,dataOffset:k,indexOffset:b})}const B=o===Hs?"bigbed":"bigwig",Q=A.length<n,m=u!==0&&!A.includes(0,u);if(!Q&&(u>n||I>n-40||m))return this._getMainHeader(e,n*2);let p;if(I){const y=rt(A,I);p={basesCovered:j(y,0),scoreMin:y.getFloat64(8,!0),scoreMax:y.getFloat64(16,!0),scoreSum:y.getFloat64(24,!0),scoreSumSquares:y.getFloat64(32,!0)}}else throw new Error("no stats");let w="";if(u){const y=A.indexOf(0,u),N=y===-1?A.length:y;w=ns.decode(A.subarray(u,N))}return{zoomLevels:E,magic:o,extHeaderOffset:C,numZoomLevels:a,fieldCount:f,totalSummary:p,definedFieldCount:h,uncompressBufSize:d,asOffset:u,chromosomeTreeOffset:c,totalSummaryOffset:I,unzoomedDataOffset:l,unzoomedIndexOffset:g,fileType:B,version:i,autoSql:w}}async _readChromosomeTree(e,n){const A=[],s={},r=e.chromosomeTreeOffset,o=rt(await this.bbi.read(32,r,n)),i=o.getUint32(4,!0),a=o.getUint32(8,!0),c=o.getUint32(12,!0),l=4+i*(a+Math.max(c,8)),g=async f=>{const h=await this.bbi.read(l,f,n),u=rt(h),I=u.getUint8(0),d=u.getUint16(2,!0);let C=4;if(I)for(let E=0;E<d;E++){const B=dA(h,C,a);C+=a;const Q=u.getUint32(C,!0);C+=4;const m=u.getUint32(C,!0);C+=4,s[B]=Q,A[Q]={name:B,id:Q,length:m}}else{const E=[];for(let B=0;B<d;B++){C+=a;const Q=j(u,C);C+=8,E.push(g(Q))}await Promise.all(E)}};return await g(r+32),{refsByName:s,refsByNumber:A}}viewCache=new Map;getOrCreateBlockView(e,n,A,s){const r=`${n}_${s}`;let o=this.viewCache.get(r);return o||(o=new Oc(this.bbi,e,n,A,s),this.viewCache.set(r,o)),o}async getUnzoomedView(e){const{unzoomedIndexOffset:n,refsByName:A,uncompressBufSize:s,fileType:r}=await this.getHeader(e);return this.getOrCreateBlockView(A,n,s,r)}async _getView(e){const{basesPerSpan:n,scale:A}=e??{},s=n?1/n:A??1;return this.getView(s,e)}async getFeatures(e,n,A,s){return(await this._getView(s)).readWigData(e,n,A,s)}async getRegionByteSize(e,n,A,s){return(await this._getView(s)).getBlockSizeForRange(e,n,A,s)}async getRegionByteSizeMulti(e,n){return(await this._getView(n)).getBlockSizeForRangeMulti(e,n)}async getFeaturesMulti(e,n){return(await this._getView(n)).readWigDataMulti(e,n)}async getFeaturesAsArrays(e,n,A,s){return(await this._getView(s)).readWigDataAsArrays(e,n,A,s)}async getFeaturesAsArraysMulti(e,n){return(await this._getView(n)).readWigDataAsArraysMulti(e,n)}}class To extends vo{async getView(e,n){const{zoomLevels:A,refsByName:s,uncompressBufSize:r}=await this.getHeader(n),o=1/e,i=A.length-1;for(let a=i;a>=0;a-=1){const c=A[a];if(c.reductionLevel<=2*o)return this.getOrCreateBlockView(s,c.indexOffset,r,"summary")}return this.getUnzoomedView(n)}}function Kc(t,e){if(e<0)return;let n=0;for(let s=0;s<e;s++){if(n=t.indexOf(" ",n),n===-1)return;n++}const A=t.indexOf(" ",n);return A===-1?t.slice(n):t.slice(n,A)}function Ws(t,e){return t<e?-1:t>e?1:0}async function Jo(t,e,n,A,s,r,o,i){const a=4+n*(A+s),c=await t.read(a,e,i),l=rt(c),g=l.getInt8(0),f=l.getInt16(2,!0);let h=4;if(g===0){const u=[];for(let B=0;B<f;B++){const Q=dA(c,h,A);h+=A;const m=j(l,h);h+=8,u.push({key:Q,offset:m})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const B=Math.floor((I+d)/2);Ws(r,u[B].key)>=0?(C=B,I=B+1):d=B-1}const E=u[Math.max(C,0)].offset;return Jo(t,E,n,A,s,r,o,i)}else if(g===1){const u=[];for(let Q=0;Q<f;Q++){const m=dA(c,h,A);h+=A;const p=j(l,h);h+=8;const w=l.getUint32(h,!0);h+=4,h+=4,u.push({key:m,offset:p,length:w})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const Q=Math.floor((I+d)/2),m=Ws(r,u[Q].key);if(m===0){C=Q;break}else m<0?d=Q-1:I=Q+1}if(C===-1)return[];let E=C;for(;E>0&&u[E-1].key===r;)E--;let B=C;for(;B<u.length-1&&u[B+1].key===r;)B++;return u.slice(E,B+1).map(Q=>({...Q,field:o}))}return[]}class $o extends vo{indicesP;readIndices(e={}){return this.indicesP||(this.indicesP=this._readIndices(e).catch(n=>{throw this.indicesP=void 0,n})),this.indicesP}async getView(e,n){return this.getUnzoomedView(n)}async _readIndices(e){const{extHeaderOffset:n}=await this.getHeader(e);if(n===0)return[];const A=await this.bbi.read(64,n,e),s=rt(A),r=s.getUint16(2,!0),o=j(s,4);if(r===0)return[];const i=20,a=i*r,c=await this.bbi.read(a,o,e),l=[];for(let g=0;g<r;g+=1){const f=rt(c,g*i),h=f.getInt16(0,!0),u=f.getInt16(2,!0),I=j(f,4),d=f.getInt16(16,!0);l.push({type:h,fieldcount:u,offset:I,field:d})}return l}async searchExtraIndexBlocks(e,n={}){const A=await this.readIndices(n);if(A.length===0)return[];const s=A.map(async o=>{const{offset:i,field:a}=o,c=await this.bbi.read(32,i,n),l=rt(c),g=l.getInt32(4,!0),f=l.getInt32(8,!0),h=l.getInt32(12,!0);return Jo(this.bbi,i+32,g,f,h,e,a,n)});return(await Promise.all(s)).flat()}async searchExtraIndex(e,n={}){const A=await this.searchExtraIndexBlocks(e,n);if(A.length===0)return[];const s=await this.getUnzoomedView(n),r=new Map;for(const i of A){const a=i.field??0,c=r.get(a);c?c.set(i.offset,i):r.set(a,new Map([[i.offset,i]]))}return(await Promise.all([...r].map(async([i,a])=>(await s.readFeatures([...a.values()],n)).map(l=>({...l,field:i}))))).flat().filter(i=>i.rest?Kc(i.rest,i.field-3)===e:!1)}}const qc=["exact","case","decorated","prefix","padded","roman","organelle","accession","version"],Ps=new Set(["gi","gb","ref","emb","dbj","tpg","tpe","tpd","lcl","pir","prf","sp","tr","pdb","ena","bbs"]);function As(t){let e=t.trim().split(/\s+/)[0]??"";if(e=e.replace(/[,;]+$/,""),e.includes("|")){const n=e.split("|").filter(A=>A!=="");if(n.some(A=>Ps.has(A.toLowerCase()))){const A=n.filter((s,r)=>Ps.has(s.toLowerCase())?!1:!(/^[0-9]+$/.test(s)&&r>0&&n[r-1].toLowerCase()==="gi"));A.length>0&&(e=A[A.length-1])}}return e}const Yo=/^(?:chromosome|chrom|chr)[ _.-]?/i;function Oo(t){const e=t.replace(Yo,"");if(e===""||e===t)return null;const n=e.toLowerCase();return/^[0-9]/.test(e)||mn.has(n)||En.has(n)||Tn(e)>0||/^un[_.-]/i.test(e)||/^[A-Za-z]{1,2}[0-9]/.test(e)||Ko.test(e)||qo.test(e.replace(/\.[0-9]+$/,""))?e:null}const Hc=/^(?:lg|linkage_?group|group)[ _.-]?(?=[0-9])/i,_o=/_(random|alt|fix|hap\d+|maternal|paternal)$/i,Wc=/(?:^|[_.-])([A-Z]{2}[0-9]{5,6})v([0-9]+)(?:$|[_.-])/,Ko=/^(N[CGTWZ]|AC)_([0-9]{5,})$/i,qo=/^[A-Z]{1,6}[0-9]{5,8}$/,Pc=[["mito",["m","mt","mtdna","mito","mitochondrion","mitochondria","mitochondrial","mitochondrion_genome","dmel_mitochondrion_genome","mitochondrial_genome","mitochondrion_dna","chrmt","nc_012920","j01415","nc_001224","nc_005089"]],["plastid",["c","pt","cp","chloroplast","plastid","chloroplast_genome","chrc","nc_000932"]],["2micron",["2-micron","2micron","2u","2-micron_plasmid","nc_001398"]]],En=new Map;for(const[t,e]of Pc)for(const n of e)En.set(n,t);const mn=new Set(["x","y","z","w"]),zc=/^(XL|L|X{0,3})(IX|IV|V?I{0,3})$/i,Xc={"":0,x:10,xx:20,xxx:30,xl:40,l:50},Vc={"":0,i:1,ii:2,iii:3,iv:4,v:5,vi:6,vii:7,viii:8,ix:9};function Tn(t){const e=zc.exec(t);if(e===null)return 0;const n=Xc[e[1].toLowerCase()],A=Vc[e[2].toLowerCase()];return n===void 0||A===void 0?0:n+A}const Zc=[{from:1,to:22,first:1,tail:["x","y"]},{from:67,to:85,first:1,tail:["x","y"]}];function jc(t){for(const e of Zc){if(t>=e.from&&t<=e.to)return String(e.first+(t-e.from));const n=t-e.to-1;if(n>=0&&n<e.tail.length)return e.tail[n]}return null}const CA=200;function tl(t){return t.length<2||mn.has(t.toLowerCase())?!1:Tn(t)>0}function Ho(t){const e=t.map(a=>Wo(a)),A=e.filter(a=>tl(a)).length>=2,s=e.filter(a=>/^[0-9]+$/.test(a)&&Number(a)>=1&&Number(a)<=CA),r=s.length<CA,o=a=>e.some(c=>c.toLowerCase()===a),i=r&&s.length>=2;return{roman:A,ordinals:r,xIsTen:A&&!i&&(o("ix")||o("xi"))}}function Wo(t){const e=As(t);return(Oo(e)??e).replace(_o,"")}function gn(t,e){const n=[],A=As(t);A!==t.trim()&&n.push("decorated");const s=Oo(A),r=s??A;s!==null&&n.push("prefix");const o=_o.exec(r),i=o===null?r:r.slice(0,o.index),a=o===null?"":`+${o[1].toLowerCase()}`,c=i.toLowerCase(),l=Wc.exec(r);if(l!==null)return n.push("accession"),{key:`acc:${l[1].toLowerCase()}`,via:n,version:l[2],opaque:!1};const g=/^(.*?)\.([0-9]+)$/.exec(i),f=g===null?i:g[1],h=g===null?null:g[2],u=En.get(c)??En.get(f.toLowerCase());if(u!==void 0)return u!==c&&n.push("organelle"),{key:`org:${u}`,via:n,version:h,opaque:!1};const I=Ko.exec(f);if(I!==null){n.push("accession");const E=I[1].toLowerCase()==="nc"?jc(Number(I[2])):null;return E!==null?{key:mn.has(E)?`sex:${E}${a}`:`num:${E}${a}`,via:n,version:h,opaque:!1}:{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1}}if(qo.test(f))return n.push("accession"),{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1};if(/^[0-9]+$/.test(i)&&e.ordinals&&Number(i)<=CA)return/^0[0-9]/.test(i)&&n.push("padded"),{key:`num:${Number(i)}${a}`,via:n,version:null,opaque:!1};const d=/^([0-9]{1,2})([a-z]{1,2})$/i.exec(i);if(d!==null&&e.ordinals)return d[1].startsWith("0")&&n.push("padded"),{key:`num:${Number(d[1])}${d[2].toLowerCase()}${a}`,via:n,version:null,opaque:!1};const C=Hc.exec(i);if(C!==null){const E=i.slice(C[0].length);if(/^[0-9]+$/.test(E))return/^0[0-9]/.test(E)&&n.push("padded"),{key:`lg:${Number(E)}${a}`,via:n,version:null,opaque:!1}}if(mn.has(c)&&!(c==="x"&&e.xIsTen))return{key:`sex:${c}${a}`,via:n,version:null,opaque:!1};if(e.roman){const E=Tn(i);if(E>0)return n.push("roman"),{key:`num:${E}${a}`,via:n,version:null,opaque:!1}}return{key:`raw:${c}${a}`,via:n,version:null,opaque:!0}}function Ee(t){return qc.indexOf(t)}function el(t,e){let n="case";for(const A of[...t.via,...e.via])Ee(A)>Ee(n)&&(n=A);return n}function tA(t,e){return t===void 0||e===void 0||t<=0||e<=0?"unknown":t===e?"agree":"differ"}const zs=new WeakMap;class St{names;context;styleCache=null;get style(){return this.styleCache??=Al(this.names,this.context),this.styleCache}exact=new Map;folded=new Map;keyed=new Map;constructor(e){this.names=e.map(n=>n.name),this.context=Ho(this.names);for(const n of e){this.exact.has(n.name)||this.exact.set(n.name,n),Xs(this.folded,n.name.toLowerCase(),n);const A=gn(n.name,this.context);Xs(this.keyed,A.key,{sequence:n,canon:A})}}static of(e){return new St(e)}static ofNames(e){return new St(e.map(n=>({name:n})))}static for(e){const n=zs.get(e);if(n!==void 0)return n;const A=typeof e[0]=="string"?St.ofNames(e):St.of(e);return zs.set(e,A),A}has(e){return this.exact.has(e)}find(e,n={}){const{length:A}=n,s=this.exact.get(e);if(s!==void 0)return{name:s.name,asked:e,tier:"exact",lengths:tA(A,s.length)};const r=this.folded.get(e.toLowerCase());if(r!==void 0&&r.length===1)return{name:r[0].name,asked:e,tier:"case",lengths:tA(A,r[0].length)};const o=n.from??this.context,i=this.byKey(e,gn(e,o),A);if(i!==null)return i;if(!o.roman){const a=Wo(e).toLowerCase();if(a!=="x"&&a!=="l"&&Tn(a)>0)return this.byKey(e,gn(e,{...o,roman:!0,xIsTen:!1}),A)}return null}byKey(e,n,A){const s=this.keyed.get(n.key);if(s===void 0||s.length===0)return null;const r=nl(s,A);if(r===null)return null;const o=el(n,r.canon),i=n.version!==null&&r.canon.version!==null&&n.version!==r.canon.version;return{name:r.sequence.name,asked:e,tier:i&&Ee(o)<Ee("version")?"version":o,lengths:tA(A,r.sequence.length)}}}function nl(t,e){if(t.length===1)return t[0];if(e===void 0||e<=0)return null;const n=t.filter(A=>A.sequence.length===e);return n.length===1?n[0]:null}function Xs(t,e,n){const A=t.get(e);A===void 0?t.set(e,[n]):A.push(n)}function Al(t,e=Ho(t)){if(t.length===0)return"empty";let n=0,A=0,s=0,r=0;for(const i of t){const a=gn(i,e);if(a.opaque){r++;continue}a.via.includes("accession")?s++:Yo.test(As(i))?n++:A++}const o=n+A+s;return o===0||r>o*4?"assembly":e.roman&&n<=A?"roman":s>n&&s>A?"accession":n>0&&A>0?"mixed":n>0?e.roman?"roman":"ucsc":e.roman?"roman":"ensembl"}function sl(t,e){const n=St.of(e),A=St.of(t).context,s=[];for(const g of t){const f=n.find(g.name,{length:g.length,from:A});f!==null&&s.push({source:g,match:f})}s.sort((g,f)=>Ee(g.match.tier)-Ee(f.match.tier));const r=new Map,o=new Set;for(const g of s){const f=r.get(g.match.name);f===void 0?r.set(g.match.name,{source:g.source.name,tier:g.match.tier}):f.tier===g.match.tier&&o.add(g.match.name)}const i=new Map,a=[];let c=0;for(const g of s){const f=r.get(g.match.name);f===void 0||f.source!==g.source.name||o.has(g.match.name)||(i.set(g.source.name,g.match),g.match.tier!=="exact"&&c++,g.match.lengths==="differ"&&a.push(g.match))}const l=t.map(g=>g.name).filter(g=>!i.has(g));return{pairs:i,unmatched:l,contested:a,renamed:c}}function pe(t,e){const n=sl(t,e),A=new Map,s=t.map(r=>{const o=n.pairs.get(r.name);return o===void 0?r.name:(A.set(o.name,r.name),o.name)});for(const r of t)A.has(r.name)||A.set(r.name,r.name);return{names:s,sourceOf:A,renamed:n.renamed,contested:n.contested}}function rl(t){return t.map(e=>({name:e}))}function Kt(t,e){const n=ol(t),A=n.get(e);if(A!==void 0)return A;const s=St.for(t).find(e);return s===null?-1:n.get(s.name)??-1}const Vs=new WeakMap;function ol(t){const e=Vs.get(t);if(e!==void 0)return e;const n=new Map;return t.forEach((A,s)=>{const r=typeof A=="string"?A:A.name;n.has(r)||n.set(r,s)}),Vs.set(t,n),n}class Rt extends Error{code;detail;constructor(e,n,A={}){super(n),this.name="ViewerError",this.code=e,this.detail=A}}const eA=new Intl.NumberFormat(void 0,{maximumFractionDigits:0}),il=new Intl.NumberFormat(void 0,{maximumFractionDigits:3}),al=new Intl.NumberFormat(void 0,{maximumSignificantDigits:3}),Zs=new Map,cl=new Intl.NumberFormat("en-US",{maximumFractionDigits:0}),G={int(t){return Number.isFinite(t)?eA.format(t):"—"},num(t){if(!Number.isFinite(t))return"—";if(Number.isInteger(t))return eA.format(t);const e=Math.abs(t);return e>=.001?il.format(t):e>=1e-7?al.format(t):t.toExponential(2)},fixed(t,e){if(!Number.isFinite(t))return"—";let n=Zs.get(e);return n===void 0&&(n=new Intl.NumberFormat(void 0,{minimumFractionDigits:e,maximumFractionDigits:e}),Zs.set(e,n)),n.format(t)},pct(t,e=1){return Number.isFinite(t)?`${(t*100).toFixed(e)}%`:"—"},pos(t){return Number.isFinite(t)?cl.format(Math.round(t)):"—"},bp(t){return Number.isFinite(t)?Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)} Mb`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(1)} kb`:`${eA.format(t)} bp`:"—"},bytes(t){if(!Number.isFinite(t))return"—";const e=["B","kB","MB","GB","TB"];let n=t,A=0;for(;n>=1e3&&A<e.length-1;)n/=1e3,A++;return`${A===0?n:n.toFixed(1)} ${e[A]}`}};function ll(t){return!Number.isFinite(t)||t<=0?"—":t>=1e6?`${nA(t/1e6)} Mb`:t>=1e3?`${nA(t/1e3)} kb`:`${nA(t)} bp`}function nA(t){return String(Number(t.toFixed(2)))}function nt(t,e){const n=fl(t),A=hl(n,e);if(A===null)return n;throw new Rt("format",`The ${e.field} of this ${e.format} reads ${BA(t)}, ${A.reason}. `+de,{format:e.format,field:e.field,value:typeof t=="bigint"?t.toString():t,ceiling:e.ceiling,...e.available===void 0?{}:{available:e.available},...A.most===void 0?{}:{most:A.most}})}function ss(t,e,n){const A={format:n.format,field:n.field,offset:t,length:e,size:n.size};if(!QA(t)||!QA(e))throw new Rt("format",`The ${n.field} of this ${n.format} points at ${BA(e)} bytes from byte ${BA(t)}, which is not a place in a file. ${de}`,A);if(n.ceiling!==void 0&&e>n.ceiling)throw new Rt("format",`The ${n.field} of this ${n.format} is ${G.int(e)} bytes long, more than the ${G.int(n.ceiling)} any real one holds. ${de}`,{...A,ceiling:n.ceiling});if(t+e>n.size)throw new Rt("format",`The ${n.field} of this ${n.format} points at bytes ${G.int(t)} to ${G.int(t+e)}, past the end of a file of ${G.int(n.size)}. ${de}`,A)}const js=65536,Po=2**29;async function rs(t,e){if(typeof DecompressionStream>"u")throw new Rt("unsupported",`Reading a ${e.format} needs DecompressionStream, which this runtime does not have. Every browser since 2023 has it; a very old one does not.`,{format:e.format});const n=new DecompressionStream(e.encoding),A=n.writable.getWriter(),s=n.readable.getReader(),r=[];let o=0,i=!1;const a=(async()=>{for(;;){const{done:I,value:d}=await s.read();if(I)return;if(o+=d.byteLength,o>e.maxBytes){i=!0,await s.cancel();return}r.push(d)}})(),c=(async()=>{for(let I=0;I<t.byteLength;I+=js){if(i)return;const d=t.subarray(I,Math.min(I+js,t.byteLength));await A.write(d)}i||await A.close()})(),[l,g]=await Promise.allSettled([a,c]);if(i)throw zo(e,e.maxBytes,t.byteLength);const f=l.status==="rejected"?l.reason:g.status==="rejected"?g.reason:null;if(f!==null){const I=f instanceof Error?f.message:String(f);throw new Rt("format",`The ${e.field} of this ${e.format} does not inflate (${I.replace(/\.$/,"")}). ${de}`,{format:e.format,field:e.field})}if(r.length===1)return r[0];const h=new Uint8Array(o);let u=0;for(const I of r)h.set(I,u),u+=I.length;return h}function gl(t,e){return Math.min(e.ceiling,Math.max(e.floor,Math.ceil(t*e.ratio)))}function zo(t,e,n){return new Rt("format",`The ${t.field} of this ${t.format} inflates to more than ${G.bytes(e)}, past what any real one holds. ${de}`,{format:t.format,field:t.field,maxBytes:e,compressed:n})}const de="The file is truncated, corrupt, or not the format its first bytes claim.";function fl(t){return typeof t=="number"?t:t>=BigInt(Number.MIN_SAFE_INTEGER)&&t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):Number.NaN}function QA(t){return Number.isSafeInteger(t)&&t>=0}function hl(t,e){if(!QA(t))return{reason:"which is not a count"};if(t>e.ceiling)return{reason:`more than the ${G.int(e.ceiling)} any real one declares`};if(e.available!==void 0){const n=Math.floor(Math.max(0,e.available)/Math.max(1,e.bytesPerItem??1));if(t>n){const A=Math.max(0,e.available);return{reason:`and the ${G.int(A)} byte${A===1?"":"s"} after it could hold at most ${G.int(n)}`,most:n}}}return null}function BA(t){return typeof t=="bigint"?t.toString():Number.isSafeInteger(t)?G.int(t):String(t)}const ul=65536;async function Il(t){return t.length===0?t:rs(t,{format:"BGZF file",field:"member",encoding:"deflate-raw",maxBytes:ul})}const os=12,Et=65536;function We(t){return t.length<os||t[0]!==31||t[1]!==139||t[2]!==8||(t[3]&4)===0?!1:ye(t)!==null}function ye(t){if(t.length<os)return null;const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint16(10,!0);let A=12;const s=Math.min(12+n,t.length);for(;A+4<=s;){const r=t[A],o=t[A+1],i=e.getUint16(A+2,!0);if(r===66&&o===67&&i===2)return e.getUint16(A+4,!0)+1;A+=4+i}return null}const dl=Il;async function Ot(t,e=Number.POSITIVE_INFINITY,n=Po){const A=[];let s=0,r=0;for(;r+os<=t.length;){const a=r,c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const g=new DataView(t.buffer,t.byteOffset+r,c).getUint16(10,!0),f=r+12+g,h=r+c-8;if(h>f){const u=await dl(t.subarray(f,h));if(u.length>0){if(s+u.length>n)throw zo({format:"BGZF file",field:"span read"},n,t.length);A.push(u),s+=u.length}}if(r+=c,a>=e)break}const o=new Uint8Array(s);let i=0;for(const a of A)o.set(a,i),i+=a.length;return o}function Cl(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<36||t[0]!==84||t[1]!==66||t[2]!==73||t[3]!==1)throw new Error("This is not a tabix index: the magic bytes are not TBI\\1.");const n=e.getInt32(4,!0),A=e.getInt32(8,!0),s=String.fromCharCode(e.getInt32(24,!0)),r=e.getInt32(28,!0),o=e.getInt32(32,!0),i=[],a=new TextDecoder().decode(t.subarray(36,36+o));for(const g of a.split("\0"))g!==""&&i.push(g);let c=36+o;const l=new Map;for(let g=0;g<n;g++){const f=e.getInt32(c,!0);c+=4;let h=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY;for(let d=0;d<f;d++){c+=4;const C=e.getInt32(c,!0);c+=4;for(let E=0;E<C;E++){const B=Number(e.getBigUint64(c,!0)>>16n),Q=Number(e.getBigUint64(c+8,!0)>>16n);c+=16,B<h&&(h=B),Q>u&&(u=Q)}}const I=e.getInt32(c,!0);c+=4;for(let d=0;d<I;d++){const C=Number(e.getBigUint64(c,!0)>>16n);c+=8,C>0&&C<h&&(h=C)}Number.isFinite(h)&&Number.isFinite(u)&&g<i.length&&l.set(i[g],{from:h,to:u})}return{names:i,spans:l,format:A,meta:s,skip:r}}function Ql(t,e,n){const A=[];for(const r of e){const o=t.spans.get(r);o!==void 0&&A.push({from:o.from,to:Math.min(n,o.to+Et),lastBlock:o.to})}A.sort((r,o)=>r.from-o.from);const s=[];for(const r of A){const o=s[s.length-1];o!==void 0&&r.from<=o.to+(1<<20)?(o.to=Math.max(o.to,r.to),o.lastBlock=Math.max(o.lastBlock,r.lastBlock)):s.push({...r})}return s}function Bl(t,e){if(e.length===0)return t.names;const n=St.ofNames(t.names),A=new Set;for(const s of e){const r=n.find(s);r!==null&&A.add(r.name)}return A.size===0?t.names:[...A]}class et{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s={}){const r=Math.min(n,A),o=Math.max(r+1,Math.max(n,A));this.rows.push({contig:this.contigId(e),start:r,end:o,strand:s.strand??0,score:s.score??Number.NaN,name:s.name??"",id:s.id??"",detail:s.detail??"",exons:s.exons??null,cds:s.cds??null,bars:s.bars??null,xyz:s.xyz??null,hap:s.hap??0})}get length(){return this.rows.length}finish(e=null,n=null){const A=this.rows;A.sort((h,u)=>h.contig-u.contig||h.start-u.start||h.end-u.end||h.hap-u.hap);const s=A.length,r={contigs:this.contigs,length:s,contig:new Int32Array(s),start:new Int32Array(s),end:new Int32Array(s),strand:new Int8Array(s),score:new Float32Array(s),name:new Array(s),id:new Array(s),detail:new Array(s),exonAt:new Int32Array(s+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(s),cdsEnd:new Int32Array(s),contigAt:new Int32Array(this.contigs.length+1),maxSpan:new Int32Array(this.contigs.length)};let o=0;for(const h of A)o+=h.exons===null?0:h.exons.length>>1;r.exonStart=new Int32Array(o),r.exonEnd=new Int32Array(o);const i=e===null?0:e.labels.length,a=new Float32Array(i*s).fill(Number.NaN);let c=0;const l=n===null?null:{x:new Float32Array(s),y:new Float32Array(s),z:new Float32Array(s),hap:new Int8Array(s)};let g=0;for(let h=0;h<s;h++){const u=A[h];if(r.contig[h]=u.contig,r.start[h]=u.start,r.end[h]=u.end,r.strand[h]=u.strand,r.score[h]=u.score,r.name[h]=u.name,r.id[h]=u.id,r.detail[h]=u.detail,r.cdsStart[h]=u.cds===null?-1:u.cds[0],r.cdsEnd[h]=u.cds===null?-1:u.cds[1],r.exonAt[h]=g,u.exons!==null){const d=[];for(let C=0;C+1<u.exons.length;C+=2)d.push([u.exons[C],u.exons[C+1]]);d.sort((C,E)=>C[0]-E[0]);for(const[C,E]of d)r.exonStart[g]=C,r.exonEnd[g]=E,g++}if(i>0&&u.bars!==null&&u.bars.length===i)for(let d=0;d<i;d++){const C=u.bars[d];a[h*i+d]=C,C>c&&(c=C)}l!==null&&(l.x[h]=u.xyz===null?Number.NaN:u.xyz[0],l.y[h]=u.xyz===null?Number.NaN:u.xyz[1],l.z[h]=u.xyz===null?Number.NaN:u.xyz[2],l.hap[h]=u.hap);const I=u.end-u.start;I>r.maxSpan[u.contig]&&(r.maxSpan[u.contig]=I)}r.exonAt[s]=g;let f=0;for(let h=0;h<this.contigs.length;h++)for(r.contigAt[h]=f;f<s&&r.contig[f]===h;)f++;if(r.contigAt[this.contigs.length]=f,e!==null){const{limit:h,...u}=e;r.bars={...u,values:a,max:Number.isFinite(h)&&h>0?h:c}}return l!==null&&n!==null&&(r.model={...l,haplotypes:[...n.haplotypes],width:n.width}),r}}function El(t,e,n=4){const A=new Set(t),s=new Set(e),r=e.filter(i=>!A.has(i)),o=t.filter(i=>!s.has(i));return{matched:e.length-r.length,total:e.length,missing:r.slice(0,n),extra:o.slice(0,n)}}class Jn{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s,r,o,i={}){this.rows.push({c1:this.contigId(e),s1:n,e1:Math.max(n+1,A),c2:this.contigId(s),s2:r,e2:Math.max(r+1,o),score:i.score??Number.NaN,name:i.name??"",detail:i.detail??""})}get length(){return this.rows.length}finish(){const e=this.rows.length,n={contigs:this.contigs,length:e,contig1:new Int32Array(e),start1:new Int32Array(e),end1:new Int32Array(e),contig2:new Int32Array(e),start2:new Int32Array(e),end2:new Int32Array(e),score:new Float32Array(e),name:new Array(e),detail:new Array(e)};for(let A=0;A<e;A++){const s=this.rows[A];n.contig1[A]=s.c1,n.start1[A]=s.s1,n.end1[A]=s.e1,n.contig2[A]=s.c2,n.start2[A]=s.s2,n.end2[A]=s.e2,n.score[A]=s.score,n.name[A]=s.name,n.detail[A]=s.detail}return n}}const De=256,ml=["#FFFEF9","#FCF9CE","#FFF2A9","#FDE188","#FFCA67","#FAAA4B","#F78E40","#F15C34","#ED3024","#D42027","#B01F29","#7A1128","#1A0A10"],wl=["#FFFFFF","#FFF5F0","#FEE0D2","#FCBBA1","#FC9272","#FB6A4A","#EF3B2C","#CB181D","#A50F15","#67000D"],pl=["#053061","#2166AC","#4393C3","#92C5DE","#D1E5F0","#F7F7F7","#FDDBC7","#F4A582","#D6604D","#B2182B","#67001F"],yl=["#1659b1","#487BA8","#819EC8","#D1E6F1","#FFFFFF","#FAC1C1","#F1606C","#EE222A"],Nl=[0,.125,.25,.375,.5,2/3,5/6,1],kl=["#00004D","#0000FF","#FFFFFF","#FF0000","#800000"];function Me(t,e,n){const A=t.map(i=>[Number.parseInt(i.slice(1,3),16),Number.parseInt(i.slice(3,5),16),Number.parseInt(i.slice(5,7),16)]),s=A.length-1,r=n??A.map((i,a)=>a/s),o=new Array(e*3);for(let i=0;i<e;i++){const a=i/(e-1);let c=0;for(;c<s-1&&a>=r[c+1];)c++;const l=r[c+1]-r[c],g=l>0?(a-r[c])/l:0;for(let f=0;f<3;f++)o[i*3+f]=Math.round(A[c][f]+(A[c+1][f]-A[c][f])*g)}return o}Me(ml,De),Me(wl,De),Me(pl,De),Me(yl,De,Nl),Me(kl,De);const bl="RdBu_r";(()=>{const t=new Int8Array(256).fill(-1),e=(n,A)=>{for(const s of n)t[s.charCodeAt(0)]=A,t[s.toLowerCase().charCodeAt(0)]=A};return e("TU",0),e("C",1),e("A",2),e("G",3),t})();const tr=[66,65,77,1],fn=32,At={PAIRED:1,PROPER_PAIR:2,UNMAPPED:4,MATE_UNMAPPED:8,REVERSE:16,FIRST_IN_PAIR:64,SECOND_IN_PAIR:128,SECONDARY:256,QC_FAIL:512,DUPLICATE:1024,SUPPLEMENTARY:2048};function is(t,e,n,A){const s={c:1,C:1,s:2,S:2,i:4,I:4,f:4,A:1};if(n==="Z"||n==="H"){let o=e;for(;o<A&&t[o]!==0;)o++;return o+1}if(n==="B"){const o=String.fromCharCode(t[e]),i=new DataView(t.buffer,t.byteOffset,t.byteLength).getInt32(e+1,!0),a=s[o];return a===void 0||i<0?-1:e+5+i*a}const r=s[n];return r===void 0?-1:e+r}const Xo=At.UNMAPPED|At.SECONDARY|At.SUPPLEMENTARY|At.QC_FAIL;function Vo(t){return t.length<tr.length?!1:tr.every((e,n)=>t[n]===e)}function Dl(t){if(!Vo(t))throw new Error("This is not a BAM: the first four bytes are not BAM\\1.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<8)return null;const n=e.getInt32(4,!0);if(n<0)throw new Error("This BAM header declares a negative length.");let A=8+n;if(t.length<A+4)return null;const s=new TextDecoder().decode(t.subarray(8,A)),r=e.getInt32(A,!0);if(A+=4,r<0)throw new Error("This BAM header declares a negative reference count.");const o=[];for(let i=0;i<r;i++){if(t.length<A+4)return null;const a=e.getInt32(A,!0);if(A+=4,a<0)throw new Error("This BAM header declares a negative name length.");if(t.length<A+a+4)return null;const c=new TextDecoder().decode(t.subarray(A,A+a-1));A+=a;const l=e.getInt32(A,!0);A+=4,o.push({name:c,length:l})}return{text:s,refs:o,sortOrder:Ml(s),recordsFrom:A}}function Ml(t){for(const e of t.split(`
|
|
2
|
-
`))if(e.startsWith("@HD"))for(const n of e.split(" ")){if(!n.startsWith("SO:"))continue;const A=n.slice(3).trim();return A==="coordinate"||A==="queryname"||A==="unsorted"?A:"unknown"}return"unknown"}const
|
|
3
|
-
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o==="")continue;if(o.startsWith("##")){if(/^##fileformat=VCF/i.test(o))return!0;continue}if(o.startsWith("#")){if(/^#CHROM\s+POS\s+ID\s+REF\s+ALT/i.test(o))return!0;continue}const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(!
|
|
4
|
-
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o!==""&&e(o)===!1)return}}function
|
|
5
|
-
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);n=r+1,A++,!(i===""||i.charCodeAt(0)===35)&&(i.startsWith("track ")||i.startsWith("browser ")||e(i.includes(" ")?i.split(" "):i.trim().split(/\s+/),A))}}function $n(t){let e=null;return wt(t,n=>{e??=n}),e}function
|
|
6
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!
|
|
7
|
-
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);if(n=r+1,A++,!(i===""||i.charCodeAt(0)===35)){if(!i.startsWith("track ")){if(!i.startsWith("browser "))break;continue}for(const[,a,c,l]of i.matchAll(/(\w+)=(?:"([^"]*)"|(\S+))/g))e[a.toLowerCase()]=c??l??"";break}}return e}function
|
|
8
|
-
`,r);i<0&&(i=o);let a=i;a>r&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(r,a);if(r=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=
|
|
9
|
-
`,g);N<0&&(N=f);let k=N;k>g&&t.charCodeAt(k-1)===13&&k--;const b=t.slice(g,k);if(g=N+1,b.startsWith(`${cr} `)){const x=b.slice(cr.length+1).trim().split(/\s+/),[Y,...J]=x;if(Y==="PLACEMENT")s=Number(J[0]);else if(Y==="FRAME"&&J.length===4){const[K,V,H,ht]=J.map(Number);[K,V,H].every(Number.isFinite)&&ht>0&&(r={cx:K,cy:V,cz:H,factor:ht})}else if(Y==="WIDTH"){const K=Number(J[0]);Number.isInteger(K)&&K>0&&(o=K)}else if(Y==="HAPLOTYPES")i=J.map(sA);else if(Y==="CHAIN"&&J.length>=6){const K=Number(J[2]),V=Number(J[3]);en(K)&&en(V)&&K<=V&&n.push({first:K,last:V,hap:sA(J[4]),sequence:sA(J.slice(5).join(" "))})}else if(Y==="RUN"&&J.length===4){const[K,V,H,ht]=J.map(Number);en(K)&&Number.isInteger(V)&&V>0&&K+V-1<=fe&&Number.isInteger(H)&&H>=0&&Number.isInteger(ht)&&ht>0&&A.push({first:K,count:V,start:H,width:ht})}continue}if(l)continue;if(b.startsWith("ENDMDL")){l=!0;continue}if(!b.startsWith("HETATM")&&!b.startsWith("ATOM "))continue;const D=Number(b.slice(6,11)),F=Number(b.slice(30,38)),R=Number(b.slice(38,46)),v=Number(b.slice(46,54));!en(D)||!Pg(F,R,v)||(b.slice(17,20)===Wg&&c++,a.push({serial:D,x:F,y:R,z:v}))}const h=e===""?"This file":e;if(a.length===0)throw new Error(`${h} has no ATOM or HETATM record with a place, so there is no bead to read.`);if(s===null||n.length===0||A.length===0)throw new Error(c===a.length?"These beads are named the way this app writes a PDB, but the lines that said where each one is on the genome are gone: PyMOL drops REMARK records when it saves. Open the PDB as this app wrote it, or its bed3d.":"A PDB says where each bead is in space and not where it is on the genome, and this one does not say: pastis and the other solvers write their beads in bin order and nothing else. Write the coordinates beside the bins they were modelled at, as a bed3d (chrom, start, end, x, y, z), and open that.");if(s!==lr)throw new Error(`This PDB's placement table is version ${String(s)}, and this reader understands version ${lr}.`);const u=new Int32Array(fe+1).fill(-1);n.forEach((N,k)=>{for(let b=N.first;b<=N.last;b++)u[b]=k});const I=new Float64Array(fe+1).fill(-1),d=new Float64Array(fe+1);for(const N of A)for(let k=0;k<N.count;k++)I[N.first+k]=N.start+k*N.width,d[N.first+k]=N.width;const C=i??[],E=new Map;C.forEach((N,k)=>E.set(N,k));const B=r??{cx:0,cy:0,cz:0,factor:1},Q=new Uint8Array(fe+1),m=[];for(const N of a){const k=u[N.serial],b=I[N.serial];if(k<0||b<0||Q[N.serial]===1)continue;Q[N.serial]=1;const D=n[k];E.has(D.hap)||(E.set(D.hap,C.length),C.push(D.hap)),m.push({contig:D.sequence,start:b,end:b+d[N.serial],xyz:[N.x/B.factor+B.cx,N.y/B.factor+B.cy,N.z/B.factor+B.cz],hap:D.hap})}if(m.length===0)throw new Error(`${h} has a placement table, and it places none of the file's ${G.int(a.length)} atoms.`);const p=C.length>1,w=new et;for(const N of m)w.add(N.contig,N.start,N.end,{xyz:N.xyz,hap:E.get(N.hap)??0,detail:p?`${hs} ${N.hap}`:""});const y={width:o??zg(m.map(N=>N.end-N.start)),haplotypes:C};return w.finish(null,y)}function en(t){return Number.isInteger(t)&&t>=1&&t<=fe}function sA(t){try{return decodeURIComponent(t)}catch{return t}}function zg(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}const rA="MessagePack value",gr=64,Xg=BigInt(Number.MAX_SAFE_INTEGER),Vg=BigInt(Number.MIN_SAFE_INTEGER);function yi(t,e=0){const n=new Zg(t,e);return{value:n.next(),end:n.at}}class Zg{constructor(e,n){this.bytes=e,this.at=n,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength)}at;view;decoder=new TextDecoder;depth=0;next(){const e=this.u8();if(e<=127)return e;if(e>=224)return e-256;if(e>=128&&e<=143)return this.map(e&15);if(e>=144&&e<=159)return this.array(e&15);if(e>=160&&e<=191)return this.str(e&31);switch(e){case 192:return null;case 194:return!1;case 195:return!0;case 196:return this.bin(this.u8());case 197:return this.bin(this.u16());case 198:return this.bin(this.u32());case 202:return this.f32();case 203:return this.f64();case 204:return this.u8();case 205:return this.u16();case 206:return this.u32();case 207:return this.big(this.view.getBigUint64(this.take(8)));case 208:return this.i8();case 209:return this.i16();case 210:return this.i32();case 211:return this.big(this.view.getBigInt64(this.take(8)));case 217:return this.str(this.u8());case 218:return this.str(this.u16());case 219:return this.str(this.u32());case 220:return this.array(this.u16());case 221:return this.array(this.u32());case 222:return this.map(this.u16());case 223:return this.map(this.u32());default:throw new Error(`msgpack: unsupported type byte 0x${e.toString(16).padStart(2,"0")} at offset ${this.at-1}.`)}}take(e){const n=this.at;if(n+e>this.bytes.length)throw new Error(`msgpack: truncated: needed ${e} byte${e===1?"":"s"} at offset ${n} of ${this.bytes.length}.`);return this.at=n+e,n}u8(){return this.view.getUint8(this.take(1))}u16(){return this.view.getUint16(this.take(2))}u32(){return this.view.getUint32(this.take(4))}i8(){return this.view.getInt8(this.take(1))}i16(){return this.view.getInt16(this.take(2))}i32(){return this.view.getInt32(this.take(4))}f32(){return this.view.getFloat32(this.take(4))}f64(){return this.view.getFloat64(this.take(8))}big(e){if(e>Xg||e<Vg)throw new Error(`msgpack: the 64-bit integer ${e} at offset ${this.at-9} does not fit a JavaScript number.`);return Number(e)}str(e){const n=this.take(e);return this.decoder.decode(this.bytes.subarray(n,n+e))}bin(e){const n=this.take(e);return this.bytes.subarray(n,n+e)}open(e,n,A){if(this.depth>=gr)throw new Rt("format",`This ${rA} nests deeper than ${gr} levels at offset ${this.at}, which no document this reader opens does. The file is corrupt, or not the format its first bytes claim.`,{format:rA,offset:this.at,depth:this.depth});return this.depth++,nt(e,{format:rA,field:`${n} length at offset ${this.at}`,ceiling:2**32-1,available:this.bytes.length-this.at,bytesPerItem:A})}array(e){const n=this.open(e,"array",1),A=new Array(n);for(let s=0;s<n;s++)A[s]=this.next();return this.depth--,A}map(e){const n=this.open(e,"map",2),A=new Map;for(let s=0;s<n;s++){const r=this.at,o=this.next();if(typeof o!="string"&&typeof o!="number")throw new Error(`msgpack: a map key at offset ${r} is neither a string nor an integer.`);A.set(o,this.next())}return this.depth--,A}}const fr=64e3,yn="binary g3d",Ni={ratio:64,floor:64<<20,ceiling:1<<30},jg=[165,109,97,103,105,99],tf=[163,71,51,68];function Is(t){if(t.length===0)return!1;const e=t[0];let n;if(e>=128&&e<=143)n=1;else if(e===222)n=3;else return!1;const A=[...jg,...tf];if(t.length<n+A.length)return!1;for(let s=0;s<A.length;s++)if(t[n+s]!==A[s])return!1;return!0}async function ef(t,e){const n=e===void 0?fr:Math.min(fr,e),A=await t(n,0);if(!Is(A))throw new Error("Not a binary g3d: the file does not begin with the G3D magic.");const{value:s}=yi(A);if(!(s instanceof Map))throw new Error("Not a binary g3d: the header is not a map.");if(s.get("magic")!=="G3D")throw new Error('Not a binary g3d: the magic is not "G3D".');const r=s.get("version");if(r!==2)throw r===1?new Error("This is a version-1 g3d, written by a g3dtools older than 0.2. Run `g3dtools load` over the original text to rewrite it as a version-2 file, which is the layout this reader and the WashU browser both understand."):new Error(`Unsupported g3d version ${String(r)}: this reader understands version 2.`);const o=xe(s.get("resolutions"),"resolutions"),i=rf(s.get("categories"),"categories"),a=s.get("offsets");if(!(a instanceof Map))throw new Error("This g3d has no offsets map in its header.");const c=new Map;for(const[l,g]of a){const f=typeof l=="number"?l:Number(l);if(!Number.isInteger(f)||!(g instanceof Map))continue;const h=g.get("offset"),u=g.get("size");if(typeof h!="number"||typeof u!="number")continue;const I=`${f} bp block`;nt(h,{format:yn,field:`offset of the ${I}`,ceiling:Number.MAX_SAFE_INTEGER}),nt(u,{format:yn,field:`size of the ${I}`,ceiling:Ni.ceiling}),c.set(f,{offset:h,size:u})}for(const l of o)if(!c.has(l))throw new Error(`This g3d lists a resolution of ${l} bp but has no block for it.`);return{version:r,genome:typeof s.get("genome")=="string"?s.get("genome"):"",name:typeof s.get("name")=="string"?s.get("name"):"",resolutions:o,categories:i,offsets:c,...e===void 0?{}:{fileSize:e}}}async function nf(t,e,n){const A=e.offsets.get(n);if(A===void 0)throw new Error(`This g3d has no model at ${n} bp; it has ${e.resolutions.join(", ")}.`);e.fileSize!==void 0&&ss(A.offset,A.size,{format:yn,field:`${n} bp block`,size:e.fileSize});const s=await t(A.size,A.offset);if(s.length!==A.size)throw new Error(`The ${n} bp block of this g3d is ${s.length} bytes where the header promised ${A.size}.`);const{value:r}=yi(await sf(s,n));if(!(r instanceof Map))throw new Error(`The ${n} bp block of this g3d is not a map.`);const o=[...e.categories],i=o.length>1,a=new et;for(const[l,g]of r){const f=String(l);let h=o.indexOf(f);h<0&&(h=o.length,o.push(f));const u=i?`${hs} ${f}`:"";if(g instanceof Map)for(const[I,d]of g){if(!(d instanceof Map))continue;const C=`${f}/${String(I)} at ${n} bp`,E=xe(d.get("start"),`start of ${C}`),B=xe(d.get("x"),`x of ${C}`),Q=xe(d.get("y"),`y of ${C}`),m=xe(d.get("z"),`z of ${C}`);if(B.length!==E.length||Q.length!==E.length||m.length!==E.length)throw new Error(`The columns of ${C} in this g3d are not the same length.`);const p=String(I);for(let w=0;w<E.length;w++)a.add(p,E[w],E[w]+n,{xyz:[B[w],Q[w],m[w]],hap:h,detail:u})}}const c={width:n,haplotypes:o};return a.finish(null,c)}function Af(t){const e=t.resolutions.length,n=t.categories.length;return["binary g3d",`${e} resolution${e===1?"":"s"}`,`${n} categor${n===1?"y":"ies"}`].join(ct)}async function sf(t,e){return rs(t,{format:yn,field:`${e} bp block`,encoding:"deflate",maxBytes:gl(t.byteLength,Ni)})}function xe(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="number")throw new Error(`This g3d's ${e} holds a value that is not a number.`);return t}function rf(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="string")throw new Error(`This g3d's ${e} holds a value that is not a string.`);return t}const of=[66,65,73,1],af=[67,83,73,1],cf=14,lf=5,gf=37450,Qt="BAM index",ff=65536,hf=65536,uf=10,If=63,he=2**31-1;function hr(t,e){return t.length<e.length?!1:e.every((n,A)=>t[A]===n)}async function df(t){const e=We(t)?await Ot(t):t,n=hr(e,af)?Qf:hr(e,of)?Cf:null;if(n===null)throw new Error("This is not a BAM index: the magic bytes are neither BAI\\1 nor CSI\\1.");try{return n(e)}catch(A){throw A instanceof RangeError?new Rt("format",`This ${Qt} ends part-way through its own tables, ${e.byteLength.toLocaleString("en-US")} bytes in. It is truncated; rebuild it with \`samtools index\`.`,{bytes:e.byteLength}):A}}function Cf(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=o=>t.byteLength-o,A=nt(e.getInt32(4,!0),{format:Qt,field:"reference count",ceiling:he,available:n(8),bytesPerItem:8});let s=8;const r=[];for(let o=0;o<A;o++){const i=new Map,a=nt(e.getInt32(s,!0),{format:Qt,field:`bin count of reference ${o}`,ceiling:ff,available:n(s+4)-4,bytesPerItem:8});s+=4;for(let g=0;g<a;g++){const f=e.getUint32(s,!0);s+=4;const h=nt(e.getInt32(s,!0),{format:Qt,field:`chunk count of bin ${f}`,ceiling:he,available:n(s+4),bytesPerItem:16});s+=4;const u=[];for(let I=0;I<h;I++)u.push({begin:e.getBigUint64(s,!0),end:e.getBigUint64(s+8,!0)}),s+=16;f!==gf&&i.set(f,u)}const c=nt(e.getInt32(s,!0),{format:Qt,field:`linear index size of reference ${o}`,ceiling:hf,available:n(s+4),bytesPerItem:8});s+=4;const l=new BigUint64Array(c);for(let g=0;g<c;g++)l[g]=e.getBigUint64(s,!0),s+=8;r.push({bins:i,linear:l,loffset:null})}return{format:"bai",minShift:cf,depth:lf,refs:r}}function Qf(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=c=>t.byteLength-c,A=nt(e.getInt32(8,!0),{format:Qt,field:"CSI depth",ceiling:uf}),s=nt(e.getInt32(4,!0),{format:Qt,field:"CSI min_shift",ceiling:If-3*A});let o=16+nt(e.getInt32(12,!0),{format:Qt,field:"auxiliary data length",ceiling:he,available:n(16)-4});const i=nt(e.getInt32(o,!0),{format:Qt,field:"reference count",ceiling:he,available:n(o+4),bytesPerItem:4});o+=4;const a=[];for(let c=0;c<i;c++){const l=new Map,g=new Map,f=nt(e.getInt32(o,!0),{format:Qt,field:`bin count of reference ${c}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;for(let h=0;h<f;h++){const u=e.getUint32(o,!0);o+=4,g.set(u,e.getBigUint64(o,!0)),o+=8;const I=nt(e.getInt32(o,!0),{format:Qt,field:`chunk count of bin ${u}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;const d=[];for(let C=0;C<I;C++)d.push({begin:e.getBigUint64(o,!0),end:e.getBigUint64(o+8,!0)}),o+=16;l.set(u,d)}a.push({bins:l,linear:null,loffset:g})}return{format:"csi",minShift:s,depth:A,refs:a}}function $e(t,e){return Math.floor(t/2**e)}function Bf(t,e,n,A){const s=[],r=Math.max(e,n-1);let o=A.minShift+A.depth*3,i=0;for(let a=0;a<=A.depth;a++){const c=i+$e(e,o),l=i+$e(r,o);if(l-c+1>t.bins.size)for(const[g,f]of t.bins)g>=c&&g<=l&&s.push(f);else for(let g=c;g<=l;g++){const f=t.bins.get(g);f!==void 0&&s.push(f)}i+=1<<a*3,o-=3}return s}function Ef(t,e,n){if(t.linear!==null){const r=$e(e,n.minShift);return t.linear.length===0?0n:t.linear[Math.min(r,t.linear.length-1)]}if(t.loffset===null)return 0n;let A=n.minShift,s=0;for(let r=n.depth;r>=0;r--){s=ki(r);const o=t.loffset.get(s+$e(e,A));if(o!==void 0)return o;A+=3}return 0n}function ki(t){let e=0;for(let n=0;n<t;n++)e+=1<<n*3;return e}function mf(t,e,n){let A=null,s=n.minShift;for(let r=n.depth;r>=0;r--){const o=ki(r),i=1<<r*3,a=$e(Math.max(0,e-1),s)+1;for(let c=0;c<8&&a+c<i;c++){const l=t.bins.get(o+a+c);if(l!==void 0)for(const g of l)(A===null||g.begin<A)&&(A=g.begin)}s+=3}return A??BigInt(Number.MAX_SAFE_INTEGER)<<16n}const wf=1<<20;function pf(t,e,n,A,s){const r=t.refs[e];if(r===void 0)return[];const o=Ef(r,Math.max(0,n),t),i=mf(r,Math.max(1,A),t),a=[];for(const l of Bf(r,Math.max(0,n),Math.max(1,A),t))for(const g of l)g.end>o&&g.begin<i&&a.push(g);if(a.length===0)return[];a.sort((l,g)=>l.begin<g.begin?-1:l.begin>g.begin?1:0);const c=[];for(const l of a){const g=Number(l.begin>>16n),f=Number(l.begin&0xffffn),h=Number(l.end>>16n),u=Math.min(s,h+Et),I=c[c.length-1];I!==void 0&&g<=I.to+wf?(I.to=Math.max(I.to,u),I.lastBlock=Math.max(I.lastBlock,h)):c.push({from:g,to:u,lastBlock:h,dataFrom:f})}return c}function bi(t){let e=0;for(const n of t)e+=n.to-n.from;return e}const yf=2*Et,Nf=Et,ur=1<<20,kf=4*Et,bf=16384,Df=1<<24,Mf=1<<18,Ff=1<<24,Nn=18,Pt=[31,139,8,4],me=36;function jt(t,e){return t<0?Number.POSITIVE_INFINITY:t*2**32+e+1}class yA extends Error{constructor(e,n){super("The reads are not in coordinate order."),this.before=e,this.after=n,this.name="UnsortedError"}}function Ir(t,e){return t.refId<0?"unplaced":`${e[t.refId]?.name??`reference ${t.refId}`}:${(t.pos+1).toLocaleString("en-US")}`}function Sf(t,e){const n=e-1;return t>>14===n>>14?32767/7+(t>>14):t>>17===n>>17?4095/7+(t>>17):t>>20===n>>20?511/7+(t>>20):t>>23===n>>23?63/7+(t>>23):t>>26===n>>26?7/7+(t>>26):0}class ds{constructor(e,n,A,s){this.handle=e,this.size=n,this.refs=A,this.progress=s,this.lineStart=[];let r=0;for(const o of A)this.lineStart.push(r),r+=Math.max(0,o.length);this.lineLength=r}probes=[];answers=new Map;probing=new Map;lastWalk=null;walking=new Map;bytesRead=0;first=null;lineStart;lineLength;static async open(e,n,A,s,r){const o=new ds(e,n,A.refs,s);if(o.first=await o.firstRecord(A.recordsFrom),o.first!==null&&A.sortOrder!=="coordinate")for(const i of[.125,.375,.625,.875])r!==void 0&&await r(),await o.probeAt(Math.floor(n*i));return o}get bytes(){return this.bytesRead}get probeCount(){return this.probes.length}async spansFor(e,n,A,s,r){if(this.first===null||A<=n)return[];const o=await this.locate(e,Math.max(0,n-bf),s);if(o===null||o.key>=jt(e,A))return[];if(r!==void 0&&o.block+r<this.size){s!==void 0&&await s();const c=await this.probeAt(dr(o.block+r,o.block));if(c.key<jt(e,A)){const l=c.block;return[{from:o.block,to:Math.min(this.size,l+Et),lastBlock:l,dataFrom:o.within}]}}const i=await this.locate(e,A,s),a=i===null||i.tail===!0?this.size:i.block;return[{from:o.block,to:Math.min(this.size,a+Et),lastBlock:a,dataFrom:o.within}]}locate(e,n,A){if(this.first===null)return Promise.resolve(null);const s=jt(e,n);if(this.first.key>=s)return Promise.resolve(this.first);const r=this.answers.get(s);if(r!==void 0)return r;const o=this.search(e,n,A).then(i=>(i!==null&&i.tail!==!0&&this.remember(i,!0),i));return this.answers.set(s,o),o.catch(()=>this.answers.delete(s)),o}async search(e,n,A){if(this.first===null)return null;const s=jt(e,n);let r=this.first,o=null;for(const c of this.probes)if(c.key<s)r=c;else{o=c;break}let i=!0;for(;;){const c=o===null?this.size:o.block,l=c-r.block;if(l<=kf)break;A!==void 0&&await A();const g=i?this.guess(r,o,e,n):null,f=await this.probeAt(dr(g??Math.floor((r.block+c)/2),r.block));if(f.block>=c)break;f.key>=s?o=f:r=f,i=(o===null?this.size:o.block)-r.block<=l/2}const a=o===null||o.tail===!0?this.size:Math.min(this.size,o.block+Et);return this.walk(r,a,s)}lineOf(e,n){return(this.lineStart[e]??this.lineLength)+Math.max(0,n)}guess(e,n,A,s){const r=this.lineOf(A,s),o=this.lineOf(e.refId,e.pos),i=n===null||n.tail===!0||n.refId<0?this.lineLength:this.lineOf(n.refId,n.pos);if(i<=o)return null;const a=(r-o)/(i-o);if(!(a>0&&a<1))return null;const c=n===null?this.size:n.block,l=e.block+Math.floor(a*(c-e.block));return Math.min(Math.max(l,e.block+1),c-2*Et)}async walk(e,n,A){if(n<=e.block)return null;let s=this.lastWalk;if(s===null||e.block<s.from||n>s.to){const c=`${e.block}-${n}`;let l=this.walking.get(c);if(l===void 0){l=this.read(n-e.block,e.block).then(async f=>{const{bytes:h,blocks:u}=await NA(f,e.block);return{from:e.block,to:n,bytes:h,blocks:u}}),this.walking.set(c,l);const g=()=>{this.walking.delete(c)};l.then(g,g)}s=await l,this.lastWalk=s}const{bytes:r,blocks:o}=s,i=o.find(c=>c.fileAt===e.block);if(i===void 0)return this.lastWalk=null,this.walk(e,n,A);let a=null;return wn(r,i.from+e.within,c=>jt(c.refId,c.pos)<A?!0:(a=kA(o,c.at-4,c.refId,c.pos),!1)),a}probeAt(e){const n=this.probing.get(e);if(n!==void 0)return n;const A=this.probe(e);this.probing.set(e,A);const s=()=>{this.probing.delete(e)};return A.then(s,s),A}async probe(e){let n=yf;for(;;){const A=Math.min(this.size,e+n);if(A<=e)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});const s=await this.read(A-e,e),r=await Lf(s,e,this.refs,this.size);if(r.kind==="record")return this.remember(r.placed);if(r.kind==="end"||A>=this.size)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});if(n>=ur)throw new Error(`no alignment record could be made out within ${ur>>20} MB of byte ${e.toLocaleString("en-US")}`);n*=4}}remember(e,n=!1){let A=this.probes.length;for(;A>0&&this.probes[A-1].block>e.block;)A--;const s=this.probes[A-1];if(s!==void 0&&s.block===e.block&&s.within===e.within)return s;if(n)return this.probes.splice(A,0,e),e;const r=A===0?this.first:this.probes[A-1],o=A<this.probes.length?this.probes[A]:null;if(r!==null&&r.key>e.key)throw new yA(r,e);if(o!==null&&e.key>o.key)throw new yA(e,o);return this.probes.splice(A,0,e),e}async firstRecord(e){let n=Mf;for(;;){const A=await this.read(Math.min(n,this.size),0);let s=0,r=0;for(;s+Nn<=A.length;){const o=ye(A.subarray(s,Math.min(s+64,A.length)));if(o===null||s+o>A.length)break;const i=Di(A,s+o-4);if(e<r+i){const{bytes:a,blocks:c}=await NA(A.subarray(s),s),l=e-r;if(l+me>a.length){if(A.length>=this.size)return null;break}if(!bA(a,l,this.refs))throw new Error("the first alignment record is not where the header says it begins");const g=new DataView(a.buffer,a.byteOffset,a.byteLength);return kA(c,l,g.getInt32(l+4,!0),g.getInt32(l+8,!0))}r+=i,s+=o}if(A.length>=this.size)return null;if(n>=Ff)throw new Error("the header does not end within the first 16 MB");n*=4}}async read(e,n){const A=await this.handle.read(e,n);return this.bytesRead+=A.length,this.progress!==void 0&&this.progress(this.bytesRead),A}}async function NA(t,e){const n=[],A=[];let s=0,r=0,o=!1;for(;r+Nn<=t.length;){const c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const l=await Ot(t.subarray(r,r+c),0);l.length===0&&(o=!0),A.push({fileAt:e+r,from:s,to:s+l.length}),n.push(l),s+=l.length,r+=c}const i=new Uint8Array(s);let a=0;for(const c of n)i.set(c,a),a+=c.length;return{bytes:i,blocks:A,sawEnd:o}}function kA(t,e,n,A){for(const r of t)if(e>=r.from&&e<r.to)return{block:r.fileAt,within:e-r.from,refId:n,pos:A,key:jt(n,A)};const s=t[t.length-1];return{block:s.fileAt,within:e-s.from,refId:n,pos:A,key:jt(n,A)}}function Rf(t,e,n){for(let A=0;A+Nn<=t.length;A++){if(t[A]!==Pt[0]||t[A+1]!==Pt[1]||t[A+2]!==Pt[2]||t[A+3]!==Pt[3])continue;const s=ye(t.subarray(A,Math.min(A+64,t.length)));if(s===null||s>Et||s<Nn+8)continue;const r=A+s;if(r>t.length)return e+r===n?A:"more";if(!(Di(t,r-4)>Et)){if(e+r===n)return A;if(r+3<=t.length){if(t[r]===Pt[0]&&t[r+1]===Pt[1]&&t[r+2]===Pt[2])return A;continue}return"more"}}return"more"}async function Lf(t,e,n,A){const s=Rf(t,e,A);if(s==="more")return e+t.length>=A?{kind:"end"}:{kind:"more"};const{bytes:r,blocks:o,sawEnd:i}=await NA(t.subarray(s),e+s);if(r.length===0)return i||e+t.length>=A?{kind:"end"}:{kind:"more"};const a=xf(r,n);if(a>=0){const c=new DataView(r.buffer,r.byteOffset,r.byteLength);return{kind:"record",placed:kA(o,a,c.getInt32(a+4,!0),c.getInt32(a+8,!0))}}return i||e+t.length>=A?{kind:"end"}:{kind:"more"}}function xf(t,e){const n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let A=0;A+me<=t.length;A++){if(!bA(t,A,e,n))continue;const s=A+4+n.getInt32(A,!0);if(s+me<=t.length){if(bA(t,s,e,n))return A;continue}if(Gf(t,A,n))return A}return-1}function bA(t,e,n,A=new DataView(t.buffer,t.byteOffset,t.byteLength)){if(e+me>t.length)return!1;const s=A.getInt32(e,!0);if(s<32||s>Df)return!1;const r=A.getInt32(e+4,!0);if(r<-1||r>=n.length)return!1;const o=A.getInt32(e+8,!0);if(o<-1||r>=0&&o>n[r].length)return!1;const i=t[e+12];if(i<1)return!1;const a=A.getUint16(e+16,!0),c=A.getInt32(e+20,!0);if(c<0)return!1;const l=A.getInt32(e+24,!0);if(l<-1||l>=n.length||A.getInt32(e+28,!0)<-1||32+i+a*4+(c+1>>1)+c>s)return!1;const g=e+me,f=g+i;if(f>t.length||t[f-1]!==0)return!1;for(let h=g;h<f-1;h++){const u=t[h];if(u<33||u>126)return!1}return!0}function Gf(t,e,n){const A=n.getInt32(e+8,!0);if(A<0||A>=1<<29)return!1;const s=e+me+t[e+12],r=n.getUint16(e+16,!0);if(s+r*4>t.length)return!1;const o=A+Zo(n,s,r);return n.getUint16(e+14,!0)===Sf(A,Math.max(o,A+1))}function dr(t,e){const n=t-t%Nf;return n>e?n:t}function Di(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0}const DA=62,Cr=10;function kn(t){return t.length>0&&t[0]===DA}function Uf(t){const e=new TextDecoder,n=[];t.length>0&&t[0]===DA&&n.push(0);for(let o=1;o<t.length;o++)t[o]===DA&&t[o-1]===Cr&&n.push(o);const A=[],s=new Map;let r=0;for(let o=0;o<n.length;o++){const i=n[o];let a=t.indexOf(Cr,i);a<0&&(a=t.length);const c=vf(e,t,i+1,a),l=Math.min(a+1,t.length),g=o+1<n.length?n[o+1]:t.length;if(c===""||s.has(c))continue;let f=0;for(let I=l;I<g;I++)t[I]>32&&f++;if(f===0)continue;const h=new Uint8Array(f);let u=0;for(let I=l;I<g;I++){const d=t[I];d>32&&(h[u++]=d)}s.set(c,h),A.push({name:c,length:f}),r+=f}return{contigs:A,bases:s,total:r}}function vf(t,e,n,A){let s=n;for(;s<A&&e[s]>32;)s++;return t.decode(e.subarray(n,s)).trim()}const Ne=(()=>{const t=new Uint8Array(256).fill(4),e=(n,A)=>{t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A};return e("A",0),e("C",1),e("G",2),e("T",3),e("U",3),t})(),Tf=25;function Qr(t,e,n,A){const s=Math.max(0,Math.floor(e)),r=Math.min(t.length,Math.ceil(n)),o=Math.max(Tf,Math.round(A)),i=r>s?Math.ceil((r-s)/o):0,a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i);for(let g=0;g<i;g++){const f=s+g*o,h=Math.min(r,f+o);let u=0,I=0;for(let d=f;d<h;d++){const C=Ne[t[d]];C===1||C===2?u++:(C===0||C===3)&&I++}a[g]=f,c[g]=h,l[g]=u+I>0?u/(u+I):Number.NaN}return{starts:a,ends:c,values:l}}const Mi={exclude:Xo,minMapq:0};function Jf(t,e,n,A,s,r,o=Mi,i,a,c){const l=s-A;if(r<=0||l<=0)return{depth:new Float32Array(0),variant:null,total:0,kept:0,max:0};const g=l/r,f=new Float64Array(r),h=new Float64Array(r+1),u=i===void 0?null:new Float64Array(r),I=i===void 0?null:new Float64Array(r+1);let d=0,C=0;wn(t,e,p=>{if(d++,p.refId===n&&(p.flag&o.exclude)===0&&!(p.mapq<o.minMapq)&&!(p.pos<0||p.end<=A||p.pos>=s)){if(C++,Kf(t,p,(w,y)=>{const N=Math.max(w,A),k=Math.min(y,s);k<=N||Br(f,h,(N-A)/g,(k-A)/g,r)}),a!==void 0){let w=null;Of(t,p,(y,N)=>{if(N<=A||y>=s)return;w??=_f(t,p);const k=`${y}:${N}:${w}`;a.set(k,(a.get(k)??0)+1)})}if(c!==void 0)for(const w of jo(t,p)){if(w.pos<A||w.pos>=s)continue;const y=Hl(w.prob,c.threshold);if(y<0)continue;let N=c.tally.get(w.code);N===void 0&&(N={calls:new Float64Array(r),modified:new Float64Array(r)},c.tally.set(w.code,N));const k=Math.min(r-1,Math.floor((w.pos-A)/g));N.calls[k]++,y===1&&N.modified[k]++}i===void 0||u===null||I===null||$f(t,p,i,w=>{w<A||w>=s||Br(u,I,(w-A)/g,(w+1-A)/g,r)},[A,s])}});let E=0,B=0;const Q=new Float32Array(r);for(let p=0;p<r;p++){E+=h[p];const w=E+f[p];Q[p]=w,w>B&&(B=w)}let m=null;if(u!==null&&I!==null){m=new Float32Array(r);let p=0;for(let w=0;w<r;w++)p+=I[w],m[w]=p+u[w]}return{depth:Q,variant:m,total:d,kept:C,max:B}}function $f(t,e,n,A,s=[Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY]){const r=new DataView(t.buffer,t.byteOffset,t.byteLength),o=Pe(t,e),i=o===null?e.cigarOps:o.length,a=f=>o===null?r.getUint32(e.cigarAt+f*4,!0):o[f],c=n.start+n.bases.length;let l=e.pos,g=0;for(let f=0;f<i;f++){const h=a(f),u=h&15,I=h>>>4;if(u===2){const d=Math.max(0,s[0]-l),C=Math.min(I,s[1]-l);for(let E=d;E<C;E++)A(l+E);l+=I;continue}if(mt(u)&&Yt(u)){const d=Math.max(0,n.start-l,s[0]-l),C=Math.min(I,c-l,s[1]-l,e.seqLength-g);for(let E=d;E<C;E++){const B=l+E-n.start,Q=Ne[n.bases[B]];if(Q===4)continue;const m=Yf(t,e.seqAt,g+E);m!==4&&m!==Q&&A(l+E)}l+=I,g+=I;continue}mt(u)&&(l+=I),Yt(u)&&(g+=I)}}function Yf(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[as.charCodeAt(s)]}function Br(t,e,n,A,s){const r=Math.min(s-1,Math.max(0,Math.floor(n))),o=Math.min(s-1,Math.max(0,Math.ceil(A)-1));if(!(o<r)){if(r===o){t[r]+=Math.min(A,r+1)-Math.max(n,r);return}t[r]+=r+1-Math.max(n,r),t[o]+=Math.min(A,o+1)-o,o>r+1&&(e[r+1]+=1,e[o]-=1)}}function Of(t,e,n){const A=Pe(t,e),s=A===null?e.cigarOps:A.length,r=A===null?new DataView(t.buffer,t.byteOffset,t.byteLength):null;let o=e.pos;for(let i=0;i<s;i++){const a=r===null?A[i]:r.getUint32(e.cigarAt+i*4,!0),c=a&15,l=a>>>4;if(c===3){l>0&&n(o,o+l),o+=l;continue}mt(c)&&(o+=l)}}function _f(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=t[A],o=t[A+1],i=String.fromCharCode(t[A+2]);if(A+=3,i==="A"&&(r===88&&o===83||r===116&&o===115)){const a=t[A]===43?1:t[A]===45?-1:0;return r===88?a:(e.flag&At.REVERSE)!==0?-a:a}if(A=is(t,A,i,s),A<0)return 0}return 0}function Kf(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=Pe(t,e),r=s===null?e.cigarOps:s.length,o=l=>s===null?A.getUint32(e.cigarAt+l*4,!0):s[l];let i=e.pos,a=e.pos,c=!1;for(let l=0;l<r;l++){const g=o(l),f=g&15,h=g>>>4;if(f===3){c&&i>a&&n(a,i),c=!1,i+=h,a=i;continue}mt(f)&&(c||(a=i,c=!0),i+=h)}c&&i>a&&n(a,i)}function qf(t,e,n){let A=2166136261;for(let s=e;s<n;s++)A^=t[s],A=Math.imul(A,16777619)>>>0;return A/4294967296}function Hf(t,e,n,A,s,r,o){const i=new DataView(t.buffer,t.byteOffset,t.byteLength),a=o.filter;let c=0;const l=[];wn(t,e,C=>{Er(C,A,s,r,a)&&(c++,l.push(qf(t,C.at+32,C.at+32+C.nameBytes-1)))});const g=Math.max(1,Math.min(o.maxReads,o.maxRows*Wf)),f=c<=g?1:g/c,h=f<1,u=[],I=[];let d=0;return wn(t,e,C=>{!Er(C,A,s,r,a)||l[d++]>=f||I.push(Pf(t,i,C,o,u))}),{pile:nh(I,n,A,s,r,o),total:c,kept:I.length,capped:h,rows:u.length,usedMd:I.some(C=>C.fromMd),usedCigar:I.some(C=>C.fromCigar)}}const Wf=8;function Er(t,e,n,A,s){return t.refId!==e||(t.flag&s.exclude)!==0||t.mapq<s.minMapq?!1:t.pos>=0&&t.end>n&&t.pos<A}function Pf(t,e,n,A,s){const r=Pe(t,n),o=r===null?n.cigarOps:r.length,i=h=>r===null?e.getUint32(n.cigarAt+h*4,!0):r[h],a=[];let c=0,l=0;for(let h=0;h<o;h++){const u=i(h);a.push(u);const I=u&15,d=u>>>4;I===4&&(h===0||h===1&&(i(0)&15)===5?c=d:(h===o-1||h===o-2&&(i(o-1)&15)===5)&&(l=d))}const g=Vf(t,n,a,A.reference),f=Xf(s,n.pos-c,n.end+l);return{refStart:n.pos,refEnd:n.end,clipStart:c,clipEnd:l,row:f,flag:n.flag,mapq:n.mapq,mateContig:n.nextRefId,matePos:n.nextPos,tlen:n.tlen,name:Rl(t,n),ops:a,diffPos:g.pos,diffBase:g.base,fromMd:g.fromMd,fromCigar:g.fromCigar,mods:A.colourBy==="basemod"?jo(t,n,a):null}}const zf=3;function Xf(t,e,n){for(let A=0;A<t.length;A++)if(t[A]+zf<=e)return t[A]=n,A;return t.push(n),t.length-1}function MA(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[as.charCodeAt(s)]}function Vf(t,e,n,A){const s={pos:[],base:[],fromMd:!1,fromCigar:!1};if(n.some(o=>(o&15)===8)){let o=e.pos,i=0;for(const a of n){const c=a&15,l=a>>>4;if(c===8){const g=Math.min(l,e.seqLength-i);for(let f=0;f<g;f++)s.pos.push(o+f),s.base.push(MA(t,e.seqAt,i+f))}mt(c)&&(o+=l),Yt(c)&&(i+=l)}return s.fromCigar=!0,s}const r=Zf(t,e);if(r!==null)return jf(t,e,n,r,s),s.fromMd=!0,s;if(A!==void 0){let o=e.pos,i=0;const a=A.start+A.bases.length;for(const c of n){const l=c&15,g=c>>>4;if(mt(l)&&Yt(l)){const f=Math.max(0,A.start-o),h=Math.min(g,a-o,e.seqLength-i);for(let u=f;u<h;u++){const I=o+u-A.start,d=Ne[A.bases[I]],C=MA(t,e.seqAt,i+u);d!==C&&d<4&&C<4&&(s.pos.push(o+u),s.base.push(C))}}mt(l)&&(o+=g),Yt(l)&&(i+=g)}}return s}function Zf(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=String.fromCharCode(t[A],t[A+1]),o=String.fromCharCode(t[A+2]);if(A+=3,r==="MD"&&o==="Z"){let i=A;for(;i<s&&t[i]!==0;)i++;return new TextDecoder().decode(t.subarray(A,i))}if(A=is(t,A,o,s),A<0)return null}return null}function jf(t,e,n,A,s){const r=[],o=[];let i=e.pos,a=0;for(const l of n){const g=l&15,f=l>>>4;if(mt(g)&&Yt(g)){const h=Math.min(f,e.seqLength-a);for(let u=0;u<h;u++)r.push(i+u),o.push(a+u)}mt(g)&&(i+=f),Yt(g)&&(a+=f)}let c=0;for(const l of A.match(/(\d+|\^[A-Za-z]+|[A-Za-z])/g)??[]){if(l.charCodeAt(0)===94)continue;const g=Number(l);if(Number.isFinite(g)&&l!==""){c+=g;continue}c<r.length&&(s.pos.push(r[c]),s.base.push(MA(t,e.seqAt,o[c]))),c+=1}}const Fi=1e3;function th(t,e,n){switch(e){case"strand":return(t.flag&At.REVERSE)!==0?1:0;case"mapq":return t.mapq===0?0:t.mapq<30?1:2;case"pair":return(t.flag&At.PAIRED)===0?0:(t.flag&At.PROPER_PAIR)!==0?1:2;case"mate":return(t.flag&At.PAIRED)===0?0:(t.flag&At.MATE_UNMAPPED)!==0||t.mateContig<0?1:t.mateContig===n?2:3;case"insert":{const A=Math.abs(t.tlen);return(t.flag&At.PAIRED)===0||A===0?0:A>Fi?2:1}default:return 0}}function eh(t){switch(t){case"strand":return["forward","reverse"];case"mapq":return["MAPQ 0","MAPQ < 30","MAPQ ≥ 30"];case"pair":return["unpaired","proper pair","not a proper pair"];case"mate":return["unpaired","mate unmapped","same sequence","another sequence"];case"insert":return["unpaired","ordinary insert",`insert > ${Fi}`];case"basemod":return["reads"];default:return["reads"]}}function nh(t,e,n,A,s,r){const o=t.length,i={contig:e,start:A,end:s,length:o,refStart:new Int32Array(o),refEnd:new Int32Array(o),clipStart:new Int32Array(o),clipEnd:new Int32Array(o),row:new Int16Array(o),flags:new Uint16Array(o),mapq:new Uint8Array(o),mateContig:new Int32Array(o),matePos:new Int32Array(o),tlen:new Int32Array(o),group:new Uint8Array(o),mate:new Int32Array(o).fill(-1),opAt:new Int32Array(o+1),opCode:new Uint8Array(t.reduce((l,g)=>l+g.ops.length,0)),opLen:new Int32Array(t.reduce((l,g)=>l+g.ops.length,0)),diffAt:new Int32Array(o+1),diffPos:new Int32Array(t.reduce((l,g)=>l+g.diffPos.length,0)),diffBase:new Uint8Array(t.reduce((l,g)=>l+g.diffPos.length,0)),contigs:[],groups:eh(r.colourBy),names:[]};let a=0,c=0;for(let l=0;l<o;l++){const g=t[l];i.refStart[l]=g.refStart,i.refEnd[l]=g.refEnd,i.clipStart[l]=g.clipStart,i.clipEnd[l]=g.clipEnd,i.row[l]=g.row,i.flags[l]=g.flag,i.mapq[l]=g.mapq,i.mateContig[l]=g.mateContig,i.matePos[l]=g.matePos,i.tlen[l]=g.tlen,i.opAt[l]=a;for(const f of g.ops)i.opCode[a]=f&15,i.opLen[a]=f>>>4,a++;i.diffAt[l]=c;for(let f=0;f<g.diffPos.length;f++)i.diffPos[c]=g.diffPos[f],i.diffBase[c]=g.diffBase[f],c++;r.withNames&&i.names.push(g.name)}i.opAt[o]=a,i.diffAt[o]=c,r.colourBy==="basemod"&&(i.mods=Ah(t));for(let l=0;l<o;l++)i.group[l]=th(t[l],r.colourBy,n);return sh(i,n,e,r),rh(i,t),i}function Ah(t){const e=new Map;let n=0;for(const i of t)for(const a of i.mods??[]){const c=e.get(a.code)??[0,0];a.prob>=128&&c[0]++,c[1]++,e.set(a.code,c),n++}const A=[...e.entries()].sort((i,a)=>a[1][0]-i[1][0]||a[1][1]-i[1][1]||(i[0]<a[0]?-1:1)),s=new Map(A.map(([i],a)=>[i,a])),r={at:new Int32Array(t.length+1),pos:new Int32Array(n),code:new Uint8Array(n),prob:new Uint8Array(n),codes:A.map(([i])=>i),counts:A.map(([,[i]])=>i)};let o=0;for(let i=0;i<t.length;i++){r.at[i]=o;for(const a of t[i].mods??[])r.pos[o]=a.pos,r.code[o]=s.get(a.code)??0,r.prob[o]=a.prob,o++}return r.at[t.length]=o,r}function sh(t,e,n,A){const s=new Map;for(let r=0;r<t.length;r++){const o=t.mateContig[r];if(o<0){t.mateContig[r]=-1;continue}let i=s.get(o);i===void 0&&(i=t.contigs.length,t.contigs.push(o===e?n:A.refNameOf?.(o)??""),s.set(o,i)),t.mateContig[r]=i}}function rh(t,e){const n=new Map;for(let A=0;A<e.length;A++){const s=e[A].name;if(s===""||(t.flags[A]&At.SUPPLEMENTARY)!==0)continue;const r=n.get(s);if(r===void 0){n.set(s,A);continue}t.mate[r]===-1&&t.mate[A]===-1&&((t.flags[r]^t.flags[A])&(At.FIRST_IN_PAIR|At.SECOND_IN_PAIR))!==0&&(t.mate[r]=A,t.mate[A]=r)}}function Si(t){const e=t.split(`
|
|
10
|
-
`,200);let n=0;for(const A of e){const s=A.trim();if(s==="")continue;if(/^(fixedStep|variableStep)\b/i.test(s))return"wig";if(/^track\b/i.test(s)){if(/type\s*=\s*"?bedGraph/i.test(s))return"bedgraph";if(/type\s*=\s*"?wiggle_0/i.test(s))return"wig";continue}if(s.startsWith("#")||/^browser\b/i.test(s))continue;const r=s.split(/\t| +/);if(r.length!==4||!
|
|
11
|
-
`)){const o=r.trim();if(o===""||o.startsWith("#")||/^(track|browser)\b/i.test(o))continue;const i=o.split(/\t| +/);if(i.length<4)continue;const a=Number(i[1]),c=Number(i[2]),l=Number(i[3]);if(!Number.isInteger(a)||!Number.isInteger(c)||!Number.isFinite(l)||c<=a)continue;let g=e.get(i[0]);g===void 0&&(g=new
|
|
12
|
-
`)){const h=f.trim();if(h===""||h.startsWith("#")||/^(track|browser)\b/i.test(h))continue;const u=/^(fixedStep|variableStep)\s+(.*)$/i.exec(h);if(u!==null){r=u[1].toLowerCase()==="fixedstep"?"fixed":"variable";const I=new Map;for(const d of u[2].split(/\s+/)){const C=d.indexOf("=");C>0&&I.set(d.slice(0,C).toLowerCase(),d.slice(C+1))}if(o=I.get("chrom")??"",i=Number(I.get("span")??1)||1,a=Number(I.get("step")??1)||1,c=(Number(I.get("start")??1)||1)-1,o===""){l=null;continue}l=e.get(o)??new
|
|
13
|
-
`).join(""),c=i.map(([I])=>I).join(";"),l=[t.method.toUpperCase(),
|
|
14
|
-
`),g=`${s}/${o.region}/${Ui}/${
|
|
15
|
-
`),h=wr(Ge(Ih(o.secretAccessKey,s,o.region),te(f))),u={Authorization:`${pr} Credential=${o.accessKeyId}/${g}, SignedHeaders=${c}, Signature=${h}`,"x-amz-content-sha256":r,"x-amz-date":A};return o.sessionToken!==void 0&&o.sessionToken!==""&&(u["x-amz-security-token"]=o.sessionToken),u}function Ch(t){const e={...t.headers};return t.credential===void 0?e:{...e,...dh({method:(t.method??"GET").toUpperCase(),url:t.url,credential:t.credential})}}function Ti(t,e){const n=e.method??Qh(t);return{...t,headers:{...Bh(t?.headers),...Ch({...e,method:n})}}}function Qh(t){const e=t?.method;return typeof e=="string"&&e!==""?e:"GET"}function Bh(t){if(t===void 0)return{};if(typeof Headers<"u"&&t instanceof Headers){const e={};return t.forEach((n,A)=>{e[A]=n}),e}return Array.isArray(t)?Object.fromEntries(t):{...t}}function Eh(t){const e=[],n=new Set,A=s=>{if(!(s===null||typeof s!="object")){if(ArrayBuffer.isView(s)){const r=s.buffer;r instanceof ArrayBuffer&&!n.has(r)&&(n.add(r),e.push(r));return}if(Array.isArray(s)){if(s.length===0||typeof s[0]!="object")return;for(const r of s)A(r);return}for(const r of Object.values(s))A(r)}};return A(t),e}function Bs(){return typeof MessageChannel>"u"?new Promise(t=>{setTimeout(t,0)}):new Promise(t=>{const e=new MessageChannel;e.port1.onmessage=()=>{e.port1.close(),e.port2.close(),t()},e.port2.postMessage(void 0)})}const mh=200,wh=3e3,ph=3e4,yh=1e3;function Nh(t=mh,e=wh){const n=[];let A=performance.now();const s=setInterval(()=>{const r=performance.now(),o=r-A;for(A=r,o<ph?n.push({at:r,span:o,late:Math.max(0,o-t)}):n.length=0;n.length>0&&r-n[0].at>e;)n.shift()},t);return{busy(){if(n.length<3)return 0;let r=0,o=0;for(const i of n)r+=i.span,o+=i.late;return r<=0?0:Math.min(1,o/r)},reset(){n.length=0,A=performance.now()},stop(){clearInterval(s)}}}function kh(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#")||/^(track|browser)\b/.test(s))continue;const r=s.split(/\s+/);if(r.length<2)return[];const o=Number(r[1]);if(!Number.isInteger(o)||o<=0)return[];n.has(r[0])||(n.add(r[0]),e.push({name:r[0],length:o}))}return e}function bh(t,e=""){const n=/\.fai$/i.test(e);let A=0;for(const s of t.split(/\r?\n/,200)){const r=s.trim();if(r===""||r.startsWith("#")||/^(track|browser)\b/.test(r))continue;const o=r.split(/\s+/);if((n?o.length<2:o.length!==2)||!/^\d+$/.test(o[1])||Number(o[1])<=0)return!1;A++}return A>0}const Dh=4096;function Mh(t,e){const n=Kt(t.contigs,e);return n<0?void 0:t.contigs[n]}function Fh(t,e,n){const A=Mh(t,e.contig);if(A===void 0||A.bins===0)return null;const s=Math.max(0,Math.floor(e.start)),r=Math.min(A.length,Math.ceil(e.end));if(!(r>s))return null;const o=Math.floor(s/t.binsize),i=Math.min(A.bins-1,Math.floor((r-1)/t.binsize));if(i<o)return null;const a=i-o+1,c=n?1:Math.max(1,Math.ceil(a/Dh)),l=Math.ceil(a/c),g=new Int32Array(l),f=new Int32Array(l),h=new Float32Array(l),u=c>1?new Float32Array(l):null,I=c>1?new Float32Array(l):null;let d=0;for(let C=0;C<l;C++){const E=o+C*c,B=Math.min(i+1,E+c);let Q=0,m=0,p=Number.POSITIVE_INFINITY,w=Number.NEGATIVE_INFINITY;for(let y=E;y<B;y++){const N=A.startBin+y-t.firstBin;if(N<0||N>=t.values.length)continue;const k=t.values[N];Number.isNaN(k)||(Q+=k,m++,k<p&&(p=k),k>w&&(w=k))}m!==0&&(g[d]=E*t.binsize,f[d]=Math.min(A.length,B*t.binsize),h[d]=Q/m,u!==null&&I!==null&&(u[d]=p,I[d]=w),d++)}return d===0?null:{contig:e.contig,start:s,end:r,starts:g.slice(0,d),ends:f.slice(0,d),values:h.slice(0,d),min:u===null?null:u.slice(0,d),max:I===null?null:I.slice(0,d),variant:null,summary:c>1}}function Sh(t,e,n,A=!1){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const i of e){const a=Fh(t,i,A);if(a!==null){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push(a)}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}function T(t,e,n){const A=t[e];return typeof A=="number"&&Number.isFinite(A)?A:n}function st(t,e,n){const A=t[e];return typeof A=="string"?A:n}function Lt(t,e,n){const A=t[e];return typeof A=="boolean"?A:n}function Yn(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n!==""?[n]:[]}function On(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n.trim()!==""?[n.trim()]:null}function at(t,e){const n=t[e];return typeof n=="string"&&n!==""?n:null}function ne(t,e,n){return{value:t?.[n],chosen:at(e,n)!==null}}function _n(t,e){return t.value!==void 0?null:t.chosen?e.gone:e.unchosen}function Rh(t){let e=0,n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isNaN(s)||(e+=s,n++)}return n===0?Number.NaN:e/n}function Ji(t){const e=Es(t);return ms(e,.5)}function Lh(t,e){const n=Es(t),A=n.length;if(A===0)return Number.NaN;const s=Number.isFinite(e)?Math.min(.5,Math.max(0,e)):0,r=Math.floor(A*s);if(A-2*r<=0)return ms(n,.5);let o=0;for(let i=r;i<A-r;i++)o+=n[i];return o/(A-2*r)}function Bt(t,e=0,n=t.length-e){if(n<8){let s=0;for(let r=0;r<n;r++)s+=t[e+r];return s}if(n<=128){let s=t[e],r=t[e+1],o=t[e+2],i=t[e+3],a=t[e+4],c=t[e+5],l=t[e+6],g=t[e+7],f=8;for(;f<n-n%8;f+=8){const u=e+f;s+=t[u],r+=t[u+1],o+=t[u+2],i+=t[u+3],a+=t[u+4],c+=t[u+5],l+=t[u+6],g+=t[u+7]}let h=s+r+(o+i)+(a+c+(l+g));for(;f<n;f++)h+=t[e+f];return h}let A=Math.floor(n/2);return A-=A%8,Bt(t,e,A)+Bt(t,e+A,n-A)}function SA(t,e=0,n=t.length-e){return Bt(t,e,n)/n}const bn=3;function $i(t,e){const n=Math.min(t.length,e.length);let A=0,s=0,r=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];Number.isNaN(f)||Number.isNaN(h)||(s+=f,r+=h,A++)}if(A<bn)return Number.NaN;const o=s/A,i=r/A;let a=0,c=0,l=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];if(Number.isNaN(f)||Number.isNaN(h))continue;const u=f-o,I=h-i;a+=u*I,c+=u*u,l+=I*I}return c<=0||l<=0?Number.NaN:a/Math.sqrt(c*l)}function xh(t,e){const n=Math.min(t.length,e.length);let A=0;for(let i=0;i<n;i++)!Number.isNaN(t[i])&&!Number.isNaN(e[i])&&A++;if(A<bn)return Number.NaN;const s=new Float64Array(A),r=new Float64Array(A);let o=0;for(let i=0;i<n;i++){const a=t[i],c=e[i];Number.isNaN(a)||Number.isNaN(c)||(s[o]=a,r[o]=c,o++)}return $i(yr(s),yr(r))}function yr(t){const e=t.length,n=new Float64Array(e),A=[];for(let r=0;r<e;r++)Number.isNaN(t[r])?n[r]=Number.NaN:A.push(r);A.sort((r,o)=>t[r]-t[o]);let s=0;for(;s<A.length;){let r=s+1;for(;r<A.length&&t[A[r]]===t[A[s]];)r++;const o=(s+r+1)/2;for(let i=s;i<r;i++)n[A[i]]=o;s=r}return n}function Yi(t,e){const n=Math.max(1,Math.trunc(e)),A=Es(t);if(A.length===0)return new Float64Array(0);const s=new Float64Array(n+1);for(let r=0;r<=n;r++)s[r]=ms(A,r/n);return s}function Es(t){let e=0;for(let s=0;s<t.length;s++)Number.isNaN(t[s])||e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++){const r=t[s];Number.isNaN(r)||(n[A]=r,A++)}return n.sort(),n}function ms(t,e){const n=t.length;if(n===0)return Number.NaN;if(n===1)return t[0];const A=Math.min(1,Math.max(0,e))*(n-1),s=Math.floor(A),r=Math.min(n-1,s+1),o=A-s;return t[s]+o*(t[r]-t[s])}const Gh=2e5,Uh=50,vh=async t=>{const e=Yn(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig and tick it under Tracks."),[];const n=ne(t.inputs.features,t.params,"features"),A=n.value;if(A===void 0)return t.note(_n(n,{unchosen:"A FRiP needs the features to measure inside, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),[];const s=[];let r=0;for(let B=0;B<A.contigs.length;B++){const Q=A.contigs[B];let m=Number.NaN,p=Number.NaN;const w=()=>{Number.isNaN(m)||(s.push({contig:Q,start:m,end:p}),r+=p-m)};for(let y=A.contigAt[B];y<A.contigAt[B+1];y++){const N=A.start[y],k=A.end[y];k<=N||(Number.isNaN(m)?(m=N,p=k):N<=p?p=Math.max(p,k):(w(),m=N,p=k))}w()}if(s.length===0)return t.note("The feature set covers no bases, so there is nothing to measure inside."),[];const o=t.inputs.contigLengths??{};let i=0;for(const B of Object.values(o))i+=B;i<=0&&t.note("This session knows no sequence lengths, so the fraction of the assembly the set covers cannot be worked out and the enrichment column is left empty. Load a chrom.sizes, or the map itself.");const a=new Float64Array(s.length);for(let B=0;B<s.length;B++)a[B]=s[B].end-s[B].start;const c=Ji(a),l=Math.max(0,Math.round(T(t.params,"resolution",0))),g=l>0?l:Math.max(1,Math.round(c/Uh)),f=i>0?Math.max(1,Math.round(i/Gh)):g,h=[];for(const[B,Q]of Object.entries(o))Q>0&&h.push({contig:B,start:0,end:Q});const u=B=>t.inputs.labels?.[B]??B,I=[],d=[],C=Lt(t.params,"perFeature",!1);for(let B=0;B<e.length;B++){t.throwIfCancelled();const Q=e[B],m=u(Q);t.progress(B,e.length,`${m} · features`);const p=await Nr(t,Q,s,g);t.throwIfCancelled(),t.progress(B+.5,e.length,`${m} · assembly`);const w=h.length>0?await Nr(t,Q,h,f):{signal:Number.NaN},y=w.signal>0?p.signal/w.signal:Number.NaN,N=i>0?r/i:Number.NaN;if(I.push({track:m,frip:y,covered:N,enrichment:N>0?y/N:Number.NaN,signal:p.signal,totalSignal:w.signal,inFeature:p.span>0?p.covered/p.span:Number.NaN}),C){const k=await Th(t,Q,A,g);t.throwIfCancelled();for(const b of k)d.push({track:m,...b,share:w.signal>0?Number(b.signal)/w.signal:Number.NaN})}}t.progress(e.length,e.length,"done"),t.note(`Features read at ${g.toLocaleString()} bp and the assembly at ${f.toLocaleString()} bp — a span-weighted sum estimates the same area at either, and the finer one is spent where the boundaries are.`);const E=[{kind:"table",id:"frip",label:`In ${s.length.toLocaleString()} merged feature${s.length===1?"":"s"}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"frip",label:"FRiP",kind:"number",digits:4,hint:"Signal inside over signal everywhere."},{key:"covered",label:"Genome covered",kind:"number",digits:4,hint:"Merged bases of the set over the assembly."},{key:"enrichment",label:"Enrichment",kind:"number",digits:2,hint:"FRiP over the covered fraction. 1 is a track with no preference."},{key:"signal",label:"Signal inside",kind:"number",digits:0},{key:"totalSignal",label:"Signal total",kind:"number",digits:0},{key:"inFeature",label:"Set with data",kind:"number",digits:3,hint:"Of the set’s bases, how many the track has a value for."}],rows:I.sort((B,Q)=>Number(Q.enrichment)-Number(B.enrichment))}];return C&&d.length>0&&E.push({kind:"table",id:"frip-features",label:"Per feature",columns:[{key:"track",label:"Track",kind:"text"},{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},{key:"signal",label:"Signal",kind:"number",digits:2},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"share",label:"Share of total",kind:"number",digits:6,hint:"This feature’s signal over the track’s whole signal."}],rows:d.sort((B,Q)=>Number(Q.signal)-Number(B.signal))}),E};async function Nr(t,e,n,A){const s=new Map;for(const a of n){const c=s.get(a.contig);c===void 0?s.set(a.contig,[a]):c.push(a)}let r=0,o=0,i=0;for(const[,a]of s){t.throwIfCancelled();for(const g of a)o+=g.end-g.start;const c=await t.sample(e,a,A),l=new Map;for(const g of a)l.set(Dn(g),g);for(const g of c.regions){const f=l.get(Dn(g));if(f!==void 0)for(let h=0;h<g.values.length;h++){const u=g.values[h];if(!Number.isFinite(u))continue;const I=Math.max(f.start,g.starts[h]),d=Math.min(f.end,g.ends[h]);d<=I||(r+=u*(d-I),i+=d-I)}}}return{signal:r,span:o,covered:i}}async function Th(t,e,n,A){const s=[],r=new Map;for(let o=0;o<n.length;o++){const i=n.contigs[n.contig[o]],a=r.get(i);a===void 0?r.set(i,[o]):a.push(o)}for(const[,o]of r){t.throwIfCancelled();const i=o.map(l=>Jh(n,l)),a=await t.sample(e,i,A),c=new Map;for(const l of a.regions)c.set(Dn(l),l);for(let l=0;l<o.length;l++){const g=i[l],f=c.get(Dn(g));if(f===void 0)continue;let h=0,u=0;for(let I=0;I<f.values.length;I++){const d=f.values[I];if(!Number.isFinite(d))continue;const C=Math.max(g.start,f.starts[I]),E=Math.min(g.end,f.ends[I]);E<=C||(h+=d*(E-C),u+=E-C)}s.push({contig:g.contig,start:g.start,end:g.end,name:n.name[o[l]]??"",signal:h,mean:u>0?h/u:Number.NaN})}}return s}function Jh(t,e){return{contig:t.contigs[t.contig[e]],start:t.start[e],end:t.end[e]}}function Dn(t){return`${t.contig}:${t.start}-${t.end}`}function $h(t){return .5*Yh(-t/Math.SQRT2)}function Yh(t){const e=Math.abs(t),n=e<2?1-Oh(e):_h(e);return t>=0?n:2-n}function Oh(t){let e=t,n=t;for(let A=1;A<200&&(e*=2*t*t/(2*A+1),n+=e,!(e<Math.abs(n)*1e-17));A++);return 2/Math.sqrt(Math.PI)*Math.exp(-t*t)*n}function _h(t){let n=1/t,A=1e300,s=n;for(let r=1;r<300;r++){const o=r/2;n=t+o*n,n===0&&(n=1e-300),A=t+o/A,A===0&&(A=1e-300),n=1/n;const i=A*n;if(s*=i,Math.abs(i-1)<1e-16)break}return Math.exp(-t*t)/Math.sqrt(Math.PI)*s}function Kh(t){const e=t.length,n=new Float64Array(e).fill(Number.NaN),A=[];for(let o=0;o<e;o++)Number.isFinite(t[o])&&A.push(o);A.sort((o,i)=>t[i]-t[o]);const s=A.length;let r=Number.POSITIVE_INFINITY;for(let o=0;o<s;o++){const i=s/(s-o);r=Math.min(r,i*t[A[o]]),n[A[o]]=Math.min(1,r)}return n}function Oi(t){return t.rows[1]<=t.rows[0]&&t.cols[1]<=t.cols[0]}function Ae(t){let e=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&(n[A++]=t[s]);return n.sort()}function Te(t,e){const n=t.length;if(n===0)return Number.NaN;const A=Math.min(n-1,Math.max(0,e*(n-1))),s=Math.floor(A),r=Math.min(n-1,s+1);return t[s]+(t[r]-t[s])*(A-s)}function qh(t){const e=Ae(t),n=e.length;if(n===0)return{n:0,mean:Number.NaN,sd:Number.NaN,median:Number.NaN,q1:Number.NaN,q3:Number.NaN};let A=0;for(let o=0;o<n;o++)A+=e[o];const s=A/n;let r=0;for(let o=0;o<n;o++)r+=(e[o]-s)**2;return{n,mean:s,sd:n>1?Math.sqrt(r/(n-1)):Number.NaN,median:Te(e,.5),q1:Te(e,.25),q3:Te(e,.75)}}function _i(t){const e=t.length,n=Array.from({length:e},(o,i)=>i).sort((o,i)=>t[o]-t[i]),A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o+1<e&&t[n[o+1]]===t[n[r]];)o++;const i=(r+o)/2+1;for(let c=r;c<=o;c++)A[n[c]]=i;const a=o-r+1;a>1&&(s+=a*a*a-a),r=o+1}return{ranks:A,ties:s}}function Hh(t,e){const n=Ae(t),A=Ae(e),s=n.length,r=A.length;if(s===0||r===0)return{u:Number.NaN,z:Number.NaN,p:Number.NaN,effect:Number.NaN};const o=new Float64Array(s+r);o.set(n,0),o.set(A,s);const{ranks:i,ties:a}=_i(o);let c=0;for(let C=0;C<s;C++)c+=i[C];const l=c-s*(s+1)/2,g=s+r,f=s*r/2,h=s*r/12*(g+1-a/(g*(g-1))),u=2*l/(s*r)-1;if(!(h>0))return{u:l,z:0,p:1,effect:u};const I=l-f,d=(I-.5*Math.sign(I))/Math.sqrt(h);return{u:l,z:d,p:Math.min(1,2*$h(-Math.abs(d))),effect:u}}function Wh(t){const e=t.map(Ae).filter(g=>g.length>0),n=e.length,A=e.reduce((g,f)=>g+f.length,0);if(n<2||A<2)return{h:Number.NaN,df:Math.max(0,n-1),p:Number.NaN};const s=new Float64Array(A);let r=0;for(const g of e)s.set(g,r),r+=g.length;const{ranks:o,ties:i}=_i(s);let a=0;r=0;for(const g of e){let f=0;for(let h=0;h<g.length;h++)f+=o[r+h];a+=f*f/g.length,r+=g.length}a=12/(A*(A+1))*a-3*(A+1);const c=1-i/(A*A*A-A);if(!(c>0))return{h:Number.NaN,df:n-1,p:Number.NaN};const l=a/c;return{h:l,df:n-1,p:Ph(l,n-1)}}function Ph(t,e){return!(e>0)||Number.isNaN(t)?Number.NaN:t<=0?1:zh(e/2,t/2)}function zh(t,e){const n=Math.exp(-e+t*Math.log(e)-Ki(t));if(e<t+1){let a=1/t,c=a;for(let l=1;l<1e3&&(a*=e/(t+l),c+=a,!(Math.abs(a)<Math.abs(c)*1e-16));l++);return Math.max(0,1-c*n)}const A=1e-300;let s=e+1-t,r=1/A,o=1/s,i=o;for(let a=1;a<1e3;a++){const c=-a*(a-t);s+=2,o=c*o+s,Math.abs(o)<A&&(o=A),r=s+c/r,Math.abs(r)<A&&(r=A),o=1/o;const l=o*r;if(i*=l,Math.abs(l-1)<1e-16)break}return Math.min(1,n*i)}function Ki(t){if(t<.5)return Math.log(Math.PI/Math.sin(Math.PI*t))-Ki(1-t);const e=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,15056327351493116e-23],n=t-1;let A=e[0];const s=n+7.5;for(let r=1;r<9;r++)A+=e[r]/(n+r);return .5*Math.log(2*Math.PI)+(n+.5)*Math.log(s)-s+Math.log(A)}const Xh=1e4,Mn=["#0072b2","#d55e00","#009e73","#cc79a7","#e69f00","#56b4e9","#f0e442","#000000"],Vh="#999999",kr="rest of the genome",ue=2e4,Zh=async t=>{const e=Yn(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig, or run a task that makes one, and tick it under Tracks."),[];const n=[];for(const[u,I]of Object.entries(t.inputs.contigLengths??{}))I>0&&n.push({name:u,length:I});if(n.length===0)return t.note("This session knows no sequence lengths, so there is no genome to cut into stretches. Load a chrom.sizes, or the map itself."),[];const A=T(t.params,"resolution",0),s=A>0?Math.round(A):t.framing.binsize>0&&!Oi(t.framing)?t.framing.binsize:Xh;let r=st(t.params,"groupBy","features")==="track"?await tu(t,n,s):jh(t,n,s);if(r===null)return[];if(r=eu(r,t),r.stretches.length===0)return t.note("No stretch of the genome fell in any group, so there is nothing to compare."),[];const o=u=>t.inputs.labels?.[u]??u,i=r.names.length,a=[],c=[],l=[];for(let u=0;u<e.length;u++){t.throwIfCancelled();const I=o(e[u]);t.progress(u,e.length,I);const d=await ws(t,e[u],r.stretches),C=r.names.map(()=>[]);for(let m=0;m<r.stretches.length;m++)Number.isFinite(d[m])&&C[r.stretches[m].group].push(d[m]);if(C.every(m=>m.length===0)){t.note(`${I} has no value over any stretch — its sequence names may not be the assembly's.`);continue}let E=0,B=0;for(const m of C){for(const p of m)B+=p;E+=m.length}for(let m=0;m<i;m++){const p=qh(C[m]),w=E-p.n,y=w>0?(B-p.mean*p.n)/w:Number.NaN;let N=0;for(const k of r.stretches)k.group===m&&(N+=k.end-k.start);a.push({track:I,group:r.names[m],n:p.n,bases:N,mean:p.mean,sd:p.sd,median:p.median,q1:p.q1,q3:p.q3,vsRest:p.n>0?p.mean-y:Number.NaN})}const Q=C.map((m,p)=>({group:m,g:p})).filter(m=>m.group.length>0);if(Q.length>2){const m=Wh(Q.map(p=>p.group));c.push({track:I,test:"Kruskal–Wallis H",a:`all ${Q.length} groups`,b:"",statistic:m.h,effect:Number.NaN,difference:Number.NaN,p:m.p})}for(let m=0;m<Q.length;m++)for(let p=m+1;p<Q.length;p++){const w=Q[m],y=Q[p],N=Hh(w.group,y.group);c.push({track:I,test:"Mann–Whitney U",a:r.names[w.g],b:r.names[y.g],statistic:N.u,effect:N.effect,difference:Te(Ae(w.group),.5)-Te(Ae(y.group),.5),p:N.p})}l.push({kind:"curve",id:`groupsignal-${u+1}`,label:`${I} by ${r.of}`,series:C.map((m,p)=>{const w=ou(m);return{name:r.names[p],x:Float64Array.from(w,(y,N)=>N),y:w,colour:r.colours[p],n:m.length,mark:"violin"}}),xLabel:r.of,yLabel:I,xScale:"linear",yScale:"linear"})}if(t.progress(e.length,e.length,"done"),l.length===0)return[];const g=Kh(c.map(u=>Number(u.p)));c.forEach((u,I)=>{u.q=g[I]});const f=l.some(u=>u.series.some(I=>(I.n??0)>ue));t.note(`Compared over ${r.stretches.length.toLocaleString()} stretches of at most ${s.toLocaleString()} bp in ${i} groups, each the track's mean over the bases it has a value for.${f?` A violin of more than ${ue.toLocaleString()} is drawn from that many, evenly by rank; the tests use every one.`:""}`);const h=[...l];if(h.push({kind:"table",id:"groupsignal-groups",label:`Groups · ${r.of}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"group",label:"Group",kind:"text"},{key:"n",label:"Stretches",kind:"number"},{key:"bases",label:"Bases",kind:"number"},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"sd",label:"SD",kind:"number",digits:4},{key:"median",label:"Median",kind:"number",digits:4},{key:"q1",label:"Q1",kind:"number",digits:4},{key:"q3",label:"Q3",kind:"number",digits:4},{key:"vsRest",label:"Mean − rest",kind:"number",digits:4,hint:"This group’s mean less that of every other stretch."}],rows:a}),h.push({kind:"table",id:"groupsignal-tests",label:"Between groups",columns:[{key:"track",label:"Track",kind:"text"},{key:"test",label:"Test",kind:"text"},{key:"a",label:"Group",kind:"text"},{key:"b",label:"Against",kind:"text"},{key:"difference",label:"Median difference",kind:"number",digits:4},{key:"effect",label:"Effect",kind:"number",digits:3,hint:"Rank-biserial r: +1 where every value of the group is above every value against it."},{key:"statistic",label:"U or H",kind:"number",digits:2},{key:"p",label:"P",kind:"number",digits:4,scientific:!0},{key:"q",label:"q",kind:"number",digits:4,scientific:!0,hint:"Benjamini–Hochberg, over every test of the run."}],rows:c}),r.segments!==void 0&&h.push({kind:"intervals",id:"groupsignal-segments",label:`Groups · ${r.of}`,payload:{kind:"features",data:r.segments},noun:{one:"segment",many:"segments"},display:"lane",look:"corner"}),st(t.params,"groupBy","features")!=="track"&&Lt(t.params,"perFeature",!1)){const u=await ru(t,e,o);u!==null&&h.push(u)}return h};function jh(t,e,n){const A=ne(t.inputs.features,t.params,"features"),s={chosen:A.chosen,value:A.chosen?A.value:void 0},r=s.value;if(r===void 0)return t.note(_n(s,{unchosen:"No feature set was chosen to make the groups from.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),null;const o=st(t.params,"split","name"),i=t.inputs.labels?.[at(t.params,"features")??""]??"the set",a=new Array(r.length).fill(null);let c;if(o==="score"){const Q=qi(t),m=Yi(r.score,Q);if(m.length===0)return t.note(`${i} carries no scores, so it cannot be cut into quantiles of them.`),null;c=Array.from({length:Q},(p,w)=>Hi(w,m));for(let p=0;p<r.length;p++){const w=Wi(r.score[p],m);w>=0&&(a[p]=c[w])}}else if(o==="strand"){c=["+ strand","− strand","no strand"];for(let Q=0;Q<r.length;Q++)a[Q]=r.strand[Q]>0?c[0]:r.strand[Q]<0?c[1]:c[2]}else if(o==="none")c=[i],a.fill(i);else{for(let Q=0;Q<r.length;Q++)a[Q]=r.name[Q]===""?"(no name)":r.name[Q];c=[...new Set(a.filter(Q=>Q!==null))].sort((Q,m)=>Q.localeCompare(m,void 0,{numeric:!0}))}const l=c.filter(Q=>a.includes(Q)),g=Lt(t.params,"outside",!0),f=g?[...l,kr]:l,h=new Map(f.map((Q,m)=>[Q,m])),u=Q=>e.find(m=>m.name===Q)?.length??t.lengthOf(Q),I=new Map,d=new Set;for(let Q=0;Q<r.contigs.length;Q++){const m=r.contigs[Q],p=u(m);if(p===void 0){r.contigAt[Q+1]>r.contigAt[Q]&&d.add(m);continue}const w=f.map(()=>[]);for(let y=r.contigAt[Q];y<r.contigAt[Q+1];y++){const N=a[y];if(N===null)continue;const k=Math.max(0,r.start[y]),b=Math.min(p,r.end[y]);b>k&&w[h.get(N)??0].push([k,b])}I.set(m,w.map(br))}d.size>0&&t.note(`${[...d].slice(0,6).join(", ")}${d.size>6?", …":""} ${d.size===1?"is":"are"} not a sequence of this assembly, so ${d.size===1?"its":"their"} features were left out.`);const C=[],E=new Map;for(const[Q,m]of I)m.forEach((p,w)=>{for(const[y,N]of p)for(const[k,b]of oA(y,N,n))C.push({contig:Q,start:k,end:b,group:w})}),E.set(Q,br(m.flat()));if(g){const Q=f.length-1;for(const{name:m,length:p}of e){let w=0;for(const[y,N]of E.get(m)??[]){for(const[k,b]of oA(w,y,n))C.push({contig:m,start:k,end:b,group:Q});w=Math.max(w,N)}for(const[y,N]of oA(w,p,n))C.push({contig:m,start:y,end:N,group:Q})}}const B=o==="score"?"score":o==="strand"?"strand":o==="none"?"":"name";return{names:f,colours:f.map((Q,m)=>Q===kr?Vh:Mn[m%Mn.length]),stretches:C,of:B===""?i:`${i}, by ${B}`}}async function tu(t,e,n){const A=at(t.params,"groupTrack");if(A===null)return t.note("No track was chosen to group the bins by."),null;const s=t.inputs.labels?.[A]??A,r=[];for(const h of e)for(let u=0;u<h.length;u+=n)r.push({contig:h.name,start:u,end:Math.min(h.length,u+n),group:-1});const o=await ws(t,A,r),i=st(t.params,"cut","sign")==="quantiles"?"quantiles":"sign";let a;if(i==="sign"){a=["above 0","below 0"];for(let h=0;h<r.length;h++)r[h].group=o[h]>0?0:o[h]<0?1:-1}else{const h=qi(t),u=Yi(o,h);if(u.length===0)return t.note(`${s} has no value over any bin, so there is nothing to cut into quantiles.`),null;a=Array.from({length:h},(I,d)=>Hi(d,u));for(let I=0;I<r.length;I++)r[I].group=Wi(o[I],u)}const c=r.filter(h=>h.group>=0);c.length<r.length&&t.note(`${(r.length-c.length).toLocaleString()} of ${r.length.toLocaleString()} bins had no reading of ${s}${i==="sign"?", or read exactly 0,":""} and are in no group.`);const l=new et;let g=null;const f=()=>{g!==null&&l.add(g.contig,g.start,g.end,{name:a[g.group]}),g=null};for(const h of c){if(g!==null&&g.contig===h.contig&&g.group===h.group&&g.end===h.start){g.end=h.end;continue}f(),g={...h}}return f(),{names:a,colours:a.map((h,u)=>Mn[u%Mn.length]),stretches:c,of:`${s}, ${i==="sign"?"by sign":"in quantiles"}`,segments:l.finish()}}function eu(t,e){const n=new Array(t.names.length).fill(0);for(const o of t.stretches)n[o.group]++;if(n.every(o=>o>0))return t;const A=t.names.filter((o,i)=>n[i]===0);e.note(`${A.join(", ")} had no stretch in ${A.length===1?"it":"them"}, and ${A.length===1?"is":"are"} left out.`);const s=t.names.map((o,i)=>i).filter(o=>n[o]>0),r=new Map(s.map((o,i)=>[o,i]));return{...t,names:s.map(o=>t.names[o]),colours:s.map(o=>t.colours[o]),stretches:t.stretches.map(o=>({...o,group:r.get(o.group)??0}))}}function qi(t){return Math.max(2,Math.min(10,Math.round(T(t.params,"quantiles",4))))}function Hi(t,e){const n=A=>Math.abs(A)>=100?A.toFixed(0):A.toPrecision(3);return`Q${t+1} (${n(e[t])} to ${n(e[t+1])})`}function Wi(t,e){if(!Number.isFinite(t)||e.length<2)return-1;const n=e.length-1;if(t<e[0]||t>e[n])return-1;for(let A=0;A<n;A++)if(t<e[A+1])return A;return n-1}function br(t){const e=[...t].sort((A,s)=>A[0]-s[0]),n=[];for(const[A,s]of e){const r=n[n.length-1];r!==void 0&&A<=r[1]?r[1]=Math.max(r[1],s):n.push([A,s])}return n}function oA(t,e,n){if(!(e>t))return[];if(e-t<=n)return[[t,e]];const A=[];let s=t;for(;s<e;){const o=Math.min(e,(Math.floor(s/n)+1)*n);A.push([s,o]),s=o}A.length>1&&A[0][1]-A[0][0]<n/2&&(A[1][0]=A[0][0],A.shift());const r=A.length-1;return r>0&&A[r][1]-A[r][0]<n/2&&(A[r-1][1]=A[r][1],A.pop()),A}const nu=1<<20,Au=4096;async function ws(t,e,n){const A=new Float64Array(n.length).fill(Number.NaN),s=new Map;n.forEach((r,o)=>{const i=s.get(r.contig);i===void 0?s.set(r.contig,[o]):i.push(o)});for(const[r,o]of s){const i=new Map;for(const l of o){const{start:g,end:f}=n[l];i.set(`${g}-${f}`,{contig:r,start:g,end:f})}const a=[...i.values()].sort((l,g)=>l.start-g.start||l.end-g.end),c=new Map;for(let l=0;l<a.length;){t.throwIfCancelled();let g=l+1,f=a[l].end-a[l].start;for(;g<a.length&&g-l<Au&&(f+=a[g].end-a[g].start,!(f>nu));)g++;const h=await t.sample(e,a.slice(l,g),1);for(const u of h.regions)c.set(`${u.start}-${u.end}`,su(u,u.start,u.end));l=g}for(const l of o){const g=c.get(`${n[l].start}-${n[l].end}`);g!==void 0&&(A[l]=g)}}return A}function su(t,e,n){let A=0,s=0;for(let r=0;r<t.values.length;r++){const o=t.values[r];if(!Number.isFinite(o))continue;const i=Math.max(e,t.starts[r]),a=Math.min(n,t.ends[r]);a<=i||(A+=o*(a-i),s+=a-i)}return s>0?A/s:Number.NaN}async function ru(t,e,n){const A=ne(t.inputs.features,t.params,"features").value;if(A===void 0)return null;const s=[];for(let i=0;i<A.length;i++)s.push({contig:A.contigs[A.contig[i]],start:A.start[i],end:A.end[i],group:i});const r=e.map((i,a)=>`track${a+1}`),o=s.map(i=>({contig:i.contig,start:i.start,end:i.end,name:A.name[i.group]??""}));for(let i=0;i<e.length;i++)(await ws(t,e[i],s)).forEach((c,l)=>{o[l][r[i]]=c});return{kind:"table",id:"groupsignal-features",label:"Per feature",columns:[{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},...e.map((i,a)=>({key:r[a],label:n(i),kind:"number",digits:4}))],rows:o}}function ou(t){const e=Ae(t);if(e.length<=ue)return e;const n=new Float64Array(ue);for(let A=0;A<ue;A++)n[A]=e[Math.round(A*(e.length-1)/(ue-1))];return n}function iu(t,e){const n=Math.max(1,Math.round(e.flank/e.step)),A=n*2,s={slots:A,bodyFrom:n,bodyTo:n,flankStep:e.step},r=[];for(const o of t){const i=e.at==="start"?o.strand<0?o.end:o.start:e.at==="end"?o.strand<0?o.start:o.end:o.start+Math.floor((o.end-o.start)/2),a=e.lengthOf(o.contig),c={from:i-n*e.step,to:i+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l))continue;const f=Math.floor((l-c.from)/e.step),h=Math.floor((c.to-g)/e.step),u=o.strand<0?h:f,I=A-(o.strand<0?f:h);if(!(I>u))continue;const d={start:c.from+f*e.step,end:c.to-h*e.step};r.push({contig:o.contig,start:l,end:g,strand:o.strand,slotFrom:u,slotTo:I,...d.start===l&&d.end===g?{}:{span:d}})}return{windows:r,layout:s}}function au(t,e){const n=Math.max(0,Math.round(e.flank/e.step)),A=e.body+n*2,s={slots:A,bodyFrom:n,bodyTo:n+e.body,flankStep:e.step},r=[];let o=0;for(const i of t){if(i.end-i.start<e.body){o++;continue}const a=e.lengthOf(i.contig),c={from:i.start-n*e.step,to:i.end+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l)){o++;continue}const f=Math.round((l-c.from)/e.step),h=Math.round((c.to-g)/e.step),u=i.strand<0?h:f,I=A-(i.strand<0?f:h);if(!(I>u)){o++;continue}const d=Math.min(Math.max(i.start,l),g),C=Math.min(Math.max(i.end,d),g),E=Math.min(Math.max(s.bodyFrom,u),I),B=Math.min(Math.max(s.bodyTo,E),I);r.push({contig:i.contig,start:l,end:g,strand:i.strand,slotFrom:u,slotTo:I,body:{start:d,end:C,slotFrom:E,slotTo:B}})}return{windows:r,layout:s,dropped:o}}function cu(t,e,n){const A=new Float64Array(n).fill(Number.NaN),s=e.slotTo-e.slotFrom;if(s<=0||e.end-e.start<=0)return A;const o=new Float64Array(s),i=new Float64Array(s),a=lu(s),{values:c,starts:l,ends:g}=t,f=e.span?.start??e.start,h=e.span?.end??e.end,u=e.strand<0,I=e.body===void 0;for(let d=0;d<c.length;d++){const C=c[d];if(!Number.isFinite(C))continue;const E=Math.max(f,l[d]),B=Math.min(h,g[d]);if(!(B>E))continue;let Q,m;if(I){const y=(E-f)/(h-f),N=(B-f)/(h-f);Q=u?1-N:y,m=u?1-y:N}else{const y=Mr(e,E),N=Mr(e,B);Q=u?N:y,m=u?y:N}const p=Math.max(0,Math.floor(Q*s)),w=Math.min(s-1,Math.ceil(m*s)-1);for(let y=p;y<=w;y++){const N=Math.min(m,a[y+1])-Math.max(Q,a[y]);N>0&&(o[y]+=C*N,i[y]+=N)}}for(let d=0;d<s;d++)i[d]>0&&(A[e.slotFrom+d]=o[d]/i[d]);return A}const Dr=new Map;function lu(t){let e=Dr.get(t);if(e===void 0){e=new Float64Array(t+1);for(let n=0;n<=t;n++)e[n]=n/t;Dr.set(t,e)}return e}function Mr(t,e){const n=t.body;if(n===void 0){const c=t.span?.start??t.start,l=t.span?.end??t.end,g=(e-c)/(l-c);return t.strand<0?1-g:g}const A=t.strand<0,s=A?t.end:t.start,r=A?n.end:n.start,o=A?n.start:n.end,i=A?t.start:t.end;return(t.slotFrom+iA(e,s,r)*(n.slotFrom-t.slotFrom)+iA(e,r,o)*(n.slotTo-n.slotFrom)+iA(e,o,i)*(t.slotTo-n.slotTo)-t.slotFrom)/(t.slotTo-t.slotFrom)}function iA(t,e,n){if(e===n)return 1;const A=(t-e)/(n-e);return A<0?0:A>1?1:A}function gu(t,e,n,A){const s=new Float64Array(n).fill(Number.NaN),r=new Float64Array(n).fill(Number.NaN),o=new Float64Array(n).fill(Number.NaN);if(e===0)return{mean:s,low:r,high:o,n:0};const i=new Float64Array(e),a=[i],c=g=>A.average==="median"?Ji(g):A.average==="trimmed"?Lh(g,A.trim):Rh(g);for(let g=0;g<n;g++){for(let f=0;f<e;f++)i[f]=t[f*n+g];if(s[g]=c(i),A.band==="sd"){const f=Pi(a,s[g]);Number.isFinite(f)&&(r[g]=s[g]-f,o[g]=s[g]+f)}}if(A.band==="bootstrap"&&e>1){const g=new Float64Array(A.iterations*n),f=new Int32Array(e),h=new Float64Array(e);for(let d=0;d<A.iterations;d++){for(let C=0;C<e;C++)f[C]=Math.floor(A.rng()*e)%e;for(let C=0;C<n;C++){for(let E=0;E<e;E++)h[E]=t[f[E]*n+C];g[d*n+C]=c(h)}}const u=(1-A.level)/2,I=new Float64Array(A.iterations);for(let d=0;d<n;d++){for(let E=0;E<A.iterations;E++)I[E]=g[E*n+d];const C=Array.from(I).filter(Number.isFinite).sort((E,B)=>E-B);C.length!==0&&(r[d]=C[Math.floor(u*(C.length-1))],o[d]=C[Math.ceil((1-u)*(C.length-1))])}}let l=0;for(let g=0;g<e;g++)for(let f=0;f<n;f++)if(Number.isFinite(t[g*n+f])){l++;break}return{mean:s,low:r,high:o,n:l}}function fu(t){const e=hu(t),n=Pi(t,e);if(!Number.isFinite(e))return{mean:e,sd:n,scaled:!1};const A=Number.isFinite(n)&&n>0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(s[r]=A?(o-e)/n:o-e)}return{mean:e,sd:n,scaled:A}}function hu(t){let e=0,n=0;for(const A of t)for(let s=0;s<A.length;s++){const r=A[s];Number.isFinite(r)&&(e+=r,n++)}return n===0?Number.NaN:e/n}function Pi(t,e){if(!Number.isFinite(e))return Number.NaN;let n=0,A=0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(n+=(o-e)**2,A++)}return A>1?Math.sqrt(n/(A-1)):Number.NaN}function RA(t){const e=new Float64Array(t.slots),n=t.bodyTo>t.bodyFrom;for(let A=0;A<t.slots;A++)e[A]=n?A:(A-t.bodyFrom+.5)*t.flankStep;return{x:e,label:n?"Position (upstream · body · downstream)":"Distance from the anchor (bp)"}}function zi(t){let e=(Number.isFinite(t)?Math.trunc(t):0)>>>0;return function(){e=e+1831565813>>>0;let A=e;return A=Math.imul(A^A>>>15,A|1),A^=A+Math.imul(A^A>>>7,A|61),((A^A>>>14)>>>0)/4294967296}}function uu(t,e,n){const A=[];for(let s=0;s<t.length;s++)A.push({contig:t.contigs[t.contig[s]],start:t.start[s],end:t.end[s],strand:n?t.strand[s]:1,rank:e===null?0:Iu(t,s,e)});return A}function Iu(t,e,n){if(n==="score")return t.score[e];for(const A of t.detail[e].split(ct)){const s=A.search(/[=:]/);if(s<0||A.slice(0,s).trim()!==n)continue;const r=Number.parseFloat(A.slice(s+1).trim());return Number.isFinite(r)?r:Number.NaN}return Number.NaN}function du(t,e){if(e.rankBy===null||e.subset==="all")return[{name:"all",features:t}];const n=[...t].sort((r,o)=>Number.isNaN(r.rank)?Number.isNaN(o.rank)?0:1:Number.isNaN(o.rank)?-1:o.rank-r.rank);if(e.subset==="top")return[{name:`top ${e.count}`,features:n.slice(0,e.count)}];if(e.subset==="bottom")return[{name:`bottom ${e.count}`,features:n.slice(-e.count)}];const A=[],s=Math.ceil(n.length/e.groups);for(let r=0;r<e.groups;r++){const o=n.slice(r*s,(r+1)*s);o.length!==0&&A.push({name:`group ${r+1}`,features:o})}return A}const Cu=async t=>{const e=Yn(t.params,"tracks"),n=ne(t.inputs.features,t.params,"features"),A=n.value;if(e.length===0||A===void 0){const b=_n(n,{unchosen:"No feature set was chosen. Load a BED or a GTF and pick it under Features.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."});return t.note(e.length===0&&b!==null?"A metaplot needs a track to read and a set of positions to read it at, and neither is in hand.":e.length===0?"No track was chosen. Load a bigWig and tick it under Tracks.":b??""),[]}const s=Lt(t.params,"stranded",!0),r=at(t.params,"rankBy"),o=uu(A,r,s),i=du(o,{rankBy:r,subset:st(t.params,"subset","all"),count:Math.max(1,Math.round(T(t.params,"count",500))),groups:Math.max(2,Math.round(T(t.params,"groups",4)))}),a=Lt(t.params,"zscore",!1),c=Math.max(1,Math.round(T(t.params,"step",50))),l=Math.max(0,Math.round(T(t.params,"flank",2e3))),g=st(t.params,"mode","reference")==="scaled",f=Math.max(10,Math.round(T(t.params,"body",100))),h=b=>t.lengthOf(b)??Number.MAX_SAFE_INTEGER,u=i.map(b=>g?au(b.features,{body:f,flank:l,step:c,lengthOf:h}):{...iu(b.features,{at:st(t.params,"at","start"),flank:l,step:c,lengthOf:h}),dropped:0}),I=u.reduce((b,D)=>b+D.dropped,0),d=[],C=[],E=u.length===0?null:u[0].layout,B=Lt(t.params,"heatmap",!0),Q=[],m=u.map(b=>({total:new Float64Array(b.windows.length),seen:new Float64Array(b.windows.length)})),p=e.length*i.length;let w=0;for(const b of e){const D=[];for(const[F,R]of i.entries()){t.throwIfCancelled(),t.progress(w,p,`${t.inputs.labels?.[b]??b} · ${R.name}`),w++;const v=u[F];v.windows.length!==0&&D.push({group:F,rows:await Eu(t,b,v.windows,v.layout),count:v.windows.length,layout:v.layout})}a&&fu(D.map(F=>F.rows));for(const F of D){const R=gu(F.rows,F.count,F.layout.slots,{average:st(t.params,"average","mean"),trim:.1,band:st(t.params,"band","bootstrap"),iterations:Math.max(20,Math.round(T(t.params,"iterations",200))),level:.95,rng:zi(Math.round(T(t.params,"seed",1)))}),v=t.inputs.labels?.[b]??b,x=i.length===1?v:`${v} · ${i[F.group].name}`;d.push({name:x,x:RA(F.layout).x,y:R.mean,low:R.low,high:R.high,n:R.n}),B&&(pu(m[F.group],F.rows,F.count,F.layout.slots),Q.push({group:F.group,rows:Float32Array.from(F.rows),count:F.count,name:x}))}}if(t.progress(p,p,"done"),E===null||d.length===0)return t.note("No feature produced a usable window. Check that the track and the set share an assembly."),[];I>0&&t.note(`${I.toLocaleString()} features were dropped: shorter than the body width, or with no window left after clipping to the sequence.`);const y=RA(E);C.push({kind:"curve",id:"metaplot",label:"Metaplot",series:d,xLabel:y.label,yLabel:a?"Signal (z-score, per track)":"Mean signal",xScale:"linear",yScale:"linear"});const N=Q.length===0?[]:m.map(yu),k={zscore:a,tracks:e.length};return Q.forEach((b,D)=>{C.push(Nu(b,N[b.group],D,E,y.label,k))}),C},Qu=1<<20,Bu=4096;async function Eu(t,e,n,A){const s=new Float64Array(n.length*A.slots).fill(Number.NaN),r=new Map;for(let o=0;o<n.length;o++){const i=r.get(n[o].contig);i===void 0?r.set(n[o].contig,[o]):i.push(o)}for(const[o,i]of r){const a=new Map;for(const g of i){const f=`${n[g].start}-${n[g].end}`,h=a.get(f);h===void 0?a.set(f,[g]):h.push(g)}const c=[...a.keys()].map(g=>{const[f,h]=g.split("-").map(Number);return{contig:o,start:f,end:h}}).sort((g,f)=>g.start-f.start||g.end-f.end),l=new Map;for(let g=0;g<c.length;){t.throwIfCancelled();let f=g+1,h=c[g].end-c[g].start;for(;f<c.length&&f-g<Bu&&(h+=c[f].end-c[f].start,!(h>Qu));)f++;const u=await t.sample(e,c.slice(g,f),1);g=f;for(const I of u.regions)for(const d of a.get(`${I.start}-${I.end}`)??[]){const C=n[d],{body:E,span:B}=C,Q=`${C.start}-${C.end}:${C.strand}:${C.slotFrom}-${C.slotTo}`+(B===void 0?"":`:${B.start}-${B.end}`)+(E===void 0?"":`:${E.start}-${E.end}:${E.slotFrom}-${E.slotTo}`),m=l.get(Q);if(m!==void 0){s.copyWithin(d*A.slots,m*A.slots,(m+1)*A.slots);continue}l.set(Q,d),s.set(cu(I,C,A.slots),d*A.slots)}}}return s}function mu(t){const e=Math.max(1,Math.floor(t.length/1e5)),n=[];for(let i=0;i<t.length;i+=e){const a=t[i];Number.isFinite(a)&&n.push(a)}if(n.length===0)return null;n.sort((i,a)=>i-a);const A=i=>n[Math.min(n.length-1,Math.floor(i*(n.length-1)))],s=A(.99),r=n[0]>=0?0:-Math.max(Math.abs(A(.01)),Math.abs(s)),o=n[0]>=0?s:Math.max(Math.abs(A(.01)),Math.abs(s));return o>r?[r,o]:null}function wu(t){const{x:e}=RA(t);if(e.length===0)return[];if(t.bodyTo>t.bodyFrom)return["","","","",""];const A=t.flankStep>0?t.flankStep:1,s=e[0]-A/2,r=e[e.length-1]+A/2;return[0,.25,.5,.75,1].map(o=>{const i=s+o*(r-s);return Math.abs(i)>=1e4?`${Number((i/1e3).toFixed(1))} kb`:String(Math.round(i))})}function pu(t,e,n,A){for(let s=0;s<n;s++){let r=0,o=0;for(let i=0;i<A;i++){const a=e[s*A+i];Number.isFinite(a)&&(r+=a,o++)}t.total[s]+=r,t.seen[s]+=o}}function yu(t){const e=t.total.length,n=new Float64Array(e);for(let A=0;A<e;A++)n[A]=t.seen[A]===0?Number.NaN:t.total[A]/t.seen[A];return Array.from({length:e},(A,s)=>s).sort((A,s)=>Number.isNaN(n[A])?Number.isNaN(n[s])?0:1:Number.isNaN(n[s])?-1:n[s]-n[A])}function Nu(t,e,n,A,s,r){const{rows:o,count:i}=t,a=new Float32Array(i*A.slots);for(let l=0;l<i;l++)a.set(o.subarray(e[l]*A.slots,(e[l]+1)*A.slots),l*A.slots);const c=mu(a);return{kind:"matrix",id:n===0?"metaplot-heatmap":`metaplot-heatmap-${n+1}`,label:`${t.name} · per feature${r.zscore?", z-scored":""}`,nrows:i,ncols:A.slots,values:a,xLabel:s,yLabel:r.tracks===1?`Features, strongest first (${i.toLocaleString()})`:`Features, strongest first across ${r.tracks} tracks (${i.toLocaleString()})`,xTicks:wu(A),yTicks:[],colormap:"viridis",...c===null?{}:{range:c},aspect:"fill"}}const Nt=1,kt=2,bt=4,dt=8,ku=Nt|kt|bt|dt,Xi=(()=>{const t=new Uint8Array(256),e={A:Nt,C:kt,G:bt,T:dt,U:dt,R:Nt|bt,Y:kt|dt,S:bt|kt,W:Nt|dt,K:bt|dt,M:Nt|kt,B:kt|bt|dt,D:Nt|bt|dt,H:Nt|kt|dt,V:Nt|kt|bt,N:ku};for(const[n,A]of Object.entries(e))t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A;return t})(),bu=(()=>{const t=new Uint8Array(16);for(let e=0;e<16;e++){let n=0;(e&Nt)!==0&&(n|=dt),(e&kt)!==0&&(n|=bt),(e&bt)!==0&&(n|=kt),(e&dt)!==0&&(n|=Nt),t[e]=n}return t})();function Ye(t){return!(t instanceof Uint8Array)}const Fr=200;function Oe(t){const e=t.replace(/\s+/g,"");if(e==="")return{reason:"Type a sequence to search for."};if(e.length>Fr)return{reason:`${e.length} bases is longer than this searches for (${Fr}). It looks for short motifs, so a query that long is a job for an aligner.`};const n=new Uint8Array(e.length);for(let A=0;A<e.length;A++){const s=Xi[e.charCodeAt(A)]??0;if(s===0)return{reason:`“${e[A]}” is not a IUPAC base. Use A C G T U and the ambiguity codes R Y S W K M B D H V N.`};n[A]=s}return n}function Vi(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=bu[t[t.length-1-n]??0]??0;return e}function Du(t){const e=Vi(t);for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function Sr(t,e,n,A){let s=0;for(let r=0;r<e.length;r++){const o=Xi[t[n+r]??0]??0,i=e[r]??0;if((o===0||(o&~i)!==0)&&(s++,s>A))return s}return s}function ps(t,e,n={}){const A=[];if(e.length===0||t.length<e.length)return{hits:A,truncated:!1};const s=n.offset??0,r=n.limit??Number.POSITIVE_INFINITY,o=Math.max(0,Math.min(e.length-1,Math.floor(n.mismatches??0))),i=n.bothStrands===!0,a=i&&Du(e),c=i&&!a?Vi(e):null,l=a?0:1,g=t.length-e.length;for(let f=0;f<=g;f++){const h=Sr(t,e,f,o);if(h<=o&&(A.push({start:f+s,end:f+e.length+s,strand:l,mismatches:h}),A.length>=r))return{hits:A,truncated:f<g};if(c!==null){const u=Sr(t,c,f,o);if(u<=o&&(A.push({start:f+s,end:f+e.length+s,strand:-1,mismatches:u}),A.length>=r))return{hits:A,truncated:f<g}}}return{hits:A,truncated:!1}}function Mu(t){return Math.max(0,t.length-1)}function Fu(t){return t>0?"+":t<0?"−":"±"}function Su(t,e){const n=new et,A=e.replace(/\s+/g,"").toUpperCase();for(const s of t.hits)for(let r=0;r<s.starts.length;r++){const o=s.strands[r],i=s.mismatches?.[r];n.add(s.contig,s.starts[r],s.ends[r],{strand:o,name:`${A} ${Fu(o)}`,...i===void 0?{}:{score:i,detail:`${i} ${i===1?"mismatch":"mismatches"}`}})}return n.finish()}function Zi(t,e,n){const A=[];let s=0;for(const i of e){const a=Math.max(1,Math.ceil(i.length/n));A.push({name:i.name,startBin:s,bins:a,length:i.length}),s+=a}const r=new Float32Array(s),o=new Map(A.map(i=>[i.name,i]));for(const i of t.hits){const a=o.get(i.contig);if(a!==void 0)for(let c=0;c<i.starts.length;c++){const l=Math.min(a.bins-1,Math.floor(i.starts[c]/n));r[a.startBin+l]+=1}}return{binsize:n,firstBin:0,values:r,contigs:A}}function Ru(t,e,n=0){const A=t.replace(/\s+/g,"").toUpperCase(),s=[...e?["both strands"]:[],...n>0?[`≤ ${n} ${n===1?"mismatch":"mismatches"}`]:[]];return s.length===0?A:`${A} (${s.join(", ")})`}const un=5e5,Lu=16e6;function xu(t){const e=t.pattern;return typeof e=="string"?e.replace(/\s+/g,"").toUpperCase():""}async function Gu(t,e,n){const A=Math.max(1,Math.min(n.limit,un)),s=n.mismatches??0,r=n.contigs??t.contigs,o=Mu(e),i=t.read?.bind(t),a=Math.max(1,Math.floor(n.piece??Lu)),c=[];let l=0,g=!1;const f=r.reduce((u,I)=>u+I.length,0);let h=0;for(const u of r){if(l>=A){g=!0;break}const I=[];let d=!1;const C=(w,y)=>{const N=A-l-I.length,k=ps(w,e,{bothStrands:n.bothStrands,limit:N+1,mismatches:s,offset:y});for(let b=0;b<Math.min(k.hits.length,N);b++)I.push(k.hits[b]);(k.truncated||k.hits.length>N)&&(d=!0)};if(i===void 0){const w=t.bases(u.name);if(w===void 0)continue;C(w,0),h+=u.length,n.progress?.(h,f,u.name)}else for(let w=0;w<u.length&&!d;w+=a){n.throwIfCancelled?.();const y=Math.min(u.length,w+a),N=await i(u.name,w,Math.min(u.length,y+o));if(N===void 0)break;C(N,w),h+=y-w,n.progress?.(h,f,u.name)}d&&(g=!0);const E=I.length;if(E===0){if(d)break;continue}const B=new Int32Array(E),Q=new Int32Array(E),m=new Int8Array(E),p=s>0?new Uint8Array(E):void 0;for(let w=0;w<E;w++){const y=I[w];B[w]=y.start,Q[w]=y.end,m[w]=y.strand,p!==void 0&&(p[w]=y.mismatches)}if(c.push({contig:u.name,starts:B,ends:Q,strands:m,...p===void 0?{}:{mismatches:p}}),l+=E,d)break}return{hits:c,total:l,truncated:g}}function ji(t,e,n){if(e===null)return[...t.contigs];const A=new Set(e);if(n.length>0&&n.every(r=>A.has(r)))return[...t.contigs];const s=new Set;for(const r of e){const o=Kt(t.contigs,r);o>=0&&s.add(o)}return t.contigs.filter((r,o)=>s.has(o))}const Uu=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to search."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=On(t.params,"sequences");if(A!==null&&A.length===0)return t.note("No sequence is ticked, so there is nothing to search."),[];const s=Object.entries(t.inputs.contigLengths??{}).filter(([,E])=>E>0).map(([E])=>E),r=ji(n,A,s);if(r.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to search."),[];const o=r.length===n.contigs.length,i=xu(t.params),a=Oe(i);if(Ye(a))return t.note(a.reason),[];const c=Lt(t.params,"bothStrands",!0),l=Math.min(un,Math.max(1,Math.round(T(t.params,"limit",un)))),g=Math.max(0,Math.min(a.length-1,Math.round(T(t.params,"mismatches",0))));t.progress(0,1,r.length===1?`searching ${r[0].name}`:`searching ${r.length.toLocaleString()} sequences`);const f=await Gu(n,a,{bothStrands:c,limit:l,mismatches:g,contigs:r,...n.read===void 0?{}:{progress:(E,B,Q)=>t.progress(E,B,`searching ${Q}`),throwIfCancelled:()=>t.throwIfCancelled()}});t.progress(1,1,"done");const h=vu(Ru(i,c,g),r,o);if(f.total===0)return t.note(o?`No match for ${h} anywhere in this reference.`:`No match for ${h}.`),[];const u=`${f.total.toLocaleString()} site${f.total===1?"":"s"}`;t.note(f.truncated?`${u} — the search stopped at the limit of ${l.toLocaleString()} and there are more. `+(l<un?"Raise “Most sites”, or narrow the pattern.":r.length>1?"That is the most one run reports, so narrow the pattern or tick fewer sequences.":"That is the most one run reports, so narrow the pattern."):`${u}, on ${f.hits.length.toLocaleString()} ${f.hits.length===1?"sequence":"sequences"}.`);const I=`motif-${i}${c?"-both":""}${g>0?`-mm${g}`:""}`+(o?"":Tu(r)),d=[Ju(f,i,h,I)],C=$u(t,f,h,I);return C!==null&&d.push(C),d};function vu(t,e,n){return n?t:e.length<=3?`${t} on ${e.map(A=>A.name).join(", ")}`:`${t} on ${e.length.toLocaleString()} sequences`}function Tu(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
16
|
-
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Ju(t,e,n,A){return{kind:"intervals",id:A,label:n,payload:{kind:"features",data:Su(t,e)},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function $u(t,e,n,A){const s=t.framing.binsize,r=Kn(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none — so there is nothing for a density to be per. Open the map and run it again for that half."),null;const o=Zi(e,r,s);return{kind:"profile",id:`${A}-density`,label:`${n} density`,values:o.values,extent:[0,o.values.length],binsize:s,unit:"sites"}}function Kn(t){const e=t.inputs.contigLengths;if(e===void 0)return[];const n=[];for(const[A,s]of Object.entries(e))s>0&&n.push({name:A,length:s});return n}let ce=null,An=null;function Yu(){if(ce===null||An===null){ce=new Uint32Array(256);for(let t=0;t<256;t++){const e=Ne[t];ce[t]=e<4?1<<8*e:0}An=new Uint32Array(65536);for(let t=0;t<65536;t++)An[t]=ce[t&255]+ce[t>>>8]}return[ce,An]}const Ou=63;function ys(t,e){const n=Math.max(1,Math.round(e)),A=t.length===0?0:Math.ceil(t.length/n),s=new Int32Array(A),r=new Int32Array(A),o=new Int32Array(A),i=new Int32Array(A),[a,c]=Yu(),l=4-(t.byteOffset&3)&3,g=new Uint32Array(t.buffer,t.byteOffset+l,Math.max(0,t.length-l>>2));for(let f=0;f<A;f++){const h=f*n,u=Math.min(t.length,h+n),I=Math.min(u,h<=l?l:l+(h-l+3>>2<<2)),d=u-I>>2;let C=0;for(let y=h;y<I;y++)C+=a[t[y]];for(let y=I+4*d;y<u;y++)C+=a[t[y]];let E=C&255,B=C>>>8&255,Q=C>>>16&255,m=C>>>24,p=I-l>>2;const w=p+d;for(;p<w;){const y=Math.min(w,p+Ou);let N=0;for(;p<y;p++){const k=g[p];N+=c[k&65535]+c[k>>>16]}E+=N&255,B+=N>>>8&255,Q+=N>>>16&255,m+=N>>>24}s[f]=E,r[f]=B,o[f]=Q,i[f]=m}return{step:n,steps:A,a:s,c:r,g:o,t:i}}const ta=1<<22;function _u(t,e=ta){const n=Math.max(1,Math.round(t));return n*Math.max(1,Math.floor(e/n))}async function Ku(t,e,n=ta){const A=Math.max(1,Math.round(e)),s=_u(A,n),r=[];let o=0;for(let l=0;;l+=s){const g=await t(l,l+s);if(g===void 0)return;if(r.push(ys(g,A)),o+=g.length,g.length<s)break}const i=r.reduce((l,g)=>l+g.steps,0),a={step:A,steps:i,a:new Int32Array(i),c:new Int32Array(i),g:new Int32Array(i),t:new Int32Array(i)};let c=0;for(const l of r)a.a.set(l.a,c),a.c.set(l.c,c),a.g.set(l.g,c),a.t.set(l.t,c),c+=l.steps;return{counts:a,length:o}}function ea(t,e,n){const A=Math.max(0,Math.floor(Math.max(1,Math.round(e))/2)),s=t.steps;if(A===0||s===0)return t;const r=o=>{const i=new Int32Array(s),a=new Float64Array(s+1);for(let g=0;g<s;g++)a[g+1]=a[g]+o[g];const c=a[s],l=g=>{if(!n)return a[Math.max(0,Math.min(s,g))];const f=Math.floor(g/s);return f*c+a[g-f*s]};for(let g=0;g<s;g++){const f=n?g-Math.min(A,Math.floor((s-1)/2)):g-A,h=n?g+Math.min(A,Math.floor((s-1)/2))+1:g+A+1;i[g]=l(h)-l(f)}return i};return{...t,a:r(t.a),c:r(t.c),g:r(t.g),t:r(t.t)}}function qu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n],s=A+t.a[n]+t.t[n];e[n]=s>0?A/s:Number.NaN}return e}function LA(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n];e[n]=A>0?(t.g[n]-t.c[n])/A:Number.NaN}return e}function Hu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.a[n]+t.t[n];e[n]=A>0?(t.a[n]-t.t[n])/A:Number.NaN}return e}function na(t){const e=new Float32Array(t.length);let n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isFinite(s)&&(n+=s),e[A]=n}return e}const Wu=1e4;function Pu(t){return["gc","gcSkew","atSkew","cumulative"].filter(e=>t[e]!==!1)}function zu(t){return Oi(t.framing)}const Rr={gc:{name:"GC content",unit:""},gcSkew:{name:"GC skew",unit:""},atSkew:{name:"AT skew",unit:""},cumulative:{name:"Cumulative GC skew",unit:""}},Xu=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=Pu(t.params);if(A.length===0)return t.note("No track was ticked, so there is nothing to make."),[];const s=T(t.params,"resolution",0),r=s>0?Math.round(s):t.framing.binsize>0&&!zu(t)?t.framing.binsize:Wu,o=Kn(t);if(o.length===0)return t.note("There are no sequences to lay the bins out on. Open a map, or load the FASTA itself."),[];const i=Math.max(0,Math.round(T(t.params,"window",0))),a=Math.max(1,Math.round(i/r)),c=a%2===1?a:a+1,l=new Set(t.framing.circular??[]),g=o.reduce((Q,m)=>Q+Math.max(1,Math.ceil(m.length/r)),0),f={gc:new Float32Array(g).fill(Number.NaN),gcSkew:new Float32Array(g).fill(Number.NaN),atSkew:new Float32Array(g).fill(Number.NaN),cumulative:new Float32Array(g).fill(Number.NaN)},{read:h}=n,u=[],I=[];let d=0;for(let Q=0;Q<o.length;Q++){const m=o[Q],p=Math.max(1,Math.ceil(m.length/r));t.progress(Q,o.length,m.name);let w;if(h!==void 0)w=await Ku((D,F)=>(t.throwIfCancelled(),h(m.name,D,F)),r);else{const D=n.bases(m.name);w=D===void 0?void 0:{counts:ys(D,r),length:D.length}}if(w===void 0){u.push(m.name),d+=p;continue}w.length!==m.length&&I.push(m.name);const{counts:y}=w,N=c>1?ea(y,c,l.has(m.name)):y,k={gc:qu(N),gcSkew:LA(N),atSkew:Hu(N),cumulative:na(LA(y))},b=Math.min(p,y.steps);for(const D of A)f[D].set(k[D].subarray(0,b),d);d+=p}if(t.progress(o.length,o.length,"done"),u.length===o.length)return t.note("The reference has none of the map’s sequences under any name this viewer knows, so nothing could be measured."),[];u.length>0&&t.note(`${u.length.toLocaleString()} of the map’s sequences are not in this reference and are gaps on every track: ${u.slice(0,6).join(", ")}${u.length>6?", …":""}.`),I.length>0&&t.note(`${I.slice(0,6).join(", ")}${I.length>6?", …":""} ${I.length===1?"is":"are"} not the length the map says — the reference may be another assembly version. Bins were read from its start.`),c>1&&t.note(`Each bin was read over ${c} bins (${(c*r).toLocaleString()} bp) centred on it; the cumulative skew sums each bin’s own.`);const C=t.inputs.labels?.[e]??"reference",E=c>1?` · ${(c*r).toLocaleString()} bp window`:"";return A.map(Q=>({kind:"profile",id:`composition-${Q.toLowerCase()}`,label:`${Rr[Q].name} · ${C}${Q==="cumulative"?"":E}`,values:f[Q],extent:[0,g],binsize:r,unit:Rr[Q].unit}))},_e=19,Aa=50,Vu=2e6,Zu=5e3,ju=500,tI=10;function Lr(t){const e=[0];for(const n of t)e.push(e[e.length-1]+n.length);return{names:t.map(n=>n.name),lengths:t.map(n=>n.length),offsets:e}}function eI(t,e=Vu){return Math.max(1,Math.ceil(2*t/e-1))}const nI=(()=>{const t=new Int8Array(256).fill(-1);for(const[e,n]of[["A",0],["C",1],["G",2],["T",3]])t[e.charCodeAt(0)]=n,t[e.toLowerCase().charCodeAt(0)]=n;return t})();function AI(t){const e=t>>>0,n=Math.floor(t/4294967296)>>>0;let A=Math.imul(e^Math.imul(n,2654435761),2246822507);return A^=A>>>13,A=Math.imul(A,3266489909),A^=A>>>16,A>>>0}class sI{hash=new Uint32Array(1024);position=new Uint32Array(1024);strand=new Int8Array(1024);count=0;push(e,n,A){if(this.count===this.hash.length){const s=this.hash.length*2,r=new Uint32Array(s);r.set(this.hash),this.hash=r;const o=new Uint32Array(s);o.set(this.position),this.position=o;const i=new Int8Array(s);i.set(this.strand),this.strand=i}this.hash[this.count]=e,this.position[this.count]=n,this.strand[this.count]=A,this.count++}finish(){return{hash:this.hash.slice(0,this.count),position:this.position.slice(0,this.count),strand:this.strand.slice(0,this.count),count:this.count}}}function xr(t,e,n,A=_e){const s=new sI,r=4**(A-1),o=new Float64Array(n+1),i=new Float64Array(n+1),a=new Int8Array(n+1);for(let c=0;c<t.names.length;c++){const l=e(t.names[c]);if(l===void 0)continue;const g=t.offsets[c];let f=0,h=0,u=0,I=0,d=0,C=-1,E=0;const B=o.length;for(let Q=0;Q<l.length;Q++){const m=nI[l[Q]];if(m<0){u=0,d=0,E=0;continue}if(f=f%r*4+m,h=Math.floor(h/4)+(3-m)*r,u++,u<A)continue;const p=Q-A+1;if(E++,f===h)continue;const w=f<h?1:-1,y=AI(f<h?f:h);for(;d>0&&o[(I+d-1)%B]>=y;)d--;for(o[(I+d)%B]=y,i[(I+d)%B]=p,a[(I+d)%B]=w,d++;d>0&&i[I]<=p-n;)I=(I+1)%B,d--;if(E<n)continue;const N=i[I];N!==C&&(s.push(o[I],g+N,a[I]),C=N)}}return s.finish()}function Fn(t,e=t.length,n){let A=new Uint32Array(e);if(n===void 0)for(let o=0;o<e;o++)A[o]=o;else A.set(n.subarray(0,e));let s=new Uint32Array(e);const r=new Uint32Array(65537);for(const o of[0,16]){r.fill(0);for(let i=0;i<e;i++)r[(t[A[i]]>>>o&65535)+1]++;for(let i=0;i<65536;i++)r[i+1]+=r[i];for(let i=0;i<e;i++)s[r[t[A[i]]>>>o&65535]++]=A[i];[A,s]=[s,A]}return A}function rI(t,e,n=Aa){const A=Fn(t.hash,t.count),s=Fn(e.hash,e.count);let r=new Uint32Array(1024),o=new Uint32Array(1024),i=new Int8Array(1024),a=0,c=0,l=0,g=0;for(;l<t.count&&g<e.count;){const f=t.hash[A[l]],h=e.hash[s[g]];if(f<h){l++;continue}if(h<f){g++;continue}let u=l;for(;u<t.count&&t.hash[A[u]]===f;)u++;let I=g;for(;I<e.count&&e.hash[s[I]]===h;)I++;if(u-l>n||I-g>n)c++;else for(let d=l;d<u;d++)for(let C=g;C<I;C++){if(a===r.length){const E=r.length*2,B=new Uint32Array(E);B.set(r),r=B;const Q=new Uint32Array(E);Q.set(o),o=Q;const m=new Int8Array(E);m.set(i),i=m}r[a]=t.position[A[d]],o[a]=e.position[s[C]],i[a]=t.strand[A[d]]===e.strand[s[C]]?1:-1,a++}l=u,g=I}return{x:r.slice(0,a),y:o.slice(0,a),strand:i.slice(0,a),count:a,dropped:c}}function oI(t,e=Zu,n=ju,A=tI,s){const r=[];s?.fill(-1);let o=0;for(let a=0;a<t.count;a++)t.y[a]>o&&(o=t.y[a]);for(const a of[1,-1]){let c=0;for(let B=0;B<t.count;B++)t.strand[B]===a&&c++;const l=new Uint32Array(c),g=new Uint32Array(c),f=new Uint32Array(c),h=Math.ceil(o/n)+1;for(let B=0,Q=0;B<t.count;B++)t.strand[B]===a&&(l[Q]=B,g[Q]=t.x[B],f[Q]=a===1?Math.round((t.x[B]-t.y[B])/n)+h:Math.round((t.x[B]+t.y[B])/n),Q++);const u=Fn(f,c,Fn(g,c)),I=new Uint32Array(c),d=new Uint32Array(c);for(let B=0;B<c;B++)I[B]=l[u[B]],d[B]=f[u[B]];let C=0;const E=B=>{const Q=B-C;if(Q>=A){let m=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY,w=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;for(let N=C;N<B;N++){const k=I[N];m=Math.min(m,t.x[k]),p=Math.max(p,t.x[k]+_e),w=Math.min(w,t.y[k]),y=Math.max(y,t.y[k]+_e)}if(s!==void 0)for(let N=C;N<B;N++)s[I[N]]=r.length;r.push({x0:m,x1:p,y0:w,y1:y,strand:a,anchors:Q})}C=B};for(let B=1;B<=I.length;B++){if(B===I.length){E(B);break}const Q=I[B-1],m=I[B];(d[B-1]!==d[B]||t.x[m]-t.x[Q]>e)&&E(B)}}const i=r.map((a,c)=>c).sort((a,c)=>r[a].x0-r[c].x0||r[a].y0-r[c].y0);if(s!==void 0){const a=new Int32Array(r.length);i.forEach((c,l)=>a[c]=l);for(let c=0;c<t.count;c++)s[c]>=0&&(s[c]=a[s[c]])}return i.map(a=>r[a])}const iI=100,aI=4e5;function cI(t,e,n){const A=e.offsets[e.offsets.length-1],s=n.offsets[n.offsets.length-1],r=Math.max(iI,Math.ceil(Math.max(A,s)/aI)),o=new Uint8Array(Math.ceil(A/r)+1),i=new Uint8Array(Math.ceil(s/r)+1),a=(h,u)=>{const I=Math.floor(h/r);return[I,Math.max(I+1,Math.ceil(u/r))]},c=(h,u,I)=>{const[d,C]=a(u,I);let E=0;for(let B=d;B<C;B++)E+=h[B];return E/(C-d)},l=(h,u,I)=>{const[d,C]=a(u,I);h.fill(1,d,C)},g=new Uint8Array(t.length),f=t.map((h,u)=>u).sort((h,u)=>t[u].anchors-t[h].anchors||h-u);for(const h of f){const u=t[h];c(o,u.x0,u.x1)>.5||c(i,u.y0,u.y1)>.5||(g[h]=1,l(o,u.x0,u.x1),l(i,u.y0,u.y1))}return g}function lI(t,e,n,A,s){const r=e.offsets[e.offsets.length-1],o=n.offsets[n.offsets.length-1],i=Math.max(1,Math.ceil(Math.max(r,o)/Math.max(1,A))),a=Math.max(1,Math.ceil(r/i)),c=Math.max(1,Math.ceil(o/i)),l=new Float32Array(a*c);for(let g=0;g<t.count;g++){if(s!==void 0&&s[g]!==1)continue;const f=Math.min(a-1,Math.floor(t.x[g]/i)),h=Math.min(c-1,Math.floor(t.y[g]/i));l[h*a+f]+=t.strand[g]}return{values:l,ncols:a,nrows:c,cellSize:i}}function Gr(t,e){let n=0,A=t.names.length-1;for(;n<A;){const s=n+A+1>>1;t.offsets[s]<=e?n=s:A=s-1}return{sequence:n,at:e-t.offsets[n]}}const Ur=400;function gI(t,e,n,A,s){const r=t.length,o={x:{label:A,names:[...e.names],lengths:[...e.lengths]},y:{label:s,names:[...n.names],lengths:[...n.lengths]},x0:new Float64Array(r),x1:new Float64Array(r),y0:new Float64Array(r),y1:new Float64Array(r),strand:new Int8Array(r),anchors:new Int32Array(r)};return t.forEach((i,a)=>{o.x0[a]=i.x0,o.x1[a]=i.x1,o.y0[a]=i.y0,o.y1[a]=i.y1,o.strand[a]=i.strand,o.anchors[a]=i.anchors}),o}function vr(t,e){return t.names.map((n,A)=>({label:n,from:t.offsets[A]/e,to:t.offsets[A+1]/e}))}const fI=async t=>{const e=at(t.params,"x"),n=at(t.params,"y");if(t.residues===void 0)return t.note("This session cannot read residues, so there is nothing to set against anything."),[];if(e===null||n===null)return t.note("Choose the two sequence sets: one along x, one along y."),[];const A=t.residues(e),s=t.residues(n);if(A===void 0||s===void 0)return t.note("A sequence set chosen is no longer loaded. Drop the FASTA again, or pick another."),[];for(const R of[A,s])if(R.refusal!==void 0)return t.note(R.refusal),[];const r=Lr(A.contigs),o=Lr(s.contigs),i=r.offsets[r.offsets.length-1],a=eI(i);t.progress(0,4,"minimizers along x");const c=xr(r,R=>A.bases(R),a);t.throwIfCancelled(),t.progress(1,4,"minimizers along y");const l=xr(o,R=>s.bases(R),a);t.throwIfCancelled(),t.progress(2,4,"anchors");const g=rI(c,l);t.throwIfCancelled(),t.progress(3,4,"streaks");const f=new Int32Array(g.count),h=oI(g,void 0,void 0,void 0,f),u=e===n,I=!u&&st(t.params,"streaks","one to one")==="one to one",d=I?cI(h,r,o):new Uint8Array(h.length).fill(1),C=h.filter((R,v)=>d[v]===1),E=new Uint8Array(g.count);for(let R=0;R<g.count;R++)f[R]>=0&&d[f[R]]===1&&(E[R]=1);const B=Math.round(T(t.params,"cells",Ur)),Q=lI(g,r,o,B>0?B:Ur,E);t.progress(4,4);const m=c.count>0?Math.round(i/c.count):0,p=h.length-C.length;t.note(`Exact ${_e}-mers, one in about ${m.toLocaleString("en-US")} bases; hashes above ${Aa} copies on either side dropped (${g.dropped.toLocaleString("en-US")} of them). ${g.count.toLocaleString("en-US")} anchors, ${h.length.toLocaleString("en-US")} streaks`+(I?`, ${C.length.toLocaleString("en-US")} of them one to one — ${p.toLocaleString("en-US")} a stronger streak had taken the stretch of`:"")+(u?", every one drawn, the set against itself":"")+`. Not an alignment, and it writes none: a streak is ten or more shared ${_e}-mers along one diagonal.`);const w=[];for(const R of Q.values)Math.abs(R)>=3&&w.push(Math.abs(R));w.sort((R,v)=>R-v);const y=w.length===0?3:Math.max(3,w[Math.floor(.5*(w.length-1))]),N={kind:"matrix",id:"dotplot-density",label:I?"Streaks one to one, the same way round (red) and the other (blue)":"Streaks, the same way round (red) and the other (blue)",nrows:Q.nrows,ncols:Q.ncols,values:Q.values,xLabel:"along x",yLabel:"along y",xTicks:[],yTicks:[],colormap:"RdBu_r",centre:0,range:[-y,y],xSegments:vr(r,Q.cellSize),ySegments:vr(o,Q.cellSize),stats:[{label:"anchors",value:g.count},{label:I?"streaks one to one":"streaks",value:C.length},{label:"bases a cell",value:Q.cellSize}],large:!0,streaks:gI(C,r,o,t.inputs.labels?.[e]??"along x",t.inputs.labels?.[n]??"along y")},k=C.map(R=>{const v=Gr(r,R.x0),x=Gr(o,R.y0);return{xSequence:r.names[v.sequence],xStart:v.at,xEnd:v.at+(R.x1-R.x0),ySequence:o.names[x.sequence],yStart:x.at,yEnd:x.at+(R.y1-R.y0),strand:R.strand===1?"+":"-",anchors:R.anchors}}),b={kind:"table",id:"dotplot-streaks",label:"Streaks",columns:[{key:"xSequence",label:"x sequence",kind:"text"},{key:"xStart",label:"x start",kind:"number",coordinate:"start"},{key:"xEnd",label:"x end",kind:"number",coordinate:"end"},{key:"ySequence",label:"y sequence",kind:"text"},{key:"yStart",label:"y start",kind:"number",coordinate:"start"},{key:"yEnd",label:"y end",kind:"number",coordinate:"end"},{key:"strand",label:"strand",kind:"text",hint:"+ the same way round, − the other"},{key:"anchors",label:"anchors",kind:"number"}],rows:k},D=new Jn;for(const R of k)D.add(R.xSequence,R.xStart,R.xEnd,R.ySequence,R.yStart,R.yEnd,{score:R.anchors,name:R.strand==="+"?"same way round":"the other way round",detail:`${R.anchors} anchors`});const F={kind:"intervals",id:"dotplot-pairs",label:"Streaks, as pairs",payload:{kind:"pairs",data:D.finish()},noun:{one:"streak",many:"streaks"},display:"overlay"};return[N,b,F]};function xA(t,e,n,A){const s=Math.abs(t-e);return A&&n>0?Math.min(s,n-s%n):s}function hI(t,e,n){if(t.length===0)return Number.NaN;if(!n||!(e>0)){let i=0;for(const a of t)i+=a;return i/t.length}let A=0,s=0;for(const i of t){const a=2*Math.PI*i/e;A+=Math.sin(a),s+=Math.cos(a)}const o=(Math.atan2(A,s)/(2*Math.PI)*e%e+e)%e;return o>=e?0:o}function Tr(t,e,n,A){if(t.length===0)return null;let s=-1,r=0;for(let i=0;i<t.length;i++){let a=0;for(const c of t)xA(t[i],c,e,n)<=A&&a++;a>r&&(r=a,s=i)}const o=t.filter(i=>xA(t[s],i,e,n)<=A);return{centre:hI(o,e,n),count:o.length}}function uI(t,e,n){let A=-1,s=-1;for(let o=0;o<t.length;o++){const i=t[o];Number.isFinite(i)&&((A<0||i<t[A])&&(A=o),(s<0||i>t[s])&&(s=o))}const r=o=>o<0?Number.NaN:Math.min(n-1,Math.floor(o*e+e/2));return{low:r(A),high:r(s)}}const II=10;function dI(t){const{length:e,circular:n,low:A,high:s}=t,r=e/8,o=Tr(t.matS,e,n,r),i=Tr(t.parS,e,n,r),a=t.minMatS??II,c=(h,u)=>xA(h,u,e,n);let l=s,g="skew";if(o!==null&&t.matS.length>=a)l=c(A,o.centre)<c(s,o.centre)?A:s,g="matS";else if(i!==null)l=c(A,i.centre)>c(s,i.centre)?A:s,g="parS";else if(t.coverageAt!==void 0){const h=t.coverageAt(A),u=t.coverageAt(s);Number.isFinite(h)&&Number.isFinite(u)&&h!==u&&(l=h<u?A:s,g="coverage")}return{ori:l===s?A:s,ter:l,rule:g,agreesWithSkew:l===s,matS:o,parS:i}}function CI(t,e,n,A,s){const r=Math.max(s?3:1,Math.round(A)),o=s?r:r+3,i=n>0?r/n:0,a=B=>{let Q=B*i;s||(Q=Math.max(0,Math.min(r-1e-9,Q)));const m=Math.floor(Q),p=Q-m,w=[(1-p)**3/6,(3*p**3-6*p**2+4)/6,(-3*p**3+3*p**2+3*p+1)/6,p**3/6];return{first:s?m-1:m,w}},c=B=>s?(B%o+o)%o:B,l=new Float64Array(o*o),g=new Float64Array(o);let f=0;for(let B=0;B<t.length;B++){const Q=e[B];if(!Number.isFinite(Q))continue;f++;const{first:m,w:p}=a(t[B]);for(let w=0;w<4;w++){const y=c(m+w);g[y]+=p[w]*Q;for(let N=0;N<4;N++)l[y*o+c(m+N)]+=p[w]*p[N]}}let h=0,u=0;for(let B=0;B<e.length;B++)Number.isFinite(e[B])&&(h+=e[B],u++);h=u>0?h/u:0;const I=1e-6*Math.max(1,f/o);for(let B=0;B<o;B++)l[B*o+B]+=I,g[B]+=I*h;const d=QI(l,g,o),C=B=>{if(d===null)return Number.NaN;const{first:Q,w:m}=a(B);let p=0;for(let w=0;w<4;w++)p+=m[w]*d[c(Q+w)];return p},E=new Float64Array(t.length);for(let B=0;B<t.length;B++)E[B]=C(t[B]);return{fitted:E,at:C}}function QI(t,e,n){const A=Float64Array.from(t),s=Float64Array.from(e);for(let o=0;o<n;o++){let i=o;for(let a=o+1;a<n;a++)Math.abs(A[a*n+o])>Math.abs(A[i*n+o])&&(i=a);if(Math.abs(A[i*n+o])<1e-300)return null;if(i!==o){for(let c=0;c<n;c++){const l=A[o*n+c];A[o*n+c]=A[i*n+c],A[i*n+c]=l}const a=s[o];s[o]=s[i],s[i]=a}for(let a=o+1;a<n;a++){const c=A[a*n+o]/A[o*n+o];if(c!==0){for(let l=o;l<n;l++)A[a*n+l]-=c*A[o*n+l];s[a]-=c*s[o]}}}const r=new Float64Array(n);for(let o=n-1;o>=0;o--){let i=s[o];for(let a=o+1;a<n;a++)i-=A[o*n+a]*r[a];r[o]=i/A[o*n+o]}return r}function BI(t){let e=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY;for(const s of t)Number.isFinite(s)&&(s>e&&(e=s),s<n&&(n=s));return{ratio:n>0&&Number.isFinite(e)?e/n:Number.NaN,highest:e,lowest:n}}const EI="TGTTNCACGTGNAACA",mI="GTGACRNYGTCAC";function wI(t,e){const n=t[e];return n==null?e==="parS"?EI:mI:typeof n=="string"?n.replace(/\s+/g,"").toUpperCase():""}const pI=5e3,aA={matS:"nearest the matS cluster",parS:"farthest from the parS cluster",coverage:"lower coverage",skew:"skew maximum"};function Jr(t,e,n){const A={mids:[],starts:[],ends:[],strands:[],mismatches:[]};if(e===null)return A;for(const s of ps(t,e,{bothStrands:!0,mismatches:n}).hits)A.mids.push((s.start+s.end)/2),A.starts.push(s.start),A.ends.push(s.end),A.strands.push(s.strand),A.mismatches.push(s.mismatches);return A}const yI=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load the genome’s FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.refusal!==void 0)return t.note(n.refusal),[];const A={parS:{motif:null,pattern:"",mismatches:0},matS:{motif:null,pattern:"",mismatches:0}};for(const N of["parS","matS"]){const k=wI(t.params,N);if(k==="")continue;const b=Oe(k);if(Ye(b)){t.note(`${N}: ${b.reason} Its step was skipped.`);continue}const D=Math.round(T(t.params,`${N}Mismatches`,N==="parS"?1:0));A[N]={motif:b,pattern:k,mismatches:Math.max(0,Math.min(b.length-1,D))}}const s=Math.max(100,Math.round(T(t.params,"window",5e3))),r=Math.max(10,Math.min(s,Math.round(T(t.params,"step",1e3)))),o=Math.max(4,Math.min(40,Math.round(T(t.params,"knots",10)))),i=at(t.params,"coverage"),a=new Set(t.framing.circular??[]),c=Kn(t),l=c.length>0?c.map(N=>N.name):n.contigs.map(N=>N.name),g=On(t.params,"sequences"),f=g===null?l:l.filter(N=>g.includes(N));if(f.length===0)return t.note("No sequence is ticked, so there is nothing to read."),[];const h=new et,u=new et,I=new et;let d=0,C=0;const E=[],B=new Map,Q=[];for(let N=0;N<f.length;N++){const k=f[N];t.progress(N,f.length,k);const b=n.bases(k);if(b===void 0){Q.push(k);continue}const D=b.length;if(D<4*s){Q.push(k);continue}const F=a.has(k),R=ys(b,r),v=LA(ea(R,Math.max(1,Math.round(s/r)),F)),x=uI(na(v),r,D);if(!Number.isFinite(x.low)||!Number.isFinite(x.high)){Q.push(k);continue}const Y=Jr(b,A.parS.motif,A.parS.mismatches),J=Jr(b,A.matS.motif,A.matS.mismatches);let K,V=Number.NaN;if(i!==null){const L=(await t.sample(i,[{contig:k,start:0,end:D}],pI)).regions[0];if(L!==void 0&&L.values.length>3){const $=new Float64Array(L.values.length),Dt=new Float64Array(L.values.length);for(let P=0;P<L.values.length;P++)$[P]=(L.starts[P]+L.ends[P])/2,Dt[P]=L.values[P];const Ut=CI($,Dt,D,o,F);K=Ut.at,B.set(k,Ut.at),V=BI(Ut.fitted).ratio}}const H=dI({length:D,circular:F,low:x.low,high:x.high,parS:Y.mids,matS:J.mids,...K===void 0?{}:{coverageAt:K}}),ht=Math.floor(s/2),Gt=`${aA[H.rule]}${H.agreesWithSkew?"":" · disagrees with the skew"}`;for(const[q,L]of[["ori",H.ori],["ter",H.ter]])h.add(k,Math.max(0,L-ht),Math.min(D,L+ht),{name:q,detail:q==="ter"?`terminus · ${Gt}`:"origin"});for(let q=0;q<Y.starts.length;q++)u.add(k,Y.starts[q],Y.ends[q],{strand:Y.strands[q],name:"parS",score:Y.mismatches[q],detail:`${Y.mismatches[q]} ${Y.mismatches[q]===1?"mismatch":"mismatches"}`});for(let q=0;q<J.starts.length;q++)I.add(k,J.starts[q],J.ends[q],{strand:J.strands[q],name:"matS",score:J.mismatches[q],detail:`${J.mismatches[q]} ${J.mismatches[q]===1?"mismatch":"mismatches"}`});d+=Y.starts.length,C+=J.starts.length,H.agreesWithSkew||t.note(`${k}: the terminus was placed ${aA[H.rule]}, at the cumulative skew’s minimum — which is where the skew alone would put the origin. Check the assembly, or the motifs.`),E.push({sequence:k,length:D,topology:F?"circular":"linear",ori:H.ori+1,ter:H.ter+1,rule:aA[H.rule],parS:Y.starts.length,parSCluster:H.parS?.count??0,matS:J.starts.length,ratio:V})}if(t.progress(f.length,f.length,"done"),Q.length>0&&t.note(`${Q.length.toLocaleString()} ${Q.length===1?"sequence was":"sequences were"} not placed — not in the reference, or shorter than four skew windows: ${Q.slice(0,6).join(", ")}${Q.length>6?", …":""}.`),E.length===0)return[];i===null&&t.note("No coverage track was chosen, so there is no ori/ter ratio and no coverage step.");const m=E.filter(N=>N.topology==="linear").length;m>0&&t.note(`${m.toLocaleString()} ${m===1?"sequence was":"sequences were"} read as linear. A bacterial chromosome is usually circular — tick it in the Chromosomes table and run this again, or the origin at its first base is split between its two ends.`);const w=[{kind:"intervals",id:"oriter-loci",label:`Origin and terminus · ${t.inputs.labels?.[e]??"reference"}`,payload:{kind:"features",data:h.finish()},noun:{one:"locus",many:"loci"},display:"lane",look:"point"}];d>0&&w.push({kind:"intervals",id:"oriter-pars",label:`parS sites · ${A.parS.pattern}`,payload:{kind:"features",data:u.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"}),C>0&&w.push({kind:"intervals",id:"oriter-mats",label:`matS sites · ${A.matS.pattern}`,payload:{kind:"features",data:I.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"});const y=t.framing.binsize;if(B.size>0&&y>0&&c.length>0){const N=c.reduce((F,R)=>F+Math.max(1,Math.ceil(R.length/y)),0),k=new Float32Array(N).fill(Number.NaN);let b=0;for(const F of c){const R=Math.max(1,Math.ceil(F.length/y)),v=B.get(F.name);if(v!==void 0)for(let x=0;x<R;x++)k[b+x]=v(Math.min(F.length-1,(x+.5)*y));b+=R}const D=t.inputs.labels?.[i??""]??"coverage";w.push({kind:"profile",id:"oriter-coverage-fit",label:`${D} · spline fit`,values:k,extent:[0,N],binsize:y,unit:""})}return w.push({kind:"table",id:"oriter-table",label:"Origin and terminus per sequence",columns:[{key:"sequence",label:"sequence",kind:"text"},{key:"length",label:"length",kind:"number"},{key:"topology",label:"read as",kind:"text"},{key:"ori",label:"ori",kind:"number",hint:"Centre of the origin locus, 1-based."},{key:"ter",label:"ter",kind:"number",hint:"Centre of the terminus locus, 1-based."},{key:"rule",label:"terminus placed by",kind:"text"},{key:"parS",label:"parS",kind:"number",hint:"Sites found on this sequence."},{key:"parSCluster",label:"in cluster",kind:"number",hint:"parS sites within an eighth of the sequence of the densest one."},{key:"matS",label:"matS",kind:"number",hint:"Sites found on this sequence."},{key:"ratio",label:"ori/ter",kind:"number",digits:2,hint:"Highest over lowest smoothed coverage: copies of the origin per copy of the terminus."}],rows:E}),w};function GA(t,e,n){const A=t.contigs.indexOf(e);if(A<0)return[];const s=[];for(let r=t.contigAt[A];r<t.contigAt[A+1];r++){const o=t.start[r],i=t.end[r];if(i<=o)continue;const a=s[s.length-1];a!==void 0&&o<=a[1]?a[1]=Math.max(a[1],i):s.push([o,i])}return s}function $r(t){let e=0;for(const[n,A]of t)e+=A-n;return e}function NI(t,e){let n=0,A=0,s=0;for(;A<t.length&&s<e.length;){const r=Math.max(t[A][0],e[s][0]),o=Math.min(t[A][1],e[s][1]);o>r&&(n+=o-r),t[A][1]<e[s][1]?A++:s++}return n}function Yr(t,e,n,A){const s=t.contigs.indexOf(e);if(s<0||n.length===0)return 0;let r=0,o=0;for(let i=t.contigAt[s];i<t.contigAt[s+1];i++){const a=t.start[i],c=t.end[i],l=c-a;if(l<=0)continue;for(;o<n.length&&n[o][1]<=a;)o++;let g=0;for(let f=o;f<n.length&&n[f][0]<c;f++)g+=Math.max(0,Math.min(c,n[f][1])-Math.max(a,n[f][0]));g/l>=A&&g>0&&r++}return r}function sa(t,e,n){const A=new Set([...t.contigs,...e.contigs]);let s=0,r=0,o=0,i=0,a=0;for(const l of A){const g=GA(t,l,n.minFraction),f=GA(e,l,n.minFraction);s+=$r(g),r+=$r(f),o+=NI(g,f),i+=Yr(t,l,f,n.minFraction),a+=Yr(e,l,g,n.minFraction)}const c=s+r-o;return{basesA:s,basesB:r,intersection:o,union:c,jaccard:c>0?o/c:Number.NaN,featuresAHit:i,featuresBHit:a,featuresA:t.length,featuresB:e.length}}function kI(t,e,n,A,s){let r=0,o=0,i=0,a=0,c=0,l=Number.NaN,g=Number.NaN;const f=()=>{if(!Number.isNaN(l)){for(o+=g-l;c<A.length&&A[c][1]<=l;)c++;for(let h=c;h<A.length&&A[h][0]<g;h++)r+=Math.min(g,A[h][1])-Math.max(l,A[h][0])}};for(let h=0;h<n.length;h++){const u=n[h],I=t[u],d=I+e[u];for(;a<A.length&&A[a][1]<=I;)a++;let C=0;for(let B=a;B<A.length&&A[B][0]<d;B++)C+=Math.max(0,Math.min(d,A[B][1])-Math.max(I,A[B][0]));const E=d-I;E>0&&C>0&&C/E>=s&&i++,Number.isNaN(l)?(l=I,g=d):I<=g?g=Math.max(g,d):(f(),l=I,g=d)}return f(),{intersection:r,covered:o,hits:i}}function cA(t,e){const n=e.length;let A=0;for(let c=0;c<n;c++)A+=e[c];const s=n>0?A/n:Number.NaN;let r=0;for(let c=0;c<n;c++)r+=(e[c]-s)**2;const o=n>1?Math.sqrt(r/(n-1)):Number.NaN;let i=0,a=0;for(let c=0;c<n;c++)e[c]>=t&&i++,e[c]<=t&&a++;return{observed:t,mean:s,sd:o,z:o>0?(t-s)/o:Number.NaN,fold:s>0?t/s:Number.NaN,pEnriched:(i+1)/(n+1),pDepleted:(a+1)/(n+1)}}function bI(t,e,n){const A=sa(t,e,{minFraction:n.minFraction}),s=[],r=[],o=[];for(const I of t.contigs){const d=t.contigs.indexOf(I),C=[];let E=0;for(let m=t.contigAt[d];m<t.contigAt[d+1];m++){const p=t.end[m]-t.start[m];p<=0||(C.push(p),E=Math.max(E,t.end[m]))}if(C.length===0)continue;let Q=n.lengthOf(I);if(Q===void 0||Q<=0){const m=e.contigs.indexOf(I);let p=E;if(m>=0)for(let w=e.contigAt[m];w<e.contigAt[m+1];w++)p=Math.max(p,e.end[w]);Q=p,r.push(I)}if(!Number.isFinite(Q)||Q<=0){o.push(I);continue}s.push({contig:I,length:Q,lengths:C,runs:GA(e,I)})}if(s.length===0)return null;const i=Math.max(1,Math.trunc(n.iterations)),a=zi(n.seed),c=new Float64Array(i),l=new Float64Array(i),g=new Float64Array(i);let f=0;for(const I of s)f=Math.max(f,I.lengths.length);const h=new Float64Array(f),u=new Int32Array(f);for(let I=0;I<i;I++){if(n.cancelled?.()===!0)return null;let d=0,C=0,E=0;for(const Q of s){const m=Q.lengths.length;for(let y=0;y<m;y++){const N=Math.max(0,Q.length-Q.lengths[y]);h[y]=Math.floor(a()*(N+1)),u[y]=y}const p=u.subarray(0,m);p.sort((y,N)=>h[y]-h[N]);const w=kI(h,Q.lengths,p,Q.runs,n.minFraction);d+=w.intersection,C+=w.covered,E+=w.hits}l[I]=d,g[I]=E;const B=C+A.basesB-d;c[I]=B>0?d/B:Number.NaN,n.onProgress?.(I+1,i)}return{iterations:i,jaccard:cA(A.jaccard,c),intersection:cA(A.intersection,l),featuresHit:cA(A.featuresAHit,g),assumedLengths:r,droppedContigs:o}}const DI=async t=>{const e=ne(t.inputs.features,t.params,"a"),n=ne(t.inputs.features,t.params,"b"),A=e.value,s=n.value;if(A===void 0||s===void 0){const u=[e,n].filter(d=>d.value===void 0),I=u.filter(d=>d.chosen).length;return t.note(I===u.length?`The interval ${u.length===2?"sets":"set"} chosen ${u.length===2?"are":"is"} no longer loaded. Re-open the file, or pick another.`:`Two interval sets are needed and ${u.length===2&&I===0?"neither has":"one has not"} been chosen. Load two BED files, or a BED and a GTF, and pick one in each box.`),[]}t.progress(0,1,"comparing");const r=sa(A,s,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6)))});t.progress(1,1,"done"),Number.isFinite(r.jaccard)||t.note("Neither set covers any bases, so there is nothing to compare.");const i=[{kind:"table",id:"overlap",label:"Overlap",columns:[{key:"measure",label:"Measure",kind:"text"},{key:"value",label:"Value",kind:"number",digits:4},{key:"note",label:"Note",kind:"text"}],rows:[{measure:"Jaccard (bases)",value:r.jaccard,note:"Symmetric; 1 is identical."},{measure:"Shared bases",value:r.intersection,note:""},{measure:"Bases in either",value:r.union,note:""},{measure:"Bases in the first",value:r.basesA,note:"After merging its own overlaps."},{measure:"Bases in the second",value:r.basesB,note:"After merging its own overlaps."},{measure:"First set hit",value:r.featuresA===0?Number.NaN:r.featuresAHit/r.featuresA,note:`${r.featuresAHit.toLocaleString()} of ${r.featuresA.toLocaleString()} features.`},{measure:"Second set hit",value:r.featuresB===0?Number.NaN:r.featuresBHit/r.featuresB,note:`${r.featuresBHit.toLocaleString()} of ${r.featuresB.toLocaleString()} features.`}]}];if(!Lt(t.params,"shuffle",!1))return i;const a=st(t.params,"shuffleWhich","a")!=="b",c=Math.max(20,Math.trunc(T(t.params,"iterations",1e3)));t.progress(0,c,"shuffling");const l=bI(a?A:s,a?s:A,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6))),iterations:c,seed:T(t.params,"seed",1),lengthOf:u=>t.lengthOf(u),cancelled:()=>t.cancelled(),onProgress:(u,I)=>t.progress(u,I,"shuffling")});if(t.throwIfCancelled(),l===null)return t.note("The set chosen to move occupies no sequence this session knows a length for, so there was nothing to shuffle it within. Load the assembly — a chrom.sizes, or the map itself."),i;l.assumedLengths.length>0&&t.note(`${l.assumedLengths.length.toLocaleString()} sequence${l.assumedLengths.length===1?" has":"s have"} no known length, so the null was drawn over the furthest position either set reaches there — which is shorter than the sequence and overstates the enrichment. ${l.assumedLengths.slice(0,6).join(", ")}${l.assumedLengths.length>6?", …":""}.`),l.droppedContigs.length>0&&t.note(`${l.droppedContigs.length.toLocaleString()} sequence${l.droppedContigs.length===1?"":"s"} could not be shuffled at all and ${l.droppedContigs.length===1?"is":"are"} left out of the null: ${l.droppedContigs.slice(0,6).join(", ")}${l.droppedContigs.length>6?", …":""}.`);const g=a?"first":"second",f=(u,I,d)=>({measure:u,observed:I.observed,expected:I.mean,fold:I.fold,z:I.z,p:I.observed>=I.mean?I.pEnriched:I.pDepleted,tail:I.observed>=I.mean?"enriched":"depleted",digits:d}),h=[f("Jaccard (bases)",l.jaccard,4),f("Shared bases",l.intersection,0),f(`Features of the ${g} set hit`,l.featuresHit,0)].map(({digits:u,...I})=>I);return i.push({kind:"table",id:"overlap-null",label:`Against ${l.iterations.toLocaleString()} shuffles of the ${g} set`,columns:[{key:"measure",label:"Measure",kind:"text"},{key:"observed",label:"Observed",kind:"number",digits:4},{key:"expected",label:"Expected",kind:"number",digits:4,hint:"Mean of the null."},{key:"fold",label:"Fold",kind:"number",digits:2,hint:"Observed over expected."},{key:"z",label:"z",kind:"number",digits:2},{key:"p",label:"p",kind:"number",digits:5,hint:`Permutation p on the tail the observation fell on, with Phipson and Smyth’s +1: the smallest this run can report is ${(1/(l.iterations+1)).toPrecision(2)}.`},{key:"tail",label:"Tail",kind:"text"}],rows:h}),i},$t={maxIter:3e3,convergenceEps:1e-6,start:[.1,1,.2,.5],pseudoValueEps:1e-8,finalPseudoValueEps:1e-12,emStepsPerRound:30},Ct=[0,.2,.1,.01],ee=[20,20,.99,.99],Or={min:Ct,max:ee};class se extends Error{constructor(e){super(e),this.name="IdrError"}}const In=new Float64Array(1),_r=new Int32Array(In.buffer),ra=new Uint8Array(Float64Array.of(1).buffer)[7]===63?1:0,MI=1-ra,Kr=.8450629115104675,FI=.1283791670955126,SI=1.0270333367641007,Fe=[.12837916709551256,-.3250421072470015,-.02848174957559851,-.005770270296489442,-23763016656650163e-21],Se=[.39791722395915535,.0650222499887673,.005081306281875766,.00013249473800432164,-3960228278775368e-21],zt=[-.0023621185607526594,.41485611868374833,-.3722078760357013,.31834661990116175,-.11089469428239668,.035478304325618236,-.002166375594868791],le=[.10642088040084423,.540397917702171,.07182865441419627,.12617121980876164,.01363708391202905,.011984499846799107],Tt=[-.009864944034847148,-.6938585727071818,-10.558626225323291,-62.375332450326006,-162.39666946257347,-184.60509290671104,-81.2874355063066,-9.814329344169145],Jt=[19.651271667439257,137.65775414351904,434.56587747522923,645.3872717332679,429.00814002756783,108.63500554177944,6.570249770319282,-.0604244152148581],Xt=[-.0098649429247001,-.799283237680523,-17.757954917754752,-160.63638485582192,-637.5664433683896,-1025.0951316110772,-483.5191916086514],Vt=[30.33806074348246,325.7925129965739,1536.729586084437,3199.8582195085955,2553.0504064331644,474.52854120695537,-22.44095244658582];function qr(t){In[0]=t;const e=_r[ra],n=e&2147483647;if(n>=2146435072)return 1-(e>>>31<<1)+1/t;if(n<1072365568){if(n<1043333120)return n<8388608?.125*(8*t+SI*t):t+FI*t;const c=t*t,l=Fe[0]+c*(Fe[1]+c*(Fe[2]+c*(Fe[3]+c*Fe[4]))),g=1+c*(Se[0]+c*(Se[1]+c*(Se[2]+c*(Se[3]+c*Se[4])))),f=l/g;return t+t*f}if(n<1072955392){const c=Math.abs(t)-1,l=zt[0]+c*(zt[1]+c*(zt[2]+c*(zt[3]+c*(zt[4]+c*(zt[5]+c*zt[6]))))),g=1+c*(le[0]+c*(le[1]+c*(le[2]+c*(le[3]+c*(le[4]+c*le[5])))));return e>=0?Kr+l/g:-Kr-l/g}if(n>=1075314688)return e>=0?1-1e-300:1e-300-1;const A=Math.abs(t),s=1/(A*A);let r,o;n<1074191214?(r=Tt[0]+s*(Tt[1]+s*(Tt[2]+s*(Tt[3]+s*(Tt[4]+s*(Tt[5]+s*(Tt[6]+s*Tt[7])))))),o=1+s*(Jt[0]+s*(Jt[1]+s*(Jt[2]+s*(Jt[3]+s*(Jt[4]+s*(Jt[5]+s*(Jt[6]+s*Jt[7])))))))):(r=Xt[0]+s*(Xt[1]+s*(Xt[2]+s*(Xt[3]+s*(Xt[4]+s*(Xt[5]+s*Xt[6]))))),o=1+s*(Vt[0]+s*(Vt[1]+s*(Vt[2]+s*(Vt[3]+s*(Vt[4]+s*(Vt[5]+s*Vt[6]))))))),In[0]=A,_r[MI]=0;const i=In[0],a=Math.exp(-i*i-.5625)*Math.exp((i-A)*(i+A)+r/o);return e>=0?1-a/A:a/A-1}function dn(t,e,n,A){const s=(t-e)/n;return .5*A*qr(s/Math.SQRT2)+.5*(1-A)*qr(t/Math.SQRT2)+.5}function Hr(t,e,n,A,s,r,o){let i=0;for(let a=0;a<1e3;a++){i=s+(r-s)/2;const c=dn(i,e,n,A);if(Math.abs(c-t)<o)return i;c<t?s=i:r=i}return i}function UA(t,e,n,A,s,r){const o=Pr(t.length,n,A,s,r),i=e.length===t.length?o:Pr(e.length,n,A,s,r);return[Wr(t,o),Wr(e,i)]}function Wr(t,e){const n=new Float64Array(t.length);for(let A=0;A<t.length;A++)n[A]=e[t[A]];return n}function Pr(t,e,n,A,s){const r=new Float64Array(t);if(t===0)return r;const o=t+1,i=1/o;let a=0<=e?0:e;for(;dn(a,e,n,A)>i;)a-=1;let c=0>=e?0:e;for(;dn(c,e,n,A)<1-i;)c+=1;a=Hr(i,e,n,A,a,c,s),r[0]=a;for(let l=1;l<t;l++){const g=(l+1)/o;dn(c,e,n,A)<g&&(c+=10);const f=Hr(g,e,n,A,a,c,s);r[l]=f,a=f,c=a+2*(f-r[l-1])}return r}class oa{constructor(e,n){this.z1=e,this.z2=n,this.n=e.length,this.noise=new Float64Array(this.n),this.signal=new Float64Array(this.n),this.terms=new Float64Array(this.n),zr(0,1,0,e,n,this.noise)}n;noise;signal;terms;at=[Number.NaN,Number.NaN,Number.NaN];logLik(e){this.signalAt(e);const n=e[3];for(let A=0;A<this.n;A++)this.terms[A]=Math.log(n*this.signal[A]+(1-n)*this.noise[A]);return Bt(this.terms)}membership(e){this.signalAt(e);const n=e[3],A=new Float64Array(this.n);for(let s=0;s<this.n;s++){const r=n*this.signal[s];A[s]=r/(r+(1-n)*this.noise[s])}return A}signalAt(e){const n=this.at;e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2]||(zr(e[0],e[1],e[2],this.z1,this.z2,this.signal),this.at=[e[0],e[1],e[2]])}}function zr(t,e,n,A,s,r){const o=-1.837877-Math.log(e)-Math.log(e)-.5*Math.log(1-n*n),i=2*n,a=2*(1-n*n);for(let c=0;c<A.length;c++){const l=(A[c]-t)/e,g=(s[c]-t)/e;r[c]=Math.exp(o-(l*l-i*l*g+g*g)/a)}}function RI(t,e){const{n,z1:A,z2:s}=t,r=t.membership(e),o=Bt(r),i=new Float64Array(n);for(let I=0;I<n;I++)i[I]=r[I]*A[I];const a=Bt(i)/o;for(let I=0;I<n;I++)i[I]=r[I]*s[I];const c=Bt(i)/o,l=(a+c)/2;for(let I=0;I<n;I++){const d=A[I]-l;i[I]=r[I]*(d*d)}const g=Bt(i);for(let I=0;I<n;I++){const d=s[I]-l;i[I]=r[I]*(d*d)}const f=Bt(i),h=Math.sqrt((g+f)/(2*o));for(let I=0;I<n;I++)i[I]=r[I]*(A[I]-l)*(s[I]-l);const u=2*Bt(i)/(g+f);return[l,h,u,o/n]}function ia(t){const e=[t[0],t[1],t[2],t[3]];let n=!1;return e[0]<Ct[0]&&(e[0]=Ct[0],n=!0),e[1]<Ct[1]&&(e[1]=Ct[1],n=!0),e[2]<Ct[2]?(e[2]=Ct[2],n=!0):e[2]>ee[2]&&(e[2]=ee[2],n=!0),e[3]<Ct[3]?(e[3]=Ct[3],n=!0):e[3]>ee[3]&&(e[3]=ee[3],n=!0),{theta:e,changed:n}}function LI(t,e,n,A){let s=e,r=t.logLik(s),o=[e[0],e[1],e[2],e[3]];for(let i=0;i<n;i++){const a=ia(RI(t,s));o=a.theta;const c=t.logLik(o);if(a.changed)return{theta:o,changed:!0};if(!(c+1e-6>=r))throw new se("An EM step lowered the likelihood, which stops idr’s own fit.");if(c-r<A)return{theta:o,changed:!1};s=o,r=c}return{theta:o,changed:!1}}function xI(t,e,n,A=1e-5,s=500){if(!Number.isFinite(e)||!Number.isFinite(n))throw new se("Optimization bounds must be finite scalars.");if(e>n)throw new se("The lower bound exceeds the upper bound.");const r=Math.sqrt(22e-17),o=.5*(3-Math.sqrt(5));let i=e,a=n,c=i+o*(a-i),l=c,g=c,f=0,h=0,u=g,I=t(u),d=1,C=I,E=I,B=.5*(i+a),Q=r*Math.abs(g)+A/3,m=2*Q;for(;Math.abs(g-B)>m-.5*(a-i);){let p=!0;if(Math.abs(h)>Q){p=!1;let N=(g-l)*(I-C),k=(g-c)*(I-E),b=(g-c)*k-(g-l)*N;if(k=2*(k-N),k>0&&(b=-b),k=Math.abs(k),N=h,h=f,Math.abs(b)<Math.abs(.5*k*N)&&b>k*(i-g)&&b<k*(a-g)){if(f=(b+0)/k,u=g+f,u-i<m||a-u<m){const D=Math.sign(B-g)+(B-g===0?1:0);f=Q*D}}else p=!0}p&&(h=g>=B?i-g:a-g,f=o*h);const w=Math.sign(f)+(f===0?1:0);u=g+w*Math.max(Math.abs(f),Q);const y=t(u);if(d+=1,y<=I?(u>=g?i=g:a=g,c=l,C=E,l=g,E=I,g=u,I=y):(u<g?i=u:a=u,y<=E||l===g?(c=l,C=E,l=u,E=y):(y<=C||c===g||c===l)&&(c=u,C=y)),B=.5*(i+a),Q=r*Math.abs(g)+A/3,m=2*Q,d>=s)break}return g}function GI(t,e,n){const A=[e[0],e[1],e[2],e[3]],s=e[n],r=c=>(A[n]=s+c,-t.logLik(A));if(!(s>=Ct[n])||!(s<=ee[n]))throw new se("A coordinate-ascent step started outside idr’s parameter box.");const o=xI(r,Ct[n]-s,ee[n]-s),i=-r(0),a=-r(o);return a>i?(e[n]+=o,a):i}function UI(t,e,n,A){let s=t.logLik(e),r=[e[0],e[1],e[2],e[3]],o=s;for(let i=0;i<n;i++){for(let c=0;c<4;c++)o=GI(t,r,c);const a=ia(r);if(a.changed)throw new se("Coordinate ascent left idr’s parameter box, which stops idr’s own fit.");if(r=a.theta,!(o+1e-6>=s))throw new se("A coordinate-ascent round lowered the likelihood, which stops idr’s own fit.");if(o-s<A)return r;s=o}return r}async function vI(t,e,n={}){const A=n.eps??$t.convergenceEps,s=n.maxIter??$t.maxIter,r=$t.pseudoValueEps,o=n.start??$t.start;let i=[o[0],o[1],o[2],o[3]],[a,c]=UA(t,e,i[0],i[1],i[3],r),l=!1,g=0;const f=new Float64Array(t.length);for(let h=0;h<s;h++){g=h+1;const u=i,I=new oa(a,c),d=LI(I,u,$t.emStepsPerRound,A/10);i=d.theta,d.changed&&(l=!0,i=UI(I,u,$t.emStepsPerRound,A/10));const C=Bt([Math.abs(i[0]-u[0]),Math.abs(i[1]-u[1]),Math.abs(i[2]-u[2]),Math.abs(i[3]-u[3])]),E=a,B=c;[a,c]=UA(t,e,i[0],i[1],i[3],r);for(let p=0;p<f.length;p++)f[p]=Math.abs(E[p]-a[p]);const Q=SA(f);for(let p=0;p<f.length;p++)f[p]=Math.abs(B[p]-c[p]);const m=Q+SA(f);if(n.between!==void 0&&await n.between(g),h>3&&C<A&&m<A)break}return{theta:i,rounds:g,coordinateAscent:l}}function TI(t,e,n){const A=$t.finalPseudoValueEps,[s,r]=UA(e,n,t[0],t[1],t[3],A),o=new oa(s,r).membership(t),i=$t.convergenceEps,a=new Float64Array(o.length);for(let c=0;c<a.length;c++){let l=1-o[c];s[c]+r[c]<0&&(l=1),a[c]=l<i?i:l>1?1:l}return a}function JI(t){const e=t.length,n=Array.from({length:e},(o,i)=>i);n.sort((o,i)=>t[o]-t[i]||o-i);const A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o<e&&t[n[o]]===t[n[r]];)s+=t[n[o]],o++;const i=s/o;for(let a=r;a<o;a++)A[n[a]]=i;r=o}return A}function vA(t){return-Math.log10(Math.max(1e-5,t))}function Xr(t){const e=t.length,n=Array.from({length:e},(s,r)=>r);n.sort((s,r)=>t[s]-t[r]||s-r);const A=new Int32Array(e);for(let s=0;s<e;s++)A[n[s]]=s;return A}const sn={width:150,times:3,minWidth:75,truncate:1e5},$I=[-1/560,8/315,-1/5,8/5,-205/72,8/5,-1/5,8/315,-1/560],YI=1e6,OI=1e-10;function _I(t,e){let n=Float64Array.from($I);const A=new Float64Array(t).fill(1/t);for(let o=0;o<e;o++)n=KI(n,A);const s=new Float64Array(n.length);for(let o=0;o<n.length;o++)s[o]=YI*n[n.length-1-o];const r=new Float64Array(s.length+1);for(let o=0;o<s.length;o++)r[o+1]=r[o]+s[o];return{width:t,times:e,values:s,cumulative:r}}function KI(t,e){const n=new Float64Array(t.length+e.length-1);for(let A=0;A<n.length;A++){let s=0;const r=Math.max(0,A-(e.length-1)),o=Math.min(A,t.length-1);for(let i=r;i<=o;i++)s+=t[i]*e[A-i];n[A]=s}return n}function Ns(t,e){return Math.min(e,t.values.length)-1>>1}function qI(t,e){const n=Ns(t,e);return{left:t.values.length-1-n,right:n}}function HI(t,e,n,A,s){const r=[],o=[],i=[],a=(l,g,f)=>{const h=i.length-1;if(h>=0&&o[h]===l&&aa(i[h],f)){o[h]=g;return}r.push(l),o.push(g),i.push(f)};let c=A;for(let l=0;l<t.length&&c<s;l++){const g=Math.max(t[l],c),f=Math.min(e[l],s);f<=g||(g>c&&a(c,g,Number.NaN),a(g,f,n[l]),c=f)}return c<s&&a(c,s,Number.NaN),{starts:Int32Array.from(r),ends:Int32Array.from(o),values:Float64Array.from(i),length:r.length}}function WI(t,e){return{starts:Int32Array.of(t),ends:Int32Array.of(e),values:Float64Array.of(0),length:1}}function PI(t,e,n){if(t.length===1)return t[0];const A=[],s=[],r=[],o=new Int32Array(t.length);let i=e;for(;i<n;){let a=n,c=0;for(let f=0;f<t.length;f++){const h=t[f];for(;o[f]<h.length&&h.ends[o[f]]<=i;)o[f]++;const u=o[f];if(u>=h.length||h.starts[u]>i)throw new Error(`pooledRuns: a track does not cover ${i}`);c+=h.values[u],h.ends[u]<a&&(a=h.ends[u])}const l=Math.fround(c/t.length),g=r.length-1;g>=0&&aa(r[g],l)?s[g]=a:(A.push(i),s.push(a),r.push(l)),i=a}return{starts:Int32Array.from(A),ends:Int32Array.from(s),values:Float64Array.from(r),length:A.length}}function aa(t,e){return t===e||t!==t&&e!==e}function Vr(t,e,n,A,s,r,o){const i=e.values.length,a=Ns(e,n),c=new Float64Array(Math.max(0,s-A));if(o===void 0)Zr(t,e,a,A,s,c,A);else{let l=0;for(;l<c.length;){const g=o.indexOf(1,l),f=g<0||g>c.length?c.length:g;if(c.fill(Number.NaN,l,f),f===c.length)break;const h=o.indexOf(0,f),u=h<0||h>c.length?c.length:h;Zr(t,e,a,A+f,A+u,c,A),l=u}}if(r!==void 0)for(let l=0;l<t.length;l++){const g=Math.max(A,t.starts[l]-a+i-1),f=Math.min(s-1,t.ends[l]-a-1);g<=f&&r.fill(1,g-A,f-A+1)}return c}function Zr(t,e,n,A,s,r,o){const i=e.values.length,a=e.values,c=e.cumulative,l=t.starts,g=t.ends,f=t.values,h=A+n+1,u=s+n,I=-(n+1)-o;let d=0,C=t.length;for(;d<C;){const Q=d+C>>>1;g[Q]>h-i?C=Q:d=Q+1}const E=c[0],B=c[i];for(;d<t.length;d++){const Q=l[d];if(Q+1>u)break;const m=g[d],p=f[d];let w=Q+1>h?Q+1:h,y=m-1<Q+i?m-1:Q+i;if(y>u&&(y=u),w<=y){let k=w;k===Q+1&&(r[I+k]+=p*a[0],k++);for(let b=I+k,D=k-Q,F=I+y;b<=F;b++,D++)r[b]+=p*(c[D]-E)}if(w=m>h?m:h,y=Q+i<u?Q+i:u,w<=y)if(m-Q===1)for(let k=I+w,b=w-1-Q,D=I+y;k<=D;k++,b++)r[k]+=p*a[b];else for(let k=I+w,b=w-Q,D=w-m,F=I+y;k<=F;k++,b++,D++)r[k]+=p*(c[b]-c[D]);if(w=Q+i+1>h?Q+i+1:h,y=m-1<u?m-1:u,w<=y){const k=p*(B-E);for(let b=I+w,D=I+y;b<=D;b++)r[b]+=k}w=m>Q+i+1?m:Q+i+1,w<h&&(w=h);const N=m+i-1;if(y=N<u?N:u,w<=y){const k=I+(y===N?y-1:y);for(let b=I+w,D=w-m;b<=k;b++,D++)r[b]+=p*(B-c[D]);y===N&&(r[I+N]+=p*a[i-1])}}}const zI=65536;function ca(t){return Math.fround(t)<OI}function XI(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)ca(t[n])&&(e[n]=1);return e}class jr{constructor(e,n,A){this.contig=e,this.length=n,this.tracks=A.length,this.absent=A,this.scores=A.map(()=>[]),this.held=A.map(()=>new Float64Array(1024))}tracks;absent;starts=[];ends=[];modes=[];flats=[];scores;previous=!1;rose=!1;open=-1;best=Number.NEGATIVE_INFINITY;ties=[];held;heldLength=0;openFlat=0;position=0;feed(e,n,A,s){if(e!==this.position)throw new Error(`ConcaveScan: fed ${e} after ${this.position}`);for(let r=0;r<n.length;r++){const o=e+r,i=Math.fround(n[r]),a=ca(i);if(o===0?a&&this.begin(0):a&&!this.previous?(this.rose=!0,this.begin(o)):!a&&this.previous&&this.close(o),a){const c=-i;c>this.best?(this.best=c,this.ties=[o]):c===this.best&&this.ties.push(o),this.hold(A,r),s!==void 0&&s[r]===1&&(this.openFlat=1)}this.previous=a}this.position=e+n.length}finish(){if(this.open>=0&&this.close(this.length),!this.rose){this.starts=[],this.ends=[],this.modes=[],this.flats=[];for(const e of this.scores)e.length=0}return{contig:this.contig,starts:Int32Array.from(this.starts),ends:Int32Array.from(this.ends),modes:Int32Array.from(this.modes),scores:this.scores.map(e=>Float64Array.from(e)),flat:Uint8Array.from(this.flats)}}begin(e){this.open=e,this.best=Number.NEGATIVE_INFINITY,this.ties=[],this.heldLength=0,this.openFlat=0,this.held[0].length>zI&&(this.held=this.held.map(()=>new Float64Array(1024)))}hold(e,n){this.heldLength===this.held[0].length&&(this.held=this.held.map(A=>{const s=new Float64Array(A.length*2);return s.set(A),s}));for(let A=0;A<this.tracks;A++)this.held[A][this.heldLength]=e[A][n];this.heldLength++}close(e){this.starts.push(this.open),this.ends.push(e),this.flats.push(this.openFlat),this.modes.push(this.ties.length===0?this.open:this.ties[this.ties.length>>1]);for(let n=0;n<this.tracks;n++)this.scores[n].push(this.absent[n]?Number.NEGATIVE_INFINITY:-SA(this.held[n],0,this.heldLength));this.open=-1}}function VI(t){const e=t.length,n=Array.from({length:e},(r,o)=>o);n.sort((r,o)=>t[o]-t[r]||r-o);const A=new Float64Array(e);let s=0;for(;s<e;){let r=s+1;for(;r<e&&t[n[r]]===t[n[s]];)r++;const o=(s+1+r)/2;for(let i=s;i<r;i++)A[n[i]]=o;s=r}return A}function ZI(t,e,n,A,s){const r=e.length,o=new Float64Array(r).fill(Number.POSITIVE_INFINITY);for(const l of A){const g=VI(l);for(let f=0;f<r;f++)g[f]<o[f]&&(o[f]=g[f])}const i=(l,g)=>t[l]<t[g]?-1:t[l]>t[g]?1:e[l]-e[g]||n[l]-n[g],a=Array.from({length:r},(l,g)=>g);a.sort((l,g)=>o[l]-o[g]||i(l,g));const c=a.slice(0,Math.max(0,Math.min(r,s)));return c.sort(i),Int32Array.from(c)}class jI{constructor(e,n,A={}){this.tracks=e,this.limit=n,this.scores=Array.from({length:e},()=>new Float64Array(1024)),this.floor=new Float64Array(e).fill(Number.NEGATIVE_INFINITY),A.prune===!1&&(this.holdAll=!0),this.below=A.below===!0?new Float64Array(1024):null}size=0;contigs=[];starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;floor;seen=0;dropped=0;holdAll=!1;below;belowSize=0;add(e,n){this.seen++;let A=this.holdAll;for(let r=0;r<this.tracks;r++){const o=e.scores[r][n];o!==o&&!this.holdAll&&(this.holdAll=!0,A=!0),o>=this.floor[r]&&(A=!0)}if(!A){this.drop(e.scores[0][n],e.flat[n]);return}this.size===this.starts.length&&this.grow();const s=this.size++;this.contigs[s]=e.contig,this.starts[s]=e.starts[n],this.ends[s]=e.ends[n],this.modes[s]=e.modes[n],this.flats[s]=e.flat[n];for(let r=0;r<this.tracks;r++)this.scores[r][s]=e.scores[r][n];!this.holdAll&&this.size>=2*this.tracks*this.limit+1024&&this.prune()}finish(){this.holdAll||this.prune();const e=this.size,n={contig:this.contigs.slice(0,e),starts:this.starts.slice(0,e),ends:this.ends.slice(0,e),modes:this.modes.slice(0,e),flat:this.flats.slice(0,e),scores:this.scores.map(A=>A.slice(0,e))};return{...n,tested:ZI(n.contig,n.starts,n.ends,n.scores,this.limit),below:this.below===null?new Float64Array(0):this.below.slice(0,this.belowSize),exact:!(this.holdAll&&this.dropped>0)}}prune(){if(this.seen<this.limit)return;const e=this.size;for(let A=0;A<this.tracks;A++){const s=this.scores[A].slice(0,e).sort();this.floor[A]=s[e-this.limit]}let n=0;for(let A=0;A<e;A++){let s=!1;for(let r=0;r<this.tracks;r++)this.scores[r][A]>=this.floor[r]&&(s=!0);if(!s){this.drop(this.scores[0][A],this.flats[A]);continue}if(n!==A){this.contigs[n]=this.contigs[A],this.starts[n]=this.starts[A],this.ends[n]=this.ends[A],this.modes[n]=this.modes[A],this.flats[n]=this.flats[A];for(let r=0;r<this.tracks;r++)this.scores[r][n]=this.scores[r][A]}n++}this.size=n,this.contigs.length=n}drop(e,n){if(this.dropped++,!(this.below===null||!(e>0)||n===1)){if(this.belowSize===this.below.length){const A=new Float64Array(this.below.length*2);A.set(this.below),this.below=A}this.below[this.belowSize++]=e}}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}function td(t,e,n,A,s){return A>0?[Math.max(0,n-A),Math.min(s,n+A+1)]:[t,e]}function la(t){return-(Math.log(t)/Math.log(10))}const ga=[.001,.005,.01,.05,.1,.2],lA="0.05";function fa(t){return typeof t.replicate=="string"&&t.replicate!==""}const ed="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",nd=8,Ad=-1,sd=-2;let ge;function rd(){if(ge!==void 0)return ge;ge=null;try{if(typeof WebAssembly>"u")return null;const t=atob(ed),e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=t.charCodeAt(n);WebAssembly.validate(e)&&(ge=new WebAssembly.Module(e))}catch{ge=null}return ge}class TA extends Error{constructor(){super("The peak-calling kernel ran out of memory."),this.name="KernelMemoryError"}}class od{size=0;starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;constructor(e){this.scores=Array.from({length:e},()=>new Float64Array(1024))}take(e,n,A){if(A===0)return;for(;this.size+A>this.starts.length;)this.grow();const s=e.buffer,r=n.scan_region_capacity();this.starts.set(new Int32Array(s,n.scan_region_starts()>>>0,A),this.size),this.ends.set(new Int32Array(s,n.scan_region_ends()>>>0,A),this.size),this.modes.set(new Int32Array(s,n.scan_region_modes()>>>0,A),this.size),this.flats.set(new Uint8Array(s,n.scan_region_flats()>>>0,A),this.size);const o=n.scan_regions()>>>0;this.scores.forEach((i,a)=>i.set(new Float64Array(s,o+a*r*8,A),this.size)),this.size+=A}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}class ks{constructor(e,n,A,s){this.memory=e,this.exports=n,this.contig=A,this.tracks=s,this.collected=new od(s)}collected;static open(e,n,A,s,r){const o=rd();if(o===null||s<1||s>nd)return null;try{const i=new WebAssembly.Memory({initial:2}),c=new WebAssembly.Instance(o,{env:{memory:i}}).exports,l=e.values.length;if(c.scan_open(s,l,Ns(e,A),A,r)!==0)return null;const g=c.scan_kernel()>>>0;return new Float64Array(i.buffer,g,l).set(e.values),new Float64Array(i.buffer,g+l*8,l+1).set(e.cumulative),new ks(i,c,n,s)}catch{return null}}window(e,n,A,s,r){let o=0;for(let i=0;i<this.tracks;i++){const a=r[i];if(a===null){o|=1<<i;continue}const c=a.starts.length,l=this.exports.scan_input(i,c)>>>0;if(l===0)throw new TA;const g=this.memory.buffer;new Float64Array(g,l,c).set(a.values),new Int32Array(g,l+c*8,c).set(a.starts),new Int32Array(g,l+c*12,c).set(a.ends)}this.closed(this.exports.scan_window(e,n,A,s,o),e)}lastWindow(e){const n=this.memory.buffer;return{pooled:new Float64Array(n,this.exports.scan_pooled()>>>0,e).slice(),flat:new Uint8Array(n,this.exports.scan_flat()>>>0,e).slice(),own:Array.from({length:this.tracks},(A,s)=>new Float64Array(n,this.exports.scan_own(s)>>>0,e).slice())}}finish(){this.closed(this.exports.scan_finish(),-1);const{collected:e}=this,n=this.exports.scan_rose()===1?e.size:0;return{contig:this.contig,starts:e.starts.slice(0,n),ends:e.ends.slice(0,n),modes:e.modes.slice(0,n),scores:e.scores.map(A=>A.slice(0,n)),flat:e.flats.slice(0,n)}}closed(e,n){if(e===Ad)throw new TA;if(e===sd)throw new Error(`ConcaveScan: fed ${n} out of order`);if(e<0)throw new Error(`pooledRuns: a track does not cover a window at ${n}`);this.collected.take(this.memory,this.exports,e)}}const gA=1<<18,to=20,rn=2e4,eo=["#0072b2","#009e73"],id="#999999",ad=async t=>{const e=at(t.params,"signal");if(e===null)return t.note("No track was chosen. Load a bigWig and pick it under Track."),[];const n=fa(t.params)?at(t.params,"replicate"):null;if(n===e)return t.note("The replicate chosen is the track being called, and a track cannot test itself. Choose a second track, or none."),[];const A=n===null?[e]:[e,n],s=L=>t.inputs.labels?.[L]??L,r=Re(T(t.params,"width",sn.width),1,2e3),o=Re(T(t.params,"times",sn.times),0,10),i=Re(T(t.params,"minWidth",sn.minWidth),1,1e9),a=Re(T(t.params,"halfWidth",0),0,1e9),c=Re(T(t.params,"truncate",sn.truncate),1,1e9),l=ld(t),g=t.inputs.contigLengths??{},f=On(t.params,"sequences"),h=Object.keys(g).filter(L=>g[L]>0&&(f===null||f.includes(L)));if(h.length===0)return t.note(f!==null&&f.length===0?"No sequence is ticked, so there is nothing to call peaks on.":"This session knows no sequence lengths, so there is nothing to scan. Load a chrom.sizes, or the map itself."),[];const u=_I(r,o),I=L=>cd(t,A,h,g,u,{minWidth:i,truncate:c,below:n===null,prune:L});let d=await I(!0);if(typeof d!="string"&&!d.held.exact&&(d=await I(!1)),typeof d=="string")return t.note(d),[];const{held:C,found:E,n:B,perSequence:Q,absentOn:m}=d;for(let L=0;L<A.length;L++){if(m[L].length===h.length)return t.note(`${s(A[L])} has none of the ${h.length===1?"sequence":"sequences"} ticked. Check that it and the assembly name their sequences the same way.`),[];m[L].length>0&&t.note(`${s(A[L])} has no ${Qd(m[L])}. yapc reads a track that lacks a sequence as zeros there, so it lowers the mean the regions are called on, and ranks every region there last by it.`)}const p=`${u.values.length}-tap kernel: a ${r.toLocaleString()} bp window, ${o} ${o===1?"pass":"passes"}`;if(B===0)return t.note(`No concave region at least ${i.toLocaleString()} bp wide on ${h.length===1?h[0]:`${h.length} sequences`} (${p}). A wider smoothing window finds broader shapes; a narrower minimum keeps smaller ones.`),[];const{contig:w,starts:y,ends:N,modes:k,flat:b,scores:D,tested:F}=C;t.note(`${E.toLocaleString()} concave ${E===1?"region":"regions"} on ${h.length.toLocaleString()} ${h.length===1?"sequence":"sequences"} (${p}), ${B.toLocaleString()} at least ${i.toLocaleString()} bp wide`+(F.length<B?`, of which the ${F.length.toLocaleString()} strongest by each track’s curvature rank were kept.`:"."));let R=null,v=null,x=null;const Y=new Uint8Array(F.length).fill(1);if(n!==null)if(F.length<to)t.note(`IDR needs at least ${to} peaks to fit — its own command refuses fewer — and there ${F.length===1?"is 1":`are ${F.length}`}. They are reported untested, ranked by curvature.`);else{const L=Xr(on(D[0],F)),$=Xr(on(D[1],F)),Dt=so(on(D[0],F))+so(on(D[1],F));Dt>0&&t.note(`${Dt.toLocaleString()} ${Dt===1?"score ties":"scores tie"} with another: ranked by position, where yapc breaks a tie at random.`);try{R=await vI(L,$,{between:async P=>{t.progress(0,0,`IDR, round ${P}`),await Bs(),t.throwIfCancelled()}})}catch(P){throw P instanceof se?new Error(`IDR could not fit these two tracks, as idr itself could not: ${P.message}`):P}v=TI(R.theta,L,$),x=JI(v);const Ut=la(l);for(let P=0;P<F.length;P++)Y[P]=vA(x[P])>=Ut?1:0;t.note(gd(R,F.length,dd(Y),l))}else{let L=0;for(let $=0;$<F.length;$++)b[F[$]]!==0&&(Y[$]=0,L++);L>0&&t.note(`${L.toLocaleString()} of the candidates ${L===1?"is":"are"} flat — the signal constant across a whole kernel’s width inside, which yapc’s test counts as concave — and ${L===1?"is":"are"} left out, as IDR would leave ${L===1?"it":"them"} out of two replicates.`),t.note("One track, so no test of significance: yapc’s cut is IDR between two replicates. These are the strongest concave regions by curvature — choose a replicate to test them, or lower “keep the strongest” to the upper of the two populations in the figure.")}const J=new Map(h.map((L,$)=>[L,$])),K=[];for(let L=0;L<F.length;L++)Y[L]===1&&K.push(L);K.sort((L,$)=>(J.get(w[F[L]])??0)-(J.get(w[F[$]])??0)||y[F[L]]-y[F[$]]);const V=new et;let H=0,ht=0;for(const L of K){const $=F[L],[Dt,Ut]=td(y[$],N[$],k[$],a,g[w[$]]);a>0&&(Dt!==k[$]-a||Ut!==k[$]+a+1)&&H++;const P=[`summit ${(k[$]+1).toLocaleString("en-US")}`];P.push(`curvature ${A.map(($Q,sc)=>ro(D[sc][$])).join(" / ")}`),x!==null&&P.push(`IDR ${ro(x[L])}`),V.add(w[$],Dt,Ut,{name:`peak_${++ht}`,score:x!==null?vA(x[L]):D[0][$],cds:[k[$],k[$]+1],detail:P.join(ct)})}H>0&&t.note(`${H.toLocaleString()} ${H===1?"peak reaches":"peaks reach"} past a sequence end at this half-width and ${H===1?"is":"are"} cut at it; yapc writes the coordinate past the end.`),K.length===0&&t.note(`No peak passes IDR ≤ ${l}. A looser threshold keeps more; two tracks that are not replicates of one experiment will pass few at any.`);const Gt=[];K.length>0&&Gt.push({kind:"intervals",id:`peaks-${A.map(L=>L.replace(/[^A-Za-z0-9_]+/g,"_")).join("-")}`,label:n===null?`Peaks · ${s(e)} · no IDR`:`Peaks · ${s(e)} + ${s(n)} · IDR ≤ ${l}`,payload:{kind:"features",data:V.finish()},noun:{one:"peak",many:"peaks"},lane:{under:{entry:e}},display:"lane",look:"point"});const q=fd(A.map(s),D,F,Y,n!==null,b,C.below);return q!==null&&Gt.push(q),Gt.push(hd(h,g,Q,K.map(L=>w[F[L]]))),R!==null&&x!==null&&Gt.push(ud(x,l)),Lt(t.params,"perPeak",!1)&&Gt.push(Id({names:A.map(s),contig:w,starts:y,ends:N,modes:k,scores:D,tested:F,passes:Y,local:v,global:x,replicate:n!==null})),t.progress(1,1,"done"),Gt};async function cd(t,e,n,A,s,r){const o=n.reduce((h,u)=>h+A[u],0);let i=0;const a=new jI(e.length,r.truncate,{prune:r.prune,below:r.below}),c=e.map(()=>[]),l=new Map;let g=0,f=0;for(const h of n){const u=await ha(t,e,h,A[h],s,C=>{i+=C,t.progress(i,o,h)});if(typeof u=="string")return u;const{regions:I}=u;let d=0;for(let C=0;C<I.starts.length;C++)I.ends[C]-I.starts[C]<r.minWidth||(d++,a.add(I,C));g+=I.starts.length,f+=d,l.set(h,{regions:I.starts.length,wide:d}),u.absent.forEach((C,E)=>{C&&c[E].push(h)})}return{held:a.finish(),found:g,n:f,perSequence:l,absentOn:c}}async function ha(t,e,n,A,s,r,o="auto"){const{left:i,right:a}=qI(s,A),c=e.map(()=>!1),l=o==="js"?null:ks.open(s,n,A,e.length,gA);let g=null,f=0;try{for(let h=0;h<A;h+=gA){const u=Math.min(A,h+gA),I=Math.max(0,h-i),d=Math.min(A,u+a),C=[];for(let E=0;E<e.length;E++){if(c[E]){C.push(null);continue}const B=await t.sample(e[E],[{contig:n,start:I,end:d}],1);if(B.note!==void 0)return B.note;const Q=B.regions[0];Q===void 0&&(c[E]=!0),C.push(Q??null)}if(l!==null)l.window(h,u,I,d,C);else{const E=C.map(w=>w===null?WI(I,d):HI(w.starts,w.ends,w.values,I,d));g??=new jr(n,A,c);const B=new Uint8Array(u-h),Q=Vr(PI(E,I,d),s,A,h,u,B),m=e.length===1?null:XI(Q),p=m===null?[Q]:E.map(w=>Vr(w,s,A,h,u,void 0,m));g.feed(h,Q,p,B)}r(u-h),f+=u-h,await Bs(),t.throwIfCancelled()}}catch(h){if(!(h instanceof TA))throw h;return r(-f),ha(t,e,n,A,s,r,"js")}return l!==null?{regions:l.finish(),absent:c}:{regions:(g??new jr(n,A,c)).finish(),absent:c}}function ld(t){const e=Number(st(t.params,"idr",lA));return ga.includes(e)?e:(fa(t.params)&&t.note(`An IDR threshold of ${st(t.params,"idr","")} is not one yapc writes; ${lA} was used.`),Number(lA))}const no=["mean","spread","correlation","reproducible share"];function gd(t,e,n,A){const[s,r,o,i]=t.theta,a=`IDR fitted over ${e.toLocaleString()} peaks in ${t.rounds.toLocaleString()} rounds: μ ${s.toFixed(2)}, σ ${r.toFixed(2)}, ρ ${o.toFixed(2)}, reproducible share ${i.toFixed(2)}; ${n.toLocaleString()} pass IDR ≤ ${A}.`,c=[],l=g=>Number.isInteger(g)?String(g):g.toFixed(2);return t.theta.forEach((g,f)=>{const[h,u]=[Or.min[f],Or.max[f]];g<=h+1e-4*Math.max(1,h)?c.push(`the ${no[f]} at its floor of ${l(h)}`):g>=u-1e-4*Math.max(1,u)&&c.push(`the ${no[f]} at its ceiling of ${l(u)}`)}),c.length===0?a:`${a} The fit ended at the edge of IDR’s parameter box — ${c.join(", ")} — which is where two tracks that do not rank their peaks like replicates of one experiment put it. Read these IDRs as that, not as reproducibility.`}function fd(t,e,n,A,s,r,o){const i=[],a=new Uint8Array(r.length);for(const f of n)a[f]=1;for(let f=0;f<e.length;f++){const h=[],u=[];if(n.forEach((E,B)=>{const Q=e[f][E];!(Q>0)||!s&&r[E]===1||(A[B]===1?h.push(Q):u.push(Q))}),!s){for(let E=0;E<r.length;E++)a[E]===0&&e[f][E]>0&&r[E]===0&&u.push(e[f][E]);for(const E of o)u.push(E)}const I=e.length===1?"":`${t[f]} · `,d=s?`${I}passes IDR`:`${I}peaks`,C=s?`${I}fails IDR`:`${I}below the cut`;h.length>0&&i.push(Ao(d,h,eo[f]??eo[0])),u.length>0&&i.push(Ao(C,u,id))}if(i.length===0)return null;const c=i.flatMap(f=>Array.from(f.y)),l=Cd(c,.01);let g=Number.NEGATIVE_INFINITY;for(const f of c)f>g&&(g=f);return{kind:"curve",id:"peaks-curvature",label:"Curvature of every candidate",series:i,xLabel:"",yLabel:"Curvature (yapc score)",xScale:"linear",yScale:"log",...Number.isFinite(l)&&l>0&&g>l?{yDomain:[10**Math.floor(Math.log10(l)),10**Math.ceil(Math.log10(g))]}:{}}}function Ao(t,e,n){const A=Float64Array.from(e).sort();let s=A;if(A.length>rn){s=new Float64Array(rn);for(let r=0;r<rn;r++)s[r]=A[Math.round(r*(A.length-1)/(rn-1))]}return{name:t,x:Float64Array.from(s,(r,o)=>o),y:s,colour:n,n:e.length,mark:"violin"}}function hd(t,e,n,A){const s=new Map;for(const r of A)s.set(r,(s.get(r)??0)+1);return{kind:"table",id:"peaks-sequences",label:"Per sequence",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"length",label:"Length",kind:"number"},{key:"regions",label:"Concave regions",kind:"number"},{key:"wide",label:"Wide enough",kind:"number"},{key:"peaks",label:"Peaks",kind:"number"},{key:"density",label:"Peaks per Mb",kind:"number",digits:1}],rows:t.map(r=>{const o=n.get(r)??{regions:0,wide:0},i=s.get(r)??0;return{sequence:r,length:e[r],regions:o.regions,wide:o.wide,peaks:i,density:i/e[r]*1e6}})}}function ud(t,e){const n=t.length;return{kind:"table",id:"peaks-idr",label:"IDR thresholds",columns:[{key:"threshold",label:"IDR ≤",kind:"text"},{key:"peaks",label:"Peaks",kind:"number"},{key:"share",label:"Share of tested",kind:"number",digits:3},{key:"drawn",label:"Drawn",kind:"text"}],rows:ga.map(A=>{const s=la(A);let r=0;for(let o=0;o<n;o++)vA(t[o])>=s&&r++;return{threshold:String(A),peaks:r,share:r/n,drawn:A===e?"yes":""}})}}function Id(t){const{names:e,contig:n,starts:A,ends:s,modes:r,scores:o,tested:i,passes:a,local:c,global:l}=t,g=[];return i.forEach((f,h)=>{const u={sequence:n[f],start:A[f],end:s[f],summit:r[f],width:s[f]-A[f]};o.forEach((I,d)=>{u[`curvature${d}`]=I[f]}),c!==null&&l!==null&&(u.local=c[h],u.idr=l[h],u.passes=a[h]===1?"yes":"no"),g.push(u)}),l!==null?g.sort((f,h)=>Number(f.idr)-Number(h.idr)):g.sort((f,h)=>Number(h.curvature0)-Number(f.curvature0)),{kind:"table",id:"peaks-list",label:t.replicate?"Every peak tested":"Every peak",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"summit",label:"Summit",kind:"number",coordinate:"start",hint:"The most concave base."},{key:"width",label:"Width",kind:"number"},...e.map((f,h)=>({key:`curvature${h}`,label:e.length===1?"Curvature":`Curvature · ${f}`,kind:"number",digits:2})),...c!==null?[{key:"local",label:"Local IDR",kind:"number",digits:4,scientific:!0},{key:"idr",label:"IDR",kind:"number",digits:4,scientific:!0},{key:"passes",label:"Passes",kind:"text"}]:[]],rows:g}}function Re(t,e,n){return Math.min(n,Math.max(e,Math.round(t)))}function on(t,e){const n=new Float64Array(e.length);for(let A=0;A<e.length;A++)n[A]=t[e[A]];return n}function dd(t){let e=0;for(const n of t)e+=n;return e}function so(t){const e=Float64Array.from(t).sort();let n=0;for(let A=1;A<e.length;A++)e[A]===e[A-1]&&n++;return n}function Cd(t,e){if(t.length===0)return Number.NaN;const n=Float64Array.from(t).sort(),A=e*(n.length-1),s=Math.floor(A),r=Math.min(n.length-1,s+1);return n[s]+(A-s)*(n[r]-n[s])}function ro(t){return Number.isFinite(t)?Number(t.toPrecision(4)).toLocaleString("en-US",{maximumSignificantDigits:4}):t>0?"∞":t<0?"−∞":"—"}function Qd(t){return t.length===1?t[0]:t.length<=3?`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`:`${t.slice(0,3).join(", ")} and ${(t.length-3).toLocaleString()} more`}const ua=[{name:"DpnII",site:"GATC",cut:0},{name:"HindIII",site:"AAGCTT",cut:1},{name:"NcoI",site:"CCATGG",cut:1},{name:"EcoRI",site:"GAATTC",cut:1},{name:"BglII",site:"AGATCT",cut:1},{name:"HinfI",site:"GANTC",cut:1},{name:"DdeI",site:"CTNAG",cut:1},{name:"MseI",site:"TTAA",cut:1},{name:"NlaIII",site:"CATG",cut:4},{name:"CviQI",site:"GTAC",cut:1},{name:"AluI",site:"AGCT",cut:2}],Bd={MboI:"DpnII",Sau3AI:"DpnII",Csp6I:"CviQI"},Sn={Arima:["DpnII","HinfI"]},Ed=(()=>{const t=new Map;for(const e of ua)t.set(e.name.toLowerCase(),e);for(const[e,n]of Object.entries(Bd)){const A=t.get(n.toLowerCase());A!==void 0&&t.set(e.toLowerCase(),A)}return t})();function an(t){return Ed.get(t.trim().toLowerCase())}function Rn(t){const e=t.trim().toLowerCase();return Object.keys(Sn).find(n=>n.toLowerCase()===e)}function Ia(t){return`${t.site.slice(0,t.cut)}^${t.site.slice(t.cut)}`}function md(t){return t.site.length-2*t.cut}const wd=1/256,oo=255;function io(t){let e=1;for(const n of t){let A=0;for(let s=n;s!==0;s&=s-1)A++;e*=A/4}return e}function pd(t){const e=t.toUpperCase().replace(/U/g,"T"),n=e.indexOf("^"),A=e.replace("^","");if(n<0){const r=Oe(A);return{refusal:Ye(r)?`“${t}” is neither an enzyme this knows nor a site in IUPAC letters with a ^ where it cuts.`:`“${t}” needs a ^ where the enzyme cuts the top strand, as in ^GATC or G^ANTC.`}}if(A.includes("^"))return{refusal:`“${t}” has more than one ^, and a site is cut in one place.`};const s=Oe(A);return Ye(s)?{refusal:s.reason}:io(s)>wd?{refusal:`“${t}” would cut every ${Math.round(1/io(s))} bases or so; a site needs at least the specificity of a four-base cutter.`}:{name:`${e.slice(0,n)}^${e.slice(n+1)}`,site:A,cut:n}}function yd(t,e){const n=t.trim();if(n===""||n==="none")return[];if(n!=="custom"){const i=Rn(n);if(i!==void 0)return Sn[i].map(c=>an(c));const a=an(n);return a===void 0?{refusal:`“${n}” is not an enzyme or a kit this knows. Pick one, or type its site under custom.`}:[a]}const A=e.split(/[\s,;]+/).filter(i=>i!=="");if(A.length===0)return{refusal:"Type an enzyme or a site, such as DpnII or G^ANTC."};const s=[],r=new Set,o=i=>{const a=`${i.site}^${i.cut}`;r.has(a)||(r.add(a),s.push(i))};for(const i of A){const a=Rn(i);if(a!==void 0){for(const g of Sn[a])o(an(g));continue}const c=an(i);if(c!==void 0){o(c);continue}const l=pd(i);if("refusal"in l)return l;o(l)}return s.length>oo?{refusal:`That is ${s.length} enzymes, and one digest takes ${oo} at most.`}:s}function Nd(t){return t.map(e=>e.name).join("+")}function kd(t){let e=0;for(const n of t)e=Math.max(e,n.site.length);return Math.max(0,e-1)}const ao=new Map;function bd(t){const e=`${t.site}^${t.cut}`,n=ao.get(e);if(n!==void 0)return n;const A=Oe(t.site);if(Ye(A))throw new Error(`${t.name}: ${A.reason}`);const s={motif:A,offset:t.cut};return ao.set(e,s),s}const Qe=256;function da(t,e,n,A,s){const r=t.subarray(0,e).sort();let o=0,i=Number.NaN;for(let c=0;c<r.length;c++){const l=Math.floor(r[c]/Qe);l===i||!(l>A&&l<s)||(i=l,r[o++]=r[c])}const a={top:new Int32Array(o),bottom:new Int32Array(o),enzyme:new Uint8Array(o)};for(let c=0;c<o;c++){const l=Math.floor(r[c]/Qe),g=r[c]-l*Qe;a.top[c]=l,a.bottom[c]=l+n[g],a.enzyme[c]=g}return a}function Dd(t,e,n=0){let A=new Float64Array(Math.max(16,t.length>>7)),s=0;e.forEach((o,i)=>{const a=bd(o),{hits:c}=ps(t,a.motif,{bothStrands:!0,offset:n});if(s+c.length>A.length){const l=new Float64Array(Math.max(A.length*2,s+c.length));l.set(A.subarray(0,s)),A=l}for(const l of c)A[s++]=(l.start+a.offset)*Qe+i});const r=Int32Array.from(e,md);return da(A,s,r,Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY)}function Md(t,e){let n=0;for(const o of t)n+=o.top.length;const A=new Float64Array(n),s=new Int32Array(Qe);let r=0;for(const o of t)for(let i=0;i<o.top.length;i++)A[r++]=o.top[i]*Qe+o.enzyme[i],s[o.enzyme[i]]=o.bottom[i]-o.top[i];return da(A,r,s,0,e)}const Fd=16e6;[...ua.map(t=>({value:t.name,label:`${t.name} (${Ia(t)})`})),...Object.entries(Sn).map(([t,e])=>({value:t,label:`${t} (${e.join(" + ")})`}))];function Sd(t){const e=typeof t.enzyme=="string"?t.enzyme:"none",n=typeof t.sites=="string"?t.sites:"";return{choice:e,sites:n}}async function Rd(t,e,n={}){const A=n.contigs??t.contigs,s=kd(e),r=Math.max(1,Math.floor(n.piece??Fd)),o=t.read?.bind(t),i=A.reduce((l,g)=>l+g.length,0);let a=0;const c=[];for(const l of A){const g=o===void 0?t.bases(l.name):void 0;if(o===void 0&&g===void 0)continue;const f=g?.length??l.length,h=[];let u=!0;for(let I=0;I<f;I+=r){n.throwIfCancelled?.();const d=Math.min(f,I+r),C=Math.min(f,d+s),E=g!==void 0?g.subarray(I,C):await o?.(l.name,I,C);if(E===void 0){u=!1;break}h.push(Dd(E,e,I)),a+=d-I,n.progress?.(a,i,l.name)}u&&c.push({contig:l.name,length:f,cuts:Md(h,f)})}return c}function Ld(t,e){const n=Nd(e),A=Rn(t);return A===void 0?n:`${A} (${n})`}function xd(t,e){const n=Rn(t);return n!==void 0?n.replace(/[^A-Za-z0-9]/g,""):e.map(A=>A.name.replace(/\^/g,"_").replace(/[^A-Za-z0-9_]/g,"")).join("-")}const Gd=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to cut."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const{choice:A,sites:s}=Sd(t.params),r=yd(A,s);if(!Array.isArray(r))return t.note(r.refusal),[];if(r.length===0)return t.note("No enzyme was chosen, so there is nothing to cut."),[];const o=On(t.params,"sequences");if(o!==null&&o.length===0)return t.note("No sequence is ticked, so there is nothing to cut."),[];const i=Object.entries(t.inputs.contigLengths??{}).filter(([,Q])=>Q>0).map(([Q])=>Q),a=ji(n,o,i);if(a.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to cut."),[];const c=a.length===n.contigs.length;t.progress(0,1,a.length===1?`cutting ${a[0].name}`:`cutting ${a.length.toLocaleString()} sequences`);const l=await Rd(n,r,{contigs:a,progress:(Q,m,p)=>t.progress(Q,m,`cutting ${p}`),throwIfCancelled:()=>t.throwIfCancelled()});if(t.progress(1,1,"done"),l.length===0)return t.note("None of the ticked sequences could be read from this reference."),[];const g=Ld(A,r),f=c?g:a.length<=3?`${g} on ${a.map(Q=>Q.name).join(", ")}`:`${g} on ${a.length.toLocaleString()} sequences`;let h=0,u=0;for(const Q of l)h+=Q.cuts.top.length,u+=Q.length;const I=h+l.length;t.note(h===0?`No ${g} site anywhere in ${c?"this reference":"the sequences ticked"}, so each sequence is one fragment.`:`${h.toLocaleString()} ${g} ${h===1?"cut":"cuts"} on ${l.length.toLocaleString()} ${l.length===1?"sequence":"sequences"}: ${I.toLocaleString()} fragments, ${Math.round(u/I).toLocaleString()} bp long on average.`);const d=`restriction-${xd(A,r)}${c?"":Ud(a)}`,C=vd(l,r),E=[Td(C,f,d)],B=Jd(t,C,f,d);return B!==null&&E.push(B),E};function Ud(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
17
|
-
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function
|
|
18
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!
|
|
19
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!n&&c.length!==4||!
|
|
20
|
-
`,s);i<0&&(i=r);let a=i;a>s&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(s,a);if(s=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=
|
|
21
|
-
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o===""||o.charCodeAt(0)===35||o.startsWith("track ")||o.startsWith("browser "))continue;const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(
|
|
22
|
-
`,A);r<0&&(r=s);let o=r;o>A&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(A,o);if(A=r+1,!(i===""||i.charCodeAt(0)===35)){if(i.startsWith("track ")){/junction/i.test(i)&&(n=!0);continue}i.startsWith("browser ")||e.push(i.includes(" ")?i.split(" "):i.trim().split(/\s+/))}}return{rows:e,declared:n}}function
|
|
23
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!
|
|
24
|
-
`)){let A=n;A.endsWith("\r")&&(A=A.slice(0,-1)),!(A===""||A.charCodeAt(0)===35)&&(A.startsWith("track ")||A.startsWith("browser ")||e(A.includes(" ")?A.split(" "):A.trim().split(/\s+/)))}}function UC(t){return/\b(percentMod|percentMeth|fractionModified)\b/.test(t)&&/\b(validCov|coverage|Nvalid_cov)\b/.test(t)}function vC(t){const e=t.codes.find(s=>s.code===t.drawn),n=[`${t.signal.length.toLocaleString()} ${e?.label??t.drawn} calls`,`${t.meanCoverage.toFixed(1)}× mean depth`],A=t.codes.filter(s=>s.code!==t.drawn);return A.length>0&&n.push(`not drawn: ${A.map(s=>`${s.label} (${s.rows.toLocaleString()})`).join(", ")}`),n.join(" · ")}const Gn=440477507,Un=".2bit",Ja=16,TC=new Uint8Array([84,67,65,71]),JC=78;function $a(t){if(t.length<4)return!1;const e=new DataView(t.buffer,t.byteOffset,4);return e.getUint32(0,!0)===Gn||e.getUint32(0,!1)===Gn}function $C(t){if(t.length<Ja)throw new Error("This file starts like a .2bit and is too short to hold one.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint32(0,!0)===Gn;if(!n&&e.getUint32(0,!1)!==Gn)throw new Error("This is not a .2bit: its first four bytes are not the format’s signature.");const A=e.getUint32(4,n);if(A!==0)throw new Error(`This is a .2bit of version ${A}. This viewer reads version 0 — the ordinary one, with 32-bit offsets. Version 1 is the “long” variant for files past 4 GB, whose offsets and sizes are 64-bit, and reading one as though it were version 0 would return wrong residues rather than fail. Convert it with \`twoBitToFa\` and \`faToTwoBit\`.`);const s=e.getUint32(8,n);if(s===0)throw new Error("This .2bit declares no sequences.");return{littleEndian:n,version:A,count:s}}function Co(t,e,n=Ja){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=[];let r=n;const o=new TextDecoder;for(;s.length<e.count&&!(r+1>t.length);){const i=t[r];if(r+1+i+4>t.length)break;const a=o.decode(t.subarray(r+1,r+1+i)),c=A.getUint32(r+1+i,e.littleEndian);s.push({name:a,offset:c}),r+=1+i+4}return{entries:s,complete:s.length===e.count,consumed:r}}function Qo(t,e,n,A={}){if(e+8>t.length)return 8;const s=new DataView(t.buffer,t.byteOffset,t.byteLength),r=Ya(s,e,n,A),o=e+8+r*8;return o+4>t.length?o+4-e:null}function Ya(t,e,n,A){return nt(t.getUint32(e+4,n),{format:Un,field:`N-block count${A.name===void 0?"":` of ${A.name}`}`,ceiling:t.getUint32(e,n),...A.fileLeft===void 0?{}:{available:A.fileLeft-8-4},bytesPerItem:8})}function YC(t,e,n,A,s=0,r){const o=new DataView(e.buffer,e.byteOffset,e.byteLength),i=o.getUint32(n,A),a=Ya(o,n,A,{name:t,fileLeft:e.length-n}),c=new Int32Array(a),l=new Int32Array(a),g=n+8,f=g+a*4;for(let d=0;d<a;d++){const C=o.getUint32(g+d*4,A);c[d]=C,l[d]=C+o.getUint32(f+d*4,A)}const h=f+a*4,u=nt(o.getUint32(h,A),{format:Un,field:`mask-block count of ${t}`,ceiling:i,...r===void 0?{}:{available:r-(s+h+4)-4},bytesPerItem:8}),I=s+h+4+u*8+4;return r!==void 0&&ss(I,Math.ceil(i/4),{format:Un,field:`packed bases of ${t}`,size:r}),{name:t,length:i,nStarts:c,nEnds:l,dnaAt:I}}const OC=8192;function _C(t,e,n){const A=Math.max(0,Math.min(e,t.length)),s=Math.max(A,Math.min(n,t.length)),r=Math.floor(A/4),o=Math.ceil(s/4);return{from:t.dnaAt+r,to:t.dnaAt+o,firstBase:r*4}}function KC(t,e,n,A,s){const r=Math.max(0,Math.min(A,n.length)),o=Math.max(r,Math.min(s,n.length)),i=new Uint8Array(o-r);for(let a=r;a<o;a++){const c=a-e,l=t[c>>2];if(l===void 0)break;const g=6-((c&3)<<1);i[a-r]=TC[l>>g&3]}for(let a=0;a<n.nStarts.length;a++){const c=n.nStarts[a];if(c>=o)break;const l=n.nEnds[a];l<=r||i.fill(JC,Math.max(r,c)-r,Math.min(o,l)-r)}return i}function qC(t){return t.map(e=>({name:e.name,length:e.length}))}const Bo=65536,Eo=1e5;async function HC(t,e){let n=await t(Bo,0);const A=$C(n);if(A.count>Eo)throw new Error(`This .2bit declares ${A.count.toLocaleString()} sequences, which is past the ${Eo.toLocaleString()} this viewer will open one record at a time. A file that says this is far more likely to be truncated than to be an assembly.`);let s=Co(n,A);for(;!s.complete;){const a=await t(Bo,n.length);if(a.length===0)throw new Error(`This .2bit ends part-way through its index: it declares ${A.count.toLocaleString()} sequences and names ${s.entries.length.toLocaleString()}. The file is truncated.`);const c=new Uint8Array(n.length+a.length);c.set(n),c.set(a,n.length),n=c,s=Co(n,A)}const r=new Map,o=[];let i=0;for(const a of s.entries){e!==void 0&&ss(a.offset,8,{format:Un,field:`index entry for ${a.name}`,size:e});const c={name:a.name,...e===void 0?{}:{fileLeft:e-a.offset}};let l=await t(OC,a.offset),g=Qo(l,0,A.littleEndian,c);for(;g!==null;){const h=await t(g,a.offset);if(h.length<=l.length)throw new Error(`This .2bit ends part-way through the record for ${a.name}.`);l=h,g=Qo(l,0,A.littleEndian,c)}const f=YC(a.name,l,0,A.littleEndian,a.offset,e);r.set(f.name,f),o.push(f),i+=f.length}return{ordered:o,records:r,total:i}}const WC=2291137574,PC=2273964779,mo=[137,72,68,70,13,10,26,10];function zC(t){return t.length<mo.length?!1:mo.every((e,n)=>t[n]===e)}function Oa(t){if(t.length<4)return null;const e=new DataView(t.buffer,t.byteOffset,4);for(const n of[!0,!1]){const A=e.getUint32(0,n);if(A===WC)return"bigwig";if(A===PC)return"bigbed"}return null}function ft(t,e){const n=pe(rl(t),e);for(let A=0;A<n.names.length;A++)t[A]=n.names[A];return n}function Z(t,e,n){const A=El(t,qa(e)),s=XC(t,e),r=n?.contested??[];return{...A,...s===null?{}:{genomes:s},...r.length===0?{}:{contested:r.slice(0,4).map(o=>`${o.asked} → ${o.name}`)}}}function XC(t,e){const n=new Set;for(const r of e)r.genome!==void 0&&r.genome!==""&&n.add(r.genome);if(n.size===0)return null;const A=new Set(t),s=new Set;for(const r of e)r.genome===void 0||r.genome===""||A.has(r.name)&&s.add(r.genome);return{matched:s.size,total:n.size,named:[...s].slice(0,4)}}function qn(t,e){const n=t.bases.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.bases.get(t.contigs[A].name)}function Ms(t,e){const n=t.records.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.records.get(t.contigs[A].name)}async function _a(t,e,n,A,s){const r=Ms(t,e);if(r===void 0)return;const o=Math.max(0,Math.floor(n)),i=Math.min(r.length,Math.ceil(A));if(!(i>o))return new Uint8Array(0);const a=t.held.get(r.name);if(a!==void 0&&a.start<=o&&a.start+a.bases.length>=i)return a.bases.subarray(o-a.start,i-a.start);const c=await Ka(t,r,o,i,s);return t.held.set(r.name,{start:o,bases:c}),c}async function Ka(t,e,n,A,s){const r=s===void 0?{}:{onProgress:s};if(_t(t)){const i=e,a=_C(i,n,A),c=await t.handle.read(a.to-a.from,a.from,r);return KC(c,a.firstBase,i,n,A)}const o=Xd(e,n,A);return Vd(await t.handle.read(o.to-o.from,o.from,r))}function qa(t){return t.map(e=>e.name)}const Fs=new Map,Hn=new Map;function Ss(t){return t.indexed===!0}function _t(t){return t.twobit===!0}function we(t){return Ss(t)||_t(t)}const re=new Map,KA=new Map,Wn=new Map,vn=new Map;function VC(t,e){return`${tt(t)}|${tt(e)}`}const wo=8<<20,Rs=3e8,qA=64e6,po=4e6;let Mt=null,oe=null;function tt(t){return t.kind==="local"?`${t.name}|${t.file.size}`:t.url}self.onmessage=t=>{jC(t.data)};const ZC=Nh();setInterval(()=>{const t={type:"busy",fraction:ZC.busy()};self.postMessage(t)},yh);const Pn=new Set,HA=new Set;let WA=0;function PA(t){return Pn.has(t)}async function Ls(t){return await Bs(),!Pn.has(t)}function ze(){const t=new Error("cancelled");return t.name="AbortError",t}async function jC(t){HA.add(t.id);try{const e=await tQ(t);if(PA(t.id))throw ze();const n={type:"result",id:t.id,payload:e};self.postMessage(n,Eh(e))}catch(e){const n={type:"error",id:t.id,message:e instanceof Error?e.message:String(e),...e instanceof Error&&e.name==="AbortError"?{cancelled:!0}:{}};self.postMessage(n)}finally{HA.delete(t.id),Pn.delete(t.id),t.id>WA&&(WA=t.id)}}function Qn(t){return(e,n)=>{const A={type:"progress",id:t,done:e,total:n??0};self.postMessage(A)}}async function tQ(t){switch(t.kind){case"load":return aQ(t.entry,t.source,t.mapContigs,Qn(t.id));case"sample":return ja(t.entry,t.regions,t.basesPerPixel,t.reads,t.id,t.exact===!0);case"register":return KA.set(t.entry,t.vector),null;case"run":return eQ(t);case"bases":return EQ(t.entry,t.regions,Qn(t.id));case"assembly":return nQ(t.source,Qn(t.id));case"reads":return vQ(t.entry,t.regions,t.maxRows,t.basesPerPixel,t.reads,t.id);case"cancel":return(HA.has(t.target)||t.target>WA)&&Pn.add(t.target),null;case"drop":{Fs.delete(t.entry);const e=re.get(t.entry);e!==void 0&&oe?.store===e&&(oe=null),re.delete(t.entry),KA.delete(t.entry),Hn.delete(t.entry),Wn.delete(t.entry);for(const[n,A]of vn)if(A.holders.delete(t.entry)){A.holders.size===0&&vn.delete(n);break}return null}}}async function eQ(t){const e=qd[t.task];if(e===void 0)throw new Error(`no track analysis runner is registered for the task ${t.task}`);const n=[],A=performance.now(),s={params:t.params,framing:t.framing,inputs:t.inputs,cancelled:()=>PA(t.id),throwIfCancelled:()=>{if(PA(t.id))throw ze()},progress:(o,i,a)=>{const c={type:"progress",id:t.id,done:o,total:i,...a===void 0?{}:{note:a}};self.postMessage(c)},note:o=>{n.push(o)},sample:(o,i,a)=>ja(o,i,a,void 0,t.id),lengthOf:o=>t.inputs.contigLengths?.[o],residues:o=>{const i=re.get(o);if(i!==void 0)return we(i)?{contigs:i.contigs,bases:()=>{},read:async(a,c,l)=>{const g=Ms(i,a);if(g===void 0)return;const f=Math.max(0,Math.floor(c)),h=Math.min(g.length,Math.ceil(l));return h>f?Ka(i,g,f,h):new Uint8Array(0)},refusal:_t(i)?`This .2bit is read by range rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(qA/1e6)} MB is held whole (\`twoBitToFa\`).`:`This FASTA is read by range from its index rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(qA/1e6)} MB is held whole.`}:{contigs:i.contigs,bases:a=>qn(i,a)}}};return{outputs:await e(s),provenance:{task:t.task,taskVersion:0,params:t.params,framing:t.framing,app:[Hd,Wd].filter(o=>o!=="").join(" "),createdAt:new Date().toISOString()},notes:n,ms:performance.now()-A}}async function nQ(t,e){const n=xt(t),A=await n.read(64,0);if(zC(A))return{format:"hdf5",contigs:[],origin:"features",exact:!0};const s=Oa(A);if(s!==null){const h=await(s==="bigwig"?new To({filehandle:xt(t)}):new $o({filehandle:xt(t)})).getHeader();return{format:s,contigs:xs(h),origin:s,exact:!0}}if(We(A)){const f=await ke(n,t),h=await tc(n,f??Number.MAX_SAFE_INTEGER);if(h!==null)return{format:"bam",contigs:h.refs.map(u=>({name:u.name,length:u.length})),origin:"bam",exact:!0}}if(kn(A))return{format:"fasta",contigs:(await Xa(t,n,e)).contigs,origin:"fasta",exact:!0};if($a(A))return{format:"twobit",contigs:(await Va(t,n,e)).contigs,origin:"twobit",exact:!0};const r=await n.readFile({onProgress:e}),o=await ls(r);if(kn(o))return{format:"fasta",contigs:Us(t,o).contigs,origin:"fasta",exact:!0};const i=new TextDecoder().decode(o);if(i.trim()==="")throw new Error("This file is empty.");if(bh(i,t.name))return Mt={key:tt(t),format:"sizes",features:null},{format:"sizes",contigs:kh(i),origin:"sizes",exact:!0};if(ti(i)){const f=rg(i);if(f.length>0)return{format:"vcf",contigs:f,origin:"vcf",exact:!0};const h=Ai(i),u=new Map;for(let I=0;I<h.length;I++)lt(u,h.contigs[h.contig[I]],h.end[I]);return{format:"vcf",contigs:It(u),origin:"features",exact:!1}}if(Is(A)){const f=await za(n),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(pA(i,t.name)||wA(i,t.name)||di(i,t.name)){const f=pA(i,t.name)?pi(i,t.name):wA(i,t.name)?Bi(i,t.name):Ei(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(li(i,t.name)){const f=hi(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"barchart",contigs:It(h),origin:"features",exact:!1}}if(Ma(i)){const f=Fa(i);Mt={key:tt(t),format:"cytoband",features:f};const h=yC(f);if(h!==null)return{format:"cytoband",contigs:h,origin:"cytoband",exact:!0};const u=new Map;for(let I=0;I<f.length;I++)lt(u,f.contigs[f.contig[I]],f.end[I]);return{format:"cytoband",contigs:It(u),origin:"features",exact:!1}}if(Ds(i,t.name)!==null){const f=Ga(i,t.name);Mt={key:tt(t),format:"junctions",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"junctions",contigs:It(h),origin:"features",exact:!1}}if(Qa(i,t.name)){const f=Ba(i);return{format:"interact",contigs:hA(f),origin:"features",exact:!1}}if(ma(i,t.name)){const f=wa(i);return{format:"longrange",contigs:hA(f),origin:"features",exact:!1}}if(Na(i,t.name)){const f=ka(i);Mt={key:tt(t),format:"genepred",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"genepred",contigs:It(h),origin:"features",exact:!1}}if(va(i,t.name)){const{signal:f}=Ta(i),h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:"bedmethyl",contigs:It(h),origin:"features",exact:!1}}const a=Si(i);if(a!==null){const f=a==="wig"?Li(i):Ri(i);Mt={key:tt(t),format:a,features:null};const h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:a,contigs:It(h),origin:"features",exact:!1}}const c=si(i,t.name);if(c==="bedpe"){const f=ci(i);return Mt={key:tt(t),format:c,features:null},{format:c,contigs:hA(f),origin:"features",exact:!1}}const l=c==="gtf"?ii(i):fs(i,t.name);Mt={key:tt(t),format:c,features:l};const g=new Map;for(let f=0;f<l.length;f++)lt(g,l.contigs[l.contig[f]],l.end[f]);return{format:c,contigs:It(g),origin:"features",exact:!1}}function xs(t){return Object.values(t.refsByNumber).sort((e,n)=>e.id-n.id).map(e=>({name:e.name,length:e.length}))}function lt(t,e,n){const A=t.get(e);(A===void 0||n>A)&&t.set(e,n)}function hA(t){const e=new Map;for(let n=0;n<t.length;n++)lt(e,t.contigs[t.contig1[n]],t.end1[n]),lt(e,t.contigs[t.contig2[n]],t.end2[n]);return It(e)}function It(t){const e=[];for(const[n,A]of t){const s=10**Math.max(0,Math.floor(Math.log10(Math.max(1,A)))-2);e.push({name:n,length:(Math.floor(A/s)+1)*s})}return e}const Zt=new Map,AQ=8;function xt(t){if(t.kind==="local")return new oc(t.file);const{credential:e,headers:n}=t,A=`${t.url}|${e===void 0?"":JSON.stringify(e)}|${n===void 0?"":JSON.stringify(n)}`,s=Zt.get(A);if(s!==void 0)return Zt.delete(A),Zt.set(A,s),s;const r=e===void 0&&n===void 0?new mr(t.url):new mr(t.url,{fetch:(o,i)=>{const a=typeof o=="string"?o:o.url;return fetch(o,Ti(i,{url:a,...n===void 0?{}:{headers:n},...e===void 0?{}:{credential:e}}))}});for(Zt.set(A,r);Zt.size>AQ;){const o=Zt.keys().next().value;Zt.delete(o)}return r}async function sQ(t,e,n,A){const s=Gs(t);if(s===null||!We(n))return null;try{const r=await Ot(await xt(s).readFile()),o=Cl(r),i=await ke(e,t);if(i===null)return null;const a=Ql(o,Bl(o,qa(A)),i);if(a.length===0||a.reduce((f,h)=>f+(h.to-h.from),0)>i*.8)return null;const l=[];for(const f of a){const h=await e.read(f.to-f.from,f.from),u=new TextDecoder().decode(await Ot(h,f.lastBlock-f.from));l.push(rQ(u,f.from===0,iQ(h,f,i)))}const g=l.join("");return g===""?null:g}catch{return null}}function rQ(t,e,n){let A=t;if(!e){const s=A.indexOf(`
|
|
1
|
+
async function Je(t){return t.bytes?t.bytes():new Uint8Array(await t.arrayBuffer())}const ic=50;async function Js(t,e){const n=t.headers.get("content-length"),A=n?parseInt(n,10):void 0,s=t.body;if(!s||A===void 0){const c=await Je(t);return e(c.byteLength,A??c.byteLength),c}const r=s.getReader();let o=new Uint8Array(A),i=0,a=0;e(0,A);for(let c=await r.read();!c.done;c=await r.read()){if(i+c.value.byteLength>o.length){const g=new Uint8Array(Math.max(i+c.value.byteLength,o.length*2));g.set(o.subarray(0,i)),o=g}o.set(c.value,i),i+=c.value.byteLength;const l=Date.now();l-a>=ic&&(a=l,e(i,A))}return e(i,A),i===o.length?o:o.subarray(0,i)}class ac{blob;constructor(e){this.blob=e}async read(e,n=0){return e===0?new Uint8Array(0):Je(this.blob.slice(n,n+e))}async readFile(e){const n=typeof e=="string"?e:e?.encoding;if(n==="utf8")return this.blob.text();if(n)throw new Error(`unsupported encoding: ${n}`);return Je(this.blob)}stat(){return Promise.resolve({size:this.blob.size})}close(){return Promise.resolve()}}function cc(t){return(typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"?t.message:`${t}`).replace(/\.$/,"")}class Do{url;_stat;fetchImplementation;baseHeaders;baseOverrides;constructor(e,n={}){this.url=e,this.baseHeaders=n.headers??{},this.baseOverrides=n.overrides??{},this.fetchImplementation=n.fetch??globalThis.fetch.bind(globalThis)}buildRequest(e,n){return{...this.baseOverrides,...e.overrides,headers:{...this.baseHeaders,...e.headers,...n},method:"GET",redirect:"follow",mode:"cors",signal:e.signal}}async fetch(e,n){const A=r=>new Error(`${cc(r)} fetching ${e}`,{cause:r});let s;try{s=await this.fetchImplementation(e,n)}catch(r){if(`${r}`.includes("Failed to fetch")){console.warn(`generic-filehandle: refetching ${e} to attempt to work around chrome CORS header caching bug`);try{s=await this.fetchImplementation(e,{...n,cache:"reload"})}catch(o){throw A(o)}}else throw A(r)}return s}async read(e,n,A={}){if(e===0)return new Uint8Array(0);if(Number.isNaN(e)||Number.isNaN(n))throw new TypeError(`read() called with NaN length or position (length=${e}, position=${n}). The index file may be corrupt.`);const s=await this.fetch(this.url,this.buildRequest(A,{range:`bytes=${n}-${n+e-1}`}));if(s.status===416)return new Uint8Array(0);if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(s.status===200&&n===0||s.status===206){const r=s.headers.get("content-range"),o=/\/(\d+)$/.exec(r??"");o?.[1]&&(this._stat={size:parseInt(o[1],10)});const i=A.onProgress?await Js(s,A.onProgress):await Je(s);return!this._stat&&s.status===200&&(this._stat={size:i.byteLength}),i.byteLength<=e?i:i.subarray(0,e)}throw new Error(s.status===200?`${this.url} fetch returned status 200, expected 206`:`HTTP ${s.status} fetching ${this.url}`)}async readFile(e={}){const n=typeof e=="string"?e:e.encoding,A=typeof e=="string"?{}:e,s=await this.fetch(this.url,this.buildRequest(A));if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(n==="utf8")return s.text();if(n)throw new Error(`unsupported encoding: ${n}`);return A.onProgress?Js(s,A.onProgress):Je(s)}async stat(){return this._stat||await this.read(10,0),this._stat??{size:0}}close(){return Promise.resolve()}}class lc{readFile(){return Promise.reject(new Error("unimplemented"))}read(){return Promise.reject(new Error("unimplemented"))}stat(){return Promise.reject(new Error("unimplemented"))}close(){return Promise.reject(new Error("unimplemented"))}}class gc{}class fc{constructor(){this.signals=new Set,this.abortController=new AbortController}addSignal(e=new gc){if(this.signal.aborted)throw new Error("cannot add a signal, already aborted!");this.signals.add(e),e.aborted?this.handleAborted(e):typeof e.addEventListener=="function"&&e.addEventListener("abort",()=>{this.handleAborted(e)})}handleAborted(e){this.signals.delete(e),this.signals.size===0&&this.abortController.abort()}get signal(){return this.abortController.signal}abort(){this.abortController.abort()}}class hc{constructor(){this.callbacks=new Set}addCallback(e=()=>{}){this.callbacks.add(e),this.currentMessage&&e(this.currentMessage)}callback(e){this.currentMessage=e;for(const n of this.callbacks)n(e)}}class Bn{constructor({fill:e,cache:n}){if(typeof e!="function")throw new TypeError("must pass a fill function");if(typeof n!="object")throw new TypeError("must pass a cache object");if(typeof n.get!="function"||typeof n.set!="function"||typeof n.delete!="function")throw new TypeError("cache must implement get(key), set(key, val), and and delete(key)");this.cache=n,this.fillCallback=e}static isAbortException(e){return e.name==="AbortError"||e.code==="ERR_ABORTED"||e.message==="AbortError: aborted"||e.message==="Error: aborted"}evict(e,n){this.cache.get(e)===n&&this.cache.delete(e)}fill(e,n,A,s){const r=new fc,o=new hc;o.addCallback(s);const i={aborter:r,promise:this.fillCallback(n,r.signal,a=>{o.callback(a)}),settled:!1,statusReporter:o,get aborted(){return this.aborter.signal.aborted}};i.aborter.addSignal(A),i.aborter.signal.addEventListener("abort",()=>{i.settled||this.evict(e,i)}),i.promise.then(()=>{i.settled=!0},()=>{i.settled=!0,this.evict(e,i)}).catch(a=>{throw console.error(a),a}),this.cache.set(e,i)}static checkSinglePromise(e,n){function A(){if(n?.aborted)throw Object.assign(new Error("aborted"),{code:"ERR_ABORTED"})}return e.then(s=>(A(),s),s=>{throw A(),s})}has(e){return this.cache.has(e)}get(e,n,A,s){if(!A&&n instanceof AbortSignal)throw new TypeError("second get argument appears to be an AbortSignal, perhaps you meant to pass `null` for the fill data?");const r=this.cache.get(e);return r?r.aborted&&!r.settled?(this.evict(e,r),this.get(e,n,A,s)):r.settled?r.promise:(r.aborter.addSignal(A),r.statusReporter.addCallback(s),Bn.checkSinglePromise(r.promise,A)):(this.fill(e,n,A,s),Bn.checkSinglePromise(this.cache.get(e).promise,A))}delete(e){const n=this.cache.get(e);n&&(n.settled||n.aborter.abort(),this.cache.delete(e))}clear(){const e=this.cache.keys();let n=0;for(let A=e.next();!A.done;A=e.next())this.delete(A.value),n+=1;return n}}var X=function(t,e,n,A,s){if(A==="m")throw new TypeError("Private method is not writable");if(A==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return A==="a"?s.call(t,n):s?s.value=n:e.set(t,n),n},D=function(t,e,n,A){if(n==="a"&&!A)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!A:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?A:n==="a"?A.call(t):A?A.value:e.get(t)},Y,ot,_,W,qt,be,Ht,Xe,ut,$s,zn,Xn,Vn,Os,Ve;class uc extends Map{constructor(e={}){if(super(),Y.add(this),ot.set(this,0),_.set(this,new Map),W.set(this,new Map),qt.set(this,void 0),be.set(this,void 0),Ht.set(this,void 0),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof e.maxAge=="number"&&e.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");X(this,qt,e.maxSize,"f"),X(this,be,e.maxAge||Number.POSITIVE_INFINITY,"f"),X(this,Ht,e.onEviction,"f")}get __oldCache(){return D(this,W,"f")}get(e){if(D(this,_,"f").has(e)){const n=D(this,_,"f").get(e);return D(this,Y,"m",zn).call(this,e,n)}if(D(this,W,"f").has(e)){const n=D(this,W,"f").get(e);if(!D(this,Y,"m",ut).call(this,e,n))return D(this,Y,"m",Os).call(this,e,n),n.value}}set(e,n,{maxAge:A=D(this,be,"f")}={}){const s=typeof A=="number"&&A!==Number.POSITIVE_INFINITY?Date.now()+A:void 0;return D(this,_,"f").has(e)?D(this,_,"f").set(e,{value:n,expiry:s}):D(this,Y,"m",Vn).call(this,e,{value:n,expiry:s}),this}has(e){return D(this,_,"f").has(e)?!D(this,Y,"m",ut).call(this,e,D(this,_,"f").get(e)):D(this,W,"f").has(e)?!D(this,Y,"m",ut).call(this,e,D(this,W,"f").get(e)):!1}peek(e){if(D(this,_,"f").has(e))return D(this,Y,"m",Xn).call(this,e,D(this,_,"f"));if(D(this,W,"f").has(e))return D(this,Y,"m",Xn).call(this,e,D(this,W,"f"))}expiresIn(e){const n=D(this,_,"f").get(e)??D(this,W,"f").get(e);if(n)return n.expiry?n.expiry-Date.now():Number.POSITIVE_INFINITY}delete(e){var n;const A=D(this,_,"f").delete(e);return A&&X(this,ot,(n=D(this,ot,"f"),n--,n),"f"),D(this,W,"f").delete(e)||A}clear(){D(this,_,"f").clear(),D(this,W,"f").clear(),X(this,ot,0,"f")}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");const n=[...D(this,Y,"m",Ve).call(this)],A=n.length-e;A<0?(X(this,_,new Map(n),"f"),X(this,W,new Map,"f"),X(this,ot,n.length,"f")):(A>0&&D(this,Y,"m",Xe).call(this,n.slice(0,A)),X(this,W,new Map(n.slice(A)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f")),X(this,qt,e,"f")}evict(e=1){const n=e;if(!n||n<=0)return;const A=[...D(this,Y,"m",Ve).call(this)],s=Math.trunc(Math.min(n,Math.max(A.length-1,0)));s<=0||(D(this,Y,"m",Xe).call(this,A.slice(0,s)),X(this,W,new Map(A.slice(s)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f"))}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[(ot=new WeakMap,_=new WeakMap,W=new WeakMap,qt=new WeakMap,be=new WeakMap,Ht=new WeakMap,Y=new WeakSet,Xe=function(n){if(typeof D(this,Ht,"f")=="function")for(const[A,s]of n)D(this,Ht,"f").call(this,A,s.value)},ut=function(n,A){return typeof A.expiry=="number"&&A.expiry<=Date.now()?(typeof D(this,Ht,"f")=="function"&&D(this,Ht,"f").call(this,n,A.value),this.delete(n)):!1},$s=function(n,A){if(!D(this,Y,"m",ut).call(this,n,A))return A.value},zn=function(n,A){return A.expiry?D(this,Y,"m",$s).call(this,n,A):A.value},Xn=function(n,A){const s=A.get(n);return D(this,Y,"m",zn).call(this,n,s)},Vn=function(n,A){var s;D(this,_,"f").set(n,A),X(this,ot,(s=D(this,ot,"f"),s++,s),"f"),D(this,ot,"f")>=D(this,qt,"f")&&(X(this,ot,0,"f"),D(this,Y,"m",Xe).call(this,D(this,W,"f")),X(this,W,D(this,_,"f"),"f"),X(this,_,new Map,"f"))},Os=function(n,A){D(this,W,"f").delete(n),D(this,Y,"m",Vn).call(this,n,A)},Ve=function*(){for(const n of D(this,W,"f")){const[A,s]=n;D(this,_,"f").has(A)||D(this,Y,"m",ut).call(this,A,s)||(yield n)}for(const n of D(this,_,"f")){const[A,s]=n;D(this,Y,"m",ut).call(this,A,s)||(yield n)}},Symbol.iterator)](){for(const e of D(this,_,"f")){const[n,A]=e;D(this,Y,"m",ut).call(this,n,A)||(yield[n,A.value])}for(const e of D(this,W,"f")){const[n,A]=e;D(this,_,"f").has(n)||D(this,Y,"m",ut).call(this,n,A)||(yield[n,A.value])}}*entriesDescending(){let e=[...D(this,_,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;D(this,Y,"m",ut).call(this,s,r)||(yield[s,r.value])}e=[...D(this,W,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;D(this,_,"f").has(s)||D(this,Y,"m",ut).call(this,s,r)||(yield[s,r.value])}}*entriesAscending(){for(const[e,n]of D(this,Y,"m",Ve).call(this))yield[e,n.value]}get size(){if(!D(this,ot,"f"))return D(this,W,"f").size;let e=0;for(const n of D(this,W,"f").keys())D(this,_,"f").has(n)||e++;return Math.min(D(this,ot,"f")+e,D(this,qt,"f"))}get maxSize(){return D(this,qt,"f")}get maxAge(){return D(this,be,"f")}entries(){return this.entriesAscending()}forEach(e,n=this){for(const[A,s]of this.entriesAscending())e.call(n,s,A,this)}get[Symbol.toStringTag](){return"QuickLRU"}toString(){return`QuickLRU(${this.size}/${this.maxSize})`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}}function Ic(t){if(t.length===0)return[];const e=t.toSorted((s,r)=>s.min-r.min),n=[];let A=e[0];for(let s=1;s<e.length;s++){const r=e[s];r.min>A.max+1?(n.push(A),A=r):r.max>A.max&&(A={min:A.min,max:r.max})}return n.push(A),n}var dc={},Ys={};function gt(t){var e=Ys[t];if(e!==void 0)return e.exports;var n=Ys[t]={exports:{}};return dc[t](n,n.exports,gt),n.exports}(()=>{var t=Object.getPrototypeOf?n=>Object.getPrototypeOf(n):n=>n.__proto__,e;gt.t=function(n,A){if(A&1&&(n=this(n)),A&8||typeof n=="object"&&n&&(A&4&&n.__esModule||A&16&&typeof n.then=="function"))return n;var s=Object.create(null);gt.r(s);var r={};e=e||[null,t({}),t([]),t(t)];for(var o=A&2&&n;(typeof o=="object"||typeof o=="function")&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach(i=>r[i]=()=>n[i]);return r.default=()=>n,gt.d(s,r),s}})();gt.d=(t,e)=>{for(var n in e)gt.o(e,n)&&!gt.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})};gt.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);gt.r=t=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var ZA={};gt.r(ZA);gt.d(ZA,{__wbg_Error_ef53bc310eb298a0:()=>Ec,__wbg_set_wasm:()=>ts,decompress_and_parse_bigwig:()=>So,decompress_and_parse_summary:()=>Ro,inflate_raw:()=>Qc,inflate_raw_batch:()=>Lo,inflate_raw_unknown_size:()=>Bc});const Fo="data:application/wasm;base64,AGFzbQEAAAABmQETYAAAYAABf2ABfwBgAX8Bf2ACf38AYAJ/fwF/YAN/f38AYAN/f38Bf2AEf39/fwBgBH9/f38Bf2AFf39/f38AYAV/f39/fwF/YAZ/f39/f38AYAZ/f39/f38Bf2AHf39/f39/fwF/YAh/f39/f39/fwBgCH9/f39/f39/AX9gCn9/f39/f39/f38AYAt/f39/f39/f39/fwACNQEULi9pbmZsYXRlX3dhc21fYmcuanMcX193YmdfRXJyb3JfZWY1M2JjMzEwZWIyOThhMAAFA3FwAw4REhAPBQkCDQcJBAUGBAYECAUFBQgKCAYEBwcSEQ8MDAYKBgYIBAIMAgYKBwQHAwYFAwQGBgUFCwQGAgIEBAUFAwICAQQCBQICBAYGDQIEBAcFCQIEBQUGBAcABwMFBQQEBAUFBQICAgIEBAUAAAQFAXABICAFAwEAEQYJAX8BQYCAwAALB88BCQZtZW1vcnkCABtkZWNvbXByZXNzX2FuZF9wYXJzZV9iaWd3aWcAHxxkZWNvbXByZXNzX2FuZF9wYXJzZV9zdW1tYXJ5AB4LaW5mbGF0ZV9yYXcAGRFpbmZsYXRlX3Jhd19iYXRjaAAgGGluZmxhdGVfcmF3X3Vua25vd25fc2l6ZQAaH19fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIAXxFfX3diaW5kZ2VuX2V4cG9ydAA4El9fd2JpbmRnZW5fZXhwb3J0MgBOCSUBAEEBCx9CQ0tsQS9AbUguFVxYNVdjRDkbKFJRSjAWXmUUZllUCrjoAXDNJAIJfwF+IwBBEGsiASQAAkACQAJAAkAgAEH1AUkNAAJAIABBzP97TQ0AQQAhAAwECyAAQQtqIgJBeHEhA0EAKAKMn0AiBEUNAkEfIQUgAEH1//8HTw0BIANBJiACQQh2ZyIAa3ZBAXEgAEEBdGtBPmohBQwBCwJAAkACQAJAAkACQEEAKAKIn0AiBkEQIABBC2pB+ANxIABBC0kbIgNBA3YiAnYiAEEDcUUNACAAQX9zQQFxIAJqIgdBA3QiA0GAncAAaiIAIANBiJ3AAGooAgAiAigCCCIIRg0BIAggADYCDCAAIAg2AggMAgsgA0EAKAKQn0BNDQYgAA0CQQAoAoyfQCIARQ0GIABoQQJ0QfCbwABqKAIAIggoAgRBeHEgA2shAiAIIQYDQAJAIAgoAhAiAA0AIAgoAhQiAA0AIAYoAhghBQJAAkACQCAGKAIMIgAgBkcNACAGQRRBECAGKAIUIgAbaigCACIIDQFBACEADAILIAYoAggiCCAANgIMIAAgCDYCCAwBCyAGQRRqIAZBEGogABshBwNAIAchCSAIIgBBFGogAEEQaiAAKAIUIggbIQcgAEEUQRAgCBtqKAIAIggNAAsgCUEANgIACyAFRQ0GAkACQCAGIAYoAhxBAnRB8JvAAGoiCCgCAEYNAAJAIAUoAhAgBkYNACAFIAA2AhQgAA0CDAkLIAUgADYCECAADQEMCAsgCCAANgIAIABFDQYLIAAgBTYCGAJAIAYoAhAiCEUNACAAIAg2AhAgCCAANgIYCyAGKAIUIghFDQYgACAINgIUIAggADYCGAwGCyAAKAIEQXhxIANrIgggAiAIIAJJIggbIQIgACAGIAgbIQYgACEIDAALC0EAIAZBfiAHd3E2AoifQAsgAkEIaiEAIAIgA0EDcjYCBCACIANqIgMgAygCBEEBcjYCBAwFCwJAAkAgACACdEECIAJ0IgBBACAAa3JxaCIJQQN0IgJBgJ3AAGoiCCACQYidwABqKAIAIgAoAggiB0YNACAHIAg2AgwgCCAHNgIIDAELQQAgBkF+IAl3cTYCiJ9ACyAAIANBA3I2AgQgACADaiIGIAIgA2siCEEBcjYCBCAAIAJqIAg2AgACQEEAKAKQn0AiAkUNAEEAKAKYn0AhAwJAAkBBACgCiJ9AIgdBASACQQN2dCIJcQ0AQQAgByAJcjYCiJ9AIAJBeHFBgJ3AAGoiAiEHDAELIAJBeHEiAkGAncAAaiEHIAJBiJ3AAGooAgAhAgsgByADNgIIIAIgAzYCDCADIAc2AgwgAyACNgIICyAAQQhqIQBBACAGNgKYn0BBACAINgKQn0AMBAtBAEEAKAKMn0BBfiAGKAIcd3E2AoyfQAsCQAJAAkAgAkEQSQ0AIAYgA0EDcjYCBCAGIANqIgggAkEBcjYCBCAIIAJqIAI2AgBBACgCkJ9AIgdFDQFBACgCmJ9AIQACQAJAQQAoAoifQCIJQQEgB0EDdnQiBXENAEEAIAkgBXI2AoifQCAHQXhxQYCdwABqIgchCQwBCyAHQXhxIgdBgJ3AAGohCSAHQYidwABqKAIAIQcLIAkgADYCCCAHIAA2AgwgACAJNgIMIAAgBzYCCAwBCyAGIAIgA2oiAEEDcjYCBCAGIABqIgAgACgCBEEBcjYCBAwBC0EAIAg2ApifQEEAIAI2ApCfQAsgBkEIaiIARQ0BDAILQQAgA2shAgJAAkACQAJAIAVBAnRB8JvAAGooAgAiBg0AQQAhCEEAIQAMAQtBACEIIANBAEEZIAVBAXZrIAVBH0YbdCEHQQAhAANAAkAgBiIGKAIEQXhxIgkgA0kNACAJIANrIgkgAk8NACAGIQggCSECIAkNAEEAIQIgBiEAIAYhCAwDCyAGKAIUIgkgACAJIAYgB0EddkEEcWooAhAiBkcbIAAgCRshACAHQQF0IQcgBg0ACwsCQCAAIAhyDQBBACEIQQIgBXQiAEEAIABrciAEcSIARQ0DIABoQQJ0QfCbwABqKAIAIQALIABFDQELA0AgACgCBEF4cSIGIANrIgcgAiAHIAJJIgkbIQUgBiADSSEHIAAgCCAJGyEJAkAgACgCECIGDQAgACgCFCEGCyACIAUgBxshAiAIIAkgBxshCCAGIQAgBg0ACwsgCEUNAAJAQQAoApCfQCIAIANJDQAgAiAAIANrTw0BCyAIKAIYIQUCQAJAAkAgCCgCDCIAIAhHDQAgCEEUQRAgCCgCFCIAG2ooAgAiBg0BQQAhAAwCCyAIKAIIIgYgADYCDCAAIAY2AggMAQsgCEEUaiAIQRBqIAAbIQcDQCAHIQkgBiIAQRRqIABBEGogACgCFCIGGyEHIABBFEEQIAYbaigCACIGDQALIAlBADYCAAsCQCAFRQ0AAkACQAJAIAggCCgCHEECdEHwm8AAaiIGKAIARg0AAkAgBSgCECAIRg0AIAUgADYCFCAADQIMBAsgBSAANgIQIAANAQwDCyAGIAA2AgAgAEUNAQsgACAFNgIYAkAgCCgCECIGRQ0AIAAgBjYCECAGIAA2AhgLIAgoAhQiBkUNASAAIAY2AhQgBiAANgIYDAELQQBBACgCjJ9AQX4gCCgCHHdxNgKMn0ALAkACQCACQRBJDQAgCCADQQNyNgIEIAggA2oiACACQQFyNgIEIAAgAmogAjYCAAJAIAJBgAJJDQAgACACEBIMAgsCQAJAQQAoAoifQCIGQQEgAkEDdnQiB3ENAEEAIAYgB3I2AoifQCACQfgBcUGAncAAaiICIQYMAQsgAkH4AXEiAkGAncAAaiEGIAJBiJ3AAGooAgAhAgsgBiAANgIIIAIgADYCDCAAIAY2AgwgACACNgIIDAELIAggAiADaiIAQQNyNgIEIAggAGoiACAAKAIEQQFyNgIECyAIQQhqIgANAQsCQAJAAkACQAJAAkBBACgCkJ9AIgAgA08NAAJAQQAoApSfQCIAIANLDQAgAUEEakG0n8AAIANBr4AEakGAgHxxECMCQCABKAIEIgYNAEEAIQAMCAsgASgCDCEFQQBBACgCoJ9AIAEoAggiCWoiADYCoJ9AQQAgAEEAKAKkn0AiAiAAIAJLGzYCpJ9AAkACQAJAQQAoApyfQCICRQ0AQfCcwAAhAANAIAYgACgCACIIIAAoAgQiB2pGDQIgACgCCCIADQAMAwsLAkACQEEAKAKsn0AiAEUNACAGIABPDQELQQAgBjYCrJ9AC0EAQf8fNgKwn0BBACAFNgL8nEBBACAJNgL0nEBBACAGNgLwnEBBAEGAncAANgKMnUBBAEGIncAANgKUnUBBAEGAncAANgKInUBBAEGQncAANgKcnUBBAEGIncAANgKQnUBBAEGYncAANgKknUBBAEGQncAANgKYnUBBAEGgncAANgKsnUBBAEGYncAANgKgnUBBAEGoncAANgK0nUBBAEGgncAANgKonUBBAEGwncAANgK8nUBBAEGoncAANgKwnUBBAEG4ncAANgLEnUBBAEGwncAANgK4nUBBAEHAncAANgLMnUBBAEG4ncAANgLAnUBBAEHAncAANgLInUBBAEHIncAANgLUnUBBAEHIncAANgLQnUBBAEHQncAANgLcnUBBAEHQncAANgLYnUBBAEHYncAANgLknUBBAEHYncAANgLgnUBBAEHgncAANgLsnUBBAEHgncAANgLonUBBAEHoncAANgL0nUBBAEHoncAANgLwnUBBAEHwncAANgL8nUBBAEHwncAANgL4nUBBAEH4ncAANgKEnkBBAEH4ncAANgKAnkBBAEGAnsAANgKMnkBBAEGInsAANgKUnkBBAEGAnsAANgKInkBBAEGQnsAANgKcnkBBAEGInsAANgKQnkBBAEGYnsAANgKknkBBAEGQnsAANgKYnkBBAEGgnsAANgKsnkBBAEGYnsAANgKgnkBBAEGonsAANgK0nkBBAEGgnsAANgKonkBBAEGwnsAANgK8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bGVkOiDAAMACOiDAAC9ydXN0Yy84YmFiMjZmNGY2OGUwZTI2ZjBiYjc5NjBiZTMzNGQ1YjUyMGVhNDUyL2xpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvcndsb2NrL25vX3RocmVhZHMucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMjIvc3JjL2V4dGVybnJlZi5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi4xMy9zcmMvZGxtYWxsb2MucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbGliZGVmbGF0ZXItMS4yNS4yL3NyYy9saWIucnMAY29tcHJlc3NlZCBibG9jayBleHRlbmRzIHBhc3QgdGhlIGlucHV0IGJ1ZmZlcmJsb2NrIG9mZnNldCBvdmVyZmxvd3NibG9jayBpcyBzaG9ydGVyIHRoYW4gdGhlIDItYnl0ZSB6bGliIGhlYWRlcgAAAM4CEAAKAAAAUQAAAAsAAADOAhAACgAAAGcAAAALAAAAzgIQAAoAAABZAAAAPQAAAM4CEAAKAAAAYgAAACsAAADOAhAACgAAAFwAAAAPAAAAZGVjb21wcmVzc2lvbiBvdXRwdXQgdG9vIGxhcmdlAADOAhAACgAAAJIAAAA9AAAAzgIQAAoAAACYAAAAHQAAAM4CEAAKAAAAAQEAAD0AAADOAhAACgAAAAcBAAAdAAAAQmFkRGF0YUluc3VmZmljaWVudFNwYWNllQEQAGcAAACEAAAAEQAAAJUBEABnAAAAkgAAABEAAABsaWJkZWZsYXRlX2RlZmxhdGVfZGVjb21wcmVzcyByZXR1cm5lZCBhbiB1bmtub3du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IG1heF9vdmVyaGVhZAAATgIQACoAAAC3BAAADQAAAHJ3bG9jayBvdmVyZmxvd2VkIHJlYWQgbG9ja3M3ARAAXQAAABUAAAAsAAAAAAAAAAgAAAAEAAAAFQAAAAkAAAAMAAAABAAAABYAAAByd2xvY2sgaGFzIG5vdCBiZWVuIGxvY2tlZCBmb3IgcmVhZGluZwAANwEQAF0AAAA+AAAACQAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/QEQAFAAAAAcAAAABQAAABcAAAAMAAAABAAAABgAAAAZAAAAGgAAAAAAAAAAAAAAAQAAABsAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdAAA7gAQAEgAAACPAgAADgAAAEVycm9yMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlSZWZDZWxsIGFscmVhZHkgYm9ycm93ZWQAQaybwAALBAQAAAAAKQRuYW1lASIBXx9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAEgJcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkCBndhbHJ1cwYwLjI2LjIMd2FzbS1iaW5kZ2VuEzAuMi4xMjIgKGRkZDMyMjUxNCk=";var Cc=gt.t(Fo);function So(t,e,n,A,s,r){try{const g=U.__wbindgen_add_to_stack_pointer(-16),f=qe(t,U.__wbindgen_export),h=it,u=Be(e,U.__wbindgen_export),I=it,d=Be(n,U.__wbindgen_export),C=it;U.decompress_and_parse_bigwig(g,f,h,u,I,d,C,A,s,r);var o=z().getInt32(g+0,!0),i=z().getInt32(g+4,!0),a=z().getInt32(g+8,!0),c=z().getInt32(g+12,!0);if(c)throw He(a);var l=Ke(o,i).slice();return U.__wbindgen_export2(o,i*1,1),l}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Ro(t,e,n,A,s,r,o){try{const f=U.__wbindgen_add_to_stack_pointer(-16),h=qe(t,U.__wbindgen_export),u=it,I=Be(e,U.__wbindgen_export),d=it,C=Be(n,U.__wbindgen_export),B=it;U.decompress_and_parse_summary(f,h,u,I,d,C,B,A,s,r,o);var i=z().getInt32(f+0,!0),a=z().getInt32(f+4,!0),c=z().getInt32(f+8,!0),l=z().getInt32(f+12,!0);if(l)throw He(c);var g=Ke(i,a).slice();return U.__wbindgen_export2(i,a*1,1),g}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Qc(t,e){try{const i=U.__wbindgen_add_to_stack_pointer(-16),a=qe(t,U.__wbindgen_export),c=it;U.inflate_raw(i,a,c,e);var n=z().getInt32(i+0,!0),A=z().getInt32(i+4,!0),s=z().getInt32(i+8,!0),r=z().getInt32(i+12,!0);if(r)throw He(s);var o=Ke(n,A).slice();return U.__wbindgen_export2(n,A*1,1),o}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Lo(t,e,n,A){try{const c=U.__wbindgen_add_to_stack_pointer(-16),l=qe(t,U.__wbindgen_export),g=it,f=Be(e,U.__wbindgen_export),h=it,u=Be(n,U.__wbindgen_export),I=it;U.inflate_raw_batch(c,l,g,f,h,u,I,A);var s=z().getInt32(c+0,!0),r=z().getInt32(c+4,!0),o=z().getInt32(c+8,!0),i=z().getInt32(c+12,!0);if(i)throw He(o);var a=Ke(s,r).slice();return U.__wbindgen_export2(s,r*1,1),a}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Bc(t){try{const o=U.__wbindgen_add_to_stack_pointer(-16),i=qe(t,U.__wbindgen_export),a=it;U.inflate_raw_unknown_size(o,i,a);var e=z().getInt32(o+0,!0),n=z().getInt32(o+4,!0),A=z().getInt32(o+8,!0),s=z().getInt32(o+12,!0);if(s)throw He(A);var r=Ke(e,n).slice();return U.__wbindgen_export2(e,n*1,1),r}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Ec(t,e){const n=Error(pc(t,e));return mc(n)}function mc(t){ve===Ft.length&&Ft.push(Ft.length+1);const e=ve;return ve=Ft[e],Ft[e]=t,e}function wc(t){t<1028||(Ft[t]=ve,ve=t)}function Ke(t,e){return t=t>>>0,jA().subarray(t/1,t/1+e)}let ae=null;function z(){return(ae===null||ae.buffer.detached===!0||ae.buffer.detached===void 0&&ae.buffer!==U.memory.buffer)&&(ae=new DataView(U.memory.buffer)),ae}function pc(t,e){return bc(t>>>0,e)}let Ze=null;function yc(){return(Ze===null||Ze.byteLength===0)&&(Ze=new Uint32Array(U.memory.buffer)),Ze}let je=null;function jA(){return(je===null||je.byteLength===0)&&(je=new Uint8Array(U.memory.buffer)),je}function Nc(t){return Ft[t]}let Ft=new Array(1024).fill(void 0);Ft.push(void 0,null,!0,!1);let ve=Ft.length;function Be(t,e){const n=e(t.length*4,4)>>>0;return yc().set(t,n/4),it=t.length,n}function qe(t,e){const n=e(t.length*1,1)>>>0;return jA().set(t,n/1),it=t.length,n}function He(t){const e=Nc(t);return wc(t),e}let ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});ln.decode();const kc=2146435072;let Zn=0;function bc(t,e){return Zn+=e,Zn>=kc&&(ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),ln.decode(),Zn=e),ln.decode(jA().subarray(t,t+e))}let it=0,U;function ts(t){U=t}ts(Cc);let tn=null,jn=null;async function es(){return tn||(jn||(jn=(async()=>{const e=await(await fetch(Fo)).arrayBuffer(),{instance:n}=await WebAssembly.instantiate(e,{"./inflate_wasm_bg.js":ZA});return ts(n.exports),tn=n.exports,tn})()),jn)}async function Mc(t,e,n,A){await es();const s=Lo(t,e,n,A),r=new DataView(s.buffer,s.byteOffset,s.byteLength),o=r.getUint32(0,!0),i=4,a=i+(o+1)*4,c=new Array(o+1);for(let g=0;g<=o;g++)c[g]=r.getUint32(i+g*4,!0);return{data:s.subarray(a),offsets:c}}function Dc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n)}}function Fc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0),minScores:new Float32Array(0),maxScores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4,o=r+n*4,i=o+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n),minScores:new Float32Array(t.buffer,t.byteOffset+o,n),maxScores:new Float32Array(t.buffer,t.byteOffset+i,n)}}async function Sc(t,e,n,A,s,r){await es();const o=So(t,e,n,A,s,r);return Dc(o)}async function Rc(t,e,n,A,s,r,o){await es();const i=Ro(t,e,n,A,s,r,o);return Fc(i)}function ns(t){const e=new Uint32Array(t.length),n=new Uint32Array(t.length);for(let A=0;A<t.length;A++){const s=t[A];e[A]=s.offset,n[A]=s.length}return{inputOffsets:e,inputLengths:n}}async function Lc(t,e,n){const{inputOffsets:A,inputLengths:s}=ns(e);return Mc(t,A,s,n)}async function xc(t,e,n,A,s){const{inputOffsets:r,inputLengths:o}=ns(e);return Sc(t,r,o,n,A,s)}async function Gc(t,e,n,A,s,r){const{inputOffsets:o,inputLengths:i}=ns(e);return Rc(t,o,i,n,A,s,r)}const As=new TextDecoder("utf8");function rt(t,e=0){return new DataView(t.buffer,t.byteOffset+e,t.length-e)}function j(t,e){return t.getUint32(e,!0)+t.getUint32(e+4,!0)*2**32}function CA(t,e,n){const A=t.indexOf(0,e),s=A!==-1&&A<e+n?A:e+n;return As.decode(t.subarray(e,s))}function vc(t){const e=t.toSorted((s,r)=>s.offset-r.offset),n=[];let A;for(const s of e)A&&s.offset-(A.offset+A.length)<=2e3?(A.length=Math.max(A.length,s.offset+s.length-A.offset),A.blocks.push(s)):(A={blocks:[s],length:s.length,offset:s.offset},n.push(A));return n}const _s=610839776;function Uc(t,e){let n=0;for(const s of t)n+=s.length;let A=0;return e?.(0,n),s=>{A+=s,e?.(A,n)}}function Ie(t,e,n,A){return t<A&&e>n}function xo(t,e){return e?t/e:t}function Tc(t,e){const n=[];let A=0;const s=rt(t);for(;A<t.byteLength;){const r=s.getUint32(A,!0);A+=4;const o=s.getUint32(A,!0);A+=4;const i=s.getUint32(A,!0);A+=4;const a=s.getUint32(A,!0);A+=4;const c=s.getFloat32(A,!0);A+=4;const l=s.getFloat32(A,!0);A+=4;const g=s.getFloat32(A,!0);A+=8,(!e||r===e.chrId&&Ie(o,i,e.start,e.end))&&n.push({start:o,end:i,maxScore:l,minScore:c,summary:!0,score:xo(g,a)})}return n}function Jc(t,e,n){const A=[];let s=0;const r=rt(t);for(;s<t.byteLength;){const o=s,i=r.getUint32(s,!0);s+=4;const a=r.getInt32(s,!0);s+=4;const c=r.getInt32(s,!0);s+=4;const l=t.indexOf(0,s),g=l===-1?t.length:l,f=As.decode(t.subarray(s,g));s=g+1,(!n||i===n.chrId&&Ie(a,c,n.start,n.end))&&A.push({start:a,end:c,rest:f,uniqueId:`bb-${e}-${o}`})}return A}function $c(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0);let a=24;const c=[];switch(o){case 1:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getInt32(a,!0);a+=4;const h=n.getFloat32(a,!0);a+=4,(!e||Ie(g,f,e.start,e.end))&&c.push({start:g,end:f,score:h})}break}case 2:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getFloat32(a,!0);a+=4;const h=g+r;(!e||Ie(g,h,e.start,e.end))&&c.push({score:f,start:g,end:h})}break}case 3:{for(let l=0;l<i;l++){const g=n.getFloat32(a,!0);a+=4;const f=A+l*s,h=f+r;(!e||Ie(f,h,e.start,e.end))&&c.push({score:g,start:f,end:h})}break}}return c}function Ks(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0),a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i),g=e.start,f=e.end;let h=0;switch(o){case 1:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=n.getInt32(u+4,!0);d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+8,!0),h++),u+=12}break}case 2:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+4,!0),h++),u+=8}break}case 3:{let u=24;for(let I=0;I<i;I++){const d=A+I*s,C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u,!0),h++),u+=4}break}}return h<i?{starts:a.subarray(0,h),ends:c.subarray(0,h),scores:l.subarray(0,h)}:{starts:a,ends:c,scores:l}}function qs(t,e){const n=rt(t),A=Math.floor(t.byteLength/32),s=new Int32Array(A),r=new Int32Array(A),o=new Float32Array(A),i=new Float32Array(A),a=new Float32Array(A);let c=0,l=0;for(;l<t.byteLength;){const g=n.getUint32(l,!0);l+=4;const f=n.getUint32(l,!0);l+=4;const h=n.getUint32(l,!0);l+=4;const u=n.getUint32(l,!0);l+=4;const I=n.getFloat32(l,!0);l+=4;const d=n.getFloat32(l,!0);l+=4;const C=n.getFloat32(l,!0);l+=8,g===e.chrId&&Ie(f,h,e.start,e.end)&&(s[c]=f,r[c]=h,o[c]=xo(C,u),i[c]=I,a[c]=d,c++)}return c<A?{starts:s.subarray(0,c),ends:r.subarray(0,c),scores:o.subarray(0,c),minScores:i.subarray(0,c),maxScores:a.subarray(0,c)}:{starts:s,ends:r,scores:o,minScores:i,maxScores:a}}function Ue(t,e,n,A){if(t.length===1)return e(t[0]);const s=new A(n);let r=0;for(const o of t){const i=e(o);s.set(i,r),r+=i.length}return s}function Go(t){let e=0;for(const n of t)e+=n.starts.length;return e}function vo(t){const e=Go(t);return{starts:Ue(t,n=>n.starts,e,Int32Array),ends:Ue(t,n=>n.ends,e,Int32Array),scores:Ue(t,n=>n.scores,e,Float32Array),isSummary:!1}}function Oc(t){const e=Go(t),{starts:n,ends:A,scores:s}=vo(t);return{starts:n,ends:A,scores:s,minScores:Ue(t,r=>r.minScores,e,Float32Array),maxScores:Ue(t,r=>r.maxScores,e,Float32Array),isSummary:!0}}function Uo(t){let e=0;for(const i of t)for(const a of i)e+=a.starts.length;const n=new Int32Array(e),A=new Int32Array(e),s=new Float32Array(e),r=[0];let o=0;for(const i of t){for(const a of i)n.set(a.starts,o),A.set(a.ends,o),s.set(a.scores,o),o+=a.starts.length;r.push(o)}return{starts:n,ends:A,scores:s,regionOffsets:r,totalCount:e}}function Yc(t){const{starts:e,ends:n,scores:A,regionOffsets:s}=Uo(t);return{starts:e,ends:n,scores:A,regionOffsets:s,isSummary:!1}}function _c(t){const{starts:e,ends:n,scores:A,regionOffsets:s,totalCount:r}=Uo(t),o=new Float32Array(r),i=new Float32Array(r);let a=0;for(const c of t)for(const l of c)o.set(l.minScores,a),i.set(l.maxScores,a),a+=l.starts.length;return{starts:e,ends:n,scores:A,minScores:o,maxScores:i,regionOffsets:s,isSummary:!0}}function Hs(t,e,n,A){switch(t){case"summary":return Tc(e,A);case"bigwig":return $c(e,A);case"bigbed":return Jc(e,n,A)}}class Kc{rTreePromise;rTreeNodeCache=new Bn({cache:new uc({maxSize:1e3}),fill:async({length:e,offset:n},A)=>this.bbi.read(e,n,{signal:A})});bbi;refsByName;rTreeOffset;uncompressBufSize;blockType;constructor(e,n,A,s,r){if(!(A>=0))throw new Error("invalid rTreeOffset!");this.bbi=e,this.refsByName=n,this.rTreeOffset=A,this.uncompressBufSize=s,this.blockType=r}async _collectBlocks(e,n,A,s){const r=this.refsByName[e];if(r===void 0||n>=A)return;this.rTreePromise||(this.rTreePromise=this.bbi.read(48,this.rTreeOffset,{signal:s?.signal}).catch(u=>{throw this.rTreePromise=void 0,u}));const o=await this.rTreePromise,i=rt(o),a=i.getUint32(0,!0);if(a!==_s)throw new Error(`invalid cirTree magic: 0x${a.toString(16)} (expected 0x${_s.toString(16)}) at offset ${this.rTreeOffset}, file may be corrupt or unsupported`);const l=4+i.getUint32(4,!0)*32,g=(u,I,d,C)=>(u<r||u===r&&I<A)&&(d>r||d===r&&C>n),f=[];let h=[this.rTreeOffset+48];for(;h.length>0;){const u=Ic(h.map(d=>({min:d,max:d+l}))),I=[];for(const{min:d,max:C}of u){const B=C-d,Q=d,E=await this.rTreeNodeCache.get(`${B}_${Q}`,{length:B,offset:Q},s?.signal);for(const m of h)if(d<=m&&m<=C){const p=E.subarray(m-Q),w=rt(p),y=w.getUint8(0),N=w.getUint16(2,!0);if(y===1||y===0){const k=y===1?32:24;let b=4;for(let M=0;M<N;M++){const F=w.getUint32(b,!0),S=w.getUint32(b+4,!0),v=w.getUint32(b+8,!0),x=w.getUint32(b+12,!0);if(g(F,S,v,x)){const O=j(w,b+16);if(y===1){const J=j(w,b+24);f.push({offset:O,length:J})}else I.push(O)}b+=k}}}}h=I}return{blocks:f,chrId:r}}async readWigData(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);if(!r)return[];const{blocks:o,chrId:i}=r;return this.readFeatures(o,{...s,request:{chrId:i,start:n,end:A}})}async getBlockSizeForRange(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);let o=0;if(r)for(const i of r.blocks)o+=i.length;return o}async getBlockSizeForRangeMulti(e,n={}){const{blockByOffset:A}=await this._collectBlocksMulti(e,n);let s=0;for(const r of A.values())s+=r.length;return s}async _collectBlocksMulti(e,n){const A=await Promise.all(e.map(({refName:o,start:i,end:a})=>this._collectBlocks(o,i,a,n))),s=new Map,r=new Map;for(let o=0;o<A.length;o++){const i=A[o];if(i){const{start:a,end:c}=e[o],l={chrId:i.chrId,start:a,end:c};for(const g of i.blocks){const f=r.get(g.offset);f?f.push({regionIndex:o,request:l}):(s.set(g.offset,g),r.set(g.offset,[{regionIndex:o,request:l}]))}}}return{blockByOffset:s,tagsByOffset:r}}async readWigDataMulti(e,n={}){const A=e.map(()=>[]),{blockByOffset:s,tagsByOffset:r}=await this._collectBlocksMulti(e,n),{blockType:o}=this;return await this._forEachDecodedBlock([...s.values()],n.signal,n.onProgress,(i,a)=>{const c=r.get(a);if(c)for(const{regionIndex:l,request:g}of c){const f=Hs(o,i,a,g);for(const h of f)A[l].push(h)}}),A}assertNotBigBed(e){if(this.blockType==="bigbed")throw new Error(`${e} is not supported for BigBed data; use getFeatures/getFeaturesMulti instead`)}async readWigDataAsArrays(e,n,A,s){this.assertNotBigBed("getFeaturesAsArrays");const r=await this._collectBlocks(e,n,A,s),o=r?r.blocks:[],i={chrId:r?r.chrId:0,start:n,end:A};return this.blockType==="summary"?this._readSummaryFeaturesAsArrays(o,i,s):this._readBigWigFeaturesAsArrays(o,i,s)}async readWigDataAsArraysMulti(e,n={}){this.assertNotBigBed("getFeaturesAsArraysMulti");const A=await this._collectBlocksMulti(e,n);return this.blockType==="summary"?_c(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>qs(s,r),n)):Yc(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>Ks(s,r),n))}async _readBlocksAsArraysMulti(e,n,A,s){const{blockByOffset:r,tagsByOffset:o}=e,i=Array.from({length:n},()=>[]);return await this._forEachDecodedBlock([...r.values()],s.signal,s.onProgress,(a,c)=>{const l=o.get(c);if(l)for(const{regionIndex:g,request:f}of l){const h=A(a,f);h.starts.length>0&&i[g].push(h)}}),i}async _forEachBlockGroup(e,n,A,s){const r=vc(e),o=Uc(r,A);for(const i of r){const a=await this.bbi.read(i.length,i.offset,{signal:n});o(i.length),await s(a,i.blocks.map(c=>({offset:c.offset-i.offset,length:c.length})),i.offset)}}async _forEachDecodedBlock(e,n,A,s){const{uncompressBufSize:r}=this;await this._forEachBlockGroup(e,n,A,async(o,i,a)=>{if(r>0){const{data:c,offsets:l}=await Lc(o,i,r);for(let g=0;g<i.length;g++)s(c.subarray(l[g],l[g+1]),a+i[g].offset)}else for(const c of i)s(o.subarray(c.offset,c.offset+c.length),a+c.offset)})}async readFeatures(e,n={}){const{blockType:A}=this,{signal:s,request:r,onProgress:o}=n,i=[];return await this._forEachDecodedBlock(e,s,o,(a,c)=>{const l=Hs(A,a,c,r);for(const g of l)i.push(g)}),i}async _readBlocksAsArrays(e,n,A,s,r){const{uncompressBufSize:o}=this,i=[],a=c=>{c.starts.length>0&&i.push(c)};return await this._forEachBlockGroup(e,n,r,async(c,l)=>{if(o>0)a(await A(c,l));else for(const g of l)a(s(c.subarray(g.offset,g.offset+g.length)))}),i}async _readBigWigFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>xc(r,o,this.uncompressBufSize,n.start,n.end),r=>Ks(r,n),A.onProgress);return vo(s)}async _readSummaryFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Gc(r,o,this.uncompressBufSize,n.chrId,n.start,n.end),r=>qs(r,n),A.onProgress);return Oc(s)}}const qc=-2003829722,Ws=-2021002517;class To{bbi;headerP;getHeader(e){return this.headerP||(this.headerP=this._getHeader(e).catch(n=>{throw this.headerP=void 0,n})),this.headerP}constructor(e){const{filehandle:n,path:A,url:s}=e;if(n)this.bbi=n;else if(s)this.bbi=new Do(s);else if(A)this.bbi=new lc(A);else throw new Error("no file given")}async _getHeader(e){const n=await this._getMainHeader(e),A=await this._readChromosomeTree(n,e);return{...n,...A}}async _getMainHeader(e,n=2e3){const A=await this.bbi.read(n,0,e),s=rt(A);let r=0;const o=s.getInt32(r,!0);if(r+=4,o!==qc&&o!==Ws)throw new Error("not a BigWig/BigBed file");const i=s.getUint16(r,!0);r+=2;const a=s.getUint16(r,!0);r+=2;const c=j(s,r);r+=8;const l=j(s,r);r+=8;const g=j(s,r);r+=8;const f=s.getUint16(r,!0);r+=2;const h=s.getUint16(r,!0);r+=2;const u=j(s,r);r+=8;const I=j(s,r);r+=8;const d=s.getUint32(r,!0);r+=4;const C=j(s,r);r+=8;const B=[];for(let y=0;y<a;y++){const N=s.getUint32(r,!0);r+=4,r+=4;const k=j(s,r);r+=8;const b=j(s,r);r+=8,B.push({reductionLevel:N,dataOffset:k,indexOffset:b})}const Q=o===Ws?"bigbed":"bigwig",E=A.length<n,m=u!==0&&!A.includes(0,u);if(!E&&(u>n||I>n-40||m))return this._getMainHeader(e,n*2);let p;if(I){const y=rt(A,I);p={basesCovered:j(y,0),scoreMin:y.getFloat64(8,!0),scoreMax:y.getFloat64(16,!0),scoreSum:y.getFloat64(24,!0),scoreSumSquares:y.getFloat64(32,!0)}}else throw new Error("no stats");let w="";if(u){const y=A.indexOf(0,u),N=y===-1?A.length:y;w=As.decode(A.subarray(u,N))}return{zoomLevels:B,magic:o,extHeaderOffset:C,numZoomLevels:a,fieldCount:f,totalSummary:p,definedFieldCount:h,uncompressBufSize:d,asOffset:u,chromosomeTreeOffset:c,totalSummaryOffset:I,unzoomedDataOffset:l,unzoomedIndexOffset:g,fileType:Q,version:i,autoSql:w}}async _readChromosomeTree(e,n){const A=[],s={},r=e.chromosomeTreeOffset,o=rt(await this.bbi.read(32,r,n)),i=o.getUint32(4,!0),a=o.getUint32(8,!0),c=o.getUint32(12,!0),l=4+i*(a+Math.max(c,8)),g=async f=>{const h=await this.bbi.read(l,f,n),u=rt(h),I=u.getUint8(0),d=u.getUint16(2,!0);let C=4;if(I)for(let B=0;B<d;B++){const Q=CA(h,C,a);C+=a;const E=u.getUint32(C,!0);C+=4;const m=u.getUint32(C,!0);C+=4,s[Q]=E,A[E]={name:Q,id:E,length:m}}else{const B=[];for(let Q=0;Q<d;Q++){C+=a;const E=j(u,C);C+=8,B.push(g(E))}await Promise.all(B)}};return await g(r+32),{refsByName:s,refsByNumber:A}}viewCache=new Map;getOrCreateBlockView(e,n,A,s){const r=`${n}_${s}`;let o=this.viewCache.get(r);return o||(o=new Kc(this.bbi,e,n,A,s),this.viewCache.set(r,o)),o}async getUnzoomedView(e){const{unzoomedIndexOffset:n,refsByName:A,uncompressBufSize:s,fileType:r}=await this.getHeader(e);return this.getOrCreateBlockView(A,n,s,r)}async _getView(e){const{basesPerSpan:n,scale:A}=e??{},s=n?1/n:A??1;return this.getView(s,e)}async getFeatures(e,n,A,s){return(await this._getView(s)).readWigData(e,n,A,s)}async getRegionByteSize(e,n,A,s){return(await this._getView(s)).getBlockSizeForRange(e,n,A,s)}async getRegionByteSizeMulti(e,n){return(await this._getView(n)).getBlockSizeForRangeMulti(e,n)}async getFeaturesMulti(e,n){return(await this._getView(n)).readWigDataMulti(e,n)}async getFeaturesAsArrays(e,n,A,s){return(await this._getView(s)).readWigDataAsArrays(e,n,A,s)}async getFeaturesAsArraysMulti(e,n){return(await this._getView(n)).readWigDataAsArraysMulti(e,n)}}class Jo extends To{async getView(e,n){const{zoomLevels:A,refsByName:s,uncompressBufSize:r}=await this.getHeader(n),o=1/e,i=A.length-1;for(let a=i;a>=0;a-=1){const c=A[a];if(c.reductionLevel<=2*o)return this.getOrCreateBlockView(s,c.indexOffset,r,"summary")}return this.getUnzoomedView(n)}}function Hc(t,e){if(e<0)return;let n=0;for(let s=0;s<e;s++){if(n=t.indexOf(" ",n),n===-1)return;n++}const A=t.indexOf(" ",n);return A===-1?t.slice(n):t.slice(n,A)}function Ps(t,e){return t<e?-1:t>e?1:0}async function $o(t,e,n,A,s,r,o,i){const a=4+n*(A+s),c=await t.read(a,e,i),l=rt(c),g=l.getInt8(0),f=l.getInt16(2,!0);let h=4;if(g===0){const u=[];for(let Q=0;Q<f;Q++){const E=CA(c,h,A);h+=A;const m=j(l,h);h+=8,u.push({key:E,offset:m})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const Q=Math.floor((I+d)/2);Ps(r,u[Q].key)>=0?(C=Q,I=Q+1):d=Q-1}const B=u[Math.max(C,0)].offset;return $o(t,B,n,A,s,r,o,i)}else if(g===1){const u=[];for(let E=0;E<f;E++){const m=CA(c,h,A);h+=A;const p=j(l,h);h+=8;const w=l.getUint32(h,!0);h+=4,h+=4,u.push({key:m,offset:p,length:w})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const E=Math.floor((I+d)/2),m=Ps(r,u[E].key);if(m===0){C=E;break}else m<0?d=E-1:I=E+1}if(C===-1)return[];let B=C;for(;B>0&&u[B-1].key===r;)B--;let Q=C;for(;Q<u.length-1&&u[Q+1].key===r;)Q++;return u.slice(B,Q+1).map(E=>({...E,field:o}))}return[]}class Oo extends To{indicesP;readIndices(e={}){return this.indicesP||(this.indicesP=this._readIndices(e).catch(n=>{throw this.indicesP=void 0,n})),this.indicesP}async getView(e,n){return this.getUnzoomedView(n)}async _readIndices(e){const{extHeaderOffset:n}=await this.getHeader(e);if(n===0)return[];const A=await this.bbi.read(64,n,e),s=rt(A),r=s.getUint16(2,!0),o=j(s,4);if(r===0)return[];const i=20,a=i*r,c=await this.bbi.read(a,o,e),l=[];for(let g=0;g<r;g+=1){const f=rt(c,g*i),h=f.getInt16(0,!0),u=f.getInt16(2,!0),I=j(f,4),d=f.getInt16(16,!0);l.push({type:h,fieldcount:u,offset:I,field:d})}return l}async searchExtraIndexBlocks(e,n={}){const A=await this.readIndices(n);if(A.length===0)return[];const s=A.map(async o=>{const{offset:i,field:a}=o,c=await this.bbi.read(32,i,n),l=rt(c),g=l.getInt32(4,!0),f=l.getInt32(8,!0),h=l.getInt32(12,!0);return $o(this.bbi,i+32,g,f,h,e,a,n)});return(await Promise.all(s)).flat()}async searchExtraIndex(e,n={}){const A=await this.searchExtraIndexBlocks(e,n);if(A.length===0)return[];const s=await this.getUnzoomedView(n),r=new Map;for(const i of A){const a=i.field??0,c=r.get(a);c?c.set(i.offset,i):r.set(a,new Map([[i.offset,i]]))}return(await Promise.all([...r].map(async([i,a])=>(await s.readFeatures([...a.values()],n)).map(l=>({...l,field:i}))))).flat().filter(i=>i.rest?Hc(i.rest,i.field-3)===e:!1)}}const Wc=["exact","case","decorated","prefix","padded","roman","organelle","accession","version"],zs=new Set(["gi","gb","ref","emb","dbj","tpg","tpe","tpd","lcl","pir","prf","sp","tr","pdb","ena","bbs"]);function ss(t){let e=t.trim().split(/\s+/)[0]??"";if(e=e.replace(/[,;]+$/,""),e.includes("|")){const n=e.split("|").filter(A=>A!=="");if(n.some(A=>zs.has(A.toLowerCase()))){const A=n.filter((s,r)=>zs.has(s.toLowerCase())?!1:!(/^[0-9]+$/.test(s)&&r>0&&n[r-1].toLowerCase()==="gi"));A.length>0&&(e=A[A.length-1])}}return e}const Yo=/^(?:chromosome|chrom|chr)[ _.-]?/i;function _o(t){const e=t.replace(Yo,"");if(e===""||e===t)return null;const n=e.toLowerCase();return/^[0-9]/.test(e)||mn.has(n)||En.has(n)||Tn(e)>0||/^un[_.-]/i.test(e)||/^[A-Za-z]{1,2}[0-9]/.test(e)||qo.test(e)||Ho.test(e.replace(/\.[0-9]+$/,""))?e:null}const Pc=/^(?:lg|linkage_?group|group)[ _.-]?(?=[0-9])/i,Ko=/_(random|alt|fix|hap\d+|maternal|paternal)$/i,zc=/(?:^|[_.-])([A-Z]{2}[0-9]{5,6})v([0-9]+)(?:$|[_.-])/,qo=/^(N[CGTWZ]|AC)_([0-9]{5,})$/i,Ho=/^[A-Z]{1,6}[0-9]{5,8}$/,Xc=[["mito",["m","mt","mtdna","mito","mitochondrion","mitochondria","mitochondrial","mitochondrion_genome","dmel_mitochondrion_genome","mitochondrial_genome","mitochondrion_dna","chrmt","nc_012920","j01415","nc_001224","nc_005089"]],["plastid",["c","pt","cp","chloroplast","plastid","chloroplast_genome","chrc","nc_000932"]],["2micron",["2-micron","2micron","2u","2-micron_plasmid","nc_001398"]]],En=new Map;for(const[t,e]of Xc)for(const n of e)En.set(n,t);const mn=new Set(["x","y","z","w"]),Vc=/^(XL|L|X{0,3})(IX|IV|V?I{0,3})$/i,Zc={"":0,x:10,xx:20,xxx:30,xl:40,l:50},jc={"":0,i:1,ii:2,iii:3,iv:4,v:5,vi:6,vii:7,viii:8,ix:9};function Tn(t){const e=Vc.exec(t);if(e===null)return 0;const n=Zc[e[1].toLowerCase()],A=jc[e[2].toLowerCase()];return n===void 0||A===void 0?0:n+A}const tl=[{from:1,to:22,first:1,tail:["x","y"]},{from:67,to:85,first:1,tail:["x","y"]}];function el(t){for(const e of tl){if(t>=e.from&&t<=e.to)return String(e.first+(t-e.from));const n=t-e.to-1;if(n>=0&&n<e.tail.length)return e.tail[n]}return null}const QA=200;function nl(t){return t.length<2||mn.has(t.toLowerCase())?!1:Tn(t)>0}function Wo(t){const e=t.map(a=>Po(a)),A=e.filter(a=>nl(a)).length>=2,s=e.filter(a=>/^[0-9]+$/.test(a)&&Number(a)>=1&&Number(a)<=QA),r=s.length<QA,o=a=>e.some(c=>c.toLowerCase()===a),i=r&&s.length>=2;return{roman:A,ordinals:r,xIsTen:A&&!i&&(o("ix")||o("xi"))}}function Po(t){const e=ss(t);return(_o(e)??e).replace(Ko,"")}function gn(t,e){const n=[],A=ss(t);A!==t.trim()&&n.push("decorated");const s=_o(A),r=s??A;s!==null&&n.push("prefix");const o=Ko.exec(r),i=o===null?r:r.slice(0,o.index),a=o===null?"":`+${o[1].toLowerCase()}`,c=i.toLowerCase(),l=zc.exec(r);if(l!==null)return n.push("accession"),{key:`acc:${l[1].toLowerCase()}`,via:n,version:l[2],opaque:!1};const g=/^(.*?)\.([0-9]+)$/.exec(i),f=g===null?i:g[1],h=g===null?null:g[2],u=En.get(c)??En.get(f.toLowerCase());if(u!==void 0)return u!==c&&n.push("organelle"),{key:`org:${u}`,via:n,version:h,opaque:!1};const I=qo.exec(f);if(I!==null){n.push("accession");const B=I[1].toLowerCase()==="nc"?el(Number(I[2])):null;return B!==null?{key:mn.has(B)?`sex:${B}${a}`:`num:${B}${a}`,via:n,version:h,opaque:!1}:{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1}}if(Ho.test(f))return n.push("accession"),{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1};if(/^[0-9]+$/.test(i)&&e.ordinals&&Number(i)<=QA)return/^0[0-9]/.test(i)&&n.push("padded"),{key:`num:${Number(i)}${a}`,via:n,version:null,opaque:!1};const d=/^([0-9]{1,2})([a-z]{1,2})$/i.exec(i);if(d!==null&&e.ordinals)return d[1].startsWith("0")&&n.push("padded"),{key:`num:${Number(d[1])}${d[2].toLowerCase()}${a}`,via:n,version:null,opaque:!1};const C=Pc.exec(i);if(C!==null){const B=i.slice(C[0].length);if(/^[0-9]+$/.test(B))return/^0[0-9]/.test(B)&&n.push("padded"),{key:`lg:${Number(B)}${a}`,via:n,version:null,opaque:!1}}if(mn.has(c)&&!(c==="x"&&e.xIsTen))return{key:`sex:${c}${a}`,via:n,version:null,opaque:!1};if(e.roman){const B=Tn(i);if(B>0)return n.push("roman"),{key:`num:${B}${a}`,via:n,version:null,opaque:!1}}return{key:`raw:${c}${a}`,via:n,version:null,opaque:!0}}function Ee(t){return Wc.indexOf(t)}function Al(t,e){let n="case";for(const A of[...t.via,...e.via])Ee(A)>Ee(n)&&(n=A);return n}function tA(t,e){return t===void 0||e===void 0||t<=0||e<=0?"unknown":t===e?"agree":"differ"}const Xs=new WeakMap;class St{names;context;styleCache=null;get style(){return this.styleCache??=rl(this.names,this.context),this.styleCache}exact=new Map;folded=new Map;keyed=new Map;constructor(e){this.names=e.map(n=>n.name),this.context=Wo(this.names);for(const n of e){this.exact.has(n.name)||this.exact.set(n.name,n),Vs(this.folded,n.name.toLowerCase(),n);const A=gn(n.name,this.context);Vs(this.keyed,A.key,{sequence:n,canon:A})}}static of(e){return new St(e)}static ofNames(e){return new St(e.map(n=>({name:n})))}static for(e){const n=Xs.get(e);if(n!==void 0)return n;const A=typeof e[0]=="string"?St.ofNames(e):St.of(e);return Xs.set(e,A),A}has(e){return this.exact.has(e)}find(e,n={}){const{length:A}=n,s=this.exact.get(e);if(s!==void 0)return{name:s.name,asked:e,tier:"exact",lengths:tA(A,s.length)};const r=this.folded.get(e.toLowerCase());if(r!==void 0&&r.length===1)return{name:r[0].name,asked:e,tier:"case",lengths:tA(A,r[0].length)};const o=n.from??this.context,i=this.byKey(e,gn(e,o),A);if(i!==null)return i;if(!o.roman){const a=Po(e).toLowerCase();if(a!=="x"&&a!=="l"&&Tn(a)>0)return this.byKey(e,gn(e,{...o,roman:!0,xIsTen:!1}),A)}return null}byKey(e,n,A){const s=this.keyed.get(n.key);if(s===void 0||s.length===0)return null;const r=sl(s,A);if(r===null)return null;const o=Al(n,r.canon),i=n.version!==null&&r.canon.version!==null&&n.version!==r.canon.version;return{name:r.sequence.name,asked:e,tier:i&&Ee(o)<Ee("version")?"version":o,lengths:tA(A,r.sequence.length)}}}function sl(t,e){if(t.length===1)return t[0];if(e===void 0||e<=0)return null;const n=t.filter(A=>A.sequence.length===e);return n.length===1?n[0]:null}function Vs(t,e,n){const A=t.get(e);A===void 0?t.set(e,[n]):A.push(n)}function rl(t,e=Wo(t)){if(t.length===0)return"empty";let n=0,A=0,s=0,r=0;for(const i of t){const a=gn(i,e);if(a.opaque){r++;continue}a.via.includes("accession")?s++:Yo.test(ss(i))?n++:A++}const o=n+A+s;return o===0||r>o*4?"assembly":e.roman&&n<=A?"roman":s>n&&s>A?"accession":n>0&&A>0?"mixed":n>0?e.roman?"roman":"ucsc":e.roman?"roman":"ensembl"}function ol(t,e){const n=St.of(e),A=St.of(t).context,s=[];for(const g of t){const f=n.find(g.name,{length:g.length,from:A});f!==null&&s.push({source:g,match:f})}s.sort((g,f)=>Ee(g.match.tier)-Ee(f.match.tier));const r=new Map,o=new Set;for(const g of s){const f=r.get(g.match.name);f===void 0?r.set(g.match.name,{source:g.source.name,tier:g.match.tier}):f.tier===g.match.tier&&o.add(g.match.name)}const i=new Map,a=[];let c=0;for(const g of s){const f=r.get(g.match.name);f===void 0||f.source!==g.source.name||o.has(g.match.name)||(i.set(g.source.name,g.match),g.match.tier!=="exact"&&c++,g.match.lengths==="differ"&&a.push(g.match))}const l=t.map(g=>g.name).filter(g=>!i.has(g));return{pairs:i,unmatched:l,contested:a,renamed:c}}function pe(t,e){const n=ol(t,e),A=new Map,s=t.map(r=>{const o=n.pairs.get(r.name);return o===void 0?r.name:(A.set(o.name,r.name),o.name)});for(const r of t)A.has(r.name)||A.set(r.name,r.name);return{names:s,sourceOf:A,renamed:n.renamed,contested:n.contested}}function il(t){return t.map(e=>({name:e}))}function Kt(t,e){const n=al(t),A=n.get(e);if(A!==void 0)return A;const s=St.for(t).find(e);return s===null?-1:n.get(s.name)??-1}const Zs=new WeakMap;function al(t){const e=Zs.get(t);if(e!==void 0)return e;const n=new Map;return t.forEach((A,s)=>{const r=typeof A=="string"?A:A.name;n.has(r)||n.set(r,s)}),Zs.set(t,n),n}class Rt extends Error{code;detail;constructor(e,n,A={}){super(n),this.name="ViewerError",this.code=e,this.detail=A}}const eA=new Intl.NumberFormat(void 0,{maximumFractionDigits:0}),cl=new Intl.NumberFormat(void 0,{maximumFractionDigits:3}),ll=new Intl.NumberFormat(void 0,{maximumSignificantDigits:3}),js=new Map,gl=new Intl.NumberFormat("en-US",{maximumFractionDigits:0}),G={int(t){return Number.isFinite(t)?eA.format(t):"—"},num(t){if(!Number.isFinite(t))return"—";if(Number.isInteger(t))return eA.format(t);const e=Math.abs(t);return e>=.001?cl.format(t):e>=1e-7?ll.format(t):t.toExponential(2)},fixed(t,e){if(!Number.isFinite(t))return"—";let n=js.get(e);return n===void 0&&(n=new Intl.NumberFormat(void 0,{minimumFractionDigits:e,maximumFractionDigits:e}),js.set(e,n)),n.format(t)},pct(t,e=1){return Number.isFinite(t)?`${(t*100).toFixed(e)}%`:"—"},pos(t){return Number.isFinite(t)?gl.format(Math.round(t)):"—"},bp(t){return Number.isFinite(t)?Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)} Mb`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(1)} kb`:`${eA.format(t)} bp`:"—"},bytes(t){if(!Number.isFinite(t))return"—";const e=["B","kB","MB","GB","TB"];let n=t,A=0;for(;n>=1e3&&A<e.length-1;)n/=1e3,A++;return`${A===0?n:n.toFixed(1)} ${e[A]}`}};function fl(t){return!Number.isFinite(t)||t<=0?"—":t>=1e6?`${nA(t/1e6)} Mb`:t>=1e3?`${nA(t/1e3)} kb`:`${nA(t)} bp`}function nA(t){return String(Number(t.toFixed(2)))}function nt(t,e){const n=ul(t),A=Il(n,e);if(A===null)return n;throw new Rt("format",`The ${e.field} of this ${e.format} reads ${EA(t)}, ${A.reason}. `+de,{format:e.format,field:e.field,value:typeof t=="bigint"?t.toString():t,ceiling:e.ceiling,...e.available===void 0?{}:{available:e.available},...A.most===void 0?{}:{most:A.most}})}function rs(t,e,n){const A={format:n.format,field:n.field,offset:t,length:e,size:n.size};if(!BA(t)||!BA(e))throw new Rt("format",`The ${n.field} of this ${n.format} points at ${EA(e)} bytes from byte ${EA(t)}, which is not a place in a file. ${de}`,A);if(n.ceiling!==void 0&&e>n.ceiling)throw new Rt("format",`The ${n.field} of this ${n.format} is ${G.int(e)} bytes long, more than the ${G.int(n.ceiling)} any real one holds. ${de}`,{...A,ceiling:n.ceiling});if(t+e>n.size)throw new Rt("format",`The ${n.field} of this ${n.format} points at bytes ${G.int(t)} to ${G.int(t+e)}, past the end of a file of ${G.int(n.size)}. ${de}`,A)}const tr=65536,zo=2**29;async function os(t,e){if(typeof DecompressionStream>"u")throw new Rt("unsupported",`Reading a ${e.format} needs DecompressionStream, which this runtime does not have. Every browser since 2023 has it; a very old one does not.`,{format:e.format});const n=new DecompressionStream(e.encoding),A=n.writable.getWriter(),s=n.readable.getReader(),r=[];let o=0,i=!1;const a=(async()=>{for(;;){const{done:I,value:d}=await s.read();if(I)return;if(o+=d.byteLength,o>e.maxBytes){i=!0,await s.cancel();return}r.push(d)}})(),c=(async()=>{for(let I=0;I<t.byteLength;I+=tr){if(i)return;const d=t.subarray(I,Math.min(I+tr,t.byteLength));await A.write(d)}i||await A.close()})(),[l,g]=await Promise.allSettled([a,c]);if(i)throw Xo(e,e.maxBytes,t.byteLength);const f=l.status==="rejected"?l.reason:g.status==="rejected"?g.reason:null;if(f!==null){const I=f instanceof Error?f.message:String(f);throw new Rt("format",`The ${e.field} of this ${e.format} does not inflate (${I.replace(/\.$/,"")}). ${de}`,{format:e.format,field:e.field})}if(r.length===1)return r[0];const h=new Uint8Array(o);let u=0;for(const I of r)h.set(I,u),u+=I.length;return h}function hl(t,e){return Math.min(e.ceiling,Math.max(e.floor,Math.ceil(t*e.ratio)))}function Xo(t,e,n){return new Rt("format",`The ${t.field} of this ${t.format} inflates to more than ${G.bytes(e)}, past what any real one holds. ${de}`,{format:t.format,field:t.field,maxBytes:e,compressed:n})}const de="The file is truncated, corrupt, or not the format its first bytes claim.";function ul(t){return typeof t=="number"?t:t>=BigInt(Number.MIN_SAFE_INTEGER)&&t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):Number.NaN}function BA(t){return Number.isSafeInteger(t)&&t>=0}function Il(t,e){if(!BA(t))return{reason:"which is not a count"};if(t>e.ceiling)return{reason:`more than the ${G.int(e.ceiling)} any real one declares`};if(e.available!==void 0){const n=Math.floor(Math.max(0,e.available)/Math.max(1,e.bytesPerItem??1));if(t>n){const A=Math.max(0,e.available);return{reason:`and the ${G.int(A)} byte${A===1?"":"s"} after it could hold at most ${G.int(n)}`,most:n}}}return null}function EA(t){return typeof t=="bigint"?t.toString():Number.isSafeInteger(t)?G.int(t):String(t)}const dl=65536;async function Cl(t){return t.length===0?t:os(t,{format:"BGZF file",field:"member",encoding:"deflate-raw",maxBytes:dl})}const is=12,Et=65536;function We(t){return t.length<is||t[0]!==31||t[1]!==139||t[2]!==8||(t[3]&4)===0?!1:ye(t)!==null}function ye(t){if(t.length<is)return null;const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint16(10,!0);let A=12;const s=Math.min(12+n,t.length);for(;A+4<=s;){const r=t[A],o=t[A+1],i=e.getUint16(A+2,!0);if(r===66&&o===67&&i===2)return e.getUint16(A+4,!0)+1;A+=4+i}return null}const Ql=Cl;async function Yt(t,e=Number.POSITIVE_INFINITY,n=zo){const A=[];let s=0,r=0;for(;r+is<=t.length;){const a=r,c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const g=new DataView(t.buffer,t.byteOffset+r,c).getUint16(10,!0),f=r+12+g,h=r+c-8;if(h>f){const u=await Ql(t.subarray(f,h));if(u.length>0){if(s+u.length>n)throw Xo({format:"BGZF file",field:"span read"},n,t.length);A.push(u),s+=u.length}}if(r+=c,a>=e)break}const o=new Uint8Array(s);let i=0;for(const a of A)o.set(a,i),i+=a.length;return o}function Bl(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<36||t[0]!==84||t[1]!==66||t[2]!==73||t[3]!==1)throw new Error("This is not a tabix index: the magic bytes are not TBI\\1.");const n=e.getInt32(4,!0),A=e.getInt32(8,!0),s=String.fromCharCode(e.getInt32(24,!0)),r=e.getInt32(28,!0),o=e.getInt32(32,!0),i=[],a=new TextDecoder().decode(t.subarray(36,36+o));for(const g of a.split("\0"))g!==""&&i.push(g);let c=36+o;const l=new Map;for(let g=0;g<n;g++){const f=e.getInt32(c,!0);c+=4;let h=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY;for(let d=0;d<f;d++){c+=4;const C=e.getInt32(c,!0);c+=4;for(let B=0;B<C;B++){const Q=Number(e.getBigUint64(c,!0)>>16n),E=Number(e.getBigUint64(c+8,!0)>>16n);c+=16,Q<h&&(h=Q),E>u&&(u=E)}}const I=e.getInt32(c,!0);c+=4;for(let d=0;d<I;d++){const C=Number(e.getBigUint64(c,!0)>>16n);c+=8,C>0&&C<h&&(h=C)}Number.isFinite(h)&&Number.isFinite(u)&&g<i.length&&l.set(i[g],{from:h,to:u})}return{names:i,spans:l,format:A,meta:s,skip:r}}function El(t,e,n){const A=[];for(const r of e){const o=t.spans.get(r);o!==void 0&&A.push({from:o.from,to:Math.min(n,o.to+Et),lastBlock:o.to})}A.sort((r,o)=>r.from-o.from);const s=[];for(const r of A){const o=s[s.length-1];o!==void 0&&r.from<=o.to+(1<<20)?(o.to=Math.max(o.to,r.to),o.lastBlock=Math.max(o.lastBlock,r.lastBlock)):s.push({...r})}return s}function ml(t,e){if(e.length===0)return t.names;const n=St.ofNames(t.names),A=new Set;for(const s of e){const r=n.find(s);r!==null&&A.add(r.name)}return A.size===0?t.names:[...A]}class et{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s={}){const r=Math.min(n,A),o=Math.max(r+1,Math.max(n,A));this.rows.push({contig:this.contigId(e),start:r,end:o,strand:s.strand??0,score:s.score??Number.NaN,name:s.name??"",id:s.id??"",detail:s.detail??"",exons:s.exons??null,cds:s.cds??null,bars:s.bars??null,xyz:s.xyz??null,hap:s.hap??0})}get length(){return this.rows.length}finish(e=null,n=null){const A=this.rows;A.sort((h,u)=>h.contig-u.contig||h.start-u.start||h.end-u.end||h.hap-u.hap);const s=A.length,r={contigs:this.contigs,length:s,contig:new Int32Array(s),start:new Int32Array(s),end:new Int32Array(s),strand:new Int8Array(s),score:new Float32Array(s),name:new Array(s),id:new Array(s),detail:new Array(s),exonAt:new Int32Array(s+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(s),cdsEnd:new Int32Array(s),contigAt:new Int32Array(this.contigs.length+1),maxSpan:new Int32Array(this.contigs.length)};let o=0;for(const h of A)o+=h.exons===null?0:h.exons.length>>1;r.exonStart=new Int32Array(o),r.exonEnd=new Int32Array(o);const i=e===null?0:e.labels.length,a=new Float32Array(i*s).fill(Number.NaN);let c=0;const l=n===null?null:{x:new Float32Array(s),y:new Float32Array(s),z:new Float32Array(s),hap:new Int8Array(s)};let g=0;for(let h=0;h<s;h++){const u=A[h];if(r.contig[h]=u.contig,r.start[h]=u.start,r.end[h]=u.end,r.strand[h]=u.strand,r.score[h]=u.score,r.name[h]=u.name,r.id[h]=u.id,r.detail[h]=u.detail,r.cdsStart[h]=u.cds===null?-1:u.cds[0],r.cdsEnd[h]=u.cds===null?-1:u.cds[1],r.exonAt[h]=g,u.exons!==null){const d=[];for(let C=0;C+1<u.exons.length;C+=2)d.push([u.exons[C],u.exons[C+1]]);d.sort((C,B)=>C[0]-B[0]);for(const[C,B]of d)r.exonStart[g]=C,r.exonEnd[g]=B,g++}if(i>0&&u.bars!==null&&u.bars.length===i)for(let d=0;d<i;d++){const C=u.bars[d];a[h*i+d]=C,C>c&&(c=C)}l!==null&&(l.x[h]=u.xyz===null?Number.NaN:u.xyz[0],l.y[h]=u.xyz===null?Number.NaN:u.xyz[1],l.z[h]=u.xyz===null?Number.NaN:u.xyz[2],l.hap[h]=u.hap);const I=u.end-u.start;I>r.maxSpan[u.contig]&&(r.maxSpan[u.contig]=I)}r.exonAt[s]=g;let f=0;for(let h=0;h<this.contigs.length;h++)for(r.contigAt[h]=f;f<s&&r.contig[f]===h;)f++;if(r.contigAt[this.contigs.length]=f,e!==null){const{limit:h,...u}=e;r.bars={...u,values:a,max:Number.isFinite(h)&&h>0?h:c}}return l!==null&&n!==null&&(r.model={...l,haplotypes:[...n.haplotypes],width:n.width}),r}}function wl(t,e,n=4){const A=new Set(t),s=new Set(e),r=e.filter(i=>!A.has(i)),o=t.filter(i=>!s.has(i));return{matched:e.length-r.length,total:e.length,missing:r.slice(0,n),extra:o.slice(0,n)}}class Jn{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s,r,o,i={}){this.rows.push({c1:this.contigId(e),s1:n,e1:Math.max(n+1,A),c2:this.contigId(s),s2:r,e2:Math.max(r+1,o),score:i.score??Number.NaN,name:i.name??"",detail:i.detail??""})}get length(){return this.rows.length}finish(){const e=this.rows.length,n={contigs:this.contigs,length:e,contig1:new Int32Array(e),start1:new Int32Array(e),end1:new Int32Array(e),contig2:new Int32Array(e),start2:new Int32Array(e),end2:new Int32Array(e),score:new Float32Array(e),name:new Array(e),detail:new Array(e)};for(let A=0;A<e;A++){const s=this.rows[A];n.contig1[A]=s.c1,n.start1[A]=s.s1,n.end1[A]=s.e1,n.contig2[A]=s.c2,n.start2[A]=s.s2,n.end2[A]=s.e2,n.score[A]=s.score,n.name[A]=s.name,n.detail[A]=s.detail}return n}}const Me=256,pl=["#FFFEF9","#FCF9CE","#FFF2A9","#FDE188","#FFCA67","#FAAA4B","#F78E40","#F15C34","#ED3024","#D42027","#B01F29","#7A1128","#1A0A10"],yl=["#FFFFFF","#FFF5F0","#FEE0D2","#FCBBA1","#FC9272","#FB6A4A","#EF3B2C","#CB181D","#A50F15","#67000D"],Nl=["#053061","#2166AC","#4393C3","#92C5DE","#D1E5F0","#F7F7F7","#FDDBC7","#F4A582","#D6604D","#B2182B","#67001F"],kl=["#1659b1","#487BA8","#819EC8","#D1E6F1","#FFFFFF","#FAC1C1","#F1606C","#EE222A"],bl=[0,.125,.25,.375,.5,2/3,5/6,1],Ml=["#00004D","#0000FF","#FFFFFF","#FF0000","#800000"];function De(t,e,n){const A=t.map(i=>[Number.parseInt(i.slice(1,3),16),Number.parseInt(i.slice(3,5),16),Number.parseInt(i.slice(5,7),16)]),s=A.length-1,r=n??A.map((i,a)=>a/s),o=new Array(e*3);for(let i=0;i<e;i++){const a=i/(e-1);let c=0;for(;c<s-1&&a>=r[c+1];)c++;const l=r[c+1]-r[c],g=l>0?(a-r[c])/l:0;for(let f=0;f<3;f++)o[i*3+f]=Math.round(A[c][f]+(A[c+1][f]-A[c][f])*g)}return o}De(pl,Me),De(yl,Me),De(Nl,Me),De(kl,Me,bl),De(Ml,Me);const Dl="RdBu_r";(()=>{const t=new Int8Array(256).fill(-1),e=(n,A)=>{for(const s of n)t[s.charCodeAt(0)]=A,t[s.toLowerCase().charCodeAt(0)]=A};return e("TU",0),e("C",1),e("A",2),e("G",3),t})();const er=[66,65,77,1],fn=32,At={PAIRED:1,PROPER_PAIR:2,UNMAPPED:4,MATE_UNMAPPED:8,REVERSE:16,FIRST_IN_PAIR:64,SECOND_IN_PAIR:128,SECONDARY:256,QC_FAIL:512,DUPLICATE:1024,SUPPLEMENTARY:2048};function as(t,e,n,A){const s={c:1,C:1,s:2,S:2,i:4,I:4,f:4,A:1};if(n==="Z"||n==="H"){let o=e;for(;o<A&&t[o]!==0;)o++;return o+1}if(n==="B"){const o=String.fromCharCode(t[e]),i=new DataView(t.buffer,t.byteOffset,t.byteLength).getInt32(e+1,!0),a=s[o];return a===void 0||i<0?-1:e+5+i*a}const r=s[n];return r===void 0?-1:e+r}const Vo=At.UNMAPPED|At.SECONDARY|At.SUPPLEMENTARY|At.QC_FAIL;function Zo(t){return t.length<er.length?!1:er.every((e,n)=>t[n]===e)}function Fl(t){if(!Zo(t))throw new Error("This is not a BAM: the first four bytes are not BAM\\1.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<8)return null;const n=e.getInt32(4,!0);if(n<0)throw new Error("This BAM header declares a negative length.");let A=8+n;if(t.length<A+4)return null;const s=new TextDecoder().decode(t.subarray(8,A)),r=e.getInt32(A,!0);if(A+=4,r<0)throw new Error("This BAM header declares a negative reference count.");const o=[];for(let i=0;i<r;i++){if(t.length<A+4)return null;const a=e.getInt32(A,!0);if(A+=4,a<0)throw new Error("This BAM header declares a negative name length.");if(t.length<A+a+4)return null;const c=new TextDecoder().decode(t.subarray(A,A+a-1));A+=a;const l=e.getInt32(A,!0);A+=4,o.push({name:c,length:l})}return{text:s,refs:o,sortOrder:Sl(s),recordsFrom:A}}function Sl(t){for(const e of t.split(`
|
|
2
|
+
`))if(e.startsWith("@HD"))for(const n of e.split(" ")){if(!n.startsWith("SO:"))continue;const A=n.slice(3).trim();return A==="coordinate"||A==="queryname"||A==="unsorted"?A:"unknown"}return"unknown"}const Rl=[!0,!1,!0,!0,!1,!1,!1,!0,!0],Ll=[!0,!0,!1,!1,!0,!1,!1,!0,!0];function mt(t){return Rl[t]===!0}function Ot(t){return Ll[t]===!0}function jo(t,e,n){let A=0;for(let s=0;s<n;s++){const r=t.getUint32(e+s*4,!0);mt(r&15)&&(A+=r>>>4)}return A}function wn(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s={at:0,bytes:0,refId:-1,pos:-1,end:-1,mapq:0,flag:0,nameBytes:0,cigarOps:0,cigarAt:0,seqLength:0,seqAt:0,nextRefId:-1,nextPos:-1,tlen:0};let r=e;for(;r+4<=t.length;){const o=A.getInt32(r,!0);if(o<=0)break;const i=r+4;if(i+o>t.length||o<fn)break;const a=A.getUint8(i+8),c=A.getUint16(i+12,!0),l=i+fn+a,g=A.getInt32(i+16,!0),f=A.getInt32(i+4,!0),h=fn+a+c*4+Math.ceil(g/2)+g;if(g<0||h>o)break;if(s.at=i,s.bytes=o+4,s.refId=A.getInt32(i,!0),s.pos=f,s.mapq=A.getUint8(i+9),s.flag=A.getUint16(i+14,!0),s.nameBytes=a,s.cigarOps=c,s.cigarAt=l,s.seqLength=g,s.seqAt=l+c*4,s.nextRefId=A.getInt32(i+20,!0),s.nextPos=A.getInt32(i+24,!0),s.tlen=A.getInt32(i+28,!0),s.end=f<0?f:f+jo(A,l,c),n(s)===!1)return;r+=4+o}}function xl(t,e){const n=e.at+fn;return new TextDecoder().decode(t.subarray(n,n+e.nameBytes-1))}const cs="=ACMGRSVTWYHKDBN";function Gl(t,e,n){let A="";for(let s=0;s<n;s++){const r=t[e+(s>>1)];A+=cs[s%2===0?r>>4:r&15]}return A}function vl(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s={};let r=e;for(;r+3<=n;){const o=String.fromCharCode(t[r],t[r+1]),i=String.fromCharCode(t[r+2]);if(r+=3,i==="B"){const c=String.fromCharCode(t[r]),l=A.getInt32(r+1,!0);r+=5;const g=nr[c];if(g===void 0||l<0||r+l*g>n)return s;const f=[];for(let h=0;h<l;h++)f.push(Ar(A,r+h*g,c));r+=l*g,s[o]=f;continue}if(i==="Z"||i==="H"){let c=r;for(;c<n&&t[c]!==0;)c++;s[o]=new TextDecoder().decode(t.subarray(r,c)),r=c+1;continue}if(i==="A"){s[o]=String.fromCharCode(t[r]),r+=1;continue}const a=nr[i];if(a===void 0)return s;s[o]=Ar(A,r,i),r+=a}return s}const nr={c:1,C:1,s:2,S:2,i:4,I:4,f:4};function Ar(t,e,n){switch(n){case"c":return t.getInt8(e);case"C":return t.getUint8(e);case"s":return t.getInt16(e,!0);case"S":return t.getUint16(e,!0);case"i":return t.getInt32(e,!0);case"I":return t.getUint32(e,!0);case"f":return t.getFloat32(e,!0);default:return 0}}function Pe(t,e){if(e.cigarOps!==2)return null;const n=new DataView(t.buffer,t.byteOffset,t.byteLength),A=n.getUint32(e.cigarAt,!0),s=n.getUint32(e.cigarAt+4,!0);if((A&15)!==4||A>>>4!==e.seqLength||(s&15)!==3)return null;const r=e.seqAt+(e.seqLength+1>>1),i=vl(t,r+e.seqLength,e.at+e.bytes-4).CG;return Array.isArray(i)?Uint32Array.from(i):null}const Ul=/^([ACGTUN])([-+])([A-Za-z]+|\d+)([.?]?)((?:,\d+)*),?$/;function Tl(t){const e=[];for(const n of t.split(";")){const A=n.trim();if(A==="")continue;const s=Ul.exec(A);if(s===null)return null;const[,r,o,i,a,c]=s,l=/^\d+$/.test(i)?[i]:[...i],g=c===""?[]:c.slice(1).split(",").map(Number);e.push({base:r==="U"?"T":r,strand:o,codes:l,mode:a==="?"?"explicit":"implicit",skips:g})}return e}const Jl={A:"T",C:"G",G:"C",T:"A",U:"A",N:"N",M:"K",K:"M",R:"Y",Y:"R",S:"S",W:"W",B:"V",V:"B",D:"H",H:"D"};function $l(t){let e="";for(let n=t.length-1;n>=0;n--){const A=t[n].toUpperCase();e+=Jl[A]??"N"}return e}function Ol(t,e,n,A){const s=Tl(n);if(s===null||t.length===0)return[];const r=e?$l(t):t.toUpperCase(),o=r.length,i=l=>e?o-1-l:l,a=[];let c=0;for(const l of s){const g=l.skips.length*l.codes.length;if(A!==null&&c+g>A.length)return[];const f=u=>l.base==="N"||u===l.base;let h=0;for(let u=0;u<l.skips.length;u++){let I=l.skips[u];for(;h<o;){if(f(r[h])){if(I===0)break;if(l.mode==="implicit")for(const d of l.codes)a.push({query:i(h),code:d,prob:0,implicit:!0});I--}h++}if(h>=o)return[];for(let d=0;d<l.codes.length;d++){const C=A===null?255:A[c+u*l.codes.length+d];a.push({query:i(h),code:l.codes[d],prob:C,implicit:!1})}h++}if(l.mode==="implicit"){for(;h<o;h++)if(f(r[h]))for(const u of l.codes)a.push({query:i(h),code:u,prob:0,implicit:!0})}c+=g}return a.sort((l,g)=>l.query-g.query),a}function Yl(t,e,n){const A=new Int32Array(n).fill(-1);let s=e,r=0;for(let o=0;o<t.length;o++){const i=t[o]&15,a=t[o]>>>4,c=mt(i),l=Ot(i);if(c&&l)for(let g=0;g<a&&r+g<n;g++)A[r+g]=s+g;c&&(s+=a),l&&(r+=a)}return A}function _l(t,e,n,A){if(t.length===0)return[];const s=Yl(e,n,A),r=[];for(const o of t){const i=s[o.query];i===void 0||i<0||r.push({pos:i,code:o.code,prob:o.prob,implicit:o.implicit})}return r.sort((o,i)=>o.pos-i.pos),r}function Kl(t,e){const n={mm:null,ml:null,mn:null},A=new DataView(t.buffer,t.byteOffset,t.byteLength);let s=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const r=e.at+e.bytes-4;for(;s+3<=r;){const o=t[s],i=t[s+1],a=String.fromCharCode(t[s+2]);if(s+=3,o===77)if((i===77||i===109)&&a==="Z"){let c=s;for(;c<r&&t[c]!==0;)c++;n.mm=new TextDecoder().decode(t.subarray(s,c))}else if((i===76||i===108)&&a==="B"&&t[s]===67){const c=A.getInt32(s+1,!0);c>=0&&s+5+c<=r&&(n.ml=t.slice(s+5,s+5+c))}else i===78&&"cCsSiI".includes(a)&&(n.mn=ql(A,s,a));if(s=as(t,s,a,r),s<0)break}return n}function ql(t,e,n){switch(n){case"c":return t.getInt8(e);case"C":return t.getUint8(e);case"s":return t.getInt16(e,!0);case"S":return t.getUint16(e,!0);case"i":return t.getInt32(e,!0);default:return t.getUint32(e,!0)}}function ti(t,e,n=null){if(e.seqLength<=0)return[];const A=Kl(t,e);if(A.mm===null||A.mm==="")return[];if(A.mn!==null&&A.mn!==e.seqLength)return[];const s=Gl(t,e.seqAt,e.seqLength),r=Ol(s,(e.flag&16)!==0,A.mm,A.ml);return r.length===0?[]:_l(r,n??Hl(t,e),e.pos,e.seqLength)}function Hl(t,e){const n=Pe(t,e);if(n!==null)return n;const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=new Uint32Array(e.cigarOps);for(let r=0;r<e.cigarOps;r++)s[r]=A.getUint32(e.cigarAt+r*4,!0);return s}function Wl(t){return(t+.5)/256}function Pl(t,e){const n=Wl(t);return n>=e?1:n<=1-e?0:-1}const zl={m:"5mC",h:"5hmC",f:"5fC",c:"5caC",C:"any C mod",g:"5hmU",e:"5fU",b:"5caU",T:"any T mod",U:"any U mod",a:"6mA",A:"any A mod",o:"8oxoG",G:"any G mod",n:"Xao",N:"any mod",21839:"4mC",17802:"pseU",17596:"inosine",27551:"5mC",76792:"5hmC",28871:"6mA"};function Xl(t){return zl[t]??(/^\d+$/.test(t)?`ChEBI:${t}`:t)}const ct=" · ";function ei(t){let e=0,n=0;const A=t.length;for(;n<A&&e<Vl;){let s=t.indexOf(`
|
|
3
|
+
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o==="")continue;if(o.startsWith("##")){if(/^##fileformat=VCF/i.test(o))return!0;continue}if(o.startsWith("#")){if(/^#CHROM\s+POS\s+ID\s+REF\s+ALT/i.test(o))return!0;continue}const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(!Zl(i))return!1;e++}return e>=1}const Vl=4;function ni(t){return t.length<8||!/^\d+$/.test(t[1])?!1:Ai(t[3])&&tg(t[4])}function Zl(t){return ni(t)&&jl(t[5])}function jl(t){return t===void 0?!1:t==="."?!0:t!==""&&Number.isFinite(Number(t))}function Ai(t){return t!==void 0&&/^[ACGTNacgtnRYKMSWBDHVryksmwbdhv]+$/.test(t)}function tg(t){return t===void 0||t===""?!1:t.split(",").every(e=>e==="."||e==="*"||Ai(e)||/^<[^<>]+>$/.test(e)||/[[\]]/.test(e)||/^\.[ACGTNacgtn]+$/.test(e)||/^[ACGTNacgtn]+\.$/.test(e))}function eg(t,e){const n=e.split(",").filter(s=>s!==""&&s!=="."&&s!=="*");if(n.length===0)return"snv";let A=null;for(const s of n){const r=/^<[^<>]+>$/.test(s)||/[[\]]/.test(s)?"structural":s.length===t.length?"snv":s.length>t.length?"insertion":"deletion";if(A===null)A=r;else if(A!==r)return"mixed"}return A??"snv"}function Ce(t,e){if(!(t===""||t===".")){for(const n of t.split(";"))if(n.startsWith(e)){if(n.length===e.length)return"";if(n.charCodeAt(e.length)===61)return n.slice(e.length+1)}}}function pn(t){if(t===void 0||t===""||t===".")return;const e=Number(t);return Number.isFinite(e)?e:void 0}function ng(t,e,n,A){const s=t+Math.max(1,e.length);if(!/<[^<>]+>/.test(n))return s;const r=pn(Ce(A,"END"));if(r!==void 0&&r>t)return r;if(Ag(n,A))return s;const o=sg(A);return o>0?t+o+1:s}function Ag(t,e){return/<INS(:|>)/i.test(t)?!0:/^INS(:|$)/i.test(Ce(e,"SVTYPE")??"")}function sg(t){const e=Ce(t,"SVLEN");if(e===void 0||e==="")return 0;let n=0;for(const A of e.split(",")){const s=pn(A);s!==void 0&&Math.abs(s)>n&&(n=Math.abs(s))}return n}function si(t){const e=new et;let n=0;if(ls(t,s=>{if(s.startsWith("##"))return;if(s.startsWith("#")){const I=mA(s);/^#CHROM$/i.test(I[0]??"")&&Math.max(0,I.length-9);return}const r=mA(s);if(!ni(r)){n++;return}const[o,i,a,c,l,g,f,h]=r,u=Math.max(0,Number(i)-1);e.add(o,u,ng(u,c,l,h??""),{...a===void 0||a==="."||a===""?{}:{name:a,id:a},...pn(g)===void 0?{}:{score:pn(g)},detail:og(c,l,g,f,h??"")})}),e.length===0&&n>0)throw new Error(`No usable rows: all ${n} data lines failed the "contig, position, ID, REF, ALT" test a VCF record begins with.`);return e.finish()}function rg(t){let e=0;return ls(t,n=>{if(!n.startsWith("#"))return!1;if(n.startsWith("##"))return;const A=mA(n);return/^#CHROM$/i.test(A[0]??"")&&(e=Math.max(0,A.length-9)),!1}),e}function og(t,e,n,A,s){const r=[`${t}>${e}`,`type ${eg(t,e)}`];n!==void 0&&n!=="."&&n!==""&&r.push(`QUAL ${n}`),A!==void 0&&A!=="."&&A!==""&&r.push(`filter ${A}`);const o=Ce(s,"AF");o!==void 0&&o!==""&&r.push(`AF ${o}`);const i=Ce(s,"DP");i!==void 0&&i!==""&&r.push(`DP ${i}`);const a=Ce(s,"SVTYPE");return a!==void 0&&a!==""&&r.push(`SVTYPE ${a}`),r.join(ct)}function ls(t,e){let n=0;const A=t.length;for(;n<A;){let s=t.indexOf(`
|
|
4
|
+
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o!==""&&e(o)===!1)return}}function mA(t){return t.includes(" ")?t.split(" "):t.trim().split(/\s+/)}function ig(t){const e=[];return ls(t,n=>{if(!n.startsWith("#"))return!1;if(!n.startsWith("##contig=<"))return;const A=/[<,]ID=([^,>]+)/.exec(n),s=/[<,]length=(\d+)/.exec(n);A===null||s===null||e.push({name:A[1],length:Number(s[1])})}),e}async function gs(t,e=zo){if(!(t.length>2&&t[0]===31&&t[1]===139))return t;if(typeof DecompressionStream>"u")throw new Error("This file is gzipped and this browser has no DecompressionStream to un-gzip it with. Decompress it and drop the plain text file.");return We(t)?Yt(t,Number.POSITIVE_INFINITY,e):os(t,{format:"file",field:"gzip stream",encoding:"gzip",maxBytes:e})}function wt(t,e){let n=0,A=0;const s=t.length;for(;n<s;){let r=t.indexOf(`
|
|
5
|
+
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);n=r+1,A++,!(i===""||i.charCodeAt(0)===35)&&(i.startsWith("track ")||i.startsWith("browser ")||e(i.includes(" ")?i.split(" "):i.trim().split(/\s+/),A))}}function $n(t){let e=null;return wt(t,n=>{e??=n}),e}function R(t){return t!==void 0&&/^[+-]?\d+$/.test(t)}function Wt(t){return t!==void 0&&t!==""&&Number.isFinite(Number(t))}function sr(t){return R(t)&&Number(t)>=0}function ri(t,e=""){const n=fs(t);if(n!==null){const s=n.map(r=>r.trim().toLowerCase());return s.includes("chrom2")||s.includes("chr2")||s.includes("start2")?"bedpe":"bed"}const A=$n(t);return A===null?/\.(gtf|gff3?)(\.b?gz)?$/i.test(e)?"gtf":/\.(bedpe|pairs)(\.b?gz)?$/i.test(e)?"bedpe":"bed":R(A[1])&&R(A[2])?A.length>=6&&!R(A[3])&&R(A[4])&&R(A[5])?"bedpe":"bed":A.length>=8&&R(A[3])&&R(A[4])?"gtf":"bed"}function fs(t){const e=$n(t);return e===null||e.length<3||R(e[1])||R(e[3])?null:e}function Ut(t,e){const n=t.map(A=>A.trim().toLowerCase());for(const A of e){const s=n.indexOf(A);if(s>=0)return s}return-1}function hs(t,e=""){const n=new et,A=fs(t),s=ag(t,e);let r=0,o=!0;if(wt(t,i=>{if(o&&A!==null){o=!1;return}if(o=!1,i.length<3||!R(i[1])||!R(i[2])){r++;return}const a=i[0],c=Number(i[1]),l=Number(i[2]),g=i[3]!==void 0&&i[3]!=="."?i[3]:"",f=oi(i[5]),h=wA(s===null?i[4]:i[ii(s)]),u=cg(i,c,l),I=lg(i,s);n.add(a,c,l,{strand:f,score:h,name:g,detail:gg(i,s),...u===null?{}:{exons:u},...I===null?{}:{cds:I}})}),n.length===0&&r>0)throw new Error(`No usable rows: all ${r} lines failed the "contig, start, end" test that every BED-like format begins with.`);return n.finish()}function ag(t,e){if(/\.narrowpeak(\.b?gz)?$/i.test(e))return"narrow";if(/\.gappedpeak(\.b?gz)?$/i.test(e))return"gapped";if(/\.broadpeak(\.b?gz)?$/i.test(e))return"broad";const n=$n(t);return n===null?null:n.length===10&&Wt(n[6])&&Wt(n[7])&&Wt(n[8])?R(n[9])?"narrow":null:n.length===15&&Wt(n[12])&&Wt(n[13])&&Wt(n[14])?"gapped":n.length!==9||n[8]!==void 0&&n[8].includes(",")?null:[n[6],n[7],n[8]].some(s=>s!==void 0&&Wt(s)&&!R(s))?"broad":null}function oi(t){return t==="+"?1:t==="-"?-1:0}function wA(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}function ii(t){return t==="gapped"?12:6}function cg(t,e,n){if(t.length<12)return null;const A=(t[10]??"").split(",").filter(i=>i!==""),s=(t[11]??"").split(",").filter(i=>i!=="");if(A.length===0||A.length!==s.length||!R(t[9])||Number(t[9])!==A.length||!A.every(sr)||!s.every(sr))return null;const r=A.length-1;if(Number(s[0])!==0||e+Number(s[r])+Number(A[r])!==n)return null;const o=[];for(let i=0;i<A.length;i++){const a=e+Number(s[i]);o.push(a,a+Number(A[i]))}return o}function lg(t,e){if(e==="narrow"||e==="broad"||t.length<8||!R(t[6])||!R(t[7]))return null;const n=Number(t[6]),A=Number(t[7]);return A>n?[n,A]:null}function gg(t,e){if(e===null){const s=t[4];return s===void 0||s===""||s==="."?"":`score ${s}`}const n=ii(e),A=[`signal ${t[n]??"—"}`,`-log10 p ${t[n+1]??"—"}`,`-log10 q ${t[n+2]??"—"}`];return e==="narrow"&&t[9]!==void 0&&t[9]!=="-1"&&A.push(`summit +${t[9]}`),A.join(ct)}function ai(t){const e=new Map,n=new Map,A=new Map,s=[],r=[],o=wg(t);wt(t,l=>{if(l.length<8||!R(l[3])||!R(l[4]))return;const g=l[0],f=l[1]??"",h=(l[2]??"").toLowerCase(),u=Number(l[3])-1,I=Number(l[4]),d=oi(l[6]),C=pg(l[8]??"",o),B=Eg(h,C,o);if(B==="landmark")return;const Q=dg(C,B),E=ci(C,ug),m=C.get("gene_biotype")??C.get("gene_type")??"",p=C.get("product")??"";if(B==="gene"){for(const N of[Q,C.get("id")??""])N!==""&&(E!==""&&n.set(N,E),m!==""&&A.set(N,m));s.push({contig:g,start:u,end:I,strand:d,geneId:Q,geneName:E,biotype:m,source:f,product:p,exons:[],pieces:[],cdsFrom:-1,cdsTo:-1});return}const w=Bg(C,B);if(w===null&&B!=="standalone")return;let y=w===null?void 0:e.get(w);y===void 0&&(y={contig:g,start:u,end:I,strand:d,geneId:Q,geneName:E,biotype:m,source:f,product:p,exons:[],pieces:[],cdsFrom:-1,cdsTo:-1},w===null?r.push(y):e.set(w,y)),B==="transcript"?(y.start=u,y.end=I):(u<y.start&&(y.start=u),I>y.end&&(y.end=I)),y.geneId===""&&(y.geneId=Q),y.geneName===""&&(y.geneName=E),y.biotype===""&&(y.biotype=m),y.product===""&&(y.product=p),h==="exon"&&y.exons.push(u,I),(h==="cds"||h==="stop_codon")&&((y.cdsFrom<0||u<y.cdsFrom)&&(y.cdsFrom=u),I>y.cdsTo&&(y.cdsTo=I)),(h==="cds"||h==="stop_codon"||fg.test(h))&&y.pieces.push(u,I)});const i=[...e.values(),...r],a=i.length>0?i:s;if(a.length===0)throw new Error("No features found. Every row either described the sequence itself rather than something on it, or named a parent that the file never defines — on a GTF, that means no row carried a `transcript_id`.");const c=new et;for(const l of a){if(l.exons.length===0){const d=hg(l.pieces);d.length>=4&&(l.exons=d)}const g=l.geneId===""?"":n.get(l.geneId)??"",f=g!==""?g:l.geneName,h=f!==""?f:l.geneId,u=l.biotype!==""?l.biotype:A.get(l.geneId)??"",I=[u===""?"":`biotype ${u}`,l.product===""?"":`product ${l.product}`,l.source===""?"":`source ${l.source}`,l.exons.length>0?`${l.exons.length>>1} exons`:""].filter(d=>d!=="").join(ct);c.add(l.contig,l.start,l.end,{strand:l.strand,name:h,id:l.geneId,detail:I,...l.exons.length>0?{exons:l.exons}:{},...l.cdsFrom>=0&&l.cdsTo>l.cdsFrom?{cds:[l.cdsFrom,l.cdsTo]}:{}})}return c.finish()}const fg=/^(five_prime_|three_prime_|5'|3')?utr$/;function hg(t){const e=[];for(let A=0;A+1<t.length;A+=2)e.push([t[A],t[A+1]]);e.sort((A,s)=>A[0]-s[0]||A[1]-s[1]);const n=[];for(const[A,s]of e){const r=n.length-1;r>0&&A<=n[r]?n[r]=Math.max(n[r],s):n.push(A,s)}return n}const ug=["gene_name","genename","gene_symbol","symbol","gene","name"],Ig=["gene_id","geneid","locus_tag"];function ci(t,e){for(const n of e){const A=t.get(n);if(A!==void 0&&A!=="")return A}return""}function dg(t,e){const n=ci(t,Ig);if(n!=="")return n;if(e==="gene"||e==="standalone")return t.get("id")??"";if(e!=="transcript")return"";const A=t.get("parent")??"";return A===""?"":A.split(",")[0]}function Cg(t){return t.endsWith("gene")}function Qg(t){return t==="transcript"||t.endsWith("_transcript")||t.endsWith("rna")}function Bg(t,e){const n=t.get("transcript_id");if(n!==void 0&&n!=="")return n;if(e==="part"){const s=t.get("parent");return s===void 0||s===""?null:s.split(",")[0]}const A=t.get("id");return A===void 0||A===""?null:A}function Eg(t,e,n){return mg.has(t)?"landmark":Cg(t)?"gene":Qg(t)?"transcript":rr(e,"transcript_id")||!n||rr(e,"parent")?"part":"standalone"}const mg=new Set(["region","source","chromosome","contig","scaffold","supercontig"]);function rr(t,e){const n=t.get(e);return n!==void 0&&n!==""}function wg(t){const n=$n(t)?.[8];if(n===void 0)return!1;const A=n.indexOf("="),s=n.indexOf('"');return A>=0&&(s<0||A<s)}function pg(t,e){const n=new Map;for(const A of t.split(";")){const s=A.trim();if(s==="")continue;if(e){const i=s.indexOf("=");if(i<0)continue;n.set(s.slice(0,i).toLowerCase(),yg(s.slice(i+1)));continue}const r=s.indexOf(" ");if(r<0)continue;const o=s.slice(r+1).trim();n.set(s.slice(0,r).toLowerCase(),o.startsWith('"')&&o.endsWith('"')?o.slice(1,-1):o)}return n}function yg(t){if(!t.includes("%"))return t;try{return decodeURIComponent(t)}catch{return t}}function li(t){const e=fs(t),n=new Jn,A=e===null?{c1:0,s1:1,e1:2,c2:3,s2:4,e2:5,name:6,score:7}:{c1:Ut(e,["chrom1","chr1","chrom_1"]),s1:Ut(e,["start1","x1","start_1"]),e1:Ut(e,["end1","x2","end_1"]),c2:Ut(e,["chrom2","chr2","chrom_2"]),s2:Ut(e,["start2","y1","start_2"]),e2:Ut(e,["end2","y2","end_2"]),name:Ut(e,["name","id","label"]),score:Ut(e,["score","value","obs/exp","count"])};if(A.c1<0||A.s1<0||A.e1<0||A.c2<0||A.s2<0||A.e2<0)throw new Error("This looks like a paired file but its header does not name all six coordinate columns. Expected chrom1, start1, end1, chrom2, start2 and end2.");const s=e===null?[]:e.map((i,a)=>({name:i.trim(),index:a})).filter(i=>i.name!==""&&![A.c1,A.s1,A.e1,A.c2,A.s2,A.e2,A.name].includes(i.index));let r=!0,o=0;if(wt(t,i=>{if(r&&e!==null){r=!1;return}if(r=!1,!R(i[A.s1])||!R(i[A.e1])){o++;return}if(!R(i[A.s2])||!R(i[A.e2])){o++;return}const a=s.map(c=>{const l=i[c.index];return l===void 0||l===""?"":`${c.name} ${l}`}).filter(c=>c!=="").join(" · ");n.add(i[A.c1],Number(i[A.s1]),Number(i[A.e1]),i[A.c2],Number(i[A.s2]),Number(i[A.e2]),{score:A.score<0?Number.NaN:wA(i[A.score]),name:A.name<0?"":i[A.name]??"",detail:a})}),n.length===0)throw new Error(o>0?`No usable rows: all ${o} lines were missing one of the six coordinates.`:"No rows found.");return n.finish()}const Ng=2,kg="top",bg="total",Mg=4;function gi(t,e=""){const n=/\.(bigbarchart|barchart)(\.b?gz)?$/i.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<Mg;){let o=t.indexOf(`
|
|
6
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!Dg(c,n))return!1;A++}return A>0}function Dg(t,e){return t.length<9||!R(t[1])||!R(t[2])||!e&&R(t[6])?!1:fi(t)>0}function fi(t){const e=Number(t[7]);return!R(t[7])||e<Ng?0:hi(t[8]??"").length===e?e:0}function hi(t){const e=t.trim();if(e==="")return[];const n=e.split(",");n.length>0&&n[n.length-1]===""&&n.pop();const A=[];for(const s of n){const r=Number(s);if(s.trim()===""||!Number.isFinite(r))return[];A.push(r)}return A}function ui(t,e=""){const n=Tg(t),A=new et,s=Ii(n.barchartbars);let r=s.length,o=0,i=0;if(wt(t,a=>{if(a.length<3||!R(a[1])||!R(a[2])){o++;return}const c=fi(a);r===0&&c>0&&(r=c);const l=c===r&&c>0?hi(a[8]??""):null;l===null&&i++;const g=Number(a[1]),f=Number(a[2]),h=or(a[3]),u=or(a[6]);A.add(a[0],g,f,{strand:Gg(a[5]),score:vg(a[4]),name:u===""?h:u,id:h,detail:Lg(l,s),...l===null?{}:{bars:l}})}),A.length===0&&o>0)throw new Error(`No usable rows: all ${o} lines failed the "contig, start, end" test that every BED-like format begins with.`);if(r===0)throw new Error(`No row of ${e===""?"this file":e} carries a category count and a matching list of values, which is the whole of what makes a barChart one.`);return A.finish(Fg(n,s,r,i))}function Fg(t,e,n,A){return{labels:e.length===n?e:Sg(n),named:e.length===n,colours:Rg(Ii(t.barchartcolors),n),unit:t.barchartunit??"",label:t.barchartlabel??"",metric:t.barchartmetric??"",limit:Number(t.maxlimit??Number.NaN),unplaced:A}}function Sg(t){const e=[];for(let n=0;n<t;n++)e.push(String(n+1));return e}function Rg(t,e){return t.length===e?t:[]}function Lg(t,e){if(t===null||t.length===0)return"";let n=0,A=0;for(let r=0;r<t.length;r++)n+=t[r],t[r]>t[A]&&(A=r);const s=[`${bg} ${xg(n)}`];return e.length===t.length&&s.unshift(`${kg} ${e[A]}`),s.join(ct)}function xg(t){return Number.isInteger(t)?String(t):t.toFixed(2)}function or(t){return t===void 0||t==="."?"":t}function Gg(t){return t==="+"?1:t==="-"?-1:0}function vg(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}const Ug=100;function Tg(t){const e={};let n=0,A=0;const s=t.length;for(;n<s&&A<Ug;){let r=t.indexOf(`
|
|
7
|
+
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);if(n=r+1,A++,!(i===""||i.charCodeAt(0)===35)){if(!i.startsWith("track ")){if(!i.startsWith("browser "))break;continue}for(const[,a,c,l]of i.matchAll(/(\w+)=(?:"([^"]*)"|(\S+))/g))e[a.toLowerCase()]=c??l??"";break}}return e}function Ii(t){if(t===void 0)return[];const e=t.trim();return e===""?[]:e.split(/[\s,]+/)}function Jg(t){return/\bexpCount\b/.test(t)&&/\bexpScores\b/.test(t)}function $g(t){const e=t.bars,n=`${t.length.toLocaleString()} feature${t.length===1?"":"s"}`;if(e===void 0)return n;const A=e.label===""?"categories":e.label.toLowerCase(),s=[n,`${e.labels.length} ${A}`];return e.unplaced>0&&s.push(`${e.unplaced.toLocaleString()} with no chart`),s.join(" · ")}const us="haplotype";function di(t){const e=t.split(/[\\/]/).pop()??t,n=e.split(/[?#]/)[0]??e;return/\.(g3d|3dg)(\.txt)?(\.gz)?$/i.test(n)?"g3d":/\.bed3d(\.txt)?(\.gz)?$/i.test(n)?"bed3d":/\.pdb(\.gz)?$/i.test(n)?"pdb":null}function Og(t){return di(t)==="pdb"}const AA="shared",ir="maternal",ar="paternal",Yg=200,_g=1/3;function pA(t,e=""){return Qi(t,e,"g3d")}function Ci(t,e=""){return Qi(t,e,"bed3d")}function Qi(t,e,n){if(di(e)===n)return!0;const A=[];let s=!1,r=0;const o=t.length;for(;r<o&&A.length<Yg;){let i=t.indexOf(`
|
|
8
|
+
`,r);i<0&&(i=o);let a=i;a>r&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(r,a);if(r=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=Bi(l,n);if(g===null)return!1;g!==Is&&((!Number.isInteger(g.xyz[0])||!Number.isInteger(g.xyz[1])||!Number.isInteger(g.xyz[2])||g.xyz[0]<0||g.xyz[1]<0||g.xyz[2]<0)&&(s=!0),A.push(g))}return A.length===0||!s?!1:Hg(A)}const Is="unplaced",Kg=/^(|[+-]?nan|na|n\/a|none|null|\.|[+-]?inf(inity)?)$/i;function Bi(t,e){const n=e==="g3d"?2:3;if(t.length<n+3||t.length>n+4||!R(t[1]))return null;let A=null;if(e==="bed3d"&&(!R(t[2])||(A=Number(t[2]),A<=Number(t[1]))))return null;const s=[t[n],t[n+1],t[n+2]];if(s.some(l=>l!==void 0&&Kg.test(l)))return Is;const[r,o,i]=s.map(Number);if(!Number.isFinite(r)||!Number.isFinite(o)||!Number.isFinite(i))return null;let a=t[0],c=t[n+3];if(c!==void 0){if(!/^[A-Za-z][\w.-]*$/.test(c))return null}else{const l=/^(.+)\(([\w.-]+)\)$/.exec(a);l!==null&&(a=l[1],c=l[2])}return a===""?null:{contig:a,start:Number(t[1]),end:A,xyz:[r,o,i],hap:qg(c)}}function qg(t){if(t===void 0||t==="")return AA;const e=t.toLowerCase();return e==="m"||e==="mat"||e===ir?ir:e==="p"||e==="pat"||e===ar?ar:e==="s"||e===AA?AA:t}function Hg(t){const e=new Map;for(const i of t){const a=`${i.contig}\0${i.hap}`,c=e.get(a);c===void 0?e.set(a,[i]):c.push(i)}let n=[1/0,1/0,1/0],A=[-1/0,-1/0,-1/0];for(const i of t)n=n.map((a,c)=>Math.min(a,i.xyz[c])),A=A.map((a,c)=>Math.max(a,i.xyz[c]));const s=Math.hypot(A[0]-n[0],A[1]-n[1],A[2]-n[2]);if(!(s>0))return!0;const r=[];for(const i of e.values())if(!(i.length<6)){i.sort((a,c)=>a.start-c.start);for(let a=1;a<i.length;a++){const c=i[a-1].xyz,l=i[a].xyz;r.push(Math.hypot(l[0]-c[0],l[1]-c[1],l[2]-c[2]))}}return r.length===0?!0:(r.sort((i,a)=>i-a),r[r.length>>1]<s*_g)}function Wg(t){const e=new Map;for(const s of t){const r=[...s].sort((o,i)=>o-i);for(let o=1;o<r.length;o++){const i=r[o]-r[o-1];i<=0||e.set(i,(e.get(i)??0)+1)}}let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}function Pg(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=1,A=0;for(const[s,r]of e)(r>A||r===A&&s<n)&&(A=r,n=s);return n}function Ei(t,e=""){return wi(t,e,"g3d")}function mi(t,e=""){return wi(t,e,"bed3d")}function wi(t,e,n){const A=[];let s=0,r=0;if(wt(t,h=>{const u=Bi(h,n);u===Is?r++:u===null?s++:A.push(u)}),A.length===0){const h=n==="g3d"?"chromosome, start, x, y, z":"chromosome, start, end, x, y, z";throw new Error(r>0&&s===0?`No bead in this file has a place: all ${r} rows carry \`nan\` where their coordinates go.`:s>0?`No usable rows: all ${s} lines failed the "${h}" test that a ${n} begins with.`:`${e===""?"This file":e} has no rows.`)}const o=[],i=new Map,a=new Map;for(const h of A){i.has(h.hap)||(i.set(h.hap,o.length),o.push(h.hap));const u=`${h.contig}\0${h.hap}`,I=a.get(u);I===void 0?a.set(u,[h.start]):I.push(h.start)}const c=n==="g3d"?Wg(a.values()):Pg(A.map(h=>(h.end??h.start)-h.start)),l=o.length>1,g=new et;for(const h of A)g.add(h.contig,h.start,h.end??h.start+c,{xyz:h.xyz,hap:i.get(h.hap)??0,detail:l?`${us} ${h.hap}`:""});const f={width:c,haplotypes:o};return g.finish(null,f)}function pi(t){const e=t.model,n=`${cr(t.length)} bead${t.length===1?"":"s"}`;if(e===void 0)return n;const A=[n,fl(e.width)];return e.haplotypes.length>1&&A.push(`${e.haplotypes.length} haplotypes`),A.push(`${cr(t.contigs.length)} sequence${t.contigs.length===1?"":"s"}`),A.join(ct)}function cr(t){return t.toLocaleString("en-US")}const fe=99999,zg="BEA",lr="REMARK 250 CHROMOSOMIX",gr=1;function Xg(t,e,n){return Number.isFinite(t)&&Number.isFinite(e)&&Number.isFinite(n)}function yA(t,e=""){if(Og(e))return!0;const n=/^[ \t]*(\S[^\n]*)/m.exec(t)?.[1]??"";return/^(HEADER|TITLE |COMPND|SOURCE|KEYWDS|EXPDTA|AUTHOR|REMARK|CRYST1|MODEL |ATOM |HETATM)/.test(n)?/^(ATOM |HETATM)/m.test(t):!1}function yi(t,e=""){const n=[],A=[];let s=null,r=null,o=null,i=null;const a=[];let c=0,l=!1,g=0;const f=t.length;for(;g<f;){let N=t.indexOf(`
|
|
9
|
+
`,g);N<0&&(N=f);let k=N;k>g&&t.charCodeAt(k-1)===13&&k--;const b=t.slice(g,k);if(g=N+1,b.startsWith(`${lr} `)){const x=b.slice(lr.length+1).trim().split(/\s+/),[O,...J]=x;if(O==="PLACEMENT")s=Number(J[0]);else if(O==="FRAME"&&J.length===4){const[K,V,H,ht]=J.map(Number);[K,V,H].every(Number.isFinite)&&ht>0&&(r={cx:K,cy:V,cz:H,factor:ht})}else if(O==="WIDTH"){const K=Number(J[0]);Number.isInteger(K)&&K>0&&(o=K)}else if(O==="HAPLOTYPES")i=J.map(sA);else if(O==="CHAIN"&&J.length>=6){const K=Number(J[2]),V=Number(J[3]);en(K)&&en(V)&&K<=V&&n.push({first:K,last:V,hap:sA(J[4]),sequence:sA(J.slice(5).join(" "))})}else if(O==="RUN"&&J.length===4){const[K,V,H,ht]=J.map(Number);en(K)&&Number.isInteger(V)&&V>0&&K+V-1<=fe&&Number.isInteger(H)&&H>=0&&Number.isInteger(ht)&&ht>0&&A.push({first:K,count:V,start:H,width:ht})}continue}if(l)continue;if(b.startsWith("ENDMDL")){l=!0;continue}if(!b.startsWith("HETATM")&&!b.startsWith("ATOM "))continue;const M=Number(b.slice(6,11)),F=Number(b.slice(30,38)),S=Number(b.slice(38,46)),v=Number(b.slice(46,54));!en(M)||!Xg(F,S,v)||(b.slice(17,20)===zg&&c++,a.push({serial:M,x:F,y:S,z:v}))}const h=e===""?"This file":e;if(a.length===0)throw new Error(`${h} has no ATOM or HETATM record with a place, so there is no bead to read.`);if(s===null||n.length===0||A.length===0)throw new Error(c===a.length?"These beads are named the way this app writes a PDB, but the lines that said where each one is on the genome are gone: PyMOL drops REMARK records when it saves. Open the PDB as this app wrote it, or its bed3d.":"A PDB says where each bead is in space and not where it is on the genome, and this one does not say: pastis and the other solvers write their beads in bin order and nothing else. Write the coordinates beside the bins they were modelled at, as a bed3d (chrom, start, end, x, y, z), and open that.");if(s!==gr)throw new Error(`This PDB's placement table is version ${String(s)}, and this reader understands version ${gr}.`);const u=new Int32Array(fe+1).fill(-1);n.forEach((N,k)=>{for(let b=N.first;b<=N.last;b++)u[b]=k});const I=new Float64Array(fe+1).fill(-1),d=new Float64Array(fe+1);for(const N of A)for(let k=0;k<N.count;k++)I[N.first+k]=N.start+k*N.width,d[N.first+k]=N.width;const C=i??[],B=new Map;C.forEach((N,k)=>B.set(N,k));const Q=r??{cx:0,cy:0,cz:0,factor:1},E=new Uint8Array(fe+1),m=[];for(const N of a){const k=u[N.serial],b=I[N.serial];if(k<0||b<0||E[N.serial]===1)continue;E[N.serial]=1;const M=n[k];B.has(M.hap)||(B.set(M.hap,C.length),C.push(M.hap)),m.push({contig:M.sequence,start:b,end:b+d[N.serial],xyz:[N.x/Q.factor+Q.cx,N.y/Q.factor+Q.cy,N.z/Q.factor+Q.cz],hap:M.hap})}if(m.length===0)throw new Error(`${h} has a placement table, and it places none of the file's ${G.int(a.length)} atoms.`);const p=C.length>1,w=new et;for(const N of m)w.add(N.contig,N.start,N.end,{xyz:N.xyz,hap:B.get(N.hap)??0,detail:p?`${us} ${N.hap}`:""});const y={width:o??Vg(m.map(N=>N.end-N.start)),haplotypes:C};return w.finish(null,y)}function en(t){return Number.isInteger(t)&&t>=1&&t<=fe}function sA(t){try{return decodeURIComponent(t)}catch{return t}}function Vg(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}const rA="MessagePack value",fr=64,Zg=BigInt(Number.MAX_SAFE_INTEGER),jg=BigInt(Number.MIN_SAFE_INTEGER);function Ni(t,e=0){const n=new tf(t,e);return{value:n.next(),end:n.at}}class tf{constructor(e,n){this.bytes=e,this.at=n,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength)}at;view;decoder=new TextDecoder;depth=0;next(){const e=this.u8();if(e<=127)return e;if(e>=224)return e-256;if(e>=128&&e<=143)return this.map(e&15);if(e>=144&&e<=159)return this.array(e&15);if(e>=160&&e<=191)return this.str(e&31);switch(e){case 192:return null;case 194:return!1;case 195:return!0;case 196:return this.bin(this.u8());case 197:return this.bin(this.u16());case 198:return this.bin(this.u32());case 202:return this.f32();case 203:return this.f64();case 204:return this.u8();case 205:return this.u16();case 206:return this.u32();case 207:return this.big(this.view.getBigUint64(this.take(8)));case 208:return this.i8();case 209:return this.i16();case 210:return this.i32();case 211:return this.big(this.view.getBigInt64(this.take(8)));case 217:return this.str(this.u8());case 218:return this.str(this.u16());case 219:return this.str(this.u32());case 220:return this.array(this.u16());case 221:return this.array(this.u32());case 222:return this.map(this.u16());case 223:return this.map(this.u32());default:throw new Error(`msgpack: unsupported type byte 0x${e.toString(16).padStart(2,"0")} at offset ${this.at-1}.`)}}take(e){const n=this.at;if(n+e>this.bytes.length)throw new Error(`msgpack: truncated: needed ${e} byte${e===1?"":"s"} at offset ${n} of ${this.bytes.length}.`);return this.at=n+e,n}u8(){return this.view.getUint8(this.take(1))}u16(){return this.view.getUint16(this.take(2))}u32(){return this.view.getUint32(this.take(4))}i8(){return this.view.getInt8(this.take(1))}i16(){return this.view.getInt16(this.take(2))}i32(){return this.view.getInt32(this.take(4))}f32(){return this.view.getFloat32(this.take(4))}f64(){return this.view.getFloat64(this.take(8))}big(e){if(e>Zg||e<jg)throw new Error(`msgpack: the 64-bit integer ${e} at offset ${this.at-9} does not fit a JavaScript number.`);return Number(e)}str(e){const n=this.take(e);return this.decoder.decode(this.bytes.subarray(n,n+e))}bin(e){const n=this.take(e);return this.bytes.subarray(n,n+e)}open(e,n,A){if(this.depth>=fr)throw new Rt("format",`This ${rA} nests deeper than ${fr} levels at offset ${this.at}, which no document this reader opens does. The file is corrupt, or not the format its first bytes claim.`,{format:rA,offset:this.at,depth:this.depth});return this.depth++,nt(e,{format:rA,field:`${n} length at offset ${this.at}`,ceiling:2**32-1,available:this.bytes.length-this.at,bytesPerItem:A})}array(e){const n=this.open(e,"array",1),A=new Array(n);for(let s=0;s<n;s++)A[s]=this.next();return this.depth--,A}map(e){const n=this.open(e,"map",2),A=new Map;for(let s=0;s<n;s++){const r=this.at,o=this.next();if(typeof o!="string"&&typeof o!="number")throw new Error(`msgpack: a map key at offset ${r} is neither a string nor an integer.`);A.set(o,this.next())}return this.depth--,A}}const hr=64e3,yn="binary g3d",ki={ratio:64,floor:64<<20,ceiling:1<<30},ef=[165,109,97,103,105,99],nf=[163,71,51,68];function ds(t){if(t.length===0)return!1;const e=t[0];let n;if(e>=128&&e<=143)n=1;else if(e===222)n=3;else return!1;const A=[...ef,...nf];if(t.length<n+A.length)return!1;for(let s=0;s<A.length;s++)if(t[n+s]!==A[s])return!1;return!0}async function Af(t,e){const n=e===void 0?hr:Math.min(hr,e),A=await t(n,0);if(!ds(A))throw new Error("Not a binary g3d: the file does not begin with the G3D magic.");const{value:s}=Ni(A);if(!(s instanceof Map))throw new Error("Not a binary g3d: the header is not a map.");if(s.get("magic")!=="G3D")throw new Error('Not a binary g3d: the magic is not "G3D".');const r=s.get("version");if(r!==2)throw r===1?new Error("This is a version-1 g3d, written by a g3dtools older than 0.2. Run `g3dtools load` over the original text to rewrite it as a version-2 file, which is the layout this reader and the WashU browser both understand."):new Error(`Unsupported g3d version ${String(r)}: this reader understands version 2.`);const o=xe(s.get("resolutions"),"resolutions"),i=af(s.get("categories"),"categories"),a=s.get("offsets");if(!(a instanceof Map))throw new Error("This g3d has no offsets map in its header.");const c=new Map;for(const[l,g]of a){const f=typeof l=="number"?l:Number(l);if(!Number.isInteger(f)||!(g instanceof Map))continue;const h=g.get("offset"),u=g.get("size");if(typeof h!="number"||typeof u!="number")continue;const I=`${f} bp block`;nt(h,{format:yn,field:`offset of the ${I}`,ceiling:Number.MAX_SAFE_INTEGER}),nt(u,{format:yn,field:`size of the ${I}`,ceiling:ki.ceiling}),c.set(f,{offset:h,size:u})}for(const l of o)if(!c.has(l))throw new Error(`This g3d lists a resolution of ${l} bp but has no block for it.`);return{version:r,genome:typeof s.get("genome")=="string"?s.get("genome"):"",name:typeof s.get("name")=="string"?s.get("name"):"",resolutions:o,categories:i,offsets:c,...e===void 0?{}:{fileSize:e}}}async function sf(t,e,n){const A=e.offsets.get(n);if(A===void 0)throw new Error(`This g3d has no model at ${n} bp; it has ${e.resolutions.join(", ")}.`);e.fileSize!==void 0&&rs(A.offset,A.size,{format:yn,field:`${n} bp block`,size:e.fileSize});const s=await t(A.size,A.offset);if(s.length!==A.size)throw new Error(`The ${n} bp block of this g3d is ${s.length} bytes where the header promised ${A.size}.`);const{value:r}=Ni(await of(s,n));if(!(r instanceof Map))throw new Error(`The ${n} bp block of this g3d is not a map.`);const o=[...e.categories],i=o.length>1,a=new et;for(const[l,g]of r){const f=String(l);let h=o.indexOf(f);h<0&&(h=o.length,o.push(f));const u=i?`${us} ${f}`:"";if(g instanceof Map)for(const[I,d]of g){if(!(d instanceof Map))continue;const C=`${f}/${String(I)} at ${n} bp`,B=xe(d.get("start"),`start of ${C}`),Q=xe(d.get("x"),`x of ${C}`),E=xe(d.get("y"),`y of ${C}`),m=xe(d.get("z"),`z of ${C}`);if(Q.length!==B.length||E.length!==B.length||m.length!==B.length)throw new Error(`The columns of ${C} in this g3d are not the same length.`);const p=String(I);for(let w=0;w<B.length;w++)a.add(p,B[w],B[w]+n,{xyz:[Q[w],E[w],m[w]],hap:h,detail:u})}}const c={width:n,haplotypes:o};return a.finish(null,c)}function rf(t){const e=t.resolutions.length,n=t.categories.length;return["binary g3d",`${e} resolution${e===1?"":"s"}`,`${n} categor${n===1?"y":"ies"}`].join(ct)}async function of(t,e){return os(t,{format:yn,field:`${e} bp block`,encoding:"deflate",maxBytes:hl(t.byteLength,ki)})}function xe(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="number")throw new Error(`This g3d's ${e} holds a value that is not a number.`);return t}function af(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="string")throw new Error(`This g3d's ${e} holds a value that is not a string.`);return t}const cf=[66,65,73,1],lf=[67,83,73,1],gf=14,ff=5,hf=37450,Qt="BAM index",uf=65536,If=65536,df=10,Cf=63,he=2**31-1;function ur(t,e){return t.length<e.length?!1:e.every((n,A)=>t[A]===n)}async function Qf(t){const e=We(t)?await Yt(t):t,n=ur(e,lf)?Ef:ur(e,cf)?Bf:null;if(n===null)throw new Error("This is not a BAM index: the magic bytes are neither BAI\\1 nor CSI\\1.");try{return n(e)}catch(A){throw A instanceof RangeError?new Rt("format",`This ${Qt} ends part-way through its own tables, ${e.byteLength.toLocaleString("en-US")} bytes in. It is truncated; rebuild it with \`samtools index\`.`,{bytes:e.byteLength}):A}}function Bf(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=o=>t.byteLength-o,A=nt(e.getInt32(4,!0),{format:Qt,field:"reference count",ceiling:he,available:n(8),bytesPerItem:8});let s=8;const r=[];for(let o=0;o<A;o++){const i=new Map,a=nt(e.getInt32(s,!0),{format:Qt,field:`bin count of reference ${o}`,ceiling:uf,available:n(s+4)-4,bytesPerItem:8});s+=4;for(let g=0;g<a;g++){const f=e.getUint32(s,!0);s+=4;const h=nt(e.getInt32(s,!0),{format:Qt,field:`chunk count of bin ${f}`,ceiling:he,available:n(s+4),bytesPerItem:16});s+=4;const u=[];for(let I=0;I<h;I++)u.push({begin:e.getBigUint64(s,!0),end:e.getBigUint64(s+8,!0)}),s+=16;f!==hf&&i.set(f,u)}const c=nt(e.getInt32(s,!0),{format:Qt,field:`linear index size of reference ${o}`,ceiling:If,available:n(s+4),bytesPerItem:8});s+=4;const l=new BigUint64Array(c);for(let g=0;g<c;g++)l[g]=e.getBigUint64(s,!0),s+=8;r.push({bins:i,linear:l,loffset:null})}return{format:"bai",minShift:gf,depth:ff,refs:r}}function Ef(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=c=>t.byteLength-c,A=nt(e.getInt32(8,!0),{format:Qt,field:"CSI depth",ceiling:df}),s=nt(e.getInt32(4,!0),{format:Qt,field:"CSI min_shift",ceiling:Cf-3*A});let o=16+nt(e.getInt32(12,!0),{format:Qt,field:"auxiliary data length",ceiling:he,available:n(16)-4});const i=nt(e.getInt32(o,!0),{format:Qt,field:"reference count",ceiling:he,available:n(o+4),bytesPerItem:4});o+=4;const a=[];for(let c=0;c<i;c++){const l=new Map,g=new Map,f=nt(e.getInt32(o,!0),{format:Qt,field:`bin count of reference ${c}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;for(let h=0;h<f;h++){const u=e.getUint32(o,!0);o+=4,g.set(u,e.getBigUint64(o,!0)),o+=8;const I=nt(e.getInt32(o,!0),{format:Qt,field:`chunk count of bin ${u}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;const d=[];for(let C=0;C<I;C++)d.push({begin:e.getBigUint64(o,!0),end:e.getBigUint64(o+8,!0)}),o+=16;l.set(u,d)}a.push({bins:l,linear:null,loffset:g})}return{format:"csi",minShift:s,depth:A,refs:a}}function $e(t,e){return Math.floor(t/2**e)}function mf(t,e,n,A){const s=[],r=Math.max(e,n-1);let o=A.minShift+A.depth*3,i=0;for(let a=0;a<=A.depth;a++){const c=i+$e(e,o),l=i+$e(r,o);if(l-c+1>t.bins.size)for(const[g,f]of t.bins)g>=c&&g<=l&&s.push(f);else for(let g=c;g<=l;g++){const f=t.bins.get(g);f!==void 0&&s.push(f)}i+=1<<a*3,o-=3}return s}function wf(t,e,n){if(t.linear!==null){const r=$e(e,n.minShift);return t.linear.length===0?0n:t.linear[Math.min(r,t.linear.length-1)]}if(t.loffset===null)return 0n;let A=n.minShift,s=0;for(let r=n.depth;r>=0;r--){s=bi(r);const o=t.loffset.get(s+$e(e,A));if(o!==void 0)return o;A+=3}return 0n}function bi(t){let e=0;for(let n=0;n<t;n++)e+=1<<n*3;return e}function pf(t,e,n){let A=null,s=n.minShift;for(let r=n.depth;r>=0;r--){const o=bi(r),i=1<<r*3,a=$e(Math.max(0,e-1),s)+1;for(let c=0;c<8&&a+c<i;c++){const l=t.bins.get(o+a+c);if(l!==void 0)for(const g of l)(A===null||g.begin<A)&&(A=g.begin)}s+=3}return A??BigInt(Number.MAX_SAFE_INTEGER)<<16n}const yf=1<<20;function Nf(t,e,n,A,s){const r=t.refs[e];if(r===void 0)return[];const o=wf(r,Math.max(0,n),t),i=pf(r,Math.max(1,A),t),a=[];for(const l of mf(r,Math.max(0,n),Math.max(1,A),t))for(const g of l)g.end>o&&g.begin<i&&a.push(g);if(a.length===0)return[];a.sort((l,g)=>l.begin<g.begin?-1:l.begin>g.begin?1:0);const c=[];for(const l of a){const g=Number(l.begin>>16n),f=Number(l.begin&0xffffn),h=Number(l.end>>16n),u=Math.min(s,h+Et),I=c[c.length-1];I!==void 0&&g<=I.to+yf?(I.to=Math.max(I.to,u),I.lastBlock=Math.max(I.lastBlock,h)):c.push({from:g,to:u,lastBlock:h,dataFrom:f})}return c}function Mi(t){let e=0;for(const n of t)e+=n.to-n.from;return e}const kf=2*Et,bf=Et,Ir=1<<20,Mf=4*Et,Df=16384,Ff=1<<24,Sf=1<<18,Rf=1<<24,Nn=18,Pt=[31,139,8,4],me=36;function jt(t,e){return t<0?Number.POSITIVE_INFINITY:t*2**32+e+1}class NA extends Error{constructor(e,n){super("The reads are not in coordinate order."),this.before=e,this.after=n,this.name="UnsortedError"}}function dr(t,e){return t.refId<0?"unplaced":`${e[t.refId]?.name??`reference ${t.refId}`}:${(t.pos+1).toLocaleString("en-US")}`}function Lf(t,e){const n=e-1;return t>>14===n>>14?32767/7+(t>>14):t>>17===n>>17?4095/7+(t>>17):t>>20===n>>20?511/7+(t>>20):t>>23===n>>23?63/7+(t>>23):t>>26===n>>26?7/7+(t>>26):0}class Cs{constructor(e,n,A,s){this.handle=e,this.size=n,this.refs=A,this.progress=s,this.lineStart=[];let r=0;for(const o of A)this.lineStart.push(r),r+=Math.max(0,o.length);this.lineLength=r}probes=[];answers=new Map;probing=new Map;lastWalk=null;walking=new Map;bytesRead=0;first=null;lineStart;lineLength;static async open(e,n,A,s,r){const o=new Cs(e,n,A.refs,s);if(o.first=await o.firstRecord(A.recordsFrom),o.first!==null&&A.sortOrder!=="coordinate")for(const i of[.125,.375,.625,.875])r!==void 0&&await r(),await o.probeAt(Math.floor(n*i));return o}get bytes(){return this.bytesRead}get probeCount(){return this.probes.length}async spansFor(e,n,A,s,r){if(this.first===null||A<=n)return[];const o=await this.locate(e,Math.max(0,n-Df),s);if(o===null||o.key>=jt(e,A))return[];if(r!==void 0&&o.block+r<this.size){s!==void 0&&await s();const c=await this.probeAt(Cr(o.block+r,o.block));if(c.key<jt(e,A)){const l=c.block;return[{from:o.block,to:Math.min(this.size,l+Et),lastBlock:l,dataFrom:o.within}]}}const i=await this.locate(e,A,s),a=i===null||i.tail===!0?this.size:i.block;return[{from:o.block,to:Math.min(this.size,a+Et),lastBlock:a,dataFrom:o.within}]}locate(e,n,A){if(this.first===null)return Promise.resolve(null);const s=jt(e,n);if(this.first.key>=s)return Promise.resolve(this.first);const r=this.answers.get(s);if(r!==void 0)return r;const o=this.search(e,n,A).then(i=>(i!==null&&i.tail!==!0&&this.remember(i,!0),i));return this.answers.set(s,o),o.catch(()=>this.answers.delete(s)),o}async search(e,n,A){if(this.first===null)return null;const s=jt(e,n);let r=this.first,o=null;for(const c of this.probes)if(c.key<s)r=c;else{o=c;break}let i=!0;for(;;){const c=o===null?this.size:o.block,l=c-r.block;if(l<=Mf)break;A!==void 0&&await A();const g=i?this.guess(r,o,e,n):null,f=await this.probeAt(Cr(g??Math.floor((r.block+c)/2),r.block));if(f.block>=c)break;f.key>=s?o=f:r=f,i=(o===null?this.size:o.block)-r.block<=l/2}const a=o===null||o.tail===!0?this.size:Math.min(this.size,o.block+Et);return this.walk(r,a,s)}lineOf(e,n){return(this.lineStart[e]??this.lineLength)+Math.max(0,n)}guess(e,n,A,s){const r=this.lineOf(A,s),o=this.lineOf(e.refId,e.pos),i=n===null||n.tail===!0||n.refId<0?this.lineLength:this.lineOf(n.refId,n.pos);if(i<=o)return null;const a=(r-o)/(i-o);if(!(a>0&&a<1))return null;const c=n===null?this.size:n.block,l=e.block+Math.floor(a*(c-e.block));return Math.min(Math.max(l,e.block+1),c-2*Et)}async walk(e,n,A){if(n<=e.block)return null;let s=this.lastWalk;if(s===null||e.block<s.from||n>s.to){const c=`${e.block}-${n}`;let l=this.walking.get(c);if(l===void 0){l=this.read(n-e.block,e.block).then(async f=>{const{bytes:h,blocks:u}=await kA(f,e.block);return{from:e.block,to:n,bytes:h,blocks:u}}),this.walking.set(c,l);const g=()=>{this.walking.delete(c)};l.then(g,g)}s=await l,this.lastWalk=s}const{bytes:r,blocks:o}=s,i=o.find(c=>c.fileAt===e.block);if(i===void 0)return this.lastWalk=null,this.walk(e,n,A);let a=null;return wn(r,i.from+e.within,c=>jt(c.refId,c.pos)<A?!0:(a=bA(o,c.at-4,c.refId,c.pos),!1)),a}probeAt(e){const n=this.probing.get(e);if(n!==void 0)return n;const A=this.probe(e);this.probing.set(e,A);const s=()=>{this.probing.delete(e)};return A.then(s,s),A}async probe(e){let n=kf;for(;;){const A=Math.min(this.size,e+n);if(A<=e)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});const s=await this.read(A-e,e),r=await Gf(s,e,this.refs,this.size);if(r.kind==="record")return this.remember(r.placed);if(r.kind==="end"||A>=this.size)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});if(n>=Ir)throw new Error(`no alignment record could be made out within ${Ir>>20} MB of byte ${e.toLocaleString("en-US")}`);n*=4}}remember(e,n=!1){let A=this.probes.length;for(;A>0&&this.probes[A-1].block>e.block;)A--;const s=this.probes[A-1];if(s!==void 0&&s.block===e.block&&s.within===e.within)return s;if(n)return this.probes.splice(A,0,e),e;const r=A===0?this.first:this.probes[A-1],o=A<this.probes.length?this.probes[A]:null;if(r!==null&&r.key>e.key)throw new NA(r,e);if(o!==null&&e.key>o.key)throw new NA(e,o);return this.probes.splice(A,0,e),e}async firstRecord(e){let n=Sf;for(;;){const A=await this.read(Math.min(n,this.size),0);let s=0,r=0;for(;s+Nn<=A.length;){const o=ye(A.subarray(s,Math.min(s+64,A.length)));if(o===null||s+o>A.length)break;const i=Di(A,s+o-4);if(e<r+i){const{bytes:a,blocks:c}=await kA(A.subarray(s),s),l=e-r;if(l+me>a.length){if(A.length>=this.size)return null;break}if(!MA(a,l,this.refs))throw new Error("the first alignment record is not where the header says it begins");const g=new DataView(a.buffer,a.byteOffset,a.byteLength);return bA(c,l,g.getInt32(l+4,!0),g.getInt32(l+8,!0))}r+=i,s+=o}if(A.length>=this.size)return null;if(n>=Rf)throw new Error("the header does not end within the first 16 MB");n*=4}}async read(e,n){const A=await this.handle.read(e,n);return this.bytesRead+=A.length,this.progress!==void 0&&this.progress(this.bytesRead),A}}async function kA(t,e){const n=[],A=[];let s=0,r=0,o=!1;for(;r+Nn<=t.length;){const c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const l=await Yt(t.subarray(r,r+c),0);l.length===0&&(o=!0),A.push({fileAt:e+r,from:s,to:s+l.length}),n.push(l),s+=l.length,r+=c}const i=new Uint8Array(s);let a=0;for(const c of n)i.set(c,a),a+=c.length;return{bytes:i,blocks:A,sawEnd:o}}function bA(t,e,n,A){for(const r of t)if(e>=r.from&&e<r.to)return{block:r.fileAt,within:e-r.from,refId:n,pos:A,key:jt(n,A)};const s=t[t.length-1];return{block:s.fileAt,within:e-s.from,refId:n,pos:A,key:jt(n,A)}}function xf(t,e,n){for(let A=0;A+Nn<=t.length;A++){if(t[A]!==Pt[0]||t[A+1]!==Pt[1]||t[A+2]!==Pt[2]||t[A+3]!==Pt[3])continue;const s=ye(t.subarray(A,Math.min(A+64,t.length)));if(s===null||s>Et||s<Nn+8)continue;const r=A+s;if(r>t.length)return e+r===n?A:"more";if(!(Di(t,r-4)>Et)){if(e+r===n)return A;if(r+3<=t.length){if(t[r]===Pt[0]&&t[r+1]===Pt[1]&&t[r+2]===Pt[2])return A;continue}return"more"}}return"more"}async function Gf(t,e,n,A){const s=xf(t,e,A);if(s==="more")return e+t.length>=A?{kind:"end"}:{kind:"more"};const{bytes:r,blocks:o,sawEnd:i}=await kA(t.subarray(s),e+s);if(r.length===0)return i||e+t.length>=A?{kind:"end"}:{kind:"more"};const a=vf(r,n);if(a>=0){const c=new DataView(r.buffer,r.byteOffset,r.byteLength);return{kind:"record",placed:bA(o,a,c.getInt32(a+4,!0),c.getInt32(a+8,!0))}}return i||e+t.length>=A?{kind:"end"}:{kind:"more"}}function vf(t,e){const n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let A=0;A+me<=t.length;A++){if(!MA(t,A,e,n))continue;const s=A+4+n.getInt32(A,!0);if(s+me<=t.length){if(MA(t,s,e,n))return A;continue}if(Uf(t,A,n))return A}return-1}function MA(t,e,n,A=new DataView(t.buffer,t.byteOffset,t.byteLength)){if(e+me>t.length)return!1;const s=A.getInt32(e,!0);if(s<32||s>Ff)return!1;const r=A.getInt32(e+4,!0);if(r<-1||r>=n.length)return!1;const o=A.getInt32(e+8,!0);if(o<-1||r>=0&&o>n[r].length)return!1;const i=t[e+12];if(i<1)return!1;const a=A.getUint16(e+16,!0),c=A.getInt32(e+20,!0);if(c<0)return!1;const l=A.getInt32(e+24,!0);if(l<-1||l>=n.length||A.getInt32(e+28,!0)<-1||32+i+a*4+(c+1>>1)+c>s)return!1;const g=e+me,f=g+i;if(f>t.length||t[f-1]!==0)return!1;for(let h=g;h<f-1;h++){const u=t[h];if(u<33||u>126)return!1}return!0}function Uf(t,e,n){const A=n.getInt32(e+8,!0);if(A<0||A>=1<<29)return!1;const s=e+me+t[e+12],r=n.getUint16(e+16,!0);if(s+r*4>t.length)return!1;const o=A+jo(n,s,r);return n.getUint16(e+14,!0)===Lf(A,Math.max(o,A+1))}function Cr(t,e){const n=t-t%bf;return n>e?n:t}function Di(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0}const DA=62,Qr=10;function kn(t){return t.length>0&&t[0]===DA}function Tf(t){const e=new TextDecoder,n=[];t.length>0&&t[0]===DA&&n.push(0);for(let o=1;o<t.length;o++)t[o]===DA&&t[o-1]===Qr&&n.push(o);const A=[],s=new Map;let r=0;for(let o=0;o<n.length;o++){const i=n[o];let a=t.indexOf(Qr,i);a<0&&(a=t.length);const c=Jf(e,t,i+1,a),l=Math.min(a+1,t.length),g=o+1<n.length?n[o+1]:t.length;if(c===""||s.has(c))continue;let f=0;for(let I=l;I<g;I++)t[I]>32&&f++;if(f===0)continue;const h=new Uint8Array(f);let u=0;for(let I=l;I<g;I++){const d=t[I];d>32&&(h[u++]=d)}s.set(c,h),A.push({name:c,length:f}),r+=f}return{contigs:A,bases:s,total:r}}function Jf(t,e,n,A){let s=n;for(;s<A&&e[s]>32;)s++;return t.decode(e.subarray(n,s)).trim()}const Ne=(()=>{const t=new Uint8Array(256).fill(4),e=(n,A)=>{t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A};return e("A",0),e("C",1),e("G",2),e("T",3),e("U",3),t})(),$f=25;function Br(t,e,n,A){const s=Math.max(0,Math.floor(e)),r=Math.min(t.length,Math.ceil(n)),o=Math.max($f,Math.round(A)),i=r>s?Math.ceil((r-s)/o):0,a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i);for(let g=0;g<i;g++){const f=s+g*o,h=Math.min(r,f+o);let u=0,I=0;for(let d=f;d<h;d++){const C=Ne[t[d]];C===1||C===2?u++:(C===0||C===3)&&I++}a[g]=f,c[g]=h,l[g]=u+I>0?u/(u+I):Number.NaN}return{starts:a,ends:c,values:l}}const Fi={exclude:Vo,minMapq:0};function Of(t,e,n,A,s,r,o=Fi,i,a,c){const l=s-A;if(r<=0||l<=0)return{depth:new Float32Array(0),variant:null,total:0,kept:0,max:0};const g=l/r,f=new Float64Array(r),h=new Float64Array(r+1),u=i===void 0?null:new Float64Array(r),I=i===void 0?null:new Float64Array(r+1);let d=0,C=0;wn(t,e,p=>{if(d++,p.refId===n&&(p.flag&o.exclude)===0&&!(p.mapq<o.minMapq)&&!(p.pos<0||p.end<=A||p.pos>=s)){if(C++,Hf(t,p,(w,y)=>{const N=Math.max(w,A),k=Math.min(y,s);k<=N||Er(f,h,(N-A)/g,(k-A)/g,r)}),a!==void 0){let w=null;Kf(t,p,(y,N)=>{if(N<=A||y>=s)return;w??=qf(t,p);const k=`${y}:${N}:${w}`;a.set(k,(a.get(k)??0)+1)})}if(c!==void 0)for(const w of ti(t,p)){if(w.pos<A||w.pos>=s)continue;const y=Pl(w.prob,c.threshold);if(y<0)continue;let N=c.tally.get(w.code);N===void 0&&(N={calls:new Float64Array(r),modified:new Float64Array(r)},c.tally.set(w.code,N));const k=Math.min(r-1,Math.floor((w.pos-A)/g));N.calls[k]++,y===1&&N.modified[k]++}i===void 0||u===null||I===null||Yf(t,p,i,w=>{w<A||w>=s||Er(u,I,(w-A)/g,(w+1-A)/g,r)},[A,s])}});let B=0,Q=0;const E=new Float32Array(r);for(let p=0;p<r;p++){B+=h[p];const w=B+f[p];E[p]=w,w>Q&&(Q=w)}let m=null;if(u!==null&&I!==null){m=new Float32Array(r);let p=0;for(let w=0;w<r;w++)p+=I[w],m[w]=p+u[w]}return{depth:E,variant:m,total:d,kept:C,max:Q}}function Yf(t,e,n,A,s=[Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY]){const r=new DataView(t.buffer,t.byteOffset,t.byteLength),o=Pe(t,e),i=o===null?e.cigarOps:o.length,a=f=>o===null?r.getUint32(e.cigarAt+f*4,!0):o[f],c=n.start+n.bases.length;let l=e.pos,g=0;for(let f=0;f<i;f++){const h=a(f),u=h&15,I=h>>>4;if(u===2){const d=Math.max(0,s[0]-l),C=Math.min(I,s[1]-l);for(let B=d;B<C;B++)A(l+B);l+=I;continue}if(mt(u)&&Ot(u)){const d=Math.max(0,n.start-l,s[0]-l),C=Math.min(I,c-l,s[1]-l,e.seqLength-g);for(let B=d;B<C;B++){const Q=l+B-n.start,E=Ne[n.bases[Q]];if(E===4)continue;const m=_f(t,e.seqAt,g+B);m!==4&&m!==E&&A(l+B)}l+=I,g+=I;continue}mt(u)&&(l+=I),Ot(u)&&(g+=I)}}function _f(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[cs.charCodeAt(s)]}function Er(t,e,n,A,s){const r=Math.min(s-1,Math.max(0,Math.floor(n))),o=Math.min(s-1,Math.max(0,Math.ceil(A)-1));if(!(o<r)){if(r===o){t[r]+=Math.min(A,r+1)-Math.max(n,r);return}t[r]+=r+1-Math.max(n,r),t[o]+=Math.min(A,o+1)-o,o>r+1&&(e[r+1]+=1,e[o]-=1)}}function Kf(t,e,n){const A=Pe(t,e),s=A===null?e.cigarOps:A.length,r=A===null?new DataView(t.buffer,t.byteOffset,t.byteLength):null;let o=e.pos;for(let i=0;i<s;i++){const a=r===null?A[i]:r.getUint32(e.cigarAt+i*4,!0),c=a&15,l=a>>>4;if(c===3){l>0&&n(o,o+l),o+=l;continue}mt(c)&&(o+=l)}}function qf(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=t[A],o=t[A+1],i=String.fromCharCode(t[A+2]);if(A+=3,i==="A"&&(r===88&&o===83||r===116&&o===115)){const a=t[A]===43?1:t[A]===45?-1:0;return r===88?a:(e.flag&At.REVERSE)!==0?-a:a}if(A=as(t,A,i,s),A<0)return 0}return 0}function Hf(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=Pe(t,e),r=s===null?e.cigarOps:s.length,o=l=>s===null?A.getUint32(e.cigarAt+l*4,!0):s[l];let i=e.pos,a=e.pos,c=!1;for(let l=0;l<r;l++){const g=o(l),f=g&15,h=g>>>4;if(f===3){c&&i>a&&n(a,i),c=!1,i+=h,a=i;continue}mt(f)&&(c||(a=i,c=!0),i+=h)}c&&i>a&&n(a,i)}function Wf(t,e,n){let A=2166136261;for(let s=e;s<n;s++)A^=t[s],A=Math.imul(A,16777619)>>>0;return A/4294967296}function Pf(t,e,n,A,s,r,o){const i=new DataView(t.buffer,t.byteOffset,t.byteLength),a=o.filter;let c=0;const l=[];wn(t,e,C=>{mr(C,A,s,r,a)&&(c++,l.push(Wf(t,C.at+32,C.at+32+C.nameBytes-1)))});const g=Math.max(1,Math.min(o.maxReads,o.maxRows*zf)),f=c<=g?1:g/c,h=f<1,u=[],I=[];let d=0;return wn(t,e,C=>{!mr(C,A,s,r,a)||l[d++]>=f||I.push(Xf(t,i,C,o,u))}),{pile:sh(I,n,A,s,r,o),total:c,kept:I.length,capped:h,rows:u.length,usedMd:I.some(C=>C.fromMd),usedCigar:I.some(C=>C.fromCigar)}}const zf=8;function mr(t,e,n,A,s){return t.refId!==e||(t.flag&s.exclude)!==0||t.mapq<s.minMapq?!1:t.pos>=0&&t.end>n&&t.pos<A}function Xf(t,e,n,A,s){const r=Pe(t,n),o=r===null?n.cigarOps:r.length,i=h=>r===null?e.getUint32(n.cigarAt+h*4,!0):r[h],a=[];let c=0,l=0;for(let h=0;h<o;h++){const u=i(h);a.push(u);const I=u&15,d=u>>>4;I===4&&(h===0||h===1&&(i(0)&15)===5?c=d:(h===o-1||h===o-2&&(i(o-1)&15)===5)&&(l=d))}const g=jf(t,n,a,A.reference),f=Zf(s,n.pos-c,n.end+l);return{refStart:n.pos,refEnd:n.end,clipStart:c,clipEnd:l,row:f,flag:n.flag,mapq:n.mapq,mateContig:n.nextRefId,matePos:n.nextPos,tlen:n.tlen,name:xl(t,n),ops:a,diffPos:g.pos,diffBase:g.base,fromMd:g.fromMd,fromCigar:g.fromCigar,mods:A.colourBy==="basemod"?ti(t,n,a):null}}const Vf=3;function Zf(t,e,n){for(let A=0;A<t.length;A++)if(t[A]+Vf<=e)return t[A]=n,A;return t.push(n),t.length-1}function FA(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[cs.charCodeAt(s)]}function jf(t,e,n,A){const s={pos:[],base:[],fromMd:!1,fromCigar:!1};if(n.some(o=>(o&15)===8)){let o=e.pos,i=0;for(const a of n){const c=a&15,l=a>>>4;if(c===8){const g=Math.min(l,e.seqLength-i);for(let f=0;f<g;f++)s.pos.push(o+f),s.base.push(FA(t,e.seqAt,i+f))}mt(c)&&(o+=l),Ot(c)&&(i+=l)}return s.fromCigar=!0,s}const r=th(t,e);if(r!==null)return eh(t,e,n,r,s),s.fromMd=!0,s;if(A!==void 0){let o=e.pos,i=0;const a=A.start+A.bases.length;for(const c of n){const l=c&15,g=c>>>4;if(mt(l)&&Ot(l)){const f=Math.max(0,A.start-o),h=Math.min(g,a-o,e.seqLength-i);for(let u=f;u<h;u++){const I=o+u-A.start,d=Ne[A.bases[I]],C=FA(t,e.seqAt,i+u);d!==C&&d<4&&C<4&&(s.pos.push(o+u),s.base.push(C))}}mt(l)&&(o+=g),Ot(l)&&(i+=g)}}return s}function th(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=String.fromCharCode(t[A],t[A+1]),o=String.fromCharCode(t[A+2]);if(A+=3,r==="MD"&&o==="Z"){let i=A;for(;i<s&&t[i]!==0;)i++;return new TextDecoder().decode(t.subarray(A,i))}if(A=as(t,A,o,s),A<0)return null}return null}function eh(t,e,n,A,s){const r=[],o=[];let i=e.pos,a=0;for(const l of n){const g=l&15,f=l>>>4;if(mt(g)&&Ot(g)){const h=Math.min(f,e.seqLength-a);for(let u=0;u<h;u++)r.push(i+u),o.push(a+u)}mt(g)&&(i+=f),Ot(g)&&(a+=f)}let c=0;for(const l of A.match(/(\d+|\^[A-Za-z]+|[A-Za-z])/g)??[]){if(l.charCodeAt(0)===94)continue;const g=Number(l);if(Number.isFinite(g)&&l!==""){c+=g;continue}c<r.length&&(s.pos.push(r[c]),s.base.push(FA(t,e.seqAt,o[c]))),c+=1}}const Si=1e3;function nh(t,e,n){switch(e){case"strand":return(t.flag&At.REVERSE)!==0?1:0;case"mapq":return t.mapq===0?0:t.mapq<30?1:2;case"pair":return(t.flag&At.PAIRED)===0?0:(t.flag&At.PROPER_PAIR)!==0?1:2;case"mate":return(t.flag&At.PAIRED)===0?0:(t.flag&At.MATE_UNMAPPED)!==0||t.mateContig<0?1:t.mateContig===n?2:3;case"insert":{const A=Math.abs(t.tlen);return(t.flag&At.PAIRED)===0||A===0?0:A>Si?2:1}default:return 0}}function Ah(t){switch(t){case"strand":return["forward","reverse"];case"mapq":return["MAPQ 0","MAPQ < 30","MAPQ ≥ 30"];case"pair":return["unpaired","proper pair","not a proper pair"];case"mate":return["unpaired","mate unmapped","same sequence","another sequence"];case"insert":return["unpaired","ordinary insert",`insert > ${Si}`];case"basemod":return["reads"];default:return["reads"]}}function sh(t,e,n,A,s,r){const o=t.length,i={contig:e,start:A,end:s,length:o,refStart:new Int32Array(o),refEnd:new Int32Array(o),clipStart:new Int32Array(o),clipEnd:new Int32Array(o),row:new Int16Array(o),flags:new Uint16Array(o),mapq:new Uint8Array(o),mateContig:new Int32Array(o),matePos:new Int32Array(o),tlen:new Int32Array(o),group:new Uint8Array(o),mate:new Int32Array(o).fill(-1),opAt:new Int32Array(o+1),opCode:new Uint8Array(t.reduce((l,g)=>l+g.ops.length,0)),opLen:new Int32Array(t.reduce((l,g)=>l+g.ops.length,0)),diffAt:new Int32Array(o+1),diffPos:new Int32Array(t.reduce((l,g)=>l+g.diffPos.length,0)),diffBase:new Uint8Array(t.reduce((l,g)=>l+g.diffPos.length,0)),contigs:[],groups:Ah(r.colourBy),names:[]};let a=0,c=0;for(let l=0;l<o;l++){const g=t[l];i.refStart[l]=g.refStart,i.refEnd[l]=g.refEnd,i.clipStart[l]=g.clipStart,i.clipEnd[l]=g.clipEnd,i.row[l]=g.row,i.flags[l]=g.flag,i.mapq[l]=g.mapq,i.mateContig[l]=g.mateContig,i.matePos[l]=g.matePos,i.tlen[l]=g.tlen,i.opAt[l]=a;for(const f of g.ops)i.opCode[a]=f&15,i.opLen[a]=f>>>4,a++;i.diffAt[l]=c;for(let f=0;f<g.diffPos.length;f++)i.diffPos[c]=g.diffPos[f],i.diffBase[c]=g.diffBase[f],c++;r.withNames&&i.names.push(g.name)}i.opAt[o]=a,i.diffAt[o]=c,r.colourBy==="basemod"&&(i.mods=rh(t));for(let l=0;l<o;l++)i.group[l]=nh(t[l],r.colourBy,n);return oh(i,n,e,r),ih(i,t),i}function rh(t){const e=new Map;let n=0;for(const i of t)for(const a of i.mods??[]){const c=e.get(a.code)??[0,0];a.prob>=128&&c[0]++,c[1]++,e.set(a.code,c),n++}const A=[...e.entries()].sort((i,a)=>a[1][0]-i[1][0]||a[1][1]-i[1][1]||(i[0]<a[0]?-1:1)),s=new Map(A.map(([i],a)=>[i,a])),r={at:new Int32Array(t.length+1),pos:new Int32Array(n),code:new Uint8Array(n),prob:new Uint8Array(n),codes:A.map(([i])=>i),counts:A.map(([,[i]])=>i)};let o=0;for(let i=0;i<t.length;i++){r.at[i]=o;for(const a of t[i].mods??[])r.pos[o]=a.pos,r.code[o]=s.get(a.code)??0,r.prob[o]=a.prob,o++}return r.at[t.length]=o,r}function oh(t,e,n,A){const s=new Map;for(let r=0;r<t.length;r++){const o=t.mateContig[r];if(o<0){t.mateContig[r]=-1;continue}let i=s.get(o);i===void 0&&(i=t.contigs.length,t.contigs.push(o===e?n:A.refNameOf?.(o)??""),s.set(o,i)),t.mateContig[r]=i}}function ih(t,e){const n=new Map;for(let A=0;A<e.length;A++){const s=e[A].name;if(s===""||(t.flags[A]&At.SUPPLEMENTARY)!==0)continue;const r=n.get(s);if(r===void 0){n.set(s,A);continue}t.mate[r]===-1&&t.mate[A]===-1&&((t.flags[r]^t.flags[A])&(At.FIRST_IN_PAIR|At.SECOND_IN_PAIR))!==0&&(t.mate[r]=A,t.mate[A]=r)}}function Ri(t){const e=t.split(`
|
|
10
|
+
`,200);let n=0;for(const A of e){const s=A.trim();if(s==="")continue;if(/^(fixedStep|variableStep)\b/i.test(s))return"wig";if(/^track\b/i.test(s)){if(/type\s*=\s*"?bedGraph/i.test(s))return"bedgraph";if(/type\s*=\s*"?wiggle_0/i.test(s))return"wig";continue}if(s.startsWith("#")||/^browser\b/i.test(s))continue;const r=s.split(/\t| +/);if(r.length!==4||!R(r[1])||!R(r[2]))return null;const o=Number(r[3]);if(!Number.isFinite(o)||r[3].trim()==="")return null;if(n+=1,n>=4)return"bedgraph"}return n>0?"bedgraph":null}class Qs{constructor(e){this.name=e}starts=[];ends=[];values=[];push(e,n,A){this.starts.push(e),this.ends.push(n),this.values.push(A)}get length(){return this.starts.length}finish(){const e=this.starts.length,n=Int32Array.from({length:e},(i,a)=>a);let A=!0;for(let i=1;i<e;i++)if(this.starts[i]<this.starts[i-1]){A=!1;break}A||n.sort((i,a)=>this.starts[i]-this.starts[a]);const s=new Int32Array(e),r=new Int32Array(e),o=new Float32Array(e);for(let i=0;i<e;i++){const a=n[i];s[i]=this.starts[a],r[i]=this.ends[a],o[i]=this.values[a]}return{name:this.name,starts:s,ends:r,values:o}}}function Li(t){const e=new Map;let n=Number.POSITIVE_INFINITY,A=Number.NEGATIVE_INFINITY,s=0;for(const r of t.split(`
|
|
11
|
+
`)){const o=r.trim();if(o===""||o.startsWith("#")||/^(track|browser)\b/i.test(o))continue;const i=o.split(/\t| +/);if(i.length<4)continue;const a=Number(i[1]),c=Number(i[2]),l=Number(i[3]);if(!Number.isInteger(a)||!Number.isInteger(c)||!Number.isFinite(l)||c<=a)continue;let g=e.get(i[0]);g===void 0&&(g=new Qs(i[0]),e.set(i[0],g)),g.push(a,c,l),s+=1,l<n&&(n=l),l>A&&(A=l)}return Bs(e,s,n,A)}function xi(t){const e=new Map;let n=Number.POSITIVE_INFINITY,A=Number.NEGATIVE_INFINITY,s=0,r=null,o="",i=1,a=1,c=0,l=null;const g=(f,h)=>{l===null||!Number.isFinite(h)||(l.push(f,f+i,h),s+=1,h<n&&(n=h),h>A&&(A=h))};for(const f of t.split(`
|
|
12
|
+
`)){const h=f.trim();if(h===""||h.startsWith("#")||/^(track|browser)\b/i.test(h))continue;const u=/^(fixedStep|variableStep)\s+(.*)$/i.exec(h);if(u!==null){r=u[1].toLowerCase()==="fixedstep"?"fixed":"variable";const I=new Map;for(const d of u[2].split(/\s+/)){const C=d.indexOf("=");C>0&&I.set(d.slice(0,C).toLowerCase(),d.slice(C+1))}if(o=I.get("chrom")??"",i=Number(I.get("span")??1)||1,a=Number(I.get("step")??1)||1,c=(Number(I.get("start")??1)||1)-1,o===""){l=null;continue}l=e.get(o)??new Qs(o),e.set(o,l);continue}if(!(r===null||l===null))if(r==="fixed")g(c,Number(h)),c+=a;else{const I=h.split(/\t| +/);if(I.length<2)continue;const d=Number(I[0]);if(!Number.isInteger(d))continue;g(d-1,Number(I[1]))}}return Bs(e,s,n,A)}function Bs(t,e,n,A){const s=[];for(const r of t.values())r.length>0&&s.push(r.finish());return{contigs:s,length:e,min:Number.isFinite(n)?n:0,max:Number.isFinite(A)?A:0}}class Gi{constructor(e){this.set=e;for(const n of e.contigs)this.byName.set(n.name,n)}byName=new Map;held(e){const n=this.byName.get(e);if(n!==void 0)return n;const A=Kt(this.set.contigs,e);return A<0?void 0:this.set.contigs[A]}get contigNames(){return this.set.contigs.map(e=>e.name)}get extent(){return{min:this.set.min,max:this.set.max}}get length(){return this.set.length}has(e){return this.held(e)!==void 0}samples(e,n,A,s){const r=this.held(e);if(r===void 0||A<=n)return null;const o=ah(r.ends,n);let i=o;for(;i<r.starts.length&&r.starts[i]<A;)i+=1;if(i<=o)return{starts:new Int32Array(0),ends:new Int32Array(0),values:new Float32Array(0),min:null,max:null,summary:!1};const a=Math.max(1,s),c=Math.ceil((A-n)/a);if(i-o<=c)return{starts:r.starts.slice(o,i),ends:r.ends.slice(o,i),values:r.values.slice(o,i),min:null,max:null,summary:!1};const l=new Int32Array(c),g=new Int32Array(c),f=new Float32Array(c),h=new Float32Array(c),u=new Float32Array(c),I=new Float64Array(c),d=new Float64Array(c);h.fill(Number.NaN),u.fill(Number.NaN);for(let C=0;C<c;C++)l[C]=Math.round(n+C*a),g[C]=Math.round(Math.min(A,n+(C+1)*a));for(let C=o;C<i;C++){const B=Math.max(r.starts[C],n),Q=Math.min(r.ends[C],A);if(Q<=B)continue;const E=r.values[C],m=Math.max(0,Math.floor((B-n)/a)),p=Math.min(c-1,Math.floor((Q-1-n)/a));for(let w=m;w<=p;w++){const y=Math.min(Q,g[w])-Math.max(B,l[w]);y<=0||(d[w]+=E*y,I[w]+=y,(Number.isNaN(h[w])||E<h[w])&&(h[w]=E),(Number.isNaN(u[w])||E>u[w])&&(u[w]=E))}}for(let C=0;C<c;C++)f[C]=I[C]>0?d[C]/I[C]:Number.NaN;return{starts:l,ends:g,values:f,min:h,max:u,summary:!0}}}function ah(t,e){let n=0,A=t.length;for(;n<A;){const s=n+A>>1;t[s]<=e?n=s+1:A=s}return n}const ch=1<<18,lh=64<<20;class wr extends Do{constructor(e,n,A=ch,s=lh){super(e,n),this.chunkBytes=A,this.budgetBytes=s}chunks=new Map;inflight=new Map;held=0;end=null;fetched=0;requests=0;async read(e,n,A){if(e<=0||this.end!==null&&n>=this.end)return new Uint8Array(0);const s=Math.floor(n/this.chunkBytes),r=Math.floor((n+e-1)/this.chunkBytes),o=[];let i=null;const a=[];for(let g=s;g<=r;g++){const f=this.inflight.get(g);if(this.chunks.has(g)||f!==void 0){f!==void 0&&!o.includes(f)&&o.push(f),i!==null&&a.push([i,g-1]),i=null;continue}i===null&&(i=g)}i!==null&&a.push([i,r]);for(const[g,f]of a){const h=this.fetchRun(g,f,A);for(let I=g;I<=f;I++)this.inflight.set(I,h);const u=()=>{for(let I=g;I<=f;I++)this.inflight.get(I)===h&&this.inflight.delete(I)};h.then(u,u),o.push(h)}await Promise.all(o);const c=new Uint8Array(e);let l=0;for(let g=s;g<=r;g++){const f=this.chunks.get(g);if(f===void 0)break;this.touch(g,f);const h=g*this.chunkBytes,u=Math.max(n,h)-h,I=Math.min(n+e,h+f.length)-h;if(I<=u||(c.set(f.subarray(u,I),Math.max(n,h)-n),l=Math.max(n,h)-n+(I-u),f.length<this.chunkBytes))break}return l===e?c:c.subarray(0,l)}async fetchRun(e,n,A){const s=e*this.chunkBytes;let r=(n-e+1)*this.chunkBytes;if(this.end!==null&&(r=Math.min(r,Math.max(0,this.end-s))),r<=0)return;this.requests+=1;const o=await super.read(r,s,A);this.fetched+=o.length,o.length<r&&(this.end=s+o.length);for(let i=e;i<=n;i++){const a=(i-e)*this.chunkBytes;if(a>=o.length)break;this.store(i,o.slice(a,Math.min(a+this.chunkBytes,o.length)))}}store(e,n){const A=this.chunks.get(e);for(A!==void 0&&(this.held-=A.length),this.chunks.set(e,n),this.held+=n.length;this.held>this.budgetBytes&&this.chunks.size>1;){const s=this.chunks.keys().next().value,r=this.chunks.get(s);this.chunks.delete(s),this.held-=r.length}}touch(e,n){this.chunks.delete(e),this.chunks.set(e,n)}}const gh=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),fh=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),yt=64,vi=32;function pt(t,e){return t>>>e|t<<32-e}function hn(t){const e=new Uint32Array(fh),n=new Uint32Array(64),A=t.length*8,s=new Uint8Array((Math.floor((t.length+8)/yt)+1)*yt);s.set(t),s[t.length]=128;const r=new DataView(s.buffer);r.setUint32(s.length-8,Math.floor(A/4294967296),!1),r.setUint32(s.length-4,A>>>0,!1);for(let a=0;a<s.length;a+=yt){for(let C=0;C<16;C++)n[C]=r.getUint32(a+C*4,!1);for(let C=16;C<64;C++){const B=n[C-15],Q=n[C-2],E=pt(B,7)^pt(B,18)^B>>>3,m=pt(Q,17)^pt(Q,19)^Q>>>10;n[C]=n[C-16]+E+n[C-7]+m>>>0}let[c,l,g,f,h,u,I,d]=e;for(let C=0;C<64;C++){const B=pt(h,6)^pt(h,11)^pt(h,25),Q=h&u^~h&I,E=d+B+Q+gh[C]+n[C]>>>0,m=pt(c,2)^pt(c,13)^pt(c,22),p=c&l^c&g^l&g,w=m+p>>>0;d=I,I=u,u=h,h=f+E>>>0,f=g,g=l,l=c,c=E+w>>>0}e[0]=e[0]+c>>>0,e[1]=e[1]+l>>>0,e[2]=e[2]+g>>>0,e[3]=e[3]+f>>>0,e[4]=e[4]+h>>>0,e[5]=e[5]+u>>>0,e[6]=e[6]+I>>>0,e[7]=e[7]+d>>>0}const o=new Uint8Array(vi),i=new DataView(o.buffer);for(let a=0;a<8;a++)i.setUint32(a*4,e[a],!1);return o}function Ge(t,e){const n=new Uint8Array(yt);n.set(t.length>yt?hn(t):t);const A=new Uint8Array(yt+e.length),s=new Uint8Array(yt+vi);for(let r=0;r<yt;r++)A[r]=n[r]^54,s[r]=n[r]^92;return A.set(e,yt),s.set(hn(A),yt),hn(s)}function pr(t){let e="";for(const n of t)e+=n.toString(16).padStart(2,"0");return e}function te(t){return new TextEncoder().encode(t)}const hh="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",yr="AWS4-HMAC-SHA256",Ui="s3",Ti="aws4_request";function uh(t){const e=(n,A=2)=>String(n).padStart(A,"0");return`${e(t.getUTCFullYear(),4)}${e(t.getUTCMonth()+1)}${e(t.getUTCDate())}T${e(t.getUTCHours())}${e(t.getUTCMinutes())}${e(t.getUTCSeconds())}Z`}function SA(t){return encodeURIComponent(t).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Ih(t){return t===""?"/":t.split("/").map(e=>SA(decodeURIComponent(e))).join("/")}function dh(t){const e=[];return t.forEach((n,A)=>e.push([SA(A),SA(n)])),e.sort((n,A)=>n[0]===A[0]?n[1]<A[1]?-1:1:n[0]<A[0]?-1:1),e.map(([n,A])=>`${n}=${A}`).join("&")}let nn=null;function Ch(t,e,n){const A=`${t}|${e}|${n}`;if(nn!==null&&nn.id===A)return nn.key;const s=Ge(te(`AWS4${t}`),te(e)),r=Ge(s,te(n)),o=Ge(r,te(Ui)),i=Ge(o,te(Ti));return nn={id:A,key:i},i}function Qh(t){const e=new URL(t.url),n=t.now??new Date,A=uh(n),s=A.slice(0,8),r=t.payloadHash??hh,{credential:o}=t,i=[["host",e.host],["x-amz-content-sha256",r],["x-amz-date",A]];o.sessionToken!==void 0&&o.sessionToken!==""&&i.push(["x-amz-security-token",o.sessionToken]);const a=i.map(([I,d])=>`${I}:${d.trim()}
|
|
13
|
+
`).join(""),c=i.map(([I])=>I).join(";"),l=[t.method.toUpperCase(),Ih(e.pathname),dh(e.searchParams),a,c,r].join(`
|
|
14
|
+
`),g=`${s}/${o.region}/${Ui}/${Ti}`,f=[yr,A,g,pr(hn(te(l)))].join(`
|
|
15
|
+
`),h=pr(Ge(Ch(o.secretAccessKey,s,o.region),te(f))),u={Authorization:`${yr} Credential=${o.accessKeyId}/${g}, SignedHeaders=${c}, Signature=${h}`,"x-amz-content-sha256":r,"x-amz-date":A};return o.sessionToken!==void 0&&o.sessionToken!==""&&(u["x-amz-security-token"]=o.sessionToken),u}function Bh(t){const e={...t.headers};return t.credential===void 0?e:{...e,...Qh({method:(t.method??"GET").toUpperCase(),url:t.url,credential:t.credential})}}function Ji(t,e){const n=e.method??Eh(t);return{...t,headers:{...mh(t?.headers),...Bh({...e,method:n})}}}function Eh(t){const e=t?.method;return typeof e=="string"&&e!==""?e:"GET"}function mh(t){if(t===void 0)return{};if(typeof Headers<"u"&&t instanceof Headers){const e={};return t.forEach((n,A)=>{e[A]=n}),e}return Array.isArray(t)?Object.fromEntries(t):{...t}}function wh(t){const e=[],n=new Set,A=s=>{if(!(s===null||typeof s!="object")){if(ArrayBuffer.isView(s)){const r=s.buffer;r instanceof ArrayBuffer&&!n.has(r)&&(n.add(r),e.push(r));return}if(Array.isArray(s)){if(s.length===0||typeof s[0]!="object")return;for(const r of s)A(r);return}for(const r of Object.values(s))A(r)}};return A(t),e}function Es(){return typeof MessageChannel>"u"?new Promise(t=>{setTimeout(t,0)}):new Promise(t=>{const e=new MessageChannel;e.port1.onmessage=()=>{e.port1.close(),e.port2.close(),t()},e.port2.postMessage(void 0)})}const ph=200,yh=3e3,Nh=3e4,kh=1e3;function bh(t=ph,e=yh){const n=[];let A=performance.now();const s=setInterval(()=>{const r=performance.now(),o=r-A;for(A=r,o<Nh?n.push({at:r,span:o,late:Math.max(0,o-t)}):n.length=0;n.length>0&&r-n[0].at>e;)n.shift()},t);return{busy(){if(n.length<3)return 0;let r=0,o=0;for(const i of n)r+=i.span,o+=i.late;return r<=0?0:Math.min(1,o/r)},reset(){n.length=0,A=performance.now()},stop(){clearInterval(s)}}}function Mh(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#")||/^(track|browser)\b/.test(s))continue;const r=s.split(/\s+/);if(r.length<2)return[];const o=Number(r[1]);if(!Number.isInteger(o)||o<=0)return[];n.has(r[0])||(n.add(r[0]),e.push({name:r[0],length:o}))}return e}function Dh(t,e=""){const n=/\.fai$/i.test(e);let A=0;for(const s of t.split(/\r?\n/,200)){const r=s.trim();if(r===""||r.startsWith("#")||/^(track|browser)\b/.test(r))continue;const o=r.split(/\s+/);if((n?o.length<2:o.length!==2)||!/^\d+$/.test(o[1])||Number(o[1])<=0)return!1;A++}return A>0}const Fh=4096;function Sh(t,e){const n=Kt(t.contigs,e);return n<0?void 0:t.contigs[n]}function Rh(t,e,n){const A=Sh(t,e.contig);if(A===void 0||A.bins===0)return null;const s=Math.max(0,Math.floor(e.start)),r=Math.min(A.length,Math.ceil(e.end));if(!(r>s))return null;const o=Math.floor(s/t.binsize),i=Math.min(A.bins-1,Math.floor((r-1)/t.binsize));if(i<o)return null;const a=i-o+1,c=n?1:Math.max(1,Math.ceil(a/Fh)),l=Math.ceil(a/c),g=new Int32Array(l),f=new Int32Array(l),h=new Float32Array(l),u=c>1?new Float32Array(l):null,I=c>1?new Float32Array(l):null;let d=0;for(let C=0;C<l;C++){const B=o+C*c,Q=Math.min(i+1,B+c);let E=0,m=0,p=Number.POSITIVE_INFINITY,w=Number.NEGATIVE_INFINITY;for(let y=B;y<Q;y++){const N=A.startBin+y-t.firstBin;if(N<0||N>=t.values.length)continue;const k=t.values[N];Number.isNaN(k)||(E+=k,m++,k<p&&(p=k),k>w&&(w=k))}m!==0&&(g[d]=B*t.binsize,f[d]=Math.min(A.length,Q*t.binsize),h[d]=E/m,u!==null&&I!==null&&(u[d]=p,I[d]=w),d++)}return d===0?null:{contig:e.contig,start:s,end:r,starts:g.slice(0,d),ends:f.slice(0,d),values:h.slice(0,d),min:u===null?null:u.slice(0,d),max:I===null?null:I.slice(0,d),variant:null,summary:c>1}}function Lh(t,e,n,A=!1){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const i of e){const a=Rh(t,i,A);if(a!==null){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push(a)}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}function T(t,e,n){const A=t[e];return typeof A=="number"&&Number.isFinite(A)?A:n}function st(t,e,n){const A=t[e];return typeof A=="string"?A:n}function Lt(t,e,n){const A=t[e];return typeof A=="boolean"?A:n}function On(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n!==""?[n]:[]}function Yn(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n.trim()!==""?[n.trim()]:null}function at(t,e){const n=t[e];return typeof n=="string"&&n!==""?n:null}function ne(t,e,n){return{value:t?.[n],chosen:at(e,n)!==null}}function _n(t,e){return t.value!==void 0?null:t.chosen?e.gone:e.unchosen}function xh(t){let e=0,n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isNaN(s)||(e+=s,n++)}return n===0?Number.NaN:e/n}function $i(t){const e=ms(t);return ws(e,.5)}function Gh(t,e){const n=ms(t),A=n.length;if(A===0)return Number.NaN;const s=Number.isFinite(e)?Math.min(.5,Math.max(0,e)):0,r=Math.floor(A*s);if(A-2*r<=0)return ws(n,.5);let o=0;for(let i=r;i<A-r;i++)o+=n[i];return o/(A-2*r)}function Bt(t,e=0,n=t.length-e){if(n<8){let s=0;for(let r=0;r<n;r++)s+=t[e+r];return s}if(n<=128){let s=t[e],r=t[e+1],o=t[e+2],i=t[e+3],a=t[e+4],c=t[e+5],l=t[e+6],g=t[e+7],f=8;for(;f<n-n%8;f+=8){const u=e+f;s+=t[u],r+=t[u+1],o+=t[u+2],i+=t[u+3],a+=t[u+4],c+=t[u+5],l+=t[u+6],g+=t[u+7]}let h=s+r+(o+i)+(a+c+(l+g));for(;f<n;f++)h+=t[e+f];return h}let A=Math.floor(n/2);return A-=A%8,Bt(t,e,A)+Bt(t,e+A,n-A)}function RA(t,e=0,n=t.length-e){return Bt(t,e,n)/n}const bn=3;function Oi(t,e){const n=Math.min(t.length,e.length);let A=0,s=0,r=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];Number.isNaN(f)||Number.isNaN(h)||(s+=f,r+=h,A++)}if(A<bn)return Number.NaN;const o=s/A,i=r/A;let a=0,c=0,l=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];if(Number.isNaN(f)||Number.isNaN(h))continue;const u=f-o,I=h-i;a+=u*I,c+=u*u,l+=I*I}return c<=0||l<=0?Number.NaN:a/Math.sqrt(c*l)}function vh(t,e){const n=Math.min(t.length,e.length);let A=0;for(let i=0;i<n;i++)!Number.isNaN(t[i])&&!Number.isNaN(e[i])&&A++;if(A<bn)return Number.NaN;const s=new Float64Array(A),r=new Float64Array(A);let o=0;for(let i=0;i<n;i++){const a=t[i],c=e[i];Number.isNaN(a)||Number.isNaN(c)||(s[o]=a,r[o]=c,o++)}return Oi(Nr(s),Nr(r))}function Nr(t){const e=t.length,n=new Float64Array(e),A=[];for(let r=0;r<e;r++)Number.isNaN(t[r])?n[r]=Number.NaN:A.push(r);A.sort((r,o)=>t[r]-t[o]);let s=0;for(;s<A.length;){let r=s+1;for(;r<A.length&&t[A[r]]===t[A[s]];)r++;const o=(s+r+1)/2;for(let i=s;i<r;i++)n[A[i]]=o;s=r}return n}function Yi(t,e){const n=Math.max(1,Math.trunc(e)),A=ms(t);if(A.length===0)return new Float64Array(0);const s=new Float64Array(n+1);for(let r=0;r<=n;r++)s[r]=ws(A,r/n);return s}function ms(t){let e=0;for(let s=0;s<t.length;s++)Number.isNaN(t[s])||e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++){const r=t[s];Number.isNaN(r)||(n[A]=r,A++)}return n.sort(),n}function ws(t,e){const n=t.length;if(n===0)return Number.NaN;if(n===1)return t[0];const A=Math.min(1,Math.max(0,e))*(n-1),s=Math.floor(A),r=Math.min(n-1,s+1),o=A-s;return t[s]+o*(t[r]-t[s])}const Uh=2e5,Th=50,Jh=async t=>{const e=On(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig and tick it under Tracks."),[];const n=ne(t.inputs.features,t.params,"features"),A=n.value;if(A===void 0)return t.note(_n(n,{unchosen:"A FRiP needs the features to measure inside, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),[];const s=[];let r=0;for(let Q=0;Q<A.contigs.length;Q++){const E=A.contigs[Q];let m=Number.NaN,p=Number.NaN;const w=()=>{Number.isNaN(m)||(s.push({contig:E,start:m,end:p}),r+=p-m)};for(let y=A.contigAt[Q];y<A.contigAt[Q+1];y++){const N=A.start[y],k=A.end[y];k<=N||(Number.isNaN(m)?(m=N,p=k):N<=p?p=Math.max(p,k):(w(),m=N,p=k))}w()}if(s.length===0)return t.note("The feature set covers no bases, so there is nothing to measure inside."),[];const o=t.inputs.contigLengths??{};let i=0;for(const Q of Object.values(o))i+=Q;i<=0&&t.note("This session knows no sequence lengths, so the fraction of the assembly the set covers cannot be worked out and the enrichment column is left empty. Load a chrom.sizes, or the map itself.");const a=new Float64Array(s.length);for(let Q=0;Q<s.length;Q++)a[Q]=s[Q].end-s[Q].start;const c=$i(a),l=Math.max(0,Math.round(T(t.params,"resolution",0))),g=l>0?l:Math.max(1,Math.round(c/Th)),f=i>0?Math.max(1,Math.round(i/Uh)):g,h=[];for(const[Q,E]of Object.entries(o))E>0&&h.push({contig:Q,start:0,end:E});const u=Q=>t.inputs.labels?.[Q]??Q,I=[],d=[],C=Lt(t.params,"perFeature",!1);for(let Q=0;Q<e.length;Q++){t.throwIfCancelled();const E=e[Q],m=u(E);t.progress(Q,e.length,`${m} · features`);const p=await kr(t,E,s,g);t.throwIfCancelled(),t.progress(Q+.5,e.length,`${m} · assembly`);const w=h.length>0?await kr(t,E,h,f):{signal:Number.NaN},y=w.signal>0?p.signal/w.signal:Number.NaN,N=i>0?r/i:Number.NaN;if(I.push({track:m,frip:y,covered:N,enrichment:N>0?y/N:Number.NaN,signal:p.signal,totalSignal:w.signal,inFeature:p.span>0?p.covered/p.span:Number.NaN}),C){const k=await $h(t,E,A,g);t.throwIfCancelled();for(const b of k)d.push({track:m,...b,share:w.signal>0?Number(b.signal)/w.signal:Number.NaN})}}t.progress(e.length,e.length,"done"),t.note(`Features read at ${g.toLocaleString()} bp and the assembly at ${f.toLocaleString()} bp — a span-weighted sum estimates the same area at either, and the finer one is spent where the boundaries are.`);const B=[{kind:"table",id:"frip",label:`In ${s.length.toLocaleString()} merged feature${s.length===1?"":"s"}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"frip",label:"FRiP",kind:"number",digits:4,hint:"Signal inside over signal everywhere."},{key:"covered",label:"Genome covered",kind:"number",digits:4,hint:"Merged bases of the set over the assembly."},{key:"enrichment",label:"Enrichment",kind:"number",digits:2,hint:"FRiP over the covered fraction. 1 is a track with no preference."},{key:"signal",label:"Signal inside",kind:"number",digits:0},{key:"totalSignal",label:"Signal total",kind:"number",digits:0},{key:"inFeature",label:"Set with data",kind:"number",digits:3,hint:"Of the set’s bases, how many the track has a value for."}],rows:I.sort((Q,E)=>Number(E.enrichment)-Number(Q.enrichment))}];return C&&d.length>0&&B.push({kind:"table",id:"frip-features",label:"Per feature",columns:[{key:"track",label:"Track",kind:"text"},{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},{key:"signal",label:"Signal",kind:"number",digits:2},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"share",label:"Share of total",kind:"number",digits:6,hint:"This feature’s signal over the track’s whole signal."}],rows:d.sort((Q,E)=>Number(E.signal)-Number(Q.signal))}),B};async function kr(t,e,n,A){const s=new Map;for(const a of n){const c=s.get(a.contig);c===void 0?s.set(a.contig,[a]):c.push(a)}let r=0,o=0,i=0;for(const[,a]of s){t.throwIfCancelled();for(const g of a)o+=g.end-g.start;const c=await t.sample(e,a,A),l=new Map;for(const g of a)l.set(Mn(g),g);for(const g of c.regions){const f=l.get(Mn(g));if(f!==void 0)for(let h=0;h<g.values.length;h++){const u=g.values[h];if(!Number.isFinite(u))continue;const I=Math.max(f.start,g.starts[h]),d=Math.min(f.end,g.ends[h]);d<=I||(r+=u*(d-I),i+=d-I)}}}return{signal:r,span:o,covered:i}}async function $h(t,e,n,A){const s=[],r=new Map;for(let o=0;o<n.length;o++){const i=n.contigs[n.contig[o]],a=r.get(i);a===void 0?r.set(i,[o]):a.push(o)}for(const[,o]of r){t.throwIfCancelled();const i=o.map(l=>Oh(n,l)),a=await t.sample(e,i,A),c=new Map;for(const l of a.regions)c.set(Mn(l),l);for(let l=0;l<o.length;l++){const g=i[l],f=c.get(Mn(g));if(f===void 0)continue;let h=0,u=0;for(let I=0;I<f.values.length;I++){const d=f.values[I];if(!Number.isFinite(d))continue;const C=Math.max(g.start,f.starts[I]),B=Math.min(g.end,f.ends[I]);B<=C||(h+=d*(B-C),u+=B-C)}s.push({contig:g.contig,start:g.start,end:g.end,name:n.name[o[l]]??"",signal:h,mean:u>0?h/u:Number.NaN})}}return s}function Oh(t,e){return{contig:t.contigs[t.contig[e]],start:t.start[e],end:t.end[e]}}function Mn(t){return`${t.contig}:${t.start}-${t.end}`}function Yh(t){return .5*_h(-t/Math.SQRT2)}function _h(t){const e=Math.abs(t),n=e<2?1-Kh(e):qh(e);return t>=0?n:2-n}function Kh(t){let e=t,n=t;for(let A=1;A<200&&(e*=2*t*t/(2*A+1),n+=e,!(e<Math.abs(n)*1e-17));A++);return 2/Math.sqrt(Math.PI)*Math.exp(-t*t)*n}function qh(t){let n=1/t,A=1e300,s=n;for(let r=1;r<300;r++){const o=r/2;n=t+o*n,n===0&&(n=1e-300),A=t+o/A,A===0&&(A=1e-300),n=1/n;const i=A*n;if(s*=i,Math.abs(i-1)<1e-16)break}return Math.exp(-t*t)/Math.sqrt(Math.PI)*s}function Hh(t){const e=t.length,n=new Float64Array(e).fill(Number.NaN),A=[];for(let o=0;o<e;o++)Number.isFinite(t[o])&&A.push(o);A.sort((o,i)=>t[i]-t[o]);const s=A.length;let r=Number.POSITIVE_INFINITY;for(let o=0;o<s;o++){const i=s/(s-o);r=Math.min(r,i*t[A[o]]),n[A[o]]=Math.min(1,r)}return n}function _i(t){return t.rows[1]<=t.rows[0]&&t.cols[1]<=t.cols[0]}function Ae(t){let e=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&(n[A++]=t[s]);return n.sort()}function Te(t,e){const n=t.length;if(n===0)return Number.NaN;const A=Math.min(n-1,Math.max(0,e*(n-1))),s=Math.floor(A),r=Math.min(n-1,s+1);return t[s]+(t[r]-t[s])*(A-s)}function Wh(t){const e=Ae(t),n=e.length;if(n===0)return{n:0,mean:Number.NaN,sd:Number.NaN,median:Number.NaN,q1:Number.NaN,q3:Number.NaN};let A=0;for(let o=0;o<n;o++)A+=e[o];const s=A/n;let r=0;for(let o=0;o<n;o++)r+=(e[o]-s)**2;return{n,mean:s,sd:n>1?Math.sqrt(r/(n-1)):Number.NaN,median:Te(e,.5),q1:Te(e,.25),q3:Te(e,.75)}}function Ki(t){const e=t.length,n=Array.from({length:e},(o,i)=>i).sort((o,i)=>t[o]-t[i]),A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o+1<e&&t[n[o+1]]===t[n[r]];)o++;const i=(r+o)/2+1;for(let c=r;c<=o;c++)A[n[c]]=i;const a=o-r+1;a>1&&(s+=a*a*a-a),r=o+1}return{ranks:A,ties:s}}function Ph(t,e){const n=Ae(t),A=Ae(e),s=n.length,r=A.length;if(s===0||r===0)return{u:Number.NaN,z:Number.NaN,p:Number.NaN,effect:Number.NaN};const o=new Float64Array(s+r);o.set(n,0),o.set(A,s);const{ranks:i,ties:a}=Ki(o);let c=0;for(let C=0;C<s;C++)c+=i[C];const l=c-s*(s+1)/2,g=s+r,f=s*r/2,h=s*r/12*(g+1-a/(g*(g-1))),u=2*l/(s*r)-1;if(!(h>0))return{u:l,z:0,p:1,effect:u};const I=l-f,d=(I-.5*Math.sign(I))/Math.sqrt(h);return{u:l,z:d,p:Math.min(1,2*Yh(-Math.abs(d))),effect:u}}function zh(t){const e=t.map(Ae).filter(g=>g.length>0),n=e.length,A=e.reduce((g,f)=>g+f.length,0);if(n<2||A<2)return{h:Number.NaN,df:Math.max(0,n-1),p:Number.NaN};const s=new Float64Array(A);let r=0;for(const g of e)s.set(g,r),r+=g.length;const{ranks:o,ties:i}=Ki(s);let a=0;r=0;for(const g of e){let f=0;for(let h=0;h<g.length;h++)f+=o[r+h];a+=f*f/g.length,r+=g.length}a=12/(A*(A+1))*a-3*(A+1);const c=1-i/(A*A*A-A);if(!(c>0))return{h:Number.NaN,df:n-1,p:Number.NaN};const l=a/c;return{h:l,df:n-1,p:Xh(l,n-1)}}function Xh(t,e){return!(e>0)||Number.isNaN(t)?Number.NaN:t<=0?1:Vh(e/2,t/2)}function Vh(t,e){const n=Math.exp(-e+t*Math.log(e)-qi(t));if(e<t+1){let a=1/t,c=a;for(let l=1;l<1e3&&(a*=e/(t+l),c+=a,!(Math.abs(a)<Math.abs(c)*1e-16));l++);return Math.max(0,1-c*n)}const A=1e-300;let s=e+1-t,r=1/A,o=1/s,i=o;for(let a=1;a<1e3;a++){const c=-a*(a-t);s+=2,o=c*o+s,Math.abs(o)<A&&(o=A),r=s+c/r,Math.abs(r)<A&&(r=A),o=1/o;const l=o*r;if(i*=l,Math.abs(l-1)<1e-16)break}return Math.min(1,n*i)}function qi(t){if(t<.5)return Math.log(Math.PI/Math.sin(Math.PI*t))-qi(1-t);const e=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,15056327351493116e-23],n=t-1;let A=e[0];const s=n+7.5;for(let r=1;r<9;r++)A+=e[r]/(n+r);return .5*Math.log(2*Math.PI)+(n+.5)*Math.log(s)-s+Math.log(A)}const Zh=1e4;function jh(t){return t.end-t.start+(t.wrap??0)}const Dn=["#0072b2","#d55e00","#009e73","#cc79a7","#e69f00","#56b4e9","#f0e442","#000000"],tu="#999999",br="rest of the genome",ue=2e4,eu=async t=>{const e=On(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig, or run a task that makes one, and tick it under Tracks."),[];const n=[];for(const[Q,E]of Object.entries(t.inputs.contigLengths??{}))E>0&&n.push({name:Q,length:E});if(n.length===0)return t.note("This session knows no sequence lengths, so there is no genome to cut into stretches. Load a chrom.sizes, or the map itself."),[];const A=T(t.params,"resolution",0),s=!(A>0),r=A>0?Math.round(A):t.framing.binsize>0&&!_i(t.framing)?t.framing.binsize:Zh,o=new Set(t.framing.circular??[]);let i=st(t.params,"groupBy","features")==="track"?await Au(t,n,r,s,o):nu(t,n,s?Number.POSITIVE_INFINITY:r,o);if(i===null)return[];const a=s?{one:"entry"}:{one:"stretch"};if(i=su(i,t,a.one),i.stretches.length===0)return t.note(`No ${a.one} of the genome fell in any group, so there is nothing to compare.`),[];const c=Q=>t.inputs.labels?.[Q]??Q,l=i.names.length,g=[],f=[],h=[];for(let Q=0;Q<e.length;Q++){t.throwIfCancelled();const E=c(e[Q]);t.progress(Q,e.length,E);const m=await ps(t,e[Q],i.stretches),p=i.names.map(()=>[]);for(let k=0;k<i.stretches.length;k++)Number.isFinite(m[k])&&p[i.stretches[k].group].push(m[k]);if(p.every(k=>k.length===0)){t.note(`${E} has no value over any stretch — its sequence names may not be the assembly's.`);continue}let w=0,y=0;for(const k of p){for(const b of k)y+=b;w+=k.length}for(let k=0;k<l;k++){const b=Wh(p[k]),M=w-b.n,F=M>0?(y-b.mean*b.n)/M:Number.NaN;let S=0;for(const v of i.stretches)v.group===k&&(S+=jh(v));g.push({track:E,group:i.names[k],n:b.n,bases:S,mean:b.mean,sd:b.sd,median:b.median,q1:b.q1,q3:b.q3,vsRest:b.n>0?b.mean-F:Number.NaN})}const N=p.map((k,b)=>({group:k,g:b})).filter(k=>k.group.length>0);if(N.length>2){const k=zh(N.map(b=>b.group));f.push({track:E,test:"Kruskal–Wallis H",a:`all ${N.length} groups`,b:"",statistic:k.h,effect:Number.NaN,difference:Number.NaN,p:k.p})}for(let k=0;k<N.length;k++)for(let b=k+1;b<N.length;b++){const M=N[k],F=N[b],S=Ph(M.group,F.group);f.push({track:E,test:"Mann–Whitney U",a:i.names[M.g],b:i.names[F.g],statistic:S.u,effect:S.effect,difference:Te(Ae(M.group),.5)-Te(Ae(F.group),.5),p:S.p})}h.push({kind:"curve",id:`groupsignal-${Q+1}`,label:`${E} by ${i.of}`,series:p.map((k,b)=>{const M=au(k);return{name:i.names[b],x:Float64Array.from(M,(F,S)=>S),y:M,colour:i.colours[b],n:k.length,mark:"violin"}}),xLabel:i.of,yLabel:E,xScale:"linear",yScale:"linear"})}if(t.progress(e.length,e.length,"done"),h.length===0)return[];const u=Hh(f.map(Q=>Number(Q.p)));f.forEach((Q,E)=>{Q.q=u[E]});const I=h.some(Q=>Q.series.some(E=>(E.n??0)>ue)),d=i.stretches.length.toLocaleString(),C=s?i.segments!==void 0?`${d} entries, each a run of ${r.toLocaleString()} bp bins in one group,`:`${d} entries, each a run of features under one name or a stretch between them,`:`${d} stretches of at most ${r.toLocaleString()} bp`;t.note(`Compared over ${C} in ${l} groups, each the track's mean over the bases it has a value for.${I?` A violin of more than ${ue.toLocaleString()} is drawn from that many, evenly by rank; the tests use every one.`:""}`);const B=[...h];if(B.push({kind:"table",id:"groupsignal-groups",label:`Groups · ${i.of}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"group",label:"Group",kind:"text"},{key:"n",label:s?"Entries":"Stretches",kind:"number"},{key:"bases",label:"Bases",kind:"number"},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"sd",label:"SD",kind:"number",digits:4},{key:"median",label:"Median",kind:"number",digits:4},{key:"q1",label:"Q1",kind:"number",digits:4},{key:"q3",label:"Q3",kind:"number",digits:4},{key:"vsRest",label:"Mean − rest",kind:"number",digits:4,hint:"This group’s mean less that of every other stretch."}],rows:g}),B.push({kind:"table",id:"groupsignal-tests",label:"Between groups",columns:[{key:"track",label:"Track",kind:"text"},{key:"test",label:"Test",kind:"text"},{key:"a",label:"Group",kind:"text"},{key:"b",label:"Against",kind:"text"},{key:"difference",label:"Median difference",kind:"number",digits:4},{key:"effect",label:"Effect",kind:"number",digits:3,hint:"Rank-biserial r: +1 where every value of the group is above every value against it."},{key:"statistic",label:"U or H",kind:"number",digits:2},{key:"p",label:"P",kind:"number",digits:4,scientific:!0},{key:"q",label:"q",kind:"number",digits:4,scientific:!0,hint:"Benjamini–Hochberg, over every test of the run."}],rows:f}),i.segments!==void 0&&B.push({kind:"intervals",id:"groupsignal-segments",label:`Groups · ${i.of}`,payload:{kind:"features",data:i.segments},noun:{one:"segment",many:"segments"},display:"lane",look:"corner"}),st(t.params,"groupBy","features")!=="track"&&Lt(t.params,"perFeature",!1)){const Q=await iu(t,e,c);Q!==null&&B.push(Q)}return B};function nu(t,e,n,A){const s=ne(t.inputs.features,t.params,"features"),r={chosen:s.chosen,value:s.chosen?s.value:void 0},o=r.value;if(o===void 0)return t.note(_n(r,{unchosen:"No feature set was chosen to make the groups from.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),null;const i=st(t.params,"split","name"),a=t.inputs.labels?.[at(t.params,"features")??""]??"the set",c=new Array(o.length).fill(null);let l;if(i==="score"){const m=Hi(t),p=Yi(o.score,m);if(p.length===0)return t.note(`${a} carries no scores, so it cannot be cut into quantiles of them.`),null;l=Array.from({length:m},(w,y)=>Wi(y,p));for(let w=0;w<o.length;w++){const y=Pi(o.score[w],p);y>=0&&(c[w]=l[y])}}else if(i==="strand"){l=["+ strand","− strand","no strand"];for(let m=0;m<o.length;m++)c[m]=o.strand[m]>0?l[0]:o.strand[m]<0?l[1]:l[2]}else if(i==="none")l=[a],c.fill(a);else{for(let m=0;m<o.length;m++)c[m]=o.name[m]===""?"(no name)":o.name[m];l=[...new Set(c.filter(m=>m!==null))].sort((m,p)=>m.localeCompare(p,void 0,{numeric:!0}))}const g=l.filter(m=>c.includes(m)),f=Lt(t.params,"outside",!0),h=f?[...g,br]:g,u=new Map(h.map((m,p)=>[m,p])),I=m=>e.find(p=>p.name===m)?.length??t.lengthOf(m),d=new Map,C=new Set;for(let m=0;m<o.contigs.length;m++){const p=o.contigs[m],w=I(p);if(w===void 0){o.contigAt[m+1]>o.contigAt[m]&&C.add(p);continue}const y=h.map(()=>[]);for(let N=o.contigAt[m];N<o.contigAt[m+1];N++){const k=c[N];if(k===null)continue;const b=Math.max(0,o.start[N]),M=Math.min(w,o.end[N]);M>b&&y[u.get(k)??0].push([b,M])}d.set(p,y.map(Mr))}C.size>0&&t.note(`${[...C].slice(0,6).join(", ")}${C.size>6?", …":""} ${C.size===1?"is":"are"} not a sequence of this assembly, so ${C.size===1?"its":"their"} features were left out.`);const B=[],Q=new Map;for(const[m,p]of d)p.forEach((w,y)=>{for(const[N,k]of w)for(const[b,M]of oA(N,k,n))B.push({contig:m,start:b,end:M,group:y})}),Q.set(m,Mr(p.flat()));if(f){const m=h.length-1;for(const{name:p,length:w}of e){let y=0;for(const[N,k]of Q.get(p)??[]){for(const[b,M]of oA(y,N,n))B.push({contig:p,start:b,end:M,group:m});y=Math.max(y,k)}for(const[N,k]of oA(y,w,n))B.push({contig:p,start:N,end:k,group:m})}}const E=i==="score"?"score":i==="strand"?"strand":i==="none"?"":"name";return{names:h,colours:h.map((m,p)=>m===br?tu:Dn[p%Dn.length]),stretches:n===Number.POSITIVE_INFINITY?zi(B,e,A):B,of:E===""?a:`${a}, by ${E}`}}async function Au(t,e,n,A,s){const r=at(t.params,"groupTrack");if(r===null)return t.note("No track was chosen to group the bins by."),null;const o=t.inputs.labels?.[r]??r,i=[];for(const d of e)for(let C=0;C<d.length;C+=n)i.push({contig:d.name,start:C,end:Math.min(d.length,C+n),group:-1});const a=await ps(t,r,i),c=st(t.params,"cut","sign")==="quantiles"?"quantiles":"sign";let l;if(c==="sign"){l=["above 0","below 0"];for(let d=0;d<i.length;d++)i[d].group=a[d]>0?0:a[d]<0?1:-1}else{const d=Hi(t),C=Yi(a,d);if(C.length===0)return t.note(`${o} has no value over any bin, so there is nothing to cut into quantiles.`),null;l=Array.from({length:d},(B,Q)=>Wi(Q,C));for(let B=0;B<i.length;B++)i[B].group=Pi(a[B],C)}const g=i.filter(d=>d.group>=0);g.length<i.length&&t.note(`${(i.length-g.length).toLocaleString()} of ${i.length.toLocaleString()} bins had no reading of ${o}${c==="sign"?", or read exactly 0,":""} and are in no group.`);const f=new et,h=[];let u=null;const I=()=>{u!==null&&(f.add(u.contig,u.start,u.end,{name:l[u.group]}),h.push(u)),u=null};for(const d of g){if(u!==null&&u.contig===d.contig&&u.group===d.group&&u.end===d.start){u.end=d.end;continue}I(),u={...d}}return I(),{names:l,colours:l.map((d,C)=>Dn[C%Dn.length]),stretches:A?zi(h,e,s):g,of:`${o}, ${c==="sign"?"by sign":"in quantiles"}`,segments:f.finish()}}function su(t,e,n){const A=new Array(t.names.length).fill(0);for(const i of t.stretches)A[i.group]++;if(A.every(i=>i>0))return t;const s=t.names.filter((i,a)=>A[a]===0);e.note(`${s.join(", ")} had no ${n} in ${s.length===1?"it":"them"}, and ${s.length===1?"is":"are"} left out.`);const r=t.names.map((i,a)=>a).filter(i=>A[i]>0),o=new Map(r.map((i,a)=>[i,a]));return{...t,names:r.map(i=>t.names[i]),colours:r.map(i=>t.colours[i]),stretches:t.stretches.map(i=>({...i,group:o.get(i.group)??0}))}}function Hi(t){return Math.max(2,Math.min(10,Math.round(T(t.params,"quantiles",4))))}function Wi(t,e){const n=A=>Math.abs(A)>=100?A.toFixed(0):A.toPrecision(3);return`Q${t+1} (${n(e[t])} to ${n(e[t+1])})`}function Pi(t,e){if(!Number.isFinite(t)||e.length<2)return-1;const n=e.length-1;if(t<e[0]||t>e[n])return-1;for(let A=0;A<n;A++)if(t<e[A+1])return A;return n-1}function Mr(t){const e=[...t].sort((A,s)=>A[0]-s[0]),n=[];for(const[A,s]of e){const r=n[n.length-1];r!==void 0&&A<=r[1]?r[1]=Math.max(r[1],s):n.push([A,s])}return n}function zi(t,e,n){if(n.size===0)return t;const A=new Map(e.map(o=>[o.name,o.length])),s=new Map;for(const o of t){const i=A.get(o.contig);if(!n.has(o.contig)||i===void 0)continue;const a=`${o.contig} ${o.group}`,c=s.get(a)??{};o.start===0&&o.end<i&&(c.head=o),o.end===i&&o.start>0&&(c.tail=o),s.set(a,c)}const r=new Set;for(const{head:o,tail:i}of s.values())o===void 0||i===void 0||(i.wrap=o.end,r.add(o));return r.size===0?t:t.filter(o=>!r.has(o))}function oA(t,e,n){if(!(e>t))return[];if(e-t<=n)return[[t,e]];const A=[];let s=t;for(;s<e;){const o=Math.min(e,(Math.floor(s/n)+1)*n);A.push([s,o]),s=o}A.length>1&&A[0][1]-A[0][0]<n/2&&(A[1][0]=A[0][0],A.shift());const r=A.length-1;return r>0&&A[r][1]-A[r][0]<n/2&&(A[r-1][1]=A[r][1],A.pop()),A}const iA=1<<20,ru=4096;async function ps(t,e,n){const A=new Float64Array(n.length).fill(Number.NaN),s=new Map;n.forEach((r,o)=>{const i=s.get(r.contig);i===void 0?s.set(r.contig,[o]):i.push(o)});for(const[r,o]of s){const i=new Map,a=new Map;for(const g of o){const{start:f,end:h,wrap:u}=n[g],I=[],d=u===void 0?[[f,h]]:[[f,h],[0,u]];for(const[C,B]of d)for(let Q=C;Q<B;Q+=iA){const E={contig:r,start:Q,end:Math.min(B,Q+iA)},m=`${E.start}-${E.end}`;i.set(m,E),I.push(m)}a.set(g,I)}const c=[...i.values()].sort((g,f)=>g.start-f.start||g.end-f.end),l=new Map;for(let g=0;g<c.length;){t.throwIfCancelled();let f=g+1,h=c[g].end-c[g].start;for(;f<c.length&&f-g<ru&&(h+=c[f].end-c[f].start,!(h>iA));)f++;const u=await t.sample(e,c.slice(g,f),1);for(const I of u.regions)l.set(`${I.start}-${I.end}`,ou(I,I.start,I.end));g=f}for(const g of o){let f=0,h=0;for(const u of a.get(g)??[]){const I=l.get(u);I!==void 0&&(f+=I[0],h+=I[1])}h>0&&(A[g]=f/h)}}return A}function ou(t,e,n){let A=0,s=0;for(let r=0;r<t.values.length;r++){const o=t.values[r];if(!Number.isFinite(o))continue;const i=Math.max(e,t.starts[r]),a=Math.min(n,t.ends[r]);a<=i||(A+=o*(a-i),s+=a-i)}return[A,s]}async function iu(t,e,n){const A=ne(t.inputs.features,t.params,"features").value;if(A===void 0)return null;const s=[];for(let i=0;i<A.length;i++)s.push({contig:A.contigs[A.contig[i]],start:A.start[i],end:A.end[i],group:i});const r=e.map((i,a)=>`track${a+1}`),o=s.map(i=>({contig:i.contig,start:i.start,end:i.end,name:A.name[i.group]??""}));for(let i=0;i<e.length;i++)(await ps(t,e[i],s)).forEach((c,l)=>{o[l][r[i]]=c});return{kind:"table",id:"groupsignal-features",label:"Per feature",columns:[{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},...e.map((i,a)=>({key:r[a],label:n(i),kind:"number",digits:4}))],rows:o}}function au(t){const e=Ae(t);if(e.length<=ue)return e;const n=new Float64Array(ue);for(let A=0;A<ue;A++)n[A]=e[Math.round(A*(e.length-1)/(ue-1))];return n}function cu(t,e){const n=Math.max(1,Math.round(e.flank/e.step)),A=n*2,s={slots:A,bodyFrom:n,bodyTo:n,flankStep:e.step},r=[];for(const o of t){const i=e.at==="start"?o.strand<0?o.end:o.start:e.at==="end"?o.strand<0?o.start:o.end:o.start+Math.floor((o.end-o.start)/2),a=e.lengthOf(o.contig),c={from:i-n*e.step,to:i+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l))continue;const f=Math.floor((l-c.from)/e.step),h=Math.floor((c.to-g)/e.step),u=o.strand<0?h:f,I=A-(o.strand<0?f:h);if(!(I>u))continue;const d={start:c.from+f*e.step,end:c.to-h*e.step};r.push({contig:o.contig,start:l,end:g,strand:o.strand,slotFrom:u,slotTo:I,...d.start===l&&d.end===g?{}:{span:d}})}return{windows:r,layout:s}}function lu(t,e){const n=Math.max(0,Math.round(e.flank/e.step)),A=e.body+n*2,s={slots:A,bodyFrom:n,bodyTo:n+e.body,flankStep:e.step},r=[];let o=0;for(const i of t){if(i.end-i.start<e.body){o++;continue}const a=e.lengthOf(i.contig),c={from:i.start-n*e.step,to:i.end+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l)){o++;continue}const f=Math.round((l-c.from)/e.step),h=Math.round((c.to-g)/e.step),u=i.strand<0?h:f,I=A-(i.strand<0?f:h);if(!(I>u)){o++;continue}const d=Math.min(Math.max(i.start,l),g),C=Math.min(Math.max(i.end,d),g),B=Math.min(Math.max(s.bodyFrom,u),I),Q=Math.min(Math.max(s.bodyTo,B),I);r.push({contig:i.contig,start:l,end:g,strand:i.strand,slotFrom:u,slotTo:I,body:{start:d,end:C,slotFrom:B,slotTo:Q}})}return{windows:r,layout:s,dropped:o}}function gu(t,e,n){const A=new Float64Array(n).fill(Number.NaN),s=e.slotTo-e.slotFrom;if(s<=0||e.end-e.start<=0)return A;const o=new Float64Array(s),i=new Float64Array(s),a=fu(s),{values:c,starts:l,ends:g}=t,f=e.span?.start??e.start,h=e.span?.end??e.end,u=e.strand<0,I=e.body===void 0;for(let d=0;d<c.length;d++){const C=c[d];if(!Number.isFinite(C))continue;const B=Math.max(f,l[d]),Q=Math.min(h,g[d]);if(!(Q>B))continue;let E,m;if(I){const y=(B-f)/(h-f),N=(Q-f)/(h-f);E=u?1-N:y,m=u?1-y:N}else{const y=Fr(e,B),N=Fr(e,Q);E=u?N:y,m=u?y:N}const p=Math.max(0,Math.floor(E*s)),w=Math.min(s-1,Math.ceil(m*s)-1);for(let y=p;y<=w;y++){const N=Math.min(m,a[y+1])-Math.max(E,a[y]);N>0&&(o[y]+=C*N,i[y]+=N)}}for(let d=0;d<s;d++)i[d]>0&&(A[e.slotFrom+d]=o[d]/i[d]);return A}const Dr=new Map;function fu(t){let e=Dr.get(t);if(e===void 0){e=new Float64Array(t+1);for(let n=0;n<=t;n++)e[n]=n/t;Dr.set(t,e)}return e}function Fr(t,e){const n=t.body;if(n===void 0){const c=t.span?.start??t.start,l=t.span?.end??t.end,g=(e-c)/(l-c);return t.strand<0?1-g:g}const A=t.strand<0,s=A?t.end:t.start,r=A?n.end:n.start,o=A?n.start:n.end,i=A?t.start:t.end;return(t.slotFrom+aA(e,s,r)*(n.slotFrom-t.slotFrom)+aA(e,r,o)*(n.slotTo-n.slotFrom)+aA(e,o,i)*(t.slotTo-n.slotTo)-t.slotFrom)/(t.slotTo-t.slotFrom)}function aA(t,e,n){if(e===n)return 1;const A=(t-e)/(n-e);return A<0?0:A>1?1:A}function hu(t,e,n,A){const s=new Float64Array(n).fill(Number.NaN),r=new Float64Array(n).fill(Number.NaN),o=new Float64Array(n).fill(Number.NaN);if(e===0)return{mean:s,low:r,high:o,n:0};const i=new Float64Array(e),a=[i],c=g=>A.average==="median"?$i(g):A.average==="trimmed"?Gh(g,A.trim):xh(g);for(let g=0;g<n;g++){for(let f=0;f<e;f++)i[f]=t[f*n+g];if(s[g]=c(i),A.band==="sd"){const f=Xi(a,s[g]);Number.isFinite(f)&&(r[g]=s[g]-f,o[g]=s[g]+f)}}if(A.band==="bootstrap"&&e>1){const g=new Float64Array(A.iterations*n),f=new Int32Array(e),h=new Float64Array(e);for(let d=0;d<A.iterations;d++){for(let C=0;C<e;C++)f[C]=Math.floor(A.rng()*e)%e;for(let C=0;C<n;C++){for(let B=0;B<e;B++)h[B]=t[f[B]*n+C];g[d*n+C]=c(h)}}const u=(1-A.level)/2,I=new Float64Array(A.iterations);for(let d=0;d<n;d++){for(let B=0;B<A.iterations;B++)I[B]=g[B*n+d];const C=Array.from(I).filter(Number.isFinite).sort((B,Q)=>B-Q);C.length!==0&&(r[d]=C[Math.floor(u*(C.length-1))],o[d]=C[Math.ceil((1-u)*(C.length-1))])}}let l=0;for(let g=0;g<e;g++)for(let f=0;f<n;f++)if(Number.isFinite(t[g*n+f])){l++;break}return{mean:s,low:r,high:o,n:l}}function uu(t){const e=Iu(t),n=Xi(t,e);if(!Number.isFinite(e))return{mean:e,sd:n,scaled:!1};const A=Number.isFinite(n)&&n>0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(s[r]=A?(o-e)/n:o-e)}return{mean:e,sd:n,scaled:A}}function Iu(t){let e=0,n=0;for(const A of t)for(let s=0;s<A.length;s++){const r=A[s];Number.isFinite(r)&&(e+=r,n++)}return n===0?Number.NaN:e/n}function Xi(t,e){if(!Number.isFinite(e))return Number.NaN;let n=0,A=0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(n+=(o-e)**2,A++)}return A>1?Math.sqrt(n/(A-1)):Number.NaN}function LA(t){const e=new Float64Array(t.slots),n=t.bodyTo>t.bodyFrom;for(let A=0;A<t.slots;A++)e[A]=n?A:(A-t.bodyFrom+.5)*t.flankStep;return{x:e,label:n?"Position (upstream · body · downstream)":"Distance from the anchor (bp)"}}function Vi(t){let e=(Number.isFinite(t)?Math.trunc(t):0)>>>0;return function(){e=e+1831565813>>>0;let A=e;return A=Math.imul(A^A>>>15,A|1),A^=A+Math.imul(A^A>>>7,A|61),((A^A>>>14)>>>0)/4294967296}}function du(t,e,n){const A=[];for(let s=0;s<t.length;s++)A.push({contig:t.contigs[t.contig[s]],start:t.start[s],end:t.end[s],strand:n?t.strand[s]:1,rank:e===null?0:Cu(t,s,e)});return A}function Cu(t,e,n){if(n==="score")return t.score[e];for(const A of t.detail[e].split(ct)){const s=A.search(/[=:]/);if(s<0||A.slice(0,s).trim()!==n)continue;const r=Number.parseFloat(A.slice(s+1).trim());return Number.isFinite(r)?r:Number.NaN}return Number.NaN}function Qu(t,e){if(e.rankBy===null||e.subset==="all")return[{name:"all",features:t}];const n=[...t].sort((r,o)=>Number.isNaN(r.rank)?Number.isNaN(o.rank)?0:1:Number.isNaN(o.rank)?-1:o.rank-r.rank);if(e.subset==="top")return[{name:`top ${e.count}`,features:n.slice(0,e.count)}];if(e.subset==="bottom")return[{name:`bottom ${e.count}`,features:n.slice(-e.count)}];const A=[],s=Math.ceil(n.length/e.groups);for(let r=0;r<e.groups;r++){const o=n.slice(r*s,(r+1)*s);o.length!==0&&A.push({name:`group ${r+1}`,features:o})}return A}const Bu=async t=>{const e=On(t.params,"tracks"),n=ne(t.inputs.features,t.params,"features"),A=n.value;if(e.length===0||A===void 0){const b=_n(n,{unchosen:"No feature set was chosen. Load a BED or a GTF and pick it under Features.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."});return t.note(e.length===0&&b!==null?"A metaplot needs a track to read and a set of positions to read it at, and neither is in hand.":e.length===0?"No track was chosen. Load a bigWig and tick it under Tracks.":b??""),[]}const s=Lt(t.params,"stranded",!0),r=at(t.params,"rankBy"),o=du(A,r,s),i=Qu(o,{rankBy:r,subset:st(t.params,"subset","all"),count:Math.max(1,Math.round(T(t.params,"count",500))),groups:Math.max(2,Math.round(T(t.params,"groups",4)))}),a=Lt(t.params,"zscore",!1),c=Math.max(1,Math.round(T(t.params,"step",50))),l=Math.max(0,Math.round(T(t.params,"flank",2e3))),g=st(t.params,"mode","reference")==="scaled",f=Math.max(10,Math.round(T(t.params,"body",100))),h=b=>t.lengthOf(b)??Number.MAX_SAFE_INTEGER,u=i.map(b=>g?lu(b.features,{body:f,flank:l,step:c,lengthOf:h}):{...cu(b.features,{at:st(t.params,"at","start"),flank:l,step:c,lengthOf:h}),dropped:0}),I=u.reduce((b,M)=>b+M.dropped,0),d=[],C=[],B=u.length===0?null:u[0].layout,Q=Lt(t.params,"heatmap",!0),E=[],m=u.map(b=>({total:new Float64Array(b.windows.length),seen:new Float64Array(b.windows.length)})),p=e.length*i.length;let w=0;for(const b of e){const M=[];for(const[F,S]of i.entries()){t.throwIfCancelled(),t.progress(w,p,`${t.inputs.labels?.[b]??b} · ${S.name}`),w++;const v=u[F];v.windows.length!==0&&M.push({group:F,rows:await wu(t,b,v.windows,v.layout),count:v.windows.length,layout:v.layout})}a&&uu(M.map(F=>F.rows));for(const F of M){const S=hu(F.rows,F.count,F.layout.slots,{average:st(t.params,"average","mean"),trim:.1,band:st(t.params,"band","bootstrap"),iterations:Math.max(20,Math.round(T(t.params,"iterations",200))),level:.95,rng:Vi(Math.round(T(t.params,"seed",1)))}),v=t.inputs.labels?.[b]??b,x=i.length===1?v:`${v} · ${i[F.group].name}`;d.push({name:x,x:LA(F.layout).x,y:S.mean,low:S.low,high:S.high,n:S.n}),Q&&(Nu(m[F.group],F.rows,F.count,F.layout.slots),E.push({group:F.group,rows:Float32Array.from(F.rows),count:F.count,name:x}))}}if(t.progress(p,p,"done"),B===null||d.length===0)return t.note("No feature produced a usable window. Check that the track and the set share an assembly."),[];I>0&&t.note(`${I.toLocaleString()} features were dropped: shorter than the body width, or with no window left after clipping to the sequence.`);const y=LA(B);C.push({kind:"curve",id:"metaplot",label:"Metaplot",series:d,xLabel:y.label,yLabel:a?"Signal (z-score, per track)":"Mean signal",xScale:"linear",yScale:"linear"});const N=E.length===0?[]:m.map(ku),k={zscore:a,tracks:e.length};return E.forEach((b,M)=>{C.push(bu(b,N[b.group],M,B,y.label,k))}),C},Eu=1<<20,mu=4096;async function wu(t,e,n,A){const s=new Float64Array(n.length*A.slots).fill(Number.NaN),r=new Map;for(let o=0;o<n.length;o++){const i=r.get(n[o].contig);i===void 0?r.set(n[o].contig,[o]):i.push(o)}for(const[o,i]of r){const a=new Map;for(const g of i){const f=`${n[g].start}-${n[g].end}`,h=a.get(f);h===void 0?a.set(f,[g]):h.push(g)}const c=[...a.keys()].map(g=>{const[f,h]=g.split("-").map(Number);return{contig:o,start:f,end:h}}).sort((g,f)=>g.start-f.start||g.end-f.end),l=new Map;for(let g=0;g<c.length;){t.throwIfCancelled();let f=g+1,h=c[g].end-c[g].start;for(;f<c.length&&f-g<mu&&(h+=c[f].end-c[f].start,!(h>Eu));)f++;const u=await t.sample(e,c.slice(g,f),1);g=f;for(const I of u.regions)for(const d of a.get(`${I.start}-${I.end}`)??[]){const C=n[d],{body:B,span:Q}=C,E=`${C.start}-${C.end}:${C.strand}:${C.slotFrom}-${C.slotTo}`+(Q===void 0?"":`:${Q.start}-${Q.end}`)+(B===void 0?"":`:${B.start}-${B.end}:${B.slotFrom}-${B.slotTo}`),m=l.get(E);if(m!==void 0){s.copyWithin(d*A.slots,m*A.slots,(m+1)*A.slots);continue}l.set(E,d),s.set(gu(I,C,A.slots),d*A.slots)}}}return s}function pu(t){const e=Math.max(1,Math.floor(t.length/1e5)),n=[];for(let i=0;i<t.length;i+=e){const a=t[i];Number.isFinite(a)&&n.push(a)}if(n.length===0)return null;n.sort((i,a)=>i-a);const A=i=>n[Math.min(n.length-1,Math.floor(i*(n.length-1)))],s=A(.99),r=n[0]>=0?0:-Math.max(Math.abs(A(.01)),Math.abs(s)),o=n[0]>=0?s:Math.max(Math.abs(A(.01)),Math.abs(s));return o>r?[r,o]:null}function yu(t){const{x:e}=LA(t);if(e.length===0)return[];if(t.bodyTo>t.bodyFrom)return["","","","",""];const A=t.flankStep>0?t.flankStep:1,s=e[0]-A/2,r=e[e.length-1]+A/2;return[0,.25,.5,.75,1].map(o=>{const i=s+o*(r-s);return Math.abs(i)>=1e4?`${Number((i/1e3).toFixed(1))} kb`:String(Math.round(i))})}function Nu(t,e,n,A){for(let s=0;s<n;s++){let r=0,o=0;for(let i=0;i<A;i++){const a=e[s*A+i];Number.isFinite(a)&&(r+=a,o++)}t.total[s]+=r,t.seen[s]+=o}}function ku(t){const e=t.total.length,n=new Float64Array(e);for(let A=0;A<e;A++)n[A]=t.seen[A]===0?Number.NaN:t.total[A]/t.seen[A];return Array.from({length:e},(A,s)=>s).sort((A,s)=>Number.isNaN(n[A])?Number.isNaN(n[s])?0:1:Number.isNaN(n[s])?-1:n[s]-n[A])}function bu(t,e,n,A,s,r){const{rows:o,count:i}=t,a=new Float32Array(i*A.slots);for(let l=0;l<i;l++)a.set(o.subarray(e[l]*A.slots,(e[l]+1)*A.slots),l*A.slots);const c=pu(a);return{kind:"matrix",id:n===0?"metaplot-heatmap":`metaplot-heatmap-${n+1}`,label:`${t.name} · per feature${r.zscore?", z-scored":""}`,nrows:i,ncols:A.slots,values:a,xLabel:s,yLabel:r.tracks===1?`Features, strongest first (${i.toLocaleString()})`:`Features, strongest first across ${r.tracks} tracks (${i.toLocaleString()})`,xTicks:yu(A),yTicks:[],colormap:"viridis",...c===null?{}:{range:c},aspect:"fill"}}const Nt=1,kt=2,bt=4,dt=8,Mu=Nt|kt|bt|dt,Zi=(()=>{const t=new Uint8Array(256),e={A:Nt,C:kt,G:bt,T:dt,U:dt,R:Nt|bt,Y:kt|dt,S:bt|kt,W:Nt|dt,K:bt|dt,M:Nt|kt,B:kt|bt|dt,D:Nt|bt|dt,H:Nt|kt|dt,V:Nt|kt|bt,N:Mu};for(const[n,A]of Object.entries(e))t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A;return t})(),Du=(()=>{const t=new Uint8Array(16);for(let e=0;e<16;e++){let n=0;(e&Nt)!==0&&(n|=dt),(e&kt)!==0&&(n|=bt),(e&bt)!==0&&(n|=kt),(e&dt)!==0&&(n|=Nt),t[e]=n}return t})();function Oe(t){return!(t instanceof Uint8Array)}const Sr=200;function Ye(t){const e=t.replace(/\s+/g,"");if(e==="")return{reason:"Type a sequence to search for."};if(e.length>Sr)return{reason:`${e.length} bases is longer than this searches for (${Sr}). It looks for short motifs, so a query that long is a job for an aligner.`};const n=new Uint8Array(e.length);for(let A=0;A<e.length;A++){const s=Zi[e.charCodeAt(A)]??0;if(s===0)return{reason:`“${e[A]}” is not a IUPAC base. Use A C G T U and the ambiguity codes R Y S W K M B D H V N.`};n[A]=s}return n}function ji(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=Du[t[t.length-1-n]??0]??0;return e}function Fu(t){const e=ji(t);for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function Rr(t,e,n,A){let s=0;for(let r=0;r<e.length;r++){const o=Zi[t[n+r]??0]??0,i=e[r]??0;if((o===0||(o&~i)!==0)&&(s++,s>A))return s}return s}function ys(t,e,n={}){const A=[];if(e.length===0||t.length<e.length)return{hits:A,truncated:!1};const s=n.offset??0,r=n.limit??Number.POSITIVE_INFINITY,o=Math.max(0,Math.min(e.length-1,Math.floor(n.mismatches??0))),i=n.bothStrands===!0,a=i&&Fu(e),c=i&&!a?ji(e):null,l=a?0:1,g=t.length-e.length;for(let f=0;f<=g;f++){const h=Rr(t,e,f,o);if(h<=o&&(A.push({start:f+s,end:f+e.length+s,strand:l,mismatches:h}),A.length>=r))return{hits:A,truncated:f<g};if(c!==null){const u=Rr(t,c,f,o);if(u<=o&&(A.push({start:f+s,end:f+e.length+s,strand:-1,mismatches:u}),A.length>=r))return{hits:A,truncated:f<g}}}return{hits:A,truncated:!1}}function Su(t){return Math.max(0,t.length-1)}function Ru(t){return t>0?"+":t<0?"−":"±"}function Lu(t,e){const n=new et,A=e.replace(/\s+/g,"").toUpperCase();for(const s of t.hits)for(let r=0;r<s.starts.length;r++){const o=s.strands[r],i=s.mismatches?.[r];n.add(s.contig,s.starts[r],s.ends[r],{strand:o,name:`${A} ${Ru(o)}`,...i===void 0?{}:{score:i,detail:`${i} ${i===1?"mismatch":"mismatches"}`}})}return n.finish()}function ta(t,e,n){const A=[];let s=0;for(const i of e){const a=Math.max(1,Math.ceil(i.length/n));A.push({name:i.name,startBin:s,bins:a,length:i.length}),s+=a}const r=new Float32Array(s),o=new Map(A.map(i=>[i.name,i]));for(const i of t.hits){const a=o.get(i.contig);if(a!==void 0)for(let c=0;c<i.starts.length;c++){const l=Math.min(a.bins-1,Math.floor(i.starts[c]/n));r[a.startBin+l]+=1}}return{binsize:n,firstBin:0,values:r,contigs:A}}function xu(t,e,n=0){const A=t.replace(/\s+/g,"").toUpperCase(),s=[...e?["both strands"]:[],...n>0?[`≤ ${n} ${n===1?"mismatch":"mismatches"}`]:[]];return s.length===0?A:`${A} (${s.join(", ")})`}const un=5e5,Gu=16e6;function vu(t){const e=t.pattern;return typeof e=="string"?e.replace(/\s+/g,"").toUpperCase():""}async function Uu(t,e,n){const A=Math.max(1,Math.min(n.limit,un)),s=n.mismatches??0,r=n.contigs??t.contigs,o=Su(e),i=t.read?.bind(t),a=Math.max(1,Math.floor(n.piece??Gu)),c=[];let l=0,g=!1;const f=r.reduce((u,I)=>u+I.length,0);let h=0;for(const u of r){if(l>=A){g=!0;break}const I=[];let d=!1;const C=(w,y)=>{const N=A-l-I.length,k=ys(w,e,{bothStrands:n.bothStrands,limit:N+1,mismatches:s,offset:y});for(let b=0;b<Math.min(k.hits.length,N);b++)I.push(k.hits[b]);(k.truncated||k.hits.length>N)&&(d=!0)};if(i===void 0){const w=t.bases(u.name);if(w===void 0)continue;C(w,0),h+=u.length,n.progress?.(h,f,u.name)}else for(let w=0;w<u.length&&!d;w+=a){n.throwIfCancelled?.();const y=Math.min(u.length,w+a),N=await i(u.name,w,Math.min(u.length,y+o));if(N===void 0)break;C(N,w),h+=y-w,n.progress?.(h,f,u.name)}d&&(g=!0);const B=I.length;if(B===0){if(d)break;continue}const Q=new Int32Array(B),E=new Int32Array(B),m=new Int8Array(B),p=s>0?new Uint8Array(B):void 0;for(let w=0;w<B;w++){const y=I[w];Q[w]=y.start,E[w]=y.end,m[w]=y.strand,p!==void 0&&(p[w]=y.mismatches)}if(c.push({contig:u.name,starts:Q,ends:E,strands:m,...p===void 0?{}:{mismatches:p}}),l+=B,d)break}return{hits:c,total:l,truncated:g}}function ea(t,e,n){if(e===null)return[...t.contigs];const A=new Set(e);if(n.length>0&&n.every(r=>A.has(r)))return[...t.contigs];const s=new Set;for(const r of e){const o=Kt(t.contigs,r);o>=0&&s.add(o)}return t.contigs.filter((r,o)=>s.has(o))}const Tu=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to search."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=Yn(t.params,"sequences");if(A!==null&&A.length===0)return t.note("No sequence is ticked, so there is nothing to search."),[];const s=Object.entries(t.inputs.contigLengths??{}).filter(([,B])=>B>0).map(([B])=>B),r=ea(n,A,s);if(r.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to search."),[];const o=r.length===n.contigs.length,i=vu(t.params),a=Ye(i);if(Oe(a))return t.note(a.reason),[];const c=Lt(t.params,"bothStrands",!0),l=Math.min(un,Math.max(1,Math.round(T(t.params,"limit",un)))),g=Math.max(0,Math.min(a.length-1,Math.round(T(t.params,"mismatches",0))));t.progress(0,1,r.length===1?`searching ${r[0].name}`:`searching ${r.length.toLocaleString()} sequences`);const f=await Uu(n,a,{bothStrands:c,limit:l,mismatches:g,contigs:r,...n.read===void 0?{}:{progress:(B,Q,E)=>t.progress(B,Q,`searching ${E}`),throwIfCancelled:()=>t.throwIfCancelled()}});t.progress(1,1,"done");const h=Ju(xu(i,c,g),r,o);if(f.total===0)return t.note(o?`No match for ${h} anywhere in this reference.`:`No match for ${h}.`),[];const u=`${f.total.toLocaleString()} site${f.total===1?"":"s"}`;t.note(f.truncated?`${u} — the search stopped at the limit of ${l.toLocaleString()} and there are more. `+(l<un?"Raise “Most sites”, or narrow the pattern.":r.length>1?"That is the most one run reports, so narrow the pattern or tick fewer sequences.":"That is the most one run reports, so narrow the pattern."):`${u}, on ${f.hits.length.toLocaleString()} ${f.hits.length===1?"sequence":"sequences"}.`);const I=`motif-${i}${c?"-both":""}${g>0?`-mm${g}`:""}`+(o?"":$u(r)),d=[Ou(f,i,h,I)],C=Yu(t,f,h,I);return C!==null&&d.push(C),d};function Ju(t,e,n){return n?t:e.length<=3?`${t} on ${e.map(A=>A.name).join(", ")}`:`${t} on ${e.length.toLocaleString()} sequences`}function $u(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
16
|
+
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Ou(t,e,n,A){return{kind:"intervals",id:A,label:n,payload:{kind:"features",data:Lu(t,e)},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function Yu(t,e,n,A){const s=t.framing.binsize,r=Kn(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none — so there is nothing for a density to be per. Open the map and run it again for that half."),null;const o=ta(e,r,s);return{kind:"profile",id:`${A}-density`,label:`${n} density`,values:o.values,extent:[0,o.values.length],binsize:s,unit:"sites"}}function Kn(t){const e=t.inputs.contigLengths;if(e===void 0)return[];const n=[];for(const[A,s]of Object.entries(e))s>0&&n.push({name:A,length:s});return n}let ce=null,An=null;function _u(){if(ce===null||An===null){ce=new Uint32Array(256);for(let t=0;t<256;t++){const e=Ne[t];ce[t]=e<4?1<<8*e:0}An=new Uint32Array(65536);for(let t=0;t<65536;t++)An[t]=ce[t&255]+ce[t>>>8]}return[ce,An]}const Ku=63;function Ns(t,e){const n=Math.max(1,Math.round(e)),A=t.length===0?0:Math.ceil(t.length/n),s=new Int32Array(A),r=new Int32Array(A),o=new Int32Array(A),i=new Int32Array(A),[a,c]=_u(),l=4-(t.byteOffset&3)&3,g=new Uint32Array(t.buffer,t.byteOffset+l,Math.max(0,t.length-l>>2));for(let f=0;f<A;f++){const h=f*n,u=Math.min(t.length,h+n),I=Math.min(u,h<=l?l:l+(h-l+3>>2<<2)),d=u-I>>2;let C=0;for(let y=h;y<I;y++)C+=a[t[y]];for(let y=I+4*d;y<u;y++)C+=a[t[y]];let B=C&255,Q=C>>>8&255,E=C>>>16&255,m=C>>>24,p=I-l>>2;const w=p+d;for(;p<w;){const y=Math.min(w,p+Ku);let N=0;for(;p<y;p++){const k=g[p];N+=c[k&65535]+c[k>>>16]}B+=N&255,Q+=N>>>8&255,E+=N>>>16&255,m+=N>>>24}s[f]=B,r[f]=Q,o[f]=E,i[f]=m}return{step:n,steps:A,a:s,c:r,g:o,t:i}}const na=1<<22;function qu(t,e=na){const n=Math.max(1,Math.round(t));return n*Math.max(1,Math.floor(e/n))}async function Hu(t,e,n=na){const A=Math.max(1,Math.round(e)),s=qu(A,n),r=[];let o=0;for(let l=0;;l+=s){const g=await t(l,l+s);if(g===void 0)return;if(r.push(Ns(g,A)),o+=g.length,g.length<s)break}const i=r.reduce((l,g)=>l+g.steps,0),a={step:A,steps:i,a:new Int32Array(i),c:new Int32Array(i),g:new Int32Array(i),t:new Int32Array(i)};let c=0;for(const l of r)a.a.set(l.a,c),a.c.set(l.c,c),a.g.set(l.g,c),a.t.set(l.t,c),c+=l.steps;return{counts:a,length:o}}function Aa(t,e,n){const A=Math.max(0,Math.floor(Math.max(1,Math.round(e))/2)),s=t.steps;if(A===0||s===0)return t;const r=o=>{const i=new Int32Array(s),a=new Float64Array(s+1);for(let g=0;g<s;g++)a[g+1]=a[g]+o[g];const c=a[s],l=g=>{if(!n)return a[Math.max(0,Math.min(s,g))];const f=Math.floor(g/s);return f*c+a[g-f*s]};for(let g=0;g<s;g++){const f=n?g-Math.min(A,Math.floor((s-1)/2)):g-A,h=n?g+Math.min(A,Math.floor((s-1)/2))+1:g+A+1;i[g]=l(h)-l(f)}return i};return{...t,a:r(t.a),c:r(t.c),g:r(t.g),t:r(t.t)}}function Wu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n],s=A+t.a[n]+t.t[n];e[n]=s>0?A/s:Number.NaN}return e}function xA(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n];e[n]=A>0?(t.g[n]-t.c[n])/A:Number.NaN}return e}function Pu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.a[n]+t.t[n];e[n]=A>0?(t.a[n]-t.t[n])/A:Number.NaN}return e}function sa(t){const e=new Float32Array(t.length);let n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isFinite(s)&&(n+=s),e[A]=n}return e}const zu=1e4;function Xu(t){return["gc","gcSkew","atSkew","cumulative"].filter(e=>t[e]!==!1)}function Vu(t){return _i(t.framing)}const Lr={gc:{name:"GC content",unit:""},gcSkew:{name:"GC skew",unit:""},atSkew:{name:"AT skew",unit:""},cumulative:{name:"Cumulative GC skew",unit:""}},Zu=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=Xu(t.params);if(A.length===0)return t.note("No track was ticked, so there is nothing to make."),[];const s=T(t.params,"resolution",0),r=s>0?Math.round(s):t.framing.binsize>0&&!Vu(t)?t.framing.binsize:zu,o=Kn(t);if(o.length===0)return t.note("There are no sequences to lay the bins out on. Open a map, or load the FASTA itself."),[];const i=Math.max(0,Math.round(T(t.params,"window",0))),a=Math.max(1,Math.round(i/r)),c=a%2===1?a:a+1,l=new Set(t.framing.circular??[]),g=o.reduce((E,m)=>E+Math.max(1,Math.ceil(m.length/r)),0),f={gc:new Float32Array(g).fill(Number.NaN),gcSkew:new Float32Array(g).fill(Number.NaN),atSkew:new Float32Array(g).fill(Number.NaN),cumulative:new Float32Array(g).fill(Number.NaN)},{read:h}=n,u=[],I=[];let d=0;for(let E=0;E<o.length;E++){const m=o[E],p=Math.max(1,Math.ceil(m.length/r));t.progress(E,o.length,m.name);let w;if(h!==void 0)w=await Hu((M,F)=>(t.throwIfCancelled(),h(m.name,M,F)),r);else{const M=n.bases(m.name);w=M===void 0?void 0:{counts:Ns(M,r),length:M.length}}if(w===void 0){u.push(m.name),d+=p;continue}w.length!==m.length&&I.push(m.name);const{counts:y}=w,N=c>1?Aa(y,c,l.has(m.name)):y,k={gc:Wu(N),gcSkew:xA(N),atSkew:Pu(N),cumulative:sa(xA(y))},b=Math.min(p,y.steps);for(const M of A)f[M].set(k[M].subarray(0,b),d);d+=p}if(t.progress(o.length,o.length,"done"),u.length===o.length)return t.note("The reference has none of the map’s sequences under any name this viewer knows, so nothing could be measured."),[];u.length>0&&t.note(`${u.length.toLocaleString()} of the map’s sequences are not in this reference and are gaps on every track: ${u.slice(0,6).join(", ")}${u.length>6?", …":""}.`),I.length>0&&t.note(`${I.slice(0,6).join(", ")}${I.length>6?", …":""} ${I.length===1?"is":"are"} not the length the map says — the reference may be another assembly version. Bins were read from its start.`),c>1&&t.note(`Each bin was read over ${c} bins (${(c*r).toLocaleString()} bp) centred on it; the cumulative skew sums each bin’s own.`);const C=t.inputs.labels?.[e]??"reference",B=c>1?` · ${(c*r).toLocaleString()} bp window`:"";return A.map(E=>({kind:"profile",id:`composition-${E.toLowerCase()}`,label:`${Lr[E].name} · ${C}${E==="cumulative"?"":B}`,values:f[E],extent:[0,g],binsize:r,unit:Lr[E].unit}))},_e=19,ra=50,ju=2e6,tI=5e3,eI=500,nI=10;function xr(t){const e=[0];for(const n of t)e.push(e[e.length-1]+n.length);return{names:t.map(n=>n.name),lengths:t.map(n=>n.length),offsets:e}}function AI(t,e=ju){return Math.max(1,Math.ceil(2*t/e-1))}const sI=(()=>{const t=new Int8Array(256).fill(-1);for(const[e,n]of[["A",0],["C",1],["G",2],["T",3]])t[e.charCodeAt(0)]=n,t[e.toLowerCase().charCodeAt(0)]=n;return t})();function rI(t){const e=t>>>0,n=Math.floor(t/4294967296)>>>0;let A=Math.imul(e^Math.imul(n,2654435761),2246822507);return A^=A>>>13,A=Math.imul(A,3266489909),A^=A>>>16,A>>>0}class oI{hash=new Uint32Array(1024);position=new Uint32Array(1024);strand=new Int8Array(1024);count=0;push(e,n,A){if(this.count===this.hash.length){const s=this.hash.length*2,r=new Uint32Array(s);r.set(this.hash),this.hash=r;const o=new Uint32Array(s);o.set(this.position),this.position=o;const i=new Int8Array(s);i.set(this.strand),this.strand=i}this.hash[this.count]=e,this.position[this.count]=n,this.strand[this.count]=A,this.count++}finish(){return{hash:this.hash.slice(0,this.count),position:this.position.slice(0,this.count),strand:this.strand.slice(0,this.count),count:this.count}}}function Gr(t,e,n,A=_e){const s=new oI,r=4**(A-1),o=new Float64Array(n+1),i=new Float64Array(n+1),a=new Int8Array(n+1);for(let c=0;c<t.names.length;c++){const l=e(t.names[c]);if(l===void 0)continue;const g=t.offsets[c];let f=0,h=0,u=0,I=0,d=0,C=-1,B=0;const Q=o.length;for(let E=0;E<l.length;E++){const m=sI[l[E]];if(m<0){u=0,d=0,B=0;continue}if(f=f%r*4+m,h=Math.floor(h/4)+(3-m)*r,u++,u<A)continue;const p=E-A+1;if(B++,f===h)continue;const w=f<h?1:-1,y=rI(f<h?f:h);for(;d>0&&o[(I+d-1)%Q]>=y;)d--;for(o[(I+d)%Q]=y,i[(I+d)%Q]=p,a[(I+d)%Q]=w,d++;d>0&&i[I]<=p-n;)I=(I+1)%Q,d--;if(B<n)continue;const N=i[I];N!==C&&(s.push(o[I],g+N,a[I]),C=N)}}return s.finish()}function Fn(t,e=t.length,n){let A=new Uint32Array(e);if(n===void 0)for(let o=0;o<e;o++)A[o]=o;else A.set(n.subarray(0,e));let s=new Uint32Array(e);const r=new Uint32Array(65537);for(const o of[0,16]){r.fill(0);for(let i=0;i<e;i++)r[(t[A[i]]>>>o&65535)+1]++;for(let i=0;i<65536;i++)r[i+1]+=r[i];for(let i=0;i<e;i++)s[r[t[A[i]]>>>o&65535]++]=A[i];[A,s]=[s,A]}return A}function iI(t,e,n=ra){const A=Fn(t.hash,t.count),s=Fn(e.hash,e.count);let r=new Uint32Array(1024),o=new Uint32Array(1024),i=new Int8Array(1024),a=0,c=0,l=0,g=0;for(;l<t.count&&g<e.count;){const f=t.hash[A[l]],h=e.hash[s[g]];if(f<h){l++;continue}if(h<f){g++;continue}let u=l;for(;u<t.count&&t.hash[A[u]]===f;)u++;let I=g;for(;I<e.count&&e.hash[s[I]]===h;)I++;if(u-l>n||I-g>n)c++;else for(let d=l;d<u;d++)for(let C=g;C<I;C++){if(a===r.length){const B=r.length*2,Q=new Uint32Array(B);Q.set(r),r=Q;const E=new Uint32Array(B);E.set(o),o=E;const m=new Int8Array(B);m.set(i),i=m}r[a]=t.position[A[d]],o[a]=e.position[s[C]],i[a]=t.strand[A[d]]===e.strand[s[C]]?1:-1,a++}l=u,g=I}return{x:r.slice(0,a),y:o.slice(0,a),strand:i.slice(0,a),count:a,dropped:c}}function aI(t,e=tI,n=eI,A=nI,s){const r=[];s?.fill(-1);let o=0;for(let a=0;a<t.count;a++)t.y[a]>o&&(o=t.y[a]);for(const a of[1,-1]){let c=0;for(let Q=0;Q<t.count;Q++)t.strand[Q]===a&&c++;const l=new Uint32Array(c),g=new Uint32Array(c),f=new Uint32Array(c),h=Math.ceil(o/n)+1;for(let Q=0,E=0;Q<t.count;Q++)t.strand[Q]===a&&(l[E]=Q,g[E]=t.x[Q],f[E]=a===1?Math.round((t.x[Q]-t.y[Q])/n)+h:Math.round((t.x[Q]+t.y[Q])/n),E++);const u=Fn(f,c,Fn(g,c)),I=new Uint32Array(c),d=new Uint32Array(c);for(let Q=0;Q<c;Q++)I[Q]=l[u[Q]],d[Q]=f[u[Q]];let C=0;const B=Q=>{const E=Q-C;if(E>=A){let m=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY,w=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;for(let N=C;N<Q;N++){const k=I[N];m=Math.min(m,t.x[k]),p=Math.max(p,t.x[k]+_e),w=Math.min(w,t.y[k]),y=Math.max(y,t.y[k]+_e)}if(s!==void 0)for(let N=C;N<Q;N++)s[I[N]]=r.length;r.push({x0:m,x1:p,y0:w,y1:y,strand:a,anchors:E})}C=Q};for(let Q=1;Q<=I.length;Q++){if(Q===I.length){B(Q);break}const E=I[Q-1],m=I[Q];(d[Q-1]!==d[Q]||t.x[m]-t.x[E]>e)&&B(Q)}}const i=r.map((a,c)=>c).sort((a,c)=>r[a].x0-r[c].x0||r[a].y0-r[c].y0);if(s!==void 0){const a=new Int32Array(r.length);i.forEach((c,l)=>a[c]=l);for(let c=0;c<t.count;c++)s[c]>=0&&(s[c]=a[s[c]])}return i.map(a=>r[a])}const cI=100,lI=4e5;function gI(t,e,n){const A=e.offsets[e.offsets.length-1],s=n.offsets[n.offsets.length-1],r=Math.max(cI,Math.ceil(Math.max(A,s)/lI)),o=new Uint8Array(Math.ceil(A/r)+1),i=new Uint8Array(Math.ceil(s/r)+1),a=(h,u)=>{const I=Math.floor(h/r);return[I,Math.max(I+1,Math.ceil(u/r))]},c=(h,u,I)=>{const[d,C]=a(u,I);let B=0;for(let Q=d;Q<C;Q++)B+=h[Q];return B/(C-d)},l=(h,u,I)=>{const[d,C]=a(u,I);h.fill(1,d,C)},g=new Uint8Array(t.length),f=t.map((h,u)=>u).sort((h,u)=>t[u].anchors-t[h].anchors||h-u);for(const h of f){const u=t[h];c(o,u.x0,u.x1)>.5||c(i,u.y0,u.y1)>.5||(g[h]=1,l(o,u.x0,u.x1),l(i,u.y0,u.y1))}return g}function fI(t,e,n,A,s){const r=e.offsets[e.offsets.length-1],o=n.offsets[n.offsets.length-1],i=Math.max(1,Math.ceil(Math.max(r,o)/Math.max(1,A))),a=Math.max(1,Math.ceil(r/i)),c=Math.max(1,Math.ceil(o/i)),l=new Float32Array(a*c);for(let g=0;g<t.count;g++){if(s!==void 0&&s[g]!==1)continue;const f=Math.min(a-1,Math.floor(t.x[g]/i)),h=Math.min(c-1,Math.floor(t.y[g]/i));l[h*a+f]+=t.strand[g]}return{values:l,ncols:a,nrows:c,cellSize:i}}function vr(t,e){let n=0,A=t.names.length-1;for(;n<A;){const s=n+A+1>>1;t.offsets[s]<=e?n=s:A=s-1}return{sequence:n,at:e-t.offsets[n]}}const Ur=400;function hI(t,e,n,A,s){const r=t.length,o={x:{label:A,names:[...e.names],lengths:[...e.lengths]},y:{label:s,names:[...n.names],lengths:[...n.lengths]},x0:new Float64Array(r),x1:new Float64Array(r),y0:new Float64Array(r),y1:new Float64Array(r),strand:new Int8Array(r),anchors:new Int32Array(r)};return t.forEach((i,a)=>{o.x0[a]=i.x0,o.x1[a]=i.x1,o.y0[a]=i.y0,o.y1[a]=i.y1,o.strand[a]=i.strand,o.anchors[a]=i.anchors}),o}function Tr(t,e){return t.names.map((n,A)=>({label:n,from:t.offsets[A]/e,to:t.offsets[A+1]/e}))}const uI=async t=>{const e=at(t.params,"x"),n=at(t.params,"y");if(t.residues===void 0)return t.note("This session cannot read residues, so there is nothing to set against anything."),[];if(e===null||n===null)return t.note("Choose the two sequence sets: one along x, one along y."),[];const A=t.residues(e),s=t.residues(n);if(A===void 0||s===void 0)return t.note("A sequence set chosen is no longer loaded. Drop the FASTA again, or pick another."),[];for(const S of[A,s])if(S.refusal!==void 0)return t.note(S.refusal),[];const r=xr(A.contigs),o=xr(s.contigs),i=r.offsets[r.offsets.length-1],a=AI(i);t.progress(0,4,"minimizers along x");const c=Gr(r,S=>A.bases(S),a);t.throwIfCancelled(),t.progress(1,4,"minimizers along y");const l=Gr(o,S=>s.bases(S),a);t.throwIfCancelled(),t.progress(2,4,"anchors");const g=iI(c,l);t.throwIfCancelled(),t.progress(3,4,"streaks");const f=new Int32Array(g.count),h=aI(g,void 0,void 0,void 0,f),u=e===n,I=!u&&st(t.params,"streaks","one to one")==="one to one",d=I?gI(h,r,o):new Uint8Array(h.length).fill(1),C=h.filter((S,v)=>d[v]===1),B=new Uint8Array(g.count);for(let S=0;S<g.count;S++)f[S]>=0&&d[f[S]]===1&&(B[S]=1);const Q=Math.round(T(t.params,"cells",Ur)),E=fI(g,r,o,Q>0?Q:Ur,B);t.progress(4,4);const m=c.count>0?Math.round(i/c.count):0,p=h.length-C.length;t.note(`Exact ${_e}-mers, one in about ${m.toLocaleString("en-US")} bases; hashes above ${ra} copies on either side dropped (${g.dropped.toLocaleString("en-US")} of them). ${g.count.toLocaleString("en-US")} anchors, ${h.length.toLocaleString("en-US")} streaks`+(I?`, ${C.length.toLocaleString("en-US")} of them one to one — ${p.toLocaleString("en-US")} a stronger streak had taken the stretch of`:"")+(u?", every one drawn, the set against itself":"")+`. Not an alignment, and it writes none: a streak is ten or more shared ${_e}-mers along one diagonal.`);const w=[];for(const S of E.values)Math.abs(S)>=3&&w.push(Math.abs(S));w.sort((S,v)=>S-v);const y=w.length===0?3:Math.max(3,w[Math.floor(.5*(w.length-1))]),N={kind:"matrix",id:"dotplot-density",label:I?"Streaks one to one, the same way round (red) and the other (blue)":"Streaks, the same way round (red) and the other (blue)",nrows:E.nrows,ncols:E.ncols,values:E.values,xLabel:"along x",yLabel:"along y",xTicks:[],yTicks:[],colormap:"RdBu_r",centre:0,range:[-y,y],xSegments:Tr(r,E.cellSize),ySegments:Tr(o,E.cellSize),stats:[{label:"anchors",value:g.count},{label:I?"streaks one to one":"streaks",value:C.length},{label:"bases a cell",value:E.cellSize}],large:!0,streaks:hI(C,r,o,t.inputs.labels?.[e]??"along x",t.inputs.labels?.[n]??"along y")},k=C.map(S=>{const v=vr(r,S.x0),x=vr(o,S.y0);return{xSequence:r.names[v.sequence],xStart:v.at,xEnd:v.at+(S.x1-S.x0),ySequence:o.names[x.sequence],yStart:x.at,yEnd:x.at+(S.y1-S.y0),strand:S.strand===1?"+":"-",anchors:S.anchors}}),b={kind:"table",id:"dotplot-streaks",label:"Streaks",columns:[{key:"xSequence",label:"x sequence",kind:"text"},{key:"xStart",label:"x start",kind:"number",coordinate:"start"},{key:"xEnd",label:"x end",kind:"number",coordinate:"end"},{key:"ySequence",label:"y sequence",kind:"text"},{key:"yStart",label:"y start",kind:"number",coordinate:"start"},{key:"yEnd",label:"y end",kind:"number",coordinate:"end"},{key:"strand",label:"strand",kind:"text",hint:"+ the same way round, − the other"},{key:"anchors",label:"anchors",kind:"number"}],rows:k},M=new Jn;for(const S of k)M.add(S.xSequence,S.xStart,S.xEnd,S.ySequence,S.yStart,S.yEnd,{score:S.anchors,name:S.strand==="+"?"same way round":"the other way round",detail:`${S.anchors} anchors`});const F={kind:"intervals",id:"dotplot-pairs",label:"Streaks, as pairs",payload:{kind:"pairs",data:M.finish()},noun:{one:"streak",many:"streaks"},display:"overlay"};return[N,b,F]};function GA(t,e,n,A){const s=Math.abs(t-e);return A&&n>0?Math.min(s,n-s%n):s}function II(t,e,n){if(t.length===0)return Number.NaN;if(!n||!(e>0)){let i=0;for(const a of t)i+=a;return i/t.length}let A=0,s=0;for(const i of t){const a=2*Math.PI*i/e;A+=Math.sin(a),s+=Math.cos(a)}const o=(Math.atan2(A,s)/(2*Math.PI)*e%e+e)%e;return o>=e?0:o}function Jr(t,e,n,A){if(t.length===0)return null;let s=-1,r=0;for(let i=0;i<t.length;i++){let a=0;for(const c of t)GA(t[i],c,e,n)<=A&&a++;a>r&&(r=a,s=i)}const o=t.filter(i=>GA(t[s],i,e,n)<=A);return{centre:II(o,e,n),count:o.length}}function dI(t,e,n){let A=-1,s=-1;for(let o=0;o<t.length;o++){const i=t[o];Number.isFinite(i)&&((A<0||i<t[A])&&(A=o),(s<0||i>t[s])&&(s=o))}const r=o=>o<0?Number.NaN:Math.min(n-1,Math.floor(o*e+e/2));return{low:r(A),high:r(s)}}const CI=10;function QI(t){const{length:e,circular:n,low:A,high:s}=t,r=e/8,o=Jr(t.matS,e,n,r),i=Jr(t.parS,e,n,r),a=t.minMatS??CI,c=(h,u)=>GA(h,u,e,n);let l=s,g="skew";if(o!==null&&t.matS.length>=a)l=c(A,o.centre)<c(s,o.centre)?A:s,g="matS";else if(i!==null)l=c(A,i.centre)>c(s,i.centre)?A:s,g="parS";else if(t.coverageAt!==void 0){const h=t.coverageAt(A),u=t.coverageAt(s);Number.isFinite(h)&&Number.isFinite(u)&&h!==u&&(l=h<u?A:s,g="coverage")}return{ori:l===s?A:s,ter:l,rule:g,agreesWithSkew:l===s,matS:o,parS:i}}function BI(t,e,n,A,s){const r=Math.max(s?3:1,Math.round(A)),o=s?r:r+3,i=n>0?r/n:0,a=Q=>{let E=Q*i;s||(E=Math.max(0,Math.min(r-1e-9,E)));const m=Math.floor(E),p=E-m,w=[(1-p)**3/6,(3*p**3-6*p**2+4)/6,(-3*p**3+3*p**2+3*p+1)/6,p**3/6];return{first:s?m-1:m,w}},c=Q=>s?(Q%o+o)%o:Q,l=new Float64Array(o*o),g=new Float64Array(o);let f=0;for(let Q=0;Q<t.length;Q++){const E=e[Q];if(!Number.isFinite(E))continue;f++;const{first:m,w:p}=a(t[Q]);for(let w=0;w<4;w++){const y=c(m+w);g[y]+=p[w]*E;for(let N=0;N<4;N++)l[y*o+c(m+N)]+=p[w]*p[N]}}let h=0,u=0;for(let Q=0;Q<e.length;Q++)Number.isFinite(e[Q])&&(h+=e[Q],u++);h=u>0?h/u:0;const I=1e-6*Math.max(1,f/o);for(let Q=0;Q<o;Q++)l[Q*o+Q]+=I,g[Q]+=I*h;const d=EI(l,g,o),C=Q=>{if(d===null)return Number.NaN;const{first:E,w:m}=a(Q);let p=0;for(let w=0;w<4;w++)p+=m[w]*d[c(E+w)];return p},B=new Float64Array(t.length);for(let Q=0;Q<t.length;Q++)B[Q]=C(t[Q]);return{fitted:B,at:C}}function EI(t,e,n){const A=Float64Array.from(t),s=Float64Array.from(e);for(let o=0;o<n;o++){let i=o;for(let a=o+1;a<n;a++)Math.abs(A[a*n+o])>Math.abs(A[i*n+o])&&(i=a);if(Math.abs(A[i*n+o])<1e-300)return null;if(i!==o){for(let c=0;c<n;c++){const l=A[o*n+c];A[o*n+c]=A[i*n+c],A[i*n+c]=l}const a=s[o];s[o]=s[i],s[i]=a}for(let a=o+1;a<n;a++){const c=A[a*n+o]/A[o*n+o];if(c!==0){for(let l=o;l<n;l++)A[a*n+l]-=c*A[o*n+l];s[a]-=c*s[o]}}}const r=new Float64Array(n);for(let o=n-1;o>=0;o--){let i=s[o];for(let a=o+1;a<n;a++)i-=A[o*n+a]*r[a];r[o]=i/A[o*n+o]}return r}function mI(t){let e=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY;for(const s of t)Number.isFinite(s)&&(s>e&&(e=s),s<n&&(n=s));return{ratio:n>0&&Number.isFinite(e)?e/n:Number.NaN,highest:e,lowest:n}}const wI="TGTTNCACGTGNAACA",pI="GTGACRNYGTCAC";function yI(t,e){const n=t[e];return n==null?e==="parS"?wI:pI:typeof n=="string"?n.replace(/\s+/g,"").toUpperCase():""}const NI=5e3,cA={matS:"nearest the matS cluster",parS:"farthest from the parS cluster",coverage:"lower coverage",skew:"skew maximum"};function $r(t,e,n){const A={mids:[],starts:[],ends:[],strands:[],mismatches:[]};if(e===null)return A;for(const s of ys(t,e,{bothStrands:!0,mismatches:n}).hits)A.mids.push((s.start+s.end)/2),A.starts.push(s.start),A.ends.push(s.end),A.strands.push(s.strand),A.mismatches.push(s.mismatches);return A}const kI=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load the genome’s FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.refusal!==void 0)return t.note(n.refusal),[];const A={parS:{motif:null,pattern:"",mismatches:0},matS:{motif:null,pattern:"",mismatches:0}};for(const N of["parS","matS"]){const k=yI(t.params,N);if(k==="")continue;const b=Ye(k);if(Oe(b)){t.note(`${N}: ${b.reason} Its step was skipped.`);continue}const M=Math.round(T(t.params,`${N}Mismatches`,N==="parS"?1:0));A[N]={motif:b,pattern:k,mismatches:Math.max(0,Math.min(b.length-1,M))}}const s=Math.max(100,Math.round(T(t.params,"window",5e3))),r=Math.max(10,Math.min(s,Math.round(T(t.params,"step",1e3)))),o=Math.max(4,Math.min(40,Math.round(T(t.params,"knots",10)))),i=at(t.params,"coverage"),a=new Set(t.framing.circular??[]),c=Kn(t),l=c.length>0?c.map(N=>N.name):n.contigs.map(N=>N.name),g=Yn(t.params,"sequences"),f=g===null?l:l.filter(N=>g.includes(N));if(f.length===0)return t.note("No sequence is ticked, so there is nothing to read."),[];const h=new et,u=new et,I=new et;let d=0,C=0;const B=[],Q=new Map,E=[];for(let N=0;N<f.length;N++){const k=f[N];t.progress(N,f.length,k);const b=n.bases(k);if(b===void 0){E.push(k);continue}const M=b.length;if(M<4*s){E.push(k);continue}const F=a.has(k),S=Ns(b,r),v=xA(Aa(S,Math.max(1,Math.round(s/r)),F)),x=dI(sa(v),r,M);if(!Number.isFinite(x.low)||!Number.isFinite(x.high)){E.push(k);continue}const O=$r(b,A.parS.motif,A.parS.mismatches),J=$r(b,A.matS.motif,A.matS.mismatches);let K,V=Number.NaN;if(i!==null){const L=(await t.sample(i,[{contig:k,start:0,end:M}],NI)).regions[0];if(L!==void 0&&L.values.length>3){const $=new Float64Array(L.values.length),Mt=new Float64Array(L.values.length);for(let P=0;P<L.values.length;P++)$[P]=(L.starts[P]+L.ends[P])/2,Mt[P]=L.values[P];const vt=BI($,Mt,M,o,F);K=vt.at,Q.set(k,vt.at),V=mI(vt.fitted).ratio}}const H=QI({length:M,circular:F,low:x.low,high:x.high,parS:O.mids,matS:J.mids,...K===void 0?{}:{coverageAt:K}}),ht=Math.floor(s/2),Gt=`${cA[H.rule]}${H.agreesWithSkew?"":" · disagrees with the skew"}`;for(const[q,L]of[["ori",H.ori],["ter",H.ter]])h.add(k,Math.max(0,L-ht),Math.min(M,L+ht),{name:q,detail:q==="ter"?`terminus · ${Gt}`:"origin"});for(let q=0;q<O.starts.length;q++)u.add(k,O.starts[q],O.ends[q],{strand:O.strands[q],name:"parS",score:O.mismatches[q],detail:`${O.mismatches[q]} ${O.mismatches[q]===1?"mismatch":"mismatches"}`});for(let q=0;q<J.starts.length;q++)I.add(k,J.starts[q],J.ends[q],{strand:J.strands[q],name:"matS",score:J.mismatches[q],detail:`${J.mismatches[q]} ${J.mismatches[q]===1?"mismatch":"mismatches"}`});d+=O.starts.length,C+=J.starts.length,H.agreesWithSkew||t.note(`${k}: the terminus was placed ${cA[H.rule]}, at the cumulative skew’s minimum — which is where the skew alone would put the origin. Check the assembly, or the motifs.`),B.push({sequence:k,length:M,topology:F?"circular":"linear",ori:H.ori+1,ter:H.ter+1,rule:cA[H.rule],parS:O.starts.length,parSCluster:H.parS?.count??0,matS:J.starts.length,ratio:V})}if(t.progress(f.length,f.length,"done"),E.length>0&&t.note(`${E.length.toLocaleString()} ${E.length===1?"sequence was":"sequences were"} not placed — not in the reference, or shorter than four skew windows: ${E.slice(0,6).join(", ")}${E.length>6?", …":""}.`),B.length===0)return[];i===null&&t.note("No coverage track was chosen, so there is no ori/ter ratio and no coverage step.");const m=B.filter(N=>N.topology==="linear").length;m>0&&t.note(`${m.toLocaleString()} ${m===1?"sequence was":"sequences were"} read as linear. A bacterial chromosome is usually circular — tick it in the Chromosomes table and run this again, or the origin at its first base is split between its two ends.`);const w=[{kind:"intervals",id:"oriter-loci",label:`Origin and terminus · ${t.inputs.labels?.[e]??"reference"}`,payload:{kind:"features",data:h.finish()},noun:{one:"locus",many:"loci"},display:"lane",look:"point"}];d>0&&w.push({kind:"intervals",id:"oriter-pars",label:`parS sites · ${A.parS.pattern}`,payload:{kind:"features",data:u.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"}),C>0&&w.push({kind:"intervals",id:"oriter-mats",label:`matS sites · ${A.matS.pattern}`,payload:{kind:"features",data:I.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"});const y=t.framing.binsize;if(Q.size>0&&y>0&&c.length>0){const N=c.reduce((F,S)=>F+Math.max(1,Math.ceil(S.length/y)),0),k=new Float32Array(N).fill(Number.NaN);let b=0;for(const F of c){const S=Math.max(1,Math.ceil(F.length/y)),v=Q.get(F.name);if(v!==void 0)for(let x=0;x<S;x++)k[b+x]=v(Math.min(F.length-1,(x+.5)*y));b+=S}const M=t.inputs.labels?.[i??""]??"coverage";w.push({kind:"profile",id:"oriter-coverage-fit",label:`${M} · spline fit`,values:k,extent:[0,N],binsize:y,unit:""})}return w.push({kind:"table",id:"oriter-table",label:"Origin and terminus per sequence",columns:[{key:"sequence",label:"sequence",kind:"text"},{key:"length",label:"length",kind:"number"},{key:"topology",label:"read as",kind:"text"},{key:"ori",label:"ori",kind:"number",hint:"Centre of the origin locus, 1-based."},{key:"ter",label:"ter",kind:"number",hint:"Centre of the terminus locus, 1-based."},{key:"rule",label:"terminus placed by",kind:"text"},{key:"parS",label:"parS",kind:"number",hint:"Sites found on this sequence."},{key:"parSCluster",label:"in cluster",kind:"number",hint:"parS sites within an eighth of the sequence of the densest one."},{key:"matS",label:"matS",kind:"number",hint:"Sites found on this sequence."},{key:"ratio",label:"ori/ter",kind:"number",digits:2,hint:"Highest over lowest smoothed coverage: copies of the origin per copy of the terminus."}],rows:B}),w};function vA(t,e,n){const A=t.contigs.indexOf(e);if(A<0)return[];const s=[];for(let r=t.contigAt[A];r<t.contigAt[A+1];r++){const o=t.start[r],i=t.end[r];if(i<=o)continue;const a=s[s.length-1];a!==void 0&&o<=a[1]?a[1]=Math.max(a[1],i):s.push([o,i])}return s}function Or(t){let e=0;for(const[n,A]of t)e+=A-n;return e}function bI(t,e){let n=0,A=0,s=0;for(;A<t.length&&s<e.length;){const r=Math.max(t[A][0],e[s][0]),o=Math.min(t[A][1],e[s][1]);o>r&&(n+=o-r),t[A][1]<e[s][1]?A++:s++}return n}function Yr(t,e,n,A){const s=t.contigs.indexOf(e);if(s<0||n.length===0)return 0;let r=0,o=0;for(let i=t.contigAt[s];i<t.contigAt[s+1];i++){const a=t.start[i],c=t.end[i],l=c-a;if(l<=0)continue;for(;o<n.length&&n[o][1]<=a;)o++;let g=0;for(let f=o;f<n.length&&n[f][0]<c;f++)g+=Math.max(0,Math.min(c,n[f][1])-Math.max(a,n[f][0]));g/l>=A&&g>0&&r++}return r}function oa(t,e,n){const A=new Set([...t.contigs,...e.contigs]);let s=0,r=0,o=0,i=0,a=0;for(const l of A){const g=vA(t,l,n.minFraction),f=vA(e,l,n.minFraction);s+=Or(g),r+=Or(f),o+=bI(g,f),i+=Yr(t,l,f,n.minFraction),a+=Yr(e,l,g,n.minFraction)}const c=s+r-o;return{basesA:s,basesB:r,intersection:o,union:c,jaccard:c>0?o/c:Number.NaN,featuresAHit:i,featuresBHit:a,featuresA:t.length,featuresB:e.length}}function MI(t,e,n,A,s){let r=0,o=0,i=0,a=0,c=0,l=Number.NaN,g=Number.NaN;const f=()=>{if(!Number.isNaN(l)){for(o+=g-l;c<A.length&&A[c][1]<=l;)c++;for(let h=c;h<A.length&&A[h][0]<g;h++)r+=Math.min(g,A[h][1])-Math.max(l,A[h][0])}};for(let h=0;h<n.length;h++){const u=n[h],I=t[u],d=I+e[u];for(;a<A.length&&A[a][1]<=I;)a++;let C=0;for(let Q=a;Q<A.length&&A[Q][0]<d;Q++)C+=Math.max(0,Math.min(d,A[Q][1])-Math.max(I,A[Q][0]));const B=d-I;B>0&&C>0&&C/B>=s&&i++,Number.isNaN(l)?(l=I,g=d):I<=g?g=Math.max(g,d):(f(),l=I,g=d)}return f(),{intersection:r,covered:o,hits:i}}function lA(t,e){const n=e.length;let A=0;for(let c=0;c<n;c++)A+=e[c];const s=n>0?A/n:Number.NaN;let r=0;for(let c=0;c<n;c++)r+=(e[c]-s)**2;const o=n>1?Math.sqrt(r/(n-1)):Number.NaN;let i=0,a=0;for(let c=0;c<n;c++)e[c]>=t&&i++,e[c]<=t&&a++;return{observed:t,mean:s,sd:o,z:o>0?(t-s)/o:Number.NaN,fold:s>0?t/s:Number.NaN,pEnriched:(i+1)/(n+1),pDepleted:(a+1)/(n+1)}}function DI(t,e,n){const A=oa(t,e,{minFraction:n.minFraction}),s=[],r=[],o=[];for(const I of t.contigs){const d=t.contigs.indexOf(I),C=[];let B=0;for(let m=t.contigAt[d];m<t.contigAt[d+1];m++){const p=t.end[m]-t.start[m];p<=0||(C.push(p),B=Math.max(B,t.end[m]))}if(C.length===0)continue;let E=n.lengthOf(I);if(E===void 0||E<=0){const m=e.contigs.indexOf(I);let p=B;if(m>=0)for(let w=e.contigAt[m];w<e.contigAt[m+1];w++)p=Math.max(p,e.end[w]);E=p,r.push(I)}if(!Number.isFinite(E)||E<=0){o.push(I);continue}s.push({contig:I,length:E,lengths:C,runs:vA(e,I)})}if(s.length===0)return null;const i=Math.max(1,Math.trunc(n.iterations)),a=Vi(n.seed),c=new Float64Array(i),l=new Float64Array(i),g=new Float64Array(i);let f=0;for(const I of s)f=Math.max(f,I.lengths.length);const h=new Float64Array(f),u=new Int32Array(f);for(let I=0;I<i;I++){if(n.cancelled?.()===!0)return null;let d=0,C=0,B=0;for(const E of s){const m=E.lengths.length;for(let y=0;y<m;y++){const N=Math.max(0,E.length-E.lengths[y]);h[y]=Math.floor(a()*(N+1)),u[y]=y}const p=u.subarray(0,m);p.sort((y,N)=>h[y]-h[N]);const w=MI(h,E.lengths,p,E.runs,n.minFraction);d+=w.intersection,C+=w.covered,B+=w.hits}l[I]=d,g[I]=B;const Q=C+A.basesB-d;c[I]=Q>0?d/Q:Number.NaN,n.onProgress?.(I+1,i)}return{iterations:i,jaccard:lA(A.jaccard,c),intersection:lA(A.intersection,l),featuresHit:lA(A.featuresAHit,g),assumedLengths:r,droppedContigs:o}}const FI=async t=>{const e=ne(t.inputs.features,t.params,"a"),n=ne(t.inputs.features,t.params,"b"),A=e.value,s=n.value;if(A===void 0||s===void 0){const u=[e,n].filter(d=>d.value===void 0),I=u.filter(d=>d.chosen).length;return t.note(I===u.length?`The interval ${u.length===2?"sets":"set"} chosen ${u.length===2?"are":"is"} no longer loaded. Re-open the file, or pick another.`:`Two interval sets are needed and ${u.length===2&&I===0?"neither has":"one has not"} been chosen. Load two BED files, or a BED and a GTF, and pick one in each box.`),[]}t.progress(0,1,"comparing");const r=oa(A,s,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6)))});t.progress(1,1,"done"),Number.isFinite(r.jaccard)||t.note("Neither set covers any bases, so there is nothing to compare.");const i=[{kind:"table",id:"overlap",label:"Overlap",columns:[{key:"measure",label:"Measure",kind:"text"},{key:"value",label:"Value",kind:"number",digits:4},{key:"note",label:"Note",kind:"text"}],rows:[{measure:"Jaccard (bases)",value:r.jaccard,note:"Symmetric; 1 is identical."},{measure:"Shared bases",value:r.intersection,note:""},{measure:"Bases in either",value:r.union,note:""},{measure:"Bases in the first",value:r.basesA,note:"After merging its own overlaps."},{measure:"Bases in the second",value:r.basesB,note:"After merging its own overlaps."},{measure:"First set hit",value:r.featuresA===0?Number.NaN:r.featuresAHit/r.featuresA,note:`${r.featuresAHit.toLocaleString()} of ${r.featuresA.toLocaleString()} features.`},{measure:"Second set hit",value:r.featuresB===0?Number.NaN:r.featuresBHit/r.featuresB,note:`${r.featuresBHit.toLocaleString()} of ${r.featuresB.toLocaleString()} features.`}]}];if(!Lt(t.params,"shuffle",!1))return i;const a=st(t.params,"shuffleWhich","a")!=="b",c=Math.max(20,Math.trunc(T(t.params,"iterations",1e3)));t.progress(0,c,"shuffling");const l=DI(a?A:s,a?s:A,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6))),iterations:c,seed:T(t.params,"seed",1),lengthOf:u=>t.lengthOf(u),cancelled:()=>t.cancelled(),onProgress:(u,I)=>t.progress(u,I,"shuffling")});if(t.throwIfCancelled(),l===null)return t.note("The set chosen to move occupies no sequence this session knows a length for, so there was nothing to shuffle it within. Load the assembly — a chrom.sizes, or the map itself."),i;l.assumedLengths.length>0&&t.note(`${l.assumedLengths.length.toLocaleString()} sequence${l.assumedLengths.length===1?" has":"s have"} no known length, so the null was drawn over the furthest position either set reaches there — which is shorter than the sequence and overstates the enrichment. ${l.assumedLengths.slice(0,6).join(", ")}${l.assumedLengths.length>6?", …":""}.`),l.droppedContigs.length>0&&t.note(`${l.droppedContigs.length.toLocaleString()} sequence${l.droppedContigs.length===1?"":"s"} could not be shuffled at all and ${l.droppedContigs.length===1?"is":"are"} left out of the null: ${l.droppedContigs.slice(0,6).join(", ")}${l.droppedContigs.length>6?", …":""}.`);const g=a?"first":"second",f=(u,I,d)=>({measure:u,observed:I.observed,expected:I.mean,fold:I.fold,z:I.z,p:I.observed>=I.mean?I.pEnriched:I.pDepleted,tail:I.observed>=I.mean?"enriched":"depleted",digits:d}),h=[f("Jaccard (bases)",l.jaccard,4),f("Shared bases",l.intersection,0),f(`Features of the ${g} set hit`,l.featuresHit,0)].map(({digits:u,...I})=>I);return i.push({kind:"table",id:"overlap-null",label:`Against ${l.iterations.toLocaleString()} shuffles of the ${g} set`,columns:[{key:"measure",label:"Measure",kind:"text"},{key:"observed",label:"Observed",kind:"number",digits:4},{key:"expected",label:"Expected",kind:"number",digits:4,hint:"Mean of the null."},{key:"fold",label:"Fold",kind:"number",digits:2,hint:"Observed over expected."},{key:"z",label:"z",kind:"number",digits:2},{key:"p",label:"p",kind:"number",digits:5,hint:`Permutation p on the tail the observation fell on, with Phipson and Smyth’s +1: the smallest this run can report is ${(1/(l.iterations+1)).toPrecision(2)}.`},{key:"tail",label:"Tail",kind:"text"}],rows:h}),i},$t={maxIter:3e3,convergenceEps:1e-6,start:[.1,1,.2,.5],pseudoValueEps:1e-8,finalPseudoValueEps:1e-12,emStepsPerRound:30},Ct=[0,.2,.1,.01],ee=[20,20,.99,.99],_r={min:Ct,max:ee};class se extends Error{constructor(e){super(e),this.name="IdrError"}}const In=new Float64Array(1),Kr=new Int32Array(In.buffer),ia=new Uint8Array(Float64Array.of(1).buffer)[7]===63?1:0,SI=1-ia,qr=.8450629115104675,RI=.1283791670955126,LI=1.0270333367641007,Fe=[.12837916709551256,-.3250421072470015,-.02848174957559851,-.005770270296489442,-23763016656650163e-21],Se=[.39791722395915535,.0650222499887673,.005081306281875766,.00013249473800432164,-3960228278775368e-21],zt=[-.0023621185607526594,.41485611868374833,-.3722078760357013,.31834661990116175,-.11089469428239668,.035478304325618236,-.002166375594868791],le=[.10642088040084423,.540397917702171,.07182865441419627,.12617121980876164,.01363708391202905,.011984499846799107],Tt=[-.009864944034847148,-.6938585727071818,-10.558626225323291,-62.375332450326006,-162.39666946257347,-184.60509290671104,-81.2874355063066,-9.814329344169145],Jt=[19.651271667439257,137.65775414351904,434.56587747522923,645.3872717332679,429.00814002756783,108.63500554177944,6.570249770319282,-.0604244152148581],Xt=[-.0098649429247001,-.799283237680523,-17.757954917754752,-160.63638485582192,-637.5664433683896,-1025.0951316110772,-483.5191916086514],Vt=[30.33806074348246,325.7925129965739,1536.729586084437,3199.8582195085955,2553.0504064331644,474.52854120695537,-22.44095244658582];function Hr(t){In[0]=t;const e=Kr[ia],n=e&2147483647;if(n>=2146435072)return 1-(e>>>31<<1)+1/t;if(n<1072365568){if(n<1043333120)return n<8388608?.125*(8*t+LI*t):t+RI*t;const c=t*t,l=Fe[0]+c*(Fe[1]+c*(Fe[2]+c*(Fe[3]+c*Fe[4]))),g=1+c*(Se[0]+c*(Se[1]+c*(Se[2]+c*(Se[3]+c*Se[4])))),f=l/g;return t+t*f}if(n<1072955392){const c=Math.abs(t)-1,l=zt[0]+c*(zt[1]+c*(zt[2]+c*(zt[3]+c*(zt[4]+c*(zt[5]+c*zt[6]))))),g=1+c*(le[0]+c*(le[1]+c*(le[2]+c*(le[3]+c*(le[4]+c*le[5])))));return e>=0?qr+l/g:-qr-l/g}if(n>=1075314688)return e>=0?1-1e-300:1e-300-1;const A=Math.abs(t),s=1/(A*A);let r,o;n<1074191214?(r=Tt[0]+s*(Tt[1]+s*(Tt[2]+s*(Tt[3]+s*(Tt[4]+s*(Tt[5]+s*(Tt[6]+s*Tt[7])))))),o=1+s*(Jt[0]+s*(Jt[1]+s*(Jt[2]+s*(Jt[3]+s*(Jt[4]+s*(Jt[5]+s*(Jt[6]+s*Jt[7])))))))):(r=Xt[0]+s*(Xt[1]+s*(Xt[2]+s*(Xt[3]+s*(Xt[4]+s*(Xt[5]+s*Xt[6]))))),o=1+s*(Vt[0]+s*(Vt[1]+s*(Vt[2]+s*(Vt[3]+s*(Vt[4]+s*(Vt[5]+s*Vt[6]))))))),In[0]=A,Kr[SI]=0;const i=In[0],a=Math.exp(-i*i-.5625)*Math.exp((i-A)*(i+A)+r/o);return e>=0?1-a/A:a/A-1}function dn(t,e,n,A){const s=(t-e)/n;return .5*A*Hr(s/Math.SQRT2)+.5*(1-A)*Hr(t/Math.SQRT2)+.5}function Wr(t,e,n,A,s,r,o){let i=0;for(let a=0;a<1e3;a++){i=s+(r-s)/2;const c=dn(i,e,n,A);if(Math.abs(c-t)<o)return i;c<t?s=i:r=i}return i}function UA(t,e,n,A,s,r){const o=zr(t.length,n,A,s,r),i=e.length===t.length?o:zr(e.length,n,A,s,r);return[Pr(t,o),Pr(e,i)]}function Pr(t,e){const n=new Float64Array(t.length);for(let A=0;A<t.length;A++)n[A]=e[t[A]];return n}function zr(t,e,n,A,s){const r=new Float64Array(t);if(t===0)return r;const o=t+1,i=1/o;let a=0<=e?0:e;for(;dn(a,e,n,A)>i;)a-=1;let c=0>=e?0:e;for(;dn(c,e,n,A)<1-i;)c+=1;a=Wr(i,e,n,A,a,c,s),r[0]=a;for(let l=1;l<t;l++){const g=(l+1)/o;dn(c,e,n,A)<g&&(c+=10);const f=Wr(g,e,n,A,a,c,s);r[l]=f,a=f,c=a+2*(f-r[l-1])}return r}class aa{constructor(e,n){this.z1=e,this.z2=n,this.n=e.length,this.noise=new Float64Array(this.n),this.signal=new Float64Array(this.n),this.terms=new Float64Array(this.n),Xr(0,1,0,e,n,this.noise)}n;noise;signal;terms;at=[Number.NaN,Number.NaN,Number.NaN];logLik(e){this.signalAt(e);const n=e[3];for(let A=0;A<this.n;A++)this.terms[A]=Math.log(n*this.signal[A]+(1-n)*this.noise[A]);return Bt(this.terms)}membership(e){this.signalAt(e);const n=e[3],A=new Float64Array(this.n);for(let s=0;s<this.n;s++){const r=n*this.signal[s];A[s]=r/(r+(1-n)*this.noise[s])}return A}signalAt(e){const n=this.at;e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2]||(Xr(e[0],e[1],e[2],this.z1,this.z2,this.signal),this.at=[e[0],e[1],e[2]])}}function Xr(t,e,n,A,s,r){const o=-1.837877-Math.log(e)-Math.log(e)-.5*Math.log(1-n*n),i=2*n,a=2*(1-n*n);for(let c=0;c<A.length;c++){const l=(A[c]-t)/e,g=(s[c]-t)/e;r[c]=Math.exp(o-(l*l-i*l*g+g*g)/a)}}function xI(t,e){const{n,z1:A,z2:s}=t,r=t.membership(e),o=Bt(r),i=new Float64Array(n);for(let I=0;I<n;I++)i[I]=r[I]*A[I];const a=Bt(i)/o;for(let I=0;I<n;I++)i[I]=r[I]*s[I];const c=Bt(i)/o,l=(a+c)/2;for(let I=0;I<n;I++){const d=A[I]-l;i[I]=r[I]*(d*d)}const g=Bt(i);for(let I=0;I<n;I++){const d=s[I]-l;i[I]=r[I]*(d*d)}const f=Bt(i),h=Math.sqrt((g+f)/(2*o));for(let I=0;I<n;I++)i[I]=r[I]*(A[I]-l)*(s[I]-l);const u=2*Bt(i)/(g+f);return[l,h,u,o/n]}function ca(t){const e=[t[0],t[1],t[2],t[3]];let n=!1;return e[0]<Ct[0]&&(e[0]=Ct[0],n=!0),e[1]<Ct[1]&&(e[1]=Ct[1],n=!0),e[2]<Ct[2]?(e[2]=Ct[2],n=!0):e[2]>ee[2]&&(e[2]=ee[2],n=!0),e[3]<Ct[3]?(e[3]=Ct[3],n=!0):e[3]>ee[3]&&(e[3]=ee[3],n=!0),{theta:e,changed:n}}function GI(t,e,n,A){let s=e,r=t.logLik(s),o=[e[0],e[1],e[2],e[3]];for(let i=0;i<n;i++){const a=ca(xI(t,s));o=a.theta;const c=t.logLik(o);if(a.changed)return{theta:o,changed:!0};if(!(c+1e-6>=r))throw new se("An EM step lowered the likelihood, which stops idr’s own fit.");if(c-r<A)return{theta:o,changed:!1};s=o,r=c}return{theta:o,changed:!1}}function vI(t,e,n,A=1e-5,s=500){if(!Number.isFinite(e)||!Number.isFinite(n))throw new se("Optimization bounds must be finite scalars.");if(e>n)throw new se("The lower bound exceeds the upper bound.");const r=Math.sqrt(22e-17),o=.5*(3-Math.sqrt(5));let i=e,a=n,c=i+o*(a-i),l=c,g=c,f=0,h=0,u=g,I=t(u),d=1,C=I,B=I,Q=.5*(i+a),E=r*Math.abs(g)+A/3,m=2*E;for(;Math.abs(g-Q)>m-.5*(a-i);){let p=!0;if(Math.abs(h)>E){p=!1;let N=(g-l)*(I-C),k=(g-c)*(I-B),b=(g-c)*k-(g-l)*N;if(k=2*(k-N),k>0&&(b=-b),k=Math.abs(k),N=h,h=f,Math.abs(b)<Math.abs(.5*k*N)&&b>k*(i-g)&&b<k*(a-g)){if(f=(b+0)/k,u=g+f,u-i<m||a-u<m){const M=Math.sign(Q-g)+(Q-g===0?1:0);f=E*M}}else p=!0}p&&(h=g>=Q?i-g:a-g,f=o*h);const w=Math.sign(f)+(f===0?1:0);u=g+w*Math.max(Math.abs(f),E);const y=t(u);if(d+=1,y<=I?(u>=g?i=g:a=g,c=l,C=B,l=g,B=I,g=u,I=y):(u<g?i=u:a=u,y<=B||l===g?(c=l,C=B,l=u,B=y):(y<=C||c===g||c===l)&&(c=u,C=y)),Q=.5*(i+a),E=r*Math.abs(g)+A/3,m=2*E,d>=s)break}return g}function UI(t,e,n){const A=[e[0],e[1],e[2],e[3]],s=e[n],r=c=>(A[n]=s+c,-t.logLik(A));if(!(s>=Ct[n])||!(s<=ee[n]))throw new se("A coordinate-ascent step started outside idr’s parameter box.");const o=vI(r,Ct[n]-s,ee[n]-s),i=-r(0),a=-r(o);return a>i?(e[n]+=o,a):i}function TI(t,e,n,A){let s=t.logLik(e),r=[e[0],e[1],e[2],e[3]],o=s;for(let i=0;i<n;i++){for(let c=0;c<4;c++)o=UI(t,r,c);const a=ca(r);if(a.changed)throw new se("Coordinate ascent left idr’s parameter box, which stops idr’s own fit.");if(r=a.theta,!(o+1e-6>=s))throw new se("A coordinate-ascent round lowered the likelihood, which stops idr’s own fit.");if(o-s<A)return r;s=o}return r}async function JI(t,e,n={}){const A=n.eps??$t.convergenceEps,s=n.maxIter??$t.maxIter,r=$t.pseudoValueEps,o=n.start??$t.start;let i=[o[0],o[1],o[2],o[3]],[a,c]=UA(t,e,i[0],i[1],i[3],r),l=!1,g=0;const f=new Float64Array(t.length);for(let h=0;h<s;h++){g=h+1;const u=i,I=new aa(a,c),d=GI(I,u,$t.emStepsPerRound,A/10);i=d.theta,d.changed&&(l=!0,i=TI(I,u,$t.emStepsPerRound,A/10));const C=Bt([Math.abs(i[0]-u[0]),Math.abs(i[1]-u[1]),Math.abs(i[2]-u[2]),Math.abs(i[3]-u[3])]),B=a,Q=c;[a,c]=UA(t,e,i[0],i[1],i[3],r);for(let p=0;p<f.length;p++)f[p]=Math.abs(B[p]-a[p]);const E=RA(f);for(let p=0;p<f.length;p++)f[p]=Math.abs(Q[p]-c[p]);const m=E+RA(f);if(n.between!==void 0&&await n.between(g),h>3&&C<A&&m<A)break}return{theta:i,rounds:g,coordinateAscent:l}}function $I(t,e,n){const A=$t.finalPseudoValueEps,[s,r]=UA(e,n,t[0],t[1],t[3],A),o=new aa(s,r).membership(t),i=$t.convergenceEps,a=new Float64Array(o.length);for(let c=0;c<a.length;c++){let l=1-o[c];s[c]+r[c]<0&&(l=1),a[c]=l<i?i:l>1?1:l}return a}function OI(t){const e=t.length,n=Array.from({length:e},(o,i)=>i);n.sort((o,i)=>t[o]-t[i]||o-i);const A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o<e&&t[n[o]]===t[n[r]];)s+=t[n[o]],o++;const i=s/o;for(let a=r;a<o;a++)A[n[a]]=i;r=o}return A}function TA(t){return-Math.log10(Math.max(1e-5,t))}function Vr(t){const e=t.length,n=Array.from({length:e},(s,r)=>r);n.sort((s,r)=>t[s]-t[r]||s-r);const A=new Int32Array(e);for(let s=0;s<e;s++)A[n[s]]=s;return A}const sn={width:150,times:3,minWidth:75,truncate:1e5},YI=[-1/560,8/315,-1/5,8/5,-205/72,8/5,-1/5,8/315,-1/560],_I=1e6,KI=1e-10;function qI(t,e){let n=Float64Array.from(YI);const A=new Float64Array(t).fill(1/t);for(let o=0;o<e;o++)n=HI(n,A);const s=new Float64Array(n.length);for(let o=0;o<n.length;o++)s[o]=_I*n[n.length-1-o];const r=new Float64Array(s.length+1);for(let o=0;o<s.length;o++)r[o+1]=r[o]+s[o];return{width:t,times:e,values:s,cumulative:r}}function HI(t,e){const n=new Float64Array(t.length+e.length-1);for(let A=0;A<n.length;A++){let s=0;const r=Math.max(0,A-(e.length-1)),o=Math.min(A,t.length-1);for(let i=r;i<=o;i++)s+=t[i]*e[A-i];n[A]=s}return n}function ks(t,e){return Math.min(e,t.values.length)-1>>1}function WI(t,e){const n=ks(t,e);return{left:t.values.length-1-n,right:n}}function PI(t,e,n,A,s){const r=[],o=[],i=[],a=(l,g,f)=>{const h=i.length-1;if(h>=0&&o[h]===l&&la(i[h],f)){o[h]=g;return}r.push(l),o.push(g),i.push(f)};let c=A;for(let l=0;l<t.length&&c<s;l++){const g=Math.max(t[l],c),f=Math.min(e[l],s);f<=g||(g>c&&a(c,g,Number.NaN),a(g,f,n[l]),c=f)}return c<s&&a(c,s,Number.NaN),{starts:Int32Array.from(r),ends:Int32Array.from(o),values:Float64Array.from(i),length:r.length}}function zI(t,e){return{starts:Int32Array.of(t),ends:Int32Array.of(e),values:Float64Array.of(0),length:1}}function XI(t,e,n){if(t.length===1)return t[0];const A=[],s=[],r=[],o=new Int32Array(t.length);let i=e;for(;i<n;){let a=n,c=0;for(let f=0;f<t.length;f++){const h=t[f];for(;o[f]<h.length&&h.ends[o[f]]<=i;)o[f]++;const u=o[f];if(u>=h.length||h.starts[u]>i)throw new Error(`pooledRuns: a track does not cover ${i}`);c+=h.values[u],h.ends[u]<a&&(a=h.ends[u])}const l=Math.fround(c/t.length),g=r.length-1;g>=0&&la(r[g],l)?s[g]=a:(A.push(i),s.push(a),r.push(l)),i=a}return{starts:Int32Array.from(A),ends:Int32Array.from(s),values:Float64Array.from(r),length:A.length}}function la(t,e){return t===e||t!==t&&e!==e}function Zr(t,e,n,A,s,r,o){const i=e.values.length,a=ks(e,n),c=new Float64Array(Math.max(0,s-A));if(o===void 0)jr(t,e,a,A,s,c,A);else{let l=0;for(;l<c.length;){const g=o.indexOf(1,l),f=g<0||g>c.length?c.length:g;if(c.fill(Number.NaN,l,f),f===c.length)break;const h=o.indexOf(0,f),u=h<0||h>c.length?c.length:h;jr(t,e,a,A+f,A+u,c,A),l=u}}if(r!==void 0)for(let l=0;l<t.length;l++){const g=Math.max(A,t.starts[l]-a+i-1),f=Math.min(s-1,t.ends[l]-a-1);g<=f&&r.fill(1,g-A,f-A+1)}return c}function jr(t,e,n,A,s,r,o){const i=e.values.length,a=e.values,c=e.cumulative,l=t.starts,g=t.ends,f=t.values,h=A+n+1,u=s+n,I=-(n+1)-o;let d=0,C=t.length;for(;d<C;){const E=d+C>>>1;g[E]>h-i?C=E:d=E+1}const B=c[0],Q=c[i];for(;d<t.length;d++){const E=l[d];if(E+1>u)break;const m=g[d],p=f[d];let w=E+1>h?E+1:h,y=m-1<E+i?m-1:E+i;if(y>u&&(y=u),w<=y){let k=w;k===E+1&&(r[I+k]+=p*a[0],k++);for(let b=I+k,M=k-E,F=I+y;b<=F;b++,M++)r[b]+=p*(c[M]-B)}if(w=m>h?m:h,y=E+i<u?E+i:u,w<=y)if(m-E===1)for(let k=I+w,b=w-1-E,M=I+y;k<=M;k++,b++)r[k]+=p*a[b];else for(let k=I+w,b=w-E,M=w-m,F=I+y;k<=F;k++,b++,M++)r[k]+=p*(c[b]-c[M]);if(w=E+i+1>h?E+i+1:h,y=m-1<u?m-1:u,w<=y){const k=p*(Q-B);for(let b=I+w,M=I+y;b<=M;b++)r[b]+=k}w=m>E+i+1?m:E+i+1,w<h&&(w=h);const N=m+i-1;if(y=N<u?N:u,w<=y){const k=I+(y===N?y-1:y);for(let b=I+w,M=w-m;b<=k;b++,M++)r[b]+=p*(Q-c[M]);y===N&&(r[I+N]+=p*a[i-1])}}}const VI=65536;function ga(t){return Math.fround(t)<KI}function ZI(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)ga(t[n])&&(e[n]=1);return e}class to{constructor(e,n,A){this.contig=e,this.length=n,this.tracks=A.length,this.absent=A,this.scores=A.map(()=>[]),this.held=A.map(()=>new Float64Array(1024))}tracks;absent;starts=[];ends=[];modes=[];flats=[];scores;previous=!1;rose=!1;open=-1;best=Number.NEGATIVE_INFINITY;ties=[];held;heldLength=0;openFlat=0;position=0;feed(e,n,A,s){if(e!==this.position)throw new Error(`ConcaveScan: fed ${e} after ${this.position}`);for(let r=0;r<n.length;r++){const o=e+r,i=Math.fround(n[r]),a=ga(i);if(o===0?a&&this.begin(0):a&&!this.previous?(this.rose=!0,this.begin(o)):!a&&this.previous&&this.close(o),a){const c=-i;c>this.best?(this.best=c,this.ties=[o]):c===this.best&&this.ties.push(o),this.hold(A,r),s!==void 0&&s[r]===1&&(this.openFlat=1)}this.previous=a}this.position=e+n.length}finish(){if(this.open>=0&&this.close(this.length),!this.rose){this.starts=[],this.ends=[],this.modes=[],this.flats=[];for(const e of this.scores)e.length=0}return{contig:this.contig,starts:Int32Array.from(this.starts),ends:Int32Array.from(this.ends),modes:Int32Array.from(this.modes),scores:this.scores.map(e=>Float64Array.from(e)),flat:Uint8Array.from(this.flats)}}begin(e){this.open=e,this.best=Number.NEGATIVE_INFINITY,this.ties=[],this.heldLength=0,this.openFlat=0,this.held[0].length>VI&&(this.held=this.held.map(()=>new Float64Array(1024)))}hold(e,n){this.heldLength===this.held[0].length&&(this.held=this.held.map(A=>{const s=new Float64Array(A.length*2);return s.set(A),s}));for(let A=0;A<this.tracks;A++)this.held[A][this.heldLength]=e[A][n];this.heldLength++}close(e){this.starts.push(this.open),this.ends.push(e),this.flats.push(this.openFlat),this.modes.push(this.ties.length===0?this.open:this.ties[this.ties.length>>1]);for(let n=0;n<this.tracks;n++)this.scores[n].push(this.absent[n]?Number.NEGATIVE_INFINITY:-RA(this.held[n],0,this.heldLength));this.open=-1}}function jI(t){const e=t.length,n=Array.from({length:e},(r,o)=>o);n.sort((r,o)=>t[o]-t[r]||r-o);const A=new Float64Array(e);let s=0;for(;s<e;){let r=s+1;for(;r<e&&t[n[r]]===t[n[s]];)r++;const o=(s+1+r)/2;for(let i=s;i<r;i++)A[n[i]]=o;s=r}return A}function td(t,e,n,A,s){const r=e.length,o=new Float64Array(r).fill(Number.POSITIVE_INFINITY);for(const l of A){const g=jI(l);for(let f=0;f<r;f++)g[f]<o[f]&&(o[f]=g[f])}const i=(l,g)=>t[l]<t[g]?-1:t[l]>t[g]?1:e[l]-e[g]||n[l]-n[g],a=Array.from({length:r},(l,g)=>g);a.sort((l,g)=>o[l]-o[g]||i(l,g));const c=a.slice(0,Math.max(0,Math.min(r,s)));return c.sort(i),Int32Array.from(c)}class ed{constructor(e,n,A={}){this.tracks=e,this.limit=n,this.scores=Array.from({length:e},()=>new Float64Array(1024)),this.floor=new Float64Array(e).fill(Number.NEGATIVE_INFINITY),A.prune===!1&&(this.holdAll=!0),this.below=A.below===!0?new Float64Array(1024):null}size=0;contigs=[];starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;floor;seen=0;dropped=0;holdAll=!1;below;belowSize=0;add(e,n){this.seen++;let A=this.holdAll;for(let r=0;r<this.tracks;r++){const o=e.scores[r][n];o!==o&&!this.holdAll&&(this.holdAll=!0,A=!0),o>=this.floor[r]&&(A=!0)}if(!A){this.drop(e.scores[0][n],e.flat[n]);return}this.size===this.starts.length&&this.grow();const s=this.size++;this.contigs[s]=e.contig,this.starts[s]=e.starts[n],this.ends[s]=e.ends[n],this.modes[s]=e.modes[n],this.flats[s]=e.flat[n];for(let r=0;r<this.tracks;r++)this.scores[r][s]=e.scores[r][n];!this.holdAll&&this.size>=2*this.tracks*this.limit+1024&&this.prune()}finish(){this.holdAll||this.prune();const e=this.size,n={contig:this.contigs.slice(0,e),starts:this.starts.slice(0,e),ends:this.ends.slice(0,e),modes:this.modes.slice(0,e),flat:this.flats.slice(0,e),scores:this.scores.map(A=>A.slice(0,e))};return{...n,tested:td(n.contig,n.starts,n.ends,n.scores,this.limit),below:this.below===null?new Float64Array(0):this.below.slice(0,this.belowSize),exact:!(this.holdAll&&this.dropped>0)}}prune(){if(this.seen<this.limit)return;const e=this.size;for(let A=0;A<this.tracks;A++){const s=this.scores[A].slice(0,e).sort();this.floor[A]=s[e-this.limit]}let n=0;for(let A=0;A<e;A++){let s=!1;for(let r=0;r<this.tracks;r++)this.scores[r][A]>=this.floor[r]&&(s=!0);if(!s){this.drop(this.scores[0][A],this.flats[A]);continue}if(n!==A){this.contigs[n]=this.contigs[A],this.starts[n]=this.starts[A],this.ends[n]=this.ends[A],this.modes[n]=this.modes[A],this.flats[n]=this.flats[A];for(let r=0;r<this.tracks;r++)this.scores[r][n]=this.scores[r][A]}n++}this.size=n,this.contigs.length=n}drop(e,n){if(this.dropped++,!(this.below===null||!(e>0)||n===1)){if(this.belowSize===this.below.length){const A=new Float64Array(this.below.length*2);A.set(this.below),this.below=A}this.below[this.belowSize++]=e}}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}function nd(t,e,n,A,s){return A>0?[Math.max(0,n-A),Math.min(s,n+A+1)]:[t,e]}function fa(t){return-(Math.log(t)/Math.log(10))}const ha=[.001,.005,.01,.05,.1,.2],gA="0.05";function ua(t){return typeof t.replicate=="string"&&t.replicate!==""}const Ad="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",sd=8,rd=-1,od=-2;let ge;function id(){if(ge!==void 0)return ge;ge=null;try{if(typeof WebAssembly>"u")return null;const t=atob(Ad),e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=t.charCodeAt(n);WebAssembly.validate(e)&&(ge=new WebAssembly.Module(e))}catch{ge=null}return ge}class JA extends Error{constructor(){super("The peak-calling kernel ran out of memory."),this.name="KernelMemoryError"}}class ad{size=0;starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;constructor(e){this.scores=Array.from({length:e},()=>new Float64Array(1024))}take(e,n,A){if(A===0)return;for(;this.size+A>this.starts.length;)this.grow();const s=e.buffer,r=n.scan_region_capacity();this.starts.set(new Int32Array(s,n.scan_region_starts()>>>0,A),this.size),this.ends.set(new Int32Array(s,n.scan_region_ends()>>>0,A),this.size),this.modes.set(new Int32Array(s,n.scan_region_modes()>>>0,A),this.size),this.flats.set(new Uint8Array(s,n.scan_region_flats()>>>0,A),this.size);const o=n.scan_regions()>>>0;this.scores.forEach((i,a)=>i.set(new Float64Array(s,o+a*r*8,A),this.size)),this.size+=A}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}class bs{constructor(e,n,A,s){this.memory=e,this.exports=n,this.contig=A,this.tracks=s,this.collected=new ad(s)}collected;static open(e,n,A,s,r){const o=id();if(o===null||s<1||s>sd)return null;try{const i=new WebAssembly.Memory({initial:2}),c=new WebAssembly.Instance(o,{env:{memory:i}}).exports,l=e.values.length;if(c.scan_open(s,l,ks(e,A),A,r)!==0)return null;const g=c.scan_kernel()>>>0;return new Float64Array(i.buffer,g,l).set(e.values),new Float64Array(i.buffer,g+l*8,l+1).set(e.cumulative),new bs(i,c,n,s)}catch{return null}}window(e,n,A,s,r){let o=0;for(let i=0;i<this.tracks;i++){const a=r[i];if(a===null){o|=1<<i;continue}const c=a.starts.length,l=this.exports.scan_input(i,c)>>>0;if(l===0)throw new JA;const g=this.memory.buffer;new Float64Array(g,l,c).set(a.values),new Int32Array(g,l+c*8,c).set(a.starts),new Int32Array(g,l+c*12,c).set(a.ends)}this.closed(this.exports.scan_window(e,n,A,s,o),e)}lastWindow(e){const n=this.memory.buffer;return{pooled:new Float64Array(n,this.exports.scan_pooled()>>>0,e).slice(),flat:new Uint8Array(n,this.exports.scan_flat()>>>0,e).slice(),own:Array.from({length:this.tracks},(A,s)=>new Float64Array(n,this.exports.scan_own(s)>>>0,e).slice())}}finish(){this.closed(this.exports.scan_finish(),-1);const{collected:e}=this,n=this.exports.scan_rose()===1?e.size:0;return{contig:this.contig,starts:e.starts.slice(0,n),ends:e.ends.slice(0,n),modes:e.modes.slice(0,n),scores:e.scores.map(A=>A.slice(0,n)),flat:e.flats.slice(0,n)}}closed(e,n){if(e===rd)throw new JA;if(e===od)throw new Error(`ConcaveScan: fed ${n} out of order`);if(e<0)throw new Error(`pooledRuns: a track does not cover a window at ${n}`);this.collected.take(this.memory,this.exports,e)}}const fA=1<<18,eo=20,rn=2e4,no=["#0072b2","#009e73"],cd="#999999",ld=async t=>{const e=at(t.params,"signal");if(e===null)return t.note("No track was chosen. Load a bigWig and pick it under Track."),[];const n=ua(t.params)?at(t.params,"replicate"):null;if(n===e)return t.note("The replicate chosen is the track being called, and a track cannot test itself. Choose a second track, or none."),[];const A=n===null?[e]:[e,n],s=L=>t.inputs.labels?.[L]??L,r=Re(T(t.params,"width",sn.width),1,2e3),o=Re(T(t.params,"times",sn.times),0,10),i=Re(T(t.params,"minWidth",sn.minWidth),1,1e9),a=Re(T(t.params,"halfWidth",0),0,1e9),c=Re(T(t.params,"truncate",sn.truncate),1,1e9),l=fd(t),g=t.inputs.contigLengths??{},f=Yn(t.params,"sequences"),h=Object.keys(g).filter(L=>g[L]>0&&(f===null||f.includes(L)));if(h.length===0)return t.note(f!==null&&f.length===0?"No sequence is ticked, so there is nothing to call peaks on.":"This session knows no sequence lengths, so there is nothing to scan. Load a chrom.sizes, or the map itself."),[];const u=qI(r,o),I=L=>gd(t,A,h,g,u,{minWidth:i,truncate:c,below:n===null,prune:L});let d=await I(!0);if(typeof d!="string"&&!d.held.exact&&(d=await I(!1)),typeof d=="string")return t.note(d),[];const{held:C,found:B,n:Q,perSequence:E,absentOn:m}=d;for(let L=0;L<A.length;L++){if(m[L].length===h.length)return t.note(`${s(A[L])} has none of the ${h.length===1?"sequence":"sequences"} ticked. Check that it and the assembly name their sequences the same way.`),[];m[L].length>0&&t.note(`${s(A[L])} has no ${Ed(m[L])}. yapc reads a track that lacks a sequence as zeros there, so it lowers the mean the regions are called on, and ranks every region there last by it.`)}const p=`${u.values.length}-tap kernel: a ${r.toLocaleString()} bp window, ${o} ${o===1?"pass":"passes"}`;if(Q===0)return t.note(`No concave region at least ${i.toLocaleString()} bp wide on ${h.length===1?h[0]:`${h.length} sequences`} (${p}). A wider smoothing window finds broader shapes; a narrower minimum keeps smaller ones.`),[];const{contig:w,starts:y,ends:N,modes:k,flat:b,scores:M,tested:F}=C;t.note(`${B.toLocaleString()} concave ${B===1?"region":"regions"} on ${h.length.toLocaleString()} ${h.length===1?"sequence":"sequences"} (${p}), ${Q.toLocaleString()} at least ${i.toLocaleString()} bp wide`+(F.length<Q?`, of which the ${F.length.toLocaleString()} strongest by each track’s curvature rank were kept.`:"."));let S=null,v=null,x=null;const O=new Uint8Array(F.length).fill(1);if(n!==null)if(F.length<eo)t.note(`IDR needs at least ${eo} peaks to fit — its own command refuses fewer — and there ${F.length===1?"is 1":`are ${F.length}`}. They are reported untested, ranked by curvature.`);else{const L=Vr(on(M[0],F)),$=Vr(on(M[1],F)),Mt=ro(on(M[0],F))+ro(on(M[1],F));Mt>0&&t.note(`${Mt.toLocaleString()} ${Mt===1?"score ties":"scores tie"} with another: ranked by position, where yapc breaks a tie at random.`);try{S=await JI(L,$,{between:async P=>{t.progress(0,0,`IDR, round ${P}`),await Es(),t.throwIfCancelled()}})}catch(P){throw P instanceof se?new Error(`IDR could not fit these two tracks, as idr itself could not: ${P.message}`):P}v=$I(S.theta,L,$),x=OI(v);const vt=fa(l);for(let P=0;P<F.length;P++)O[P]=TA(x[P])>=vt?1:0;t.note(hd(S,F.length,Qd(O),l))}else{let L=0;for(let $=0;$<F.length;$++)b[F[$]]!==0&&(O[$]=0,L++);L>0&&t.note(`${L.toLocaleString()} of the candidates ${L===1?"is":"are"} flat — the signal constant across a whole kernel’s width inside, which yapc’s test counts as concave — and ${L===1?"is":"are"} left out, as IDR would leave ${L===1?"it":"them"} out of two replicates.`),t.note("One track, so no test of significance: yapc’s cut is IDR between two replicates. These are the strongest concave regions by curvature — choose a replicate to test them, or lower “keep the strongest” to the upper of the two populations in the figure.")}const J=new Map(h.map((L,$)=>[L,$])),K=[];for(let L=0;L<F.length;L++)O[L]===1&&K.push(L);K.sort((L,$)=>(J.get(w[F[L]])??0)-(J.get(w[F[$]])??0)||y[F[L]]-y[F[$]]);const V=new et;let H=0,ht=0;for(const L of K){const $=F[L],[Mt,vt]=nd(y[$],N[$],k[$],a,g[w[$]]);a>0&&(Mt!==k[$]-a||vt!==k[$]+a+1)&&H++;const P=[`summit ${(k[$]+1).toLocaleString("en-US")}`];P.push(`curvature ${A.map((YQ,oc)=>oo(M[oc][$])).join(" / ")}`),x!==null&&P.push(`IDR ${oo(x[L])}`),V.add(w[$],Mt,vt,{name:`peak_${++ht}`,score:x!==null?TA(x[L]):M[0][$],cds:[k[$],k[$]+1],detail:P.join(ct)})}H>0&&t.note(`${H.toLocaleString()} ${H===1?"peak reaches":"peaks reach"} past a sequence end at this half-width and ${H===1?"is":"are"} cut at it; yapc writes the coordinate past the end.`),K.length===0&&t.note(`No peak passes IDR ≤ ${l}. A looser threshold keeps more; two tracks that are not replicates of one experiment will pass few at any.`);const Gt=[];K.length>0&&Gt.push({kind:"intervals",id:`peaks-${A.map(L=>L.replace(/[^A-Za-z0-9_]+/g,"_")).join("-")}`,label:n===null?`Peaks · ${s(e)} · no IDR`:`Peaks · ${s(e)} + ${s(n)} · IDR ≤ ${l}`,payload:{kind:"features",data:V.finish()},noun:{one:"peak",many:"peaks"},lane:{under:{entry:e}},display:"lane",look:"point"});const q=ud(A.map(s),M,F,O,n!==null,b,C.below);return q!==null&&Gt.push(q),Gt.push(Id(h,g,E,K.map(L=>w[F[L]]))),S!==null&&x!==null&&Gt.push(dd(x,l)),Lt(t.params,"perPeak",!1)&&Gt.push(Cd({names:A.map(s),contig:w,starts:y,ends:N,modes:k,scores:M,tested:F,passes:O,local:v,global:x,replicate:n!==null})),t.progress(1,1,"done"),Gt};async function gd(t,e,n,A,s,r){const o=n.reduce((h,u)=>h+A[u],0);let i=0;const a=new ed(e.length,r.truncate,{prune:r.prune,below:r.below}),c=e.map(()=>[]),l=new Map;let g=0,f=0;for(const h of n){const u=await Ia(t,e,h,A[h],s,C=>{i+=C,t.progress(i,o,h)});if(typeof u=="string")return u;const{regions:I}=u;let d=0;for(let C=0;C<I.starts.length;C++)I.ends[C]-I.starts[C]<r.minWidth||(d++,a.add(I,C));g+=I.starts.length,f+=d,l.set(h,{regions:I.starts.length,wide:d}),u.absent.forEach((C,B)=>{C&&c[B].push(h)})}return{held:a.finish(),found:g,n:f,perSequence:l,absentOn:c}}async function Ia(t,e,n,A,s,r,o="auto"){const{left:i,right:a}=WI(s,A),c=e.map(()=>!1),l=o==="js"?null:bs.open(s,n,A,e.length,fA);let g=null,f=0;try{for(let h=0;h<A;h+=fA){const u=Math.min(A,h+fA),I=Math.max(0,h-i),d=Math.min(A,u+a),C=[];for(let B=0;B<e.length;B++){if(c[B]){C.push(null);continue}const Q=await t.sample(e[B],[{contig:n,start:I,end:d}],1);if(Q.note!==void 0)return Q.note;const E=Q.regions[0];E===void 0&&(c[B]=!0),C.push(E??null)}if(l!==null)l.window(h,u,I,d,C);else{const B=C.map(w=>w===null?zI(I,d):PI(w.starts,w.ends,w.values,I,d));g??=new to(n,A,c);const Q=new Uint8Array(u-h),E=Zr(XI(B,I,d),s,A,h,u,Q),m=e.length===1?null:ZI(E),p=m===null?[E]:B.map(w=>Zr(w,s,A,h,u,void 0,m));g.feed(h,E,p,Q)}r(u-h),f+=u-h,await Es(),t.throwIfCancelled()}}catch(h){if(!(h instanceof JA))throw h;return r(-f),Ia(t,e,n,A,s,r,"js")}return l!==null?{regions:l.finish(),absent:c}:{regions:(g??new to(n,A,c)).finish(),absent:c}}function fd(t){const e=Number(st(t.params,"idr",gA));return ha.includes(e)?e:(ua(t.params)&&t.note(`An IDR threshold of ${st(t.params,"idr","")} is not one yapc writes; ${gA} was used.`),Number(gA))}const Ao=["mean","spread","correlation","reproducible share"];function hd(t,e,n,A){const[s,r,o,i]=t.theta,a=`IDR fitted over ${e.toLocaleString()} peaks in ${t.rounds.toLocaleString()} rounds: μ ${s.toFixed(2)}, σ ${r.toFixed(2)}, ρ ${o.toFixed(2)}, reproducible share ${i.toFixed(2)}; ${n.toLocaleString()} pass IDR ≤ ${A}.`,c=[],l=g=>Number.isInteger(g)?String(g):g.toFixed(2);return t.theta.forEach((g,f)=>{const[h,u]=[_r.min[f],_r.max[f]];g<=h+1e-4*Math.max(1,h)?c.push(`the ${Ao[f]} at its floor of ${l(h)}`):g>=u-1e-4*Math.max(1,u)&&c.push(`the ${Ao[f]} at its ceiling of ${l(u)}`)}),c.length===0?a:`${a} The fit ended at the edge of IDR’s parameter box — ${c.join(", ")} — which is where two tracks that do not rank their peaks like replicates of one experiment put it. Read these IDRs as that, not as reproducibility.`}function ud(t,e,n,A,s,r,o){const i=[],a=new Uint8Array(r.length);for(const f of n)a[f]=1;for(let f=0;f<e.length;f++){const h=[],u=[];if(n.forEach((B,Q)=>{const E=e[f][B];!(E>0)||!s&&r[B]===1||(A[Q]===1?h.push(E):u.push(E))}),!s){for(let B=0;B<r.length;B++)a[B]===0&&e[f][B]>0&&r[B]===0&&u.push(e[f][B]);for(const B of o)u.push(B)}const I=e.length===1?"":`${t[f]} · `,d=s?`${I}passes IDR`:`${I}peaks`,C=s?`${I}fails IDR`:`${I}below the cut`;h.length>0&&i.push(so(d,h,no[f]??no[0])),u.length>0&&i.push(so(C,u,cd))}if(i.length===0)return null;const c=i.flatMap(f=>Array.from(f.y)),l=Bd(c,.01);let g=Number.NEGATIVE_INFINITY;for(const f of c)f>g&&(g=f);return{kind:"curve",id:"peaks-curvature",label:"Curvature of every candidate",series:i,xLabel:"",yLabel:"Curvature (yapc score)",xScale:"linear",yScale:"log",...Number.isFinite(l)&&l>0&&g>l?{yDomain:[10**Math.floor(Math.log10(l)),10**Math.ceil(Math.log10(g))]}:{}}}function so(t,e,n){const A=Float64Array.from(e).sort();let s=A;if(A.length>rn){s=new Float64Array(rn);for(let r=0;r<rn;r++)s[r]=A[Math.round(r*(A.length-1)/(rn-1))]}return{name:t,x:Float64Array.from(s,(r,o)=>o),y:s,colour:n,n:e.length,mark:"violin"}}function Id(t,e,n,A){const s=new Map;for(const r of A)s.set(r,(s.get(r)??0)+1);return{kind:"table",id:"peaks-sequences",label:"Per sequence",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"length",label:"Length",kind:"number"},{key:"regions",label:"Concave regions",kind:"number"},{key:"wide",label:"Wide enough",kind:"number"},{key:"peaks",label:"Peaks",kind:"number"},{key:"density",label:"Peaks per Mb",kind:"number",digits:1}],rows:t.map(r=>{const o=n.get(r)??{regions:0,wide:0},i=s.get(r)??0;return{sequence:r,length:e[r],regions:o.regions,wide:o.wide,peaks:i,density:i/e[r]*1e6}})}}function dd(t,e){const n=t.length;return{kind:"table",id:"peaks-idr",label:"IDR thresholds",columns:[{key:"threshold",label:"IDR ≤",kind:"text"},{key:"peaks",label:"Peaks",kind:"number"},{key:"share",label:"Share of tested",kind:"number",digits:3},{key:"drawn",label:"Drawn",kind:"text"}],rows:ha.map(A=>{const s=fa(A);let r=0;for(let o=0;o<n;o++)TA(t[o])>=s&&r++;return{threshold:String(A),peaks:r,share:r/n,drawn:A===e?"yes":""}})}}function Cd(t){const{names:e,contig:n,starts:A,ends:s,modes:r,scores:o,tested:i,passes:a,local:c,global:l}=t,g=[];return i.forEach((f,h)=>{const u={sequence:n[f],start:A[f],end:s[f],summit:r[f],width:s[f]-A[f]};o.forEach((I,d)=>{u[`curvature${d}`]=I[f]}),c!==null&&l!==null&&(u.local=c[h],u.idr=l[h],u.passes=a[h]===1?"yes":"no"),g.push(u)}),l!==null?g.sort((f,h)=>Number(f.idr)-Number(h.idr)):g.sort((f,h)=>Number(h.curvature0)-Number(f.curvature0)),{kind:"table",id:"peaks-list",label:t.replicate?"Every peak tested":"Every peak",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"summit",label:"Summit",kind:"number",coordinate:"start",hint:"The most concave base."},{key:"width",label:"Width",kind:"number"},...e.map((f,h)=>({key:`curvature${h}`,label:e.length===1?"Curvature":`Curvature · ${f}`,kind:"number",digits:2})),...c!==null?[{key:"local",label:"Local IDR",kind:"number",digits:4,scientific:!0},{key:"idr",label:"IDR",kind:"number",digits:4,scientific:!0},{key:"passes",label:"Passes",kind:"text"}]:[]],rows:g}}function Re(t,e,n){return Math.min(n,Math.max(e,Math.round(t)))}function on(t,e){const n=new Float64Array(e.length);for(let A=0;A<e.length;A++)n[A]=t[e[A]];return n}function Qd(t){let e=0;for(const n of t)e+=n;return e}function ro(t){const e=Float64Array.from(t).sort();let n=0;for(let A=1;A<e.length;A++)e[A]===e[A-1]&&n++;return n}function Bd(t,e){if(t.length===0)return Number.NaN;const n=Float64Array.from(t).sort(),A=e*(n.length-1),s=Math.floor(A),r=Math.min(n.length-1,s+1);return n[s]+(A-s)*(n[r]-n[s])}function oo(t){return Number.isFinite(t)?Number(t.toPrecision(4)).toLocaleString("en-US",{maximumSignificantDigits:4}):t>0?"∞":t<0?"−∞":"—"}function Ed(t){return t.length===1?t[0]:t.length<=3?`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`:`${t.slice(0,3).join(", ")} and ${(t.length-3).toLocaleString()} more`}const da=[{name:"DpnII",site:"GATC",cut:0},{name:"HindIII",site:"AAGCTT",cut:1},{name:"NcoI",site:"CCATGG",cut:1},{name:"EcoRI",site:"GAATTC",cut:1},{name:"BglII",site:"AGATCT",cut:1},{name:"HinfI",site:"GANTC",cut:1},{name:"DdeI",site:"CTNAG",cut:1},{name:"MseI",site:"TTAA",cut:1},{name:"NlaIII",site:"CATG",cut:4},{name:"CviQI",site:"GTAC",cut:1},{name:"AluI",site:"AGCT",cut:2}],md={MboI:"DpnII",Sau3AI:"DpnII",Csp6I:"CviQI"},Sn={Arima:["DpnII","HinfI"]},wd=(()=>{const t=new Map;for(const e of da)t.set(e.name.toLowerCase(),e);for(const[e,n]of Object.entries(md)){const A=t.get(n.toLowerCase());A!==void 0&&t.set(e.toLowerCase(),A)}return t})();function an(t){return wd.get(t.trim().toLowerCase())}function Rn(t){const e=t.trim().toLowerCase();return Object.keys(Sn).find(n=>n.toLowerCase()===e)}function Ca(t){return`${t.site.slice(0,t.cut)}^${t.site.slice(t.cut)}`}function pd(t){return t.site.length-2*t.cut}const yd=1/256,io=255;function ao(t){let e=1;for(const n of t){let A=0;for(let s=n;s!==0;s&=s-1)A++;e*=A/4}return e}function Nd(t){const e=t.toUpperCase().replace(/U/g,"T"),n=e.indexOf("^"),A=e.replace("^","");if(n<0){const r=Ye(A);return{refusal:Oe(r)?`“${t}” is neither an enzyme this knows nor a site in IUPAC letters with a ^ where it cuts.`:`“${t}” needs a ^ where the enzyme cuts the top strand, as in ^GATC or G^ANTC.`}}if(A.includes("^"))return{refusal:`“${t}” has more than one ^, and a site is cut in one place.`};const s=Ye(A);return Oe(s)?{refusal:s.reason}:ao(s)>yd?{refusal:`“${t}” would cut every ${Math.round(1/ao(s))} bases or so; a site needs at least the specificity of a four-base cutter.`}:{name:`${e.slice(0,n)}^${e.slice(n+1)}`,site:A,cut:n}}function kd(t,e){const n=t.trim();if(n===""||n==="none")return[];if(n!=="custom"){const i=Rn(n);if(i!==void 0)return Sn[i].map(c=>an(c));const a=an(n);return a===void 0?{refusal:`“${n}” is not an enzyme or a kit this knows. Pick one, or type its site under custom.`}:[a]}const A=e.split(/[\s,;]+/).filter(i=>i!=="");if(A.length===0)return{refusal:"Type an enzyme or a site, such as DpnII or G^ANTC."};const s=[],r=new Set,o=i=>{const a=`${i.site}^${i.cut}`;r.has(a)||(r.add(a),s.push(i))};for(const i of A){const a=Rn(i);if(a!==void 0){for(const g of Sn[a])o(an(g));continue}const c=an(i);if(c!==void 0){o(c);continue}const l=Nd(i);if("refusal"in l)return l;o(l)}return s.length>io?{refusal:`That is ${s.length} enzymes, and one digest takes ${io} at most.`}:s}function bd(t){return t.map(e=>e.name).join("+")}function Md(t){let e=0;for(const n of t)e=Math.max(e,n.site.length);return Math.max(0,e-1)}const co=new Map;function Dd(t){const e=`${t.site}^${t.cut}`,n=co.get(e);if(n!==void 0)return n;const A=Ye(t.site);if(Oe(A))throw new Error(`${t.name}: ${A.reason}`);const s={motif:A,offset:t.cut};return co.set(e,s),s}const Qe=256;function Qa(t,e,n,A,s){const r=t.subarray(0,e).sort();let o=0,i=Number.NaN;for(let c=0;c<r.length;c++){const l=Math.floor(r[c]/Qe);l===i||!(l>A&&l<s)||(i=l,r[o++]=r[c])}const a={top:new Int32Array(o),bottom:new Int32Array(o),enzyme:new Uint8Array(o)};for(let c=0;c<o;c++){const l=Math.floor(r[c]/Qe),g=r[c]-l*Qe;a.top[c]=l,a.bottom[c]=l+n[g],a.enzyme[c]=g}return a}function Fd(t,e,n=0){let A=new Float64Array(Math.max(16,t.length>>7)),s=0;e.forEach((o,i)=>{const a=Dd(o),{hits:c}=ys(t,a.motif,{bothStrands:!0,offset:n});if(s+c.length>A.length){const l=new Float64Array(Math.max(A.length*2,s+c.length));l.set(A.subarray(0,s)),A=l}for(const l of c)A[s++]=(l.start+a.offset)*Qe+i});const r=Int32Array.from(e,pd);return Qa(A,s,r,Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY)}function Sd(t,e){let n=0;for(const o of t)n+=o.top.length;const A=new Float64Array(n),s=new Int32Array(Qe);let r=0;for(const o of t)for(let i=0;i<o.top.length;i++)A[r++]=o.top[i]*Qe+o.enzyme[i],s[o.enzyme[i]]=o.bottom[i]-o.top[i];return Qa(A,r,s,0,e)}const Rd=16e6;[...da.map(t=>({value:t.name,label:`${t.name} (${Ca(t)})`})),...Object.entries(Sn).map(([t,e])=>({value:t,label:`${t} (${e.join(" + ")})`}))];function Ld(t){const e=typeof t.enzyme=="string"?t.enzyme:"none",n=typeof t.sites=="string"?t.sites:"";return{choice:e,sites:n}}async function xd(t,e,n={}){const A=n.contigs??t.contigs,s=Md(e),r=Math.max(1,Math.floor(n.piece??Rd)),o=t.read?.bind(t),i=A.reduce((l,g)=>l+g.length,0);let a=0;const c=[];for(const l of A){const g=o===void 0?t.bases(l.name):void 0;if(o===void 0&&g===void 0)continue;const f=g?.length??l.length,h=[];let u=!0;for(let I=0;I<f;I+=r){n.throwIfCancelled?.();const d=Math.min(f,I+r),C=Math.min(f,d+s),B=g!==void 0?g.subarray(I,C):await o?.(l.name,I,C);if(B===void 0){u=!1;break}h.push(Fd(B,e,I)),a+=d-I,n.progress?.(a,i,l.name)}u&&c.push({contig:l.name,length:f,cuts:Sd(h,f)})}return c}function Gd(t,e){const n=bd(e),A=Rn(t);return A===void 0?n:`${A} (${n})`}function vd(t,e){const n=Rn(t);return n!==void 0?n.replace(/[^A-Za-z0-9]/g,""):e.map(A=>A.name.replace(/\^/g,"_").replace(/[^A-Za-z0-9_]/g,"")).join("-")}const Ud=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to cut."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const{choice:A,sites:s}=Ld(t.params),r=kd(A,s);if(!Array.isArray(r))return t.note(r.refusal),[];if(r.length===0)return t.note("No enzyme was chosen, so there is nothing to cut."),[];const o=Yn(t.params,"sequences");if(o!==null&&o.length===0)return t.note("No sequence is ticked, so there is nothing to cut."),[];const i=Object.entries(t.inputs.contigLengths??{}).filter(([,E])=>E>0).map(([E])=>E),a=ea(n,o,i);if(a.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to cut."),[];const c=a.length===n.contigs.length;t.progress(0,1,a.length===1?`cutting ${a[0].name}`:`cutting ${a.length.toLocaleString()} sequences`);const l=await xd(n,r,{contigs:a,progress:(E,m,p)=>t.progress(E,m,`cutting ${p}`),throwIfCancelled:()=>t.throwIfCancelled()});if(t.progress(1,1,"done"),l.length===0)return t.note("None of the ticked sequences could be read from this reference."),[];const g=Gd(A,r),f=c?g:a.length<=3?`${g} on ${a.map(E=>E.name).join(", ")}`:`${g} on ${a.length.toLocaleString()} sequences`;let h=0,u=0;for(const E of l)h+=E.cuts.top.length,u+=E.length;const I=h+l.length;t.note(h===0?`No ${g} site anywhere in ${c?"this reference":"the sequences ticked"}, so each sequence is one fragment.`:`${h.toLocaleString()} ${g} ${h===1?"cut":"cuts"} on ${l.length.toLocaleString()} ${l.length===1?"sequence":"sequences"}: ${I.toLocaleString()} fragments, ${Math.round(u/I).toLocaleString()} bp long on average.`);const d=`restriction-${vd(A,r)}${c?"":Td(a)}`,C=Jd(l,r),B=[$d(C,f,d)],Q=Od(t,C,f,d);return Q!==null&&B.push(Q),B};function Td(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
17
|
+
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Jd(t,e){let n=0;for(const i of t)n+=i.cuts.top.length;const A=e.map(i=>i.name),s=e.map(i=>`${i.name} cuts ${Ca(i)}`),r={contigs:t.map(i=>i.contig),length:n,contig:new Int32Array(n),start:new Int32Array(n),end:new Int32Array(n),strand:new Int8Array(n),score:new Float32Array(n).fill(Number.NaN),name:new Array(n),id:new Array(n).fill(""),detail:new Array(n),exonAt:new Int32Array(n+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(n).fill(-1),cdsEnd:new Int32Array(n).fill(-1),contigAt:new Int32Array(t.length+1),maxSpan:new Int32Array(t.length)};let o=0;return t.forEach((i,a)=>{const{top:c,enzyme:l}=i.cuts;r.contigAt[a]=o,r.contig.fill(a,o,o+c.length),r.start.set(c,o);for(let g=0;g<c.length;g++)r.end[o+g]=c[g]+1,r.name[o+g]=A[l[g]],r.detail[o+g]=s[l[g]];c.length>0&&(r.maxSpan[a]=1),o+=c.length}),r.contigAt[t.length]=o,r}function $d(t,e,n){return{kind:"intervals",id:n,label:`${e} sites`,payload:{kind:"features",data:t},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function Od(t,e,n,A){const s=t.framing.binsize,r=Kn(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none. Open the map and run it again for that half."),null;const o=e.contigs.map((a,c)=>{const l=e.contigAt[c],g=e.contigAt[c+1];return{contig:a,starts:e.start.subarray(l,g),ends:e.end.subarray(l,g),strands:e.strand.subarray(l,g)}}),i=ta({hits:o,total:e.length},r,s);return{kind:"profile",id:`${A}-density`,label:`${n} site density`,values:i.values,extent:[0,i.values.length],binsize:s,unit:"sites"}}const Yd=async t=>{const e=On(t.params,"tracks");if(e.length<2)return t.note(e.length===0?"No tracks were chosen. Load two or more bigWigs and tick them under Tracks.":"Only one track was chosen, and a correlation needs two."),[];const n=I=>t.inputs.labels?.[I]??I,A=e.map(n),s=await _d(t);if(s.count===0)return t.note("No unit to compare over. Check that the tracks and the assembly share contig names."),[];const r=[];for(let I=0;I<e.length;I++)t.throwIfCancelled(),t.progress(I,e.length,A[I]),r.push(await qd(t,e[I],s));t.progress(e.length,e.length,"correlating");const o=Hd(r),i=s.kind==="bins"?"windows":"features";if(o<bn)t.note(`Fewer than ${bn} of the ${s.count.toLocaleString()} ${i} have a value in every track, so no pair has a coefficient. Check that the tracks cover the same sequences.`);else if(o<s.count){const I=s.count-o,d=I===1;t.note(`${I.toLocaleString()} of the ${s.count.toLocaleString()} ${i} ${d?"has":"have"} no value in at least one track, and ${d?"is":"are"} left out of every pair: every coefficient is over the other ${o.toLocaleString()}.`)}const a=st(t.params,"method","spearman"),c=e.length,l=new Float32Array(c*c),g=[];for(let I=0;I<c;I++){l[I*c+I]=1;for(let d=I+1;d<c;d++){const C=a==="pearson"?Oi(r[I],r[d]):vh(r[I],r[d]);l[I*c+d]=C,l[d*c+I]=C,g.push({a:A[I],b:A[d],r:C})}}const f={kind:"matrix",id:"trackcorr",label:`Track correlation · ${a}`,nrows:c,ncols:c,values:l,xLabel:"",yLabel:"",xTicks:A,yTicks:A,colormap:Dl,centre:0,stats:[{label:"units",value:s.count,digits:0},{label:"compared",value:o,digits:0,hint:"Units every track has a value for: the ones every pair is correlated over."}]},h={kind:"table",id:"trackcorr-table",label:"Pairs",columns:[{key:"a",label:"Track",kind:"text"},{key:"b",label:"Track",kind:"text"},{key:"r",label:a==="pearson"?"Pearson r":"Spearman ρ",kind:"number",digits:3}],rows:g.sort((I,d)=>Number(d.r)-Number(I.r))};return[f,h]};async function _d(t){if(st(t.params,"over","bins")==="features"){const s=ne(t.inputs.features,t.params,"features"),r=s.value;if(r===void 0)return t.note(_n(s,{unchosen:"Correlating over features needs a feature set, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),{kind:"features",regions:[],count:0};const o=[];for(let i=0;i<r.length;i++)o.push({contig:r.contigs[r.contig[i]],start:r.start[i],end:r.end[i]});return{kind:"features",regions:o,count:o.length}}const e=Math.max(1,Math.round(T(t.params,"binsize",100))),n=[];let A=0;for(const[s,r]of Object.entries(t.inputs.contigLengths??{})){const o=Math.floor(r/e);o!==0&&(n.push({contig:s,count:o,offset:A}),A+=o)}return{kind:"bins",size:e,tilings:n,count:A}}const Kd=1<<20,lo=4096;async function qd(t,e,n){const A=new Float64Array(n.count),s=new Float64Array(n.count),r=(o,i,a,c,l,g)=>{const f=Math.min(l,a)-Math.max(c,i);f>0&&(A[o]+=g*f,s[o]+=f)};if(n.kind==="bins"){const{size:o}=n,i=Math.max(1,Math.floor(Kd/o))*o;for(const a of n.tilings){const c=a.count*o;for(let l=0;l<c;l+=i){t.throwIfCancelled();const g=Math.min(c,l+i),f=await t.sample(e,[{contig:a.contig,start:l,end:g}],1);for(const h of f.regions)for(let u=0;u<h.values.length;u++){const I=h.values[u];if(!Number.isFinite(I))continue;const d=Math.max(l,h.starts[u]),C=Math.min(g,h.ends[u]);for(let B=Math.floor(d/o);B*o<C;B++)r(a.offset+B,B*o,(B+1)*o,d,C,I)}}}}else{const o=new Map;n.regions.forEach((i,a)=>{const c=o.get(i.contig);c===void 0?o.set(i.contig,[a]):c.push(a)});for(const[,i]of o)for(let a=0;a<i.length;a+=lo){t.throwIfCancelled();const c=i.slice(a,a+lo),l=await t.sample(e,c.map(f=>n.regions[f]),1),g=new Map;for(const f of l.regions)g.set(`${f.contig}:${f.start}-${f.end}`,f);for(const f of c){const h=n.regions[f],u=g.get(`${h.contig}:${h.start}-${h.end}`);if(u!==void 0)for(let I=0;I<u.values.length;I++){const d=u.values[I];Number.isFinite(d)&&r(f,h.start,h.end,u.starts[I],u.ends[I],d)}}}}for(let o=0;o<A.length;o++)A[o]=s[o]>0?A[o]/s[o]:Number.NaN;return A}function Hd(t){const e=t.length===0?0:t[0].length;let n=0;for(let A=0;A<e;A++)if(t.every(s=>!Number.isNaN(s[A])))n++;else for(const s of t)s[A]=Number.NaN;return n}const Wd={motif:Tu,restriction:Ud,peaks:ld,composition:Zu,dotplot:uI,oriter:kI,metaplot:Bu,trackcorr:Yd,frip:Jh,groupsignal:eu,overlap:FI},Pd="0.19.0",zd="9731db4";function Xd(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#"))continue;const r=s.split(/\s+/);if(r.length<5)return[];const[o,i,a,c,l]=[r[0],Number(r[1]),Number(r[2]),Number(r[3]),Number(r[4])];if([i,a,c,l].some(f=>!Number.isInteger(f)||f<0))return[];if(c===0||l<c)return[];n.has(o)||(n.add(o),e.push({name:o,length:i,offset:a,lineBases:c,lineWidth:l}))}return e}function Vd(t){return t.map(e=>({name:e.name,length:e.length}))}function cn(t,e){const n=Math.floor(e/t.lineBases);return t.offset+n*t.lineWidth+(e-n*t.lineBases)}function Zd(t,e,n){const A=Math.max(0,Math.min(t.length,Math.floor(e))),s=Math.max(A,Math.min(t.length,Math.ceil(n)));return s<=A?{from:cn(t,A),to:cn(t,A)}:{from:cn(t,A),to:cn(t,s-1)+1}}function jd(t){let e=0;for(let s=0;s<t.length;s++)t[s]>32&&e++;if(e===t.length)return t;const n=new Uint8Array(e);let A=0;for(let s=0;s<t.length;s++)t[s]>32&&(n[A++]=t[s]);return n}const Ba=/\.(fa|fasta|fna|fas)$/i;function tC(t){if(/\.b?gz$/i.test(t))return`${t}.tbi`;if(/\.bam$/i.test(t))return`${t}.bai`;if(Ba.test(t))return`${t}.fai`}const $A=18,eC=4,nC=/\.(biginteract|interact)(\.b?gz)?$/i;function AC(t){return t!==void 0&&t!==""&&Number.isFinite(Number(t))}function go(t){return t==="+"||t==="-"||t==="."||t===""}function Ea(t,e=""){const n=nC.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<eC;){let o=t.indexOf(`
|
|
18
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!sC(c,n))return!1;A++}return A>0}function sC(t,e){if(e?t.length<$A:t.length!==$A)return!1;for(const n of[1,2,9,10,14,15])if(!R(t[n]))return!1;return!R(t[4])||!AC(t[5])||!e&&!(go(t[12])&&go(t[17]))?!1:e||rC(t)}function rC(t){const e=t[0],n=Number(t[1]),A=Number(t[2]);if(!(A>n))return!1;let s=!1;for(const[r,o,i]of[[8,9,10],[13,14,15]])if(t[r]===e&&(s=!0,Number(t[o])<n||Number(t[i])>A))return!1;return s}function ma(t){const e=new Jn;let n=0;if(wt(t,A=>{if(A.length<$A){n++;return}const s=A[9],r=A[10],o=A[14],i=A[15];if(!R(s)||!R(r)||!R(o)||!R(i)){n++;return}const a=Cn(A[11]),c=Cn(A[16]);e.add(A[8]??"",Number(s),Number(r),A[13]??"",Number(o),Number(i),{score:aC(A[5]),name:Cn(A[3])||iC(a,c),detail:oC(A,a,c)})}),e.length===0)throw new Error(`No usable rows: all ${n} lines failed the eighteen-column test an interact file is made of. UCSC writes BED5+13 — chrom, start, end, name, score, value, exp, colour, then the source and target triples and their strands.`);return e.finish()}function oC(t,e,n){const A=[],s=Cn(t[6]);s!==""&&A.push(`exp ${s}`);const r=t[4];r!==void 0&&r!==""&&r!=="0"&&A.push(`score ${r}`),(e!==""||n!=="")&&A.push(`${e||"?"} → ${n||"?"}`);const o=`${fo(t[12])}${fo(t[17])}`;return o!==".."&&A.push(`strands ${o}`),A.join(ct)}function iC(t,e){return t===""&&e===""?"":`${t||"?"}/${e||"?"}`}function Cn(t){return t===void 0||t==="."?"":t}function fo(t){return t==="+"||t==="-"?t:"."}function aC(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}function cC(t){return/\bsourceChrom\b/.test(t)&&/\btargetChrom\b/.test(t)}function lC(t){let e=0;for(let A=0;A<t.length;A++)t.contig1[A]!==t.contig2[A]&&e++;const n=[`${t.length.toLocaleString()} interaction${t.length===1?"":"s"}`];return e>0&&n.push(`${e.toLocaleString()} between sequences`),n.join(" · ")}const wa=/^([^\s:]+):(\d+)-(\d+)(?:,(.+))?$/,gC=4,fC=/\.(longrange|longtabix)(\.(bed|txt))?(\.b?gz)?$/i;function pa(t,e=""){const n=fC.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<gC;){let o=t.indexOf(`
|
|
19
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!n&&c.length!==4||!R(c[1])||!R(c[2])||c[3]===void 0||!wa.test(c[3]))return!1;A++}return A>0}function ya(t){const e=new Jn,n=new Set;let A=0,s=0;if(wt(t,o=>{if(o.length<4||!R(o[1])||!R(o[2])){A++;return}const i=wa.exec(o[3]??"");if(i===null){A++;return}const a={contig:o[0]??"",start:Number(o[1]),end:Number(o[2])},c={contig:i[1],start:Number(i[2]),end:Number(i[3])},l=i[4]===void 0||i[4]===""?Number.NaN:Number(i[4]),[g,f]=a.contig<c.contig||a.contig===c.contig&&a.start<=c.start?[a,c]:[c,a],h=`${g.contig}:${g.start}-${g.end}|${f.contig}:${f.start}-${f.end}|${i[4]??""}`;if(n.has(h)){s++;return}n.add(h),e.add(a.contig,a.start,a.end,c.contig,c.start,c.end,{score:l,detail:Number.isFinite(l)?`score ${i[4]}`:""})}),e.length===0)throw new Error(`No usable rows: all ${A} lines failed the "contig, start, end, chrom:start-end,score" test a longrange file is made of.`);const r=e.finish();return Na.set(r,s),r}const Na=new WeakMap;function hC(t){const e=[`${t.length.toLocaleString()} interaction${t.length===1?"":"s"}`],n=Na.get(t)??0;n>0&&e.push(`${n.toLocaleString()} reciprocal lines folded in`);let A=0;for(let s=0;s<t.length;s++)t.contig1[s]!==t.contig2[s]&&A++;return A>0&&e.push(`${A.toLocaleString()} between sequences`),e.join(" · ")}const uC=10,IC=11,hA=10,dC=4,CC=/(\.(genepred|genepredext|refflat)(\.txt)?(\.gz)?|refgene\.txt(\.gz)?)$/i;function ka(t){for(const e of[0,1,2])if(!(t.length<e+uC)&&QC(t,e))return e;return-1}function QC(t,e){const n=t[e+2];if(n!=="+"&&n!=="-")return!1;for(const l of[3,4,5,6,7])if(!R(t[e+l]))return!1;const A=Number(t[e+3]),s=Number(t[e+4]),r=Number(t[e+5]),o=Number(t[e+6]),i=Number(t[e+7]);if(!(s>A)||i<1||r<A||o>s||o<r)return!1;const a=Ln(t[e+8]),c=Ln(t[e+9]);if(a===null||c===null||a.length!==i||c.length!==i||a[0]!==A||c[i-1]!==s)return!1;for(let l=0;l<i;l++)if(c[l]<a[l]||l>0&&a[l]<c[l-1])return!1;return!0}function Ln(t){if(t===void 0||t==="")return null;const e=t.split(",").filter(A=>A!=="");if(e.length===0)return null;const n=[];for(const A of e){if(!R(A))return null;const s=Number(A);if(s<0)return null;n.push(s)}return n}function ba(t,e=""){const n=CC.test(e);let A=0,s=0;const r=t.length;let o=-1;for(;s<r&&A<dC;){let i=t.indexOf(`
|
|
20
|
+
`,s);i<0&&(i=r);let a=i;a>s&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(s,a);if(s=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=ka(l);if(g<0||o>=0&&g!==o&&!n)return!1;o=g,A++}return A>0}function Ma(t){const e=new et;let n=0,A=0;if(wt(t,r=>{const o=ka(r);if(o<0){n++;return}const i=Number(r[o+3]),a=Number(r[o+4]),c=Number(r[o+5]),l=Number(r[o+6]),g=Ln(r[o+8])??[],f=Ln(r[o+9])??[],h=[];for(let d=0;d<g.length;d++)h.push(g[d],f[d]);const u=mC(r[o]),I=BC(r,o);l>c&&A++,e.add(r[o+1]??"",i,a,{strand:r[o+2]==="+"?1:-1,score:o+hA<r.length&&R(r[o+hA])?Number(r[o+hA]):Number.NaN,name:I===""?u:I,id:u,detail:EC(r,o,I,u,g.length),...h.length===0?{}:{exons:h},...l>c?{cds:[c,l]}:{}})}),e.length===0)throw new Error(`No usable rows: all ${n} lines failed the genePred test — a name, a contig, a strand, four coordinates, an exon count and two comma-separated lists of that length.`);const s=e.finish();return Da.set(s,A),s}function BC(t,e){const n=t[e+IC];if(n!==void 0&&n!==""&&n!==".")return n;if(e===0)return"";const A=t[e-1];return A===void 0||A===""||A==="."||R(A)?"":A}function EC(t,e,n,A,s){const r=[`${s} exon${s===1?"":"s"}`];n!==""&&n!==A&&r.push(`gene ${n}`);const o=t[e+12],i=t[e+13];return o!==void 0&&/^(cmpl|incmpl|none|unk)$/.test(o)&&r.push(`cds ${o}/${i??"?"}`),r.join(ct)}function mC(t){return t===void 0||t==="."?"":t}const Da=new WeakMap;function wC(t){return/\bcdsStartStat\b/.test(t)&&/\bexonFrames\b/.test(t)}function Ms(t){const e=t.exonStart.length,n=[`${t.length.toLocaleString()} transcript${t.length===1?"":"s"}`,`${e.toLocaleString()} exons`],A=Da.get(t);return A!==void 0&&A<t.length&&n.push(`${A.toLocaleString()} coding`),n.join(" · ")}const ho=/^(gneg|gpos\d{0,3}|acen|gvar|stalk)$/,OA="stain",pC=8;function Fa(t){return!R(t[1])||!R(t[2])?null:t.length===5&&ho.test(t[4])?{name:t[3],stain:t[4]}:t.length===4&&ho.test(t[3])?{name:"",stain:t[3]}:null}function Sa(t){let e=0,n=0;const A=t.length;for(;n<A&&e<pC;){let s=t.indexOf(`
|
|
21
|
+
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o===""||o.charCodeAt(0)===35||o.startsWith("track ")||o.startsWith("browser "))continue;const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(Fa(i)===null)return!1;e++}return e>0}function yC(t){if(t==="gneg")return 0;if(t.startsWith("gpos")){const e=t.slice(4);if(e==="")return 100;const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):100}return Number.NaN}function NC(t){const e=t.indexOf(`${OA} `);if(e<0)return"";const n=e+OA.length+1,A=t.indexOf(" ",n);return A<0?t.slice(n):t.slice(n,A)}function Ra(t){const e=new et;let n=0;if(wt(t,A=>{const s=Fa(A);if(s===null){n++;return}e.add(A[0],Number(A[1]),Number(A[2]),{name:s.name,score:yC(s.stain),detail:`${OA} ${s.stain}`})}),e.length===0&&n>0)throw new Error(`No usable rows: all ${n} lines failed the "sequence, start, end, band, stain" test a cytoBand is made of.`);return e.finish()}function kC(t){const e=[];for(let n=0;n<t.contigs.length;n++){const A=t.contigAt[n],s=t.contigAt[n+1];if(s<=A)continue;let r=0;for(let o=A;o<s;o++){if(t.start[o]!==r)return null;r=t.end[o]}e.push({name:t.contigs[n],length:r})}return e.length>0?e:null}function La(t){let e=0,n=0;for(let r=0;r<t.length;r++)NC(t.detail[r])==="acen"&&e++,t.name[r]!==""&&n++;const A=t.contigAt.reduce((r,o,i)=>i<t.contigs.length&&t.contigAt[i+1]>t.contigAt[i]?r+1:r,0),s=[`${G.int(t.length)} band${t.length===1?"":"s"}`,`${G.int(A)} sequence${A===1?"":"s"}`];return n<t.length&&s.push(`${G.int(n)} named`),e>0&&s.push(`${G.int(e)} centromeric`),s.join(" · ")}const bC=["non-canonical","GT/AG","GT/AG","GC/AG","GC/AG","AT/AC","AT/AC"],MC="multi",DC="motif",YA="annotated",FC="overhang",SC="anchors",RC=8;function LC(t){const e=[];let n=!1,A=0;const s=t.length;for(;A<s&&e.length<RC;){let r=t.indexOf(`
|
|
22
|
+
`,A);r<0&&(r=s);let o=r;o>A&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(A,o);if(A=r+1,!(i===""||i.charCodeAt(0)===35)){if(i.startsWith("track ")){/junction/i.test(i)&&(n=!0);continue}i.startsWith("browser ")||e.push(i.includes(" ")?i.split(" "):i.trim().split(/\s+/))}}return{rows:e,declared:n}}function xa(t){if(t.length!==9)return!1;for(let s=1;s<9;s++)if(!R(t[s]))return!1;const e=Number(t[3]),n=Number(t[4]),A=Number(t[5]);return Number(t[2])>=Number(t[1])&&e>=0&&e<=2&&n>=0&&n<=6&&(A===0||A===1)}function Ga(t){if(t.length<12||!R(t[1])||!R(t[2])||t[9]!=="2")return null;const e=t[10].split(",").filter(a=>a!==""),n=t[11].split(",").filter(a=>a!=="");if(e.length!==2||n.length!==2||!e.every(R)||!n.every(R))return null;const A=Number(t[1]),s=Number(t[2]),r=Number(e[0]),o=Number(e[1]),i=Number(n[1]);return Number(n[0])!==0||A+i+o!==s||r<=0||o<=0||i<=r?null:[A+r,i-r,o]}function va(t){return t.length===6&&R(t[1])&&R(t[2])&&R(t[4])&&(t[5]==="+"||t[5]==="-"||t[5]===".")}function Ds(t,e=""){const{rows:n,declared:A}=LC(t);if(n.length===0)return null;if(n.every(xa))return"star";const s=/junc|(^|[._-])sj([._-]|$)/i.test(e.replace(/\.b?gz$/i,"")),r=n.every(o=>/^JUNC/i.test(o[3]??""));return(s||A||r)&&n.every(o=>Ga(o)!==null)?"bed":/\.junc(\.b?gz)?$/i.test(e)&&n.every(va)?"junc":null}function uo(t){return t==="+"?1:t==="-"?-1:0}function xC(t){if(t===void 0||t===""||t===".")return Number.NaN;const e=Number(t);return Number.isFinite(e)?e:Number.NaN}function Ua(t,e="",n){const A=Ds(t,e);if(A===null)throw new Error("This is not a junction file STAR, regtools or leafcutter wrote.");const s=new et;let r=0;if(wt(t,o=>{if(A==="star"){if(!xa(o)){r++;return}const i=Number(o[3]),a=Number(o[4]),c=[`${MC} ${o[7]}`,`${DC} ${bC[a]}`,`${YA} ${o[5]==="1"?"yes":"no"}`,`${FC} ${o[8]}`].join(ct);s.add(o[0],Number(o[1])-1,Number(o[2]),{strand:i===1?1:i===2?-1:0,score:Number(o[6]),detail:c});return}if(A==="bed"){const i=Ga(o);if(i===null){r++;return}const[a,c,l]=i,g=a-Number(o[1]),f=o[3]!==void 0&&o[3]!=="."?o[3]:"";s.add(o[0],a,a+c,{strand:uo(o[5]),score:xC(o[4]),name:f,detail:`${SC} ${g}/${l}`});return}if(!va(o)){r++;return}s.add(o[0],Number(o[1]),Number(o[2]),{strand:uo(o[5]),score:Number(o[4]),name:o[3]!=="."?o[3]:""})}),s.length===0&&r>0)throw new Error(`No usable rows: all ${r} lines failed the junction test for this file's shape.`);return s.finish()}function Ta(t){let e=0,n=0,A=!1;for(let r=0;r<t.length;r++){const o=t.score[r];Number.isFinite(o)&&(e+=o);const i=t.detail[r];i.includes(`${YA} `)&&(A=!0,i.includes(`${YA} yes`)&&n++)}const s=[`${G.int(t.length)} junction${t.length===1?"":"s"}`,`${G.int(e)} read${e===1?"":"s"}`];return A&&s.push(`${G.int(n)} annotated`),s.join(ct)}const _A=11,xn=9,KA=10,GC=4,vC=/\.(bedmethyl|bigmethyl|bed ?methyl)(\.b?gz)?$/i;function Ja(t,e=""){const n=vC.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<GC;){let o=t.indexOf(`
|
|
23
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!UC(c,n))return!1;A++}return A>0}function UC(t,e){if(t.length<_A||!R(t[1])||!R(t[2]))return!1;const n=Number(t[KA]);if(t[KA]===""||!Number.isFinite(n))return!1;if(e)return!0;if(!R(t[xn])||Number(t[xn])<0||n<0||n>100)return!1;const A=t[5];return A!=="+"&&A!=="-"&&A!=="."?!1:Number(t[2])-Number(t[1])===1}function $a(t){const e=new Map;Co(t,c=>{if(c.length<_A||!R(c[1])||!R(c[2]))return;const l=Io(c[3]);e.set(l,(e.get(l)??0)+1)});const n=[...e.entries()].map(([c,l])=>({code:c,label:Xl(c),rows:l})).sort((c,l)=>l.rows-c.rows||c.code.localeCompare(l.code));if(n.length===0)throw new Error("This looks like a bedMethyl but holds no usable rows.");const A=n[0].code,s=new Map;let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,i=0,a=0;if(Co(t,c=>{if(c.length<_A||!R(c[1])||!R(c[2])||Io(c[3])!==A)return;const l=Number(c[1]),g=Number(c[2]);if(g<=l)return;const f=Number(c[KA]);if(!Number.isFinite(f))return;const h=R(c[xn])?Number(c[xn]):0;if(h<=0)return;const u=c[0]??"";let I=s.get(u);I===void 0&&(I=new Qs(u),s.set(u,I)),I.push(l,g,f),i++,a+=h,f<r&&(r=f),f>o&&(o=f)}),i===0)throw new Error("This looks like a bedMethyl but every row rests on zero reads, so there is no measurement to draw.");return{signal:Bs(s,i,r,o),codes:n,drawn:A,meanCoverage:a/i}}function Io(t){return t===void 0||t===""||t==="."?"?":t}function Co(t,e){for(const n of t.split(`
|
|
24
|
+
`)){let A=n;A.endsWith("\r")&&(A=A.slice(0,-1)),!(A===""||A.charCodeAt(0)===35)&&(A.startsWith("track ")||A.startsWith("browser ")||e(A.includes(" ")?A.split(" "):A.trim().split(/\s+/)))}}function TC(t){return/\b(percentMod|percentMeth|fractionModified)\b/.test(t)&&/\b(validCov|coverage|Nvalid_cov)\b/.test(t)}function JC(t){const e=t.codes.find(s=>s.code===t.drawn),n=[`${t.signal.length.toLocaleString()} ${e?.label??t.drawn} calls`,`${t.meanCoverage.toFixed(1)}× mean depth`],A=t.codes.filter(s=>s.code!==t.drawn);return A.length>0&&n.push(`not drawn: ${A.map(s=>`${s.label} (${s.rows.toLocaleString()})`).join(", ")}`),n.join(" · ")}const Gn=440477507,vn=".2bit",Oa=16,$C=new Uint8Array([84,67,65,71]),OC=78;function Ya(t){if(t.length<4)return!1;const e=new DataView(t.buffer,t.byteOffset,4);return e.getUint32(0,!0)===Gn||e.getUint32(0,!1)===Gn}function YC(t){if(t.length<Oa)throw new Error("This file starts like a .2bit and is too short to hold one.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint32(0,!0)===Gn;if(!n&&e.getUint32(0,!1)!==Gn)throw new Error("This is not a .2bit: its first four bytes are not the format’s signature.");const A=e.getUint32(4,n);if(A!==0)throw new Error(`This is a .2bit of version ${A}. This viewer reads version 0 — the ordinary one, with 32-bit offsets. Version 1 is the “long” variant for files past 4 GB, whose offsets and sizes are 64-bit, and reading one as though it were version 0 would return wrong residues rather than fail. Convert it with \`twoBitToFa\` and \`faToTwoBit\`.`);const s=e.getUint32(8,n);if(s===0)throw new Error("This .2bit declares no sequences.");return{littleEndian:n,version:A,count:s}}function Qo(t,e,n=Oa){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=[];let r=n;const o=new TextDecoder;for(;s.length<e.count&&!(r+1>t.length);){const i=t[r];if(r+1+i+4>t.length)break;const a=o.decode(t.subarray(r+1,r+1+i)),c=A.getUint32(r+1+i,e.littleEndian);s.push({name:a,offset:c}),r+=1+i+4}return{entries:s,complete:s.length===e.count,consumed:r}}function Bo(t,e,n,A={}){if(e+8>t.length)return 8;const s=new DataView(t.buffer,t.byteOffset,t.byteLength),r=_a(s,e,n,A),o=e+8+r*8;return o+4>t.length?o+4-e:null}function _a(t,e,n,A){return nt(t.getUint32(e+4,n),{format:vn,field:`N-block count${A.name===void 0?"":` of ${A.name}`}`,ceiling:t.getUint32(e,n),...A.fileLeft===void 0?{}:{available:A.fileLeft-8-4},bytesPerItem:8})}function _C(t,e,n,A,s=0,r){const o=new DataView(e.buffer,e.byteOffset,e.byteLength),i=o.getUint32(n,A),a=_a(o,n,A,{name:t,fileLeft:e.length-n}),c=new Int32Array(a),l=new Int32Array(a),g=n+8,f=g+a*4;for(let d=0;d<a;d++){const C=o.getUint32(g+d*4,A);c[d]=C,l[d]=C+o.getUint32(f+d*4,A)}const h=f+a*4,u=nt(o.getUint32(h,A),{format:vn,field:`mask-block count of ${t}`,ceiling:i,...r===void 0?{}:{available:r-(s+h+4)-4},bytesPerItem:8}),I=s+h+4+u*8+4;return r!==void 0&&rs(I,Math.ceil(i/4),{format:vn,field:`packed bases of ${t}`,size:r}),{name:t,length:i,nStarts:c,nEnds:l,dnaAt:I}}const KC=8192;function qC(t,e,n){const A=Math.max(0,Math.min(e,t.length)),s=Math.max(A,Math.min(n,t.length)),r=Math.floor(A/4),o=Math.ceil(s/4);return{from:t.dnaAt+r,to:t.dnaAt+o,firstBase:r*4}}function HC(t,e,n,A,s){const r=Math.max(0,Math.min(A,n.length)),o=Math.max(r,Math.min(s,n.length)),i=new Uint8Array(o-r);for(let a=r;a<o;a++){const c=a-e,l=t[c>>2];if(l===void 0)break;const g=6-((c&3)<<1);i[a-r]=$C[l>>g&3]}for(let a=0;a<n.nStarts.length;a++){const c=n.nStarts[a];if(c>=o)break;const l=n.nEnds[a];l<=r||i.fill(OC,Math.max(r,c)-r,Math.min(o,l)-r)}return i}function WC(t){return t.map(e=>({name:e.name,length:e.length}))}const Eo=65536,mo=1e5;async function PC(t,e){let n=await t(Eo,0);const A=YC(n);if(A.count>mo)throw new Error(`This .2bit declares ${A.count.toLocaleString()} sequences, which is past the ${mo.toLocaleString()} this viewer will open one record at a time. A file that says this is far more likely to be truncated than to be an assembly.`);let s=Qo(n,A);for(;!s.complete;){const a=await t(Eo,n.length);if(a.length===0)throw new Error(`This .2bit ends part-way through its index: it declares ${A.count.toLocaleString()} sequences and names ${s.entries.length.toLocaleString()}. The file is truncated.`);const c=new Uint8Array(n.length+a.length);c.set(n),c.set(a,n.length),n=c,s=Qo(n,A)}const r=new Map,o=[];let i=0;for(const a of s.entries){e!==void 0&&rs(a.offset,8,{format:vn,field:`index entry for ${a.name}`,size:e});const c={name:a.name,...e===void 0?{}:{fileLeft:e-a.offset}};let l=await t(KC,a.offset),g=Bo(l,0,A.littleEndian,c);for(;g!==null;){const h=await t(g,a.offset);if(h.length<=l.length)throw new Error(`This .2bit ends part-way through the record for ${a.name}.`);l=h,g=Bo(l,0,A.littleEndian,c)}const f=_C(a.name,l,0,A.littleEndian,a.offset,e);r.set(f.name,f),o.push(f),i+=f.length}return{ordered:o,records:r,total:i}}const zC=2291137574,XC=2273964779,wo=[137,72,68,70,13,10,26,10];function VC(t){return t.length<wo.length?!1:wo.every((e,n)=>t[n]===e)}function Ka(t){if(t.length<4)return null;const e=new DataView(t.buffer,t.byteOffset,4);for(const n of[!0,!1]){const A=e.getUint32(0,n);if(A===zC)return"bigwig";if(A===XC)return"bigbed"}return null}function ft(t,e){const n=pe(il(t),e);for(let A=0;A<n.names.length;A++)t[A]=n.names[A];return n}function Z(t,e,n){const A=wl(t,Wa(e)),s=ZC(t,e),r=n?.contested??[];return{...A,...s===null?{}:{genomes:s},...r.length===0?{}:{contested:r.slice(0,4).map(o=>`${o.asked} → ${o.name}`)}}}function ZC(t,e){const n=new Set;for(const r of e)r.genome!==void 0&&r.genome!==""&&n.add(r.genome);if(n.size===0)return null;const A=new Set(t),s=new Set;for(const r of e)r.genome===void 0||r.genome===""||A.has(r.name)&&s.add(r.genome);return{matched:s.size,total:n.size,named:[...s].slice(0,4)}}function qn(t,e){const n=t.bases.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.bases.get(t.contigs[A].name)}function Fs(t,e){const n=t.records.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.records.get(t.contigs[A].name)}async function qa(t,e,n,A,s){const r=Fs(t,e);if(r===void 0)return;const o=Math.max(0,Math.floor(n)),i=Math.min(r.length,Math.ceil(A));if(!(i>o))return new Uint8Array(0);const a=t.held.get(r.name);if(a!==void 0&&a.start<=o&&a.start+a.bases.length>=i)return a.bases.subarray(o-a.start,i-a.start);const c=await Ha(t,r,o,i,s);return t.held.set(r.name,{start:o,bases:c}),c}async function Ha(t,e,n,A,s){const r=s===void 0?{}:{onProgress:s};if(_t(t)){const i=e,a=qC(i,n,A),c=await t.handle.read(a.to-a.from,a.from,r);return HC(c,a.firstBase,i,n,A)}const o=Zd(e,n,A);return jd(await t.handle.read(o.to-o.from,o.from,r))}function Wa(t){return t.map(e=>e.name)}const Ss=new Map,Hn=new Map;function Rs(t){return t.indexed===!0}function _t(t){return t.twobit===!0}function we(t){return Rs(t)||_t(t)}const re=new Map,qA=new Map,Wn=new Map,Un=new Map;function jC(t,e){return`${tt(t)}|${tt(e)}`}const po=8<<20,Ls=3e8,HA=64e6,yo=4e6;let Dt=null,oe=null;function tt(t){return t.kind==="local"?`${t.name}|${t.file.size}`:t.url}self.onmessage=t=>{eQ(t.data)};const tQ=bh();setInterval(()=>{const t={type:"busy",fraction:tQ.busy()};self.postMessage(t)},kh);const Pn=new Set,WA=new Set;let PA=0;function zA(t){return Pn.has(t)}async function xs(t){return await Es(),!Pn.has(t)}function ze(){const t=new Error("cancelled");return t.name="AbortError",t}async function eQ(t){WA.add(t.id);try{const e=await nQ(t);if(zA(t.id))throw ze();const n={type:"result",id:t.id,payload:e};self.postMessage(n,wh(e))}catch(e){const n={type:"error",id:t.id,message:e instanceof Error?e.message:String(e),...e instanceof Error&&e.name==="AbortError"?{cancelled:!0}:{}};self.postMessage(n)}finally{WA.delete(t.id),Pn.delete(t.id),t.id>PA&&(PA=t.id)}}function Qn(t){return(e,n)=>{const A={type:"progress",id:t,done:e,total:n??0};self.postMessage(A)}}async function nQ(t){switch(t.kind){case"load":return lQ(t.entry,t.source,t.mapContigs,Qn(t.id));case"sample":return ec(t.entry,t.regions,t.basesPerPixel,t.reads,t.id,t.exact===!0);case"register":return qA.set(t.entry,t.vector),null;case"run":return AQ(t);case"bases":return wQ(t.entry,t.regions,Qn(t.id));case"assembly":return sQ(t.source,Qn(t.id));case"reads":return JQ(t.entry,t.regions,t.maxRows,t.basesPerPixel,t.reads,t.id);case"cancel":return(WA.has(t.target)||t.target>PA)&&Pn.add(t.target),null;case"drop":{Ss.delete(t.entry);const e=re.get(t.entry);e!==void 0&&oe?.store===e&&(oe=null),re.delete(t.entry),qA.delete(t.entry),Hn.delete(t.entry),Wn.delete(t.entry);for(const[n,A]of Un)if(A.holders.delete(t.entry)){A.holders.size===0&&Un.delete(n);break}return null}}}async function AQ(t){const e=Wd[t.task];if(e===void 0)throw new Error(`no track analysis runner is registered for the task ${t.task}`);const n=[],A=performance.now(),s={params:t.params,framing:t.framing,inputs:t.inputs,cancelled:()=>zA(t.id),throwIfCancelled:()=>{if(zA(t.id))throw ze()},progress:(o,i,a)=>{const c={type:"progress",id:t.id,done:o,total:i,...a===void 0?{}:{note:a}};self.postMessage(c)},note:o=>{n.push(o)},sample:(o,i,a)=>ec(o,i,a,void 0,t.id),lengthOf:o=>t.inputs.contigLengths?.[o],residues:o=>{const i=re.get(o);if(i!==void 0)return we(i)?{contigs:i.contigs,bases:()=>{},read:async(a,c,l)=>{const g=Fs(i,a);if(g===void 0)return;const f=Math.max(0,Math.floor(c)),h=Math.min(g.length,Math.ceil(l));return h>f?Ha(i,g,f,h):new Uint8Array(0)},refusal:_t(i)?`This .2bit is read by range rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(HA/1e6)} MB is held whole (\`twoBitToFa\`).`:`This FASTA is read by range from its index rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(HA/1e6)} MB is held whole.`}:{contigs:i.contigs,bases:a=>qn(i,a)}}};return{outputs:await e(s),provenance:{task:t.task,taskVersion:0,params:t.params,framing:t.framing,app:[Pd,zd].filter(o=>o!=="").join(" "),createdAt:new Date().toISOString()},notes:n,ms:performance.now()-A}}async function sQ(t,e){const n=xt(t),A=await n.read(64,0);if(VC(A))return{format:"hdf5",contigs:[],origin:"features",exact:!0};const s=Ka(A);if(s!==null){const h=await(s==="bigwig"?new Jo({filehandle:xt(t)}):new Oo({filehandle:xt(t)})).getHeader();return{format:s,contigs:Gs(h),origin:s,exact:!0}}if(We(A)){const f=await ke(n,t),h=await nc(n,f??Number.MAX_SAFE_INTEGER);if(h!==null)return{format:"bam",contigs:h.refs.map(u=>({name:u.name,length:u.length})),origin:"bam",exact:!0}}if(kn(A))return{format:"fasta",contigs:(await Za(t,n,e)).contigs,origin:"fasta",exact:!0};if(Ya(A))return{format:"twobit",contigs:(await ja(t,n,e)).contigs,origin:"twobit",exact:!0};const r=await n.readFile({onProgress:e}),o=await gs(r);if(kn(o))return{format:"fasta",contigs:Us(t,o).contigs,origin:"fasta",exact:!0};const i=new TextDecoder().decode(o);if(i.trim()==="")throw new Error("This file is empty.");if(Dh(i,t.name))return Dt={key:tt(t),format:"sizes",features:null},{format:"sizes",contigs:Mh(i),origin:"sizes",exact:!0};if(ei(i)){const f=ig(i);if(f.length>0)return{format:"vcf",contigs:f,origin:"vcf",exact:!0};const h=si(i),u=new Map;for(let I=0;I<h.length;I++)lt(u,h.contigs[h.contig[I]],h.end[I]);return{format:"vcf",contigs:It(u),origin:"features",exact:!1}}if(ds(A)){const f=await Va(n),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(yA(i,t.name)||pA(i,t.name)||Ci(i,t.name)){const f=yA(i,t.name)?yi(i,t.name):pA(i,t.name)?Ei(i,t.name):mi(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(gi(i,t.name)){const f=ui(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"barchart",contigs:It(h),origin:"features",exact:!1}}if(Sa(i)){const f=Ra(i);Dt={key:tt(t),format:"cytoband",features:f};const h=kC(f);if(h!==null)return{format:"cytoband",contigs:h,origin:"cytoband",exact:!0};const u=new Map;for(let I=0;I<f.length;I++)lt(u,f.contigs[f.contig[I]],f.end[I]);return{format:"cytoband",contigs:It(u),origin:"features",exact:!1}}if(Ds(i,t.name)!==null){const f=Ua(i,t.name);Dt={key:tt(t),format:"junctions",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"junctions",contigs:It(h),origin:"features",exact:!1}}if(Ea(i,t.name)){const f=ma(i);return{format:"interact",contigs:uA(f),origin:"features",exact:!1}}if(pa(i,t.name)){const f=ya(i);return{format:"longrange",contigs:uA(f),origin:"features",exact:!1}}if(ba(i,t.name)){const f=Ma(i);Dt={key:tt(t),format:"genepred",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"genepred",contigs:It(h),origin:"features",exact:!1}}if(Ja(i,t.name)){const{signal:f}=$a(i),h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:"bedmethyl",contigs:It(h),origin:"features",exact:!1}}const a=Ri(i);if(a!==null){const f=a==="wig"?xi(i):Li(i);Dt={key:tt(t),format:a,features:null};const h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:a,contigs:It(h),origin:"features",exact:!1}}const c=ri(i,t.name);if(c==="bedpe"){const f=li(i);return Dt={key:tt(t),format:c,features:null},{format:c,contigs:uA(f),origin:"features",exact:!1}}const l=c==="gtf"?ai(i):hs(i,t.name);Dt={key:tt(t),format:c,features:l};const g=new Map;for(let f=0;f<l.length;f++)lt(g,l.contigs[l.contig[f]],l.end[f]);return{format:c,contigs:It(g),origin:"features",exact:!1}}function Gs(t){return Object.values(t.refsByNumber).sort((e,n)=>e.id-n.id).map(e=>({name:e.name,length:e.length}))}function lt(t,e,n){const A=t.get(e);(A===void 0||n>A)&&t.set(e,n)}function uA(t){const e=new Map;for(let n=0;n<t.length;n++)lt(e,t.contigs[t.contig1[n]],t.end1[n]),lt(e,t.contigs[t.contig2[n]],t.end2[n]);return It(e)}function It(t){const e=[];for(const[n,A]of t){const s=10**Math.max(0,Math.floor(Math.log10(Math.max(1,A)))-2);e.push({name:n,length:(Math.floor(A/s)+1)*s})}return e}const Zt=new Map,rQ=8;function xt(t){if(t.kind==="local")return new ac(t.file);const{credential:e,headers:n}=t,A=`${t.url}|${e===void 0?"":JSON.stringify(e)}|${n===void 0?"":JSON.stringify(n)}`,s=Zt.get(A);if(s!==void 0)return Zt.delete(A),Zt.set(A,s),s;const r=e===void 0&&n===void 0?new wr(t.url):new wr(t.url,{fetch:(o,i)=>{const a=typeof o=="string"?o:o.url;return fetch(o,Ji(i,{url:a,...n===void 0?{}:{headers:n},...e===void 0?{}:{credential:e}}))}});for(Zt.set(A,r);Zt.size>rQ;){const o=Zt.keys().next().value;Zt.delete(o)}return r}async function oQ(t,e,n,A){const s=vs(t);if(s===null||!We(n))return null;try{const r=await Yt(await xt(s).readFile()),o=Bl(r),i=await ke(e,t);if(i===null)return null;const a=El(o,ml(o,Wa(A)),i);if(a.length===0||a.reduce((f,h)=>f+(h.to-h.from),0)>i*.8)return null;const l=[];for(const f of a){const h=await e.read(f.to-f.from,f.from),u=new TextDecoder().decode(await Yt(h,f.lastBlock-f.from));l.push(iQ(u,f.from===0,cQ(h,f,i)))}const g=l.join("");return g===""?null:g}catch{return null}}function iQ(t,e,n){let A=t;if(!e){const s=A.indexOf(`
|
|
25
25
|
`);A=s<0?"":A.slice(s+1)}if(!n&&!A.endsWith(`
|
|
26
26
|
`)){const s=A.lastIndexOf(`
|
|
27
|
-
`);A=s<0?"":A.slice(0,s+1)}return A}const
|
|
28
|
-
`),c=s.autoSql??"";if(vg(c)){const f=Pa(a,e.name,n);return i?{...f,summary:Le(f.summary)}:f}if(iC(c)){const f=Ha(a,n);return i?{...f,summary:Le(f.summary)}:f}if(UC(c)){const f=Wa(t,a,n);return i?{...f,summary:Le(f.summary)}:f}const l=fs(a,e.name);if(EC(c)){const f=ft(l.contigs,n),h={format:"genepred",contigs:l.contigs,overlap:Z(l.contigs,n,f),summary:bs(l),payload:{kind:"features",data:l}};return i?{...h,summary:Le(h.summary)}:h}const g=zA("bigbed",l,n);return{...g,summary:i?Le(g.summary):g.summary}}function Le(t){return`${t} · cut off at ${G.int(XA)}`}async function wQ(t,e,n){const A=new To({filehandle:xt(e)}),s=await A.getHeader(),r=pe(xs(s),n),o=r.names;Fs.set(t,{bigwig:A,refOf:r.sourceOf,refNames:Object.keys(s.refsByName)});const i=s.totalSummary,a=i!==void 0&&Number.isFinite(i.scoreMin)&&Number.isFinite(i.scoreMax)&&i.scoreMax>i.scoreMin;return{format:"bigwig",contigs:o,overlap:Z(o,n,r),summary:vs(o.length)+(a?` · ${ie(i.scoreMin)}–${ie(i.scoreMax)}`:""),...a?{fileExtent:{min:i.scoreMin,max:i.scoreMax}}:{}}}function pQ(t,e,n,A){const s=e==="wig"?Li(n):Ri(n);if(s.length===0)throw new Error(`This looks like a ${e==="wig"?"wig":"bedGraph"} but holds no usable intervals.`);const r=pe(s.contigs.map(g=>({name:g.name})),A);s.contigs.forEach((g,f)=>{g.name=r.names[f]});const o=new xi(s);Hn.set(t,o);const i=o.contigNames,{min:a,max:c}=o.extent,l=Number.isFinite(a)&&Number.isFinite(c)&&c>a;return{format:e,contigs:i,overlap:Z(i,A,r),summary:`${G.int(o.length)} intervals · ${vs(i.length)}`+(l?` · ${ie(a)}–${ie(c)}`:""),...l?{fileExtent:{min:a,max:c}}:{}}}function yQ(t,e,n){const A=[];let s=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(const o of e){if(!t.has(o.contig)||o.end<=o.start)continue;const i=t.samples(o.contig,o.start,o.end,n);if(i!==null){for(const a of i.values)Number.isFinite(a)&&(a<s&&(s=a),a>r&&(r=a));A.push({contig:o.contig,start:o.start,end:o.end,variant:null,...i})}}return{basesPerPixel:n,regions:A,extent:s<=r?{min:s,max:r}:null}}async function ja(t,e,n,A,s,r=!1){const o=Wn.get(t);if(o!==void 0)return RQ(s,o,e,n,A);const i=re.get(t);if(i!==void 0)return QQ(i,e,n,Qn(s));const a=Hn.get(t);if(a!==void 0)return yQ(a,e,n);const c=KA.get(t);if(c!==void 0)return Sh(c,e,n,r);const l=Fs.get(t);if(l===void 0)throw new Error("This track is no longer open. Drop the file again.");const g=C=>{const E=l.refOf.get(C);if(E!==void 0)return E;const B=Kt(l.refNames,C);if(!(B<0))return l.refOf.set(C,l.refNames[B]),l.refNames[B]},f=e.filter(C=>g(C.contig)!==void 0&&C.end>C.start);if(f.length===0)return{basesPerPixel:n,regions:[],extent:null};const h=await l.bigwig.getFeaturesAsArraysMulti(f.map(C=>({refName:g(C.contig)??C.contig,start:Math.max(0,Math.floor(C.start)),end:Math.ceil(C.end)})),{basesPerSpan:Math.max(1,n)}),u=[];let I=Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY;for(let C=0;C<f.length;C++){const E=h.regionOffsets[C],B=h.regionOffsets[C+1],Q=h.scores.slice(E,B);for(let m=0;m<Q.length;m++){const p=Q[m];Number.isFinite(p)&&(p<I&&(I=p),p>d&&(d=p))}u.push({contig:f[C].contig,start:f[C].start,end:f[C].end,starts:h.starts.slice(E,B),ends:h.ends.slice(E,B),values:Q,min:h.isSummary?h.minScores.slice(E,B):null,max:h.isSummary?h.maxScores.slice(E,B):null,variant:null,summary:h.isSummary})}return{basesPerPixel:n,regions:u,extent:I<=d?{min:I,max:d}:null}}const NQ=1<<18,ko=1<<24;async function tc(t,e){const n=Number.isFinite(e)&&e>0?e:Number.MAX_SAFE_INTEGER;let A=NQ;for(;;){let s;try{s=await Ot(await t.read(Math.min(A,n),0))}catch{return null}if(!Vo(s))return null;const r=Dl(s);if(r!==null)return r;if(A>=n||A>=ko)throw new Error("This BAM's header is truncated: its reference table does not end.");A=Math.min(A*4,ko)}}async function kQ(t,e,n,A,s,r,o){if(s.sortOrder==="queryname"||s.sortOrder==="unsorted")throw new Error(`${e.name} is sorted by ${s.sortOrder==="queryname"?"read name":"nothing"}, and reads are drawn by region. Run \`samtools sort -o sorted.bam ${e.name}\` and index the result.`);const i=Gs(e),a=i===null?`${tt(e)}|search`:VC(e,i),c=vn.get(a);let l=null,g=null,f="";if(c!==void 0)l=c.open.index,g=c.open.search,f=c.open.searched;else{if(i===null)f="no index dropped with it";else try{l=await df(await xt(i).readFile({onProgress:o}))}catch(C){const E=C instanceof Error?C.message:String(C);f=i.kind==="remote"?`no ${i.url.split("?")[0].split("/").pop()??"index"} beside it`:`${i.name} could not be read (${E})`}if(l===null){if(!Number.isFinite(r)||r<=0)throw new Error(`${e.name} has ${f}, and its length could not be learnt, so its reads cannot be located by search either. A BAM is read by region: publish its index beside it, or name one with \`${e.kind==="remote"?e.url:e.name}#index=<url of the .bai>\`.`);try{g=await ds.open(n,r,s,C=>o(C,0))}catch(C){if(C instanceof yA)throw new Error(bQ(e.name,s,C));const E=C instanceof Error?C.message:String(C);throw new Error(`${e.name} has ${f} and could not be read by search: ${E}. A BAM is read by region; run \`samtools index ${e.name}\` and publish the index beside it, or name one with \`#index=<url of the .bai>\`.`)}}}const h=pe(s.refs,A),u=h.names,I=new Map;for(let C=0;C<u.length;C++)I.set(u[C],C);for(let C=0;C<s.refs.length;C++)I.has(s.refs[C].name)||I.set(s.refs[C].name,C);const d=c?.open??{handle:n,header:s,index:l,search:g,searched:f,size:r,refIdOf:I,refNames:s.refs.map(C=>C.name)};return c===void 0?vn.set(a,{open:d,holders:new Set([t])}):c.holders.add(t),Wn.set(t,d),{format:"bam",contigs:u,overlap:Z(u,A,h),summary:`${G.int(s.refs.length)} reference${s.refs.length===1?"":"s"} · ${l!==null?l.format.toUpperCase():`${f} — reads located by search`}`}}function bQ(t,e,n){const A=e.sortOrder==="coordinate"?"its header says SO:coordinate, but":"its header has no @HD line to say so, and";return`${t} is not in coordinate order — ${A} the reads at byte ${G.int(n.before.block)} are on ${Ir(n.before,e.refs)} while those at byte ${G.int(n.after.block)}, later in the file, are on ${Ir(n.after,e.refs)}. Reads are drawn by region, which needs the file sorted and indexed: run \`samtools sort -o sorted.bam ${t}\` and \`samtools index sorted.bam\`. The alignment file a Hi-C pipeline writes is in read-pair order for its pairs step and is not made for browsing; its .pairs or its contact map is the file to open.`}const DQ=4e6;function MQ(t,e){if(t.search===null)return null;const n=e.reduce((A,s)=>A+(s.end-s.start),0);return e.length>1||n>DQ?`${FQ(n)} without an index — zoom in`:null}function FQ(t){return t>=1e6?`${ie(t/1e6)} Mb`:`${ie(t/1e3)} kb`}async function ec(t,e,n,A,s){const r=Math.max(0,Math.floor(n.start)),o=Math.ceil(n.end);return t.index!==null?pf(t.index,e,r,o,t.size):t.search===null?[]:t.search.spansFor(e,r,o,async()=>{if(!await Ls(A))throw ze()},s)}function nc(t){return t===void 0?Mi:{exclude:Xo|(t.hideDuplicates?At.DUPLICATE:0),minMapq:t.minMapq}}function SQ(t){const e=nc(t);return t.splits?{...e,exclude:e.exclude&-2049}:e}async function RQ(t,e,n,A,s){const r=I=>{const d=e.refIdOf.get(I);if(d!==void 0)return d;const C=Kt(e.refNames,I);if(!(C<0))return e.refIdOf.set(I,C),C},o=n.filter(I=>r(I.contig)!==void 0&&I.end>I.start);if(o.length===0)return{basesPerPixel:A,regions:[],extent:null};const i=MQ(e,o);if(i!==null)return{basesPerPixel:A,regions:[],extent:null,note:i};const a=[];for(const I of o){const d=r(I.contig);a.push({region:I,refId:d,spans:await ec(e,d,I,t,wo)})}const c=a.reduce((I,d)=>I+bi(d.spans),0);if(c>wo)return{basesPerPixel:A,regions:[],extent:null,note:`${G.bytes(c)} of reads — zoom in`};const l=[];let g=Number.POSITIVE_INFINITY,f=Number.NEGATIVE_INFINITY;const h=s?.modFraction===!0,u=[];for(const I of a){const d=I.region.end-I.region.start,C=Math.max(1,Math.min(4096,Math.round(d/Math.max(1,A)))),E=new Float64Array(C),B=new Map;u.push(B);const Q=A<=JQ?Ac(I.region):void 0,m=Q===void 0?null:new Float64Array(C),p=new Map;for(const D of I.spans){if(!await Ls(t))throw ze();const F=await e.handle.read(D.to-D.from,D.from),R=await Ot(F,D.lastBlock-D.from),v=Jf(R,D.dataFrom,I.refId,Math.floor(I.region.start),Math.ceil(I.region.end),C,nc(s),Q,p,h?{tally:B,threshold:s.modThreshold}:void 0);for(let x=0;x<C;x++)E[x]+=v.depth[x];if(m!==null&&v.variant!==null)for(let x=0;x<C;x++)m[x]+=v.variant[x]}const w=new Int32Array(C),y=new Int32Array(C),N=new Float32Array(C),k=m===null?null:new Float32Array(C),b=d/C;for(let D=0;D<C;D++)w[D]=Math.round(I.region.start+D*b),y[D]=Math.round(I.region.start+(D+1)*b),N[D]=E[D],k!==null&&m!==null&&(k[D]=m[D]),E[D]<g&&(g=E[D]),E[D]>f&&(f=E[D]);l.push({contig:I.region.contig,start:I.region.start,end:I.region.end,starts:w,ends:y,values:N,variant:k,junctions:xQ(p),min:null,max:null,summary:!1})}return h?LQ(A,l,u,s.modCode):{basesPerPixel:A,regions:l,extent:g<=f&&f>0?{min:0,max:f}:null}}function LQ(t,e,n,A){const s=new Map;for(const c of n)for(const[l,g]of c){const f=s.get(l)??[0,0];f[0]+=g.modified.reduce((h,u)=>h+u,0),f[1]+=g.calls.reduce((h,u)=>h+u,0),s.set(l,f)}const r=[...s.entries()].sort((c,l)=>l[1][0]-c[1][0]||l[1][1]-c[1][1]).map(([c])=>c),o=A!==""?A:r[0]??"";let i=!1;const a=e.map((c,l)=>{const g=n[l].get(o),f=new Float32Array(c.values.length).fill(Number.NaN);if(g!==void 0)for(let h=0;h<f.length;h++)g.calls[h]<=0||(f[h]=100*g.modified[h]/g.calls[h],i=!0);return{...c,values:f,variant:null,junctions:void 0}});return{basesPerPixel:t,regions:a,extent:i?{min:0,max:100}:null,mods:{code:o,codes:r},...r.length===0?{note:"no MM/ML modification calls here"}:{}}}function xQ(t){const e=[];for(const[s,r]of t){const[o,i,a]=s.split(":").map(Number);e.push([o,i,a,r])}e.sort((s,r)=>s[0]-r[0]||s[1]-r[1]||s[2]-r[2]);const n=e.length,A={starts:new Int32Array(n),ends:new Int32Array(n),counts:new Float32Array(n),strands:new Int8Array(n)};return e.forEach(([s,r,o,i],a)=>{A.starts[a]=s,A.ends[a]=r,A.strands[a]=o,A.counts[a]=i}),A}const bo=4<<20,GQ=2e5,UQ=40;async function vQ(t,e,n,A,s,r){const o=Wn.get(t);if(o===void 0)throw new Error("This track is no longer open. Drop the file again.");const i={piles:[],total:0,kept:0,capped:!1,rows:0,diffs:"none"},a=m=>{const p=o.refIdOf.get(m);if(p!==void 0)return p;const w=Kt(o.refNames,m);if(!(w<0))return o.refIdOf.set(m,w),w},c=e.filter(m=>a(m.contig)!==void 0&&m.end>m.start);if(c.length===0)return i;const l=c.reduce((m,p)=>m+(p.end-p.start),0);if(l>GQ)return{...i,note:`${ie(l/1e3)} kb — too wide to draw reads`};const g=[];for(const m of c){const p=a(m.contig);g.push({region:m,refId:p,spans:await ec(o,p,m,r,bo)})}const f=g.reduce((m,p)=>m+bi(p.spans),0);if(f>bo)return{...i,note:`${G.bytes(f)} of reads here — zoom in`};const h=[];let u=0,I=0,d=!1,C=0,E=!1,B=!1,Q=!1;for(const m of g){const p=Ac(m.region);p!==void 0&&(Q=!0);for(const w of m.spans){if(!await Ls(r))throw ze();const y=await o.handle.read(w.to-w.from,w.from),N=await Ot(y,w.lastBlock-w.from),k=Hf(N,w.dataFrom,m.region.contig,m.refId,Math.floor(m.region.start),Math.ceil(m.region.end),{filter:SQ(s),maxRows:n,maxReads:TQ,colourBy:s.colourBy,withNames:A<=UQ,refNameOf:b=>o.refNames[b],...p===void 0?{}:{reference:p}});u+=k.total,I+=k.kept,d=d||k.capped,C=Math.max(C,k.rows),E=E||k.usedMd,B=B||k.usedCigar,(k.pile.length>0||h.length===0)&&h.push(k.pile)}}return{piles:h,total:u,kept:I,capped:d,rows:C,diffs:B?"cigar":E?"md":Q?"reference":"none"}}const TQ=2e4,JQ=16;function Ac(t){const e=Math.max(0,Math.floor(t.start));for(const n of re.values()){if(we(n)){const r=Ms(n,t.contig),o=r===void 0?void 0:n.held.get(r.name);if(o===void 0)continue;const i=Math.min(o.start+o.bases.length,Math.ceil(t.end));if(o.start>e||i<=e)continue;return{start:e,bases:o.bases.subarray(e-o.start,i-o.start)}}const A=qn(n,t.contig);if(A===void 0)continue;const s=Math.min(A.length,Math.ceil(t.end));if(!(s<=e))return{start:e,bases:A.subarray(e,s)}}}function vs(t){return`${G.int(t)} sequence${t===1?"":"s"}`}function ie(t){if(!Number.isFinite(t))return"—";const e=Math.abs(t);return e===0?"0":e>=1e3?G.int(Math.round(t)):e>=1?t.toFixed(2).replace(/\.?0+$/,""):t.toPrecision(2)}
|
|
27
|
+
`);A=s<0?"":A.slice(0,s+1)}return A}const aQ=28;function cQ(t,e,n){if(e.to<n)return!1;const A=e.lastBlock-e.from;if(A<0||A>=t.length)return!1;const s=ye(t.subarray(A,Math.min(A+64,t.length)));return s===null||A+s>t.length?!1:t.length-(A+s)<=aQ}function vs(t){return t.kind==="local"?t.index===void 0?null:{kind:"local",file:t.index,name:t.index.name}:t.index===void 0?null:{kind:"remote",url:t.index,name:t.index,...t.credential===void 0?{}:{credential:t.credential},...t.headers===void 0?{}:{headers:t.headers}}}async function ke(t,e){const n=t.stat;if(typeof n=="function")try{const A=(await n.call(t)).size;if(Number.isFinite(A)&&A>0)return A}catch{}if(e===void 0||e.kind!=="remote")return null;try{const{credential:A,headers:s}=e,r=await fetch(e.url,Ji({method:"HEAD",mode:"cors"},{url:e.url,method:"HEAD",...s===void 0?{}:{headers:s},...A===void 0?{}:{credential:A}}));if(!r.ok)return null;const o=Number(r.headers.get("Content-Length")??Number.NaN);return Number.isFinite(o)&&o>0?o:null}catch{return null}}async function lQ(t,e,n,A){const s=xt(e),r=await s.read(64,0),o=Ka(r);if(o==="bigwig")return yQ(t,e,n);if(o==="bigbed")return pQ(t,e,n);if(We(r)){const I=await ke(s,e),d=await nc(s,I??Number.MAX_SAFE_INTEGER);if(d!==null){if(I===null)throw new Error(`${e.name} cannot be measured — its host states neither Content-Range nor Content-Length to a page — and a BAM is read by byte range.`);return MQ(t,e,s,n,d,I,A)}}if(kn(r))return dA(t,await Za(e,s,A),n);if(Ya(r))return dA(t,await ja(e,s,A),n);if(ds(r))return dQ(s,n);const i=Dt;if(i!==null&&i.key===tt(e)&&i.features!==null)return Dt=null,XA(i.format,i.features,n);const a=await oQ(e,s,r,n),c=a===null?await gs(await s.readFile({onProgress:A})):null;if(c!==null&&kn(c))return dA(t,Us(e,c),n);const l=a??new TextDecoder().decode(c);if(l.trim()==="")throw new Error("This file is empty.");if(ei(l))return gQ(l,n);if(yA(l,e.name))return IA(l,e.name,n,yi);if(pA(l,e.name))return IA(l,e.name,n);if(Ci(l,e.name))return IA(l,e.name,n,mi);if(gi(l,e.name))return Xa(l,e.name,n);if(Sa(l))return uQ(l,n);if(Ds(l,e.name)!==null)return IQ(l,e.name,n);if(Ea(l,e.name))return Pa(l,n);if(pa(l,e.name))return fQ(l,n);if(ba(l,e.name))return hQ(l,n);if(Ja(l,e.name))return za(t,l,n);const f=Ri(l);if(f!==null)return NQ(t,f,l,n);const h=ri(l,e.name);if(h==="bedpe"){const I=li(l),d=ft(I.contigs,n);return{format:h,contigs:I.contigs,overlap:Z(I.contigs,n,d),summary:`${G.int(I.length)} pair${I.length===1?"":"s"}`,payload:{kind:"pairs",data:I}}}const u=h==="gtf"?ai(l):hs(l,e.name);return XA(h,u,n)}function gQ(t,e){const n=si(t),A=ft(n.contigs,e),s=rg(t);return{format:"vcf",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:`${G.int(n.length)} variant${n.length===1?"":"s"}`+(s===0?"":` · ${G.int(s)} sample${s===1?"":"s"} not drawn`),payload:{kind:"features",data:n}}}function Pa(t,e){const n=ma(t),A=ft(n.contigs,e);return{format:"interact",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:lC(n),payload:{kind:"pairs",data:n}}}function fQ(t,e){const n=ya(t),A=ft(n.contigs,e);return{format:"longrange",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:hC(n),payload:{kind:"pairs",data:n}}}function hQ(t,e){const n=Ma(t),A=ft(n.contigs,e);return{format:"genepred",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:Ms(n),payload:{kind:"features",data:n}}}function za(t,e,n){const A=$a(e),s=A.signal,r=pe(s.contigs.map(a=>({name:a.name})),n);s.contigs.forEach((a,c)=>{a.name=r.names[c]});const o=new Gi(s);Hn.set(t,o);const i=o.contigNames;return{format:"bedmethyl",contigs:i,overlap:Z(i,n,r),summary:JC(A),fileExtent:{min:0,max:100}}}function Xa(t,e,n){const A=ui(t,e),s=ft(A.contigs,n);return{format:"barchart",contigs:A.contigs,overlap:Z(A.contigs,n,s),summary:$g(A),payload:{kind:"features",data:A}}}function uQ(t,e){const n=Ra(t),A=ft(n.contigs,e);return{format:"cytoband",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:La(n),payload:{kind:"features",data:n}}}function IQ(t,e,n){const A=Ua(t,e),s=ft(A.contigs,n);return{format:"junctions",contigs:A.contigs,overlap:Z(A.contigs,n,s),summary:Ta(A),payload:{kind:"features",data:A}}}function IA(t,e,n,A=Ei){const s=A(t,e),r=ft(s.contigs,n);return{format:"structure",contigs:s.contigs,overlap:Z(s.contigs,n,r),summary:pi(s),payload:{kind:"features",data:s}}}async function Va(t){const e=(o,i)=>t.read(o,i),n=await ke(t),A=await Af(e,n??void 0),s=Math.min(...A.resolutions),r=await sf(e,A,s);return Object.assign(r,{header:A})}async function dQ(t,e){const n=await Va(t),A=ft(n.contigs,e),s=n.header.resolutions.filter(o=>o!==n.model?.width),r=[pi(n),rf(n.header),...s.length===0?[]:[`also at ${s.join(", ")} bp`]].join(ct);return{format:"structure",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:r,payload:{kind:"features",data:n}}}function XA(t,e,n){const A=e.exonStart.length,s=ft(e.contigs,n);return{format:t,contigs:e.contigs,overlap:Z(e.contigs,n,s),summary:t==="gtf"?`${G.int(e.length)} transcripts · ${G.int(A)} exons`:t==="genepred"?Ms(e):t==="cytoband"?La(e):t==="junctions"?Ta(e):`${G.int(e.length)} feature${e.length===1?"":"s"}`,payload:{kind:"features",data:e}}}async function Za(t,e,n){const A=oe;if(A!==null&&A.key===tt(t))return A.store;const s=t.kind==="local"?t.file.size:await ke(e,t),r=s!==null&&s>0;if(r&&s<=HA)return No(t,e,n);const o=await CQ(t,e);if(o!==null)return oe={key:tt(t),store:o},o;if(r&&s>Ls)throw tc(s,t);return No(t,e,n)}async function No(t,e,n){return Us(t,await gs(await e.readFile({onProgress:n})))}async function CQ(t,e){const n=t.index!==void 0?t:t.kind==="remote"&&Ba.test(t.url)?{...t,index:tC(t.url)}:null,A=n===null?null:vs(n);if(A===null)return null;try{const s=Xd(new TextDecoder().decode(await xt(A).readFile()));return s.length===0?null:{indexed:!0,contigs:Vd(s),records:new Map(s.map(r=>[r.name,r])),handle:e,total:s.reduce((r,o)=>r+o.length,0),held:new Map}}catch{return null}}async function ja(t,e,n){const A=oe;if(A!==null&&A.key===tt(t)&&_t(A.store))return A.store;const s=await ke(e),r=await PC((i,a)=>e.read(i,a,{onProgress:n}),s??void 0),o={twobit:!0,contigs:WC(r.ordered),records:r.records,handle:e,total:r.total,held:new Map};return oe={key:tt(t),store:o},o}function Us(t,e){if(e.length>Ls)throw tc(e.length,t);const n=Tf(e);if(n.contigs.length===0)throw new Error("This looks like a FASTA but holds no sequences.");return oe={key:tt(t),store:n},n}function tc(t,e){const n=e.name.replace(/[#?].*$/,"")||"genome.fa";return new Error(`This FASTA is ${G.int(Math.round(t/1e6))} MB and has no index. It would be read whole and held whole — which is what makes panning free — so anything over ${G.int(Ls/1e6)} MB is refused rather than allowed to take the tab with it. Index it (\`samtools faidx ${n}\`) and ${e.kind==="local"?"drop the .fai with it":"publish the .fai beside it, or name it with #index=<url>"}: an indexed FASTA opens at once and is read by range.`)}function dA(t,e,n){const A=BQ(e,n);re.set(t,e);const s=e.contigs.map(r=>r.name);return{format:_t(e)?"twobit":"fasta",contigs:s,overlap:Z(s,n,A),summary:`${Ts(s.length)} · ${G.bp(e.total)}`+(_t(e)?" · read by range, two bits a base":Rs(e)?" · read by range from its index":""),...we(e)?{byRange:{bases:e.total,bytesPerBase:QQ(e)}}:{}}}function QQ(t){if(_t(t))return .25;let e=0,n=0;for(const A of t.records.values())e+=A.length*A.lineWidth/A.lineBases,n+=A.length;return n>0?e/n:1}function BQ(t,e){const n=pe(t.contigs,e);if(n.renamed===0)return n;if(_t(t)||Rs(t))return t.records=ko(t.records,t.contigs,n.names),t.held.clear(),n;const A=new Map;return t.contigs.forEach((s,r)=>{const o=t.bases.get(s.name);s.name=n.names[r],o!==void 0&&A.set(s.name,o)}),t.bases=A,n}function ko(t,e,n){const A=new Map;return e.forEach((s,r)=>{const o=t.get(s.name);s.name=n[r],o!==void 0&&A.set(s.name,{...o,name:s.name})}),A}async function EQ(t,e,n,A){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;if(we(t)&&e.reduce((a,c)=>a+Math.max(0,c.end-c.start),0)>yo)return{basesPerPixel:n,regions:[],extent:null,note:`GC under ${G.int(yo/1e6)} Mb, letters at base resolution — zoom in`};for(const i of e){if(!(i.end>i.start))continue;let a;if(we(t)){const c=Math.max(0,Math.floor(i.start)),l=await qa(t,i.contig,c,i.end,A);if(l===void 0||l.length===0)continue;a=Br(l,0,l.length,n);for(let g=0;g<a.starts.length;g++)a.starts[g]+=c,a.ends[g]+=c}else{const c=qn(t,i.contig);if(c===void 0)continue;a=Br(c,i.start,i.end,n)}if(a.values.length!==0){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push({contig:i.contig,start:i.start,end:i.end,starts:a.starts,ends:a.ends,values:a.values,min:null,max:null,variant:null,summary:!0})}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}const mQ=4e5;async function wQ(t,e,n){const A=re.get(t);if(A===void 0)throw new Error("This sequence is no longer open. Drop the file again.");const s=[];let r=mQ;for(const o of e){const i=Math.max(0,Math.floor(o.start));if(we(A)){const l=await qa(A,o.contig,i,Math.min(Math.ceil(o.end),i+r),n);if(l===void 0||l.length===0)continue;if(r-=l.length,s.push({contig:o.contig,start:i,end:i+l.length,bases:l.slice()}),r<=0)break;continue}const a=qn(A,o.contig);if(a===void 0)continue;const c=Math.min(a.length,Math.ceil(o.end),i+r);if(c>i&&(r-=c-i,s.push({contig:o.contig,start:i,end:c,bases:a.slice(i,c)}),r<=0))break}return{regions:s}}const VA=1e6;async function pQ(t,e,n){const A=new Oo({filehandle:xt(e)}),s=await A.getHeader(),r=Gs(s),o=[];let i=!1;for(const f of r){if(o.length>=VA){i=!0;break}const h=await A.getFeatures(f.name,0,f.length);for(const u of h){if(o.length>=VA){i=!0;break}const I=typeof u.rest=="string"&&u.rest!==""?` ${u.rest}`:"";o.push(`${f.name} ${u.start} ${u.end}${I}`)}}const a=o.join(`
|
|
28
|
+
`),c=s.autoSql??"";if(Jg(c)){const f=Xa(a,e.name,n);return i?{...f,summary:Le(f.summary)}:f}if(cC(c)){const f=Pa(a,n);return i?{...f,summary:Le(f.summary)}:f}if(TC(c)){const f=za(t,a,n);return i?{...f,summary:Le(f.summary)}:f}const l=hs(a,e.name);if(wC(c)){const f=ft(l.contigs,n),h={format:"genepred",contigs:l.contigs,overlap:Z(l.contigs,n,f),summary:Ms(l),payload:{kind:"features",data:l}};return i?{...h,summary:Le(h.summary)}:h}const g=XA("bigbed",l,n);return{...g,summary:i?Le(g.summary):g.summary}}function Le(t){return`${t} · cut off at ${G.int(VA)}`}async function yQ(t,e,n){const A=new Jo({filehandle:xt(e)}),s=await A.getHeader(),r=pe(Gs(s),n),o=r.names;Ss.set(t,{bigwig:A,refOf:r.sourceOf,refNames:Object.keys(s.refsByName)});const i=s.totalSummary,a=i!==void 0&&Number.isFinite(i.scoreMin)&&Number.isFinite(i.scoreMax)&&i.scoreMax>i.scoreMin;return{format:"bigwig",contigs:o,overlap:Z(o,n,r),summary:Ts(o.length)+(a?` · ${ie(i.scoreMin)}–${ie(i.scoreMax)}`:""),...a?{fileExtent:{min:i.scoreMin,max:i.scoreMax}}:{}}}function NQ(t,e,n,A){const s=e==="wig"?xi(n):Li(n);if(s.length===0)throw new Error(`This looks like a ${e==="wig"?"wig":"bedGraph"} but holds no usable intervals.`);const r=pe(s.contigs.map(g=>({name:g.name})),A);s.contigs.forEach((g,f)=>{g.name=r.names[f]});const o=new Gi(s);Hn.set(t,o);const i=o.contigNames,{min:a,max:c}=o.extent,l=Number.isFinite(a)&&Number.isFinite(c)&&c>a;return{format:e,contigs:i,overlap:Z(i,A,r),summary:`${G.int(o.length)} intervals · ${Ts(i.length)}`+(l?` · ${ie(a)}–${ie(c)}`:""),...l?{fileExtent:{min:a,max:c}}:{}}}function kQ(t,e,n){const A=[];let s=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(const o of e){if(!t.has(o.contig)||o.end<=o.start)continue;const i=t.samples(o.contig,o.start,o.end,n);if(i!==null){for(const a of i.values)Number.isFinite(a)&&(a<s&&(s=a),a>r&&(r=a));A.push({contig:o.contig,start:o.start,end:o.end,variant:null,...i})}}return{basesPerPixel:n,regions:A,extent:s<=r?{min:s,max:r}:null}}async function ec(t,e,n,A,s,r=!1){const o=Wn.get(t);if(o!==void 0)return xQ(s,o,e,n,A);const i=re.get(t);if(i!==void 0)return EQ(i,e,n,Qn(s));const a=Hn.get(t);if(a!==void 0)return kQ(a,e,n);const c=qA.get(t);if(c!==void 0)return Lh(c,e,n,r);const l=Ss.get(t);if(l===void 0)throw new Error("This track is no longer open. Drop the file again.");const g=C=>{const B=l.refOf.get(C);if(B!==void 0)return B;const Q=Kt(l.refNames,C);if(!(Q<0))return l.refOf.set(C,l.refNames[Q]),l.refNames[Q]},f=e.filter(C=>g(C.contig)!==void 0&&C.end>C.start);if(f.length===0)return{basesPerPixel:n,regions:[],extent:null};const h=await l.bigwig.getFeaturesAsArraysMulti(f.map(C=>({refName:g(C.contig)??C.contig,start:Math.max(0,Math.floor(C.start)),end:Math.ceil(C.end)})),{basesPerSpan:Math.max(1,n)}),u=[];let I=Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY;for(let C=0;C<f.length;C++){const B=h.regionOffsets[C],Q=h.regionOffsets[C+1],E=h.scores.slice(B,Q);for(let m=0;m<E.length;m++){const p=E[m];Number.isFinite(p)&&(p<I&&(I=p),p>d&&(d=p))}u.push({contig:f[C].contig,start:f[C].start,end:f[C].end,starts:h.starts.slice(B,Q),ends:h.ends.slice(B,Q),values:E,min:h.isSummary?h.minScores.slice(B,Q):null,max:h.isSummary?h.maxScores.slice(B,Q):null,variant:null,summary:h.isSummary})}return{basesPerPixel:n,regions:u,extent:I<=d?{min:I,max:d}:null}}const bQ=1<<18,bo=1<<24;async function nc(t,e){const n=Number.isFinite(e)&&e>0?e:Number.MAX_SAFE_INTEGER;let A=bQ;for(;;){let s;try{s=await Yt(await t.read(Math.min(A,n),0))}catch{return null}if(!Zo(s))return null;const r=Fl(s);if(r!==null)return r;if(A>=n||A>=bo)throw new Error("This BAM's header is truncated: its reference table does not end.");A=Math.min(A*4,bo)}}async function MQ(t,e,n,A,s,r,o){if(s.sortOrder==="queryname"||s.sortOrder==="unsorted")throw new Error(`${e.name} is sorted by ${s.sortOrder==="queryname"?"read name":"nothing"}, and reads are drawn by region. Run \`samtools sort -o sorted.bam ${e.name}\` and index the result.`);const i=vs(e),a=i===null?`${tt(e)}|search`:jC(e,i),c=Un.get(a);let l=null,g=null,f="";if(c!==void 0)l=c.open.index,g=c.open.search,f=c.open.searched;else{if(i===null)f="no index dropped with it";else try{l=await Qf(await xt(i).readFile({onProgress:o}))}catch(C){const B=C instanceof Error?C.message:String(C);f=i.kind==="remote"?`no ${i.url.split("?")[0].split("/").pop()??"index"} beside it`:`${i.name} could not be read (${B})`}if(l===null){if(!Number.isFinite(r)||r<=0)throw new Error(`${e.name} has ${f}, and its length could not be learnt, so its reads cannot be located by search either. A BAM is read by region: publish its index beside it, or name one with \`${e.kind==="remote"?e.url:e.name}#index=<url of the .bai>\`.`);try{g=await Cs.open(n,r,s,C=>o(C,0))}catch(C){if(C instanceof NA)throw new Error(DQ(e.name,s,C));const B=C instanceof Error?C.message:String(C);throw new Error(`${e.name} has ${f} and could not be read by search: ${B}. A BAM is read by region; run \`samtools index ${e.name}\` and publish the index beside it, or name one with \`#index=<url of the .bai>\`.`)}}}const h=pe(s.refs,A),u=h.names,I=new Map;for(let C=0;C<u.length;C++)I.set(u[C],C);for(let C=0;C<s.refs.length;C++)I.has(s.refs[C].name)||I.set(s.refs[C].name,C);const d=c?.open??{handle:n,header:s,index:l,search:g,searched:f,size:r,refIdOf:I,refNames:s.refs.map(C=>C.name)};return c===void 0?Un.set(a,{open:d,holders:new Set([t])}):c.holders.add(t),Wn.set(t,d),{format:"bam",contigs:u,overlap:Z(u,A,h),summary:`${G.int(s.refs.length)} reference${s.refs.length===1?"":"s"} · ${l!==null?l.format.toUpperCase():`${f} — reads located by search`}`}}function DQ(t,e,n){const A=e.sortOrder==="coordinate"?"its header says SO:coordinate, but":"its header has no @HD line to say so, and";return`${t} is not in coordinate order — ${A} the reads at byte ${G.int(n.before.block)} are on ${dr(n.before,e.refs)} while those at byte ${G.int(n.after.block)}, later in the file, are on ${dr(n.after,e.refs)}. Reads are drawn by region, which needs the file sorted and indexed: run \`samtools sort -o sorted.bam ${t}\` and \`samtools index sorted.bam\`. The alignment file a Hi-C pipeline writes is in read-pair order for its pairs step and is not made for browsing; its .pairs or its contact map is the file to open.`}const FQ=4e6;function SQ(t,e){if(t.search===null)return null;const n=e.reduce((A,s)=>A+(s.end-s.start),0);return e.length>1||n>FQ?`${RQ(n)} without an index — zoom in`:null}function RQ(t){return t>=1e6?`${ie(t/1e6)} Mb`:`${ie(t/1e3)} kb`}async function Ac(t,e,n,A,s){const r=Math.max(0,Math.floor(n.start)),o=Math.ceil(n.end);return t.index!==null?Nf(t.index,e,r,o,t.size):t.search===null?[]:t.search.spansFor(e,r,o,async()=>{if(!await xs(A))throw ze()},s)}function sc(t){return t===void 0?Fi:{exclude:Vo|(t.hideDuplicates?At.DUPLICATE:0),minMapq:t.minMapq}}function LQ(t){const e=sc(t);return t.splits?{...e,exclude:e.exclude&-2049}:e}async function xQ(t,e,n,A,s){const r=I=>{const d=e.refIdOf.get(I);if(d!==void 0)return d;const C=Kt(e.refNames,I);if(!(C<0))return e.refIdOf.set(I,C),C},o=n.filter(I=>r(I.contig)!==void 0&&I.end>I.start);if(o.length===0)return{basesPerPixel:A,regions:[],extent:null};const i=SQ(e,o);if(i!==null)return{basesPerPixel:A,regions:[],extent:null,note:i};const a=[];for(const I of o){const d=r(I.contig);a.push({region:I,refId:d,spans:await Ac(e,d,I,t,po)})}const c=a.reduce((I,d)=>I+Mi(d.spans),0);if(c>po)return{basesPerPixel:A,regions:[],extent:null,note:`${G.bytes(c)} of reads — zoom in`};const l=[];let g=Number.POSITIVE_INFINITY,f=Number.NEGATIVE_INFINITY;const h=s?.modFraction===!0,u=[];for(const I of a){const d=I.region.end-I.region.start,C=Math.max(1,Math.min(4096,Math.round(d/Math.max(1,A)))),B=new Float64Array(C),Q=new Map;u.push(Q);const E=A<=OQ?rc(I.region):void 0,m=E===void 0?null:new Float64Array(C),p=new Map;for(const M of I.spans){if(!await xs(t))throw ze();const F=await e.handle.read(M.to-M.from,M.from),S=await Yt(F,M.lastBlock-M.from),v=Of(S,M.dataFrom,I.refId,Math.floor(I.region.start),Math.ceil(I.region.end),C,sc(s),E,p,h?{tally:Q,threshold:s.modThreshold}:void 0);for(let x=0;x<C;x++)B[x]+=v.depth[x];if(m!==null&&v.variant!==null)for(let x=0;x<C;x++)m[x]+=v.variant[x]}const w=new Int32Array(C),y=new Int32Array(C),N=new Float32Array(C),k=m===null?null:new Float32Array(C),b=d/C;for(let M=0;M<C;M++)w[M]=Math.round(I.region.start+M*b),y[M]=Math.round(I.region.start+(M+1)*b),N[M]=B[M],k!==null&&m!==null&&(k[M]=m[M]),B[M]<g&&(g=B[M]),B[M]>f&&(f=B[M]);l.push({contig:I.region.contig,start:I.region.start,end:I.region.end,starts:w,ends:y,values:N,variant:k,junctions:vQ(p),min:null,max:null,summary:!1})}return h?GQ(A,l,u,s.modCode):{basesPerPixel:A,regions:l,extent:g<=f&&f>0?{min:0,max:f}:null}}function GQ(t,e,n,A){const s=new Map;for(const c of n)for(const[l,g]of c){const f=s.get(l)??[0,0];f[0]+=g.modified.reduce((h,u)=>h+u,0),f[1]+=g.calls.reduce((h,u)=>h+u,0),s.set(l,f)}const r=[...s.entries()].sort((c,l)=>l[1][0]-c[1][0]||l[1][1]-c[1][1]).map(([c])=>c),o=A!==""?A:r[0]??"";let i=!1;const a=e.map((c,l)=>{const g=n[l].get(o),f=new Float32Array(c.values.length).fill(Number.NaN);if(g!==void 0)for(let h=0;h<f.length;h++)g.calls[h]<=0||(f[h]=100*g.modified[h]/g.calls[h],i=!0);return{...c,values:f,variant:null,junctions:void 0}});return{basesPerPixel:t,regions:a,extent:i?{min:0,max:100}:null,mods:{code:o,codes:r},...r.length===0?{note:"no MM/ML modification calls here"}:{}}}function vQ(t){const e=[];for(const[s,r]of t){const[o,i,a]=s.split(":").map(Number);e.push([o,i,a,r])}e.sort((s,r)=>s[0]-r[0]||s[1]-r[1]||s[2]-r[2]);const n=e.length,A={starts:new Int32Array(n),ends:new Int32Array(n),counts:new Float32Array(n),strands:new Int8Array(n)};return e.forEach(([s,r,o,i],a)=>{A.starts[a]=s,A.ends[a]=r,A.strands[a]=o,A.counts[a]=i}),A}const Mo=4<<20,UQ=2e5,TQ=40;async function JQ(t,e,n,A,s,r){const o=Wn.get(t);if(o===void 0)throw new Error("This track is no longer open. Drop the file again.");const i={piles:[],total:0,kept:0,capped:!1,rows:0,diffs:"none"},a=m=>{const p=o.refIdOf.get(m);if(p!==void 0)return p;const w=Kt(o.refNames,m);if(!(w<0))return o.refIdOf.set(m,w),w},c=e.filter(m=>a(m.contig)!==void 0&&m.end>m.start);if(c.length===0)return i;const l=c.reduce((m,p)=>m+(p.end-p.start),0);if(l>UQ)return{...i,note:`${ie(l/1e3)} kb — too wide to draw reads`};const g=[];for(const m of c){const p=a(m.contig);g.push({region:m,refId:p,spans:await Ac(o,p,m,r,Mo)})}const f=g.reduce((m,p)=>m+Mi(p.spans),0);if(f>Mo)return{...i,note:`${G.bytes(f)} of reads here — zoom in`};const h=[];let u=0,I=0,d=!1,C=0,B=!1,Q=!1,E=!1;for(const m of g){const p=rc(m.region);p!==void 0&&(E=!0);for(const w of m.spans){if(!await xs(r))throw ze();const y=await o.handle.read(w.to-w.from,w.from),N=await Yt(y,w.lastBlock-w.from),k=Pf(N,w.dataFrom,m.region.contig,m.refId,Math.floor(m.region.start),Math.ceil(m.region.end),{filter:LQ(s),maxRows:n,maxReads:$Q,colourBy:s.colourBy,withNames:A<=TQ,refNameOf:b=>o.refNames[b],...p===void 0?{}:{reference:p}});u+=k.total,I+=k.kept,d=d||k.capped,C=Math.max(C,k.rows),B=B||k.usedMd,Q=Q||k.usedCigar,(k.pile.length>0||h.length===0)&&h.push(k.pile)}}return{piles:h,total:u,kept:I,capped:d,rows:C,diffs:Q?"cigar":B?"md":E?"reference":"none"}}const $Q=2e4,OQ=16;function rc(t){const e=Math.max(0,Math.floor(t.start));for(const n of re.values()){if(we(n)){const r=Fs(n,t.contig),o=r===void 0?void 0:n.held.get(r.name);if(o===void 0)continue;const i=Math.min(o.start+o.bases.length,Math.ceil(t.end));if(o.start>e||i<=e)continue;return{start:e,bases:o.bases.subarray(e-o.start,i-o.start)}}const A=qn(n,t.contig);if(A===void 0)continue;const s=Math.min(A.length,Math.ceil(t.end));if(!(s<=e))return{start:e,bases:A.subarray(e,s)}}}function Ts(t){return`${G.int(t)} sequence${t===1?"":"s"}`}function ie(t){if(!Number.isFinite(t))return"—";const e=Math.abs(t);return e===0?"0":e>=1e3?G.int(Math.round(t)):e>=1?t.toFixed(2).replace(/\.?0+$/,""):t.toPrecision(2)}
|