class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(e,t,n){this.blockHeight=`${e}`,this.txValueCache=t,this.parcelId=n?Number(n.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const e=await fetch("/r/sat/717782964543142/at/-1").then((e=>e.json())),t=await fetch(`/content/${e.id}`).then((async e=>atob(await e.text()))),n=await fetch("/r/sat/717782965662484/at/-1").then((e=>e.json())),i=await fetch(`/content/${n.id}`).then((async e=>JSON.parse(decodeURIComponent(escape(atob(await e.text()))))));window.enableApp=window.fullScreen||window.innerWidth==screen.width||window.innerWidth>=i.enableApp&&screen.width>=i.enableApp,window.enableRecursion=window.innerWidth>=i.enableRecursion&&screen.width>=i.enableRecursion,window.tipSatAmount=i.tipSatAmount,window.parcelHighLight=i.parcelHighLight,window.enableQG="518357"===this.blockHeight&&i.enableQG;const a=!(!window.enableQG||!window.enableApp||!window.ethereum&&!window.XverseProviders),o=a&&await fetch("/r/sat/717782964480455/at/-1").then((e=>e.json())),s=a&&await fetch(`/content/${o.id}`).then((async e=>JSON.parse(decodeURIComponent(escape(atob(await e.text()))))));if(window.tipCreator=a&&i.tipCreator,window.ethContracAbi=a&&s.ethContracAbi,a){const e=await fetch("/r/sat/717782964530533/at/-1").then((e=>e.json())),n=await fetch(`/content/${e.id}`),o=document.createElement("script");o.innerHTML=decodeURIComponent(escape(atob(await n.text()))),document.body.appendChild(o);const r=a&&await fetch("/r/sat/717782965138207/at/-1").then((e=>e.json())),c=a&&await fetch(`/content/${r.id}`),d=a&&document.createElement("script");d.innerHTML=decodeURIComponent(escape(atob(await c.text()))),document.body.appendChild(d),window.assetName=`${null!==this.parcelId?this.parcelId+"."+this.blockHeight:this.blockHeight}.bitmap`,"518357"===this.blockHeight?window.titleName=`NAKAMOTO MATRIX ${window.assetName} ${null!==this.parcelId?"parcel":""}`:window.titleName=window.assetName,window.introMsg=`Welcome to ${window.titleName} on Blocks Of Bitcoin! This ${"518357"===this.blockHeight?"Nakamoto rare sat inscription":"metaverse property"} lives forever on Bitcoin!>This onchain asset is a Bitmap 3D upgrade and a key to the future of the BTC metaverse.>${window.enableQG?"It showcases that AIs and ETH smart contracts can be built as BTC Ordinals on Bitcoin!!>Will you explore this brave new digital world?":""}`,window.ethContractAddress=i.evm[t].contractAddress,window.targetChainName=s.evm[t].chainName,window.quark20Msg=i.quark20Msg,window.targetChainId=s.evm[t].id,window.targetChainRPC=s.evm[t].rpc,window.targetChainExplorer=s.evm[t].explorer,window.targetChainCurrencyName=s.evm[t].currencyName,window.targetChainCurrencySymbol=s.evm[t].currencySymbol,initGate()}const r=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),c=document.createElement("script");c.innerHTML=await r.text(),document.body.appendChild(c);const d=document.createElement("div");function l(e){const t=new Uint8Array(e.length/2);for(var n=0;n<t.length;n++)t[n]=parseInt(e.substring(2*n,2*n+2),16);return t.buffer}d.setAttribute("id","css3d"),document.body.appendChild(d),document.getElementById("css3d").style="margin: 0; overflow: hidden; position: absolute; top: 0px;";const h={};let w=null,p={},f=[],m=!1;window.selfInscriptionId,window.canCheckInventory=!1,null!==this.parcelId||(m=!0);if(w=(e=>{e=BigInt(e);const t=5000000000n,n=210000n,i=e=>t/2n**e,a=e/n;let o=0n;for(let e=0n;e<a;e++)o+=i(e)*n;return o+=e%n*i(a),String(o)})(this.blockHeight),Number(this.blockHeight)<84e4){const e=await import("/content/d36f3434809b4b4bed7da6c17d45fbb3e72b89d31f3334d9d34e168519b51bd9i0"),t=await e.getBitmapSat(Number(this.blockHeight)),n=await fetch(`/r/sat/${t}/at/-1`).then((e=>e.json()));try{const e=await fetch(`/r/metadata/${n.id}`).then((async e=>{if(e.ok)return await e.text();throw new Error(`${e.status} ${n.id} metadata not found`)})).then((e=>CBOR.decode(l(e.replace(/"/g,"")))));if(Number(e.blockHeight)===Number(this.blockHeight)&&(w=t,m)){window.selfInscriptionId=n.id,window.canCheckInventory=!0,window.selfSat=t;const e=await fetch(`/r/inscription/${n.id}`).then((e=>e.json()));window.ownerAddress=e.address}}catch(e){}}if((window.enableApp||window.enableRecursion)&&w){const e=await fetch(`/r/sat/${w}/at/-1`).then((e=>e.json()));let t=!0,n=0;try{if(e&&e.id)for(;t;){const i=await fetch(`/r/children/${e.id}/inscriptions/${n}`).then((e=>e.json()));t=i.more,f=f.concat(i.children),n+=1}}catch(e){}if(f.length>0){let e=!1;const t=m?0:797===this.parcelId?1:this.parcelId;for(let n=0+t;n<f.length+t;n++){const t=f[n];m?fetch(`/r/metadata/${t.id}`).then((async e=>{if(e.ok)return await e.text()})).then((e=>CBOR.decode(l(e.replace(/"/g,""))))).then((e=>{if(e&&e.parcelId){const n=Number(e.parcelId.split(":").pop());n in h||(h[n]=t.id)}})).catch((e=>{})):e||await fetch(`/r/metadata/${t.id}`).then((async e=>{if(e.ok)return await e.text()})).then((e=>CBOR.decode(l(e.replace(/"/g,""))))).then((async n=>{if(n&&n.parcelId){const i=Number(n.parcelId.split(":").pop());if(!(i in h)&&(h[i]=t.id,!m&&i===this.parcelId)){window.selfInscriptionId=t.id,window.selfSat=t.sat,window.canCheckInventory=!0,e=!0;const n=await fetch(`/r/inscription/${t.id}`).then((e=>e.json()));window.ownerAddress=n.address}}}))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:b}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{iframe3DRenderer:u,iframe3D:g}=await import("/content/3b7fd16da25b50dc8042cee1b0ef7947c4ef83993fb9c74420d24bec94824155i0");function E(e,t,n,i,a,o,s,r){const c=document.createElement("div");c.style.width="350px",c.style.height="350px",c.style.backgroundColor="transparent",c.style.border="0px",c.style.overflow="hidden";const d=document.createElement("iframe");d.style.overflow="hidden",d.style.width="350px",d.style.height="350px",d.style.border="0px",d.setAttribute("scrolling","no"),d.src=e.includes("http")?e:`/content/${e}`,c.appendChild(d);const l=r||130,h=new g(c);return h.position.set(t,n,i),h.rotation.set(a-Math.PI/2,o,s),h.scale.set(1/l,1/l,1/l),h}const{POSTPROCESSING:y}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),x=y.BloomEffect,R=y.EffectComposer,C=y.EffectPass,H=y.RenderPass,I=y.BlendFunction,T={headers:{Accept:"application/json"}},M=await fetch("/r/blockheight",T).then((e=>e.json())),v=await fetch(`/r/blockinfo/${M}`,T).then((e=>e.json())),S=Math.floor(v.transaction_count/2);await this.fetchData();const k=S<this.txList.length?this.txList[S].value:0;for(let e=0;e<this.txList.length;e++)this.txList[e].size=this.logTxSize(this.txList[e].value);let A=0;for(let e of this.txList)A+=e.size*e.size;let $=Math.ceil(Math.sqrt(A));this.mondrian=new MondrianLayout($,$),b.install({THREE:THREE});const N=window.innerWidth,L=window.innerHeight,B=new THREE.Clock;window.scene=new THREE.Scene;const P=new THREE.PerspectiveCamera(90,N/L,.01,1e3);P.position.set(0,$/1.6+2,0);const j=new u;j.setSize(N,L),document.getElementById("css3d").appendChild(j.domElement);const G=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!0,alpha:!0});G.setSize(N,L),G.shadowMap.enabled=!0,G.setClearColor(0,0),G.setPixelRatio(window.devicePixelRatio),G.shadowMap.type=THREE.PCFSoftShadowMap;let O=new THREE.HemisphereLight(16777215,0,2);window.scene.add(O);let D=new THREE.DirectionalLight(16777215,1);D.position.set(-10,100,-10),D.target.position.set(0,0,0),D.castShadow=!0,window.scene.add(D),document.getElementById("root").appendChild(G.domElement);const z=new b(P,G.domElement),W=new b(P,j.domElement);let F=13576336;this.blockHeight<84e4&&(F=16356896);const U=new THREE.MeshStandardMaterial({color:F,wireframe:!1}),q=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375});let Q=0;const X=f.length-1;let _=!1;for(let e=0;e<this.txList.length;e++){const t=this.mondrian.place(this.txList[e].size),n=.5*t.r,i=new THREE.Mesh(new THREE.BoxGeometry(.9*t.r,.2*t.r,.9*t.r),this.txList[e].value===k&&Q<=X?q:U);if(i.name="parcelBase",m&&h&&h[e])if(6!==t.r||_){let i=null;i=(e in h&&e in p&&p[e]&&p[e].length,new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}));const a=new THREE.Mesh(new THREE.BoxGeometry(.7*t.r,.25*t.r,.7*t.r),i);a.position.set(t.position.x-$/2+n,.1*t.r/2,t.position.y-$/2+n),window.scene.add(a)}else{const e=new THREE.Group;e.add(new E(window.parcelHighLight,t.position.x-$/2+n,.1*t.r+.35,t.position.y-$/2+n,0,0,0,70)),window.scene.add(e),_=!0}else if(null!==this.parcelId&&e===this.parcelId){const e=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),i=new THREE.Mesh(new THREE.BoxGeometry(.7*t.r,.25*t.r,.7*t.r),e);i.position.set(t.position.x-$/2+n,.1*t.r/2,t.position.y-$/2+n),window.scene.add(i)}this.txList[e].value===k&&(Q+=1),window.scene.add(i),i.position.set(t.position.x-$/2+n,.1*t.r/2,t.position.y-$/2+n)}const J=new R(G);J.addPass(new H(window.scene,P));const V=new x({blendFunction:I.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});J.addPass(new C(P,V)),G.render(window.scene,P),J.render();let K=!0;!function e(){const t=B.getDelta(),n=B.getElapsedTime(),i=z.update(t);W.update(t);K&&window.scene&&(V.intensity=1+1*Math.sin(n),J.render(),j.render(window.scene,P)),requestAnimationFrame(e),i&&(K=!0)}()}async fetchData(){const e=await fetch(this.txValueCache).then((e=>e.text()));if(e){let t=e.split(/\r?\n/);this.txList=new Array(t.length);for(let e=0;e<t.length;e++){let n=parseInt(t[e]);this.txList[e]={value:n}}}}logTxSize(e){if(0===e)return 1;let t=Math.ceil(Math.log10(e))-5;return Math.min(Number.MAX_SAFE_INTEGER,Math.max(1,t))}}