bump version beta 1

This commit is contained in:
Lloyd committed 2025-11-27 22:14:37 +00:00
1 parent 996209964d
commit 94f12a399d
4 files changed
+5 -5

No files matched your search

+1 -1
View File
@@ -1 +1 @@
__version__ = "1.0.5-beta"
__version__ = "1.0.5-beta-1"
@@ -1 +1 @@
@tailwind base;@tailwind components;@tailwind utilities;:root{--vt-c-white: #ffffff;--vt-c-white-soft: #f8f8f8;--vt-c-white-mute: #f2f2f2;--vt-c-black: #181818;--vt-c-black-soft: #222222;--vt-c-black-mute: #282828;--vt-c-indigo: #2c3e50;--vt-c-divider-light-1: rgba(60, 60, 60, .29);--vt-c-divider-light-2: rgba(60, 60, 60, .12);--vt-c-divider-dark-1: rgba(84, 84, 84, .65);--vt-c-divider-dark-2: rgba(84, 84, 84, .48);--vt-c-text-light-1: var(--vt-c-indigo);--vt-c-text-light-2: rgba(60, 60, 60, .66);--vt-c-text-dark-1: var(--vt-c-white);--vt-c-text-dark-2: rgba(235, 235, 235, .64)}:root{--color-background: var(--vt-c-white);--color-background-soft: var(--vt-c-white-soft);--color-background-mute: var(--vt-c-white-mute);--color-border: var(--vt-c-divider-light-2);--color-border-hover: var(--vt-c-divider-light-1);--color-heading: var(--vt-c-text-light-1);--color-text: var(--vt-c-text-light-1);--section-gap: 160px}@media (prefers-color-scheme: dark){:root{--color-background: var(--vt-c-black);--color-background-soft: var(--vt-c-black-soft);--color-background-mute: var(--vt-c-black-mute);--color-border: var(--vt-c-divider-dark-2);--color-border-hover: var(--vt-c-divider-dark-1);--color-heading: var(--vt-c-text-dark-1);--color-text: var(--vt-c-text-dark-2)}}*,*:before,*:after{box-sizing:border-box;margin:0;font-weight:400}body{min-height:100vh;color:var(--color-text);background:var(--color-background);transition:color .5s,background-color .5s;line-height:1.6;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:15px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Noto Sans,-apple-system,Roboto,Helvetica,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.Line truncated
@tailwind base;@tailwind components;@tailwind utilities;:root{--vt-c-white: #ffffff;--vt-c-white-soft: #f8f8f8;--vt-c-white-mute: #f2f2f2;--vt-c-black: #181818;--vt-c-black-soft: #222222;--vt-c-black-mute: #282828;--vt-c-indigo: #2c3e50;--vt-c-divider-light-1: rgba(60, 60, 60, .29);--vt-c-divider-light-2: rgba(60, 60, 60, .12);--vt-c-divider-dark-1: rgba(84, 84, 84, .65);--vt-c-divider-dark-2: rgba(84, 84, 84, .48);--vt-c-text-light-1: var(--vt-c-indigo);--vt-c-text-light-2: rgba(60, 60, 60, .66);--vt-c-text-dark-1: var(--vt-c-white);--vt-c-text-dark-2: rgba(235, 235, 235, .64)}:root{--color-background: var(--vt-c-white);--color-background-soft: var(--vt-c-white-soft);--color-background-mute: var(--vt-c-white-mute);--color-border: var(--vt-c-divider-light-2);--color-border-hover: var(--vt-c-divider-light-1);--color-heading: var(--vt-c-text-light-1);--color-text: var(--vt-c-text-light-1);--section-gap: 160px}@media (prefers-color-scheme: dark){:root{--color-background: var(--vt-c-black);--color-background-soft: var(--vt-c-black-soft);--color-background-mute: var(--vt-c-black-mute);--color-border: var(--vt-c-divider-dark-2);--color-border-hover: var(--vt-c-divider-dark-1);--color-heading: var(--vt-c-text-dark-1);--color-text: var(--vt-c-text-dark-2)}}*,*:before,*:after{box-sizing:border-box;margin:0;font-weight:400}body{min-height:100vh;color:var(--color-text);background:var(--color-background);transition:color .5s,background-color .5s;line-height:1.6;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:15px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Noto Sans,-apple-system,Roboto,Helvetica,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.Line truncated
@@ -42,7 +42,7 @@
inset 0 1px 0 rgba(255, 255, 255, 0.3),
inset 0 -1px 0 rgba(0, 0, 0, 0.2)
`})},[Ee("span",lnt,Qi(he.count),1)],4)]),Ee("div",unt,[Ee("div",cnt,Qi(he.name.replace(/\([^)]*\)/g,"").trim()),1)])]))),128))]))]),s.value.length>0?(_i(),zi("div",hnt," Total packet types: "+Qi(s.value.length)+" | Total packets: "+Qi(s.value.reduce((he,De)=>he+De.count,0)),1)):is("",!0)]))}}),dnt=ld(fnt,[["__scopeId","data-v-dc58fd68"]]),pnt={class:"glass-card rounded-[10px] p-6"},mnt={class:"relative h-48"},gnt={class:"mt-4 grid grid-cols-2 gap-4"},vnt={class:"text-center"},ynt={class:"text-2xl font-bold text-white"},xnt={class:"text-center"},_nt={class:"text-2xl font-bold text-white"},bnt={class:"mt-3 grid grid-cols-3 gap-3 text-center"},wnt={class:"text-sm font-semibold text-accent-purple"},knt={class:"text-sm font-semibold text-accent-red"},Tnt={class:"text-sm font-semibold text-white"},Ant=Dc({name:"PerformanceChart",__name:"PerformanceChart",setup(d){const s=sw(),E=Ga(null),B=Ga([]),K=Ga(null),pt=Ga(!0),_t=async()=>{try{pt.value=!0;const jt=await Ah.get("/recent_packets",{limit:50});if(!jt.success){B.value=[],pt.value=!1,om(()=>{Ot()});return}const te=jt.data||[],he=Date.now(),De=24,er=12,pr=De*60*60*1e3/er,Mr=[];for(let Tr=0;Tr<er;Tr++){const Vr=he-De*60*60*1e3+Tr*pr,mn=Vr+pr,Dt=te.filter(Bn=>{const ni=Bn.timestamp*1e3;return ni>=Vr&&ni<mn}),cn=Dt.filter(Bn=>!Bn.transmitted).length,Jn=Dt.filter(Bn=>Bn.transmitted).length;Mr.push({time:new Date(Vr+pr/2).toISOString(),rxPackets:cn,txPackets:Jn})}B.value=Mr,pt.value=!1,om(()=>{Ot()})}catch{B.value=[],pt.value=!1,om(()=>{Ot()})}},Ot=()=>{if(!E.value)return;const jt=E.value,te=jt.getContext("2d");if(!te)return;const he=jt.parentElement;if(!he)return;const De=he.getBoundingClientRect(),er=De.width,pr=De.height;jt.width=er*window.devicePixelRatio,jt.height=pr*window.devicePixelRatio,jt.style.width=er+"px",jt.style.height=pr+"px",te.scale(window.devicePixelRatio,window.devicePixelRatio);const Mr=20;if(te.clearRect(0,0,er,pr),pt.value){te.fillStyle="#666",te.font="16px sans-serif",te.textAlign="center",te.fillText("Loading chart data...",er/2,pr/2);return}if(B.value.length===0){te.fillStyle="#666",te.font="16px sans-serif",te.textAlign="center",te.fillText("No data available",er/2,pr/2);return}const Tr=B.value.every(Un=>Un.rxPackets===0&&Un.txPackets===0),Vr=er-Mr*2,mn=pr-Mr*2,Dt=B.value.flatMap(Un=>[Un.rxPackets,Un.txPackets]),cn=Math.min(...Dt),Jn=Math.max(...Dt),Bn=cn,ni=Jn,Wi=Math.max(ni-Bn,1);if(te.strokeStyle="rgba(255, 255, 255, 0.1)",te.lineWidth=1,Bn<=0&&ni>=0){te.strokeStyle="rgba(255, 255, 255, 0.3)",te.lineWidth=2;const Un=pr-Mr-(0-Bn)/Wi*mn;te.beginPath(),te.moveTo(Mr,Un),te.lineTo(er-Mr,Un),te.stroke(),Un>20&&Un<pr-20&&(te.fillStyle="rgba(255, 255, 255, 0.7)",te.font="10px system-ui",te.textAlign="left",te.fillText("0",Mr+2,Un-2)),te.strokeStyle="rgba(255, 255, 255, 0.1)",te.lineWidth=1}for(let Un=0;Un<=5;Un++){const qr=Mr+mn*Un/5;te.beginPath(),te.moveTo(Mr,qr),te.lineTo(er-Mr,qr),te.stroke()}for(let Un=0;Un<=6;Un++){const qr=Mr+Vr*Un/6;te.beginPath(),te.moveTo(qr,Mr),te.lineTo(qr,pr-Mr),te.stroke()}B.value.length>1&&(te.strokeStyle="#EBA0FC",te.lineWidth=2,te.beginPath(),B.value.forEach((Un,qr)=>{const Di=Mr+Vr*qr/(B.value.length-1),Fi=pr-Mr-(Un.rxPackets-Bn)/Wi*mn;qr===0?te.moveTo(Di,Fi):te.lineTo(Di,Fi)}),te.stroke(),te.fillStyle="#EBA0FC",B.value.forEach((Un,qr)=>{const Di=Mr+Vr*qr/(B.value.length-1),Fi=pr-Mr-(Un.rxPackets-Bn)/Wi*mn;te.beginPath(),te.arc(Di,Fi,2,0,2*Math.PI),te.fill()})),B.value.length>1&&(te.strokeStyle="#FB787B",te.lineWidth=2,te.beginPath(),B.value.forEach((Un,qr)=>{const Di=Mr+Vr*qr/(B.value.length-1),Fi=pr-Mr-(Un.txPackets-Bn)/Wi*mn;qr===0?te.moveTo(Di,Fi):te.lineTo(Di,Fi)}),te.stroke(),te.fillStyle="#FB787B",B.value.forEach((Un,qr)=>{const Di=Mr+Vr*qr/(B.value.length-1),Fi=pr-Mr-(Un.txPackets-Bn)/Wi*mn;te.beginPath(),te.arc(Di,Fi,2,0,2*Math.PI),te.fill()})),te.fillStyle="rgba(255, 255, 255, 0.6)",te.font="12px system-ui",te.textAlign="center",Tr&&(te.fillStyle="rgba(255, 255, 255, 0.6)",te.font="14px system-ui",te.textAlign="center",te.fillText("No packet activity in last 24 hours",er/2,pr-15))};return bp(()=>{_t(),K.value=window.setInterval(_t,3e4),om(()=>{Ot(),setTimeout(()=>{Ot()},100)}),window.addEventListener("resize",Ot)}),gg(()=>{K.value&&clearInterval(K.value),window.removeEventListener("resize",Ot)}),(jt,te)=>(_i(),zi("div",pnt,[te[5]||(te[5]=$f('<h3 class="text-white text-xl font-semibold mb-4" data-v-2ece57e8>Performance Metrics</h3><p class="text-white text-sm uppercase mb-4" data-v-2ece57e8>Packet Activity (Last 24 Hours)</p><div class="flex items-center gap-6 mb-4" data-v-2ece57e8><div class="flex items-center gap-2" data-v-2ece57e8><div class="w-7 h-2 rounded bg-accent-purple" data-v-2ece57e8></div><span class="text-white text-sm" data-v-2ece57e8>Received</span></div><div class="flex items-center gap-2" data-v-2ece57e8><div class="w-7 h-2 rounded bg-accent-red" data-v-2ece57e8></div><span class="text-white text-sm" data-v-2ece57e8>Transmitted</span></div></div>',3)),Ee("div",mnt,[Ee(" Line truncated
`)||Dt},he=(Dt,cn,Jn)=>{try{let Bn=0;const ni=cn.length/2;if(ni>=100){if(cn.length>=Bn+64){const Wi=cn.slice(Bn,Bn+64);Dt.push({name:"Public Key",byteRange:`${(Jn+Bn)/2}-${(Jn+Bn+63)/2}`,hexData:Wi.match(/.{8}/g)?.join(" ")||Wi,description:"Ed25519 public key of the node (32 bytes)",fields:[{bits:"0-255",name:"Ed25519 Public Key",value:`${Wi.slice(0,16)}...${Wi.slice(-16)}`,binary:"32 bytes (256 bits)"}]}),Bn+=64}if(cn.length>=Bn+8){const Wi=cn.slice(Bn,Bn+8),Un=parseInt(Wi,16),qr=new Date(Un*1e3);Dt.push({name:"Timestamp",byteRange:`${(Jn+Bn)/2}-${(Jn+Bn+7)/2}`,hexData:Wi.match(/.{2}/g)?.join(" ")||Wi,description:"Unix timestamp of advertisement",fields:[{bits:"0-31",name:"Unix Timestamp",value:`${Un} (${qr.toLocaleString()})`,binary:Un.toString(2).padStart(32,"0")}]}),Bn+=8}if(cn.length>=Bn+128){const Wi=cn.slice(Bn,Bn+128);Dt.push({name:"Signature",byteRange:`${(Jn+Bn)/2}-${(Jn+Bn+127)/2}`,hexData:Wi.match(/.{8}/g)?.join(" ")||Wi,description:"Ed25519 signature of public key, timestamp, and appdata",fields:[{bits:"0-511",name:"Ed25519 Signature",value:`${Wi.slice(0,16)}...${Wi.slice(-16)}`,binary:"64 bytes (512 bits)"}]}),Bn+=128}if(cn.length>Bn){const Wi=cn.slice(Bn);De(Dt,Wi,Jn+Bn)}}else Dt.push({name:"ADVERT AppData (Partial)",byteRange:`${Jn/2}-${Jn/2+ni-1}`,hexData:cn.match(/.{2}/g)?.join(" ")||cn,description:`Partial ADVERT data - appears to be just AppData portion (${ni} bytes)`,fields:[{bits:`0-${ni*8-1}`,name:"Partial Data",value:`${ni} bytes - attempting to decode as AppData`,binary:`${ni} bytes (${ni*8} bits)`}]}),De(Dt,cn,Jn)}catch(Bn){Dt.push({name:"ADVERT Parse Error",byteRange:"N/A",hexData:cn.slice(0,32)+"...",description:"Failed to parse ADVERT payload structure",fields:[{bits:"N/A",name:"Error",value:`Parse error: ${Bn instanceof Error?Bn.message:"Unknown error"}`,binary:"Invalid"}]})}},De=(Dt,cn,Jn)=>{try{const Bn=cn.length/2;Dt.push({name:"AppData",byteRange:`${Jn/2}-${Jn/2+Bn-1}`,hexData:cn.match(/.{2}/g)?.join(" ")||cn,description:`Node advertisement application data (${Bn} bytes)`,fields:[{bits:`0-${Bn*8-1}`,name:"Application Data",value:`${Bn} bytes (contains flags, location, name, etc.)`,binary:`${Bn} bytes (${Bn*8} bits)`}]});let ni=0;if(cn.length>=2){const Wi=parseInt(cn.slice(ni,ni+2),16),Un=[],qr=!!(Wi&16),Di=!!(Wi&32),Fi=!!(Wi&64),Pi=!!(Wi&128);if(Wi&1&&Un.push("is chat node"),Wi&2&&Un.push("is repeater"),Wi&4&&Un.push("is room server"),Wi&8&&Un.push("is sensor"),qr&&Un.push("has location"),Di&&Un.push("has feature 1"),Fi&&Un.push("has feature 2"),Pi&&Un.push("has name"),Dt.push({name:"AppData Flags",byteRange:`${(Jn+ni)/2}`,hexData:`0x${cn.slice(ni,ni+2)}`,description:"Flags indicating which optional fields are present",fields:[{bits:"0-7",name:"Flags",value:Un.join(", ")||"none",binary:Wi.toString(2).padStart(8,"0")}]}),ni+=2,qr&&cn.length>=ni+16){const bi=cn.slice(ni,ni+8),Yi=[];for(let xl=6;xl>=0;xl-=2)Yi.push(bi.slice(xl,xl+2));const Ca=parseInt(Yi.join(""),16),Ni=Ca>2147483647?Ca-4294967296:Ca,si=Ni/1e6,Ma=cn.slice(ni+8,ni+16),zo=[];for(let xl=6;xl>=0;xl-=2)zo.push(Ma.slice(xl,xl+2));const ho=parseInt(zo.join(""),16),mo=ho>2147483647?ho-4294967296:ho,Ts=mo/1e6;Dt.push({name:"Location Data",byteRange:`${(Jn+ni)/2}-${(Jn+ni+15)/2}`,hexData:`${bi.match(/.{2}/g)?.join(" ")||bi} ${Ma.match(/.{2}/g)?.join(" ")||Ma}`,description:"GPS coordinates (latitude and longitude)",fields:[{bits:"0-31",name:"Latitude",value:`${si.toFixed(6)}° (raw: ${Ni})`,binary:Ni.toString(2).padStart(32,"0")},{bits:"32-63",name:"Longitude",value:`${Ts.toFixed(6)}° (raw: ${mo})`,binary:mo.toString(2).padStart(32,"0")}]}),ni+=16}if(Di&&cn.length>=ni+4){const bi=cn.slice(ni,ni+4),Yi=parseInt(bi,16);Dt.push({name:"Feature 1",byteRange:`${(Jn+ni)/2}-${(Jn+ni+3)/2}`,hexData:bi.match(/.{2}/g)?.join(" ")||bi,description:"Reserved feature 1 (2 bytes)",fields:[{bits:"0-15",name:"Feature 1 Value",value:`${Yi}`,binary:Yi.toString(2).padStart(16,"0")}]}),ni+=4}if(Fi&&cn.length>=ni+4){const bi=cn.slice(ni,ni+4),Yi=parseInt(bi,16);Dt.push({name:"Feature 2",byteRange:`${(Jn+ni)/2}-${(Jn+ni+3)/2}`,hexData:bi.match(/.{2}/g)?.join(" ")||bi,description:"Reserved feature 2 (2 bytes)",fields:[{bits:"0-15",name:"Feature 2 Value",value:`${Yi}`,binary:Yi.toString(2).padStart(16,"0")}]}),ni+=4}if(Pi&&cn.length>ni){const bi=cn.slice(ni),Yi=bi.match(/.{2}/g)||[],Ca=Yi.map(Ni=>{const si=parseInt(Ni,16);return si>=32&&si<=126?String.fromCharCode(si):"."}).join("").replace(/\.+$/,"");Dt.push({name:"Node Name",byteRange:`${(Jn+ni)/2}-${(Jn+cn.length-1)/2}`,hexData:bi.match(/.{2}/g)?.join(" ")||bi,description:`Node name string (${Yi.length} bytes)`,fields:[{bits:`0-${Yi.length*8-1}`,name:"Node Name",value:`"${Ca}"`,binary:`ASCII text (${Yi.length} bytes)`}]})}}}catch(Bn){Dt.push({name:"AppData Parse Error",byteRange:"N/A",hexData:cn.slice(0,Math.min(32,cn.length)),description:"Failed to parse AppData structure",fields:[{bits:"N/A",name:"Error",value:`Parse error: ${Bn instanceof Error?Bn.message:"Unknown error"}`,binary:"Invalid"} Line truncated
`)||Dt},he=(Dt,cn,Jn)=>{try{let Bn=0;const ni=cn.length/2;if(ni>=100){if(cn.length>=Bn+64){const Wi=cn.slice(Bn,Bn+64);Dt.push({name:"Public Key",byteRange:`${(Jn+Bn)/2}-${(Jn+Bn+63)/2}`,hexData:Wi.match(/.{8}/g)?.join(" ")||Wi,description:"Ed25519 public key of the node (32 bytes)",fields:[{bits:"0-255",name:"Ed25519 Public Key",value:`${Wi.slice(0,16)}...${Wi.slice(-16)}`,binary:"32 bytes (256 bits)"}]}),Bn+=64}if(cn.length>=Bn+8){const Wi=cn.slice(Bn,Bn+8),Un=parseInt(Wi,16),qr=new Date(Un*1e3);Dt.push({name:"Timestamp",byteRange:`${(Jn+Bn)/2}-${(Jn+Bn+7)/2}`,hexData:Wi.match(/.{2}/g)?.join(" ")||Wi,description:"Unix timestamp of advertisement",fields:[{bits:"0-31",name:"Unix Timestamp",value:`${Un} (${qr.toLocaleString()})`,binary:Un.toString(2).padStart(32,"0")}]}),Bn+=8}if(cn.length>=Bn+128){const Wi=cn.slice(Bn,Bn+128);Dt.push({name:"Signature",byteRange:`${(Jn+Bn)/2}-${(Jn+Bn+127)/2}`,hexData:Wi.match(/.{8}/g)?.join(" ")||Wi,description:"Ed25519 signature of public key, timestamp, and appdata",fields:[{bits:"0-511",name:"Ed25519 Signature",value:`${Wi.slice(0,16)}...${Wi.slice(-16)}`,binary:"64 bytes (512 bits)"}]}),Bn+=128}if(cn.length>Bn){const Wi=cn.slice(Bn);De(Dt,Wi,Jn+Bn)}}else Dt.push({name:"ADVERT AppData (Partial)",byteRange:`${Jn/2}-${Jn/2+ni-1}`,hexData:cn.match(/.{2}/g)?.join(" ")||cn,description:`Partial ADVERT data - appears to be just AppData portion (${ni} bytes)`,fields:[{bits:`0-${ni*8-1}`,name:"Partial Data",value:`${ni} bytes - attempting to decode as AppData`,binary:`${ni} bytes (${ni*8} bits)`}]}),De(Dt,cn,Jn)}catch(Bn){Dt.push({name:"ADVERT Parse Error",byteRange:"N/A",hexData:cn.slice(0,32)+"...",description:"Failed to parse ADVERT payload structure",fields:[{bits:"N/A",name:"Error",value:`Parse error: ${Bn instanceof Error?Bn.message:"Unknown error"}`,binary:"Invalid"}]})}},De=(Dt,cn,Jn)=>{try{const Bn=cn.length/2;Dt.push({name:"AppData",byteRange:`${Jn/2}-${Jn/2+Bn-1}`,hexData:cn.match(/.{2}/g)?.join(" ")||cn,description:`Node advertisement application data (${Bn} bytes)`,fields:[{bits:`0-${Bn*8-1}`,name:"Application Data",value:`${Bn} bytes (contains flags, location, name, etc.)`,binary:`${Bn} bytes (${Bn*8} bits)`}]});let ni=0;if(cn.length>=2){const Wi=parseInt(cn.slice(ni,ni+2),16),Un=[],qr=!!(Wi&16),Di=!!(Wi&32),Fi=!!(Wi&64),Pi=!!(Wi&128);if(Wi&1&&Un.push("is chat node"),Wi&2&&Un.push("is repeater"),Wi&4&&Un.push("is room server"),Wi&8&&Un.push("is sensor"),qr&&Un.push("has location"),Di&&Un.push("has feature 1"),Fi&&Un.push("has feature 2"),Pi&&Un.push("has name"),Dt.push({name:"AppData Flags",byteRange:`${(Jn+ni)/2}`,hexData:`0x${cn.slice(ni,ni+2)}`,description:"Flags indicating which optional fields are present",fields:[{bits:"0-7",name:"Flags",value:Un.join(", ")||"none",binary:Wi.toString(2).padStart(8,"0")}]}),ni+=2,qr&&cn.length>=ni+16){const bi=cn.slice(ni,ni+8),Yi=[];for(let xl=6;xl>=0;xl-=2)Yi.push(bi.slice(xl,xl+2));const Ca=parseInt(Yi.join(""),16),Ni=Ca>2147483647?Ca-4294967296:Ca,si=Ni/1e6,Ma=cn.slice(ni+8,ni+16),zo=[];for(let xl=6;xl>=0;xl-=2)zo.push(Ma.slice(xl,xl+2));const ho=parseInt(zo.join(""),16),mo=ho>2147483647?ho-4294967296:ho,Ts=mo/1e6;Dt.push({name:"Location Data",byteRange:`${(Jn+ni)/2}-${(Jn+ni+15)/2}`,hexData:`${bi.match(/.{2}/g)?.join(" ")||bi} ${Ma.match(/.{2}/g)?.join(" ")||Ma}`,description:"GPS coordinates (latitude and longitude)",fields:[{bits:"0-31",name:"Latitude",value:`${si.toFixed(6)}° (raw: ${Ni})`,binary:Ni.toString(2).padStart(32,"0")},{bits:"32-63",name:"Longitude",value:`${Ts.toFixed(6)}° (raw: ${mo})`,binary:mo.toString(2).padStart(32,"0")}]}),ni+=16}if(Di&&cn.length>=ni+4){const bi=cn.slice(ni,ni+4),Yi=parseInt(bi,16);Dt.push({name:"Feature 1",byteRange:`${(Jn+ni)/2}-${(Jn+ni+3)/2}`,hexData:bi.match(/.{2}/g)?.join(" ")||bi,description:"Reserved feature 1 (2 bytes)",fields:[{bits:"0-15",name:"Feature 1 Value",value:`${Yi}`,binary:Yi.toString(2).padStart(16,"0")}]}),ni+=4}if(Fi&&cn.length>=ni+4){const bi=cn.slice(ni,ni+4),Yi=parseInt(bi,16);Dt.push({name:"Feature 2",byteRange:`${(Jn+ni)/2}-${(Jn+ni+3)/2}`,hexData:bi.match(/.{2}/g)?.join(" ")||bi,description:"Reserved feature 2 (2 bytes)",fields:[{bits:"0-15",name:"Feature 2 Value",value:`${Yi}`,binary:Yi.toString(2).padStart(16,"0")}]}),ni+=4}if(Pi&&cn.length>ni){const bi=cn.slice(ni),Yi=bi.match(/.{2}/g)||[],Ca=Yi.map(Ni=>{const si=parseInt(Ni,16);return si>=32&&si<=126?String.fromCharCode(si):"."}).join("").replace(/\.+$/,"");Dt.push({name:"Node Name",byteRange:`${(Jn+ni)/2}-${(Jn+cn.length-1)/2}`,hexData:bi.match(/.{2}/g)?.join(" ")||bi,description:`Node name string (${Yi.length} bytes)`,fields:[{bits:`0-${Yi.length*8-1}`,name:"Node Name",value:`"${Ca}"`,binary:`ASCII text (${Yi.length} bytes)`}]})}}}catch(Bn){Dt.push({name:"AppData Parse Error",byteRange:"N/A",hexData:cn.slice(0,Math.min(32,cn.length)),description:"Failed to parse AppData structure",fields:[{bits:"N/A",name:"Error",value:`Parse error: ${Bn instanceof Error?Bn.message:"Unknown error"}`,binary:"Invalid"} Line truncated
* Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com
* (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade
*/var wot=g2.exports,QL;function kot(){return QL||(QL=1,function(d,s){(function(E,B){B(s)})(wot,function(E){var B="1.9.4";function K(ct){var Bt,me,Qe,zr;for(me=1,Qe=arguments.length;me<Qe;me++){zr=arguments[me];for(Bt in zr)ct[Bt]=zr[Bt]}return ct}var pt=Object.create||function(){function ct(){}return function(Bt){return ct.prototype=Bt,new ct}}();function _t(ct,Bt){var me=Array.prototype.slice;if(ct.bind)return ct.bind.apply(ct,me.call(arguments,1));var Qe=me.call(arguments,2);return function(){return ct.apply(Bt,Qe.length?Qe.concat(me.call(arguments)):arguments)}}var Ot=0;function jt(ct){return"_leaflet_id"in ct||(ct._leaflet_id=++Ot),ct._leaflet_id}function te(ct,Bt,me){var Qe,zr,An,qi;return qi=function(){Qe=!1,zr&&(An.apply(me,zr),zr=!1)},An=function(){Qe?zr=arguments:(ct.apply(me,arguments),setTimeout(qi,Bt),Qe=!0)},An}function he(ct,Bt,me){var Qe=Bt[1],zr=Bt[0],An=Qe-zr;return ct===Qe&&me?ct:((ct-zr)%An+An)%An+zr}function De(){return!1}function er(ct,Bt){if(Bt===!1)return ct;var me=Math.pow(10,Bt===void 0?6:Bt);return Math.round(ct*me)/me}function pr(ct){return ct.trim?ct.trim():ct.replace(/^\s+|\s+$/g,"")}function Mr(ct){return pr(ct).split(/\s+/)}function Tr(ct,Bt){Object.prototype.hasOwnProperty.call(ct,"options")||(ct.options=ct.options?pt(ct.options):{});for(var me in Bt)ct.options[me]=Bt[me];return ct.options}function Vr(ct,Bt,me){var Qe=[];for(var zr in ct)Qe.push(encodeURIComponent(me?zr.toUpperCase():zr)+"="+encodeURIComponent(ct[zr]));return(!Bt||Bt.indexOf("?")===-1?"?":"&")+Qe.join("&")}var mn=/\{ *([\w_ -]+) *\}/g;function Dt(ct,Bt){return ct.replace(mn,function(me,Qe){var zr=Bt[Qe];if(zr===void 0)throw new Error("No value provided for variable "+me);return typeof zr=="function"&&(zr=zr(Bt)),zr})}var cn=Array.isArray||function(ct){return Object.prototype.toString.call(ct)==="[object Array]"};function Jn(ct,Bt){for(var me=0;me<ct.length;me++)if(ct[me]===Bt)return me;return-1}var Bn="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function ni(ct){return window["webkit"+ct]||window["moz"+ct]||window["ms"+ct]}var Wi=0;function Un(ct){var Bt=+new Date,me=Math.max(0,16-(Bt-Wi));return Wi=Bt+me,window.setTimeout(ct,me)}var qr=window.requestAnimationFrame||ni("RequestAnimationFrame")||Un,Di=window.cancelAnimationFrame||ni("CancelAnimationFrame")||ni("CancelRequestAnimationFrame")||function(ct){window.clearTimeout(ct)};function Fi(ct,Bt,me){if(me&&qr===Un)ct.call(Bt);else return qr.call(window,_t(ct,Bt))}function Pi(ct){ct&&Di.call(window,ct)}var bi={__proto__:null,extend:K,create:pt,bind:_t,get lastId(){return Ot},stamp:jt,throttle:te,wrapNum:he,falseFn:De,formatNum:er,trim:pr,splitWords:Mr,setOptions:Tr,getParamString:Vr,template:Dt,isArray:cn,indexOf:Jn,emptyImageUrl:Bn,requestFn:qr,cancelFn:Di,requestAnimFrame:Fi,cancelAnimFrame:Pi};function Yi(){}Yi.extend=function(ct){var Bt=function(){Tr(this),this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()},me=Bt.__super__=this.prototype,Qe=pt(me);Qe.constructor=Bt,Bt.prototype=Qe;for(var zr in this)Object.prototype.hasOwnProperty.call(this,zr)&&zr!=="prototype"&&zr!=="__super__"&&(Bt[zr]=this[zr]);return ct.statics&&K(Bt,ct.statics),ct.includes&&(Ca(ct.includes),K.apply(null,[Qe].concat(ct.includes))),K(Qe,ct),delete Qe.statics,delete Qe.includes,Qe.options&&(Qe.options=me.options?pt(me.options):{},K(Qe.options,ct.options)),Qe._initHooks=[],Qe.callInitHooks=function(){if(!this._initHooksCalled){me.callInitHooks&&me.callInitHooks.call(this),this._initHooksCalled=!0;for(var An=0,qi=Qe._initHooks.length;An<qi;An++)Qe._initHooks[An].call(this)}},Bt},Yi.include=function(ct){var Bt=this.prototype.options;return K(this.prototype,ct),ct.options&&(this.prototype.options=Bt,this.mergeOptions(ct.options)),this},Yi.mergeOptions=function(ct){return K(this.prototype.options,ct),this},Yi.addInitHook=function(ct){var Bt=Array.prototype.slice.call(arguments,1),me=typeof ct=="function"?ct:function(){this[ct].apply(this,Bt)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(me),this};function Ca(ct){if(!(typeof L>"u"||!L||!L.Mixin)){ct=cn(ct)?ct:[ct];for(var Bt=0;Bt<ct.length;Bt++)ct[Bt]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",new Error().stack)}}var Ni={on:function(ct,Bt,me){if(typeof ct=="object")for(var Qe in ct)this._on(Qe,ct[Qe],Bt);else{ct=Mr(ct);for(var zr=0,An=ct.length;zr<An;zr++)this._on(ct[zr],Bt,me)}return this},off:function(ct,Bt,me){if(!arguments.length)delete this._events;else if(typeof ct=="object")for(var Qe in ct)this._off(Qe,ct[Qe],Bt);else{ct=Mr(ct);for(var zr=arguments.length===1,An=0,qi=ct.length;An<qi;An++)zr?this._off(ct[An]):this._off(ct[An],Bt,me)}return this},_on:function(ct,Bt,me,Qe){if(typeof Bt!="function"){console.warn("wrong listener type: "+typeof Bt);return}if(this._listens(ct,Bt,me)===!1){me===this&&(me=void 0);var zr={fn:Bt,ctx:me};Qe&Line truncated
+2 -2
View File
@@ -8,8 +8,8 @@
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<script type="module" crossorigin src="/assets/index-_Dem5-aE.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-Ceeo6dki.css">
<script type="module" crossorigin src="/assets/index-r2jdFy7f.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-Dmg9lJJT.css">
</head>
<body>
<div id="app"></div>