class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,console.log("blockHeight",this.blockHeight),this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),e=document.createElement("script");function i(t){const e=new Uint8Array(t.length/2);for(var i=0;i<e.length;i++)e[i]=parseInt(t.substring(2*i,2*i+2),16);return e.buffer}e.innerHTML=await t.text(),document.body.appendChild(e);const o={};let n=null;if(null!==this.parcelId)console.log("parcelId",this.parcelId);else{if(console.log("isParent",!0),n=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,o=t=>e/2n**t,n=t/i;let s=0n;for(let t=0n;t<n;t++)s+=o(t)*i;return s+=t%i*o(n),String(s)})(this.blockHeight),Number(this.blockHeight)<84e4){const e=await import("/content/d36f3434809b4b4bed7da6c17d45fbb3e72b89d31f3334d9d34e168519b51bd9i0"),o=await e.getBitmapSat(Number(this.blockHeight)),s=await fetch(`/r/sat/${o}/at/-1`).then((t=>t.json()));try{const t=await fetch(`/r/metadata/${s.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${s.id} metadata not found`)})).then((t=>CBOR.decode(i(t.replace(/"/g,"")))));console.log(t);const e=Number(t.blockHeight);console.log("bitmapBlockHeight",e),e===Number(this.blockHeight)&&(n=o,console.log(`sat on bitmap: ${n}`),console.log("bitmap reinscription id",s.id))}catch(t){console.log("no valid 3D reinscription found on Bitmap (or not a Bitmap)")}}if(n){console.log("inscribed on sat",n);const t=await fetch(`/r/sat/${n}/at/-1`).then((t=>t.json()));console.log("inscriptionId",t.id);let e=[],s=!0,r=0;if(t.id){for(;s;){const i=await fetch(`/r/children/${t.id}/${r}`).then((t=>t.json()));s=i.more,e=e.concat(i.ids),r+=1}console.log("Num of children",e.length)}if(e.length>0)for(let t=0;t<e.length;t++){const n=e[t];fetch(`/r/metadata/${n}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${n} metadata not found`)})).then((t=>CBOR.decode(i(t.replace(/"/g,""))))).then((t=>{if(t&&t.parcelId){const e=t.parcelId.split(":").pop();e in o||(o[e]=n,console.log("parcelId",e,"indexed"))}})).catch((t=>console.log(t)))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:s}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{POSTPROCESSING:r}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),a=r.BloomEffect,l=r.EffectComposer,h=r.EffectPass,c=r.RenderPass,d=r.BlendFunction,p={headers:{Accept:"application/json"}},f=await fetch("/r/blockheight",p).then((t=>t.json())),x=await fetch(`/r/blockinfo/${f}`,p).then((t=>t.json()));console.log("latest blockHeight",f,"tx_count",x.transaction_count);const w=Math.floor(x.transaction_count/2);console.log("treasure tx: 1/2 tx x latest tx_count =",w),await this.fetchData();const u=w<this.txList.length?this.txList[w].value:0;console.log("treasure tx #",w,"in block",this.blockHeight,"has tx value in total of",u,"sats");for(let t=0;t<this.txList.length;t++)this.txList[t].size=this.logTxSize(this.txList[t].value);let g=0;for(let t of this.txList)g+=t.size*t.size;let m=Math.ceil(Math.sqrt(g));this.mondrian=new MondrianLayout(m,m),s.install({THREE:THREE});const b=window.innerWidth,y=window.innerHeight,E=new THREE.Clock,M=new THREE.Scene,R=new THREE.PerspectiveCamera(90,b/y,.01,1e3);R.position.set(0,m/1.6,0);const H=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!1,stencil:!1,depth:!1});H.setSize(b,y),H.shadowMap.enabled=!0,H.shadowMap.type=THREE.BasicShadowMap;let S=new THREE.HemisphereLight(16777215,0,2);M.add(S);let T=new THREE.DirectionalLight(16777215,1);T.position.set(-10,100,-10),T.target.position.set(0,0,0),T.castShadow=!0,M.add(T),document.getElementById("root").appendChild(H.domElement);const k=new s(R,H.domElement);let L=13576336;this.blockHeight<84e4&&(L=16356896);const I=new THREE.MeshStandardMaterial({color:L,wireframe:!1}),B=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),v=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375}),C=new l(H);C.addPass(new c(M,R));const $=new a({blendFunction:d.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});C.addPass(new h(R,$));let P=0;for(let t=0;t<this.txList.length;t++){const e=this.mondrian.place(this.txList[t].size),i=.5*e.r,n=new THREE.Mesh(new THREE.BoxGeometry(.9*e.r,.2*e.r,.9*e.r),this.txList[t].value===u?v:I);if(o&&o[t]){const t=new THREE.Mesh(new THREE.BoxGeometry(.6*e.r,.25*e.r,.6*e.r),B);t.position.set(e.position.x-m/2+i,.1*e.r/2,e.position.y-m/2+i),M.add(t)}if(null!==this.parcelId&&t===this.parcelId){const t=new THREE.Mesh(new THREE.BoxGeometry(.6*e.r,.25*e.r,.6*e.r),B);t.position.set(e.position.x-m/2+i,.1*e.r/2,e.position.y-m/2+i),M.add(t)}this.txList[t].value===u&&(P+=1),M.add(n),n.position.set(e.position.x-m/2+i,.1*e.r/2,e.position.y-m/2+i)}console.log("found",P,1!==P?"treasure parcels":"treasure parcel","with the same output value for BlockDrop"),H.render(M,R),C.render();let D=!1;!function t(){const e=E.getDelta(),i=E.getElapsedTime(),o=k.update(e);D&&($.intensity=2+2*Math.sin(i),C.render(),i>30&&(D=!1)),requestAnimationFrame(t),o&&(D=!0)}()}async fetchData(){const t=await fetch(this.txValueCache).then((t=>t.text()));if(t){let e=t.split(/\r?\n/);this.txList=new Array(e.length);for(let t=0;t<e.length;t++){let i=parseInt(e[t]);this.txList[t]={value:i}}}}decompress=t=>{const e=Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),i=new DecompressionStream("gzip"),o=i.writable.getWriter();return o.write(e),o.close(),new Response(i.readable).arrayBuffer().then((function(t){return(new TextDecoder).decode(t)}))};logTxSize(t){if(0===t)return 1;let e=Math.ceil(Math.log10(t))-5;return Math.min(Number.MAX_SAFE_INTEGER,Math.max(1,e))}}class MondrianLayout{constructor(t,e){this.width=t,this.height=e,this.xMax=0,this.yMax=0,this.rowOffset=0,this.rows=[],this.txMap=[]}getSize(){return{width:this.xMax,height:this.yMax}}getRow(t){let e=t.y-this.rowOffset;return e<this.rows.length?this.rows[e]:null}getSlot(t){let e=this.getRow(t);return null!==e&&e.map.hasOwnProperty(t.x)?e.map[t.x]:null}addRow(){let t={y:this.rows.length+this.rowOffset,slots:[],map:{},max:0};return this.rows.push(t),t}addSlot(t){if(t.r<=0)return null;let e=this.getSlot(t.position);if(null!==e)return e.r=Math.max(e.r,t.r),e;{let e=this.getRow(t.position);if(null===e)return null;let i=e.slots.findIndex((e=>e.position.x>t.position.x));return-1===i?e.slots.push(t):e.slots.splice(i,0,t),e.map[t.position.x]=t,t}}removeSlot(t){let e=this.getRow(t.position);if(null!==e){delete e.map[t.position.x];let i=e.slots.findIndex((e=>e.position.x===t.position.x));-1!==i&&e.slots.splice(i,1)}}fillSlot(t,e){let i={left:t.position.x,right:t.position.x+e,bottom:t.position.y,top:t.position.y+e};this.removeSlot(t);for(let o=t.position.y;o<i.top;o++){let n=this.getRow({x:t.position.x,y:o});if(null!==n){let s=[],r=0;for(let e of n.slots)if(!(e.position.x+e.r<i.left||e.position.x>=i.right)){s.push(e);let i=Math.max(0,e.position.x+e.r-(t.position.x+t.r));r=Math.max(r,i)}i.right<this.width&&!n.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:o},r:t.r-e+r});for(let e of s)e.r=t.position.x-e.position.x,0===e.r&&this.removeSlot(e)}else this.addRow(),t.position.x>0&&this.addSlot({position:{x:0,y:o},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:o},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let o=this.getRow({x:t.position.x,y:i});if(null!==o)for(let i=0;i<o.slots.length;i++){let n=o.slots[i];if(n.position.x<t.position.x+e&&n.position.x+n.r>t.position.x&&n.position.y+n.r>=t.position.y){let e=n.r;n.r=t.position.y-n.position.y;let i={x:n.position.x+n.r,y:n.position.y,width:e-n.r,height:n.r};for(;i.width>0&&i.height>0;)i.width<=i.height?(this.addSlot({position:{x:i.x,y:i.y},r:i.width}),i.y+=i.width,i.height-=i.width):(this.addSlot({position:{x:i.x,y:i.y},r:i.height}),i.x+=i.height,i.width-=i.height)}}}return{position:t.position,r:e}}place(t){let e={},i=!1,o=null;for(let e of this.rows){for(let n of e.slots)if(n.r>=t){i=!0,o=this.fillSlot(n,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});o=this.fillSlot(i,t)}for(let t=0;t<o.r;t++)for(let i=0;i<o.r;i++)this.setTxMapCell({x:o.position.x+t,y:o.position.y+i},e);return o.position.x+o.r>this.xMax&&(this.xMax=o.position.x+o.r),o.position.y+o.r>this.yMax&&(this.yMax=o.position.y+o.r),o}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let o=i*this.width+t.x;o>=0&&o<this.txMap.length&&(this.txMap[o]=e)}}}