class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t=await fetch("/r/sat/717782964543142/at/-1").then((t=>t.json())),e=await fetch(`/content/${t.id}`).then((async t=>atob(await t.text()))),i=await fetch("/r/sat/717782965085693/at/-1").then((t=>t.json())),n=await fetch(`/content/${i.id}`).then((async t=>JSON.parse(decodeURIComponent(escape(atob(await t.text()))))));window.enableApp=window.fullScreen||window.innerWidth==screen.width||window.innerWidth>=n.enableApp&&screen.width>=n.enableApp,window.enableRecursion=window.innerWidth>=n.enableRecursion&&screen.width>=n.enableRecursion,window.tipSatAmount=n.tipSatAmount,window.parcelHighLight=n.parcelHighLight,window.enableQG=n.enableQG;const o=!(!window.enableQG||!window.enableApp||!window.ethereum&&!window.XverseProviders),s=o&&await fetch("/r/sat/717782964480455/at/-1").then((t=>t.json())),a=o&&await fetch(`/content/${s.id}`).then((async t=>JSON.parse(decodeURIComponent(escape(atob(await t.text()))))));if(window.tipCreator=o&&n.tipCreator,window.ethContracAbi=o&&a.ethContracAbi,o){const t=await fetch("/r/sat/717782964530533/at/-1").then((t=>t.json())),i=await fetch(`/content/${t.id}`),s=document.createElement("script");s.innerHTML=decodeURIComponent(escape(atob(await i.text()))),document.body.appendChild(s);const r=o&&await fetch("/r/sat/717782965080554/at/-1").then((t=>t.json())),h=o&&await fetch(`/content/${r.id}`),l=o&&document.createElement("script");l.innerHTML=decodeURIComponent(escape(atob(await h.text()))),document.body.appendChild(l),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 metaverse property (inscribed on Nakamoto rare sats) lives forever on Bitcoin!>This 100% onchain asset is a key to the future of the BTC metaverse.>${window.enableQG?"It links Bitcoin and Ethereum blockchains using their shared elliptic curve, SECP256K1.>In this brave new orange world on Blocks of Bitcoin, you can be the first ones to mine Quark20 ($Q)!":""}`,window.ethContractAddress=n.evm[e].contractAddress,window.targetChainName=a.evm[e].chainName,window.ethMsg=`You are verified on Bitcoin. Verifying on ${window.targetChainName} via elliptic curve SECP256K1...`,window.quark20Msg=n.quark20Msg,window.targetChainId=a.evm[e].id,window.targetChainRPC=a.evm[e].rpc,window.targetChainExplorer=a.evm[e].explorer,window.targetChainCurrencyName=a.evm[e].currencyName,window.targetChainCurrencySymbol=a.evm[e].currencySymbol,initGate()}const r=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),h=document.createElement("script");h.innerHTML=await r.text(),document.body.appendChild(h);const l=document.createElement("div");function d(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}l.setAttribute("id","css3d"),document.body.appendChild(l),document.getElementById("css3d").style="margin: 0; overflow: hidden; position: absolute; top: 0px;";const c={};let w=null,p={},f=[],m=!1;window.selfInscriptionId,window.canCheckInventory=!1,null!==this.parcelId||(m=!0);if(w=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,n=t=>e/2n**t,o=t/i;let s=0n;for(let t=0n;t<o;t++)s+=n(t)*i;return s+=t%i*n(o),String(s)})(this.blockHeight),Number(this.blockHeight)<84e4){const t=await import("/content/d36f3434809b4b4bed7da6c17d45fbb3e72b89d31f3334d9d34e168519b51bd9i0"),e=await t.getBitmapSat(Number(this.blockHeight)),i=await fetch(`/r/sat/${e}/at/-1`).then((t=>t.json()));try{const t=await fetch(`/r/metadata/${i.id}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${i.id} metadata not found`)})).then((t=>CBOR.decode(d(t.replace(/"/g,"")))));if(Number(t.blockHeight)===Number(this.blockHeight)&&(w=e,m)){window.selfInscriptionId=i.id,window.canCheckInventory=!0,window.selfSat=e;const t=await fetch(`/r/inscription/${i.id}`).then((t=>t.json()));window.ownerAddress=t.address}}catch(t){}}if((window.enableApp||window.enableRecursion)&&w){const t=await fetch(`/r/sat/${w}/at/-1`).then((t=>t.json()));let e=!0,i=0;try{if(t&&t.id)for(;e;){const n=await fetch(`/r/children/${t.id}/inscriptions/${i}`).then((t=>t.json()));e=n.more,f=f.concat(n.children),i+=1}}catch(t){}if(f.length>0){let t=!1;const e=m?0:797===this.parcelId?1:this.parcelId;for(let i=0+e;i<f.length+e;i++){const e=f[i];m?fetch(`/r/metadata/${e.id}`).then((async t=>{if(t.ok)return await t.text()})).then((t=>CBOR.decode(d(t.replace(/"/g,""))))).then((t=>{if(t&&t.parcelId){const i=Number(t.parcelId.split(":").pop());i in c||(c[i]=e.id)}})).catch((t=>{})):t||await fetch(`/r/metadata/${e.id}`).then((async t=>{if(t.ok)return await t.text()})).then((t=>CBOR.decode(d(t.replace(/"/g,""))))).then((async i=>{if(i&&i.parcelId){const n=Number(i.parcelId.split(":").pop());if(!(n in c)&&(c[n]=e.id,!m&&n===this.parcelId)){window.selfInscriptionId=e.id,window.selfSat=e.sat,window.canCheckInventory=!0,t=!0;const i=await fetch(`/r/inscription/${e.id}`).then((t=>t.json()));window.ownerAddress=i.address}}}))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:u}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{iframe3DRenderer:x,iframe3D:g}=await import("/content/3b7fd16da25b50dc8042cee1b0ef7947c4ef83993fb9c74420d24bec94824155i0");function b(t,e,i,n,o,s,a,r){const h=document.createElement("div");h.style.width="350px",h.style.height="350px",h.style.backgroundColor="transparent",h.style.border="0px",h.style.overflow="hidden";const l=document.createElement("iframe");l.style.overflow="hidden",l.style.width="350px",l.style.height="350px",l.style.border="0px",l.setAttribute("scrolling","no"),l.src=t.includes("http")?t:`/content/${t}`,h.appendChild(l);const d=r||130,c=new g(h);return c.position.set(e,i,n),c.rotation.set(o-Math.PI/2,s,a),c.scale.set(1/d,1/d,1/d),c}const{POSTPROCESSING:y}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),E=y.BloomEffect,R=y.EffectComposer,M=y.EffectPass,C=y.RenderPass,S=y.BlendFunction,I={headers:{Accept:"application/json"}},H=await fetch("/r/blockheight",I).then((t=>t.json())),v=await fetch(`/r/blockinfo/${H}`,I).then((t=>t.json())),T=Math.floor(v.transaction_count/2);await this.fetchData();const k=T<this.txList.length?this.txList[T].value:0;for(let t=0;t<this.txList.length;t++)this.txList[t].size=this.logTxSize(this.txList[t].value);let $=0;for(let t of this.txList)$+=t.size*t.size;let A=Math.ceil(Math.sqrt($));this.mondrian=new MondrianLayout(A,A),u.install({THREE:THREE});const N=window.innerWidth,L=window.innerHeight,B=new THREE.Clock,P=new THREE.Scene,O=new THREE.PerspectiveCamera(90,N/L,.01,1e3);O.position.set(0,A/1.6+2,0);const j=new x;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 z=new THREE.HemisphereLight(16777215,0,2);P.add(z);let D=new THREE.DirectionalLight(16777215,1);D.position.set(-10,100,-10),D.target.position.set(0,0,0),D.castShadow=!0,P.add(D),document.getElementById("root").appendChild(G.domElement);const Q=new u(O,G.domElement),W=new u(O,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 K=0;const V=f.length-1;let X=!1;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===k&&K<=V?q:U);if(m&&c&&c[t])if(6!==e.r||X){let n=null;n=(t in c&&t in p&&p[t]&&p[t].length,new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}));const o=new THREE.Mesh(new THREE.BoxGeometry(.7*e.r,.25*e.r,.7*e.r),n);o.position.set(e.position.x-A/2+i,.1*e.r/2,e.position.y-A/2+i),P.add(o)}else{const t=new THREE.Group;t.add(new b(window.parcelHighLight,e.position.x-A/2+i,.1*e.r+.35,e.position.y-A/2+i,0,0,0,70)),P.add(t),X=!0}else if(null!==this.parcelId&&t===this.parcelId){const t=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),n=new THREE.Mesh(new THREE.BoxGeometry(.7*e.r,.25*e.r,.7*e.r),t);n.position.set(e.position.x-A/2+i,.1*e.r/2,e.position.y-A/2+i),P.add(n)}this.txList[t].value===k&&(K+=1),P.add(n),n.position.set(e.position.x-A/2+i,.1*e.r/2,e.position.y-A/2+i)}const _=new R(G);_.addPass(new C(P,O));const J=new E({blendFunction:S.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});_.addPass(new M(O,J)),G.render(P,O),_.render();let Y=!0;!function t(){const e=B.getDelta(),i=B.getElapsedTime(),n=Q.update(e);W.update(e);Y&&(J.intensity=1+1*Math.sin(i),_.render(),j.render(P,O)),requestAnimationFrame(t),n&&(Y=!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}}}}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 n=t.position.y;n<i.top;n++){let o=this.getRow({x:t.position.x,y:n});if(null!==o){let s=[],a=0;for(let e of o.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));a=Math.max(a,i)}i.right<this.width&&!o.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:n},r:t.r-e+a});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:n},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:n},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let n=this.getRow({x:t.position.x,y:i});if(null!==n)for(let i=0;i<n.slots.length;i++){let o=n.slots[i];if(o.position.x<t.position.x+e&&o.position.x+o.r>t.position.x&&o.position.y+o.r>=t.position.y){let e=o.r;o.r=t.position.y-o.position.y;let i={x:o.position.x+o.r,y:o.position.y,width:e-o.r,height:o.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,n=null;for(let e of this.rows){for(let o of e.slots)if(o.r>=t){i=!0,n=this.fillSlot(o,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});n=this.fillSlot(i,t)}for(let t=0;t<n.r;t++)for(let i=0;i<n.r;i++)this.setTxMapCell({x:n.position.x+t,y:n.position.y+i},e);return n.position.x+n.r>this.xMax&&(this.xMax=n.position.x+n.r),n.position.y+n.r>this.yMax&&(this.yMax=n.position.y+n.r),n}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let n=i*this.width+t.x;n>=0&&n<this.txMap.length&&(this.txMap[n]=e)}}}