From b2e84cdeb5016b978b465ef8502c784e62da004b Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot Date: Mon, 2 Feb 2026 23:48:22 +0000 Subject: [PATCH] Sync build v0.9.213 Automated sync from private repository. Commit: f4d2237260720cc0060b7bc0e39a079729ae3831 --- frontend/dist/VERSION | 2 +- ...{BasemapLayer-B5scdheQ.js => BasemapLayer-C9wiTbJT.js} | 2 +- .../dist/assets/{Card-BiYlryJL.js => Card-CCBguhJs.js} | 2 +- ...dal-CX6f3IBB.js => CollisionExplorerModal-BmT8XQYy.js} | 2 +- ...onfiguration-Df5yvVwq.js => Configuration-Bh26u4ks.js} | 2 +- ...{ConfirmModal-OyBnZ1Rq.js => ConfirmModal-flvCJ5X5.js} | 2 +- frontend/dist/assets/Contacts-DHVYuXFa.js | 2 ++ frontend/dist/assets/Contacts-hCqb2-UP.js | 2 -- frontend/dist/assets/ContactsMapMapLibre-BVr13QqT.js | 1 - frontend/dist/assets/ContactsMapMapLibre-Cpb6Sk8-.js | 1 + frontend/dist/assets/Dashboard-BSUVzNBC.js | 1 - frontend/dist/assets/Dashboard-Hxpnr4og.js | 1 + .../assets/{DataBox-BuwfTaKv.js => DataBox-Bl0vntck.js} | 2 +- ...sisModal-Ckyyxl1o.js => DeepAnalysisModal-DSV1q_wY.js} | 2 +- .../dist/assets/{Grid-TNw012c2.js => Grid-BVGRgue6.js} | 2 +- .../dist/assets/{Login-X6H6_R2y.js => Login-DJBcf-C6.js} | 2 +- .../dist/assets/{Logs-C-eWV8pL.js => Logs-C6iBCeIs.js} | 2 +- .../{MeshGraph-CbZRxc5R.js => MeshGraph-jA9fGpu6.js} | 2 +- ...belTest-9WwHSZHg.js => MeshGraphLabelTest-Cv3ODNn6.js} | 2 +- ...onCard-D_WIPYcK.js => NodeInformationCard-CJnzzUo0.js} | 2 +- frontend/dist/assets/PacketList-C0Zwn6jt.js | 2 -- frontend/dist/assets/PacketList-DSZP-sF4.js | 2 ++ frontend/dist/assets/Packets-5FmM_VMr.js | 1 + frontend/dist/assets/Packets-9uyPWOef.js | 1 - .../{PageLayout-Dz1NyqHa.js => PageLayout-B53JpmK1.js} | 2 +- frontend/dist/assets/PathMapMapLibre-CFZlE15b.js | 1 + frontend/dist/assets/PathMapMapLibre-DyVKbFr_.js | 1 - frontend/dist/assets/SignalIndicator-CBL6VSNS.js | 1 + frontend/dist/assets/SignalIndicator-FtRKgdkw.js | 1 - frontend/dist/assets/Statistics-B9XmGE0m.js | 1 - frontend/dist/assets/Statistics-CGJSoMIn.js | 1 + frontend/dist/assets/System-CNFICQV5.js | 1 - frontend/dist/assets/System-bU7CQZPd.js | 1 + frontend/dist/assets/Terminal-4b8EQwTz.js | 1 - frontend/dist/assets/Terminal-CFdtTKrf.js | 1 + frontend/dist/assets/TimeRangeSelector-C89_yLwH.js | 1 + frontend/dist/assets/TimeRangeSelector-CDHWyMqL.js | 1 - frontend/dist/assets/activity-Cb8TQBuo.js | 1 + .../assets/{arrow-up-Bv56Dbd2.js => arrow-up-DysUUcGL.js} | 2 +- frontend/dist/assets/chevron-right-CZNwXWtt.js | 1 + frontend/dist/assets/chevron-right-CchtyLvr.js | 1 - frontend/dist/assets/chevron-up-Cn6bmTpb.js | 1 - ...{circle-check-BQrKpAc_.js => circle-check-CKXuJpMJ.js} | 2 +- .../assets/{compass-ipowibkG.js => compass-Bsfx4e84.js} | 2 +- frontend/dist/assets/decryption.worker-C84ax0zu.js | 1 + .../{git-branch-CU4ha9LK.js => git-branch-Cev-c9BQ.js} | 2 +- .../dist/assets/{house-BPemXMFi.js => house-D2cJ2w9-.js} | 2 +- frontend/dist/assets/index-BKfnA8uz.js | 1 - frontend/dist/assets/index-CZBrdv20.js | 2 -- frontend/dist/assets/index-D22MpaCY.js | 2 ++ frontend/dist/assets/index-DVRwteP8.css | 1 - frontend/dist/assets/index-DWq9tBbL.css | 1 + frontend/dist/assets/index-bDa2a9Y2.js | 1 + .../dist/assets/{info-pu09_Xxl.js => info-BojcGhYE.js} | 2 +- ...{link-scoring-BY8TYwtV.js => link-scoring-BnkyjnFT.js} | 2 +- ...oader-circle-BLG0SL8e.js => loader-circle-2q9lT2qG.js} | 2 +- .../assets/{map-pin-BnrkOs2D.js => map-pin-kiJDSdn0.js} | 2 +- .../assets/{network-Did0WXxt.js => network-Dz5VqBhN.js} | 2 +- frontend/dist/assets/packet-CCmg5Y4j.js | 1 - frontend/dist/assets/payload-decoders-B_w2m9Or.js | 1 + .../dist/assets/{ping-DAjkGztv.js => ping-o6tDyVoV.js} | 2 +- .../{refresh-cw-B42SG81L.js => refresh-cw-BtHqSStQ.js} | 2 +- .../dist/assets/{route-CHkUVMnV.js => route-ExVvvUtv.js} | 2 +- .../assets/{target-5KyqyCil.js => target-BlWNMuhi.js} | 2 +- .../{trending-up-xQoBxaWx.js => trending-up-D5ntwkR1.js} | 2 +- ...angle-alert-DlaBoont.js => triangle-alert-TfoZuZfW.js} | 2 +- .../{usePolling-ZH_j5bYw.js => usePolling-XMUhKpB6.js} | 2 +- ...ThemeColors-CzhUM4y-.js => useThemeColors-S-uaxvPT.js} | 2 +- .../dist/assets/{users-DbmAVTAI.js => users-dFI4fg5G.js} | 2 +- .../{vendor-core-Dhs13Wlh.js => vendor-core-CDrKesoV.js} | 2 +- frontend/dist/assets/vendor-react-Cwum97tW.js | 2 ++ frontend/dist/assets/vendor-react-DFCqJxYC.js | 2 -- frontend/dist/assets/webgl-device-QoBMYpnS-C7K-Ybl_.js | 1 - frontend/dist/assets/webgl-device-QoBMYpnS-DdFdcbLu.js | 1 + frontend/dist/assets/{zap-DOkzycJm.js => zap-Cpbok2bP.js} | 2 +- frontend/dist/index.html | 8 ++++---- frontend/package.json | 7 +++++-- 77 files changed, 69 insertions(+), 65 deletions(-) rename frontend/dist/assets/{BasemapLayer-B5scdheQ.js => BasemapLayer-C9wiTbJT.js} (99%) rename frontend/dist/assets/{Card-BiYlryJL.js => Card-CCBguhJs.js} (92%) rename frontend/dist/assets/{CollisionExplorerModal-CX6f3IBB.js => CollisionExplorerModal-BmT8XQYy.js} (90%) rename frontend/dist/assets/{Configuration-Df5yvVwq.js => Configuration-Bh26u4ks.js} (91%) rename frontend/dist/assets/{ConfirmModal-OyBnZ1Rq.js => ConfirmModal-flvCJ5X5.js} (70%) create mode 100644 frontend/dist/assets/Contacts-DHVYuXFa.js delete mode 100644 frontend/dist/assets/Contacts-hCqb2-UP.js delete mode 100644 frontend/dist/assets/ContactsMapMapLibre-BVr13QqT.js create mode 100644 frontend/dist/assets/ContactsMapMapLibre-Cpb6Sk8-.js delete mode 100644 frontend/dist/assets/Dashboard-BSUVzNBC.js create mode 100644 frontend/dist/assets/Dashboard-Hxpnr4og.js rename frontend/dist/assets/{DataBox-BuwfTaKv.js => DataBox-Bl0vntck.js} (94%) rename frontend/dist/assets/{DeepAnalysisModal-Ckyyxl1o.js => DeepAnalysisModal-DSV1q_wY.js} (74%) rename frontend/dist/assets/{Grid-TNw012c2.js => Grid-BVGRgue6.js} (94%) rename frontend/dist/assets/{Login-X6H6_R2y.js => Login-DJBcf-C6.js} (98%) rename frontend/dist/assets/{Logs-C-eWV8pL.js => Logs-C6iBCeIs.js} (76%) rename frontend/dist/assets/{MeshGraph-CbZRxc5R.js => MeshGraph-jA9fGpu6.js} (85%) rename frontend/dist/assets/{MeshGraphLabelTest-9WwHSZHg.js => MeshGraphLabelTest-Cv3ODNn6.js} (95%) rename frontend/dist/assets/{NodeInformationCard-D_WIPYcK.js => NodeInformationCard-CJnzzUo0.js} (87%) delete mode 100644 frontend/dist/assets/PacketList-C0Zwn6jt.js create mode 100644 frontend/dist/assets/PacketList-DSZP-sF4.js create mode 100644 frontend/dist/assets/Packets-5FmM_VMr.js delete mode 100644 frontend/dist/assets/Packets-9uyPWOef.js rename frontend/dist/assets/{PageLayout-Dz1NyqHa.js => PageLayout-B53JpmK1.js} (96%) create mode 100644 frontend/dist/assets/PathMapMapLibre-CFZlE15b.js delete mode 100644 frontend/dist/assets/PathMapMapLibre-DyVKbFr_.js create mode 100644 frontend/dist/assets/SignalIndicator-CBL6VSNS.js delete mode 100644 frontend/dist/assets/SignalIndicator-FtRKgdkw.js delete mode 100644 frontend/dist/assets/Statistics-B9XmGE0m.js create mode 100644 frontend/dist/assets/Statistics-CGJSoMIn.js delete mode 100644 frontend/dist/assets/System-CNFICQV5.js create mode 100644 frontend/dist/assets/System-bU7CQZPd.js delete mode 100644 frontend/dist/assets/Terminal-4b8EQwTz.js create mode 100644 frontend/dist/assets/Terminal-CFdtTKrf.js create mode 100644 frontend/dist/assets/TimeRangeSelector-C89_yLwH.js delete mode 100644 frontend/dist/assets/TimeRangeSelector-CDHWyMqL.js create mode 100644 frontend/dist/assets/activity-Cb8TQBuo.js rename frontend/dist/assets/{arrow-up-Bv56Dbd2.js => arrow-up-DysUUcGL.js} (75%) create mode 100644 frontend/dist/assets/chevron-right-CZNwXWtt.js delete mode 100644 frontend/dist/assets/chevron-right-CchtyLvr.js delete mode 100644 frontend/dist/assets/chevron-up-Cn6bmTpb.js rename frontend/dist/assets/{circle-check-BQrKpAc_.js => circle-check-CKXuJpMJ.js} (62%) rename frontend/dist/assets/{compass-ipowibkG.js => compass-Bsfx4e84.js} (74%) create mode 100644 frontend/dist/assets/decryption.worker-C84ax0zu.js rename frontend/dist/assets/{git-branch-CU4ha9LK.js => git-branch-Cev-c9BQ.js} (76%) rename frontend/dist/assets/{house-BPemXMFi.js => house-D2cJ2w9-.js} (86%) delete mode 100644 frontend/dist/assets/index-BKfnA8uz.js delete mode 100644 frontend/dist/assets/index-CZBrdv20.js create mode 100644 frontend/dist/assets/index-D22MpaCY.js delete mode 100644 frontend/dist/assets/index-DVRwteP8.css create mode 100644 frontend/dist/assets/index-DWq9tBbL.css create mode 100644 frontend/dist/assets/index-bDa2a9Y2.js rename frontend/dist/assets/{info-pu09_Xxl.js => info-BojcGhYE.js} (68%) rename frontend/dist/assets/{link-scoring-BY8TYwtV.js => link-scoring-BnkyjnFT.js} (78%) rename frontend/dist/assets/{loader-circle-BLG0SL8e.js => loader-circle-2q9lT2qG.js} (54%) rename frontend/dist/assets/{map-pin-BnrkOs2D.js => map-pin-kiJDSdn0.js} (74%) rename frontend/dist/assets/{network-Did0WXxt.js => network-Dz5VqBhN.js} (83%) delete mode 100644 frontend/dist/assets/packet-CCmg5Y4j.js create mode 100644 frontend/dist/assets/payload-decoders-B_w2m9Or.js rename frontend/dist/assets/{ping-DAjkGztv.js => ping-o6tDyVoV.js} (94%) rename frontend/dist/assets/{refresh-cw-B42SG81L.js => refresh-cw-BtHqSStQ.js} (79%) rename frontend/dist/assets/{route-CHkUVMnV.js => route-ExVvvUtv.js} (92%) rename frontend/dist/assets/{target-5KyqyCil.js => target-BlWNMuhi.js} (87%) rename frontend/dist/assets/{trending-up-xQoBxaWx.js => trending-up-D5ntwkR1.js} (87%) rename frontend/dist/assets/{triangle-alert-DlaBoont.js => triangle-alert-TfoZuZfW.js} (75%) rename frontend/dist/assets/{usePolling-ZH_j5bYw.js => usePolling-XMUhKpB6.js} (75%) rename frontend/dist/assets/{useThemeColors-CzhUM4y-.js => useThemeColors-S-uaxvPT.js} (60%) rename frontend/dist/assets/{users-DbmAVTAI.js => users-dFI4fg5G.js} (87%) rename frontend/dist/assets/{vendor-core-Dhs13Wlh.js => vendor-core-CDrKesoV.js} (99%) create mode 100644 frontend/dist/assets/vendor-react-Cwum97tW.js delete mode 100644 frontend/dist/assets/vendor-react-DFCqJxYC.js delete mode 100644 frontend/dist/assets/webgl-device-QoBMYpnS-C7K-Ybl_.js create mode 100644 frontend/dist/assets/webgl-device-QoBMYpnS-DdFdcbLu.js rename frontend/dist/assets/{zap-DOkzycJm.js => zap-Cpbok2bP.js} (85%) diff --git a/frontend/dist/VERSION b/frontend/dist/VERSION index d49dd2cc..ebd50c88 100644 --- a/frontend/dist/VERSION +++ b/frontend/dist/VERSION @@ -1 +1 @@ -0.9.212 +0.9.213 diff --git a/frontend/dist/assets/BasemapLayer-B5scdheQ.js b/frontend/dist/assets/BasemapLayer-C9wiTbJT.js similarity index 99% rename from frontend/dist/assets/BasemapLayer-B5scdheQ.js rename to frontend/dist/assets/BasemapLayer-C9wiTbJT.js index a6d478f1..7c3e8eb4 100644 --- a/frontend/dist/assets/BasemapLayer-B5scdheQ.js +++ b/frontend/dist/assets/BasemapLayer-C9wiTbJT.js @@ -1,2 +1,2 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/maplibre-gl-B1CfjdFi.css"])))=>i.map(i=>d[i]); -import{r as e,e as t}from"./vendor-react-DFCqJxYC.js";import{c as o}from"./vendor-core-Dhs13Wlh.js";import{_ as n}from"./deckgl-DTsmDcfs.js";const r=e.createContext(null);function s(){var t;const o=null==(t=e.useContext(r))?void 0:t.maps,n=e.useContext(b);return e.useMemo(()=>({...o,current:null==n?void 0:n.map}),[o,n])}function a(e,t){if(e===t)return!0;if(!e||!t)return!1;if(Array.isArray(e)){if(!Array.isArray(t)||e.length!==t.length)return!1;for(let o=0;o{let o=null;"interactive"in e&&(o=Object.assign({},e),delete o.interactive);const n=t[e.ref];if(n){o=o||Object.assign({},e),delete o.ref;for(const e of c)e in n&&(o[e]=n[e])}return o||e});return{...e,layers:o}}const d={version:8,sources:{},layers:[]},p={mousedown:"onMouseDown",mouseup:"onMouseUp",mouseover:"onMouseOver",mousemove:"onMouseMove",click:"onClick",dblclick:"onDblClick",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave",mouseout:"onMouseOut",contextmenu:"onContextMenu",touchstart:"onTouchStart",touchend:"onTouchEnd",touchmove:"onTouchMove",touchcancel:"onTouchCancel"},m={movestart:"onMoveStart",move:"onMove",moveend:"onMoveEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",zoomstart:"onZoomStart",zoom:"onZoom",zoomend:"onZoomEnd",rotatestart:"onRotateStart",rotate:"onRotate",rotateend:"onRotateEnd",pitchstart:"onPitchStart",pitch:"onPitch",pitchend:"onPitchEnd"},f={wheel:"onWheel",boxzoomstart:"onBoxZoomStart",boxzoomend:"onBoxZoomEnd",boxzoomcancel:"onBoxZoomCancel",resize:"onResize",load:"onLoad",render:"onRender",idle:"onIdle",remove:"onRemove",data:"onData",styledata:"onStyleData",sourcedata:"onSourceData",error:"onError"},g=["minZoom","maxZoom","minPitch","maxPitch","maxBounds","projection","renderWorldCopies"],h=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate","touchPitch"];class y{constructor(e,t,o){this._map=null,this._internalUpdate=!1,this._hoveredFeatures=null,this._propsedCameraUpdate=null,this._styleComponents={},this._onEvent=e=>{const t=this.props[f[e.type]];t?t(e):e.type},this._onCameraEvent=e=>{if(this._internalUpdate)return;e.viewState=this._propsedCameraUpdate||i(this._map.transform);const t=this.props[m[e.type]];t&&t(e)},this._onCameraUpdate=e=>this._internalUpdate?e:(this._propsedCameraUpdate=i(e),l(e,this.props)),this._onPointerEvent=e=>{"mousemove"!==e.type&&"mouseout"!==e.type||this._updateHover(e);const t=this.props[p[e.type]];t&&(this.props.interactiveLayerIds&&"mouseover"!==e.type&&"mouseout"!==e.type&&(e.features=this._hoveredFeatures||this._queryRenderedFeatures(e.point)),t(e),delete e.features)},this._MapClass=e,this.props=t,this._initialize(o)}get map(){return this._map}setProps(e){const t=this.props;this.props=e;const o=this._updateSettings(e,t),n=this._updateSize(e),r=this._updateViewState(e);this._updateStyle(e,t),this._updateStyleComponents(e),this._updateHandlers(e,t),(o||n||r&&!this._map.isMoving())&&this.redraw()}static reuse(e,t){const o=y.savedMaps.pop();if(!o)return null;const n=o.map,r=n.getContainer();for(t.className=r.className;r.childNodes.length>0;)t.appendChild(r.childNodes[0]);n._container=t;const s=n._resizeObserver;s&&(s.disconnect(),s.observe(t)),o.setProps({...e,styleDiffing:!1}),n.resize();const{initialViewState:a}=e;return a&&(a.bounds?n.fitBounds(a.bounds,{...a.fitBoundsOptions,duration:0}):o._updateViewState(a)),n.isStyleLoaded()?n.fire("load"):n.once("style.load",()=>n.fire("load")),n._update(),o}_initialize(e){const{props:t}=this,{mapStyle:o=d}=t,n={...t,...t.initialViewState,container:e,style:u(o)},r=n.initialViewState||n.viewState||n;if(Object.assign(n,{center:[r.longitude||0,r.latitude||0],zoom:r.zoom||0,pitch:r.pitch||0,bearing:r.bearing||0}),t.gl){const e=HTMLCanvasElement.prototype.getContext;HTMLCanvasElement.prototype.getContext=()=>(HTMLCanvasElement.prototype.getContext=e,t.gl)}const s=new this._MapClass(n);r.padding&&s.setPadding(r.padding),t.cursor&&(s.getCanvas().style.cursor=t.cursor),s.transformCameraUpdate=this._onCameraUpdate,s.on("style.load",()=>{var e;this._styleComponents={light:s.getLight(),sky:s.getSky(),projection:null==(e=s.getProjection)?void 0:e.call(s),terrain:s.getTerrain()},this._updateStyleComponents(this.props)}),s.on("sourcedata",()=>{this._updateStyleComponents(this.props)});for(const a in p)s.on(a,this._onPointerEvent);for(const a in m)s.on(a,this._onCameraEvent);for(const a in f)s.on(a,this._onEvent);this._map=s}recycle(){const e=this.map.getContainer().querySelector("[mapboxgl-children]");null==e||e.remove(),y.savedMaps.push(this)}destroy(){this._map.remove()}redraw(){const e=this._map;e.style&&(e._frame&&(e._frame.cancel(),e._frame=null),e._render())}_updateSize(e){const{viewState:t}=e;if(t){const e=this._map;if(t.width!==e.transform.width||t.height!==e.transform.height)return e.resize(),!0}return!1}_updateViewState(e){const t=this._map,o=t.transform;if(!t.isMoving()){const n=l(o,e);if(Object.keys(n).length>0)return this._internalUpdate=!0,t.jumpTo(n),this._internalUpdate=!1,!0}return!1}_updateSettings(e,t){const o=this._map;let n=!1;for(const r of g)if(r in e&&!a(e[r],t[r])){n=!0;const t=o[`set${r[0].toUpperCase()}${r.slice(1)}`];null==t||t.call(o,e[r])}return n}_updateStyle(e,t){if(e.cursor!==t.cursor&&(this._map.getCanvas().style.cursor=e.cursor||""),e.mapStyle!==t.mapStyle){const{mapStyle:t=d,styleDiffing:o=!0}=e,n={diff:o};"localIdeographFontFamily"in e&&(n.localIdeographFontFamily=e.localIdeographFontFamily),this._map.setStyle(u(t),n)}}_updateStyleComponents({light:e,projection:t,sky:o,terrain:n}){var r,s;const i=this._map,l=this._styleComponents;i.style._loaded&&(e&&!a(e,l.light)&&(l.light=e,i.setLight(e)),t&&!a(t,l.projection)&&t!==(null==(r=l.projection)?void 0:r.type)&&(l.projection="string"==typeof t?{type:t}:t,null==(s=i.setProjection)||s.call(i,l.projection)),o&&!a(o,l.sky)&&(l.sky=o,i.setSky(o)),void 0===n||a(n,l.terrain)||n&&!i.getSource(n.source)||(l.terrain=n,i.setTerrain(n)))}_updateHandlers(e,t){const o=this._map;for(const n of h){const r=e[n]??!0;a(r,t[n]??!0)||(r?o[n].enable(r):o[n].disable())}}_queryRenderedFeatures(e){const t=this._map,{interactiveLayerIds:o=[]}=this.props;try{return t.queryRenderedFeatures(e,{layers:o.filter(t.getLayer.bind(t))})}catch{return[]}}_updateHover(e){var t;const{props:o}=this;if(o.interactiveLayerIds&&(o.onMouseMove||o.onMouseEnter||o.onMouseLeave)){const o=e.type,n=(null==(t=this._hoveredFeatures)?void 0:t.length)>0,r=this._queryRenderedFeatures(e.point),s=r.length>0;!s&&n&&(e.type="mouseleave",this._onPointerEvent(e)),this._hoveredFeatures=r,s&&!n&&(e.type="mouseenter",this._onPointerEvent(e)),e.type=o}else this._hoveredFeatures=null}}y.savedMaps=[];const v=["setMaxBounds","setMinZoom","setMaxZoom","setMinPitch","setMaxPitch","setRenderWorldCopies","setProjection","setStyle","addSource","removeSource","addLayer","removeLayer","setLayerZoomRange","setFilter","setPaintProperty","setLayoutProperty","setLight","setTerrain","setFog","remove"];const _="undefined"!=typeof document?e.useLayoutEffect:e.useEffect,b=e.createContext(null),L=e.forwardRef(function(t,o){const s=e.useContext(r),[a,i]=e.useState(null),l=e.useRef(),{current:c}=e.useRef({mapLib:null,map:null});e.useEffect(()=>{const e=t.mapLib;let o,r=!0;return Promise.resolve(e||n(()=>import("./maplibre-gl-Bk5DsYkB.js").then(e=>e.m),__vite__mapDeps([0]))).then(e=>{if(!r)return;if(!e)throw new Error("Invalid mapLib");const n="Map"in e?e:e.default;if(!n.Map)throw new Error("Invalid mapLib");!function(e,t){const{RTLTextPlugin:o,maxParallelImageRequests:n,workerCount:r,workerUrl:s}=t;if(o&&e.getRTLTextPluginStatus&&"unavailable"===e.getRTLTextPluginStatus()){const{pluginUrl:t,lazy:n=!0}="string"==typeof o?{pluginUrl:o}:o;e.setRTLTextPlugin(t,e=>{},n)}void 0!==n&&e.setMaxParallelImageRequests(n),void 0!==r&&e.setWorkerCount(r),void 0!==s&&e.setWorkerUrl(s)}(n,t),t.reuseMaps&&(o=y.reuse(t,l.current)),o||(o=new y(n.Map,t,l.current)),c.map=function(e){if(!e)return null;const t=e.map,o={getMap:()=>t};for(const n of function(e){const t=new Set;let o=e;for(;o;){for(const n of Object.getOwnPropertyNames(o))"_"!==n[0]&&"function"==typeof e[n]&&"fire"!==n&&"setEventedParent"!==n&&t.add(n);o=Object.getPrototypeOf(o)}return Array.from(t)}(t))n in o||v.includes(n)||(o[n]=t[n].bind(t));return o}(o),c.mapLib=n,i(o),null==s||s.onMapMount(c.map,t.id)}).catch(e=>{const{onError:o}=t;o&&o({type:"error",target:null,originalEvent:null,error:e})}),()=>{r=!1,o&&(null==s||s.onMapUnmount(t.id),t.reuseMaps?o.recycle():o.destroy())}},[]),_(()=>{a&&a.setProps(t)}),e.useImperativeHandle(o,()=>c.map,[a]);const u=e.useMemo(()=>({position:"relative",width:"100%",height:"100%",...t.style}),[t.style]);return e.createElement("div",{id:t.id,ref:l,style:u},a&&e.createElement(b.Provider,{value:c},e.createElement("div",{"mapboxgl-children":"",style:{height:"100%"}},t.children)))}),C=/box|flex|grid|column|lineHeight|fontWeight|opacity|order|tabSize|zIndex/;function S(e,t){if(!e||!t)return;const o=e.style;for(const n in t){const e=t[n];Number.isFinite(e)&&!C.test(n)?o[n]=`${e}px`:o[n]=e}}function E(e,t){if(e===t)return null;const o=M(e),n=M(t),r=[];for(const s of n)o.has(s)||r.push(s);for(const s of o)n.has(s)||r.push(s);return 0===r.length?null:r}function M(e){return new Set(e?e.trim().split(/\s+/):[])}const w=e.memo(e.forwardRef((o,n)=>{const{map:r,mapLib:s}=e.useContext(b),a=e.useRef({props:o}),i=e.useMemo(()=>{let t=!1;e.Children.forEach(o.children,e=>{e&&(t=!0)});const n={...o,element:t?document.createElement("div"):void 0},r=new s.Marker(n);return r.setLngLat([o.longitude,o.latitude]),r.getElement().addEventListener("click",e=>{var t,o;null==(o=(t=a.current.props).onClick)||o.call(t,{type:"click",target:r,originalEvent:e})}),r.on("dragstart",e=>{var t,o;const n=e;n.lngLat=i.getLngLat(),null==(o=(t=a.current.props).onDragStart)||o.call(t,n)}),r.on("drag",e=>{var t,o;const n=e;n.lngLat=i.getLngLat(),null==(o=(t=a.current.props).onDrag)||o.call(t,n)}),r.on("dragend",e=>{var t,o;const n=e;n.lngLat=i.getLngLat(),null==(o=(t=a.current.props).onDragEnd)||o.call(t,n)}),r},[]);e.useEffect(()=>(i.addTo(r.getMap()),()=>{i.remove()}),[]);const{longitude:l,latitude:c,offset:u,style:d,draggable:p=!1,popup:m=null,rotation:f=0,rotationAlignment:g="auto",pitchAlignment:h="auto"}=o;e.useEffect(()=>{S(i.getElement(),d)},[d]),e.useImperativeHandle(n,()=>i,[]);const y=a.current.props;i.getLngLat().lng===l&&i.getLngLat().lat===c||i.setLngLat([l,c]),u&&!function(e,t){const o=Array.isArray(e)?e[0]:e?e.x:0,n=Array.isArray(e)?e[1]:e?e.y:0,r=Array.isArray(t)?t[0]:t?t.x:0,s=Array.isArray(t)?t[1]:t?t.y:0;return o===r&&n===s}(i.getOffset(),u)&&i.setOffset(u),i.isDraggable()!==p&&i.setDraggable(p),i.getRotation()!==f&&i.setRotation(f),i.getRotationAlignment()!==g&&i.setRotationAlignment(g),i.getPitchAlignment()!==h&&i.setPitchAlignment(h),i.getPopup()!==m&&i.setPopup(m);const v=E(y.className,o.className);if(v)for(const e of v)i.toggleClassName(e);return a.current.props=o,t.createPortal(o.children,i.getElement())})),x=e.memo(e.forwardRef((o,n)=>{const{map:r,mapLib:s}=e.useContext(b),i=e.useMemo(()=>document.createElement("div"),[]),l=e.useRef({props:o}),c=e.useMemo(()=>{const e={...o},t=new s.Popup(e);return t.setLngLat([o.longitude,o.latitude]),t.once("open",e=>{var t,o;null==(o=(t=l.current.props).onOpen)||o.call(t,e)}),t},[]);if(e.useEffect(()=>{const e=e=>{var t,o;null==(o=(t=l.current.props).onClose)||o.call(t,e)};return c.on("close",e),c.setDOMContent(i).addTo(r.getMap()),()=>{c.off("close",e),c.isOpen()&&c.remove()}},[]),e.useEffect(()=>{S(c.getElement(),o.style)},[o.style]),e.useImperativeHandle(n,()=>c,[]),c.isOpen()){const e=l.current.props;c.getLngLat().lng===o.longitude&&c.getLngLat().lat===o.latitude||c.setLngLat([o.longitude,o.latitude]),o.offset&&!a(e.offset,o.offset)&&c.setOffset(o.offset),e.anchor===o.anchor&&e.maxWidth===o.maxWidth||(c.options.anchor=o.anchor,c.setMaxWidth(o.maxWidth));const t=E(e.className,o.className);if(t)for(const o of t)c.toggleClassName(o);l.current.props=o}return t.createPortal(o.children,i)}));function P(t,o,n,r){const s=e.useContext(b),a=e.useMemo(()=>t(s),[]);return e.useEffect(()=>{const e=o,t="function"==typeof o?o:null,{map:n}=s;return n.hasControl(a)||n.addControl(a,null==e?void 0:e.position),()=>{t&&t(s),n.hasControl(a)&&n.removeControl(a)}},[]),a}e.memo(function(t){const o=P(({mapLib:e})=>new e.AttributionControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null}),e.memo(function(t){const o=P(({mapLib:e})=>new e.FullscreenControl({container:t.containerId&&document.getElementById(t.containerId)}),{position:t.position});return e.useEffect(()=>{S(o._controlContainer,t.style)},[t.style]),null}),e.memo(e.forwardRef(function(t,o){const n=e.useRef({props:t}),r=P(({mapLib:e})=>{const o=new e.GeolocateControl(t),r=o._setupUI;return o._setupUI=()=>{o._container.hasChildNodes()||r()},o.on("geolocate",e=>{var t,o;null==(o=(t=n.current.props).onGeolocate)||o.call(t,e)}),o.on("error",e=>{var t,o;null==(o=(t=n.current.props).onError)||o.call(t,e)}),o.on("outofmaxbounds",e=>{var t,o;null==(o=(t=n.current.props).onOutOfMaxBounds)||o.call(t,e)}),o.on("trackuserlocationstart",e=>{var t,o;null==(o=(t=n.current.props).onTrackUserLocationStart)||o.call(t,e)}),o.on("trackuserlocationend",e=>{var t,o;null==(o=(t=n.current.props).onTrackUserLocationEnd)||o.call(t,e)}),o},{position:t.position});return n.current.props=t,e.useImperativeHandle(o,()=>r,[]),e.useEffect(()=>{S(r._container,t.style)},[t.style]),null})),e.memo(function(t){const o=P(({mapLib:e})=>new e.NavigationControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null});const k=e.memo(function(t){const o=P(({mapLib:e})=>new e.ScaleControl(t),{position:t.position}),n=e.useRef(t),r=n.current;n.current=t;const{style:s}=t;return void 0!==t.maxWidth&&t.maxWidth!==r.maxWidth&&(o.options.maxWidth=t.maxWidth),void 0!==t.unit&&t.unit!==r.unit&&o.setUnit(t.unit),e.useEffect(()=>{S(o._container,s)},[s]),null});function R(e,t){if(!e)throw new Error(t)}e.memo(function(t){const o=P(({mapLib:e})=>new e.TerrainControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null}),e.memo(function(t){const o=P(({mapLib:e})=>new e.LogoControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null});let I=0;function z(t){const o=e.useContext(b).map.getMap(),n=e.useRef(t),[,r]=e.useState(0),s=e.useMemo(()=>t.id||"jsx-source-"+I++,[]);e.useEffect(()=>{if(o){const e=()=>setTimeout(()=>r(e=>e+1),0);return o.on("styledata",e),e(),()=>{var t;if(o.off("styledata",e),o.style&&o.style._loaded&&o.getSource(s)){const e=null==(t=o.getStyle())?void 0:t.layers;if(e)for(const t of e)t.source===s&&o.removeLayer(t.id);o.removeSource(s)}}}},[o]);let i=o&&o.style&&o.getSource(s);return i?function(e,t,o){var n,r,s;R(t.id===o.id,"source id changed"),R(t.type===o.type,"source type changed");let i="",l=0;for(const u in t)"children"===u||"id"===u||a(o[u],t[u])||(i=u,l++);if(!l)return;const c=t.type;if("geojson"===c)e.setData(t.data);else if("image"===c)e.updateImage({url:t.url,coordinates:t.coordinates});else switch(i){case"coordinates":null==(n=e.setCoordinates)||n.call(e,t.coordinates);break;case"url":null==(r=e.setUrl)||r.call(e,t.url);break;case"tiles":null==(s=e.setTiles)||s.call(e,t.tiles)}}(i,t,n.current):i=function(e,t,o){if(e.style&&e.style._loaded){const n={...o};return delete n.id,delete n.children,e.addSource(t,n),e.getSource(t)}return null}(o,s,t),n.current=t,i&&e.Children.map(t.children,t=>t&&e.cloneElement(t,{source:s}))||null}let j=0;function T(t){const o=e.useContext(b).map.getMap(),n=e.useRef(t),[,r]=e.useState(0),s=e.useMemo(()=>t.id||"jsx-layer-"+j++,[]);if(e.useEffect(()=>{if(o){const e=()=>r(e=>e+1);return o.on("styledata",e),e(),()=>{o.off("styledata",e),o.style&&o.style._loaded&&o.getLayer(s)&&o.removeLayer(s)}}},[o]),o&&o.style&&o.getLayer(s))try{!function(e,t,o,n){if(R(o.id===n.id,"layer id changed"),R(o.type===n.type,"layer type changed"),"custom"===o.type||"custom"===n.type)return;const{layout:r={},paint:s={},filter:i,minzoom:l,maxzoom:c,beforeId:u}=o;if(u!==n.beforeId&&e.moveLayer(t,u),r!==n.layout){const o=n.layout||{};for(const n in r)a(r[n],o[n])||e.setLayoutProperty(t,n,r[n]);for(const n in o)r.hasOwnProperty(n)||e.setLayoutProperty(t,n,void 0)}if(s!==n.paint){const o=n.paint||{};for(const n in s)a(s[n],o[n])||e.setPaintProperty(t,n,s[n]);for(const n in o)s.hasOwnProperty(n)||e.setPaintProperty(t,n,void 0)}a(i,n.filter)||e.setFilter(t,i),l===n.minzoom&&c===n.maxzoom||e.setLayerZoomRange(t,l,c)}(o,s,t,n.current)}catch(i){}else!function(e,t,o){if(e.style&&e.style._loaded&&(!("source"in o)||e.getSource(o.source))){const n={...o,id:t};delete n.beforeId,e.addLayer(n,o.beforeId)}}(o,s,t);return n.current=t,null}const O="pymc-basemap-mode",U="dark";function A(){if("undefined"==typeof window)return U;try{const e=localStorage.getItem(O);if("light"===e||"dark"===e)return e}catch{}return U}function F(e){if("undefined"!=typeof window)try{localStorage.setItem(O,e)}catch{}}const W=o(e=>({mode:A(),toggle:()=>e(e=>{const t="light"===e.mode?"dark":"light";return F(t),{mode:t}}),setMode:t=>{F(t),e({mode:t})}})),D=()=>W(e=>e.mode),Z=()=>W(e=>e.toggle),N={light:"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json",dark:"https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json"},H={light:"basemap-light-",dark:"basemap-dark-"},B={};function q({mode:t}){const{current:o}=s(),[n,r]=e.useState(null),a=e.useRef({light:!1,dark:!1}),i=e.useRef({light:[],dark:[]});e.useEffect(()=>{const e=()=>{var e;const t=null==(e=null==o?void 0:o.getMap)?void 0:e.call(o);t&&!n&&r(t)};e();const t=setInterval(e,50),s=setTimeout(()=>clearInterval(t),5e3);return()=>{clearInterval(t),clearTimeout(s)}},[o,n]);const l=e.useCallback(async(e,t,o)=>{var n,r;if(a.current[t])return;const s=H[t],l=await async function(e){if(B[e])return B[e];const t=await fetch(N[e]),o=await t.json();return B[e]=o,o}(t),c=[];for(const[a,i]of Object.entries(l.sources||{})){const t=s+a;e.getSource(t)||e.addSource(t,i)}const u=null==(r=((null==(n=e.getStyle())?void 0:n.layers)||[]).find(e=>!e.id.startsWith("basemap-light-")&&!e.id.startsWith("basemap-dark-")))?void 0:r.id;for(const a of l.layers||[]){const t=s+a.id;if(c.push(t),e.getLayer(t))continue;const n={...a,id:t};"source"in n&&"string"==typeof n.source&&(n.source=s+n.source),n.layout||(n.layout={}),n.layout.visibility=o?"visible":"none";try{e.addLayer(n,u)}catch(d){}}i.current[t]=c,a.current[t]=!0},[]),c=e.useCallback((e,t,o)=>{const n=i.current[t],r=o?"visible":"none";for(const s of n)if(e.getLayer(s))try{e.setLayoutProperty(s,"visibility",r)}catch{}},[]),u=e.useCallback(e=>{var t;const o=((null==(t=e.getStyle())?void 0:t.layers)||[]).filter(e=>!e.id.startsWith("basemap-light-")&&!e.id.startsWith("basemap-dark-"));for(const n of o)try{e.moveLayer(n.id)}catch{}},[]);return e.useEffect(()=>{if(!n)return;const e=e=>{n.hasImage(e.id)||n.addImage(e.id,{width:1,height:1,data:new Uint8Array([0,0,0,0])})};return n.on("styleimagemissing",e),()=>{n.off("styleimagemissing",e)}},[n]),e.useEffect(()=>{if(!n)return;let e=!1;const o=async()=>{if(!e)try{await Promise.all([l(n,"light","light"===t),l(n,"dark","dark"===t)]),e||u(n)}catch(o){}};n.isStyleLoaded()?o():(n.once("style.load",o),n.once("load",()=>{e||a.current.light||o()}));const r=()=>{e||setTimeout(()=>{!e&&a.current.light&&a.current.dark&&u(n)},100)};return n.on("styledata",r),()=>{e=!0,n.off("styledata",r)}},[n,l,u,t]),e.useEffect(()=>{n&&a.current.light&&a.current.dark&&(c(n,"light","light"===t),c(n,"dark","dark"===t))},[n,t,c]),null}export{q as B,T as L,L as M,x as P,z as S,w as a,s as b,Z as c,k as d,D as u}; +import{r as e,e as t}from"./vendor-react-Cwum97tW.js";import{c as o}from"./vendor-core-CDrKesoV.js";import{_ as n}from"./deckgl-DTsmDcfs.js";const r=e.createContext(null);function s(){var t;const o=null==(t=e.useContext(r))?void 0:t.maps,n=e.useContext(b);return e.useMemo(()=>({...o,current:null==n?void 0:n.map}),[o,n])}function a(e,t){if(e===t)return!0;if(!e||!t)return!1;if(Array.isArray(e)){if(!Array.isArray(t)||e.length!==t.length)return!1;for(let o=0;o{let o=null;"interactive"in e&&(o=Object.assign({},e),delete o.interactive);const n=t[e.ref];if(n){o=o||Object.assign({},e),delete o.ref;for(const e of c)e in n&&(o[e]=n[e])}return o||e});return{...e,layers:o}}const d={version:8,sources:{},layers:[]},p={mousedown:"onMouseDown",mouseup:"onMouseUp",mouseover:"onMouseOver",mousemove:"onMouseMove",click:"onClick",dblclick:"onDblClick",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave",mouseout:"onMouseOut",contextmenu:"onContextMenu",touchstart:"onTouchStart",touchend:"onTouchEnd",touchmove:"onTouchMove",touchcancel:"onTouchCancel"},m={movestart:"onMoveStart",move:"onMove",moveend:"onMoveEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",zoomstart:"onZoomStart",zoom:"onZoom",zoomend:"onZoomEnd",rotatestart:"onRotateStart",rotate:"onRotate",rotateend:"onRotateEnd",pitchstart:"onPitchStart",pitch:"onPitch",pitchend:"onPitchEnd"},f={wheel:"onWheel",boxzoomstart:"onBoxZoomStart",boxzoomend:"onBoxZoomEnd",boxzoomcancel:"onBoxZoomCancel",resize:"onResize",load:"onLoad",render:"onRender",idle:"onIdle",remove:"onRemove",data:"onData",styledata:"onStyleData",sourcedata:"onSourceData",error:"onError"},g=["minZoom","maxZoom","minPitch","maxPitch","maxBounds","projection","renderWorldCopies"],h=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate","touchPitch"];class y{constructor(e,t,o){this._map=null,this._internalUpdate=!1,this._hoveredFeatures=null,this._propsedCameraUpdate=null,this._styleComponents={},this._onEvent=e=>{const t=this.props[f[e.type]];t?t(e):e.type},this._onCameraEvent=e=>{if(this._internalUpdate)return;e.viewState=this._propsedCameraUpdate||i(this._map.transform);const t=this.props[m[e.type]];t&&t(e)},this._onCameraUpdate=e=>this._internalUpdate?e:(this._propsedCameraUpdate=i(e),l(e,this.props)),this._onPointerEvent=e=>{"mousemove"!==e.type&&"mouseout"!==e.type||this._updateHover(e);const t=this.props[p[e.type]];t&&(this.props.interactiveLayerIds&&"mouseover"!==e.type&&"mouseout"!==e.type&&(e.features=this._hoveredFeatures||this._queryRenderedFeatures(e.point)),t(e),delete e.features)},this._MapClass=e,this.props=t,this._initialize(o)}get map(){return this._map}setProps(e){const t=this.props;this.props=e;const o=this._updateSettings(e,t),n=this._updateSize(e),r=this._updateViewState(e);this._updateStyle(e,t),this._updateStyleComponents(e),this._updateHandlers(e,t),(o||n||r&&!this._map.isMoving())&&this.redraw()}static reuse(e,t){const o=y.savedMaps.pop();if(!o)return null;const n=o.map,r=n.getContainer();for(t.className=r.className;r.childNodes.length>0;)t.appendChild(r.childNodes[0]);n._container=t;const s=n._resizeObserver;s&&(s.disconnect(),s.observe(t)),o.setProps({...e,styleDiffing:!1}),n.resize();const{initialViewState:a}=e;return a&&(a.bounds?n.fitBounds(a.bounds,{...a.fitBoundsOptions,duration:0}):o._updateViewState(a)),n.isStyleLoaded()?n.fire("load"):n.once("style.load",()=>n.fire("load")),n._update(),o}_initialize(e){const{props:t}=this,{mapStyle:o=d}=t,n={...t,...t.initialViewState,container:e,style:u(o)},r=n.initialViewState||n.viewState||n;if(Object.assign(n,{center:[r.longitude||0,r.latitude||0],zoom:r.zoom||0,pitch:r.pitch||0,bearing:r.bearing||0}),t.gl){const e=HTMLCanvasElement.prototype.getContext;HTMLCanvasElement.prototype.getContext=()=>(HTMLCanvasElement.prototype.getContext=e,t.gl)}const s=new this._MapClass(n);r.padding&&s.setPadding(r.padding),t.cursor&&(s.getCanvas().style.cursor=t.cursor),s.transformCameraUpdate=this._onCameraUpdate,s.on("style.load",()=>{var e;this._styleComponents={light:s.getLight(),sky:s.getSky(),projection:null==(e=s.getProjection)?void 0:e.call(s),terrain:s.getTerrain()},this._updateStyleComponents(this.props)}),s.on("sourcedata",()=>{this._updateStyleComponents(this.props)});for(const a in p)s.on(a,this._onPointerEvent);for(const a in m)s.on(a,this._onCameraEvent);for(const a in f)s.on(a,this._onEvent);this._map=s}recycle(){const e=this.map.getContainer().querySelector("[mapboxgl-children]");null==e||e.remove(),y.savedMaps.push(this)}destroy(){this._map.remove()}redraw(){const e=this._map;e.style&&(e._frame&&(e._frame.cancel(),e._frame=null),e._render())}_updateSize(e){const{viewState:t}=e;if(t){const e=this._map;if(t.width!==e.transform.width||t.height!==e.transform.height)return e.resize(),!0}return!1}_updateViewState(e){const t=this._map,o=t.transform;if(!t.isMoving()){const n=l(o,e);if(Object.keys(n).length>0)return this._internalUpdate=!0,t.jumpTo(n),this._internalUpdate=!1,!0}return!1}_updateSettings(e,t){const o=this._map;let n=!1;for(const r of g)if(r in e&&!a(e[r],t[r])){n=!0;const t=o[`set${r[0].toUpperCase()}${r.slice(1)}`];null==t||t.call(o,e[r])}return n}_updateStyle(e,t){if(e.cursor!==t.cursor&&(this._map.getCanvas().style.cursor=e.cursor||""),e.mapStyle!==t.mapStyle){const{mapStyle:t=d,styleDiffing:o=!0}=e,n={diff:o};"localIdeographFontFamily"in e&&(n.localIdeographFontFamily=e.localIdeographFontFamily),this._map.setStyle(u(t),n)}}_updateStyleComponents({light:e,projection:t,sky:o,terrain:n}){var r,s;const i=this._map,l=this._styleComponents;i.style._loaded&&(e&&!a(e,l.light)&&(l.light=e,i.setLight(e)),t&&!a(t,l.projection)&&t!==(null==(r=l.projection)?void 0:r.type)&&(l.projection="string"==typeof t?{type:t}:t,null==(s=i.setProjection)||s.call(i,l.projection)),o&&!a(o,l.sky)&&(l.sky=o,i.setSky(o)),void 0===n||a(n,l.terrain)||n&&!i.getSource(n.source)||(l.terrain=n,i.setTerrain(n)))}_updateHandlers(e,t){const o=this._map;for(const n of h){const r=e[n]??!0;a(r,t[n]??!0)||(r?o[n].enable(r):o[n].disable())}}_queryRenderedFeatures(e){const t=this._map,{interactiveLayerIds:o=[]}=this.props;try{return t.queryRenderedFeatures(e,{layers:o.filter(t.getLayer.bind(t))})}catch{return[]}}_updateHover(e){var t;const{props:o}=this;if(o.interactiveLayerIds&&(o.onMouseMove||o.onMouseEnter||o.onMouseLeave)){const o=e.type,n=(null==(t=this._hoveredFeatures)?void 0:t.length)>0,r=this._queryRenderedFeatures(e.point),s=r.length>0;!s&&n&&(e.type="mouseleave",this._onPointerEvent(e)),this._hoveredFeatures=r,s&&!n&&(e.type="mouseenter",this._onPointerEvent(e)),e.type=o}else this._hoveredFeatures=null}}y.savedMaps=[];const v=["setMaxBounds","setMinZoom","setMaxZoom","setMinPitch","setMaxPitch","setRenderWorldCopies","setProjection","setStyle","addSource","removeSource","addLayer","removeLayer","setLayerZoomRange","setFilter","setPaintProperty","setLayoutProperty","setLight","setTerrain","setFog","remove"];const _="undefined"!=typeof document?e.useLayoutEffect:e.useEffect,b=e.createContext(null),L=e.forwardRef(function(t,o){const s=e.useContext(r),[a,i]=e.useState(null),l=e.useRef(),{current:c}=e.useRef({mapLib:null,map:null});e.useEffect(()=>{const e=t.mapLib;let o,r=!0;return Promise.resolve(e||n(()=>import("./maplibre-gl-Bk5DsYkB.js").then(e=>e.m),__vite__mapDeps([0]))).then(e=>{if(!r)return;if(!e)throw new Error("Invalid mapLib");const n="Map"in e?e:e.default;if(!n.Map)throw new Error("Invalid mapLib");!function(e,t){const{RTLTextPlugin:o,maxParallelImageRequests:n,workerCount:r,workerUrl:s}=t;if(o&&e.getRTLTextPluginStatus&&"unavailable"===e.getRTLTextPluginStatus()){const{pluginUrl:t,lazy:n=!0}="string"==typeof o?{pluginUrl:o}:o;e.setRTLTextPlugin(t,e=>{},n)}void 0!==n&&e.setMaxParallelImageRequests(n),void 0!==r&&e.setWorkerCount(r),void 0!==s&&e.setWorkerUrl(s)}(n,t),t.reuseMaps&&(o=y.reuse(t,l.current)),o||(o=new y(n.Map,t,l.current)),c.map=function(e){if(!e)return null;const t=e.map,o={getMap:()=>t};for(const n of function(e){const t=new Set;let o=e;for(;o;){for(const n of Object.getOwnPropertyNames(o))"_"!==n[0]&&"function"==typeof e[n]&&"fire"!==n&&"setEventedParent"!==n&&t.add(n);o=Object.getPrototypeOf(o)}return Array.from(t)}(t))n in o||v.includes(n)||(o[n]=t[n].bind(t));return o}(o),c.mapLib=n,i(o),null==s||s.onMapMount(c.map,t.id)}).catch(e=>{const{onError:o}=t;o&&o({type:"error",target:null,originalEvent:null,error:e})}),()=>{r=!1,o&&(null==s||s.onMapUnmount(t.id),t.reuseMaps?o.recycle():o.destroy())}},[]),_(()=>{a&&a.setProps(t)}),e.useImperativeHandle(o,()=>c.map,[a]);const u=e.useMemo(()=>({position:"relative",width:"100%",height:"100%",...t.style}),[t.style]);return e.createElement("div",{id:t.id,ref:l,style:u},a&&e.createElement(b.Provider,{value:c},e.createElement("div",{"mapboxgl-children":"",style:{height:"100%"}},t.children)))}),C=/box|flex|grid|column|lineHeight|fontWeight|opacity|order|tabSize|zIndex/;function S(e,t){if(!e||!t)return;const o=e.style;for(const n in t){const e=t[n];Number.isFinite(e)&&!C.test(n)?o[n]=`${e}px`:o[n]=e}}function E(e,t){if(e===t)return null;const o=M(e),n=M(t),r=[];for(const s of n)o.has(s)||r.push(s);for(const s of o)n.has(s)||r.push(s);return 0===r.length?null:r}function M(e){return new Set(e?e.trim().split(/\s+/):[])}const w=e.memo(e.forwardRef((o,n)=>{const{map:r,mapLib:s}=e.useContext(b),a=e.useRef({props:o}),i=e.useMemo(()=>{let t=!1;e.Children.forEach(o.children,e=>{e&&(t=!0)});const n={...o,element:t?document.createElement("div"):void 0},r=new s.Marker(n);return r.setLngLat([o.longitude,o.latitude]),r.getElement().addEventListener("click",e=>{var t,o;null==(o=(t=a.current.props).onClick)||o.call(t,{type:"click",target:r,originalEvent:e})}),r.on("dragstart",e=>{var t,o;const n=e;n.lngLat=i.getLngLat(),null==(o=(t=a.current.props).onDragStart)||o.call(t,n)}),r.on("drag",e=>{var t,o;const n=e;n.lngLat=i.getLngLat(),null==(o=(t=a.current.props).onDrag)||o.call(t,n)}),r.on("dragend",e=>{var t,o;const n=e;n.lngLat=i.getLngLat(),null==(o=(t=a.current.props).onDragEnd)||o.call(t,n)}),r},[]);e.useEffect(()=>(i.addTo(r.getMap()),()=>{i.remove()}),[]);const{longitude:l,latitude:c,offset:u,style:d,draggable:p=!1,popup:m=null,rotation:f=0,rotationAlignment:g="auto",pitchAlignment:h="auto"}=o;e.useEffect(()=>{S(i.getElement(),d)},[d]),e.useImperativeHandle(n,()=>i,[]);const y=a.current.props;i.getLngLat().lng===l&&i.getLngLat().lat===c||i.setLngLat([l,c]),u&&!function(e,t){const o=Array.isArray(e)?e[0]:e?e.x:0,n=Array.isArray(e)?e[1]:e?e.y:0,r=Array.isArray(t)?t[0]:t?t.x:0,s=Array.isArray(t)?t[1]:t?t.y:0;return o===r&&n===s}(i.getOffset(),u)&&i.setOffset(u),i.isDraggable()!==p&&i.setDraggable(p),i.getRotation()!==f&&i.setRotation(f),i.getRotationAlignment()!==g&&i.setRotationAlignment(g),i.getPitchAlignment()!==h&&i.setPitchAlignment(h),i.getPopup()!==m&&i.setPopup(m);const v=E(y.className,o.className);if(v)for(const e of v)i.toggleClassName(e);return a.current.props=o,t.createPortal(o.children,i.getElement())})),x=e.memo(e.forwardRef((o,n)=>{const{map:r,mapLib:s}=e.useContext(b),i=e.useMemo(()=>document.createElement("div"),[]),l=e.useRef({props:o}),c=e.useMemo(()=>{const e={...o},t=new s.Popup(e);return t.setLngLat([o.longitude,o.latitude]),t.once("open",e=>{var t,o;null==(o=(t=l.current.props).onOpen)||o.call(t,e)}),t},[]);if(e.useEffect(()=>{const e=e=>{var t,o;null==(o=(t=l.current.props).onClose)||o.call(t,e)};return c.on("close",e),c.setDOMContent(i).addTo(r.getMap()),()=>{c.off("close",e),c.isOpen()&&c.remove()}},[]),e.useEffect(()=>{S(c.getElement(),o.style)},[o.style]),e.useImperativeHandle(n,()=>c,[]),c.isOpen()){const e=l.current.props;c.getLngLat().lng===o.longitude&&c.getLngLat().lat===o.latitude||c.setLngLat([o.longitude,o.latitude]),o.offset&&!a(e.offset,o.offset)&&c.setOffset(o.offset),e.anchor===o.anchor&&e.maxWidth===o.maxWidth||(c.options.anchor=o.anchor,c.setMaxWidth(o.maxWidth));const t=E(e.className,o.className);if(t)for(const o of t)c.toggleClassName(o);l.current.props=o}return t.createPortal(o.children,i)}));function P(t,o,n,r){const s=e.useContext(b),a=e.useMemo(()=>t(s),[]);return e.useEffect(()=>{const e=o,t="function"==typeof o?o:null,{map:n}=s;return n.hasControl(a)||n.addControl(a,null==e?void 0:e.position),()=>{t&&t(s),n.hasControl(a)&&n.removeControl(a)}},[]),a}e.memo(function(t){const o=P(({mapLib:e})=>new e.AttributionControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null}),e.memo(function(t){const o=P(({mapLib:e})=>new e.FullscreenControl({container:t.containerId&&document.getElementById(t.containerId)}),{position:t.position});return e.useEffect(()=>{S(o._controlContainer,t.style)},[t.style]),null}),e.memo(e.forwardRef(function(t,o){const n=e.useRef({props:t}),r=P(({mapLib:e})=>{const o=new e.GeolocateControl(t),r=o._setupUI;return o._setupUI=()=>{o._container.hasChildNodes()||r()},o.on("geolocate",e=>{var t,o;null==(o=(t=n.current.props).onGeolocate)||o.call(t,e)}),o.on("error",e=>{var t,o;null==(o=(t=n.current.props).onError)||o.call(t,e)}),o.on("outofmaxbounds",e=>{var t,o;null==(o=(t=n.current.props).onOutOfMaxBounds)||o.call(t,e)}),o.on("trackuserlocationstart",e=>{var t,o;null==(o=(t=n.current.props).onTrackUserLocationStart)||o.call(t,e)}),o.on("trackuserlocationend",e=>{var t,o;null==(o=(t=n.current.props).onTrackUserLocationEnd)||o.call(t,e)}),o},{position:t.position});return n.current.props=t,e.useImperativeHandle(o,()=>r,[]),e.useEffect(()=>{S(r._container,t.style)},[t.style]),null})),e.memo(function(t){const o=P(({mapLib:e})=>new e.NavigationControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null});const k=e.memo(function(t){const o=P(({mapLib:e})=>new e.ScaleControl(t),{position:t.position}),n=e.useRef(t),r=n.current;n.current=t;const{style:s}=t;return void 0!==t.maxWidth&&t.maxWidth!==r.maxWidth&&(o.options.maxWidth=t.maxWidth),void 0!==t.unit&&t.unit!==r.unit&&o.setUnit(t.unit),e.useEffect(()=>{S(o._container,s)},[s]),null});function R(e,t){if(!e)throw new Error(t)}e.memo(function(t){const o=P(({mapLib:e})=>new e.TerrainControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null}),e.memo(function(t){const o=P(({mapLib:e})=>new e.LogoControl(t),{position:t.position});return e.useEffect(()=>{S(o._container,t.style)},[t.style]),null});let I=0;function z(t){const o=e.useContext(b).map.getMap(),n=e.useRef(t),[,r]=e.useState(0),s=e.useMemo(()=>t.id||"jsx-source-"+I++,[]);e.useEffect(()=>{if(o){const e=()=>setTimeout(()=>r(e=>e+1),0);return o.on("styledata",e),e(),()=>{var t;if(o.off("styledata",e),o.style&&o.style._loaded&&o.getSource(s)){const e=null==(t=o.getStyle())?void 0:t.layers;if(e)for(const t of e)t.source===s&&o.removeLayer(t.id);o.removeSource(s)}}}},[o]);let i=o&&o.style&&o.getSource(s);return i?function(e,t,o){var n,r,s;R(t.id===o.id,"source id changed"),R(t.type===o.type,"source type changed");let i="",l=0;for(const u in t)"children"===u||"id"===u||a(o[u],t[u])||(i=u,l++);if(!l)return;const c=t.type;if("geojson"===c)e.setData(t.data);else if("image"===c)e.updateImage({url:t.url,coordinates:t.coordinates});else switch(i){case"coordinates":null==(n=e.setCoordinates)||n.call(e,t.coordinates);break;case"url":null==(r=e.setUrl)||r.call(e,t.url);break;case"tiles":null==(s=e.setTiles)||s.call(e,t.tiles)}}(i,t,n.current):i=function(e,t,o){if(e.style&&e.style._loaded){const n={...o};return delete n.id,delete n.children,e.addSource(t,n),e.getSource(t)}return null}(o,s,t),n.current=t,i&&e.Children.map(t.children,t=>t&&e.cloneElement(t,{source:s}))||null}let j=0;function T(t){const o=e.useContext(b).map.getMap(),n=e.useRef(t),[,r]=e.useState(0),s=e.useMemo(()=>t.id||"jsx-layer-"+j++,[]);if(e.useEffect(()=>{if(o){const e=()=>r(e=>e+1);return o.on("styledata",e),e(),()=>{o.off("styledata",e),o.style&&o.style._loaded&&o.getLayer(s)&&o.removeLayer(s)}}},[o]),o&&o.style&&o.getLayer(s))try{!function(e,t,o,n){if(R(o.id===n.id,"layer id changed"),R(o.type===n.type,"layer type changed"),"custom"===o.type||"custom"===n.type)return;const{layout:r={},paint:s={},filter:i,minzoom:l,maxzoom:c,beforeId:u}=o;if(u!==n.beforeId&&e.moveLayer(t,u),r!==n.layout){const o=n.layout||{};for(const n in r)a(r[n],o[n])||e.setLayoutProperty(t,n,r[n]);for(const n in o)r.hasOwnProperty(n)||e.setLayoutProperty(t,n,void 0)}if(s!==n.paint){const o=n.paint||{};for(const n in s)a(s[n],o[n])||e.setPaintProperty(t,n,s[n]);for(const n in o)s.hasOwnProperty(n)||e.setPaintProperty(t,n,void 0)}a(i,n.filter)||e.setFilter(t,i),l===n.minzoom&&c===n.maxzoom||e.setLayerZoomRange(t,l,c)}(o,s,t,n.current)}catch(i){}else!function(e,t,o){if(e.style&&e.style._loaded&&(!("source"in o)||e.getSource(o.source))){const n={...o,id:t};delete n.beforeId,e.addLayer(n,o.beforeId)}}(o,s,t);return n.current=t,null}const O="pymc-basemap-mode",U="dark";function A(){if("undefined"==typeof window)return U;try{const e=localStorage.getItem(O);if("light"===e||"dark"===e)return e}catch{}return U}function F(e){if("undefined"!=typeof window)try{localStorage.setItem(O,e)}catch{}}const W=o(e=>({mode:A(),toggle:()=>e(e=>{const t="light"===e.mode?"dark":"light";return F(t),{mode:t}}),setMode:t=>{F(t),e({mode:t})}})),D=()=>W(e=>e.mode),Z=()=>W(e=>e.toggle),N={light:"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json",dark:"https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json"},H={light:"basemap-light-",dark:"basemap-dark-"},B={};function q({mode:t}){const{current:o}=s(),[n,r]=e.useState(null),a=e.useRef({light:!1,dark:!1}),i=e.useRef({light:[],dark:[]});e.useEffect(()=>{const e=()=>{var e;const t=null==(e=null==o?void 0:o.getMap)?void 0:e.call(o);t&&!n&&r(t)};e();const t=setInterval(e,50),s=setTimeout(()=>clearInterval(t),5e3);return()=>{clearInterval(t),clearTimeout(s)}},[o,n]);const l=e.useCallback(async(e,t,o)=>{var n,r;if(a.current[t])return;const s=H[t],l=await async function(e){if(B[e])return B[e];const t=await fetch(N[e]),o=await t.json();return B[e]=o,o}(t),c=[];for(const[a,i]of Object.entries(l.sources||{})){const t=s+a;e.getSource(t)||e.addSource(t,i)}const u=null==(r=((null==(n=e.getStyle())?void 0:n.layers)||[]).find(e=>!e.id.startsWith("basemap-light-")&&!e.id.startsWith("basemap-dark-")))?void 0:r.id;for(const a of l.layers||[]){const t=s+a.id;if(c.push(t),e.getLayer(t))continue;const n={...a,id:t};"source"in n&&"string"==typeof n.source&&(n.source=s+n.source),n.layout||(n.layout={}),n.layout.visibility=o?"visible":"none";try{e.addLayer(n,u)}catch(d){}}i.current[t]=c,a.current[t]=!0},[]),c=e.useCallback((e,t,o)=>{const n=i.current[t],r=o?"visible":"none";for(const s of n)if(e.getLayer(s))try{e.setLayoutProperty(s,"visibility",r)}catch{}},[]),u=e.useCallback(e=>{var t;const o=((null==(t=e.getStyle())?void 0:t.layers)||[]).filter(e=>!e.id.startsWith("basemap-light-")&&!e.id.startsWith("basemap-dark-"));for(const n of o)try{e.moveLayer(n.id)}catch{}},[]);return e.useEffect(()=>{if(!n)return;const e=e=>{n.hasImage(e.id)||n.addImage(e.id,{width:1,height:1,data:new Uint8Array([0,0,0,0])})};return n.on("styleimagemissing",e),()=>{n.off("styleimagemissing",e)}},[n]),e.useEffect(()=>{if(!n)return;let e=!1;const o=async()=>{if(!e)try{await Promise.all([l(n,"light","light"===t),l(n,"dark","dark"===t)]),e||u(n)}catch(o){}};n.isStyleLoaded()?o():(n.once("style.load",o),n.once("load",()=>{e||a.current.light||o()}));const r=()=>{e||setTimeout(()=>{!e&&a.current.light&&a.current.dark&&u(n)},100)};return n.on("styledata",r),()=>{e=!0,n.off("styledata",r)}},[n,l,u,t]),e.useEffect(()=>{n&&a.current.light&&a.current.dark&&(c(n,"light","light"===t),c(n,"dark","dark"===t))},[n,t,c]),null}export{q as B,T as L,L as M,x as P,z as S,w as a,s as b,Z as c,k as d,D as u}; diff --git a/frontend/dist/assets/Card-BiYlryJL.js b/frontend/dist/assets/Card-CCBguhJs.js similarity index 92% rename from frontend/dist/assets/Card-BiYlryJL.js rename to frontend/dist/assets/Card-CCBguhJs.js index 270e0840..1512c5a7 100644 --- a/frontend/dist/assets/Card-BiYlryJL.js +++ b/frontend/dist/assets/Card-CCBguhJs.js @@ -1 +1 @@ -import{j as e,c as s}from"./vendor-react-DFCqJxYC.js";import{B as l}from"./index-CZBrdv20.js";function t({title:t,icon:r,badge:i,badgeColor:a="teal",subtitle:c,actions:n,iconColor:x="text-icon-card-title",largeTitle:d=!1,listHeader:m=!1,stackActionsOnMobile:o=!1}){return o&&n?e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",m?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 min-h-[32px]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[r&&e.jsx("span",{className:s("icon-md flex items-center justify-center",x),children:r}),e.jsx("span",{className:s(d?"type-subheading text-text-primary":"type-micro"),children:t}),i&&e.jsx(l,{color:a,children:i})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:n})]}),c&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:c})]}):e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",m?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 min-h-[32px]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[r&&e.jsx("span",{className:s("icon-md flex items-center justify-center",x),children:r}),e.jsx("span",{className:s(d?"type-subheading text-text-primary":"type-micro"),children:t}),i&&e.jsx(l,{color:a,children:i})]}),n&&e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:n})]}),c&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:c})]})}function r({children:l,centered:t,className:r}){return e.jsx("div",{className:s("flex-1 min-h-0",t&&"flex items-center justify-center",r),children:l})}export{t as C,r as a}; +import{j as e,c as s}from"./vendor-react-Cwum97tW.js";import{B as l}from"./index-D22MpaCY.js";function t({title:t,icon:r,badge:i,badgeColor:a="teal",subtitle:c,actions:n,iconColor:x="text-icon-card-title",largeTitle:d=!1,listHeader:m=!1,stackActionsOnMobile:o=!1}){return o&&n?e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",m?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 min-h-[32px]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[r&&e.jsx("span",{className:s("icon-md flex items-center justify-center",x),children:r}),e.jsx("span",{className:s(d?"type-subheading text-text-primary":"type-micro"),children:t}),i&&e.jsx(l,{color:a,children:i})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:n})]}),c&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:c})]}):e.jsxs("div",{className:s("flex flex-col gap-1 flex-shrink-0",m?"px-4 py-3 border-b border-border-subtle bg-bg-elevated/20":"mb-3"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 min-h-[32px]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[r&&e.jsx("span",{className:s("icon-md flex items-center justify-center",x),children:r}),e.jsx("span",{className:s(d?"type-subheading text-text-primary":"type-micro"),children:t}),i&&e.jsx(l,{color:a,children:i})]}),n&&e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:n})]}),c&&e.jsx("p",{className:"type-label text-text-muted ml-8",children:c})]})}function r({children:l,centered:t,className:r}){return e.jsx("div",{className:s("flex-1 min-h-0",t&&"flex items-center justify-center",r),children:l})}export{t as C,r as a}; diff --git a/frontend/dist/assets/CollisionExplorerModal-CX6f3IBB.js b/frontend/dist/assets/CollisionExplorerModal-BmT8XQYy.js similarity index 90% rename from frontend/dist/assets/CollisionExplorerModal-CX6f3IBB.js rename to frontend/dist/assets/CollisionExplorerModal-BmT8XQYy.js index c1736ba6..0bc48a6c 100644 --- a/frontend/dist/assets/CollisionExplorerModal-CX6f3IBB.js +++ b/frontend/dist/assets/CollisionExplorerModal-BmT8XQYy.js @@ -1 +1 @@ -import{r as e,j as s,c as t}from"./vendor-react-DFCqJxYC.js";import{u as a,M as i,B as o,S as n,L as r,a as l}from"./BasemapLayer-B5scdheQ.js";import"./maplibre-gl-Bk5DsYkB.js";import{c as d,q as c,ak as h,r as u,K as m,N as x,ab as p,B as v}from"./index-CZBrdv20.js";import{T as g}from"./triangle-alert-DlaBoont.js";import{M as b}from"./map-pin-BnrkOs2D.js";import{C as f,a as j}from"./DataBox-BuwfTaKv.js";const y=d("messages-square",[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]]),N=d("monitor-smartphone",[["path",{d:"M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8",key:"10dyio"}],["path",{d:"M10 19v-3.96 3.15",key:"1irgej"}],["path",{d:"M7 19h5",key:"qswx4l"}],["rect",{width:"6",height:"10",x:"16",y:"12",rx:"2",key:"1egngj"}]]),w=d("share-2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]),k={version:8,sources:{},layers:[],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"};function M({node:a,isHovered:i,onHover:o}){const[n,r]=e.useState(!1),l=e.useCallback(e=>{var s,t;e.stopPropagation(),s=a.hash,(null==(t=navigator.clipboard)?void 0:t.writeText)&&navigator.clipboard.writeText(s).catch(()=>{}),r(!0),setTimeout(()=>r(!1),2e3)},[a.hash]),d=a.contactType.toLowerCase(),c=d.includes("room")||d.includes("server");let h=w,u="text-accent-primary";return c?(h=y,u="text-signal-fair"):"companion"===d||"client"===d?(h=N,u="text-text-muted"):a.isNeighbor&&(u="text-accent-success"),s.jsxs("div",{className:t("flex items-center gap-3 px-3 py-2.5 radius-inner transition-base cursor-pointer",i?"bg-accent-primary/10":"hover:bg-white/[0.03]"),onMouseEnter:()=>o(a.hash),onMouseLeave:()=>o(null),children:[s.jsx(h,{className:t("w-4 h-4 flex-shrink-0",u)}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"text-sm font-medium text-text-primary truncate",children:a.name}),a.isNeighbor&&s.jsx(v,{color:"green",compact:!0,children:"NBR"}),a.isRepeater&&s.jsx(v,{color:"zinc",compact:!0,children:"RPT"}),a.isHub&&s.jsx(v,{color:"purple",compact:!0,children:"HUB"})]}),s.jsxs("button",{onClick:l,className:t("mt-1 inline-flex items-center gap-1 text-[10px] font-mono px-1.5 py-0.5 rounded","border transition-all cursor-pointer",n?"border-accent-success/50 bg-accent-success/10 text-accent-success":"border-border-subtle bg-bg-subtle/50 text-text-muted hover:border-border-strong"),title:`Copy: ${a.hash}`,children:[a.hash.slice(0,12),"…",n?s.jsx(f,{className:"w-2.5 h-2.5"}):s.jsx(j,{className:"w-2.5 h-2.5 opacity-50"})]})]})]})}function H({nodes:d,hoveredHash:c,onHover:h}){const u=a(),m=e.useRef(null),x=p(),[g,f]=e.useState(!1),j=e.useMemo(()=>d.filter(e=>null!=e.latitude&&null!=e.longitude&&(0!==e.latitude||0!==e.longitude)),[d]),y=e.useMemo(()=>{if(0===j.length)return null;let e=1/0,s=-1/0,t=1/0,a=-1/0;for(const i of j)e=Math.min(e,i.longitude),s=Math.max(s,i.longitude),t=Math.min(t,i.latitude),a=Math.max(a,i.latitude);if(a-t<.01){const e=(a+t)/2;t=e-.005,a=e+.005}if(s-e<.01){const t=(s+e)/2;e=t-.005,s=t+.005}return[[e,t],[s,a]]},[j]),N=e.useMemo(()=>y?{longitude:(y[0][0]+y[1][0])/2,latitude:(y[0][1]+y[1][1])/2}:{longitude:0,latitude:0},[y]),w=e.useMemo(()=>{if(j.length<2)return null;const e=[];for(let s=0;s{var e;const s=null==(e=m.current)?void 0:e.getMap();s&&y?(s.fitBounds(y,{padding:{top:50,bottom:50,left:50,right:50},maxZoom:13,duration:0}),setTimeout(()=>f(!0),50)):f(!0)},[y]),H=x&&g;return 0===j.length?s.jsx("div",{className:"h-full flex items-center justify-center bg-bg-subtle/30 radius-inner",children:s.jsxs("div",{className:"text-center text-text-secondary p-4",children:[s.jsx(b,{className:"w-8 h-8 mx-auto mb-2 opacity-40"}),s.jsx("p",{className:"text-sm",children:"No location data available"})]})}):s.jsxs("div",{className:"h-full w-full relative radius-inner overflow-hidden bg-bg-elevated",children:[s.jsx("div",{className:t("absolute inset-0 flex items-center justify-center z-10","transition-opacity duration-200 pointer-events-none",H?"opacity-0":"opacity-100 bg-bg-elevated"),children:s.jsx("div",{className:"w-5 h-5 border-2 border-text-muted/30 border-t-text-muted rounded-full animate-spin"})}),s.jsx("div",{className:t("h-full w-full transition-opacity duration-200",H?"opacity-100":"opacity-0"),children:s.jsxs(i,{ref:m,initialViewState:{longitude:N.longitude,latitude:N.latitude,zoom:10},style:{height:"100%",width:"100%"},mapStyle:k,attributionControl:!1,onLoad:M,children:[s.jsx(o,{mode:u}),w&&s.jsx(n,{id:"collision-edges",type:"geojson",data:w,children:s.jsx(r,{id:"collision-edges-line",type:"line",paint:{"line-color":"#3B3F4A","line-width":2,"line-opacity":.8},layout:{"line-cap":"round","line-join":"round"}})}),j.map(e=>{const t=e.hash===c,a=e.hash.startsWith("0x")?e.hash.slice(2,4).toUpperCase():e.hash.slice(0,2).toUpperCase();return s.jsx(l,{longitude:e.longitude,latitude:e.latitude,anchor:"center",children:s.jsx("div",{className:"cursor-pointer transition-all duration-150",onMouseEnter:()=>h(e.hash),onMouseLeave:()=>h(null),style:{pointerEvents:"auto"},children:s.jsxs(v,{color:"amber",filled:!0,className:"font-mono text-[10px] shadow-lg",children:[a,t&&s.jsx("span",{className:"ml-1 opacity-75 font-sans",children:e.name})]})})},e.hash)})]})})]})}const C=e.memo(function({isOpen:t,prefix:a,candidateHashes:i,onClose:o}){const n=c(),r=h(),l=u(),[d,p]=e.useState(null),v=e.useMemo(()=>new Set(l.map(e=>e.hash)),[l]),b=(null==n?void 0:n.neighbors)??{},f=e.useMemo(()=>i.map(e=>{var s;const t=(e=>b[e]?b[e]:!e.startsWith("0x")&&b["0x"+e]?b["0x"+e]:e.startsWith("0x")&&b[e.slice(2)]?b[e.slice(2)]:void 0)(e);return{hash:e,name:(null==t?void 0:t.node_name)||(null==t?void 0:t.name)||`Unknown (${e.slice(0,8)}…)`,contactType:(null==t?void 0:t.contact_type)||"",isRepeater:(null==t?void 0:t.is_repeater)||"repeater"===(null==(s=null==t?void 0:t.contact_type)?void 0:s.toLowerCase())||!1,isNeighbor:v.has(e)||v.has("0x"+e)||v.has(e.replace(/^0x/,"")),isHub:r.has(e),latitude:null==t?void 0:t.latitude,longitude:null==t?void 0:t.longitude}}).sort((e,s)=>e.isNeighbor!==s.isNeighbor?e.isNeighbor?-1:1:e.isHub!==s.isHub?e.isHub?-1:1:e.name.localeCompare(s.name)),[i,b,v,r]),j=e.useMemo(()=>f.some(e=>null!=e.latitude&&null!=e.longitude&&(0!==e.latitude||0!==e.longitude)),[f]),y=e.useCallback(e=>{p(e)},[]),N=j?"4xl":"lg";return t?s.jsxs(m,{open:t,onClose:o,size:N,motionPlus:!0,className:j?"sm:h-[500px] sm:max-h-[600px]":"",children:[s.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border-subtle",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"p-2 radius-inner bg-signal-fair/10",children:s.jsx(g,{className:"w-5 h-5 text-signal-fair"})}),s.jsxs("div",{children:[s.jsxs("div",{className:"text-base font-semibold text-text-primary",children:["Prefix Collision: ",s.jsx("span",{className:"font-mono text-accent-primary",children:a})]}),s.jsxs("p",{className:"text-xs text-text-secondary",children:[f.length," nodes share this prefix"]})]})]}),s.jsx("button",{onClick:o,className:"p-2 text-text-muted hover:text-text-primary transition-base radius-inner hover:bg-bg-subtle",children:s.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:s.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),s.jsxs(x,{className:"p-0 overflow-hidden flex-1 flex flex-col min-h-0",children:[s.jsxs("div",{className:"sm:hidden flex-1 overflow-y-auto",children:[j&&s.jsx("div",{className:"h-64 p-2 border-b border-border-subtle",children:s.jsx(H,{nodes:f,hoveredHash:d,onHover:y})}),s.jsx("div",{className:"p-2",children:f.map(e=>s.jsx(M,{node:e,isHovered:d===e.hash,onHover:y},e.hash))})]}),j?s.jsxs("div",{className:"hidden sm:grid sm:grid-cols-[280px_minmax(400px,1fr)] flex-1 overflow-hidden sm:min-w-[700px]",children:[s.jsx("div",{className:"overflow-y-auto border-r border-border-subtle",children:s.jsx("div",{className:"p-2",children:f.map(e=>s.jsx(M,{node:e,isHovered:d===e.hash,onHover:y},e.hash))})}),s.jsx("div",{className:"overflow-hidden p-2",children:s.jsx(H,{nodes:f,hoveredHash:d,onHover:y})})]}):s.jsx("div",{className:"hidden sm:block flex-1 overflow-y-auto",children:s.jsx("div",{className:"p-2",children:f.map(e=>s.jsx(M,{node:e,isHovered:d===e.hash,onHover:y},e.hash))})})]})]}):null});export{C,N as M,w as S}; +import{r as e,j as s,c as t}from"./vendor-react-Cwum97tW.js";import{u as a,M as i,B as o,S as n,L as r,a as l}from"./BasemapLayer-C9wiTbJT.js";import"./maplibre-gl-Bk5DsYkB.js";import{c as d,f as c,aa as h,h as u,C as m,E as x,a3 as p,B as v}from"./index-D22MpaCY.js";import{T as g}from"./triangle-alert-TfoZuZfW.js";import{M as b}from"./map-pin-kiJDSdn0.js";import{C as f,a as j}from"./DataBox-Bl0vntck.js";const y=d("messages-square",[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]]),N=d("monitor-smartphone",[["path",{d:"M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8",key:"10dyio"}],["path",{d:"M10 19v-3.96 3.15",key:"1irgej"}],["path",{d:"M7 19h5",key:"qswx4l"}],["rect",{width:"6",height:"10",x:"16",y:"12",rx:"2",key:"1egngj"}]]),w=d("share-2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]),M={version:8,sources:{},layers:[],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"};function k({node:a,isHovered:i,onHover:o}){const[n,r]=e.useState(!1),l=e.useCallback(e=>{var s,t;e.stopPropagation(),s=a.hash,(null==(t=navigator.clipboard)?void 0:t.writeText)&&navigator.clipboard.writeText(s).catch(()=>{}),r(!0),setTimeout(()=>r(!1),2e3)},[a.hash]),d=a.contactType.toLowerCase(),c=d.includes("room")||d.includes("server");let h=w,u="text-accent-primary";return c?(h=y,u="text-signal-fair"):"companion"===d||"client"===d?(h=N,u="text-text-muted"):a.isNeighbor&&(u="text-accent-success"),s.jsxs("div",{className:t("flex items-center gap-3 px-3 py-2.5 radius-inner transition-base cursor-pointer",i?"bg-accent-primary/10":"hover:bg-white/[0.03]"),onMouseEnter:()=>o(a.hash),onMouseLeave:()=>o(null),children:[s.jsx(h,{className:t("w-4 h-4 flex-shrink-0",u)}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"text-sm font-medium text-text-primary truncate",children:a.name}),a.isNeighbor&&s.jsx(v,{color:"green",compact:!0,children:"NBR"}),a.isRepeater&&s.jsx(v,{color:"zinc",compact:!0,children:"RPT"}),a.isHub&&s.jsx(v,{color:"purple",compact:!0,children:"HUB"})]}),s.jsxs("button",{onClick:l,className:t("mt-1 inline-flex items-center gap-1 text-[10px] font-mono px-1.5 py-0.5 rounded","border transition-all cursor-pointer",n?"border-accent-success/50 bg-accent-success/10 text-accent-success":"border-border-subtle bg-bg-subtle/50 text-text-muted hover:border-border-strong"),title:`Copy: ${a.hash}`,children:[a.hash.slice(0,12),"…",n?s.jsx(f,{className:"w-2.5 h-2.5"}):s.jsx(j,{className:"w-2.5 h-2.5 opacity-50"})]})]})]})}function H({nodes:d,hoveredHash:c,onHover:h}){const u=a(),m=e.useRef(null),x=p(),[g,f]=e.useState(!1),j=e.useMemo(()=>d.filter(e=>null!=e.latitude&&null!=e.longitude&&(0!==e.latitude||0!==e.longitude)),[d]),y=e.useMemo(()=>{if(0===j.length)return null;let e=1/0,s=-1/0,t=1/0,a=-1/0;for(const i of j)e=Math.min(e,i.longitude),s=Math.max(s,i.longitude),t=Math.min(t,i.latitude),a=Math.max(a,i.latitude);if(a-t<.01){const e=(a+t)/2;t=e-.005,a=e+.005}if(s-e<.01){const t=(s+e)/2;e=t-.005,s=t+.005}return[[e,t],[s,a]]},[j]),N=e.useMemo(()=>y?{longitude:(y[0][0]+y[1][0])/2,latitude:(y[0][1]+y[1][1])/2}:{longitude:0,latitude:0},[y]),w=e.useMemo(()=>{if(j.length<2)return null;const e=[];for(let s=0;s{var e;const s=null==(e=m.current)?void 0:e.getMap();s&&y?(s.fitBounds(y,{padding:{top:50,bottom:50,left:50,right:50},maxZoom:13,duration:0}),setTimeout(()=>f(!0),50)):f(!0)},[y]),H=x&&g;return 0===j.length?s.jsx("div",{className:"h-full flex items-center justify-center bg-bg-subtle/30 radius-inner",children:s.jsxs("div",{className:"text-center text-text-secondary p-4",children:[s.jsx(b,{className:"w-8 h-8 mx-auto mb-2 opacity-40"}),s.jsx("p",{className:"text-sm",children:"No location data available"})]})}):s.jsxs("div",{className:"h-full w-full relative radius-inner overflow-hidden bg-bg-elevated",children:[s.jsx("div",{className:t("absolute inset-0 flex items-center justify-center z-10","transition-opacity duration-200 pointer-events-none",H?"opacity-0":"opacity-100 bg-bg-elevated"),children:s.jsx("div",{className:"w-5 h-5 border-2 border-text-muted/30 border-t-text-muted rounded-full animate-spin"})}),s.jsx("div",{className:t("h-full w-full transition-opacity duration-200",H?"opacity-100":"opacity-0"),children:s.jsxs(i,{ref:m,initialViewState:{longitude:N.longitude,latitude:N.latitude,zoom:10},style:{height:"100%",width:"100%"},mapStyle:M,attributionControl:!1,onLoad:k,children:[s.jsx(o,{mode:u}),w&&s.jsx(n,{id:"collision-edges",type:"geojson",data:w,children:s.jsx(r,{id:"collision-edges-line",type:"line",paint:{"line-color":"#3B3F4A","line-width":2,"line-opacity":.8},layout:{"line-cap":"round","line-join":"round"}})}),j.map(e=>{const t=e.hash===c,a=e.hash.startsWith("0x")?e.hash.slice(2,4).toUpperCase():e.hash.slice(0,2).toUpperCase();return s.jsx(l,{longitude:e.longitude,latitude:e.latitude,anchor:"center",children:s.jsx("div",{className:"cursor-pointer transition-all duration-150",onMouseEnter:()=>h(e.hash),onMouseLeave:()=>h(null),style:{pointerEvents:"auto"},children:s.jsxs(v,{color:"amber",filled:!0,className:"font-mono text-[10px] shadow-lg",children:[a,t&&s.jsx("span",{className:"ml-1 opacity-75 font-sans",children:e.name})]})})},e.hash)})]})})]})}const C=e.memo(function({isOpen:t,prefix:a,candidateHashes:i,onClose:o}){const n=c(),r=h(),l=u(),[d,p]=e.useState(null),v=e.useMemo(()=>new Set(l.map(e=>e.hash)),[l]),b=(null==n?void 0:n.neighbors)??{},f=e.useMemo(()=>i.map(e=>{var s;const t=(e=>b[e]?b[e]:!e.startsWith("0x")&&b["0x"+e]?b["0x"+e]:e.startsWith("0x")&&b[e.slice(2)]?b[e.slice(2)]:void 0)(e);return{hash:e,name:(null==t?void 0:t.node_name)||(null==t?void 0:t.name)||`Unknown (${e.slice(0,8)}…)`,contactType:(null==t?void 0:t.contact_type)||"",isRepeater:(null==t?void 0:t.is_repeater)||"repeater"===(null==(s=null==t?void 0:t.contact_type)?void 0:s.toLowerCase())||!1,isNeighbor:v.has(e)||v.has("0x"+e)||v.has(e.replace(/^0x/,"")),isHub:r.has(e),latitude:null==t?void 0:t.latitude,longitude:null==t?void 0:t.longitude}}).sort((e,s)=>e.isNeighbor!==s.isNeighbor?e.isNeighbor?-1:1:e.isHub!==s.isHub?e.isHub?-1:1:e.name.localeCompare(s.name)),[i,b,v,r]),j=e.useMemo(()=>f.some(e=>null!=e.latitude&&null!=e.longitude&&(0!==e.latitude||0!==e.longitude)),[f]),y=e.useCallback(e=>{p(e)},[]),N=j?"4xl":"lg";return t?s.jsxs(m,{open:t,onClose:o,size:N,motionPlus:!0,className:j?"sm:h-[500px] sm:max-h-[600px]":"",children:[s.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border-subtle",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"p-2 radius-inner bg-signal-fair/10",children:s.jsx(g,{className:"w-5 h-5 text-signal-fair"})}),s.jsxs("div",{children:[s.jsxs("div",{className:"text-base font-semibold text-text-primary",children:["Prefix Collision: ",s.jsx("span",{className:"font-mono text-accent-primary",children:a})]}),s.jsxs("p",{className:"text-xs text-text-secondary",children:[f.length," nodes share this prefix"]})]})]}),s.jsx("button",{onClick:o,className:"p-2 text-text-muted hover:text-text-primary transition-base radius-inner hover:bg-bg-subtle",children:s.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:s.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),s.jsxs(x,{className:"p-0 overflow-hidden flex-1 flex flex-col min-h-0",children:[s.jsxs("div",{className:"sm:hidden flex-1 overflow-y-auto",children:[j&&s.jsx("div",{className:"h-64 p-2 border-b border-border-subtle",children:s.jsx(H,{nodes:f,hoveredHash:d,onHover:y})}),s.jsx("div",{className:"p-2",children:f.map(e=>s.jsx(k,{node:e,isHovered:d===e.hash,onHover:y},e.hash))})]}),j?s.jsxs("div",{className:"hidden sm:grid sm:grid-cols-[280px_minmax(400px,1fr)] flex-1 overflow-hidden sm:min-w-[700px]",children:[s.jsx("div",{className:"overflow-y-auto border-r border-border-subtle",children:s.jsx("div",{className:"p-2",children:f.map(e=>s.jsx(k,{node:e,isHovered:d===e.hash,onHover:y},e.hash))})}),s.jsx("div",{className:"overflow-hidden p-2",children:s.jsx(H,{nodes:f,hoveredHash:d,onHover:y})})]}):s.jsx("div",{className:"hidden sm:block flex-1 overflow-y-auto",children:s.jsx("div",{className:"p-2",children:f.map(e=>s.jsx(k,{node:e,isHovered:d===e.hash,onHover:y},e.hash))})})]})]}):null});export{C,N as M,w as S}; diff --git a/frontend/dist/assets/Configuration-Df5yvVwq.js b/frontend/dist/assets/Configuration-Bh26u4ks.js similarity index 91% rename from frontend/dist/assets/Configuration-Df5yvVwq.js rename to frontend/dist/assets/Configuration-Bh26u4ks.js index 53ec0096..54ba2abd 100644 --- a/frontend/dist/assets/Configuration-Df5yvVwq.js +++ b/frontend/dist/assets/Configuration-Bh26u4ks.js @@ -1 +1 @@ -import{r as e,j as t,c as s}from"./vendor-react-DFCqJxYC.js";import{c as a,bF as r,bG as n,bH as l,bI as c,bJ as i,_ as o,aA as d,bK as u,bL as m,bM as x,O as p,bN as h,R as b,bf as y}from"./index-CZBrdv20.js";import{T as g,P as f,C as j}from"./ConfirmModal-OyBnZ1Rq.js";import{l as v}from"./font-loader-jlbdh9Fw.js";import{N}from"./NodeInformationCard-D_WIPYcK.js";import{a as w,P as k,b as C,B as S}from"./PageLayout-Dz1NyqHa.js";import{C as _}from"./Card-BiYlryJL.js";import{L as T}from"./loader-circle-BLG0SL8e.js";import{C as F,a as E}from"./DataBox-BuwfTaKv.js";import{I as M}from"./info-pu09_Xxl.js";import{R as L,C as P}from"./Grid-TNw012c2.js";import{C as R}from"./circle-check-BQrKpAc_.js";import{T as z}from"./triangle-alert-DlaBoont.js";import{R as D}from"./refresh-cw-B42SG81L.js";import{C as A}from"./chevron-right-CchtyLvr.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-Dhs13Wlh.js";const I=a("antenna",[["path",{d:"M2 12 7 2",key:"117k30"}],["path",{d:"m7 12 5-10",key:"1tvx22"}],["path",{d:"m12 12 5-10",key:"ev1o1a"}],["path",{d:"m17 12 5-10",key:"1e4ti3"}],["path",{d:"M4.5 7h15",key:"vlsxkz"}],["path",{d:"M12 16v6",key:"c8a4gj"}]]),O=a("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]),K=a("folder-key",[["circle",{cx:"16",cy:"20",r:"2",key:"1vifvg"}],["path",{d:"M10 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v2",key:"3hgo9p"}],["path",{d:"m22 14-4.5 4.5",key:"1ef6z8"}],["path",{d:"m21 15 1 1",key:"1ejcpy"}]]),q=a("folder-lock",[["rect",{width:"8",height:"5",x:"14",y:"17",rx:"1",key:"19aais"}],["path",{d:"M10 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v2.5",key:"1w6v7t"}],["path",{d:"M20 17v-2a2 2 0 1 0-4 0v2",key:"pwaxnr"}]]),H=a("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]),V=a("monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]),$=a("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]),Y=a("shield-check",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),U=a("shield-x",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]]),B=a("triangle-dashed",[["path",{d:"M10.17 4.193a2 2 0 0 1 3.666.013",key:"pltmmw"}],["path",{d:"M14 21h2",key:"v4qezv"}],["path",{d:"m15.874 7.743 1 1.732",key:"10m0iw"}],["path",{d:"m18.849 12.952 1 1.732",key:"zadnam"}],["path",{d:"M21.824 18.18a2 2 0 0 1-1.835 2.824",key:"fvwuk4"}],["path",{d:"M4.024 21a2 2 0 0 1-1.839-2.839",key:"1e1kah"}],["path",{d:"m5.136 12.952-1 1.732",key:"1u4ldi"}],["path",{d:"M8 21h2",key:"i9zjee"}],["path",{d:"m8.102 7.743-1 1.732",key:"1zzo4u"}]]);async function J(e){return r("/api/update_web_config",{method:"POST",body:JSON.stringify(e)})}const X=e.memo(function(){const{theme:e}=n(),{colorScheme:s}=e,a=l.find(e=>e.colorScheme===s)??l[0],r=a.displaySize,c=`clamp(${.8*r}rem, ${.6*r}rem + 1.5vw, ${1.4*r}rem)`;return t.jsx("div",{className:"h-10 flex items-center justify-center",children:t.jsxs("span",{className:"font-medium transition-all duration-300 leading-none text-center",style:{fontFamily:a.displayFont,color:a.displayColor,fontSize:c,fontOpticalSizing:"auto",letterSpacing:"-0.03em"},children:["Theme: ",a.displayName]})})}),G=e.memo(function(){const{theme:a,setThemePreset:r,setBrightness:i}=n(),{colorScheme:o,brightness:d}=a,[u,m]=e.useState(!1),[x,p]=e.useState(!1),h=e.useRef(null),b=e.useRef(null),y=(l.find(e=>e.colorScheme===o)??l[0]).id,g=e.useCallback((e,t)=>{if(!b.current)return d;const s=(b.current.y-e)/(t?200:80)*100;return Math.round(Math.max(0,Math.min(100,b.current.brightness+s)))},[d]),f=e.useCallback(e=>{r(e),m(!0)},[r]),j=e.useCallback(e=>{i(e)},[i]),v=e.useCallback(e=>{const t=l.find(t=>t.id===e);t&&c(t.backgroundImage)},[]);return t.jsx("div",{className:"grid grid-cols-4 gap-[3%] w-full",children:l.map(e=>{const a=y===e.id,r=!e.backgroundImage,n=a&&!r&&(u||x);return t.jsxs("div",{ref:a?h:void 0,title:e.displayName,className:s("flex flex-col items-stretch rounded-sm transition-all duration-300 ease-out overflow-hidden",a?"ring-2 ring-accent-primary scale-105 "+(r?"cursor-pointer":"cursor-ns-resize"):"cursor-pointer"),onMouseEnter:()=>{a&&!r?m(!0):a||v(e.id)},onMouseLeave:()=>!x&&m(!1),onClick:()=>!a&&f(e.id),onTouchStart:e=>{if(!a||r)return;e.preventDefault();const t=e.touches[0];b.current={y:t.clientY,brightness:d},p(!0),m(!0);const s=e=>{e.preventDefault();const t=e.touches[0];j(g(t.clientY,!0))},n=()=>{document.removeEventListener("touchmove",s),document.removeEventListener("touchend",n),b.current=null,p(!1),setTimeout(()=>m(!1),1500)};document.addEventListener("touchmove",s,{passive:!1}),document.addEventListener("touchend",n)},onMouseDown:e=>{if(!a||r)return;e.preventDefault(),b.current={y:e.clientY,brightness:d},p(!0),m(!0);const t=e=>{j(g(e.clientY,!1))},s=()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",s),b.current=null,p(!1)};document.addEventListener("mousemove",t),document.addEventListener("mouseup",s)},children:[t.jsxs("div",{className:"glass-thumbnail w-full aspect-square sm:aspect-[4/3] lg:aspect-video relative !rounded-b-none",children:["kde breeze"===e.id?t.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-[#242627]",style:{opacity:n?.4:1},children:t.jsx("span",{className:"text-[#58b99d] text-[1.5em] font-bold font-mono",children:">"})}):"ribbon"===e.id?t.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-[#F5F5F5]",style:{opacity:n?.4:1},children:t.jsx("span",{className:"text-[#2D2D2D] text-[1.5em] font-bold font-mono",children:"R"})}):t.jsx("div",{className:"absolute bg-cover bg-center transition-opacity duration-200",style:{inset:0,backgroundImage:`url(${e.backgroundImage})`,opacity:n?.4:1,filter:"brightness(var(--thumbnail-brightness, 1.5))"}}),a&&t.jsxs("div",{className:s("absolute inset-0 transition-opacity duration-200",n?"opacity-100":"opacity-0"),children:[t.jsx("div",{className:"absolute inset-x-0 bottom-0 bg-black/70 transition-all duration-100 ease-out",style:{height:100-d+"%"}}),t.jsx("div",{className:"absolute inset-x-[8%] h-0.5 bg-white rounded-full shadow-lg transition-all duration-100 ease-out",style:{top:100-d+"%"}}),t.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:t.jsxs("span",{className:"text-[0.6em] font-mono font-bold text-white drop-shadow-lg",children:[d,"%"]})})]})]}),t.jsx("div",{className:"flex flex-col w-full",children:e.paletteColors.map((e,s)=>t.jsx("div",{className:"flex",children:e.map((e,s)=>t.jsx("div",{className:"flex-1 aspect-[2/1]",style:{backgroundColor:e}},s))},s))})]},e.id)})})}),W=e.memo(function({layout:s="horizontal"}){return e.useEffect(()=>{v()},[]),"logo-only"===s?t.jsx(X,{}):"thumbnails-only"===s?t.jsx(G,{}):t.jsxs("div",{className:"flex flex-col items-center gap-3",children:[t.jsx(X,{}),t.jsx(G,{})]})});function Q(){const{latitude:a,longitude:r,enabled:n,setLocation:l,enable:c,disable:d,clear:u}=i(),[m,x]=e.useState(!1),[p,h]=e.useState(""),[b,y]=e.useState(""),[f,j]=e.useState("idle"),[v,N]=e.useState(null),k=e.useRef(null),C=e.useRef(null),S=e.useRef(!0);e.useEffect(()=>(S.current=!0,()=>{S.current=!1,C.current&&clearTimeout(C.current)}),[]);const E=()=>{x(!1),N(null)};e.useEffect(()=>{if(!m)return;const e=e=>{"loading"!==f&&k.current&&!k.current.contains(e.target)&&E()};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[m,f]);const L=null!==a&&null!==r;return t.jsx(w,{children:t.jsxs("div",{ref:k,children:[t.jsxs("div",{className:"flex items-center justify-between mb-4",children:[t.jsx(_,{icon:t.jsx(B,{}),title:"Stealth",largeTitle:!0}),t.jsxs("div",{className:"flex items-center gap-1",children:[L&&!m&&t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:()=>{n?d():c()},className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2 mr-2",n?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle"),title:n?"Disable stealth location":"Enable stealth location",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",n?"translate-x-5":"translate-x-0.5")})}),t.jsx("button",{onClick:()=>{u(),x(!1)},className:"p-2 rounded-lg transition-colors text-text-muted hover:text-accent-danger hover:bg-accent-danger/10",title:"Clear stealth location",children:t.jsx(g,{className:"w-4 h-4"})})]}),m?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:E,disabled:"loading"===f,className:s("p-2 rounded-lg transition-colors","loading"===f?"text-text-muted cursor-not-allowed":"text-text-muted hover:text-accent-danger hover:bg-accent-danger/10"),title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})}),t.jsx("button",{onClick:()=>{if("loading"===f)return;C.current&&clearTimeout(C.current);const e=((e,t)=>{const s=parseFloat(e),a=parseFloat(t);return isNaN(s)||isNaN(a)?"Please enter valid numbers":s<-90||s>90?"Latitude must be between -90 and 90":a<-180||a>180?"Longitude must be between -180 and 180":0===s&&0===a?"Coordinates (0, 0) are invalid":null})(p,b);if(e)return void N(e);j("loading"),N(null);const t=parseFloat(p),s=parseFloat(b);l(t,s),n||c(),j("success"),C.current=setTimeout(()=>{S.current&&(j("idle"),x(!1))},1e3)},disabled:"loading"===f,className:s("p-2 rounded-lg transition-colors","loading"===f?"text-accent-primary cursor-wait":"success"===f?"text-accent-success":"error"===f?"text-accent-danger":"text-accent-success hover:bg-accent-success/10"),title:"Save",children:"loading"===f?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===f?t.jsx(F,{className:"w-4 h-4"}):"error"===f?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:()=>{h((null==a?void 0:a.toFixed(6))??""),y((null==r?void 0:r.toFixed(6))??""),N(null),x(!0)},className:"p-2 rounded-lg transition-colors text-text-muted hover:text-text-primary hover:bg-bg-subtle",title:L?"Edit stealth location":"Set stealth location",children:t.jsx($,{className:"w-4 h-4"})})]})]}),t.jsx("div",{className:"bg-accent-tertiary/5 rounded-xl p-3 mb-4",children:t.jsxs("div",{className:"flex gap-2",children:[t.jsx(M,{className:"w-4 h-4 text-accent-tertiary flex-shrink-0 mt-0.5"}),t.jsxs("p",{className:"type-body-sm text-text-muted",children:[t.jsx("span",{className:"text-text-secondary",children:"Stealth mode"})," allows you to appear on the map and in topology analysis without broadcasting your location. Coordinates are stored locally in your browser only — ",t.jsx("span",{className:"text-accent-tertiary",children:"never sent to config.yaml or the mesh"}),"."]})]})}),v&&t.jsx("div",{className:"text-xs mb-3 px-2 py-1.5 rounded-md text-accent-danger bg-accent-danger/10",children:v}),t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:m?"Latitude (°)":"Latitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",m?"bg-white/5":"bg-white/[0.02]"),children:m?t.jsx("input",{type:"number",value:p,onChange:e=>h(e.target.value),step:"0.000001",min:"-90",max:"90",placeholder:"e.g. 34.052234",className:"w-full bg-transparent text-text-primary focus:outline-none type-data placeholder:text-text-muted/50"}):t.jsx("span",{className:s("type-data",L&&n?"text-text-primary":"text-text-muted"),children:L?a.toFixed(6):"Not set"})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:m?"Longitude (°)":"Longitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",m?"bg-white/5":"bg-white/[0.02]"),children:m?t.jsx("input",{type:"number",value:b,onChange:e=>y(e.target.value),step:"0.000001",min:"-180",max:"180",placeholder:"e.g. -118.243685",className:"w-full bg-transparent text-text-primary focus:outline-none type-data placeholder:text-text-muted/50"}):t.jsx("span",{className:s("type-data",L&&n?"text-text-primary":"text-text-muted"),children:L?r.toFixed(6):"Not set"})})]})]}),L&&!m&&t.jsx("div",{className:"mt-3 pt-3 border-t border-border-subtle",children:t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:s("w-2 h-2 rounded-full",n?"bg-accent-success":"bg-text-muted")}),t.jsx("span",{className:"type-body-sm text-text-muted",children:n?"Stealth location active — you appear on maps with these coordinates":"Stealth location disabled — coordinates saved but not in use"})]})})]})})}const Z=[{value:7.8,label:"7.8 kHz"},{value:10.4,label:"10.4 kHz"},{value:15.6,label:"15.6 kHz"},{value:20.8,label:"20.8 kHz"},{value:31.25,label:"31.25 kHz"},{value:41.7,label:"41.7 kHz"},{value:62.5,label:"62.5 kHz"},{value:125,label:"125 kHz"},{value:250,label:"250 kHz"},{value:500,label:"500 kHz"}],ee=[5,6,7,8,9,10,11,12],te=[{value:5,label:"4/5"},{value:6,label:"4/6"},{value:7,label:"4/7"},{value:8,label:"4/8"}],se="radioConfig",ae="repeaterSettings",re="operatingMode";function ne({node:e,level:a,expandedKeys:r,selectedKeyId:n,globalFloodPolicy:l,onSelect:c,onToggle:i}){const o=r.has(e.id),d=n===e.id,u=e.children&&e.children.length>0,m="allow"===l;return t.jsxs("div",{children:[t.jsxs("div",{className:s("flex items-center gap-2 h-[36px] px-3 rounded-full cursor-pointer transition-colors",d?"bg-accent-primary/15":"hover:bg-subtle-fill",m&&"opacity-50 cursor-not-allowed"),style:{marginLeft:16*a+"px"},onClick:()=>!m&&c(e.id),children:[u?t.jsx("button",{onClick:t=>{t.stopPropagation(),i(e.id)},className:"p-1 hover:bg-subtle-fill-hover rounded-full transition-colors",children:t.jsx(A,{className:s("w-3.5 h-3.5 text-text-muted transition-transform",o&&"rotate-90")})}):t.jsx("span",{className:"w-5"}),t.jsx(K,{className:"w-4 h-4 text-accent-primary flex-shrink-0"}),t.jsx("span",{className:"type-data text-text-primary flex-1 truncate",children:e.name}),t.jsx("span",{className:s("type-data-xs px-2 py-0.5 rounded-full","allow"===e.floodPolicy?"bg-accent-success/15 text-accent-success":"bg-accent-danger/15 text-accent-danger"),children:"allow"===e.floodPolicy?"Allow":"Deny"})]}),u&&o&&t.jsx("div",{children:e.children.map(e=>t.jsx(ne,{node:e,level:a+1,expandedKeys:r,selectedKeyId:n,globalFloodPolicy:l,onSelect:c,onToggle:i},e.id))})]})}function le(){var a,n,l,c,i,v;const{stats:A,setMode:K,clearModeMutation:B,setDutyCycleConfig:X,clearDutyCycleMutation:G,fetchStats:le,startMutation:ce,clearMutation:ie}=d(),oe=null==(a=null==A?void 0:A.config)?void 0:a.radio,de=null==(n=null==A?void 0:A.config)?void 0:n.repeater,ue=null==(l=null==A?void 0:A.config)?void 0:l.duty_cycle,me=(null==A?void 0:A.node_name)||(null==(c=null==A?void 0:A.config)?void 0:c.node_name)||"Unknown Node",xe=(null==de?void 0:de.mode)??"forward",pe=(null==ue?void 0:ue.enforcement_enabled)??!1,he=null==(i=null==A?void 0:A.config)?void 0:i.delays,[be,ye]=e.useState(!1),[ge,fe]=e.useState(""),[je,ve]=e.useState(62.5),[Ne,we]=e.useState(7),[ke,Ce]=e.useState(5),[Se,_e]=e.useState(""),[Te,Fe]=e.useState("idle"),[Ee,Me]=e.useState(null),Le=e.useRef(null),Pe=e.useRef(null),[Re,ze]=e.useState(!1),[De,Ae]=e.useState(""),[Ie,Oe]=e.useState(""),[Ke,qe]=e.useState(""),[He,Ve]=e.useState("idle"),$e=e.useRef(null),Ye=e.useRef(null),[Ue,Be]=e.useState(!1),[Je,Xe]=e.useState(""),[Ge,We]=e.useState(""),[Qe,Ze]=e.useState(""),[et,tt]=e.useState(""),[st,at]=e.useState("idle"),[rt,nt]=e.useState(null),lt=e.useRef(null),ct=e.useRef(null),[it,ot]=e.useState("idle"),[dt,ut]=e.useState("idle"),[mt,xt]=e.useState(null),[pt,ht]=e.useState(null),bt=e.useRef(!0),yt=e.useRef(null),gt=e.useRef(null),ft=e.useRef(null),jt=e.useRef(null),vt=e.useRef(!1),Nt=e.useRef(!1);e.useEffect(()=>(bt.current=!0,()=>{bt.current=!1,yt.current&&clearTimeout(yt.current),gt.current&&clearTimeout(gt.current),ft.current&&clearTimeout(ft.current),jt.current&&clearTimeout(jt.current),Tt.current&&clearTimeout(Tt.current),Ft.current&&clearTimeout(Ft.current),Pe.current&&clearTimeout(Pe.current),$e.current&&clearTimeout($e.current),ct.current&&clearTimeout(ct.current)}),[]),e.useEffect(()=>{const e=e=>{if(be||Ue||Re)return e.preventDefault(),e.returnValue="You have unsaved changes. Are you sure you want to leave?",e.returnValue};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[be,Ue,Re]);const wt=null==(v=null==A?void 0:A.config)?void 0:v.web,[kt,Ct]=e.useState("idle"),[St,_t]=e.useState(null),Tt=e.useRef(null),Ft=e.useRef(null),Et=e.useRef(!1),[Mt,Lt]=e.useState([]),[Pt,Rt]=e.useState(!1),[zt,Dt]=e.useState(null),[At,It]=e.useState(!1),[Ot,Kt]=e.useState(""),[qt,Ht]=e.useState(null),[Vt,$t]=e.useState(!1),[Yt,Ut]=e.useState(null),[Bt,Jt]=e.useState(!1),[Xt,Gt]=e.useState(!1),[Wt,Qt]=e.useState(!1),[Zt,es]=e.useState([]),[ts,ss]=e.useState(!1),[as,rs]=e.useState(null),[ns,ls]=e.useState("deny"),[cs,is]=e.useState(!1),[os,ds]=e.useState(null),[us,ms]=e.useState(new Set),[xs,ps]=e.useState(!1),[hs,bs]=e.useState(!1),[ys,gs]=e.useState(!1),[fs,js]=e.useState(null),[vs,Ns]=e.useState(null),[ws,ks]=e.useState(""),[Cs,Ss]=e.useState("deny"),[_s,Ts]=e.useState(!1),[Fs,Es]=e.useState(!0),[Ms,Ls]=e.useState(!1),[Ps,Rs]=e.useState(!0),[zs,Ds]=e.useState("idle"),[As,Is]=e.useState(!1),[Os,Ks]=e.useState(!1),qs=e.useRef(!1);e.useEffect(()=>{const e=be&&!qs.current;qs.current=be,oe&&e&&(fe((oe.frequency/1e6).toFixed(3)),ve(oe.bandwidth/1e3),we(oe.spreading_factor),Ce(oe.coding_rate),_e(String(oe.tx_power)))},[oe,be]);const Hs=e.useMemo(()=>{if(!oe||!be)return!1;const e=oe.frequency/1e6,t=oe.bandwidth/1e3,s=parseFloat(ge)||0;return Math.abs(s-e)>1e-4||je!==t||Ne!==oe.spreading_factor||ke!==oe.coding_rate||parseInt(Se)!==oe.tx_power},[oe,be,ge,je,Ne,ke,Se]),Vs=e.useCallback(()=>{ye(!1),Me(null),oe&&(fe((oe.frequency/1e6).toFixed(3)),ve(oe.bandwidth/1e3),we(oe.spreading_factor),Ce(oe.coding_rate),_e(String(oe.tx_power)))},[oe]);e.useEffect(()=>{if(!be)return;const e=e=>{"loading"!==Te&&Le.current&&!Le.current.contains(e.target)&&Vs()};return document.addEventListener("mouseup",e),()=>{document.removeEventListener("mouseup",e)}},[be,Vs,Te]);const $s=e.useCallback(()=>{const e=null==he?void 0:he.tx_delay_factor;return e&&"object"==typeof e&&"parsedValue"in e?e.parsedValue??1:"number"==typeof e?e:1},[he]),Ys=e.useCallback(()=>{const e=null==he?void 0:he.direct_tx_delay_factor;return"number"==typeof e?e:.5},[he]),Us=e.useCallback(()=>{const e=null==ue?void 0:ue.max_airtime_percent;return"number"==typeof e?e:e&&"object"==typeof e&&"parsedValue"in e?e.parsedValue??6:6},[ue]),Bs=e.useCallback(()=>{Ae($s().toFixed(2)),Oe(Ys().toFixed(2)),qe(Us().toFixed(1)),ze(!0)},[$s,Ys,Us]),Js=e.useCallback(()=>{ze(!1)},[]);e.useEffect(()=>{if(!Re)return;const e=e=>{"loading"!==He&&Ye.current&&!Ye.current.contains(e.target)&&Js()};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[Re,Js,He]);const Xs=e.useCallback(()=>{var e,t,s;Xe(me),We((null==(e=null==de?void 0:de.latitude)?void 0:e.toString())||"0"),Ze((null==(t=null==de?void 0:de.longitude)?void 0:t.toString())||"0"),tt((null==(s=null==de?void 0:de.send_advert_interval_hours)?void 0:s.toString())||"0"),nt(null),Be(!0)},[me,de]),Gs=e.useCallback(()=>{Be(!1),nt(null)},[]);e.useEffect(()=>{if(!Ue)return;const e=e=>{"loading"!==st&<.current&&!lt.current.contains(e.target)&&Gs()};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[Ue,Gs,st]);const Ws=async()=>{var e;if("loading"===kt)return;const t=(null==wt?void 0:wt.cors_enabled)??!1,s=!t,a=t;Tt.current&&clearTimeout(Tt.current),Ft.current&&clearTimeout(Ft.current),Et.current=!1,_t(s),Ct("loading"),Tt.current=setTimeout(()=>{Et.current||bt.current&&(_t(a),Ct("error"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3))},1e4);try{const t=await J({web:{cors_enabled:s}});if(Et.current=!0,Tt.current&&clearTimeout(Tt.current),!bt.current)return;t.success||(null==(e=t.data)?void 0:e.persisted)?(await le(),Ct("success"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3)):(_t(a),Ct("error"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3))}catch{if(Et.current=!0,Tt.current&&clearTimeout(Tt.current),!bt.current)return;_t(a),Ct("error"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3)}};e.useEffect(()=>{(async()=>{Rs(!0);try{const e=await async function(){return r("/api/check_pymc_console")}();e.success&&e.data?Ls(e.data.exists):Ls(!1);const t=null==wt?void 0:wt.web_path;Es(!t||""===t)}catch{Ls(!1)}finally{Rs(!1)}})()},[null==wt?void 0:wt.web_path]);const Qs=async e=>{var t;if("loading"!==zs){Ds("loading");try{const s=await J({web:{web_path:e?null:"/opt/pymc_console/web/html"}});if(!bt.current)return;s.success||(null==(t=s.data)?void 0:t.persisted)?(Es(e),Ds("success"),Is(!0),setTimeout(()=>{bt.current&&Ds("idle")},2e3)):(Ds("error"),setTimeout(()=>{bt.current&&Ds("idle")},2e3))}catch{if(!bt.current)return;Ds("error"),setTimeout(()=>{bt.current&&Ds("idle")},2e3)}}},Zs=e.useCallback(async()=>{Rt(!0),Dt(null);try{const e=await async function(){return r("/auth/tokens")}();Lt(e.tokens||[])}catch(e){Dt(e instanceof Error?e.message:"Failed to fetch tokens")}finally{Rt(!1)}},[]);e.useEffect(()=>{Zs()},[Zs]);const ea=async()=>{if(Ot.trim()){Jt(!0),Dt(null);try{const e=await async function(e){return r("/auth/tokens",{method:"POST",body:JSON.stringify({name:e})})}(Ot.trim());Ht(e.token||null),It(!1),$t(!0),Kt(""),await Zs()}catch(e){Dt(e instanceof Error?e.message:"Failed to create token")}finally{Jt(!1)}}else Dt("Token name is required")},ta=e=>e?new Date(1e3*e).toLocaleString():"Never",sa=e.useCallback(e=>{const t=new Map,s=[];return e.forEach(e=>{const s={id:e.id,name:e.name,floodPolicy:e.flood_policy,transport_key:e.transport_key,last_used:e.last_used,parent_id:e.parent_id,children:[]};t.set(e.id,s)}),t.forEach(e=>{e.parent_id&&t.has(e.parent_id)?t.get(e.parent_id).children.push(e):s.push(e)}),s},[]),aa=e.useCallback(async()=>{ss(!0),rs(null);try{const e=await async function(){return r("/api/transport_keys")}();e.success&&e.data?es(sa(e.data)):rs(e.error||"Failed to load transport keys")}catch(e){rs(e instanceof Error?e.message:"Unknown error occurred")}finally{ss(!1)}},[sa]);e.useEffect(()=>{aa()},[aa]);const ra=e.useCallback((e,t)=>{for(const s of e){if(s.id===t)return s;if(s.children){const e=ra(s.children,t);if(e)return e}}return null},[]),na=e.useCallback(()=>{if(!os)return;const e=ra(Zt,os);return null==e?void 0:e.name},[os,Zt,ra]),la=e.useCallback(e=>{ms(t=>{const s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})},[]),ca=async e=>{is(!0),rs(null);try{const t=await async function(e){return r("/api/global_flood_policy",{method:"POST",body:JSON.stringify({global_flood_allow:e})})}("allow"===e);t.success?ls(e):rs(t.error||"Failed to update global flood policy")}catch(t){rs(t instanceof Error?t.message:"Failed to update global flood policy")}finally{is(!1)}},ia=async()=>{if(ws.trim()){Ts(!0),rs(null);try{const e=await async function(e){return r("/api/transport_keys",{method:"POST",body:JSON.stringify(e)})}({name:ws.trim(),flood_policy:Cs,parent_id:os??void 0});e.success?(await aa(),ps(!1),ks(""),Ss("deny")):rs(e.error||"Failed to add transport key")}catch(e){rs(e instanceof Error?e.message:"Failed to add transport key")}finally{Ts(!1)}}else rs("Key name is required")},oa=e.useCallback(()=>{if(!os)return;const e=ra(Zt,os);e&&(js({...e}),bs(!0))},[os,Zt,ra]);e.useEffect(()=>{const e=e=>{"Escape"===e.key&&(xs&&(ps(!1),ks(""),Ss("deny")),hs&&(bs(!1),js(null)),ys&&(gs(!1),Ns(null)),At&&(It(!1),Kt("")),Vt&&($t(!1),Ht(null)))};if(xs||hs||ys||At||Vt)return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[xs,hs,ys,At,Vt]);const da=e.useCallback(()=>{if(!os)return;const e=ra(Zt,os);e&&(Ns(e),gs(!0))},[os,Zt,ra]);return t.jsxs(k,{children:[t.jsx(C,{title:"Configuration",icon:t.jsx(u,{})}),t.jsxs(S,{children:[t.jsxs(L,{template:"standard",children:[t.jsx(P,{span:12,md:6,children:t.jsx(w,{children:t.jsxs("div",{ref:lt,children:[t.jsxs("div",{className:"flex items-center justify-between mb-4",children:[t.jsxs("h2",{className:"type-subheading text-text-primary flex items-center gap-2",children:[t.jsx(m,{className:"icon-md text-accent-primary"}),"Repeater Settings"]}),t.jsx("div",{className:"flex items-center gap-1",children:de&&(Ue?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:Gs,disabled:"loading"===st,className:s("p-2 radius-inner transition-base","loading"===st?"text-text-muted cursor-not-allowed":"text-text-muted hover:text-accent-danger hover:bg-accent-danger/10"),title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})}),t.jsx("button",{onClick:async()=>{if("loading"!==st){ct.current&&clearTimeout(ct.current),ce(ae),at("loading"),nt(null);try{const e={};Je&&Je!==me&&(e.node_name=Je);const t=parseFloat(Ge);isNaN(t)||t===(null==de?void 0:de.latitude)||(e.latitude=t);const s=parseFloat(Qe);isNaN(s)||s===(null==de?void 0:de.longitude)||(e.longitude=s);const a=parseInt(et);if(isNaN(a)||a===(null==de?void 0:de.send_advert_interval_hours)||(e.flood_advert_interval_hours=a),0===Object.keys(e).length)return nt({success:!0,message:"No changes to save"}),at("idle"),void ie(ae);const r=await y(e);if(!bt.current)return void ie(ae);if(r.success&&r.data){const e=r.data.applied.join(", ");nt({success:!0,message:`Updated: ${e}`}),await le({force:!0}),at("success"),ct.current=setTimeout(()=>{bt.current&&(at("idle"),Be(!1),nt(null),ie(ae))},1500)}else nt({success:!1,message:r.error||"Failed to save"}),at("error"),ie(ae),ct.current=setTimeout(()=>{bt.current&&at("idle")},2e3)}catch(e){if(!bt.current)return void ie(ae);nt({success:!1,message:String(e)}),at("error"),ie(ae),ct.current=setTimeout(()=>{bt.current&&at("idle")},2e3)}}},disabled:"loading"===st,className:s("p-2 radius-inner transition-base","loading"===st?"text-accent-primary cursor-wait":"success"===st?"text-accent-success":"error"===st?"text-accent-danger":"text-accent-success hover:bg-accent-success/10"),title:"Save changes",children:"loading"===st?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===st?t.jsx(F,{className:"w-4 h-4"}):"error"===st?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:Xs,className:"p-2 radius-inner transition-base text-text-muted hover:text-text-primary hover-bg",title:"Edit repeater settings",children:t.jsx($,{className:"w-4 h-4"})}))})]}),rt&&t.jsx("div",{className:s("text-xs mb-3 px-2 py-1.5 rounded-md",rt.success?"text-accent-success bg-accent-success/10":"text-accent-danger bg-accent-danger/10"),children:rt.message}),de?t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsxs("div",{className:"col-span-2",children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Node Name"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"text",value:Je,onChange:e=>Xe(e.target.value),maxLength:50,className:"w-full bg-transparent text-text-primary focus:outline-none type-data",placeholder:"Enter node name"}):t.jsx("span",{className:"type-data text-text-primary",children:me})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:Ue?"Latitude (°)":"Latitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"number",value:Ge,onChange:e=>We(e.target.value),step:"0.000001",min:"-90",max:"90",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:0!==de.latitude?de.latitude.toFixed(6):"Not set"})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:Ue?"Longitude (°)":"Longitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"number",value:Qe,onChange:e=>Ze(e.target.value),step:"0.000001",min:"-180",max:"180",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:0!==de.longitude?de.longitude.toFixed(6):"Not set"})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:Ue?"Advert Interval (hours)":"Advert Interval"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"number",value:et,onChange:e=>tt(e.target.value),min:"0",max:"48",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:de.send_advert_interval_hours>0?`${de.send_advert_interval_hours}h`:"Disabled"})}),Ue&&t.jsx("p",{className:"type-data-xs text-text-muted mt-1 ml-4",children:"0 = disabled, 3-48 hours"})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Score-based TX"}),t.jsx("div",{className:"h-[38px] rounded-full px-4 flex items-center bg-subtle-fill",children:t.jsx("span",{className:"type-data text-text-primary",children:de.use_score_for_tx?"Enabled":"Disabled"})})]})]}):t.jsx("p",{className:"text-text-muted",children:"Loading repeater settings..."})]})})}),t.jsx(P,{span:12,md:6,children:t.jsx(w,{children:t.jsxs("div",{ref:Le,children:[t.jsxs("div",{className:"flex items-center justify-between mb-4",children:[t.jsxs("h2",{className:"type-subheading text-text-primary flex items-center gap-2",children:[t.jsx(I,{className:"icon-md text-accent-primary"}),"Radio Configuration"]}),t.jsx("div",{className:"flex items-center gap-1",children:oe&&(be?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:Vs,disabled:"loading"===Te,className:s("p-2 radius-inner transition-base","loading"===Te?"text-text-muted cursor-not-allowed":"text-text-muted hover:text-accent-danger hover:bg-accent-danger/10"),title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})}),t.jsx("button",{onClick:async()=>{if("loading"!==Te){Pe.current&&clearTimeout(Pe.current),ce(se),Fe("loading"),Me(null);try{const e={},t=parseFloat(ge),s=oe?oe.frequency/1e6:0;Math.abs(t-s)>1e-4&&(e.frequency_mhz=t);const a=oe?oe.bandwidth/1e3:0;je!==a&&(e.bandwidth_khz=je),Ne!==(null==oe?void 0:oe.spreading_factor)&&(e.spreading_factor=Ne),ke!==(null==oe?void 0:oe.coding_rate)&&(e.coding_rate=ke);const r=parseInt(Se);if(r!==(null==oe?void 0:oe.tx_power)&&(e.tx_power=r),0===Object.keys(e).length)return Me({success:!0,message:"No changes to save"}),Fe("idle"),void ie(se);const n=await y(e);if(!bt.current)return void ie(se);if(n.success&&n.data){const e=n.data.applied.join(", "),t=n.data.live_update?" (applied live)":" (restart required)";Me({success:!0,message:`Updated: ${e}${t}`}),await le({force:!0}),Fe("success"),Pe.current=setTimeout(()=>{bt.current&&(Fe("idle"),ye(!1),Me(null),ie(se))},1500)}else Me({success:!1,message:n.error||"Failed to save"}),Fe("error"),ie(se),Pe.current=setTimeout(()=>{bt.current&&Fe("idle")},2e3)}catch(e){if(!bt.current)return void ie(se);Me({success:!1,message:String(e)}),Fe("error"),ie(se),Pe.current=setTimeout(()=>{bt.current&&Fe("idle")},2e3)}}},disabled:"loading"===Te||!Hs,className:s("p-2 radius-inner transition-base","loading"===Te?"text-accent-primary cursor-wait":"success"===Te?"text-accent-success":"error"===Te?"text-accent-danger":Hs?"text-accent-success hover:bg-accent-success/10":"text-text-muted cursor-not-allowed"),title:Hs?"Save changes":"No changes to save",children:"loading"===Te?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===Te?t.jsx(F,{className:"w-4 h-4"}):"error"===Te?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:()=>{oe&&(fe((oe.frequency/1e6).toFixed(3)),ve(oe.bandwidth/1e3),we(oe.spreading_factor),Ce(oe.coding_rate),_e(String(oe.tx_power))),Me(null),ye(!0)},className:"p-2 radius-inner transition-base text-text-muted hover:text-text-primary hover-bg",title:"Edit radio settings",children:t.jsx($,{className:"w-4 h-4"})}))})]}),Ee&&t.jsx("div",{className:s("text-xs mb-3 px-2 py-1.5 rounded-md",Ee.success?"text-accent-success bg-accent-success/10":"text-accent-danger bg-accent-danger/10"),children:Ee.message}),oe?t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:be?"Frequency (MHz)":"Frequency"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsx("input",{type:"number",value:ge,onChange:e=>fe(e.target.value),step:"0.001",min:"400",max:"930",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:x(oe.frequency)})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:be?"TX Power (dBm)":"TX Power"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsx("input",{type:"number",value:Se,onChange:e=>_e(e.target.value),min:"-9",max:"22",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsxs("span",{className:"type-data text-text-primary",children:[oe.tx_power," dBm"]})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Bandwidth"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors relative",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsxs(t.Fragment,{children:[t.jsx("select",{value:je,onChange:e=>ve(parseFloat(e.target.value)),className:"w-full bg-transparent text-text-primary focus:outline-none appearance-none cursor-pointer type-data pr-6",children:Z.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))}),t.jsx(p,{className:"absolute right-4 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted pointer-events-none"})]}):t.jsx("span",{className:"type-data text-text-primary",children:h(oe.bandwidth)})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Spreading Factor"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors relative",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsxs(t.Fragment,{children:[t.jsx("select",{value:Ne,onChange:e=>we(parseInt(e.target.value)),className:"w-full bg-transparent text-text-primary focus:outline-none appearance-none cursor-pointer type-data pr-6",children:ee.map(e=>t.jsxs("option",{value:e,children:["SF",e]},e))}),t.jsx(p,{className:"absolute right-4 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted pointer-events-none"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:["SF",oe.spreading_factor]})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Coding Rate"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors relative",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsxs(t.Fragment,{children:[t.jsx("select",{value:ke,onChange:e=>Ce(parseInt(e.target.value)),className:"w-full bg-transparent text-text-primary focus:outline-none appearance-none cursor-pointer type-data pr-6",children:te.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))}),t.jsx(p,{className:"absolute right-4 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted pointer-events-none"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:["4/",oe.coding_rate]})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Preamble"}),t.jsx("div",{className:"h-[38px] rounded-full px-4 flex items-center bg-subtle-fill",children:t.jsxs("span",{className:"type-data text-text-primary",children:[oe.preamble_length," symbols"]})})]})]}):t.jsx("p",{className:"text-text-muted",children:"Loading radio configuration..."})]})})})]}),t.jsxs(L,{template:"standard",children:[t.jsx(P,{span:12,md:6,children:t.jsx(w,{children:t.jsxs("div",{ref:Ye,children:[t.jsxs("div",{className:"flex items-center justify-between mb-3",children:[t.jsxs("h2",{className:"type-subheading text-text-primary flex items-center gap-3",children:[t.jsx(b,{className:"icon-md text-icon-card-title"}),"Operating Mode"]}),t.jsx("div",{className:"flex items-center gap-1",children:Re?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:async()=>{if("loading"!==He){$e.current&&clearTimeout($e.current),ce(re),Ve("loading");try{const e=await y({tx_delay_factor:parseFloat(De),direct_tx_delay_factor:parseFloat(Ie)});if(await X({max_airtime_percent:parseFloat(Ke),enforcement_enabled:pe}),!bt.current)return void ie(re);e.success&&e.data?(await le({force:!0}),Ve("success"),$e.current=setTimeout(()=>{bt.current&&(Ve("idle"),ze(!1),ie(re))},1500)):(Ve("error"),ie(re),$e.current=setTimeout(()=>{bt.current&&Ve("idle")},2e3))}catch{if(!bt.current)return void ie(re);Ve("error"),ie(re),$e.current=setTimeout(()=>{bt.current&&Ve("idle")},2e3)}}},disabled:"loading"===He,className:s("p-2 radius-inner transition-base","loading"===He?"text-accent-primary cursor-wait":"success"===He?"text-accent-success":"error"===He?"text-accent-danger":"text-accent-success hover:bg-accent-success/10"),title:"Save",children:"loading"===He?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===He?t.jsx(F,{className:"w-4 h-4"}):"error"===He?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})}),t.jsx("button",{onClick:Js,className:"p-2 radius-inner transition-base text-text-muted hover:text-accent-danger hover:bg-accent-danger/10",title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:Bs,className:"p-2 radius-inner transition-base text-text-muted hover:text-text-primary hover-bg",title:"Edit settings",children:t.jsx($,{className:"w-4 h-4"})})})]}),t.jsx("p",{className:"type-label text-text-muted mb-3",children:"Control how the repeater handles packets"}),t.jsxs("div",{className:"flex flex-col sm:flex-row gap-4",children:[t.jsxs("div",{className:"flex-1 space-y-4",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("label",{className:"type-label text-text-muted",children:"Repeat"}),t.jsx("div",{className:"flex items-center gap-2",children:(()=>{const e=null!==mt?mt:"forward"===xe;return t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:async()=>{if("loading"===it)return;const t=!e,s="forward"===xe;yt.current&&clearTimeout(yt.current),gt.current&&clearTimeout(gt.current),vt.current=!1,xt(t),ot("loading"),yt.current=setTimeout(()=>{vt.current||bt.current&&(xt(s),ot("error"),gt.current=setTimeout(()=>{bt.current&&(ot("idle"),xt(null))},2e3))},1e4);try{if(await K(t?"forward":"monitor"),vt.current=!0,yt.current&&clearTimeout(yt.current),!bt.current)return;ot("success"),gt.current=setTimeout(()=>{bt.current&&(ot("idle"),xt(null),B())},2e3)}catch{if(vt.current=!0,yt.current&&clearTimeout(yt.current),!bt.current)return;xt(s),ot("error"),gt.current=setTimeout(()=>{bt.current&&(ot("idle"),xt(null))},2e3)}},disabled:"loading"===it,className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2",e?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle","loading"===it&&"opacity-70"),"aria-label":"Toggle forward mode",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",e?"translate-x-5":"translate-x-0.5")})}),t.jsx("span",{className:s("type-data text-sm w-7",e?"text-accent-success":"text-text-muted"),children:e?"On":"Off"}),"loading"===it&&t.jsx(T,{className:"w-4 h-4 text-text-muted animate-spin"}),"success"===it&&t.jsx(F,{className:"w-4 h-4 text-accent-success"}),"error"===it&&t.jsx(o,{className:"w-4 h-4 text-accent-danger"})]})})()})]}),t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("label",{className:"type-label text-text-muted",children:"Duty Cycle"}),t.jsx("div",{className:"flex items-center gap-2",children:(()=>{const e=null!==pt?pt:pe;return t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:async()=>{if("loading"===dt)return;const t=!e,s=pe;ft.current&&clearTimeout(ft.current),jt.current&&clearTimeout(jt.current),Nt.current=!1,ht(t),ut("loading"),ft.current=setTimeout(()=>{Nt.current||bt.current&&(ht(s),ut("error"),jt.current=setTimeout(()=>{bt.current&&(ut("idle"),ht(null))},2e3))},1e4);try{if(await X({max_airtime_percent:Us(),enforcement_enabled:t}),Nt.current=!0,ft.current&&clearTimeout(ft.current),!bt.current)return;ut("success"),jt.current=setTimeout(()=>{bt.current&&(ut("idle"),ht(null),G())},2e3)}catch{if(Nt.current=!0,ft.current&&clearTimeout(ft.current),!bt.current)return;ht(s),ut("error"),jt.current=setTimeout(()=>{bt.current&&(ut("idle"),ht(null))},2e3)}},disabled:"loading"===dt,className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2",e?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle","loading"===dt&&"opacity-70"),"aria-label":"Toggle duty cycle",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",e?"translate-x-5":"translate-x-0.5")})}),t.jsx("span",{className:s("type-data text-sm w-7",e?"text-accent-success":"text-text-muted"),children:e?"On":"Off"}),"loading"===dt&&t.jsx(T,{className:"w-4 h-4 text-text-muted animate-spin"}),"success"===dt&&t.jsx(F,{className:"w-4 h-4 text-accent-success"}),"error"===dt&&t.jsx(o,{className:"w-4 h-4 text-accent-danger"})]})})()})]}),t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("label",{className:"type-label text-text-muted",children:"Max Airtime"}),t.jsx("div",{className:s("h-[32px] rounded-full px-3 flex items-center justify-end transition-colors min-w-[80px]",Re?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Re?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("input",{type:"number",value:Ke,onChange:e=>qe(e.target.value),step:"0.5",min:"0.1",max:"100",className:"w-12 bg-transparent text-text-primary text-right focus:outline-none type-data"}),t.jsx("span",{className:"text-text-muted type-data",children:"%"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:[Us().toFixed(1),"%"]})})]})]}),t.jsx("div",{className:"hidden sm:block w-px bg-border-subtle"}),t.jsxs("div",{className:"flex-1 pt-4 sm:pt-0 border-t sm:border-t-0 border-border-subtle",children:[t.jsx("label",{className:"type-label text-text-muted block mb-3",children:"TX Delays"}),t.jsxs("div",{className:"space-y-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("span",{className:"type-label text-text-muted",children:"Flood"}),t.jsx("div",{className:s("h-[32px] rounded-full px-3 flex items-center justify-end transition-colors min-w-[80px]",Re?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Re?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("input",{type:"number",value:De,onChange:e=>Ae(e.target.value),step:"0.1",min:"0",max:"5",className:"w-12 bg-transparent text-text-primary text-right focus:outline-none type-data"}),t.jsx("span",{className:"text-text-muted type-data",children:"x"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:[$s().toFixed(2),"x"]})})]}),t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("span",{className:"type-label text-text-muted",children:"Direct"}),t.jsx("div",{className:s("h-[32px] rounded-full px-3 flex items-center justify-end transition-colors min-w-[80px]",Re?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Re?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("input",{type:"number",value:Ie,onChange:e=>Oe(e.target.value),step:"0.1",min:"0",max:"5",className:"w-12 bg-transparent text-text-primary text-right focus:outline-none type-data"}),t.jsx("span",{className:"text-text-muted type-data",children:"s"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:[Ys().toFixed(2),"s"]})})]})]})]})]})]})})}),t.jsx(P,{span:12,md:6,children:t.jsxs(w,{children:[t.jsx(_,{icon:t.jsx(u,{}),title:"App Settings",largeTitle:!0}),t.jsx("p",{className:"type-body-sm text-text-muted mb-4",children:"Appearance and web server options."}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{className:"flex justify-between items-center",children:[t.jsxs("div",{children:[t.jsx("span",{className:"type-body text-text-primary font-medium block",children:"Enable CORS"}),t.jsx("span",{className:"type-body-sm text-text-muted",children:"Allow cross-origin API access"})]}),t.jsx("div",{className:"flex items-center gap-2",children:(()=>{const e=null!==St?St:(null==wt?void 0:wt.cors_enabled)??!1;return t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:Ws,disabled:"loading"===kt,className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2",e?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle","loading"===kt&&"opacity-70"),title:e?"Disable CORS":"Enable CORS",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",e?"translate-x-5":"translate-x-0.5")})}),"loading"===kt&&t.jsx(T,{className:"w-4 h-4 text-text-muted animate-spin"}),"success"===kt&&t.jsx(F,{className:"w-4 h-4 text-accent-success"}),"error"===kt&&t.jsx(o,{className:"w-4 h-4 text-accent-danger"})]})})()})]}),t.jsx("div",{children:t.jsx(W,{})})]})]})})]}),t.jsx(L,{template:"auto",children:t.jsxs(w,{children:[t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4",children:[t.jsxs("div",{children:[t.jsxs("h2",{className:"type-heading text-text-primary flex items-center gap-2",children:[t.jsx(q,{className:"icon-md text-accent-primary"}),"Regions / Transport Keys"]}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Manage regional key hierarchy for flood control"})]}),t.jsxs("div",{className:"flex gap-2 flex-wrap",children:[t.jsxs("button",{onClick:()=>ps(!0),disabled:"allow"===ns,className:s("flex items-center gap-1.5 h-[32px] px-3 rounded-full transition-colors type-body-sm font-medium","allow"===ns?"bg-subtle-fill text-text-muted cursor-not-allowed":"bg-accent-success/10 hover:bg-accent-success/20 text-accent-success"),children:[t.jsx(f,{className:"w-3.5 h-3.5"}),"Add"]}),t.jsx("button",{onClick:oa,disabled:!os||"allow"===ns,className:s("h-[32px] px-3 rounded-full transition-colors type-body-sm font-medium",os&&"allow"!==ns?"bg-accent-primary/10 hover:bg-accent-primary/20 text-accent-primary":"bg-subtle-fill text-text-muted cursor-not-allowed"),children:"Edit"}),t.jsx("button",{onClick:da,disabled:!os||"allow"===ns,className:s("h-[32px] px-3 rounded-full transition-colors type-body-sm font-medium",os&&"allow"!==ns?"bg-accent-danger/10 hover:bg-accent-danger/20 text-accent-danger":"bg-subtle-fill text-text-muted cursor-not-allowed"),children:"Delete"})]})]}),t.jsx("div",{className:"bg-subtle-fill radius-card p-4 mb-4",children:t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:s("w-10 h-10 rounded-full flex items-center justify-center","allow"===ns?"bg-accent-success/20":"bg-accent-danger/20"),children:"allow"===ns?t.jsx(Y,{className:"w-5 h-5 text-accent-success"}):t.jsx(U,{className:"w-5 h-5 text-accent-danger"})}),t.jsxs("div",{children:[t.jsx("h4",{className:"type-body text-text-primary font-medium",children:"Global Flood Policy"}),t.jsx("p",{className:"type-body-sm text-text-muted",children:"Master control for repeater flooding"})]})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsxs("div",{className:"flex bg-subtle-fill rounded-full p-1",children:[t.jsx("button",{onClick:()=>ca("deny"),disabled:cs,className:s("px-4 py-1.5 rounded-full transition-colors type-body-sm font-medium","deny"===ns?"bg-accent-danger/20 text-accent-danger":"text-text-muted hover:text-text-secondary",cs&&"opacity-50"),children:"Deny"}),t.jsx("button",{onClick:()=>ca("allow"),disabled:cs,className:s("px-4 py-1.5 rounded-full transition-colors type-body-sm font-medium","allow"===ns?"bg-accent-success/20 text-accent-success":"text-text-muted hover:text-text-secondary",cs&&"opacity-50"),children:"Allow"})]}),cs&&t.jsx(T,{className:"w-4 h-4 animate-spin text-text-muted"})]})]})}),as&&t.jsx("div",{className:"type-body-sm mb-3 px-3 py-2 rounded-full text-accent-danger bg-accent-danger/10",children:as}),t.jsx("div",{className:"bg-subtle-fill radius-card p-4 min-h-[120px]",children:ts?t.jsxs("div",{className:"flex items-center justify-center py-6",children:[t.jsx(T,{className:"w-5 h-5 animate-spin text-accent-primary mr-2"}),t.jsx("span",{className:"type-body-sm text-text-muted",children:"Loading transport keys..."})]}):0===Zt.length?t.jsxs("div",{className:"text-center py-6",children:[t.jsx("div",{className:"w-12 h-12 rounded-full bg-subtle-fill mx-auto mb-3 flex items-center justify-center",children:t.jsx(q,{className:"w-6 h-6 text-text-muted/50"})}),t.jsx("p",{className:"type-body text-text-muted",children:"No transport keys found"}),t.jsx("p",{className:"type-body-sm text-text-muted/70 mt-1",children:"Add your first transport key to get started"})]}):t.jsx("div",{className:"space-y-1",children:Zt.map(e=>t.jsx(ne,{node:e,level:0,expandedKeys:us,selectedKeyId:os,globalFloodPolicy:ns,onSelect:ds,onToggle:la},e.id))})})]})}),t.jsx(L,{template:"auto",children:t.jsxs(w,{children:[t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4",children:[t.jsxs("div",{children:[t.jsxs("h2",{className:"type-heading text-text-primary flex items-center gap-2",children:[t.jsx(H,{className:"icon-md text-accent-primary"}),"API Tokens"]}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Manage API tokens for machine-to-machine authentication"})]}),t.jsxs("button",{onClick:()=>It(!0),className:"flex items-center justify-center gap-2 h-[32px] px-4 bg-accent-primary/10 hover:bg-accent-primary/20 text-accent-primary rounded-full transition-colors type-body-sm font-medium",children:[t.jsx(f,{className:"w-4 h-4"}),"Create Token"]})]}),t.jsx("div",{className:"bg-accent-tertiary/5 radius-card p-4 mb-4",children:t.jsxs("div",{className:"flex gap-3",children:[t.jsx("div",{className:"w-8 h-8 rounded-full bg-accent-tertiary/20 flex items-center justify-center flex-shrink-0",children:t.jsx(M,{className:"w-4 h-4 text-accent-tertiary"})}),t.jsxs("div",{className:"type-body-sm text-text-muted",children:[t.jsxs("p",{children:[t.jsx("span",{className:"text-text-secondary",children:"API tokens"})," are used for machine-to-machine authentication. Include the token in the ",t.jsx("code",{className:"type-code bg-accent-tertiary/20 px-1.5 py-0.5 rounded-full text-accent-tertiary",children:"X-API-Key"})," header when making API requests."]}),t.jsx("p",{className:"mt-1 text-text-muted/70",children:"Tokens are only shown once at creation. Store them securely."})]})]})}),zt&&t.jsx("div",{className:"type-body-sm mb-3 px-3 py-2 rounded-full text-accent-danger bg-accent-danger/10",children:zt}),Pt&&0===Mt.length?t.jsxs("div",{className:"flex items-center justify-center py-6",children:[t.jsx(T,{className:"w-5 h-5 animate-spin text-accent-primary mr-2"}),t.jsx("span",{className:"type-body-sm text-text-muted",children:"Loading tokens..."})]}):Mt.length>0?t.jsx("div",{className:"space-y-2",children:Mt.map(e=>t.jsx("div",{className:"bg-subtle-fill hover:bg-subtle-fill-strong radius-card p-4 transition-base",children:t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[t.jsxs("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[t.jsx("div",{className:"w-10 h-10 rounded-full bg-accent-primary/10 flex items-center justify-center flex-shrink-0",children:t.jsx(H,{className:"w-5 h-5 text-accent-primary"})}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("h3",{className:"type-body text-text-primary font-medium truncate",children:e.name}),t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:gap-4 mt-0.5",children:[t.jsxs("span",{className:"type-data-sm text-text-muted truncate",children:["Created: ",ta(e.created_at)]}),t.jsxs("span",{className:"type-data-sm text-text-muted truncate",children:["Last used: ",ta(e.last_used)]})]})]})]}),t.jsxs("button",{onClick:()=>Ut({id:e.id,name:e.name}),disabled:Xt,className:"h-[32px] px-4 bg-accent-danger/10 hover:bg-accent-danger/20 text-accent-danger rounded-full transition-colors disabled:opacity-50 type-body-sm font-medium flex items-center justify-center gap-1.5",children:[t.jsx(g,{className:"w-3.5 h-3.5"}),"Revoke"]})]})},e.id))}):t.jsxs("div",{className:"bg-subtle-fill radius-card p-6 text-center",children:[t.jsx("div",{className:"w-14 h-14 rounded-full bg-subtle-fill mx-auto mb-4 flex items-center justify-center",children:t.jsx(H,{className:"w-7 h-7 text-text-muted/50"})}),t.jsx("h3",{className:"type-body text-text-primary font-medium mb-1",children:"No API Tokens"}),t.jsx("p",{className:"type-body-sm text-text-muted mb-4",children:"Create a token to enable API access"}),t.jsx("button",{onClick:()=>It(!0),className:"h-[32px] px-4 bg-accent-primary/10 hover:bg-accent-primary/20 text-accent-primary rounded-full transition-colors type-body-sm font-medium",children:"Create Your First Token"})]})]})}),t.jsx(L,{template:"auto",children:t.jsxs(w,{children:[t.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4",children:t.jsxs("div",{children:[t.jsxs("h2",{className:"type-heading text-text-primary flex items-center gap-2",children:[t.jsx(V,{className:"icon-md text-accent-primary"}),"Web Frontend"]}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Choose which web interface to use"})]})}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{className:"space-y-3",children:[t.jsxs("label",{className:s("flex items-start gap-3 p-4 bg-subtle-fill radius-card border-2 cursor-pointer transition-base",Fs?"border-accent-primary bg-accent-primary/5":"border-transparent hover:border-accent-primary/30","loading"===zs&&"opacity-50 pointer-events-none"),children:[t.jsx("input",{type:"radio",name:"frontend",checked:Fs,onChange:()=>Qs(!0),disabled:"loading"===zs,className:"mt-1 h-4 w-4 text-accent-primary focus:ring-accent-primary focus:ring-offset-bg-elevated"}),t.jsxs("div",{className:"flex-1",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("div",{className:"type-body text-text-primary font-medium",children:"Default Frontend"}),t.jsx("a",{href:"https://github.com/rightup/pyMC_Repeater",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),className:"type-data-xs bg-accent-tertiary/15 text-accent-tertiary px-2.5 py-0.5 rounded-full font-medium hover:bg-accent-tertiary/25 transition-colors",children:"@RightUp"})]}),t.jsx("div",{className:"type-body-sm text-text-muted mt-1",children:"Built-in pyMC Repeater web interface"}),t.jsx("div",{className:"type-data-xs text-text-muted/60 mt-1 font-mono",children:"/opt/pymc_repeater/repeater/web/html"})]})]}),t.jsxs("label",{className:s("flex items-start gap-3 p-4 bg-subtle-fill radius-card border-2 cursor-pointer transition-base",Fs?"border-transparent hover:border-accent-primary/30":"border-accent-primary bg-accent-primary/5","loading"===zs&&"opacity-50 pointer-events-none"),children:[t.jsx("input",{type:"radio",name:"frontend",checked:!Fs,onChange:()=>Qs(!1),disabled:"loading"===zs,className:"mt-1 h-4 w-4 text-accent-primary focus:ring-accent-primary focus:ring-offset-bg-elevated"}),t.jsxs("div",{className:"flex-1",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("div",{className:"type-body text-text-primary font-medium",children:"PyMC Console"}),t.jsx("span",{className:"type-data-xs bg-accent-secondary/15 text-accent-secondary px-2.5 py-0.5 rounded-full font-medium",children:"@Treehouse ⚡"})]}),t.jsx("div",{className:"type-body-sm text-text-muted mt-1",children:"Alternative web interface for pyMC Repeater"}),t.jsx("div",{className:"type-data-xs text-text-muted/60 mt-1 font-mono",children:"/opt/pymc_console/web/html"})]})]})]}),!Ps&&t.jsx("div",{className:s("bg-subtle-fill radius-card p-4",Ms?"border border-accent-success/20":"border border-accent-tertiary/20"),children:t.jsxs("div",{className:"flex items-start gap-3",children:[t.jsx("div",{className:s("w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0",Ms?"bg-accent-success/20":"bg-accent-tertiary/20"),children:Ms?t.jsx(R,{className:"w-4 h-4 text-accent-success"}):t.jsx(M,{className:"w-4 h-4 text-accent-tertiary"})}),t.jsxs("div",{className:"flex-1",children:[t.jsx("h4",{className:"type-body text-text-primary font-medium",children:Ms?"PyMC Console has been detected":"PyMC Console Not Installed"}),Ms?t.jsxs("p",{className:"type-body-sm text-text-muted mt-1",children:["PyMC Console is installed at ",t.jsx("code",{className:"type-code bg-accent-success/10 px-1.5 py-0.5 rounded-full text-accent-success",children:"/opt/pymc_console/web/html"})]}):t.jsxs(t.Fragment,{children:[t.jsxs("p",{className:"type-body-sm text-text-muted mt-1 mb-3",children:["PyMC Console must be installed at ",t.jsx("code",{className:"type-code bg-accent-tertiary/10 px-1.5 py-0.5 rounded-full text-accent-tertiary",children:"/opt/pymc_console/web/html"})," before selecting this option."]}),t.jsxs("a",{href:"https://github.com/dmduran12/pymc_console-dist",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-2 h-[32px] px-4 bg-accent-tertiary/10 hover:bg-accent-tertiary/20 text-accent-tertiary rounded-full type-body-sm font-medium transition-colors",children:[t.jsx(O,{className:"w-4 h-4"}),"PyMC Console Install Instructions"]})]})]})]})}),As&&t.jsx("div",{className:"bg-subtle-fill radius-card p-4 border border-accent-secondary/30",children:t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[t.jsxs("div",{className:"flex items-start gap-3 flex-1",children:[t.jsx("div",{className:"w-8 h-8 rounded-full bg-accent-secondary/20 flex items-center justify-center flex-shrink-0",children:t.jsx(z,{className:"w-4 h-4 text-accent-secondary"})}),t.jsxs("div",{className:"flex-1",children:[t.jsx("h4",{className:"type-body text-text-primary font-medium",children:"Service restart required"}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Web frontend changes will take effect after restarting the pymc-repeater service."})]})]}),t.jsx("button",{onClick:async()=>{if(!Os){Ks(!0);try{await async function(){return r("/api/restart_service",{method:"POST",body:"{}"})}(),Is(!1),setTimeout(()=>{window.location.reload()},2e3)}catch{Is(!1),setTimeout(()=>{window.location.reload()},3e3)}}},disabled:Os,className:"h-[32px] px-4 bg-accent-secondary/10 hover:bg-accent-secondary/20 text-accent-secondary rounded-full transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2 whitespace-nowrap type-body-sm font-medium",children:Os?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Restarting..."]}):t.jsxs(t.Fragment,{children:[t.jsx(D,{className:"w-4 h-4"}),"Restart Now"]})})]})})]})]})}),A&&t.jsx(L,{template:"auto",children:t.jsx(N,{nodeName:me,repeaterVersion:A.version,coreVersion:A.core_version,localHash:A.local_hash,publicKey:A.public_key})}),A&&(0===(null==de?void 0:de.latitude)||!(null==de?void 0:de.latitude))&&(0===(null==de?void 0:de.longitude)||!(null==de?void 0:de.longitude))&&t.jsx(L,{template:"auto",children:t.jsx(Q,{})})]}),At&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&It(!1),role:"dialog","aria-modal":"true","aria-labelledby":"create-token-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"create-token-modal-title",className:"type-subheading text-text-primary mb-4",children:"Create API Token"}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Token Name"}),t.jsx("input",{type:"text",value:Ot,onChange:e=>Kt(e.target.value),placeholder:"e.g., Production Server, CI/CD Pipeline",className:"w-full px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary placeholder-text-muted focus:outline-none ring-focus-inset transition-base",onKeyDown:e=>"Enter"===e.key&&ea(),autoFocus:!0}),t.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Give your token a descriptive name to identify its purpose"})]}),t.jsxs("div",{className:"flex justify-end gap-3 mt-6",children:[t.jsx("button",{onClick:()=>{It(!1),Kt(""),Dt(null)},disabled:Bt,className:"px-4 py-2 bg-bg-subtle hover-bg text-text-secondary radius-inner border-control transition-base disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:ea,disabled:Bt||!Ot.trim(),className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base disabled:opacity-50 flex items-center gap-2",children:Bt?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Creating..."]}):"Create Token"})]})]})]})}),Vt&&qt&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&$t(!1),role:"dialog","aria-modal":"true","aria-labelledby":"show-token-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-lg w-full",children:[t.jsx("h3",{id:"show-token-modal-title",className:"type-subheading text-text-primary mb-4",children:"Token Created Successfully"}),t.jsxs("div",{className:"space-y-4",children:[t.jsx("div",{className:"bg-accent-secondary/10 border border-accent-secondary/30 radius-inner p-3",children:t.jsxs("div",{className:"flex gap-2",children:[t.jsx(z,{className:"w-4 h-4 text-accent-secondary flex-shrink-0 mt-0.5"}),t.jsxs("div",{className:"text-sm text-text-secondary",children:[t.jsx("strong",{children:"Save this token now!"})," For security reasons, it will not be shown again."]})]})}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Your API Token"}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("input",{value:qt,readOnly:!0,className:"flex-1 px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary font-mono text-sm"}),t.jsxs("button",{onClick:()=>{qt&&(navigator.clipboard.writeText(qt),Qt(!0),setTimeout(()=>Qt(!1),2e3))},className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base flex items-center gap-2",title:"Copy to clipboard",children:[Wt?t.jsx(F,{className:"w-4 h-4 text-accent-success"}):t.jsx(E,{className:"w-4 h-4"}),Wt?"Copied!":"Copy"]})]})]}),t.jsxs("div",{className:"bg-accent-tertiary/10 border border-accent-tertiary/30 radius-inner p-3",children:[t.jsx("p",{className:"text-sm text-text-secondary mb-2",children:t.jsx("strong",{children:"Usage Example:"})}),t.jsxs("code",{className:"block bg-accent-tertiary/20 px-3 py-2 rounded text-xs text-accent-tertiary font-mono overflow-x-auto",children:['curl -H "X-API-Key: ',qt.slice(0,12),'..." ',window.location.origin,"/api/stats"]})]}),t.jsx("div",{className:"flex justify-end mt-6",children:t.jsx("button",{onClick:()=>{$t(!1),Ht(null)},className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base",children:"Done"})})]})]})}),t.jsx(j,{isOpen:!!Yt,title:"Revoke API Token",message:`Are you sure you want to revoke the token '${null==Yt?void 0:Yt.name}'? This action cannot be undone.`,confirmLabel:Xt?"Revoking...":"Revoke",cancelLabel:"Cancel",variant:"danger",onConfirm:async()=>{if(Yt){Gt(!0),Dt(null);try{await async function(e){return r(`/auth/tokens/${e}`,{method:"DELETE"})}(Yt.id),await Zs(),Ut(null)}catch(e){Dt(e instanceof Error?e.message:"Failed to revoke token")}finally{Gt(!1)}}},onCancel:()=>Ut(null)}),xs&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&ps(!1),role:"dialog","aria-modal":"true","aria-labelledby":"add-key-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"add-key-modal-title",className:"type-subheading text-text-primary mb-4",children:"Add Transport Key"}),t.jsxs("div",{className:"space-y-4",children:[os&&t.jsxs("div",{className:"bg-accent-tertiary/10 border border-accent-tertiary/30 radius-inner p-3 text-sm text-text-secondary",children:["Adding as child of: ",t.jsx("strong",{className:"text-text-primary",children:na()})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Key Name"}),t.jsx("input",{type:"text",value:ws,onChange:e=>ks(e.target.value),placeholder:"e.g., Region Name, Group Key",className:"w-full px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary placeholder-text-muted focus:outline-none ring-focus-inset transition-base",onKeyDown:e=>"Enter"===e.key&&ia(),autoFocus:!0})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Flood Policy"}),t.jsxs("div",{className:"flex bg-bg-subtle radius-inner border-control p-1",children:[t.jsx("button",{onClick:()=>Ss("deny"),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","deny"===Cs?"bg-accent-danger/20 text-accent-danger border border-accent-danger/50":"text-text-muted hover:text-text-secondary"),children:"DENY"}),t.jsx("button",{onClick:()=>Ss("allow"),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","allow"===Cs?"bg-accent-success/20 text-accent-success border border-accent-success/50":"text-text-muted hover:text-text-secondary"),children:"ALLOW"})]})]}),t.jsxs("div",{className:"flex justify-end gap-3 mt-6",children:[t.jsx("button",{onClick:()=>{ps(!1),ks(""),Ss("deny")},disabled:_s,className:"px-4 py-2 bg-bg-subtle hover-bg text-text-secondary radius-inner border-control transition-base disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:ia,disabled:_s||!ws.trim(),className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base disabled:opacity-50 flex items-center gap-2",children:_s?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Adding..."]}):"Add Key"})]})]})]})}),hs&&fs&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&bs(!1),role:"dialog","aria-modal":"true","aria-labelledby":"edit-key-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"edit-key-modal-title",className:"type-subheading text-text-primary mb-4",children:"Edit Transport Key"}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Key Name"}),t.jsx("input",{type:"text",value:fs.name,onChange:e=>js({...fs,name:e.target.value}),className:"w-full px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary focus:outline-none ring-focus-inset transition-base",autoFocus:!0})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Flood Policy"}),t.jsxs("div",{className:"flex bg-bg-subtle radius-inner border-control p-1",children:[t.jsx("button",{onClick:()=>js({...fs,floodPolicy:"deny"}),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","deny"===fs.floodPolicy?"bg-accent-danger/20 text-accent-danger border border-accent-danger/50":"text-text-muted hover:text-text-secondary"),children:"DENY"}),t.jsx("button",{onClick:()=>js({...fs,floodPolicy:"allow"}),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","allow"===fs.floodPolicy?"bg-accent-success/20 text-accent-success border border-accent-success/50":"text-text-muted hover:text-text-secondary"),children:"ALLOW"})]})]}),fs.transport_key&&t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Transport Key"}),t.jsx("code",{className:"block bg-bg-subtle px-3 py-2 radius-inner text-xs text-text-muted font-mono overflow-x-auto",children:fs.transport_key})]}),t.jsxs("div",{className:"flex justify-between gap-3 mt-6",children:[t.jsx("button",{onClick:()=>{bs(!1),Ns(fs),gs(!0),js(null)},disabled:_s,className:"px-4 py-2 bg-accent-danger/20 hover:bg-accent-danger/30 text-accent-danger radius-inner border border-accent-danger/50 transition-base disabled:opacity-50",children:"Delete"}),t.jsxs("div",{className:"flex gap-3",children:[t.jsx("button",{onClick:()=>{bs(!1),js(null)},disabled:_s,className:"px-4 py-2 bg-bg-subtle hover-bg text-text-secondary radius-inner border-control transition-base disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:async()=>{if(fs){Ts(!0),rs(null);try{const e=await async function(e,t){return r(`/api/transport_key/${e}`,{method:"PUT",body:JSON.stringify(t)})}(fs.id,{name:fs.name,flood_policy:fs.floodPolicy});e.success?(await aa(),bs(!1),js(null)):rs(e.error||"Failed to update transport key")}catch(e){rs(e instanceof Error?e.message:"Failed to update transport key")}finally{Ts(!1)}}},disabled:_s||!fs.name.trim(),className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base disabled:opacity-50 flex items-center gap-2",children:_s?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Saving..."]}):"Save"})]})]})]})]})}),ys&&vs&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&gs(!1),role:"dialog","aria-modal":"true","aria-labelledby":"delete-key-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"delete-key-modal-title",className:"type-subheading text-text-primary mb-4",children:"Delete Transport Key"}),t.jsxs("p",{className:"text-text-secondary mb-4",children:["Are you sure you want to delete ",t.jsxs("strong",{className:"text-text-primary",children:["'",vs.name,"'"]}),"?"]}),vs.children&&vs.children.length>0&&t.jsx("div",{className:"bg-accent-secondary/10 border border-accent-secondary/30 radius-inner p-3 mb-4",children:t.jsxs("div",{className:"flex gap-2",children:[t.jsx(z,{className:"w-4 h-4 text-accent-secondary flex-shrink-0 mt-0.5"}),t.jsxs("div",{className:"text-sm text-text-secondary",children:["This key has ",vs.children.length," child key(s). Deleting will also remove all children."]})]})}),t.jsxs("div",{className:"flex justify-end gap-3",children:[t.jsx("button",{onClick:()=>{gs(!1),Ns(null)},disabled:_s,className:"px-4 py-2 bg-bg-subtle hover:bg-bg-elevated text-text-secondary rounded-lg border border-border-subtle transition-colors disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:async()=>{if(vs){Ts(!0),rs(null);try{const e=await async function(e){return r(`/api/transport_key/${e}`,{method:"DELETE"})}(vs.id);e.success?(await aa(),gs(!1),Ns(null),ds(null)):rs(e.error||"Failed to delete transport key")}catch(e){rs(e instanceof Error?e.message:"Failed to delete transport key")}finally{Ts(!1)}}},disabled:_s,className:"px-4 py-2 bg-accent-danger/20 hover:bg-accent-danger/30 text-accent-danger radius-inner border border-accent-danger/50 transition-base disabled:opacity-50 flex items-center gap-2",children:_s?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Deleting..."]}):"Delete"})]})]})})]})}export{le as default}; +import{r as e,j as t,c as s}from"./vendor-react-Cwum97tW.js";import{c as a,bU as r,bV as n,bW as l,bX as c,bY as i,X as o,aq as d,bZ as u,b_ as m,b$ as x,F as p,c0 as h,R as b,b6 as y}from"./index-D22MpaCY.js";import{T as g,P as f,C as j}from"./ConfirmModal-flvCJ5X5.js";import{l as v}from"./font-loader-jlbdh9Fw.js";import{N}from"./NodeInformationCard-CJnzzUo0.js";import{a as w,P as k,b as C,B as S}from"./PageLayout-B53JpmK1.js";import{C as _}from"./Card-CCBguhJs.js";import{L as T}from"./loader-circle-2q9lT2qG.js";import{C as F,a as E}from"./DataBox-Bl0vntck.js";import{I as M}from"./info-BojcGhYE.js";import{R as L,C as P}from"./Grid-BVGRgue6.js";import{C as R}from"./circle-check-CKXuJpMJ.js";import{T as z}from"./triangle-alert-TfoZuZfW.js";import{R as D}from"./refresh-cw-BtHqSStQ.js";import{C as A}from"./chevron-right-CZNwXWtt.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-CDrKesoV.js";const I=a("antenna",[["path",{d:"M2 12 7 2",key:"117k30"}],["path",{d:"m7 12 5-10",key:"1tvx22"}],["path",{d:"m12 12 5-10",key:"ev1o1a"}],["path",{d:"m17 12 5-10",key:"1e4ti3"}],["path",{d:"M4.5 7h15",key:"vlsxkz"}],["path",{d:"M12 16v6",key:"c8a4gj"}]]),O=a("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]),q=a("folder-key",[["circle",{cx:"16",cy:"20",r:"2",key:"1vifvg"}],["path",{d:"M10 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v2",key:"3hgo9p"}],["path",{d:"m22 14-4.5 4.5",key:"1ef6z8"}],["path",{d:"m21 15 1 1",key:"1ejcpy"}]]),K=a("folder-lock",[["rect",{width:"8",height:"5",x:"14",y:"17",rx:"1",key:"19aais"}],["path",{d:"M10 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v2.5",key:"1w6v7t"}],["path",{d:"M20 17v-2a2 2 0 1 0-4 0v2",key:"pwaxnr"}]]),H=a("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]),V=a("monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]),$=a("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]),Y=a("shield-check",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]),U=a("shield-x",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]]),B=a("triangle-dashed",[["path",{d:"M10.17 4.193a2 2 0 0 1 3.666.013",key:"pltmmw"}],["path",{d:"M14 21h2",key:"v4qezv"}],["path",{d:"m15.874 7.743 1 1.732",key:"10m0iw"}],["path",{d:"m18.849 12.952 1 1.732",key:"zadnam"}],["path",{d:"M21.824 18.18a2 2 0 0 1-1.835 2.824",key:"fvwuk4"}],["path",{d:"M4.024 21a2 2 0 0 1-1.839-2.839",key:"1e1kah"}],["path",{d:"m5.136 12.952-1 1.732",key:"1u4ldi"}],["path",{d:"M8 21h2",key:"i9zjee"}],["path",{d:"m8.102 7.743-1 1.732",key:"1zzo4u"}]]);async function X(e){return r("/api/update_web_config",{method:"POST",body:JSON.stringify(e)})}const J=e.memo(function(){const{theme:e}=n(),{colorScheme:s}=e,a=l.find(e=>e.colorScheme===s)??l[0],r=a.displaySize,c=`clamp(${.8*r}rem, ${.6*r}rem + 1.5vw, ${1.4*r}rem)`;return t.jsx("div",{className:"h-10 flex items-center justify-center",children:t.jsxs("span",{className:"font-medium transition-all duration-300 leading-none text-center",style:{fontFamily:a.displayFont,color:a.displayColor,fontSize:c,fontOpticalSizing:"auto",letterSpacing:"-0.03em"},children:["Theme: ",a.displayName]})})}),W=e.memo(function(){const{theme:a,setThemePreset:r,setBrightness:i}=n(),{colorScheme:o,brightness:d}=a,[u,m]=e.useState(!1),[x,p]=e.useState(!1),h=e.useRef(null),b=e.useRef(null),y=(l.find(e=>e.colorScheme===o)??l[0]).id,g=e.useCallback((e,t)=>{if(!b.current)return d;const s=(b.current.y-e)/(t?200:80)*100;return Math.round(Math.max(0,Math.min(100,b.current.brightness+s)))},[d]),f=e.useCallback(e=>{r(e),m(!0)},[r]),j=e.useCallback(e=>{i(e)},[i]),v=e.useCallback(e=>{const t=l.find(t=>t.id===e);t&&c(t.backgroundImage)},[]);return t.jsx("div",{className:"grid grid-cols-4 gap-[3%] w-full",children:l.map(e=>{const a=y===e.id,r=!e.backgroundImage,n=a&&!r&&(u||x);return t.jsxs("div",{ref:a?h:void 0,title:e.displayName,className:s("flex flex-col items-stretch rounded-sm transition-all duration-300 ease-out overflow-hidden",a?"ring-2 ring-accent-primary scale-105 "+(r?"cursor-pointer":"cursor-ns-resize"):"cursor-pointer"),onMouseEnter:()=>{a&&!r?m(!0):a||v(e.id)},onMouseLeave:()=>!x&&m(!1),onClick:()=>!a&&f(e.id),onTouchStart:e=>{if(!a||r)return;e.preventDefault();const t=e.touches[0];b.current={y:t.clientY,brightness:d},p(!0),m(!0);const s=e=>{e.preventDefault();const t=e.touches[0];j(g(t.clientY,!0))},n=()=>{document.removeEventListener("touchmove",s),document.removeEventListener("touchend",n),b.current=null,p(!1),setTimeout(()=>m(!1),1500)};document.addEventListener("touchmove",s,{passive:!1}),document.addEventListener("touchend",n)},onMouseDown:e=>{if(!a||r)return;e.preventDefault(),b.current={y:e.clientY,brightness:d},p(!0),m(!0);const t=e=>{j(g(e.clientY,!1))},s=()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",s),b.current=null,p(!1)};document.addEventListener("mousemove",t),document.addEventListener("mouseup",s)},children:[t.jsxs("div",{className:"glass-thumbnail w-full aspect-square sm:aspect-[4/3] lg:aspect-video relative !rounded-b-none",children:["kde breeze"===e.id?t.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-[#242627]",style:{opacity:n?.4:1},children:t.jsx("span",{className:"text-[#58b99d] text-[1.5em] font-bold font-mono",children:">"})}):"ribbon"===e.id?t.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-[#F5F5F5]",style:{opacity:n?.4:1},children:t.jsx("span",{className:"text-[#2D2D2D] text-[1.5em] font-bold font-mono",children:"R"})}):t.jsx("div",{className:"absolute bg-cover bg-center transition-opacity duration-200",style:{inset:0,backgroundImage:`url(${e.backgroundImage})`,opacity:n?.4:1,filter:"brightness(var(--thumbnail-brightness, 1.5))"}}),a&&t.jsxs("div",{className:s("absolute inset-0 transition-opacity duration-200",n?"opacity-100":"opacity-0"),children:[t.jsx("div",{className:"absolute inset-x-0 bottom-0 bg-black/70 transition-all duration-100 ease-out",style:{height:100-d+"%"}}),t.jsx("div",{className:"absolute inset-x-[8%] h-0.5 bg-white rounded-full shadow-lg transition-all duration-100 ease-out",style:{top:100-d+"%"}}),t.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:t.jsxs("span",{className:"text-[0.6em] font-mono font-bold text-white drop-shadow-lg",children:[d,"%"]})})]})]}),t.jsx("div",{className:"flex flex-col w-full",children:e.paletteColors.map((e,s)=>t.jsx("div",{className:"flex",children:e.map((e,s)=>t.jsx("div",{className:"flex-1 aspect-[2/1]",style:{backgroundColor:e}},s))},s))})]},e.id)})})}),G=e.memo(function({layout:s="horizontal"}){return e.useEffect(()=>{v()},[]),"logo-only"===s?t.jsx(J,{}):"thumbnails-only"===s?t.jsx(W,{}):t.jsxs("div",{className:"flex flex-col items-center gap-3",children:[t.jsx(J,{}),t.jsx(W,{})]})});function Z(){const{latitude:a,longitude:r,enabled:n,setLocation:l,enable:c,disable:d,clear:u}=i(),[m,x]=e.useState(!1),[p,h]=e.useState(""),[b,y]=e.useState(""),[f,j]=e.useState("idle"),[v,N]=e.useState(null),k=e.useRef(null),C=e.useRef(null),S=e.useRef(!0);e.useEffect(()=>(S.current=!0,()=>{S.current=!1,C.current&&clearTimeout(C.current)}),[]);const E=()=>{x(!1),N(null)};e.useEffect(()=>{if(!m)return;const e=e=>{"loading"!==f&&k.current&&!k.current.contains(e.target)&&E()};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[m,f]);const L=null!==a&&null!==r;return t.jsx(w,{children:t.jsxs("div",{ref:k,children:[t.jsxs("div",{className:"flex items-center justify-between mb-4",children:[t.jsx(_,{icon:t.jsx(B,{}),title:"Stealth",largeTitle:!0}),t.jsxs("div",{className:"flex items-center gap-1",children:[L&&!m&&t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:()=>{n?d():c()},className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2 mr-2",n?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle"),title:n?"Disable stealth location":"Enable stealth location",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",n?"translate-x-5":"translate-x-0.5")})}),t.jsx("button",{onClick:()=>{u(),x(!1)},className:"p-2 rounded-lg transition-colors text-text-muted hover:text-accent-danger hover:bg-accent-danger/10",title:"Clear stealth location",children:t.jsx(g,{className:"w-4 h-4"})})]}),m?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:E,disabled:"loading"===f,className:s("p-2 rounded-lg transition-colors","loading"===f?"text-text-muted cursor-not-allowed":"text-text-muted hover:text-accent-danger hover:bg-accent-danger/10"),title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})}),t.jsx("button",{onClick:()=>{if("loading"===f)return;C.current&&clearTimeout(C.current);const e=((e,t)=>{const s=parseFloat(e),a=parseFloat(t);return isNaN(s)||isNaN(a)?"Please enter valid numbers":s<-90||s>90?"Latitude must be between -90 and 90":a<-180||a>180?"Longitude must be between -180 and 180":0===s&&0===a?"Coordinates (0, 0) are invalid":null})(p,b);if(e)return void N(e);j("loading"),N(null);const t=parseFloat(p),s=parseFloat(b);l(t,s),n||c(),j("success"),C.current=setTimeout(()=>{S.current&&(j("idle"),x(!1))},1e3)},disabled:"loading"===f,className:s("p-2 rounded-lg transition-colors","loading"===f?"text-accent-primary cursor-wait":"success"===f?"text-accent-success":"error"===f?"text-accent-danger":"text-accent-success hover:bg-accent-success/10"),title:"Save",children:"loading"===f?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===f?t.jsx(F,{className:"w-4 h-4"}):"error"===f?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:()=>{h((null==a?void 0:a.toFixed(6))??""),y((null==r?void 0:r.toFixed(6))??""),N(null),x(!0)},className:"p-2 rounded-lg transition-colors text-text-muted hover:text-text-primary hover:bg-bg-subtle",title:L?"Edit stealth location":"Set stealth location",children:t.jsx($,{className:"w-4 h-4"})})]})]}),t.jsx("div",{className:"bg-accent-tertiary/5 rounded-xl p-3 mb-4",children:t.jsxs("div",{className:"flex gap-2",children:[t.jsx(M,{className:"w-4 h-4 text-accent-tertiary flex-shrink-0 mt-0.5"}),t.jsxs("p",{className:"type-body-sm text-text-muted",children:[t.jsx("span",{className:"text-text-secondary",children:"Stealth mode"})," allows you to appear on the map and in topology analysis without broadcasting your location. Coordinates are stored locally in your browser only — ",t.jsx("span",{className:"text-accent-tertiary",children:"never sent to config.yaml or the mesh"}),"."]})]})}),v&&t.jsx("div",{className:"text-xs mb-3 px-2 py-1.5 rounded-md text-accent-danger bg-accent-danger/10",children:v}),t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:m?"Latitude (°)":"Latitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",m?"bg-white/5":"bg-white/[0.02]"),children:m?t.jsx("input",{type:"number",value:p,onChange:e=>h(e.target.value),step:"0.000001",min:"-90",max:"90",placeholder:"e.g. 34.052234",className:"w-full bg-transparent text-text-primary focus:outline-none type-data placeholder:text-text-muted/50"}):t.jsx("span",{className:s("type-data",L&&n?"text-text-primary":"text-text-muted"),children:L?a.toFixed(6):"Not set"})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:m?"Longitude (°)":"Longitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",m?"bg-white/5":"bg-white/[0.02]"),children:m?t.jsx("input",{type:"number",value:b,onChange:e=>y(e.target.value),step:"0.000001",min:"-180",max:"180",placeholder:"e.g. -118.243685",className:"w-full bg-transparent text-text-primary focus:outline-none type-data placeholder:text-text-muted/50"}):t.jsx("span",{className:s("type-data",L&&n?"text-text-primary":"text-text-muted"),children:L?r.toFixed(6):"Not set"})})]})]}),L&&!m&&t.jsx("div",{className:"mt-3 pt-3 border-t border-border-subtle",children:t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:s("w-2 h-2 rounded-full",n?"bg-accent-success":"bg-text-muted")}),t.jsx("span",{className:"type-body-sm text-text-muted",children:n?"Stealth location active — you appear on maps with these coordinates":"Stealth location disabled — coordinates saved but not in use"})]})})]})})}const Q=[{value:7.8,label:"7.8 kHz"},{value:10.4,label:"10.4 kHz"},{value:15.6,label:"15.6 kHz"},{value:20.8,label:"20.8 kHz"},{value:31.25,label:"31.25 kHz"},{value:41.7,label:"41.7 kHz"},{value:62.5,label:"62.5 kHz"},{value:125,label:"125 kHz"},{value:250,label:"250 kHz"},{value:500,label:"500 kHz"}],ee=[5,6,7,8,9,10,11,12],te=[{value:5,label:"4/5"},{value:6,label:"4/6"},{value:7,label:"4/7"},{value:8,label:"4/8"}],se="radioConfig",ae="repeaterSettings",re="operatingMode";function ne({node:e,level:a,expandedKeys:r,selectedKeyId:n,globalFloodPolicy:l,onSelect:c,onToggle:i}){const o=r.has(e.id),d=n===e.id,u=e.children&&e.children.length>0,m="allow"===l;return t.jsxs("div",{children:[t.jsxs("div",{className:s("flex items-center gap-2 h-[36px] px-3 rounded-full cursor-pointer transition-colors",d?"bg-accent-primary/15":"hover:bg-subtle-fill",m&&"opacity-50 cursor-not-allowed"),style:{marginLeft:16*a+"px"},onClick:()=>!m&&c(e.id),children:[u?t.jsx("button",{onClick:t=>{t.stopPropagation(),i(e.id)},className:"p-1 hover:bg-subtle-fill-hover rounded-full transition-colors",children:t.jsx(A,{className:s("w-3.5 h-3.5 text-text-muted transition-transform",o&&"rotate-90")})}):t.jsx("span",{className:"w-5"}),t.jsx(q,{className:"w-4 h-4 text-accent-primary flex-shrink-0"}),t.jsx("span",{className:"type-data text-text-primary flex-1 truncate",children:e.name}),t.jsx("span",{className:s("type-data-xs px-2 py-0.5 rounded-full","allow"===e.floodPolicy?"bg-accent-success/15 text-accent-success":"bg-accent-danger/15 text-accent-danger"),children:"allow"===e.floodPolicy?"Allow":"Deny"})]}),u&&o&&t.jsx("div",{children:e.children.map(e=>t.jsx(ne,{node:e,level:a+1,expandedKeys:r,selectedKeyId:n,globalFloodPolicy:l,onSelect:c,onToggle:i},e.id))})]})}function le(){var a,n,l,c,i,v;const{stats:A,setMode:q,clearModeMutation:B,setDutyCycleConfig:J,clearDutyCycleMutation:W,fetchStats:le,startMutation:ce,clearMutation:ie}=d(),oe=null==(a=null==A?void 0:A.config)?void 0:a.radio,de=null==(n=null==A?void 0:A.config)?void 0:n.repeater,ue=null==(l=null==A?void 0:A.config)?void 0:l.duty_cycle,me=(null==A?void 0:A.node_name)||(null==(c=null==A?void 0:A.config)?void 0:c.node_name)||"Unknown Node",xe=(null==de?void 0:de.mode)??"forward",pe=(null==ue?void 0:ue.enforcement_enabled)??!1,he=null==(i=null==A?void 0:A.config)?void 0:i.delays,[be,ye]=e.useState(!1),[ge,fe]=e.useState(""),[je,ve]=e.useState(62.5),[Ne,we]=e.useState(7),[ke,Ce]=e.useState(5),[Se,_e]=e.useState(""),[Te,Fe]=e.useState("idle"),[Ee,Me]=e.useState(null),Le=e.useRef(null),Pe=e.useRef(null),[Re,ze]=e.useState(!1),[De,Ae]=e.useState(""),[Ie,Oe]=e.useState(""),[qe,Ke]=e.useState(""),[He,Ve]=e.useState("idle"),$e=e.useRef(null),Ye=e.useRef(null),[Ue,Be]=e.useState(!1),[Xe,Je]=e.useState(""),[We,Ge]=e.useState(""),[Ze,Qe]=e.useState(""),[et,tt]=e.useState(""),[st,at]=e.useState("idle"),[rt,nt]=e.useState(null),lt=e.useRef(null),ct=e.useRef(null),[it,ot]=e.useState("idle"),[dt,ut]=e.useState("idle"),[mt,xt]=e.useState(null),[pt,ht]=e.useState(null),bt=e.useRef(!0),yt=e.useRef(null),gt=e.useRef(null),ft=e.useRef(null),jt=e.useRef(null),vt=e.useRef(!1),Nt=e.useRef(!1);e.useEffect(()=>(bt.current=!0,()=>{bt.current=!1,yt.current&&clearTimeout(yt.current),gt.current&&clearTimeout(gt.current),ft.current&&clearTimeout(ft.current),jt.current&&clearTimeout(jt.current),Tt.current&&clearTimeout(Tt.current),Ft.current&&clearTimeout(Ft.current),Pe.current&&clearTimeout(Pe.current),$e.current&&clearTimeout($e.current),ct.current&&clearTimeout(ct.current)}),[]),e.useEffect(()=>{const e=e=>{if(be||Ue||Re)return e.preventDefault(),e.returnValue="You have unsaved changes. Are you sure you want to leave?",e.returnValue};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[be,Ue,Re]);const wt=null==(v=null==A?void 0:A.config)?void 0:v.web,[kt,Ct]=e.useState("idle"),[St,_t]=e.useState(null),Tt=e.useRef(null),Ft=e.useRef(null),Et=e.useRef(!1),[Mt,Lt]=e.useState([]),[Pt,Rt]=e.useState(!1),[zt,Dt]=e.useState(null),[At,It]=e.useState(!1),[Ot,qt]=e.useState(""),[Kt,Ht]=e.useState(null),[Vt,$t]=e.useState(!1),[Yt,Ut]=e.useState(null),[Bt,Xt]=e.useState(!1),[Jt,Wt]=e.useState(!1),[Gt,Zt]=e.useState(!1),[Qt,es]=e.useState([]),[ts,ss]=e.useState(!1),[as,rs]=e.useState(null),[ns,ls]=e.useState("deny"),[cs,is]=e.useState(!1),[os,ds]=e.useState(null),[us,ms]=e.useState(new Set),[xs,ps]=e.useState(!1),[hs,bs]=e.useState(!1),[ys,gs]=e.useState(!1),[fs,js]=e.useState(null),[vs,Ns]=e.useState(null),[ws,ks]=e.useState(""),[Cs,Ss]=e.useState("deny"),[_s,Ts]=e.useState(!1),[Fs,Es]=e.useState(!0),[Ms,Ls]=e.useState(!1),[Ps,Rs]=e.useState(!0),[zs,Ds]=e.useState("idle"),[As,Is]=e.useState(!1),[Os,qs]=e.useState(!1),Ks=e.useRef(!1);e.useEffect(()=>{const e=be&&!Ks.current;Ks.current=be,oe&&e&&(fe((oe.frequency/1e6).toFixed(3)),ve(oe.bandwidth/1e3),we(oe.spreading_factor),Ce(oe.coding_rate),_e(String(oe.tx_power)))},[oe,be]);const Hs=e.useMemo(()=>{if(!oe||!be)return!1;const e=oe.frequency/1e6,t=oe.bandwidth/1e3,s=parseFloat(ge)||0;return Math.abs(s-e)>1e-4||je!==t||Ne!==oe.spreading_factor||ke!==oe.coding_rate||parseInt(Se)!==oe.tx_power},[oe,be,ge,je,Ne,ke,Se]),Vs=e.useCallback(()=>{ye(!1),Me(null),oe&&(fe((oe.frequency/1e6).toFixed(3)),ve(oe.bandwidth/1e3),we(oe.spreading_factor),Ce(oe.coding_rate),_e(String(oe.tx_power)))},[oe]);e.useEffect(()=>{if(!be)return;const e=e=>{"loading"!==Te&&Le.current&&!Le.current.contains(e.target)&&Vs()};return document.addEventListener("mouseup",e),()=>{document.removeEventListener("mouseup",e)}},[be,Vs,Te]);const $s=e.useCallback(()=>{const e=null==he?void 0:he.tx_delay_factor;return e&&"object"==typeof e&&"parsedValue"in e?e.parsedValue??1:"number"==typeof e?e:1},[he]),Ys=e.useCallback(()=>{const e=null==he?void 0:he.direct_tx_delay_factor;return"number"==typeof e?e:.5},[he]),Us=e.useCallback(()=>{const e=null==ue?void 0:ue.max_airtime_percent;return"number"==typeof e?e:e&&"object"==typeof e&&"parsedValue"in e?e.parsedValue??6:6},[ue]),Bs=e.useCallback(()=>{Ae($s().toFixed(2)),Oe(Ys().toFixed(2)),Ke(Us().toFixed(1)),ze(!0)},[$s,Ys,Us]),Xs=e.useCallback(()=>{ze(!1)},[]);e.useEffect(()=>{if(!Re)return;const e=e=>{"loading"!==He&&Ye.current&&!Ye.current.contains(e.target)&&Xs()};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[Re,Xs,He]);const Js=e.useCallback(()=>{var e,t,s;Je(me),Ge((null==(e=null==de?void 0:de.latitude)?void 0:e.toString())||"0"),Qe((null==(t=null==de?void 0:de.longitude)?void 0:t.toString())||"0"),tt((null==(s=null==de?void 0:de.send_advert_interval_hours)?void 0:s.toString())||"0"),nt(null),Be(!0)},[me,de]),Ws=e.useCallback(()=>{Be(!1),nt(null)},[]);e.useEffect(()=>{if(!Ue)return;const e=e=>{"loading"!==st&<.current&&!lt.current.contains(e.target)&&Ws()};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[Ue,Ws,st]);const Gs=async()=>{var e;if("loading"===kt)return;const t=(null==wt?void 0:wt.cors_enabled)??!1,s=!t,a=t;Tt.current&&clearTimeout(Tt.current),Ft.current&&clearTimeout(Ft.current),Et.current=!1,_t(s),Ct("loading"),Tt.current=setTimeout(()=>{Et.current||bt.current&&(_t(a),Ct("error"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3))},1e4);try{const t=await X({web:{cors_enabled:s}});if(Et.current=!0,Tt.current&&clearTimeout(Tt.current),!bt.current)return;t.success||(null==(e=t.data)?void 0:e.persisted)?(await le(),Ct("success"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3)):(_t(a),Ct("error"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3))}catch{if(Et.current=!0,Tt.current&&clearTimeout(Tt.current),!bt.current)return;_t(a),Ct("error"),Ft.current=setTimeout(()=>{bt.current&&(Ct("idle"),_t(null))},2e3)}};e.useEffect(()=>{(async()=>{Rs(!0);try{const e=await async function(){return r("/api/check_pymc_console")}();e.success&&e.data?Ls(e.data.exists):Ls(!1);const t=null==wt?void 0:wt.web_path;Es(!t||""===t)}catch{Ls(!1)}finally{Rs(!1)}})()},[null==wt?void 0:wt.web_path]);const Zs=async e=>{var t;if("loading"!==zs){Ds("loading");try{const s=await X({web:{web_path:e?null:"/opt/pymc_console/web/html"}});if(!bt.current)return;s.success||(null==(t=s.data)?void 0:t.persisted)?(Es(e),Ds("success"),Is(!0),setTimeout(()=>{bt.current&&Ds("idle")},2e3)):(Ds("error"),setTimeout(()=>{bt.current&&Ds("idle")},2e3))}catch{if(!bt.current)return;Ds("error"),setTimeout(()=>{bt.current&&Ds("idle")},2e3)}}},Qs=e.useCallback(async()=>{Rt(!0),Dt(null);try{const e=await async function(){return r("/auth/tokens")}();Lt(e.tokens||[])}catch(e){Dt(e instanceof Error?e.message:"Failed to fetch tokens")}finally{Rt(!1)}},[]);e.useEffect(()=>{Qs()},[Qs]);const ea=async()=>{if(Ot.trim()){Xt(!0),Dt(null);try{const e=await async function(e){return r("/auth/tokens",{method:"POST",body:JSON.stringify({name:e})})}(Ot.trim());Ht(e.token||null),It(!1),$t(!0),qt(""),await Qs()}catch(e){Dt(e instanceof Error?e.message:"Failed to create token")}finally{Xt(!1)}}else Dt("Token name is required")},ta=e=>e?new Date(1e3*e).toLocaleString():"Never",sa=e.useCallback(e=>{const t=new Map,s=[];return e.forEach(e=>{const s={id:e.id,name:e.name,floodPolicy:e.flood_policy,transport_key:e.transport_key,last_used:e.last_used,parent_id:e.parent_id,children:[]};t.set(e.id,s)}),t.forEach(e=>{e.parent_id&&t.has(e.parent_id)?t.get(e.parent_id).children.push(e):s.push(e)}),s},[]),aa=e.useCallback(async()=>{ss(!0),rs(null);try{const e=await async function(){return r("/api/transport_keys")}();e.success&&e.data?es(sa(e.data)):rs(e.error||"Failed to load transport keys")}catch(e){rs(e instanceof Error?e.message:"Unknown error occurred")}finally{ss(!1)}},[sa]);e.useEffect(()=>{aa()},[aa]);const ra=e.useCallback((e,t)=>{for(const s of e){if(s.id===t)return s;if(s.children){const e=ra(s.children,t);if(e)return e}}return null},[]),na=e.useCallback(()=>{if(!os)return;const e=ra(Qt,os);return null==e?void 0:e.name},[os,Qt,ra]),la=e.useCallback(e=>{ms(t=>{const s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})},[]),ca=async e=>{is(!0),rs(null);try{const t=await async function(e){return r("/api/global_flood_policy",{method:"POST",body:JSON.stringify({global_flood_allow:e})})}("allow"===e);t.success?ls(e):rs(t.error||"Failed to update global flood policy")}catch(t){rs(t instanceof Error?t.message:"Failed to update global flood policy")}finally{is(!1)}},ia=async()=>{if(ws.trim()){Ts(!0),rs(null);try{const e=await async function(e){return r("/api/transport_keys",{method:"POST",body:JSON.stringify(e)})}({name:ws.trim(),flood_policy:Cs,parent_id:os??void 0});e.success?(await aa(),ps(!1),ks(""),Ss("deny")):rs(e.error||"Failed to add transport key")}catch(e){rs(e instanceof Error?e.message:"Failed to add transport key")}finally{Ts(!1)}}else rs("Key name is required")},oa=e.useCallback(()=>{if(!os)return;const e=ra(Qt,os);e&&(js({...e}),bs(!0))},[os,Qt,ra]);e.useEffect(()=>{const e=e=>{"Escape"===e.key&&(xs&&(ps(!1),ks(""),Ss("deny")),hs&&(bs(!1),js(null)),ys&&(gs(!1),Ns(null)),At&&(It(!1),qt("")),Vt&&($t(!1),Ht(null)))};if(xs||hs||ys||At||Vt)return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[xs,hs,ys,At,Vt]);const da=e.useCallback(()=>{if(!os)return;const e=ra(Qt,os);e&&(Ns(e),gs(!0))},[os,Qt,ra]);return t.jsxs(k,{children:[t.jsx(C,{title:"Configuration",icon:t.jsx(u,{})}),t.jsxs(S,{children:[t.jsxs(L,{template:"standard",children:[t.jsx(P,{span:12,md:6,children:t.jsx(w,{children:t.jsxs("div",{ref:lt,children:[t.jsxs("div",{className:"flex items-center justify-between mb-4",children:[t.jsxs("h2",{className:"type-subheading text-text-primary flex items-center gap-2",children:[t.jsx(m,{className:"icon-md text-accent-primary"}),"Repeater Settings"]}),t.jsx("div",{className:"flex items-center gap-1",children:de&&(Ue?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:Ws,disabled:"loading"===st,className:s("p-2 radius-inner transition-base","loading"===st?"text-text-muted cursor-not-allowed":"text-text-muted hover:text-accent-danger hover:bg-accent-danger/10"),title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})}),t.jsx("button",{onClick:async()=>{if("loading"!==st){ct.current&&clearTimeout(ct.current),ce(ae),at("loading"),nt(null);try{const e={};Xe&&Xe!==me&&(e.node_name=Xe);const t=parseFloat(We);isNaN(t)||t===(null==de?void 0:de.latitude)||(e.latitude=t);const s=parseFloat(Ze);isNaN(s)||s===(null==de?void 0:de.longitude)||(e.longitude=s);const a=parseInt(et);if(isNaN(a)||a===(null==de?void 0:de.send_advert_interval_hours)||(e.flood_advert_interval_hours=a),0===Object.keys(e).length)return nt({success:!0,message:"No changes to save"}),at("idle"),void ie(ae);const r=await y(e);if(!bt.current)return void ie(ae);if(r.success&&r.data){const e=r.data.applied.join(", ");nt({success:!0,message:`Updated: ${e}`}),await le({force:!0}),at("success"),ct.current=setTimeout(()=>{bt.current&&(at("idle"),Be(!1),nt(null),ie(ae))},1500)}else nt({success:!1,message:r.error||"Failed to save"}),at("error"),ie(ae),ct.current=setTimeout(()=>{bt.current&&at("idle")},2e3)}catch(e){if(!bt.current)return void ie(ae);nt({success:!1,message:String(e)}),at("error"),ie(ae),ct.current=setTimeout(()=>{bt.current&&at("idle")},2e3)}}},disabled:"loading"===st,className:s("p-2 radius-inner transition-base","loading"===st?"text-accent-primary cursor-wait":"success"===st?"text-accent-success":"error"===st?"text-accent-danger":"text-accent-success hover:bg-accent-success/10"),title:"Save changes",children:"loading"===st?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===st?t.jsx(F,{className:"w-4 h-4"}):"error"===st?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:Js,className:"p-2 radius-inner transition-base text-text-muted hover:text-text-primary hover-bg",title:"Edit repeater settings",children:t.jsx($,{className:"w-4 h-4"})}))})]}),rt&&t.jsx("div",{className:s("text-xs mb-3 px-2 py-1.5 rounded-md",rt.success?"text-accent-success bg-accent-success/10":"text-accent-danger bg-accent-danger/10"),children:rt.message}),de?t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsxs("div",{className:"col-span-2",children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Node Name"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"text",value:Xe,onChange:e=>Je(e.target.value),maxLength:50,className:"w-full bg-transparent text-text-primary focus:outline-none type-data",placeholder:"Enter node name"}):t.jsx("span",{className:"type-data text-text-primary",children:me})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:Ue?"Latitude (°)":"Latitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"number",value:We,onChange:e=>Ge(e.target.value),step:"0.000001",min:"-90",max:"90",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:0!==de.latitude?de.latitude.toFixed(6):"Not set"})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:Ue?"Longitude (°)":"Longitude"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"number",value:Ze,onChange:e=>Qe(e.target.value),step:"0.000001",min:"-180",max:"180",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:0!==de.longitude?de.longitude.toFixed(6):"Not set"})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:Ue?"Advert Interval (hours)":"Advert Interval"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",Ue?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Ue?t.jsx("input",{type:"number",value:et,onChange:e=>tt(e.target.value),min:"0",max:"48",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:de.send_advert_interval_hours>0?`${de.send_advert_interval_hours}h`:"Disabled"})}),Ue&&t.jsx("p",{className:"type-data-xs text-text-muted mt-1 ml-4",children:"0 = disabled, 3-48 hours"})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Score-based TX"}),t.jsx("div",{className:"h-[38px] rounded-full px-4 flex items-center bg-subtle-fill",children:t.jsx("span",{className:"type-data text-text-primary",children:de.use_score_for_tx?"Enabled":"Disabled"})})]})]}):t.jsx("p",{className:"text-text-muted",children:"Loading repeater settings..."})]})})}),t.jsx(P,{span:12,md:6,children:t.jsx(w,{children:t.jsxs("div",{ref:Le,children:[t.jsxs("div",{className:"flex items-center justify-between mb-4",children:[t.jsxs("h2",{className:"type-subheading text-text-primary flex items-center gap-2",children:[t.jsx(I,{className:"icon-md text-accent-primary"}),"Radio Configuration"]}),t.jsx("div",{className:"flex items-center gap-1",children:oe&&(be?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:Vs,disabled:"loading"===Te,className:s("p-2 radius-inner transition-base","loading"===Te?"text-text-muted cursor-not-allowed":"text-text-muted hover:text-accent-danger hover:bg-accent-danger/10"),title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})}),t.jsx("button",{onClick:async()=>{if("loading"!==Te){Pe.current&&clearTimeout(Pe.current),ce(se),Fe("loading"),Me(null);try{const e={},t=parseFloat(ge),s=oe?oe.frequency/1e6:0;Math.abs(t-s)>1e-4&&(e.frequency_mhz=t);const a=oe?oe.bandwidth/1e3:0;je!==a&&(e.bandwidth_khz=je),Ne!==(null==oe?void 0:oe.spreading_factor)&&(e.spreading_factor=Ne),ke!==(null==oe?void 0:oe.coding_rate)&&(e.coding_rate=ke);const r=parseInt(Se);if(r!==(null==oe?void 0:oe.tx_power)&&(e.tx_power=r),0===Object.keys(e).length)return Me({success:!0,message:"No changes to save"}),Fe("idle"),void ie(se);const n=await y(e);if(!bt.current)return void ie(se);if(n.success&&n.data){const e=n.data.applied.join(", "),t=n.data.live_update?" (applied live)":" (restart required)";Me({success:!0,message:`Updated: ${e}${t}`}),await le({force:!0}),Fe("success"),Pe.current=setTimeout(()=>{bt.current&&(Fe("idle"),ye(!1),Me(null),ie(se))},1500)}else Me({success:!1,message:n.error||"Failed to save"}),Fe("error"),ie(se),Pe.current=setTimeout(()=>{bt.current&&Fe("idle")},2e3)}catch(e){if(!bt.current)return void ie(se);Me({success:!1,message:String(e)}),Fe("error"),ie(se),Pe.current=setTimeout(()=>{bt.current&&Fe("idle")},2e3)}}},disabled:"loading"===Te||!Hs,className:s("p-2 radius-inner transition-base","loading"===Te?"text-accent-primary cursor-wait":"success"===Te?"text-accent-success":"error"===Te?"text-accent-danger":Hs?"text-accent-success hover:bg-accent-success/10":"text-text-muted cursor-not-allowed"),title:Hs?"Save changes":"No changes to save",children:"loading"===Te?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===Te?t.jsx(F,{className:"w-4 h-4"}):"error"===Te?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:()=>{oe&&(fe((oe.frequency/1e6).toFixed(3)),ve(oe.bandwidth/1e3),we(oe.spreading_factor),Ce(oe.coding_rate),_e(String(oe.tx_power))),Me(null),ye(!0)},className:"p-2 radius-inner transition-base text-text-muted hover:text-text-primary hover-bg",title:"Edit radio settings",children:t.jsx($,{className:"w-4 h-4"})}))})]}),Ee&&t.jsx("div",{className:s("text-xs mb-3 px-2 py-1.5 rounded-md",Ee.success?"text-accent-success bg-accent-success/10":"text-accent-danger bg-accent-danger/10"),children:Ee.message}),oe?t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:be?"Frequency (MHz)":"Frequency"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsx("input",{type:"number",value:ge,onChange:e=>fe(e.target.value),step:"0.001",min:"400",max:"930",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsx("span",{className:"type-data text-text-primary",children:x(oe.frequency)})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:be?"TX Power (dBm)":"TX Power"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsx("input",{type:"number",value:Se,onChange:e=>_e(e.target.value),min:"-9",max:"22",className:"w-full bg-transparent text-text-primary focus:outline-none type-data"}):t.jsxs("span",{className:"type-data text-text-primary",children:[oe.tx_power," dBm"]})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Bandwidth"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors relative",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsxs(t.Fragment,{children:[t.jsx("select",{value:je,onChange:e=>ve(parseFloat(e.target.value)),className:"w-full bg-transparent text-text-primary focus:outline-none appearance-none cursor-pointer type-data pr-6",children:Q.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))}),t.jsx(p,{className:"absolute right-4 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted pointer-events-none"})]}):t.jsx("span",{className:"type-data text-text-primary",children:h(oe.bandwidth)})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Spreading Factor"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors relative",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsxs(t.Fragment,{children:[t.jsx("select",{value:Ne,onChange:e=>we(parseInt(e.target.value)),className:"w-full bg-transparent text-text-primary focus:outline-none appearance-none cursor-pointer type-data pr-6",children:ee.map(e=>t.jsxs("option",{value:e,children:["SF",e]},e))}),t.jsx(p,{className:"absolute right-4 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted pointer-events-none"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:["SF",oe.spreading_factor]})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Coding Rate"}),t.jsx("div",{className:s("h-[38px] rounded-full px-4 flex items-center transition-colors relative",be?"bg-subtle-fill-hover":"bg-subtle-fill"),children:be?t.jsxs(t.Fragment,{children:[t.jsx("select",{value:ke,onChange:e=>Ce(parseInt(e.target.value)),className:"w-full bg-transparent text-text-primary focus:outline-none appearance-none cursor-pointer type-data pr-6",children:te.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))}),t.jsx(p,{className:"absolute right-4 top-1/2 -translate-y-1/2 w-4 h-4 text-text-muted pointer-events-none"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:["4/",oe.coding_rate]})})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-1",children:"Preamble"}),t.jsx("div",{className:"h-[38px] rounded-full px-4 flex items-center bg-subtle-fill",children:t.jsxs("span",{className:"type-data text-text-primary",children:[oe.preamble_length," symbols"]})})]})]}):t.jsx("p",{className:"text-text-muted",children:"Loading radio configuration..."})]})})})]}),t.jsxs(L,{template:"standard",children:[t.jsx(P,{span:12,md:6,children:t.jsx(w,{children:t.jsxs("div",{ref:Ye,children:[t.jsxs("div",{className:"flex items-center justify-between mb-3",children:[t.jsxs("h2",{className:"type-subheading text-text-primary flex items-center gap-3",children:[t.jsx(b,{className:"icon-md text-icon-card-title"}),"Operating Mode"]}),t.jsx("div",{className:"flex items-center gap-1",children:Re?t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:async()=>{if("loading"!==He){$e.current&&clearTimeout($e.current),ce(re),Ve("loading");try{const e=await y({tx_delay_factor:parseFloat(De),direct_tx_delay_factor:parseFloat(Ie)});if(await J({max_airtime_percent:parseFloat(qe),enforcement_enabled:pe}),!bt.current)return void ie(re);e.success&&e.data?(await le({force:!0}),Ve("success"),$e.current=setTimeout(()=>{bt.current&&(Ve("idle"),ze(!1),ie(re))},1500)):(Ve("error"),ie(re),$e.current=setTimeout(()=>{bt.current&&Ve("idle")},2e3))}catch{if(!bt.current)return void ie(re);Ve("error"),ie(re),$e.current=setTimeout(()=>{bt.current&&Ve("idle")},2e3)}}},disabled:"loading"===He,className:s("p-2 radius-inner transition-base","loading"===He?"text-accent-primary cursor-wait":"success"===He?"text-accent-success":"error"===He?"text-accent-danger":"text-accent-success hover:bg-accent-success/10"),title:"Save",children:"loading"===He?t.jsx(T,{className:"w-4 h-4 animate-spin"}):"success"===He?t.jsx(F,{className:"w-4 h-4"}):"error"===He?t.jsx(o,{className:"w-4 h-4"}):t.jsx(F,{className:"w-4 h-4"})}),t.jsx("button",{onClick:Xs,className:"p-2 radius-inner transition-base text-text-muted hover:text-accent-danger hover:bg-accent-danger/10",title:"Cancel",children:t.jsx(o,{className:"w-4 h-4"})})]}):t.jsx("button",{onClick:Bs,className:"p-2 radius-inner transition-base text-text-muted hover:text-text-primary hover-bg",title:"Edit settings",children:t.jsx($,{className:"w-4 h-4"})})})]}),t.jsx("p",{className:"type-label text-text-muted mb-3",children:"Control how the repeater handles packets"}),t.jsxs("div",{className:"flex flex-col sm:flex-row gap-4",children:[t.jsxs("div",{className:"flex-1 space-y-4",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("label",{className:"type-label text-text-muted",children:"Repeat"}),t.jsx("div",{className:"flex items-center gap-2",children:(()=>{const e=null!==mt?mt:"forward"===xe;return t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:async()=>{if("loading"===it)return;const t=!e,s="forward"===xe;yt.current&&clearTimeout(yt.current),gt.current&&clearTimeout(gt.current),vt.current=!1,xt(t),ot("loading"),yt.current=setTimeout(()=>{vt.current||bt.current&&(xt(s),ot("error"),gt.current=setTimeout(()=>{bt.current&&(ot("idle"),xt(null))},2e3))},1e4);try{if(await q(t?"forward":"monitor"),vt.current=!0,yt.current&&clearTimeout(yt.current),!bt.current)return;ot("success"),gt.current=setTimeout(()=>{bt.current&&(ot("idle"),xt(null),B())},2e3)}catch{if(vt.current=!0,yt.current&&clearTimeout(yt.current),!bt.current)return;xt(s),ot("error"),gt.current=setTimeout(()=>{bt.current&&(ot("idle"),xt(null))},2e3)}},disabled:"loading"===it,className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2",e?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle","loading"===it&&"opacity-70"),"aria-label":"Toggle forward mode",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",e?"translate-x-5":"translate-x-0.5")})}),t.jsx("span",{className:s("type-data text-sm w-7",e?"text-accent-success":"text-text-muted"),children:e?"On":"Off"}),"loading"===it&&t.jsx(T,{className:"w-4 h-4 text-text-muted animate-spin"}),"success"===it&&t.jsx(F,{className:"w-4 h-4 text-accent-success"}),"error"===it&&t.jsx(o,{className:"w-4 h-4 text-accent-danger"})]})})()})]}),t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("label",{className:"type-label text-text-muted",children:"Duty Cycle"}),t.jsx("div",{className:"flex items-center gap-2",children:(()=>{const e=null!==pt?pt:pe;return t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:async()=>{if("loading"===dt)return;const t=!e,s=pe;ft.current&&clearTimeout(ft.current),jt.current&&clearTimeout(jt.current),Nt.current=!1,ht(t),ut("loading"),ft.current=setTimeout(()=>{Nt.current||bt.current&&(ht(s),ut("error"),jt.current=setTimeout(()=>{bt.current&&(ut("idle"),ht(null))},2e3))},1e4);try{if(await J({max_airtime_percent:Us(),enforcement_enabled:t}),Nt.current=!0,ft.current&&clearTimeout(ft.current),!bt.current)return;ut("success"),jt.current=setTimeout(()=>{bt.current&&(ut("idle"),ht(null),W())},2e3)}catch{if(Nt.current=!0,ft.current&&clearTimeout(ft.current),!bt.current)return;ht(s),ut("error"),jt.current=setTimeout(()=>{bt.current&&(ut("idle"),ht(null))},2e3)}},disabled:"loading"===dt,className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2",e?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle","loading"===dt&&"opacity-70"),"aria-label":"Toggle duty cycle",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",e?"translate-x-5":"translate-x-0.5")})}),t.jsx("span",{className:s("type-data text-sm w-7",e?"text-accent-success":"text-text-muted"),children:e?"On":"Off"}),"loading"===dt&&t.jsx(T,{className:"w-4 h-4 text-text-muted animate-spin"}),"success"===dt&&t.jsx(F,{className:"w-4 h-4 text-accent-success"}),"error"===dt&&t.jsx(o,{className:"w-4 h-4 text-accent-danger"})]})})()})]}),t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("label",{className:"type-label text-text-muted",children:"Max Airtime"}),t.jsx("div",{className:s("h-[32px] rounded-full px-3 flex items-center justify-end transition-colors min-w-[80px]",Re?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Re?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("input",{type:"number",value:qe,onChange:e=>Ke(e.target.value),step:"0.5",min:"0.1",max:"100",className:"w-12 bg-transparent text-text-primary text-right focus:outline-none type-data"}),t.jsx("span",{className:"text-text-muted type-data",children:"%"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:[Us().toFixed(1),"%"]})})]})]}),t.jsx("div",{className:"hidden sm:block w-px bg-border-subtle"}),t.jsxs("div",{className:"flex-1 pt-4 sm:pt-0 border-t sm:border-t-0 border-border-subtle",children:[t.jsx("label",{className:"type-label text-text-muted block mb-3",children:"TX Delays"}),t.jsxs("div",{className:"space-y-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("span",{className:"type-label text-text-muted",children:"Flood"}),t.jsx("div",{className:s("h-[32px] rounded-full px-3 flex items-center justify-end transition-colors min-w-[80px]",Re?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Re?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("input",{type:"number",value:De,onChange:e=>Ae(e.target.value),step:"0.1",min:"0",max:"5",className:"w-12 bg-transparent text-text-primary text-right focus:outline-none type-data"}),t.jsx("span",{className:"text-text-muted type-data",children:"x"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:[$s().toFixed(2),"x"]})})]}),t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("span",{className:"type-label text-text-muted",children:"Direct"}),t.jsx("div",{className:s("h-[32px] rounded-full px-3 flex items-center justify-end transition-colors min-w-[80px]",Re?"bg-subtle-fill-hover":"bg-subtle-fill"),children:Re?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("input",{type:"number",value:Ie,onChange:e=>Oe(e.target.value),step:"0.1",min:"0",max:"5",className:"w-12 bg-transparent text-text-primary text-right focus:outline-none type-data"}),t.jsx("span",{className:"text-text-muted type-data",children:"s"})]}):t.jsxs("span",{className:"type-data text-text-primary",children:[Ys().toFixed(2),"s"]})})]})]})]})]})]})})}),t.jsx(P,{span:12,md:6,children:t.jsxs(w,{children:[t.jsx(_,{icon:t.jsx(u,{}),title:"App Settings",largeTitle:!0}),t.jsx("p",{className:"type-body-sm text-text-muted mb-4",children:"Appearance and web server options."}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{className:"flex justify-between items-center",children:[t.jsxs("div",{children:[t.jsx("span",{className:"type-body text-text-primary font-medium block",children:"Enable CORS"}),t.jsx("span",{className:"type-body-sm text-text-muted",children:"Allow cross-origin API access"})]}),t.jsx("div",{className:"flex items-center gap-2",children:(()=>{const e=null!==St?St:(null==wt?void 0:wt.cors_enabled)??!1;return t.jsxs(t.Fragment,{children:[t.jsx("button",{onClick:Gs,disabled:"loading"===kt,className:s("relative inline-flex h-6 w-11 items-center rounded-full transition-colors border-2",e?"bg-toggle-on border-toggle-on":"bg-toggle-off border-border-subtle","loading"===kt&&"opacity-70"),title:e?"Disable CORS":"Enable CORS",children:t.jsx("span",{className:s("inline-block h-4 w-4 transform rounded-full bg-white transition-transform shadow-lg",e?"translate-x-5":"translate-x-0.5")})}),"loading"===kt&&t.jsx(T,{className:"w-4 h-4 text-text-muted animate-spin"}),"success"===kt&&t.jsx(F,{className:"w-4 h-4 text-accent-success"}),"error"===kt&&t.jsx(o,{className:"w-4 h-4 text-accent-danger"})]})})()})]}),t.jsx("div",{children:t.jsx(G,{})})]})]})})]}),t.jsx(L,{template:"auto",children:t.jsxs(w,{children:[t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4",children:[t.jsxs("div",{children:[t.jsxs("h2",{className:"type-heading text-text-primary flex items-center gap-2",children:[t.jsx(K,{className:"icon-md text-accent-primary"}),"Regions / Transport Keys"]}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Manage regional key hierarchy for flood control"})]}),t.jsxs("div",{className:"flex gap-2 flex-wrap",children:[t.jsxs("button",{onClick:()=>ps(!0),disabled:"allow"===ns,className:s("flex items-center gap-1.5 h-[32px] px-3 rounded-full transition-colors type-body-sm font-medium","allow"===ns?"bg-subtle-fill text-text-muted cursor-not-allowed":"bg-accent-success/10 hover:bg-accent-success/20 text-accent-success"),children:[t.jsx(f,{className:"w-3.5 h-3.5"}),"Add"]}),t.jsx("button",{onClick:oa,disabled:!os||"allow"===ns,className:s("h-[32px] px-3 rounded-full transition-colors type-body-sm font-medium",os&&"allow"!==ns?"bg-accent-primary/10 hover:bg-accent-primary/20 text-accent-primary":"bg-subtle-fill text-text-muted cursor-not-allowed"),children:"Edit"}),t.jsx("button",{onClick:da,disabled:!os||"allow"===ns,className:s("h-[32px] px-3 rounded-full transition-colors type-body-sm font-medium",os&&"allow"!==ns?"bg-accent-danger/10 hover:bg-accent-danger/20 text-accent-danger":"bg-subtle-fill text-text-muted cursor-not-allowed"),children:"Delete"})]})]}),t.jsx("div",{className:"bg-subtle-fill radius-card p-4 mb-4",children:t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:s("w-10 h-10 rounded-full flex items-center justify-center","allow"===ns?"bg-accent-success/20":"bg-accent-danger/20"),children:"allow"===ns?t.jsx(Y,{className:"w-5 h-5 text-accent-success"}):t.jsx(U,{className:"w-5 h-5 text-accent-danger"})}),t.jsxs("div",{children:[t.jsx("h4",{className:"type-body text-text-primary font-medium",children:"Global Flood Policy"}),t.jsx("p",{className:"type-body-sm text-text-muted",children:"Master control for repeater flooding"})]})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsxs("div",{className:"flex bg-subtle-fill rounded-full p-1",children:[t.jsx("button",{onClick:()=>ca("deny"),disabled:cs,className:s("px-4 py-1.5 rounded-full transition-colors type-body-sm font-medium","deny"===ns?"bg-accent-danger/20 text-accent-danger":"text-text-muted hover:text-text-secondary",cs&&"opacity-50"),children:"Deny"}),t.jsx("button",{onClick:()=>ca("allow"),disabled:cs,className:s("px-4 py-1.5 rounded-full transition-colors type-body-sm font-medium","allow"===ns?"bg-accent-success/20 text-accent-success":"text-text-muted hover:text-text-secondary",cs&&"opacity-50"),children:"Allow"})]}),cs&&t.jsx(T,{className:"w-4 h-4 animate-spin text-text-muted"})]})]})}),as&&t.jsx("div",{className:"type-body-sm mb-3 px-3 py-2 rounded-full text-accent-danger bg-accent-danger/10",children:as}),t.jsx("div",{className:"bg-subtle-fill radius-card p-4 min-h-[120px]",children:ts?t.jsxs("div",{className:"flex items-center justify-center py-6",children:[t.jsx(T,{className:"w-5 h-5 animate-spin text-accent-primary mr-2"}),t.jsx("span",{className:"type-body-sm text-text-muted",children:"Loading transport keys..."})]}):0===Qt.length?t.jsxs("div",{className:"text-center py-6",children:[t.jsx("div",{className:"w-12 h-12 rounded-full bg-subtle-fill mx-auto mb-3 flex items-center justify-center",children:t.jsx(K,{className:"w-6 h-6 text-text-muted/50"})}),t.jsx("p",{className:"type-body text-text-muted",children:"No transport keys found"}),t.jsx("p",{className:"type-body-sm text-text-muted/70 mt-1",children:"Add your first transport key to get started"})]}):t.jsx("div",{className:"space-y-1",children:Qt.map(e=>t.jsx(ne,{node:e,level:0,expandedKeys:us,selectedKeyId:os,globalFloodPolicy:ns,onSelect:ds,onToggle:la},e.id))})})]})}),t.jsx(L,{template:"auto",children:t.jsxs(w,{children:[t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4",children:[t.jsxs("div",{children:[t.jsxs("h2",{className:"type-heading text-text-primary flex items-center gap-2",children:[t.jsx(H,{className:"icon-md text-accent-primary"}),"API Tokens"]}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Manage API tokens for machine-to-machine authentication"})]}),t.jsxs("button",{onClick:()=>It(!0),className:"flex items-center justify-center gap-2 h-[32px] px-4 bg-accent-primary/10 hover:bg-accent-primary/20 text-accent-primary rounded-full transition-colors type-body-sm font-medium",children:[t.jsx(f,{className:"w-4 h-4"}),"Create Token"]})]}),t.jsx("div",{className:"bg-accent-tertiary/5 radius-card p-4 mb-4",children:t.jsxs("div",{className:"flex gap-3",children:[t.jsx("div",{className:"w-8 h-8 rounded-full bg-accent-tertiary/20 flex items-center justify-center flex-shrink-0",children:t.jsx(M,{className:"w-4 h-4 text-accent-tertiary"})}),t.jsxs("div",{className:"type-body-sm text-text-muted",children:[t.jsxs("p",{children:[t.jsx("span",{className:"text-text-secondary",children:"API tokens"})," are used for machine-to-machine authentication. Include the token in the ",t.jsx("code",{className:"type-code bg-accent-tertiary/20 px-1.5 py-0.5 rounded-full text-accent-tertiary",children:"X-API-Key"})," header when making API requests."]}),t.jsx("p",{className:"mt-1 text-text-muted/70",children:"Tokens are only shown once at creation. Store them securely."})]})]})}),zt&&t.jsx("div",{className:"type-body-sm mb-3 px-3 py-2 rounded-full text-accent-danger bg-accent-danger/10",children:zt}),Pt&&0===Mt.length?t.jsxs("div",{className:"flex items-center justify-center py-6",children:[t.jsx(T,{className:"w-5 h-5 animate-spin text-accent-primary mr-2"}),t.jsx("span",{className:"type-body-sm text-text-muted",children:"Loading tokens..."})]}):Mt.length>0?t.jsx("div",{className:"space-y-2",children:Mt.map(e=>t.jsx("div",{className:"bg-subtle-fill hover:bg-subtle-fill-strong radius-card p-4 transition-base",children:t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[t.jsxs("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[t.jsx("div",{className:"w-10 h-10 rounded-full bg-accent-primary/10 flex items-center justify-center flex-shrink-0",children:t.jsx(H,{className:"w-5 h-5 text-accent-primary"})}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("h3",{className:"type-body text-text-primary font-medium truncate",children:e.name}),t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:gap-4 mt-0.5",children:[t.jsxs("span",{className:"type-data-sm text-text-muted truncate",children:["Created: ",ta(e.created_at)]}),t.jsxs("span",{className:"type-data-sm text-text-muted truncate",children:["Last used: ",ta(e.last_used)]})]})]})]}),t.jsxs("button",{onClick:()=>Ut({id:e.id,name:e.name}),disabled:Jt,className:"h-[32px] px-4 bg-accent-danger/10 hover:bg-accent-danger/20 text-accent-danger rounded-full transition-colors disabled:opacity-50 type-body-sm font-medium flex items-center justify-center gap-1.5",children:[t.jsx(g,{className:"w-3.5 h-3.5"}),"Revoke"]})]})},e.id))}):t.jsxs("div",{className:"bg-subtle-fill radius-card p-6 text-center",children:[t.jsx("div",{className:"w-14 h-14 rounded-full bg-subtle-fill mx-auto mb-4 flex items-center justify-center",children:t.jsx(H,{className:"w-7 h-7 text-text-muted/50"})}),t.jsx("h3",{className:"type-body text-text-primary font-medium mb-1",children:"No API Tokens"}),t.jsx("p",{className:"type-body-sm text-text-muted mb-4",children:"Create a token to enable API access"}),t.jsx("button",{onClick:()=>It(!0),className:"h-[32px] px-4 bg-accent-primary/10 hover:bg-accent-primary/20 text-accent-primary rounded-full transition-colors type-body-sm font-medium",children:"Create Your First Token"})]})]})}),t.jsx(L,{template:"auto",children:t.jsxs(w,{children:[t.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4",children:t.jsxs("div",{children:[t.jsxs("h2",{className:"type-heading text-text-primary flex items-center gap-2",children:[t.jsx(V,{className:"icon-md text-accent-primary"}),"Web Frontend"]}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Choose which web interface to use"})]})}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{className:"space-y-3",children:[t.jsxs("label",{className:s("flex items-start gap-3 p-4 bg-subtle-fill radius-card border-2 cursor-pointer transition-base",Fs?"border-accent-primary bg-accent-primary/5":"border-transparent hover:border-accent-primary/30","loading"===zs&&"opacity-50 pointer-events-none"),children:[t.jsx("input",{type:"radio",name:"frontend",checked:Fs,onChange:()=>Zs(!0),disabled:"loading"===zs,className:"mt-1 h-4 w-4 text-accent-primary focus:ring-accent-primary focus:ring-offset-bg-elevated"}),t.jsxs("div",{className:"flex-1",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("div",{className:"type-body text-text-primary font-medium",children:"Default Frontend"}),t.jsx("a",{href:"https://github.com/rightup/pyMC_Repeater",target:"_blank",rel:"noopener noreferrer",onClick:e=>e.stopPropagation(),className:"type-data-xs bg-accent-tertiary/15 text-accent-tertiary px-2.5 py-0.5 rounded-full font-medium hover:bg-accent-tertiary/25 transition-colors",children:"@RightUp"})]}),t.jsx("div",{className:"type-body-sm text-text-muted mt-1",children:"Built-in pyMC Repeater web interface"}),t.jsx("div",{className:"type-data-xs text-text-muted/60 mt-1 font-mono",children:"/opt/pymc_repeater/repeater/web/html"})]})]}),t.jsxs("label",{className:s("flex items-start gap-3 p-4 bg-subtle-fill radius-card border-2 cursor-pointer transition-base",Fs?"border-transparent hover:border-accent-primary/30":"border-accent-primary bg-accent-primary/5","loading"===zs&&"opacity-50 pointer-events-none"),children:[t.jsx("input",{type:"radio",name:"frontend",checked:!Fs,onChange:()=>Zs(!1),disabled:"loading"===zs,className:"mt-1 h-4 w-4 text-accent-primary focus:ring-accent-primary focus:ring-offset-bg-elevated"}),t.jsxs("div",{className:"flex-1",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("div",{className:"type-body text-text-primary font-medium",children:"PyMC Console"}),t.jsx("span",{className:"type-data-xs bg-accent-secondary/15 text-accent-secondary px-2.5 py-0.5 rounded-full font-medium",children:"@Treehouse ⚡"})]}),t.jsx("div",{className:"type-body-sm text-text-muted mt-1",children:"Alternative web interface for pyMC Repeater"}),t.jsx("div",{className:"type-data-xs text-text-muted/60 mt-1 font-mono",children:"/opt/pymc_console/web/html"})]})]})]}),!Ps&&t.jsx("div",{className:s("bg-subtle-fill radius-card p-4",Ms?"border border-accent-success/20":"border border-accent-tertiary/20"),children:t.jsxs("div",{className:"flex items-start gap-3",children:[t.jsx("div",{className:s("w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0",Ms?"bg-accent-success/20":"bg-accent-tertiary/20"),children:Ms?t.jsx(R,{className:"w-4 h-4 text-accent-success"}):t.jsx(M,{className:"w-4 h-4 text-accent-tertiary"})}),t.jsxs("div",{className:"flex-1",children:[t.jsx("h4",{className:"type-body text-text-primary font-medium",children:Ms?"PyMC Console has been detected":"PyMC Console Not Installed"}),Ms?t.jsxs("p",{className:"type-body-sm text-text-muted mt-1",children:["PyMC Console is installed at ",t.jsx("code",{className:"type-code bg-accent-success/10 px-1.5 py-0.5 rounded-full text-accent-success",children:"/opt/pymc_console/web/html"})]}):t.jsxs(t.Fragment,{children:[t.jsxs("p",{className:"type-body-sm text-text-muted mt-1 mb-3",children:["PyMC Console must be installed at ",t.jsx("code",{className:"type-code bg-accent-tertiary/10 px-1.5 py-0.5 rounded-full text-accent-tertiary",children:"/opt/pymc_console/web/html"})," before selecting this option."]}),t.jsxs("a",{href:"https://github.com/dmduran12/pymc_console-dist",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-2 h-[32px] px-4 bg-accent-tertiary/10 hover:bg-accent-tertiary/20 text-accent-tertiary rounded-full type-body-sm font-medium transition-colors",children:[t.jsx(O,{className:"w-4 h-4"}),"PyMC Console Install Instructions"]})]})]})]})}),As&&t.jsx("div",{className:"bg-subtle-fill radius-card p-4 border border-accent-secondary/30",children:t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",children:[t.jsxs("div",{className:"flex items-start gap-3 flex-1",children:[t.jsx("div",{className:"w-8 h-8 rounded-full bg-accent-secondary/20 flex items-center justify-center flex-shrink-0",children:t.jsx(z,{className:"w-4 h-4 text-accent-secondary"})}),t.jsxs("div",{className:"flex-1",children:[t.jsx("h4",{className:"type-body text-text-primary font-medium",children:"Service restart required"}),t.jsx("p",{className:"type-body-sm text-text-muted mt-1",children:"Web frontend changes will take effect after restarting the pymc-repeater service."})]})]}),t.jsx("button",{onClick:async()=>{if(!Os){qs(!0);try{await async function(){return r("/api/restart_service",{method:"POST",body:"{}"})}(),Is(!1),setTimeout(()=>{window.location.reload()},2e3)}catch{Is(!1),setTimeout(()=>{window.location.reload()},3e3)}}},disabled:Os,className:"h-[32px] px-4 bg-accent-secondary/10 hover:bg-accent-secondary/20 text-accent-secondary rounded-full transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2 whitespace-nowrap type-body-sm font-medium",children:Os?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Restarting..."]}):t.jsxs(t.Fragment,{children:[t.jsx(D,{className:"w-4 h-4"}),"Restart Now"]})})]})})]})]})}),A&&t.jsx(L,{template:"auto",children:t.jsx(N,{nodeName:me,repeaterVersion:A.version,coreVersion:A.core_version,localHash:A.local_hash,publicKey:A.public_key})}),A&&(0===(null==de?void 0:de.latitude)||!(null==de?void 0:de.latitude))&&(0===(null==de?void 0:de.longitude)||!(null==de?void 0:de.longitude))&&t.jsx(L,{template:"auto",children:t.jsx(Z,{})})]}),At&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&It(!1),role:"dialog","aria-modal":"true","aria-labelledby":"create-token-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"create-token-modal-title",className:"type-subheading text-text-primary mb-4",children:"Create API Token"}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Token Name"}),t.jsx("input",{type:"text",value:Ot,onChange:e=>qt(e.target.value),placeholder:"e.g., Production Server, CI/CD Pipeline",className:"w-full px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary placeholder-text-muted focus:outline-none ring-focus-inset transition-base",onKeyDown:e=>"Enter"===e.key&&ea(),autoFocus:!0}),t.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Give your token a descriptive name to identify its purpose"})]}),t.jsxs("div",{className:"flex justify-end gap-3 mt-6",children:[t.jsx("button",{onClick:()=>{It(!1),qt(""),Dt(null)},disabled:Bt,className:"px-4 py-2 bg-bg-subtle hover-bg text-text-secondary radius-inner border-control transition-base disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:ea,disabled:Bt||!Ot.trim(),className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base disabled:opacity-50 flex items-center gap-2",children:Bt?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Creating..."]}):"Create Token"})]})]})]})}),Vt&&Kt&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&$t(!1),role:"dialog","aria-modal":"true","aria-labelledby":"show-token-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-lg w-full",children:[t.jsx("h3",{id:"show-token-modal-title",className:"type-subheading text-text-primary mb-4",children:"Token Created Successfully"}),t.jsxs("div",{className:"space-y-4",children:[t.jsx("div",{className:"bg-accent-secondary/10 border border-accent-secondary/30 radius-inner p-3",children:t.jsxs("div",{className:"flex gap-2",children:[t.jsx(z,{className:"w-4 h-4 text-accent-secondary flex-shrink-0 mt-0.5"}),t.jsxs("div",{className:"text-sm text-text-secondary",children:[t.jsx("strong",{children:"Save this token now!"})," For security reasons, it will not be shown again."]})]})}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Your API Token"}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("input",{value:Kt,readOnly:!0,className:"flex-1 px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary font-mono text-sm"}),t.jsxs("button",{onClick:()=>{Kt&&(navigator.clipboard.writeText(Kt),Zt(!0),setTimeout(()=>Zt(!1),2e3))},className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base flex items-center gap-2",title:"Copy to clipboard",children:[Gt?t.jsx(F,{className:"w-4 h-4 text-accent-success"}):t.jsx(E,{className:"w-4 h-4"}),Gt?"Copied!":"Copy"]})]})]}),t.jsxs("div",{className:"bg-accent-tertiary/10 border border-accent-tertiary/30 radius-inner p-3",children:[t.jsx("p",{className:"text-sm text-text-secondary mb-2",children:t.jsx("strong",{children:"Usage Example:"})}),t.jsxs("code",{className:"block bg-accent-tertiary/20 px-3 py-2 rounded text-xs text-accent-tertiary font-mono overflow-x-auto",children:['curl -H "X-API-Key: ',Kt.slice(0,12),'..." ',window.location.origin,"/api/stats"]})]}),t.jsx("div",{className:"flex justify-end mt-6",children:t.jsx("button",{onClick:()=>{$t(!1),Ht(null)},className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base",children:"Done"})})]})]})}),t.jsx(j,{isOpen:!!Yt,title:"Revoke API Token",message:`Are you sure you want to revoke the token '${null==Yt?void 0:Yt.name}'? This action cannot be undone.`,confirmLabel:Jt?"Revoking...":"Revoke",cancelLabel:"Cancel",variant:"danger",onConfirm:async()=>{if(Yt){Wt(!0),Dt(null);try{await async function(e){return r(`/auth/tokens/${e}`,{method:"DELETE"})}(Yt.id),await Qs(),Ut(null)}catch(e){Dt(e instanceof Error?e.message:"Failed to revoke token")}finally{Wt(!1)}}},onCancel:()=>Ut(null)}),xs&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&ps(!1),role:"dialog","aria-modal":"true","aria-labelledby":"add-key-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"add-key-modal-title",className:"type-subheading text-text-primary mb-4",children:"Add Transport Key"}),t.jsxs("div",{className:"space-y-4",children:[os&&t.jsxs("div",{className:"bg-accent-tertiary/10 border border-accent-tertiary/30 radius-inner p-3 text-sm text-text-secondary",children:["Adding as child of: ",t.jsx("strong",{className:"text-text-primary",children:na()})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Key Name"}),t.jsx("input",{type:"text",value:ws,onChange:e=>ks(e.target.value),placeholder:"e.g., Region Name, Group Key",className:"w-full px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary placeholder-text-muted focus:outline-none ring-focus-inset transition-base",onKeyDown:e=>"Enter"===e.key&&ia(),autoFocus:!0})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Flood Policy"}),t.jsxs("div",{className:"flex bg-bg-subtle radius-inner border-control p-1",children:[t.jsx("button",{onClick:()=>Ss("deny"),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","deny"===Cs?"bg-accent-danger/20 text-accent-danger border border-accent-danger/50":"text-text-muted hover:text-text-secondary"),children:"DENY"}),t.jsx("button",{onClick:()=>Ss("allow"),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","allow"===Cs?"bg-accent-success/20 text-accent-success border border-accent-success/50":"text-text-muted hover:text-text-secondary"),children:"ALLOW"})]})]}),t.jsxs("div",{className:"flex justify-end gap-3 mt-6",children:[t.jsx("button",{onClick:()=>{ps(!1),ks(""),Ss("deny")},disabled:_s,className:"px-4 py-2 bg-bg-subtle hover-bg text-text-secondary radius-inner border-control transition-base disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:ia,disabled:_s||!ws.trim(),className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base disabled:opacity-50 flex items-center gap-2",children:_s?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Adding..."]}):"Add Key"})]})]})]})}),hs&&fs&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&bs(!1),role:"dialog","aria-modal":"true","aria-labelledby":"edit-key-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"edit-key-modal-title",className:"type-subheading text-text-primary mb-4",children:"Edit Transport Key"}),t.jsxs("div",{className:"space-y-4",children:[t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Key Name"}),t.jsx("input",{type:"text",value:fs.name,onChange:e=>js({...fs,name:e.target.value}),className:"w-full px-4 py-2 bg-bg-subtle border-control radius-inner text-text-primary focus:outline-none ring-focus-inset transition-base",autoFocus:!0})]}),t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Flood Policy"}),t.jsxs("div",{className:"flex bg-bg-subtle radius-inner border-control p-1",children:[t.jsx("button",{onClick:()=>js({...fs,floodPolicy:"deny"}),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","deny"===fs.floodPolicy?"bg-accent-danger/20 text-accent-danger border border-accent-danger/50":"text-text-muted hover:text-text-secondary"),children:"DENY"}),t.jsx("button",{onClick:()=>js({...fs,floodPolicy:"allow"}),className:s("flex-1 px-3 py-2 text-sm font-medium rounded transition-colors","allow"===fs.floodPolicy?"bg-accent-success/20 text-accent-success border border-accent-success/50":"text-text-muted hover:text-text-secondary"),children:"ALLOW"})]})]}),fs.transport_key&&t.jsxs("div",{children:[t.jsx("label",{className:"type-label text-text-muted block mb-2",children:"Transport Key"}),t.jsx("code",{className:"block bg-bg-subtle px-3 py-2 radius-inner text-xs text-text-muted font-mono overflow-x-auto",children:fs.transport_key})]}),t.jsxs("div",{className:"flex justify-between gap-3 mt-6",children:[t.jsx("button",{onClick:()=>{bs(!1),Ns(fs),gs(!0),js(null)},disabled:_s,className:"px-4 py-2 bg-accent-danger/20 hover:bg-accent-danger/30 text-accent-danger radius-inner border border-accent-danger/50 transition-base disabled:opacity-50",children:"Delete"}),t.jsxs("div",{className:"flex gap-3",children:[t.jsx("button",{onClick:()=>{bs(!1),js(null)},disabled:_s,className:"px-4 py-2 bg-bg-subtle hover-bg text-text-secondary radius-inner border-control transition-base disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:async()=>{if(fs){Ts(!0),rs(null);try{const e=await async function(e,t){return r(`/api/transport_key/${e}`,{method:"PUT",body:JSON.stringify(t)})}(fs.id,{name:fs.name,flood_policy:fs.floodPolicy});e.success?(await aa(),bs(!1),js(null)):rs(e.error||"Failed to update transport key")}catch(e){rs(e instanceof Error?e.message:"Failed to update transport key")}finally{Ts(!1)}}},disabled:_s||!fs.name.trim(),className:"px-4 py-2 bg-accent-primary/20 hover:bg-accent-primary/30 text-text-primary radius-inner border border-accent-primary/50 transition-base disabled:opacity-50 flex items-center gap-2",children:_s?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Saving..."]}):"Save"})]})]})]})]})}),ys&&vs&&t.jsx("div",{className:"fixed inset-0 z-[10010] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm",onClick:e=>e.target===e.currentTarget&&gs(!1),role:"dialog","aria-modal":"true","aria-labelledby":"delete-key-modal-title",children:t.jsxs("div",{className:"surface-modal radius-card p-6 max-w-md w-full",children:[t.jsx("h3",{id:"delete-key-modal-title",className:"type-subheading text-text-primary mb-4",children:"Delete Transport Key"}),t.jsxs("p",{className:"text-text-secondary mb-4",children:["Are you sure you want to delete ",t.jsxs("strong",{className:"text-text-primary",children:["'",vs.name,"'"]}),"?"]}),vs.children&&vs.children.length>0&&t.jsx("div",{className:"bg-accent-secondary/10 border border-accent-secondary/30 radius-inner p-3 mb-4",children:t.jsxs("div",{className:"flex gap-2",children:[t.jsx(z,{className:"w-4 h-4 text-accent-secondary flex-shrink-0 mt-0.5"}),t.jsxs("div",{className:"text-sm text-text-secondary",children:["This key has ",vs.children.length," child key(s). Deleting will also remove all children."]})]})}),t.jsxs("div",{className:"flex justify-end gap-3",children:[t.jsx("button",{onClick:()=>{gs(!1),Ns(null)},disabled:_s,className:"px-4 py-2 bg-bg-subtle hover:bg-bg-elevated text-text-secondary rounded-lg border border-border-subtle transition-colors disabled:opacity-50",children:"Cancel"}),t.jsx("button",{onClick:async()=>{if(vs){Ts(!0),rs(null);try{const e=await async function(e){return r(`/api/transport_key/${e}`,{method:"DELETE"})}(vs.id);e.success?(await aa(),gs(!1),Ns(null),ds(null)):rs(e.error||"Failed to delete transport key")}catch(e){rs(e instanceof Error?e.message:"Failed to delete transport key")}finally{Ts(!1)}}},disabled:_s,className:"px-4 py-2 bg-accent-danger/20 hover:bg-accent-danger/30 text-accent-danger radius-inner border border-accent-danger/50 transition-base disabled:opacity-50 flex items-center gap-2",children:_s?t.jsxs(t.Fragment,{children:[t.jsx(T,{className:"w-4 h-4 animate-spin"}),"Deleting..."]}):"Delete"})]})]})})]})}export{le as default}; diff --git a/frontend/dist/assets/ConfirmModal-OyBnZ1Rq.js b/frontend/dist/assets/ConfirmModal-flvCJ5X5.js similarity index 70% rename from frontend/dist/assets/ConfirmModal-OyBnZ1Rq.js rename to frontend/dist/assets/ConfirmModal-flvCJ5X5.js index 81793a4d..ee18389d 100644 --- a/frontend/dist/assets/ConfirmModal-OyBnZ1Rq.js +++ b/frontend/dist/assets/ConfirmModal-flvCJ5X5.js @@ -1 +1 @@ -import{c as e,K as t,bO as n,N as a,bP as s}from"./index-CZBrdv20.js";import{r,j as o,c as i}from"./vendor-react-DFCqJxYC.js";import{T as c}from"./triangle-alert-DlaBoont.js";const d=e("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),l=e("trash-2",[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]]),m={danger:{icon:"text-accent-danger",button:"bg-accent-danger hover:brightness-110 active:brightness-90"},warning:{icon:"text-accent-secondary",button:"bg-accent-secondary hover:brightness-110 active:brightness-90 text-bg-body"},default:{icon:"text-accent-primary",button:"bg-accent-primary hover:brightness-110 active:brightness-90 text-bg-body"}},b=r.memo(function({isOpen:e,title:r="Confirm",message:d,confirmLabel:l="Confirm",cancelLabel:b="Cancel",variant:h="default",onConfirm:x,onCancel:p}){const g=m[h];return o.jsxs(t,{open:e,onClose:p,size:"sm",children:[o.jsx(n,{icon:o.jsx(c,{className:i("w-5 h-5",g.icon)}),title:r,onClose:p}),o.jsx(a,{children:o.jsx("p",{className:"text-sm text-text-secondary",children:d})}),o.jsxs(s,{children:[o.jsx("button",{onClick:p,className:"flex-1 px-4 py-2.5 radius-inner text-sm font-medium text-text-secondary bg-bg-subtle hover-bg border-control transition-base",children:b}),o.jsx("button",{onClick:x,className:i("flex-1 px-4 py-2.5 radius-inner text-sm font-medium text-text-primary transition-base",g.button),children:l})]})]})});export{b as C,d as P,l as T}; +import{c as e,C as t,c1 as n,E as a,c2 as s}from"./index-D22MpaCY.js";import{r,j as o,c as i}from"./vendor-react-Cwum97tW.js";import{T as c}from"./triangle-alert-TfoZuZfW.js";const d=e("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]),l=e("trash-2",[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]]),m={danger:{icon:"text-accent-danger",button:"bg-accent-danger hover:brightness-110 active:brightness-90"},warning:{icon:"text-accent-secondary",button:"bg-accent-secondary hover:brightness-110 active:brightness-90 text-bg-body"},default:{icon:"text-accent-primary",button:"bg-accent-primary hover:brightness-110 active:brightness-90 text-bg-body"}},h=r.memo(function({isOpen:e,title:r="Confirm",message:d,confirmLabel:l="Confirm",cancelLabel:h="Cancel",variant:b="default",onConfirm:x,onCancel:p}){const g=m[b];return o.jsxs(t,{open:e,onClose:p,size:"sm",children:[o.jsx(n,{icon:o.jsx(c,{className:i("w-5 h-5",g.icon)}),title:r,onClose:p}),o.jsx(a,{children:o.jsx("p",{className:"text-sm text-text-secondary",children:d})}),o.jsxs(s,{children:[o.jsx("button",{onClick:p,className:"flex-1 px-4 py-2.5 radius-inner text-sm font-medium text-text-secondary bg-bg-subtle hover-bg border-control transition-base",children:h}),o.jsx("button",{onClick:x,className:i("flex-1 px-4 py-2.5 radius-inner text-sm font-medium text-text-primary transition-base",g.button),children:l})]})]})});export{h as C,d as P,l as T}; diff --git a/frontend/dist/assets/Contacts-DHVYuXFa.js b/frontend/dist/assets/Contacts-DHVYuXFa.js new file mode 100644 index 00000000..83bec7f0 --- /dev/null +++ b/frontend/dist/assets/Contacts-DHVYuXFa.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ContactsMapMapLibre-Cpb6Sk8-.js","assets/vendor-react-Cwum97tW.js","assets/BasemapLayer-C9wiTbJT.js","assets/vendor-core-CDrKesoV.js","assets/link-scoring-BnkyjnFT.js","assets/index-D22MpaCY.js","assets/ConfirmModal-flvCJ5X5.js","assets/triangle-alert-TfoZuZfW.js","assets/DeepAnalysisModal-DSV1q_wY.js","assets/config-C7QO3CEB.js","assets/DataBox-Bl0vntck.js","assets/git-branch-Cev-c9BQ.js","assets/house-D2cJ2w9-.js","assets/loader-circle-2q9lT2qG.js","assets/useThemeColors-S-uaxvPT.js","assets/trending-up-D5ntwkR1.js","assets/refresh-cw-BtHqSStQ.js","assets/target-BlWNMuhi.js","assets/compass-Bsfx4e84.js","assets/zap-Cpbok2bP.js","assets/font-loader-jlbdh9Fw.js","assets/index-bDa2a9Y2.js","assets/users-dFI4fg5G.js","assets/SignalIndicator-CBL6VSNS.js","assets/map-pin-kiJDSdn0.js","assets/ping-o6tDyVoV.js","assets/PageLayout-B53JpmK1.js","assets/activity-Cb8TQBuo.js","assets/circle-check-CKXuJpMJ.js","assets/CollisionExplorerModal-BmT8XQYy.js","assets/network-Dz5VqBhN.js","assets/maplibre-gl-B1CfjdFi.css","assets/index-DWq9tBbL.css"])))=>i.map(i=>d[i]); +import{j as e,r as s,c as t,g as a,T as n,i as l}from"./vendor-react-Cwum97tW.js";import{c,ai as i,aj as r,ak as o,ac as d,al as x,F as m,a7 as h,am as p,an as u,ao as g,I as j,ap as b,p as N,aq as v,j as f,ar as y,as as w,at as k,h as C,au as M,av as S,R as L,X as P,B as H,y as F}from"./index-D22MpaCY.js";import{p as E}from"./ping-o6tDyVoV.js";import{P as R,b as T,B as $}from"./PageLayout-B53JpmK1.js";import{_ as O}from"./deckgl-DTsmDcfs.js";import{G as _}from"./git-branch-Cev-c9BQ.js";import{T as A}from"./triangle-alert-TfoZuZfW.js";import{a as D,T as z,M as G,b as I}from"./trending-up-D5ntwkR1.js";import{b as U,C as W,c as K,d as V}from"./SignalIndicator-CBL6VSNS.js";import{E as B,S as q,T as Z}from"./target-BlWNMuhi.js";import{Z as J,C as Q}from"./zap-Cpbok2bP.js";import{A as X}from"./activity-Cb8TQBuo.js";import{C as Y,D as ee}from"./DataBox-Bl0vntck.js";import{F as se,U as te}from"./users-dFI4fg5G.js";import{P as ae,T as ne,C as le}from"./ConfirmModal-flvCJ5X5.js";import{M as ce}from"./map-pin-kiJDSdn0.js";import{C as ie}from"./circle-check-CKXuJpMJ.js";import{C as re,S as oe,M as de}from"./CollisionExplorerModal-BmT8XQYy.js";import{N as xe}from"./network-Dz5VqBhN.js";import{L as me}from"./loader-circle-2q9lT2qG.js";const he=c("arrow-left-right",[["path",{d:"M8 3 4 7l4 4",key:"9rb6wj"}],["path",{d:"M4 7h16",key:"6tx8e3"}],["path",{d:"m16 21 4-4-4-4",key:"siv7j2"}],["path",{d:"M20 17H4",key:"h6l3hr"}]]),pe=c("arrow-up-down",[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]]),ue=c("calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]),ge=c("file-digit",[["path",{d:"M4 12V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2",key:"jrl274"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 16h2v6",key:"1bxocy"}],["path",{d:"M10 22h4",key:"ceow96"}],["rect",{x:"2",y:"16",width:"4",height:"6",rx:"2",key:"r45zd0"}]]),je=c("ruler",[["path",{d:"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z",key:"icamh8"}],["path",{d:"m14.5 12.5 2-2",key:"inckbg"}],["path",{d:"m11.5 9.5 2-2",key:"fmmyf7"}],["path",{d:"m8.5 6.5 2-2",key:"vc6u1g"}],["path",{d:"m17.5 15.5 2-2",key:"wo5hmg"}]]),be=c("shield-alert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]),Ne=c("sparkles",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]]);class ve extends s.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}render(){var s;return this.state.hasError?e.jsx("div",{className:t("map-container-16-9 flex items-center justify-center rounded-2xl",i),role:"alert","aria-live":"assertive",children:e.jsxs("div",{className:"text-center text-white/50 p-4",children:[e.jsx("p",{className:"text-lg mb-2",children:"Map failed to load"}),e.jsx("p",{className:"text-sm text-white/30",children:(null==(s=this.state.error)?void 0:s.message)||"Unknown error"}),e.jsx("p",{className:"text-xs text-white/20 mt-2",children:"Try refreshing the page or check your browser's WebGL support."})]})}):this.props.children}}const fe=s.lazy(()=>O(()=>import("./ContactsMapMapLibre-Cpb6Sk8-.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32])));function ye({neighbors:a,localNode:n,localHash:l,onRemoveNode:c,selectedNodeHash:r,onNodeSelected:o,highlightedEdgeKey:d,highlightedGhost:x}){return e.jsx(ve,{children:e.jsx(s.Suspense,{fallback:e.jsx("div",{className:t("map-container-16-9 flex items-center justify-center rounded-2xl",i),role:"status","aria-live":"polite","aria-label":"Loading map",children:e.jsxs("div",{className:"text-white/50 flex items-center gap-3",children:[e.jsx("div",{className:"w-5 h-5 border-2 border-accent-primary border-t-transparent rounded-full animate-spin","aria-hidden":"true"}),e.jsx("span",{children:"Loading map..."})]})}),children:e.jsx(fe,{neighbors:a,localNode:n,localHash:l,onRemoveNode:c,selectedNodeHash:r,onNodeSelected:o,highlightedEdgeKey:d,highlightedGhost:x})})})}function we(e){return e>=.7?"text-accent-success":e>=.5?"text-accent-secondary":e>=.3?"text-signal-poor":"text-accent-danger"}function ke(e){return`${Math.round(100*e)}%`}function Ce(e,s){return s.has(e.toUpperCase())}const Me=s.memo(function({path:s,isHighlighted:t,onHighlight:a,ghostPrefixes:n}){const l=function(s){return s>.2?{icon:e.jsx(z,{className:"w-3 h-3"}),color:"text-accent-success"}:s<-.2?{icon:e.jsx(D,{className:"w-3 h-3"}),color:"text-accent-danger"}:{icon:e.jsx(G,{className:"w-3 h-3"}),color:"text-text-muted"}}(s.observationTrend),c=s.weakestLinkKey&&s.weakestLinkConfidence<.5,i=s.hops.some(e=>Ce(e,n));return e.jsxs("div",{className:"flex items-center gap-3 p-2 rounded-md transition-colors cursor-pointer "+(t?"bg-accent-primary/20 border border-accent-primary/40":"hover:bg-white/5"),onClick:()=>a(t?null:s.weakestLinkKey),children:[e.jsx("div",{className:"flex-shrink-0 w-12 text-center py-1 rounded-md "+(r=s.healthScore,r>=.7?"bg-accent-success/10":r>=.5?"bg-accent-secondary/10":r>=.3?"bg-signal-poor/10":"bg-accent-danger/10"),children:e.jsx("span",{className:`text-xs font-semibold tabular-nums ${we(s.healthScore)}`,children:ke(s.healthScore)})}),e.jsx("div",{className:"flex-1 flex items-center gap-0.5 overflow-x-auto min-w-0",children:s.hops.map((t,a)=>{var l;const i=Ce(t,n),r=c&&(null==(l=s.weakestLinkKey)?void 0:l.includes(t));return e.jsxs("span",{className:"flex items-center",children:[e.jsxs("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded flex items-center gap-0.5 "+(i?"bg-accent-tertiary/20 text-accent-tertiary border border-accent-tertiary/30":r?"bg-accent-danger/20 text-accent-danger":"bg-white/10 text-text-secondary"),children:[i&&e.jsx(x,{className:"w-2.5 h-2.5"}),t]}),anew Set(i.map(e=>e.prefix.toUpperCase())),[i]),g=s.useMemo(()=>l.slice(0,t),[l,t]),j=s.useMemo(()=>0===l.length?null:{avgHealth:l.reduce((e,s)=>e+s.healthScore,0)/l.length,declining:l.filter(e=>e.observationTrend<-.2).length,weakLinks:l.filter(e=>e.weakestLinkConfidence<.5).length,pathsWithGhosts:l.filter(e=>e.hops.some(e=>u.has(e.toUpperCase()))).length},[l,u]),b=e=>{null==a||a(e)};return 0===l.length?null:e.jsxs("div",{className:"chart-container",children:[e.jsxs("button",{onClick:()=>p(!h),className:"w-full chart-header hover:bg-white/5 transition-colors rounded-t-lg cursor-pointer",children:[e.jsxs("div",{className:"chart-title",children:[e.jsx(_,{className:"chart-title-icon"}),"Path Health",e.jsxs("span",{className:"ml-2 text-[10px] font-normal text-text-muted",children:["(",l.length," paths)"]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[j&&e.jsxs("div",{className:"flex items-center gap-3 text-[10px]",children:[e.jsxs("span",{className:`tabular-nums ${we(j.avgHealth)}`,children:["Avg: ",ke(j.avgHealth)]}),j.weakLinks>0&&e.jsxs("span",{className:"text-accent-danger flex items-center gap-1",children:[e.jsx(A,{className:"w-3 h-3"}),j.weakLinks," weak"]}),j.declining>0&&e.jsxs("span",{className:"text-signal-poor flex items-center gap-1",children:[e.jsx(D,{className:"w-3 h-3"}),j.declining," declining"]}),j.pathsWithGhosts>0&&e.jsxs("span",{className:"text-accent-tertiary flex items-center gap-1",children:[e.jsx(x,{className:"w-3 h-3"}),j.pathsWithGhosts," ghost"]})]}),h?e.jsx(U,{className:"w-4 h-4 text-text-muted"}):e.jsx(m,{className:"w-4 h-4 text-text-muted"})]})]}),h&&e.jsxs("div",{className:"p-3 pt-0 space-y-1",children:[c.totalPaths>0&&e.jsxs("div",{className:"flex items-center gap-3 text-[10px] text-text-muted pb-2 border-b border-white/5",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3 h-3 text-accent-primary"}),e.jsx("span",{className:"text-text-secondary",children:c.totalPaths.toLocaleString()})," Viterbi decoded"]}),c.observationOverrideCount>0&&e.jsxs("span",{className:"text-accent-success",children:[Math.round(c.observationOverrideCount/c.totalPaths*100),"% observation override"]}),i.length>0&&e.jsxs("span",{className:"text-accent-tertiary flex items-center gap-1",children:[e.jsx(x,{className:"w-3 h-3"}),i.length," ghost",1!==i.length?"s":""]})]}),e.jsxs("div",{className:"flex items-center gap-4 text-[10px] text-text-muted pb-2 border-b border-white/5",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-accent-success"})," Healthy (≥70%)"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-accent-secondary"})," Fair (50-70%)"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-signal-poor"})," Weak (30-50%)"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-accent-danger"})," Critical (<30%)"]}),i.length>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(x,{className:"w-3 h-3 text-accent-tertiary"})," Ghost"]})]}),e.jsx("div",{className:"space-y-1 max-h-64 overflow-y-auto",children:g.map(s=>e.jsx(Me,{path:s,isHighlighted:n===s.weakestLinkKey,onHighlight:b,ghostPrefixes:u},s.pathKey))}),l.length>t&&e.jsxs("div",{className:"text-center text-[10px] text-text-muted pt-2",children:["Showing top ",t," of ",l.length," paths"]})]})]})});function Le(e){switch(e){case"rf_intersection":return"RF Circle Intersection";case"weighted_centroid":return"Weighted Centroid";case"single_anchor":return"Single Anchor (less reliable)";default:return e}}const Pe={confirmed:{label:"Confirmed",icon:e.jsx(Ne,{className:"w-3.5 h-3.5"}),borderClass:"border-accent-success/40",bgClass:"bg-accent-success/10",textClass:"text-accent-success",badgeClass:"bg-accent-success/20 text-accent-success"},likely:{label:"Likely",icon:e.jsx(Y,{className:"w-3.5 h-3.5"}),borderClass:"border-accent-tertiary/30",bgClass:"bg-accent-tertiary/5",textClass:"text-accent-tertiary",badgeClass:"bg-accent-tertiary/20 text-accent-tertiary"},possible:{label:"Possible",icon:e.jsx(Q,{className:"w-3.5 h-3.5"}),borderClass:"border-accent-secondary/20",bgClass:"bg-accent-secondary/5",textClass:"text-accent-secondary",badgeClass:"bg-accent-secondary/20 text-accent-secondary"},noise:{label:"Noise",icon:e.jsx(A,{className:"w-3.5 h-3.5"}),borderClass:"border-border-muted",bgClass:"bg-bg-card/30",textClass:"text-text-muted",badgeClass:"bg-bg-elevated text-text-muted"}};function He({ghost:a,neighbors:n,isExpanded:l,onToggle:c,compact:i}){var r,o;const d=(null==(r=a.classification)?void 0:r.tier)??"noise",u=Pe[d],g="clusterId"in(j=a)&&"temporal"in j;var j;const b=s.useMemo(()=>Array.from(a.commonNeighbors).map(e=>{var s;return{hash:e,name:null==(s=n[e])?void 0:s.name}}),[a.commonNeighbors,n]),N=a.estimatedLocation?a.estimatedLocation.uncertaintyM>=1e3?`±${(a.estimatedLocation.uncertaintyM/1e3).toFixed(1)}km`:`±${Math.round(a.estimatedLocation.uncertaintyM)}m`:null,v=g&&a.temporal?(f=a.temporal.consistency)>=.7?{label:"Steady",color:"text-accent-success"}:f>=.4?{label:"Regular",color:"text-accent-tertiary"}:f>=.2?{label:"Sporadic",color:"text-accent-secondary"}:{label:"Bursty",color:"text-signal-poor"}:null;var f;const y=g&&a.collisionCandidates&&a.collisionCandidates.length>0,w=y?a.collisionCandidates[0]:null;return i?e.jsxs("div",{className:"inline-flex items-center gap-1.5 px-2 py-1 rounded bg-bg-elevated/50 text-sm",children:[e.jsx("span",{className:"font-mono font-medium text-text-secondary",children:a.prefix.toUpperCase()}),e.jsx("span",{className:"text-text-muted",children:a.observationCount})]}):e.jsxs("div",{className:t("rounded-lg border transition-all duration-150",u.borderClass,u.bgClass),children:[e.jsxs("button",{onClick:c,className:"w-full flex items-center gap-3 px-3 py-2 text-left hover:bg-white/5 rounded-lg",children:[e.jsx(x,{className:t("w-5 h-5 flex-shrink-0",u.textClass)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-mono text-sm font-semibold text-text-primary",children:a.prefix.toUpperCase()}),e.jsx("span",{className:t("px-1.5 py-0.5 rounded text-sm font-medium",u.badgeClass),children:u.label})]}),e.jsx("div",{className:t("text-sm mt-0.5",u.textClass),children:(null==(o=a.classification)?void 0:o.reason)??"Unknown"}),e.jsxs("div",{className:"flex items-center gap-3 text-sm text-text-muted mt-1",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3 h-3"}),a.observationCount]}),e.jsxs("span",{children:[(100*a.confidence).toFixed(0),"%"]}),a.commonNeighbors.size>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(te,{className:"w-3 h-3"}),a.commonNeighbors.size]}),a.estimatedLocation&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ce,{className:"w-3 h-3"}),N]}),v&&e.jsxs("span",{className:t("flex items-center gap-1",v.color),children:[e.jsx(X,{className:"w-3 h-3"}),v.label]}),y&&e.jsxs("span",{className:"flex items-center gap-1 text-signal-poor",children:[e.jsx(be,{className:"w-3 h-3"}),"Collision?"]})]})]}),l?e.jsx(U,{className:"w-4 h-4 text-text-muted"}):e.jsx(m,{className:"w-4 h-4 text-text-muted"})]}),l&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-border-muted/50 mt-1 pt-3",children:[y&&w&&e.jsx("div",{className:"p-2 rounded bg-signal-poor/10 border border-signal-poor/30",children:e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(be,{className:"w-4 h-4 text-signal-poor flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-signal-poor font-medium",children:"Possible collision with known node"}),e.jsx("div",{className:"text-text-secondary mt-0.5",children:w.knownNodeName?e.jsxs("span",{children:["May match ",e.jsx("span",{className:"font-medium",children:w.knownNodeName})," ","(",(100*w.collisionProbability).toFixed(0),"% probability)"]}):e.jsxs("span",{children:["May match ",e.jsx(ee,{copy:!0,size:"compact",className:"inline",children:w.knownNodeHash})," ","(",(100*w.collisionProbability).toFixed(0),"% probability)"]})}),w.evidence&&e.jsxs("div",{className:"text-text-muted mt-1 text-[10px]",children:[w.evidence.sharedEdgeCount>0&&e.jsxs("span",{className:"mr-2",children:[w.evidence.sharedEdgeCount," shared edges"]}),void 0!==w.evidence.distanceKm&&e.jsxs("span",{className:"mr-2",children:[w.evidence.distanceKm.toFixed(1),"km apart"]}),w.evidence.withinUncertainty&&e.jsx("span",{className:"text-accent-secondary",children:"Within uncertainty radius"})]})]})]})}),a.estimatedLocation?e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(ce,{className:"w-4 h-4 text-accent-primary mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary font-medium",children:[a.estimatedLocation.lat.toFixed(5),", ",a.estimatedLocation.lon.toFixed(5)]}),e.jsxs("div",{className:"text-text-muted",children:["Uncertainty: ",N]}),g&&a.location&&e.jsxs("div",{className:"mt-1 text-text-muted",children:[e.jsxs("div",{children:["Method: ",Le(a.location.method)]}),a.location.anchors&&a.location.anchors.length>0&&e.jsxs("div",{children:[a.location.anchors.length," anchor",1!==a.location.anchors.length?"s":""," used"," · ",(100*a.location.locationConfidence).toFixed(0),"% confidence"]})]})]})]}):e.jsxs("div",{className:"flex items-center gap-2 text-sm text-text-muted",children:[e.jsx(A,{className:"w-4 h-4 text-signal-poor"}),"Location unknown (neighbors lack coordinates)"]}),g&&a.temporal&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(X,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary font-medium",children:["Temporal Pattern: ",e.jsx("span",{className:null==v?void 0:v.color,children:null==v?void 0:v.label})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 gap-y-0.5 mt-1 text-text-muted",children:[e.jsxs("span",{children:["Distinct hours: ",a.temporal.distinctHours]}),e.jsxs("span",{children:["Distinct days: ",a.temporal.distinctDays]}),e.jsxs("span",{children:["Burstiness: ",(100*a.temporal.burstiness).toFixed(0),"%"]}),e.jsxs("span",{children:["Consistency: ",(100*a.temporal.consistency).toFixed(0),"%"]}),e.jsxs("span",{children:["Last 24h: ",a.temporal.last24HourCount," obs"]}),e.jsxs("span",{children:["Active hours: ",a.temporal.activeHoursLast24,"/24"]})]})]})]}),!g&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(h,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary",children:["First seen: ",p(a.firstSeen)," ago"]}),e.jsxs("div",{className:"text-text-muted",children:["Last seen: ",p(a.lastSeen)," ago"]})]})]}),g&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(ue,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary",children:["Active period: ",p(a.firstSeen)," – ",p(a.lastSeen)," ago"]}),a.temporal&&e.jsxs("div",{className:"text-text-muted",children:["Obs/hour avg: ",a.temporal.observationsPerHour.toFixed(1)]})]})]}),b.length>0&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(te,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-muted mb-1",children:["Adjacent to ",b.length," known node",1!==b.length?"s":"",":"]}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[b.slice(0,5).map(({hash:s})=>e.jsx(ee,{copy:!0,size:"compact",children:s},s)),b.length>5&&e.jsxs("span",{className:"text-text-muted",children:["+",b.length-5," more"]})]})]})]}),g&&a.validationStages&&e.jsxs("div",{className:"pt-2 border-t border-border-muted/30",children:[e.jsx("div",{className:"text-[10px] text-text-muted mb-1.5 uppercase tracking-wide",children:"Validation Stages"}),e.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[e.jsx(Fe,{label:"Candidates",passed:a.validationStages.candidateExhaustion}),e.jsx(Fe,{label:"Temporal",passed:a.validationStages.temporalConsistency}),e.jsx(Fe,{label:"Topology",passed:a.validationStages.topologicalFit}),e.jsx(Fe,{label:"Location",passed:a.validationStages.locationPlausible})]})]}),a.classification&&!g&&e.jsx("div",{className:"pt-2 border-t border-border-muted/30",children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[a.classification.criteria.hasVeryHighObservations&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-success/20 text-accent-success",children:"200+ obs"}),a.classification.criteria.hasHighObservations&&!a.classification.criteria.hasVeryHighObservations&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-tertiary/20 text-accent-tertiary",children:"50+ obs"}),a.classification.criteria.hasHighConfidence&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-success/20 text-accent-success",children:"70%+ conf"}),a.classification.criteria.hasCommonNeighbors&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-primary/20 text-accent-primary",children:"2+ neighbors"}),a.classification.criteria.hasGoodLocation&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-primary/20 text-accent-primary",children:"good loc"}),a.classification.criteria.isRecent&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-text-muted/20 text-text-muted",children:"recent"})]})}),g&&a.upgradeRequirements&&a.upgradeRequirements.length>0&&"confirmed"!==d&&e.jsxs("div",{className:"pt-2 border-t border-border-muted/30",children:[e.jsx("div",{className:"text-[10px] text-text-muted mb-1 uppercase tracking-wide",children:"To upgrade tier:"}),e.jsx("ul",{className:"text-xs text-text-secondary space-y-0.5",children:a.upgradeRequirements.slice(0,3).map((s,t)=>e.jsxs("li",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-accent-tertiary",children:"•"})," ",s]},t))})]})]})]})}function Fe({label:s,passed:a}){return e.jsxs("span",{className:t("inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium",a?"bg-accent-success/20 text-accent-success":"bg-bg-elevated text-text-muted"),children:[a?e.jsx(ie,{className:"w-2.5 h-2.5"}):e.jsx(W,{className:"w-2.5 h-2.5"}),s]})}function Ee({neighbors:a,className:n,onGhostSelect:l}){const c=d(),i=o(),[r,h]=s.useState(new Set),[p,u]=s.useState("actionable"),[g,j]=s.useState(!1),[b,N]=s.useState(!0),[v,f]=s.useState(Date.now);s.useEffect(()=>{f(Date.now())},[c]);const y=s.useMemo(()=>c.filter(e=>!function(e,s){return s-1e3*e.lastSeen>6048e5}(e,v)),[c,v]),w=s.useMemo(()=>{const e=Array.from(r);return e.length>0?e[0]:null},[r]),k=s.useMemo(()=>w?y.find(e=>e.prefix===w)??null:null,[w,y]);s.useEffect(()=>{l&&l(k&&!b?{prefix:k.prefix,commonNeighbors:Array.from(k.commonNeighbors),estimatedLocation:k.estimatedLocation}:null)},[k,b,l]),s.useEffect(()=>{b&&h(new Set)},[b]);const{confirmed:C,likely:M,possible:S,noise:L,actionableCount:P}=s.useMemo(()=>{var e;const s=[],t=[],a=[],n=[];for(const c of y)switch((null==(e=c.classification)?void 0:e.tier)??"noise"){case"confirmed":s.push(c);break;case"likely":t.push(c);break;case"possible":a.push(c);break;case"noise":n.push(c)}const l=(e,s)=>s.observationCount-e.observationCount;return s.sort(l),t.sort(l),a.sort(l),n.sort(l),{confirmed:s,likely:t,possible:a,noise:n,actionableCount:s.length+t.length}},[y]);if(0===y.length)return null;const H=e=>{h(s=>s.has(e)?new Set:new Set([e]))},F="all"===p,E=C.length+M.length+(F?S.length:0)+(g?L.length:0);return e.jsxs("div",{className:n,children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"chart-title",children:[e.jsx(x,{className:"chart-title-icon"}),"Ghost Buster",P>0&&e.jsxs("span",{className:"px-2 py-0.5 rounded-full text-xs font-medium bg-accent-success/20 text-accent-success",children:[P," actionable"]}),b&&y.length>0&&e.jsxs("span",{className:"text-xs text-text-muted ml-2",children:["(",y.length," total)"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[!b&&e.jsxs("button",{onClick:()=>u(e=>"actionable"===e?"all":"actionable"),className:t("flex items-center gap-1.5 px-2 py-1 rounded text-xs transition-colors","all"===p?"bg-accent-primary/20 text-accent-primary":"bg-bg-elevated text-text-muted hover:text-text-secondary"),children:[e.jsx(se,{className:"w-3 h-3"}),"actionable"===p?"Actionable":"All"]}),e.jsx("button",{onClick:()=>N(e=>!e),className:"flex items-center gap-1 px-2 py-1 rounded text-xs bg-bg-elevated text-text-muted hover:text-text-secondary transition-colors",title:b?"Expand panel":"Minimize panel",children:b?e.jsx(ae,{className:"w-3 h-3"}):e.jsx(G,{className:"w-3 h-3"})})]})]}),b?e.jsxs("div",{className:"px-5 py-3 flex items-center gap-3 text-xs cursor-pointer hover:bg-white/5 transition-colors",onClick:()=>N(!1),children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[C.length>0&&e.jsxs("span",{className:"flex items-center gap-1 text-accent-success",children:[e.jsx(Ne,{className:"w-3 h-3"}),C.length," confirmed"]}),M.length>0&&e.jsxs("span",{className:"flex items-center gap-1 text-accent-tertiary",children:[e.jsx(Y,{className:"w-3 h-3"}),M.length," likely"]}),S.length>0&&e.jsxs("span",{className:"text-accent-secondary",children:[S.length," possible"]}),L.length>0&&e.jsxs("span",{className:"text-text-muted",children:[L.length," noise"]})]}),e.jsx("span",{className:"text-text-muted ml-auto",children:"Click to expand"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-5 py-2 flex items-center gap-3 text-xs border-b border-border-muted/30",children:[e.jsxs("span",{className:"text-text-muted",children:[i.pathsWithGhosts.toLocaleString()," / ",i.totalPaths.toLocaleString()," paths"]}),e.jsx("span",{className:"text-text-muted",children:"•"}),e.jsxs("div",{className:"flex items-center gap-2",children:[C.length>0&&e.jsxs("span",{className:"text-accent-success",children:[C.length," confirmed"]}),M.length>0&&e.jsxs("span",{className:"text-accent-tertiary",children:[M.length," likely"]}),S.length>0&&e.jsxs("span",{className:"text-accent-secondary",children:[S.length," possible"]}),L.length>0&&e.jsxs("span",{className:"text-text-muted",children:[L.length," noise"]})]})]}),e.jsxs("div",{className:"px-5 py-4 space-y-4",children:[C.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-accent-success",children:[e.jsx(Ne,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"font-medium",children:["Confirmed Repeaters (",C.length,")"]})]}),e.jsx("div",{className:"space-y-2",children:C.map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:r.has(s.prefix),onToggle:()=>H(s.prefix)},s.prefix))})]}),M.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-accent-tertiary",children:[e.jsx(Y,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"font-medium",children:["Likely Repeaters (",M.length,")"]})]}),e.jsx("div",{className:"space-y-2",children:M.map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:r.has(s.prefix),onToggle:()=>H(s.prefix)},s.prefix))})]}),F&&S.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-accent-secondary",children:[e.jsx(Q,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"font-medium",children:["Possible (",S.length,")"]})]}),e.jsxs("div",{className:"space-y-2",children:[S.slice(0,10).map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:r.has(s.prefix),onToggle:()=>H(s.prefix)},s.prefix)),S.length>10&&e.jsxs("div",{className:"text-xs text-text-muted text-center py-1",children:["+",S.length-10," more possible nodes"]})]})]}),L.length>0&&"all"===p&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("button",{onClick:()=>j(!g),className:"flex items-center gap-2 text-xs text-text-muted hover:text-text-secondary transition-colors",children:[g?e.jsx(U,{className:"w-3.5 h-3.5"}):e.jsx(m,{className:"w-3.5 h-3.5"}),e.jsx(A,{className:"w-3.5 h-3.5"}),e.jsxs("span",{children:["Noise (",L.length,")"]})]}),g&&e.jsx("div",{className:"flex flex-wrap gap-1",children:L.map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:!1,onToggle:()=>{},compact:!0},s.prefix))})]}),"actionable"===p&&0===P&&e.jsxs("div",{className:"text-center py-6 text-sm text-text-muted",children:[e.jsx(x,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),e.jsx("p",{children:"No confirmed or likely repeaters yet."}),e.jsxs("p",{className:"text-xs mt-1",children:[S.length+L.length," prefixes need more evidence."]}),e.jsxs("button",{onClick:()=>u("all"),className:"mt-3 text-accent-primary hover:underline",children:["View all ",y.length," discovered nodes"]})]}),i.observationOverrideCount>0&&E>0&&e.jsxs("div",{className:"pt-2 border-t border-border-muted/30 text-xs text-text-muted",children:[e.jsx("span",{className:"text-accent-primary",children:i.observationOverrideCount})," observation overrides • Avg confidence: ",e.jsxs("span",{className:"text-accent-secondary",children:[(100*i.avgPathConfidence).toFixed(0),"%"]})]})]})]})]})}const Re="var(--sparkline-critical)",Te="var(--sparkline-poor)",$e="var(--sparkline-fair)",Oe="var(--sparkline-good)",_e="var(--sparkline-excellent)";function Ae({active:s,payload:t}){if(!s||!t||!t.length)return null;const a=t[0].payload,n=new Date(a.timestamp),l=`${(n.getMonth()+1).toString().padStart(2,"0")}/${n.getDate().toString().padStart(2,"0")}`;return e.jsxs("div",{className:"bg-tooltip-bg border border-border-subtle rounded px-1.5 py-0.5 text-[10px] shadow-xl",children:[e.jsx("span",{className:"text-text-muted",children:l}),e.jsx("span",{className:"ml-1.5 font-semibold tabular-nums",children:a.count})]})}const De=s.memo(function({nodeHash:s,width:t=60,height:c=20,color:i,showArea:r=!0,showTooltip:o=!1,className:d=""}){const x=u(s),m=g(),h=!j().backgroundLoadComplete||m,p=i??(x.length>0?function(e){if(0===e.length)return Re;const s=e.slice(-4),t=s.reduce((e,s)=>e+s.count,0),a=t/s.length,n=e.reduce((e,s)=>e+s.count,0)/e.length;if(0===t)return Re;if(n>0){const e=a/n;return e>=1.2?_e:e>=.8?Oe:e>=.4?$e:e>=.1?Te:Re}return t>=10?_e:t>=5?Oe:t>=2?$e:t>=1?Te:Re}(x):"var(--text-muted)"),b="number"==typeof t?t:60,N=c;return h&&x.length<2?e.jsx("div",{className:`flex items-center justify-center ${d}`,style:{width:b,height:N},children:e.jsx("div",{className:"rounded animate-pulse bg-white/[0.06]",style:{width:b-8,height:N-6}})}):x.length<2?e.jsx("div",{className:`flex items-center justify-center ${d}`,style:{width:b,height:N,color:Re},children:e.jsx("svg",{width:b,height:N,viewBox:`0 0 ${b} ${N}`,preserveAspectRatio:"none",children:e.jsx("line",{x1:4,y1:N/2,x2:b-4,y2:N/2,stroke:"currentColor",strokeWidth:1.5,strokeDasharray:"3,2"})})}):e.jsx("div",{className:d,style:{width:b,height:N},children:e.jsxs(a,{data:x,width:b,height:N,margin:{top:1,right:1,bottom:1,left:1},children:[o&&e.jsx(n,{content:e.jsx(Ae,{}),cursor:{stroke:"rgba(255,255,255,0.2)",strokeWidth:1}}),e.jsx(l,{type:"monotone",dataKey:"count",stroke:p,strokeWidth:1.5,dot:!1,isAnimationActive:!1})]})})}),ze=s.memo(function({hash:t,className:a="",size:n="sm"}){const l=b(),c=o(),[i,r]=s.useState(!1),d=s.useMemo(()=>N(t),[t]),x=s.useMemo(()=>d?l.find(e=>e.prefix===d)??null:null,[d,l]),m=c.totalPaths>0&&c.avgPathConfidence>=.7,h=s.useCallback(e=>{e.preventDefault(),e.stopPropagation(),r(!0)},[]),p=s.useCallback(()=>{r(!1)},[]);if(!x)return null;const u="sm"===n?"w-3.5 h-3.5":"w-4 h-4",g=m?"text-accent-tertiary hover:text-accent-tertiary hover:bg-accent-tertiary/10 focus:ring-accent-tertiary/50":"text-signal-fair hover:text-accent-secondary hover:bg-signal-fair/10 focus:ring-signal-fair/50",j=m?`Prefix conflict resolved by Viterbi HMM (${(100*c.avgPathConfidence).toFixed(0)}% confidence)`:`Prefix conflict: ${x.candidateCount} nodes share prefix "${d}"`;return e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:h,className:`inline-flex items-center justify-center p-0.5 rounded focus:outline-none focus:ring-2 transition-colors cursor-pointer touch-manipulation ${g} ${a}`,title:j,"aria-label":`View prefix conflict for ${d}${m?" (Viterbi resolved)":""}`,children:m?e.jsxs("span",{className:"relative",children:[e.jsx(B,{className:u}),e.jsx(Y,{className:"absolute -bottom-0.5 -right-0.5 w-2 h-2 text-accent-success"})]}):e.jsx(ge,{className:u})}),e.jsx(re,{isOpen:i,prefix:x.prefix,candidateHashes:x.candidateHashes,onClose:p})]})});function Ge(e,s,t,a){const n=(t-e)*Math.PI/180,l=(a-s)*Math.PI/180,c=Math.sin(n/2)*Math.sin(n/2)+Math.cos(e*Math.PI/180)*Math.cos(t*Math.PI/180)*Math.sin(l/2)*Math.sin(l/2);return 2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))*6371e3}const Ie=Object.freeze(Object.defineProperty({__proto__:null,default:function(){const{stats:t}=v(),a=f(),n=y(),l=w(),c=k(),i=C(),r=d(),o=M(),[x,p]=s.useState(null),[u,g]=s.useState("lastHeard"),[j,b]=s.useState("desc"),[N,O]=s.useState(""),[_,A]=s.useState(!1),[D,z]=s.useState(null),[G,U]=s.useState(null),[W,B]=s.useState(null),[J,Q]=s.useState(null),[se,ae]=s.useState(new Map),[ie,re]=s.useState(new Map),[ue,ge]=s.useState(25),[be,Ne]=s.useState(25),ve=s.useRef(null),[fe,we]=s.useState(!1),ke=s.useMemo(()=>(null==t?void 0:t.neighbors)??{},[null==t?void 0:t.neighbors]),Ce=s.useMemo(()=>Object.fromEntries(Object.entries(ke).filter(([e])=>!a.has(e))),[ke,a]),Me=S(),Le=null==t?void 0:t.local_hash,Pe=s.useMemo(()=>{const e=new Map;if(!(null==Me?void 0:Me.latitude)||!(null==Me?void 0:Me.longitude))return e;for(const[s,t]of Object.entries(Ce))t.latitude&&t.longitude&&0!==t.latitude&&0!==t.longitude?e.set(s,Ge(Me.latitude,Me.longitude,t.latitude,t.longitude)):e.set(s,null);return e},[Ce,Me]),{neighborHashSet:He,neighborSignalMap:Fe}=s.useMemo(()=>{const e=new Set,s=new Map;for(const t of i)e.add(t.hash),s.set(t.hash,{avgRssi:t.avgRssi,avgSnr:t.avgSnr});return{neighborHashSet:e,neighborSignalMap:s}},[i]),Re=s.useMemo(()=>{const e=N.toLowerCase().trim(),s="neighbor"===e||"neighbors"===e,t=_||s;return Object.fromEntries(Object.entries(Ce).filter(([a,n])=>{if(t&&!He.has(a))return!1;if(s)return!0;if(!e)return!0;const l=(n.node_name||n.name||"").toLowerCase(),c=a.slice(2,4).toLowerCase();return l.includes(e)||c.includes(e)||a.toLowerCase().includes(e)}))},[Ce,N,_,He]),Te=s.useMemo(()=>Object.entries(Re).sort(([e,s],[t,a])=>{let n=0;switch(u){case"lastHeard":n=(s.last_seen||0)-(a.last_seen||0);break;case"distance":{const s=Pe.get(e)??null,a=Pe.get(t)??null;n=null===s&&null===a?0:null===s?1:null===a?-1:s-a;break}case"centrality":n=(c.get(e)||0)-(c.get(t)||0)}return"desc"===j?-n:n}),[Re,u,j,Pe,c]),$e=Te.filter(([,e])=>e.latitude&&e.longitude&&0!==e.latitude&&0!==e.longitude).length,Oe=s.useMemo(()=>new Set(l),[l]),_e=s.useMemo(()=>0===ue?Te:Te.slice(0,be),[Te,be,ue]);s.useEffect(()=>{Ne(ue||Te.length)},[u,j,N,_,ue,Te.length]),s.useEffect(()=>{if(0===ue)return;const e=new IntersectionObserver(e=>{e[0].isIntersecting&&beMath.min(e+ue,Te.length))},{threshold:.1,rootMargin:"100px"});return ve.current&&e.observe(ve.current),()=>e.disconnect()},[ue,be,Te.length]);const Ae=s.useCallback(e=>{ge(e),Ne(e||Te.length),we(!1)},[Te.length]),Ie=s.useCallback(e=>{u===e?b(e=>"desc"===e?"asc":"desc"):(g(e),b("desc"))},[u]),Ue=s.useCallback(e=>{const s=Ce[e];(null==s?void 0:s.latitude)&&(null==s?void 0:s.longitude)&&0!==s.latitude&&0!==s.longitude&&z(e)},[Ce]),We=s.useCallback(()=>{z(null)},[]),Ke=s.useCallback(async(e,s)=>{if(s.stopPropagation(),!J){Q(e),ae(s=>{const t=new Map(s);return t.delete(e),t}),re(s=>{const t=new Map(s);return t.delete(e),t});try{const s=e.startsWith("0x")?e.slice(0,4):`0x${e.slice(0,2)}`,t=await E(s,30);t.success&&t.data?(ae(s=>new Map(s).set(e,t.data)),setTimeout(()=>{ae(s=>{const t=new Map(s);return t.delete(e),t})},1e4)):(re(s=>new Map(s).set(e,t.error||"Ping failed")),setTimeout(()=>{re(s=>{const t=new Map(s);return t.delete(e),t})},5e3))}catch(t){const s=t instanceof Error?t.message:"Ping failed";re(t=>new Map(t).set(e,s)),setTimeout(()=>{re(s=>{const t=new Map(s);return t.delete(e),t})},5e3)}finally{Q(null)}}},[J]);return e.jsxs(R,{children:[e.jsx(T,{title:"Contacts",icon:e.jsx(te,{}),controls:e.jsxs("div",{className:"flex items-baseline gap-3 sm:gap-4",children:[e.jsxs("span",{className:"roster-title tabular-nums",children:[Te.length," node",1!==Te.length?"s":""]}),$e>0&&e.jsxs("span",{className:"roster-title flex items-baseline gap-1.5 tabular-nums",children:[e.jsx(ce,{className:"w-3.5 h-3.5 relative top-[2px]"}),$e," with location"]})]})}),e.jsxs($,{children:[o?e.jsx(ye,{neighbors:Ce,localNode:Me??void 0,localHash:Le,onRemoveNode:n,selectedNodeHash:D,onNodeSelected:We,highlightedEdgeKey:G,highlightedGhost:W}):e.jsx("div",{className:"surface-base radius-card aspect-video flex items-center justify-center",children:e.jsxs("div",{className:"flex flex-col items-center gap-3",children:[e.jsx("div",{className:"w-6 h-6 border-2 border-accent-primary border-t-transparent rounded-full animate-spin"}),e.jsx("span",{className:"text-sm text-text-muted",children:"Loading map..."})]})}),e.jsx(Se,{maxPaths:10,highlightedEdge:G,onHighlightEdge:U}),r.length>0&&(o?e.jsx("div",{className:"chart-container",children:e.jsx(Ee,{neighbors:Ce,onGhostSelect:B})}):e.jsxs("div",{className:"surface-base radius-card",children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-24 h-4 rounded bg-bg-elevated animate-pulse"})]}),e.jsx("div",{className:"w-6 h-6 rounded bg-bg-elevated animate-pulse"})]}),e.jsx("div",{className:"px-5 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-20 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-16 h-4 rounded bg-bg-elevated animate-pulse"})]})})]})),e.jsx("div",{className:"chart-container",children:o?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"chart-title",children:[e.jsx(te,{className:"chart-title-icon"}),"Discovered Contacts"]}),e.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2",children:[He.size>0&&e.jsxs("button",{onClick:()=>A(!_),className:"flex items-center gap-1 px-1.5 sm:px-2.5 py-1.5 text-sm radius-inner transition-base "+(_?"bg-accent-success/20 text-accent-success border border-accent-success/30":"text-text-muted hover:text-text-secondary hover-bg border border-transparent"),title:_?"Show all contacts":"Show only MeshCore neighbors (direct RF contact)",children:[e.jsx(L,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Neighbors"}),e.jsx("span",{className:"sm:hidden tabular-nums",children:He.size})]}),e.jsxs("div",{className:"relative",children:[e.jsx(q,{className:"absolute left-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-muted"}),e.jsx("input",{type:"text",name:"contact-search",id:"contact-search",autoComplete:"off",value:N,onChange:e=>O(e.target.value),placeholder:"Search...",className:"w-20 sm:w-28 lg:w-32 pl-6 sm:pl-7 pr-6 py-1.5 text-sm surface-input radius-inner text-text-primary placeholder:text-text-muted focus:outline-none focus:border-accent-primary/50"}),N&&e.jsx("button",{onClick:()=>{O(""),"neighbor"!==N.toLowerCase().trim()&&"neighbors"!==N.toLowerCase().trim()||A(!1)},className:"absolute right-1.5 top-1/2 -translate-y-1/2 text-text-muted hover:text-text-secondary p-0.5",children:e.jsx(P,{className:"w-3 h-3"})})]}),e.jsxs("div",{className:"flex items-center gap-0.5 sm:gap-1",children:[e.jsxs("button",{onClick:()=>Ie("lastHeard"),className:"flex items-center gap-1 p-1.5 sm:px-2 sm:py-1.5 text-sm radius-inner transition-base "+("lastHeard"===u?"bg-accent-primary/20 text-accent-primary":"text-text-muted hover:text-text-secondary hover-bg"),title:"Sort by last heard",children:[e.jsx(h,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Recent"}),"lastHeard"===u&&e.jsx(pe,{className:"w-3 h-3 "+("asc"===j?"rotate-180":"")})]}),e.jsxs("button",{onClick:()=>Ie("distance"),className:"flex items-center gap-1 p-1.5 sm:px-2 sm:py-1.5 text-sm radius-inner transition-base "+("distance"===u?"bg-accent-primary/20 text-accent-primary":"text-text-muted hover:text-text-secondary hover-bg"),title:"Sort by distance",children:[e.jsx(je,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Distance"}),"distance"===u&&e.jsx(pe,{className:"w-3 h-3 "+("asc"===j?"rotate-180":"")})]}),e.jsxs("button",{onClick:()=>Ie("centrality"),className:"flex items-center gap-1 p-1.5 sm:px-2 sm:py-1.5 text-sm radius-inner transition-base "+("centrality"===u?"bg-accent-primary/20 text-accent-primary":"text-text-muted hover:text-text-secondary hover-bg"),title:"Sort by network centrality",children:[e.jsx(X,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Centrality"}),"centrality"===u&&e.jsx(pe,{className:"w-3 h-3 "+("asc"===j?"rotate-180":"")})]})]}),e.jsxs("div",{className:"relative",children:[e.jsxs("button",{onClick:()=>we(!fe),className:"flex items-center gap-1 px-2 py-1.5 text-sm text-text-muted hover:text-text-secondary hover-bg radius-inner transition-base",title:"Items per page",children:[e.jsx("span",{className:"tabular-nums",children:0===ue?"All":ue}),e.jsx(m,{className:"w-3 h-3 transition-transform "+(fe?"rotate-180":"")})]}),fe&&e.jsx("div",{className:"absolute right-0 top-full mt-1 z-50 surface-elevated radius-inner py-1 min-w-[80px]",children:[25,50,100,0].map(s=>e.jsx("button",{onClick:()=>Ae(s),className:"w-full px-3 py-1.5 text-sm text-left hover-bg transition-base "+(ue===s?"text-accent-primary":"text-text-secondary"),children:0===s?"All":s},s))})]})]})]}),Te.length>0?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"hidden sm:grid contacts-grid-header border-b border-border-subtle/50 px-3 py-2 text-[10px] uppercase tracking-wider text-text-muted",children:[e.jsx("div",{className:"contacts-col-node",children:"Node"}),e.jsx("div",{className:"contacts-col-signal text-right",children:"Signal"}),e.jsx("div",{className:"contacts-col-distance text-right",children:"Distance"}),e.jsx("div",{className:"contacts-col-centrality text-right",children:"Centrality"}),e.jsx("div",{className:"contacts-col-activity text-center",children:"Activity"}),e.jsx("div",{className:"contacts-col-seen text-right",children:"Last Seen"}),e.jsx("div",{className:"contacts-col-actions"})]}),e.jsx("div",{className:"divide-y divide-border-subtle/30",children:_e.map(([s,t])=>{var a;const n=t.latitude&&t.longitude&&0!==t.latitude&&0!==t.longitude,l=t.node_name||t.name||"Unknown",i=Oe.has(s),r=He.has(s),o=Pe.get(s),d=c.get(s)||0,x=r?Fe.get(s):void 0,m=r&&x,h=null==(a=t.contact_type)?void 0:a.toLowerCase(),u="room server"===h||"room_server"===h||"room"===h||"server"===h,g="companion"===h,j="client"===h||"cli"===h,b=t.is_repeater||"repeater"===h||"rep"===h,N=r?"direct":"flood",v=r?"Direct RF contact (zero-hop neighbor)":"Flood routing (multi-hop via mesh)";return e.jsxs("div",{className:`contacts-grid-row ${i?"bg-amber-500/5 border-l-2 border-l-amber-400":""} ${n?"cursor-pointer hover:bg-white/[0.02]":""}`,onClick:()=>Ue(s),children:[e.jsxs("div",{className:"contacts-col-node flex items-center gap-2 min-w-0",children:[m&&null!==(null==x?void 0:x.avgSnr)?e.jsx("div",{className:"w-2 h-2 rounded-full flex-shrink-0 self-center "+(y=x.avgSnr,void 0===y?"bg-[var(--signal-unknown)]":y>=5?"bg-[var(--signal-excellent)]":y>=0?"bg-[var(--signal-good)]":y>=-5?"bg-[var(--signal-fair)]":y>=-10?"bg-[var(--signal-poor)]":"bg-[var(--signal-critical)]")}):e.jsx("div",{className:"w-2 flex-shrink-0"}),e.jsx("div",{className:"roster-icon flex-shrink-0",title:v,children:u&&b?e.jsxs("div",{className:"relative w-5 h-5",children:[e.jsx(I,{className:"w-5 h-5 absolute inset-0 text-sys-pink"}),e.jsx(oe,{className:"w-2.5 h-2.5 absolute -bottom-0.5 -right-0.5 text-sys-teal"})]}):u?e.jsx(I,{className:"w-5 h-5 text-sys-pink"}):g?e.jsx(de,{className:"w-5 h-5 text-text-muted"}):b?"direct"===N?e.jsx(he,{className:"w-5 h-5 text-sys-green"}):e.jsx(oe,{className:"w-5 h-5 text-sys-cyan"}):e.jsx(de,{className:"w-5 h-5 text-text-muted"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-1.5 overflow-hidden",children:[e.jsx("span",{className:"roster-title truncate",title:l,children:l}),r&&e.jsx(H,{color:K.neighbor,compact:!0,className:"flex-shrink-0",children:"NBR"}),i&&e.jsxs(H,{color:K.hub,compact:!0,className:"flex items-center gap-1 flex-shrink-0",children:[e.jsx(xe,{className:"w-3 h-3"}),"HUB"]}),b&&e.jsx(H,{color:K.repeater,compact:!0,className:"flex-shrink-0",children:"RPT"}),u&&e.jsx(H,{color:K.room,compact:!0,className:"flex-shrink-0",children:"ROOM"}),g&&e.jsx(H,{color:K.companion,compact:!0,className:"flex-shrink-0",children:"COMP"}),j&&e.jsx(H,{color:K.client,compact:!0,className:"flex-shrink-0",children:"CLIENT"})]}),e.jsxs("div",{className:"flex items-center gap-1.5 mt-0.5",children:[e.jsx(ee,{copy:!0,size:"compact",truncate:[8,6],children:s}),e.jsx(ze,{hash:s})]})]})]}),e.jsxs("div",{className:"contacts-col-signal flex items-center justify-end gap-2",children:[m&&null!==(null==x?void 0:x.avgRssi)&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(V,{rssi:x.avgRssi,className:"w-3.5 h-3.5"}),e.jsx("span",{className:"type-data-xs tabular-nums text-text-muted",children:Math.round(x.avgRssi)})]}),m&&null!==(null==x?void 0:x.avgSnr)&&e.jsxs("span",{className:"type-data-xs tabular-nums text-text-muted",children:[x.avgSnr.toFixed(1)," dB"]})]}),e.jsx("div",{className:"contacts-col-distance flex items-center justify-end gap-1 text-text-muted",children:null!=o&&e.jsxs(e.Fragment,{children:[e.jsx(je,{className:"w-3 h-3"}),e.jsx("span",{className:"type-data-xs tabular-nums",children:(f=o,f<1e3?`${Math.round(f)}m`:`${(f/1e3).toFixed(1)}km`)})]})}),e.jsx("div",{className:"contacts-col-centrality flex items-center justify-end gap-1",children:d>0&&e.jsxs(e.Fragment,{children:[e.jsx(X,{className:"w-3 h-3 text-accent-secondary"}),e.jsxs("span",{className:"type-data-xs tabular-nums text-text-muted",children:[(100*d).toFixed(0),"%"]})]})}),e.jsx("div",{className:"contacts-col-activity flex items-center justify-center",children:e.jsx(De,{nodeHash:s,width:48,height:16})}),e.jsx("div",{className:"contacts-col-seen flex items-center justify-end",children:e.jsx("span",{className:"type-data-xs tabular-nums text-text-primary whitespace-nowrap",children:t.last_seen?F(t.last_seen):"—"})}),e.jsxs("div",{className:"contacts-col-actions flex items-center justify-end gap-1",children:[r&&e.jsx(e.Fragment,{children:se.has(s)?e.jsxs("div",{className:"flex items-center gap-1 text-accent-success",title:`RTT: ${se.get(s).rtt_ms.toFixed(0)}ms`,children:[e.jsx(Y,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"type-data-xs tabular-nums hidden sm:inline",children:[se.get(s).snr_db.toFixed(1),"dB"]})]}):ie.has(s)?e.jsx("span",{className:"text-red-400 text-[10px]",title:ie.get(s),children:"✗"}):e.jsx("button",{onClick:e=>Ke(s,e),disabled:null!==J,className:"p-1 sm:p-1.5 radius-inner text-text-muted/50 hover:text-accent-primary hover:bg-accent-primary/10 transition-base disabled:opacity-50 disabled:cursor-not-allowed",title:"Ping neighbor for updated signal info",children:J===s?e.jsx(me,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4 animate-spin"}):e.jsx(Z,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"})})}),e.jsx("button",{onClick:e=>{e.stopPropagation(),p({hash:s,name:l})},className:"p-1 sm:p-1.5 radius-inner text-text-muted/50 hover:text-red-400 hover:bg-red-500/10 transition-base",title:"Remove contact",children:e.jsx(ne,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"})})]})]},s);var f,y})}),ue>0&&be0&&beNe(e=>Math.min(e+ue,Te.length)),className:"text-accent-primary hover:text-accent-primary/80 transition-base",children:"Load more"})]})]}):e.jsxs("div",{className:"roster-empty",children:[e.jsx(te,{className:"roster-empty-icon"}),e.jsx("div",{className:"type-label text-text-secondary",children:"No Contacts Discovered"}),e.jsx("div",{className:"type-data-xs text-text-muted mt-1",children:"Contacts will appear here as they advertise on the mesh network."})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-32 h-4 rounded bg-bg-elevated animate-pulse"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-16 h-6 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-24 h-6 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-16 h-6 rounded bg-bg-elevated animate-pulse"})]})]}),e.jsx("div",{className:"px-3 py-3 space-y-3",children:[...Array(5)].map((s,t)=>e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-5 h-5 rounded bg-bg-elevated animate-pulse"}),e.jsxs("div",{className:"flex-1 space-y-1.5",children:[e.jsx("div",{className:"h-4 w-32 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"h-3 w-24 rounded bg-bg-elevated animate-pulse"})]}),e.jsx("div",{className:"w-12 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-16 h-4 rounded bg-bg-elevated animate-pulse"})]},t))})]})})]}),e.jsx(le,{isOpen:!!x,title:"Remove Contact",message:`Are you sure you would like to remove ${(null==x?void 0:x.name)||"this contact"}?`,confirmLabel:"Remove",cancelLabel:"Cancel",variant:"danger",onConfirm:()=>{x&&n(x.hash),p(null)},onCancel:()=>p(null)})]})}},Symbol.toStringTag,{value:"Module"}));export{Ie as C,De as N,ze as P,je as R}; diff --git a/frontend/dist/assets/Contacts-hCqb2-UP.js b/frontend/dist/assets/Contacts-hCqb2-UP.js deleted file mode 100644 index 0ef32734..00000000 --- a/frontend/dist/assets/Contacts-hCqb2-UP.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ContactsMapMapLibre-BVr13QqT.js","assets/vendor-react-DFCqJxYC.js","assets/BasemapLayer-B5scdheQ.js","assets/vendor-core-Dhs13Wlh.js","assets/link-scoring-BY8TYwtV.js","assets/index-CZBrdv20.js","assets/ConfirmModal-OyBnZ1Rq.js","assets/triangle-alert-DlaBoont.js","assets/DeepAnalysisModal-Ckyyxl1o.js","assets/config-C7QO3CEB.js","assets/DataBox-BuwfTaKv.js","assets/git-branch-CU4ha9LK.js","assets/house-BPemXMFi.js","assets/loader-circle-BLG0SL8e.js","assets/useThemeColors-CzhUM4y-.js","assets/trending-up-xQoBxaWx.js","assets/refresh-cw-B42SG81L.js","assets/target-5KyqyCil.js","assets/compass-ipowibkG.js","assets/zap-DOkzycJm.js","assets/font-loader-jlbdh9Fw.js","assets/index-BKfnA8uz.js","assets/users-DbmAVTAI.js","assets/SignalIndicator-FtRKgdkw.js","assets/map-pin-BnrkOs2D.js","assets/ping-DAjkGztv.js","assets/PageLayout-Dz1NyqHa.js","assets/chevron-up-Cn6bmTpb.js","assets/circle-check-BQrKpAc_.js","assets/CollisionExplorerModal-CX6f3IBB.js","assets/network-Did0WXxt.js","assets/maplibre-gl-B1CfjdFi.css","assets/index-DVRwteP8.css"])))=>i.map(i=>d[i]); -import{j as e,r as s,c as t,g as a,T as n,i as l}from"./vendor-react-DFCqJxYC.js";import{c,as as i,at as r,au as o,am as d,av as x,O as m,ah as h,aw as p,ax as u,ay as g,V as j,az as b,z as N,aA as v,t as f,aB as y,aC as w,aD as k,r as C,aE as M,aF as S,R as L,_ as P,B as H,H as F}from"./index-CZBrdv20.js";import{p as E}from"./ping-DAjkGztv.js";import{P as R,b as T,B as $}from"./PageLayout-Dz1NyqHa.js";import{_ as O}from"./deckgl-DTsmDcfs.js";import{G as _}from"./git-branch-CU4ha9LK.js";import{T as A}from"./triangle-alert-DlaBoont.js";import{a as z,T as D,M as G,b as B}from"./trending-up-xQoBxaWx.js";import{C as I,A as U}from"./chevron-up-Cn6bmTpb.js";import{E as V,S as W,T as K}from"./target-5KyqyCil.js";import{Z as q,C as Z}from"./zap-DOkzycJm.js";import{C as J,D as Q}from"./DataBox-BuwfTaKv.js";import{F as X,U as Y}from"./users-DbmAVTAI.js";import{P as ee,T as se,C as te}from"./ConfirmModal-OyBnZ1Rq.js";import{M as ae}from"./map-pin-BnrkOs2D.js";import{C as ne}from"./circle-check-BQrKpAc_.js";import{C as le,b as ce,c as ie}from"./SignalIndicator-FtRKgdkw.js";import{C as re,S as oe,M as de}from"./CollisionExplorerModal-CX6f3IBB.js";import{N as xe}from"./network-Did0WXxt.js";import{L as me}from"./loader-circle-BLG0SL8e.js";const he=c("arrow-left-right",[["path",{d:"M8 3 4 7l4 4",key:"9rb6wj"}],["path",{d:"M4 7h16",key:"6tx8e3"}],["path",{d:"m16 21 4-4-4-4",key:"siv7j2"}],["path",{d:"M20 17H4",key:"h6l3hr"}]]),pe=c("arrow-up-down",[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]]),ue=c("calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]),ge=c("file-digit",[["path",{d:"M4 12V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2",key:"jrl274"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 16h2v6",key:"1bxocy"}],["path",{d:"M10 22h4",key:"ceow96"}],["rect",{x:"2",y:"16",width:"4",height:"6",rx:"2",key:"r45zd0"}]]),je=c("ruler",[["path",{d:"M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.41 2.41 0 0 1 0-3.4l2.6-2.6a2.41 2.41 0 0 1 3.4 0Z",key:"icamh8"}],["path",{d:"m14.5 12.5 2-2",key:"inckbg"}],["path",{d:"m11.5 9.5 2-2",key:"fmmyf7"}],["path",{d:"m8.5 6.5 2-2",key:"vc6u1g"}],["path",{d:"m17.5 15.5 2-2",key:"wo5hmg"}]]),be=c("shield-alert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]),Ne=c("sparkles",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]]);class ve extends s.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}render(){var s;return this.state.hasError?e.jsx("div",{className:t("map-container-16-9 flex items-center justify-center rounded-2xl",i),role:"alert","aria-live":"assertive",children:e.jsxs("div",{className:"text-center text-white/50 p-4",children:[e.jsx("p",{className:"text-lg mb-2",children:"Map failed to load"}),e.jsx("p",{className:"text-sm text-white/30",children:(null==(s=this.state.error)?void 0:s.message)||"Unknown error"}),e.jsx("p",{className:"text-xs text-white/20 mt-2",children:"Try refreshing the page or check your browser's WebGL support."})]})}):this.props.children}}const fe=s.lazy(()=>O(()=>import("./ContactsMapMapLibre-BVr13QqT.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32])));function ye({neighbors:a,localNode:n,localHash:l,onRemoveNode:c,selectedNodeHash:r,onNodeSelected:o,highlightedEdgeKey:d,highlightedGhost:x}){return e.jsx(ve,{children:e.jsx(s.Suspense,{fallback:e.jsx("div",{className:t("map-container-16-9 flex items-center justify-center rounded-2xl",i),role:"status","aria-live":"polite","aria-label":"Loading map",children:e.jsxs("div",{className:"text-white/50 flex items-center gap-3",children:[e.jsx("div",{className:"w-5 h-5 border-2 border-accent-primary border-t-transparent rounded-full animate-spin","aria-hidden":"true"}),e.jsx("span",{children:"Loading map..."})]})}),children:e.jsx(fe,{neighbors:a,localNode:n,localHash:l,onRemoveNode:c,selectedNodeHash:r,onNodeSelected:o,highlightedEdgeKey:d,highlightedGhost:x})})})}function we(e){return e>=.7?"text-accent-success":e>=.5?"text-accent-secondary":e>=.3?"text-signal-poor":"text-accent-danger"}function ke(e){return`${Math.round(100*e)}%`}function Ce(e,s){return s.has(e.toUpperCase())}const Me=s.memo(function({path:s,isHighlighted:t,onHighlight:a,ghostPrefixes:n}){const l=function(s){return s>.2?{icon:e.jsx(D,{className:"w-3 h-3"}),color:"text-accent-success"}:s<-.2?{icon:e.jsx(z,{className:"w-3 h-3"}),color:"text-accent-danger"}:{icon:e.jsx(G,{className:"w-3 h-3"}),color:"text-text-muted"}}(s.observationTrend),c=s.weakestLinkKey&&s.weakestLinkConfidence<.5,i=s.hops.some(e=>Ce(e,n));return e.jsxs("div",{className:"flex items-center gap-3 p-2 rounded-md transition-colors cursor-pointer "+(t?"bg-accent-primary/20 border border-accent-primary/40":"hover:bg-white/5"),onClick:()=>a(t?null:s.weakestLinkKey),children:[e.jsx("div",{className:"flex-shrink-0 w-12 text-center py-1 rounded-md "+(r=s.healthScore,r>=.7?"bg-accent-success/10":r>=.5?"bg-accent-secondary/10":r>=.3?"bg-signal-poor/10":"bg-accent-danger/10"),children:e.jsx("span",{className:`text-xs font-semibold tabular-nums ${we(s.healthScore)}`,children:ke(s.healthScore)})}),e.jsx("div",{className:"flex-1 flex items-center gap-0.5 overflow-x-auto min-w-0",children:s.hops.map((t,a)=>{var l;const i=Ce(t,n),r=c&&(null==(l=s.weakestLinkKey)?void 0:l.includes(t));return e.jsxs("span",{className:"flex items-center",children:[e.jsxs("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded flex items-center gap-0.5 "+(i?"bg-accent-tertiary/20 text-accent-tertiary border border-accent-tertiary/30":r?"bg-accent-danger/20 text-accent-danger":"bg-white/10 text-text-secondary"),children:[i&&e.jsx(x,{className:"w-2.5 h-2.5"}),t]}),anew Set(i.map(e=>e.prefix.toUpperCase())),[i]),g=s.useMemo(()=>l.slice(0,t),[l,t]),j=s.useMemo(()=>0===l.length?null:{avgHealth:l.reduce((e,s)=>e+s.healthScore,0)/l.length,declining:l.filter(e=>e.observationTrend<-.2).length,weakLinks:l.filter(e=>e.weakestLinkConfidence<.5).length,pathsWithGhosts:l.filter(e=>e.hops.some(e=>u.has(e.toUpperCase()))).length},[l,u]),b=e=>{null==a||a(e)};return 0===l.length?null:e.jsxs("div",{className:"chart-container",children:[e.jsxs("button",{onClick:()=>p(!h),className:"w-full chart-header hover:bg-white/5 transition-colors rounded-t-lg cursor-pointer",children:[e.jsxs("div",{className:"chart-title",children:[e.jsx(_,{className:"chart-title-icon"}),"Path Health",e.jsxs("span",{className:"ml-2 text-[10px] font-normal text-text-muted",children:["(",l.length," paths)"]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[j&&e.jsxs("div",{className:"flex items-center gap-3 text-[10px]",children:[e.jsxs("span",{className:`tabular-nums ${we(j.avgHealth)}`,children:["Avg: ",ke(j.avgHealth)]}),j.weakLinks>0&&e.jsxs("span",{className:"text-accent-danger flex items-center gap-1",children:[e.jsx(A,{className:"w-3 h-3"}),j.weakLinks," weak"]}),j.declining>0&&e.jsxs("span",{className:"text-signal-poor flex items-center gap-1",children:[e.jsx(z,{className:"w-3 h-3"}),j.declining," declining"]}),j.pathsWithGhosts>0&&e.jsxs("span",{className:"text-accent-tertiary flex items-center gap-1",children:[e.jsx(x,{className:"w-3 h-3"}),j.pathsWithGhosts," ghost"]})]}),h?e.jsx(I,{className:"w-4 h-4 text-text-muted"}):e.jsx(m,{className:"w-4 h-4 text-text-muted"})]})]}),h&&e.jsxs("div",{className:"p-3 pt-0 space-y-1",children:[c.totalPaths>0&&e.jsxs("div",{className:"flex items-center gap-3 text-[10px] text-text-muted pb-2 border-b border-white/5",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(V,{className:"w-3 h-3 text-accent-primary"}),e.jsx("span",{className:"text-text-secondary",children:c.totalPaths.toLocaleString()})," Viterbi decoded"]}),c.observationOverrideCount>0&&e.jsxs("span",{className:"text-accent-success",children:[Math.round(c.observationOverrideCount/c.totalPaths*100),"% observation override"]}),i.length>0&&e.jsxs("span",{className:"text-accent-tertiary flex items-center gap-1",children:[e.jsx(x,{className:"w-3 h-3"}),i.length," ghost",1!==i.length?"s":""]})]}),e.jsxs("div",{className:"flex items-center gap-4 text-[10px] text-text-muted pb-2 border-b border-white/5",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-accent-success"})," Healthy (≥70%)"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-accent-secondary"})," Fair (50-70%)"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-signal-poor"})," Weak (30-50%)"]}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full bg-accent-danger"})," Critical (<30%)"]}),i.length>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(x,{className:"w-3 h-3 text-accent-tertiary"})," Ghost"]})]}),e.jsx("div",{className:"space-y-1 max-h-64 overflow-y-auto",children:g.map(s=>e.jsx(Me,{path:s,isHighlighted:n===s.weakestLinkKey,onHighlight:b,ghostPrefixes:u},s.pathKey))}),l.length>t&&e.jsxs("div",{className:"text-center text-[10px] text-text-muted pt-2",children:["Showing top ",t," of ",l.length," paths"]})]})]})});function Le(e){switch(e){case"rf_intersection":return"RF Circle Intersection";case"weighted_centroid":return"Weighted Centroid";case"single_anchor":return"Single Anchor (less reliable)";default:return e}}const Pe={confirmed:{label:"Confirmed",icon:e.jsx(Ne,{className:"w-3.5 h-3.5"}),borderClass:"border-accent-success/40",bgClass:"bg-accent-success/10",textClass:"text-accent-success",badgeClass:"bg-accent-success/20 text-accent-success"},likely:{label:"Likely",icon:e.jsx(J,{className:"w-3.5 h-3.5"}),borderClass:"border-accent-tertiary/30",bgClass:"bg-accent-tertiary/5",textClass:"text-accent-tertiary",badgeClass:"bg-accent-tertiary/20 text-accent-tertiary"},possible:{label:"Possible",icon:e.jsx(Z,{className:"w-3.5 h-3.5"}),borderClass:"border-accent-secondary/20",bgClass:"bg-accent-secondary/5",textClass:"text-accent-secondary",badgeClass:"bg-accent-secondary/20 text-accent-secondary"},noise:{label:"Noise",icon:e.jsx(A,{className:"w-3.5 h-3.5"}),borderClass:"border-border-muted",bgClass:"bg-bg-card/30",textClass:"text-text-muted",badgeClass:"bg-bg-elevated text-text-muted"}};function He({ghost:a,neighbors:n,isExpanded:l,onToggle:c,compact:i}){var r,o;const d=(null==(r=a.classification)?void 0:r.tier)??"noise",u=Pe[d],g="clusterId"in(j=a)&&"temporal"in j;var j;const b=s.useMemo(()=>Array.from(a.commonNeighbors).map(e=>{var s;return{hash:e,name:null==(s=n[e])?void 0:s.name}}),[a.commonNeighbors,n]),N=a.estimatedLocation?a.estimatedLocation.uncertaintyM>=1e3?`±${(a.estimatedLocation.uncertaintyM/1e3).toFixed(1)}km`:`±${Math.round(a.estimatedLocation.uncertaintyM)}m`:null,v=g&&a.temporal?(f=a.temporal.consistency)>=.7?{label:"Steady",color:"text-accent-success"}:f>=.4?{label:"Regular",color:"text-accent-tertiary"}:f>=.2?{label:"Sporadic",color:"text-accent-secondary"}:{label:"Bursty",color:"text-signal-poor"}:null;var f;const y=g&&a.collisionCandidates&&a.collisionCandidates.length>0,w=y?a.collisionCandidates[0]:null;return i?e.jsxs("div",{className:"inline-flex items-center gap-1.5 px-2 py-1 rounded bg-bg-elevated/50 text-sm",children:[e.jsx("span",{className:"font-mono font-medium text-text-secondary",children:a.prefix.toUpperCase()}),e.jsx("span",{className:"text-text-muted",children:a.observationCount})]}):e.jsxs("div",{className:t("rounded-lg border transition-all duration-150",u.borderClass,u.bgClass),children:[e.jsxs("button",{onClick:c,className:"w-full flex items-center gap-3 px-3 py-2 text-left hover:bg-white/5 rounded-lg",children:[e.jsx(x,{className:t("w-5 h-5 flex-shrink-0",u.textClass)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-mono text-sm font-semibold text-text-primary",children:a.prefix.toUpperCase()}),e.jsx("span",{className:t("px-1.5 py-0.5 rounded text-sm font-medium",u.badgeClass),children:u.label})]}),e.jsx("div",{className:t("text-sm mt-0.5",u.textClass),children:(null==(o=a.classification)?void 0:o.reason)??"Unknown"}),e.jsxs("div",{className:"flex items-center gap-3 text-sm text-text-muted mt-1",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(V,{className:"w-3 h-3"}),a.observationCount]}),e.jsxs("span",{children:[(100*a.confidence).toFixed(0),"%"]}),a.commonNeighbors.size>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Y,{className:"w-3 h-3"}),a.commonNeighbors.size]}),a.estimatedLocation&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ae,{className:"w-3 h-3"}),N]}),v&&e.jsxs("span",{className:t("flex items-center gap-1",v.color),children:[e.jsx(U,{className:"w-3 h-3"}),v.label]}),y&&e.jsxs("span",{className:"flex items-center gap-1 text-signal-poor",children:[e.jsx(be,{className:"w-3 h-3"}),"Collision?"]})]})]}),l?e.jsx(I,{className:"w-4 h-4 text-text-muted"}):e.jsx(m,{className:"w-4 h-4 text-text-muted"})]}),l&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-border-muted/50 mt-1 pt-3",children:[y&&w&&e.jsx("div",{className:"p-2 rounded bg-signal-poor/10 border border-signal-poor/30",children:e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(be,{className:"w-4 h-4 text-signal-poor flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-signal-poor font-medium",children:"Possible collision with known node"}),e.jsx("div",{className:"text-text-secondary mt-0.5",children:w.knownNodeName?e.jsxs("span",{children:["May match ",e.jsx("span",{className:"font-medium",children:w.knownNodeName})," ","(",(100*w.collisionProbability).toFixed(0),"% probability)"]}):e.jsxs("span",{children:["May match ",e.jsx(Q,{copy:!0,size:"compact",className:"inline",children:w.knownNodeHash})," ","(",(100*w.collisionProbability).toFixed(0),"% probability)"]})}),w.evidence&&e.jsxs("div",{className:"text-text-muted mt-1 text-[10px]",children:[w.evidence.sharedEdgeCount>0&&e.jsxs("span",{className:"mr-2",children:[w.evidence.sharedEdgeCount," shared edges"]}),void 0!==w.evidence.distanceKm&&e.jsxs("span",{className:"mr-2",children:[w.evidence.distanceKm.toFixed(1),"km apart"]}),w.evidence.withinUncertainty&&e.jsx("span",{className:"text-accent-secondary",children:"Within uncertainty radius"})]})]})]})}),a.estimatedLocation?e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(ae,{className:"w-4 h-4 text-accent-primary mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary font-medium",children:[a.estimatedLocation.lat.toFixed(5),", ",a.estimatedLocation.lon.toFixed(5)]}),e.jsxs("div",{className:"text-text-muted",children:["Uncertainty: ",N]}),g&&a.location&&e.jsxs("div",{className:"mt-1 text-text-muted",children:[e.jsxs("div",{children:["Method: ",Le(a.location.method)]}),a.location.anchors&&a.location.anchors.length>0&&e.jsxs("div",{children:[a.location.anchors.length," anchor",1!==a.location.anchors.length?"s":""," used"," · ",(100*a.location.locationConfidence).toFixed(0),"% confidence"]})]})]})]}):e.jsxs("div",{className:"flex items-center gap-2 text-sm text-text-muted",children:[e.jsx(A,{className:"w-4 h-4 text-signal-poor"}),"Location unknown (neighbors lack coordinates)"]}),g&&a.temporal&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(U,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary font-medium",children:["Temporal Pattern: ",e.jsx("span",{className:null==v?void 0:v.color,children:null==v?void 0:v.label})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 gap-y-0.5 mt-1 text-text-muted",children:[e.jsxs("span",{children:["Distinct hours: ",a.temporal.distinctHours]}),e.jsxs("span",{children:["Distinct days: ",a.temporal.distinctDays]}),e.jsxs("span",{children:["Burstiness: ",(100*a.temporal.burstiness).toFixed(0),"%"]}),e.jsxs("span",{children:["Consistency: ",(100*a.temporal.consistency).toFixed(0),"%"]}),e.jsxs("span",{children:["Last 24h: ",a.temporal.last24HourCount," obs"]}),e.jsxs("span",{children:["Active hours: ",a.temporal.activeHoursLast24,"/24"]})]})]})]}),!g&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(h,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary",children:["First seen: ",p(a.firstSeen)," ago"]}),e.jsxs("div",{className:"text-text-muted",children:["Last seen: ",p(a.lastSeen)," ago"]})]})]}),g&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(ue,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-primary",children:["Active period: ",p(a.firstSeen)," – ",p(a.lastSeen)," ago"]}),a.temporal&&e.jsxs("div",{className:"text-text-muted",children:["Obs/hour avg: ",a.temporal.observationsPerHour.toFixed(1)]})]})]}),b.length>0&&e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(Y,{className:"w-4 h-4 text-text-muted mt-0.5 flex-shrink-0"}),e.jsxs("div",{className:"text-sm",children:[e.jsxs("div",{className:"text-text-muted mb-1",children:["Adjacent to ",b.length," known node",1!==b.length?"s":"",":"]}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[b.slice(0,5).map(({hash:s})=>e.jsx(Q,{copy:!0,size:"compact",children:s},s)),b.length>5&&e.jsxs("span",{className:"text-text-muted",children:["+",b.length-5," more"]})]})]})]}),g&&a.validationStages&&e.jsxs("div",{className:"pt-2 border-t border-border-muted/30",children:[e.jsx("div",{className:"text-[10px] text-text-muted mb-1.5 uppercase tracking-wide",children:"Validation Stages"}),e.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[e.jsx(Fe,{label:"Candidates",passed:a.validationStages.candidateExhaustion}),e.jsx(Fe,{label:"Temporal",passed:a.validationStages.temporalConsistency}),e.jsx(Fe,{label:"Topology",passed:a.validationStages.topologicalFit}),e.jsx(Fe,{label:"Location",passed:a.validationStages.locationPlausible})]})]}),a.classification&&!g&&e.jsx("div",{className:"pt-2 border-t border-border-muted/30",children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[a.classification.criteria.hasVeryHighObservations&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-success/20 text-accent-success",children:"200+ obs"}),a.classification.criteria.hasHighObservations&&!a.classification.criteria.hasVeryHighObservations&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-tertiary/20 text-accent-tertiary",children:"50+ obs"}),a.classification.criteria.hasHighConfidence&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-success/20 text-accent-success",children:"70%+ conf"}),a.classification.criteria.hasCommonNeighbors&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-primary/20 text-accent-primary",children:"2+ neighbors"}),a.classification.criteria.hasGoodLocation&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-accent-primary/20 text-accent-primary",children:"good loc"}),a.classification.criteria.isRecent&&e.jsx("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-text-muted/20 text-text-muted",children:"recent"})]})}),g&&a.upgradeRequirements&&a.upgradeRequirements.length>0&&"confirmed"!==d&&e.jsxs("div",{className:"pt-2 border-t border-border-muted/30",children:[e.jsx("div",{className:"text-[10px] text-text-muted mb-1 uppercase tracking-wide",children:"To upgrade tier:"}),e.jsx("ul",{className:"text-xs text-text-secondary space-y-0.5",children:a.upgradeRequirements.slice(0,3).map((s,t)=>e.jsxs("li",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-accent-tertiary",children:"•"})," ",s]},t))})]})]})]})}function Fe({label:s,passed:a}){return e.jsxs("span",{className:t("inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium",a?"bg-accent-success/20 text-accent-success":"bg-bg-elevated text-text-muted"),children:[a?e.jsx(ne,{className:"w-2.5 h-2.5"}):e.jsx(le,{className:"w-2.5 h-2.5"}),s]})}function Ee({neighbors:a,className:n,onGhostSelect:l}){const c=d(),i=o(),[r,h]=s.useState(new Set),[p,u]=s.useState("actionable"),[g,j]=s.useState(!1),[b,N]=s.useState(!0),[v,f]=s.useState(Date.now);s.useEffect(()=>{f(Date.now())},[c]);const y=s.useMemo(()=>c.filter(e=>!function(e,s){return s-1e3*e.lastSeen>6048e5}(e,v)),[c,v]),w=s.useMemo(()=>{const e=Array.from(r);return e.length>0?e[0]:null},[r]),k=s.useMemo(()=>w?y.find(e=>e.prefix===w)??null:null,[w,y]);s.useEffect(()=>{l&&l(k&&!b?{prefix:k.prefix,commonNeighbors:Array.from(k.commonNeighbors),estimatedLocation:k.estimatedLocation}:null)},[k,b,l]),s.useEffect(()=>{b&&h(new Set)},[b]);const{confirmed:C,likely:M,possible:S,noise:L,actionableCount:P}=s.useMemo(()=>{var e;const s=[],t=[],a=[],n=[];for(const c of y)switch((null==(e=c.classification)?void 0:e.tier)??"noise"){case"confirmed":s.push(c);break;case"likely":t.push(c);break;case"possible":a.push(c);break;case"noise":n.push(c)}const l=(e,s)=>s.observationCount-e.observationCount;return s.sort(l),t.sort(l),a.sort(l),n.sort(l),{confirmed:s,likely:t,possible:a,noise:n,actionableCount:s.length+t.length}},[y]);if(0===y.length)return null;const H=e=>{h(s=>s.has(e)?new Set:new Set([e]))},F="all"===p,E=C.length+M.length+(F?S.length:0)+(g?L.length:0);return e.jsxs("div",{className:n,children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"chart-title",children:[e.jsx(x,{className:"chart-title-icon"}),"Ghost Buster",P>0&&e.jsxs("span",{className:"px-2 py-0.5 rounded-full text-xs font-medium bg-accent-success/20 text-accent-success",children:[P," actionable"]}),b&&y.length>0&&e.jsxs("span",{className:"text-xs text-text-muted ml-2",children:["(",y.length," total)"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[!b&&e.jsxs("button",{onClick:()=>u(e=>"actionable"===e?"all":"actionable"),className:t("flex items-center gap-1.5 px-2 py-1 rounded text-xs transition-colors","all"===p?"bg-accent-primary/20 text-accent-primary":"bg-bg-elevated text-text-muted hover:text-text-secondary"),children:[e.jsx(X,{className:"w-3 h-3"}),"actionable"===p?"Actionable":"All"]}),e.jsx("button",{onClick:()=>N(e=>!e),className:"flex items-center gap-1 px-2 py-1 rounded text-xs bg-bg-elevated text-text-muted hover:text-text-secondary transition-colors",title:b?"Expand panel":"Minimize panel",children:b?e.jsx(ee,{className:"w-3 h-3"}):e.jsx(G,{className:"w-3 h-3"})})]})]}),b?e.jsxs("div",{className:"px-5 py-3 flex items-center gap-3 text-xs cursor-pointer hover:bg-white/5 transition-colors",onClick:()=>N(!1),children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[C.length>0&&e.jsxs("span",{className:"flex items-center gap-1 text-accent-success",children:[e.jsx(Ne,{className:"w-3 h-3"}),C.length," confirmed"]}),M.length>0&&e.jsxs("span",{className:"flex items-center gap-1 text-accent-tertiary",children:[e.jsx(J,{className:"w-3 h-3"}),M.length," likely"]}),S.length>0&&e.jsxs("span",{className:"text-accent-secondary",children:[S.length," possible"]}),L.length>0&&e.jsxs("span",{className:"text-text-muted",children:[L.length," noise"]})]}),e.jsx("span",{className:"text-text-muted ml-auto",children:"Click to expand"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-5 py-2 flex items-center gap-3 text-xs border-b border-border-muted/30",children:[e.jsxs("span",{className:"text-text-muted",children:[i.pathsWithGhosts.toLocaleString()," / ",i.totalPaths.toLocaleString()," paths"]}),e.jsx("span",{className:"text-text-muted",children:"•"}),e.jsxs("div",{className:"flex items-center gap-2",children:[C.length>0&&e.jsxs("span",{className:"text-accent-success",children:[C.length," confirmed"]}),M.length>0&&e.jsxs("span",{className:"text-accent-tertiary",children:[M.length," likely"]}),S.length>0&&e.jsxs("span",{className:"text-accent-secondary",children:[S.length," possible"]}),L.length>0&&e.jsxs("span",{className:"text-text-muted",children:[L.length," noise"]})]})]}),e.jsxs("div",{className:"px-5 py-4 space-y-4",children:[C.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-accent-success",children:[e.jsx(Ne,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"font-medium",children:["Confirmed Repeaters (",C.length,")"]})]}),e.jsx("div",{className:"space-y-2",children:C.map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:r.has(s.prefix),onToggle:()=>H(s.prefix)},s.prefix))})]}),M.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-accent-tertiary",children:[e.jsx(J,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"font-medium",children:["Likely Repeaters (",M.length,")"]})]}),e.jsx("div",{className:"space-y-2",children:M.map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:r.has(s.prefix),onToggle:()=>H(s.prefix)},s.prefix))})]}),F&&S.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-accent-secondary",children:[e.jsx(Z,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"font-medium",children:["Possible (",S.length,")"]})]}),e.jsxs("div",{className:"space-y-2",children:[S.slice(0,10).map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:r.has(s.prefix),onToggle:()=>H(s.prefix)},s.prefix)),S.length>10&&e.jsxs("div",{className:"text-xs text-text-muted text-center py-1",children:["+",S.length-10," more possible nodes"]})]})]}),L.length>0&&"all"===p&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("button",{onClick:()=>j(!g),className:"flex items-center gap-2 text-xs text-text-muted hover:text-text-secondary transition-colors",children:[g?e.jsx(I,{className:"w-3.5 h-3.5"}):e.jsx(m,{className:"w-3.5 h-3.5"}),e.jsx(A,{className:"w-3.5 h-3.5"}),e.jsxs("span",{children:["Noise (",L.length,")"]})]}),g&&e.jsx("div",{className:"flex flex-wrap gap-1",children:L.map(s=>e.jsx(He,{ghost:s,neighbors:a,isExpanded:!1,onToggle:()=>{},compact:!0},s.prefix))})]}),"actionable"===p&&0===P&&e.jsxs("div",{className:"text-center py-6 text-sm text-text-muted",children:[e.jsx(x,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),e.jsx("p",{children:"No confirmed or likely repeaters yet."}),e.jsxs("p",{className:"text-xs mt-1",children:[S.length+L.length," prefixes need more evidence."]}),e.jsxs("button",{onClick:()=>u("all"),className:"mt-3 text-accent-primary hover:underline",children:["View all ",y.length," discovered nodes"]})]}),i.observationOverrideCount>0&&E>0&&e.jsxs("div",{className:"pt-2 border-t border-border-muted/30 text-xs text-text-muted",children:[e.jsx("span",{className:"text-accent-primary",children:i.observationOverrideCount})," observation overrides • Avg confidence: ",e.jsxs("span",{className:"text-accent-secondary",children:[(100*i.avgPathConfidence).toFixed(0),"%"]})]})]})]})]})}const Re="var(--sparkline-critical)",Te="var(--sparkline-poor)",$e="var(--sparkline-fair)",Oe="var(--sparkline-good)",_e="var(--sparkline-excellent)";function Ae({active:s,payload:t}){if(!s||!t||!t.length)return null;const a=t[0].payload,n=new Date(a.timestamp),l=`${(n.getMonth()+1).toString().padStart(2,"0")}/${n.getDate().toString().padStart(2,"0")}`;return e.jsxs("div",{className:"bg-tooltip-bg border border-border-subtle rounded px-1.5 py-0.5 text-[10px] shadow-xl",children:[e.jsx("span",{className:"text-text-muted",children:l}),e.jsx("span",{className:"ml-1.5 font-semibold tabular-nums",children:a.count})]})}const ze=s.memo(function({nodeHash:s,width:t=60,height:c=20,color:i,showArea:r=!0,showTooltip:o=!1,className:d=""}){const x=u(s),m=g(),h=!j().backgroundLoadComplete||m,p=i??(x.length>0?function(e){if(0===e.length)return Re;const s=e.slice(-4),t=s.reduce((e,s)=>e+s.count,0),a=t/s.length,n=e.reduce((e,s)=>e+s.count,0)/e.length;if(0===t)return Re;if(n>0){const e=a/n;return e>=1.2?_e:e>=.8?Oe:e>=.4?$e:e>=.1?Te:Re}return t>=10?_e:t>=5?Oe:t>=2?$e:t>=1?Te:Re}(x):"var(--text-muted)"),b="number"==typeof t?t:60,N=c;return h&&x.length<2?e.jsx("div",{className:`flex items-center justify-center ${d}`,style:{width:b,height:N},children:e.jsx("div",{className:"rounded animate-pulse bg-white/[0.06]",style:{width:b-8,height:N-6}})}):x.length<2?e.jsx("div",{className:`flex items-center justify-center ${d}`,style:{width:b,height:N,color:Re},children:e.jsx("svg",{width:b,height:N,viewBox:`0 0 ${b} ${N}`,preserveAspectRatio:"none",children:e.jsx("line",{x1:4,y1:N/2,x2:b-4,y2:N/2,stroke:"currentColor",strokeWidth:1.5,strokeDasharray:"3,2"})})}):e.jsx("div",{className:d,style:{width:b,height:N},children:e.jsxs(a,{data:x,width:b,height:N,margin:{top:1,right:1,bottom:1,left:1},children:[o&&e.jsx(n,{content:e.jsx(Ae,{}),cursor:{stroke:"rgba(255,255,255,0.2)",strokeWidth:1}}),e.jsx(l,{type:"monotone",dataKey:"count",stroke:p,strokeWidth:1.5,dot:!1,isAnimationActive:!1})]})})}),De=s.memo(function({hash:t,className:a="",size:n="sm"}){const l=b(),c=o(),[i,r]=s.useState(!1),d=s.useMemo(()=>N(t),[t]),x=s.useMemo(()=>d?l.find(e=>e.prefix===d)??null:null,[d,l]),m=c.totalPaths>0&&c.avgPathConfidence>=.7,h=s.useCallback(e=>{e.preventDefault(),e.stopPropagation(),r(!0)},[]),p=s.useCallback(()=>{r(!1)},[]);if(!x)return null;const u="sm"===n?"w-3.5 h-3.5":"w-4 h-4",g=m?"text-accent-tertiary hover:text-accent-tertiary hover:bg-accent-tertiary/10 focus:ring-accent-tertiary/50":"text-signal-fair hover:text-accent-secondary hover:bg-signal-fair/10 focus:ring-signal-fair/50",j=m?`Prefix conflict resolved by Viterbi HMM (${(100*c.avgPathConfidence).toFixed(0)}% confidence)`:`Prefix conflict: ${x.candidateCount} nodes share prefix "${d}"`;return e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:h,className:`inline-flex items-center justify-center p-0.5 rounded focus:outline-none focus:ring-2 transition-colors cursor-pointer touch-manipulation ${g} ${a}`,title:j,"aria-label":`View prefix conflict for ${d}${m?" (Viterbi resolved)":""}`,children:m?e.jsxs("span",{className:"relative",children:[e.jsx(V,{className:u}),e.jsx(J,{className:"absolute -bottom-0.5 -right-0.5 w-2 h-2 text-accent-success"})]}):e.jsx(ge,{className:u})}),e.jsx(re,{isOpen:i,prefix:x.prefix,candidateHashes:x.candidateHashes,onClose:p})]})});function Ge(e,s,t,a){const n=(t-e)*Math.PI/180,l=(a-s)*Math.PI/180,c=Math.sin(n/2)*Math.sin(n/2)+Math.cos(e*Math.PI/180)*Math.cos(t*Math.PI/180)*Math.sin(l/2)*Math.sin(l/2);return 2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))*6371e3}const Be=Object.freeze(Object.defineProperty({__proto__:null,default:function(){const{stats:t}=v(),a=f(),n=y(),l=w(),c=k(),i=C(),r=d(),o=M(),[x,p]=s.useState(null),[u,g]=s.useState("lastHeard"),[j,b]=s.useState("desc"),[N,O]=s.useState(""),[_,A]=s.useState(!1),[z,D]=s.useState(null),[G,I]=s.useState(null),[V,q]=s.useState(null),[Z,X]=s.useState(null),[ee,ne]=s.useState(new Map),[le,re]=s.useState(new Map),[ue,ge]=s.useState(25),[be,Ne]=s.useState(25),ve=s.useRef(null),[fe,we]=s.useState(!1),ke=s.useMemo(()=>(null==t?void 0:t.neighbors)??{},[null==t?void 0:t.neighbors]),Ce=s.useMemo(()=>Object.fromEntries(Object.entries(ke).filter(([e])=>!a.has(e))),[ke,a]),Me=S(),Le=null==t?void 0:t.local_hash,Pe=s.useMemo(()=>{const e=new Map;if(!(null==Me?void 0:Me.latitude)||!(null==Me?void 0:Me.longitude))return e;for(const[s,t]of Object.entries(Ce))t.latitude&&t.longitude&&0!==t.latitude&&0!==t.longitude?e.set(s,Ge(Me.latitude,Me.longitude,t.latitude,t.longitude)):e.set(s,null);return e},[Ce,Me]),{neighborHashSet:He,neighborSignalMap:Fe}=s.useMemo(()=>{const e=new Set,s=new Map;for(const t of i)e.add(t.hash),s.set(t.hash,{avgRssi:t.avgRssi,avgSnr:t.avgSnr});return{neighborHashSet:e,neighborSignalMap:s}},[i]),Re=s.useMemo(()=>{const e=N.toLowerCase().trim(),s="neighbor"===e||"neighbors"===e,t=_||s;return Object.fromEntries(Object.entries(Ce).filter(([a,n])=>{if(t&&!He.has(a))return!1;if(s)return!0;if(!e)return!0;const l=(n.node_name||n.name||"").toLowerCase(),c=a.slice(2,4).toLowerCase();return l.includes(e)||c.includes(e)||a.toLowerCase().includes(e)}))},[Ce,N,_,He]),Te=s.useMemo(()=>Object.entries(Re).sort(([e,s],[t,a])=>{let n=0;switch(u){case"lastHeard":n=(s.last_seen||0)-(a.last_seen||0);break;case"distance":{const s=Pe.get(e)??null,a=Pe.get(t)??null;n=null===s&&null===a?0:null===s?1:null===a?-1:s-a;break}case"centrality":n=(c.get(e)||0)-(c.get(t)||0)}return"desc"===j?-n:n}),[Re,u,j,Pe,c]),$e=Te.filter(([,e])=>e.latitude&&e.longitude&&0!==e.latitude&&0!==e.longitude).length,Oe=s.useMemo(()=>new Set(l),[l]),_e=s.useMemo(()=>0===ue?Te:Te.slice(0,be),[Te,be,ue]);s.useEffect(()=>{Ne(ue||Te.length)},[u,j,N,_,ue,Te.length]),s.useEffect(()=>{if(0===ue)return;const e=new IntersectionObserver(e=>{e[0].isIntersecting&&beMath.min(e+ue,Te.length))},{threshold:.1,rootMargin:"100px"});return ve.current&&e.observe(ve.current),()=>e.disconnect()},[ue,be,Te.length]);const Ae=s.useCallback(e=>{ge(e),Ne(e||Te.length),we(!1)},[Te.length]),Be=s.useCallback(e=>{u===e?b(e=>"desc"===e?"asc":"desc"):(g(e),b("desc"))},[u]),Ie=s.useCallback(e=>{const s=Ce[e];(null==s?void 0:s.latitude)&&(null==s?void 0:s.longitude)&&0!==s.latitude&&0!==s.longitude&&D(e)},[Ce]),Ue=s.useCallback(()=>{D(null)},[]),Ve=s.useCallback(async(e,s)=>{if(s.stopPropagation(),!Z){X(e),ne(s=>{const t=new Map(s);return t.delete(e),t}),re(s=>{const t=new Map(s);return t.delete(e),t});try{const s=e.startsWith("0x")?e.slice(0,4):`0x${e.slice(0,2)}`,t=await E(s,30);t.success&&t.data?(ne(s=>new Map(s).set(e,t.data)),setTimeout(()=>{ne(s=>{const t=new Map(s);return t.delete(e),t})},1e4)):(re(s=>new Map(s).set(e,t.error||"Ping failed")),setTimeout(()=>{re(s=>{const t=new Map(s);return t.delete(e),t})},5e3))}catch(t){const s=t instanceof Error?t.message:"Ping failed";re(t=>new Map(t).set(e,s)),setTimeout(()=>{re(s=>{const t=new Map(s);return t.delete(e),t})},5e3)}finally{X(null)}}},[Z]);return e.jsxs(R,{children:[e.jsx(T,{title:"Contacts",icon:e.jsx(Y,{}),controls:e.jsxs("div",{className:"flex items-baseline gap-3 sm:gap-4",children:[e.jsxs("span",{className:"roster-title tabular-nums",children:[Te.length," node",1!==Te.length?"s":""]}),$e>0&&e.jsxs("span",{className:"roster-title flex items-baseline gap-1.5 tabular-nums",children:[e.jsx(ae,{className:"w-3.5 h-3.5 relative top-[2px]"}),$e," with location"]})]})}),e.jsxs($,{children:[o?e.jsx(ye,{neighbors:Ce,localNode:Me??void 0,localHash:Le,onRemoveNode:n,selectedNodeHash:z,onNodeSelected:Ue,highlightedEdgeKey:G,highlightedGhost:V}):e.jsx("div",{className:"surface-base radius-card aspect-video flex items-center justify-center",children:e.jsxs("div",{className:"flex flex-col items-center gap-3",children:[e.jsx("div",{className:"w-6 h-6 border-2 border-accent-primary border-t-transparent rounded-full animate-spin"}),e.jsx("span",{className:"text-sm text-text-muted",children:"Loading map..."})]})}),e.jsx(Se,{maxPaths:10,highlightedEdge:G,onHighlightEdge:I}),r.length>0&&(o?e.jsx("div",{className:"chart-container",children:e.jsx(Ee,{neighbors:Ce,onGhostSelect:q})}):e.jsxs("div",{className:"surface-base radius-card",children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-24 h-4 rounded bg-bg-elevated animate-pulse"})]}),e.jsx("div",{className:"w-6 h-6 rounded bg-bg-elevated animate-pulse"})]}),e.jsx("div",{className:"px-5 py-3",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-20 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-16 h-4 rounded bg-bg-elevated animate-pulse"})]})})]})),e.jsx("div",{className:"chart-container",children:o?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"chart-title",children:[e.jsx(Y,{className:"chart-title-icon"}),"Discovered Contacts"]}),e.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2",children:[He.size>0&&e.jsxs("button",{onClick:()=>A(!_),className:"flex items-center gap-1 px-1.5 sm:px-2.5 py-1.5 text-sm radius-inner transition-base "+(_?"bg-accent-success/20 text-accent-success border border-accent-success/30":"text-text-muted hover:text-text-secondary hover-bg border border-transparent"),title:_?"Show all contacts":"Show only MeshCore neighbors (direct RF contact)",children:[e.jsx(L,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Neighbors"}),e.jsx("span",{className:"sm:hidden tabular-nums",children:He.size})]}),e.jsxs("div",{className:"relative",children:[e.jsx(W,{className:"absolute left-2 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-muted"}),e.jsx("input",{type:"text",name:"contact-search",id:"contact-search",autoComplete:"off",value:N,onChange:e=>O(e.target.value),placeholder:"Search...",className:"w-20 sm:w-28 lg:w-32 pl-6 sm:pl-7 pr-6 py-1.5 text-sm surface-input radius-inner text-text-primary placeholder:text-text-muted focus:outline-none focus:border-accent-primary/50"}),N&&e.jsx("button",{onClick:()=>{O(""),"neighbor"!==N.toLowerCase().trim()&&"neighbors"!==N.toLowerCase().trim()||A(!1)},className:"absolute right-1.5 top-1/2 -translate-y-1/2 text-text-muted hover:text-text-secondary p-0.5",children:e.jsx(P,{className:"w-3 h-3"})})]}),e.jsxs("div",{className:"flex items-center gap-0.5 sm:gap-1",children:[e.jsxs("button",{onClick:()=>Be("lastHeard"),className:"flex items-center gap-1 p-1.5 sm:px-2 sm:py-1.5 text-sm radius-inner transition-base "+("lastHeard"===u?"bg-accent-primary/20 text-accent-primary":"text-text-muted hover:text-text-secondary hover-bg"),title:"Sort by last heard",children:[e.jsx(h,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Recent"}),"lastHeard"===u&&e.jsx(pe,{className:"w-3 h-3 "+("asc"===j?"rotate-180":"")})]}),e.jsxs("button",{onClick:()=>Be("distance"),className:"flex items-center gap-1 p-1.5 sm:px-2 sm:py-1.5 text-sm radius-inner transition-base "+("distance"===u?"bg-accent-primary/20 text-accent-primary":"text-text-muted hover:text-text-secondary hover-bg"),title:"Sort by distance",children:[e.jsx(je,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Distance"}),"distance"===u&&e.jsx(pe,{className:"w-3 h-3 "+("asc"===j?"rotate-180":"")})]}),e.jsxs("button",{onClick:()=>Be("centrality"),className:"flex items-center gap-1 p-1.5 sm:px-2 sm:py-1.5 text-sm radius-inner transition-base "+("centrality"===u?"bg-accent-primary/20 text-accent-primary":"text-text-muted hover:text-text-secondary hover-bg"),title:"Sort by network centrality",children:[e.jsx(U,{className:"w-3.5 h-3.5"}),e.jsx("span",{className:"hidden sm:inline",children:"Centrality"}),"centrality"===u&&e.jsx(pe,{className:"w-3 h-3 "+("asc"===j?"rotate-180":"")})]})]}),e.jsxs("div",{className:"relative",children:[e.jsxs("button",{onClick:()=>we(!fe),className:"flex items-center gap-1 px-2 py-1.5 text-sm text-text-muted hover:text-text-secondary hover-bg radius-inner transition-base",title:"Items per page",children:[e.jsx("span",{className:"tabular-nums",children:0===ue?"All":ue}),e.jsx(m,{className:"w-3 h-3 transition-transform "+(fe?"rotate-180":"")})]}),fe&&e.jsx("div",{className:"absolute right-0 top-full mt-1 z-50 surface-elevated radius-inner py-1 min-w-[80px]",children:[25,50,100,0].map(s=>e.jsx("button",{onClick:()=>Ae(s),className:"w-full px-3 py-1.5 text-sm text-left hover-bg transition-base "+(ue===s?"text-accent-primary":"text-text-secondary"),children:0===s?"All":s},s))})]})]})]}),Te.length>0?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"hidden sm:grid contacts-grid-header border-b border-border-subtle/50 px-3 py-2 text-[10px] uppercase tracking-wider text-text-muted",children:[e.jsx("div",{className:"contacts-col-node",children:"Node"}),e.jsx("div",{className:"contacts-col-signal text-right",children:"Signal"}),e.jsx("div",{className:"contacts-col-distance text-right",children:"Distance"}),e.jsx("div",{className:"contacts-col-centrality text-right",children:"Centrality"}),e.jsx("div",{className:"contacts-col-activity text-center",children:"Activity"}),e.jsx("div",{className:"contacts-col-seen text-right",children:"Last Seen"}),e.jsx("div",{className:"contacts-col-actions"})]}),e.jsx("div",{className:"divide-y divide-border-subtle/30",children:_e.map(([s,t])=>{var a;const n=t.latitude&&t.longitude&&0!==t.latitude&&0!==t.longitude,l=t.node_name||t.name||"Unknown",i=Oe.has(s),r=He.has(s),o=Pe.get(s),d=c.get(s)||0,x=r?Fe.get(s):void 0,m=r&&x,h=null==(a=t.contact_type)?void 0:a.toLowerCase(),u="room server"===h||"room_server"===h||"room"===h||"server"===h,g="companion"===h,j="client"===h||"cli"===h,b=t.is_repeater||"repeater"===h||"rep"===h,N=r?"direct":"flood",v=r?"Direct RF contact (zero-hop neighbor)":"Flood routing (multi-hop via mesh)";return e.jsxs("div",{className:`contacts-grid-row ${i?"bg-amber-500/5 border-l-2 border-l-amber-400":""} ${n?"cursor-pointer hover:bg-white/[0.02]":""}`,onClick:()=>Ie(s),children:[e.jsxs("div",{className:"contacts-col-node flex items-center gap-2 min-w-0",children:[m&&null!==(null==x?void 0:x.avgSnr)?e.jsx("div",{className:"w-2 h-2 rounded-full flex-shrink-0 self-center "+(y=x.avgSnr,void 0===y?"bg-[var(--signal-unknown)]":y>=5?"bg-[var(--signal-excellent)]":y>=0?"bg-[var(--signal-good)]":y>=-5?"bg-[var(--signal-fair)]":y>=-10?"bg-[var(--signal-poor)]":"bg-[var(--signal-critical)]")}):e.jsx("div",{className:"w-2 flex-shrink-0"}),e.jsx("div",{className:"roster-icon flex-shrink-0",title:v,children:u&&b?e.jsxs("div",{className:"relative w-5 h-5",children:[e.jsx(B,{className:"w-5 h-5 absolute inset-0 text-sys-pink"}),e.jsx(oe,{className:"w-2.5 h-2.5 absolute -bottom-0.5 -right-0.5 text-sys-teal"})]}):u?e.jsx(B,{className:"w-5 h-5 text-sys-pink"}):g?e.jsx(de,{className:"w-5 h-5 text-text-muted"}):b?"direct"===N?e.jsx(he,{className:"w-5 h-5 text-sys-green"}):e.jsx(oe,{className:"w-5 h-5 text-sys-cyan"}):e.jsx(de,{className:"w-5 h-5 text-text-muted"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-1.5 overflow-hidden",children:[e.jsx("span",{className:"roster-title truncate",title:l,children:l}),r&&e.jsx(H,{color:ce.neighbor,compact:!0,className:"flex-shrink-0",children:"NBR"}),i&&e.jsxs(H,{color:ce.hub,compact:!0,className:"flex items-center gap-1 flex-shrink-0",children:[e.jsx(xe,{className:"w-3 h-3"}),"HUB"]}),b&&e.jsx(H,{color:ce.repeater,compact:!0,className:"flex-shrink-0",children:"RPT"}),u&&e.jsx(H,{color:ce.room,compact:!0,className:"flex-shrink-0",children:"ROOM"}),g&&e.jsx(H,{color:ce.companion,compact:!0,className:"flex-shrink-0",children:"COMP"}),j&&e.jsx(H,{color:ce.client,compact:!0,className:"flex-shrink-0",children:"CLIENT"})]}),e.jsxs("div",{className:"flex items-center gap-1.5 mt-0.5",children:[e.jsx(Q,{copy:!0,size:"compact",truncate:[8,6],children:s}),e.jsx(De,{hash:s})]})]})]}),e.jsxs("div",{className:"contacts-col-signal flex items-center justify-end gap-2",children:[m&&null!==(null==x?void 0:x.avgRssi)&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(ie,{rssi:x.avgRssi,className:"w-3.5 h-3.5"}),e.jsx("span",{className:"type-data-xs tabular-nums text-text-muted",children:Math.round(x.avgRssi)})]}),m&&null!==(null==x?void 0:x.avgSnr)&&e.jsxs("span",{className:"type-data-xs tabular-nums text-text-muted",children:[x.avgSnr.toFixed(1)," dB"]})]}),e.jsx("div",{className:"contacts-col-distance flex items-center justify-end gap-1 text-text-muted",children:null!=o&&e.jsxs(e.Fragment,{children:[e.jsx(je,{className:"w-3 h-3"}),e.jsx("span",{className:"type-data-xs tabular-nums",children:(f=o,f<1e3?`${Math.round(f)}m`:`${(f/1e3).toFixed(1)}km`)})]})}),e.jsx("div",{className:"contacts-col-centrality flex items-center justify-end gap-1",children:d>0&&e.jsxs(e.Fragment,{children:[e.jsx(U,{className:"w-3 h-3 text-accent-secondary"}),e.jsxs("span",{className:"type-data-xs tabular-nums text-text-muted",children:[(100*d).toFixed(0),"%"]})]})}),e.jsx("div",{className:"contacts-col-activity flex items-center justify-center",children:e.jsx(ze,{nodeHash:s,width:48,height:16})}),e.jsx("div",{className:"contacts-col-seen flex items-center justify-end",children:e.jsx("span",{className:"type-data-xs tabular-nums text-text-primary whitespace-nowrap",children:t.last_seen?F(t.last_seen):"—"})}),e.jsxs("div",{className:"contacts-col-actions flex items-center justify-end gap-1",children:[r&&e.jsx(e.Fragment,{children:ee.has(s)?e.jsxs("div",{className:"flex items-center gap-1 text-accent-success",title:`RTT: ${ee.get(s).rtt_ms.toFixed(0)}ms`,children:[e.jsx(J,{className:"w-3.5 h-3.5"}),e.jsxs("span",{className:"type-data-xs tabular-nums hidden sm:inline",children:[ee.get(s).snr_db.toFixed(1),"dB"]})]}):le.has(s)?e.jsx("span",{className:"text-red-400 text-[10px]",title:le.get(s),children:"✗"}):e.jsx("button",{onClick:e=>Ve(s,e),disabled:null!==Z,className:"p-1 sm:p-1.5 radius-inner text-text-muted/50 hover:text-accent-primary hover:bg-accent-primary/10 transition-base disabled:opacity-50 disabled:cursor-not-allowed",title:"Ping neighbor for updated signal info",children:Z===s?e.jsx(me,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4 animate-spin"}):e.jsx(K,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"})})}),e.jsx("button",{onClick:e=>{e.stopPropagation(),p({hash:s,name:l})},className:"p-1 sm:p-1.5 radius-inner text-text-muted/50 hover:text-red-400 hover:bg-red-500/10 transition-base",title:"Remove contact",children:e.jsx(se,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"})})]})]},s);var f,y})}),ue>0&&be0&&beNe(e=>Math.min(e+ue,Te.length)),className:"text-accent-primary hover:text-accent-primary/80 transition-base",children:"Load more"})]})]}):e.jsxs("div",{className:"roster-empty",children:[e.jsx(Y,{className:"roster-empty-icon"}),e.jsx("div",{className:"type-label text-text-secondary",children:"No Contacts Discovered"}),e.jsx("div",{className:"type-data-xs text-text-muted mt-1",children:"Contacts will appear here as they advertise on the mesh network."})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chart-header",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-4 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-32 h-4 rounded bg-bg-elevated animate-pulse"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-16 h-6 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-24 h-6 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-16 h-6 rounded bg-bg-elevated animate-pulse"})]})]}),e.jsx("div",{className:"px-3 py-3 space-y-3",children:[...Array(5)].map((s,t)=>e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-5 h-5 rounded bg-bg-elevated animate-pulse"}),e.jsxs("div",{className:"flex-1 space-y-1.5",children:[e.jsx("div",{className:"h-4 w-32 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"h-3 w-24 rounded bg-bg-elevated animate-pulse"})]}),e.jsx("div",{className:"w-12 h-4 rounded bg-bg-elevated animate-pulse"}),e.jsx("div",{className:"w-16 h-4 rounded bg-bg-elevated animate-pulse"})]},t))})]})})]}),e.jsx(te,{isOpen:!!x,title:"Remove Contact",message:`Are you sure you would like to remove ${(null==x?void 0:x.name)||"this contact"}?`,confirmLabel:"Remove",cancelLabel:"Cancel",variant:"danger",onConfirm:()=>{x&&n(x.hash),p(null)},onCancel:()=>p(null)})]})}},Symbol.toStringTag,{value:"Module"}));export{Be as C,ze as N,De as P,je as R}; diff --git a/frontend/dist/assets/ContactsMapMapLibre-BVr13QqT.js b/frontend/dist/assets/ContactsMapMapLibre-BVr13QqT.js deleted file mode 100644 index 689de19a..00000000 --- a/frontend/dist/assets/ContactsMapMapLibre-BVr13QqT.js +++ /dev/null @@ -1 +0,0 @@ -import{r as A,j as e,c as t,s as r}from"./vendor-react-DFCqJxYC.js";import{u as n,b as o,S as i,L as a,P as s,c as l,M as c,d as u,B as d}from"./BasemapLayer-B5scdheQ.js";import"./maplibre-gl-Bk5DsYkB.js";import{L as f,S as g,M as h,c as m}from"./link-scoring-BY8TYwtV.js";import{c as b,h as p,am as v,au as y,av as w,T as x,m as k,O as C,A as B,Z as M,aQ as D,ao as E,K as j,R as Q,_ as N,N as S,ah as F,y as P,bQ as T,bR as L,z as R,bS as I,B as _,H as z,aV as H,r as G,V as O,bT as U,bU as Y}from"./index-CZBrdv20.js";import{P as V,T as W,C as Z}from"./ConfirmModal-OyBnZ1Rq.js";import{M as K,a as J,E as q,b as X,D as $}from"./DeepAnalysisModal-Ckyyxl1o.js";import{h as AA,i as eA,j as tA,k as rA}from"./useThemeColors-CzhUM4y-.js";import{b as nA,M as oA}from"./trending-up-xQoBxaWx.js";import{H as iA}from"./house-BPemXMFi.js";import{R as aA}from"./refresh-cw-B42SG81L.js";import{E as sA}from"./target-5KyqyCil.js";import{C as lA}from"./compass-ipowibkG.js";import{L as cA}from"./loader-circle-BLG0SL8e.js";import{G as uA}from"./git-branch-CU4ha9LK.js";import{Z as dA}from"./zap-DOkzycJm.js";import{l as fA}from"./font-loader-jlbdh9Fw.js";import{a as gA}from"./config-C7QO3CEB.js";import{A as hA}from"./index-BKfnA8uz.js";import{c as mA,p as bA,d as pA}from"./vendor-core-Dhs13Wlh.js";import{C as vA,a as yA}from"./DataBox-BuwfTaKv.js";import{U as wA}from"./users-DbmAVTAI.js";import{P as xA,R as kA,N as CA}from"./Contacts-hCqb2-UP.js";import{H as BA,b as MA,N as DA,d as EA}from"./SignalIndicator-FtRKgdkw.js";import{M as jA}from"./map-pin-BnrkOs2D.js";import"./deckgl-DTsmDcfs.js";import"./triangle-alert-DlaBoont.js";import"./ping-DAjkGztv.js";import"./PageLayout-Dz1NyqHa.js";import"./chevron-up-Cn6bmTpb.js";import"./circle-check-BQrKpAc_.js";import"./CollisionExplorerModal-CX6f3IBB.js";import"./network-Did0WXxt.js";const QA=b("boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]),NA=b("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]),SA=b("grip-vertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]),FA=b("map",[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]]),PA=b("mountain",[["path",{d:"m8 3 4 8 5-5 5 15H2L8 3z",key:"otkl63"}]]),TA=b("sigma",[["path",{d:"M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2",key:"wuwx1p"}]]),LA=b("swords",[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}],["polyline",{points:"14.5 6.5 18 3 21 3 21 6 17.5 9.5",key:"hbey2j"}],["line",{x1:"5",x2:"9",y1:"14",y2:"18",key:"1hf58s"}],["line",{x1:"7",x2:"4",y1:"17",y2:"20",key:"pidxm4"}],["line",{x1:"3",x2:"5",y1:"19",y2:"21",key:"1pehsh"}]]),RA=b("wifi-off",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]),IA=b("wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]),_A=b("wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]]);class zA{constructor(){this.componentControls=new Set}subscribe(A){return this.componentControls.add(A),()=>this.componentControls.delete(A)}start(A,e){this.componentControls.forEach(t=>{t.start(A.nativeEvent||A,e)})}cancel(){this.componentControls.forEach(A=>{A.cancel()})}stop(){this.componentControls.forEach(A=>{A.stop()})}}const HA=()=>new zA;function GA(A,e,t,r){const n=(t-A)*Math.PI/180,o=(r-e)*Math.PI/180,i=Math.sin(n/2)*Math.sin(n/2)+Math.cos(A*Math.PI/180)*Math.cos(t*Math.PI/180)*Math.sin(o/2)*Math.sin(o/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371e3}function OA(A,e){const t=Math.max(5,Math.min(A,300)),r=Math.log(5),n=Math.log(300);return 1+(Math.log(t)-r)/(n-r)*5}const UA={nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",nodeColor:"#4338CA",localColor:"#FFB224",hubColor:"#8E4EC6",gatewayColor:"#5B5BD6",mobileColor:"#F76B15",roomServerColor:"#D6409F",neighborColor:"#FFB224",edges:{rest:"#4B4B4B",restBright:"#616161",restDim:"#3F3F3F",hoverDirect:"#6FBCBD",hoverLoop:"#8B7BAD",hoverStandard:"#8A8A8A",hoverNeighbor:"#FBBF24",neighborRest:"#6B7280",neighborHover:"#FBBF24",highlight:"#FFD700"},edgeOpacity:.82};function YA(){if("undefined"==typeof window)return UA;const A=AA(),e=eA();return{nodeFill:A.nodeFill,nodeStroke:A.nodeStroke,nodeColor:UA.nodeColor,localColor:A.localColor,hubColor:A.hubColor,gatewayColor:A.gatewayColor,mobileColor:A.mobileColor,roomServerColor:A.roomColor,neighborColor:A.neighborColor,edges:{rest:e.rest,restBright:e.restBright,restDim:e.restDim,hoverDirect:e.hoverDirect,hoverLoop:e.hoverLoop,hoverStandard:e.hoverStandard,hoverNeighbor:e.hoverNeighbor,neighborRest:UA.edges.neighborRest,neighborHover:UA.edges.neighborHover,highlight:e.highlight},edgeOpacity:UA.edgeOpacity}}const VA=2e3,WA={type:"spring",stiffness:500,damping:35},ZA="#4A4A4A",KA="#737373",JA="rgba(0, 0, 0, 0.12)",qA=A.createContext("dark"),XA=()=>A.useContext(qA);function $A({color:A,ring:t}){return e.jsx("span",{className:"shrink-0 rounded-full",style:{width:14,height:14,backgroundColor:t?"transparent":A,border:t?`4px solid ${A}`:void 0,boxSizing:"border-box"}})}function Ae({color:A}){return e.jsx("span",{className:"shrink-0 rounded-sm",style:{width:16,height:3,backgroundColor:A}})}function ee({indicator:A,label:r,tooltip:n}){const o="light"===XA();return e.jsxs("div",{className:"flex items-center gap-1.5",children:[A,e.jsx("span",{className:t(!o&&"text-text-secondary"),style:o?{color:ZA}:void 0,children:r}),n&&e.jsx(x,{content:n,delay:200,children:e.jsx("span",{className:t("cursor-help text-[10px] opacity-60 hover:opacity-100 transition-opacity",!o&&"text-text-muted"),style:o?{color:KA}:void 0,children:"ⓘ"})})]})}function te({title:A,tooltip:r,isOpen:n,onToggle:o,showDivider:i,children:a}){const s="light"===XA();return e.jsxs("div",{className:i?"mt-2 pt-2 border-t":"",style:i?{borderColor:s?JA:"var(--map-ui-border)"}:void 0,children:[e.jsxs("button",{type:"button",onClick:o,className:t("group w-full flex items-center justify-between py-1 font-medium transition-colors",!s&&"text-text-secondary hover:text-text-primary"),style:s?{color:ZA}:void 0,children:[e.jsxs("span",{className:"flex items-center gap-1",children:[A,e.jsx(x,{content:r,delay:200,children:e.jsx("span",{className:t("cursor-help text-[10px] opacity-60 group-hover:opacity-100 transition-opacity",!s&&"text-text-muted"),style:s?{color:KA}:void 0,children:"ⓘ"})})]}),e.jsx(k.span,{animate:{rotate:n?0:-90},transition:{duration:.15},children:e.jsx(C,{className:"w-3 h-3",style:s?{color:KA}:{color:"var(--text-muted)"}})})]}),e.jsx(B,{initial:!1,children:n&&e.jsx(k.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:WA,className:"overflow-hidden",children:e.jsx("div",{className:"flex flex-col gap-1 pt-1.5",children:a})})})]})}function re({label:A,value:r,color:n}){const o="light"===XA();return e.jsxs("div",{className:t("flex justify-between tabular-nums",!o&&"text-text-muted"),style:o?{color:KA}:void 0,children:[e.jsx("span",{children:A}),e.jsx("span",{style:n?{color:n}:o?{color:ZA}:{color:"var(--text-secondary)"},children:r})]})}function ne({icon:A,color:r,title:n,subtitle:o}){const i="light"===XA();return e.jsx("div",{className:"mt-1.5 pt-1.5 border-t",style:{borderColor:i?JA:"var(--map-ui-border)"},children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"shrink-0",style:{color:r},children:A}),e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx("span",{className:"font-medium truncate",style:{color:r},children:n}),e.jsx("span",{className:t("text-[10px] leading-tight",!i&&"text-text-muted"),style:i?{color:KA}:void 0,children:o})]})]})})}function oe({showTopology:t,validatedPolylineCount:r,filteredNeighborCount:n,hasLocalNode:o,meshTopology:i,zeroHopNeighbors:a,neighborsWithLocation:s,basemapMode:l="dark"}){const c=tA(),u=v(),d=y(),g=u.filter(A=>A.isLikelyReal).length,h=function(A){let e=0;for(const t of A.txDelayRecommendations.values())"backbone"===t.networkRole&&e++;return e}(i),m=a.size>0,[b,p]=A.useState(!0),[x,k]=A.useState(!0),[C,B]=A.useState(!0);return e.jsx(qA.Provider,{value:l,children:e.jsxs("div",{className:"map-control-glass p-2.5 text-xs",children:[e.jsxs(te,{title:"Nodes",tooltip:"Node type shown by shape + color. Yellow = direct RF neighbor.",isOpen:b,onToggle:()=>p(A=>!A),children:[e.jsx(ee,{indicator:e.jsx($A,{color:c.nodeFill}),label:"Node",tooltip:"Standard mesh node. Repeater, client, or companion device."}),e.jsx(ee,{indicator:e.jsx($A,{color:c.hubColor}),label:"Hub",tooltip:"Network hub (≥10% of last-hop traffic)."}),(M=s,M.some(([,A])=>{var e;const t=null==(e=A.contact_type)?void 0:e.toLowerCase();return"room server"===t||"room_server"===t||"room"===t||"server"===t})&&e.jsx(ee,{indicator:e.jsx(nA,{className:"w-3 h-3 shrink-0",style:{color:c.roomColor},strokeWidth:2.5}),label:"Room",tooltip:"Room Server identity for client sync."})),e.jsx(ee,{indicator:e.jsx(iA,{className:"w-3 h-3 shrink-0",style:{color:c.localColor},strokeWidth:2.5}),label:"Local",tooltip:"Your repeater running pyMC_Repeater."}),m&&e.jsx(ee,{indicator:e.jsx($A,{color:c.neighborColor}),label:"Neighbor",tooltip:"Zero-hop direct RF contact."}),i.gatewayNodes.length>0&&e.jsx(ee,{indicator:e.jsx($A,{color:c.gatewayColor}),label:"Gateway",tooltip:"Significant forwarder (7-10% traffic)."}),h>0&&e.jsx(ee,{indicator:e.jsx($A,{color:c.hubColor}),label:"Backbone",tooltip:"Critical relay with high centrality."}),i.mobileNodes.length>0&&e.jsx(ee,{indicator:e.jsx($A,{color:c.mobileColor,ring:!0}),label:"Mobile",tooltip:"Volatile node that appears/disappears."}),g>0&&e.jsx(ee,{indicator:e.jsx(w,{className:"w-3 h-3 shrink-0",style:{color:c.ghostColor},strokeWidth:2.5}),label:`Ghost (${g})`,tooltip:"Unknown repeater from Viterbi analysis."})]}),m&&e.jsxs(te,{title:"Link Quality",tooltip:"Neighbor edge colors based on bidirectional balance.",isOpen:x,onToggle:()=>k(A=>!A),showDivider:!0,children:[e.jsx(ee,{indicator:e.jsx(Ae,{color:f.YELLOW}),label:"2-Way",tooltip:"33-67% balanced. Ideal bidirectional link."}),e.jsx(ee,{indicator:e.jsx(Ae,{color:f.GREEN}),label:"Listener",tooltip:">67% listener. They hear us well."}),e.jsx(ee,{indicator:e.jsx(Ae,{color:f.RED}),label:"Loud",tooltip:"<33% listener. They route more to us."})]}),t&&r>0&&e.jsxs(te,{title:"Topology",tooltip:"Links with 5+ validations. Thickness = strength.",isOpen:C,onToggle:()=>B(A=>!A),showDivider:!0,children:[e.jsx(re,{label:"Nodes",value:n+(o?1:0)}),i.hubNodes.length>0&&e.jsx(re,{label:"Hubs",value:i.hubNodes.length,color:UA.hubColor}),i.loops.length>0&&e.jsx(ne,{icon:e.jsx(aA,{className:"w-3 h-3"}),color:UA.edges.hoverLoop,title:`${i.loops.length} ${1===i.loops.length?"Loop":"Loops"}`,subtitle:"Redundant paths"}),d.totalPaths>0&&e.jsx(ne,{icon:e.jsx(sA,{className:"w-3 h-3"}),color:c.ghostColor,title:`${d.totalPaths.toLocaleString()} Viterbi`,subtitle:"HMM decoded paths"})]})]})});var M}function ie({mapRef:A,showNeighborLines:t,onToggleNeighborLines:r,hasNeighborPolylines:n,nodeFilter:o,onNodeFilterChange:i,hasHubNodes:a,hasZeroHopNeighbors:s,showCoverage:l,onToggleCoverage:c,showMinCut:u=!1,onToggleMinCut:d,hasMinCutData:f=!1,show3DTerrain:m,onToggle3DTerrain:b,basemapMode:p,onToggleBasemap:v,isFullscreen:y,onToggleFullscreen:w}){const x="w-4 h-4",k="light"===p?"#737373":void 0;return e.jsx(e.Fragment,{children:e.jsxs("div",{className:"absolute top-3 right-3 z-[600] flex flex-col gap-2 sm:top-4 sm:right-4",children:[e.jsxs("div",{className:"map-control-glass flex items-center gap-1 p-1",children:[n&&e.jsx(M,{plain:!0,color:t?"warning":"muted",onClick:r,title:t?"Hide edge lines":"Show edge lines","aria-label":t?"Hide edge lines":"Show edge lines","aria-pressed":t,className:"!p-1.5 !rounded-md",children:e.jsx(D,{className:x})}),e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx(E,{color:"all"===o?"green":"zinc",customColor:"all"!==o?k:void 0,onClick:()=>i("all"),title:"Show all nodes",children:"All"}),a&&e.jsx(E,{color:"hubs"===o?"green":"zinc",customColor:"hubs"!==o?k:void 0,onClick:()=>i("hubs"),title:"Show only hub nodes and their connections",children:"Hubs"}),s&&e.jsx(E,{color:"direct"===o?"green":"zinc",customColor:"direct"!==o?k:void 0,onClick:()=>i("direct"),title:"Show only zero-hop (direct RF) neighbors",children:"Direct"})]}),f&&d&&e.jsx(M,{plain:!0,color:u?"primary":"muted",onClick:d,title:u?"Hide community partition":"Show community partition","aria-label":u?"Hide community partition":"Show community partition","aria-pressed":u,className:"!p-1.5 !rounded-md",children:e.jsx(QA,{className:x})}),e.jsx(M,{plain:!0,color:"light"===p?"primary":"muted",onClick:v,title:"light"===p?"Switch to dark map":"Switch to light map","aria-label":"light"===p?"Switch to dark map":"Switch to light map","aria-pressed":"light"===p,className:"!p-1.5 !rounded-md",children:"light"===p?e.jsx(g,{className:x}):e.jsx(h,{className:x})}),e.jsx(M,{plain:!0,color:m?"success":"muted",onClick:b,title:m?"Disable 3D terrain":"Enable 3D terrain","aria-label":m?"Disable 3D terrain":"Enable 3D terrain","aria-pressed":m,className:"!p-1.5 !rounded-md",children:e.jsx(PA,{className:x})}),e.jsx(M,{plain:!0,color:"muted",onClick:w,title:y?"Exit fullscreen":"Fullscreen","aria-label":y?"Exit fullscreen":"Enter fullscreen","aria-pressed":y,className:"!p-1.5 !rounded-md",children:y?e.jsx(K,{className:x}):e.jsx(J,{className:x})})]}),e.jsxs("div",{className:"map-control-glass flex flex-col items-stretch !overflow-hidden self-end !p-0",children:[e.jsx(M,{plain:!0,color:"muted",onClick:()=>{var e,t;null==(t=null==(e=A.current)?void 0:e.getMap())||t.zoomIn()},title:"Zoom in","aria-label":"Zoom in",className:"!p-1.5 !rounded-none",children:e.jsx(V,{className:x})}),e.jsx("div",{className:"h-px bg-border-subtle"}),e.jsx(M,{plain:!0,color:"muted",onClick:()=>{var e,t;null==(t=null==(e=A.current)?void 0:e.getMap())||t.zoomOut()},title:"Zoom out","aria-label":"Zoom out",className:"!p-1.5 !rounded-none",children:e.jsx(oA,{className:x})}),e.jsx("div",{className:"h-px bg-border-subtle"}),e.jsx(M,{plain:!0,color:"muted",onClick:()=>{var e;const t=null==(e=A.current)?void 0:e.getMap();t&&t.easeTo({bearing:0,pitch:0,duration:300})},title:"Reset bearing to north","aria-label":"Reset bearing to north",className:"!p-1.5 !rounded-none",children:e.jsx(lA,{className:x})})]})]})})}const ae="DeepAnalysis";function se(){return"abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())]}function le({isActive:t,hasAnalyzed:r,isLoading:n,onClick:o,basemapMode:i="dark"}){const a="light"===i,s=a?"#4A4A4A":void 0,l=a?"#16A34A":"#4ADE80",[c,u]=A.useState(!1),[d,f]=A.useState(ae),g=A.useRef(!1),h=A.useRef(null),[m]=A.useState(()=>{var A;return"undefined"!=typeof window&&((null==(A=window.matchMedia)?void 0:A.call(window,"(hover: hover)").matches)??!1)}),b=c&&!t&&!n&&m;A.useEffect(()=>{if(c&&!t&&!n&&!g.current){g.current=!0;const A=performance.now(),e=t=>{const r=t-A,n=Math.min(r/700,1),o=Math.floor(12*n);let i="";for(let A=0;A<12;A++)i+=A{h.current&&cancelAnimationFrame(h.current)}},[c,t,n]);const p=n?"Analyzing...":d;return e.jsxs("button",{onClick:o,onMouseEnter:()=>m&&u(!0),onMouseLeave:()=>m&&u(!1),onPointerEnter:()=>m&&u(!0),onPointerLeave:()=>m&&u(!1),disabled:n,className:"flex items-center gap-2 w-full text-left radius-inner transition-base "+(n?"cursor-wait":""),style:{padding:"0.5rem 0.625rem",backgroundColor:t?a?"rgba(220, 252, 231, 1)":"rgba(10, 26, 10, 1)":"var(--map-ui-bg, var(--bg-surface))"},title:n?"Analyzing packet history...":r?t?"Hide topology edges":"Show topology edges":"Load full packet history and build topology",children:[n?e.jsx(cA,{className:"w-3.5 h-3.5 flex-shrink-0 animate-spin",style:{color:l}}):e.jsx(uA,{className:"w-3.5 h-3.5 flex-shrink-0 transition-colors "+(t?"":"text-text-secondary"),style:{...t&&{color:l},...b&&{color:l},...!t&&!b&&s&&{color:s}}}),e.jsx("span",{className:t?"":"text-text-secondary",style:{fontFamily:"ui-monospace, SFMono-Regular, monospace",fontSize:"0.6875rem",fontWeight:t||b?700:500,letterSpacing:"-0.01em",lineHeight:1,...t&&{color:l},...b&&{color:l},...!t&&!b&&s&&{color:s}},children:p})]})}function ce({isActive:t,onClick:r,basemapMode:n="dark"}){const o="light"===n,i=o?"#4A4A4A":void 0,a=o?"#0D7377":"#12A594",[s,l]=A.useState(!1),[c,u]=A.useState(0),d=A.useRef(!1),f=A.useRef(null),[g,h]=A.useState(0),m=A.useRef(!1),[b]=A.useState(()=>{var A;return"undefined"!=typeof window&&((null==(A=window.matchMedia)?void 0:A.call(window,"(hover: hover)").matches)??!1)}),p=s&&!t&&b;A.useEffect(()=>{p&&!m.current&&(m.current=!0,h(1),setTimeout(()=>h(2),100),setTimeout(()=>h(3),200)),s||(m.current=!1,h(0))},[p,s]),A.useEffect(()=>{if(s&&!t&&!d.current){d.current=!0;const A=performance.now(),e=t=>{const r=t-A,n=Math.min(r/400,1);u(n),n<1&&(f.current=requestAnimationFrame(e))};f.current=requestAnimationFrame(e)}return s||(f.current&&(cancelAnimationFrame(f.current),f.current=null),d.current=!1,u(0)),()=>{f.current&&cancelAnimationFrame(f.current)}},[s,t]);const v=A=>{if(t)return a;if(!p)return i;const e=11*c;return A>=e-2&&Ab&&l(!0),onMouseLeave:()=>b&&l(!1),onPointerEnter:()=>b&&l(!0),onPointerLeave:()=>b&&l(!1),className:"flex items-center gap-2 w-full text-left radius-inner transition-base",style:{padding:"0.5rem 0.625rem",backgroundColor:t?o?"rgba(204, 251, 241, 1)":"rgba(10, 36, 32, 1)":"var(--map-ui-bg, var(--bg-surface))"},title:t?"Disable live packet tracing (reduces CPU usage)":"Enable live packet tracing",children:[e.jsx(dA,{className:"w-3.5 h-3.5 flex-shrink-0 "+(t?"":"text-text-secondary"),fill:1===g?"#FFFFFF":3===g?a:"none",stroke:1===g||2===g?"#FFFFFF":t||p?a:i||"currentColor",style:{transition:"fill 0.05s, stroke 0.05s"}}),e.jsx("span",{className:t?"":"text-text-secondary",style:{fontFamily:"ui-monospace, SFMono-Regular, monospace",fontSize:"0.6875rem",fontWeight:t||p?700:500,letterSpacing:"-0.01em",lineHeight:1},children:"LiveTrace".split("").map((A,t)=>e.jsx("span",{style:{color:v(t)||void 0},children:A},t))})]})}const ue="rgba(0, 0, 0, 0.06)",de="rgba(0, 0, 0, 0.25)",fe="#fe8019";function ge({isActive:t,onClick:r,brightness:n=.7,onBrightnessChange:o,basemapMode:i="dark"}){const a="light"===i,s=a?"#4A4A4A":void 0,[l,c]=A.useState(!1),[u,d]=A.useState(!1),[f]=A.useState(()=>{var A;return"undefined"!=typeof window&&((null==(A=window.matchMedia)?void 0:A.call(window,"(hover: hover)").matches)??!1)});A.useEffect(()=>{fA()},[]),A.useEffect(()=>{if(!l||t)return;const A=requestAnimationFrame(()=>d(!0)),e=setTimeout(()=>d(!1),80);return()=>{cancelAnimationFrame(A),clearTimeout(e)}},[l,t]);const m=Math.max(.01,Math.min(1,n)),b=m<.999,p=m>.011,v=l&&!t&&f;return e.jsxs("button",{onClick:r,onMouseEnter:()=>f&&c(!0),onMouseLeave:()=>f&&c(!1),onPointerEnter:()=>f&&c(!0),onPointerLeave:()=>f&&c(!1),className:"flex items-center gap-2 w-full text-left radius-inner transition-base",style:{padding:"0.5rem 0.625rem",backgroundColor:t?a?"rgba(254, 243, 199, 1)":"rgba(26, 20, 8, 1)":"var(--map-ui-bg, var(--bg-surface))"},title:t?"Configure wardriving coverage":"Show wardriving coverage",children:[e.jsx(LA,{className:"w-3.5 h-3.5 flex-shrink-0 transition-colors "+(t?"text-amber-400":"text-text-secondary"),style:v?{color:fe}:!t&&s?{color:s}:void 0}),e.jsx("span",{className:t?"text-amber-400":"text-text-secondary",style:{fontFamily:t||v?"'Jacquard 12', serif":"ui-monospace, SFMono-Regular, monospace",fontSize:t||v?"0.75rem":"0.6875rem",fontWeight:500,letterSpacing:"-0.01em",lineHeight:1,transition:"none",transform:t?"scale(1.45)":v?`scale(${u?1.595:1.45})`:void 0,transformOrigin:"left center",...v?{color:fe}:!t&&s?{color:s}:{}},children:"Wardrive"}),t&&o&&e.jsxs("div",{className:"ml-auto flex items-center gap-0.5",children:[e.jsx("button",{onClick:A=>{A.stopPropagation();const e=Math.max(.01,m-.2);null==o||o(e)},disabled:!p,className:"p-0.5 rounded transition-colors "+(p?"text-amber-400":"cursor-not-allowed"),style:{...p&&{"--hover-bg":a?ue:"var(--bg-elevated)"},...!p&&{color:a?de:"rgba(251, 191, 36, 0.3)"}},onMouseEnter:A=>p&&(A.currentTarget.style.backgroundColor=a?ue:"var(--bg-elevated)"),onMouseLeave:A=>A.currentTarget.style.backgroundColor="transparent",title:`Decrease opacity (${Math.round(100*m)}%)`,children:e.jsx(h,{className:"w-3.5 h-3.5"})}),e.jsx("button",{onClick:A=>{A.stopPropagation();const e=Math.min(1,m+.2);null==o||o(e)},disabled:!b,className:"p-0.5 rounded transition-colors "+(b?"text-amber-400":"cursor-not-allowed"),style:{...b&&{"--hover-bg":a?ue:"var(--bg-elevated)"},...!b&&{color:a?de:"rgba(251, 191, 36, 0.3)"}},onMouseEnter:A=>b&&(A.currentTarget.style.backgroundColor=a?ue:"var(--bg-elevated)"),onMouseLeave:A=>A.currentTarget.style.backgroundColor="transparent",title:`Increase opacity (${Math.round(100*m)}%)`,children:e.jsx(g,{className:"w-3.5 h-3.5"})})]})]})}function he(A){let e=!0,t=-90,r=90,n=-180,o=180;for(const i of A.toLowerCase()){const A="0123456789bcdefghjkmnpqrstuvwxyz".indexOf(i);if(-1!==A)for(let i=4;i>=0;i--){const a=A>>i&1;if(e){const A=(n+o)/2;a?n=A:o=A}else{const A=(t+r)/2;a?t=A:r=A}e=!e}}return{lat:(t+r)/2,lon:(n+o)/2}}function me(A){return Math.exp(-A*Math.LN2/7)}const be="pymc-wardriving-url",pe="pymc-wardriving-enabled",ve="pymc-wardriving-brightness";function ye(A){"undefined"!=typeof localStorage&&(A?localStorage.setItem(be,A):localStorage.removeItem(be))}function we(A){"undefined"!=typeof localStorage&&localStorage.setItem(pe,String(A))}function xe(){if("undefined"==typeof localStorage)return.7;const A=localStorage.getItem(ve);if(A){const e=parseFloat(A);if(!isNaN(e)&&e>=.01&&e<=1)return e}return.7}function ke(A,e=null){if(null!==A){const t=(Math.max(-12,Math.min(12,A))+12)/24;return null!==e?.8*t+(Math.max(-120,Math.min(-50,e))+120)/70*.2:t}return null!==e?(Math.max(-120,Math.min(-50,e))+120)/70:.5}const Ce=mA((A,e)=>({status:"idle",isVisible:"undefined"!=typeof localStorage&&"true"===localStorage.getItem(pe),coveragePoints:[],repeaters:[],error:null,stats:{coverageCount:0,repeaterCount:0,lastUpdated:null},url:"undefined"==typeof localStorage?"":localStorage.getItem(be)||"",brightness:xe(),isModalOpen:!1,openModal:()=>A({isModalOpen:!0}),closeModal:()=>A({isModalOpen:!1}),setUrl:e=>A({url:e}),setBrightness:e=>{const t=Math.max(.01,Math.min(1,e));!function(A){if("undefined"==typeof localStorage)return;const e=Math.max(.01,Math.min(1,A));localStorage.setItem(ve,String(e))}(t),A({brightness:t})},toggleVisibility:()=>{const t=!e().isVisible;we(t),A({isVisible:t})},setVisible:e=>{we(e),A({isVisible:e})},loadCoverage:async e=>{if(!e.trim())return A({error:"Please enter a URL",status:"error"}),!1;try{new URL(e.trim())}catch{return A({error:"Invalid URL format",status:"error"}),!1}A({error:null,status:"connecting"});try{A({status:"loading"});const t=await async function(A){const e=`${A.replace(/\/+$/,"").replace(/\/get-nodes$/,"").replace(/\/get-samples$/,"")}/get-samples`,t=await async function(A,e={},t=8e3){const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{return await fetch(A,{...e,signal:r.signal})}catch(o){if(o instanceof Error&&"AbortError"===o.name)throw new Error(`Connection timed out after ${t/1e3}s`);throw o}finally{clearTimeout(n)}}(e,{headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch precise samples: ${t.status}`);return t.json()}(e.trim());if(!t||"object"!=typeof t)throw new Error("Invalid response from server");if(!Array.isArray(t.keys))throw new Error("No sample data found in response");A({status:"processing"});const r=function(A){var e;const t=[];for(const r of A.keys){if(!r.observed)continue;const{lat:A,lon:n}=he(r.hash),o=parseInt(r.time,10),i=isNaN(o)?30:(Date.now()-o)/864e5,a=me(i),s=ke(r.snr,r.rssi)*(.3+.7*a);t.push({lat:A,lon:n,successRate:r.observed?1:0,weight:s,totalSamples:1,ageDays:i,geohash:r.hash,repeaters:(null==(e=r.path)?void 0:e.map(A=>A.toLowerCase()))||[]})}return t}(t);if(0===r.length)throw new Error("No valid coverage points found");return A({coveragePoints:r,repeaters:[],stats:{coverageCount:r.length,repeaterCount:0,lastUpdated:new Date},status:"success",isVisible:!0,url:e.trim()}),ye(e.trim()),we(!0),!0}catch(t){const e=t instanceof Error?t.message:"Failed to load coverage data";let r=e;return e.includes("timed out")?r="Connection timed out. Server may be unreachable or slow.":e.includes("Failed to fetch")||e.includes("NetworkError")?r="Could not connect to server. Check the URL and try again.":e.includes("CORS")?r="Server does not allow cross-origin requests.":e.includes("404")?r="Coverage endpoint not found. Check the URL.":(e.includes("ERR_NAME_NOT_RESOLVED")||e.includes("DNS"))&&(r="Server not found. Check the URL for typos."),A({error:r,status:"error"}),!1}},clearCoverage:()=>{A({coveragePoints:[],repeaters:[],stats:{coverageCount:0,repeaterCount:0,lastUpdated:null},status:"idle",error:null,isVisible:!1,url:""}),ye(""),we(!1)}})),Be={bg:"#F8F8F8",bgSubtle:"#F0F0F0",bgElevated:"#FFFFFF",bgInput:"#FFFFFF",border:"rgba(0, 0, 0, 0.12)",borderStrong:"rgba(0, 0, 0, 0.20)",borderFocus:"#3B82F6",text:"#1A1A1A",textSecondary:"#4A4A4A",textMuted:"#737373",success:"#059669",successBg:"#ECFDF5",successBorder:"#A7F3D0",error:"#DC2626",errorBg:"#FEF2F2",errorBorder:"#FECACA",info:"#2563EB",infoBg:"#EFF6FF",infoBorder:"#BFDBFE",warning:"#D97706",warningBg:"#FFFBEB",warningBorder:"#FDE68A",primary:"#F59E0B",hoverBg:"rgba(0, 0, 0, 0.04)",sliderTrack:"#E5E7EB",sliderThumb:"#F59E0B"},Me={bg:"var(--bg-surface)",bgSubtle:"var(--bg-subtle)",bgElevated:"var(--bg-elevated)",bgInput:"var(--bg-subtle)",border:"var(--border-subtle)",borderStrong:"var(--border-strong)",borderFocus:"var(--accent-primary)",text:"var(--text-primary)",textSecondary:"var(--text-secondary)",textMuted:"var(--text-muted)",success:"var(--accent-success)",successBg:"rgba(74, 222, 128, 0.1)",successBorder:"rgba(74, 222, 128, 0.3)",error:"var(--accent-danger)",errorBg:"rgba(239, 68, 68, 0.1)",errorBorder:"rgba(239, 68, 68, 0.3)",info:"var(--accent-secondary)",infoBg:"rgba(249, 210, 111, 0.1)",infoBorder:"rgba(249, 210, 111, 0.3)",warning:"var(--accent-secondary)",warningBg:"rgba(249, 210, 111, 0.1)",warningBorder:"rgba(249, 210, 111, 0.3)",primary:"var(--accent-secondary)",hoverBg:"var(--hover-tint)",sliderTrack:"var(--bg-elevated)",sliderThumb:"var(--accent-secondary)"},De=A.createContext({theme:Me,isLight:!1});function Ee(){return A.useContext(De)}const je={type:"spring",visualDuration:.6,bounce:.25,opacity:{duration:.2,ease:"linear"}};function Qe({value:t,format:r,className:n,style:o}){const[i,a]=A.useState("waiting");if(A.useEffect(()=>{const A=setTimeout(()=>a("mounted"),400);return()=>clearTimeout(A)},[]),A.useEffect(()=>{if("mounted"===i){const A=requestAnimationFrame(()=>a("animating"));return()=>cancelAnimationFrame(A)}},[i]),"waiting"===i){const A=(0).toLocaleString(void 0,r);return e.jsx("span",{className:n,style:o,children:A})}return e.jsx(hA,{className:n,style:o,format:r,transition:je,children:"animating"===i?t:0})}function Ne({status:t,hasData:r}){const{theme:n,isLight:o}=Ee(),i=A.useMemo(()=>"connecting"===t||"loading"===t||"processing"===t?{icon:e.jsx(cA,{className:"w-3.5 h-3.5 animate-spin"}),label:"connecting"===t?"Connecting...":"loading"===t?"Loading...":"Processing...",color:n.warning,bg:n.warningBg}:"error"===t?{icon:e.jsx(RA,{className:"w-3.5 h-3.5"}),label:"Disconnected",color:n.error,bg:n.errorBg}:r?{icon:e.jsx(IA,{className:"w-3.5 h-3.5"}),label:"Connected",color:n.success,bg:n.successBg}:{icon:e.jsx(Q,{className:"w-3.5 h-3.5"}),label:"Ready",color:n.textMuted,bg:o?"rgba(0,0,0,0.04)":"rgba(255,255,255,0.04)"},[t,r,n,o]);return e.jsxs(k.div,{initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},className:"flex items-center gap-1.5 px-2 py-1 rounded-full text-xs font-medium",style:{backgroundColor:i.bg,color:i.color},children:[i.icon,e.jsx("span",{children:i.label})]},i.label)}function Se({status:t}){const{theme:r}=Ee(),n=A.useMemo(()=>{switch(t){case"connecting":return 25;case"loading":return 60;case"processing":return 90;default:return 0}},[t]);return 0===n?null:e.jsx(k.div,{initial:{opacity:0,scaleY:0},animate:{opacity:1,scaleY:1},exit:{opacity:0,scaleY:0},className:"h-1 rounded-full overflow-hidden origin-top",style:{backgroundColor:r.sliderTrack},children:e.jsx(k.div,{className:"h-full rounded-full",style:{backgroundColor:r.primary},initial:{width:0},animate:{width:`${n}%`},transition:{duration:.4,ease:"easeOut"}})})}function Fe({variant:t,title:r,description:n,onDismiss:o}){const{theme:i}=Ee(),a=A.useMemo(()=>{switch(t){case"success":return{icon:e.jsx(vA,{className:"w-4 h-4"}),color:i.success,bg:i.successBg,border:i.successBorder};case"error":return{icon:e.jsx(NA,{className:"w-4 h-4"}),color:i.error,bg:i.errorBg,border:i.errorBorder};case"info":return{icon:e.jsx(FA,{className:"w-4 h-4"}),color:i.info,bg:i.infoBg,border:i.infoBorder}}},[t,i]);return e.jsxs(k.div,{initial:{opacity:0,y:-8},animate:{opacity:1,y:0},exit:{opacity:0,y:-8},transition:gA.snappy,className:"flex items-start gap-3 p-3 rounded-lg border",style:{backgroundColor:a.bg,borderColor:a.border,color:a.color},children:[e.jsx("div",{className:"flex-shrink-0 mt-0.5",children:a.icon}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium",children:r}),n&&e.jsx("p",{className:"text-xs mt-0.5 opacity-80",children:n})]}),o&&e.jsx("button",{onClick:o,className:"flex-shrink-0 p-1 rounded hover:bg-black/10 transition-colors","aria-label":"Dismiss",children:e.jsx(N,{className:"w-3.5 h-3.5"})})]})}function Pe({value:r,onChange:n,onSubmit:o,disabled:i}){const{theme:a,isLight:s}=Ee(),[l,c]=A.useState(!1);return e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"block text-sm font-medium",style:{color:a.textSecondary},children:"Coverage Server URL"}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:"url",value:r,onChange:A=>n(A.target.value),onKeyDown:A=>{"Enter"!==A.key||A.shiftKey||i||(A.preventDefault(),o())},onFocus:()=>c(!0),onBlur:()=>c(!1),placeholder:"https://coverage.wcmesh.com",disabled:i,className:t("w-full pl-3 pr-10 py-2.5 rounded-lg border text-sm transition-all duration-150","focus:outline-none",i&&"opacity-50 cursor-not-allowed"),style:{backgroundColor:a.bgInput,borderColor:l?a.borderFocus:a.border,color:a.text,boxShadow:l?"0 0 0 3px "+(s?"rgba(59, 130, 246, 0.15)":"rgba(139, 92, 246, 0.15)"):"none"}}),r&&!i&&e.jsx("button",{onClick:()=>n(""),className:"absolute right-2.5 top-1/2 -translate-y-1/2 p-1 rounded transition-colors",style:{color:a.textMuted},onMouseEnter:A=>A.currentTarget.style.color=a.text,onMouseLeave:A=>A.currentTarget.style.color=a.textMuted,"aria-label":"Clear URL",children:e.jsx(N,{className:"w-4 h-4"})})]}),e.jsx("p",{className:"text-xs",style:{color:a.textMuted},children:"Press Enter to connect, or use the Connect button below"})]})}function Te({value:A,onChange:r}){const{theme:n,isLight:o}=Ee(),i=Math.round(100*A);return e.jsx(k.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},transition:gA.gentle,className:"overflow-hidden",children:e.jsx("div",{className:"p-3 rounded-lg border",style:{backgroundColor:n.bgSubtle,borderColor:n.border},children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"relative w-4 h-4",children:[e.jsx(h,{className:"w-4 h-4 absolute inset-0 transition-opacity",style:{color:n.textMuted,opacity:A<.5?1:0}}),e.jsx(g,{className:"w-4 h-4 absolute inset-0 transition-opacity",style:{color:n.primary,opacity:A>=.5?1:0}})]}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[e.jsx("span",{className:"text-xs font-medium",style:{color:n.textSecondary},children:"Layer Opacity"}),e.jsxs("span",{className:"text-xs font-mono tabular-nums px-1.5 py-0.5 rounded",style:{color:n.text,backgroundColor:o?"rgba(0,0,0,0.06)":"rgba(255,255,255,0.06)"},children:[i,"%"]})]}),e.jsx("input",{type:"range",min:5,max:100,value:i,onChange:A=>r(Number(A.target.value)/100),className:t("w-full h-2 rounded-full appearance-none cursor-pointer","[&::-webkit-slider-thumb]:appearance-none","[&::-webkit-slider-thumb]:w-4","[&::-webkit-slider-thumb]:h-4","[&::-webkit-slider-thumb]:rounded-full","[&::-webkit-slider-thumb]:cursor-pointer","[&::-webkit-slider-thumb]:transition-transform","[&::-webkit-slider-thumb]:hover:scale-110","[&::-webkit-slider-thumb]:shadow-lg","[&::-moz-range-thumb]:appearance-none","[&::-moz-range-thumb]:w-4","[&::-moz-range-thumb]:h-4","[&::-moz-range-thumb]:rounded-full","[&::-moz-range-thumb]:border-0","[&::-moz-range-thumb]:cursor-pointer"),style:{background:`linear-gradient(to right, ${n.primary} ${i}%, ${n.sliderTrack} ${i}%)`,"--thumb-color":n.sliderThumb}}),e.jsx("style",{children:`\n input[type="range"]::-webkit-slider-thumb {\n background-color: ${n.sliderThumb};\n }\n input[type="range"]::-moz-range-thumb {\n background-color: ${n.sliderThumb};\n }\n `})]})]})})})}function Le({coverageCount:A,repeaterCount:t,lastUpdated:r}){const{theme:n}=Ee();return e.jsxs("div",{className:"grid grid-cols-3 gap-2 p-3 rounded-lg border",style:{backgroundColor:n.bgSubtle,borderColor:n.border},children:[e.jsxs("div",{className:"text-center",children:[e.jsx(Qe,{value:A,format:{useGrouping:!0,maximumFractionDigits:0},className:"text-lg font-semibold tabular-nums block",style:{color:n.text}}),e.jsx("div",{className:"text-xs mt-0.5",style:{color:n.textMuted},children:"Points"})]}),e.jsxs("div",{className:"text-center border-x",style:{borderColor:n.border},children:[e.jsx(Qe,{value:t,format:{useGrouping:!0,maximumFractionDigits:0},className:"text-lg font-semibold tabular-nums block",style:{color:n.text}}),e.jsx("div",{className:"text-xs mt-0.5",style:{color:n.textMuted},children:"Repeaters"})]}),e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5",style:{color:n.textMuted}}),e.jsx("span",{className:"text-lg font-semibold tabular-nums",style:{color:n.text},children:r?r.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"—"})]}),e.jsx("div",{className:"text-xs mt-0.5",style:{color:n.textMuted},children:"Updated"})]})]})}function Re({icon:r,label:n,onClick:o,disabled:i,variant:a="default",active:s}){const{theme:l,isLight:c}=Ee(),u=A.useMemo(()=>"danger"===a?{text:l.error,hoverBg:c?"rgba(220, 38, 38, 0.08)":"rgba(239, 68, 68, 0.15)"}:{text:s?l.primary:l.textSecondary,hoverBg:l.hoverBg},[a,s,l,c]);return e.jsxs("button",{onClick:o,disabled:i,className:t("flex items-center gap-1.5 px-2.5 py-1.5 rounded-md text-sm font-medium transition-colors",i&&"opacity-50 cursor-not-allowed"),style:{color:u.text},onMouseEnter:A=>!i&&(A.currentTarget.style.backgroundColor=u.hoverBg),onMouseLeave:A=>A.currentTarget.style.backgroundColor="transparent",children:[r,e.jsx("span",{children:n})]})}function Ie(){const t=n(),r="light"===t,o=r?Be:Me,{isModalOpen:i,closeModal:a,status:s,isVisible:l,stats:c,error:u,url:d,brightness:f,loadCoverage:g,clearCoverage:h,toggleVisibility:m,setUrl:b,setBrightness:p}=Ce(),v="connecting"===s||"loading"===s||"processing"===s,y=c.coverageCount>0,[w,x]=A.useState(!0),[C,D]=A.useState(d);A.useEffect(()=>{D(d)},[d]),A.useEffect(()=>{"error"===s&&x(!0)},[s]);const E=A.useCallback(async()=>{await g(C)},[C,g]),F=A.useCallback(()=>{D(""),h()},[h]),P=A.useCallback(A=>{D(A),b(A)},[b]),T=A.useCallback(()=>{v||a()},[v,a]),L=C.trim().length>0&&!v;return e.jsx(De.Provider,{value:{theme:o,isLight:r},children:e.jsxs(j,{open:i,onClose:T,size:"md",bottomSheet:!0,basemapMode:t,children:[e.jsxs("div",{className:"flex items-center justify-between p-4 border-b",style:{borderColor:o.border},children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg",style:{backgroundColor:o.bgSubtle,color:o.primary},children:e.jsx(Q,{className:"w-5 h-5"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-semibold",style:{color:o.text},children:"Wardriving Coverage"}),e.jsx("p",{className:"text-xs",style:{color:o.textMuted},children:"RF coverage heatmap overlay"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ne,{status:s,hasData:y}),!v&&e.jsx("button",{onClick:T,className:"p-2 rounded-lg transition-colors",style:{color:o.textMuted},onMouseEnter:A=>{A.currentTarget.style.color=o.text,A.currentTarget.style.backgroundColor=o.hoverBg},onMouseLeave:A=>{A.currentTarget.style.color=o.textMuted,A.currentTarget.style.backgroundColor="transparent"},"aria-label":"Close",children:e.jsx(N,{className:"w-5 h-5"})})]})]}),e.jsx(B,{children:v&&e.jsx(Se,{status:s})}),e.jsxs(S,{className:"space-y-4",children:[e.jsx(Pe,{value:C,onChange:P,onSubmit:E,disabled:v}),e.jsx(B,{children:"error"===s&&u&&w&&e.jsx(Fe,{variant:"error",title:"Connection Failed",description:u,onDismiss:()=>x(!1)})}),e.jsx(B,{children:"success"===s&&y&&e.jsx(Fe,{variant:"success",title:"Coverage Data Loaded",description:"Adjust opacity below, then close to view on map"})}),e.jsx(B,{children:y&&!v&&e.jsx(k.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:gA.snappy,children:e.jsx(Le,{coverageCount:c.coverageCount,repeaterCount:c.repeaterCount,lastUpdated:c.lastUpdated})})}),e.jsx(B,{children:y&&!v&&e.jsx(Te,{value:f,onChange:p})})]}),e.jsxs("div",{className:"flex items-center justify-between p-4 border-t",style:{borderColor:o.border},children:[e.jsx("div",{className:"flex items-center gap-1",children:e.jsx(B,{children:y&&e.jsxs(k.div,{initial:{opacity:0,x:-10},animate:{opacity:1,x:0},exit:{opacity:0,x:-10},transition:gA.snappy,className:"flex items-center gap-1",children:[e.jsx(Re,{icon:l?e.jsx(q,{className:"w-4 h-4"}):e.jsx(sA,{className:"w-4 h-4"}),label:l?"Hide":"Show",onClick:m,disabled:v,active:l}),e.jsx(Re,{icon:e.jsx(W,{className:"w-4 h-4"}),label:"Clear",onClick:F,disabled:v,variant:"danger"})]})})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{plain:!0,color:"muted",onClick:T,disabled:v,children:y?"Done":"Cancel"}),e.jsx(M,{color:"warning",onClick:E,disabled:!L,children:v?e.jsxs(e.Fragment,{children:[e.jsx(cA,{"data-slot":"icon",className:"animate-spin"}),"connecting"===s?"Connecting...":"loading"===s?"Loading...":"Processing..."]}):y?e.jsxs(e.Fragment,{children:[e.jsx(aA,{"data-slot":"icon"}),"Refresh"]}):e.jsxs(e.Fragment,{children:[e.jsx(X,{"data-slot":"icon"}),"Connect"]})})]})]})]})})}const _e={bandwidth:.07,threshold:.1,opacity:1,strokeWidth:4.5},ze="#1A1A1A",He="#4A4A4A",Ge="#737373",Oe="rgba(0, 0, 0, 0.12)";function Ue({label:A,value:t,min:r,max:n,step:o,unit:i,formatValue:a,onChange:s,isLightMode:l}){const c=a?a(t):t.toFixed(2);return e.jsxs("div",{className:"flex items-center gap-2 sm:gap-2",children:[e.jsx("span",{className:"text-xs font-medium w-14 sm:w-16 flex-shrink-0",style:l?{color:He}:{color:"var(--text-secondary)"},children:A}),e.jsx("input",{type:"range",min:r,max:n,step:o,value:t,onChange:A=>s(parseFloat(A.target.value)),className:"flex-1 h-1.5 rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none\n [&::-webkit-slider-thumb]:w-3.5\n [&::-webkit-slider-thumb]:h-3.5\n [&::-webkit-slider-thumb]:rounded-full\n [&::-webkit-slider-thumb]:bg-accent-secondary\n [&::-webkit-slider-thumb]:cursor-pointer\n [&::-webkit-slider-thumb]:transition-transform\n [&::-webkit-slider-thumb]:hover:scale-110\n [&::-webkit-slider-thumb]:shadow-md",style:l?{backgroundColor:"rgba(0, 0, 0, 0.12)"}:{backgroundColor:"var(--bg-elevated)"}}),e.jsxs("span",{className:"text-xs font-mono tabular-nums w-12 sm:w-14 text-right flex-shrink-0",style:l?{color:ze}:{color:"var(--text-muted)"},children:[c,i&&e.jsx("span",{className:"ml-0.5 opacity-70",style:l?{color:Ge}:void 0,children:i})]})]})}function Ye({icon:A,label:t,value:r,subtext:n,isLightMode:o}){return e.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 py-0.5 sm:py-1",children:[e.jsx("div",{style:o?{color:Ge}:{color:"var(--text-muted)"},children:A}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx("div",{className:"text-[10px] sm:text-xs truncate",style:o?{color:He}:{color:"var(--text-secondary)"},children:t})}),e.jsxs("div",{className:"text-right",children:[e.jsx("div",{className:"text-xs font-mono tabular-nums",style:o?{color:ze}:{color:"var(--text-primary)"},children:r}),n&&e.jsx("div",{className:"text-[9px] leading-tight opacity-70",style:o?{color:Ge}:{color:"var(--text-muted)"},children:n})]})]})}function Ve({visible:t,onClose:r,settings:n,onSettingsChange:o,partition:i,totalNodes:a,basemapMode:s="dark"}){const l=p(HA),c=A.useRef(null),u="light"===s,d=A.useMemo(()=>{if(!i)return{numCommunities:0,avgCommunitySize:0,minCommunitySize:0,maxCommunitySize:0,fiedlerValue:0,modularity:0,coveragePercent:0};const A=Array.from(i.communities.values()).map(A=>A.length),e=A.reduce((A,e)=>A+e,0);return{numCommunities:i.numCommunities,avgCommunitySize:A.length>0?Math.round(e/A.length):0,minCommunitySize:A.length>0?Math.min(...A):0,maxCommunitySize:A.length>0?Math.max(...A):0,fiedlerValue:i.fiedlerValue,modularity:0,coveragePercent:a>0?Math.round(e/a*100):0}},[i,a]),f=(A,e)=>{o({...n,[A]:e})},g=(111*n.bandwidth).toFixed(1);return e.jsx("div",{ref:c,className:"absolute inset-0 z-[600] pointer-events-none",children:e.jsx(B,{children:t&&e.jsx(k.div,{drag:!0,dragControls:l,dragConstraints:c,dragElastic:.1,dragMomentum:!1,initial:{opacity:0,scale:.95,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},transition:{type:"spring",damping:25,stiffness:300},className:"\n absolute pointer-events-auto\n /* Mobile: bottom sheet style, full width with margins */\n bottom-2 left-2 right-2\n /* sm+: floating panel in bottom-right */\n sm:bottom-16 sm:left-auto sm:right-3 sm:w-64\n /* md+: slightly wider */\n md:w-72\n ",style:{touchAction:"none"},children:e.jsxs("div",{className:"\n map-control-glass rounded-lg overflow-hidden shadow-lg\n /* Mobile: limit height, allow scroll */\n max-h-[45vh] sm:max-h-[calc(100vh-180px)] overflow-y-auto\n /* iOS momentum scrolling */\n overscroll-contain\n ",children:[e.jsxs("div",{className:"\n flex items-center justify-between \n px-3 py-2 sm:px-2.5 sm:py-1.5 \n border-b \n cursor-grab active:cursor-grabbing\n /* Larger touch target on mobile */\n min-h-[44px] sm:min-h-0\n ",style:u?{borderColor:Oe}:void 0,onPointerDown:A=>l.start(A),children:[e.jsxs("div",{className:"flex items-center gap-2 sm:gap-1.5",children:[e.jsx(SA,{className:"w-4 h-4 sm:w-3 sm:h-3",style:u?{color:Ge}:void 0}),e.jsx(QA,{className:"w-4 h-4 sm:w-3.5 sm:h-3.5 text-accent-primary"}),e.jsx("span",{className:"text-sm sm:text-xs font-medium",style:u?{color:ze}:void 0,children:"Partition"})]}),e.jsx(M,{plain:!0,color:"muted",onClick:r,className:"!p-1.5 sm:!p-0.5 !rounded min-w-[44px] min-h-[44px] sm:min-w-0 sm:min-h-0 flex items-center justify-center","aria-label":"Close toolbox",children:e.jsx(N,{className:"w-4 h-4 sm:w-3 sm:h-3"})})]}),e.jsx("div",{className:"px-3 py-2 sm:px-2.5 sm:py-1.5 border-b",style:u?{borderColor:Oe}:void 0,children:e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 sm:gap-x-3 gap-y-1 sm:gap-y-0.5",children:[e.jsx(Ye,{icon:e.jsx(QA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Communities",value:d.numCommunities,isLightMode:u}),e.jsx(Ye,{icon:e.jsx(wA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Avg Size",value:d.avgCommunitySize,subtext:`${d.minCommunitySize}–${d.maxCommunitySize}`,isLightMode:u}),e.jsx(Ye,{icon:e.jsx(TA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Fiedler λ₂",value:d.fiedlerValue.toFixed(3),isLightMode:u}),e.jsx(Ye,{icon:e.jsx(wA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Coverage",value:`${d.coveragePercent}%`,subtext:`of ${a}`,isLightMode:u})]})}),e.jsx("div",{className:"px-3 py-2 sm:px-2.5 sm:py-1.5",children:e.jsxs("div",{className:"space-y-3 sm:space-y-1.5",children:[e.jsx(Ue,{label:"Bandwidth",value:n.bandwidth,min:.01,max:.15,step:.005,formatValue:()=>g,unit:"km",onChange:A=>f("bandwidth",A),isLightMode:u}),e.jsx(Ue,{label:"Threshold",value:n.threshold,min:.05,max:.5,step:.01,formatValue:A=>`${Math.round(100*(1-A))}%`,unit:"cov",onChange:A=>f("threshold",A),isLightMode:u}),e.jsx(Ue,{label:"Opacity",value:n.opacity,min:.1,max:1,step:.05,formatValue:A=>`${Math.round(100*A)}%`,onChange:A=>f("opacity",A),isLightMode:u}),e.jsx(Ue,{label:"Stroke",value:n.strokeWidth,min:0,max:5,step:.5,unit:"px",formatValue:A=>A.toFixed(1),onChange:A=>f("strokeWidth",A),isLightMode:u})]})})]})})})})}const We={getItem:A=>{try{return localStorage.getItem(A)}catch{return null}},setItem:(A,e)=>{try{localStorage.setItem(A,e)}catch{}},removeItem:A=>{try{localStorage.removeItem(A)}catch{}}},Ze=mA()(bA(A=>({isEnabled:!1,toggle:()=>A(A=>({isEnabled:!A.isEnabled})),setEnabled:e=>A({isEnabled:e})}),{name:"pymc-live-trace",storage:pA(()=>We)}));var Ke=function(A){var e,t=void 0!==(A=A||{})?A:{},r={};for(e in t)t.hasOwnProperty(e)&&(r[e]=t[e]);var n,o="";"undefined"!=typeof document&&document.currentScript&&(o=document.currentScript.src),o=0!==o.indexOf("blob:")?o.substr(0,o.lastIndexOf("/")+1):"",n=function(A,e,t){var r=new XMLHttpRequest;r.open("GET",A,!0),r.responseType="arraybuffer",r.onload=function(){if(200==r.status||0==r.status&&r.response)e(r.response);else{var n=O(A);n?e(n.buffer):t()}},r.onerror=t,r.send(null)};var i=t.print||function(){}.bind(),a=t.printErr||function(){}.bind();for(e in r)r.hasOwnProperty(e)&&(t[e]=r[e]);r=null,t.arguments&&t.arguments;var s=0,l=!1;function c(A){var e=t["_"+A];return e||tA("Assertion failed: "+("Cannot call unknown function "+A+", make sure it is exported")),e}var u,d,f,g,h,m,b,p="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function v(A,e){return A?function(A,e,t){for(var r=e+t,n=e;A[n]&&!(n>=r);)++n;if(n-e>16&&A.subarray&&p)return p.decode(A.subarray(e,n));for(var o="";e>10,56320|1023&l)}}else o+=String.fromCharCode((31&i)<<6|a)}else o+=String.fromCharCode(i)}return o}(f,A,e):""}function y(A,e){return A%e>0&&(A+=e-A%e),A}function w(A){u=A,t.HEAP8=d=new Int8Array(A),t.HEAP16=g=new Int16Array(A),t.HEAP32=h=new Int32Array(A),t.HEAPU8=f=new Uint8Array(A),t.HEAPU16=new Uint16Array(A),t.HEAPU32=new Uint32Array(A),t.HEAPF32=m=new Float32Array(A),t.HEAPF64=b=new Float64Array(A)}"undefined"!=typeof TextDecoder&&new TextDecoder("utf-16le");var x=t.TOTAL_MEMORY||33554432;function k(A){for(;A.length>0;){var e=A.shift();if("function"!=typeof e){var r=e.func;"number"==typeof r?void 0===e.arg?t.dynCall_v(r):t.dynCall_vi(r,e.arg):r(void 0===e.arg?null:e.arg)}else e()}}x=(u=t.buffer?t.buffer:new ArrayBuffer(x)).byteLength,w(u),h[7156]=5271536;var C=[],B=[],M=[],D=[];function E(A){C.unshift(A)}function j(A){D.unshift(A)}var Q=Math.abs,N=Math.ceil,S=Math.floor,F=Math.min,P=0,T=null;t.preloadedImages={},t.preloadedAudios={};var L,R,I=null,_="data:application/octet-stream;base64,";function z(A){return String.prototype.startsWith?A.startsWith(_):0===A.indexOf(_)}function H(){return d.length}I="data:application/octet-stream;base64,AAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAAQAAAAQAAAADAAAABgAAAAUAAAACAAAAAAAAAAIAAAADAAAAAQAAAAQAAAAGAAAAAAAAAAUAAAADAAAABgAAAAQAAAAFAAAAAAAAAAEAAAACAAAABAAAAAUAAAAGAAAAAAAAAAIAAAADAAAAAQAAAAUAAAACAAAAAAAAAAEAAAADAAAABgAAAAQAAAAGAAAAAAAAAAUAAAACAAAAAQAAAAQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAACAAAAAAAAAAEAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAYAAAAAAAAABQAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAIAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAIAAAADAAAABQAAAAYAAAAAAAAAAQAAAAIAAAADAAAABAAAAAYAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAYAAAAAAAAAAwAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAFAAAABAAAAAAAAAABAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAgAAAAQAAAADAAAACAAAAAEAAAAHAAAABgAAAAkAAAAAAAAAAwAAAAIAAAACAAAABgAAAAoAAAALAAAAAAAAAAEAAAAFAAAAAwAAAA0AAAABAAAABwAAAAQAAAAMAAAAAAAAAAQAAAB/AAAADwAAAAgAAAADAAAAAAAAAAwAAAAFAAAAAgAAABIAAAAKAAAACAAAAAAAAAAQAAAABgAAAA4AAAALAAAAEQAAAAEAAAAJAAAAAgAAAAcAAAAVAAAACQAAABMAAAADAAAADQAAAAEAAAAIAAAABQAAABYAAAAQAAAABAAAAAAAAAAPAAAACQAAABMAAAAOAAAAFAAAAAEAAAAHAAAABgAAAAoAAAALAAAAGAAAABcAAAAFAAAAAgAAABIAAAALAAAAEQAAABcAAAAZAAAAAgAAAAYAAAAKAAAADAAAABwAAAANAAAAGgAAAAQAAAAPAAAAAwAAAA0AAAAaAAAAFQAAAB0AAAADAAAADAAAAAcAAAAOAAAAfwAAABEAAAAbAAAACQAAABQAAAAGAAAADwAAABYAAAAcAAAAHwAAAAQAAAAIAAAADAAAABAAAAASAAAAIQAAAB4AAAAIAAAABQAAABYAAAARAAAACwAAAA4AAAAGAAAAIwAAABkAAAAbAAAAEgAAABgAAAAeAAAAIAAAAAUAAAAKAAAAEAAAABMAAAAiAAAAFAAAACQAAAAHAAAAFQAAAAkAAAAUAAAADgAAABMAAAAJAAAAKAAAABsAAAAkAAAAFQAAACYAAAATAAAAIgAAAA0AAAAdAAAABwAAABYAAAAQAAAAKQAAACEAAAAPAAAACAAAAB8AAAAXAAAAGAAAAAsAAAAKAAAAJwAAACUAAAAZAAAAGAAAAH8AAAAgAAAAJQAAAAoAAAAXAAAAEgAAABkAAAAXAAAAEQAAAAsAAAAtAAAAJwAAACMAAAAaAAAAKgAAAB0AAAArAAAADAAAABwAAAANAAAAGwAAACgAAAAjAAAALgAAAA4AAAAUAAAAEQAAABwAAAAfAAAAKgAAACwAAAAMAAAADwAAABoAAAAdAAAAKwAAACYAAAAvAAAADQAAABoAAAAVAAAAHgAAACAAAAAwAAAAMgAAABAAAAASAAAAIQAAAB8AAAApAAAALAAAADUAAAAPAAAAFgAAABwAAAAgAAAAHgAAABgAAAASAAAANAAAADIAAAAlAAAAIQAAAB4AAAAxAAAAMAAAABYAAAAQAAAAKQAAACIAAAATAAAAJgAAABUAAAA2AAAAJAAAADMAAAAjAAAALgAAAC0AAAA4AAAAEQAAABsAAAAZAAAAJAAAABQAAAAiAAAAEwAAADcAAAAoAAAANgAAACUAAAAnAAAANAAAADkAAAAYAAAAFwAAACAAAAAmAAAAfwAAACIAAAAzAAAAHQAAAC8AAAAVAAAAJwAAACUAAAAZAAAAFwAAADsAAAA5AAAALQAAACgAAAAbAAAAJAAAABQAAAA8AAAALgAAADcAAAApAAAAMQAAADUAAAA9AAAAFgAAACEAAAAfAAAAKgAAADoAAAArAAAAPgAAABwAAAAsAAAAGgAAACsAAAA+AAAALwAAAEAAAAAaAAAAKgAAAB0AAAAsAAAANQAAADoAAABBAAAAHAAAAB8AAAAqAAAALQAAACcAAAAjAAAAGQAAAD8AAAA7AAAAOAAAAC4AAAA8AAAAOAAAAEQAAAAbAAAAKAAAACMAAAAvAAAAJgAAACsAAAAdAAAARQAAADMAAABAAAAAMAAAADEAAAAeAAAAIQAAAEMAAABCAAAAMgAAADEAAAB/AAAAPQAAAEIAAAAhAAAAMAAAACkAAAAyAAAAMAAAACAAAAAeAAAARgAAAEMAAAA0AAAAMwAAAEUAAAA2AAAARwAAACYAAAAvAAAAIgAAADQAAAA5AAAARgAAAEoAAAAgAAAAJQAAADIAAAA1AAAAPQAAAEEAAABLAAAAHwAAACkAAAAsAAAANgAAAEcAAAA3AAAASQAAACIAAAAzAAAAJAAAADcAAAAoAAAANgAAACQAAABIAAAAPAAAAEkAAAA4AAAARAAAAD8AAABNAAAAIwAAAC4AAAAtAAAAOQAAADsAAABKAAAATgAAACUAAAAnAAAANAAAADoAAAB/AAAAPgAAAEwAAAAsAAAAQQAAACoAAAA7AAAAPwAAAE4AAABPAAAAJwAAAC0AAAA5AAAAPAAAAEgAAABEAAAAUAAAACgAAAA3AAAALgAAAD0AAAA1AAAAMQAAACkAAABRAAAASwAAAEIAAAA+AAAAKwAAADoAAAAqAAAAUgAAAEAAAABMAAAAPwAAAH8AAAA4AAAALQAAAE8AAAA7AAAATQAAAEAAAAAvAAAAPgAAACsAAABUAAAARQAAAFIAAABBAAAAOgAAADUAAAAsAAAAVgAAAEwAAABLAAAAQgAAAEMAAABRAAAAVQAAADEAAAAwAAAAPQAAAEMAAABCAAAAMgAAADAAAABXAAAAVQAAAEYAAABEAAAAOAAAADwAAAAuAAAAWgAAAE0AAABQAAAARQAAADMAAABAAAAALwAAAFkAAABHAAAAVAAAAEYAAABDAAAANAAAADIAAABTAAAAVwAAAEoAAABHAAAAWQAAAEkAAABbAAAAMwAAAEUAAAA2AAAASAAAAH8AAABJAAAANwAAAFAAAAA8AAAAWAAAAEkAAABbAAAASAAAAFgAAAA2AAAARwAAADcAAABKAAAATgAAAFMAAABcAAAANAAAADkAAABGAAAASwAAAEEAAAA9AAAANQAAAF4AAABWAAAAUQAAAEwAAABWAAAAUgAAAGAAAAA6AAAAQQAAAD4AAABNAAAAPwAAAEQAAAA4AAAAXQAAAE8AAABaAAAATgAAAEoAAAA7AAAAOQAAAF8AAABcAAAATwAAAE8AAABOAAAAPwAAADsAAABdAAAAXwAAAE0AAABQAAAARAAAAEgAAAA8AAAAYwAAAFoAAABYAAAAUQAAAFUAAABeAAAAZQAAAD0AAABCAAAASwAAAFIAAABgAAAAVAAAAGIAAAA+AAAATAAAAEAAAABTAAAAfwAAAEoAAABGAAAAZAAAAFcAAABcAAAAVAAAAEUAAABSAAAAQAAAAGEAAABZAAAAYgAAAFUAAABXAAAAZQAAAGYAAABCAAAAQwAAAFEAAABWAAAATAAAAEsAAABBAAAAaAAAAGAAAABeAAAAVwAAAFMAAABmAAAAZAAAAEMAAABGAAAAVQAAAFgAAABIAAAAWwAAAEkAAABjAAAAUAAAAGkAAABZAAAAYQAAAFsAAABnAAAARQAAAFQAAABHAAAAWgAAAE0AAABQAAAARAAAAGoAAABdAAAAYwAAAFsAAABJAAAAWQAAAEcAAABpAAAAWAAAAGcAAABcAAAAUwAAAE4AAABKAAAAbAAAAGQAAABfAAAAXQAAAE8AAABaAAAATQAAAG0AAABfAAAAagAAAF4AAABWAAAAUQAAAEsAAABrAAAAaAAAAGUAAABfAAAAXAAAAE8AAABOAAAAbQAAAGwAAABdAAAAYAAAAGgAAABiAAAAbgAAAEwAAABWAAAAUgAAAGEAAAB/AAAAYgAAAFQAAABnAAAAWQAAAG8AAABiAAAAbgAAAGEAAABvAAAAUgAAAGAAAABUAAAAYwAAAFAAAABpAAAAWAAAAGoAAABaAAAAcQAAAGQAAABmAAAAUwAAAFcAAABsAAAAcgAAAFwAAABlAAAAZgAAAGsAAABwAAAAUQAAAFUAAABeAAAAZgAAAGUAAABXAAAAVQAAAHIAAABwAAAAZAAAAGcAAABbAAAAYQAAAFkAAAB0AAAAaQAAAG8AAABoAAAAawAAAG4AAABzAAAAVgAAAF4AAABgAAAAaQAAAFgAAABnAAAAWwAAAHEAAABjAAAAdAAAAGoAAABdAAAAYwAAAFoAAAB1AAAAbQAAAHEAAABrAAAAfwAAAGUAAABeAAAAcwAAAGgAAABwAAAAbAAAAGQAAABfAAAAXAAAAHYAAAByAAAAbQAAAG0AAABsAAAAXQAAAF8AAAB1AAAAdgAAAGoAAABuAAAAYgAAAGgAAABgAAAAdwAAAG8AAABzAAAAbwAAAGEAAABuAAAAYgAAAHQAAABnAAAAdwAAAHAAAABrAAAAZgAAAGUAAAB4AAAAcwAAAHIAAABxAAAAYwAAAHQAAABpAAAAdQAAAGoAAAB5AAAAcgAAAHAAAABkAAAAZgAAAHYAAAB4AAAAbAAAAHMAAABuAAAAawAAAGgAAAB4AAAAdwAAAHAAAAB0AAAAZwAAAHcAAABvAAAAcQAAAGkAAAB5AAAAdQAAAH8AAABtAAAAdgAAAHEAAAB5AAAAagAAAHYAAAB4AAAAbAAAAHIAAAB1AAAAeQAAAG0AAAB3AAAAbwAAAHMAAABuAAAAeQAAAHQAAAB4AAAAeAAAAHMAAAByAAAAcAAAAHkAAAB3AAAAdgAAAHkAAAB0AAAAeAAAAHcAAAB1AAAAcQAAAHYAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAABAAAABQAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAACAAAABQAAAAEAAAAAAAAA/////wEAAAAAAAAAAwAAAAQAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAFAAAAAQAAAAAAAAAAAAAAAQAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAADAAAABQAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAEAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAQAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAUAAAABAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABAAAAAUAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAIAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAAAAAAD/////AQAAAAAAAAADAAAABAAAAAIAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAUAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAEAAAD//////////wEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAAAAAAAAAAAAAAABAAAAAgAAAAYAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAAAQAAAAEAAAAFAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAACAAAAAAAAAAAAAAABAAAAAwAAAAcAAAAGAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAADgAAAAIAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAMAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAIAAAAAAAAAAAAAAAEAAAAEAAAACAAAAAoAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAAAAAAAAAAAAAQAAAAsAAAAPAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAgAAAAAAAAAAAAAAAQAAAAwAAAAQAAAADAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAADwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAAAAAAAAAAABAAAACgAAABMAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAIAAAAAAAAAAAAAAAEAAAANAAAAEQAAAA0AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAABAAAADgAAABIAAAAPAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAADwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAABEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABIAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAATAAAAAgAAAAAAAAAAAAAAAQAAAP//////////EwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAASAAAAAAAAABgAAAAAAAAAIQAAAAAAAAAeAAAAAAAAACAAAAADAAAAMQAAAAEAAAAwAAAAAwAAADIAAAADAAAACAAAAAAAAAAFAAAABQAAAAoAAAAFAAAAFgAAAAAAAAAQAAAAAAAAABIAAAAAAAAAKQAAAAEAAAAhAAAAAAAAAB4AAAAAAAAABAAAAAAAAAAAAAAABQAAAAIAAAAFAAAADwAAAAEAAAAIAAAAAAAAAAUAAAAFAAAAHwAAAAEAAAAWAAAAAAAAABAAAAAAAAAAAgAAAAAAAAAGAAAAAAAAAA4AAAAAAAAACgAAAAAAAAALAAAAAAAAABEAAAADAAAAGAAAAAEAAAAXAAAAAwAAABkAAAADAAAAAAAAAAAAAAABAAAABQAAAAkAAAAFAAAABQAAAAAAAAACAAAAAAAAAAYAAAAAAAAAEgAAAAEAAAAKAAAAAAAAAAsAAAAAAAAABAAAAAEAAAADAAAABQAAAAcAAAAFAAAACAAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAEAAAAAEAAAAFAAAAAAAAAAIAAAAAAAAABwAAAAAAAAAVAAAAAAAAACYAAAAAAAAACQAAAAAAAAATAAAAAAAAACIAAAADAAAADgAAAAEAAAAUAAAAAwAAACQAAAADAAAAAwAAAAAAAAANAAAABQAAAB0AAAAFAAAAAQAAAAAAAAAHAAAAAAAAABUAAAAAAAAABgAAAAEAAAAJAAAAAAAAABMAAAAAAAAABAAAAAIAAAAMAAAABQAAABoAAAAFAAAAAAAAAAEAAAADAAAAAAAAAA0AAAAFAAAAAgAAAAEAAAABAAAAAAAAAAcAAAAAAAAAGgAAAAAAAAAqAAAAAAAAADoAAAAAAAAAHQAAAAAAAAArAAAAAAAAAD4AAAADAAAAJgAAAAEAAAAvAAAAAwAAAEAAAAADAAAADAAAAAAAAAAcAAAABQAAACwAAAAFAAAADQAAAAAAAAAaAAAAAAAAACoAAAAAAAAAFQAAAAEAAAAdAAAAAAAAACsAAAAAAAAABAAAAAMAAAAPAAAABQAAAB8AAAAFAAAAAwAAAAEAAAAMAAAAAAAAABwAAAAFAAAABwAAAAEAAAANAAAAAAAAABoAAAAAAAAAHwAAAAAAAAApAAAAAAAAADEAAAAAAAAALAAAAAAAAAA1AAAAAAAAAD0AAAADAAAAOgAAAAEAAABBAAAAAwAAAEsAAAADAAAADwAAAAAAAAAWAAAABQAAACEAAAAFAAAAHAAAAAAAAAAfAAAAAAAAACkAAAAAAAAAKgAAAAEAAAAsAAAAAAAAADUAAAAAAAAABAAAAAQAAAAIAAAABQAAABAAAAAFAAAADAAAAAEAAAAPAAAAAAAAABYAAAAFAAAAGgAAAAEAAAAcAAAAAAAAAB8AAAAAAAAAMgAAAAAAAAAwAAAAAAAAADEAAAADAAAAIAAAAAAAAAAeAAAAAwAAACEAAAADAAAAGAAAAAMAAAASAAAAAwAAABAAAAADAAAARgAAAAAAAABDAAAAAAAAAEIAAAADAAAANAAAAAMAAAAyAAAAAAAAADAAAAAAAAAAJQAAAAMAAAAgAAAAAAAAAB4AAAADAAAAUwAAAAAAAABXAAAAAwAAAFUAAAADAAAASgAAAAMAAABGAAAAAAAAAEMAAAAAAAAAOQAAAAEAAAA0AAAAAwAAADIAAAAAAAAAGQAAAAAAAAAXAAAAAAAAABgAAAADAAAAEQAAAAAAAAALAAAAAwAAAAoAAAADAAAADgAAAAMAAAAGAAAAAwAAAAIAAAADAAAALQAAAAAAAAAnAAAAAAAAACUAAAADAAAAIwAAAAMAAAAZAAAAAAAAABcAAAAAAAAAGwAAAAMAAAARAAAAAAAAAAsAAAADAAAAPwAAAAAAAAA7AAAAAwAAADkAAAADAAAAOAAAAAMAAAAtAAAAAAAAACcAAAAAAAAALgAAAAMAAAAjAAAAAwAAABkAAAAAAAAAJAAAAAAAAAAUAAAAAAAAAA4AAAADAAAAIgAAAAAAAAATAAAAAwAAAAkAAAADAAAAJgAAAAMAAAAVAAAAAwAAAAcAAAADAAAANwAAAAAAAAAoAAAAAAAAABsAAAADAAAANgAAAAMAAAAkAAAAAAAAABQAAAAAAAAAMwAAAAMAAAAiAAAAAAAAABMAAAADAAAASAAAAAAAAAA8AAAAAwAAAC4AAAADAAAASQAAAAMAAAA3AAAAAAAAACgAAAAAAAAARwAAAAMAAAA2AAAAAwAAACQAAAAAAAAAQAAAAAAAAAAvAAAAAAAAACYAAAADAAAAPgAAAAAAAAArAAAAAwAAAB0AAAADAAAAOgAAAAMAAAAqAAAAAwAAABoAAAADAAAAVAAAAAAAAABFAAAAAAAAADMAAAADAAAAUgAAAAMAAABAAAAAAAAAAC8AAAAAAAAATAAAAAMAAAA+AAAAAAAAACsAAAADAAAAYQAAAAAAAABZAAAAAwAAAEcAAAADAAAAYgAAAAMAAABUAAAAAAAAAEUAAAAAAAAAYAAAAAMAAABSAAAAAwAAAEAAAAAAAAAASwAAAAAAAABBAAAAAAAAADoAAAADAAAAPQAAAAAAAAA1AAAAAwAAACwAAAADAAAAMQAAAAMAAAApAAAAAwAAAB8AAAADAAAAXgAAAAAAAABWAAAAAAAAAEwAAAADAAAAUQAAAAMAAABLAAAAAAAAAEEAAAAAAAAAQgAAAAMAAAA9AAAAAAAAADUAAAADAAAAawAAAAAAAABoAAAAAwAAAGAAAAADAAAAZQAAAAMAAABeAAAAAAAAAFYAAAAAAAAAVQAAAAMAAABRAAAAAwAAAEsAAAAAAAAAOQAAAAAAAAA7AAAAAAAAAD8AAAADAAAASgAAAAAAAABOAAAAAwAAAE8AAAADAAAAUwAAAAMAAABcAAAAAwAAAF8AAAADAAAAJQAAAAAAAAAnAAAAAwAAAC0AAAADAAAANAAAAAAAAAA5AAAAAAAAADsAAAAAAAAARgAAAAMAAABKAAAAAAAAAE4AAAADAAAAGAAAAAAAAAAXAAAAAwAAABkAAAADAAAAIAAAAAMAAAAlAAAAAAAAACcAAAADAAAAMgAAAAMAAAA0AAAAAAAAADkAAAAAAAAALgAAAAAAAAA8AAAAAAAAAEgAAAADAAAAOAAAAAAAAABEAAAAAwAAAFAAAAADAAAAPwAAAAMAAABNAAAAAwAAAFoAAAADAAAAGwAAAAAAAAAoAAAAAwAAADcAAAADAAAAIwAAAAAAAAAuAAAAAAAAADwAAAAAAAAALQAAAAMAAAA4AAAAAAAAAEQAAAADAAAADgAAAAAAAAAUAAAAAwAAACQAAAADAAAAEQAAAAMAAAAbAAAAAAAAACgAAAADAAAAGQAAAAMAAAAjAAAAAAAAAC4AAAAAAAAARwAAAAAAAABZAAAAAAAAAGEAAAADAAAASQAAAAAAAABbAAAAAwAAAGcAAAADAAAASAAAAAMAAABYAAAAAwAAAGkAAAADAAAAMwAAAAAAAABFAAAAAwAAAFQAAAADAAAANgAAAAAAAABHAAAAAAAAAFkAAAAAAAAANwAAAAMAAABJAAAAAAAAAFsAAAADAAAAJgAAAAAAAAAvAAAAAwAAAEAAAAADAAAAIgAAAAMAAAAzAAAAAAAAAEUAAAADAAAAJAAAAAMAAAA2AAAAAAAAAEcAAAAAAAAAYAAAAAAAAABoAAAAAAAAAGsAAAADAAAAYgAAAAAAAABuAAAAAwAAAHMAAAADAAAAYQAAAAMAAABvAAAAAwAAAHcAAAADAAAATAAAAAAAAABWAAAAAwAAAF4AAAADAAAAUgAAAAAAAABgAAAAAAAAAGgAAAAAAAAAVAAAAAMAAABiAAAAAAAAAG4AAAADAAAAOgAAAAAAAABBAAAAAwAAAEsAAAADAAAAPgAAAAMAAABMAAAAAAAAAFYAAAADAAAAQAAAAAMAAABSAAAAAAAAAGAAAAAAAAAAVQAAAAAAAABXAAAAAAAAAFMAAAADAAAAZQAAAAAAAABmAAAAAwAAAGQAAAADAAAAawAAAAMAAABwAAAAAwAAAHIAAAADAAAAQgAAAAAAAABDAAAAAwAAAEYAAAADAAAAUQAAAAAAAABVAAAAAAAAAFcAAAAAAAAAXgAAAAMAAABlAAAAAAAAAGYAAAADAAAAMQAAAAAAAAAwAAAAAwAAADIAAAADAAAAPQAAAAMAAABCAAAAAAAAAEMAAAADAAAASwAAAAMAAABRAAAAAAAAAFUAAAAAAAAAXwAAAAAAAABcAAAAAAAAAFMAAAAAAAAATwAAAAAAAABOAAAAAAAAAEoAAAADAAAAPwAAAAEAAAA7AAAAAwAAADkAAAADAAAAbQAAAAAAAABsAAAAAAAAAGQAAAAFAAAAXQAAAAEAAABfAAAAAAAAAFwAAAAAAAAATQAAAAEAAABPAAAAAAAAAE4AAAAAAAAAdQAAAAQAAAB2AAAABQAAAHIAAAAFAAAAagAAAAEAAABtAAAAAAAAAGwAAAAAAAAAWgAAAAEAAABdAAAAAQAAAF8AAAAAAAAAWgAAAAAAAABNAAAAAAAAAD8AAAAAAAAAUAAAAAAAAABEAAAAAAAAADgAAAADAAAASAAAAAEAAAA8AAAAAwAAAC4AAAADAAAAagAAAAAAAABdAAAAAAAAAE8AAAAFAAAAYwAAAAEAAABaAAAAAAAAAE0AAAAAAAAAWAAAAAEAAABQAAAAAAAAAEQAAAAAAAAAdQAAAAMAAABtAAAABQAAAF8AAAAFAAAAcQAAAAEAAABqAAAAAAAAAF0AAAAAAAAAaQAAAAEAAABjAAAAAQAAAFoAAAAAAAAAaQAAAAAAAABYAAAAAAAAAEgAAAAAAAAAZwAAAAAAAABbAAAAAAAAAEkAAAADAAAAYQAAAAEAAABZAAAAAwAAAEcAAAADAAAAcQAAAAAAAABjAAAAAAAAAFAAAAAFAAAAdAAAAAEAAABpAAAAAAAAAFgAAAAAAAAAbwAAAAEAAABnAAAAAAAAAFsAAAAAAAAAdQAAAAIAAABqAAAABQAAAFoAAAAFAAAAeQAAAAEAAABxAAAAAAAAAGMAAAAAAAAAdwAAAAEAAAB0AAAAAQAAAGkAAAAAAAAAdwAAAAAAAABvAAAAAAAAAGEAAAAAAAAAcwAAAAAAAABuAAAAAAAAAGIAAAADAAAAawAAAAEAAABoAAAAAwAAAGAAAAADAAAAeQAAAAAAAAB0AAAAAAAAAGcAAAAFAAAAeAAAAAEAAAB3AAAAAAAAAG8AAAAAAAAAcAAAAAEAAABzAAAAAAAAAG4AAAAAAAAAdQAAAAEAAABxAAAABQAAAGkAAAAFAAAAdgAAAAEAAAB5AAAAAAAAAHQAAAAAAAAAcgAAAAEAAAB4AAAAAQAAAHcAAAAAAAAAcgAAAAAAAABwAAAAAAAAAGsAAAAAAAAAZAAAAAAAAABmAAAAAAAAAGUAAAADAAAAUwAAAAEAAABXAAAAAwAAAFUAAAADAAAAdgAAAAAAAAB4AAAAAAAAAHMAAAAFAAAAbAAAAAEAAAByAAAAAAAAAHAAAAAAAAAAXAAAAAEAAABkAAAAAAAAAGYAAAAAAAAAdQAAAAAAAAB5AAAABQAAAHcAAAAFAAAAbQAAAAEAAAB2AAAAAAAAAHgAAAAAAAAAXwAAAAEAAABsAAAAAQAAAHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAgAAAAUAAAABAAAABAAAAAAAAAAAAAAABQAAAAMAAAABAAAABgAAAAQAAAACAAAAAAAAAH6iBfbytuk/Gq6akm/58z/Xrm0Liez0P5doSdOpSwRAWs602ULg8D/dT7Rcbo/1v1N1RQHFNOM/g9Snx7HW3L8HWsP8Q3jfP6VwOLosutk/9rjk1YQcxj+gnmKMsNn6P/HDeuPFY+M/YHwDjqKhB0Ci19/fCVrbP4UxKkDWOP6/pvljWa09tL9wi7wrQXjnv/Z6yLImkM2/3yTlOzY14D+m+WNZrT20PzwKVQnrQwNA9nrIsiaQzT/g40rFrRQFwPa45NWEHMa/kbslHEZq97/xw3rjxWPjv4cLC2SMBci/otff3wla27+rKF5oIAv0P1N1RQHFNOO/iDJPGyWHBUAHWsP8Q3jfvwQf/by16gXAfqIF9vK26b8XrO0Vh0r+v9eubQuJ7PS/BxLrA0ZZ479azrTZQuDwv1MK1EuItPw/yscgV9Z6FkAwHBR2WjQMQJNRzXsQ5vY/GlUHVJYKF0DONuFv2lMNQNCGZ28QJfk/0WUwoIL36D8ggDOMQuATQNqMOeAy/wZAWFYOYM+M2z/LWC4uH3oSQDE+LyTsMgRAkJzhRGWFGEDd4soovCQQQKqk0DJMEP8/rGmNdwOLBUAW2X/9xCbjP4hu3dcqJhNAzuYItRvdB0CgzW3zJW/sPxotm/Y2TxRAQAk9XmdDDEC1Kx9MKgT3P1M+NctcghZAFVqcLlb0C0Bgzd3sB2b2P77mZDPUWhZAFROHJpUGCEDAfma5CxXtPz1DWq/zYxRAmhYY5824F0DOuQKWSbAOQNCMqrvu3fs/L6DR22K2wT9nAAxPBU8RQGiN6mW43AFAZhu25b633D8c1YgmzowSQNM25BRKWARArGS08/lNxD+LFssHwmMRQLC5aNcxBgJABL9HT0WRF0CjCmJmOGEOQHsuaVzMP/s/TWJCaGGwBUCeu1PAPLzjP9nqN9DZOBNAKE4JcydbCkCGtbd1qjPzP8dgm9U8jhVAtPeKTkVwDkCeCLss5l37P401XMPLmBdAFd29VMVQDUBg0yA55h75Pz6odcYLCRdApBM4rBrkAkDyAVWgQxbRP4XDMnK20hFAymLlF7EmzD8GUgo9XBHlP3lbK7T9COc/k+OhPthhy7+YGEpnrOvCPzBFhLs15u4/epbqB6H4uz9IuuLF5svev6lzLKY31es/CaQ0envF5z8ZY0xlUADXv7zaz7HYEuI/CfbK1sn16T8uAQfWwxLWPzKn/YuFN94/5KdbC1AFu793fyCSnlfvPzK2y4doAMY/NRg5t1/X6b/shq4QJaHDP5yNIAKPOeI/vpn7BSE30r/X4YQrO6nrv78Ziv/Thto/DqJ1Y6+y5z9l51NaxFrlv8QlA65HOLS/86dxiEc96z+Hj0+LFjneP6LzBZ8LTc2/DaJ1Y6+y579l51NaxFrlP8QlA65HOLQ/8qdxiEc967+Jj0+LFjnev6LzBZ8LTc0/1qdbC1AFuz93fyCSnlfvvzK2y4doAMa/NRg5t1/X6T/vhq4QJaHDv5yNIAKPOeK/wJn7BSE30j/W4YQrO6nrP78Ziv/Thtq/CaQ0envF578XY0xlUADXP7zaz7HYEuK/CvbK1sn16b8rAQfWwxLWvzKn/YuFN96/zWLlF7EmzL8GUgo9XBHlv3lbK7T9COe/kOOhPthhyz+cGEpnrOvCvzBFhLs15u6/c5bqB6H4u79IuuLF5sveP6lzLKY31eu/AQAAAP////8HAAAA/////zEAAAD/////VwEAAP////9hCQAA/////6dBAAD/////kcsBAP/////3kAwA/////8H2VwAAAAAAAAAAAAAAAAACAAAA/////w4AAAD/////YgAAAP////+uAgAA/////8ISAAD/////ToMAAP////8ilwMA/////+4hGQD/////gu2vAAAAAAAAAAAAAAAAAAAAAAACAAAA//////////8BAAAAAwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////AgAAAP//////////AQAAAAAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD/////////////////////AQAAAP///////////////wIAAAD///////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP///////////////////////////////wIAAAD///////////////8BAAAA/////////////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAABAAAA//////////8CAAAA//////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAAAQAAAP//////////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAACAAAAAAAAAAIAAAABAAAAAQAAAAIAAAACAAAAAAAAAAUAAAAFAAAAAAAAAAIAAAACAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAEAAAACAAAAAgAAAAIAAAAAAAAABQAAAAYAAAAAAAAAAgAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAACAAAAAQAAAAMAAAACAAAAAgAAAAAAAAAFAAAABwAAAAAAAAACAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAIAAAABAAAABAAAAAIAAAACAAAAAAAAAAUAAAAIAAAAAAAAAAIAAAACAAAAAwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAIAAAAAAAAAAgAAAAEAAAAAAAAAAgAAAAIAAAAAAAAABQAAAAkAAAAAAAAAAgAAAAIAAAADAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAIAAAAAAAAAAwAAAA4AAAACAAAAAAAAAAIAAAADAAAAAAAAAAAAAAACAAAAAgAAAAMAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAAAAAgAAAAAAAAADAAAACgAAAAIAAAAAAAAAAgAAAAMAAAABAAAAAAAAAAIAAAACAAAAAwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAIAAAACAAAAAAAAAAMAAAALAAAAAgAAAAAAAAACAAAAAwAAAAIAAAAAAAAAAgAAAAIAAAADAAAACAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAgAAAAIAAAAAAAAAAwAAAAwAAAACAAAAAAAAAAIAAAADAAAAAwAAAAAAAAACAAAAAgAAAAMAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAACAAAAAgAAAAAAAAADAAAADQAAAAIAAAAAAAAAAgAAAAMAAAAEAAAAAAAAAAIAAAACAAAAAwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAIAAAACAAAAAAAAAAMAAAAGAAAAAgAAAAAAAAACAAAAAwAAAA8AAAAAAAAAAgAAAAIAAAADAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAAIAAAAAAAAAAwAAAAcAAAACAAAAAAAAAAIAAAADAAAAEAAAAAAAAAACAAAAAgAAAAMAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAACAAAAAgAAAAAAAAADAAAACAAAAAIAAAAAAAAAAgAAAAMAAAARAAAAAAAAAAIAAAACAAAAAwAAAA0AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAIAAAACAAAAAAAAAAMAAAAJAAAAAgAAAAAAAAACAAAAAwAAABIAAAAAAAAAAgAAAAIAAAADAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAgAAAAIAAAAAAAAAAwAAAAUAAAACAAAAAAAAAAIAAAADAAAAEwAAAAAAAAACAAAAAgAAAAMAAAAPAAAAAAAAAAAAAAAAAAAAAAAAABAAAAACAAAAAAAAAAIAAAABAAAAEwAAAAIAAAACAAAAAAAAAAUAAAAKAAAAAAAAAAIAAAACAAAAAwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAIAAAAAAAAAAgAAAAEAAAAPAAAAAgAAAAIAAAAAAAAABQAAAAsAAAAAAAAAAgAAAAIAAAADAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAASAAAAAgAAAAAAAAACAAAAAQAAABAAAAACAAAAAgAAAAAAAAAFAAAADAAAAAAAAAACAAAAAgAAAAMAAAASAAAAAAAAAAAAAAAAAAAAAAAAABMAAAACAAAAAAAAAAIAAAABAAAAEQAAAAIAAAACAAAAAAAAAAUAAAANAAAAAAAAAAIAAAACAAAAAwAAABMAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAIAAAAAAAAAAgAAAAEAAAASAAAAAgAAAAIAAAAAAAAABQAAAA4AAAAAAAAAAgAAAAIAAAADAAAAAgAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAEAAAACAAAAAQAAAAAAAAACAAAAAAAAAAUAAAAEAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAFAAAABAAAAAAAAAABAAAABQAAAAQAAAAAAAAABQAAAAAAAAACAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAQAAAAIAAAABAAAAAAAAAAIAAAACAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAAEAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAFAAAABAAAAAAAAAABAAAABQAAAAQAAAAAAAAABQAAAAUAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAAAAAAAAAAAQAAAAAAAAAAAAA6B6FaUp9QQTPXMuL4myJBraiDfBwx9UBYJseitzTIQOL5if9jqZtAnXX+Z+ycb0C3pucbhRBCQG8wJBYqpRRAlWbDCzCY5z/eFWBUEve6P/+qo4Q50Y4/D9YM3iCcYT8fcA2QJSA0P4ADxu0qAAc/BNcGolVJ2j5d9FACqwquPh9z7MthtI9CSUSYJke/YUJQ/64OyjU0Qpi0+HCmFQdCm3GfIVdh2kHsJ11kAyauQYC3UDFJOoFBSJsFV1OwU0FK5fcxX4AmQWhy/zZIt/lACqaCPsBjzUDbdUNIScugQMYQlVJ4MXNANiuq8GTvRUDxTXnulxEZQFZ8QX5kpuw/qmG/JwYFlEAluh3Q6DB+QKn4vyNq0GZAKOXekas+UUB8xabXXhI6QG63C2pLtSNAdDBtyNfLDUDyOcu67ID2P0rCMvRXAeE/Ki2TSVyzyT9Dk+8Sz2uzP5J+w5ARWp0/NQAoOiMuhj9YnP+RyMJwPxgW7TvQVFk/KgsLYF0kQz9g5dAC6IwzQcgHPVvDex1B1XjppodHBkHJq3OMM9fwQNvcmJ7wddlAInGPpQs/w0BRobq5EBmtQJZ2ai7n+ZVAtv2G5E+bgECG+gIfKBlpQK5f8jdI91JAL39sL/WpPEB8rGxhDqklQK6yUf43XhBAxL9y/tK8+D86XyZpgrHiPwAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////AAAAAP////8AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/////AAAAAAAAAAABAAAAAQAAAAAAAAAAAAAA/////wAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAP////8FAAAABQAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////wAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAFAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////AAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAEAAAAAAAAABQAAAAEAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAQABAAABAQAAAAAAAQAAAAEAAAABAAEAAAAAAAAAAAAAAAAAAAAAquJYWJZl+D9jaeZNtj/zPwwdI9KqaeO/qGefXwdHdz+q4lhYlmX4P+OrlPMN3PI/DB0j0qpp47+7SQLV4VIEQKriWFiWZfg/r2kma3tz8T82eQmLqNIGwMRIWXMqSvo/fcCszPux9j+jara6ozTwP6hnn18HR3c/MSoKLequ8r+SabgA2nj0P7jBLbDOHO8/1Ym/ICfH4T+6lxjvlFXHv73m373LRPU/0vXyDVxo7T+ToKRHJXMAQF/33578aPE/pAyy64tD9T8+U/hCvyruPwxv8Y7YYwLAuXYr8NAiCEB4+LDK0Sn0P1Qeuy4j+eo/OMx50n7K7L+TrGB/nyf8v5ehC2fbYPM/aXMKexiT6z8mFRIMjg/zP7yUVwGGBNw/E6opHERf8z/z0wR2g9DqPw4pBpcOhvu/NbA29uWAA8DMaTExyXzyP02biiQ+Ruk/S8jz2/FKBEB1pzZnpbb9P7pQU4wLfPI//7ZcQXeG6D9CqEQvAYoIwDB2VB6sSgRAVyv8H5We8T+EHWF8XNPmPzB2wT8Nrrg/SEi+cX+w4L8of+GtdSDxP1sjk5AdouU/6ZjOVru13r8K0obqI6bxvwVbdNXyhfA/w5GG024n5z+rwmtMzP8BwLw9pSX49QXABe/2uQxP8D+b6wCzCvXkP7uGT87fK+Q/pz/JWw4coj+qoBf2J0nwP/yE3PUo0+I/vFJeHcaC+D96luSIqvntP/bf8sHUYu8/gZNN41mL4z9bhOqVOF4FwO6lmAh1hQhAbCVxbdhk7z+1C8NdDcfiPwG36x/0OQBAx0WJ76c2+D9nlSHXANfuP2HlfZ3gqOE/EwnVlVPg9r96+oHzEH//v5bXzdT1Auw/DM3GwLsA4D9p/8uoKcr+v+U9x5DQVAPAehjSdghb7D9sc1IetODgP8MVwwB1pu6/azPk6OGe978W8t/TUc3rP+0QMvYfP+A/RsG/QpSE8D+l3uwScxzgPwQaifgujuw/k1Vti1I43z8MAwLnSh0GQH5nYnwwZgJAiGUzWC5s6j8WyyI/BbLgPw4iUapGeQJAB3W+imnp/j9BLWR4ssrpP2t+gG5Pstk/cpBsfm6DCMCOpU9dOZsFQEv8nFypHeo/ehJ6i+6S2D9jqlGEmarLv7STC5TRiOa/bC+x8WZD6D9H3yUkWpDZP8gZvmCMuQLAreY19/eRBsCoPOc8UzzpP6KI/QV+y9g/t/MoboyWzT+Hv5q3Zu3Mvy2xROCT4uY/9gQitMMg1T9abAqhWMDkv1oLTavoUfG/PMUJP9CD5j+fHRX3t6fSPz7W2gk6bvs/WRnuHwqN9D8YFturGCTmP1EZczv0b9I/5t4exabB5D/1ESLh5fTEP9X2z6SYweQ/6lv3I2zT0D9zkRGNUNMAQKoSvc4EIfs/Xggt8wQI5T+mJHHg/w/SP4lhT/9t8vQ/DrZ/DbwH7D+XlhbYZrjkP34LIpFt6c4/lwfp8fLX9L+j96CTTf76v3WdNhEv9uM/d8c3o4lV0D/vFdCHVcsFwAHeDq0F1QhApbYqcZiN5D9KoilqByXLPwX0/diA0vq/0fo0GxnxAMBbaTkvlCzjP/RrFrWXrMs/UYTrky7jA0DB9f4FiZYAQEGAk/3QzeE/r/TeqE8t0D/OqjlsnPbvvz8RKU8JOfW/smSEbK/O4T8MzuyPm3DDP/rFtctq9gZAfb1EVEaSA0Dts5dVInnhP18SFMc79MM/7y34cw6LAMDFrRJsZO0DwC2KLvLSYuA/hx5wcUHewz+49SnK/4ruPyeS0PX9a+E/ZxaaLvvZ3z8WPu5T2QS8Pygo4RIvMqa/BJ0Kqsd0279cKW4ay8jdP3b05bmZ364/10/qtdxk2r+Bcz6CDMvpv54qOw+Amdw/qLV71pW7sT/YKc80nIPUP8OfIaBJ77G/LyTuD1un2z+diYu8efWzP1wU7ACkfwjAZroyPL1yBkAmv3lKJJbbPysKSE4W+p0/dIgqY79TA8ATLTOQ3tsGwJ2zweD/Xdg/XO/jXeFUaL8VW2qLFKfov1cA9Aa6XfK/tIa7YGgI2T+f3hu/sxqPv2nXdPpf3Pc/jkw8Jbda8j+tT/z8tGPVP1yBHpJd35k/KYvYOy1s8j/yz+kCQjPrP9+agH7x59g/PZfJ9aBhpr/rDKzvYBb+PwtkiaGCt/c/vb1mVr+f1T/JIHwHc8Govw7aeF6+9vG/Xv7kD6fp979isYioQYHVP7AIQZuSFrG/3z1AdUTnAUDN3XY9O7f9P0AdQ9ljYNQ/dJANJPTOrb8kLECUiiPlP4yF7UgmStA/9xGmXxCG1T9qZzix4W2zv2SGJRJVrPe/Fh9a2M/B/b8IexzFCoPSP9y1QFD2bLe/Q86cWLJe/b+mOOfYm78BwOTjkPAGE9E/8aPCUKu/ub9pPZyLCiUGwBA7Mev/BQlALOmrlRi+0j+AMJ/dKULBv7iLtL6a6QRAEMDV/yajAUDa62dE3crJP1P70RgBUbq/38hVnR6esT/s1tG10Z/Ov/zLwalHPss/dTS9NKTXx78nMcRzCIEHQAabxDsAmQRA0tyLK3gSyT+Aui7nOhDGv5Gs58z3WgHATN3forJuBMCAui7nOhDGP9Lciyt4Esm/WAJyHQ4c7z8UP5HFIs3iP3U0vTSk18c//MvBqUc+y7+cvv8HLg/Kvy1I/mHsI+K/U/vRGAFRuj/a62dE3crJv8p+WV8KlQjAuQ/nOP43B0CAMJ/dKULBPyzpq5UYvtK/ZoU+VoLh4L9etLlRUfvtv/GjwlCrv7k/5OOQ8AYT0b9DfT9FhufXPwUX8hJp+4u/3LVAUPZstz8IexzFCoPSv9+L609E5fQ/q9Fz7X2J7T9qZzix4W2zP/cRpl8QhtW/vtNilqGX+j8MOy7QJoL0P3SQDST0zq0/QB1D2WNg1L8IIjSvGNkDwGB8Jou2GAfAsAhBm5IWsT9isYioQYHVvyS9D3zb6uy/gnwRa7uM9L/JIHwHc8GoP729Zla/n9W/CsAHJZwmAEDEW6OYT1r6Pz2XyfWgYaY/35qAfvHn2L83Tdy4lS30vxf2/gZ0jPq/XIEekl3fmb+tT/z8tGPVvybPr2zJ1/+/K7mJ0ypVAsCf3hu/sxqPPwCGu2BoCNm/5oITrpZn+r+UDUyDP+n/v1zv413hVGg/nbPB4P9d2L9MlmkxNvgCQMtZlKE85v8/KwpIThb6nb8mv3lKJJbbv8+SZsTvOOc/pQCIIOYw0j+diYu8efWzvy8k7g9bp9u/kxYDa+pKtD9XlYvA8HnVv6i1e9aVu7G/nio7D4CZ3L/WR6rNh5EGwCkgQweBkghAdvTluZnfrr9cKW4ay8jdvxbjhr1f1QVAR5C0MzivAkAWPu5T2QS8v2cWmi772d+/cKj4lzLJCEBx2QJfYrMFQIcecHFB3sO/LYou8tJi4L+jr7lhO38BwIcI0Nb7xgTAXxIUxzv0w7/ts5dVInnhv0T+l8DZLfE/MP3FoFvS5D8MzuyPm3DDv7JkhGyvzuG/tzhzRIRc0b9Ovv3/0z7mv6/03qhPLdC/m4CT/dDN4b9dwjU5VCQBQBBJX1ntCv0/9GsWtZesy79baTkvlCzjv1mjYgEz++S/oW6KnOQW8b9KoilqByXLv6W2KnGYjeS/SmaKz3Vx9z+BZB5yxGHwP3fHN6OJVdC/dZ02ES/2478PuaBjLrXaP4/JU81pPaO/fgsikW3pzr+XlhbYZrjkv4tSn7YDbP0/f2LnFKlF9z+mJHHg/w/Sv14ILfMECOW/mfg4qYhR/b+OP+RQDCACwOpb9yNs09C/1fbPpJjB5L9pN2WOVZ3wv3hHy9nxIve/URlzO/Rv0r8YFturGCTmv1d1/KKR8QPA8gsy9qzSB8CfHRX3t6fSvzzFCT/Qg+a/EYStnrzV9r/2QJqI7Lb9v/YEIrTDINW/LbFE4JPi5r/7kQEs5fEDQHunnf4GeQBAooj9BX7L2L+oPOc8Uzzpv+ydYY2SSAfAL4HK6CRTB0BH3yUkWpDZv2wvsfFmQ+i/Ik0Yzruh6T8fM3LoGoDUP3oSeovukti/S/ycXKkd6r9rEv+7UWcHQCRIQe/GfwNAa36Abk+y2b9BLWR4ssrpv9KT87qa0bM/FTyktw823L8WyyI/BbLgv4hlM1gubOq/DizMp9Ki6r8b5ckdjVrzv5NVbYtSON+/BBqJ+C6O7L/dUBFqgyXYv00Wh18r7+q/7RAy9h8/4L8W8t/TUc3rv4RM5DKx3wDAfvWIj94aBcBsc1IetODgv3oY0nYIW+y/oGcTFF54AUDkJqS/FKX6PwzNxsC7AOC/ltfN1PUC7L+5Wrz/zHnzP6688w2rNOc/YeV9neCo4b9nlSHXANfuvw9RsxKjY/s/1V8GteXE8j+1C8NdDcfiv2wlcW3YZO+/IOywaA7Q8b9bFP+4Tg36v4GTTeNZi+O/9t/ywdRi77+tRc3yFR7eP2bkcHXJkLO//ITc9SjT4r+qoBf2J0nwv2YHKoswwfm/iQcLspCjAcCb6wCzCvXkvwXv9rkMT/C/YkuwYAMXBMApCNUai9kIwMORhtNuJ+e/BVt01fKF8L+ZqWEfvIjsP6h693QZYNk/WyOTkB2i5b8of+GtdSDxvwpaaulDSwVADMQAX+lOAECEHWF8XNPmv1cr/B+VnvG/XyFG6opcCMD/mtR32/UEQP+2XEF3hui/ulBTjAt88r/imfCfRP+yP9zbvtc8XeO/TZuKJD5G6b/MaTExyXzyvxiTQeElXOO/rbJRQVGN9L/z0wR2g9DqvxOqKRxEX/O/FDGCEei99j9x8zV4VYTmP2lzCnsYk+u/l6ELZ9tg878pRXacaDT/v3k6GZRqoQXAVB67LiP56r94+LDK0Sn0vwO6pZ9b7wFAvK0nKVcc9j8+U/hCvyruv6QMsuuLQ/W/FPhKFYv46j8MyxaDTOW/v9L18g1caO2/vebfvctE9b/7GD8ZrF3xv3gx1AR9bQDAuMEtsM4c77+SabgA2nj0v5xKFIwxsATArKNSBaKsB0Cjara6ozTwv33ArMz7sfa/dF2U0FcWCcDxL357DJX/P69pJmt7c/G/quJYWJZl+L/YntVJlnrSP4sRLzXM+fe/46uU8w3c8r+q4lhYlmX4v85lu5+QRwRAsI0H/WU8479jaeZNtj/zv6riWFiWZfi/sI0H/WU847/OZbufkEcEQHAoPUBrnss/9exKzDtFtT88wM8kax+gP9OqeKeAYog/MW0ItiZvcj+ph+smvt5bP2lCaV5dEUU/StaUmQDaLz+kK9y22BMYP0O3whZuMwI/IIbgZGWE6z7UkjYaEM3UPuezxwa9cr8+LybxRMnFpz6E1N8DbPiRPsYjySMvK3s+//////8fAAj//////zMQCP////9/MiAI/////28yMAj/////YzJACP///z9iMlAI////N2IyYAj///8zYjJwCP//vzNiMoAI//+rM2IykAj/f6szYjKgCP8PqzNiMrAI/wOrM2IywAi/A6szYjLQCJ8DqzNiMuAImQOrM2Iy8Aj//////z8PCP//////Kx8I/////38pLwj/////Pyk/CP////85KU8I////PzgpXwj///8POClvCP///w44KX8I//8fDjgpjwj//w8OOCmfCP9/DQ44Ka8I/w8NDjgpvwj/DQ0OOCnPCP8MDQ44Kd8IxwwNDjgp7wjEDA0OOCn/CAcAAAAHAAAAAQAAAAIAAAAEAAAAAwAAAAAAAAAAAAAABwAAAAMAAAABAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAAAAQAAAAMAAAAOAAAABgAAAAsAAAACAAAABwAAAAEAAAAYAAAABQAAAAoAAAABAAAABgAAAAAAAAAmAAAABwAAAAwAAAADAAAACAAAAAIAAAAxAAAACQAAAA4AAAAAAAAABQAAAAQAAAA6AAAACAAAAA0AAAAEAAAACQAAAAMAAAA/AAAACwAAAAYAAAAPAAAACgAAABAAAABIAAAADAAAAAcAAAAQAAAACwAAABEAAABTAAAACgAAAAUAAAATAAAADgAAAA8AAABhAAAADQAAAAgAAAARAAAADAAAABIAAABrAAAADgAAAAkAAAASAAAADQAAABMAAAB1AAAADwAAABMAAAARAAAAEgAAABAAAAAGAAAAAgAAAAMAAAAFAAAABAAAAAAAAAAAAAAAAAAAAAYAAAACAAAAAwAAAAEAAAAFAAAABAAAAAAAAAAAAAAABwAAAAUAAAADAAAABAAAAAEAAAAAAAAAAgAAAAAAAAACAAAAAwAAAAEAAAAFAAAABAAAAAYAAAAAAAAAAAAAABgtRFT7Ifk/GC1EVPsh+b8YLURU+yEJQBgtRFT7IQnAYWxnb3MuYwBoM05laWdoYm9yUm90YXRpb25zAGNvb3JkaWprLmMAX3VwQXA3Q2hlY2tlZABfdXBBcDdyQ2hlY2tlZABkaXJlY3RlZEVkZ2UuYwBkaXJlY3RlZEVkZ2VUb0JvdW5kYXJ5AGFkamFjZW50RmFjZURpclt0bXBGaWprLmZhY2VdW2ZpamsuZmFjZV0gPT0gS0kAZmFjZWlqay5jAF9mYWNlSWprUGVudFRvQ2VsbEJvdW5kYXJ5AGFkamFjZW50RmFjZURpcltjZW50ZXJJSksuZmFjZV1bZmFjZTJdID09IEtJAF9mYWNlSWprVG9DZWxsQm91bmRhcnkAaDNJbmRleC5jAGNvbXBhY3RDZWxscwBsYXRMbmdUb0NlbGwAY2VsbFRvQ2hpbGRQb3MAdmFsaWRhdGVDaGlsZFBvcwBsYXRMbmcuYwBjZWxsQXJlYVJhZHMyAHBvbHlnb24tPm5leHQgPT0gTlVMTABsaW5rZWRHZW8uYwBhZGROZXdMaW5rZWRQb2x5Z29uAG5leHQgIT0gTlVMTABsb29wICE9IE5VTEwAYWRkTmV3TGlua2VkTG9vcABwb2x5Z29uLT5maXJzdCA9PSBOVUxMAGFkZExpbmtlZExvb3AAY29vcmQgIT0gTlVMTABhZGRMaW5rZWRDb29yZABsb29wLT5maXJzdCA9PSBOVUxMAGlubmVyTG9vcHMgIT0gTlVMTABub3JtYWxpemVNdWx0aVBvbHlnb24AYmJveGVzICE9IE5VTEwAY2FuZGlkYXRlcyAhPSBOVUxMAGZpbmRQb2x5Z29uRm9ySG9sZQBjYW5kaWRhdGVCQm94ZXMgIT0gTlVMTAByZXZEaXIgIT0gSU5WQUxJRF9ESUdJVABsb2NhbGlqLmMAY2VsbFRvTG9jYWxJamsAYmFzZUNlbGwgIT0gb3JpZ2luQmFzZUNlbGwAIShvcmlnaW5PblBlbnQgJiYgaW5kZXhPblBlbnQpAGJhc2VDZWxsID09IG9yaWdpbkJhc2VDZWxsAGJhc2VDZWxsICE9IElOVkFMSURfQkFTRV9DRUxMAGxvY2FsSWprVG9DZWxsACFfaXNCYXNlQ2VsbFBlbnRhZ29uKGJhc2VDZWxsKQBiYXNlQ2VsbFJvdGF0aW9ucyA+PSAwAGdyaWRQYXRoQ2VsbHMAcG9seWZpbGwuYwBpdGVyU3RlcFBvbHlnb25Db21wYWN0ADAAdmVydGV4LmMAdmVydGV4Um90YXRpb25zAGNlbGxUb1ZlcnRleABncmFwaC0+YnVja2V0cyAhPSBOVUxMAHZlcnRleEdyYXBoLmMAaW5pdFZlcnRleEdyYXBoAG5vZGUgIT0gTlVMTABhZGRWZXJ0ZXhOb2Rl";var G="function"==typeof atob?atob:function(A){var e,t,r,n,o,i,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",s="",l=0;A=A.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{e=a.indexOf(A.charAt(l++))<<2|(n=a.indexOf(A.charAt(l++)))>>4,t=(15&n)<<4|(o=a.indexOf(A.charAt(l++)))>>2,r=(3&o)<<6|(i=a.indexOf(A.charAt(l++))),s+=String.fromCharCode(e),64!==o&&(s+=String.fromCharCode(t)),64!==i&&(s+=String.fromCharCode(r))}while(l=0){if((0|t)>13780509){if(0|(a=0|le(15,s)))break;s=0|n[(l=s)>>2],l=0|n[l+4>>2]}else c=0|Xe(0|t,0|(a=((0|t)<0)<<31>>31),3,0),l=0|B(),a=0|We(0|t,0|a,1,0),a=0|We(0|(a=0|Xe(0|c,0|l,0|a,0|B())),0|B(),1,0),l=0|B(),n[s>>2]=a,n[s+4>>2]=l,s=a;if(lt(0|r,0,s<<3),0|o){lt(0|o,0,s<<2),a=0|L(A,e,t,r,o,s,l,0);break}(a=0|Ve(s,4))?(c=0|L(A,e,t,r,a,s,l,0),Ye(a),a=c):a=13}else a=2}while(0);return S=i,0|a}function T(A,e,t,r,o){A|=0,e|=0,t|=0,r|=0,o|=0;var i,a,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0;if(a=S,S=S+16|0,m=a+8|0,n[(h=i=a)>>2]=A,n[h+4>>2]=e,(0|t)<0)return S=a,2;if(n[(s=r)>>2]=A,n[s+4>>2]=e,(s=!!(0|o))&&(n[o>>2]=0),0|zA(A,e))return S=a,9;n[m>>2]=0;A:do{if((0|t)>=1)if(s)for(f=1,d=0,g=0,h=1,s=A;;){if(!(d|g)){if(0|(s=0|R(s,e,4,m,i)))break A;if(0|zA(s=0|n[(e=i)>>2],e=0|n[e+4>>2])){s=9;break A}}if(0|(s=0|R(s,e,0|n[26800+(g<<2)>>2],m,i)))break A;if(s=0|n[(e=i)>>2],e=0|n[e+4>>2],n[(A=r+(f<<3)|0)>>2]=s,n[A+4>>2]=e,n[o+(f<<2)>>2]=h,l=(0|(A=d+1|0))==(0|h),u=6==(0|(c=g+1|0)),0|zA(s,e)){s=9;break A}if((0|(h=h+(u&l&1)|0))>(0|t)){s=0;break}f=f+1|0,d=l?0:A,g=l?u?0:c:g}else for(f=1,d=0,g=0,h=1,s=A;;){if(!(d|g)){if(0|(s=0|R(s,e,4,m,i)))break A;if(0|zA(s=0|n[(e=i)>>2],e=0|n[e+4>>2])){s=9;break A}}if(0|(s=0|R(s,e,0|n[26800+(g<<2)>>2],m,i)))break A;if(s=0|n[(e=i)>>2],e=0|n[e+4>>2],n[(A=r+(f<<3)|0)>>2]=s,n[A+4>>2]=e,l=(0|(A=d+1|0))==(0|h),u=6==(0|(c=g+1|0)),0|zA(s,e)){s=9;break A}if((0|(h=h+(u&l&1)|0))>(0|t)){s=0;break}f=f+1|0,d=l?0:A,g=l?u?0:c:g}else s=0}while(0);return S=a,0|s}function L(A,e,t,r,o,i,a,s){t|=0,r|=0,o|=0,s|=0;var l,c,u,d=0,f=0,g=0,h=0,m=0,b=0,p=0;if(u=S,S=S+16|0,l=u+8|0,c=u,d=0|At(0|(A|=0),0|(e|=0),0|(i|=0),0|(a|=0)),g=0|B(),!(!(0|(p=0|n[(b=h=r+(d<<3)|0)>>2]))&!(0|(b=0|n[b+4>>2]))|(f=(0|p)==(0|A)&(0|b)==(0|e))))do{d=0|$e(0|(d=0|We(0|d,0|g,1,0)),0|B(),0|i,0|a),g=0|B(),f=(0|(b=0|n[(p=h=r+(d<<3)|0)>>2]))==(0|A)&(0|(p=0|n[p+4>>2]))==(0|e)}while(!(!(0|b)&!(0|p)|f));if(d=o+(d<<2)|0,f&&(0|n[d>>2])<=(0|s))return S=u,0;if(n[(p=h)>>2]=A,n[p+4>>2]=e,n[d>>2]=s,(0|s)>=(0|t))return S=u,0;switch(f=s+1|0,n[l>>2]=0,0|(d=0|R(A,e,2,l,c))){case 9:m=9;break;case 0:(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f))||(m=9)}A:do{if(9==(0|m)){switch(n[l>>2]=0,0|(d=0|R(A,e,3,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|R(A,e,1,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|R(A,e,5,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|R(A,e,4,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|R(A,e,6,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}return S=u,0}}while(0);return S=u,0|d}function R(A,e,t,r,o){A|=0,e|=0,o|=0;var i,a,s=0,l=0,c=0,u=0,d=0,f=0,g=0;if((t|=0)>>>0>6)return 1;if(d=(0|n[(r|=0)>>2])%6|0,n[r>>2]=d,(0|d)>0){s=0;do{t=0|vA(t),s=s+1|0}while((0|s)<(0|n[r>>2]))}if(d=0|tt(0|A,0|e,45),B(),(a=127&d)>>>0>121)return 5;i=0|OA(A,e),s=0|tt(0|A,0|e,52),B(),s&=15;A:do{if(s){for(;;){if(c=0|tt(0|A,0|e,0|(l=3*(15-s|0)|0)),B(),7==(0|(c&=7))){e=5;break}if(g=!(0|ZA(s)),s=s+-1|0,f=0|rt(7,0,0|l),e&=~B(),A=0|rt(0|n[(g?432:16)+(28*c|0)+(t<<2)>>2],0,0|l)|A&~f,e|=l=0|B(),!(t=0|n[(g?640:224)+(28*c|0)+(t<<2)>>2])){t=0;break A}if(!s){u=8;break A}}return 0|e}u=8}while(0);8==(0|u)&&(A|=0|rt(0|(g=0|n[848+(28*a|0)+(t<<2)>>2]),0,45),e=B()|-1040385&e,t=0|n[4272+(28*a|0)+(t<<2)>>2],127&~g||(g=0|rt(0|n[848+(28*a|0)+20>>2],0,45),e=B()|-1040385&e,t=0|n[4272+(28*a|0)+20>>2],A=0|YA(g|A,e),e=0|B(),n[r>>2]=1+(0|n[r>>2]))),c=0|tt(0|A,0|e,45),B(),c&=127;A:do{if(0|H(c)){e:do{if(1==(0|OA(A,e))){if((0|a)!=(0|c)){if(0|Y(c,0|n[7696+(28*a|0)>>2])){A=0|WA(A,e),l=1,e=0|B();break}M(27795,26864,533,26872)}switch(0|i){case 3:A=0|YA(A,e),e=0|B(),n[r>>2]=1+(0|n[r>>2]),l=0;break e;case 5:A=0|WA(A,e),e=0|B(),n[r>>2]=5+(0|n[r>>2]),l=0;break e;case 0:return 9;default:return 1}}else l=0}while(0);if((0|t)>0){s=0;do{A=0|UA(A,e),e=0|B(),s=s+1|0}while((0|s)!=(0|t))}if((0|a)!=(0|c)){if(!(0|G(c))){if(!!(0|l)|5!=(0|OA(A,e)))break;n[r>>2]=1+(0|n[r>>2]);break}switch(127&d){case 8:case 118:break A}3!=(0|OA(A,e))&&(n[r>>2]=1+(0|n[r>>2]))}}else if((0|t)>0){s=0;do{A=0|YA(A,e),e=0|B(),s=s+1|0}while((0|s)!=(0|t))}}while(0);return n[r>>2]=((0|n[r>>2])+t|0)%6|0,n[(g=o)>>2]=A,n[g+4>>2]=e,0}function I(A,e,t,r){A|=0,e|=0,t|=0,r|=0;var o,i,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0;if(i=S,S=S+16|0,h=i+8|0,n[(g=o=i)>>2]=A,n[g+4>>2]=e,(0|t)<0)return S=i,2;if(!t)return n[(h=r)>>2]=A,n[h+4>>2]=e,S=i,0;n[h>>2]=0;A:do{if(0|zA(A,e))A=9;else{a=0,g=A;do{if(0|(A=0|R(g,e,4,h,o)))break A;if(a=a+1|0,0|zA(g=0|n[(e=o)>>2],e=0|n[e+4>>2])){A=9;break A}}while((0|a)<(0|t));n[(f=r)>>2]=g,n[f+4>>2]=e,f=t+-1|0,d=0,A=1;do{if(a=26800+(d<<2)|0,5==(0|d))for(l=0|n[a>>2],s=0,a=A;;){if(0|(A=0|R(0|n[(A=o)>>2],0|n[A+4>>2],l,h,o)))break A;if((0|s)!=(0|f)){if(c=0|n[(u=o)>>2],u=0|n[u+4>>2],n[(A=r+(a<<3)|0)>>2]=c,n[A+4>>2]=u,0|zA(c,u)){A=9;break A}A=a+1|0}else A=a;if((0|(s=s+1|0))>=(0|t))break;a=A}else for(l=o,u=0|n[a>>2],c=0,a=A,s=0|n[l>>2],l=0|n[l+4>>2];;){if(0|(A=0|R(s,l,u,h,o)))break A;if(s=0|n[(l=o)>>2],l=0|n[l+4>>2],n[(A=r+(a<<3)|0)>>2]=s,n[A+4>>2]=l,A=a+1|0,0|zA(s,l)){A=9;break A}if((0|(c=c+1|0))>=(0|t))break;a=A}d=d+1|0}while(d>>>0<6);A=(0|g)==(0|n[(A=o)>>2])&&(0|e)==(0|n[A+4>>2])?0:9}}while(0);return S=i,0|A}function _(A,e,t,r){t|=0,r|=0;var o,i,a,s=0,l=0;for(a=S,S=S+16|0,o=a,i=a+8|0,s=(s=!(0|zA(A|=0,e|=0)))?1:2;;){if(n[i>>2]=0,!(0|R(A,e,s,i,o))&((0|n[(l=o)>>2])==(0|t)?(0|n[l+4>>2])==(0|r):0)){A=4;break}if((s=s+1|0)>>>0>=7){s=7,A=4;break}}return 4==(0|A)?(S=a,0|s):0}function z(A,e,t,r,i,a,s){e|=0,t|=0,r|=0,i|=0,a|=0,s|=0;var l,c,u,d,f,g,h,m,b,p,v=0,y=0,w=0,x=0,k=0,C=0,M=0,D=0,E=0,j=0,Q=0,N=0,F=0,P=0,T=0,L=0,R=0,I=0,_=0;if(p=S,S=S+64|0,h=p+48|0,m=p+32|0,b=p+24|0,l=p+8|0,c=p,(0|(y=0|n[(A|=0)>>2]))<=0)return S=p,0;for(u=A+4|0,d=h+8|0,f=m+8|0,g=l+8|0,v=0,F=0;;){N=(w=0|n[u>>2])+(F<<4)|0,n[h>>2]=n[N>>2],n[h+4>>2]=n[N+4>>2],n[h+8>>2]=n[N+8>>2],n[h+12>>2]=n[N+12>>2],(0|F)==(y+-1|0)?(n[m>>2]=n[w>>2],n[m+4>>2]=n[w+4>>2],n[m+8>>2]=n[w+8>>2],n[m+12>>2]=n[w+12>>2]):(N=w+(F+1<<4)|0,n[m>>2]=n[N>>2],n[m+4>>2]=n[N+4>>2],n[m+8>>2]=n[N+8>>2],n[m+12>>2]=n[N+12>>2]),y=0|tA(h,m,r,b);A:do{if(y)w=0,v=y;else if(w=0|n[(y=b)>>2],(0|(y=0|n[y+4>>2]))>0|!(0|y)&w>>>0>0){Q=0,N=0;e:for(;;){if(R=1/(+(w>>>0)+4294967296*+(0|y)),_=+o[h>>3],I=+((y=0|Ze(0|w,0|y,0|Q,0|N))>>>0)+4294967296*+(0|B()),L=+(Q>>>0)+4294967296*+(0|N),o[l>>3]=R*(_*I)+R*(+o[m>>3]*L),o[g>>3]=R*(+o[d>>3]*I)+R*(+o[f>>3]*L),0|(y=0|KA(l,r,c))){v=y;break}C=0|At(0|(E=0|n[(j=c)>>2]),0|(j=0|n[j+4>>2]),0|e,0|t),x=0|B(),w=0|n[(k=y=s+(C<<3)|0)>>2],k=0|n[k+4>>2];t:do{if(!(0|w)&!(0|k))P=y,T=16;else for(M=0,D=0;;){if((0|M)>(0|t)|(0|M)==(0|t)&D>>>0>e>>>0){v=1;break e}if((0|w)==(0|E)&(0|k)==(0|j))break t;if(C=0|$e(0|(y=0|We(0|C,0|x,1,0)),0|B(),0|e,0|t),x=0|B(),D=0|We(0|D,0|M,1,0),M=0|B(),!(0|(w=0|n[(k=y=s+(C<<3)|0)>>2]))&!(0|(k=0|n[k+4>>2]))){P=y,T=16;break}}}while(0);if(16!=(0|T)||(T=0,!(0|E)&!(0|j))||(n[(D=P)>>2]=E,n[D+4>>2]=j,D=a+(n[i>>2]<<3)|0,n[D>>2]=E,n[D+4>>2]=j,D=0|We(0|n[(D=i)>>2],0|n[D+4>>2],1,0),E=0|B(),n[(j=i)>>2]=D,n[j+4>>2]=E),Q=0|We(0|Q,0|N,1,0),N=0|B(),w=0|n[(y=b)>>2],!((0|(y=0|n[y+4>>2]))>(0|N)|(0|y)==(0|N)&w>>>0>Q>>>0)){w=1;break A}}w=0}else w=1}while(0);if(F=F+1|0,!w){T=21;break}if((0|F)>=(0|(y=0|n[A>>2]))){v=0,T=21;break}}return 21==(0|T)?(S=p,0|v):0}function H(A){return(A|=0)>>>0>121?0|(A=0):0|(A=0|n[7696+(28*A|0)+16>>2])}function G(A){return 4==(0|(A|=0))|117==(0|A)|0}function O(A){return 0|n[11120+(216*(0|n[(A|=0)>>2])|0)+(72*(0|n[A+4>>2])|0)+(24*(0|n[A+8>>2])|0)+(n[A+12>>2]<<3)>>2]}function U(A){return 0|n[11120+(216*(0|n[(A|=0)>>2])|0)+(72*(0|n[A+4>>2])|0)+(24*(0|n[A+8>>2])|0)+(n[A+12>>2]<<3)+4>>2]}function Y(A,e){return e|=0,(0|n[7696+(28*(A|=0)|0)+20>>2])==(0|e)?0|(e=1):0|(e=(0|n[7696+(28*A|0)+24>>2])==(0|e))}function V(A,e){return 0|n[848+(28*(A|=0)|0)+((e|=0)<<2)>>2]}function W(A,e){return e|=0,(0|n[848+(28*(A|=0)|0)>>2])==(0|e)?0|(e=0):(0|n[848+(28*A|0)+4>>2])==(0|e)?0|(e=1):(0|n[848+(28*A|0)+8>>2])==(0|e)?0|(e=2):(0|n[848+(28*A|0)+12>>2])==(0|e)?0|(e=3):(0|n[848+(28*A|0)+16>>2])==(0|e)?0|(e=4):(0|n[848+(28*A|0)+20>>2])==(0|e)?0|(e=5):0|((0|n[848+(28*A|0)+24>>2])==(0|e)?6:7)}function Z(A){var e,t,r;return e=(r=+o[16+(A|=0)>>3])-(t=+o[A+24>>3]),+(r>3]<+o[A+24>>3]|0}function J(A){return+(+o[(A|=0)>>3]-+o[A+8>>3])}function q(A,e){A|=0;var t,r,n=0;return(n=+o[(e|=0)>>3])>=+o[A+8>>3]&&n<=+o[A>>3]?(t=+o[A+16>>3],n=+o[A+24>>3],e=(r=+o[e+8>>3])>=n,A=r<=t&1,t>3]<+o[e+8>>3]||+o[A+8>>3]>+o[e>>3]?0|(s=0):(n=(l=+o[A+16>>3])<(u=+o[(t=A+24|0)>>3]),c=(a=+o[(s=e+16|0)>>3])<(i=+o[(r=e+24|0)>>3]),e=u-a>3],e)||(u=+ie(+o[t>>3],A))>+ie(+o[s>>3],e)?0|(c=0):0|(c=1))}function $(A,e){e|=0;var t,r,n,i,a,s=0,l=0,c=0,u=0;return+o[(A|=0)>>3]<+o[e>>3]||+o[A+8>>3]>+o[e+8>>3]?0|(s=0):(n=(i=+o[(s=A+16|0)>>3])<(l=+o[A+24>>3]),c=(u=+o[(t=e+16|0)>>3])<(a=+o[(r=e+24|0)>>3]),e=l-u>3],e)?0|(c=(u=+ie(+o[s>>3],A))>=+ie(+o[t>>3],e)):0|(c=0))}function AA(A,e){A|=0,e|=0;var t,r,i,a,s,l=0;i=S,S=S+176|0,n[(r=i)>>2]=4,l=+o[e>>3],o[r+8>>3]=l,a=+o[e+16>>3],o[r+16>>3]=a,o[r+24>>3]=l,l=+o[e+24>>3],o[r+32>>3]=l,s=+o[e+8>>3],o[r+40>>3]=s,o[r+48>>3]=l,o[r+56>>3]=s,o[r+64>>3]=a,t=96+(e=r+72|0)|0;do{n[e>>2]=0,e=e+4|0}while((0|e)<(0|t));st(0|A,0|r,168),S=i}function eA(A,e,t){A|=0,e|=0,t|=0;var r,a,c,u,d,f,g,h=0,m=0,b=0,p=0,y=0,x=0,k=0;f=S,S=S+288|0,d=f+264|0,p=f+96|0,m=(h=b=f)+96|0;do{n[h>>2]=0,h=h+4|0}while((0|h)<(0|m));return 0|(e=0|Ae(e,b))?(S=f,0|(x=e)):(XA(b=0|n[(m=b)>>2],m=0|n[m+4>>2],d),$A(b,m,p),u=+ae(d,p+8|0),o[d>>3]=+o[A>>3],o[(m=d+8|0)>>3]=+o[A+16>>3],o[p>>3]=+o[A+8>>3],o[(b=p+8|0)>>3]=+o[A+24>>3],a=+ae(d,p),k=+o[m>>3]-+o[b>>3],c=+l(+k),g=+o[d>>3]-+o[p>>3],r=+l(+g),!(0==k|0==g)&&(k=+ot(+c,+r),k=+v(+a*a/+it(+k/+it(+c,+r),3)/(u*(2.59807621135*u)*.8)),o[i>>3]=k,y=~~k>>>0,x=+l(k)>=1?k>0?~~+w(+s(k/4294967296),4294967295)>>>0:~~+v((k-+(~~k>>>0))/4294967296)>>>0:0,2146435072&~n[i+4>>2])?(p=!(0|y)&!(0|x),n[(e=t)>>2]=p?1:y,n[e+4>>2]=p?0:x,e=0):e=1,S=f,0|(x=e))}function tA(A,e,t,r){A|=0,e|=0,t|=0,r|=0;var a,c,u,d,f=0,g=0,h=0;d=S,S=S+288|0,c=d+264|0,u=d+96|0,a=(f=g=d)+96|0;do{n[f>>2]=0,f=f+4|0}while((0|f)<(0|a));return 0|(t=0|Ae(t,g))?(S=d,0|(r=t)):(XA(f=0|n[(t=g)>>2],t=0|n[t+4>>2],c),$A(f,t,u),h=+ae(c,u+8|0),h=+v(+ +ae(A,e)/(2*h)),o[i>>3]=h,t=~~h>>>0,f=+l(h)>=1?h>0?~~+w(+s(h/4294967296),4294967295)>>>0:~~+v((h-+(~~h>>>0))/4294967296)>>>0:0,2146435072&~n[i+4>>2]?(g=!(0|t)&!(0|f),n[r>>2]=g?1:t,n[r+4>>2]=g?0:f,S=d,0|(r=0)):(S=d,0|(r=1)))}function rA(A,e,t,r){e|=0,t|=0,r|=0,n[(A|=0)>>2]=e,n[A+4>>2]=t,n[A+8>>2]=r}function nA(A){var e,t=0,r=0,o=0,i=0,a=0;t=0|n[(A|=0)>>2],r=0|n[(e=A+4|0)>>2],(0|t)<0&&(r=r-t|0,n[e>>2]=r,n[(a=A+8|0)>>2]=(0|n[a>>2])-t,n[A>>2]=0,t=0),(0|r)<0?(t=t-r|0,n[A>>2]=t,i=(0|n[(a=A+8|0)>>2])-r|0,n[a>>2]=i,n[e>>2]=0,r=0):(a=i=A+8|0,i=0|n[i>>2]),(0|i)<0&&(t=t-i|0,n[A>>2]=t,r=r-i|0,n[e>>2]=r,n[a>>2]=0,i=0),(0|(o=(0|i)<(0|(o=(0|r)<(0|t)?r:t))?i:o))<=0||(n[A>>2]=t-o,n[e>>2]=r-o,n[a>>2]=i-o)}function oA(A,e){var t,r;e|=0,r=0|n[8+(A|=0)>>2],t=+((0|n[A+4>>2])-r|0),o[e>>3]=+((0|n[A>>2])-r|0)-.5*t,o[e+8>>3]=.8660254037844386*t}function iA(A,e,t){A|=0,e|=0,n[(t|=0)>>2]=(0|n[e>>2])+(0|n[A>>2]),n[t+4>>2]=(0|n[e+4>>2])+(0|n[A+4>>2]),n[t+8>>2]=(0|n[e+8>>2])+(0|n[A+8>>2])}function aA(A,e,t){A|=0,e|=0,n[(t|=0)>>2]=(0|n[A>>2])-(0|n[e>>2]),n[t+4>>2]=(0|n[A+4>>2])-(0|n[e+4>>2]),n[t+8>>2]=(0|n[A+8>>2])-(0|n[e+8>>2])}function sA(A,e){e|=0;var t,r=0;r=0|y(0|n[(A|=0)>>2],e),n[A>>2]=r,t=0|y(0|n[(r=A+4|0)>>2],e),n[r>>2]=t,e=0|y(0|n[(A=A+8|0)>>2],e),n[A>>2]=e}function lA(A){var e,t,r=0,o=0,i=0,a=0,s=0;s=(0|(t=0|n[(A|=0)>>2]))<0,A=(A=(o=(0|(a=((e=(0|(i=(0|n[A+4>>2])-(s?t:0)|0))<0)?0-i|0:0)+((0|n[A+8>>2])-(s?t:0))|0))<0)?0:a)-((i=(0|(o=(0|A)<(0|(o=(0|(r=(e?0:i)-(o?a:0)|0))<(0|(a=(s?0:t)-(e?i:0)-(o?a:0)|0))?r:a))?A:o))>0)?o:0)|0,r=r-(i?o:0)|0;A:do{switch(a-(i?o:0)|0){case 0:switch(0|r){case 0:return 0|(0|A?1==(0|A)?1:7:0);case 1:return 0|(0|A?1==(0|A)?3:7:2);default:break A}case 1:switch(0|r){case 0:return 0|(0|A?1==(0|A)?5:7:4);case 1:if(A)break A;return 6;default:break A}}}while(0);return 7}function cA(A){var e,t,r=0,o=0,i=0,a=0,s=0,l=0,c=0;if(l=0|n[(t=8+(A|=0)|0)>>2],(e=(0|n[A>>2])-l|0)>>>0>715827881|(l=(0|n[(c=A+4|0)>>2])-l|0)>>>0>715827881){if(a=2147483647-e|0,s=-2147483648-e|0,(i=(0|e)>0)?(0|a)<(0|e):(0|s)>(0|e))return 1;if(o=e<<1,i?(2147483647-o|0)<(0|e):(-2147483648-o|0)>(0|e))return 1;if((0|l)>0?(2147483647-l|0)<(0|l):(-2147483648-l|0)>(0|l))return 1;if(r=3*e|0,o=l<<1,(i?(0|a)<(0|o):(0|s)>(0|o))||((0|e)>-1?(-2147483648|r)>=(0|l):(-2147483648^r)<(0|l)))return 1}else o=l<<1,r=3*e|0;return i=0|Oe(.14285714285714285*+(r-l|0)),n[A>>2]=i,a=0|Oe(.14285714285714285*+(o+e|0)),n[c>>2]=a,n[t>>2]=0,r=(o=(0|a)<(0|i))?i:a,(0|(o=o?a:i))<0&&((-2147483648==(0|o)||((0|r)>0?(2147483647-r|0)<(0|o):(-2147483648-r|0)>(0|o)))&&M(27795,26892,354,26903),((0|r)>-1?(-2147483648|r)>=(0|o):(-2147483648^r)<(0|o))&&M(27795,26892,354,26903)),r=a-i|0,(0|i)<0?(o=0-i|0,n[c>>2]=r,n[t>>2]=o,n[A>>2]=0,i=0):(r=a,o=0),(0|r)<0&&(i=i-r|0,n[A>>2]=i,o=o-r|0,n[t>>2]=o,n[c>>2]=0,r=0),s=i-o|0,a=r-o|0,(0|o)<0?(n[A>>2]=s,n[c>>2]=a,n[t>>2]=0,r=a,a=s,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|r)<(0|a)?r:a))?o:i))<=0||(n[A>>2]=a-i,n[c>>2]=r-i,n[t>>2]=o-i),0}function uA(A){var e,t=0,r=0,o=0,i=0,a=0,s=0,l=0;if(i=0|n[(e=8+(A|=0)|0)>>2],(a=(0|n[A>>2])-i|0)>>>0>715827881|(i=(0|n[(s=A+4|0)>>2])-i|0)>>>0>715827881){if((r=(0|a)>0)?(2147483647-a|0)<(0|a):(-2147483648-a|0)>(0|a))return 1;if(t=a<<1,(o=(0|i)>0)?(2147483647-i|0)<(0|i):(-2147483648-i|0)>(0|i))return 1;if(l=i<<1,o?(2147483647-l|0)<(0|i):(-2147483648-l|0)>(0|i))return 1;if(r?(2147483647-t|0)<(0|i):(-2147483648-t|0)>(0|i))return 1;if(r=3*i|0,(0|i)>-1?(-2147483648|r)>=(0|a):(-2147483648^r)<(0|a))return 1}else r=3*i|0,t=a<<1;return o=0|Oe(.14285714285714285*+(t+i|0)),n[A>>2]=o,i=0|Oe(.14285714285714285*+(r-a|0)),n[s>>2]=i,n[e>>2]=0,t=(r=(0|i)<(0|o))?o:i,(0|(r=r?i:o))<0&&((-2147483648==(0|r)||((0|t)>0?(2147483647-t|0)<(0|r):(-2147483648-t|0)>(0|r)))&&M(27795,26892,402,26917),((0|t)>-1?(-2147483648|t)>=(0|r):(-2147483648^t)<(0|r))&&M(27795,26892,402,26917)),t=i-o|0,(0|o)<0?(r=0-o|0,n[s>>2]=t,n[e>>2]=r,n[A>>2]=0,o=0):(t=i,r=0),(0|t)<0&&(o=o-t|0,n[A>>2]=o,r=r-t|0,n[e>>2]=r,n[s>>2]=0,t=0),a=o-r|0,i=t-r|0,(0|r)<0?(n[A>>2]=a,n[s>>2]=i,n[e>>2]=0,t=i,i=a,r=0):i=o,(0|(o=(0|r)<(0|(o=(0|t)<(0|i)?t:i))?r:o))<=0||(n[A>>2]=i-o,n[s>>2]=t-o,n[e>>2]=r-o),0}function dA(A){var e,t,r=0,o=0,i=0,a=0,s=0;o=0|n[(e=8+(A|=0)|0)>>2],i=0|Oe(.14285714285714285*+((3*(r=(0|n[A>>2])-o|0)|0)-(o=(0|n[(t=A+4|0)>>2])-o|0)|0)),n[A>>2]=i,r=0|Oe(.14285714285714285*+((o<<1)+r|0)),n[t>>2]=r,n[e>>2]=0,o=r-i|0,(0|i)<0?(s=0-i|0,n[t>>2]=o,n[e>>2]=s,n[A>>2]=0,r=o,i=0,o=s):o=0,(0|r)<0&&(i=i-r|0,n[A>>2]=i,o=o-r|0,n[e>>2]=o,n[t>>2]=0,r=0),s=i-o|0,a=r-o|0,(0|o)<0?(n[A>>2]=s,n[t>>2]=a,n[e>>2]=0,r=a,a=s,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|r)<(0|a)?r:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=r-i,n[e>>2]=o-i)}function fA(A){var e,t,r=0,o=0,i=0,a=0,s=0;o=0|n[(e=8+(A|=0)|0)>>2],i=0|Oe(.14285714285714285*+(((r=(0|n[A>>2])-o|0)<<1)+(o=(0|n[(t=A+4|0)>>2])-o|0)|0)),n[A>>2]=i,r=0|Oe(.14285714285714285*+((3*o|0)-r|0)),n[t>>2]=r,n[e>>2]=0,o=r-i|0,(0|i)<0?(s=0-i|0,n[t>>2]=o,n[e>>2]=s,n[A>>2]=0,r=o,i=0,o=s):o=0,(0|r)<0&&(i=i-r|0,n[A>>2]=i,o=o-r|0,n[e>>2]=o,n[t>>2]=0,r=0),s=i-o|0,a=r-o|0,(0|o)<0?(n[A>>2]=s,n[t>>2]=a,n[e>>2]=0,r=a,a=s,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|r)<(0|a)?r:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=r-i,n[e>>2]=o-i)}function gA(A){var e,t,r,o=0,i=0,a=0,s=0;o=0|n[(A|=0)>>2],i=0|n[(t=A+4|0)>>2],a=0|n[(r=A+8|0)>>2],s=i+(3*o|0)|0,n[A>>2]=s,i=a+(3*i|0)|0,n[t>>2]=i,o=(3*a|0)+o|0,n[r>>2]=o,a=i-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=a,n[r>>2]=o,n[A>>2]=0,i=a,a=0):a=s,(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function hA(A){var e,t,r,o=0,i=0,a=0,s=0;s=0|n[(A|=0)>>2],a=(3*(o=0|n[(t=A+4|0)>>2])|0)+s|0,s=(i=0|n[(r=A+8|0)>>2])+(3*s|0)|0,n[A>>2]=s,n[t>>2]=a,o=(3*i|0)+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,s=0):i=a,(0|i)<0&&(s=s-i|0,n[A>>2]=s,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=s-o|0,a=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=a,n[r>>2]=0,s=e,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|a)<(0|s)?a:s))?o:i))<=0||(n[A>>2]=s-i,n[t>>2]=a-i,n[r>>2]=o-i)}function mA(A,e){A|=0;var t,r,o,i=0,a=0,s=0;((e|=0)-1|0)>>>0>=6||(s=(0|n[15440+(12*e|0)>>2])+(0|n[A>>2])|0,n[A>>2]=s,o=A+4|0,a=(0|n[15440+(12*e|0)+4>>2])+(0|n[o>>2])|0,n[o>>2]=a,r=A+8|0,e=(0|n[15440+(12*e|0)+8>>2])+(0|n[r>>2])|0,n[r>>2]=e,i=a-s|0,(0|s)<0?(e=e-s|0,n[o>>2]=i,n[r>>2]=e,n[A>>2]=0,a=0):(i=a,a=s),(0|i)<0&&(a=a-i|0,n[A>>2]=a,e=e-i|0,n[r>>2]=e,n[o>>2]=0,i=0),t=a-e|0,s=i-e|0,(0|e)<0?(n[A>>2]=t,n[o>>2]=s,n[r>>2]=0,a=t,e=0):s=i,(0|(i=(0|e)<(0|(i=(0|s)<(0|a)?s:a))?e:i))<=0||(n[A>>2]=a-i,n[o>>2]=s-i,n[r>>2]=e-i))}function bA(A){var e,t,r,o=0,i=0,a=0,s=0;s=0|n[(A|=0)>>2],a=(o=0|n[(t=A+4|0)>>2])+s|0,s=(i=0|n[(r=A+8|0)>>2])+s|0,n[A>>2]=s,n[t>>2]=a,o=i+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,a=0):(i=a,a=s),(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function pA(A){var e,t,r,o=0,i=0,a=0,s=0;o=0|n[(A|=0)>>2],a=0|n[(t=A+4|0)>>2],i=0|n[(r=A+8|0)>>2],s=a+o|0,n[A>>2]=s,a=i+a|0,n[t>>2]=a,o=i+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,a=0):(i=a,a=s),(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function vA(A){switch(0|(A|=0)){case 1:A=5;break;case 5:A=4;break;case 4:A=6;break;case 6:A=2;break;case 2:A=3;break;case 3:A=1}return 0|A}function yA(A){switch(0|(A|=0)){case 1:A=3;break;case 3:A=2;break;case 2:A=6;break;case 6:A=4;break;case 4:A=5;break;case 5:A=1}return 0|A}function wA(A){var e,t,r,o=0,i=0,a=0,s=0;o=0|n[(A|=0)>>2],i=0|n[(t=A+4|0)>>2],a=0|n[(r=A+8|0)>>2],s=i+(o<<1)|0,n[A>>2]=s,i=a+(i<<1)|0,n[t>>2]=i,o=(a<<1)+o|0,n[r>>2]=o,a=i-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=a,n[r>>2]=o,n[A>>2]=0,i=a,a=0):a=s,(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function xA(A){var e,t,r,o=0,i=0,a=0,s=0;s=0|n[(A|=0)>>2],a=((o=0|n[(t=A+4|0)>>2])<<1)+s|0,s=(i=0|n[(r=A+8|0)>>2])+(s<<1)|0,n[A>>2]=s,n[t>>2]=a,o=(i<<1)+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,s=0):i=a,(0|i)<0&&(s=s-i|0,n[A>>2]=s,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=s-o|0,a=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=a,n[r>>2]=0,s=e,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|a)<(0|s)?a:s))?o:i))<=0||(n[A>>2]=s-i,n[t>>2]=a-i,n[r>>2]=o-i)}function kA(A,e){e|=0;var t,r,o,i=0,a=0,s=0;return o=(0|(r=(0|n[(A|=0)>>2])-(0|n[e>>2])|0))<0,t=(0|(a=(0|n[A+4>>2])-(0|n[e+4>>2])-(o?r:0)|0))<0,e=(e=(A=(0|(s=(o?0-r|0:0)+(0|n[A+8>>2])-(0|n[e+8>>2])+(t?0-a|0:0)|0))<0)?0:s)-((a=(0|(A=(0|e)<(0|(A=(0|(i=(t?0:a)-(A?s:0)|0))<(0|(s=(o?0:r)-(t?a:0)-(A?s:0)|0))?i:s))?e:A))>0)?A:0)|0,i=i-(a?A:0)|0,0|((0|(A=(0|(A=s-(a?A:0)|0))>-1?A:0-A|0))>(0|(e=(0|(i=(0|i)>-1?i:0-i|0))>(0|(e=(0|e)>-1?e:0-e|0))?i:e))?A:e)}function CA(A){var e,t,r,o;t=(o=0|n[(e=8+(A|=0)|0)>>2])-(0|n[A>>2])|0,n[A>>2]=t,A=(0|n[(r=A+4|0)>>2])-o|0,n[r>>2]=A,n[e>>2]=0-(A+t)}function BA(A){var e,t,r=0,o=0,i=0,a=0,s=0;r=0-(o=0|n[(A|=0)>>2])|0,n[A>>2]=r,n[(e=A+8|0)>>2]=0,a=(i=0|n[(t=A+4|0)>>2])+o|0,(0|o)>0?(n[t>>2]=a,n[e>>2]=o,n[A>>2]=0,r=0,i=a):o=0,(0|i)<0?(s=r-i|0,n[A>>2]=s,o=o-i|0,n[e>>2]=o,n[t>>2]=0,a=s-o|0,r=0-o|0,(0|o)<0?(n[A>>2]=a,n[t>>2]=r,n[e>>2]=0,i=r,o=0):(i=0,a=s)):a=r,(0|(r=(0|o)<(0|(r=(0|i)<(0|a)?i:a))?o:r))<=0||(n[A>>2]=a-r,n[t>>2]=i-r,n[e>>2]=o-r)}function MA(A,e){var t=0;switch(t=0|tt(0|(A|=0),0|(e|=0),56),B(),7&t){case 0:case 7:return 0}return t=-2130706433&e|134217728,!0&268435456==(2013265920&e)?!0&16777216==(117440512&e)&!!(0|zA(A,t))?0|(t=0):0|(t=0|LA(A,t)):0|(t=0)}function DA(A,e,t){t|=0;var r,o,i=0,a=0;return o=S,S=S+16|0,r=o,a=-2130706433&(e|=0)|134217728,!0&268435456==(2013265920&e)?(i=0|tt(0|(A|=0),0|e,56),B(),i=0|function(A,e,t){t|=0;var r,o=0,i=0;if(r=S,S=S+16|0,i=r,o=0|zA(A|=0,e|=0),(t+-1|0)>>>0>5)return S=r,-1;if(1==(0|t)&(o=!!(0|o)))return S=r,-1;do{if(!(0|Fe(A,e,i))){if(o){o=(5+(0|n[26352+(t<<2)>>2])-(0|n[i>>2])|0)%5|0;break}o=(6+(0|n[26384+(t<<2)>>2])-(0|n[i>>2])|0)%6|0;break}o=-1}while(0);return S=r,0|(i=o)}(A,a,7&i),-1==(0|i)?(n[t>>2]=0,S=o,0|(a=6)):(0|qA(A,a,r)&&M(27795,26932,282,26947),e=0|tt(0|A,0|e,52),B(),e&=15,0|zA(A,a)?jA(r,e,i,2,t):FA(r,e,i,2,t),S=o,0|(a=0))):(S=o,0|(a=6))}function EA(A,e,t,r,i){e|=0,t|=0,r|=0,i|=0;var a,s=0,u=0;if(s=+function(A){var e,t;return t=+o[(A|=0)>>3],e=+o[A+8>>3],+ +c(+(t*t+e*e))}(A|=0),s<1e-16)return e=15600+(e<<4)|0,n[i>>2]=n[e>>2],n[i+4>>2]=n[e+4>>2],n[i+8>>2]=n[e+8>>2],void(n[i+12>>2]=n[e+12>>2]);if(u=+p(+ +o[A+8>>3],+ +o[A>>3]),(0|t)>0){A=0;do{s*=.37796447300922725,A=A+1|0}while((0|A)!=(0|t))}a=.3333333333333333*s,r?(t=!(0|ZA(t)),s=+b(.381966011250105*(t?a:.37796447300922725*a))):(s=+b(.381966011250105*s),0|ZA(t)&&(u=+ne(u+.3334731722518321))),function(A,e,t,r){A|=0,e=+e,r|=0;var i=0,a=0,s=0,c=0;if((t=+t)<1e-16)return n[r>>2]=n[A>>2],n[r+4>>2]=n[A+4>>2],n[r+8>>2]=n[A+8>>2],void(n[r+12>>2]=n[A+12>>2]);a=e<0?e+6.283185307179586:e,a=e>=6.283185307179586?a+-6.283185307179586:a;do{if(!(a<1e-16)){if(i=+l(+(a+-3.141592653589793))<1e-16,e=+o[A>>3],i){e-=t,o[r>>3]=e,i=r;break}if(s=+d(+t),t=+f(+t),e=s*+f(+e)+ +d(+a)*(t*+d(+e)),e=+m(+((e=e>1?1:e)<-1?-1:e)),o[r>>3]=e,+l(+(e+-1.5707963267948966))<1e-16)return o[r>>3]=1.5707963267948966,void(o[r+8>>3]=0);if(+l(+(e+1.5707963267948966))<1e-16)return o[r>>3]=-1.5707963267948966,void(o[r+8>>3]=0);if(c=1/+d(+e),a=t*+f(+a)*c,t=+o[A>>3],e=c*((s-+f(+e)*+f(+t))/+d(+t)),s=a>1?1:a,e=e>1?1:e,(e=+o[A+8>>3]+ +p(+(s<-1?-1:s),+(e<-1?-1:e)))>3.141592653589793)do{e+=-6.283185307179586}while(e>3.141592653589793);if(e<-3.141592653589793)do{e+=6.283185307179586}while(e<-3.141592653589793);return void(o[r+8>>3]=e)}e=+o[A>>3]+t,o[r>>3]=e,i=r}while(0);if(+l(+(e+-1.5707963267948966))<1e-16)return o[i>>3]=1.5707963267948966,void(o[r+8>>3]=0);if(+l(+(e+1.5707963267948966))<1e-16)return o[i>>3]=-1.5707963267948966,void(o[r+8>>3]=0);if((e=+o[A+8>>3])>3.141592653589793)do{e+=-6.283185307179586}while(e>3.141592653589793);if(e<-3.141592653589793)do{e+=6.283185307179586}while(e<-3.141592653589793);o[r+8>>3]=e}(15600+(e<<4)|0,+ne(+o[15920+(24*e|0)>>3]-u),s,i)}function jA(A,e,t,r,i){A|=0,e|=0,t|=0,r|=0,i|=0;var a,s,l,c,u,d,f,g,h,m,b,p,v,y,w,x,k,C,B,D,E,j,Q=0,N=0,F=0,P=0,T=0,L=0;if(j=S,S=S+272|0,P=j+240|0,B=j,D=j+224|0,E=j+208|0,b=j+176|0,p=j+160|0,v=j+192|0,y=j+144|0,w=j+128|0,x=j+112|0,k=j+96|0,C=j+80|0,n[(Q=j+256|0)>>2]=e,n[P>>2]=n[A>>2],n[P+4>>2]=n[A+4>>2],n[P+8>>2]=n[A+8>>2],n[P+12>>2]=n[A+12>>2],QA(P,Q,B),n[i>>2]=0,(0|(P=r+t+(5==(0|r)&1)|0))<=(0|t))S=j;else{s=D+4|0,l=b+4|0,c=t+5|0,u=16880+((a=0|n[Q>>2])<<2)|0,d=16960+(a<<2)|0,f=w+8|0,g=x+8|0,h=k+8|0,m=E+4|0,F=t;A:for(;;){N=B+((0|F)%5<<4)|0,n[E>>2]=n[N>>2],n[E+4>>2]=n[N+4>>2],n[E+8>>2]=n[N+8>>2],n[E+12>>2]=n[N+12>>2];do{}while(2==(0|NA(E,a,0,1)));if((0|F)>(0|t)&!!(0|ZA(e))){if(n[b>>2]=n[E>>2],n[b+4>>2]=n[E+4>>2],n[b+8>>2]=n[E+8>>2],n[b+12>>2]=n[E+12>>2],oA(s,p),r=0|n[b>>2],Q=0|n[17040+(80*r|0)+(n[D>>2]<<2)>>2],n[b>>2]=n[18640+(80*r|0)+(20*Q|0)>>2],(0|(N=0|n[18640+(80*r|0)+(20*Q|0)+16>>2]))>0){A=0;do{bA(l),A=A+1|0}while((0|A)<(0|N))}switch(N=18640+(80*r|0)+(20*Q|0)+4|0,n[v>>2]=n[N>>2],n[v+4>>2]=n[N+4>>2],n[v+8>>2]=n[N+8>>2],sA(v,3*(0|n[u>>2])|0),iA(l,v,l),nA(l),oA(l,y),T=+(0|n[d>>2]),o[w>>3]=3*T,o[f>>3]=0,L=-1.5*T,o[x>>3]=L,o[g>>3]=2.598076211353316*T,o[k>>3]=L,o[h>>3]=-2.598076211353316*T,0|n[17040+(80*(0|n[b>>2])|0)+(n[E>>2]<<2)>>2]){case 1:A=x,r=w;break;case 3:A=k,r=x;break;case 2:A=w,r=k;break;default:A=12;break A}Qe(p,y,r,A,C),EA(C,0|n[b>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2])}if((0|F)<(0|c)&&(oA(m,b),EA(b,0|n[E>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2])),n[D>>2]=n[E>>2],n[D+4>>2]=n[E+4>>2],n[D+8>>2]=n[E+8>>2],n[D+12>>2]=n[E+12>>2],(0|(F=F+1|0))>=(0|P)){A=3;break}}3!=(0|A)?12==(0|A)&&M(26970,27017,572,27027):S=j}}function QA(A,e,t){A|=0,e|=0,t|=0;var r,o=0,i=0,a=0,s=0,l=0;r=S,S=S+128|0,i=r,s=20240,l=60+(a=o=r+64|0)|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));s=20304,l=(a=i)+60|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));o=(l=!(0|ZA(0|n[e>>2])))?o:i,wA(i=A+4|0),xA(i),0|ZA(0|n[e>>2])&&(hA(i),n[e>>2]=1+(0|n[e>>2])),n[t>>2]=n[A>>2],iA(i,o,e=t+4|0),nA(e),n[t+16>>2]=n[A>>2],iA(i,o+12|0,e=t+20|0),nA(e),n[t+32>>2]=n[A>>2],iA(i,o+24|0,e=t+36|0),nA(e),n[t+48>>2]=n[A>>2],iA(i,o+36|0,e=t+52|0),nA(e),n[t+64>>2]=n[A>>2],iA(i,o+48|0,t=t+68|0),nA(t),S=r}function NA(A,e,t,r){t|=0,r|=0;var o,i,a,s,l,c,u=0,d=0,f=0,g=0,h=0;if(c=S,S=S+32|0,l=c+12|0,i=c,h=4+(A|=0)|0,g=0|n[16960+((e|=0)<<2)>>2],g=(s=!!(0|r))?3*g|0:g,u=0|n[h>>2],o=0|n[(a=A+8|0)>>2],s){if((0|(u=o+u+(r=0|n[(d=A+12|0)>>2])|0))==(0|g))return S=c,1;f=d}else u=o+u+(r=0|n[(f=A+12|0)>>2])|0;if((0|u)<=(0|g))return S=c,0;do{if((0|r)>0){if(r=0|n[A>>2],(0|o)>0){d=18640+(80*r|0)+60|0,r=A;break}r=18640+(80*r|0)+40|0,t?(rA(l,g,0,0),aA(h,l,i),pA(i),iA(i,l,h),d=r,r=A):(d=r,r=A)}else d=18640+(80*(0|n[A>>2])|0)+20|0,r=A}while(0);if(n[r>>2]=n[d>>2],(0|n[(u=d+16|0)>>2])>0){r=0;do{bA(h),r=r+1|0}while((0|r)<(0|n[u>>2]))}return A=d+4|0,n[l>>2]=n[A>>2],n[l+4>>2]=n[A+4>>2],n[l+8>>2]=n[A+8>>2],e=0|n[16880+(e<<2)>>2],sA(l,s?3*e|0:e),iA(h,l,h),nA(h),r=s&&((0|n[a>>2])+(0|n[h>>2])+(0|n[f>>2])|0)==(0|g)?1:2,S=c,0|r}function SA(A,e){A|=0,e|=0;var t=0;do{t=0|NA(A,e,0,1)}while(2==(0|t));return 0|t}function FA(A,e,t,r,i){A|=0,e|=0,t|=0,r|=0,i|=0;var a,s,l,c,u,d,f,g,h,m,b,p,v,y,w,x,k,C,B=0,D=0,E=0,j=0,Q=0;if(C=S,S=S+240|0,y=C+208|0,w=C,x=C+192|0,k=C+176|0,h=C+160|0,m=C+144|0,b=C+128|0,p=C+112|0,v=C+96|0,n[(B=C+224|0)>>2]=e,n[y>>2]=n[A>>2],n[y+4>>2]=n[A+4>>2],n[y+8>>2]=n[A+8>>2],n[y+12>>2]=n[A+12>>2],PA(y,B,w),n[i>>2]=0,(0|(g=r+t+(6==(0|r)&1)|0))<=(0|t))S=C;else{s=t+6|0,l=16960+((a=0|n[B>>2])<<2)|0,c=m+8|0,u=b+8|0,d=p+8|0,f=x+4|0,D=0,E=t,r=-1;A:for(;;){if(A=w+((B=(0|E)%6|0)<<4)|0,n[x>>2]=n[A>>2],n[x+4>>2]=n[A+4>>2],n[x+8>>2]=n[A+8>>2],n[x+12>>2]=n[A+12>>2],A=D,D=0|NA(x,a,0,1),(0|E)>(0|t)&!!(0|ZA(e))&&1!=(0|A)&&(0|n[x>>2])!=(0|r)){switch(oA(w+((B+5|0)%6<<4)+4|0,k),oA(w+(B<<4)+4|0,h),j=+(0|n[l>>2]),o[m>>3]=3*j,o[c>>3]=0,Q=-1.5*j,o[b>>3]=Q,o[u>>3]=2.598076211353316*j,o[p>>3]=Q,o[d>>3]=-2.598076211353316*j,B=0|n[y>>2],0|n[17040+(80*B|0)+(((0|r)==(0|B)?n[x>>2]:r)<<2)>>2]){case 1:A=b,r=m;break;case 3:A=p,r=b;break;case 2:A=m,r=p;break;default:A=8;break A}Qe(k,h,r,A,v),0|Ne(k,v)||0|Ne(h,v)||(EA(v,0|n[y>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2]))}if((0|E)<(0|s)&&(oA(f,k),EA(k,0|n[x>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2])),(0|(E=E+1|0))>=(0|g)){A=3;break}r=0|n[x>>2]}3!=(0|A)?8==(0|A)&&M(27054,27017,737,27099):S=C}}function PA(A,e,t){A|=0,e|=0,t|=0;var r,o=0,i=0,a=0,s=0,l=0;r=S,S=S+160|0,i=r,s=20368,l=72+(a=o=r+80|0)|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));s=20448,l=(a=i)+72|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));o=(l=!(0|ZA(0|n[e>>2])))?o:i,wA(i=A+4|0),xA(i),0|ZA(0|n[e>>2])&&(hA(i),n[e>>2]=1+(0|n[e>>2])),n[t>>2]=n[A>>2],iA(i,o,e=t+4|0),nA(e),n[t+16>>2]=n[A>>2],iA(i,o+12|0,e=t+20|0),nA(e),n[t+32>>2]=n[A>>2],iA(i,o+24|0,e=t+36|0),nA(e),n[t+48>>2]=n[A>>2],iA(i,o+36|0,e=t+52|0),nA(e),n[t+64>>2]=n[A>>2],iA(i,o+48|0,e=t+68|0),nA(e),n[t+80>>2]=n[A>>2],iA(i,o+60|0,t=t+84|0),nA(t),S=r}function TA(A,e){return e=0|tt(0|(A|=0),0|(e|=0),45),B(),127&e}function LA(A,e){A|=0;var t=0,n=0,o=0,i=0;return!0&134217728==(-16777216&(e|=0))?(n=0|tt(0|A,0|e,52),B(),n&=15,t=0|tt(0|A,0|e,45),B(),(t&=127)>>>0>121?0|(A=0):!(613566756&(i=0|rt(0|(o=0|tt(0|A,0|e,0|(i=3*(15^n)|0))),0|B(),0|i))&Ze(-1227133514,-1171,0|i,0|(o=0|B())))&!(4681&o&B())&&15==(0|n)|!(0|(i=0|tt(0|rt(0|~A,0|~e,0|(i=19+(3*n|0)|0)),0|B(),0|i)))&!(0|B())?0|r[20528+t|0]?!(0|A)&!(0|(e&=8191))?0|(i=1):(i=0|nt(0|A,0|e),B(),0|!!((63-i|0)%3|0)):0|(i=1):0|(i=0)):0|(A=0)}function RA(A,e,t,r){A|=0,t|=0,r|=0;var o=0,i=0,a=0,s=0;if(o=0|rt(0|(e|=0),0,52),i=0|B(),t=0|rt(0|t,0,45),t=0|i|B()|134225919,(0|e)<1)return i=-1,r=t,n[(e=A)>>2]=i,void(n[(A=A+4|0)>>2]=r);for(i=1,o=-1;s=0|rt(7,0,0|(a=3*(15-i|0)|0)),t&=~B(),o=o&~s|(a=0|rt(0|r,0,0|a)),t=0|t|B(),(0|i)!=(0|e);)i=i+1|0;n[(a=s=A)>>2]=o,n[(s=s+4|0)>>2]=t}function IA(A,e,t,r){t|=0,r|=0;var o=0,i=0;if(i=0|tt(0|(A|=0),0|(e|=0),52),B(),t>>>0>15)return 4;if((0|(i&=15))<(0|t))return 12;if((0|i)==(0|t))return n[r>>2]=A,n[r+4>>2]=e,0;if(o=0|rt(0|t,0,52),o|=A,A=B()|-15728641&e,(0|i)>(0|t))do{e=0|rt(7,0,3*(14-t|0)|0),t=t+1|0,o|=e,A=0|B()|A}while((0|t)<(0|i));return n[r>>2]=o,n[r+4>>2]=A,0}function _A(A,e,t,r){t|=0,r|=0;var o=0,i=0,a=0;if(i=0|tt(0|(A|=0),0|(e|=0),52),B(),!((0|t)<16&(0|(i&=15))<=(0|t)))return 4;o=t-i|0,t=0|tt(0|A,0|e,45),B();A:do{if(0|H(127&t)){e:do{if(0|i){for(t=1;!((a=0|rt(7,0,3*(15-t|0)|0))&A)&!((0|B())&e);){if(!(t>>>0>>0))break e;t=t+1|0}t=0|pe(7,0,o,((0|o)<0)<<31>>31),o=0|B();break A}}while(0);t=0|We(0|(t=0|Xe(0|(t=0|pe(7,0,o,((0|o)<0)<<31>>31)),0|B(),5,0)),0|B(),-5,-1),t=0|We(0|(t=0|qe(0|t,0|B(),6,0)),0|B(),1,0),o=0|B()}else t=0|pe(7,0,o,((0|o)<0)<<31>>31),o=0|B()}while(0);return n[(a=r)>>2]=t,n[a+4>>2]=o,0}function zA(A,e){var t=0,r=0,n=0;if(n=0|tt(0|(A|=0),0|(e|=0),45),B(),!(0|H(127&n)))return 0;n=0|tt(0|A,0|e,52),B(),n&=15;A:do{if(n)for(r=1;;){if(t=0|tt(0|A,0|e,3*(15-r|0)|0),B(),0|(t&=7))break A;if(!(r>>>0>>0)){t=0;break}r=r+1|0}else t=0}while(0);return 1&!(0|t)}function HA(A,e,t,r){return A|=0,e|=0,(0|(r|=0))<(0|(t|=0))?(r=A,C(0|(t=e)),0|r):(t=0|rt(-1,-1,3+(3*(r-t|0)|0)|0),r=0|rt(0|~t,0|~B(),3*(15-r|0)|0),t=~B()&e,r=~r&A,C(0|t),0|r)}function GA(A,e,t,r){t|=0,r|=0;var o=0;return o=0|tt(0|(A|=0),0|(e|=0),52),B(),(0|t)<16&(0|(o&=15))<=(0|t)?((0|o)<(0|t)&&(o=0|rt(-1,-1,3+(3*(t+-1-o|0)|0)|0),o=0|rt(0|~o,0|~B(),3*(15-t|0)|0),e=~B()&e,A&=~o),o=0|rt(0|t,0,52),t=-15728641&e|B(),n[r>>2]=A|o,n[r+4>>2]=t,0|(r=0)):0|(r=4)}function OA(A,e){var t=0,r=0,n=0;if(n=0|tt(0|(A|=0),0|(e|=0),52),B(),!(n&=15))return 0;for(r=1;;){if(t=0|tt(0|A,0|e,3*(15-r|0)|0),B(),0|(t&=7)){r=5;break}if(!(r>>>0>>0)){t=0,r=5;break}r=r+1|0}return 5==(0|r)?0|t:0}function UA(A,e){var t=0,r=0,n=0,o=0,i=0,a=0,s=0;if(s=0|tt(0|(A|=0),0|(e|=0),52),B(),!(s&=15))return s=A,C(0|(a=e)),0|s;for(a=1,t=0;;){r=0|rt(7,0,0|(o=3*(15-a|0)|0)),n=0|B(),i=0|tt(0|A,0|e,0|o),B(),A=(o=0|rt(0|vA(7&i),0,0|o))|A&~r,e=(i=0|B())|e&~n;A:do{if(!t)if(!(o&r|0)&!(i&n|0))t=0;else if(r=0|tt(0|A,0|e,52),B(),r&=15){t=1;e:for(;;){switch(i=0|tt(0|A,0|e,3*(15-t|0)|0),B(),7&i){case 1:break e;case 0:break;default:t=1;break A}if(!(t>>>0>>0)){t=1;break A}t=t+1|0}for(t=1;;){if(n=0|tt(0|A,0|e,0|(i=3*(15-t|0)|0)),B(),o=0|rt(7,0,0|i),e&=~B(),A=A&~o|(i=0|rt(0|vA(7&n),0,0|i)),e=0|e|B(),!(t>>>0>>0)){t=1;break}t=t+1|0}}else t=1}while(0);if(!(a>>>0>>0))break;a=a+1|0}return C(0|e),0|A}function YA(A,e){var t=0,r=0,n=0,o=0,i=0;if(r=0|tt(0|(A|=0),0|(e|=0),52),B(),!(r&=15))return r=A,C(0|(t=e)),0|r;for(t=1;i=0|tt(0|A,0|e,0|(o=3*(15-t|0)|0)),B(),n=0|rt(7,0,0|o),e&=~B(),A=(o=0|rt(0|vA(7&i),0,0|o))|A&~n,e=0|B()|e,t>>>0>>0;)t=t+1|0;return C(0|e),0|A}function VA(A,e){var t=0,r=0,n=0,o=0,i=0,a=0,s=0;if(s=0|tt(0|(A|=0),0|(e|=0),52),B(),!(s&=15))return s=A,C(0|(a=e)),0|s;for(a=1,t=0;;){r=0|rt(7,0,0|(o=3*(15-a|0)|0)),n=0|B(),i=0|tt(0|A,0|e,0|o),B(),A=(o=0|rt(0|yA(7&i),0,0|o))|A&~r,e=(i=0|B())|e&~n;A:do{if(!t)if(!(o&r|0)&!(i&n|0))t=0;else if(r=0|tt(0|A,0|e,52),B(),r&=15){t=1;e:for(;;){switch(i=0|tt(0|A,0|e,3*(15-t|0)|0),B(),7&i){case 1:break e;case 0:break;default:t=1;break A}if(!(t>>>0>>0)){t=1;break A}t=t+1|0}for(t=1;;){if(o=0|rt(7,0,0|(n=3*(15-t|0)|0)),i=e&~B(),e=0|tt(0|A,0|e,0|n),B(),A=A&~o|(e=0|rt(0|yA(7&e),0,0|n)),e=0|i|B(),!(t>>>0>>0)){t=1;break}t=t+1|0}}else t=1}while(0);if(!(a>>>0>>0))break;a=a+1|0}return C(0|e),0|A}function WA(A,e){var t=0,r=0,n=0,o=0,i=0;if(r=0|tt(0|(A|=0),0|(e|=0),52),B(),!(r&=15))return r=A,C(0|(t=e)),0|r;for(t=1;o=0|rt(7,0,0|(i=3*(15-t|0)|0)),n=e&~B(),e=0|tt(0|A,0|e,0|i),B(),A=(e=0|rt(0|yA(7&e),0,0|i))|A&~o,e=0|B()|n,t>>>0>>0;)t=t+1|0;return C(0|e),0|A}function ZA(A){return(0|(A|=0))%2|0}function KA(A,e,t){t|=0;var r,i=0;return r=S,S=S+16|0,i=r,(e|=0)>>>0>15?(S=r,0|(i=4)):2146435072&~n[4+(A|=0)>>2]&&2146435072&~n[A+8+4>>2]?(function(A,e,t){var r,i;r=S,S=S+16|0,function(A,e,t,r){e|=0,r|=0;var i,a=0,s=0,l=0,c=0;if(i=S,S=S+16|0,function(A,e,t){e|=0,t|=0;var r,i,a=0;i=S,S=S+32|0,function(A,e){e|=0;var t,r,n=0;n=+o[(A|=0)>>3],t=+d(+n),n=+f(+n),o[e+16>>3]=n,n=+o[A+8>>3],r=t*+d(+n),o[e>>3]=r,n=t*+f(+n),o[e+8>>3]=n}(A|=0,r=i),n[e>>2]=0,o[t>>3]=5,(a=+Se(16400,r))<+o[t>>3]&&(n[e>>2]=0,o[t>>3]=a),(a=+Se(16424,r))<+o[t>>3]&&(n[e>>2]=1,o[t>>3]=a),(a=+Se(16448,r))<+o[t>>3]&&(n[e>>2]=2,o[t>>3]=a),(a=+Se(16472,r))<+o[t>>3]&&(n[e>>2]=3,o[t>>3]=a),(a=+Se(16496,r))<+o[t>>3]&&(n[e>>2]=4,o[t>>3]=a),(a=+Se(16520,r))<+o[t>>3]&&(n[e>>2]=5,o[t>>3]=a),(a=+Se(16544,r))<+o[t>>3]&&(n[e>>2]=6,o[t>>3]=a),(a=+Se(16568,r))<+o[t>>3]&&(n[e>>2]=7,o[t>>3]=a),(a=+Se(16592,r))<+o[t>>3]&&(n[e>>2]=8,o[t>>3]=a),(a=+Se(16616,r))<+o[t>>3]&&(n[e>>2]=9,o[t>>3]=a),(a=+Se(16640,r))<+o[t>>3]&&(n[e>>2]=10,o[t>>3]=a),(a=+Se(16664,r))<+o[t>>3]&&(n[e>>2]=11,o[t>>3]=a),(a=+Se(16688,r))<+o[t>>3]&&(n[e>>2]=12,o[t>>3]=a),(a=+Se(16712,r))<+o[t>>3]&&(n[e>>2]=13,o[t>>3]=a),(a=+Se(16736,r))<+o[t>>3]&&(n[e>>2]=14,o[t>>3]=a),(a=+Se(16760,r))<+o[t>>3]&&(n[e>>2]=15,o[t>>3]=a),(a=+Se(16784,r))<+o[t>>3]&&(n[e>>2]=16,o[t>>3]=a),(a=+Se(16808,r))<+o[t>>3]&&(n[e>>2]=17,o[t>>3]=a),(a=+Se(16832,r))<+o[t>>3]&&(n[e>>2]=18,o[t>>3]=a),(a=+Se(16856,r))<+o[t>>3]?(n[e>>2]=19,o[t>>3]=a,S=i):S=i}(A|=0,t|=0,c=i),(s=+h(+(1-.5*+o[c>>3])))<1e-16)return n[r>>2]=0,n[r+4>>2]=0,n[r+8>>2]=0,n[r+12>>2]=0,void(S=i);if(c=0|n[t>>2],a=+ne((a=+o[15920+(24*c|0)>>3])-+ne(+function(A,e){var t,r,n,i,a;return A|=0,i=+o[(e|=0)>>3],r=+d(+i),n=+o[e+8>>3]-+o[A+8>>3],a=r*+f(+n),t=+o[A>>3],+ +p(+a,+(+f(+i)*+d(+t)-+d(+n)*(r*+f(+t))))}(15600+(c<<4)|0,A))),l=0|ZA(e)?+ne(a+-.3334731722518321):a,a=2.618033988749896*+g(+s),(0|e)>0){A=0;do{a*=2.6457513110645907,A=A+1|0}while((0|A)!=(0|e))}s=+d(+l)*a,o[r>>3]=s,l=+f(+l)*a,o[r+8>>3]=l,S=i}(A|=0,e|=0,t|=0,i=r),function(A,e){A|=0;var t,r,i,a,s=0,c=0,u=0,d=0,f=0,g=0,h=0;n[(a=8+(e|=0)|0)>>2]=0,r=+o[A>>3],d=+l(+r),i=+o[A+8>>3],d+=.5*(f=1.1547005383792515*+l(+i)),d-=+(0|(s=~~d)),f-=+(0|(A=~~f));do{if(d<.5){if(d<.3333333333333333){if(n[e>>2]=s,f<.5*(d+1)){n[e+4>>2]=A;break}A=A+1|0,n[e+4>>2]=A;break}if(A=(1&!(f<(h=1-d)))+A|0,n[e+4>>2]=A,h<=f&f<2*d){s=s+1|0,n[e>>2]=s;break}n[e>>2]=s;break}if(!(d<.6666666666666666)){if(s=s+1|0,n[e>>2]=s,f<.5*d){n[e+4>>2]=A;break}A=A+1|0,n[e+4>>2]=A;break}if(f<1-d){if(n[e+4>>2]=A,2*d-1>2]=s;break}}else A=A+1|0,n[e+4>>2]=A;s=s+1|0,n[e>>2]=s}while(0);do{if(r<0){if(1&A){s=~~(+(0|s)-(2*(+((g=0|Ze(0|s,((0|s)<0)<<31>>31,0|(g=(A+1|0)/2|0),((0|g)<0)<<31>>31))>>>0)+4294967296*+(0|B()))+1)),n[e>>2]=s;break}s=~~(+(0|s)-2*(+((g=0|Ze(0|s,((0|s)<0)<<31>>31,0|(g=(0|A)/2|0),((0|g)<0)<<31>>31))>>>0)+4294967296*+(0|B()))),n[e>>2]=s;break}}while(0);g=e+4|0,i<0&&(s=s-((1|A<<1)/2|0)|0,n[e>>2]=s,A=0-A|0,n[g>>2]=A),c=A-s|0,(0|s)<0?(u=0-s|0,n[g>>2]=c,n[a>>2]=u,n[e>>2]=0,A=c,s=0):u=0,(0|A)<0&&(s=s-A|0,n[e>>2]=s,u=u-A|0,n[a>>2]=u,n[g>>2]=0,A=0),t=s-u|0,c=A-u|0,(0|u)<0&&(n[e>>2]=t,n[g>>2]=c,n[a>>2]=0,A=c,s=t,u=0),(0|(c=(0|u)<(0|(c=(0|A)<(0|s)?A:s))?u:c))<=0||(n[e>>2]=s-c,n[g>>2]=A-c,n[a>>2]=u-c)}(i,t+4|0),S=r}(A,e,i),e=0|function(A,e){A|=0;var t,r=0,o=0,i=0,a=0,s=0,l=0,c=0,u=0;if(t=S,S=S+64|0,l=t+40|0,o=t+24|0,i=t+12|0,a=t,rt(0|(e|=0),0,52),r=134225919|B(),!e)return(0|n[A+4>>2])>2||(0|n[A+8>>2])>2||(0|n[A+12>>2])>2?(l=0,C(0|(s=0)),S=t,0|l):(rt(0|O(A),0,45),s=0|B()|r,l=-1,C(0|s),S=t,0|l);if(n[l>>2]=n[A>>2],n[l+4>>2]=n[A+4>>2],n[l+8>>2]=n[A+8>>2],n[l+12>>2]=n[A+12>>2],s=l+4|0,(0|e)>0)for(A=-1;n[o>>2]=n[s>>2],n[o+4>>2]=n[s+4>>2],n[o+8>>2]=n[s+8>>2],1&e?(dA(s),n[i>>2]=n[s>>2],n[i+4>>2]=n[s+4>>2],n[i+8>>2]=n[s+8>>2],gA(i)):(fA(s),n[i>>2]=n[s>>2],n[i+4>>2]=n[s+4>>2],n[i+8>>2]=n[s+8>>2],hA(i)),aA(o,i,a),nA(a),c=0|rt(7,0,0|(u=3*(15-e|0)|0)),r&=~B(),A=(u=0|rt(0|lA(a),0,0|u))|A&~c,r=0|B()|r,(0|e)>1;)e=e+-1|0;else A=-1;A:do{if((0|n[s>>2])<=2&&(0|n[l+8>>2])<=2&&(0|n[l+12>>2])<=2){if(e=0|rt(0|(o=0|O(l)),0,45),e|=A,A=B()|-1040385&r,a=0|U(l),!(0|H(o))){if((0|a)<=0)break;for(i=0;;){if(o=0|tt(0|e,0|A,52),B(),o&=15)for(r=1;l=0|tt(0|e,0|A,0|(u=3*(15-r|0)|0)),B(),c=0|rt(7,0,0|u),A&=~B(),e=e&~c|(u=0|rt(0|vA(7&l),0,0|u)),A=0|A|B(),r>>>0>>0;)r=r+1|0;if((0|(i=i+1|0))==(0|a))break A}}i=0|tt(0|e,0|A,52),B(),i&=15;e:do{if(i){r=1;t:for(;;){switch(u=0|tt(0|e,0|A,3*(15-r|0)|0),B(),7&u){case 1:break t;case 0:break;default:break e}if(!(r>>>0>>0))break e;r=r+1|0}if(0|Y(o,0|n[l>>2]))for(r=1;c=0|rt(7,0,0|(l=3*(15-r|0)|0)),u=A&~B(),A=0|tt(0|e,0|A,0|l),B(),e=e&~c|(A=0|rt(0|yA(7&A),0,0|l)),A=0|u|B(),r>>>0>>0;)r=r+1|0;else for(r=1;l=0|tt(0|e,0|A,0|(u=3*(15-r|0)|0)),B(),c=0|rt(7,0,0|u),A&=~B(),e=e&~c|(u=0|rt(0|vA(7&l),0,0|u)),A=0|A|B(),r>>>0>>0;)r=r+1|0}}while(0);if((0|a)>0){r=0;do{e=0|UA(e,A),A=0|B(),r=r+1|0}while((0|r)!=(0|a))}}else e=0,A=0}while(0);return u=e,C(0|(c=A)),S=t,0|u}(i,e),i=0|B(),n[t>>2]=e,n[t+4>>2]=i,!(0|e)&!(0|i)&&M(27795,27122,1050,27145),S=r,0|(i=0)):(S=r,0|(i=3))}function JA(A,e,t){var r,o=0,i=0,a=0;if(r=4+(t|=0)|0,i=0|tt(0|(A|=0),0|(e|=0),52),B(),i&=15,a=0|tt(0|A,0|e,45),B(),o=!(0|i),0|H(127&a)){if(o)return 1;o=1}else{if(o)return 0;o=0|n[r>>2]||0|n[t+8>>2]?1:1&!!(0|n[t+12>>2])}for(t=1;1&t?gA(r):hA(r),a=0|tt(0|A,0|e,3*(15-t|0)|0),B(),mA(r,7&a),t>>>0>>0;)t=t+1|0;return 0|o}function qA(A,e,t){t|=0;var r,o,i=0,a=0,s=0,l=0,c=0,u=0;if(o=S,S=S+16|0,r=o,u=0|tt(0|(A|=0),0|(e|=0),45),B(),(u&=127)>>>0>121)return n[t>>2]=0,n[t+4>>2]=0,n[t+8>>2]=0,n[t+12>>2]=0,S=o,5;A:do{if(0|H(u)&&(s=0|tt(0|A,0|e,52),B(),0|(s&=15))){i=1;e:for(;;){switch(c=0|tt(0|A,0|e,3*(15-i|0)|0),B(),7&c){case 5:break e;case 0:break;default:i=e;break A}if(!(i>>>0>>0)){i=e;break A}i=i+1|0}for(a=1,i=e;l=0|rt(7,0,0|(e=3*(15-a|0)|0)),c=i&~B(),i=0|tt(0|A,0|i,0|e),B(),A=A&~l|(i=0|rt(0|yA(7&i),0,0|e)),i=0|c|B(),a>>>0>>0;)a=a+1|0}else i=e}while(0);if(c=7696+(28*u|0)|0,n[t>>2]=n[c>>2],n[t+4>>2]=n[c+4>>2],n[t+8>>2]=n[c+8>>2],n[t+12>>2]=n[c+12>>2],!(0|JA(A,i,t)))return S=o,0;if(l=t+4|0,n[r>>2]=n[l>>2],n[r+4>>2]=n[l+4>>2],n[r+8>>2]=n[l+8>>2],s=0|tt(0|A,0|i,52),B(),c=15&s,1&s?(hA(l),s=c+1|0):s=c,0|H(u)){A:do{if(c)for(e=1;;){if(a=0|tt(0|A,0|i,3*(15-e|0)|0),B(),0|(a&=7)){i=a;break A}if(!(e>>>0>>0)){i=0;break}e=e+1|0}else i=0}while(0);i=4==(0|i)&1}else i=0;if(0|NA(t,s,i,0)){if(0|H(u))do{}while(0|NA(t,s,0,0));(0|s)!=(0|c)&&fA(l)}else(0|s)!=(0|c)&&(n[l>>2]=n[r>>2],n[l+4>>2]=n[r+4>>2],n[l+8>>2]=n[r+8>>2]);return S=o,0}function XA(A,e,t){t|=0;var r,o,i=0;return o=S,S=S+16|0,0|(i=0|qA(A|=0,e|=0,r=o))?(S=o,0|i):(i=0|tt(0|A,0|e,52),B(),function(A,e,t){var r,o;e|=0,t|=0,r=S,S=S+16|0,oA(4+(A|=0)|0,o=r),EA(o,0|n[A>>2],e,0,t),S=r}(r,15&i,t),S=o,0|(i=0))}function $A(A,e,t){t|=0;var r,n=0,o=0,i=0;if(r=S,S=S+16|0,0|(n=0|qA(A|=0,e|=0,i=r)))return S=r,0|n;n=0|tt(0|A,0|e,45),B(),n=!(0|H(127&n)),o=0|tt(0|A,0|e,52),B(),o&=15;A:do{if(!n){if(0|o)for(n=1;;){if(!(!((0|rt(7,0,3*(15-n|0)|0))&A)&!((0|B())&e)))break A;if(!(n>>>0>>0))break;n=n+1|0}return jA(i,o,0,5,t),S=r,0}}while(0);return FA(i,o,0,6,t),S=r,0}function Ae(A,e){e|=0;var t=0,r=0,o=0,i=0,a=0,s=0,l=0;if((A|=0)>>>0>15)return 4;if(rt(0|A,0,52),s=134225919|B(),!A){t=0,r=0;do{0|H(r)&&(rt(0|r,0,45),a=0|s|B(),n[(A=e+(t<<3)|0)>>2]=-1,n[A+4>>2]=a,t=t+1|0),r=r+1|0}while(122!=(0|r));return 0}t=0,a=0;do{if(0|H(a)){for(rt(0|a,0,45),r=1,o=-1,i=0|s|B();o&=~(l=0|rt(7,0,3*(15-r|0)|0)),i&=~B(),(0|r)!=(0|A);)r=r+1|0;n[(l=e+(t<<3)|0)>>2]=o,n[l+4>>2]=i,t=t+1|0}a=a+1|0}while(122!=(0|a));return 0}function ee(A,e,t,r){A|=0,r|=0;var o=0,i=0,a=0;o=0|tt(0|(e|=0),0|(t|=0),52),B(),!(0|e)&!(0|t)|(0|r)>15|(0|(o&=15))>(0|r)?(i=-1,e=-1,t=0,o=0):(e=0|HA(e,t,o+1|0,r),a=-15728641&B(),t=0|rt(0|r,0,52),i=o,e=(e=!(0|zA(t|=e,a=0|a|B())))?-1:r,o=a),n[(a=A)>>2]=t,n[a+4>>2]=o,n[A+8>>2]=i,n[A+12>>2]=e}function te(A,e,t,r){t|=0,r|=0;var o=0,i=0;return o=0|tt(0|(A|=0),0|(e|=0),52),B(),o&=15,n[(i=r+8|0)>>2]=o,!(0|A)&!(0|e)|(0|t)>15|(0|o)>(0|t)?(n[(t=r)>>2]=0,n[t+4>>2]=0,n[i>>2]=-1,void(n[r+12>>2]=-1)):(A=0|HA(A,e,o+1|0,t),i=-15728641&B(),o=0|rt(0|t,0,52),o|=A,i=0|i|B(),n[(A=r)>>2]=o,n[A+4>>2]=i,A=r+12|0,0|zA(o,i)?void(n[A>>2]=t):void(n[A>>2]=-1))}function re(A){var e,t=0,r=0,o=0,i=0,a=0,s=0,l=0,c=0;if(!(!(0|(t=0|n[(r=A|=0)>>2]))&!(0|(r=0|n[r+4>>2]))||(o=0|tt(0|t,0|r,52),B(),t=0|We(0|(l=0|rt(1,0,3*(15^(o&=15))|0)),0|B(),0|t,0|r),r=0|B(),n[(l=A)>>2]=t,n[l+4>>2]=r,(0|o)<(0|(s=0|n[(l=A+8|0)>>2]))))){for(e=A+12|0,a=o;;){if((0|a)==(0|s)){o=5;break}if(c=(0|a)==(0|n[e>>2]),o=0|tt(0|t,0|r,0|(i=3*(15-a|0)|0)),B(),c&1==(0|(o&=7))&!0){o=7;break}if(!(7==(0|o)&!0)){o=10;break}if(t=0|We(0|t,0|r,0|(c=0|rt(1,0,0|i)),0|B()),r=0|B(),n[(c=A)>>2]=t,n[c+4>>2]=r,!((0|a)>(0|s))){o=10;break}a=a+-1|0}if(5==(0|o))return n[(c=A)>>2]=0,n[c+4>>2]=0,n[l>>2]=-1,void(n[e>>2]=-1);if(7==(0|o))return s=0|We(0|t,0|r,0|(s=0|rt(1,0,0|i)),0|B()),l=0|B(),n[(c=A)>>2]=s,n[c+4>>2]=l,void(n[e>>2]=a+-1)}}function ne(A){var e;return e=(A=+A)<0?A+6.283185307179586:A,+(A>=6.283185307179586?e+-6.283185307179586:e)}function oe(A,e){return e|=0,+l(+(+o[(A|=0)>>3]-+o[e>>3]))<17453292519943298e-27?0|(e=+l(+(+o[A+8>>3]-+o[e+8>>3]))<17453292519943298e-27):0|(e=0)}function ie(A,e){switch(A=+A,0|(e|=0)){case 1:A=A<0?A+6.283185307179586:A;break;case 2:A=A>0?A+-6.283185307179586:A}return+A}function ae(A,e){A|=0;var t,r,n,i=0;return r=+o[(e|=0)>>3],t=+o[A>>3],i=(n=+f(.5*(r-t)))*n+(i=+f(.5*(+o[e+8>>3]-+o[A+8>>3])))*(+d(+r)*+d(+t)*i),2*+p(+ +c(+i),+ +c(+(1-i)))*6371.007180918475}function se(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[20656+(A<<3)>>3],0|(e=0))}function le(A,e){e|=0;var t=0;return(A|=0)>>>0>15?0|(e=4):(t=0|Xe(0|(t=0|pe(7,0,A,((0|A)<0)<<31>>31)),0|B(),120,0),A=0|B(),n[e>>2]=2|t,n[e+4>>2]=A,0|(e=0))}function ce(A,e,t){A|=0,t|=0;var r,n,i,a,s=0,l=0,u=0,h=0,m=0,v=0;return v=+o[(e|=0)>>3],i=+o[A>>3],m=+f(.5*(v-i)),u=+o[e+8>>3],n=+o[A+8>>3],h=+f(.5*(u-n)),r=+d(+i),a=+d(+v),h=2*+p(+ +c(+(h=m*m+h*(a*r*h))),+ +c(+(1-h))),m=+o[t>>3],v=+f(.5*(m-v)),s=+o[t+8>>3],u=+f(.5*(s-u)),l=+d(+m),u=2*+p(+ +c(+(u=v*v+u*(a*l*u))),+ +c(+(1-u))),m=+f(.5*(i-m)),s=+f(.5*(n-s)),s=2*+p(+ +c(+(s=m*m+s*(r*l*s))),+ +c(+(1-s))),4*+b(+ +c(+ +g(.5*(l=.5*(h+u+s)))*+g(.5*(l-h))*+g(.5*(l-u))*+g(.5*(l-s))))}function ue(A,e,t){t|=0;var r,i,a,s=0,l=0;if(a=S,S=S+192|0,i=a,0|(l=0|XA(A|=0,e|=0,r=a+168|0)))return S=a,0|l;if(0|$A(A,e,i)&&M(27795,27190,415,27199),(0|(e=0|n[i>>2]))>0){if(s=+ce(i+8|0,i+8+((1!=(0|e)&1)<<4)|0,r)+0,1!=(0|e)){A=1;do{s+=+ce(i+8+((l=A)<<4)|0,i+8+((0|(A=A+1|0))%(0|e)<<4)|0,r)}while((0|A)<(0|e))}}else s=0;return o[t>>3]=s,S=a,0}function de(A){A|=0;var e,t,r=0;return(e=0|Ve(1,12))||M(27280,27235,49,27293),0|(r=0|n[(t=A+4|0)>>2])?(n[(r=r+8|0)>>2]=e,n[t>>2]=e,0|e):(0|n[A>>2]&&M(27310,27235,61,27333),n[(r=A)>>2]=e,n[t>>2]=e,0|e)}function fe(A,e){var t,r;return A|=0,e|=0,(r=0|Ue(24))||M(27347,27235,78,27361),n[r>>2]=n[e>>2],n[r+4>>2]=n[e+4>>2],n[r+8>>2]=n[e+8>>2],n[r+12>>2]=n[e+12>>2],n[r+16>>2]=0,0|(t=0|n[(e=A+4|0)>>2])?(n[t+16>>2]=r,n[e>>2]=r,0|r):(0|n[A>>2]&&M(27376,27235,82,27361),n[A>>2]=r,n[e>>2]=r,0|r)}function ge(A){var e=0,t=0,r=0,o=0;if(A|=0)for(r=1;;){if(0|(e=0|n[A>>2]))do{if(0|(t=0|n[e>>2]))do{o=t,t=0|n[t+16>>2],Ye(o)}while(0|t);o=e,e=0|n[e+8>>2],Ye(o)}while(0|e);if(e=A,A=0|n[A+8>>2],r||Ye(e),!A)break;r=0}}function he(A,e,t){A|=0;var r=0,i=0,a=0,s=0,l=0,c=0,u=0,d=0;if(!(0|q(e|=0,t|=0)))return 0;if(e=0|K(e),r=+o[t>>3],i=e&(i=+o[t+8>>3])<0?i+6.283185307179586:i,!(A=0|n[A>>2]))return 0;if(e){e=0,u=i,t=A;A:for(;;){for(;s=+o[t>>3],i=+o[t+8>>3],d=0|n[(t=t+16|0)>>2],a=+o[(d=0|d?d:A)>>3],l=+o[d+8>>3],s>a?(c=s,s=l):(c=a,a=s,s=i,i=l),(r=r==a|r==c?r+2220446049250313e-31:r)c;)if(!(t=0|n[t>>2])){t=22;break A}if(((c=(l=s<0?s+6.283185307179586:s)+(r-a)/(c-a)*((s=i<0?i+6.283185307179586:i)-l))<0?c+6.283185307179586:c)>(u=l==u|s==u?u+-2220446049250313e-31:u)&&(e^=1),!(t=0|n[t>>2])){t=22;break}}if(22==(0|t))return 0|e}else{e=0,u=i,t=A;A:for(;;){for(;s=+o[t>>3],i=+o[t+8>>3],d=0|n[(t=t+16|0)>>2],a=+o[(d=0|d?d:A)>>3],l=+o[d+8>>3],s>a?(c=s,s=l):(c=a,a=s,s=i,i=l),(r=r==a|r==c?r+2220446049250313e-31:r)c;)if(!(t=0|n[t>>2])){t=22;break A}if(s+(r-a)/(c-a)*(i-s)>(u=s==u|i==u?u+-2220446049250313e-31:u)&&(e^=1),!(t=0|n[t>>2])){t=22;break}}if(22==(0|t))return 0|e}return 0}function me(A,e,t,o,i){t|=0,o|=0,i|=0;var a,s,l,c,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0;if(c=S,S=S+32|0,y=c+16|0,l=c,u=0|tt(0|(A|=0),0|(e|=0),52),B(),u&=15,b=0|tt(0|t,0|o,52),B(),(0|u)!=(15&b))return S=c,12;if(h=0|tt(0|A,0|e,45),B(),h&=127,m=0|tt(0|t,0|o,45),B(),h>>>0>121|(m&=127)>>>0>121)return S=c,5;if(b=(0|h)!=(0|m)){if(7==(0|(f=0|W(h,m))))return S=c,1;7==(0|(g=0|W(m,h)))?M(27514,27538,161,27548):(p=f,d=g)}else p=0,d=0;a=0|H(h),s=0|H(m),n[y>>2]=0,n[y+4>>2]=0,n[y+8>>2]=0,n[y+12>>2]=0;do{if(p){if(f=(0|(m=0|n[4272+(28*h|0)+(p<<2)>>2]))>0,s)if(f){h=0,g=t,f=o;do{g=0|VA(g,f),f=0|B(),1==(0|(d=0|yA(d)))&&(d=0|yA(1)),h=h+1|0}while((0|h)!=(0|m));m=d,h=g,g=f}else m=d,h=t,g=o;else if(f){h=0,g=t,f=o;do{g=0|WA(g,f),f=0|B(),d=0|yA(d),h=h+1|0}while((0|h)!=(0|m));m=d,h=g,g=f}else m=d,h=t,g=o;if(JA(h,g,y),b||M(27563,27538,191,27548),(f=!!(0|a))&(d=!!(0|s))&&M(27590,27538,192,27548),f){if(7==(0|(d=0|OA(A,e)))){u=5;break}if(0|r[22e3+(7*d|0)+p|0]){u=1;break}h=g=0|n[21168+(28*d|0)+(p<<2)>>2]}else if(d){if(7==(0|(d=0|OA(h,g)))){u=5;break}if(0|r[22e3+(7*d|0)+m|0]){u=1;break}h=0,g=0|n[21168+(28*m|0)+(d<<2)>>2]}else h=0,g=0;if((h|g|0)<0)u=5;else{if((0|g)>0){f=y+4|0,d=0;do{pA(f),d=d+1|0}while((0|d)!=(0|g))}if(n[l>>2]=0,n[l+4>>2]=0,n[l+8>>2]=0,mA(l,p),0|u)for(;0|ZA(u)?gA(l):hA(l),(0|u)>1;)u=u+-1|0;if((0|h)>0){u=0;do{pA(l),u=u+1|0}while((0|u)!=(0|h))}iA(v=y+4|0,l,v),nA(v),v=51}}else if(JA(t,o,y),!!(0|a)&!!(0|s))if((0|m)!=(0|h)&&M(27621,27538,261,27548),7==(0|(d=0|OA(A,e)))|7==(0|(u=0|OA(t,o))))u=5;else if(0|r[22e3+(7*d|0)+u|0])u=1;else if((0|(d=0|n[21168+(28*d|0)+(u<<2)>>2]))>0){f=y+4|0,u=0;do{pA(f),u=u+1|0}while((0|u)!=(0|d));v=51}else v=51;else v=51}while(0);return 51==(0|v)&&(u=y+4|0,n[i>>2]=n[u>>2],n[i+4>>2]=n[u+4>>2],n[i+8>>2]=n[u+8>>2],u=0),S=c,0|u}function be(A,e,t,r){t|=0,r|=0;var o,i,a,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0;if(a=S,S=S+48|0,o=a+36|0,c=a+24|0,u=a+12|0,d=a,s=0|tt(0|(A|=0),0|(e|=0),52),B(),s&=15,g=0|tt(0|A,0|e,45),B(),(g&=127)>>>0>121)return S=a,5;if(i=0|H(g),rt(0|s,0,52),b=134225919|B(),n[(l=r)>>2]=-1,n[l+4>>2]=b,!s)return 7==(0|(s=0|lA(t)))||127==(0|(s=0|V(g,s)))?(S=a,0|(b=1)):(h=0|rt(0|s,0,45),m=0|B(),m=-1040385&n[(g=r)+4>>2]|m,n[(b=r)>>2]=n[g>>2]|h,n[b+4>>2]=m,S=a,0|(b=0));for(n[o>>2]=n[t>>2],n[o+4>>2]=n[t+4>>2],n[o+8>>2]=n[t+8>>2],t=s;;){if(l=t,t=t+-1|0,n[c>>2]=n[o>>2],n[c+4>>2]=n[o+4>>2],n[c+8>>2]=n[o+8>>2],0|ZA(l)){if(0|(s=0|cA(o))){t=13;break}n[u>>2]=n[o>>2],n[u+4>>2]=n[o+4>>2],n[u+8>>2]=n[o+8>>2],gA(u)}else{if(0|(s=0|uA(o))){t=13;break}n[u>>2]=n[o>>2],n[u+4>>2]=n[o+4>>2],n[u+8>>2]=n[o+8>>2],hA(u)}if(aA(c,u,d),nA(d),v=0|n[(s=r)>>2],s=0|n[s+4>>2],p=0|rt(7,0,0|(y=3*(15-l|0)|0)),s&=~B(),y=0|rt(0|lA(d),0,0|y),s=0|B()|s,n[(b=r)>>2]=y|v&~p,n[b+4>>2]=s,(0|l)<=1){t=14;break}}A:do{if(13!=(0|t)&&14==(0|t))if((0|n[o>>2])<=1&&(0|n[o+4>>2])<=1&&(0|n[o+8>>2])<=1){d=127==(0|(s=0|V(g,t=0|lA(o))))?0:0|H(s);e:do{if(t){if(i){if(7==(0|(s=0|OA(A,e)))){s=5;break A}if((0|(l=0|n[21376+(28*s|0)+(t<<2)>>2]))>0){s=t,t=0;do{s=0|vA(s),t=t+1|0}while((0|t)!=(0|l))}else s=t;if(1==(0|s)){s=9;break A}127==(0|(t=0|V(g,s)))&&M(27648,27538,411,27678),0|H(t)?M(27693,27538,412,27678):(m=t,h=l,f=s)}else m=s,h=0,f=t;if((0|(u=0|n[4272+(28*g|0)+(f<<2)>>2]))<=-1&&M(27724,27538,419,27678),!d){if((0|h)<0){s=5;break A}if(0|h){s=0,t=0|n[(l=r)>>2],l=0|n[l+4>>2];do{t=0|YA(t,l),l=0|B(),n[(y=r)>>2]=t,n[y+4>>2]=l,s=s+1|0}while((0|s)<(0|h))}if((0|u)<=0){s=m,t=58;break}for(s=0,t=0|n[(l=r)>>2],l=0|n[l+4>>2];;)if(t=0|YA(t,l),l=0|B(),n[(y=r)>>2]=t,n[y+4>>2]=l,(0|(s=s+1|0))==(0|u)){s=m,t=58;break e}}if(7==(0|(c=0|W(m,g)))&&M(27514,27538,428,27678),t=0|n[(s=r)>>2],s=0|n[s+4>>2],(0|u)>0){l=0;do{t=0|YA(t,s),s=0|B(),n[(y=r)>>2]=t,n[y+4>>2]=s,l=l+1|0}while((0|l)!=(0|u))}if(7==(0|(s=0|OA(t,s)))&&M(27795,27538,440,27678),t=0|G(m),(0|(t=0|n[(t?21792:21584)+(28*c|0)+(s<<2)>>2]))<0&&M(27795,27538,454,27678),t){s=0,l=0|n[(c=r)>>2],c=0|n[c+4>>2];do{l=0|UA(l,c),c=0|B(),n[(y=r)>>2]=l,n[y+4>>2]=c,s=s+1|0}while((0|s)<(0|t));s=m,t=58}else s=m,t=58}else if(!!(0|i)&!!(0|d)){if(7==(0|(t=0|OA(A,e)))|7==(0|(l=0|OA(0|n[(l=r)>>2],0|n[l+4>>2])))){s=5;break A}if((0|(l=0|n[21376+(28*t|0)+(l<<2)>>2]))<0){s=5;break A}if(l){t=0,c=0|n[(u=r)>>2],u=0|n[u+4>>2];do{c=0|YA(c,u),u=0|B(),n[(y=r)>>2]=c,n[y+4>>2]=u,t=t+1|0}while((0|t)<(0|l));t=58}else t=59}else t=58}while(0);if(58==(0|t)&&d&&(t=59),59==(0|t)&&1==(0|OA(0|n[(y=r)>>2],0|n[y+4>>2]))){s=9;break}p=0|n[(y=r)>>2],y=-1040385&n[y+4>>2],v=0|rt(0|s,0,45),y=0|y|B(),n[(s=r)>>2]=p|v,n[s+4>>2]=y,s=0}else s=1}while(0);return S=a,0|s}function pe(A,e,t,r){A|=0,e|=0;var n=0,o=0,i=0;if(!(0|(t|=0))&!(0|(r|=0)))return o=1,C(0|(n=0)),0|o;o=A,n=e,A=1,e=0;do{A=0|Xe(0|((i=!0&!(1&t))?1:o),0|(i?0:n),0|A,0|e),e=0|B(),t=0|et(0|t,0|r,1),r=0|B(),o=0|Xe(0|o,0|n,0|o,0|n),n=0|B()}while(!(!(0|t)&!(0|r)));return C(0|e),0|A}function ve(A,e,t,r){t|=0,r|=0;var i,a=0,s=0,l=0,c=0,u=0,f=0;i=S,S=S+16|0,s=i,l=0|tt(0|(A|=0),0|(e|=0),52),B(),l&=15;do{if(l){if(!(a=0|XA(A,e,s))){u=+o[s>>3],c=1/+d(+u),f=+o[25968+(l<<3)>>3],o[t>>3]=u+f,o[t+8>>3]=u-f,u=+o[s+8>>3],c*=f,o[t+16>>3]=c+u,o[t+24>>3]=u-c;break}return S=i,0|a}if(a=0|tt(0|A,0|e,45),B(),(a&=127)>>>0>121)return S=i,5;s=22064+(a<<5)|0,n[t>>2]=n[s>>2],n[t+4>>2]=n[s+4>>2],n[t+8>>2]=n[s+8>>2],n[t+12>>2]=n[s+12>>2],n[t+16>>2]=n[s+16>>2],n[t+20>>2]=n[s+20>>2],n[t+24>>2]=n[s+24>>2],n[t+28>>2]=n[s+28>>2];break}while(0);return function(A,e){e=+e;var t,r,n,i,a,s,l,c=0,u=0;c=(i=+o[(n=16+(A|=0)|0)>>3])-(r=+o[(t=A+24|0)>>3]),c=i>3],c=.5*(c*e-c),u+=e=.5*((l=u-(s=+o[(a=A+8|0)>>3]))*e-l),o[A>>3]=u>1.5707963267948966?1.5707963267948966:u,e=s-e,o[a>>3]=e<-1.5707963267948966?-1.5707963267948966:e,e=(e=i+c)>3.141592653589793?e+-6.283185307179586:e,o[n>>3]=e<-3.141592653589793?e+6.283185307179586:e,e=(e=r-c)>3.141592653589793?e+-6.283185307179586:e,o[t>>3]=e<-3.141592653589793?e+6.283185307179586:e}(t,r?1.4:1.1),(0|n[(r=26096+(l<<3)|0)>>2])==(0|A)&&(0|n[r+4>>2])==(0|e)&&(o[t>>3]=1.5707963267948966),(0|n[(l=26224+(l<<3)|0)>>2])==(0|A)&&(0|n[l+4>>2])==(0|e)&&(o[t+8>>3]=-1.5707963267948966),1.5707963267948966!=+o[t>>3]&&-1.5707963267948966!=+o[t+8>>3]?(S=i,0|(l=0)):(o[t+16>>3]=3.141592653589793,o[t+24>>3]=-3.141592653589793,S=i,0|(l=0))}function ye(A){var e,t,o,i,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0;if(i=S,S=S+336|0,e=i+168|0,t=i,!(0|(s=0|n[(l=A|=0)>>2]))&!(0|(l=0|n[l+4>>2])))S=i;else{if(0|r[0|(a=A+28|0)]?(s=0|we(s,l),l=0|B()):r[0|a]=1,!(0|n[n[(o=A+20|0)>>2]>>2]))return 0|(s=0|n[(a=A+24|0)>>2])&&Ye(s),n[(x=A)>>2]=0,n[x+4>>2]=0,n[A+8>>2]=0,n[o>>2]=0,n[A+12>>2]=-1,n[A+16>>2]=0,n[a>>2]=0,void(S=i);c=15&(a=0|n[(x=A+16|0)>>2]);A:do{if(!(0|s)&!(0|l))w=A+24|0;else{v=A+12|0,b=3==(0|c),m=255&a,g=3==(1|c),p=A+24|0,h=(c+-1|0)>>>0<3,d=3==(2|c),f=t+8|0;e:for(;;){if(u=0|tt(0|s,0|l,52),B(),(0|(u&=15))==(0|n[v>>2])){switch(15&m){case 0:case 2:case 3:if(0|(c=0|XA(s,l,e))){y=15;break e}if(0|Me(0|n[o>>2],0|n[p>>2],e)){y=19;break e}}if(g&&(c=0|n[4+(0|n[o>>2])>>2],n[e>>2]=n[c>>2],n[e+4>>2]=n[c+4>>2],n[e+8>>2]=n[c+8>>2],n[e+12>>2]=n[c+12>>2],0|q(26832,e))){if(0|KA(0|n[4+(0|n[o>>2])>>2],u,t)){y=25;break}if((0|n[(c=t)>>2])==(0|s)&&(0|n[c+4>>2])==(0|l)){y=29;break}}if(h){if(0|(c=0|$A(s,l,e))){y=32;break}if(0|ve(s,l,t,0)){y=36;break}if(d&&0|De(0|n[o>>2],0|n[p>>2],e,t)){y=42;break}if(g&&0|je(0|n[o>>2],0|n[p>>2],e,t)){y=42;break}}if(b){if(a=0|ve(s,l,e,1),c=0|n[p>>2],0|a){y=45;break}if(0|X(c,e)){if(AA(t,e),0|$(e,0|n[p>>2])){y=53;break}if(0|Me(0|n[o>>2],0|n[p>>2],f)){y=53;break}if(0|je(0|n[o>>2],0|n[p>>2],t,e)){y=53;break}}}}do{if((0|u)<(0|n[v>>2])){if(a=0|ve(s,l,e,1),c=0|n[p>>2],0|a){y=58;break e}if(!(0|X(c,e))){y=73;break}if(0|$(0|n[p>>2],e)&&(AA(t,e),0|De(0|n[o>>2],0|n[p>>2],t,e))){y=65;break e}if(0|(s=0|GA(s,l,u+1|0,t))){y=67;break e}s=0|n[(l=t)>>2],l=0|n[l+4>>2]}else y=73}while(0);if(73==(0|y)&&(y=0,s=0|we(s,l),l=0|B()),!(0|s)&!(0|l)){w=p;break A}}switch(0|y){case 15:0|(a=0|n[p>>2])&&Ye(a),n[(y=A)>>2]=0,n[y+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=c,y=20;break;case 19:n[A>>2]=s,n[A+4>>2]=l,y=20;break;case 25:M(27795,27761,470,27772);break;case 29:case 42:return n[A>>2]=s,n[A+4>>2]=l,void(S=i);case 32:return 0|(a=0|n[p>>2])&&Ye(a),n[(w=A)>>2]=0,n[w+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=c,void(S=i);case 36:M(27795,27761,493,27772);break;case 45:0|c&&Ye(c),n[(y=A)>>2]=0,n[y+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=a,y=55;break;case 53:n[A>>2]=s,n[A+4>>2]=l,y=55;break;case 58:0|c&&Ye(c),n[(y=A)>>2]=0,n[y+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=a,y=71;break;case 65:n[A>>2]=s,n[A+4>>2]=l,y=71;break;case 67:return 0|(a=0|n[p>>2])&&Ye(a),n[(w=A)>>2]=0,n[w+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=s,void(S=i)}if(20==(0|y))return void(S=i);if(55==(0|y))return void(S=i);if(71==(0|y))return void(S=i)}}while(0);0|(a=0|n[w>>2])&&Ye(a),n[(y=A)>>2]=0,n[y+4>>2]=0,n[A+8>>2]=0,n[o>>2]=0,n[A+12>>2]=-1,n[x>>2]=0,n[w>>2]=0,S=i}}function we(A,e){var t,r=0,o=0,i=0,a=0,s=0,l=0,c=0,u=0,d=0;t=S,S=S+16|0,d=t,o=0|tt(0|(A|=0),0|(e|=0),52),B(),o&=15,r=0|tt(0|A,0|e,45),B();do{if(o){for(;r=0|rt(o+4095|0,0,52),i=B()|-15728641&e,r=r|A|(s=0|rt(7,0,0|(a=3*(15-o|0)|0))),i|=l=0|B(),c=0|tt(0|A,0|e,0|a),B(),o=o+-1|0,!((c&=7)>>>0<6);){if(!o){u=4;break}e=i,A=r}if(4==(0|u)){r=0|tt(0|r,0|i,45),B();break}return d=0|rt(((d=!(0|c)&!!(0|zA(r,i)))?2:1)+c|0,0,0|a),u=0|B()|e&~l,d|=A&~s,C(0|u),S=t,0|d}}while(0);return(r&=127)>>>0>120?(d=0,C(0|(u=0)),S=t,0|d):(RA(d,0,r+1|0,0),u=0|n[d+4>>2],d=0|n[d>>2],C(0|u),S=t,0|d)}function xe(A,e,t){A|=0;var r,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0;if(!(0|q(e|=0,t|=0)))return 0;if(e=0|K(e),i=+o[t>>3],a=e&(a=+o[t+8>>3])<0?a+6.283185307179586:a,(0|(g=0|n[A>>2]))<=0)return 0;if(r=0|n[A+4>>2],e){e=0,f=a,t=-1,A=0;A:for(;;){for(d=A;l=+o[r+(d<<4)>>3],a=+o[r+(d<<4)+8>>3],s=+o[r+((A=(t+2|0)%(0|g)|0)<<4)>>3],c=+o[r+(A<<4)+8>>3],l>s?(u=l,l=c):(u=s,s=l,l=a,a=c),(i=i==s|i==u?i+2220446049250313e-31:i)u;){if((0|(t=d+1|0))>=(0|g)){t=22;break A}A=d,d=t,t=A}if(((u=(c=l<0?l+6.283185307179586:l)+(i-s)/(u-s)*((l=a<0?a+6.283185307179586:a)-c))<0?u+6.283185307179586:u)>(f=c==f|l==f?f+-2220446049250313e-31:f)&&(e^=1),(0|(A=d+1|0))>=(0|g)){t=22;break}t=d}if(22==(0|t))return 0|e}else{e=0,f=a,t=-1,A=0;A:for(;;){for(d=A;l=+o[r+(d<<4)>>3],a=+o[r+(d<<4)+8>>3],s=+o[r+((A=(t+2|0)%(0|g)|0)<<4)>>3],c=+o[r+(A<<4)+8>>3],l>s?(u=l,l=c):(u=s,s=l,l=a,a=c),(i=i==s|i==u?i+2220446049250313e-31:i)u;){if((0|(t=d+1|0))>=(0|g)){t=22;break A}A=d,d=t,t=A}if(l+(i-s)/(u-s)*(a-l)>(f=l==f|a==f?f+-2220446049250313e-31:f)&&(e^=1),(0|(A=d+1|0))>=(0|g)){t=22;break}t=d}if(22==(0|t))return 0|e}return 0}function ke(A,e){e|=0;var t,r,i,a,s,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0;if(!(r=0|n[(A|=0)>>2]))return n[e>>2]=0,n[e+4>>2]=0,n[e+8>>2]=0,n[e+12>>2]=0,n[e+16>>2]=0,n[e+20>>2]=0,n[e+24>>2]=0,void(n[e+28>>2]=0);if(o[(i=e+8|0)>>3]=17976931348623157e292,o[(a=e+24|0)>>3]=17976931348623157e292,o[e>>3]=-17976931348623157e292,o[(s=e+16|0)>>3]=-17976931348623157e292,!((0|r)<=0)){for(t=0|n[A+4>>2],b=17976931348623157e292,p=-17976931348623157e292,v=0,A=-1,f=17976931348623157e292,g=17976931348623157e292,m=-17976931348623157e292,u=-17976931348623157e292,y=0;c=+o[t+(y<<4)>>3],h=+o[t+(y<<4)+8>>3],d=+o[t+(((0|(A=A+2|0))==(0|r)?0:A)<<4)+8>>3],c>3]=c,f=c),h>3]=h,g=h),c>m?o[e>>3]=c:c=m,h>u&&(o[s>>3]=h,u=h),b=h>0&hp?h:p,v|=+l(+(h-d))>3.141592653589793,(0|(A=y+1|0))!=(0|r);)w=y,m=c,y=A,A=w;v&&(o[s>>3]=p,o[a>>3]=b)}}function Ce(A){return 0|((A|=0)>>>0<4?0:15)}function Be(A,e){e|=0;var t,r=0,i=0,a=0,s=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,B=0,M=0;if(p=0|n[(A|=0)>>2]){if(o[(v=e+8|0)>>3]=17976931348623157e292,o[(y=e+24|0)>>3]=17976931348623157e292,o[e>>3]=-17976931348623157e292,o[(w=e+16|0)>>3]=-17976931348623157e292,(0|p)>0){for(a=0|n[A+4>>2],m=17976931348623157e292,b=-17976931348623157e292,i=0,r=-1,d=17976931348623157e292,f=17976931348623157e292,h=-17976931348623157e292,c=-17976931348623157e292,x=0;s=+o[a+(x<<4)>>3],g=+o[a+(x<<4)+8>>3],u=+o[a+(((0|(B=r+2|0))==(0|p)?0:B)<<4)+8>>3],s>3]=s,d=s),g>3]=g,f=g),s>h?o[e>>3]=s:s=h,g>c&&(o[w>>3]=g,c=g),m=g>0&gb?g:b,i|=+l(+(g-u))>3.141592653589793,(0|(r=x+1|0))!=(0|p);)B=x,h=s,x=r,r=B;i&&(o[w>>3]=b,o[y>>3]=m)}}else n[e>>2]=0,n[e+4>>2]=0,n[e+8>>2]=0,n[e+12>>2]=0,n[e+16>>2]=0,n[e+20>>2]=0,n[e+24>>2]=0,n[e+28>>2]=0;if(!((0|(r=0|n[(B=A+8|0)>>2]))<=0)){t=A+12|0,C=0;do{if(a=0|n[t>>2],i=C,y=e+((C=C+1|0)<<5)|0,w=0|n[a+(i<<3)>>2]){if(o[(x=e+(C<<5)+8|0)>>3]=17976931348623157e292,o[(A=e+(C<<5)+24|0)>>3]=17976931348623157e292,o[y>>3]=-17976931348623157e292,o[(k=e+(C<<5)+16|0)>>3]=-17976931348623157e292,(0|w)>0){for(p=0|n[a+(i<<3)+4>>2],m=17976931348623157e292,b=-17976931348623157e292,a=0,i=-1,v=0,d=17976931348623157e292,f=17976931348623157e292,g=-17976931348623157e292,c=-17976931348623157e292;s=+o[p+(v<<4)>>3],h=+o[p+(v<<4)+8>>3],u=+o[p+(((0|(i=i+2|0))==(0|w)?0:i)<<4)+8>>3],s>3]=s,d=s),h>3]=h,f=h),s>g?o[y>>3]=s:s=g,h>c&&(o[k>>3]=h,c=h),m=h>0&hb?h:b,a|=+l(+(h-u))>3.141592653589793,(0|(i=v+1|0))!=(0|w);)M=v,v=i,g=s,i=M;a&&(o[k>>3]=b,o[A>>3]=m)}}else n[y>>2]=0,n[y+4>>2]=0,n[y+8>>2]=0,n[y+12>>2]=0,n[y+16>>2]=0,n[y+20>>2]=0,n[y+24>>2]=0,n[y+28>>2]=0,r=0|n[B>>2]}while((0|C)<(0|r))}}function Me(A,e,t){var r=0,o=0,i=0;if(!(0|xe(A|=0,e|=0,t|=0)))return 0;if((0|n[(o=A+8|0)>>2])<=0)return 1;for(r=A+12|0,A=0;;){if(i=A,A=A+1|0,0|xe((0|n[r>>2])+(i<<3)|0,e+(A<<5)|0,t)){A=0,r=6;break}if((0|A)>=(0|n[o>>2])){A=1,r=6;break}}return 6==(0|r)?0|A:0}function De(A,e,t,r){r|=0;var o,i,a=0,s=0,l=0,c=0,u=0;if(i=S,S=S+16|0,o=i,!(0|xe(A|=0,e|=0,l=8+(t|=0)|0)))return S=i,0;c=A+8|0;A:do{if((0|n[c>>2])>0){for(s=A+12|0,a=0;;){if(u=a,a=a+1|0,0|xe((0|n[s>>2])+(u<<3)|0,e+(a<<5)|0,l)){a=0;break}if((0|a)>=(0|n[c>>2]))break A}return S=i,0|a}}while(0);if(0|Ee(A,e,t,r))return S=i,0;n[o>>2]=n[t>>2],n[o+4>>2]=l,a=0|n[c>>2];A:do{if((0|a)>0)for(A=A+12|0,l=0,s=a;;){if(a=0|n[A>>2],(0|n[a+(l<<3)>>2])>0){if(0|xe(o,r,0|n[a+(l<<3)+4>>2])){a=0;break A}if(a=l+1|0,0|Ee((0|n[A>>2])+(l<<3)|0,e+(a<<5)|0,t,r)){a=0;break A}s=0|n[c>>2]}else a=l+1|0;if(!((0|a)<(0|s))){a=1;break}l=a}else a=1}while(0);return S=i,0|a}function Ee(A,e,t,r){A|=0,t|=0;var i,a,s,l,c,u,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,B=0,M=0;if(u=S,S=S+176|0,l=u+172|0,d=u+168|0,c=u,!(0|X(e|=0,r|=0)))return S=u,0;if(function(A,e,t,r){var i,a,s,l,c;e|=0,t|=0,r|=0,A=(a=+o[16+(A|=0)>>3])<(c=+o[A+24>>3]),i=(l=+o[e+16>>3])<(s=+o[e+24>>3]),e=c-l>2]=A?i|e?1:2:0,n[r>>2]=i?A?1:e?2:1:0}(e,r,l,d),st(0|c,0|t,168),(0|n[t>>2])>0){e=0;do{x=+ie(+o[(B=c+8+(e<<4)+8|0)>>3],0|n[d>>2]),o[B>>3]=x,e=e+1|0}while((0|e)<(0|n[t>>2]))}a=+o[r>>3],s=+o[r+8>>3],x=+ie(+o[r+16>>3],0|n[d>>2]),i=+ie(+o[r+24>>3],0|n[d>>2]);A:do{if((0|n[A>>2])>0){if(r=A+4|0,(0|(d=0|n[c>>2]))<=0)for(e=0;;)if((0|(e=e+1|0))>=(0|n[A>>2])){e=0;break A}for(t=0;;){if(e=0|n[r>>2],y=+o[e+(t<<4)>>3],w=+ie(+o[e+(t<<4)+8>>3],0|n[l>>2]),e=0|n[r>>2],B=(0|(t=t+1|0))%(0|n[A>>2])|0,f=+o[e+(B<<4)>>3],g=+ie(+o[e+(B<<4)+8>>3],0|n[l>>2]),!(y>=a)|!(f>=a)&&!(y<=s)|!(f<=s)&&!(w<=i)|!(g<=i)&&!(w>=x)|!(g>=x)){v=f-y,b=g-w,e=0;do{if(M=e,B=(0|(e=e+1|0))==(0|d)?0:e,f=+o[c+8+(M<<4)+8>>3],g=+o[c+8+(B<<4)+8>>3]-f,h=+o[c+8+(M<<4)>>3],!(0==(p=v*g-b*(m=+o[c+8+(B<<4)>>3]-h))||(k=w-f,C=y-h,m=(k*m-g*C)/p,m<0|m>1))&&(p=(v*k-b*C)/p)>=0&p<=1){e=1;break A}}while((0|e)<(0|d))}if((0|t)>=(0|n[A>>2])){e=0;break}}}else e=0}while(0);return S=u,0|e}function je(A,e,t,r){var o=0,i=0,a=0;if(0|Ee(A|=0,e|=0,t|=0,r|=0))return 1;if((0|n[(i=A+8|0)>>2])<=0)return 0;for(o=A+12|0,A=0;;){if(a=A,A=A+1|0,0|Ee((0|n[o>>2])+(a<<3)|0,e+(A<<5)|0,t,r)){A=1,o=6;break}if((0|A)>=(0|n[i>>2])){A=0,o=6;break}}return 6==(0|o)?0|A:0}function Qe(A,e,t,r,n){e|=0,t|=0,r|=0,n|=0;var i,a,s,l,c,u,d,f=0;l=+o[(A|=0)>>3],s=+o[e>>3]-l,a=+o[A+8>>3],i=+o[e+8>>3]-a,u=+o[t>>3],f=((f=+o[r>>3]-u)*(a-(d=+o[t+8>>3]))-(l-u)*(c=+o[r+8>>3]-d))/(s*c-i*f),o[n>>3]=l+s*f,o[n+8>>3]=a+i*f}function Ne(A,e){return e|=0,+l(+(+o[(A|=0)>>3]-+o[e>>3]))<1.1920928955078125e-7?0|(e=+l(+(+o[A+8>>3]-+o[e+8>>3]))<1.1920928955078125e-7):0|(e=0)}function Se(A,e){var t,r,n;return e|=0,+((n=+o[(A|=0)>>3]-+o[e>>3])*n+(r=+o[A+8>>3]-+o[e+8>>3])*r+(t=+o[A+16>>3]-+o[e+16>>3])*t)}function Fe(A,e,t){t|=0;var r,o,i,a,s=0,l=0,c=0,u=0;if(a=S,S=S+32|0,u=a,0|(s=0|qA(A|=0,e|=0,o=a+16|0)))return S=a,0|s;r=0|TA(A,e),i=0|OA(A,e),function(A,e){A=7696+(28*(A|=0)|0)|0,n[(e|=0)>>2]=n[A>>2],n[e+4>>2]=n[A+4>>2],n[e+8>>2]=n[A+8>>2],n[e+12>>2]=n[A+12>>2]}(r,u),s=0|function(A,e){A|=0;var t=0,r=0;if((e|=0)>>>0>20)return-1;do{if((0|n[11120+(216*e|0)>>2])!=(0|A))if((0|n[11120+(216*e|0)+8>>2])!=(0|A))if((0|n[11120+(216*e|0)+16>>2])!=(0|A))if((0|n[11120+(216*e|0)+24>>2])!=(0|A))if((0|n[11120+(216*e|0)+32>>2])!=(0|A))if((0|n[11120+(216*e|0)+40>>2])!=(0|A))if((0|n[11120+(216*e|0)+48>>2])!=(0|A))if((0|n[11120+(216*e|0)+56>>2])!=(0|A))if((0|n[11120+(216*e|0)+64>>2])!=(0|A))if((0|n[11120+(216*e|0)+72>>2])!=(0|A))if((0|n[11120+(216*e|0)+80>>2])!=(0|A))if((0|n[11120+(216*e|0)+88>>2])!=(0|A))if((0|n[11120+(216*e|0)+96>>2])!=(0|A))if((0|n[11120+(216*e|0)+104>>2])!=(0|A))if((0|n[11120+(216*e|0)+112>>2])!=(0|A))if((0|n[11120+(216*e|0)+120>>2])!=(0|A))if((0|n[11120+(216*e|0)+128>>2])!=(0|A)){if((0|n[11120+(216*e|0)+136>>2])!=(0|A)){if((0|n[11120+(216*e|0)+144>>2])==(0|A)){A=0,t=2,r=0;break}if((0|n[11120+(216*e|0)+152>>2])==(0|A)){A=0,t=2,r=1;break}if((0|n[11120+(216*e|0)+160>>2])==(0|A)){A=0,t=2,r=2;break}if((0|n[11120+(216*e|0)+168>>2])==(0|A)){A=1,t=2,r=0;break}if((0|n[11120+(216*e|0)+176>>2])==(0|A)){A=1,t=2,r=1;break}if((0|n[11120+(216*e|0)+184>>2])==(0|A)){A=1,t=2,r=2;break}if((0|n[11120+(216*e|0)+192>>2])==(0|A)){A=2,t=2,r=0;break}if((0|n[11120+(216*e|0)+200>>2])==(0|A)){A=2,t=2,r=1;break}if((0|n[11120+(216*e|0)+208>>2])==(0|A)){A=2,t=2,r=2;break}return-1}A=2,t=1,r=2}else A=2,t=1,r=1;else A=2,t=1,r=0;else A=1,t=1,r=2;else A=1,t=1,r=1;else A=1,t=1,r=0;else A=0,t=1,r=2;else A=0,t=1,r=1;else A=0,t=1,r=0;else A=2,t=0,r=2;else A=2,t=0,r=1;else A=2,t=0,r=0;else A=1,t=0,r=2;else A=1,t=0,r=1;else A=1,t=0,r=0;else A=0,t=0,r=2;else A=0,t=0,r=1;else A=0,t=0,r=0}while(0);return 0|n[11120+(216*e|0)+(72*t|0)+(24*A|0)+(r<<3)+4>>2]}(r,0|n[o>>2]);do{if(0|H(r)){switch(0|r){case 4:l=0;break;case 14:l=1;break;case 24:l=2;break;case 38:l=3;break;case 49:l=4;break;case 58:l=5;break;case 63:l=6;break;case 72:l=7;break;case 83:l=8;break;case 97:l=9;break;case 107:l=10;break;case 117:l=11;break;default:M(27795,27797,75,27806)}if(c=0|n[26416+(24*l|0)+8>>2],e=0|n[26416+(24*l|0)+16>>2],(0|(A=0|n[o>>2]))!=(0|n[u>>2])&&(u=0|G(r))|(0|(A=0|n[o>>2]))==(0|e)&&(s=(s+1|0)%6|0),3==(0|i)&(0|A)==(0|e)){s=(s+5|0)%6|0;break}5==(0|i)&(0|A)==(0|c)&&(s=(s+1|0)%6|0)}}while(0);return n[t>>2]=s,S=a,0}function Pe(A,e,t,r){t|=0,r|=0;var o,i,a,s,l,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0;if(l=S,S=S+32|0,y=l+24|0,s=l+20|0,a=l+8|0,i=l+16|0,o=l,g=(g=!(0|zA(A|=0,e|=0)))?6:5,m=0|tt(0|A,0|e,52),B(),g>>>0<=t>>>0)return S=l,2;!(b=!(0|(m&=15)))&&!((p=0|rt(7,0,3*(15^m)|0))&A)&!((0|B())&e)?c=t:u=4;A:do{if(4==(0|u)){if((0|((c=!!(0|zA(A,e)))?4:5))<(0|t))return S=l,1;if(0|Fe(A,e,y))return S=l,1;if(u=(0|n[y>>2])+t|0,7==(0|(p=0|n[(c=c?26704+((0|u)%5<<2)|0:26736+((0|u)%6<<2)|0)>>2])))return S=l,1;n[s>>2]=0,c=0|R(A,e,p,s,a);do{if(!c){if(h=0|n[(f=a)>>2],u=(d=(f=0|n[f+4>>2])>>>0>>0|(0|f)==(0|e)&h>>>0>>0)?h:A,d=d?f:e,!b&&!(h&(b=0|rt(7,0,3*(15^m)|0)))&!(f&(0|B())))c=t;else{if(f=(t+-1+g|0)%(0|g)|0,c=0|zA(A,e),(0|f)<0&&M(27795,27797,248,27822),(0|((g=!!(0|c))?4:5))<(0|f)&&M(27795,27797,248,27822),0|Fe(A,e,y)&&M(27795,27797,248,27822),c=(0|n[y>>2])+f|0,7==(0|(f=0|n[(c=g?26704+((0|c)%5<<2)|0:26736+((0|c)%6<<2)|0)>>2]))&&M(27795,27797,248,27822),n[i>>2]=0,0|(c=0|R(A,e,f,i,o)))break;g=0|n[(h=o)>>2],h=0|n[h+4>>2];do{if(h>>>0>>0|(0|h)==(0|d)&g>>>0>>0){if(u=0|zA(g,h)?0|_(g,h,A,e):0|n[26800+(((0|n[i>>2])+(0|n[26768+(f<<2)>>2])|0)%6<<2)>>2],c=0|zA(g,h),(u+-1|0)>>>0>5){c=-1,u=g,d=h;break}if(1==(0|u)&(c=!!(0|c))){c=-1,u=g,d=h;break}do{if(!(0|Fe(g,h,y))){if(c){c=(5+(0|n[26352+(u<<2)>>2])-(0|n[y>>2])|0)%5|0;break}c=(6+(0|n[26384+(u<<2)>>2])-(0|n[y>>2])|0)%6|0;break}c=-1}while(0);u=g,d=h}else c=t}while(0);h=0|n[(f=a)>>2],f=0|n[f+4>>2]}if((0|u)==(0|h)&(0|d)==(0|f)){if(A=(g=!!(0|zA(h,f)))?0|_(h,f,A,e):0|n[26800+(((0|n[s>>2])+(0|n[26768+(p<<2)>>2])|0)%6<<2)>>2],c=0|zA(h,f),(A+-1|0)>>>0<=5&&!(1==(0|A)&(v=!!(0|c))))do{if(!(0|Fe(h,f,y))){if(v){c=(5+(0|n[26352+(A<<2)>>2])-(0|n[y>>2])|0)%5|0;break}c=(6+(0|n[26384+(A<<2)>>2])-(0|n[y>>2])|0)%6|0;break}c=-1}while(0);else c=-1;c=6==(0|(c=c+1|0))|g&5==(0|c)?0:c}e=d,A=u;break A}}while(0);return S=l,0|c}}while(0);return v=0|rt(0|c,0,56),y=B()|-2130706433&e|536870912,n[r>>2]=v|A,n[r+4>>2]=y,S=l,0}function Te(A,e){A|=0;var t,r,o=0,i=0;return r=S,S=S+16|0,t=r,!0&536870912==(2013265920&(e|=0))&&0|LA(A,o=-2130706433&e|134217728)?(i=0|tt(0|A,0|e,56),B(),o=(i=!(0|Pe(A,o,7&i,t)))&((0|n[(o=t)>>2])==(0|A)?(0|n[o+4>>2])==(0|e):0)&1,S=r,0|o):(S=r,0|(o=0))}function Le(A,e,t){A|=0,t|=0;var r=0;(0|(e|=0))>0?(r=0|Ve(e,4),n[A>>2]=r,r||M(27835,27858,40,27872)):n[A>>2]=0,n[A+4>>2]=e,n[A+8>>2]=0,n[A+12>>2]=t}function Re(A){var e,t,r,i=0,a=0,s=0,c=0;e=4+(A|=0)|0,t=A+12|0,r=A+8|0;A:for(;;){for(a=0|n[e>>2],i=0;;){if((0|i)>=(0|a))break A;if(s=0|n[A>>2],c=0|n[s+(i<<2)>>2])break;i=i+1|0}i=s+(~~(+l(+ +u(10,+ +(15-(0|n[t>>2])|0))*(+o[c>>3]+ +o[c+8>>3]))%+(0|a))>>>0<<2)|0,a=0|n[i>>2];e:do{if(0|a){if(s=c+32|0,(0|a)==(0|c))n[i>>2]=n[s>>2];else{if(!(i=0|n[(a=a+32|0)>>2]))break;for(;(0|i)!=(0|c);)if(!(i=0|n[(a=i+32|0)>>2]))break e;n[a>>2]=n[s>>2]}Ye(c),n[r>>2]=(0|n[r>>2])-1}}while(0)}Ye(0|n[A>>2])}function Ie(A){var e,t=0,r=0;for(e=0|n[4+(A|=0)>>2],r=0;;){if((0|r)>=(0|e)){t=0,r=4;break}if(t=0|n[(0|n[A>>2])+(r<<2)>>2]){r=4;break}r=r+1|0}return 4==(0|r)?0|t:0}function _e(A,e){e|=0;var t=0,r=0,i=0,a=0;if(t=~~(+l(+ +u(10,+ +(15-(0|n[12+(A|=0)>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,t=(0|n[A>>2])+(t<<2)|0,!(r=0|n[t>>2]))return 1;a=e+32|0;do{if((0|r)!=(0|e)){if(!(t=0|n[r+32>>2]))return 1;for(i=t;;){if((0|i)==(0|e)){i=8;break}if(!(t=0|n[i+32>>2])){t=1,i=10;break}r=i,i=t}if(8==(0|i)){n[r+32>>2]=n[a>>2];break}if(10==(0|i))return 0|t}else n[t>>2]=n[a>>2]}while(0);return Ye(e),n[(a=A+8|0)>>2]=(0|n[a>>2])-1,0}function ze(A,e,t){A|=0,e|=0,t|=0;var r,i=0,a=0,s=0;(r=0|Ue(40))||M(27888,27858,98,27901),n[r>>2]=n[e>>2],n[r+4>>2]=n[e+4>>2],n[r+8>>2]=n[e+8>>2],n[r+12>>2]=n[e+12>>2],n[(a=r+16|0)>>2]=n[t>>2],n[a+4>>2]=n[t+4>>2],n[a+8>>2]=n[t+8>>2],n[a+12>>2]=n[t+12>>2],n[r+32>>2]=0,a=~~(+l(+ +u(10,+ +(15-(0|n[A+12>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,a=(0|n[A>>2])+(a<<2)|0,i=0|n[a>>2];do{if(i){for(;!(0|oe(i,e)&&0|oe(i+16|0,t));)if(a=0|n[i+32>>2],!(0|n[(i=0|a?a:i)+32>>2])){s=10;break}if(10==(0|s)){n[i+32>>2]=r;break}return Ye(r),0|i}n[a>>2]=r}while(0);return n[(s=A+8|0)>>2]=1+(0|n[s>>2]),0|r}function He(A,e,t){e|=0,t|=0;var r=0,i=0;if(i=~~(+l(+ +u(10,+ +(15-(0|n[12+(A|=0)>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,!(i=0|n[(0|n[A>>2])+(i<<2)>>2]))return 0;if(!t){for(A=i;;){if(0|oe(A,e)){r=10;break}if(!(A=0|n[A+32>>2])){A=0,r=10;break}}if(10==(0|r))return 0|A}for(A=i;;){if(0|oe(A,e)&&0|oe(A+16|0,t)){r=10;break}if(!(A=0|n[A+32>>2])){A=0,r=10;break}}return 10==(0|r)?0|A:0}function Ge(A,e){e|=0;var t=0;if(t=~~(+l(+ +u(10,+ +(15-(0|n[12+(A|=0)>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,!(A=0|n[(0|n[A>>2])+(t<<2)>>2]))return 0;for(;;){if(0|oe(A,e)){e=5;break}if(!(A=0|n[A+32>>2])){A=0,e=5;break}}return 5==(0|e)?0|A:0}function Oe(A){return 0|+ct(+(A=+A))}function Ue(A){A|=0;var e,t=0,r=0,o=0,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0;e=S,S=S+16|0,g=e;do{if(A>>>0<245){if(A=(u=A>>>0<11?16:A+11&-8)>>>3,3&(r=(f=0|n[6981])>>>A))return o=0|n[(r=8+(A=27964+((t=(1&r^1)+A|0)<<1<<2)|0)|0)>>2],(0|(a=0|n[(i=o+8|0)>>2]))==(0|A)?n[6981]=f&~(1<>2]=A,n[r>>2]=a),x=t<<3,n[o+4>>2]=3|x,n[(x=o+x+4|0)>>2]=1|n[x>>2],S=e,0|i;if(u>>>0>(d=0|n[6983])>>>0){if(0|r)return t=((t=r<>>=l=t>>>12&16)>>>5&8)|l|(a=(t>>>=r)>>>2&4)|(A=(t>>>=a)>>>1&2)|(o=(t>>>=A)>>>1&1))+(t>>>o)|0)<<1<<2)|0)|0)>>2],(0|(r=0|n[(l=a+8|0)>>2]))==(0|t)?(A=f&~(1<>2]=t,n[A>>2]=r,A=f),s=(x=o<<3)-u|0,n[a+4>>2]=3|u,n[4+(i=a+u|0)>>2]=1|s,n[a+x>>2]=s,0|d&&(o=0|n[6986],r=27964+((t=d>>>3)<<1<<2)|0,A&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=o,n[t+12>>2]=o,n[o+8>>2]=t,n[o+12>>2]=r),n[6983]=s,n[6986]=i,S=e,0|l;if(a=0|n[6982]){for(r=(a&0-a)-1|0,r=c=0|n[28228+(((o=(r>>>=i=r>>>12&16)>>>5&8)|i|(s=(r>>>=o)>>>2&4)|(l=(r>>>=s)>>>1&2)|(c=(r>>>=l)>>>1&1))+(r>>>c)<<2)>>2],l=c,c=(-8&n[c+4>>2])-u|0;(A=0|n[r+16>>2])||(A=0|n[r+20>>2]);)r=A,l=(i=(s=(-8&n[A+4>>2])-u|0)>>>0>>0)?A:l,c=i?s:c;if((s=l+u|0)>>>0>l>>>0){i=0|n[l+24>>2],t=0|n[l+12>>2];do{if((0|t)==(0|l)){if(!(t=0|n[(A=l+20|0)>>2])&&!(t=0|n[(A=l+16|0)>>2])){r=0;break}for(;;)if(r=0|n[(o=t+20|0)>>2])t=r,A=o;else{if(!(r=0|n[(o=t+16|0)>>2]))break;t=r,A=o}n[A>>2]=0,r=t}else r=0|n[l+8>>2],n[r+12>>2]=t,n[t+8>>2]=r,r=t}while(0);do{if(0|i){if(t=0|n[l+28>>2],(0|l)==(0|n[(A=28228+(t<<2)|0)>>2])){if(n[A>>2]=r,!r){n[6982]=a&~(1<>2])==(0|l)?x:i+20)>>2]=r,!r)break;n[r+24>>2]=i,0|(t=0|n[l+16>>2])&&(n[r+16>>2]=t,n[t+24>>2]=r),0|(t=0|n[l+20>>2])&&(n[r+20>>2]=t,n[t+24>>2]=r)}}while(0);return c>>>0<16?(x=c+u|0,n[l+4>>2]=3|x,n[(x=l+x+4|0)>>2]=1|n[x>>2]):(n[l+4>>2]=3|u,n[s+4>>2]=1|c,n[s+c>>2]=c,0|d&&(o=0|n[6986],r=27964+((t=d>>>3)<<1<<2)|0,(t=1<>2]:(n[6981]=t|f,t=r,A=r+8|0),n[A>>2]=o,n[t+12>>2]=o,n[o+8>>2]=t,n[o+12>>2]=r),n[6983]=c,n[6986]=s),S=e,0|l+8}f=u}else f=u}else f=u}else if(A>>>0<=4294967231)if(u=-8&(A=A+11|0),o=0|n[6982]){i=0-u|0,c=(A>>>=8)?u>>>0>16777215?31:u>>>(7+(c=14-((l=(520192+(b=A<<(f=(A+1048320|0)>>>16&8))|0)>>>16&4)|f|(c=(245760+(b<<=l)|0)>>>16&2))+(b<>>15)|0)|0)&1|c<<1:0,r=0|n[28228+(c<<2)>>2];A:do{if(r)for(A=0,l=u<<(31==(0|c)?0:25-(c>>>1)|0),a=0;;){if((s=(-8&n[r+4>>2])-u|0)>>>0>>0){if(!s){A=r,i=0,b=65;break A}A=r,i=s}if(a=!(0|(b=0|n[r+20>>2]))|(0|b)==(0|(r=0|n[r+16+(l>>>31<<2)>>2]))?a:b,!r){r=a,b=61;break}l<<=1}else r=0,A=0,b=61}while(0);if(61==(0|b)){if(!(0|r)&!(0|A)){if(!(A=((A=2<>>=s=f>>>12&16)>>>5&8)|s|(l=(f>>>=a)>>>2&4)|(c=(f>>>=l)>>>1&2)|(r=(f>>>=c)>>>1&1))+(f>>>r)<<2)>>2]}r?b=65:(l=A,s=i)}if(65==(0|b))for(a=r;;){if(i=(r=(f=(-8&n[a+4>>2])-u|0)>>>0>>0)?f:i,A=r?a:A,(r=0|n[a+16>>2])||(r=0|n[a+20>>2]),!r){l=A,s=i;break}a=r}if(0|l&&s>>>0<((0|n[6983])-u|0)>>>0&&(d=l+u|0)>>>0>l>>>0){a=0|n[l+24>>2],t=0|n[l+12>>2];do{if((0|t)==(0|l)){if(!(t=0|n[(A=l+20|0)>>2])&&!(t=0|n[(A=l+16|0)>>2])){t=0;break}for(;;)if(r=0|n[(i=t+20|0)>>2])t=r,A=i;else{if(!(r=0|n[(i=t+16|0)>>2]))break;t=r,A=i}n[A>>2]=0}else x=0|n[l+8>>2],n[x+12>>2]=t,n[t+8>>2]=x}while(0);do{if(a){if(A=0|n[l+28>>2],(0|l)==(0|n[(r=28228+(A<<2)|0)>>2])){if(n[r>>2]=t,!t){o&=~(1<>2])==(0|l)?x:a+20)>>2]=t,!t)break;n[t+24>>2]=a,0|(A=0|n[l+16>>2])&&(n[t+16>>2]=A,n[A+24>>2]=t),(A=0|n[l+20>>2])&&(n[t+20>>2]=A,n[A+24>>2]=t)}}while(0);A:do{if(s>>>0<16)x=s+u|0,n[l+4>>2]=3|x,n[(x=l+x+4|0)>>2]=1|n[x>>2];else{if(n[l+4>>2]=3|u,n[d+4>>2]=1|s,n[d+s>>2]=s,t=s>>>3,s>>>0<256){r=27964+(t<<1<<2)|0,(A=0|n[6981])&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=d,n[t+12>>2]=d,n[d+8>>2]=t,n[d+12>>2]=r;break}if(t=28228+((r=(t=s>>>8)?s>>>0>16777215?31:s>>>(7+(r=14-((y=(520192+(x=t<<(w=(t+1048320|0)>>>16&8))|0)>>>16&4)|w|(r=(245760+(x<<=y)|0)>>>16&2))+(x<>>15)|0)|0)&1|r<<1:0)<<2)|0,n[d+28>>2]=r,n[4+(A=d+16|0)>>2]=0,n[A>>2]=0,!(o&(A=1<>2]=d,n[d+24>>2]=t,n[d+12>>2]=d,n[d+8>>2]=d;break}t=0|n[t>>2];e:do{if((-8&n[t+4>>2])!=(0|s)){for(o=s<<(31==(0|r)?0:25-(r>>>1)|0);A=0|n[(r=t+16+(o>>>31<<2)|0)>>2];){if((-8&n[A+4>>2])==(0|s)){t=A;break e}o<<=1,t=A}n[r>>2]=d,n[d+24>>2]=t,n[d+12>>2]=d,n[d+8>>2]=d;break A}}while(0);x=0|n[(w=t+8|0)>>2],n[x+12>>2]=d,n[w>>2]=d,n[d+8>>2]=x,n[d+12>>2]=t,n[d+24>>2]=0}}while(0);return S=e,0|l+8}f=u}else f=u;else f=-1}while(0);if((r=0|n[6983])>>>0>=f>>>0)return t=r-f|0,A=0|n[6986],t>>>0>15?(x=A+f|0,n[6986]=x,n[6983]=t,n[x+4>>2]=1|t,n[A+r>>2]=t,n[A+4>>2]=3|f):(n[6983]=0,n[6986]=0,n[A+4>>2]=3|r,n[(x=A+r+4|0)>>2]=1|n[x>>2]),S=e,0|A+8;if((s=0|n[6984])>>>0>f>>>0)return y=s-f|0,n[6984]=y,w=(x=0|n[6987])+f|0,n[6987]=w,n[w+4>>2]=1|y,n[x+4>>2]=3|f,S=e,0|x+8;if(0|n[7099]?A=0|n[7101]:(n[7101]=4096,n[7100]=4096,n[7102]=-1,n[7103]=-1,n[7104]=0,n[7092]=0,n[7099]=-16&g^1431655768,A=4096),l=f+48|0,(u=(a=A+(c=f+47|0)|0)&(i=0-A|0))>>>0<=f>>>0)return S=e,0;if(0|(A=0|n[7091])&&(g=(d=0|n[7089])+u|0)>>>0<=d>>>0|g>>>0>A>>>0)return S=e,0;A:do{if(4&n[7092])t=0,b=143;else{r=0|n[6987];e:do{if(r){for(o=28372;!((g=0|n[o>>2])>>>0<=r>>>0&&(g+(0|n[o+4>>2])|0)>>>0>r>>>0);){if(!(A=0|n[o+8>>2])){b=128;break e}o=A}if((t=a-s&i)>>>0<2147483647)if((0|(A=0|ut(0|t)))==((0|n[o>>2])+(0|n[o+4>>2])|0)){if(-1!=(0|A)){s=t,a=A,b=145;break A}}else o=A,b=136;else t=0}else b=128}while(0);do{if(128==(0|b))if(-1!=(0|(r=0|ut(0)))&&(t=r,m=(t=((m=(h=0|n[7100])-1|0)&t?(m+t&0-h)-t|0:0)+u|0)+(h=0|n[7089])|0,t>>>0>f>>>0&t>>>0<2147483647)){if(0|(g=0|n[7091])&&m>>>0<=h>>>0|m>>>0>g>>>0){t=0;break}if((0|(A=0|ut(0|t)))==(0|r)){s=t,a=r,b=145;break A}o=A,b=136}else t=0}while(0);do{if(136==(0|b)){if(r=0-t|0,!(l>>>0>t>>>0&t>>>0<2147483647&-1!=(0|o))){if(-1==(0|o)){t=0;break}s=t,a=o,b=145;break A}if((A=c-t+(A=0|n[7101])&0-A)>>>0>=2147483647){s=t,a=o,b=145;break A}if(-1==(0|ut(0|A))){ut(0|r),t=0;break}s=A+t|0,a=o,b=145;break A}}while(0);n[7092]=4|n[7092],b=143}}while(0);if(143==(0|b)&&u>>>0<2147483647&&!(-1==(0|(y=0|ut(0|u)))|1^(v=(p=(m=0|ut(0))-y|0)>>>0>(f+40|0)>>>0)|y>>>0>>0&-1!=(0|y)&-1!=(0|m)^1)&&(s=v?p:t,a=y,b=145),145==(0|b)){t=(0|n[7089])+s|0,n[7089]=t,t>>>0>(0|n[7090])>>>0&&(n[7090]=t),c=0|n[6987];A:do{if(c){for(t=28372;;){if((0|a)==((A=0|n[t>>2])+(r=0|n[t+4>>2])|0)){b=154;break}if(!(o=0|n[t+8>>2]))break;t=o}if(!(154!=(0|b)||(w=t+4|0,8&n[t+12>>2]))&&a>>>0>c>>>0&A>>>0<=c>>>0){n[w>>2]=r+s,w=c+(y=7&(y=c+8|0)?0-y&7:0)|0,y=(x=(0|n[6984])+s|0)-y|0,n[6987]=w,n[6984]=y,n[w+4>>2]=1|y,n[c+x+4>>2]=40,n[6988]=n[7103];break}for(a>>>0<(0|n[6985])>>>0&&(n[6985]=a),r=a+s|0,t=28372;;){if((0|n[t>>2])==(0|r)){b=162;break}if(!(A=0|n[t+8>>2]))break;t=A}if(162==(0|b)&&!(8&n[t+12>>2])){n[t>>2]=a,n[(d=t+4|0)>>2]=(0|n[d>>2])+s,u=(d=a+(7&(d=a+8|0)?0-d&7:0)|0)+f|0,l=(t=r+(7&(t=r+8|0)?0-t&7:0)|0)-d-f|0,n[d+4>>2]=3|f;e:do{if((0|c)==(0|t))x=(0|n[6984])+l|0,n[6984]=x,n[6987]=u,n[u+4>>2]=1|x;else{if((0|n[6986])==(0|t)){x=(0|n[6983])+l|0,n[6983]=x,n[6986]=u,n[u+4>>2]=1|x,n[u+x>>2]=x;break}if(1==(3&(A=0|n[t+4>>2]))){s=-8&A,o=A>>>3;t:do{if(A>>>0<256){if(A=0|n[t+8>>2],(0|(r=0|n[t+12>>2]))==(0|A)){n[6981]=n[6981]&~(1<>2]=r,n[r+8>>2]=A;break}a=0|n[t+24>>2],A=0|n[t+12>>2];do{if((0|A)==(0|t)){if(A=0|n[(o=4+(r=t+16|0)|0)>>2])r=o;else if(!(A=0|n[r>>2])){A=0;break}for(;;)if(o=0|n[(i=A+20|0)>>2])A=o,r=i;else{if(!(o=0|n[(i=A+16|0)>>2]))break;A=o,r=i}n[r>>2]=0}else x=0|n[t+8>>2],n[x+12>>2]=A,n[A+8>>2]=x}while(0);if(!a)break;o=28228+((r=0|n[t+28>>2])<<2)|0;do{if((0|n[o>>2])==(0|t)){if(n[o>>2]=A,0|A)break;n[6982]=n[6982]&~(1<>2])==(0|t)?x:a+20)>>2]=A,!A)break t}while(0);if(n[A+24>>2]=a,0|(o=0|n[(r=t+16|0)>>2])&&(n[A+16>>2]=o,n[o+24>>2]=A),!(r=0|n[r+4>>2]))break;n[A+20>>2]=r,n[r+24>>2]=A}while(0);t=t+s|0,i=s+l|0}else i=l;if(n[(t=t+4|0)>>2]=-2&n[t>>2],n[u+4>>2]=1|i,n[u+i>>2]=i,t=i>>>3,i>>>0<256){r=27964+(t<<1<<2)|0,(A=0|n[6981])&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=u,n[t+12>>2]=u,n[u+8>>2]=t,n[u+12>>2]=r;break}t=i>>>8;do{if(t){if(i>>>0>16777215){o=31;break}o=i>>>(7+(o=14-((y=(520192+(x=t<<(w=(t+1048320|0)>>>16&8))|0)>>>16&4)|w|(o=(245760+(x<<=y)|0)>>>16&2))+(x<>>15)|0)|0)&1|o<<1}else o=0}while(0);if(t=28228+(o<<2)|0,n[u+28>>2]=o,n[4+(A=u+16|0)>>2]=0,n[A>>2]=0,!((A=0|n[6982])&(r=1<>2]=u,n[u+24>>2]=t,n[u+12>>2]=u,n[u+8>>2]=u;break}t=0|n[t>>2];t:do{if((-8&n[t+4>>2])!=(0|i)){for(o=i<<(31==(0|o)?0:25-(o>>>1)|0);A=0|n[(r=t+16+(o>>>31<<2)|0)>>2];){if((-8&n[A+4>>2])==(0|i)){t=A;break t}o<<=1,t=A}n[r>>2]=u,n[u+24>>2]=t,n[u+12>>2]=u,n[u+8>>2]=u;break e}}while(0);x=0|n[(w=t+8|0)>>2],n[x+12>>2]=u,n[w>>2]=u,n[u+8>>2]=x,n[u+12>>2]=t,n[u+24>>2]=0}}while(0);return S=e,0|d+8}for(t=28372;!((A=0|n[t>>2])>>>0<=c>>>0&&(x=A+(0|n[t+4>>2])|0)>>>0>c>>>0);)t=0|n[t+8>>2];t=(A=(A=(i=x+-47|0)+(7&(A=i+8|0)?0-A&7:0)|0)>>>0<(i=c+16|0)>>>0?c:A)+8|0,w=a+(y=7&(y=a+8|0)?0-y&7:0)|0,y=(r=s+-40|0)-y|0,n[6987]=w,n[6984]=y,n[w+4>>2]=1|y,n[a+r+4>>2]=40,n[6988]=n[7103],n[(r=A+4|0)>>2]=27,n[t>>2]=n[7093],n[t+4>>2]=n[7094],n[t+8>>2]=n[7095],n[t+12>>2]=n[7096],n[7093]=a,n[7094]=s,n[7096]=0,n[7095]=t,t=A+24|0;do{w=t,n[(t=t+4|0)>>2]=7}while((w+8|0)>>>0>>0);if((0|A)!=(0|c)){if(a=A-c|0,n[r>>2]=-2&n[r>>2],n[c+4>>2]=1|a,n[A>>2]=a,t=a>>>3,a>>>0<256){r=27964+(t<<1<<2)|0,(A=0|n[6981])&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=c,n[t+12>>2]=c,n[c+8>>2]=t,n[c+12>>2]=r;break}if(r=28228+((o=(t=a>>>8)?a>>>0>16777215?31:a>>>(7+(o=14-((y=(520192+(x=t<<(w=(t+1048320|0)>>>16&8))|0)>>>16&4)|w|(o=(245760+(x<<=y)|0)>>>16&2))+(x<>>15)|0)|0)&1|o<<1:0)<<2)|0,n[c+28>>2]=o,n[c+20>>2]=0,n[i>>2]=0,!((t=0|n[6982])&(A=1<>2]=c,n[c+24>>2]=r,n[c+12>>2]=c,n[c+8>>2]=c;break}t=0|n[r>>2];e:do{if((-8&n[t+4>>2])!=(0|a)){for(o=a<<(31==(0|o)?0:25-(o>>>1)|0);A=0|n[(r=t+16+(o>>>31<<2)|0)>>2];){if((-8&n[A+4>>2])==(0|a)){t=A;break e}o<<=1,t=A}n[r>>2]=c,n[c+24>>2]=t,n[c+12>>2]=c,n[c+8>>2]=c;break A}}while(0);x=0|n[(w=t+8|0)>>2],n[x+12>>2]=c,n[w>>2]=c,n[c+8>>2]=x,n[c+12>>2]=t,n[c+24>>2]=0}}else!(0|(x=0|n[6985]))|a>>>0>>0&&(n[6985]=a),n[7093]=a,n[7094]=s,n[7096]=0,n[6990]=n[7099],n[6989]=-1,n[6994]=27964,n[6993]=27964,n[6996]=27972,n[6995]=27972,n[6998]=27980,n[6997]=27980,n[7e3]=27988,n[6999]=27988,n[7002]=27996,n[7001]=27996,n[7004]=28004,n[7003]=28004,n[7006]=28012,n[7005]=28012,n[7008]=28020,n[7007]=28020,n[7010]=28028,n[7009]=28028,n[7012]=28036,n[7011]=28036,n[7014]=28044,n[7013]=28044,n[7016]=28052,n[7015]=28052,n[7018]=28060,n[7017]=28060,n[7020]=28068,n[7019]=28068,n[7022]=28076,n[7021]=28076,n[7024]=28084,n[7023]=28084,n[7026]=28092,n[7025]=28092,n[7028]=28100,n[7027]=28100,n[7030]=28108,n[7029]=28108,n[7032]=28116,n[7031]=28116,n[7034]=28124,n[7033]=28124,n[7036]=28132,n[7035]=28132,n[7038]=28140,n[7037]=28140,n[7040]=28148,n[7039]=28148,n[7042]=28156,n[7041]=28156,n[7044]=28164,n[7043]=28164,n[7046]=28172,n[7045]=28172,n[7048]=28180,n[7047]=28180,n[7050]=28188,n[7049]=28188,n[7052]=28196,n[7051]=28196,n[7054]=28204,n[7053]=28204,n[7056]=28212,n[7055]=28212,w=a+(y=7&(y=a+8|0)?0-y&7:0)|0,y=(x=s+-40|0)-y|0,n[6987]=w,n[6984]=y,n[w+4>>2]=1|y,n[a+x+4>>2]=40,n[6988]=n[7103]}while(0);if((t=0|n[6984])>>>0>f>>>0)return y=t-f|0,n[6984]=y,w=(x=0|n[6987])+f|0,n[6987]=w,n[w+4>>2]=1|y,n[x+4>>2]=3|f,S=e,0|x+8}return n[(x=27920)>>2]=12,S=e,0}function Ye(A){var e=0,t=0,r=0,o=0,i=0,a=0,s=0,l=0;if(A|=0){t=A+-8|0,o=0|n[6985],l=t+(e=-8&(A=0|n[A+-4>>2]))|0;do{if(1&A)s=t,a=t;else{if(r=0|n[t>>2],!(3&A))return;if(i=r+e|0,(a=t+(0-r)|0)>>>0>>0)return;if((0|n[6986])==(0|a)){if(3&~(e=0|n[(A=l+4|0)>>2])){s=a,e=i;break}return n[6983]=i,n[A>>2]=-2&e,n[a+4>>2]=1|i,void(n[a+i>>2]=i)}if(t=r>>>3,r>>>0<256){if(A=0|n[a+8>>2],(0|(e=0|n[a+12>>2]))==(0|A)){n[6981]=n[6981]&~(1<>2]=e,n[e+8>>2]=A,s=a,e=i;break}o=0|n[a+24>>2],A=0|n[a+12>>2];do{if((0|A)==(0|a)){if(A=0|n[(t=4+(e=a+16|0)|0)>>2])e=t;else if(!(A=0|n[e>>2])){A=0;break}for(;;)if(t=0|n[(r=A+20|0)>>2])A=t,e=r;else{if(!(t=0|n[(r=A+16|0)>>2]))break;A=t,e=r}n[e>>2]=0}else s=0|n[a+8>>2],n[s+12>>2]=A,n[A+8>>2]=s}while(0);if(o){if(e=0|n[a+28>>2],(0|n[(t=28228+(e<<2)|0)>>2])==(0|a)){if(n[t>>2]=A,!A){n[6982]=n[6982]&~(1<>2])==(0|a)?s:o+20)>>2]=A,!A){s=a,e=i;break}n[A+24>>2]=o,0|(t=0|n[(e=a+16|0)>>2])&&(n[A+16>>2]=t,n[t+24>>2]=A),(e=0|n[e+4>>2])?(n[A+20>>2]=e,n[e+24>>2]=A,s=a,e=i):(s=a,e=i)}else s=a,e=i}}while(0);if(!(a>>>0>=l>>>0)&&1&(r=0|n[(A=l+4|0)>>2])){if(2&r)n[A>>2]=-2&r,n[s+4>>2]=1|e,n[a+e>>2]=e,o=e;else{if((0|n[6987])==(0|l)){if(l=(0|n[6984])+e|0,n[6984]=l,n[6987]=s,n[s+4>>2]=1|l,(0|s)!=(0|n[6986]))return;return n[6986]=0,void(n[6983]=0)}if((0|n[6986])==(0|l))return l=(0|n[6983])+e|0,n[6983]=l,n[6986]=a,n[s+4>>2]=1|l,void(n[a+l>>2]=l);o=(-8&r)+e|0,t=r>>>3;do{if(r>>>0<256){if(e=0|n[l+8>>2],(0|(A=0|n[l+12>>2]))==(0|e)){n[6981]=n[6981]&~(1<>2]=A,n[A+8>>2]=e;break}i=0|n[l+24>>2],A=0|n[l+12>>2];do{if((0|A)==(0|l)){if(A=0|n[(t=4+(e=l+16|0)|0)>>2])e=t;else if(!(A=0|n[e>>2])){t=0;break}for(;;)if(t=0|n[(r=A+20|0)>>2])A=t,e=r;else{if(!(t=0|n[(r=A+16|0)>>2]))break;A=t,e=r}n[e>>2]=0,t=A}else t=0|n[l+8>>2],n[t+12>>2]=A,n[A+8>>2]=t,t=A}while(0);if(0|i){if(A=0|n[l+28>>2],(0|n[(e=28228+(A<<2)|0)>>2])==(0|l)){if(n[e>>2]=t,!t){n[6982]=n[6982]&~(1<>2])==(0|l)?r:i+20)>>2]=t,!t)break;n[t+24>>2]=i,0|(e=0|n[(A=l+16|0)>>2])&&(n[t+16>>2]=e,n[e+24>>2]=t),0|(A=0|n[A+4>>2])&&(n[t+20>>2]=A,n[A+24>>2]=t)}}while(0);if(n[s+4>>2]=1|o,n[a+o>>2]=o,(0|s)==(0|n[6986]))return void(n[6983]=o)}if(A=o>>>3,o>>>0<256)return t=27964+(A<<1<<2)|0,(e=0|n[6981])&(A=1<>2]:(n[6981]=e|A,A=t,e=t+8|0),n[e>>2]=s,n[A+12>>2]=s,n[s+8>>2]=A,void(n[s+12>>2]=t);A=28228+((r=(A=o>>>8)?o>>>0>16777215?31:o>>>(7+(r=14-((i=(520192+(l=A<<(a=(A+1048320|0)>>>16&8))|0)>>>16&4)|a|(r=(245760+(l<<=i)|0)>>>16&2))+(l<>>15)|0)|0)&1|r<<1:0)<<2)|0,n[s+28>>2]=r,n[s+20>>2]=0,n[s+16>>2]=0,e=0|n[6982],t=1<>2];e:do{if((-8&n[A+4>>2])!=(0|o)){for(r=o<<(31==(0|r)?0:25-(r>>>1)|0);e=0|n[(t=A+16+(r>>>31<<2)|0)>>2];){if((-8&n[e+4>>2])==(0|o)){A=e;break e}r<<=1,A=e}n[t>>2]=s,n[s+24>>2]=A,n[s+12>>2]=s,n[s+8>>2]=s;break A}}while(0);l=0|n[(a=A+8|0)>>2],n[l+12>>2]=s,n[a>>2]=s,n[s+8>>2]=l,n[s+12>>2]=A,n[s+24>>2]=0}else n[6982]=e|t,n[A>>2]=s,n[s+24>>2]=A,n[s+12>>2]=s,n[s+8>>2]=s}while(0);if(l=(0|n[6989])-1|0,n[6989]=l,!(0|l)){for(A=28380;A=0|n[A>>2];)A=A+8|0;n[6989]=-1}}}}function Ve(A,e){e|=0;var t=0;return(A|=0)?(t=0|y(e,A),(e|A)>>>0>65535&&(t=((t>>>0)/(A>>>0)|0)==(0|e)?t:-1)):t=0,(A=0|Ue(t))&&3&n[A+-4>>2]?(lt(0|A,0,0|t),0|A):0|A}function We(A,e,t,r){return 0|(C((e|=0)+(r|=0)+((t=(A|=0)+(t|=0)>>>0)>>>0>>0|0)>>>0|0),t)}function Ze(A,e,t,r){return 0|(C(0|(r=(e|=0)-(r|=0)-((t|=0)>>>0>(A|=0)>>>0|0)>>>0)),A-t>>>0)}function Ke(A){return 0|((A|=0)?31-(0|k(A^A-1)):32)}function Je(A,e,t,r,o){o|=0;var i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0;if(u=A|=0,a=t|=0,s=f=r|=0,!(c=l=e|=0))return i=!!(0|o),s?i?(n[o>>2]=0|A,n[o+4>>2]=0&e,o=0,0|(C(0|(f=0)),o)):(o=0,0|(C(0|(f=0)),o)):(i&&(n[o>>2]=(u>>>0)%(a>>>0),n[o+4>>2]=0),o=(u>>>0)/(a>>>0)>>>0,0|(C(0|(f=0)),o));i=!(0|s);do{if(a){if(!i){if((i=(0|k(0|s))-(0|k(0|c))|0)>>>0<=31){a=d=i+1|0,A=u>>>(d>>>0)&(e=i-31>>31)|c<<(s=31-i|0),e&=c>>>(d>>>0),i=0,s=u<>2]=0|A,n[o+4>>2]=l|0&e,o=0,0|(C(0|(f=0)),o)):(o=0,0|(C(0|(f=0)),o))}if((i=a-1|0)&a){a=s=33+(0|k(0|a))-(0|k(0|c))|0,A=(d=32-s|0)-1>>31&c>>>((g=s-32|0)>>>0)|(c<>>(s>>>0))&(e=g>>31),e&=c>>>(s>>>0),i=u<<(h=64-s|0)&(l=d>>31),s=(c<>>(g>>>0))&l|u<>31;break}return 0|o&&(n[o>>2]=i&u,n[o+4>>2]=0),1==(0|a)?(h=0|A,0|(C(0|(g=l|0&e)),h)):(g=c>>>((h=0|Ke(0|a))>>>0)|0,h=c<<32-h|u>>>(h>>>0),0|(C(0|g),h))}if(i)return 0|o&&(n[o>>2]=(c>>>0)%(a>>>0),n[o+4>>2]=0),h=(c>>>0)/(a>>>0)>>>0,0|(C(0|(g=0)),h);if(!u)return 0|o&&(n[o>>2]=0,n[o+4>>2]=(c>>>0)%(s>>>0)),h=(c>>>0)/(s>>>0)>>>0,0|(C(0|(g=0)),h);if(!((i=s-1|0)&s))return 0|o&&(n[o>>2]=0|A,n[o+4>>2]=i&c|0&e),g=0,h=c>>>((0|Ke(0|s))>>>0),0|(C(0|g),h);if((i=(0|k(0|s))-(0|k(0|c))|0)>>>0<=30){a=e=i+1|0,A=c<<(s=31-i|0)|u>>>(e>>>0),e=c>>>(e>>>0),i=0,s=u<>2]=0|A,n[o+4>>2]=l|0&e,h=0,0|(C(0|(g=0)),h)):(h=0,0|(C(0|(g=0)),h))}while(0);if(a){c=0|We(0|(d=0|t),0|(u=f|0&r),-1,-1),t=0|B(),l=s,s=0;do{r=l,l=i>>>31|l<<1,i=s|i<<1,Ze(0|c,0|t,0|(r=A<<1|r>>>31),0|(f=A>>>31|e<<1)),s=1&(g=(h=0|B())>>31|((0|h)<0?-1:0)<<1),A=0|Ze(0|r,0|f,g&d|0,(((0|h)<0?-1:0)>>31|((0|h)<0?-1:0)<<1)&u),e=0|B(),a=a-1|0}while(0|a);c=l,l=0}else c=s,l=0,s=0;return a=0,0|o&&(n[o>>2]=A,n[o+4>>2]=e),h=i<<1&-2|s,0|(C(0|(g=(0|i)>>>31|(c|a)<<1|l)),h)}function qe(A,e,t,r){var n,o,i,a,s;return t|=0,o=(r|=0)>>31|((0|r)<0?-1:0)<<1,n=((0|r)<0?-1:0)>>31|((0|r)<0?-1:0)<<1,i=0|Ze((s=(e|=0)>>31|((0|e)<0?-1:0)<<1)^(A|=0),(a=((0|e)<0?-1:0)>>31|((0|e)<0?-1:0)<<1)^e,0|s,0|a),A=o^s,e=n^a,0|Ze((0|Je(i,0|B(),0|Ze(o^t|0,n^r|0,0|o,0|n),0|B(),0))^A,(0|B())^e,0|A,0|e)}function Xe(A,e,t,r){var n,o;return e|=0,r|=0,t=0|function(A,e){var t,r,n,o=0;return A=((t=0|y(o=65535&(e|=0),n=65535&(A|=0)))>>>16)+(0|y(o,r=A>>>16))|0,e=0|y(o=e>>>16,n),0|(C((A>>>16)+(0|y(o,r))+(((65535&A)+e|0)>>>16)|0),A+e<<16|65535&t)}(n=A|=0,o=t|=0),A=0|B(),0|(C((0|y(e,o))+(0|y(r,n))+A|0&A),t)}function $e(A,e,t,r){var o,i,a,s,l,c;return t|=0,o=S,S=S+16|0,s=0|o,c=(r|=0)>>31|((0|r)<0?-1:0)<<1,l=((0|r)<0?-1:0)>>31|((0|r)<0?-1:0)<<1,Je(A=0|Ze((a=(e|=0)>>31|((0|e)<0?-1:0)<<1)^(A|=0),(i=((0|e)<0?-1:0)>>31|((0|e)<0?-1:0)<<1)^e,0|a,0|i),e=0|B(),0|Ze(c^t|0,l^r|0,0|c,0|l),0|B(),s),r=0|Ze(n[s>>2]^a|0,n[s+4>>2]^i|0,0|a,0|i),t=0|B(),S=o,0|(C(0|t),r)}function At(A,e,t,r){var o,i;return i=S,S=S+16|0,Je(A|=0,e|=0,t|=0,r|=0,o=0|i),S=i,0|(C(0|n[o+4>>2]),n[o>>2])}function et(A,e,t){return A|=0,e|=0,(0|(t|=0))<32?(C(e>>t|0),A>>>t|(e&(1<>t-32)}function tt(A,e,t){return A|=0,e|=0,(0|(t|=0))<32?(C(e>>>t|0),A>>>t|(e&(1<>>t-32|0)}function rt(A,e,t){return A|=0,(0|(t|=0))<32?(C((e|=0)<>>32-t),A<=0?+s(A+.5):+v(A-.5)}function st(A,e,t){A|=0,e|=0;var o,i,a=0;if((0|(t|=0))>=8192)return j(0|A,0|e,0|t),0|A;if(i=0|A,o=A+t|0,(3&A)==(3&e)){for(;3&A;){if(!t)return 0|i;r[0|A]=0|r[0|e],A=A+1|0,e=e+1|0,t=t-1|0}for(a=(t=-4&o)-64|0;(0|A)<=(0|a);)n[A>>2]=n[e>>2],n[A+4>>2]=n[e+4>>2],n[A+8>>2]=n[e+8>>2],n[A+12>>2]=n[e+12>>2],n[A+16>>2]=n[e+16>>2],n[A+20>>2]=n[e+20>>2],n[A+24>>2]=n[e+24>>2],n[A+28>>2]=n[e+28>>2],n[A+32>>2]=n[e+32>>2],n[A+36>>2]=n[e+36>>2],n[A+40>>2]=n[e+40>>2],n[A+44>>2]=n[e+44>>2],n[A+48>>2]=n[e+48>>2],n[A+52>>2]=n[e+52>>2],n[A+56>>2]=n[e+56>>2],n[A+60>>2]=n[e+60>>2],A=A+64|0,e=e+64|0;for(;(0|A)<(0|t);)n[A>>2]=n[e>>2],A=A+4|0,e=e+4|0}else for(t=o-4|0;(0|A)<(0|t);)r[0|A]=0|r[0|e],r[A+1|0]=0|r[e+1|0],r[A+2|0]=0|r[e+2|0],r[A+3|0]=0|r[e+3|0],A=A+4|0,e=e+4|0;for(;(0|A)<(0|o);)r[0|A]=0|r[0|e],A=A+1|0,e=e+1|0;return 0|i}function lt(A,e,t){e|=0;var o,i=0,a=0,s=0;if(o=(A|=0)+(t|=0)|0,e&=255,(0|t)>=67){for(;3&A;)r[0|A]=e,A=A+1|0;for(s=e|e<<8|e<<16|e<<24,a=(i=-4&o)-64|0;(0|A)<=(0|a);)n[A>>2]=s,n[A+4>>2]=s,n[A+8>>2]=s,n[A+12>>2]=s,n[A+16>>2]=s,n[A+20>>2]=s,n[A+24>>2]=s,n[A+28>>2]=s,n[A+32>>2]=s,n[A+36>>2]=s,n[A+40>>2]=s,n[A+44>>2]=s,n[A+48>>2]=s,n[A+52>>2]=s,n[A+56>>2]=s,n[A+60>>2]=s,A=A+64|0;for(;(0|A)<(0|i);)n[A>>2]=s,A=A+4|0}for(;(0|A)<(0|o);)r[0|A]=e,A=A+1|0;return o-t|0}function ct(A){return(A=+A)>=0?+s(A+.5):+v(A-.5)}function ut(A){var e,t,r;return A|=0,r=0|E(),(0|A)>0&(0|(e=(t=0|n[a>>2])+A|0))<(0|t)|(0|e)<0?(N(0|e),D(12),-1):(0|e)>(0|r)&&!(0|Q(0|e))?(D(12),-1):(n[a>>2]=e,0|t)}return{___divdi3:qe,___muldi3:Xe,___remdi3:$e,___uremdi3:At,_areNeighborCells:function(A,e,t,r,o){o|=0;var i,a,s,l=0,c=0,u=0,d=0;if(s=S,S=S+64|0,a=s,i=s+56|0,!(!0&134217728==(2013265920&(e|=0))&!0&134217728==(2013265920&(r|=0))))return S=s,5;if((0|(A|=0))==(0|(t|=0))&(0|e)==(0|r))return n[o>>2]=0,S=s,0;if(c=0|tt(0|A,0|e,52),B(),c&=15,d=0|tt(0|t,0|r,52),B(),(0|c)!=(15&d))return S=s,12;if(l=c+-1|0,c>>>0>1){IA(A,e,l,a),IA(t,r,l,i),u=0|n[(d=a)>>2],d=0|n[d+4>>2];A:do{if((0|u)==(0|n[i>>2])&&(0|d)==(0|n[i+4>>2])){l=0|tt(0|A,0|e,0|(c=3*(15^c)|0)),B(),l&=7,c=0|tt(0|t,0|r,0|c),B(),c&=7;do{if(!(0|l)|!(0|c))n[o>>2]=1,l=0;else if(7==(0|l))l=5;else{if(1==(0|l)|1==(0|c)&&0|zA(u,d)){l=5;break}if((0|n[15536+(l<<2)>>2])!=(0|c)&&(0|n[15568+(l<<2)>>2])!=(0|c))break A;n[o>>2]=1,l=0}}while(0);return S=s,0|l}}while(0)}c=(l=a)+56|0;do{n[l>>2]=0,l=l+4|0}while((0|l)<(0|c));return F(A,e,1,a),l=(0|n[(e=a)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+8|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+16|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+24|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+32|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+40|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)?1:1&((0|n[(l=a+48|0)>>2])==(0|t)?(0|n[l+4>>2])==(0|r):0),n[o>>2]=l,S=s,0},_bitshift64Ashr:et,_bitshift64Lshr:tt,_bitshift64Shl:rt,_calloc:Ve,_cellAreaKm2:function(A,e,t){return 0|(A=0|ue(A|=0,e|=0,t|=0))||(o[t>>3]=6371.007180918475*+o[t>>3]*6371.007180918475),0|A},_cellAreaM2:function(A,e,t){return 0|(A=0|ue(A|=0,e|=0,t|=0))||(o[t>>3]=6371.007180918475*+o[t>>3]*6371.007180918475*1e3*1e3),0|A},_cellAreaRads2:ue,_cellToBoundary:$A,_cellToCenterChild:GA,_cellToChildPos:function(A,e,t,r){t|=0,r|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0;if(o=S,S=S+16|0,p=o,v=0|tt(0|(A|=0),0|(e|=0),52),B(),t>>>0>15)return S=o,4;if((0|(v&=15))<(0|t))return S=o,12;if((0|v)!=(0|t))if(a=0|rt(0|t,0,52),a|=A,l=B()|-15728641&e,(0|v)>(0|t)){c=t;do{b=0|rt(7,0,3*(14-c|0)|0),c=c+1|0,a|=b,l=0|B()|l}while((0|c)<(0|v));b=a}else b=a;else b=A,l=e;m=0|tt(0|b,0|l,45),B();A:do{if(0|H(127&m)){if(c=0|tt(0|b,0|l,52),B(),0|(c&=15))for(a=1;;){if(!(!((m=0|rt(7,0,3*(15-a|0)|0))&b)&!((0|B())&l))){u=33;break A}if(!(a>>>0>>0))break;a=a+1|0}if(n[(m=r)>>2]=0,n[m+4>>2]=0,(0|v)>(0|t)){for(m=-15728641&e,h=v;;){if(g=h,(h=h+-1|0)>>>0>15|(0|v)<(0|h)){u=19;break}if((0|v)!=(0|h))if(a=0|rt(0|h,0,52),a|=A,c=0|B()|m,(0|v)<(0|g))f=a;else{u=h;do{f=0|rt(7,0,3*(14-u|0)|0),u=u+1|0,a|=f,c=0|B()|c}while((0|u)<(0|v));f=a}else f=A,c=e;if(d=0|tt(0|f,0|c,45),B(),0|H(127&d)){d=0|tt(0|f,0|c,52),B(),d&=15;e:do{if(d)for(u=1;;){if(a=0|tt(0|f,0|c,3*(15-u|0)|0),B(),0|(a&=7))break e;if(!(u>>>0>>0)){a=0;break}u=u+1|0}else a=0}while(0);a=1&!(0|a)}else a=0;if(c=0|tt(0|A,0|e,3*(15-g|0)|0),B(),7==(0|(c&=7))){i=5,u=42;break}if(1==(0|c)&(a=!!(0|a))){i=5,u=42;break}if(0|(f=c+((!!(0|c)&a)<<31>>31)|0)&&(u=0|pe(7,0,u=v-g|0,((0|u)<0)<<31>>31),d=0|B(),a?(a=0|We(0|(a=0|Xe(0|u,0|d,5,0)),0|B(),-5,-1),a=0|We(0|(a=0|qe(0|a,0|B(),6,0)),0|B(),1,0),c=0|B()):(a=u,c=d),g=0|We(0|a,0|c,0|(g=0|Xe(0|u,0|d,0|(g=f+-1|0),((0|g)<0)<<31>>31)),0|B()),d=0|We(0|g,0|(f=0|B()),0|n[(d=r)>>2],0|n[d+4>>2]),f=0|B(),n[(g=r)>>2]=d,n[g+4>>2]=f),(0|h)<=(0|t)){u=37;break}}if(19==(0|u))M(27795,27122,1367,27158);else{if(37==(0|u)){i=0|n[(s=r)+4>>2],s=0|n[s>>2];break}if(42==(0|u))return S=o,0|i}}else i=0,s=0}else u=33}while(0);A:do{if(33==(0|u)){if(n[(m=r)>>2]=0,n[m+4>>2]=0,(0|v)>(0|t)){for(a=v;;){if(i=0|tt(0|A,0|e,3*(15-a|0)|0),B(),7==(0|(i&=7))){i=5;break}if(i=0|Xe(0|(s=0|pe(7,0,s=v-a|0,((0|s)<0)<<31>>31)),0|B(),0|i,0),s=0|B(),s=0|We(0|n[(m=r)>>2],0|n[m+4>>2],0|i,0|s),i=0|B(),n[(m=r)>>2]=s,n[m+4>>2]=i,(0|(a=a+-1|0))<=(0|t))break A}return S=o,0|i}i=0,s=0}}while(0);return 0|_A(b,l,v,p)&&M(27795,27122,1327,27173),((0|i)>-1|-1==(0|i)&s>>>0>4294967295)&((0|(p=0|n[(v=p)+4>>2]))>(0|i)|((0|p)==(0|i)?(0|n[v>>2])>>>0>s>>>0:0))?(S=o,0|(v=0)):(M(27795,27122,1407,27158),0)},_cellToChildren:function(A,e,t,r){r|=0;var o,i,a=0,s=0;if(i=S,S=S+16|0,ee(o=i,A|=0,e|=0,t|=0),!(0|(A=0|n[(e=o)>>2]))&!(0|(e=0|n[e+4>>2])))return S=i,0;a=0,t=0;do{n[(s=r+(a<<3)|0)>>2]=A,n[s+4>>2]=e,a=0|We(0|a,0|t,1,0),t=0|B(),re(o),A=0|n[(s=o)>>2],e=0|n[s+4>>2]}while(!(!(0|A)&!(0|e)));return S=i,0},_cellToChildrenSize:_A,_cellToLatLng:XA,_cellToLocalIj:function(A,e,t,r,o,i){var a,s;return A|=0,i|=0,s=S,S=S+16|0,a=s,(o|=0)?A=15:(A=0|me(A,e|=0,t|=0,r|=0,a))||(function(A,e){var t;e|=0,t=0|n[8+(A|=0)>>2],n[e>>2]=(0|n[A>>2])-t,n[e+4>>2]=(0|n[A+4>>2])-t}(a,i),A=0),S=s,0|A},_cellToParent:IA,_cellToVertex:Pe,_cellToVertexes:function(A,e,t){t|=0;var r,o=0,i=0;return i=!(0|zA(A|=0,e|=0)),r=!(0|(o=0|Pe(A,e,0,t))),i?r?0|(o=0|Pe(A,e,1,t+8|0))||0|(o=0|Pe(A,e,2,t+16|0))||0|(o=0|Pe(A,e,3,t+24|0))||(o=0|Pe(A,e,4,t+32|0))?0|(i=o):0|Pe(A,e,5,t+40|0):0|(i=o):r?0|(o=0|Pe(A,e,1,t+8|0))||0|(o=0|Pe(A,e,2,t+16|0))||0|(o=0|Pe(A,e,3,t+24|0))||0|(o=0|Pe(A,e,4,t+32|0))?0|(i=o):(n[(i=t+40|0)>>2]=0,n[i+4>>2]=0,0|(i=0)):0|(i=o)},_cellsToDirectedEdge:function(A,e,t,r,o){return o|=0,7==(0|(t=0|_(A|=0,e|=0,t|=0,r|=0)))?0|(o=11):(r=0|rt(0|t,0,56),e=-2130706433&e|B()|268435456,n[o>>2]=A|r,n[o+4>>2]=e,0|(o=0))},_cellsToLinkedMultiPolygon:function(A,e,t){t|=0;var r,i,a,s=0;if(a=S,S=S+32|0,r=a,0|(A=0|function(A,e,t){A|=0,t|=0;var r,o,i=0,a=0,s=0,l=0,c=0,u=0;if(o=S,S=S+176|0,r=o,(0|(e|=0))<1)return Le(t,0,0),S=o,0;for(c=0|tt(0|n[(c=A)>>2],0|n[c+4>>2],52),B(),Le(t,(0|e)>6?e:6,15&c),c=0;!(0|(i=0|$A(0|n[(i=A+(c<<3)|0)>>2],0|n[i+4>>2],r)));){if((0|(i=0|n[r>>2]))>0){l=0;do{s=r+8+(l<<4)|0,(a=0|He(t,i=r+8+((0|(l=l+1|0))%(0|i)<<4)|0,s))?_e(t,a):ze(t,s,i),i=0|n[r>>2]}while((0|l)<(0|i))}if((0|(c=c+1|0))>=(0|e)){i=0,u=13;break}}return 13==(0|u)?(S=o,0|i):(Re(t),S=o,0|(u=i))}(A|=0,e|=0,i=a+16|0)))return S=a,0|A;if(n[t>>2]=0,n[t+4>>2]=0,n[t+8>>2]=0,0|(A=0|Ie(i)))do{e=0|de(t);do{fe(e,A),s=A+16|0,n[r>>2]=n[s>>2],n[r+4>>2]=n[s+4>>2],n[r+8>>2]=n[s+8>>2],n[r+12>>2]=n[s+12>>2],_e(i,A),A=0|Ge(i,r)}while(0|A);A=0|Ie(i)}while(0|A);return Re(i),(A=0|function(A){var e,t,r=0,i=0,a=0,s=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,B=0,D=0,E=0,j=0,Q=0,N=0,S=0,F=0,P=0,T=0,L=0;if(0|n[(s=(A|=0)+8|0)>>2])return 1;if(!(a=0|n[A>>2]))return 0;r=a,i=0;do{i=i+1|0,r=0|n[r+8>>2]}while(0|r);if(i>>>0<2)return 0;(t=0|Ue(i<<2))||M(27396,27235,317,27415),(e=0|Ue(i<<5))||M(27437,27235,321,27415),n[A>>2]=0,n[(E=A+4|0)>>2]=0,n[s>>2]=0,i=0,P=0,D=0,m=0;A:for(;;){if(h=0|n[a>>2]){c=0,u=h;do{if(f=+o[u+8>>3],r=u,u=0|n[u+16>>2],d=+o[(s=(g=!(0|u))?h:u)+8>>3],+l(+(f-d))>3.141592653589793){L=14;break}c+=(d-f)*(+o[r>>3]+ +o[s>>3])}while(!g);if(14==(0|L)){L=0,c=0,r=h;do{B=+o[r+8>>3],S=0|n[(F=r+16|0)>>2],C=+o[(S=0|S?S:h)+8>>3],c+=(+o[r>>3]+ +o[S>>3])*((C<0?C+6.283185307179586:C)-(B<0?B+6.283185307179586:B)),r=0|n[(0|r?F:a)>>2]}while(0|r)}c>0?(n[t+(P<<2)>>2]=a,P=P+1|0,s=D,r=m):L=19}else L=19;if(19==(0|L)){L=0;do{if(!i){if(m){s=E,u=m+8|0,r=a,i=A;break}if(0|n[A>>2]){L=27;break A}s=E,u=A,r=a,i=A;break}if(0|n[(r=i+8|0)>>2]){L=21;break A}if(!(i=0|Ve(1,12))){L=23;break A}n[r>>2]=i,s=i+4|0,u=i,r=m}while(0);if(n[u>>2]=a,n[s>>2]=a,u=e+(D<<5)|0,g=0|n[a>>2]){for(o[(h=e+(D<<5)+8|0)>>3]=17976931348623157e292,o[(m=e+(D<<5)+24|0)>>3]=17976931348623157e292,o[u>>3]=-17976931348623157e292,o[(b=e+(D<<5)+16|0)>>3]=-17976931348623157e292,x=17976931348623157e292,k=-17976931348623157e292,s=0,p=g,f=17976931348623157e292,y=17976931348623157e292,w=-17976931348623157e292,d=-17976931348623157e292;c=+o[p>>3],B=+o[p+8>>3],p=0|n[p+16>>2],C=+o[((v=!(0|p))?g:p)+8>>3],c>3]=c,f=c),B>3]=B,y=B),c>w?o[u>>3]=c:c=w,B>d&&(o[b>>3]=B,d=B),x=B>0&Bk?B:k,s|=+l(+(B-C))>3.141592653589793,!v;)w=c;s&&(o[b>>3]=k,o[m>>3]=x)}else n[u>>2]=0,n[u+4>>2]=0,n[u+8>>2]=0,n[u+12>>2]=0,n[u+16>>2]=0,n[u+20>>2]=0,n[u+24>>2]=0,n[u+28>>2]=0;s=D+1|0}if(a=0|n[(F=a+8|0)>>2],n[F>>2]=0,!a){L=45;break}D=s,m=r}if(21==(0|L))M(27213,27235,35,27247);else if(23==(0|L))M(27267,27235,37,27247);else if(27==(0|L))M(27310,27235,61,27333);else if(45==(0|L)){A:do{if((0|P)>0){for(F=!(0|s),N=s<<2,S=!(0|A),Q=0,r=0;;){if(j=0|n[t+(Q<<2)>>2],F)L=73;else{if(!(D=0|Ue(N))){L=50;break}if(!(E=0|Ue(N))){L=52;break}e:do{if(S)i=0;else{for(s=0,i=0,u=A;a=e+(s<<5)|0,0|he(0|n[u>>2],a,0|n[j>>2])?(n[D+(i<<2)>>2]=u,n[E+(i<<2)>>2]=a,v=i+1|0):v=i,u=0|n[u+8>>2];)s=s+1|0,i=v;if((0|v)>0)if(a=0|n[D>>2],1==(0|v))i=a;else for(b=0,p=-1,i=a,m=a;;){for(g=0|n[m>>2],a=0,u=0;h=(0|(s=0|n[n[D+(u<<2)>>2]>>2]))==(0|g)?a:a+(1&he(s,0|n[E+(u<<2)>>2],0|n[g>>2]))|0,(0|(u=u+1|0))!=(0|v);)a=h;if(i=(s=(0|h)>(0|p))?m:i,(0|(a=b+1|0))==(0|v))break e;b=a,p=s?h:p,m=0|n[D+(a<<2)>>2]}else i=0}}while(0);if(Ye(D),Ye(E),i){if(a=0|n[(s=i+4|0)>>2])i=a+8|0;else if(0|n[i>>2]){L=70;break}n[i>>2]=j,n[s>>2]=j}else L=73}if(73==(0|L)){if(L=0,0|(r=0|n[j>>2]))do{E=r,r=0|n[r+16>>2],Ye(E)}while(0|r);Ye(j),r=1}if((0|(Q=Q+1|0))>=(0|P)){T=r;break A}}50==(0|L)?M(27452,27235,249,27471):52==(0|L)?M(27490,27235,252,27471):70==(0|L)&&M(27310,27235,61,27333)}else T=0}while(0);return Ye(t),Ye(e),0|T}return 0}(t))?(ge(t),S=a,0|(s=A)):(S=a,0|(s=0))},_childPosToCell:function(A,e,t,r,o,i){A|=0,e|=0,i|=0;var a,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0;if(a=S,S=S+16|0,s=a,(o|=0)>>>0>15)return S=a,4;if(l=0|tt(0|(t|=0),0|(r|=0),52),B(),(0|(l&=15))>(0|o))return S=a,12;if(0|_A(t,r,o,s)&&M(27795,27122,1327,27173),!(((0|e)>-1|-1==(0|e)&A>>>0>4294967295)&((0|(u=0|n[(d=s)+4>>2]))>(0|e)|((0|u)==(0|e)?(0|n[d>>2])>>>0>A>>>0:0))))return S=a,2;d=o-l|0,o=0|rt(0|o,0,52),c=B()|-15728641&r,n[(u=i)>>2]=o|t,n[u+4>>2]=c,u=0|tt(0|t,0|r,45),B();A:do{if(0|H(127&u)){if(0|l)for(s=1;;){if(!(!((u=0|rt(7,0,3*(15-s|0)|0))&t)&!((0|B())&r)))break A;if(!(s>>>0>>0))break;s=s+1|0}if((0|d)<1)return S=a,0;for(u=15^l,r=-1,c=1,s=1;;){l=0|pe(7,0,l=d-c|0,((0|l)<0)<<31>>31),t=0|B();do{if(s){if(s=0|qe(0|(s=0|We(0|(s=0|Xe(0|l,0|t,5,0)),0|B(),-5,-1)),0|B(),6,0),(0|e)>(0|(o=0|B()))|(0|e)==(0|o)&A>>>0>s>>>0){e=0|Ze(0|(e=0|We(0|A,0|e,-1,-1)),0|B(),0|s,0|o),s=0|B(),h=0|n[(f=i)>>2],f=0|n[f+4>>2],g=0|rt(7,0,0|(m=3*(u+r|0)|0)),f&=~B(),m=0|rt(0|(o=0|We(0|(r=0|qe(0|e,0|s,0|l,0|t)),0|(A=0|B()),2,0)),0|B(),0|m),f=0|B()|f,n[(o=i)>>2]=m|h&~g,n[o+4>>2]=f,A=0|Ze(0|e,0|s,0|(A=0|Xe(0|r,0|A,0|l,0|t)),0|B()),s=0,e=0|B();break}g=0|n[(m=i)>>2],m=0|n[m+4>>2],h=0|rt(7,0,3*(u+r|0)|0),m&=~B(),n[(s=i)>>2]=g&~h,n[s+4>>2]=m,s=1;break}o=0|n[(g=i)>>2],g=0|n[g+4>>2],f=0|rt(7,0,0|(r=3*(u+r|0)|0)),g&=~B(),r=0|rt(0|(m=0|qe(0|A,0|e,0|l,0|t)),0|(s=0|B()),0|r),g=0|B()|g,n[(h=i)>>2]=r|o&~f,n[h+4>>2]=g,A=0|Ze(0|A,0|e,0|(s=0|Xe(0|m,0|s,0|l,0|t)),0|B()),s=0,e=0|B()}while(0);if(!((0|d)>(0|c))){e=0;break}r=~c,c=c+1|0}return S=a,0|e}}while(0);if((0|d)<1)return S=a,0;for(o=15^l,s=1;;){if(h=0|pe(7,0,h=d-s|0,((0|h)<0)<<31>>31),m=0|B(),t=0|n[(c=i)>>2],c=0|n[c+4>>2],r=0|rt(7,0,0|(l=3*(o-s|0)|0)),c&=~B(),l=0|rt(0|(f=0|qe(0|A,0|e,0|h,0|m)),0|(g=0|B()),0|l),c=0|B()|c,n[(u=i)>>2]=l|t&~r,n[u+4>>2]=c,A=0|Ze(0|A,0|e,0|(m=0|Xe(0|f,0|g,0|h,0|m)),0|B()),e=0|B(),(0|d)<=(0|s)){e=0;break}s=s+1|0}return S=a,0|e},_compactCells:function(A,e,t,r){e|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,D=0,E=0,j=0,Q=0,N=0,S=0;if(!(0|(t|=0))&!(0|(r|=0)))return 0;if(a=0|n[(i=A|=0)>>2],!0&!(15728640&(i=0|n[i+4>>2]))){if(!((0|r)>0|!(0|r)&t>>>0>0))return 0;if(n[(S=e)>>2]=a,n[S+4>>2]=i,1==(0|t)&!(0|r))return 0;i=1,a=0;do{N=0|n[4+(Q=A+(i<<3)|0)>>2],n[(S=e+(i<<3)|0)>>2]=n[Q>>2],n[S+4>>2]=N,i=0|We(0|i,0|a,1,0),a=0|B()}while((0|a)<(0|r)|(0|a)==(0|r)&i>>>0>>0);return 0}if(!(N=0|Ue(o=t<<3)))return 13;if(st(0|N,0|A,0|o),!(Q=0|Ve(t,8)))return Ye(N),13;A:for(;;){E=0|tt(0|(u=0|n[(i=N)>>2]),0|(i=0|n[i+4>>2]),52),B(),j=(E&=15)-1|0,D=!!(0|E),C=(0|r)>0|!(0|r)&t>>>0>0;e:do{if(D&C){if(y=0|rt(0|j,0,52),w=0|B(),j>>>0>15){if(!(!(0|u)&!(0|i))){S=16;break A}for(a=0,A=0;;){if(a=0|We(0|a,0|A,1,0),!((0|(A=0|B()))<(0|r)|(0|A)==(0|r)&a>>>0>>0))break e;if(!(!(0|(k=0|n[(s=N+(a<<3)|0)>>2]))&!(0|(s=0|n[s+4>>2])))){i=s,S=16;break A}}}for(l=u,A=i,a=0,s=0;;){if(!(!(0|l)&!(0|A))){if(!(!0&!(117440512&A))){S=21;break A}if(d=0|tt(0|l,0|A,52),B(),(0|(d&=15))<(0|j)){i=12,S=27;break A}if((0|d)!=(0|j)&&(l|=y,A=-15728641&A|w,d>>>0>=E>>>0)){c=j;do{k=0|rt(7,0,3*(14-c|0)|0),c=c+1|0,l|=k,A=0|B()|A}while(c>>>0>>0)}if(g=0|At(0|l,0|A,0|t,0|r),h=0|B(),!(!(0|(f=0|n[(d=c=Q+(g<<3)|0)>>2]))&!(0|(d=0|n[d+4>>2])))){p=0,v=0;do{if((0|p)>(0|r)|(0|p)==(0|r)&v>>>0>t>>>0){S=31;break A}if((0|f)==(0|l)&(-117440513&d)==(0|A)){m=0|tt(0|f,0|d,56),B(),b=1+(m&=7)|0,k=0|tt(0|f,0|d,45),B();t:do{if(0|H(127&k)){if(f=0|tt(0|f,0|d,52),B(),!(f&=15)){d=6;break}for(d=1;;){if(!(!((k=0|rt(7,0,3*(15-d|0)|0))&l)&!((0|B())&A))){d=7;break t}if(!(d>>>0>>0)){d=6;break}d=d+1|0}}else d=7}while(0);if((m+2|0)>>>0>d>>>0){S=41;break A}k=0|rt(0|b,0,56),A=B()|-117440513&A,n[(x=c)>>2]=0,n[x+4>>2]=0,l|=k}else g=0|$e(0|(g=0|We(0|g,0|h,1,0)),0|B(),0|t,0|r),h=0|B();v=0|We(0|v,0|p,1,0),p=0|B(),f=0|n[(d=c=Q+(g<<3)|0)>>2],d=0|n[d+4>>2]}while(!(!(0|f)&!(0|d)))}n[(k=c)>>2]=l,n[k+4>>2]=A}if(a=0|We(0|a,0|s,1,0),!((0|(s=0|B()))<(0|r)|(0|s)==(0|r)&a>>>0>>0))break e;l=0|n[(A=N+(a<<3)|0)>>2],A=0|n[A+4>>2]}}}while(0);if(k=0|We(0|t,0|r,5,0),(x=0|B())>>>0<0|!(0|x)&k>>>0<11){S=85;break}if(k=0|qe(0|t,0|r,6,0),B(),!(k=0|Ve(k,8))){S=48;break}do{if(C){for(b=0,A=0,m=0,p=0;;){if(!(0|(a=0|n[(s=d=Q+(b<<3)|0)>>2]))&!(0|(s=0|n[s+4>>2])))x=m;else{f=0|tt(0|a,0|s,56),B(),l=1+(f&=7)|0,g=-117440513&s,x=0|tt(0|a,0|s,45),B();e:do{if(0|H(127&x)){if(h=0|tt(0|a,0|s,52),B(),0|(h&=15))for(c=1;;){if(!(!(a&(x=0|rt(7,0,3*(15-c|0)|0)))&!(g&(0|B()))))break e;if(!(c>>>0>>0))break;c=c+1|0}a|=s=0|rt(0|l,0,56),s=0|B()|g,n[(l=d)>>2]=a,n[l+4>>2]=s,l=f+2|0}}while(0);7==(0|l)?(n[(x=k+(A<<3)|0)>>2]=a,n[x+4>>2]=-117440513&s,A=0|We(0|A,0|m,1,0),x=0|B()):x=m}if(b=0|We(0|b,0|p,1,0),!((0|(p=0|B()))<(0|r)|(0|p)==(0|r)&b>>>0>>0))break;m=x}if(C){if(v=j>>>0>15,y=0|rt(0|j,0,52),w=0|B(),!D){for(a=0,c=0,l=0,s=0;!(0|u)&!(0|i)||(n[(j=e+(a<<3)|0)>>2]=u,n[j+4>>2]=i,a=0|We(0|a,0|c,1,0),c=0|B()),l=0|We(0|l,0|s,1,0),(0|(s=0|B()))<(0|r)|(0|s)==(0|r)&l>>>0>>0;)u=0|n[(i=N+(l<<3)|0)>>2],i=0|n[i+4>>2];i=x;break}for(a=0,c=0,s=0,l=0;;){do{if(!(!(0|u)&!(0|i))){if(h=0|tt(0|u,0|i,52),B(),v|(0|(h&=15))<(0|j)){S=80;break A}if((0|h)!=(0|j)){if(d=u|y,f=-15728641&i|w,h>>>0>=E>>>0){g=j;do{D=0|rt(7,0,3*(14-g|0)|0),g=g+1|0,d|=D,f=0|B()|f}while(g>>>0>>0)}}else d=u,f=i;m=0|At(0|d,0|f,0|t,0|r),g=0,h=0,p=0|B();do{if((0|g)>(0|r)|(0|g)==(0|r)&h>>>0>t>>>0){S=81;break A}if((-117440513&(b=0|n[4+(D=Q+(m<<3)|0)>>2]))==(0|f)&&(0|n[D>>2])==(0|d)){S=65;break}m=0|$e(0|(D=0|We(0|m,0|p,1,0)),0|B(),0|t,0|r),p=0|B(),h=0|We(0|h,0|g,1,0),g=0|B(),D=Q+(m<<3)|0}while((0|n[D>>2])!=(0|d)||(0|n[D+4>>2])!=(0|f));if(65==(0|S)&&(S=0,!0&100663296==(117440512&b)))break;n[(D=e+(a<<3)|0)>>2]=u,n[D+4>>2]=i,a=0|We(0|a,0|c,1,0),c=0|B()}}while(0);if(s=0|We(0|s,0|l,1,0),!((0|(l=0|B()))<(0|r)|(0|l)==(0|r)&s>>>0>>0))break;u=0|n[(i=N+(s<<3)|0)>>2],i=0|n[i+4>>2]}i=x}else a=0,i=x}else a=0,A=0,i=0}while(0);if(lt(0|Q,0,0|o),st(0|N,0|k,A<<3),Ye(k),!(0|A)&!(0|i)){S=89;break}e=e+(a<<3)|0,r=i,t=A}if(16==(0|S))!0&!(117440512&i)?(i=4,S=27):S=21;else if(31==(0|S))M(27795,27122,620,27132);else{if(41==(0|S))return Ye(N),Ye(Q),10;if(48==(0|S))return Ye(N),Ye(Q),13;80==(0|S)?M(27795,27122,711,27132):81==(0|S)?M(27795,27122,723,27132):85==(0|S)&&(st(0|e,0|N,t<<3),S=89)}return 21==(0|S)?(Ye(N),Ye(Q),0|(S=5)):27==(0|S)?(Ye(N),Ye(Q),0|(S=i)):89==(0|S)?(Ye(N),Ye(Q),0|(S=0)):0},_constructCell:function(A,e,t,o){t|=0,o|=0;var i=0,a=0,s=0,l=0,c=0,u=0;if((A|=0)>>>0>15)return 4;if((e|=0)>>>0>121)return 17;s=0|rt(0|A,0,52),i=0|B(),l=0|rt(0|e,0,45),i=0|i|B()|134225919;A:do{if((0|A)>=1){for(l=1,s=!!(0|r[20528+e|0]),a=-1;;){if((e=0|n[t+(l+-1<<2)>>2])>>>0>6){i=18,e=10;break}if(!(!(0|e)|1^s)){if(1==(0|e)){i=19,e=10;break}s=0}if(c=0|rt(7,0,0|(u=3*(15-l|0)|0)),i&=~B(),a=(e=0|rt(0|e,((0|e)<0)<<31>>31,0|u))|a&~c,i=0|B()|i,!((0|l)<(0|A)))break A;l=l+1|0}if(10==(0|e))return 0|i}else a=-1}while(0);return n[(u=o)>>2]=a,n[u+4>>2]=i,0},_destroyLinkedMultiPolygon:ge,_directedEdgeToBoundary:DA,_directedEdgeToCells:function(A,e,t){A|=0;var r,o,i,a=0;return r=S,S=S+16|0,a=r,!0&268435456==(2013265920&(e|=0))?(o=-2130706433&e|134217728,n[(i=t|=0)>>2]=A,n[i+4>>2]=o,n[a>>2]=0,e=0|tt(0|A,0|e,56),B(),a=0|R(A,o,7&e,a,t+8|0),S=r,0|a):(S=r,0|(a=6))},_edgeLengthKm:function(A,e,t){t|=0;var r,i=0,a=0,s=0,l=0,u=0,g=0,h=0;if(r=S,S=S+176|0,0|(A=0|DA(A|=0,e|=0,l=r)))return l=A,s=+o[t>>3],s*=6371.007180918475,o[t>>3]=s,S=r,0|l;if(o[t>>3]=0,(0|(A=0|n[l>>2]))<=1)return l=0,s=0,s*=6371.007180918475,o[t>>3]=s,S=r,0|l;e=A+-1|0,A=0,i=+o[l+8>>3],a=+o[l+16>>3],s=0;do{g=i,i=+o[l+8+((A=A+1|0)<<4)>>3],h=+f(.5*(i-g)),u=a,a=+o[l+8+(A<<4)+8>>3],u=h*h+(u=+f(.5*(a-u)))*(+d(+g)*+d(+i)*u),s+=2*+p(+ +c(+u),+ +c(+(1-u)))}while((0|A)!=(0|e));return o[t>>3]=s,l=0,h=s,h*=6371.007180918475,o[t>>3]=h,S=r,0|l},_edgeLengthM:function(A,e,t){t|=0;var r,i=0,a=0,s=0,l=0,u=0,g=0,h=0;if(r=S,S=S+176|0,0|(A=0|DA(A|=0,e|=0,l=r)))return l=A,s=+o[t>>3],s*=6371.007180918475,s*=1e3,o[t>>3]=s,S=r,0|l;if(o[t>>3]=0,(0|(A=0|n[l>>2]))<=1)return l=0,s=0,s*=6371.007180918475,s*=1e3,o[t>>3]=s,S=r,0|l;e=A+-1|0,A=0,i=+o[l+8>>3],a=+o[l+16>>3],s=0;do{g=i,i=+o[l+8+((A=A+1|0)<<4)>>3],h=+f(.5*(i-g)),u=a,a=+o[l+8+(A<<4)+8>>3],u=h*h+(u=+f(.5*(a-u)))*(+d(+g)*+d(+i)*u),s+=2*+p(+ +c(+u),+ +c(+(1-u)))}while((0|A)!=(0|e));return o[t>>3]=s,l=0,h=s,h*=6371.007180918475,h*=1e3,o[t>>3]=h,S=r,0|l},_edgeLengthRads:function(A,e,t){t|=0;var r,i=0,a=0,s=0,l=0,u=0,g=0,h=0;if(r=S,S=S+176|0,0|(A=0|DA(A|=0,e|=0,l=r)))return S=r,0|A;if(o[t>>3]=0,(0|(A=0|n[l>>2]))<=1)return S=r,0;e=A+-1|0,A=0,i=+o[l+8>>3],a=+o[l+16>>3],s=0;do{g=i,i=+o[l+8+((A=A+1|0)<<4)>>3],h=+f(.5*(i-g)),u=a,a=+o[l+8+(A<<4)+8>>3],u=h*h+(u=+f(.5*(a-u)))*(+d(+i)*+d(+g)*u),s+=2*+p(+ +c(+u),+ +c(+(1-u)))}while((0|A)<(0|e));return o[t>>3]=s,S=r,0},_emscripten_replace_memory:function(A){return r=new Int8Array(A),n=new Int32Array(A),o=new Float64Array(A),t=A,!0},_free:Ye,_getBaseCellNumber:TA,_getDirectedEdgeDestination:function(A,e,t){A|=0,e|=0,t|=0;var r,o,i=0;return r=S,S=S+16|0,n[(i=r)>>2]=0,!0&268435456==(2013265920&e)?(o=0|tt(0|A,0|e,56),B(),i=0|R(A,-2130706433&e|134217728,7&o,i,t),S=r,0|i):(S=r,0|(i=6))},_getDirectedEdgeOrigin:function(A,e,t){return A|=0,t|=0,!0&268435456==(2013265920&(e|=0))?(n[t>>2]=A,n[t+4>>2]=-2130706433&e|134217728,0|(t=0)):0|(t=6)},_getHexagonAreaAvgKm2:se,_getHexagonAreaAvgM2:function(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[20784+(A<<3)>>3],0|(e=0))},_getHexagonEdgeLengthAvgKm:function(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[20912+(A<<3)>>3],0|(e=0))},_getHexagonEdgeLengthAvgM:function(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[21040+(A<<3)>>3],0|(e=0))},_getIcosahedronFaces:function A(e,t,r){r|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0;o=S,S=S+128|0,d=o+112|0,s=o+96|0,f=o,a=0|tt(0|(e|=0),0|(t|=0),52),B(),c=15&a,n[d>>2]=c,l=0|tt(0|e,0|t,45),B(),l&=127;A:do{if(0|H(l)){if(0|c)for(i=1;;){if(!(!((u=0|rt(7,0,3*(15-i|0)|0))&e)&!((0|B())&t))){a=0;break A}if(!(i>>>0>>0))break;i=i+1|0}if(!(1&a))return u=0|rt(c+1|0,0,52),f=B()|-15728641&t,f=0|A((u|e)&~(d=0|rt(7,0,3*(14-c|0)|0)),f&~B(),r),S=o,0|f;a=1}else a=0}while(0);if(!(i=0|qA(e,t,s))){a?(QA(s,d,f),u=5):(PA(s,d,f),u=6);A:do{if(0|H(l))if(c)for(i=1;;){if(!(!((l=0|rt(7,0,3*(15-i|0)|0))&e)&!((0|B())&t))){e=2;break A}if(!(i>>>0>>0)){e=5;break}i=i+1|0}else e=5;else e=2}while(0);lt(0|r,-1,e<<2);A:do{if(a)for(s=0;;){if(SA(l=f+(s<<4)|0,0|n[d>>2]),l=0|n[l>>2],-1==(0|(c=0|n[r>>2]))|(0|c)==(0|l))i=r;else{a=0;do{if((a=a+1|0)>>>0>=e>>>0){i=1;break A}c=0|n[(i=r+(a<<2)|0)>>2]}while(!(-1==(0|c)|(0|c)==(0|l)))}if(n[i>>2]=l,(s=s+1|0)>>>0>=u>>>0){i=0;break}}else for(s=0;;){if(NA(l=f+(s<<4)|0,0|n[d>>2],0,1),l=0|n[l>>2],-1==(0|(c=0|n[r>>2]))|(0|c)==(0|l))i=r;else{a=0;do{if((a=a+1|0)>>>0>=e>>>0){i=1;break A}c=0|n[(i=r+(a<<2)|0)>>2]}while(!(-1==(0|c)|(0|c)==(0|l)))}if(n[i>>2]=l,(s=s+1|0)>>>0>=u>>>0){i=0;break}}}while(0)}return S=o,0|i},_getIndexDigit:function(A,e,t,r){return r|=0,((t|=0)-1|0)>>>0>14?0|(r=4):(t=0|tt(0|(A|=0),0|(e|=0),3*(15-t|0)|0),B(),n[r>>2]=7&t,0|(r=0))},_getNumCells:le,_getPentagons:Ae,_getRes0Cells:function(A){A|=0;var e=0,t=0,r=0;e=0;do{rt(0|e,0,45),r=134225919|B(),n[(t=A+(e<<3)|0)>>2]=-1,n[t+4>>2]=r,e=e+1|0}while(122!=(0|e));return 0},_getResolution:function(A,e){return e=0|tt(0|(A|=0),0|(e|=0),52),B(),15&e},_greatCircleDistanceKm:ae,_greatCircleDistanceM:function(A,e){A|=0;var t,r,n,i=0;return r=+o[(e|=0)>>3],t=+o[A>>3],i=(n=+f(.5*(r-t)))*n+(i=+f(.5*(+o[e+8>>3]-+o[A+8>>3])))*(+d(+r)*+d(+t)*i),2*+p(+ +c(+i),+ +c(+(1-i)))*6371.007180918475*1e3},_greatCircleDistanceRads:function(A,e){A|=0;var t,r,n,i=0;return r=+o[(e|=0)>>3],t=+o[A>>3],i=(n=+f(.5*(r-t)))*n+(i=+f(.5*(+o[e+8>>3]-+o[A+8>>3])))*(+d(+r)*+d(+t)*i),2*+p(+ +c(+i),+ +c(+(1-i)))},_gridDisk:F,_gridDiskDistances:P,_gridDistance:function(A,e,t,r,o){t|=0,r|=0,o|=0;var i,a,s=0,l=0;return a=S,S=S+32|0,l=a,0|(i=0|me(A|=0,e|=0,A,e,s=a+12|0))?(S=a,0|(l=i)):0|(A=0|me(A,e,t,r,l))?(S=a,0|(l=A)):(s=0|kA(s,l),n[(l=o)>>2]=s,n[l+4>>2]=((0|s)<0)<<31>>31,S=a,0|(l=0))},_gridPathCells:function(A,e,t,r,o){t|=0,r|=0,o|=0;var i,a,s=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,D=0,E=0;if(a=S,S=S+48|0,c=a+12|0,D=a,!(s=0|me(A|=0,e|=0,A,e,i=a+24|0))&&!(s=0|me(A,e,t,r,c))){C=((0|(k=0|kA(i,c)))<0)<<31>>31,n[i>>2]=0,n[i+4>>2]=0,n[i+8>>2]=0,n[c>>2]=0,n[c+4>>2]=0,n[c+8>>2]=0,0|me(A,e,A,e,i)&&M(27795,27538,692,27747),0|me(A,e,t,r,c)&&M(27795,27538,697,27747),CA(i),CA(c),g=0|k?1/+(0|k):0,t=0|n[i>>2],v=g*+((0|n[c>>2])-t|0),r=0|n[(y=i+4|0)>>2],w=g*+((0|n[c+4>>2])-r|0),s=0|n[(x=i+8|0)>>2],g*=+((0|n[c+8>>2])-s|0),n[D>>2]=t,n[(h=D+4|0)>>2]=r,n[(m=D+8|0)>>2]=s;A:do{if((0|k)<0)s=0;else for(b=0,p=0;;){E=v*(d=+(p>>>0)+4294967296*+(0|b))+ +(0|t),u=w*d+ +(0|r),d=g*d+ +(0|s),t=~~+at(+E),c=~~+at(+u),s=~~+at(+d),E=+l(+(+(0|t)-E)),u=+l(+(+(0|c)-u)),d=+l(+(+(0|s)-d));do{if(!(E>u&E>d)){if(f=0-t|0,u>d){r=f-s|0;break}r=c,s=f-c|0;break}t=0-(c+s)|0,r=c}while(0);if(n[D>>2]=t,n[h>>2]=r,n[m>>2]=s,BA(D),0|(s=0|be(A,e,D,o+(p<<3)|0)))break A;if(!((0|b)<(0|C)|(0|b)==(0|C)&p>>>0>>0)){s=0;break A}t=0|We(0|p,0|b,1,0),b=r=0|B(),p=t,t=0|n[i>>2],r=0|n[y>>2],s=0|n[x>>2]}}while(0);return S=a,0|s}return S=a,0|s},_gridPathCellsSize:function(A,e,t,r,o){t|=0,r|=0,o|=0;var i,a=0,s=0,l=0;return i=S,S=S+32|0,l=i,(a=0|me(A|=0,e|=0,A,e,s=i+12|0))||(a=0|me(A,e,t,r,l))?(S=i,0|(l=a)):(r=0|We(0|(r=0|kA(s,l)),((0|r)<0)<<31>>31,1,0),s=0|B(),n[(l=o)>>2]=r,n[l+4>>2]=s,S=i,0|(l=0))},_gridRing:function(A,e,t,r){return 0|I(A|=0,e|=0,t|=0,r|=0)?(lt(0|r,0,48*t|0),0|(r=0|function(A,e,t,r){A|=0,e|=0,r|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0;if(o=S,S=S+16|0,s=o,!(t|=0))return n[r>>2]=A,n[r+4>>2]=e,S=o,0;do{if((0|t)>=0){if((0|t)>13780509){if(0|(i=0|le(15,s)))break;i=0|n[(a=s)>>2],a=0|n[a+4>>2]}else d=0|Xe(0|t,0|(i=((0|t)<0)<<31>>31),3,0),a=0|B(),i=0|We(0|t,0|i,1,0),i=0|We(0|(i=0|Xe(0|d,0|a,0|i,0|B())),0|B(),1,0),a=0|B(),n[(d=s)>>2]=i,n[d+4>>2]=a;if(u=0|Ve(i,8)){if(!(d=0|Ve(i,4))){Ye(u),i=13;break}if(0|(i=0|L(A,e,t,u,d,i,a,0))){Ye(u),Ye(d);break}if(e=0|n[s>>2],(0|(s=0|n[s+4>>2]))>0|!(0|s)&e>>>0>0){i=0,l=0,c=0;do{!(0|(a=0|n[(A=u+(l<<3)|0)>>2]))&!(0|(A=0|n[A+4>>2]))||(0|n[d+(l<<2)>>2])!=(0|t)||(n[(f=r+(i<<3)|0)>>2]=a,n[f+4>>2]=A,i=i+1|0),l=0|We(0|l,0|c,1,0),c=0|B()}while((0|c)<(0|s)|(0|c)==(0|s)&l>>>0>>0)}Ye(u),Ye(d),i=0}else i=13}else i=2}while(0);return S=o,0|i}(A,e,t,r))):0|(r=0)},_gridRingUnsafe:I,_i64Add:We,_i64Subtract:Ze,_isPentagon:zA,_isResClassIII:function(A,e){return e=0|tt(0|(A|=0),0|(e|=0),52),B(),1&e},_isValidCell:LA,_isValidDirectedEdge:MA,_isValidIndex:function(A,e){A|=0;var t=0,n=0,o=0,i=0;if(!0&134217728==(-16777216&(e|=0))&&(n=0|tt(0|A,0|e,52),B(),n&=15,t=0|tt(0|A,0|e,45),B(),(t&=127)>>>0<=121)&&!(613566756&(i=0|rt(0|(o=0|tt(0|A,0|e,0|(i=3*(15^n)|0))),0|B(),0|i))&Ze(-1227133514,-1171,0|i,0|(o=0|B())))&!(4681&o&B())&&15==(0|n)|!(0|(i=0|tt(0|rt(0|~A,0|~e,0|(i=19+(3*n|0)|0)),0|B(),0|i)))&!(0|B())){if(!(0|r[20528+t|0]))return 1;if(!(0|A)&!(0|(t=8191&e)))return 1;if(i=0|nt(0|A,0|t),B(),(63-i|0)%3|0)return 1}return 0|MA(A,e)?0|(i=1):0|(i=1&!!(0|Te(A,e)))},_isValidVertex:Te,_latLngToCell:KA,_llvm_ctlz_i64:nt,_llvm_maxnum_f64:ot,_llvm_minnum_f64:it,_llvm_round_f64:at,_localIjToCell:function(A,e,t,r,o){var i,a;return A|=0,e|=0,t|=0,o|=0,a=S,S=S+16|0,i=a,(r|=0)?t=15:(t=0|function(A,e){e|=0;var t,r,o,i=0,a=0,s=0;if(a=0|n[(A|=0)>>2],n[e>>2]=a,s=0|n[A+4>>2],n[(r=e+4|0)>>2]=s,n[(o=e+8|0)>>2]=0,A=(i=(0|s)<(0|a))?a:s,(0|(i=i?s:a))<0){if(-2147483648==(0|i)||((0|A)>0?(2147483647-A|0)<(0|i):(-2147483648-A|0)>(0|i)))return 1;if((0|A)>-1?(-2147483648|A)>=(0|i):(-2147483648^A)<(0|i))return 1}return A=s-a|0,(0|a)<0?(i=0-a|0,n[r>>2]=A,n[o>>2]=i,n[e>>2]=0,a=0):(A=s,i=0),(0|A)<0&&(a=a-A|0,n[e>>2]=a,i=i-A|0,n[o>>2]=i,n[r>>2]=0,A=0),t=a-i|0,s=A-i|0,(0|i)<0?(n[e>>2]=t,n[r>>2]=s,n[o>>2]=0,A=s,s=t,i=0):s=a,(0|(a=(0|i)<(0|(a=(0|A)<(0|s)?A:s))?i:a))<=0||(n[e>>2]=s-a,n[r>>2]=A-a,n[o>>2]=i-a),0}(t,i))||(t=0|be(A,e,i,o)),S=a,0|t},_malloc:Ue,_maxFaceCount:function(A,e,t){t|=0;var r=0,o=0;if(o=0|tt(0|(A|=0),0|(e|=0),45),B(),!(0|H(127&o)))return o=2,n[t>>2]=o,0;if(o=0|tt(0|A,0|e,52),B(),!(o&=15))return o=5,n[t>>2]=o,0;for(r=1;;){if(!(!((0|rt(7,0,3*(15-r|0)|0))&A)&!((0|B())&e))){r=2,A=6;break}if(!(r>>>0>>0)){r=5,A=6;break}r=r+1|0}return 6==(0|A)?(n[t>>2]=r,0):0},_maxGridDiskSize:function(A,e){e|=0;var t=0,r=0,o=0;return(0|(A|=0))<0?0|(e=2):(0|A)>13780509?0|(e=0|le(15,e)):(o=0|Xe(0|A,0|(t=((0|A)<0)<<31>>31),3,0),r=0|B(),t=0|We(0|A,0|t,1,0),t=0|We(0|(t=0|Xe(0|o,0|r,0|t,0|B())),0|B(),1,0),A=0|B(),n[e>>2]=t,n[e+4>>2]=A,0|(e=0))},_maxPolygonToCellsSize:function(A,e,t,r){A|=0,e|=0,r|=0;var o,i=0,a=0,s=0,l=0,c=0;if(o=S,S=S+48|0,i=o+16|0,a=o+8|0,s=o,0|(t=0|Ce(t|=0)))return S=o,0|t;if(l=0|n[(c=A)+4>>2],n[(t=a)>>2]=n[c>>2],n[t+4>>2]=l,ke(a,i),!(t=0|eA(i,e,s))){if(e=0|n[a>>2],(0|(a=0|n[A+8>>2]))>0){i=0|n[A+12>>2],t=0;do{e=(0|n[i+(t<<3)>>2])+e|0,t=t+1|0}while((0|t)<(0|a))}i=0|n[(t=s)>>2],(0|(t=0|n[t+4>>2]))<(0|(a=((0|e)<0)<<31>>31))|(0|t)==(0|a)&i>>>0>>0?(n[(t=s)>>2]=e,n[t+4>>2]=a,t=a):e=i,l=0|We(0|e,0|t,12,0),c=0|B(),n[(t=s)>>2]=l,n[t+4>>2]=c,n[(t=r)>>2]=l,n[t+4>>2]=c,t=0}return S=o,0|t},_maxPolygonToCellsSizeExperimental:function(A,e,t,i){e|=0,t|=0,i|=0;var a,s,c=0,u=0,f=0,g=0,h=0,m=0,b=0,p=0;if(s=S,S=S+48|0,h=s+32|0,g=s+40|0,a=s,!(0|n[(A|=0)>>2]))return n[(m=i)>>2]=0,n[m+4>>2]=0,S=s,0;RA(h,0,0,0),c=0|n[(f=h)>>2],f=0|n[f+4>>2];do{if(e>>>0>15)n[(m=a)>>2]=0,n[m+4>>2]=0,n[a+8>>2]=4,n[a+12>>2]=-1,t=a+29|0,n[(m=a+16|0)>>2]=0,n[m+4>>2]=0,n[m+8>>2]=0,r[m+12|0]=0,r[0|t]=0|r[0|g],r[t+1|0]=0|r[g+1|0],r[t+2|0]=0|r[g+2|0],t=4,m=9;else{if(0|(t=0|Ce(t))){n[(h=a)>>2]=0,n[h+4>>2]=0,n[a+8>>2]=t,n[a+12>>2]=-1,m=a+29|0,n[(h=a+16|0)>>2]=0,n[h+4>>2]=0,n[h+8>>2]=0,r[h+12|0]=0,r[0|m]=0|r[0|g],r[m+1|0]=0|r[g+1|0],r[m+2|0]=0|r[g+2|0],m=9;break}if(!(t=0|Ve(1+(0|n[A+8>>2])|0,32))){n[(m=a)>>2]=0,n[m+4>>2]=0,n[a+8>>2]=13,n[a+12>>2]=-1,t=a+29|0,n[(m=a+16|0)>>2]=0,n[m+4>>2]=0,n[m+8>>2]=0,r[m+12|0]=0,r[0|t]=0|r[0|g],r[t+1|0]=0|r[g+1|0],r[t+2|0]=0|r[g+2|0],t=13,m=9;break}Be(A,t),n[(p=a)>>2]=c,n[p+4>>2]=f,n[(f=a+8|0)>>2]=0,n[a+12>>2]=e,n[a+20>>2]=A,n[a+24>>2]=t,r[a+28|0]=0,r[0|(c=a+29|0)]=0|r[0|g],r[c+1|0]=0|r[g+1|0],r[c+2|0]=0|r[g+2|0],n[a+16>>2]=3,b=+J(t),b*=+Z(t),u=+l(+ +o[t>>3]),u=b/+d(+ +it(+u,+ +l(+ +o[t+8>>3])))*6371.007180918475*6371.007180918475,t=0|n[(c=a+12|0)>>2];A:do{if((0|t)>0)do{if(se(t+-1|0,h),!(u/+o[h>>3]>10))break A;t=(p=0|n[c>>2])-1|0,n[c>>2]=t}while((0|p)>1)}while(0);if(ye(a),n[(c=i)>>2]=0,n[c+4>>2]=0,!(!(0|(t=0|n[(c=a)>>2]))&!(0|(c=0|n[c+4>>2]))))do{_A(t,c,e,h),g=h,g=0|We(0|n[(A=i)>>2],0|n[A+4>>2],0|n[g>>2],0|n[g+4>>2]),A=0|B(),n[(p=i)>>2]=g,n[p+4>>2]=A,ye(a),t=0|n[(p=a)>>2],c=0|n[p+4>>2]}while(!(!(0|t)&!(0|c)));t=0|n[f>>2]}}while(0);return S=s,0|t},_memcpy:st,_memset:lt,_originToDirectedEdges:function(A,e,t){t|=0;var r,o=0;return r=!(0|zA(A|=0,e|=0)),e&=-2130706433,n[(o=t)>>2]=r?A:0,n[o+4>>2]=r?285212672|e:0,n[(o=t+8|0)>>2]=A,n[o+4>>2]=301989888|e,n[(o=t+16|0)>>2]=A,n[o+4>>2]=318767104|e,n[(o=t+24|0)>>2]=A,n[o+4>>2]=335544320|e,n[(o=t+32|0)>>2]=A,n[o+4>>2]=352321536|e,n[(t=t+40|0)>>2]=A,n[t+4>>2]=369098752|e,0},_pentagonCount:function(){return 12},_polygonToCells:function(A,e,t,r){A|=0,e|=0,r|=0;var o,i,a,s,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,M=0,D=0,E=0,j=0,Q=0,N=0,F=0,P=0,R=0,I=0,_=0;if(s=S,S=S+112|0,o=s+80|0,f=s+72|0,i=s,a=s+56|0,0|(l=0|Ce(t|=0)))return S=s,0|l;if(!(_=0|Ue(32+(n[(g=A+8|0)>>2]<<5)|0)))return S=s,13;if(Be(A,_),!(l=0|Ce(t))){if(I=0|n[(R=A)+4>>2],n[(l=f)>>2]=n[R>>2],n[l+4>>2]=I,ke(f,o),l=0|eA(o,e,i))R=0,I=0;else{if(l=0|n[f>>2],(0|(c=0|n[g>>2]))>0){u=0|n[A+12>>2],t=0;do{l=(0|n[u+(t<<3)>>2])+l|0,t=t+1|0}while((0|t)!=(0|c));t=l}else t=l;c=0|n[(l=i)>>2],(0|(l=0|n[l+4>>2]))<(0|(u=((0|t)<0)<<31>>31))|(0|l)==(0|u)&c>>>0>>0?(n[(l=i)>>2]=t,n[l+4>>2]=u,l=u):t=c,R=0|We(0|t,0|l,12,0),I=0|B(),n[(l=i)>>2]=R,n[l+4>>2]=I,l=0}if(!l){if(!(t=0|Ve(R,8)))return Ye(_),S=s,13;if(!(d=0|Ve(R,8)))return Ye(_),Ye(t),S=s,13;n[(F=o)>>2]=0,n[F+4>>2]=0,P=0|n[(F=A)+4>>2],n[(l=f)>>2]=n[F>>2],n[l+4>>2]=P,l=0|z(f,R,I,e,o,t,d);A:do{if(l)Ye(t),Ye(d),Ye(_);else{e:do{if((0|n[g>>2])>0){for(u=A+12|0,c=0;l=0|z((0|n[u>>2])+(c<<3)|0,R,I,e,o,t,d),c=c+1|0,!(0|l);)if((0|c)>=(0|n[g>>2]))break e;Ye(t),Ye(d),Ye(_);break A}}while(0);(0|I)>0|!(0|I)&R>>>0>0&<(0|d,0,R<<3),F=0|n[(P=o)+4>>2];e:do{if((0|F)>0|!(0|F)&(0|n[P>>2])>>>0>0){j=t,Q=d,N=t,F=d,P=t,l=t,M=t,D=d,E=d,t=d;t:for(;;){for(w=0,x=0,k=0,C=0,c=0,u=0;;){f=(d=i)+56|0;do{n[d>>2]=0,d=d+4|0}while((0|d)<(0|f));if(0|T(g=0|n[(e=j+(w<<3)|0)>>2],e=0|n[e+4>>2],1,i,0)){f=(d=i)+56|0;do{n[d>>2]=0,d=d+4|0}while((0|d)<(0|f));0|(d=0|Ve(7,4))&&(L(g,e,1,i,d,7,0,0),Ye(d))}for(y=0;;){p=0|n[(v=i+(y<<3)|0)>>2],v=0|n[v+4>>2];r:do{if(!(0|p)&!(0|v))d=c,f=u;else{if(h=0|At(0|p,0|v,0|R,0|I),g=0|B(),!(!(0|(f=0|n[(e=d=r+(h<<3)|0)>>2]))&!(0|(e=0|n[e+4>>2])))){m=0,b=0;do{if((0|m)>(0|I)|(0|m)==(0|I)&b>>>0>R>>>0)break t;if((0|f)==(0|p)&(0|e)==(0|v)){d=c,f=u;break r}h=0|$e(0|(d=0|We(0|h,0|g,1,0)),0|B(),0|R,0|I),g=0|B(),b=0|We(0|b,0|m,1,0),m=0|B(),f=0|n[(e=d=r+(h<<3)|0)>>2],e=0|n[e+4>>2]}while(!(!(0|f)&!(0|e)))}if(!(0|p)&!(0|v)){d=c,f=u;break}XA(p,v,a),0|Me(A,_,a)&&(b=0|We(0|c,0|u,1,0),u=0|B(),n[(m=d)>>2]=p,n[m+4>>2]=v,n[(c=Q+(c<<3)|0)>>2]=p,n[c+4>>2]=v,c=b),d=c,f=u}}while(0);if((y=y+1|0)>>>0>=7)break;c=d,u=f}if(w=0|We(0|w,0|x,1,0),x=0|B(),k=0|We(0|k,0|C,1,0),C=0|B(),c=0|n[(u=o)>>2],!((0|C)<(0|(u=0|n[u+4>>2]))|(0|C)==(0|u)&k>>>0>>0))break;c=d,u=f}if((0|u)>0|!(0|u)&c>>>0>0){c=0,u=0;do{n[(C=j+(c<<3)|0)>>2]=0,n[C+4>>2]=0,c=0|We(0|c,0|u,1,0),u=0|B(),k=0|n[(C=o)+4>>2]}while((0|u)<(0|k)|((0|u)==(0|k)?c>>>0<(0|n[C>>2])>>>0:0))}if(n[(C=o)>>2]=d,n[C+4>>2]=f,!((0|f)>0|!(0|f)&d>>>0>0))break e;y=t,w=E,x=P,k=D,C=Q,t=M,E=l,D=N,M=y,l=w,P=F,F=x,N=k,Q=j,j=C}Ye(N),Ye(F),Ye(_),l=1;break A}l=d}while(0);Ye(_),Ye(t),Ye(l),l=0}}while(0);return S=s,0|l}}return Ye(_),S=s,0|l},_polygonToCellsExperimental:function(A,e,t,o,i,a){o|=0,i|=0,a|=0;var s,l,c,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0;c=S,S=S+160|0,d=c+64|0,h=c+112|0,p=c,function(A,e,t,o){A|=0,e|=0,t|=0,o|=0;var i,a,s,l=0,c=0,u=0,d=0;s=S,S=S+48|0,i=s+40|0,a=s,RA(c=s+32|0,0,0,0),u=0|n[c>>2],c=0|n[c+4>>2];do{if(t>>>0<=15){if(0|(l=0|Ce(o))){n[(o=a)>>2]=0,n[o+4>>2]=0,n[a+8>>2]=l,n[a+12>>2]=-1,u=a+29|0,n[(o=a+16|0)>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,r[o+12|0]=0,r[0|u]=0|r[0|i],r[u+1|0]=0|r[i+1|0],r[u+2|0]=0|r[i+2|0];break}if(l=0|Ve(1+(0|n[e+8>>2])|0,32)){Be(e,l),n[(d=a)>>2]=u,n[d+4>>2]=c,n[a+8>>2]=0,n[a+12>>2]=t,n[a+16>>2]=o,n[a+20>>2]=e,n[a+24>>2]=l,r[a+28|0]=0,r[0|(u=a+29|0)]=0|r[0|i],r[u+1|0]=0|r[i+1|0],r[u+2|0]=0|r[i+2|0];break}n[(o=a)>>2]=0,n[o+4>>2]=0,n[a+8>>2]=13,n[a+12>>2]=-1,u=a+29|0,n[(o=a+16|0)>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,r[o+12|0]=0,r[0|u]=0|r[0|i],r[u+1|0]=0|r[i+1|0],r[u+2|0]=0|r[i+2|0];break}n[(u=a)>>2]=0,n[u+4>>2]=0,n[a+8>>2]=4,n[a+12>>2]=-1,d=a+29|0,n[(u=a+16|0)>>2]=0,n[u+4>>2]=0,n[u+8>>2]=0,r[u+12|0]=0,r[0|d]=0|r[0|i],r[d+1|0]=0|r[i+1|0],r[d+2|0]=0|r[i+2|0]}while(0);ye(a),n[A>>2]=n[a>>2],n[A+4>>2]=n[a+4>>2],n[A+8>>2]=n[a+8>>2],n[A+12>>2]=n[a+12>>2],n[A+16>>2]=n[a+16>>2],n[A+20>>2]=n[a+20>>2],n[A+24>>2]=n[a+24>>2],n[A+28>>2]=n[a+28>>2],S=s}(g=c+80|0,A|=0,e|=0,t|=0),ee(d,0|n[(f=g)>>2],0|n[f+4>>2],e),s=0|n[(f=d)>>2],f=0|n[f+4>>2],u=0|n[g+8>>2],n[(m=h+4|0)>>2]=n[g>>2],n[m+4>>2]=n[g+4>>2],n[m+8>>2]=n[g+8>>2],n[m+12>>2]=n[g+12>>2],n[m+16>>2]=n[g+16>>2],n[m+20>>2]=n[g+20>>2],n[m+24>>2]=n[g+24>>2],n[m+28>>2]=n[g+28>>2],n[(m=p)>>2]=s,n[m+4>>2]=f,n[(m=p+8|0)>>2]=u,e=h,t=36+(A=p+12|0)|0;do{n[A>>2]=n[e>>2],A=A+4|0,e=e+4|0}while((0|A)<(0|t));if(n[(h=p+48|0)>>2]=n[d>>2],n[h+4>>2]=n[d+4>>2],n[h+8>>2]=n[d+8>>2],n[h+12>>2]=n[d+12>>2],!(0|s)&!(0|f))return S=c,0|u;t=p+16|0,l=p+24|0,g=p+28|0,u=0,d=0,e=s,A=f;do{if(!((0|u)<(0|i)|(0|u)==(0|i)&d>>>0>>0)){b=4;break}if(f=d,d=0|We(0|d,0|u,1,0),u=0|B(),n[(f=a+(f<<3)|0)>>2]=e,n[f+4>>2]=A,re(h),!(0|(e=0|n[(A=h)>>2]))&!(0|(A=0|n[A+4>>2]))){if(ye(t),!(0|(A=0|n[(e=t)>>2]))&!(0|(e=0|n[e+4>>2]))){b=10;break}te(A,e,0|n[g>>2],h),e=0|n[(A=h)>>2],A=0|n[A+4>>2]}n[(f=p)>>2]=e,n[f+4>>2]=A}while(!(!(0|e)&!(0|A)));return 4==(0|b)?(0|(e=0|n[(A=p+40|0)>>2])&&Ye(e),n[(b=p+16|0)>>2]=0,n[b+4>>2]=0,n[l>>2]=0,n[p+36>>2]=0,n[g>>2]=-1,n[p+32>>2]=0,n[A>>2]=0,te(0,0,0,h),n[p>>2]=0,n[p+4>>2]=0,n[m>>2]=0,S=c,0|(p=14)):(10==(0|b)&&(n[p>>2]=0,n[p+4>>2]=0,n[m>>2]=n[l>>2]),p=0|n[m>>2],S=c,0|p)},_readInt64AsDoubleFromPointer:function(A){return+(+((0|n[(A|=0)>>2])>>>0)+4294967296*+(0|n[A+4>>2]))},_res0CellCount:function(){return 122},_round:ct,_sbrk:ut,_sizeOfCellBoundary:function(){return 168},_sizeOfCoordIJ:function(){return 8},_sizeOfGeoLoop:function(){return 8},_sizeOfGeoPolygon:function(){return 16},_sizeOfH3Index:function(){return 8},_sizeOfLatLng:function(){return 16},_sizeOfLinkedGeoPolygon:function(){return 12},_uncompactCells:function(A,e,t,r,o,i,a){A|=0,r|=0,o|=0,i|=0;var s,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0;if(s=S,S=S+16|0,m=s,!((0|(t|=0))>0|!(0|t)&(e|=0)>>>0>0))return S=s,0;if((0|(a|=0))>=16)return S=s,12;g=0,h=0,f=0,l=0;A:for(;;){if(d=0|tt(0|(c=0|n[(u=A+(g<<3)|0)>>2]),0|(u=0|n[u+4>>2]),52),B(),(15&d)>(0|a)){l=12,c=11;break}if(ee(m,c,u,a),!(0|(u=0|n[(d=m)>>2]))&!(0|(d=0|n[d+4>>2])))c=f;else{c=f;do{if(!((0|l)<(0|i)|(0|l)==(0|i)&c>>>0>>0)){c=10;break A}n[(f=r+(c<<3)|0)>>2]=u,n[f+4>>2]=d,c=0|We(0|c,0|l,1,0),l=0|B(),re(m),u=0|n[(f=m)>>2],d=0|n[f+4>>2]}while(!(!(0|u)&!(0|d)))}if(g=0|We(0|g,0|h,1,0),!((0|(h=0|B()))<(0|t)|(0|h)==(0|t)&g>>>0>>0)){l=0,c=11;break}f=c}return 10==(0|c)?(S=s,0|(m=14)):11==(0|c)?(S=s,0|l):0},_uncompactCellsSize:function(A,e,t,r,o){A|=0,e|=0,t|=0,r|=0,o|=0;var i,a,s=0,l=0,c=0,u=0,d=0,f=0;a=S,S=S+16|0,i=a;A:do{if((0|t)>0|!(0|t)&e>>>0>0){for(d=0,l=0,s=0,f=0;;){if(!(!(0|(c=0|n[(u=A+(d<<3)|0)>>2]))&!(0|(u=0|n[u+4>>2]))||(u=!(0|_A(c,u,r,i)),l=0|We(0|n[(c=i)>>2],0|n[c+4>>2],0|l,0|s),s=0|B(),u))){s=12;break}if(d=0|We(0|d,0|f,1,0),!((0|(f=0|B()))<(0|t)|(0|f)==(0|t)&d>>>0>>0))break A}return S=a,0|s}l=0,s=0}while(0);return n[o>>2]=l,n[o+4>>2]=s,S=a,0},_vertexToLatLng:function(A,e,t){t|=0;var r,o,i,a,s=0,l=0;return a=S,S=S+192|0,o=a,i=a+168|0,s=0|tt(0|(A|=0),0|(e|=0),56),B(),s&=7,0|(r=0|qA(A,l=-2130706433&e|134217728,i))?(S=a,0|(l=r)):(e=0|tt(0|A,0|e,52),B(),e&=15,0|zA(A,l)?jA(i,e,s,1,o):FA(i,e,s,1,o),l=o+8|0,n[t>>2]=n[l>>2],n[t+4>>2]=n[l+4>>2],n[t+8>>2]=n[l+8>>2],n[t+12>>2]=n[l+12>>2],S=a,0|(l=0))},establishStackSpace:function(A,e){S=A|=0},stackAlloc:function(A){var e;return e=S,S=15+(S=S+(A|=0)|0)&-16,0|e},stackRestore:function(A){S=A|=0},stackSave:function(){return 0|S}}}({Math:Math,Int8Array:Int8Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Float32Array:Float32Array,Float64Array:Float64Array},{b:function(A){s=A},c:function(){return s},d:function(A,e,t,r){tA("Assertion failed: "+v(A)+", at: "+[e?v(e):"unknown filename",t,r?v(r):"unknown function"])},e:function(A){return t.___errno_location&&(h[t.___errno_location()>>2]=A),A},f:H,g:function(A,e,t){f.set(f.subarray(e,e+t),A)},h:function(A){var e=H(),t=16777216,r=2130706432;if(A>r)return!1;for(var n=Math.max(e,16777216);n0))return 0;for(var n=t+r-1,o=0;o=55296&&i<=57343&&(i=65536+((1023&i)<<10)|1023&A.charCodeAt(++o)),i<=127){if(t>=n)break;e[t++]=i}else if(i<=2047){if(t+1>=n)break;e[t++]=192|i>>6,e[t++]=128|63&i}else if(i<=65535){if(t+2>=n)break;e[t++]=224|i>>12,e[t++]=128|i>>6&63,e[t++]=128|63&i}else{if(t+3>=n)break;e[t++]=240|i>>18,e[t++]=128|i>>12&63,e[t++]=128|i>>6&63,e[t++]=128|63&i}}e[t]=0}(A,f,e,t)}(A,e=Z(t),t)}return e},array:function(A){var e,t,r=Z(A.length);return e=A,t=r,d.set(e,t),r}},o=c(A),i=[],a=0;if(r)for(var s=0;s>1]=e;break;case"i32":h[A>>2]=e;break;case"i64":R=[e>>>0,(L=e,+Q(L)>=1?L>0?(0|F(+S(L/4294967296),4294967295))>>>0:~~+N((L-+(~~L>>>0))/4294967296)>>>0:0)],h[A>>2]=R[0],h[A+4>>2]=R[1];break;case"float":m[A>>2]=e;break;case"double":b[A>>3]=e;break;default:tA("invalid type for setValue: "+t)}},t.getValue=function(A,e,t){switch("*"===(e=e||"i8").charAt(e.length-1)&&(e="i32"),e){case"i1":case"i8":return d[0|A];case"i16":return g[A>>1];case"i32":case"i64":return h[A>>2];case"float":return m[A>>2];case"double":return b[A>>3];default:tA("invalid type for getValue: "+e)}return null},I){z(I)||(V=I,I=t.locateFile?t.locateFile(V,o):o+V),P++,t.monitorRunDependencies&&t.monitorRunDependencies(P);var q=function(A){A.byteLength&&(A=new Uint8Array(A)),f.set(A,8),t.memoryInitializerRequest&&delete t.memoryInitializerRequest.response,function(){if(P--,t.monitorRunDependencies&&t.monitorRunDependencies(P),0==P&&T){var A=T;T=null,A()}}()},X=function(){n(I,q,function(){throw"could not load memory initializer "+I})},$=O(I);if($)q($.buffer);else if(t.memoryInitializerRequest){var AA=function(){var A=t.memoryInitializerRequest,e=A.response;if(200!==A.status&&0!==A.status){var r=O(t.memoryInitializerRequestURL);if(!r)return void X();e=r.buffer}q(e)};t.memoryInitializerRequest.response?setTimeout(AA,0):t.memoryInitializerRequest.addEventListener("load",AA)}else X()}function eA(A){function e(){W||(W=!0,l||(k(B),k(M),t.onRuntimeInitialized&&t.onRuntimeInitialized(),function(){if(t.postRun)for("function"==typeof t.postRun&&(t.postRun=[t.postRun]);t.postRun.length;)j(t.postRun.shift());k(D)}()))}P>0||(function(){if(t.preRun)for("function"==typeof t.preRun&&(t.preRun=[t.preRun]);t.preRun.length;)E(t.preRun.shift());k(C)}(),P>0||(t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),e()},1)):e()))}function tA(A){throw t.onAbort&&t.onAbort(A),i(A+=""),a(A),l=!0,"abort("+A+"). Build with -s ASSERTIONS=1 for more info."}if(T=function A(){W||eA(),W||(T=A)},t.run=eA,t.abort=tA,t.preInit)for("function"==typeof t.preInit&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return eA(),A}("object"==typeof Ke?Ke:{}),Je="number",qe={0:"Success",1:"The operation failed but a more specific error is not available",2:"Argument was outside of acceptable range",3:"Latitude or longitude arguments were outside of acceptable range",4:"Resolution argument was outside of acceptable range",5:"Cell argument was not valid",6:"Directed edge argument was not valid",7:"Undirected edge argument was not valid",8:"Vertex argument was not valid",9:"Pentagon distortion was encountered",10:"Duplicate input",11:"Cell arguments were not neighbors",12:"Cell arguments had incompatible resolutions",13:"Memory allocation failed",14:"Bounds of provided memory were insufficient",15:"Mode or flags argument was not valid",16:"Index argument was not valid",17:"Base cell number was outside of acceptable range",18:"Child indexing digits invalid",19:"Child indexing digits refer to a deleted subsequence"},Xe={1e3:"Unknown unit",1001:"Array length out of bounds",1002:"Got unexpected null value for H3 index"};function $e(A,e,t){var r=t&&"value"in t,n=new Error((A[e]||"Unknown error")+" (code: "+e+(r?", value: "+t.value:"")+")");return n.code=e,n}function At(A){if(0!==A)throw function(A,e){return $e(qe,A,2===arguments.length?{value:e}:{})}(A)}var et={};[["sizeOfH3Index",Je],["sizeOfLatLng",Je],["sizeOfCellBoundary",Je],["sizeOfGeoLoop",Je],["sizeOfGeoPolygon",Je],["sizeOfLinkedGeoPolygon",Je],["sizeOfCoordIJ",Je],["readInt64AsDoubleFromPointer",Je],["isValidCell",Je,[Je,Je]],["isValidIndex",Je,[Je,Je]],["latLngToCell",Je,[Je,Je,Je,Je]],["cellToLatLng",Je,[Je,Je,Je]],["cellToBoundary",Je,[Je,Je,Je]],["maxGridDiskSize",Je,[Je,Je]],["gridDisk",Je,[Je,Je,Je,Je]],["gridDiskDistances",Je,[Je,Je,Je,Je,Je]],["gridRing",Je,[Je,Je,Je,Je]],["gridRingUnsafe",Je,[Je,Je,Je,Je]],["maxPolygonToCellsSize",Je,[Je,Je,Je,Je]],["polygonToCells",Je,[Je,Je,Je,Je]],["maxPolygonToCellsSizeExperimental",Je,[Je,Je,Je,Je]],["polygonToCellsExperimental",Je,[Je,Je,Je,Je,Je,Je]],["cellsToLinkedMultiPolygon",Je,[Je,Je,Je]],["destroyLinkedMultiPolygon",null,[Je]],["compactCells",Je,[Je,Je,Je,Je]],["uncompactCells",Je,[Je,Je,Je,Je,Je,Je]],["uncompactCellsSize",Je,[Je,Je,Je,Je,Je]],["isPentagon",Je,[Je,Je]],["isResClassIII",Je,[Je,Je]],["getBaseCellNumber",Je,[Je,Je]],["getResolution",Je,[Je,Je]],["getIndexDigit",Je,[Je,Je,Je]],["constructCell",Je,[Je,Je,Je,Je]],["maxFaceCount",Je,[Je,Je,Je]],["getIcosahedronFaces",Je,[Je,Je,Je]],["cellToParent",Je,[Je,Je,Je,Je]],["cellToChildren",Je,[Je,Je,Je,Je]],["cellToCenterChild",Je,[Je,Je,Je,Je]],["cellToChildrenSize",Je,[Je,Je,Je,Je]],["cellToChildPos",Je,[Je,Je,Je,Je]],["childPosToCell",Je,[Je,Je,Je,Je,Je,Je]],["areNeighborCells",Je,[Je,Je,Je,Je,Je]],["cellsToDirectedEdge",Je,[Je,Je,Je,Je,Je]],["getDirectedEdgeOrigin",Je,[Je,Je,Je]],["getDirectedEdgeDestination",Je,[Je,Je,Je]],["isValidDirectedEdge",Je,[Je,Je]],["directedEdgeToCells",Je,[Je,Je,Je]],["originToDirectedEdges",Je,[Je,Je,Je]],["directedEdgeToBoundary",Je,[Je,Je,Je]],["gridDistance",Je,[Je,Je,Je,Je,Je]],["gridPathCells",Je,[Je,Je,Je,Je,Je]],["gridPathCellsSize",Je,[Je,Je,Je,Je,Je]],["cellToLocalIj",Je,[Je,Je,Je,Je,Je,Je]],["localIjToCell",Je,[Je,Je,Je,Je,Je]],["getHexagonAreaAvgM2",Je,[Je,Je]],["getHexagonAreaAvgKm2",Je,[Je,Je]],["getHexagonEdgeLengthAvgM",Je,[Je,Je]],["getHexagonEdgeLengthAvgKm",Je,[Je,Je]],["greatCircleDistanceM",Je,[Je,Je]],["greatCircleDistanceKm",Je,[Je,Je]],["greatCircleDistanceRads",Je,[Je,Je]],["cellAreaM2",Je,[Je,Je,Je]],["cellAreaKm2",Je,[Je,Je,Je]],["cellAreaRads2",Je,[Je,Je,Je]],["edgeLengthM",Je,[Je,Je,Je]],["edgeLengthKm",Je,[Je,Je,Je]],["edgeLengthRads",Je,[Je,Je,Je]],["getNumCells",Je,[Je,Je]],["getRes0Cells",Je,[Je]],["res0CellCount",Je],["getPentagons",Je,[Je,Je]],["pentagonCount",Je],["cellToVertex",Je,[Je,Je,Je,Je]],["cellToVertexes",Je,[Je,Je,Je]],["vertexToLatLng",Je,[Je,Je,Je]],["isValidVertex",Je,[Je,Je]]].forEach(function(A){et[A[0]]=Ke.cwrap.apply(Ke,A)});var tt=16,rt=et.sizeOfH3Index(),nt=et.sizeOfLatLng(),ot=et.sizeOfCellBoundary();et.sizeOfGeoPolygon(),et.sizeOfGeoLoop(),et.sizeOfLinkedGeoPolygon(),et.sizeOfCoordIJ();var it=/[^0-9a-fA-F]/;function at(A){if(A>=0)return A.toString(tt);var e=st(8,(A&=2147483647).toString(tt));return(parseInt(e[0],tt)+8).toString(tt)+e.substring(1)}function st(A,e){for(var t=A-e.length,r="",n=0;n.85?.9+(i-.85)/.15*.1:.1+(i-.15)/.7*.8;var i;return pt(r[Math.min(23,Math.floor(24*o))])}function yt({coveragePoints:t,visible:r,terrainEnabled:n=!1,brightness:i=.7,basemapMode:a="dark"}){const{current:s}=o(),[l,c]=A.useState(null);A.useEffect(()=>{const A=()=>{var A;const e=null==(A=null==s?void 0:s.getMap)?void 0:A.call(s);e&&!l&&c(e)};A();const e=setInterval(A,50),t=setTimeout(()=>clearInterval(e),5e3);return()=>{clearInterval(e),clearTimeout(t)}},[s,l]);const[u,d]=A.useState(null),[f,g]=A.useState(!1),h=A.useRef({aborted:!1}),m=A.useRef(0),b=A.useRef(a),p=function(e){const[t,r]=A.useState(e);return A.useEffect(()=>{const A=setTimeout(()=>r(e),300);return()=>clearTimeout(A)},[e,300]),t}(t),v=A.useMemo(()=>function(A="dark"){var e;if("light"===A)return bt;const t=rA();return 24===t.length&&0!==(null==(e=t[0])?void 0:e[0])?t:mt}(a),[a]);A.useEffect(()=>{if(!p||!Array.isArray(p)||0===p.length)return void queueMicrotask(()=>{d(null),m.current=0});const A=b.current!==a;if(p.length===m.current&&u&&!A)return;m.current=p.length,b.current=a,h.current.aborted=!0,h.current={aborted:!1};const e=h.current;g(!0);const{cells:t,minQuality:r,maxQuality:n}=function(A){const e=new Map;for(const o of A){if("number"!=typeof o.lat||"number"!=typeof o.lon||isNaN(o.lat)||isNaN(o.lon))continue;const A=ut(o.lat,o.lon,8),t=e.get(A),r=o.weight;t?(t.count++,t.qualitySum+=r):e.set(A,{count:1,qualitySum:r})}const t=[];let r=1/0,n=-1/0;for(const[o,i]of e.entries()){const A=i.qualitySum/i.count;t.push({hexId:o,count:i.count,avgQuality:A}),r=Math.min(r,A),n=Math.max(n,A)}return{cells:t,minQuality:t.length>0?r:0,maxQuality:t.length>0?n:0}}(p);if(0===t.length)return d(null),void g(!1);if(t.length<500){const A=function(A,e,t,r){const n=[];for(const o of A){const A=dt(o.hexId).map(([A,e])=>[e,A]);A.push(A[0]);const i=vt(o.avgQuality,e,t,r);n.push({type:"Feature",properties:{color:i,quality:o.avgQuality,count:o.count},geometry:{type:"Polygon",coordinates:[A]}})}return{type:"FeatureCollection",features:n}}(t,r,n,v);return void(e.aborted||(d(A),g(!1)))}return async function(A,e,t,r,n){const o=[];let i=0;for(;i[e,A]);a.push(a[0]);const s=vt(n.avgQuality,e,t,r);o.push({type:"Feature",properties:{color:s,quality:n.avgQuality,count:n.count},geometry:{type:"Polygon",coordinates:[a]}})}irequestAnimationFrame(A))}return{type:"FeatureCollection",features:o}}(t,r,n,v,e).then(A=>{!e.aborted&&A&&d(A)}).finally(()=>{e.aborted||g(!1)}),()=>{e.aborted=!0}},[p,v]),A.useEffect(()=>{if(!l)return;const A=()=>{var A,e;try{const t=l.getLayer(ht),n=l.getSource(gt);if(r&&u&&u.features.length>0){if(n?l.getSource(gt).setData(u):l.addSource(gt,{type:"geojson",data:u}),!t){const t=l.getLayer("topology-weak-edges-native"),r=null==(e=null==(A=l.getStyle())?void 0:A.layers)?void 0:e.find(A=>"symbol"===A.type),n=t?"topology-weak-edges-native":null==r?void 0:r.id;l.addLayer({id:ht,type:"fill",source:gt,paint:{"fill-color":["get","color"],"fill-opacity":i}},n)}}else t&&l.removeLayer(ht),n&&l.removeSource(gt)}catch(t){}};l.isStyleLoaded()?A():l.once("style.load",A)},[l,r,u,n]),A.useEffect(()=>{if(l&&r)try{l.getLayer(ht)&&l.setPaintProperty(ht,"fill-opacity",i)}catch{}},[l,i,r]),A.useEffect(()=>()=>{if(l)try{l.getLayer(ht)&&l.removeLayer(ht),l.getSource(gt)&&l.removeSource(gt)}catch{}},[l]);const y=(null==u?void 0:u.features.length)??0;return y>0&&r?e.jsx("div",{"data-testid":"wardriving-hexlayer-maplibre-active","data-point-count":(null==t?void 0:t.length)||0,"data-cell-count":y,"data-terrain-enabled":n,"data-is-processing":f,style:{display:"none"}}):null}const wt="https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png",xt="terrarium",kt="terrain-dem",Ct="hillshade-dem",Bt="terrain-hillshade";function Mt({enabled:e,exaggeration:t=4}){const{current:r}=o(),[n,i]=A.useState(null),a=A.useRef(null);return A.useEffect(()=>{const A=()=>{var A;const e=null==(A=null==r?void 0:r.getMap)?void 0:A.call(r);e&&!n&&i(e)};A();const e=setInterval(A,50),t=setTimeout(()=>clearInterval(e),5e3);return()=>{clearInterval(e),clearTimeout(t)}},[r,n]),A.useEffect(()=>{if(!n)return;let A=!0;const e=()=>{var e,t;if(A)try{if(n.getSource(Ct)||n.addSource(Ct,{type:"raster-dem",tiles:[wt],encoding:xt,tileSize:256,maxzoom:14}),!n.getLayer(Bt)){const A=null==(t=null==(e=n.getStyle())?void 0:e.layers)?void 0:t.find(A=>"symbol"===A.type);n.addLayer({id:Bt,type:"hillshade",source:Ct,paint:{"hillshade-shadow-color":"rgba(10, 10, 10, 0.6)","hillshade-highlight-color":"rgba(245, 240, 230, 0.4)","hillshade-accent-color":"rgba(90, 75, 65, 0.3)","hillshade-illumination-direction":315,"hillshade-exaggeration":.35}},null==A?void 0:A.id)}n.getSource(kt)||n.addSource(kt,{type:"raster-dem",tiles:[wt],encoding:xt,tileSize:256,maxzoom:14})}catch(r){}};return n.isStyleLoaded()?e():(n.once("style.load",e),n.once("load",()=>{A&&!n.getSource(Ct)&&e()})),()=>{A=!1}},[n]),A.useEffect(()=>{if(!n)return;let A=!0,r=!1;const o=()=>{if(A&&n.getSource(kt))try{e?(n.setCenterClampedToGround(!1),n.setTerrain({source:kt,exaggeration:t}),n.setMaxPitch(70),!r&&n.getPitch()<30&&!n.isMoving()&&(r=!0,null!==a.current&&clearTimeout(a.current),a.current=window.setTimeout(()=>{a.current=null,A&&!n.isMoving()&&n.getPitch()<30&&n.easeTo({pitch:45,duration:1e3})},200))):(n.setTerrain(null),n.setCenterClampedToGround(!0),n.getPitch()>0&&!n.isMoving()&&n.easeTo({pitch:0,duration:800}),n.setMaxPitch(60))}catch(o){}};if(n.isStyleLoaded()&&n.getSource(kt))o();else{const A=()=>{n.getSource(kt)&&o()};n.once("idle",A)}return()=>{A=!1,null!==a.current&&(clearTimeout(a.current),a.current=null)}},[n,e,t]),A.useEffect(()=>()=>{var A;try{(null==(A=null==n?void 0:n.getStyle)?void 0:A.call(n))&&n.isStyleLoaded()&&(n.setTerrain(null),n.getLayer(Bt)&&n.removeLayer(Bt),n.getSource(Ct)&&n.removeSource(Ct),n.getSource(kt)&&n.removeSource(kt))}catch{}},[n]),null}function Dt(A,e){let t=0;for(let r=0;r0)for(let t=0;t=A.length)return A;const t=[],r=A.length/e;for(let n=0;no.has(A.fromHash)&&o.has(A.toHash));if(0===i.length)return null;const a=function(A,e,t,r){const n=e.length,o=new Map(e.map((A,e)=>[A,e])),i=Array(n).fill(null).map(()=>Array(n).fill(0));for(const a of A){const A=o.get(a.fromHash),e=o.get(a.toHash);if(void 0!==A&&void 0!==e&&A!==e){const n=a.strength*a.certainCount;let o=1;if(t){const A=t.get(a.fromHash),e=t.get(a.toHash);A&&e&&(o=Nt(GA(A[0],A[1],e[0],e[1])/1e3))}let s=1;if(r){const A=[a.fromHash,a.toHash].sort().join("-");s=1-.7*(r.get(A)??0)}const l=.3+.7*(a.symmetryRatio??0),c=Math.pow(n,.7)*Math.pow(o,.3)*s*l;i[A][e]=c,i[e][A]=c}}return i}(i,e,t,r),s=function(A){const e=A.length,t=Array(e).fill(null).map(()=>Array(e).fill(0));for(let r=0;rArray(e).fill(0));for(let a=0;a43758.5453*Math.sin(12.9898*e)%1-.5);jt(o,t),Et(o);let i=0;for(let a=0;a<100;a++){const A=Qt(n,o);jt(A,t);const e=Dt(A,A)/Dt(o,A);if(Et(A),o=A,Math.abs(e-i)<1e-8)return{vector:o,eigenvalue:r-e};i=e}return{vector:o,eigenvalue:r-i}}(s);if(c<.001)return null;const u=[],d=[];for(let f=0;f0&&A.push([A[0][0],A[0][1]]),t=A}return t}function zt(A,e={}){const t=function(A,e={}){if(A.length<3)return{coordinates:[],valid:!1};const{bandwidth:t=Lt,threshold:n=Rt,cellSize:o=It}=e,i=function(A,e){let t=1/0,r=-1/0,n=1/0,o=-1/0;for(const[i,a]of A)ir&&(r=i),ao&&(o=a);return t-=e,r+=e,n-=e,o+=e,{minX:t,minY:n,maxX:r,maxY:o,width:r-t,height:o-n}}(A,.02),a=Math.ceil(i.width/(t/2)),s=Math.ceil(i.height/(t/2)),l=Math.min(1,200/Math.max(a,s)),c=Math.max(10,Math.ceil(a*l)),u=Math.max(10,Math.ceil(s*l)),d=A=>A/c*i.width+i.minX,f=A=>A/u*i.height+i.minY,g=t/i.width*c;try{const e=r().x(A=>(A[0]-i.minX)/i.width*c).y(A=>(A[1]-i.minY)/i.height*u).size([c,u]).bandwidth(Math.max(5,g)).cellSize(o)(A);if(0===e.length)return{coordinates:[],valid:!1};const t=Math.max(...e.map(A=>A.value))*n;let a=e[0],s=1/0;for(const A of e){const e=Math.abs(A.value-t);e0){const e=A[0],t=A[A.length-1];e[0]===t[0]&&e[1]===t[1]||A.push([e[0],e[1]])}if(A.length>=4){const t=_t(A);e.push(t)}}e.length>0&&l.push(e)}const h=[];for(const A of l)for(const e of A)h.push(e);return{coordinates:l,valid:l.length>0}}catch(h){return{coordinates:[],valid:!1}}}(A,e);return t.valid&&0!==t.coordinates.length?1===t.coordinates.length?{type:"Polygon",coordinates:t.coordinates[0]}:{type:"MultiPolygon",coordinates:t.coordinates}:null}function Ht(A,e,t){return(e[0]-A[0])*(t[1]-A[1])-(e[1]-A[1])*(t[0]-A[0])}function Gt(A,e,t,r,n){const o=n*n,i=o*n;return[.5*(2*e[0]+(-A[0]+t[0])*n+(2*A[0]-5*e[0]+4*t[0]-r[0])*o+(-A[0]+3*e[0]-3*t[0]+r[0])*i),.5*(2*e[1]+(-A[1]+t[1])*n+(2*A[1]-5*e[1]+4*t[1]-r[1])*o+(-A[1]+3*e[1]-3*t[1]+r[1])*i)]}function Ot(A){let e=function(A){if(A.length<3)return A;const e=[...A].sort((A,e)=>A[0]-e[0]||A[1]-e[1]),t=[];for(const n of e){for(;t.length>=2&&Ht(t[t.length-2],t[t.length-1],n)<=0;)t.pop();t.push(n)}const r=[];for(let n=e.length-1;n>=0;n--){const A=e[n];for(;r.length>=2&&Ht(r[r.length-2],r[r.length-1],A)<=0;)r.pop();r.push(A)}return t.pop(),r.pop(),t.concat(r)}(A);if(e.length<3)return null;e=function(A){if(A.length<3)return A;let e=0,t=0;for(const[r,n]of A)e+=r,t+=n;return e/=A.length,t/=A.length,A.map(([A,r])=>{const n=A-e,o=r-t,i=Math.sqrt(n*n+o*o);if(i<1e-4)return[A,r];const a=(i+.008)/i;return[e+n*a,t+o*a]})}(e);const t=function(A){if(A.length<3)return A;const e=[],t=A.length;for(let r=0;rt?function(A,e,t,r){const n=[];for(const[o,i]of A.communities){const A=[];for(const t of i){const r=e.get(t);r&&A.push([r[1],r[0]])}if(A.length<3)continue;let a=zt(A,{bandwidth:t,threshold:r});a||(a=Ot(A)),a&&n.push({type:"Feature",properties:{community:o,color:Pt(o),borderColor:Tt(o),nodeCount:i.length},geometry:a})}return{type:"FeatureCollection",features:n}}(t,r,s,l):{type:"FeatureCollection",features:[]},[t,r,s,l]),d=n?o:0,f={"fill-color":["get","color"],"fill-opacity":d},g={"line-color":["get","borderColor"],"line-width":c,"line-opacity":d};return e.jsxs(i,{id:"mincut-partition",type:"geojson",data:u,children:[e.jsx(a,{id:"mincut-partition-fill",type:"fill",paint:f}),e.jsx(a,{id:"mincut-partition-stroke",type:"line",paint:g})]})}const Yt={showTopology:!1,showNeighborLines:!0,show3DTerrain:!1,showMinCut:!1,nodeFilter:"all"},Vt=mA()(bA(A=>({viewState:null,setViewState:e=>A({viewState:e,lastSavedAt:Date.now()}),toggles:Yt,setToggle:(e,t)=>A(A=>({toggles:{...A.toggles,[e]:t},lastSavedAt:Date.now()})),setToggles:e=>A(A=>({toggles:{...A.toggles,...e},lastSavedAt:Date.now()})),hasAnalyzed:!1,setHasAnalyzed:e=>A({hasAnalyzed:e,lastSavedAt:Date.now()}),lastSavedAt:null,reset:()=>A({viewState:null,toggles:Yt,hasAnalyzed:!1,lastSavedAt:null})}),{name:"pymc-map-view",partialize:A=>({viewState:A.viewState,toggles:A.toggles,hasAnalyzed:A.hasAnalyzed,lastSavedAt:A.lastSavedAt})}));function Wt(A,e=!1,t=!1,r=!1,n=.7,o){const i=eA(o);return r?n>=.75?i.restBright:i.rest:n>=.85?i.rest:i.restDim}function Zt(A){return[A[1],A[0]]}function Kt(A,e,t,r=12){const[n,o]=A,[i,a]=e,s=[];for(let l=0;l<=r;l++){const A=l/r,e=o+(a-o)*A,c=n+(i-n)*A,u=4*t*A*(1-A);s.push([e,c,u])}return s}function Jt(A){return A<.5?4*A*A*A:1-Math.pow(-2*A+2,3)/2}function qt(A,e,t,r,n,o,i,a,s,l,c,u="dark"){const d=YA(),f=[];let g=1/0,h=-1/0;const m=[];for(const p of A){const A=.7*(p.edge.avgConfidence??(e?.7:.5))+p.edge.certainCount/Math.max(i,1)*.3+(e?.5:0);m.push({polyline:p,brightnessScore:A}),g=Math.min(g,A),h=Math.max(h,A)}if(0===m.length)return{type:"FeatureCollection",features:[]};const b=h-g||1;m.sort((A,e)=>A.brightnessScore-e.brightnessScore);for(const{polyline:p,brightnessScore:v}of m){const{from:A,to:i,edge:h}=p,m=t.get(h.key)??0;if(m<=0)continue;const y=a.has(h.key),w=s.has(h.key),x=h.avgConfidence??(e?.7:.5),k=l===h.key,C=c[h.fromHash],B=c[h.toHash],M=(null==C?void 0:C.node_name)||(null==C?void 0:C.name)||h.fromHash.slice(0,8),D=(null==B?void 0:B.node_name)||(null==B?void 0:B.name)||h.toHash.slice(0,8),E=[A[0]+(i[0]-A[0])*m,A[1]+(i[1]-A[1])*m];let j,Q,N,S;if(e){const A=o.get(h.key)??OA(h.certainCount),e=n.get(h.key)??A;j=e+(A-e)*r,k?j=Math.max(1.6*j,4.5):w&&(j*=1.3)}else j=1.5;if(Q=k?d.edges.highlight:Wt(0,h.isDirectPathEdge??!1,y,w,x,u),N=k?d.edges.highlight:h.isDirectPathEdge?d.edges.hoverDirect:y?d.edges.hoverLoop:d.edges.hoverStandard,e){const A=Math.min(1.5*m,1)*d.edgeOpacity;S=w?1.15*A:A}else S=(.3+.3*x)*m;k&&(S=.95);const F=(v-g)/b;f.push({type:"Feature",properties:{key:h.key,baseColor:Q,hoverColor:N,baseWidth:j,baseOpacity:S,brightnessScore:F,isLoopEdge:y,isBackbone:w,isDirectPath:h.isDirectPathEdge??!1,isHubConnection:h.isHubConnection??!1,isZeroHop:h.isZeroHop??!1,isValidated:e,certainCount:h.certainCount,confidence:x,symmetryRatio:h.symmetryRatio??1,dominantDirection:h.dominantDirection??"balanced",fromName:M,toName:D,fromHash:h.fromHash,toHash:h.toHash},geometry:{type:"LineString",coordinates:[Zt(A),Zt(E)]}})}return{type:"FeatureCollection",features:f}}function Xt(A,e){const t=YA(),r=[];let n=0;for(const o of A){const A=e.get(o.hash);A&&A.blendedScore>n&&(n=A.blendedScore)}for(const o of A){const{from:A,to:i,hash:a,neighbor:s,lastHopData:l}=o,c=`neighbor-${a}`,u=(null==l?void 0:l.avgRssi)??s.rssi??null,d=(null==l?void 0:l.avgSnr)??s.snr??null,f=(null==l?void 0:l.count)??0,g=(null==l?void 0:l.confidence)??1,h=e.get(a),m=(null==h?void 0:h.listenerScore)??0,b=(null==h?void 0:h.loudScore)??0,p=(null==h?void 0:h.blendedScore)??0,v=n>0?p/n:0,y=o.rxAdvertCount??0,w=o.txProxyCount??0,x=y+w,k=x>0?(w-y)/x:0,C=Kt(A,i,150,8);r.push({type:"Feature",properties:{key:c,hash:a,name:s.node_name||s.name||a.slice(0,8),prefix:a.slice(2,4).toUpperCase(),color:t.neighborColor,width:2.5,opacity:.85,rssi:u,snr:d,packetCount:f,confidence:g,hasAvgRssi:void 0!==(null==l?void 0:l.avgRssi),hasAvgSnr:void 0!==(null==l?void 0:l.avgSnr),isNeighborEdge:!0,listenerScore:m,loudScore:b,blendedScore:p,trafficWeight:v,linkAsymmetry:k,rxAdvertCount:y,txProxyCount:w},geometry:{type:"LineString",coordinates:C}})}return{type:"FeatureCollection",features:r}}function $t(A){return A<.5?4*A*A*A:1-Math.pow(-2*A+2,3)/2}function Ar(A,e){if(A<240)return.5;if(A<480)return 1;const t=(A-480)/(e-480);return Math.max(0,.33*(1-t))}function er(A,e,t){const r=t?R(t):null,n=[];for(const o of A){if(r&&o.toUpperCase()===r){t&&n.push(t);continue}const A=e.get(o.toUpperCase());A&&n.push(A)}return n}const tr="edge-blink-source",rr="edge-blink-layer",nr=1e3,or=1e3,ir="node-markers-layer";function ar(A){return A<0||A>=nr?0:1-A/nr}function sr(A){if(A<0)return 0;if(A>=or)return 0;const e=A/or;return Math.pow(1-e,3)}function lr(A){return[A[1],A[0]]}function cr(A){const e=new Date(1e3*A);return`${(e.getMonth()+1).toString().padStart(2,"0")}/${e.getDate().toString().padStart(2,"0")}`}function ur({txDelayRec:t,onRemove:r}){const[n,o]=A.useState(!1),i=t.floodFactor??t.txDelayFactor,a=t.directFactor??t.directTxDelayFactor;return e.jsxs("div",{className:"flex items-center gap-2 text-[10px]",children:[e.jsxs("button",{onClick:async()=>{const A=`set txdelay ${i.toFixed(1)}\nset direct.txdelay ${a.toFixed(1)}`;try{await navigator.clipboard.writeText(A),o(!0),setTimeout(()=>o(!1),1500)}catch(e){const t=document.createElement("textarea");t.value=A,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();try{document.execCommand("copy"),o(!0),setTimeout(()=>o(!1),1500)}catch{}document.body.removeChild(t)}},className:"flex items-center gap-2 flex-1 py-1 px-1.5 bg-amber-400/5 hover:bg-amber-400/10 rounded transition-colors group",title:"Click to copy CLI commands",children:[e.jsx(_A,{className:"w-3 h-3 text-amber-400 shrink-0"}),e.jsx("span",{className:"text-text-muted",children:"TxDelay"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-text-muted",children:"F"}),e.jsxs("span",{className:"data-box data-box-compact text-amber-400",children:["×",i.toFixed(1)]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-text-muted",children:"D"}),e.jsxs("span",{className:"data-box data-box-compact text-amber-400",children:["×",a.toFixed(1)]})]})]}),n?e.jsx(vA,{className:"w-3 h-3 text-green-400 ml-auto"}):e.jsx(yA,{className:"w-3 h-3 text-text-muted opacity-0 group-hover:opacity-100 transition-opacity ml-auto"})]}),r&&e.jsx("button",{onClick:r,className:"p-1 text-text-secondary hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",title:"Remove from contacts",children:e.jsx(W,{className:"w-3.5 h-3.5"})})]})}function dr({hash:t,hashPrefix:r,name:n,isHub:o,isGateway:i,isBackbone:a,isZeroHop:s,isMobile:l,isRoomServer:c,isStale:u,lastSeenTimestamp:d,centrality:f,affinity:g,meanSnr:h,meanRssi:m,neighbor:b,onRemove:p,txDelayRec:v}){const[y,w]=A.useState(!1),x=s?"Direct":(null==g?void 0:g.typicalHopPosition)?`${g.typicalHopPosition}-hop`:null,k=v&&!v.insufficientData;return e.jsxs("div",{className:"w-[240px] pr-2",children:[e.jsx("div",{className:"text-[14px] font-semibold text-text-primary leading-tight truncate mb-1",children:n}),e.jsxs("div",{className:"flex items-center gap-1 flex-wrap mb-1.5",children:[e.jsx("code",{className:"font-mono text-[10px] text-text-secondary bg-data-box-bg border border-data-box-border px-1 py-0.5 rounded",children:r}),e.jsx("button",{onClick:async()=>{try{await navigator.clipboard.writeText(t),w(!0),setTimeout(()=>w(!1),1500)}catch(A){const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select();try{document.execCommand("copy"),w(!0),setTimeout(()=>w(!1),1500)}catch{}document.body.removeChild(e)}},className:"p-0.5 hover:bg-subtle-fill-hover rounded transition-colors",title:"Copy full hash",children:y?e.jsx(vA,{className:"w-3 h-3 text-sys-green"}):e.jsx(yA,{className:"w-3 h-3 text-text-secondary"})}),e.jsx(xA,{hash:t,size:"sm"}),x&&e.jsx(_,{color:s?BA.direct:BA.multihop,compact:!0,children:x}),b.is_repeater&&e.jsx(_,{color:MA.repeater,compact:!0,children:"Rptr"}),o&&e.jsx(_,{color:MA.hub,compact:!0,title:"Hub: ≥10% of last-hop traffic",children:"Hub"}),i&&!o&&e.jsx(_,{color:MA.gateway,compact:!0,title:"Gateway: 7-10% of last-hop traffic",children:"Gate"}),a&&e.jsx(_,{color:MA.backbone,compact:!0,title:"Backbone",children:"Bone"}),l&&e.jsx(_,{color:MA.mobile,compact:!0,children:"Mobile"}),c&&e.jsx(_,{color:MA.room,compact:!0,children:"Room"}),u&&d&&e.jsxs(_,{compact:!0,title:"Neighbor not heard in 7+ days",children:["Idle ",cr(d)]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-[10px] text-text-secondary mb-1.5",children:[e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(F,{className:"w-3 h-3 text-text-muted shrink-0"}),e.jsx("span",{className:"font-mono",children:z(b.last_seen)})]}),(null==g?void 0:g.distanceMeters)&&e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(kA,{className:"w-3 h-3 text-text-muted shrink-0"}),e.jsx("span",{className:"font-mono font-semibold text-text-primary",children:(C=g.distanceMeters,null===C?"—":C<1e3?`${Math.round(C)}m`:`${(C/1e3).toFixed(1)}km`)})]}),b.latitude&&b.longitude&&0!==b.latitude&&0!==b.longitude&&e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(jA,{className:"w-3 h-3 text-text-muted shrink-0"}),e.jsxs("span",{className:"font-mono text-text-muted",children:[b.latitude.toFixed(2),", ",b.longitude.toFixed(2)]})]})]}),e.jsx("div",{className:"mb-1.5",style:{width:224},children:e.jsx(CA,{nodeHash:t,width:224,height:26,showArea:!0,showTooltip:!0})}),e.jsxs("div",{className:"flex gap-3 text-[10px] mb-1.5",children:[e.jsxs("div",{className:"flex-1 space-y-1",children:[e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Packets"}),e.jsx("span",{className:"data-box data-box-compact",children:(null==g?void 0:g.frequency)||0})]}),s&&void 0!==h&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"SNR"}),e.jsxs("span",{className:"data-box data-box-compact",children:[h.toFixed(1)," dB"]})]}),k&&v.networkRole&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Role"}),e.jsx(_,{color:DA[v.networkRole],compact:!0,title:{hub:"Hub: High-connectivity node that bridges many paths",backbone:"Backbone: Critical relay with high traffic",relay:"Relay: Standard forwarding node",edge:"Edge: Peripheral node"}[v.networkRole],children:v.networkRole})]})]}),e.jsxs("div",{className:"flex-1 space-y-1",children:[e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Adverts"}),e.jsx("span",{className:"data-box data-box-compact",children:b.advert_count||0})]}),s&&void 0!==m&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"RSSI"}),e.jsxs("span",{className:"data-box data-box-compact",children:[Math.round(m)," dBm"]})]}),k&&v.dataConfidence&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Data"}),e.jsx(_,{color:EA[v.dataConfidence],compact:!0,title:{high:"1000+ packets",medium:"500-999 packets",low:"100-499 packets",insufficient:"Insufficient data"}[v.dataConfidence],children:v.dataConfidence})]})]}),!k&&p&&e.jsx("button",{onClick:p,className:"p-1 self-start text-text-secondary hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",title:"Remove from contacts",children:e.jsx(W,{className:"w-3.5 h-3.5"})})]}),k&&e.jsx(ur,{txDelayRec:v,onRemove:p})]});var C}const fr="node-markers-native",gr="node-markers-layer",hr="node-markers-layer-local",mr="marker-standard",br="marker-standard-neighbor",pr="marker-hub",vr="marker-hub-neighbor",yr="marker-gateway",wr="marker-gateway-neighbor",xr="marker-mobile",kr="marker-mobile-neighbor",Cr="marker-room-server",Br="marker-room-server-neighbor",Mr="marker-local",Dr="marker-stale-5day",Er="marker-stale-10day",jr="marker-blink-black",Qr="marker-blink-black-local",Nr="marker-blink",Sr="marker-blink-local";function Fr(A){if(!A)return 0;const e=(Date.now()-1e3*A)/864e5;return e>=10?2:e>=5?1:0}function Pr(A){var e;const t=null==(e=A.contact_type)?void 0:e.toLowerCase();return"room server"===t||"room_server"===t||"room"===t||"server"===t}function Tr(A){return A.startsWith("0x")?A.slice(2,4).toUpperCase():A.slice(0,2).toUpperCase()}function Lr({neighborsWithLocation:t,localNode:r,localHash:n,zeroHopNeighbors:l,lastHopNeighborMap:c,meshTopology:u,hoveredMarker:d,onMarkerHover:f,getNodeOpacity:g,shouldShowNode:h,onRequestRemove:m,openPopupId:b,onOpenPopup:p,onClosePopup:v,onNodeClick:y,blinkingNodes:w}){const{current:x}=o(),k=A.useRef(!1),[C,B]=A.useState(!1);A.useEffect(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);if(!e)return;const t=()=>{try{!function(A){const e=AA(),t=(A,e,t=0,r=!1)=>{const n=document.createElement("canvas");n.width=32,n.height=32;const o=n.getContext("2d",r?{colorSpace:"display-p3"}:void 0),i=14-t/2;return o.beginPath(),o.arc(16,16,i,0,2*Math.PI),o.fillStyle=A,o.fill(),e&&t>0&&(o.strokeStyle=e,o.lineWidth=2*t,o.stroke()),o.shadowColor="rgba(0,0,0,0.3)",o.shadowBlur=4,o.shadowOffsetY=2,{data:o.getImageData(0,0,32,32),pixelRatio:2}},r=(A,e=!1)=>{const t=document.createElement("canvas");t.width=48,t.height=48;const r=t.getContext("2d",e?{colorSpace:"display-p3"}:void 0),n=24*.35*2;return r.strokeStyle=A,r.lineWidth=5,r.lineCap="round",r.lineJoin="round",r.beginPath(),r.moveTo(24-n,24),r.lineTo(24,24-n),r.lineTo(40.8,24),r.stroke(),r.beginPath(),r.moveTo(24-.7*n,24),r.lineTo(24-.7*n,35.76),r.lineTo(35.76,35.76),r.lineTo(35.76,24),r.stroke(),r.beginPath(),r.moveTo(20.64,35.76),r.lineTo(20.64,27.36),r.lineTo(27.36,27.36),r.lineTo(27.36,35.76),r.stroke(),{data:r.getImageData(0,0,48,48),pixelRatio:2}},n=(A,e)=>{const t=document.createElement("canvas");t.width=48,t.height=48;const r=t.getContext("2d"),n=24*.35*2;return r.strokeStyle=A,r.lineWidth=5,r.lineCap="round",r.lineJoin="round",e&&(r.fillStyle=e),r.beginPath(),r.roundRect(24-n,24-.6*n,1.6*n,1.2*n,6),e&&r.fill(),r.stroke(),r.beginPath(),r.moveTo(18.96,34.08),r.lineTo(24-.6*n,40.8),r.lineTo(24,34.08),r.stroke(),{data:r.getImageData(0,0,48,48),pixelRatio:2}},o="#00FF00",i={[mr]:t(e.nodeFill),[br]:t(e.neighborColor),[pr]:t(e.hubColor),[vr]:t(e.neighborColor),[yr]:t(e.gatewayColor),[wr]:t(e.neighborColor),[xr]:t("transparent",e.mobileColor,2.5),[kr]:t(e.neighborColor),[Cr]:n(e.roomColor),[Br]:n(e.neighborColor,"#1a1a1c"),[Mr]:r(e.localColor),[Dr]:t("#808080"),[Er]:t("#404040"),[jr]:t("#000000"),[Qr]:r("#000000"),[Nr]:t(o,void 0,0,!0),[Sr]:r(o,!0)};for(const[a,s]of Object.entries(i))try{A.hasImage(a)&&A.removeImage(a),A.addImage(a,s.data,{pixelRatio:s.pixelRatio})}catch{}}(e),k.current=!0,C||B(!0)}catch(A){}};e.isStyleLoaded()?t():e.once("style.load",t);const r=()=>{e.hasImage(mr)||t()};e.on("styledata",r);const n=()=>{k.current=!1,t()},o=new MutationObserver(A=>{for(const e of A)if("data-theme"===e.attributeName){setTimeout(n,100);break}});o.observe(document.documentElement,{attributes:!0});const i=document.querySelector("[data-basemap]");let a=null;return i&&(a=new MutationObserver(A=>{for(const e of A)if("data-basemap"===e.attributeName){setTimeout(n,100);break}}),a.observe(i,{attributes:!0})),()=>{e.off("styledata",r),o.disconnect(),null==a||a.disconnect()}},[x,C]);const M=A.useMemo(()=>{var A;const e=[],r=[...t].sort(([A,e],[t,r])=>{const n=(A,e)=>{var t;return Pr(e)?5e3:l.has(A)?3e3:u.hubNodes.includes(A)?2e3:(null==(t=u.gatewayNodes)?void 0:t.includes(A))?1e3:0};return n(A,e)-n(t,r)});for(const[t,o]of r){if(!o.latitude||!o.longitude)continue;if(n&&((n.startsWith("0x")?n.slice(2,4).toLowerCase():n.slice(0,2).toLowerCase())===(t.startsWith("0x")?t.slice(2,4).toLowerCase():t.slice(0,2).toLowerCase())||t===n))continue;const r=h(t),i=g(t,r);if(i<=.01)continue;const a=l.has(t),s=u.hubNodes.includes(t),d=(null==(A=u.gatewayNodes)?void 0:A.includes(t))??!1,f=u.mobileNodes.includes(t),m=Pr(o),b=u.centrality.get(t)||0,p=c.get(t),v=o.last_seen||(null==p?void 0:p.lastSeen),y=Fr(v),w=y>0;let x=i;2===y?x=Math.min(i,.25):1===y&&(x=Math.min(i,.5));let k="standard";m?k="roomServer":s?k="hub":d?k="gateway":f&&(k="mobile");const C=u.fullAffinity.get(t),B=u.txDelayRecommendations.get(t);e.push({type:"Feature",geometry:{type:"Point",coordinates:[o.longitude,o.latitude]},properties:{hash:t,name:o.node_name||o.name||"Unknown",hashPrefix:Tr(t),iconType:k,isNeighbor:a,isHub:s,isGateway:d,isMobile:f,isRoomServer:m,isStale:w,staleTier:y,isZeroHop:a,opacity:x,blinkIntensity:0,lastSeenTimestamp:v,centrality:b,neighborJson:JSON.stringify(o),affinityJson:C?JSON.stringify(C):void 0,txDelayRecJson:B?JSON.stringify(B):void 0,meanSnr:(null==p?void 0:p.avgSnr)??void 0,meanRssi:(null==p?void 0:p.avgRssi)??void 0}})}return{type:"FeatureCollection",features:e}},[t,n,l,c,u,g,h]),D=A.useMemo(()=>(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude)?{type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"Point",coordinates:[r.longitude,r.latitude]},properties:{hash:"local",name:r.name,hashPrefix:n?Tr(n):"",iconType:"local",isNeighbor:!1,isHub:!1,isGateway:!1,isMobile:!1,isRoomServer:!1,isStale:!1,staleTier:0,isZeroHop:!1,opacity:1,blinkIntensity:0,centrality:0}}]}:{type:"FeatureCollection",features:[]},[r,n]),E=A.useCallback(A=>{var e;if(!A.features||0===A.features.length)return;const t=null==(e=A.features[0].properties)?void 0:e.hash;t&&(p&&p(t),y&&"local"!==t&&y(t))},[p,y]),j=A.useCallback(A=>{var e,t;if(!A.features||0===A.features.length)return;const r=null==(e=null==x?void 0:x.getMap)?void 0:e.call(x);r&&(r.getCanvas().style.cursor="pointer");const n=null==(t=A.features[0].properties)?void 0:t.hash;n&&f(n)},[x,f]),Q=A.useCallback(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);e&&(e.getCanvas().style.cursor=""),f(null)},[x,f]);A.useEffect(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);if(!e||!C)return;const t=[gr,hr];for(const r of t)e.on("click",r,E),e.on("mouseenter",r,j),e.on("mouseleave",r,Q);return()=>{for(const A of t)e.off("click",A,E),e.off("mouseenter",A,j),e.off("mouseleave",A,Q)}},[x,C,E,j,Q]);const N=A.useRef(M),S=A.useRef(D);A.useEffect(()=>{N.current=M,S.current=D},[M,D]),A.useEffect(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);if(!e||!C||!w||0===w.size)return;const t=e.getSource(fr),r=e.getSource(`${fr}-local`);if(t||r){if(t){const A=N.current;let e=!1;const r=A.features.map(A=>{const t=w.get(A.properties.hash)??0;return t!==A.properties.blinkIntensity?(e=!0,{...A,properties:{...A.properties,blinkIntensity:t}}):A});e&&t.setData({type:"FeatureCollection",features:r})}if(r&&n){const A=w.get(n)??0,e=S.current;e.features.length>0&&e.features[0].properties.blinkIntensity!==A&&r.setData({type:"FeatureCollection",features:[{...e.features[0],properties:{...e.features[0].properties,blinkIntensity:A}}]})}}},[x,C,w,n]);const F=A.useMemo(()=>{if(!b)return null;if("local"===b&&r)return{longitude:r.longitude,latitude:r.latitude,isLocal:!0,name:r.name,hash:n};const A=M.features.find(A=>A.properties.hash===b);if(!A)return null;const e=A.properties,t=e.txDelayRecJson?JSON.parse(e.txDelayRecJson):void 0;return{longitude:A.geometry.coordinates[0],latitude:A.geometry.coordinates[1],isLocal:!1,hash:e.hash,hashPrefix:e.hashPrefix,name:e.name,isHub:e.isHub,isGateway:e.isGateway,isBackbone:"backbone"===(null==t?void 0:t.networkRole),isZeroHop:e.isZeroHop,isMobile:e.isMobile,isRoomServer:e.isRoomServer,isStale:e.isStale,lastSeenTimestamp:e.lastSeenTimestamp,centrality:e.centrality,neighbor:e.neighborJson?JSON.parse(e.neighborJson):void 0,affinity:e.affinityJson?JSON.parse(e.affinityJson):void 0,txDelayRec:t,meanSnr:e.meanSnr,meanRssi:e.meanRssi}},[b,r,n,M]);if(!C)return null;const P=AA(),T=["case",[">",["get","blinkIntensity"],.66],Nr,[">",["get","blinkIntensity"],.33],jr,["==",["get","staleTier"],2],Er,["==",["get","staleTier"],1],Dr,["==",["get","iconType"],"roomServer"],["case",["get","isNeighbor"],Br,Cr],["==",["get","iconType"],"hub"],["case",["get","isNeighbor"],vr,pr],["==",["get","iconType"],"gateway"],["case",["get","isNeighbor"],wr,yr],["==",["get","iconType"],"mobile"],["case",["get","isNeighbor"],kr,xr],["case",["get","isNeighbor"],br,mr]],L=["interpolate",["linear"],["zoom"],6,.25,10,1];return e.jsxs(e.Fragment,{children:[e.jsx(i,{id:fr,type:"geojson",data:M,children:e.jsx(a,{id:gr,type:"symbol",layout:{"icon-image":T,"icon-size":L,"icon-allow-overlap":!0,"icon-ignore-placement":!0,"symbol-sort-key":["get","opacity"]},paint:{"icon-opacity":["get","opacity"]}})}),e.jsx(i,{id:`${fr}-local`,type:"geojson",data:D,children:e.jsx(a,{id:hr,type:"symbol",layout:{"icon-image":["case",[">",["get","blinkIntensity"],.66],Sr,[">",["get","blinkIntensity"],.33],Qr,Mr],"icon-size":L,"icon-allow-overlap":!0,"icon-ignore-placement":!0},paint:{"icon-opacity":1}})}),F&&v&&e.jsx(s,{longitude:F.longitude,latitude:F.latitude,offset:{center:[0,0],top:[0,12],"top-left":[6,12],"top-right":[-6,12],bottom:[0,-12],"bottom-left":[6,-12],"bottom-right":[-6,-12],left:[12,0],right:[-12,0]},maxWidth:"280px",closeOnClick:!0,onClose:v,className:"maplibre-popup",children:F.isLocal?e.jsxs("div",{className:"text-sm",children:[e.jsx("strong",{className:"text-base",children:F.name}),F.hash&&e.jsx("span",{className:"ml-2 font-mono text-xs text-text-muted surface-badge px-1.5 py-0.5 rounded",children:Tr(F.hash)}),e.jsx("br",{}),e.jsx("span",{style:{color:P.localColor},className:"font-medium",children:"This Node (Local)"}),e.jsx("br",{}),r&&e.jsxs("span",{className:"text-xs text-text-muted",children:[r.latitude.toFixed(5),", ",r.longitude.toFixed(5)]})]}):F.neighbor&&F.hash?e.jsx(dr,{hash:F.hash,hashPrefix:F.hashPrefix,name:F.name,isHub:F.isHub,isGateway:F.isGateway,isBackbone:F.isBackbone,isZeroHop:F.isZeroHop,isMobile:F.isMobile,isRoomServer:F.isRoomServer,isStale:F.isStale,lastSeenTimestamp:F.lastSeenTimestamp,centrality:F.centrality,affinity:F.affinity,meanSnr:F.meanSnr,meanRssi:F.meanRssi,neighbor:F.neighbor,txDelayRec:F.txDelayRec,onRemove:m?()=>m(F.hash,F.name):void 0}):null})]})}const Rr=[gr,hr];A.createContext(null);const Ir="topology-validated-edges-native",_r="topology-weak-edges-native",zr="neighbor-edges-native",Hr="topology-weak-edges-native",Gr="topology-validated-edges-native",Or="neighbor-edges-native",Ur={type:"FeatureCollection",features:[]},Yr={"line-cap":"round","line-join":"round"},Vr={"line-color":"transparent","line-width":16,"line-opacity":0};function Wr({showTopology:t,isExiting:r,hoveredEdgeKey:n,highlightedLoopEdges:s,highlightedFocusEdges:l,onEdgeHover:c,onLoopHover:u,loops:d=[],neighborNames:g={},opacityBias:h=.5,widthMultiplier:m=1,trafficFilter:b=0,showNeighborLines:p=!0,disableHover:v=!1}){const{current:y}=o(),w=t||r,x=!0,k=p?"visible":"none",C=v||r,B=A.useRef(null),M=A.useRef(C),D=A.useRef(new Map),E=A.useRef(g),j=A.useRef(u);A.useLayoutEffect(()=>{M.current=C,E.current=g,j.current=u});const Q=A.useMemo(()=>function(A){const e=new Map;for(const t of A)for(const A of t.edgeKeys){const r=e.get(A)??[];r.push(t),e.set(A,r)}return e}(d),[d]);A.useLayoutEffect(()=>{D.current=Q},[Q]);const N=A.useCallback(A=>{var e,t;if(M.current)return;if(!A.features||0===A.features.length)return;const r=A.features[0].properties;if(!(null==r?void 0:r.key))return;const n=r.key;if(n!==B.current){B.current=n;const o=!0===r.isNeighborEdge||"true"===r.isNeighborEdge,i=!0===r.isLoopEdge||"true"===r.isLoopEdge;if(o){const t={key:n,fromName:"Local",toName:r.name,certainCount:Number(r.packetCount)||0,confidence:1,isBackbone:!1,isLoopEdge:!1,isDirectPath:!0,isZeroHop:!0,symmetryRatio:1,dominantDirection:"balanced",isHubConnection:!1};c(n,[A.lngLat.lng,A.lngLat.lat],t),null==(e=j.current)||e.call(j,null)}else if(i&&j.current){const e=D.current.get(n)??[];if(e.length>0){const t=new Set;for(const A of e)for(const e of A.edgeKeys)t.add(e);const r={loops:e,highlightedEdgeKeys:t,hoveredEdgeKey:n,nodeNames:e[0].nodes.map(A=>E.current[A]||A.substring(0,4))};j.current(r,[A.lngLat.lng,A.lngLat.lat]),c(n)}else{const e={key:n,fromName:r.fromName,toName:r.toName,certainCount:Number(r.certainCount),confidence:Number(r.confidence),isBackbone:!0===r.isBackbone||"true"===r.isBackbone,isLoopEdge:!0,isDirectPath:!0===r.isDirectPath||"true"===r.isDirectPath,isZeroHop:!0===r.isZeroHop||"true"===r.isZeroHop,symmetryRatio:Number(r.symmetryRatio),dominantDirection:r.dominantDirection,isHubConnection:!0===r.isHubConnection||"true"===r.isHubConnection};c(n,[A.lngLat.lng,A.lngLat.lat],e)}}else{const e={key:n,fromName:r.fromName,toName:r.toName,certainCount:Number(r.certainCount),confidence:Number(r.confidence),isBackbone:!0===r.isBackbone||"true"===r.isBackbone,isLoopEdge:i,isDirectPath:!0===r.isDirectPath||"true"===r.isDirectPath,isZeroHop:!0===r.isZeroHop||"true"===r.isZeroHop,symmetryRatio:Number(r.symmetryRatio),dominantDirection:r.dominantDirection,isHubConnection:!0===r.isHubConnection||"true"===r.isHubConnection};c(n,[A.lngLat.lng,A.lngLat.lat],e),null==(t=j.current)||t.call(j,null)}}},[c]),S=A.useCallback(()=>{var A;null!==B.current&&(B.current=null,c(null),null==(A=j.current)||A.call(j,null))},[c]);A.useEffect(()=>{var A;const e=null==(A=null==y?void 0:y.getMap)?void 0:A.call(y);if(!e||!w)return;const t="topology-validated-edges-hitarea-native",r=()=>{try{return e.getStyle()&&e.getLayer(t)}catch{return!1}},n=()=>!!r()&&(e.on("mousemove",t,N),e.on("mouseleave",t,S),!0);if(!n()){const A=()=>{n()&&e.off("styledata",A)};return e.on("styledata",A),()=>{try{e.off("styledata",A),r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}}return()=>{try{r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}},[y,w,N,S]),A.useEffect(()=>{var A;const e=null==(A=null==y?void 0:y.getMap)?void 0:A.call(y);if(!e||!p)return;const t="neighbor-edges-hitarea-native",r=()=>{try{return e.getStyle()&&e.getLayer(t)}catch{return!1}},n=()=>!!r()&&(e.on("mousemove",t,N),e.on("mouseleave",t,S),!0);if(!n()){const A=()=>{n()&&e.off("styledata",A)};return e.on("styledata",A),()=>{try{e.off("styledata",A),r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}}return()=>{try{r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}},[y,x,p,N,S]),A.useEffect(()=>{var A;const e=null==(A=null==y?void 0:y.getMap)?void 0:A.call(y);if(!e)return;let t=null;const r=(A,t)=>{try{if(e.getLayer(A)&&e.getLayer(t))return e.moveLayer(A,t),!0}catch{}return!1},n=()=>{try{if(!e.getLayer("node-markers-layer"))return;r(Or,"node-markers-layer"),r("neighbor-edges-hitarea-native",Or),(r(Gr,"neighbor-edges-hitarea-native")||r(Gr,"node-markers-layer"))&&r("topology-validated-edges-hitarea-native",Gr),r(Hr,"topology-validated-edges-hitarea-native")}catch{}},o=()=>{t&&clearTimeout(t),t=setTimeout(n,50)},i=setTimeout(n,100);e.on("styledata",o);const a=A=>{(A.sourceId===Ir||A.sourceId===_r||A.sourceId===zr)&&o()};return e.on("sourcedata",a),()=>{clearTimeout(i),t&&clearTimeout(t);try{e.off("styledata",o),e.off("sourcedata",a)}catch{}}},[y,w,x,p]);const F=C?null:n,P=function(A,e,t,r,n,o){const i=YA(),a=null!==A,s=n&&n.size>0,l=o&&o.size>0,c=s?Array.from(n):[],u=l?Array.from(o):[],d=e<=0?["get","baseColor"]:["case",[">=",["get","brightnessScore"],1-.5*e],"#FFFFFF",["get","baseColor"]],f=e<=0?1:["max",.1,["+",1,["*",e,3,["-",["get","brightnessScore"],.5]]]],g=s?["in",["get","key"],["literal",c]]:l?["in",["get","key"],["literal",u]]:!!a&&["==",["get","key"],A],h=a||s||l,m=i.edges.hoverLoop??"#A78BFA";return{"line-color":h?["case",g,s?m:l?"#FFD700":["get","hoverColor"],d]:d,"line-width":h?["case",g,["max",["*",["get","baseWidth"],t,1.3],3.5],["*",["get","baseWidth"],t]]:["*",["get","baseWidth"],t],"line-opacity":["case",["<",["get","brightnessScore"],r],0,h?["case",g,["min",["*",["get","baseOpacity"],1.25],1],["*",["get","baseOpacity"],f,.35]]:["*",["get","baseOpacity"],f]]}}(F,h,m,b,C?null:s,l??null),T=function(A){const e=null!==A,{YELLOW:t,GREEN:r,RED:n,GRAY:o}=f,i=["to-number",["get","listenerScore"],0],a=["to-number",["get","loudScore"],0],s=["/",i,["max",["+",i,a],1]],l=["*",["+",.2,["*",["to-number",["get","trafficWeight"],0],.8]],8];return{"line-color":["case",["all",["==",i,0],["==",a,0]],o,[">=",s,.97],r,["<=",s,.03],n,["interpolate",["linear"],s,.03,n,.5,t,.97,r]],"line-width":["interpolate",["linear"],["zoom"],6,e?["case",["==",["get","key"],A],["max",["*",l,.25],1.25],["*",l,.25]]:["*",l,.25],10,e?["case",["==",["get","key"],A],["max",l,5],l]:l],"line-opacity":e?["case",["==",["get","key"],A],1,.35]:.9}}(F);return e.jsxs(e.Fragment,{children:[w&&e.jsx(i,{id:_r,type:"geojson",data:Ur,children:e.jsx(a,{id:Hr,type:"line",paint:P,layout:{...Yr,visibility:k}})}),w&&e.jsxs(i,{id:Ir,type:"geojson",data:Ur,children:[e.jsx(a,{id:"topology-validated-edges-hitarea-native",type:"line",paint:Vr,layout:{...Yr,visibility:k}}),e.jsx(a,{id:Gr,type:"line",paint:P,layout:{...Yr,visibility:k}})]}),e.jsxs(i,{id:zr,type:"geojson",data:Ur,children:[e.jsx(a,{id:"neighbor-edges-hitarea-native",type:"line",paint:Vr,layout:{...Yr,visibility:k}}),e.jsx(a,{id:Or,type:"line",paint:T,layout:{...Yr,visibility:k}})]})]})}const Zr=["topology-validated-edges-hitarea-native","topology-validated-edges-native","topology-weak-edges-native","neighbor-edges-hitarea-native","neighbor-edges-native"];function Kr({targetHash:e,nodeCoordinates:t,onComplete:r}){const{current:n}=o(),i=A.useRef(null);return A.useEffect(()=>{if(!n||!e||e===i.current)return;const A=t.get(e);if(!A)return;const o=n.getMap();o.isMoving()&&o.stop(),i.current=e;const[a,s]=A;n.flyTo({center:[s,a],zoom:10,duration:2500,essential:!0}),setTimeout(()=>{null==r||r()},2600)},[e,t,n,r]),null}function Jr({highlightedEdgeKey:e,validatedPolylines:t,weakPolylines:r,onEnsureTopology:n}){const{current:i}=o(),a=A.useRef(null);return A.useEffect(()=>{if(!i||!e)return;if(e===a.current)return;a.current=e,n();const A=t.find(A=>A.edge.key===e)||r.find(A=>A.edge.key===e);if(!A)return;if(i.getMap().isMoving())return;const o=(A.from[0]+A.to[0])/2,s=(A.from[1]+A.to[1])/2,l=i.getZoom(),c=Math.max(l,11);i.easeTo({center:[s,o],zoom:c,duration:500})},[e,t,r,i,n]),null}function qr(A,e,t,r=64){const n=[],o=t/6371e3*(180/Math.PI),i=o/Math.cos(e*Math.PI/180);for(let a=0;a<=r;a++){const t=a/r*2*Math.PI,s=A+i*Math.cos(t),l=e+o*Math.sin(t);n.push([s,l])}return{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[n]}}}function Xr({ghost:t,neighborCoordinates:r,onHighlightedNeighborsChange:n}){const{current:s}=o(),l=A.useRef(null),c=A.useRef(null),u=A.useMemo(()=>t?new Set(t.commonNeighbors):new Set,[t]);A.useEffect(()=>{null==n||n(u)},[u,n]);const d=A.useMemo(()=>{if(!(null==t?void 0:t.commonNeighbors)||t.commonNeighbors.length<2)return 8e3;let A=0;const e=[];for(const n of t.commonNeighbors){const A=r.get(n);A&&e.push(A)}t.estimatedLocation&&e.push([t.estimatedLocation.lat,t.estimatedLocation.lon]);for(let t=0;tA&&(A=n)}return Math.max(A,2e3)},[t,r]),f=A.useMemo(()=>{if(!(null==t?void 0:t.estimatedLocation))return{type:"FeatureCollection",features:[]};const{lat:A,lon:e,uncertaintyM:r}=t.estimatedLocation,n=.5*d,o=r>0?r:2e3;return{type:"FeatureCollection",features:[qr(e,A,Math.max(500,Math.min(o,n)))]}},[t,d]);if(A.useEffect(()=>{if(!s)return;const A=s.getMap();if(t&&t.prefix!==c.current){if(c.current=t.prefix,!l.current&&A.getZoom()>3){const e=A.getCenter();l.current={center:[e.lng,e.lat],zoom:A.getZoom(),pitch:A.getPitch(),bearing:A.getBearing()}}const e=[];for(const A of t.commonNeighbors){const t=r.get(A);t&&e.push([t[1],t[0]])}if(t.estimatedLocation&&e.push([t.estimatedLocation.lon,t.estimatedLocation.lat]),e.length>0){const r=()=>{var n;if(A.isMoving())setTimeout(r,100);else if(1===e.length)s.flyTo({center:e[0],zoom:13,duration:1500});else{let A=1/0,r=-1/0,o=1/0,i=-1/0;for(const[t,n]of e)A=Math.min(A,t),r=Math.max(r,t),o=Math.min(o,n),i=Math.max(i,n);if(null==(n=t.estimatedLocation)?void 0:n.uncertaintyM){const e=t.estimatedLocation.uncertaintyM/111e3;A-=e,r+=e,o-=e,i+=e}s.fitBounds([[A,o],[r,i]],{padding:{top:60,bottom:60,left:60,right:60},maxZoom:14,duration:1500})}};setTimeout(r,50)}}if(!t&&null!==c.current&&(c.current=null,l.current)){const e=l.current,t=()=>{A.isMoving()?setTimeout(t,100):(s.flyTo({center:e.center,zoom:e.zoom,pitch:e.pitch,bearing:e.bearing,duration:1e3}),l.current=null)};setTimeout(t,50)}},[t,s,r]),!(null==t?void 0:t.estimatedLocation))return null;return e.jsx(i,{id:"ghost-uncertainty-circle",type:"geojson",data:f,children:e.jsx(a,{id:"ghost-uncertainty-fill",type:"fill",paint:{"fill-color":"rgba(167, 139, 250, 0.15)","fill-opacity":.8}})})}!function(A){const e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(A);e&&(parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16))}(UA.edges.neighborHover);const $r={version:8,sources:{},layers:[],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},An={longitude:0,latitude:0,zoom:2};function en({data:A}){const t=A.subtitle&&"loop"===A.type,r=A.subtitle&&"loop"!==A.type;return e.jsxs("div",{className:"w-[540px]",children:[e.jsxs("div",{className:"flex items-center justify-between h-5",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[A.title.icon&&e.jsx("span",{className:`${A.title.color} text-base leading-none flex-shrink-0`,children:A.title.icon}),e.jsx("span",{className:`${A.title.color} font-semibold text-[13px] truncate`,children:A.title.text}),r&&e.jsx("span",{className:`${A.subtitle.color} text-[11px] flex-shrink-0`,children:A.subtitle.text})]}),A.badges.length>0&&e.jsx("div",{className:"flex items-center gap-2 flex-shrink-0 ml-3",children:A.badges.map((A,t)=>e.jsx("span",{className:`${A.color} text-[11px] font-medium`,children:A.text},t))})]}),t&&e.jsx("div",{className:"h-4 mt-0.5 overflow-hidden",children:e.jsx("span",{className:"font-mono text-[10px] text-text-muted truncate block",children:A.subtitle.text})}),e.jsx("div",{className:`flex items-center gap-4 h-4 ${t?"mt-1":"mt-1.5"} text-[11px]`,children:A.stats.map((A,t)=>e.jsxs("span",{className:"whitespace-nowrap",children:[e.jsx("span",{className:`font-mono tabular-nums font-semibold ${A.color??"text-text-primary"}`,children:A.value}),e.jsx("span",{className:"text-text-muted ml-1",children:A.label}),A.unit&&e.jsx("span",{className:"text-text-muted/50 ml-0.5",children:A.unit})]},t))})]})}function tn({neighbors:t,localNode:r,localHash:o,onRemoveNode:i,selectedNodeHash:a,onNodeSelected:s,highlightedEdgeKey:f,highlightedGhost:g}){const h=A.useRef(null),b=H(),p=G(),v=O(),y=U(),[w,x]=A.useState(!1),k=Vt(A=>A.viewState),C=Vt(A=>A.toggles),B=Vt(A=>A.hasAnalyzed),M=Vt(A=>A.setViewState),D=Vt(A=>A.setToggle),E=Vt(A=>A.setHasAnalyzed),j=Y(A=>A.preloadFromNodes),Q=Y(A=>A.isLoading),N=Y(A=>A.terrainGrid),S=o??y,F=A.useMemo(()=>{const A=[];for(const[,e]of Object.entries(t))e.latitude&&e.longitude&&A.push([e.latitude,e.longitude]);return A},[t]),_=A.useMemo(()=>function(A,e){let t=[...A];if((null==e?void 0:e.latitude)&&(null==e?void 0:e.longitude)&&t.push([e.latitude,e.longitude]),0===t.length)return null;if(1===t.length){const[A,e]=t[0];return{longitude:e,latitude:A,zoom:14}}t=function(A,e){if(A.length<=2)return A;let t,r;if((null==e?void 0:e.latitude)&&(null==e?void 0:e.longitude))t=e.latitude,r=e.longitude;else{let e=0,n=0;for(const[t,r]of A)e+=t,n+=r;t=e/A.length,r=n/A.length}const n=A.map(([A,e])=>{return{pos:[A,e],dist:(n=t,o=r,i=A,a=e,GA(n,o,i,a)/1e3)};var n,o,i,a});n.sort((A,e)=>A.dist-e.dist);const o=n[Math.floor(n.length/2)].dist,i=Math.max(3*o,50),a=n.filter(A=>A.dist<=i).map(A=>A.pos);return a.length<.5*A.length?A:a}(t,e);let r=1/0,n=-1/0,o=1/0,i=-1/0;for(const[f,g]of t)r=Math.min(r,g),n=Math.max(n,g),o=Math.min(o,f),i=Math.max(i,f);const a=(r+n)/2,s=(o+i)/2,l=i-o,c=n-r,u=Math.max(l,c);let d=16;return u>0&&(d=Math.floor(Math.log2(360/u*1.2)),d=Math.max(1,Math.min(14,d))),d=Math.min(d+1,12),{longitude:a,latitude:s,zoom:d}}(F,r),[F,r]),[z,V]=A.useState(()=>k??_??An),W=A.useCallback(A=>{V(A),queueMicrotask(()=>M(A))},[M]),K=A.useRef(!!k);A.useEffect(()=>{K.current||!_||k?k&&setTimeout(()=>x(!0),50):(V(_),queueMicrotask(()=>M(_)),K.current=!0,setTimeout(()=>x(!0),50))},[_,k,M]);const[J,q]=A.useState(!1),[X,AA]=A.useState(()=>!(C.showTopology&&!v.topologyLoadComplete)&&C.showTopology),[eA,tA]=A.useState(C.showNeighborLines),[rA,nA]=A.useState(!1),[oA,iA]=A.useState(C.showMinCut),[aA,sA]=A.useState(_e),[lA,cA]=A.useState(C.show3DTerrain),[uA,dA]=A.useState(C.nodeFilter),fA=A.useCallback(A=>{AA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("showTopology",t)),t})},[D]),gA=A.useCallback(A=>{tA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("showNeighborLines",t)),t})},[D]),hA=A.useCallback(A=>{iA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("showMinCut",t)),t})},[D]),mA=A.useCallback(A=>{cA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("show3DTerrain",t)),t})},[D]),bA=A.useCallback(A=>{dA(A),queueMicrotask(()=>D("nodeFilter",A))},[D]),[pA,vA]=A.useState(null),[yA,wA]=A.useState(null),[xA,kA]=A.useState(null),[CA]=A.useState(0),[BA]=A.useState(.5),[MA]=A.useState(0),[DA,EA]=A.useState(null),[jA,QA]=A.useState(""),[NA,SA]=A.useState(!1),[FA,PA]=A.useState(!1),[TA,LA]=A.useState(()=>!(B&&!v.topologyLoadComplete)&&B);A.useEffect(()=>{if(v.topologyLoadComplete)return;const A=B&&!TA,e=C.showTopology&&!X;(A||e)&&queueMicrotask(()=>{A&&E(!1),e&&D("showTopology",!1)})},[B,C.showTopology,v.topologyLoadComplete,TA,X,E,D]);const RA=A.useCallback(A=>{LA(A),queueMicrotask(()=>E(A))},[E]),[IA,_A]=A.useState(null),zA=A.useCallback(A=>_A(A),[]),HA=A.useCallback(()=>_A(null),[]),[,UA]=A.useState(new Set),YA=Ce(A=>A.coveragePoints),WA=Ce(A=>A.isVisible),ZA=Ce(A=>A.brightness),KA=Ce(A=>A.openModal),JA=Ze(A=>A.isEnabled),qA=Ze(A=>A.toggle),XA=n(),$A=l(),Ae=A.useRef(!1);A.useEffect(()=>{YA.length>0&&WA&&!Ae.current&&(gA(!1),Ae.current=!0)},[YA.length,WA]);const ee=A.useRef(null);A.useEffect(()=>{if(a&&a!==ee.current){ee.current=a;const A=setTimeout(()=>{_A(a)},1250);return()=>clearTimeout(A)}},[a]);const[te,re]=A.useState(null),[ne,ae]=A.useState(null),se=A.useCallback((A,e,t)=>{wA(A),A&&e&&t?re({longitude:e[0],latitude:e[1],type:"topology",properties:{key:t.key,fromName:t.fromName,toName:t.toName,certainCount:t.certainCount,confidence:t.confidence,isBackbone:t.isBackbone,isLoopEdge:t.isLoopEdge,isDirectPath:t.isDirectPath,isHubConnection:t.isHubConnection,symmetryRatio:t.symmetryRatio,dominantDirection:t.dominantDirection}}):A||re(null)},[]),ue=A.useCallback((A,e)=>{ae(A),A&&re(null)},[]),de=A.useMemo(()=>{var A;if(!X)return null;if(!pA)return null;if(yA)return null;const e=b.loops;if(0===e.length)return null;const r=function(A,e,t){const r=function(A,e){return e.filter(e=>e.nodes.includes(A)).sort((A,e)=>e.avgCertainCount-A.avgCertainCount)}(A,e),n=new Set,o=[];for(const i of r)for(const A of i.edgeKeys)if(!n.has(A)){n.add(A);const e=t.get(A);o.push({key:A,certainCount:(null==e?void 0:e.certainCount)??0})}return o.sort((A,e)=>e.certainCount-A.certainCount),{loops:r,highlightedEdgeKeys:n,sortedEdges:o}}(pA,e,b.edgeMap);if(0===r.loops.length)return null;const n=r.loops[0].nodes.map(A=>{var e,r;return A===S?"You":(null==(e=t[A])?void 0:e.node_name)||(null==(r=t[A])?void 0:r.name)||A.substring(0,4)});return{loops:r.loops,highlightedEdgeKeys:r.highlightedEdgeKeys,hoveredEdgeKey:(null==(A=r.sortedEdges[0])?void 0:A.key)||"",nodeNames:n}},[X,pA,yA,b.loops,b.edgeMap,t,S]);A.useEffect(()=>{yA||ae(de)},[de,yA]);const fe=A.useMemo(()=>{const A={};for(const[e,r]of Object.entries(t))A[e]=r.node_name||r.name||e.substring(0,4);return S&&(A[S]="You"),A},[t,S]),he=A.useMemo(()=>Object.entries(t).filter(([,A])=>A.latitude&&A.longitude),[t]),me=A.useMemo(()=>{const A=new Map;S&&(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude)&&A.set(S,[r.latitude,r.longitude]);for(const[e,t]of he)t.latitude&&t.longitude&&A.set(e,[t.latitude,t.longitude]);return A},[S,r,he]),be=A.useMemo(()=>{const A=new Map;for(const e of p)"expired"!==e.status&&A.set(e.hash,{hash:e.hash,prefix:e.prefix,count:e.count,avgRssi:e.avgRssi,avgSnr:e.avgSnr,lastSeen:e.lastSeen,confidence:1,status:e.status});return A},[p]),pe=A.useMemo(()=>{var A,e;const r=new Set;for(const n of be.keys())(null==(A=t[n])?void 0:A.latitude)&&(null==(e=t[n])?void 0:e.longitude)&&r.add(n);return r},[be,t]),ve=A.useMemo(()=>{if(0===pe.size||!S)return new Map;const A=T.getPackets();if(0===A.length)return new Map;const e=R(S);return m(A,pe,e).scores},[pe,S,v.packetCount]),ye=A.useCallback(A=>!!(S&&(A.fromHash===S&&pe.has(A.toHash)||A.toHash===S&&pe.has(A.fromHash))),[S,pe]),we=A.useMemo(()=>{var A,e;if(0===p.length||!S)return[];if(v.backgroundLoadComplete)return[];const r=[];for(const n of p){if("expired"===n.status)continue;if(!(null==(A=t[n.hash])?void 0:A.latitude)||!(null==(e=t[n.hash])?void 0:e.longitude))continue;const o=[S,n.hash].sort(),i=`${o[0]}~${o[1]}`;r.push({fromHash:S,toHash:n.hash,key:i,packetCount:n.count,avgConfidence:1,strength:.8,avgRecency:1,hopDistanceFromLocal:0,isHubConnection:!1,isCertain:!0,certainCount:n.count,isLoopEdge:!1,forwardCount:n.count,reverseCount:0,symmetryRatio:0,dominantDirection:"forward",floodCount:n.count,directCount:0,isDirectPathEdge:!1,isZeroHop:!0,avgRssi:n.avgRssi,avgSnr:n.avgSnr})}return r},[p,S,v.backgroundLoadComplete,t]),xe=A.useMemo(()=>{const A=[];if(we.length>0&&!v.backgroundLoadComplete){for(const e of we){const t=me.get(e.fromHash),r=me.get(e.toHash);t&&r&&A.push({from:t,to:r,edge:e})}return A}for(const e of b.validatedEdges){if(ye(e))continue;const t=me.get(e.fromHash),r=me.get(e.toHash);t&&r&&A.push({from:t,to:r,edge:e})}return A},[b.validatedEdges,me,ye,we,v.backgroundLoadComplete]),ke=A.useMemo(()=>{const A=[];for(const e of b.weakEdges){if(ye(e))continue;const t=me.get(e.fromHash),r=me.get(e.toHash);t&&r&&A.push({from:t,to:r,edge:e})}return A},[b.weakEdges,me,ye]),Be=A.useMemo(()=>{if(!(null==r?void 0:r.latitude)||!(null==r?void 0:r.longitude))return[];const A=[],e=[r.latitude,r.longitude],n=new Map;for(const t of b.lastHopNeighbors)n.set(t.hash,t.count);const o=new Map;for(const t of p)o.set(t.hash,t.count);for(const r of pe){const i=t[r];if(!(null==i?void 0:i.latitude)||!(null==i?void 0:i.longitude))continue;const a=o.get(r),s=n.get(r);A.push({from:e,to:[i.latitude,i.longitude],hash:r,neighbor:i,lastHopData:be.get(r)??null,rxAdvertCount:a,txProxyCount:s})}return A},[r,pe,t,be,b.lastHopNeighbors,p]),Me=A.useMemo(()=>new Set(b.loopEdgeKeys),[b.loopEdgeKeys]),De=A.useMemo(()=>new Set(b.backboneEdges),[b.backboneEdges]),Ee=A.useMemo(()=>{if(!xA)return null;const A=b.validatedEdges.filter(A=>A.fromHash===xA||A.toHash===xA);if(0===A.length)return null;const e=[...A].sort((A,e)=>e.certainCount-A.certainCount),t=Math.max(1,Math.ceil(.2*e.length)),r=e.slice(0,t);return new Set(r.map(A=>A.key))},[xA,b.validatedEdges]),je=A.useMemo(()=>{let A=0;if(we.length>0&&!v.backgroundLoadComplete){for(const e of we)e.certainCount>A&&(A=e.certainCount);return A||1}for(const e of b.validatedEdges)e.certainCount>A&&(A=e.certainCount);return A||1},[b.validatedEdges,we,v.backgroundLoadComplete]),Qe=A.useMemo(()=>{if(0===b.validatedEdges.length)return null;const A=new Set;for(const r of b.validatedEdges)A.add(r.fromHash),A.add(r.toHash);const e=Array.from(A).filter(A=>me.has(A)).sort();if(e.length<3)return null;const t=new Map;for(const r of e){const A=me.get(r);A&&t.set(r,A)}return function(A,e,t,r){const n=e.length;if(n<3)return{communities:new Map([[0,e]]),nodePartitions:e.map(A=>({hash:A,community:0,fiedlerValue:0})),numCommunities:1,fiedlerValue:0,isConnected:n<=1};const o=[];let i=1/0;const a=[[e,0]];for(;a.length>0;){const[e,n]=a.shift();if((t?St(e,t):0)>20&&n<4&&e.length>=10){const o=Ft(A,e,t,r);if(o){i=Math.min(i,o.fiedlerValue),a.push([o.group0,n+1]),a.push([o.group1,n+1]);continue}}o.push(e)}const s=new Map,l=[],c=new Map;for(let u=0;u{hA(A=>{const e=!A;if(e&&Qe&&h.current){const A=h.current.getMap();if(!A)return e;let t=1/0,r=-1/0,n=1/0,o=-1/0,i=!1;for(const[,e]of Qe.communities)for(const A of e){const e=me.get(A);if(e){const[A,a]=e;n=Math.min(n,A),o=Math.max(o,A),t=Math.min(t,a),r=Math.max(r,a),i=!0}}i&&A.fitBounds([[t,n],[r,o]],{padding:{top:60,bottom:100,left:60,right:320},duration:800,maxZoom:14})}return e})},[Qe,me]),Se=A.useRef(null);A.useLayoutEffect(()=>{var A,e;Se.current=(null==(e=null==(A=h.current)?void 0:A.getMap)?void 0:e.call(A))??null});const Fe=P(),Pe=A.useMemo(()=>T.getPackets(),[Fe]);!function({map:e,nodeCoordinates:t,packets:r,localHash:n,neighbors:o,meshTopology:i,enabled:a=!0}){const s=A.useRef(null),l=e&&"current"in e?e.current:e;A.useEffect(()=>{s.current=l},[l]);const c=A.useRef(!1),u=A.useRef(null),d=A.useRef([]),f=A.useRef(0),g=A.useRef(!1),[h,m]=A.useState(!1),b=A.useRef(null),p=A.useRef([]),v=A.useRef(new Map),y=A.useRef(t);A.useEffect(()=>{y.current=t},[t]),A.useEffect(()=>{v.current=function(A,e){const t=new Map;for(const r of Object.keys(A)){const A=R(r);t.has(A)||t.set(A,r)}if(e){const A=R(e);t.set(A,e)}return t}(o,n)},[o,n]),A.useEffect(()=>{if(!a){b.current&&(clearTimeout(b.current),b.current=null),p.current=[],null!==u.current&&(cancelAnimationFrame(u.current),u.current=null),d.current=[];const A=s.current;if(A&&c.current){const e=A.getSource(tr);e&&e.setData({type:"FeatureCollection",features:[]})}g.current=!1,f.current=0}},[a]),A.useEffect(()=>{const A=l;if(!A)return;let e=null,t=!1;const r=()=>{if(!t&&!c.current)try{A.getLayer(rr)&&A.removeLayer(rr),A.getSource(tr)&&A.removeSource(tr),A.addSource(tr,{type:"geojson",data:{type:"FeatureCollection",features:[]}});const t=A.getLayer(ir)?ir:void 0;A.addLayer({id:rr,type:"line",source:tr,layout:{"line-cap":"round","line-join":"round"},paint:{"line-color":["case",["any",["==",["get","isSpeculative"],!0],["==",["get","isSpeculative"],"true"]],"#8B7BAD","#12A594"],"line-width":["case",["any",["==",["get","isSpeculative"],!0],["==",["get","isSpeculative"],"true"]],1.875,2.5],"line-opacity":["*",["get","opacityMult"],["interpolate",["linear"],["get","intensity"],0,0,.1,.8,.5,1,1,1]]}},t),c.current=!0,m(!0),e&&(clearInterval(e),e=null)}catch{}};return A.isStyleLoaded()&&r(),A.once("style.load",()=>{r()}),c.current||(e=setInterval(()=>{c.current?e&&clearInterval(e):r()},100),setTimeout(()=>{e&&(clearInterval(e),e=null)},5e3)),()=>{t=!0,e&&clearInterval(e),null!==u.current&&(cancelAnimationFrame(u.current),u.current=null);const A=s.current;if(A&&c.current){try{A.getLayer(rr)&&A.removeLayer(rr),A.getSource(tr)&&A.removeSource(tr)}catch{}c.current=!1,m(!1)}}},[l]);const w=A.useRef(()=>{});A.useEffect(()=>{w.current=()=>{const A=s.current;if(!A)return;const e=A.getSource(tr);if(!e)return;const t=performance.now(),r=d.current,n=[],o=[];for(const i of r){const A=t-i.startTime-i.delay;if(A<(i.isSpeculative?or:nr)){o.push(i);const e=i.isSpeculative?sr(A):ar(A);e>0&&n.push({type:"Feature",properties:{intensity:e,opacityMult:i.isSpeculative?.5:1,isSpeculative:i.isSpeculative??!1},geometry:{type:"LineString",coordinates:[i.fromCoord,i.toCoord]}})}}e.setData({type:"FeatureCollection",features:n}),d.current=o,o.length>0?u.current=requestAnimationFrame(()=>w.current()):u.current=null}},[]);const x=A.useCallback(()=>{const A=s.current;A&&function(A){if(!A.getLayer(rr))return;const e=A.getLayer(ir)?ir:void 0;try{A.moveLayer(rr,e)}catch{}}(A),null===u.current&&(u.current=requestAnimationFrame(()=>w.current()))},[]),k=A.useCallback(()=>{if(!s.current||!c.current)return;const A=p.current;if(p.current=[],b.current=null,0===A.length)return;const e=v.current,t=y.current;if(0===e.size)return;const r=performance.now();let o=0,a=!1;const l=new Set;for(const s of A){const A=L(s,n);if(!A||A.original.length<2)continue;const c=A.original;let u=0,f=null;for(let n=0;n0){A.sort((A,e)=>e.confidence-A.confidence);const e=Math.max(1,Math.ceil(.25*A.length)),n=A.slice(0,e),i=o+150*u;for(const{edgeKey:A,otherHash:o}of n){const e=t.get(f),n=t.get(o);d.current.push({edgeKey:A,fromCoord:lr(e),toCoord:lr(n),startTime:r,delay:i,isSpeculative:!0}),l.add(A),a=!0}}}u>0&&(o+=150*u*.5)}a&&x()},[n,i,x]);A.useEffect(()=>{const A=s.current;if(!a)return;if(!A)return;if(!h)return;if(0===r.length)return;const e=Date.now(),t=f.current;if(!g.current){g.current=!0;const A=(e-3e4)/1e3,t=r.filter(e=>(e.timestamp??0)>=A);let n=0;for(const e of r){const A=e.timestamp??0;A>n&&(n=A)}if(f.current=n,t.length>0){t.sort((A,e)=>(A.timestamp??0)-(e.timestamp??0));const A=t.slice(-20);p.current.push(...A),k()}return}const n=r.filter(A=>(A.timestamp??0)>t);if(0===n.length)return;let o=0;for(const r of n){const A=r.timestamp??0;A>o&&(o=A)}f.current=o,p.current.push(...n),b.current&&clearTimeout(b.current),b.current=setTimeout(k,175)},[a,r,k,h]),A.useEffect(()=>()=>{b.current&&clearTimeout(b.current)},[])}({map:Se,nodeCoordinates:me,packets:Pe,localHash:S,neighbors:t,meshTopology:b,enabled:JA});const{isExiting:Te,isAnimating:Le,resetAnimationState:Re}=function({map:e,showTopology:t,validatedPolylines:r,weakPolylines:n,maxCertainCount:o,loopEdgeKeys:i,backboneEdgeKeys:a,highlightedEdgeKey:s,neighbors:l,validatedSourceId:c,weakSourceId:u,neighborPolylines:d=[],showNeighborLines:f=!0,neighborSourceId:g,neighborLinkScores:h=new Map,basemapMode:m}){const b=A.useRef(null);A.useEffect(()=>{const A=e&&"current"in e?e.current:e;b.current=A});const p=A.useRef(new Map),v=A.useRef(1),y=A.useRef(new Map),w=A.useRef(new Map),x=A.useRef(!1),k=A.useRef(null),C=A.useRef(t),B=A.useRef(new Set),M=A.useRef(""),D=A.useRef(new Map),E=A.useRef(""),j=A.useRef(""),Q=A.useRef(""),N=A.useRef(r),S=A.useRef(n),F=A.useRef(o),P=A.useRef(i),T=A.useRef(a),L=A.useRef(s),R=A.useRef(l),I=A.useRef(d),_=A.useRef(f),z=A.useRef(h),H=A.useRef(m);A.useEffect(()=>{N.current=r,S.current=n,F.current=o,P.current=i,T.current=a,L.current=s,R.current=l,I.current=d,_.current=f,z.current=h,H.current=m},[r,n,o,i,a,s,l,d,f,h,m]);const G=A.useCallback((A=!1)=>{var e,t,r,n,o,i,a,s,l,d;const f=b.current;if(!f)return;const h=f.getSource(c),m=f.getSource(u),x=f.getSource(g);if(h){const o=qt(N.current,!0,p.current,v.current,y.current,w.current,F.current,P.current,T.current,L.current,R.current,H.current),i=`${o.features.length}:${(null==(t=null==(e=o.features[0])?void 0:e.properties)?void 0:t.key)??""}:${(null==(n=null==(r=o.features[o.features.length-1])?void 0:r.properties)?void 0:n.key)??""}:${Array.from(p.current.values()).reduce((A,e)=>A+e,0).toFixed(2)}`;(A||i!==E.current)&&(h.setData(o),E.current=i)}if(m){const e=qt(S.current,!1,p.current,v.current,y.current,w.current,F.current,P.current,T.current,L.current,R.current,H.current),t=`${e.features.length}:${(null==(i=null==(o=e.features[0])?void 0:o.properties)?void 0:i.key)??""}:${(null==(s=null==(a=e.features[e.features.length-1])?void 0:a.properties)?void 0:s.key)??""}`;(A||t!==j.current)&&(m.setData(e),j.current=t)}if(x&&I.current.length>0){const e=Xt(I.current,z.current),t=`${e.features.length}:${(null==(d=null==(l=e.features[0])?void 0:l.properties)?void 0:d.hash)??""}`;(A||t!==Q.current)&&(x.setData(e),Q.current=t)}},[c,u,g]),O=A.useCallback(()=>{k.current&&(cancelAnimationFrame(k.current),k.current=null),p.current=new Map,v.current=1,y.current=new Map,w.current=new Map,x.current=!1,B.current=new Set,M.current="",D.current=new Map},[]);A.useEffect(()=>{const A=C.current,e=t;if(C.current=t,b.current){if(k.current&&(cancelAnimationFrame(k.current),k.current=null),A&&!e&&!x.current){x.current=!0;const A=new Map(p.current);let e=null;const t=r=>{e||(e=r);const n=r-e,o=Math.min(n/500,1),i=(a=o,1-Math.pow(1-a,3));var a;for(const[e,t]of A)p.current.set(e,t*(1-i));G(!0),o<1?k.current=requestAnimationFrame(t):(x.current=!1,p.current=new Map,B.current=new Set,M.current="",y.current=new Map,w.current=new Map,k.current=null,G(!0))};k.current=requestAnimationFrame(t)}!A&&e&&(p.current=new Map,B.current=new Set,M.current="")}},[t,G]),A.useEffect(()=>{const A=b.current;if(!t||x.current||!A)return;const e=[...r,...n],o=e.map(A=>`${A.edge.key}:${A.edge.certainCount}`).sort().join(","),i=0===B.current.size,a=""!==M.current&&M.current!==o;if(!i&&!a)return void G();const s=[],l=[];for(const{edge:t}of e)B.current.has(t.key)?l.push(t.key):s.push(t.key);a&&l.length>0&&(y.current=new Map(D.current),v.current=0),w.current=new Map;for(const{edge:t}of r){const A=OA(t.certainCount);w.current.set(t.key,A)}for(const t of s)p.current.set(t,0);for(const t of l)p.current.has(t)||p.current.set(t,1);if(s.length>0||a&&l.length>0){k.current&&(cancelAnimationFrame(k.current),k.current=null);let A=null;const e=Math.min(100,VA/Math.max(s.length,1)/2),t=r=>{A||(A=r);const n=r-A;for(let A=0;A0){const A=Math.min(n/VA,1);v.current=Jt(A)}G(!0);const o=VA+(s.length-1)*e;k.current=n{const A=b.current;if(!A||!g)return;const e=()=>{const e=A.getSource(g);if(!e)return!1;if(d.length>0){const A=Xt(d,h);e.setData(A)}else e.setData({type:"FeatureCollection",features:[]});return!0};if(e())return;const t=r=>{r.sourceId===g&&e()&&A.off("sourcedata",t)};A.on("sourcedata",t);const r=()=>{e()&&(A.off("styledata",r),A.off("sourcedata",t))};return A.on("styledata",r),()=>{A.off("sourcedata",t),A.off("styledata",r)}},[g,d,h]);const U=A.useRef(m);return A.useEffect(()=>{m!==U.current&&(U.current=m,E.current="",j.current="",Q.current="",G(!0))},[m,G]),A.useEffect(()=>()=>{k.current&&(cancelAnimationFrame(k.current),k.current=null)},[]),{isExiting:x.current,isAnimating:null!==k.current,resetAnimationState:O,weightAnimProgress:v.current,animStartWeights:y.current,animTargetWeights:w.current}}({map:Se,showTopology:X,validatedPolylines:xe,weakPolylines:ke,maxCertainCount:je,loopEdgeKeys:Me,backboneEdgeKeys:De,highlightedEdgeKey:f,neighbors:t,validatedSourceId:Ir,weakSourceId:_r,neighborPolylines:Be,showNeighborLines:eA,neighborSourceId:zr,neighborLinkScores:ve,basemapMode:XA}),ze=A.useMemo(()=>{const A=new Set;for(const e of b.hubNodes){A.add(e);for(const t of b.validatedEdges)t.fromHash===e&&A.add(t.toHash),t.toHash===e&&A.add(t.fromHash)}return A},[b.hubNodes,b.validatedEdges]),He=A.useMemo(()=>{const A=new Set;if(!o)return A;for(const e of b.validatedEdges)e.fromHash===o&&A.add(e.toHash),e.toHash===o&&A.add(e.fromHash);return A},[o,b.validatedEdges]),{getNodeOpacity:Ge}=function({soloDirect:e,soloHubs:t,neighborHashes:r,hubConnectedNodes:n,directNodeSet:o,localConnectedNodes:i,showTopology:a}){const[s,l]=A.useState(new Map),c=A.useRef(e),u=A.useRef(t),d=A.useRef(new Map),f=A.useRef(null),g=A.useRef(n),h=A.useRef(o),m=A.useRef(i),b=A.useRef(a);return A.useEffect(()=>{g.current=n,h.current=o,m.current=i,b.current=a},[n,o,i,a]),A.useEffect(()=>{const A=c.current,n=u.current,o=e,i=t;if(c.current=e,u.current=t,A===o&&n===i)return;f.current&&(cancelAnimationFrame(f.current),f.current=null);const a=g.current,s=h.current,p=m.current,v=b.current;for(const e of r)d.current.has(e)||d.current.set(e,Math.random());const y=(A,e,t)=>{const r=a.has(A),n=s.has(A),o=v&&p.has(A);return!e&&!t||(e&&t?r||n||o:t?r:!e||n||o)},w=[];for(const e of r){const t=y(e,A,n),r=y(e,o,i);t!==r&&w.push({hash:e,startOpacity:t?1:0,targetOpacity:r?1:0})}if(0===w.length)return;l(A=>{const e=new Map(A);for(const{hash:t,startOpacity:r}of w)e.set(t,r);return e});const x=w;let k=null;const C=A=>{k||(k=A);const e=A-k;let t=!0;l(()=>{const A=new Map;for(const{hash:r,startOpacity:n,targetOpacity:o}of x){const i=250*(d.current.get(r)??0),a=Math.max(0,e-i),s=Math.min(a/500,1),l=n+(o-n)*$t(s);A.set(r,l),s<1&&(t=!1)}return A}),e<750&&!t?f.current=requestAnimationFrame(C):(f.current=null,l(new Map))};return f.current=requestAnimationFrame(C),()=>{f.current&&(cancelAnimationFrame(f.current),f.current=null)}},[e,t,r]),{nodeOpacities:s,getNodeOpacity:(A,e)=>s.has(A)?s.get(A):e?1:0}}({soloDirect:"direct"===uA,soloHubs:"hubs"===uA,neighborHashes:he.map(([A])=>A),hubConnectedNodes:ze,directNodeSet:pe,localConnectedNodes:He,showTopology:X}),{blinkingNodes:Oe,blinkColor:Ue}=function({neighbors:e,localHash:t,enabled:r=!0}){const[n,o]=A.useState(new Map),i=P(),a=A.useRef(T.getPackets());A.useEffect(()=>{a.current=T.getPackets()},[i]);const s=A.useRef(0),l=A.useRef(null),c=A.useRef(new Map),u=A.useRef(new Map);A.useEffect(()=>{u.current=function(A){const e=new Map;for(const t of Object.keys(A)){const A=R(t);e.has(A)||e.set(A,t)}return e}(e)},[e]);const d=A.useRef(null);return A.useEffect(()=>{d.current=()=>{const A=performance.now(),e=c.current;if(0===e.size)return l.current=null,void o(new Map);const t=new Map,r=[];for(const[n,{startTime:o,staggerDelay:i}]of e){const e=A-o-i;if(e<0);else if(e>=750)r.push(n);else{const A=Ar(e,750);A>0&&t.set(n,A)}}for(const n of r)e.delete(n);o(t),e.size>0&&d.current?l.current=requestAnimationFrame(d.current):l.current=null}},[]),A.useEffect(()=>{if(!r)return;const A=a.current;if(0===A.length)return;const e=s.current,n=A.filter(A=>(A.timestamp??0)>e);if(0===e){const e=A.reduce((A,e)=>Math.max(A,e.timestamp??0),0);return void(s.current=e)}if(0===n.length)return;const o=n.reduce((A,e)=>Math.max(A,e.timestamp??0),0);s.current=o;const i=performance.now();let f=0;for(const r of n){const A=L(r,t);if(!A||0===A.original.length)continue;const e=er(A.original,u.current,t);if(0===e.length)continue;const n=375;for(let t=0;t()=>{null!==l.current&&(cancelAnimationFrame(l.current),l.current=null)},[]),{blinkingNodes:n,blinkColor:"#00FF00"}}({neighbors:t,localHash:o,enabled:JA}),Ye=A.useCallback(A=>{if("all"===uA)return!0;if("direct"===uA)return pe.has(A);if("hubs"===uA){if(b.hubNodes.includes(A))return!0;for(const e of b.validatedEdges){if(e.fromHash===A&&b.hubNodes.includes(e.toHash))return!0;if(e.toHash===A&&b.hubNodes.includes(e.fromHash))return!0}return!1}return!0},[uA,pe,b.hubNodes,b.validatedEdges]),We=A.useCallback(()=>{PA(!0),SA(!0)},[]),Ke=A.useCallback(()=>{TA?fA(A=>!A):We()},[TA,We]),Je=A.useCallback(A=>{W(A.viewState),(A.viewState.pitch??0)>10&&!lA&&mA(!0)},[lA]),qe=A.useCallback(()=>{q(A=>{var e,t,r,n,o,i,a;const s=!A,l=null==(r=null==(t=null==(e=h.current)?void 0:e.getContainer())?void 0:t.closest(".map-container-fullscreen, .map-container-16-9"))?void 0:r.parentElement;return s?l&&document.fullscreenEnabled?null==(n=l.requestFullscreen)||n.call(l).catch(()=>{}):l&&document.webkitFullscreenEnabled&&(null==(o=l.webkitRequestFullscreen)||o.call(l)):document.fullscreenElement?null==(i=document.exitFullscreen)||i.call(document).catch(()=>{}):document.webkitFullscreenElement&&(null==(a=document.webkitExitFullscreen)||a.call(document)),s})},[]),Xe=A.useCallback(A=>{bA(A)},[]),$e=A.useCallback(()=>{gA(A=>!A)},[]),At=A.useCallback(()=>{nA(A=>!A)},[]),et=A.useCallback(()=>{mA(A=>{const e=!A;if(h.current){const A=h.current.getMap();A&&A.stop()}if(e&&h.current){const A=h.current.getMap();A&&A.easeTo({pitch:45,duration:1500,easing:A=>1-Math.pow(1-A,3)})}if(!e&&h.current){const A=h.current.getMap();A&&A.easeTo({pitch:0,bearing:0,duration:800,easing:A=>1-Math.pow(1-A,2)})}return e})},[]),tt=A.useCallback(()=>{X||fA(!0)},[X]),rt=A.useCallback((A,e)=>{EA(A),QA(e)},[]),nt=A.useCallback(()=>{DA&&i&&i(DA),EA(null),QA("")},[DA,i]),ot=A.useMemo(()=>[...Zr,...Rr],[]),it=A.useRef(!1);A.useEffect(()=>{it.current="ontouchstart"in window||navigator.maxTouchPoints>0},[]);const at=A.useCallback(A=>{A.features&&0!==A.features.length||(it.current&&te&&(re(null),wA(null)),xA&&kA(null))},[te,xA]),st=A.useCallback(A=>{kA(e=>e===A?null:A)},[]),lt=A.useCallback(A=>{var e,t;if(!A.features||0===A.features.length)return;if(A.features.some(A=>{var e,t;return null==(t=null==(e=A.layer)?void 0:e.id)?void 0:t.startsWith("node-markers-")}))return void(yA&&(wA(null),re(null)));const r=A.features.find(A=>{var e;const t=null==(e=A.layer)?void 0:e.id;return(null==t?void 0:t.startsWith("topology-"))||(null==t?void 0:t.startsWith("neighbor-"))});if(!r)return;const n=null==(e=r.layer)?void 0:e.id,o=r.properties;if(!(null==o?void 0:o.key))return;const i=null==n?void 0:n.startsWith("topology-"),a=null==n?void 0:n.startsWith("neighbor-");if(i||a){const e=o.key.replace(/-loop[12]$/,"");wA(e),A.lngLat&&re({longitude:A.lngLat.lng,latitude:A.lngLat.lat,type:i?"topology":"neighbor",properties:o})}try{(null==(t=h.current)?void 0:t.getCanvas())&&(h.current.getCanvas().style.cursor="pointer")}catch{}},[yA]),ct=A.useCallback(()=>{var A;wA(null),re(null);try{(null==(A=h.current)?void 0:A.getCanvas())&&(h.current.getCanvas().style.cursor="")}catch{}},[]),ut=J?"map-container-fullscreen":"map-container-16-9",dt=F.length>0||(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude),ft=!w||!dt,gt=dt;return e.jsxs("div",{className:`relative ${ut}`,role:"application","aria-label":"Mesh network contacts map","aria-describedby":"map-instructions","data-basemap":XA,children:[e.jsx("span",{id:"map-instructions",className:"sr-only",children:"Interactive map showing mesh network contacts. Use mouse or touch to pan and zoom. Press Tab to navigate map controls. Press Escape to exit fullscreen mode."}),ft&&e.jsx("div",{className:"absolute inset-0 z-50 surface-base rounded-2xl flex items-center justify-center","aria-hidden":"true",children:e.jsxs("div",{className:"flex flex-col items-center gap-3",children:[e.jsx("div",{className:"w-6 h-6 border-2 border-accent-primary border-t-transparent rounded-full animate-spin"}),e.jsx("span",{className:"text-sm text-text-muted",children:"Loading map..."})]})}),gt&&e.jsx("div",{className:`relative w-full h-full ${J?"":"rounded-[1.125rem] overflow-hidden"} ${ft?"opacity-0":"opacity-100 transition-opacity duration-300"}`,children:e.jsxs(c,{ref:h,...z,onMove:Je,mapStyle:$r,style:{width:"100%",height:"100%"},attributionControl:!1,interactiveLayerIds:ot,onMouseMove:lt,onMouseLeave:ct,onClick:at,onError:A=>{},onIdle:()=>{if(!N&&!Q&&h.current){const A=h.current.getMap();if(A){const e=Object.values(t).filter(A=>A.latitude&&A.longitude).map(A=>({latitude:A.latitude,longitude:A.longitude}));(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude)&&e.push({latitude:r.latitude,longitude:r.longitude}),e.length>0&&j(e,A)}}},children:[e.jsx(u,{position:"bottom-right"}),e.jsx(d,{mode:XA}),e.jsx(Mt,{enabled:lA,exaggeration:4}),e.jsx(yt,{coveragePoints:YA,visible:YA.length>0&&WA,terrainEnabled:lA,brightness:ZA,basemapMode:XA}),e.jsx(Ut,{partition:Qe,nodeCoordinates:me,visible:oA&&TA,opacity:aA.opacity,bandwidth:aA.bandwidth,threshold:aA.threshold,strokeWidth:aA.strokeWidth}),e.jsx(Wr,{showTopology:X,isExiting:Te,hoveredEdgeKey:yA,highlightedLoopEdges:null==ne?void 0:ne.highlightedEdgeKeys,highlightedFocusEdges:Ee,onEdgeHover:se,onLoopHover:ue,loops:b.loops,neighborNames:fe,opacityBias:CA,widthMultiplier:BA,trafficFilter:MA,showNeighborLines:eA,disableHover:Le||FA}),a&&e.jsx(Kr,{targetHash:a,nodeCoordinates:me,onComplete:s}),f&&e.jsx(Jr,{highlightedEdgeKey:f,validatedPolylines:xe,weakPolylines:ke,onEnsureTopology:tt}),e.jsx(Xr,{ghost:g??null,neighborCoordinates:me,onHighlightedNeighborsChange:UA}),e.jsx(Lr,{neighborsWithLocation:he,localNode:r,localHash:o,zeroHopNeighbors:pe,lastHopNeighborMap:be,meshTopology:b,hoveredMarker:pA,onMarkerHover:vA,getNodeOpacity:Ge,shouldShowNode:Ye,onRequestRemove:i?rt:void 0,openPopupId:IA,onOpenPopup:zA,onClosePopup:HA,onNodeClick:st,blinkingNodes:Oe,blinkColor:Ue})]})}),(()=>{const A=function(A,e,t){if(e){const A=e.loops[0],t=e.loops.length,r=[{label:"hops",value:A.size},{label:"seen",value:A.minCertainCount}],n=[];return A.includesLocal&&n.push({text:"★ Includes your node",color:"text-amber-400"}),t>1&&n.push({text:`+${t-1} overlapping`,color:"text-violet-400/70"}),{type:"loop",title:{icon:"⟳",text:"Redundant Path"+(t>1?"s":""),color:"text-violet-400"},subtitle:{text:`${e.nodeNames.join(" → ")} → ${e.nodeNames[0]}`,color:"text-text-secondary",mono:!0},stats:r,badges:n}}if("neighbor"===(null==A?void 0:A.type)){const e=A.properties,t=[];void 0!==e.rssi&&null!==e.rssi&&t.push({label:"RSSI",value:`${Math.round(e.rssi)} dBm`,unit:e.hasAvgRssi?"avg":void 0}),void 0!==e.snr&&null!==e.snr&&t.push({label:"SNR",value:`${Number(e.snr).toFixed(1)} dB`,unit:e.hasAvgSnr?"avg":void 0});const r=e.listenerScore??0,n=e.loudScore??0,o=r>0||n>0;return o&&(t.push({label:"listener",value:r,color:"text-accent-success"}),t.push({label:"loud",value:n,color:"text-accent-danger"})),void 0===e.packetCount||o||t.push({label:"packets",value:Number(e.packetCount).toLocaleString()}),{type:"neighbor",title:{icon:"●",text:e.prefix?`${e.name} (${e.prefix})`:e.name,color:"text-amber-400"},subtitle:{text:"Direct RF Neighbor",color:"text-amber-400/70"},stats:t,badges:[]}}if("topology"===(null==A?void 0:A.type)){const e=A.properties,r=t>0?Number(e.certainCount)/t:0,n=[{label:"validations",value:e.certainCount},{label:"of max traffic",value:`${Math.round(100*r)}%`},{label:"confidence",value:`${Math.round(100*Number(e.confidence))}%`}];if(void 0!==e.symmetryRatio&&e.symmetryRatio<1){const A="forward"===e.dominantDirection?"→":"reverse"===e.dominantDirection?"←":"↔";n.push({label:"symmetric",value:`${A} ${Math.round(100*e.symmetryRatio)}%`,color:"text-text-muted"})}const o=[];return e.isBackbone&&o.push({text:"Backbone",color:"text-gray-300"}),e.isLoopEdge&&o.push({text:"Redundant",color:"text-violet-400"}),e.isDirectPath&&o.push({text:"Direct Path",color:"text-teal-400"}),{type:"topology",title:{icon:"",text:`${e.fromName} ↔ ${e.toName}`,color:"text-text-primary"},stats:n,badges:o}}return null}(te?{type:te.type,properties:te.properties}:null,ne,je);return A&&e.jsx("div",{className:"map-edge-tooltip",children:e.jsx("div",{className:"map-control-glass map-edge-tooltip-inner",children:e.jsx(en,{data:A})})})})(),e.jsx(ie,{mapRef:h,showNeighborLines:eA,onToggleNeighborLines:$e,hasNeighborPolylines:Be.length>0,nodeFilter:uA,onNodeFilterChange:Xe,hasHubNodes:b.hubNodes.length>0,hasZeroHopNeighbors:pe.size>0,showCoverage:rA,onToggleCoverage:At,showMinCut:oA,onToggleMinCut:Ne,hasMinCutData:TA&&null!==Qe&&Qe.numCommunities>1,show3DTerrain:lA,onToggle3DTerrain:et,basemapMode:XA,onToggleBasemap:$A,isFullscreen:J,onToggleFullscreen:qe}),e.jsxs("div",{className:"map-legend-stack",children:[e.jsx(le,{isActive:X,hasAnalyzed:TA,isLoading:FA,onClick:Ke,basemapMode:XA}),e.jsx(ce,{isActive:JA,onClick:qA,basemapMode:XA}),e.jsx(ge,{isActive:YA.length>0&&WA,onClick:KA,basemapMode:XA}),e.jsx(oe,{showTopology:X,validatedPolylineCount:xe.length,filteredNeighborCount:he.length,hasLocalNode:!(!(null==r?void 0:r.latitude)||!(null==r?void 0:r.longitude)),meshTopology:b,zeroHopNeighbors:pe,neighborsWithLocation:he,basemapMode:XA})]}),!J&&e.jsx("div",{className:"glass-card-frame absolute inset-0 pointer-events-none rounded-[1.125rem]",style:{zIndex:9999},"aria-hidden":"true"}),e.jsx(Z,{isOpen:null!==DA,onCancel:()=>EA(null),onConfirm:nt,title:"Remove Node?",message:`Remove "${jA}" from the contacts list? This will hide the node until it sends a new packet.`,confirmLabel:"Remove",cancelLabel:"Cancel",variant:"danger"}),e.jsx($,{isOpen:NA,onClose:()=>{SA(!1),PA(!1),Re(),RA(!0),setTimeout(()=>fA(!0),150)}}),e.jsx(Ie,{}),e.jsx(Ve,{visible:oA&&TA,onClose:()=>hA(!1),settings:aA,onSettingsChange:sA,partition:Qe,totalNodes:Object.keys(t).length,basemapMode:XA})]})}export{tn as default}; diff --git a/frontend/dist/assets/ContactsMapMapLibre-Cpb6Sk8-.js b/frontend/dist/assets/ContactsMapMapLibre-Cpb6Sk8-.js new file mode 100644 index 00000000..26f12f3b --- /dev/null +++ b/frontend/dist/assets/ContactsMapMapLibre-Cpb6Sk8-.js @@ -0,0 +1 @@ +import{r as A,j as e,c as t,q as r}from"./vendor-react-Cwum97tW.js";import{u as n,b as o,S as i,L as a,P as s,c as l,M as c,d as u,B as d}from"./BasemapLayer-C9wiTbJT.js";import"./maplibre-gl-Bk5DsYkB.js";import{L as f,S as g,M as h,c as m}from"./link-scoring-BnkyjnFT.js";import{c as b,U as p,ac as v,ak as y,al as w,T as x,m as k,F as C,A as B,N as M,aF as D,ae as E,C as j,R as Q,X as N,E as S,a7 as F,o as P,c3 as T,c4 as L,p as I,c5 as R,B as _,y as z,aK as H,h as G,I as U,c6 as O,c7 as Y}from"./index-D22MpaCY.js";import{P as V,T as W,C as Z}from"./ConfirmModal-flvCJ5X5.js";import{M as K,a as J,E as q,b as X,D as $}from"./DeepAnalysisModal-DSV1q_wY.js";import{i as AA,j as eA,k as tA,l as rA}from"./useThemeColors-S-uaxvPT.js";import{b as nA,M as oA}from"./trending-up-D5ntwkR1.js";import{H as iA}from"./house-D2cJ2w9-.js";import{R as aA}from"./refresh-cw-BtHqSStQ.js";import{E as sA}from"./target-BlWNMuhi.js";import{C as lA}from"./compass-Bsfx4e84.js";import{L as cA}from"./loader-circle-2q9lT2qG.js";import{G as uA}from"./git-branch-Cev-c9BQ.js";import{Z as dA}from"./zap-Cpbok2bP.js";import{l as fA}from"./font-loader-jlbdh9Fw.js";import{a as gA}from"./config-C7QO3CEB.js";import{A as hA}from"./index-bDa2a9Y2.js";import{c as mA,p as bA,d as pA}from"./vendor-core-CDrKesoV.js";import{C as vA,a as yA}from"./DataBox-Bl0vntck.js";import{U as wA}from"./users-dFI4fg5G.js";import{P as xA,R as kA,N as CA}from"./Contacts-DHVYuXFa.js";import{H as BA,c as MA,N as DA,e as EA}from"./SignalIndicator-CBL6VSNS.js";import{M as jA}from"./map-pin-kiJDSdn0.js";import"./deckgl-DTsmDcfs.js";import"./triangle-alert-TfoZuZfW.js";import"./ping-o6tDyVoV.js";import"./PageLayout-B53JpmK1.js";import"./activity-Cb8TQBuo.js";import"./circle-check-CKXuJpMJ.js";import"./CollisionExplorerModal-BmT8XQYy.js";import"./network-Dz5VqBhN.js";const QA=b("boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]),NA=b("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]),SA=b("grip-vertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]),FA=b("map",[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]]),PA=b("mountain",[["path",{d:"m8 3 4 8 5-5 5 15H2L8 3z",key:"otkl63"}]]),TA=b("sigma",[["path",{d:"M18 7V5a1 1 0 0 0-1-1H6.5a.5.5 0 0 0-.4.8l4.5 6a2 2 0 0 1 0 2.4l-4.5 6a.5.5 0 0 0 .4.8H17a1 1 0 0 0 1-1v-2",key:"wuwx1p"}]]),LA=b("swords",[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}],["polyline",{points:"14.5 6.5 18 3 21 3 21 6 17.5 9.5",key:"hbey2j"}],["line",{x1:"5",x2:"9",y1:"14",y2:"18",key:"1hf58s"}],["line",{x1:"7",x2:"4",y1:"17",y2:"20",key:"pidxm4"}],["line",{x1:"3",x2:"5",y1:"19",y2:"21",key:"1pehsh"}]]),IA=b("wifi-off",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]),RA=b("wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]),_A=b("wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]]);class zA{constructor(){this.componentControls=new Set}subscribe(A){return this.componentControls.add(A),()=>this.componentControls.delete(A)}start(A,e){this.componentControls.forEach(t=>{t.start(A.nativeEvent||A,e)})}cancel(){this.componentControls.forEach(A=>{A.cancel()})}stop(){this.componentControls.forEach(A=>{A.stop()})}}const HA=()=>new zA;function GA(A,e,t,r){const n=(t-A)*Math.PI/180,o=(r-e)*Math.PI/180,i=Math.sin(n/2)*Math.sin(n/2)+Math.cos(A*Math.PI/180)*Math.cos(t*Math.PI/180)*Math.sin(o/2)*Math.sin(o/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371e3}function UA(A,e){const t=Math.max(5,Math.min(A,300)),r=Math.log(5),n=Math.log(300);return 1+(Math.log(t)-r)/(n-r)*5}const OA={nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",nodeColor:"#4338CA",localColor:"#FFB224",hubColor:"#8E4EC6",gatewayColor:"#5B5BD6",mobileColor:"#F76B15",roomServerColor:"#D6409F",neighborColor:"#FFB224",edges:{rest:"#4B4B4B",restBright:"#616161",restDim:"#3F3F3F",hoverDirect:"#6FBCBD",hoverLoop:"#8B7BAD",hoverStandard:"#8A8A8A",hoverNeighbor:"#FBBF24",neighborRest:"#6B7280",neighborHover:"#FBBF24",highlight:"#FFD700"},edgeOpacity:.82};function YA(){if("undefined"==typeof window)return OA;const A=AA(),e=eA();return{nodeFill:A.nodeFill,nodeStroke:A.nodeStroke,nodeColor:OA.nodeColor,localColor:A.localColor,hubColor:A.hubColor,gatewayColor:A.gatewayColor,mobileColor:A.mobileColor,roomServerColor:A.roomColor,neighborColor:A.neighborColor,edges:{rest:e.rest,restBright:e.restBright,restDim:e.restDim,hoverDirect:e.hoverDirect,hoverLoop:e.hoverLoop,hoverStandard:e.hoverStandard,hoverNeighbor:e.hoverNeighbor,neighborRest:OA.edges.neighborRest,neighborHover:OA.edges.neighborHover,highlight:e.highlight},edgeOpacity:OA.edgeOpacity}}const VA=2e3,WA={type:"spring",stiffness:500,damping:35},ZA="#4A4A4A",KA="#737373",JA="rgba(0, 0, 0, 0.12)",qA=A.createContext("dark"),XA=()=>A.useContext(qA);function $A({color:A,ring:t}){return e.jsx("span",{className:"shrink-0 rounded-full",style:{width:14,height:14,backgroundColor:t?"transparent":A,border:t?`4px solid ${A}`:void 0,boxSizing:"border-box"}})}function Ae({color:A}){return e.jsx("span",{className:"shrink-0 rounded-sm",style:{width:16,height:3,backgroundColor:A}})}function ee({indicator:A,label:r,tooltip:n}){const o="light"===XA();return e.jsxs("div",{className:"flex items-center gap-1.5",children:[A,e.jsx("span",{className:t(!o&&"text-text-secondary"),style:o?{color:ZA}:void 0,children:r}),n&&e.jsx(x,{content:n,delay:200,children:e.jsx("span",{className:t("cursor-help text-[10px] opacity-60 hover:opacity-100 transition-opacity",!o&&"text-text-muted"),style:o?{color:KA}:void 0,children:"ⓘ"})})]})}function te({title:A,tooltip:r,isOpen:n,onToggle:o,showDivider:i,children:a}){const s="light"===XA();return e.jsxs("div",{className:i?"mt-2 pt-2 border-t":"",style:i?{borderColor:s?JA:"var(--map-ui-border)"}:void 0,children:[e.jsxs("button",{type:"button",onClick:o,className:t("group w-full flex items-center justify-between py-1 font-medium transition-colors",!s&&"text-text-secondary hover:text-text-primary"),style:s?{color:ZA}:void 0,children:[e.jsxs("span",{className:"flex items-center gap-1",children:[A,e.jsx(x,{content:r,delay:200,children:e.jsx("span",{className:t("cursor-help text-[10px] opacity-60 group-hover:opacity-100 transition-opacity",!s&&"text-text-muted"),style:s?{color:KA}:void 0,children:"ⓘ"})})]}),e.jsx(k.span,{animate:{rotate:n?0:-90},transition:{duration:.15},children:e.jsx(C,{className:"w-3 h-3",style:s?{color:KA}:{color:"var(--text-muted)"}})})]}),e.jsx(B,{initial:!1,children:n&&e.jsx(k.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:WA,className:"overflow-hidden",children:e.jsx("div",{className:"flex flex-col gap-1 pt-1.5",children:a})})})]})}function re({label:A,value:r,color:n}){const o="light"===XA();return e.jsxs("div",{className:t("flex justify-between tabular-nums",!o&&"text-text-muted"),style:o?{color:KA}:void 0,children:[e.jsx("span",{children:A}),e.jsx("span",{style:n?{color:n}:o?{color:ZA}:{color:"var(--text-secondary)"},children:r})]})}function ne({icon:A,color:r,title:n,subtitle:o}){const i="light"===XA();return e.jsx("div",{className:"mt-1.5 pt-1.5 border-t",style:{borderColor:i?JA:"var(--map-ui-border)"},children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"shrink-0",style:{color:r},children:A}),e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx("span",{className:"font-medium truncate",style:{color:r},children:n}),e.jsx("span",{className:t("text-[10px] leading-tight",!i&&"text-text-muted"),style:i?{color:KA}:void 0,children:o})]})]})})}function oe({showTopology:t,validatedPolylineCount:r,filteredNeighborCount:n,hasLocalNode:o,meshTopology:i,zeroHopNeighbors:a,neighborsWithLocation:s,basemapMode:l="dark"}){const c=tA(),u=v(),d=y(),g=u.filter(A=>A.isLikelyReal).length,h=function(A){let e=0;for(const t of A.txDelayRecommendations.values())"backbone"===t.networkRole&&e++;return e}(i),m=a.size>0,[b,p]=A.useState(!0),[x,k]=A.useState(!0),[C,B]=A.useState(!0);return e.jsx(qA.Provider,{value:l,children:e.jsxs("div",{className:"map-control-glass p-2.5 text-xs",children:[e.jsxs(te,{title:"Nodes",tooltip:"Node type shown by shape + color. Yellow = direct RF neighbor.",isOpen:b,onToggle:()=>p(A=>!A),children:[e.jsx(ee,{indicator:e.jsx($A,{color:c.nodeFill}),label:"Node",tooltip:"Standard mesh node. Repeater, client, or companion device."}),e.jsx(ee,{indicator:e.jsx($A,{color:c.hubColor}),label:"Hub",tooltip:"Network hub (≥10% of last-hop traffic)."}),(M=s,M.some(([,A])=>{var e;const t=null==(e=A.contact_type)?void 0:e.toLowerCase();return"room server"===t||"room_server"===t||"room"===t||"server"===t})&&e.jsx(ee,{indicator:e.jsx(nA,{className:"w-3 h-3 shrink-0",style:{color:c.roomColor},strokeWidth:2.5}),label:"Room",tooltip:"Room Server identity for client sync."})),e.jsx(ee,{indicator:e.jsx(iA,{className:"w-3 h-3 shrink-0",style:{color:c.localColor},strokeWidth:2.5}),label:"Local",tooltip:"Your repeater running pyMC_Repeater."}),m&&e.jsx(ee,{indicator:e.jsx($A,{color:c.neighborColor}),label:"Neighbor",tooltip:"Zero-hop direct RF contact."}),i.gatewayNodes.length>0&&e.jsx(ee,{indicator:e.jsx($A,{color:c.gatewayColor}),label:"Gateway",tooltip:"Significant forwarder (7-10% traffic)."}),h>0&&e.jsx(ee,{indicator:e.jsx($A,{color:c.hubColor}),label:"Backbone",tooltip:"Critical relay with high centrality."}),i.mobileNodes.length>0&&e.jsx(ee,{indicator:e.jsx($A,{color:c.mobileColor,ring:!0}),label:"Mobile",tooltip:"Volatile node that appears/disappears."}),g>0&&e.jsx(ee,{indicator:e.jsx(w,{className:"w-3 h-3 shrink-0",style:{color:c.ghostColor},strokeWidth:2.5}),label:`Ghost (${g})`,tooltip:"Unknown repeater from Viterbi analysis."})]}),m&&e.jsxs(te,{title:"Link Quality",tooltip:"Neighbor edge colors based on bidirectional balance.",isOpen:x,onToggle:()=>k(A=>!A),showDivider:!0,children:[e.jsx(ee,{indicator:e.jsx(Ae,{color:f.YELLOW}),label:"2-Way",tooltip:"33-67% balanced. Ideal bidirectional link."}),e.jsx(ee,{indicator:e.jsx(Ae,{color:f.GREEN}),label:"Listener",tooltip:">67% listener. They hear us well."}),e.jsx(ee,{indicator:e.jsx(Ae,{color:f.RED}),label:"Loud",tooltip:"<33% listener. They route more to us."})]}),t&&r>0&&e.jsxs(te,{title:"Topology",tooltip:"Links with 5+ validations. Thickness = strength.",isOpen:C,onToggle:()=>B(A=>!A),showDivider:!0,children:[e.jsx(re,{label:"Nodes",value:n+(o?1:0)}),i.hubNodes.length>0&&e.jsx(re,{label:"Hubs",value:i.hubNodes.length,color:OA.hubColor}),i.loops.length>0&&e.jsx(ne,{icon:e.jsx(aA,{className:"w-3 h-3"}),color:OA.edges.hoverLoop,title:`${i.loops.length} ${1===i.loops.length?"Loop":"Loops"}`,subtitle:"Redundant paths"}),d.totalPaths>0&&e.jsx(ne,{icon:e.jsx(sA,{className:"w-3 h-3"}),color:c.ghostColor,title:`${d.totalPaths.toLocaleString()} Viterbi`,subtitle:"HMM decoded paths"})]})]})});var M}function ie({mapRef:A,showNeighborLines:t,onToggleNeighborLines:r,hasNeighborPolylines:n,nodeFilter:o,onNodeFilterChange:i,hasHubNodes:a,hasZeroHopNeighbors:s,showCoverage:l,onToggleCoverage:c,showMinCut:u=!1,onToggleMinCut:d,hasMinCutData:f=!1,show3DTerrain:m,onToggle3DTerrain:b,basemapMode:p,onToggleBasemap:v,isFullscreen:y,onToggleFullscreen:w}){const x="w-4 h-4",k="light"===p?"#737373":void 0;return e.jsx(e.Fragment,{children:e.jsxs("div",{className:"absolute top-3 right-3 z-[600] flex flex-col gap-2 sm:top-4 sm:right-4",children:[e.jsxs("div",{className:"map-control-glass flex items-center gap-1 p-1",children:[n&&e.jsx(M,{plain:!0,color:t?"warning":"muted",onClick:r,title:t?"Hide edge lines":"Show edge lines","aria-label":t?"Hide edge lines":"Show edge lines","aria-pressed":t,className:"!p-1.5 !rounded-md",children:e.jsx(D,{className:x})}),e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx(E,{color:"all"===o?"green":"zinc",customColor:"all"!==o?k:void 0,onClick:()=>i("all"),title:"Show all nodes",children:"All"}),a&&e.jsx(E,{color:"hubs"===o?"green":"zinc",customColor:"hubs"!==o?k:void 0,onClick:()=>i("hubs"),title:"Show only hub nodes and their connections",children:"Hubs"}),s&&e.jsx(E,{color:"direct"===o?"green":"zinc",customColor:"direct"!==o?k:void 0,onClick:()=>i("direct"),title:"Show only zero-hop (direct RF) neighbors",children:"Direct"})]}),f&&d&&e.jsx(M,{plain:!0,color:u?"primary":"muted",onClick:d,title:u?"Hide community partition":"Show community partition","aria-label":u?"Hide community partition":"Show community partition","aria-pressed":u,className:"!p-1.5 !rounded-md",children:e.jsx(QA,{className:x})}),e.jsx(M,{plain:!0,color:"light"===p?"primary":"muted",onClick:v,title:"light"===p?"Switch to dark map":"Switch to light map","aria-label":"light"===p?"Switch to dark map":"Switch to light map","aria-pressed":"light"===p,className:"!p-1.5 !rounded-md",children:"light"===p?e.jsx(g,{className:x}):e.jsx(h,{className:x})}),e.jsx(M,{plain:!0,color:m?"success":"muted",onClick:b,title:m?"Disable 3D terrain":"Enable 3D terrain","aria-label":m?"Disable 3D terrain":"Enable 3D terrain","aria-pressed":m,className:"!p-1.5 !rounded-md",children:e.jsx(PA,{className:x})}),e.jsx(M,{plain:!0,color:"muted",onClick:w,title:y?"Exit fullscreen":"Fullscreen","aria-label":y?"Exit fullscreen":"Enter fullscreen","aria-pressed":y,className:"!p-1.5 !rounded-md",children:y?e.jsx(K,{className:x}):e.jsx(J,{className:x})})]}),e.jsxs("div",{className:"map-control-glass flex flex-col items-stretch !overflow-hidden self-end !p-0",children:[e.jsx(M,{plain:!0,color:"muted",onClick:()=>{var e,t;null==(t=null==(e=A.current)?void 0:e.getMap())||t.zoomIn()},title:"Zoom in","aria-label":"Zoom in",className:"!p-1.5 !rounded-none",children:e.jsx(V,{className:x})}),e.jsx("div",{className:"h-px bg-border-subtle"}),e.jsx(M,{plain:!0,color:"muted",onClick:()=>{var e,t;null==(t=null==(e=A.current)?void 0:e.getMap())||t.zoomOut()},title:"Zoom out","aria-label":"Zoom out",className:"!p-1.5 !rounded-none",children:e.jsx(oA,{className:x})}),e.jsx("div",{className:"h-px bg-border-subtle"}),e.jsx(M,{plain:!0,color:"muted",onClick:()=>{var e;const t=null==(e=A.current)?void 0:e.getMap();t&&t.easeTo({bearing:0,pitch:0,duration:300})},title:"Reset bearing to north","aria-label":"Reset bearing to north",className:"!p-1.5 !rounded-none",children:e.jsx(lA,{className:x})})]})]})})}const ae="DeepAnalysis";function se(){return"abcdefghijklmnopqrstuvwxyz0123456789"[Math.floor(36*Math.random())]}function le({isActive:t,hasAnalyzed:r,isLoading:n,onClick:o,basemapMode:i="dark"}){const a="light"===i,s=a?"#4A4A4A":void 0,l=a?"#16A34A":"#4ADE80",[c,u]=A.useState(!1),[d,f]=A.useState(ae),g=A.useRef(!1),h=A.useRef(null),[m]=A.useState(()=>{var A;return"undefined"!=typeof window&&((null==(A=window.matchMedia)?void 0:A.call(window,"(hover: hover)").matches)??!1)}),b=c&&!t&&!n&&m;A.useEffect(()=>{if(c&&!t&&!n&&!g.current){g.current=!0;const A=performance.now(),e=t=>{const r=t-A,n=Math.min(r/700,1),o=Math.floor(12*n);let i="";for(let A=0;A<12;A++)i+=A{h.current&&cancelAnimationFrame(h.current)}},[c,t,n]);const p=n?"Analyzing...":d;return e.jsxs("button",{onClick:o,onMouseEnter:()=>m&&u(!0),onMouseLeave:()=>m&&u(!1),onPointerEnter:()=>m&&u(!0),onPointerLeave:()=>m&&u(!1),disabled:n,className:"flex items-center gap-2 w-full text-left radius-inner transition-base "+(n?"cursor-wait":""),style:{padding:"0.5rem 0.625rem",backgroundColor:t?a?"rgba(220, 252, 231, 1)":"rgba(10, 26, 10, 1)":"var(--map-ui-bg, var(--bg-surface))"},title:n?"Analyzing packet history...":r?t?"Hide topology edges":"Show topology edges":"Load full packet history and build topology",children:[n?e.jsx(cA,{className:"w-3.5 h-3.5 flex-shrink-0 animate-spin",style:{color:l}}):e.jsx(uA,{className:"w-3.5 h-3.5 flex-shrink-0 transition-colors "+(t?"":"text-text-secondary"),style:{...t&&{color:l},...b&&{color:l},...!t&&!b&&s&&{color:s}}}),e.jsx("span",{className:t?"":"text-text-secondary",style:{fontFamily:"ui-monospace, SFMono-Regular, monospace",fontSize:"0.6875rem",fontWeight:t||b?700:500,letterSpacing:"-0.01em",lineHeight:1,...t&&{color:l},...b&&{color:l},...!t&&!b&&s&&{color:s}},children:p})]})}function ce({isActive:t,onClick:r,basemapMode:n="dark"}){const o="light"===n,i=o?"#4A4A4A":void 0,a=o?"#0D7377":"#12A594",[s,l]=A.useState(!1),[c,u]=A.useState(0),d=A.useRef(!1),f=A.useRef(null),[g,h]=A.useState(0),m=A.useRef(!1),[b]=A.useState(()=>{var A;return"undefined"!=typeof window&&((null==(A=window.matchMedia)?void 0:A.call(window,"(hover: hover)").matches)??!1)}),p=s&&!t&&b;A.useEffect(()=>{p&&!m.current&&(m.current=!0,h(1),setTimeout(()=>h(2),100),setTimeout(()=>h(3),200)),s||(m.current=!1,h(0))},[p,s]),A.useEffect(()=>{if(s&&!t&&!d.current){d.current=!0;const A=performance.now(),e=t=>{const r=t-A,n=Math.min(r/400,1);u(n),n<1&&(f.current=requestAnimationFrame(e))};f.current=requestAnimationFrame(e)}return s||(f.current&&(cancelAnimationFrame(f.current),f.current=null),d.current=!1,u(0)),()=>{f.current&&cancelAnimationFrame(f.current)}},[s,t]);const v=A=>{if(t)return a;if(!p)return i;const e=11*c;return A>=e-2&&Ab&&l(!0),onMouseLeave:()=>b&&l(!1),onPointerEnter:()=>b&&l(!0),onPointerLeave:()=>b&&l(!1),className:"flex items-center gap-2 w-full text-left radius-inner transition-base",style:{padding:"0.5rem 0.625rem",backgroundColor:t?o?"rgba(204, 251, 241, 1)":"rgba(10, 36, 32, 1)":"var(--map-ui-bg, var(--bg-surface))"},title:t?"Disable live packet tracing (reduces CPU usage)":"Enable live packet tracing",children:[e.jsx(dA,{className:"w-3.5 h-3.5 flex-shrink-0 "+(t?"":"text-text-secondary"),fill:1===g?"#FFFFFF":3===g?a:"none",stroke:1===g||2===g?"#FFFFFF":t||p?a:i||"currentColor",style:{transition:"fill 0.05s, stroke 0.05s"}}),e.jsx("span",{className:t?"":"text-text-secondary",style:{fontFamily:"ui-monospace, SFMono-Regular, monospace",fontSize:"0.6875rem",fontWeight:t||p?700:500,letterSpacing:"-0.01em",lineHeight:1},children:"LiveTrace".split("").map((A,t)=>e.jsx("span",{style:{color:v(t)||void 0},children:A},t))})]})}const ue="rgba(0, 0, 0, 0.06)",de="rgba(0, 0, 0, 0.25)",fe="#fe8019";function ge({isActive:t,onClick:r,brightness:n=.7,onBrightnessChange:o,basemapMode:i="dark"}){const a="light"===i,s=a?"#4A4A4A":void 0,[l,c]=A.useState(!1),[u,d]=A.useState(!1),[f]=A.useState(()=>{var A;return"undefined"!=typeof window&&((null==(A=window.matchMedia)?void 0:A.call(window,"(hover: hover)").matches)??!1)});A.useEffect(()=>{fA()},[]),A.useEffect(()=>{if(!l||t)return;const A=requestAnimationFrame(()=>d(!0)),e=setTimeout(()=>d(!1),80);return()=>{cancelAnimationFrame(A),clearTimeout(e)}},[l,t]);const m=Math.max(.01,Math.min(1,n)),b=m<.999,p=m>.011,v=l&&!t&&f;return e.jsxs("button",{onClick:r,onMouseEnter:()=>f&&c(!0),onMouseLeave:()=>f&&c(!1),onPointerEnter:()=>f&&c(!0),onPointerLeave:()=>f&&c(!1),className:"flex items-center gap-2 w-full text-left radius-inner transition-base",style:{padding:"0.5rem 0.625rem",backgroundColor:t?a?"rgba(254, 243, 199, 1)":"rgba(26, 20, 8, 1)":"var(--map-ui-bg, var(--bg-surface))"},title:t?"Configure wardriving coverage":"Show wardriving coverage",children:[e.jsx(LA,{className:"w-3.5 h-3.5 flex-shrink-0 transition-colors "+(t?"text-amber-400":"text-text-secondary"),style:v?{color:fe}:!t&&s?{color:s}:void 0}),e.jsx("span",{className:t?"text-amber-400":"text-text-secondary",style:{fontFamily:t||v?"'Jacquard 12', serif":"ui-monospace, SFMono-Regular, monospace",fontSize:t||v?"0.75rem":"0.6875rem",fontWeight:500,letterSpacing:"-0.01em",lineHeight:1,transition:"none",transform:t?"scale(1.45)":v?`scale(${u?1.595:1.45})`:void 0,transformOrigin:"left center",...v?{color:fe}:!t&&s?{color:s}:{}},children:"Wardrive"}),t&&o&&e.jsxs("div",{className:"ml-auto flex items-center gap-0.5",children:[e.jsx("button",{onClick:A=>{A.stopPropagation();const e=Math.max(.01,m-.2);null==o||o(e)},disabled:!p,className:"p-0.5 rounded transition-colors "+(p?"text-amber-400":"cursor-not-allowed"),style:{...p&&{"--hover-bg":a?ue:"var(--bg-elevated)"},...!p&&{color:a?de:"rgba(251, 191, 36, 0.3)"}},onMouseEnter:A=>p&&(A.currentTarget.style.backgroundColor=a?ue:"var(--bg-elevated)"),onMouseLeave:A=>A.currentTarget.style.backgroundColor="transparent",title:`Decrease opacity (${Math.round(100*m)}%)`,children:e.jsx(h,{className:"w-3.5 h-3.5"})}),e.jsx("button",{onClick:A=>{A.stopPropagation();const e=Math.min(1,m+.2);null==o||o(e)},disabled:!b,className:"p-0.5 rounded transition-colors "+(b?"text-amber-400":"cursor-not-allowed"),style:{...b&&{"--hover-bg":a?ue:"var(--bg-elevated)"},...!b&&{color:a?de:"rgba(251, 191, 36, 0.3)"}},onMouseEnter:A=>b&&(A.currentTarget.style.backgroundColor=a?ue:"var(--bg-elevated)"),onMouseLeave:A=>A.currentTarget.style.backgroundColor="transparent",title:`Increase opacity (${Math.round(100*m)}%)`,children:e.jsx(g,{className:"w-3.5 h-3.5"})})]})]})}function he(A){let e=!0,t=-90,r=90,n=-180,o=180;for(const i of A.toLowerCase()){const A="0123456789bcdefghjkmnpqrstuvwxyz".indexOf(i);if(-1!==A)for(let i=4;i>=0;i--){const a=A>>i&1;if(e){const A=(n+o)/2;a?n=A:o=A}else{const A=(t+r)/2;a?t=A:r=A}e=!e}}return{lat:(t+r)/2,lon:(n+o)/2}}function me(A){return Math.exp(-A*Math.LN2/7)}const be="pymc-wardriving-url",pe="pymc-wardriving-enabled",ve="pymc-wardriving-brightness";function ye(A){"undefined"!=typeof localStorage&&(A?localStorage.setItem(be,A):localStorage.removeItem(be))}function we(A){"undefined"!=typeof localStorage&&localStorage.setItem(pe,String(A))}function xe(){if("undefined"==typeof localStorage)return.7;const A=localStorage.getItem(ve);if(A){const e=parseFloat(A);if(!isNaN(e)&&e>=.01&&e<=1)return e}return.7}function ke(A,e=null){if(null!==A){const t=(Math.max(-12,Math.min(12,A))+12)/24;return null!==e?.8*t+(Math.max(-120,Math.min(-50,e))+120)/70*.2:t}return null!==e?(Math.max(-120,Math.min(-50,e))+120)/70:.5}const Ce=mA((A,e)=>({status:"idle",isVisible:"undefined"!=typeof localStorage&&"true"===localStorage.getItem(pe),coveragePoints:[],repeaters:[],error:null,stats:{coverageCount:0,repeaterCount:0,lastUpdated:null},url:"undefined"==typeof localStorage?"":localStorage.getItem(be)||"",brightness:xe(),isModalOpen:!1,openModal:()=>A({isModalOpen:!0}),closeModal:()=>A({isModalOpen:!1}),setUrl:e=>A({url:e}),setBrightness:e=>{const t=Math.max(.01,Math.min(1,e));!function(A){if("undefined"==typeof localStorage)return;const e=Math.max(.01,Math.min(1,A));localStorage.setItem(ve,String(e))}(t),A({brightness:t})},toggleVisibility:()=>{const t=!e().isVisible;we(t),A({isVisible:t})},setVisible:e=>{we(e),A({isVisible:e})},loadCoverage:async e=>{if(!e.trim())return A({error:"Please enter a URL",status:"error"}),!1;try{new URL(e.trim())}catch{return A({error:"Invalid URL format",status:"error"}),!1}A({error:null,status:"connecting"});try{A({status:"loading"});const t=await async function(A){const e=`${A.replace(/\/+$/,"").replace(/\/get-nodes$/,"").replace(/\/get-samples$/,"")}/get-samples`,t=await async function(A,e={},t=8e3){const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{return await fetch(A,{...e,signal:r.signal})}catch(o){if(o instanceof Error&&"AbortError"===o.name)throw new Error(`Connection timed out after ${t/1e3}s`);throw o}finally{clearTimeout(n)}}(e,{headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch precise samples: ${t.status}`);return t.json()}(e.trim());if(!t||"object"!=typeof t)throw new Error("Invalid response from server");if(!Array.isArray(t.keys))throw new Error("No sample data found in response");A({status:"processing"});const r=function(A){var e;const t=[];for(const r of A.keys){if(!r.observed)continue;const{lat:A,lon:n}=he(r.hash),o=parseInt(r.time,10),i=isNaN(o)?30:(Date.now()-o)/864e5,a=me(i),s=ke(r.snr,r.rssi)*(.3+.7*a);t.push({lat:A,lon:n,successRate:r.observed?1:0,weight:s,totalSamples:1,ageDays:i,geohash:r.hash,repeaters:(null==(e=r.path)?void 0:e.map(A=>A.toLowerCase()))||[]})}return t}(t);if(0===r.length)throw new Error("No valid coverage points found");return A({coveragePoints:r,repeaters:[],stats:{coverageCount:r.length,repeaterCount:0,lastUpdated:new Date},status:"success",isVisible:!0,url:e.trim()}),ye(e.trim()),we(!0),!0}catch(t){const e=t instanceof Error?t.message:"Failed to load coverage data";let r=e;return e.includes("timed out")?r="Connection timed out. Server may be unreachable or slow.":e.includes("Failed to fetch")||e.includes("NetworkError")?r="Could not connect to server. Check the URL and try again.":e.includes("CORS")?r="Server does not allow cross-origin requests.":e.includes("404")?r="Coverage endpoint not found. Check the URL.":(e.includes("ERR_NAME_NOT_RESOLVED")||e.includes("DNS"))&&(r="Server not found. Check the URL for typos."),A({error:r,status:"error"}),!1}},clearCoverage:()=>{A({coveragePoints:[],repeaters:[],stats:{coverageCount:0,repeaterCount:0,lastUpdated:null},status:"idle",error:null,isVisible:!1,url:""}),ye(""),we(!1)}})),Be={bg:"#F8F8F8",bgSubtle:"#F0F0F0",bgElevated:"#FFFFFF",bgInput:"#FFFFFF",border:"rgba(0, 0, 0, 0.12)",borderStrong:"rgba(0, 0, 0, 0.20)",borderFocus:"#3B82F6",text:"#1A1A1A",textSecondary:"#4A4A4A",textMuted:"#737373",success:"#059669",successBg:"#ECFDF5",successBorder:"#A7F3D0",error:"#DC2626",errorBg:"#FEF2F2",errorBorder:"#FECACA",info:"#2563EB",infoBg:"#EFF6FF",infoBorder:"#BFDBFE",warning:"#D97706",warningBg:"#FFFBEB",warningBorder:"#FDE68A",primary:"#F59E0B",hoverBg:"rgba(0, 0, 0, 0.04)",sliderTrack:"#E5E7EB",sliderThumb:"#F59E0B"},Me={bg:"var(--bg-surface)",bgSubtle:"var(--bg-subtle)",bgElevated:"var(--bg-elevated)",bgInput:"var(--bg-subtle)",border:"var(--border-subtle)",borderStrong:"var(--border-strong)",borderFocus:"var(--accent-primary)",text:"var(--text-primary)",textSecondary:"var(--text-secondary)",textMuted:"var(--text-muted)",success:"var(--accent-success)",successBg:"rgba(74, 222, 128, 0.1)",successBorder:"rgba(74, 222, 128, 0.3)",error:"var(--accent-danger)",errorBg:"rgba(239, 68, 68, 0.1)",errorBorder:"rgba(239, 68, 68, 0.3)",info:"var(--accent-secondary)",infoBg:"rgba(249, 210, 111, 0.1)",infoBorder:"rgba(249, 210, 111, 0.3)",warning:"var(--accent-secondary)",warningBg:"rgba(249, 210, 111, 0.1)",warningBorder:"rgba(249, 210, 111, 0.3)",primary:"var(--accent-secondary)",hoverBg:"var(--hover-tint)",sliderTrack:"var(--bg-elevated)",sliderThumb:"var(--accent-secondary)"},De=A.createContext({theme:Me,isLight:!1});function Ee(){return A.useContext(De)}const je={type:"spring",visualDuration:.6,bounce:.25,opacity:{duration:.2,ease:"linear"}};function Qe({value:t,format:r,className:n,style:o}){const[i,a]=A.useState("waiting");if(A.useEffect(()=>{const A=setTimeout(()=>a("mounted"),400);return()=>clearTimeout(A)},[]),A.useEffect(()=>{if("mounted"===i){const A=requestAnimationFrame(()=>a("animating"));return()=>cancelAnimationFrame(A)}},[i]),"waiting"===i){const A=(0).toLocaleString(void 0,r);return e.jsx("span",{className:n,style:o,children:A})}return e.jsx(hA,{className:n,style:o,format:r,transition:je,children:"animating"===i?t:0})}function Ne({status:t,hasData:r}){const{theme:n,isLight:o}=Ee(),i=A.useMemo(()=>"connecting"===t||"loading"===t||"processing"===t?{icon:e.jsx(cA,{className:"w-3.5 h-3.5 animate-spin"}),label:"connecting"===t?"Connecting...":"loading"===t?"Loading...":"Processing...",color:n.warning,bg:n.warningBg}:"error"===t?{icon:e.jsx(IA,{className:"w-3.5 h-3.5"}),label:"Disconnected",color:n.error,bg:n.errorBg}:r?{icon:e.jsx(RA,{className:"w-3.5 h-3.5"}),label:"Connected",color:n.success,bg:n.successBg}:{icon:e.jsx(Q,{className:"w-3.5 h-3.5"}),label:"Ready",color:n.textMuted,bg:o?"rgba(0,0,0,0.04)":"rgba(255,255,255,0.04)"},[t,r,n,o]);return e.jsxs(k.div,{initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},className:"flex items-center gap-1.5 px-2 py-1 rounded-full text-xs font-medium",style:{backgroundColor:i.bg,color:i.color},children:[i.icon,e.jsx("span",{children:i.label})]},i.label)}function Se({status:t}){const{theme:r}=Ee(),n=A.useMemo(()=>{switch(t){case"connecting":return 25;case"loading":return 60;case"processing":return 90;default:return 0}},[t]);return 0===n?null:e.jsx(k.div,{initial:{opacity:0,scaleY:0},animate:{opacity:1,scaleY:1},exit:{opacity:0,scaleY:0},className:"h-1 rounded-full overflow-hidden origin-top",style:{backgroundColor:r.sliderTrack},children:e.jsx(k.div,{className:"h-full rounded-full",style:{backgroundColor:r.primary},initial:{width:0},animate:{width:`${n}%`},transition:{duration:.4,ease:"easeOut"}})})}function Fe({variant:t,title:r,description:n,onDismiss:o}){const{theme:i}=Ee(),a=A.useMemo(()=>{switch(t){case"success":return{icon:e.jsx(vA,{className:"w-4 h-4"}),color:i.success,bg:i.successBg,border:i.successBorder};case"error":return{icon:e.jsx(NA,{className:"w-4 h-4"}),color:i.error,bg:i.errorBg,border:i.errorBorder};case"info":return{icon:e.jsx(FA,{className:"w-4 h-4"}),color:i.info,bg:i.infoBg,border:i.infoBorder}}},[t,i]);return e.jsxs(k.div,{initial:{opacity:0,y:-8},animate:{opacity:1,y:0},exit:{opacity:0,y:-8},transition:gA.snappy,className:"flex items-start gap-3 p-3 rounded-lg border",style:{backgroundColor:a.bg,borderColor:a.border,color:a.color},children:[e.jsx("div",{className:"flex-shrink-0 mt-0.5",children:a.icon}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium",children:r}),n&&e.jsx("p",{className:"text-xs mt-0.5 opacity-80",children:n})]}),o&&e.jsx("button",{onClick:o,className:"flex-shrink-0 p-1 rounded hover:bg-black/10 transition-colors","aria-label":"Dismiss",children:e.jsx(N,{className:"w-3.5 h-3.5"})})]})}function Pe({value:r,onChange:n,onSubmit:o,disabled:i}){const{theme:a,isLight:s}=Ee(),[l,c]=A.useState(!1);return e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"block text-sm font-medium",style:{color:a.textSecondary},children:"Coverage Server URL"}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:"url",value:r,onChange:A=>n(A.target.value),onKeyDown:A=>{"Enter"!==A.key||A.shiftKey||i||(A.preventDefault(),o())},onFocus:()=>c(!0),onBlur:()=>c(!1),placeholder:"https://coverage.wcmesh.com",disabled:i,className:t("w-full pl-3 pr-10 py-2.5 rounded-lg border text-sm transition-all duration-150","focus:outline-none",i&&"opacity-50 cursor-not-allowed"),style:{backgroundColor:a.bgInput,borderColor:l?a.borderFocus:a.border,color:a.text,boxShadow:l?"0 0 0 3px "+(s?"rgba(59, 130, 246, 0.15)":"rgba(139, 92, 246, 0.15)"):"none"}}),r&&!i&&e.jsx("button",{onClick:()=>n(""),className:"absolute right-2.5 top-1/2 -translate-y-1/2 p-1 rounded transition-colors",style:{color:a.textMuted},onMouseEnter:A=>A.currentTarget.style.color=a.text,onMouseLeave:A=>A.currentTarget.style.color=a.textMuted,"aria-label":"Clear URL",children:e.jsx(N,{className:"w-4 h-4"})})]}),e.jsx("p",{className:"text-xs",style:{color:a.textMuted},children:"Press Enter to connect, or use the Connect button below"})]})}function Te({value:A,onChange:r}){const{theme:n,isLight:o}=Ee(),i=Math.round(100*A);return e.jsx(k.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},transition:gA.gentle,className:"overflow-hidden",children:e.jsx("div",{className:"p-3 rounded-lg border",style:{backgroundColor:n.bgSubtle,borderColor:n.border},children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"relative w-4 h-4",children:[e.jsx(h,{className:"w-4 h-4 absolute inset-0 transition-opacity",style:{color:n.textMuted,opacity:A<.5?1:0}}),e.jsx(g,{className:"w-4 h-4 absolute inset-0 transition-opacity",style:{color:n.primary,opacity:A>=.5?1:0}})]}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[e.jsx("span",{className:"text-xs font-medium",style:{color:n.textSecondary},children:"Layer Opacity"}),e.jsxs("span",{className:"text-xs font-mono tabular-nums px-1.5 py-0.5 rounded",style:{color:n.text,backgroundColor:o?"rgba(0,0,0,0.06)":"rgba(255,255,255,0.06)"},children:[i,"%"]})]}),e.jsx("input",{type:"range",min:5,max:100,value:i,onChange:A=>r(Number(A.target.value)/100),className:t("w-full h-2 rounded-full appearance-none cursor-pointer","[&::-webkit-slider-thumb]:appearance-none","[&::-webkit-slider-thumb]:w-4","[&::-webkit-slider-thumb]:h-4","[&::-webkit-slider-thumb]:rounded-full","[&::-webkit-slider-thumb]:cursor-pointer","[&::-webkit-slider-thumb]:transition-transform","[&::-webkit-slider-thumb]:hover:scale-110","[&::-webkit-slider-thumb]:shadow-lg","[&::-moz-range-thumb]:appearance-none","[&::-moz-range-thumb]:w-4","[&::-moz-range-thumb]:h-4","[&::-moz-range-thumb]:rounded-full","[&::-moz-range-thumb]:border-0","[&::-moz-range-thumb]:cursor-pointer"),style:{background:`linear-gradient(to right, ${n.primary} ${i}%, ${n.sliderTrack} ${i}%)`,"--thumb-color":n.sliderThumb}}),e.jsx("style",{children:`\n input[type="range"]::-webkit-slider-thumb {\n background-color: ${n.sliderThumb};\n }\n input[type="range"]::-moz-range-thumb {\n background-color: ${n.sliderThumb};\n }\n `})]})]})})})}function Le({coverageCount:A,repeaterCount:t,lastUpdated:r}){const{theme:n}=Ee();return e.jsxs("div",{className:"grid grid-cols-3 gap-2 p-3 rounded-lg border",style:{backgroundColor:n.bgSubtle,borderColor:n.border},children:[e.jsxs("div",{className:"text-center",children:[e.jsx(Qe,{value:A,format:{useGrouping:!0,maximumFractionDigits:0},className:"text-lg font-semibold tabular-nums block",style:{color:n.text}}),e.jsx("div",{className:"text-xs mt-0.5",style:{color:n.textMuted},children:"Points"})]}),e.jsxs("div",{className:"text-center border-x",style:{borderColor:n.border},children:[e.jsx(Qe,{value:t,format:{useGrouping:!0,maximumFractionDigits:0},className:"text-lg font-semibold tabular-nums block",style:{color:n.text}}),e.jsx("div",{className:"text-xs mt-0.5",style:{color:n.textMuted},children:"Repeaters"})]}),e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5",style:{color:n.textMuted}}),e.jsx("span",{className:"text-lg font-semibold tabular-nums",style:{color:n.text},children:r?r.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"—"})]}),e.jsx("div",{className:"text-xs mt-0.5",style:{color:n.textMuted},children:"Updated"})]})]})}function Ie({icon:r,label:n,onClick:o,disabled:i,variant:a="default",active:s}){const{theme:l,isLight:c}=Ee(),u=A.useMemo(()=>"danger"===a?{text:l.error,hoverBg:c?"rgba(220, 38, 38, 0.08)":"rgba(239, 68, 68, 0.15)"}:{text:s?l.primary:l.textSecondary,hoverBg:l.hoverBg},[a,s,l,c]);return e.jsxs("button",{onClick:o,disabled:i,className:t("flex items-center gap-1.5 px-2.5 py-1.5 rounded-md text-sm font-medium transition-colors",i&&"opacity-50 cursor-not-allowed"),style:{color:u.text},onMouseEnter:A=>!i&&(A.currentTarget.style.backgroundColor=u.hoverBg),onMouseLeave:A=>A.currentTarget.style.backgroundColor="transparent",children:[r,e.jsx("span",{children:n})]})}function Re(){const t=n(),r="light"===t,o=r?Be:Me,{isModalOpen:i,closeModal:a,status:s,isVisible:l,stats:c,error:u,url:d,brightness:f,loadCoverage:g,clearCoverage:h,toggleVisibility:m,setUrl:b,setBrightness:p}=Ce(),v="connecting"===s||"loading"===s||"processing"===s,y=c.coverageCount>0,[w,x]=A.useState(!0),[C,D]=A.useState(d);A.useEffect(()=>{D(d)},[d]),A.useEffect(()=>{"error"===s&&x(!0)},[s]);const E=A.useCallback(async()=>{await g(C)},[C,g]),F=A.useCallback(()=>{D(""),h()},[h]),P=A.useCallback(A=>{D(A),b(A)},[b]),T=A.useCallback(()=>{v||a()},[v,a]),L=C.trim().length>0&&!v;return e.jsx(De.Provider,{value:{theme:o,isLight:r},children:e.jsxs(j,{open:i,onClose:T,size:"md",bottomSheet:!0,basemapMode:t,children:[e.jsxs("div",{className:"flex items-center justify-between p-4 border-b",style:{borderColor:o.border},children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg",style:{backgroundColor:o.bgSubtle,color:o.primary},children:e.jsx(Q,{className:"w-5 h-5"})}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-semibold",style:{color:o.text},children:"Wardriving Coverage"}),e.jsx("p",{className:"text-xs",style:{color:o.textMuted},children:"RF coverage heatmap overlay"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ne,{status:s,hasData:y}),!v&&e.jsx("button",{onClick:T,className:"p-2 rounded-lg transition-colors",style:{color:o.textMuted},onMouseEnter:A=>{A.currentTarget.style.color=o.text,A.currentTarget.style.backgroundColor=o.hoverBg},onMouseLeave:A=>{A.currentTarget.style.color=o.textMuted,A.currentTarget.style.backgroundColor="transparent"},"aria-label":"Close",children:e.jsx(N,{className:"w-5 h-5"})})]})]}),e.jsx(B,{children:v&&e.jsx(Se,{status:s})}),e.jsxs(S,{className:"space-y-4",children:[e.jsx(Pe,{value:C,onChange:P,onSubmit:E,disabled:v}),e.jsx(B,{children:"error"===s&&u&&w&&e.jsx(Fe,{variant:"error",title:"Connection Failed",description:u,onDismiss:()=>x(!1)})}),e.jsx(B,{children:"success"===s&&y&&e.jsx(Fe,{variant:"success",title:"Coverage Data Loaded",description:"Adjust opacity below, then close to view on map"})}),e.jsx(B,{children:y&&!v&&e.jsx(k.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:8},transition:gA.snappy,children:e.jsx(Le,{coverageCount:c.coverageCount,repeaterCount:c.repeaterCount,lastUpdated:c.lastUpdated})})}),e.jsx(B,{children:y&&!v&&e.jsx(Te,{value:f,onChange:p})})]}),e.jsxs("div",{className:"flex items-center justify-between p-4 border-t",style:{borderColor:o.border},children:[e.jsx("div",{className:"flex items-center gap-1",children:e.jsx(B,{children:y&&e.jsxs(k.div,{initial:{opacity:0,x:-10},animate:{opacity:1,x:0},exit:{opacity:0,x:-10},transition:gA.snappy,className:"flex items-center gap-1",children:[e.jsx(Ie,{icon:l?e.jsx(q,{className:"w-4 h-4"}):e.jsx(sA,{className:"w-4 h-4"}),label:l?"Hide":"Show",onClick:m,disabled:v,active:l}),e.jsx(Ie,{icon:e.jsx(W,{className:"w-4 h-4"}),label:"Clear",onClick:F,disabled:v,variant:"danger"})]})})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{plain:!0,color:"muted",onClick:T,disabled:v,children:y?"Done":"Cancel"}),e.jsx(M,{color:"warning",onClick:E,disabled:!L,children:v?e.jsxs(e.Fragment,{children:[e.jsx(cA,{"data-slot":"icon",className:"animate-spin"}),"connecting"===s?"Connecting...":"loading"===s?"Loading...":"Processing..."]}):y?e.jsxs(e.Fragment,{children:[e.jsx(aA,{"data-slot":"icon"}),"Refresh"]}):e.jsxs(e.Fragment,{children:[e.jsx(X,{"data-slot":"icon"}),"Connect"]})})]})]})]})})}const _e={bandwidth:.07,threshold:.1,opacity:1,strokeWidth:4.5},ze="#1A1A1A",He="#4A4A4A",Ge="#737373",Ue="rgba(0, 0, 0, 0.12)";function Oe({label:A,value:t,min:r,max:n,step:o,unit:i,formatValue:a,onChange:s,isLightMode:l}){const c=a?a(t):t.toFixed(2);return e.jsxs("div",{className:"flex items-center gap-2 sm:gap-2",children:[e.jsx("span",{className:"text-xs font-medium w-14 sm:w-16 flex-shrink-0",style:l?{color:He}:{color:"var(--text-secondary)"},children:A}),e.jsx("input",{type:"range",min:r,max:n,step:o,value:t,onChange:A=>s(parseFloat(A.target.value)),className:"flex-1 h-1.5 rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none\n [&::-webkit-slider-thumb]:w-3.5\n [&::-webkit-slider-thumb]:h-3.5\n [&::-webkit-slider-thumb]:rounded-full\n [&::-webkit-slider-thumb]:bg-accent-secondary\n [&::-webkit-slider-thumb]:cursor-pointer\n [&::-webkit-slider-thumb]:transition-transform\n [&::-webkit-slider-thumb]:hover:scale-110\n [&::-webkit-slider-thumb]:shadow-md",style:l?{backgroundColor:"rgba(0, 0, 0, 0.12)"}:{backgroundColor:"var(--bg-elevated)"}}),e.jsxs("span",{className:"text-xs font-mono tabular-nums w-12 sm:w-14 text-right flex-shrink-0",style:l?{color:ze}:{color:"var(--text-muted)"},children:[c,i&&e.jsx("span",{className:"ml-0.5 opacity-70",style:l?{color:Ge}:void 0,children:i})]})]})}function Ye({icon:A,label:t,value:r,subtext:n,isLightMode:o}){return e.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 py-0.5 sm:py-1",children:[e.jsx("div",{style:o?{color:Ge}:{color:"var(--text-muted)"},children:A}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx("div",{className:"text-[10px] sm:text-xs truncate",style:o?{color:He}:{color:"var(--text-secondary)"},children:t})}),e.jsxs("div",{className:"text-right",children:[e.jsx("div",{className:"text-xs font-mono tabular-nums",style:o?{color:ze}:{color:"var(--text-primary)"},children:r}),n&&e.jsx("div",{className:"text-[9px] leading-tight opacity-70",style:o?{color:Ge}:{color:"var(--text-muted)"},children:n})]})]})}function Ve({visible:t,onClose:r,settings:n,onSettingsChange:o,partition:i,totalNodes:a,basemapMode:s="dark"}){const l=p(HA),c=A.useRef(null),u="light"===s,d=A.useMemo(()=>{if(!i)return{numCommunities:0,avgCommunitySize:0,minCommunitySize:0,maxCommunitySize:0,fiedlerValue:0,modularity:0,coveragePercent:0};const A=Array.from(i.communities.values()).map(A=>A.length),e=A.reduce((A,e)=>A+e,0);return{numCommunities:i.numCommunities,avgCommunitySize:A.length>0?Math.round(e/A.length):0,minCommunitySize:A.length>0?Math.min(...A):0,maxCommunitySize:A.length>0?Math.max(...A):0,fiedlerValue:i.fiedlerValue,modularity:0,coveragePercent:a>0?Math.round(e/a*100):0}},[i,a]),f=(A,e)=>{o({...n,[A]:e})},g=(111*n.bandwidth).toFixed(1);return e.jsx("div",{ref:c,className:"absolute inset-0 z-[600] pointer-events-none",children:e.jsx(B,{children:t&&e.jsx(k.div,{drag:!0,dragControls:l,dragConstraints:c,dragElastic:.1,dragMomentum:!1,initial:{opacity:0,scale:.95,y:10},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:10},transition:{type:"spring",damping:25,stiffness:300},className:"\n absolute pointer-events-auto\n /* Mobile: bottom sheet style, full width with margins */\n bottom-2 left-2 right-2\n /* sm+: floating panel in bottom-right */\n sm:bottom-16 sm:left-auto sm:right-3 sm:w-64\n /* md+: slightly wider */\n md:w-72\n ",style:{touchAction:"none"},children:e.jsxs("div",{className:"\n map-control-glass rounded-lg overflow-hidden shadow-lg\n /* Mobile: limit height, allow scroll */\n max-h-[45vh] sm:max-h-[calc(100vh-180px)] overflow-y-auto\n /* iOS momentum scrolling */\n overscroll-contain\n ",children:[e.jsxs("div",{className:"\n flex items-center justify-between \n px-3 py-2 sm:px-2.5 sm:py-1.5 \n border-b \n cursor-grab active:cursor-grabbing\n /* Larger touch target on mobile */\n min-h-[44px] sm:min-h-0\n ",style:u?{borderColor:Ue}:void 0,onPointerDown:A=>l.start(A),children:[e.jsxs("div",{className:"flex items-center gap-2 sm:gap-1.5",children:[e.jsx(SA,{className:"w-4 h-4 sm:w-3 sm:h-3",style:u?{color:Ge}:void 0}),e.jsx(QA,{className:"w-4 h-4 sm:w-3.5 sm:h-3.5 text-accent-primary"}),e.jsx("span",{className:"text-sm sm:text-xs font-medium",style:u?{color:ze}:void 0,children:"Partition"})]}),e.jsx(M,{plain:!0,color:"muted",onClick:r,className:"!p-1.5 sm:!p-0.5 !rounded min-w-[44px] min-h-[44px] sm:min-w-0 sm:min-h-0 flex items-center justify-center","aria-label":"Close toolbox",children:e.jsx(N,{className:"w-4 h-4 sm:w-3 sm:h-3"})})]}),e.jsx("div",{className:"px-3 py-2 sm:px-2.5 sm:py-1.5 border-b",style:u?{borderColor:Ue}:void 0,children:e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 sm:gap-x-3 gap-y-1 sm:gap-y-0.5",children:[e.jsx(Ye,{icon:e.jsx(QA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Communities",value:d.numCommunities,isLightMode:u}),e.jsx(Ye,{icon:e.jsx(wA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Avg Size",value:d.avgCommunitySize,subtext:`${d.minCommunitySize}–${d.maxCommunitySize}`,isLightMode:u}),e.jsx(Ye,{icon:e.jsx(TA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Fiedler λ₂",value:d.fiedlerValue.toFixed(3),isLightMode:u}),e.jsx(Ye,{icon:e.jsx(wA,{className:"w-3.5 h-3.5 sm:w-3 sm:h-3"}),label:"Coverage",value:`${d.coveragePercent}%`,subtext:`of ${a}`,isLightMode:u})]})}),e.jsx("div",{className:"px-3 py-2 sm:px-2.5 sm:py-1.5",children:e.jsxs("div",{className:"space-y-3 sm:space-y-1.5",children:[e.jsx(Oe,{label:"Bandwidth",value:n.bandwidth,min:.01,max:.15,step:.005,formatValue:()=>g,unit:"km",onChange:A=>f("bandwidth",A),isLightMode:u}),e.jsx(Oe,{label:"Threshold",value:n.threshold,min:.05,max:.5,step:.01,formatValue:A=>`${Math.round(100*(1-A))}%`,unit:"cov",onChange:A=>f("threshold",A),isLightMode:u}),e.jsx(Oe,{label:"Opacity",value:n.opacity,min:.1,max:1,step:.05,formatValue:A=>`${Math.round(100*A)}%`,onChange:A=>f("opacity",A),isLightMode:u}),e.jsx(Oe,{label:"Stroke",value:n.strokeWidth,min:0,max:5,step:.5,unit:"px",formatValue:A=>A.toFixed(1),onChange:A=>f("strokeWidth",A),isLightMode:u})]})})]})})})})}const We={getItem:A=>{try{return localStorage.getItem(A)}catch{return null}},setItem:(A,e)=>{try{localStorage.setItem(A,e)}catch{}},removeItem:A=>{try{localStorage.removeItem(A)}catch{}}},Ze=mA()(bA(A=>({isEnabled:!1,toggle:()=>A(A=>({isEnabled:!A.isEnabled})),setEnabled:e=>A({isEnabled:e})}),{name:"pymc-live-trace",storage:pA(()=>We)}));var Ke=function(A){var e,t=void 0!==(A=A||{})?A:{},r={};for(e in t)t.hasOwnProperty(e)&&(r[e]=t[e]);var n,o="";"undefined"!=typeof document&&document.currentScript&&(o=document.currentScript.src),o=0!==o.indexOf("blob:")?o.substr(0,o.lastIndexOf("/")+1):"",n=function(A,e,t){var r=new XMLHttpRequest;r.open("GET",A,!0),r.responseType="arraybuffer",r.onload=function(){if(200==r.status||0==r.status&&r.response)e(r.response);else{var n=U(A);n?e(n.buffer):t()}},r.onerror=t,r.send(null)};var i=t.print||function(){}.bind(),a=t.printErr||function(){}.bind();for(e in r)r.hasOwnProperty(e)&&(t[e]=r[e]);r=null,t.arguments&&t.arguments;var s=0,l=!1;function c(A){var e=t["_"+A];return e||tA("Assertion failed: "+("Cannot call unknown function "+A+", make sure it is exported")),e}var u,d,f,g,h,m,b,p="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function v(A,e){return A?function(A,e,t){for(var r=e+t,n=e;A[n]&&!(n>=r);)++n;if(n-e>16&&A.subarray&&p)return p.decode(A.subarray(e,n));for(var o="";e>10,56320|1023&l)}}else o+=String.fromCharCode((31&i)<<6|a)}else o+=String.fromCharCode(i)}return o}(f,A,e):""}function y(A,e){return A%e>0&&(A+=e-A%e),A}function w(A){u=A,t.HEAP8=d=new Int8Array(A),t.HEAP16=g=new Int16Array(A),t.HEAP32=h=new Int32Array(A),t.HEAPU8=f=new Uint8Array(A),t.HEAPU16=new Uint16Array(A),t.HEAPU32=new Uint32Array(A),t.HEAPF32=m=new Float32Array(A),t.HEAPF64=b=new Float64Array(A)}"undefined"!=typeof TextDecoder&&new TextDecoder("utf-16le");var x=t.TOTAL_MEMORY||33554432;function k(A){for(;A.length>0;){var e=A.shift();if("function"!=typeof e){var r=e.func;"number"==typeof r?void 0===e.arg?t.dynCall_v(r):t.dynCall_vi(r,e.arg):r(void 0===e.arg?null:e.arg)}else e()}}x=(u=t.buffer?t.buffer:new ArrayBuffer(x)).byteLength,w(u),h[7156]=5271536;var C=[],B=[],M=[],D=[];function E(A){C.unshift(A)}function j(A){D.unshift(A)}var Q=Math.abs,N=Math.ceil,S=Math.floor,F=Math.min,P=0,T=null;t.preloadedImages={},t.preloadedAudios={};var L,I,R=null,_="data:application/octet-stream;base64,";function z(A){return String.prototype.startsWith?A.startsWith(_):0===A.indexOf(_)}function H(){return d.length}R="data:application/octet-stream;base64,AAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAAAQAAAAQAAAADAAAABgAAAAUAAAACAAAAAAAAAAIAAAADAAAAAQAAAAQAAAAGAAAAAAAAAAUAAAADAAAABgAAAAQAAAAFAAAAAAAAAAEAAAACAAAABAAAAAUAAAAGAAAAAAAAAAIAAAADAAAAAQAAAAUAAAACAAAAAAAAAAEAAAADAAAABgAAAAQAAAAGAAAAAAAAAAUAAAACAAAAAQAAAAQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAACAAAAAAAAAAEAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAYAAAAAAAAABQAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAMAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAIAAAAEAAAABQAAAAYAAAAAAAAAAQAAAAIAAAADAAAABQAAAAYAAAAAAAAAAQAAAAIAAAADAAAABAAAAAYAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAYAAAAAAAAAAwAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAFAAAABAAAAAAAAAABAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAgAAAAQAAAADAAAACAAAAAEAAAAHAAAABgAAAAkAAAAAAAAAAwAAAAIAAAACAAAABgAAAAoAAAALAAAAAAAAAAEAAAAFAAAAAwAAAA0AAAABAAAABwAAAAQAAAAMAAAAAAAAAAQAAAB/AAAADwAAAAgAAAADAAAAAAAAAAwAAAAFAAAAAgAAABIAAAAKAAAACAAAAAAAAAAQAAAABgAAAA4AAAALAAAAEQAAAAEAAAAJAAAAAgAAAAcAAAAVAAAACQAAABMAAAADAAAADQAAAAEAAAAIAAAABQAAABYAAAAQAAAABAAAAAAAAAAPAAAACQAAABMAAAAOAAAAFAAAAAEAAAAHAAAABgAAAAoAAAALAAAAGAAAABcAAAAFAAAAAgAAABIAAAALAAAAEQAAABcAAAAZAAAAAgAAAAYAAAAKAAAADAAAABwAAAANAAAAGgAAAAQAAAAPAAAAAwAAAA0AAAAaAAAAFQAAAB0AAAADAAAADAAAAAcAAAAOAAAAfwAAABEAAAAbAAAACQAAABQAAAAGAAAADwAAABYAAAAcAAAAHwAAAAQAAAAIAAAADAAAABAAAAASAAAAIQAAAB4AAAAIAAAABQAAABYAAAARAAAACwAAAA4AAAAGAAAAIwAAABkAAAAbAAAAEgAAABgAAAAeAAAAIAAAAAUAAAAKAAAAEAAAABMAAAAiAAAAFAAAACQAAAAHAAAAFQAAAAkAAAAUAAAADgAAABMAAAAJAAAAKAAAABsAAAAkAAAAFQAAACYAAAATAAAAIgAAAA0AAAAdAAAABwAAABYAAAAQAAAAKQAAACEAAAAPAAAACAAAAB8AAAAXAAAAGAAAAAsAAAAKAAAAJwAAACUAAAAZAAAAGAAAAH8AAAAgAAAAJQAAAAoAAAAXAAAAEgAAABkAAAAXAAAAEQAAAAsAAAAtAAAAJwAAACMAAAAaAAAAKgAAAB0AAAArAAAADAAAABwAAAANAAAAGwAAACgAAAAjAAAALgAAAA4AAAAUAAAAEQAAABwAAAAfAAAAKgAAACwAAAAMAAAADwAAABoAAAAdAAAAKwAAACYAAAAvAAAADQAAABoAAAAVAAAAHgAAACAAAAAwAAAAMgAAABAAAAASAAAAIQAAAB8AAAApAAAALAAAADUAAAAPAAAAFgAAABwAAAAgAAAAHgAAABgAAAASAAAANAAAADIAAAAlAAAAIQAAAB4AAAAxAAAAMAAAABYAAAAQAAAAKQAAACIAAAATAAAAJgAAABUAAAA2AAAAJAAAADMAAAAjAAAALgAAAC0AAAA4AAAAEQAAABsAAAAZAAAAJAAAABQAAAAiAAAAEwAAADcAAAAoAAAANgAAACUAAAAnAAAANAAAADkAAAAYAAAAFwAAACAAAAAmAAAAfwAAACIAAAAzAAAAHQAAAC8AAAAVAAAAJwAAACUAAAAZAAAAFwAAADsAAAA5AAAALQAAACgAAAAbAAAAJAAAABQAAAA8AAAALgAAADcAAAApAAAAMQAAADUAAAA9AAAAFgAAACEAAAAfAAAAKgAAADoAAAArAAAAPgAAABwAAAAsAAAAGgAAACsAAAA+AAAALwAAAEAAAAAaAAAAKgAAAB0AAAAsAAAANQAAADoAAABBAAAAHAAAAB8AAAAqAAAALQAAACcAAAAjAAAAGQAAAD8AAAA7AAAAOAAAAC4AAAA8AAAAOAAAAEQAAAAbAAAAKAAAACMAAAAvAAAAJgAAACsAAAAdAAAARQAAADMAAABAAAAAMAAAADEAAAAeAAAAIQAAAEMAAABCAAAAMgAAADEAAAB/AAAAPQAAAEIAAAAhAAAAMAAAACkAAAAyAAAAMAAAACAAAAAeAAAARgAAAEMAAAA0AAAAMwAAAEUAAAA2AAAARwAAACYAAAAvAAAAIgAAADQAAAA5AAAARgAAAEoAAAAgAAAAJQAAADIAAAA1AAAAPQAAAEEAAABLAAAAHwAAACkAAAAsAAAANgAAAEcAAAA3AAAASQAAACIAAAAzAAAAJAAAADcAAAAoAAAANgAAACQAAABIAAAAPAAAAEkAAAA4AAAARAAAAD8AAABNAAAAIwAAAC4AAAAtAAAAOQAAADsAAABKAAAATgAAACUAAAAnAAAANAAAADoAAAB/AAAAPgAAAEwAAAAsAAAAQQAAACoAAAA7AAAAPwAAAE4AAABPAAAAJwAAAC0AAAA5AAAAPAAAAEgAAABEAAAAUAAAACgAAAA3AAAALgAAAD0AAAA1AAAAMQAAACkAAABRAAAASwAAAEIAAAA+AAAAKwAAADoAAAAqAAAAUgAAAEAAAABMAAAAPwAAAH8AAAA4AAAALQAAAE8AAAA7AAAATQAAAEAAAAAvAAAAPgAAACsAAABUAAAARQAAAFIAAABBAAAAOgAAADUAAAAsAAAAVgAAAEwAAABLAAAAQgAAAEMAAABRAAAAVQAAADEAAAAwAAAAPQAAAEMAAABCAAAAMgAAADAAAABXAAAAVQAAAEYAAABEAAAAOAAAADwAAAAuAAAAWgAAAE0AAABQAAAARQAAADMAAABAAAAALwAAAFkAAABHAAAAVAAAAEYAAABDAAAANAAAADIAAABTAAAAVwAAAEoAAABHAAAAWQAAAEkAAABbAAAAMwAAAEUAAAA2AAAASAAAAH8AAABJAAAANwAAAFAAAAA8AAAAWAAAAEkAAABbAAAASAAAAFgAAAA2AAAARwAAADcAAABKAAAATgAAAFMAAABcAAAANAAAADkAAABGAAAASwAAAEEAAAA9AAAANQAAAF4AAABWAAAAUQAAAEwAAABWAAAAUgAAAGAAAAA6AAAAQQAAAD4AAABNAAAAPwAAAEQAAAA4AAAAXQAAAE8AAABaAAAATgAAAEoAAAA7AAAAOQAAAF8AAABcAAAATwAAAE8AAABOAAAAPwAAADsAAABdAAAAXwAAAE0AAABQAAAARAAAAEgAAAA8AAAAYwAAAFoAAABYAAAAUQAAAFUAAABeAAAAZQAAAD0AAABCAAAASwAAAFIAAABgAAAAVAAAAGIAAAA+AAAATAAAAEAAAABTAAAAfwAAAEoAAABGAAAAZAAAAFcAAABcAAAAVAAAAEUAAABSAAAAQAAAAGEAAABZAAAAYgAAAFUAAABXAAAAZQAAAGYAAABCAAAAQwAAAFEAAABWAAAATAAAAEsAAABBAAAAaAAAAGAAAABeAAAAVwAAAFMAAABmAAAAZAAAAEMAAABGAAAAVQAAAFgAAABIAAAAWwAAAEkAAABjAAAAUAAAAGkAAABZAAAAYQAAAFsAAABnAAAARQAAAFQAAABHAAAAWgAAAE0AAABQAAAARAAAAGoAAABdAAAAYwAAAFsAAABJAAAAWQAAAEcAAABpAAAAWAAAAGcAAABcAAAAUwAAAE4AAABKAAAAbAAAAGQAAABfAAAAXQAAAE8AAABaAAAATQAAAG0AAABfAAAAagAAAF4AAABWAAAAUQAAAEsAAABrAAAAaAAAAGUAAABfAAAAXAAAAE8AAABOAAAAbQAAAGwAAABdAAAAYAAAAGgAAABiAAAAbgAAAEwAAABWAAAAUgAAAGEAAAB/AAAAYgAAAFQAAABnAAAAWQAAAG8AAABiAAAAbgAAAGEAAABvAAAAUgAAAGAAAABUAAAAYwAAAFAAAABpAAAAWAAAAGoAAABaAAAAcQAAAGQAAABmAAAAUwAAAFcAAABsAAAAcgAAAFwAAABlAAAAZgAAAGsAAABwAAAAUQAAAFUAAABeAAAAZgAAAGUAAABXAAAAVQAAAHIAAABwAAAAZAAAAGcAAABbAAAAYQAAAFkAAAB0AAAAaQAAAG8AAABoAAAAawAAAG4AAABzAAAAVgAAAF4AAABgAAAAaQAAAFgAAABnAAAAWwAAAHEAAABjAAAAdAAAAGoAAABdAAAAYwAAAFoAAAB1AAAAbQAAAHEAAABrAAAAfwAAAGUAAABeAAAAcwAAAGgAAABwAAAAbAAAAGQAAABfAAAAXAAAAHYAAAByAAAAbQAAAG0AAABsAAAAXQAAAF8AAAB1AAAAdgAAAGoAAABuAAAAYgAAAGgAAABgAAAAdwAAAG8AAABzAAAAbwAAAGEAAABuAAAAYgAAAHQAAABnAAAAdwAAAHAAAABrAAAAZgAAAGUAAAB4AAAAcwAAAHIAAABxAAAAYwAAAHQAAABpAAAAdQAAAGoAAAB5AAAAcgAAAHAAAABkAAAAZgAAAHYAAAB4AAAAbAAAAHMAAABuAAAAawAAAGgAAAB4AAAAdwAAAHAAAAB0AAAAZwAAAHcAAABvAAAAcQAAAGkAAAB5AAAAdQAAAH8AAABtAAAAdgAAAHEAAAB5AAAAagAAAHYAAAB4AAAAbAAAAHIAAAB1AAAAeQAAAG0AAAB3AAAAbwAAAHMAAABuAAAAeQAAAHQAAAB4AAAAeAAAAHMAAAByAAAAcAAAAHkAAAB3AAAAdgAAAHkAAAB0AAAAeAAAAHcAAAB1AAAAcQAAAHYAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAABAAAABQAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAACAAAABQAAAAEAAAAAAAAA/////wEAAAAAAAAAAwAAAAQAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAFAAAAAQAAAAAAAAAAAAAAAQAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAADAAAABQAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAEAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAQAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAAABQAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAAAAAD/////AwAAAAAAAAAFAAAAAgAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAADAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAUAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAA/////wMAAAAAAAAABQAAAAIAAAAAAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAUAAAABAAAAAAAAAP////8DAAAAAAAAAAUAAAACAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABAAAAAUAAAABAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAIAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAQAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAAAAAAD/////AQAAAAAAAAADAAAABAAAAAIAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAUAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAEAAAD//////////wEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAAAAAAAAAAAAAAABAAAAAgAAAAYAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAAAQAAAAEAAAAFAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAACAAAAAAAAAAAAAAABAAAAAwAAAAcAAAAGAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAADgAAAAIAAAAAAAAAAAAAAAEAAAAAAAAACQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAMAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAIAAAAAAAAAAAAAAAEAAAAEAAAACAAAAAoAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAAAAAAAAAAAAAQAAAAsAAAAPAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAIAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAgAAAAAAAAAAAAAAAQAAAAwAAAAQAAAADAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAADwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAAAAAAAAAAABAAAACgAAABMAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAIAAAAAAAAAAAAAAAEAAAANAAAAEQAAAA0AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAABAAAADgAAABIAAAAPAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAADwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAABEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABIAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAATAAAAAgAAAAAAAAAAAAAAAQAAAP//////////EwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAEgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAASAAAAAAAAABgAAAAAAAAAIQAAAAAAAAAeAAAAAAAAACAAAAADAAAAMQAAAAEAAAAwAAAAAwAAADIAAAADAAAACAAAAAAAAAAFAAAABQAAAAoAAAAFAAAAFgAAAAAAAAAQAAAAAAAAABIAAAAAAAAAKQAAAAEAAAAhAAAAAAAAAB4AAAAAAAAABAAAAAAAAAAAAAAABQAAAAIAAAAFAAAADwAAAAEAAAAIAAAAAAAAAAUAAAAFAAAAHwAAAAEAAAAWAAAAAAAAABAAAAAAAAAAAgAAAAAAAAAGAAAAAAAAAA4AAAAAAAAACgAAAAAAAAALAAAAAAAAABEAAAADAAAAGAAAAAEAAAAXAAAAAwAAABkAAAADAAAAAAAAAAAAAAABAAAABQAAAAkAAAAFAAAABQAAAAAAAAACAAAAAAAAAAYAAAAAAAAAEgAAAAEAAAAKAAAAAAAAAAsAAAAAAAAABAAAAAEAAAADAAAABQAAAAcAAAAFAAAACAAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAEAAAAAEAAAAFAAAAAAAAAAIAAAAAAAAABwAAAAAAAAAVAAAAAAAAACYAAAAAAAAACQAAAAAAAAATAAAAAAAAACIAAAADAAAADgAAAAEAAAAUAAAAAwAAACQAAAADAAAAAwAAAAAAAAANAAAABQAAAB0AAAAFAAAAAQAAAAAAAAAHAAAAAAAAABUAAAAAAAAABgAAAAEAAAAJAAAAAAAAABMAAAAAAAAABAAAAAIAAAAMAAAABQAAABoAAAAFAAAAAAAAAAEAAAADAAAAAAAAAA0AAAAFAAAAAgAAAAEAAAABAAAAAAAAAAcAAAAAAAAAGgAAAAAAAAAqAAAAAAAAADoAAAAAAAAAHQAAAAAAAAArAAAAAAAAAD4AAAADAAAAJgAAAAEAAAAvAAAAAwAAAEAAAAADAAAADAAAAAAAAAAcAAAABQAAACwAAAAFAAAADQAAAAAAAAAaAAAAAAAAACoAAAAAAAAAFQAAAAEAAAAdAAAAAAAAACsAAAAAAAAABAAAAAMAAAAPAAAABQAAAB8AAAAFAAAAAwAAAAEAAAAMAAAAAAAAABwAAAAFAAAABwAAAAEAAAANAAAAAAAAABoAAAAAAAAAHwAAAAAAAAApAAAAAAAAADEAAAAAAAAALAAAAAAAAAA1AAAAAAAAAD0AAAADAAAAOgAAAAEAAABBAAAAAwAAAEsAAAADAAAADwAAAAAAAAAWAAAABQAAACEAAAAFAAAAHAAAAAAAAAAfAAAAAAAAACkAAAAAAAAAKgAAAAEAAAAsAAAAAAAAADUAAAAAAAAABAAAAAQAAAAIAAAABQAAABAAAAAFAAAADAAAAAEAAAAPAAAAAAAAABYAAAAFAAAAGgAAAAEAAAAcAAAAAAAAAB8AAAAAAAAAMgAAAAAAAAAwAAAAAAAAADEAAAADAAAAIAAAAAAAAAAeAAAAAwAAACEAAAADAAAAGAAAAAMAAAASAAAAAwAAABAAAAADAAAARgAAAAAAAABDAAAAAAAAAEIAAAADAAAANAAAAAMAAAAyAAAAAAAAADAAAAAAAAAAJQAAAAMAAAAgAAAAAAAAAB4AAAADAAAAUwAAAAAAAABXAAAAAwAAAFUAAAADAAAASgAAAAMAAABGAAAAAAAAAEMAAAAAAAAAOQAAAAEAAAA0AAAAAwAAADIAAAAAAAAAGQAAAAAAAAAXAAAAAAAAABgAAAADAAAAEQAAAAAAAAALAAAAAwAAAAoAAAADAAAADgAAAAMAAAAGAAAAAwAAAAIAAAADAAAALQAAAAAAAAAnAAAAAAAAACUAAAADAAAAIwAAAAMAAAAZAAAAAAAAABcAAAAAAAAAGwAAAAMAAAARAAAAAAAAAAsAAAADAAAAPwAAAAAAAAA7AAAAAwAAADkAAAADAAAAOAAAAAMAAAAtAAAAAAAAACcAAAAAAAAALgAAAAMAAAAjAAAAAwAAABkAAAAAAAAAJAAAAAAAAAAUAAAAAAAAAA4AAAADAAAAIgAAAAAAAAATAAAAAwAAAAkAAAADAAAAJgAAAAMAAAAVAAAAAwAAAAcAAAADAAAANwAAAAAAAAAoAAAAAAAAABsAAAADAAAANgAAAAMAAAAkAAAAAAAAABQAAAAAAAAAMwAAAAMAAAAiAAAAAAAAABMAAAADAAAASAAAAAAAAAA8AAAAAwAAAC4AAAADAAAASQAAAAMAAAA3AAAAAAAAACgAAAAAAAAARwAAAAMAAAA2AAAAAwAAACQAAAAAAAAAQAAAAAAAAAAvAAAAAAAAACYAAAADAAAAPgAAAAAAAAArAAAAAwAAAB0AAAADAAAAOgAAAAMAAAAqAAAAAwAAABoAAAADAAAAVAAAAAAAAABFAAAAAAAAADMAAAADAAAAUgAAAAMAAABAAAAAAAAAAC8AAAAAAAAATAAAAAMAAAA+AAAAAAAAACsAAAADAAAAYQAAAAAAAABZAAAAAwAAAEcAAAADAAAAYgAAAAMAAABUAAAAAAAAAEUAAAAAAAAAYAAAAAMAAABSAAAAAwAAAEAAAAAAAAAASwAAAAAAAABBAAAAAAAAADoAAAADAAAAPQAAAAAAAAA1AAAAAwAAACwAAAADAAAAMQAAAAMAAAApAAAAAwAAAB8AAAADAAAAXgAAAAAAAABWAAAAAAAAAEwAAAADAAAAUQAAAAMAAABLAAAAAAAAAEEAAAAAAAAAQgAAAAMAAAA9AAAAAAAAADUAAAADAAAAawAAAAAAAABoAAAAAwAAAGAAAAADAAAAZQAAAAMAAABeAAAAAAAAAFYAAAAAAAAAVQAAAAMAAABRAAAAAwAAAEsAAAAAAAAAOQAAAAAAAAA7AAAAAAAAAD8AAAADAAAASgAAAAAAAABOAAAAAwAAAE8AAAADAAAAUwAAAAMAAABcAAAAAwAAAF8AAAADAAAAJQAAAAAAAAAnAAAAAwAAAC0AAAADAAAANAAAAAAAAAA5AAAAAAAAADsAAAAAAAAARgAAAAMAAABKAAAAAAAAAE4AAAADAAAAGAAAAAAAAAAXAAAAAwAAABkAAAADAAAAIAAAAAMAAAAlAAAAAAAAACcAAAADAAAAMgAAAAMAAAA0AAAAAAAAADkAAAAAAAAALgAAAAAAAAA8AAAAAAAAAEgAAAADAAAAOAAAAAAAAABEAAAAAwAAAFAAAAADAAAAPwAAAAMAAABNAAAAAwAAAFoAAAADAAAAGwAAAAAAAAAoAAAAAwAAADcAAAADAAAAIwAAAAAAAAAuAAAAAAAAADwAAAAAAAAALQAAAAMAAAA4AAAAAAAAAEQAAAADAAAADgAAAAAAAAAUAAAAAwAAACQAAAADAAAAEQAAAAMAAAAbAAAAAAAAACgAAAADAAAAGQAAAAMAAAAjAAAAAAAAAC4AAAAAAAAARwAAAAAAAABZAAAAAAAAAGEAAAADAAAASQAAAAAAAABbAAAAAwAAAGcAAAADAAAASAAAAAMAAABYAAAAAwAAAGkAAAADAAAAMwAAAAAAAABFAAAAAwAAAFQAAAADAAAANgAAAAAAAABHAAAAAAAAAFkAAAAAAAAANwAAAAMAAABJAAAAAAAAAFsAAAADAAAAJgAAAAAAAAAvAAAAAwAAAEAAAAADAAAAIgAAAAMAAAAzAAAAAAAAAEUAAAADAAAAJAAAAAMAAAA2AAAAAAAAAEcAAAAAAAAAYAAAAAAAAABoAAAAAAAAAGsAAAADAAAAYgAAAAAAAABuAAAAAwAAAHMAAAADAAAAYQAAAAMAAABvAAAAAwAAAHcAAAADAAAATAAAAAAAAABWAAAAAwAAAF4AAAADAAAAUgAAAAAAAABgAAAAAAAAAGgAAAAAAAAAVAAAAAMAAABiAAAAAAAAAG4AAAADAAAAOgAAAAAAAABBAAAAAwAAAEsAAAADAAAAPgAAAAMAAABMAAAAAAAAAFYAAAADAAAAQAAAAAMAAABSAAAAAAAAAGAAAAAAAAAAVQAAAAAAAABXAAAAAAAAAFMAAAADAAAAZQAAAAAAAABmAAAAAwAAAGQAAAADAAAAawAAAAMAAABwAAAAAwAAAHIAAAADAAAAQgAAAAAAAABDAAAAAwAAAEYAAAADAAAAUQAAAAAAAABVAAAAAAAAAFcAAAAAAAAAXgAAAAMAAABlAAAAAAAAAGYAAAADAAAAMQAAAAAAAAAwAAAAAwAAADIAAAADAAAAPQAAAAMAAABCAAAAAAAAAEMAAAADAAAASwAAAAMAAABRAAAAAAAAAFUAAAAAAAAAXwAAAAAAAABcAAAAAAAAAFMAAAAAAAAATwAAAAAAAABOAAAAAAAAAEoAAAADAAAAPwAAAAEAAAA7AAAAAwAAADkAAAADAAAAbQAAAAAAAABsAAAAAAAAAGQAAAAFAAAAXQAAAAEAAABfAAAAAAAAAFwAAAAAAAAATQAAAAEAAABPAAAAAAAAAE4AAAAAAAAAdQAAAAQAAAB2AAAABQAAAHIAAAAFAAAAagAAAAEAAABtAAAAAAAAAGwAAAAAAAAAWgAAAAEAAABdAAAAAQAAAF8AAAAAAAAAWgAAAAAAAABNAAAAAAAAAD8AAAAAAAAAUAAAAAAAAABEAAAAAAAAADgAAAADAAAASAAAAAEAAAA8AAAAAwAAAC4AAAADAAAAagAAAAAAAABdAAAAAAAAAE8AAAAFAAAAYwAAAAEAAABaAAAAAAAAAE0AAAAAAAAAWAAAAAEAAABQAAAAAAAAAEQAAAAAAAAAdQAAAAMAAABtAAAABQAAAF8AAAAFAAAAcQAAAAEAAABqAAAAAAAAAF0AAAAAAAAAaQAAAAEAAABjAAAAAQAAAFoAAAAAAAAAaQAAAAAAAABYAAAAAAAAAEgAAAAAAAAAZwAAAAAAAABbAAAAAAAAAEkAAAADAAAAYQAAAAEAAABZAAAAAwAAAEcAAAADAAAAcQAAAAAAAABjAAAAAAAAAFAAAAAFAAAAdAAAAAEAAABpAAAAAAAAAFgAAAAAAAAAbwAAAAEAAABnAAAAAAAAAFsAAAAAAAAAdQAAAAIAAABqAAAABQAAAFoAAAAFAAAAeQAAAAEAAABxAAAAAAAAAGMAAAAAAAAAdwAAAAEAAAB0AAAAAQAAAGkAAAAAAAAAdwAAAAAAAABvAAAAAAAAAGEAAAAAAAAAcwAAAAAAAABuAAAAAAAAAGIAAAADAAAAawAAAAEAAABoAAAAAwAAAGAAAAADAAAAeQAAAAAAAAB0AAAAAAAAAGcAAAAFAAAAeAAAAAEAAAB3AAAAAAAAAG8AAAAAAAAAcAAAAAEAAABzAAAAAAAAAG4AAAAAAAAAdQAAAAEAAABxAAAABQAAAGkAAAAFAAAAdgAAAAEAAAB5AAAAAAAAAHQAAAAAAAAAcgAAAAEAAAB4AAAAAQAAAHcAAAAAAAAAcgAAAAAAAABwAAAAAAAAAGsAAAAAAAAAZAAAAAAAAABmAAAAAAAAAGUAAAADAAAAUwAAAAEAAABXAAAAAwAAAFUAAAADAAAAdgAAAAAAAAB4AAAAAAAAAHMAAAAFAAAAbAAAAAEAAAByAAAAAAAAAHAAAAAAAAAAXAAAAAEAAABkAAAAAAAAAGYAAAAAAAAAdQAAAAAAAAB5AAAABQAAAHcAAAAFAAAAbQAAAAEAAAB2AAAAAAAAAHgAAAAAAAAAXwAAAAEAAABsAAAAAQAAAHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAgAAAAUAAAABAAAABAAAAAAAAAAAAAAABQAAAAMAAAABAAAABgAAAAQAAAACAAAAAAAAAH6iBfbytuk/Gq6akm/58z/Xrm0Liez0P5doSdOpSwRAWs602ULg8D/dT7Rcbo/1v1N1RQHFNOM/g9Snx7HW3L8HWsP8Q3jfP6VwOLosutk/9rjk1YQcxj+gnmKMsNn6P/HDeuPFY+M/YHwDjqKhB0Ci19/fCVrbP4UxKkDWOP6/pvljWa09tL9wi7wrQXjnv/Z6yLImkM2/3yTlOzY14D+m+WNZrT20PzwKVQnrQwNA9nrIsiaQzT/g40rFrRQFwPa45NWEHMa/kbslHEZq97/xw3rjxWPjv4cLC2SMBci/otff3wla27+rKF5oIAv0P1N1RQHFNOO/iDJPGyWHBUAHWsP8Q3jfvwQf/by16gXAfqIF9vK26b8XrO0Vh0r+v9eubQuJ7PS/BxLrA0ZZ479azrTZQuDwv1MK1EuItPw/yscgV9Z6FkAwHBR2WjQMQJNRzXsQ5vY/GlUHVJYKF0DONuFv2lMNQNCGZ28QJfk/0WUwoIL36D8ggDOMQuATQNqMOeAy/wZAWFYOYM+M2z/LWC4uH3oSQDE+LyTsMgRAkJzhRGWFGEDd4soovCQQQKqk0DJMEP8/rGmNdwOLBUAW2X/9xCbjP4hu3dcqJhNAzuYItRvdB0CgzW3zJW/sPxotm/Y2TxRAQAk9XmdDDEC1Kx9MKgT3P1M+NctcghZAFVqcLlb0C0Bgzd3sB2b2P77mZDPUWhZAFROHJpUGCEDAfma5CxXtPz1DWq/zYxRAmhYY5824F0DOuQKWSbAOQNCMqrvu3fs/L6DR22K2wT9nAAxPBU8RQGiN6mW43AFAZhu25b633D8c1YgmzowSQNM25BRKWARArGS08/lNxD+LFssHwmMRQLC5aNcxBgJABL9HT0WRF0CjCmJmOGEOQHsuaVzMP/s/TWJCaGGwBUCeu1PAPLzjP9nqN9DZOBNAKE4JcydbCkCGtbd1qjPzP8dgm9U8jhVAtPeKTkVwDkCeCLss5l37P401XMPLmBdAFd29VMVQDUBg0yA55h75Pz6odcYLCRdApBM4rBrkAkDyAVWgQxbRP4XDMnK20hFAymLlF7EmzD8GUgo9XBHlP3lbK7T9COc/k+OhPthhy7+YGEpnrOvCPzBFhLs15u4/epbqB6H4uz9IuuLF5svev6lzLKY31es/CaQ0envF5z8ZY0xlUADXv7zaz7HYEuI/CfbK1sn16T8uAQfWwxLWPzKn/YuFN94/5KdbC1AFu793fyCSnlfvPzK2y4doAMY/NRg5t1/X6b/shq4QJaHDP5yNIAKPOeI/vpn7BSE30r/X4YQrO6nrv78Ziv/Thto/DqJ1Y6+y5z9l51NaxFrlv8QlA65HOLS/86dxiEc96z+Hj0+LFjneP6LzBZ8LTc2/DaJ1Y6+y579l51NaxFrlP8QlA65HOLQ/8qdxiEc967+Jj0+LFjnev6LzBZ8LTc0/1qdbC1AFuz93fyCSnlfvvzK2y4doAMa/NRg5t1/X6T/vhq4QJaHDv5yNIAKPOeK/wJn7BSE30j/W4YQrO6nrP78Ziv/Thtq/CaQ0envF578XY0xlUADXP7zaz7HYEuK/CvbK1sn16b8rAQfWwxLWvzKn/YuFN96/zWLlF7EmzL8GUgo9XBHlv3lbK7T9COe/kOOhPthhyz+cGEpnrOvCvzBFhLs15u6/c5bqB6H4u79IuuLF5sveP6lzLKY31eu/AQAAAP////8HAAAA/////zEAAAD/////VwEAAP////9hCQAA/////6dBAAD/////kcsBAP/////3kAwA/////8H2VwAAAAAAAAAAAAAAAAACAAAA/////w4AAAD/////YgAAAP////+uAgAA/////8ISAAD/////ToMAAP////8ilwMA/////+4hGQD/////gu2vAAAAAAAAAAAAAAAAAAAAAAACAAAA//////////8BAAAAAwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////////////////////AQAAAAAAAAACAAAA////////////////AwAAAP//////////////////////////////////////////////////////////AgAAAP//////////AQAAAAAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD/////////////////////AQAAAP///////////////wIAAAD///////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAD///////////////8CAAAAAQAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8BAAAAAgAAAP///////////////wAAAAD/////////////////////AwAAAP///////////////////////////////wIAAAD///////////////8BAAAA/////////////////////wAAAAD/////////////////////AwAAAP////////////////////////////////////////////////////8DAAAA/////////////////////wAAAAABAAAA//////////8CAAAA//////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAA////////////////AgAAAAAAAAABAAAA//////////////////////////////////////////////////////////////////////////8DAAAAAQAAAP//////////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAACAAAAAAAAAAIAAAABAAAAAQAAAAIAAAACAAAAAAAAAAUAAAAFAAAAAAAAAAIAAAACAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAEAAAACAAAAAgAAAAIAAAAAAAAABQAAAAYAAAAAAAAAAgAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAACAAAAAQAAAAMAAAACAAAAAgAAAAAAAAAFAAAABwAAAAAAAAACAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAIAAAABAAAABAAAAAIAAAACAAAAAAAAAAUAAAAIAAAAAAAAAAIAAAACAAAAAwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAIAAAAAAAAAAgAAAAEAAAAAAAAAAgAAAAIAAAAAAAAABQAAAAkAAAAAAAAAAgAAAAIAAAADAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAIAAAAAAAAAAwAAAA4AAAACAAAAAAAAAAIAAAADAAAAAAAAAAAAAAACAAAAAgAAAAMAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAACAAAAAgAAAAAAAAADAAAACgAAAAIAAAAAAAAAAgAAAAMAAAABAAAAAAAAAAIAAAACAAAAAwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAIAAAACAAAAAAAAAAMAAAALAAAAAgAAAAAAAAACAAAAAwAAAAIAAAAAAAAAAgAAAAIAAAADAAAACAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAAgAAAAIAAAAAAAAAAwAAAAwAAAACAAAAAAAAAAIAAAADAAAAAwAAAAAAAAACAAAAAgAAAAMAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAACAAAAAgAAAAAAAAADAAAADQAAAAIAAAAAAAAAAgAAAAMAAAAEAAAAAAAAAAIAAAACAAAAAwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAIAAAACAAAAAAAAAAMAAAAGAAAAAgAAAAAAAAACAAAAAwAAAA8AAAAAAAAAAgAAAAIAAAADAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAAIAAAAAAAAAAwAAAAcAAAACAAAAAAAAAAIAAAADAAAAEAAAAAAAAAACAAAAAgAAAAMAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAACAAAAAgAAAAAAAAADAAAACAAAAAIAAAAAAAAAAgAAAAMAAAARAAAAAAAAAAIAAAACAAAAAwAAAA0AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAIAAAACAAAAAAAAAAMAAAAJAAAAAgAAAAAAAAACAAAAAwAAABIAAAAAAAAAAgAAAAIAAAADAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAgAAAAIAAAAAAAAAAwAAAAUAAAACAAAAAAAAAAIAAAADAAAAEwAAAAAAAAACAAAAAgAAAAMAAAAPAAAAAAAAAAAAAAAAAAAAAAAAABAAAAACAAAAAAAAAAIAAAABAAAAEwAAAAIAAAACAAAAAAAAAAUAAAAKAAAAAAAAAAIAAAACAAAAAwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAIAAAAAAAAAAgAAAAEAAAAPAAAAAgAAAAIAAAAAAAAABQAAAAsAAAAAAAAAAgAAAAIAAAADAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAASAAAAAgAAAAAAAAACAAAAAQAAABAAAAACAAAAAgAAAAAAAAAFAAAADAAAAAAAAAACAAAAAgAAAAMAAAASAAAAAAAAAAAAAAAAAAAAAAAAABMAAAACAAAAAAAAAAIAAAABAAAAEQAAAAIAAAACAAAAAAAAAAUAAAANAAAAAAAAAAIAAAACAAAAAwAAABMAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAIAAAAAAAAAAgAAAAEAAAASAAAAAgAAAAIAAAAAAAAABQAAAA4AAAAAAAAAAgAAAAIAAAADAAAAAgAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAEAAAACAAAAAQAAAAAAAAACAAAAAAAAAAUAAAAEAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAFAAAABAAAAAAAAAABAAAABQAAAAQAAAAAAAAABQAAAAAAAAACAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAQAAAAIAAAABAAAAAAAAAAIAAAACAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAAEAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAFAAAABAAAAAAAAAABAAAABQAAAAQAAAAAAAAABQAAAAUAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAAAAAAAAAAAAQAAAAAAAAAAAAA6B6FaUp9QQTPXMuL4myJBraiDfBwx9UBYJseitzTIQOL5if9jqZtAnXX+Z+ycb0C3pucbhRBCQG8wJBYqpRRAlWbDCzCY5z/eFWBUEve6P/+qo4Q50Y4/D9YM3iCcYT8fcA2QJSA0P4ADxu0qAAc/BNcGolVJ2j5d9FACqwquPh9z7MthtI9CSUSYJke/YUJQ/64OyjU0Qpi0+HCmFQdCm3GfIVdh2kHsJ11kAyauQYC3UDFJOoFBSJsFV1OwU0FK5fcxX4AmQWhy/zZIt/lACqaCPsBjzUDbdUNIScugQMYQlVJ4MXNANiuq8GTvRUDxTXnulxEZQFZ8QX5kpuw/qmG/JwYFlEAluh3Q6DB+QKn4vyNq0GZAKOXekas+UUB8xabXXhI6QG63C2pLtSNAdDBtyNfLDUDyOcu67ID2P0rCMvRXAeE/Ki2TSVyzyT9Dk+8Sz2uzP5J+w5ARWp0/NQAoOiMuhj9YnP+RyMJwPxgW7TvQVFk/KgsLYF0kQz9g5dAC6IwzQcgHPVvDex1B1XjppodHBkHJq3OMM9fwQNvcmJ7wddlAInGPpQs/w0BRobq5EBmtQJZ2ai7n+ZVAtv2G5E+bgECG+gIfKBlpQK5f8jdI91JAL39sL/WpPEB8rGxhDqklQK6yUf43XhBAxL9y/tK8+D86XyZpgrHiPwAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////AAAAAP////8AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/////AAAAAAAAAAABAAAAAQAAAAAAAAAAAAAA/////wAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAP////8FAAAABQAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////wAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAFAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////AAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAEAAAAAAAAABQAAAAEAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAQABAAABAQAAAAAAAQAAAAEAAAABAAEAAAAAAAAAAAAAAAAAAAAAquJYWJZl+D9jaeZNtj/zPwwdI9KqaeO/qGefXwdHdz+q4lhYlmX4P+OrlPMN3PI/DB0j0qpp47+7SQLV4VIEQKriWFiWZfg/r2kma3tz8T82eQmLqNIGwMRIWXMqSvo/fcCszPux9j+jara6ozTwP6hnn18HR3c/MSoKLequ8r+SabgA2nj0P7jBLbDOHO8/1Ym/ICfH4T+6lxjvlFXHv73m373LRPU/0vXyDVxo7T+ToKRHJXMAQF/33578aPE/pAyy64tD9T8+U/hCvyruPwxv8Y7YYwLAuXYr8NAiCEB4+LDK0Sn0P1Qeuy4j+eo/OMx50n7K7L+TrGB/nyf8v5ehC2fbYPM/aXMKexiT6z8mFRIMjg/zP7yUVwGGBNw/E6opHERf8z/z0wR2g9DqPw4pBpcOhvu/NbA29uWAA8DMaTExyXzyP02biiQ+Ruk/S8jz2/FKBEB1pzZnpbb9P7pQU4wLfPI//7ZcQXeG6D9CqEQvAYoIwDB2VB6sSgRAVyv8H5We8T+EHWF8XNPmPzB2wT8Nrrg/SEi+cX+w4L8of+GtdSDxP1sjk5AdouU/6ZjOVru13r8K0obqI6bxvwVbdNXyhfA/w5GG024n5z+rwmtMzP8BwLw9pSX49QXABe/2uQxP8D+b6wCzCvXkP7uGT87fK+Q/pz/JWw4coj+qoBf2J0nwP/yE3PUo0+I/vFJeHcaC+D96luSIqvntP/bf8sHUYu8/gZNN41mL4z9bhOqVOF4FwO6lmAh1hQhAbCVxbdhk7z+1C8NdDcfiPwG36x/0OQBAx0WJ76c2+D9nlSHXANfuP2HlfZ3gqOE/EwnVlVPg9r96+oHzEH//v5bXzdT1Auw/DM3GwLsA4D9p/8uoKcr+v+U9x5DQVAPAehjSdghb7D9sc1IetODgP8MVwwB1pu6/azPk6OGe978W8t/TUc3rP+0QMvYfP+A/RsG/QpSE8D+l3uwScxzgPwQaifgujuw/k1Vti1I43z8MAwLnSh0GQH5nYnwwZgJAiGUzWC5s6j8WyyI/BbLgPw4iUapGeQJAB3W+imnp/j9BLWR4ssrpP2t+gG5Pstk/cpBsfm6DCMCOpU9dOZsFQEv8nFypHeo/ehJ6i+6S2D9jqlGEmarLv7STC5TRiOa/bC+x8WZD6D9H3yUkWpDZP8gZvmCMuQLAreY19/eRBsCoPOc8UzzpP6KI/QV+y9g/t/MoboyWzT+Hv5q3Zu3Mvy2xROCT4uY/9gQitMMg1T9abAqhWMDkv1oLTavoUfG/PMUJP9CD5j+fHRX3t6fSPz7W2gk6bvs/WRnuHwqN9D8YFturGCTmP1EZczv0b9I/5t4exabB5D/1ESLh5fTEP9X2z6SYweQ/6lv3I2zT0D9zkRGNUNMAQKoSvc4EIfs/Xggt8wQI5T+mJHHg/w/SP4lhT/9t8vQ/DrZ/DbwH7D+XlhbYZrjkP34LIpFt6c4/lwfp8fLX9L+j96CTTf76v3WdNhEv9uM/d8c3o4lV0D/vFdCHVcsFwAHeDq0F1QhApbYqcZiN5D9KoilqByXLPwX0/diA0vq/0fo0GxnxAMBbaTkvlCzjP/RrFrWXrMs/UYTrky7jA0DB9f4FiZYAQEGAk/3QzeE/r/TeqE8t0D/OqjlsnPbvvz8RKU8JOfW/smSEbK/O4T8MzuyPm3DDP/rFtctq9gZAfb1EVEaSA0Dts5dVInnhP18SFMc79MM/7y34cw6LAMDFrRJsZO0DwC2KLvLSYuA/hx5wcUHewz+49SnK/4ruPyeS0PX9a+E/ZxaaLvvZ3z8WPu5T2QS8Pygo4RIvMqa/BJ0Kqsd0279cKW4ay8jdP3b05bmZ364/10/qtdxk2r+Bcz6CDMvpv54qOw+Amdw/qLV71pW7sT/YKc80nIPUP8OfIaBJ77G/LyTuD1un2z+diYu8efWzP1wU7ACkfwjAZroyPL1yBkAmv3lKJJbbPysKSE4W+p0/dIgqY79TA8ATLTOQ3tsGwJ2zweD/Xdg/XO/jXeFUaL8VW2qLFKfov1cA9Aa6XfK/tIa7YGgI2T+f3hu/sxqPv2nXdPpf3Pc/jkw8Jbda8j+tT/z8tGPVP1yBHpJd35k/KYvYOy1s8j/yz+kCQjPrP9+agH7x59g/PZfJ9aBhpr/rDKzvYBb+PwtkiaGCt/c/vb1mVr+f1T/JIHwHc8Govw7aeF6+9vG/Xv7kD6fp979isYioQYHVP7AIQZuSFrG/3z1AdUTnAUDN3XY9O7f9P0AdQ9ljYNQ/dJANJPTOrb8kLECUiiPlP4yF7UgmStA/9xGmXxCG1T9qZzix4W2zv2SGJRJVrPe/Fh9a2M/B/b8IexzFCoPSP9y1QFD2bLe/Q86cWLJe/b+mOOfYm78BwOTjkPAGE9E/8aPCUKu/ub9pPZyLCiUGwBA7Mev/BQlALOmrlRi+0j+AMJ/dKULBv7iLtL6a6QRAEMDV/yajAUDa62dE3crJP1P70RgBUbq/38hVnR6esT/s1tG10Z/Ov/zLwalHPss/dTS9NKTXx78nMcRzCIEHQAabxDsAmQRA0tyLK3gSyT+Aui7nOhDGv5Gs58z3WgHATN3forJuBMCAui7nOhDGP9Lciyt4Esm/WAJyHQ4c7z8UP5HFIs3iP3U0vTSk18c//MvBqUc+y7+cvv8HLg/Kvy1I/mHsI+K/U/vRGAFRuj/a62dE3crJv8p+WV8KlQjAuQ/nOP43B0CAMJ/dKULBPyzpq5UYvtK/ZoU+VoLh4L9etLlRUfvtv/GjwlCrv7k/5OOQ8AYT0b9DfT9FhufXPwUX8hJp+4u/3LVAUPZstz8IexzFCoPSv9+L609E5fQ/q9Fz7X2J7T9qZzix4W2zP/cRpl8QhtW/vtNilqGX+j8MOy7QJoL0P3SQDST0zq0/QB1D2WNg1L8IIjSvGNkDwGB8Jou2GAfAsAhBm5IWsT9isYioQYHVvyS9D3zb6uy/gnwRa7uM9L/JIHwHc8GoP729Zla/n9W/CsAHJZwmAEDEW6OYT1r6Pz2XyfWgYaY/35qAfvHn2L83Tdy4lS30vxf2/gZ0jPq/XIEekl3fmb+tT/z8tGPVvybPr2zJ1/+/K7mJ0ypVAsCf3hu/sxqPPwCGu2BoCNm/5oITrpZn+r+UDUyDP+n/v1zv413hVGg/nbPB4P9d2L9MlmkxNvgCQMtZlKE85v8/KwpIThb6nb8mv3lKJJbbv8+SZsTvOOc/pQCIIOYw0j+diYu8efWzvy8k7g9bp9u/kxYDa+pKtD9XlYvA8HnVv6i1e9aVu7G/nio7D4CZ3L/WR6rNh5EGwCkgQweBkghAdvTluZnfrr9cKW4ay8jdvxbjhr1f1QVAR5C0MzivAkAWPu5T2QS8v2cWmi772d+/cKj4lzLJCEBx2QJfYrMFQIcecHFB3sO/LYou8tJi4L+jr7lhO38BwIcI0Nb7xgTAXxIUxzv0w7/ts5dVInnhv0T+l8DZLfE/MP3FoFvS5D8MzuyPm3DDv7JkhGyvzuG/tzhzRIRc0b9Ovv3/0z7mv6/03qhPLdC/m4CT/dDN4b9dwjU5VCQBQBBJX1ntCv0/9GsWtZesy79baTkvlCzjv1mjYgEz++S/oW6KnOQW8b9KoilqByXLv6W2KnGYjeS/SmaKz3Vx9z+BZB5yxGHwP3fHN6OJVdC/dZ02ES/2478PuaBjLrXaP4/JU81pPaO/fgsikW3pzr+XlhbYZrjkv4tSn7YDbP0/f2LnFKlF9z+mJHHg/w/Sv14ILfMECOW/mfg4qYhR/b+OP+RQDCACwOpb9yNs09C/1fbPpJjB5L9pN2WOVZ3wv3hHy9nxIve/URlzO/Rv0r8YFturGCTmv1d1/KKR8QPA8gsy9qzSB8CfHRX3t6fSvzzFCT/Qg+a/EYStnrzV9r/2QJqI7Lb9v/YEIrTDINW/LbFE4JPi5r/7kQEs5fEDQHunnf4GeQBAooj9BX7L2L+oPOc8Uzzpv+ydYY2SSAfAL4HK6CRTB0BH3yUkWpDZv2wvsfFmQ+i/Ik0Yzruh6T8fM3LoGoDUP3oSeovukti/S/ycXKkd6r9rEv+7UWcHQCRIQe/GfwNAa36Abk+y2b9BLWR4ssrpv9KT87qa0bM/FTyktw823L8WyyI/BbLgv4hlM1gubOq/DizMp9Ki6r8b5ckdjVrzv5NVbYtSON+/BBqJ+C6O7L/dUBFqgyXYv00Wh18r7+q/7RAy9h8/4L8W8t/TUc3rv4RM5DKx3wDAfvWIj94aBcBsc1IetODgv3oY0nYIW+y/oGcTFF54AUDkJqS/FKX6PwzNxsC7AOC/ltfN1PUC7L+5Wrz/zHnzP6688w2rNOc/YeV9neCo4b9nlSHXANfuvw9RsxKjY/s/1V8GteXE8j+1C8NdDcfiv2wlcW3YZO+/IOywaA7Q8b9bFP+4Tg36v4GTTeNZi+O/9t/ywdRi77+tRc3yFR7eP2bkcHXJkLO//ITc9SjT4r+qoBf2J0nwv2YHKoswwfm/iQcLspCjAcCb6wCzCvXkvwXv9rkMT/C/YkuwYAMXBMApCNUai9kIwMORhtNuJ+e/BVt01fKF8L+ZqWEfvIjsP6h693QZYNk/WyOTkB2i5b8of+GtdSDxvwpaaulDSwVADMQAX+lOAECEHWF8XNPmv1cr/B+VnvG/XyFG6opcCMD/mtR32/UEQP+2XEF3hui/ulBTjAt88r/imfCfRP+yP9zbvtc8XeO/TZuKJD5G6b/MaTExyXzyvxiTQeElXOO/rbJRQVGN9L/z0wR2g9DqvxOqKRxEX/O/FDGCEei99j9x8zV4VYTmP2lzCnsYk+u/l6ELZ9tg878pRXacaDT/v3k6GZRqoQXAVB67LiP56r94+LDK0Sn0vwO6pZ9b7wFAvK0nKVcc9j8+U/hCvyruv6QMsuuLQ/W/FPhKFYv46j8MyxaDTOW/v9L18g1caO2/vebfvctE9b/7GD8ZrF3xv3gx1AR9bQDAuMEtsM4c77+SabgA2nj0v5xKFIwxsATArKNSBaKsB0Cjara6ozTwv33ArMz7sfa/dF2U0FcWCcDxL357DJX/P69pJmt7c/G/quJYWJZl+L/YntVJlnrSP4sRLzXM+fe/46uU8w3c8r+q4lhYlmX4v85lu5+QRwRAsI0H/WU8479jaeZNtj/zv6riWFiWZfi/sI0H/WU847/OZbufkEcEQHAoPUBrnss/9exKzDtFtT88wM8kax+gP9OqeKeAYog/MW0ItiZvcj+ph+smvt5bP2lCaV5dEUU/StaUmQDaLz+kK9y22BMYP0O3whZuMwI/IIbgZGWE6z7UkjYaEM3UPuezxwa9cr8+LybxRMnFpz6E1N8DbPiRPsYjySMvK3s+//////8fAAj//////zMQCP////9/MiAI/////28yMAj/////YzJACP///z9iMlAI////N2IyYAj///8zYjJwCP//vzNiMoAI//+rM2IykAj/f6szYjKgCP8PqzNiMrAI/wOrM2IywAi/A6szYjLQCJ8DqzNiMuAImQOrM2Iy8Aj//////z8PCP//////Kx8I/////38pLwj/////Pyk/CP////85KU8I////PzgpXwj///8POClvCP///w44KX8I//8fDjgpjwj//w8OOCmfCP9/DQ44Ka8I/w8NDjgpvwj/DQ0OOCnPCP8MDQ44Kd8IxwwNDjgp7wjEDA0OOCn/CAcAAAAHAAAAAQAAAAIAAAAEAAAAAwAAAAAAAAAAAAAABwAAAAMAAAABAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAAAAQAAAAMAAAAOAAAABgAAAAsAAAACAAAABwAAAAEAAAAYAAAABQAAAAoAAAABAAAABgAAAAAAAAAmAAAABwAAAAwAAAADAAAACAAAAAIAAAAxAAAACQAAAA4AAAAAAAAABQAAAAQAAAA6AAAACAAAAA0AAAAEAAAACQAAAAMAAAA/AAAACwAAAAYAAAAPAAAACgAAABAAAABIAAAADAAAAAcAAAAQAAAACwAAABEAAABTAAAACgAAAAUAAAATAAAADgAAAA8AAABhAAAADQAAAAgAAAARAAAADAAAABIAAABrAAAADgAAAAkAAAASAAAADQAAABMAAAB1AAAADwAAABMAAAARAAAAEgAAABAAAAAGAAAAAgAAAAMAAAAFAAAABAAAAAAAAAAAAAAAAAAAAAYAAAACAAAAAwAAAAEAAAAFAAAABAAAAAAAAAAAAAAABwAAAAUAAAADAAAABAAAAAEAAAAAAAAAAgAAAAAAAAACAAAAAwAAAAEAAAAFAAAABAAAAAYAAAAAAAAAAAAAABgtRFT7Ifk/GC1EVPsh+b8YLURU+yEJQBgtRFT7IQnAYWxnb3MuYwBoM05laWdoYm9yUm90YXRpb25zAGNvb3JkaWprLmMAX3VwQXA3Q2hlY2tlZABfdXBBcDdyQ2hlY2tlZABkaXJlY3RlZEVkZ2UuYwBkaXJlY3RlZEVkZ2VUb0JvdW5kYXJ5AGFkamFjZW50RmFjZURpclt0bXBGaWprLmZhY2VdW2ZpamsuZmFjZV0gPT0gS0kAZmFjZWlqay5jAF9mYWNlSWprUGVudFRvQ2VsbEJvdW5kYXJ5AGFkamFjZW50RmFjZURpcltjZW50ZXJJSksuZmFjZV1bZmFjZTJdID09IEtJAF9mYWNlSWprVG9DZWxsQm91bmRhcnkAaDNJbmRleC5jAGNvbXBhY3RDZWxscwBsYXRMbmdUb0NlbGwAY2VsbFRvQ2hpbGRQb3MAdmFsaWRhdGVDaGlsZFBvcwBsYXRMbmcuYwBjZWxsQXJlYVJhZHMyAHBvbHlnb24tPm5leHQgPT0gTlVMTABsaW5rZWRHZW8uYwBhZGROZXdMaW5rZWRQb2x5Z29uAG5leHQgIT0gTlVMTABsb29wICE9IE5VTEwAYWRkTmV3TGlua2VkTG9vcABwb2x5Z29uLT5maXJzdCA9PSBOVUxMAGFkZExpbmtlZExvb3AAY29vcmQgIT0gTlVMTABhZGRMaW5rZWRDb29yZABsb29wLT5maXJzdCA9PSBOVUxMAGlubmVyTG9vcHMgIT0gTlVMTABub3JtYWxpemVNdWx0aVBvbHlnb24AYmJveGVzICE9IE5VTEwAY2FuZGlkYXRlcyAhPSBOVUxMAGZpbmRQb2x5Z29uRm9ySG9sZQBjYW5kaWRhdGVCQm94ZXMgIT0gTlVMTAByZXZEaXIgIT0gSU5WQUxJRF9ESUdJVABsb2NhbGlqLmMAY2VsbFRvTG9jYWxJamsAYmFzZUNlbGwgIT0gb3JpZ2luQmFzZUNlbGwAIShvcmlnaW5PblBlbnQgJiYgaW5kZXhPblBlbnQpAGJhc2VDZWxsID09IG9yaWdpbkJhc2VDZWxsAGJhc2VDZWxsICE9IElOVkFMSURfQkFTRV9DRUxMAGxvY2FsSWprVG9DZWxsACFfaXNCYXNlQ2VsbFBlbnRhZ29uKGJhc2VDZWxsKQBiYXNlQ2VsbFJvdGF0aW9ucyA+PSAwAGdyaWRQYXRoQ2VsbHMAcG9seWZpbGwuYwBpdGVyU3RlcFBvbHlnb25Db21wYWN0ADAAdmVydGV4LmMAdmVydGV4Um90YXRpb25zAGNlbGxUb1ZlcnRleABncmFwaC0+YnVja2V0cyAhPSBOVUxMAHZlcnRleEdyYXBoLmMAaW5pdFZlcnRleEdyYXBoAG5vZGUgIT0gTlVMTABhZGRWZXJ0ZXhOb2Rl";var G="function"==typeof atob?atob:function(A){var e,t,r,n,o,i,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",s="",l=0;A=A.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{e=a.indexOf(A.charAt(l++))<<2|(n=a.indexOf(A.charAt(l++)))>>4,t=(15&n)<<4|(o=a.indexOf(A.charAt(l++)))>>2,r=(3&o)<<6|(i=a.indexOf(A.charAt(l++))),s+=String.fromCharCode(e),64!==o&&(s+=String.fromCharCode(t)),64!==i&&(s+=String.fromCharCode(r))}while(l=0){if((0|t)>13780509){if(0|(a=0|le(15,s)))break;s=0|n[(l=s)>>2],l=0|n[l+4>>2]}else c=0|Xe(0|t,0|(a=((0|t)<0)<<31>>31),3,0),l=0|B(),a=0|We(0|t,0|a,1,0),a=0|We(0|(a=0|Xe(0|c,0|l,0|a,0|B())),0|B(),1,0),l=0|B(),n[s>>2]=a,n[s+4>>2]=l,s=a;if(lt(0|r,0,s<<3),0|o){lt(0|o,0,s<<2),a=0|L(A,e,t,r,o,s,l,0);break}(a=0|Ve(s,4))?(c=0|L(A,e,t,r,a,s,l,0),Ye(a),a=c):a=13}else a=2}while(0);return S=i,0|a}function T(A,e,t,r,o){A|=0,e|=0,t|=0,r|=0,o|=0;var i,a,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0;if(a=S,S=S+16|0,m=a+8|0,n[(h=i=a)>>2]=A,n[h+4>>2]=e,(0|t)<0)return S=a,2;if(n[(s=r)>>2]=A,n[s+4>>2]=e,(s=!!(0|o))&&(n[o>>2]=0),0|zA(A,e))return S=a,9;n[m>>2]=0;A:do{if((0|t)>=1)if(s)for(f=1,d=0,g=0,h=1,s=A;;){if(!(d|g)){if(0|(s=0|I(s,e,4,m,i)))break A;if(0|zA(s=0|n[(e=i)>>2],e=0|n[e+4>>2])){s=9;break A}}if(0|(s=0|I(s,e,0|n[26800+(g<<2)>>2],m,i)))break A;if(s=0|n[(e=i)>>2],e=0|n[e+4>>2],n[(A=r+(f<<3)|0)>>2]=s,n[A+4>>2]=e,n[o+(f<<2)>>2]=h,l=(0|(A=d+1|0))==(0|h),u=6==(0|(c=g+1|0)),0|zA(s,e)){s=9;break A}if((0|(h=h+(u&l&1)|0))>(0|t)){s=0;break}f=f+1|0,d=l?0:A,g=l?u?0:c:g}else for(f=1,d=0,g=0,h=1,s=A;;){if(!(d|g)){if(0|(s=0|I(s,e,4,m,i)))break A;if(0|zA(s=0|n[(e=i)>>2],e=0|n[e+4>>2])){s=9;break A}}if(0|(s=0|I(s,e,0|n[26800+(g<<2)>>2],m,i)))break A;if(s=0|n[(e=i)>>2],e=0|n[e+4>>2],n[(A=r+(f<<3)|0)>>2]=s,n[A+4>>2]=e,l=(0|(A=d+1|0))==(0|h),u=6==(0|(c=g+1|0)),0|zA(s,e)){s=9;break A}if((0|(h=h+(u&l&1)|0))>(0|t)){s=0;break}f=f+1|0,d=l?0:A,g=l?u?0:c:g}else s=0}while(0);return S=a,0|s}function L(A,e,t,r,o,i,a,s){t|=0,r|=0,o|=0,s|=0;var l,c,u,d=0,f=0,g=0,h=0,m=0,b=0,p=0;if(u=S,S=S+16|0,l=u+8|0,c=u,d=0|At(0|(A|=0),0|(e|=0),0|(i|=0),0|(a|=0)),g=0|B(),!(!(0|(p=0|n[(b=h=r+(d<<3)|0)>>2]))&!(0|(b=0|n[b+4>>2]))|(f=(0|p)==(0|A)&(0|b)==(0|e))))do{d=0|$e(0|(d=0|We(0|d,0|g,1,0)),0|B(),0|i,0|a),g=0|B(),f=(0|(b=0|n[(p=h=r+(d<<3)|0)>>2]))==(0|A)&(0|(p=0|n[p+4>>2]))==(0|e)}while(!(!(0|b)&!(0|p)|f));if(d=o+(d<<2)|0,f&&(0|n[d>>2])<=(0|s))return S=u,0;if(n[(p=h)>>2]=A,n[p+4>>2]=e,n[d>>2]=s,(0|s)>=(0|t))return S=u,0;switch(f=s+1|0,n[l>>2]=0,0|(d=0|I(A,e,2,l,c))){case 9:m=9;break;case 0:(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f))||(m=9)}A:do{if(9==(0|m)){switch(n[l>>2]=0,0|(d=0|I(A,e,3,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|I(A,e,1,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|I(A,e,5,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|I(A,e,4,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}switch(n[l>>2]=0,0|(d=0|I(A,e,6,l,c))){case 9:break;case 0:if(0|(d=0|L(0|n[(d=c)>>2],0|n[d+4>>2],t,r,o,i,a,f)))break A;break;default:break A}return S=u,0}}while(0);return S=u,0|d}function I(A,e,t,r,o){A|=0,e|=0,o|=0;var i,a,s=0,l=0,c=0,u=0,d=0,f=0,g=0;if((t|=0)>>>0>6)return 1;if(d=(0|n[(r|=0)>>2])%6|0,n[r>>2]=d,(0|d)>0){s=0;do{t=0|vA(t),s=s+1|0}while((0|s)<(0|n[r>>2]))}if(d=0|tt(0|A,0|e,45),B(),(a=127&d)>>>0>121)return 5;i=0|UA(A,e),s=0|tt(0|A,0|e,52),B(),s&=15;A:do{if(s){for(;;){if(c=0|tt(0|A,0|e,0|(l=3*(15-s|0)|0)),B(),7==(0|(c&=7))){e=5;break}if(g=!(0|ZA(s)),s=s+-1|0,f=0|rt(7,0,0|l),e&=~B(),A=0|rt(0|n[(g?432:16)+(28*c|0)+(t<<2)>>2],0,0|l)|A&~f,e|=l=0|B(),!(t=0|n[(g?640:224)+(28*c|0)+(t<<2)>>2])){t=0;break A}if(!s){u=8;break A}}return 0|e}u=8}while(0);8==(0|u)&&(A|=0|rt(0|(g=0|n[848+(28*a|0)+(t<<2)>>2]),0,45),e=B()|-1040385&e,t=0|n[4272+(28*a|0)+(t<<2)>>2],127&~g||(g=0|rt(0|n[848+(28*a|0)+20>>2],0,45),e=B()|-1040385&e,t=0|n[4272+(28*a|0)+20>>2],A=0|YA(g|A,e),e=0|B(),n[r>>2]=1+(0|n[r>>2]))),c=0|tt(0|A,0|e,45),B(),c&=127;A:do{if(0|H(c)){e:do{if(1==(0|UA(A,e))){if((0|a)!=(0|c)){if(0|Y(c,0|n[7696+(28*a|0)>>2])){A=0|WA(A,e),l=1,e=0|B();break}M(27795,26864,533,26872)}switch(0|i){case 3:A=0|YA(A,e),e=0|B(),n[r>>2]=1+(0|n[r>>2]),l=0;break e;case 5:A=0|WA(A,e),e=0|B(),n[r>>2]=5+(0|n[r>>2]),l=0;break e;case 0:return 9;default:return 1}}else l=0}while(0);if((0|t)>0){s=0;do{A=0|OA(A,e),e=0|B(),s=s+1|0}while((0|s)!=(0|t))}if((0|a)!=(0|c)){if(!(0|G(c))){if(!!(0|l)|5!=(0|UA(A,e)))break;n[r>>2]=1+(0|n[r>>2]);break}switch(127&d){case 8:case 118:break A}3!=(0|UA(A,e))&&(n[r>>2]=1+(0|n[r>>2]))}}else if((0|t)>0){s=0;do{A=0|YA(A,e),e=0|B(),s=s+1|0}while((0|s)!=(0|t))}}while(0);return n[r>>2]=((0|n[r>>2])+t|0)%6|0,n[(g=o)>>2]=A,n[g+4>>2]=e,0}function R(A,e,t,r){A|=0,e|=0,t|=0,r|=0;var o,i,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0;if(i=S,S=S+16|0,h=i+8|0,n[(g=o=i)>>2]=A,n[g+4>>2]=e,(0|t)<0)return S=i,2;if(!t)return n[(h=r)>>2]=A,n[h+4>>2]=e,S=i,0;n[h>>2]=0;A:do{if(0|zA(A,e))A=9;else{a=0,g=A;do{if(0|(A=0|I(g,e,4,h,o)))break A;if(a=a+1|0,0|zA(g=0|n[(e=o)>>2],e=0|n[e+4>>2])){A=9;break A}}while((0|a)<(0|t));n[(f=r)>>2]=g,n[f+4>>2]=e,f=t+-1|0,d=0,A=1;do{if(a=26800+(d<<2)|0,5==(0|d))for(l=0|n[a>>2],s=0,a=A;;){if(0|(A=0|I(0|n[(A=o)>>2],0|n[A+4>>2],l,h,o)))break A;if((0|s)!=(0|f)){if(c=0|n[(u=o)>>2],u=0|n[u+4>>2],n[(A=r+(a<<3)|0)>>2]=c,n[A+4>>2]=u,0|zA(c,u)){A=9;break A}A=a+1|0}else A=a;if((0|(s=s+1|0))>=(0|t))break;a=A}else for(l=o,u=0|n[a>>2],c=0,a=A,s=0|n[l>>2],l=0|n[l+4>>2];;){if(0|(A=0|I(s,l,u,h,o)))break A;if(s=0|n[(l=o)>>2],l=0|n[l+4>>2],n[(A=r+(a<<3)|0)>>2]=s,n[A+4>>2]=l,A=a+1|0,0|zA(s,l)){A=9;break A}if((0|(c=c+1|0))>=(0|t))break;a=A}d=d+1|0}while(d>>>0<6);A=(0|g)==(0|n[(A=o)>>2])&&(0|e)==(0|n[A+4>>2])?0:9}}while(0);return S=i,0|A}function _(A,e,t,r){t|=0,r|=0;var o,i,a,s=0,l=0;for(a=S,S=S+16|0,o=a,i=a+8|0,s=(s=!(0|zA(A|=0,e|=0)))?1:2;;){if(n[i>>2]=0,!(0|I(A,e,s,i,o))&((0|n[(l=o)>>2])==(0|t)?(0|n[l+4>>2])==(0|r):0)){A=4;break}if((s=s+1|0)>>>0>=7){s=7,A=4;break}}return 4==(0|A)?(S=a,0|s):0}function z(A,e,t,r,i,a,s){e|=0,t|=0,r|=0,i|=0,a|=0,s|=0;var l,c,u,d,f,g,h,m,b,p,v=0,y=0,w=0,x=0,k=0,C=0,M=0,D=0,E=0,j=0,Q=0,N=0,F=0,P=0,T=0,L=0,I=0,R=0,_=0;if(p=S,S=S+64|0,h=p+48|0,m=p+32|0,b=p+24|0,l=p+8|0,c=p,(0|(y=0|n[(A|=0)>>2]))<=0)return S=p,0;for(u=A+4|0,d=h+8|0,f=m+8|0,g=l+8|0,v=0,F=0;;){N=(w=0|n[u>>2])+(F<<4)|0,n[h>>2]=n[N>>2],n[h+4>>2]=n[N+4>>2],n[h+8>>2]=n[N+8>>2],n[h+12>>2]=n[N+12>>2],(0|F)==(y+-1|0)?(n[m>>2]=n[w>>2],n[m+4>>2]=n[w+4>>2],n[m+8>>2]=n[w+8>>2],n[m+12>>2]=n[w+12>>2]):(N=w+(F+1<<4)|0,n[m>>2]=n[N>>2],n[m+4>>2]=n[N+4>>2],n[m+8>>2]=n[N+8>>2],n[m+12>>2]=n[N+12>>2]),y=0|tA(h,m,r,b);A:do{if(y)w=0,v=y;else if(w=0|n[(y=b)>>2],(0|(y=0|n[y+4>>2]))>0|!(0|y)&w>>>0>0){Q=0,N=0;e:for(;;){if(I=1/(+(w>>>0)+4294967296*+(0|y)),_=+o[h>>3],R=+((y=0|Ze(0|w,0|y,0|Q,0|N))>>>0)+4294967296*+(0|B()),L=+(Q>>>0)+4294967296*+(0|N),o[l>>3]=I*(_*R)+I*(+o[m>>3]*L),o[g>>3]=I*(+o[d>>3]*R)+I*(+o[f>>3]*L),0|(y=0|KA(l,r,c))){v=y;break}C=0|At(0|(E=0|n[(j=c)>>2]),0|(j=0|n[j+4>>2]),0|e,0|t),x=0|B(),w=0|n[(k=y=s+(C<<3)|0)>>2],k=0|n[k+4>>2];t:do{if(!(0|w)&!(0|k))P=y,T=16;else for(M=0,D=0;;){if((0|M)>(0|t)|(0|M)==(0|t)&D>>>0>e>>>0){v=1;break e}if((0|w)==(0|E)&(0|k)==(0|j))break t;if(C=0|$e(0|(y=0|We(0|C,0|x,1,0)),0|B(),0|e,0|t),x=0|B(),D=0|We(0|D,0|M,1,0),M=0|B(),!(0|(w=0|n[(k=y=s+(C<<3)|0)>>2]))&!(0|(k=0|n[k+4>>2]))){P=y,T=16;break}}}while(0);if(16!=(0|T)||(T=0,!(0|E)&!(0|j))||(n[(D=P)>>2]=E,n[D+4>>2]=j,D=a+(n[i>>2]<<3)|0,n[D>>2]=E,n[D+4>>2]=j,D=0|We(0|n[(D=i)>>2],0|n[D+4>>2],1,0),E=0|B(),n[(j=i)>>2]=D,n[j+4>>2]=E),Q=0|We(0|Q,0|N,1,0),N=0|B(),w=0|n[(y=b)>>2],!((0|(y=0|n[y+4>>2]))>(0|N)|(0|y)==(0|N)&w>>>0>Q>>>0)){w=1;break A}}w=0}else w=1}while(0);if(F=F+1|0,!w){T=21;break}if((0|F)>=(0|(y=0|n[A>>2]))){v=0,T=21;break}}return 21==(0|T)?(S=p,0|v):0}function H(A){return(A|=0)>>>0>121?0|(A=0):0|(A=0|n[7696+(28*A|0)+16>>2])}function G(A){return 4==(0|(A|=0))|117==(0|A)|0}function U(A){return 0|n[11120+(216*(0|n[(A|=0)>>2])|0)+(72*(0|n[A+4>>2])|0)+(24*(0|n[A+8>>2])|0)+(n[A+12>>2]<<3)>>2]}function O(A){return 0|n[11120+(216*(0|n[(A|=0)>>2])|0)+(72*(0|n[A+4>>2])|0)+(24*(0|n[A+8>>2])|0)+(n[A+12>>2]<<3)+4>>2]}function Y(A,e){return e|=0,(0|n[7696+(28*(A|=0)|0)+20>>2])==(0|e)?0|(e=1):0|(e=(0|n[7696+(28*A|0)+24>>2])==(0|e))}function V(A,e){return 0|n[848+(28*(A|=0)|0)+((e|=0)<<2)>>2]}function W(A,e){return e|=0,(0|n[848+(28*(A|=0)|0)>>2])==(0|e)?0|(e=0):(0|n[848+(28*A|0)+4>>2])==(0|e)?0|(e=1):(0|n[848+(28*A|0)+8>>2])==(0|e)?0|(e=2):(0|n[848+(28*A|0)+12>>2])==(0|e)?0|(e=3):(0|n[848+(28*A|0)+16>>2])==(0|e)?0|(e=4):(0|n[848+(28*A|0)+20>>2])==(0|e)?0|(e=5):0|((0|n[848+(28*A|0)+24>>2])==(0|e)?6:7)}function Z(A){var e,t,r;return e=(r=+o[16+(A|=0)>>3])-(t=+o[A+24>>3]),+(r>3]<+o[A+24>>3]|0}function J(A){return+(+o[(A|=0)>>3]-+o[A+8>>3])}function q(A,e){A|=0;var t,r,n=0;return(n=+o[(e|=0)>>3])>=+o[A+8>>3]&&n<=+o[A>>3]?(t=+o[A+16>>3],n=+o[A+24>>3],e=(r=+o[e+8>>3])>=n,A=r<=t&1,t>3]<+o[e+8>>3]||+o[A+8>>3]>+o[e>>3]?0|(s=0):(n=(l=+o[A+16>>3])<(u=+o[(t=A+24|0)>>3]),c=(a=+o[(s=e+16|0)>>3])<(i=+o[(r=e+24|0)>>3]),e=u-a>3],e)||(u=+ie(+o[t>>3],A))>+ie(+o[s>>3],e)?0|(c=0):0|(c=1))}function $(A,e){e|=0;var t,r,n,i,a,s=0,l=0,c=0,u=0;return+o[(A|=0)>>3]<+o[e>>3]||+o[A+8>>3]>+o[e+8>>3]?0|(s=0):(n=(i=+o[(s=A+16|0)>>3])<(l=+o[A+24>>3]),c=(u=+o[(t=e+16|0)>>3])<(a=+o[(r=e+24|0)>>3]),e=l-u>3],e)?0|(c=(u=+ie(+o[s>>3],A))>=+ie(+o[t>>3],e)):0|(c=0))}function AA(A,e){A|=0,e|=0;var t,r,i,a,s,l=0;i=S,S=S+176|0,n[(r=i)>>2]=4,l=+o[e>>3],o[r+8>>3]=l,a=+o[e+16>>3],o[r+16>>3]=a,o[r+24>>3]=l,l=+o[e+24>>3],o[r+32>>3]=l,s=+o[e+8>>3],o[r+40>>3]=s,o[r+48>>3]=l,o[r+56>>3]=s,o[r+64>>3]=a,t=96+(e=r+72|0)|0;do{n[e>>2]=0,e=e+4|0}while((0|e)<(0|t));st(0|A,0|r,168),S=i}function eA(A,e,t){A|=0,e|=0,t|=0;var r,a,c,u,d,f,g,h=0,m=0,b=0,p=0,y=0,x=0,k=0;f=S,S=S+288|0,d=f+264|0,p=f+96|0,m=(h=b=f)+96|0;do{n[h>>2]=0,h=h+4|0}while((0|h)<(0|m));return 0|(e=0|Ae(e,b))?(S=f,0|(x=e)):(XA(b=0|n[(m=b)>>2],m=0|n[m+4>>2],d),$A(b,m,p),u=+ae(d,p+8|0),o[d>>3]=+o[A>>3],o[(m=d+8|0)>>3]=+o[A+16>>3],o[p>>3]=+o[A+8>>3],o[(b=p+8|0)>>3]=+o[A+24>>3],a=+ae(d,p),k=+o[m>>3]-+o[b>>3],c=+l(+k),g=+o[d>>3]-+o[p>>3],r=+l(+g),!(0==k|0==g)&&(k=+ot(+c,+r),k=+v(+a*a/+it(+k/+it(+c,+r),3)/(u*(2.59807621135*u)*.8)),o[i>>3]=k,y=~~k>>>0,x=+l(k)>=1?k>0?~~+w(+s(k/4294967296),4294967295)>>>0:~~+v((k-+(~~k>>>0))/4294967296)>>>0:0,2146435072&~n[i+4>>2])?(p=!(0|y)&!(0|x),n[(e=t)>>2]=p?1:y,n[e+4>>2]=p?0:x,e=0):e=1,S=f,0|(x=e))}function tA(A,e,t,r){A|=0,e|=0,t|=0,r|=0;var a,c,u,d,f=0,g=0,h=0;d=S,S=S+288|0,c=d+264|0,u=d+96|0,a=(f=g=d)+96|0;do{n[f>>2]=0,f=f+4|0}while((0|f)<(0|a));return 0|(t=0|Ae(t,g))?(S=d,0|(r=t)):(XA(f=0|n[(t=g)>>2],t=0|n[t+4>>2],c),$A(f,t,u),h=+ae(c,u+8|0),h=+v(+ +ae(A,e)/(2*h)),o[i>>3]=h,t=~~h>>>0,f=+l(h)>=1?h>0?~~+w(+s(h/4294967296),4294967295)>>>0:~~+v((h-+(~~h>>>0))/4294967296)>>>0:0,2146435072&~n[i+4>>2]?(g=!(0|t)&!(0|f),n[r>>2]=g?1:t,n[r+4>>2]=g?0:f,S=d,0|(r=0)):(S=d,0|(r=1)))}function rA(A,e,t,r){e|=0,t|=0,r|=0,n[(A|=0)>>2]=e,n[A+4>>2]=t,n[A+8>>2]=r}function nA(A){var e,t=0,r=0,o=0,i=0,a=0;t=0|n[(A|=0)>>2],r=0|n[(e=A+4|0)>>2],(0|t)<0&&(r=r-t|0,n[e>>2]=r,n[(a=A+8|0)>>2]=(0|n[a>>2])-t,n[A>>2]=0,t=0),(0|r)<0?(t=t-r|0,n[A>>2]=t,i=(0|n[(a=A+8|0)>>2])-r|0,n[a>>2]=i,n[e>>2]=0,r=0):(a=i=A+8|0,i=0|n[i>>2]),(0|i)<0&&(t=t-i|0,n[A>>2]=t,r=r-i|0,n[e>>2]=r,n[a>>2]=0,i=0),(0|(o=(0|i)<(0|(o=(0|r)<(0|t)?r:t))?i:o))<=0||(n[A>>2]=t-o,n[e>>2]=r-o,n[a>>2]=i-o)}function oA(A,e){var t,r;e|=0,r=0|n[8+(A|=0)>>2],t=+((0|n[A+4>>2])-r|0),o[e>>3]=+((0|n[A>>2])-r|0)-.5*t,o[e+8>>3]=.8660254037844386*t}function iA(A,e,t){A|=0,e|=0,n[(t|=0)>>2]=(0|n[e>>2])+(0|n[A>>2]),n[t+4>>2]=(0|n[e+4>>2])+(0|n[A+4>>2]),n[t+8>>2]=(0|n[e+8>>2])+(0|n[A+8>>2])}function aA(A,e,t){A|=0,e|=0,n[(t|=0)>>2]=(0|n[A>>2])-(0|n[e>>2]),n[t+4>>2]=(0|n[A+4>>2])-(0|n[e+4>>2]),n[t+8>>2]=(0|n[A+8>>2])-(0|n[e+8>>2])}function sA(A,e){e|=0;var t,r=0;r=0|y(0|n[(A|=0)>>2],e),n[A>>2]=r,t=0|y(0|n[(r=A+4|0)>>2],e),n[r>>2]=t,e=0|y(0|n[(A=A+8|0)>>2],e),n[A>>2]=e}function lA(A){var e,t,r=0,o=0,i=0,a=0,s=0;s=(0|(t=0|n[(A|=0)>>2]))<0,A=(A=(o=(0|(a=((e=(0|(i=(0|n[A+4>>2])-(s?t:0)|0))<0)?0-i|0:0)+((0|n[A+8>>2])-(s?t:0))|0))<0)?0:a)-((i=(0|(o=(0|A)<(0|(o=(0|(r=(e?0:i)-(o?a:0)|0))<(0|(a=(s?0:t)-(e?i:0)-(o?a:0)|0))?r:a))?A:o))>0)?o:0)|0,r=r-(i?o:0)|0;A:do{switch(a-(i?o:0)|0){case 0:switch(0|r){case 0:return 0|(0|A?1==(0|A)?1:7:0);case 1:return 0|(0|A?1==(0|A)?3:7:2);default:break A}case 1:switch(0|r){case 0:return 0|(0|A?1==(0|A)?5:7:4);case 1:if(A)break A;return 6;default:break A}}}while(0);return 7}function cA(A){var e,t,r=0,o=0,i=0,a=0,s=0,l=0,c=0;if(l=0|n[(t=8+(A|=0)|0)>>2],(e=(0|n[A>>2])-l|0)>>>0>715827881|(l=(0|n[(c=A+4|0)>>2])-l|0)>>>0>715827881){if(a=2147483647-e|0,s=-2147483648-e|0,(i=(0|e)>0)?(0|a)<(0|e):(0|s)>(0|e))return 1;if(o=e<<1,i?(2147483647-o|0)<(0|e):(-2147483648-o|0)>(0|e))return 1;if((0|l)>0?(2147483647-l|0)<(0|l):(-2147483648-l|0)>(0|l))return 1;if(r=3*e|0,o=l<<1,(i?(0|a)<(0|o):(0|s)>(0|o))||((0|e)>-1?(-2147483648|r)>=(0|l):(-2147483648^r)<(0|l)))return 1}else o=l<<1,r=3*e|0;return i=0|Ue(.14285714285714285*+(r-l|0)),n[A>>2]=i,a=0|Ue(.14285714285714285*+(o+e|0)),n[c>>2]=a,n[t>>2]=0,r=(o=(0|a)<(0|i))?i:a,(0|(o=o?a:i))<0&&((-2147483648==(0|o)||((0|r)>0?(2147483647-r|0)<(0|o):(-2147483648-r|0)>(0|o)))&&M(27795,26892,354,26903),((0|r)>-1?(-2147483648|r)>=(0|o):(-2147483648^r)<(0|o))&&M(27795,26892,354,26903)),r=a-i|0,(0|i)<0?(o=0-i|0,n[c>>2]=r,n[t>>2]=o,n[A>>2]=0,i=0):(r=a,o=0),(0|r)<0&&(i=i-r|0,n[A>>2]=i,o=o-r|0,n[t>>2]=o,n[c>>2]=0,r=0),s=i-o|0,a=r-o|0,(0|o)<0?(n[A>>2]=s,n[c>>2]=a,n[t>>2]=0,r=a,a=s,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|r)<(0|a)?r:a))?o:i))<=0||(n[A>>2]=a-i,n[c>>2]=r-i,n[t>>2]=o-i),0}function uA(A){var e,t=0,r=0,o=0,i=0,a=0,s=0,l=0;if(i=0|n[(e=8+(A|=0)|0)>>2],(a=(0|n[A>>2])-i|0)>>>0>715827881|(i=(0|n[(s=A+4|0)>>2])-i|0)>>>0>715827881){if((r=(0|a)>0)?(2147483647-a|0)<(0|a):(-2147483648-a|0)>(0|a))return 1;if(t=a<<1,(o=(0|i)>0)?(2147483647-i|0)<(0|i):(-2147483648-i|0)>(0|i))return 1;if(l=i<<1,o?(2147483647-l|0)<(0|i):(-2147483648-l|0)>(0|i))return 1;if(r?(2147483647-t|0)<(0|i):(-2147483648-t|0)>(0|i))return 1;if(r=3*i|0,(0|i)>-1?(-2147483648|r)>=(0|a):(-2147483648^r)<(0|a))return 1}else r=3*i|0,t=a<<1;return o=0|Ue(.14285714285714285*+(t+i|0)),n[A>>2]=o,i=0|Ue(.14285714285714285*+(r-a|0)),n[s>>2]=i,n[e>>2]=0,t=(r=(0|i)<(0|o))?o:i,(0|(r=r?i:o))<0&&((-2147483648==(0|r)||((0|t)>0?(2147483647-t|0)<(0|r):(-2147483648-t|0)>(0|r)))&&M(27795,26892,402,26917),((0|t)>-1?(-2147483648|t)>=(0|r):(-2147483648^t)<(0|r))&&M(27795,26892,402,26917)),t=i-o|0,(0|o)<0?(r=0-o|0,n[s>>2]=t,n[e>>2]=r,n[A>>2]=0,o=0):(t=i,r=0),(0|t)<0&&(o=o-t|0,n[A>>2]=o,r=r-t|0,n[e>>2]=r,n[s>>2]=0,t=0),a=o-r|0,i=t-r|0,(0|r)<0?(n[A>>2]=a,n[s>>2]=i,n[e>>2]=0,t=i,i=a,r=0):i=o,(0|(o=(0|r)<(0|(o=(0|t)<(0|i)?t:i))?r:o))<=0||(n[A>>2]=i-o,n[s>>2]=t-o,n[e>>2]=r-o),0}function dA(A){var e,t,r=0,o=0,i=0,a=0,s=0;o=0|n[(e=8+(A|=0)|0)>>2],i=0|Ue(.14285714285714285*+((3*(r=(0|n[A>>2])-o|0)|0)-(o=(0|n[(t=A+4|0)>>2])-o|0)|0)),n[A>>2]=i,r=0|Ue(.14285714285714285*+((o<<1)+r|0)),n[t>>2]=r,n[e>>2]=0,o=r-i|0,(0|i)<0?(s=0-i|0,n[t>>2]=o,n[e>>2]=s,n[A>>2]=0,r=o,i=0,o=s):o=0,(0|r)<0&&(i=i-r|0,n[A>>2]=i,o=o-r|0,n[e>>2]=o,n[t>>2]=0,r=0),s=i-o|0,a=r-o|0,(0|o)<0?(n[A>>2]=s,n[t>>2]=a,n[e>>2]=0,r=a,a=s,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|r)<(0|a)?r:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=r-i,n[e>>2]=o-i)}function fA(A){var e,t,r=0,o=0,i=0,a=0,s=0;o=0|n[(e=8+(A|=0)|0)>>2],i=0|Ue(.14285714285714285*+(((r=(0|n[A>>2])-o|0)<<1)+(o=(0|n[(t=A+4|0)>>2])-o|0)|0)),n[A>>2]=i,r=0|Ue(.14285714285714285*+((3*o|0)-r|0)),n[t>>2]=r,n[e>>2]=0,o=r-i|0,(0|i)<0?(s=0-i|0,n[t>>2]=o,n[e>>2]=s,n[A>>2]=0,r=o,i=0,o=s):o=0,(0|r)<0&&(i=i-r|0,n[A>>2]=i,o=o-r|0,n[e>>2]=o,n[t>>2]=0,r=0),s=i-o|0,a=r-o|0,(0|o)<0?(n[A>>2]=s,n[t>>2]=a,n[e>>2]=0,r=a,a=s,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|r)<(0|a)?r:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=r-i,n[e>>2]=o-i)}function gA(A){var e,t,r,o=0,i=0,a=0,s=0;o=0|n[(A|=0)>>2],i=0|n[(t=A+4|0)>>2],a=0|n[(r=A+8|0)>>2],s=i+(3*o|0)|0,n[A>>2]=s,i=a+(3*i|0)|0,n[t>>2]=i,o=(3*a|0)+o|0,n[r>>2]=o,a=i-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=a,n[r>>2]=o,n[A>>2]=0,i=a,a=0):a=s,(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function hA(A){var e,t,r,o=0,i=0,a=0,s=0;s=0|n[(A|=0)>>2],a=(3*(o=0|n[(t=A+4|0)>>2])|0)+s|0,s=(i=0|n[(r=A+8|0)>>2])+(3*s|0)|0,n[A>>2]=s,n[t>>2]=a,o=(3*i|0)+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,s=0):i=a,(0|i)<0&&(s=s-i|0,n[A>>2]=s,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=s-o|0,a=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=a,n[r>>2]=0,s=e,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|a)<(0|s)?a:s))?o:i))<=0||(n[A>>2]=s-i,n[t>>2]=a-i,n[r>>2]=o-i)}function mA(A,e){A|=0;var t,r,o,i=0,a=0,s=0;((e|=0)-1|0)>>>0>=6||(s=(0|n[15440+(12*e|0)>>2])+(0|n[A>>2])|0,n[A>>2]=s,o=A+4|0,a=(0|n[15440+(12*e|0)+4>>2])+(0|n[o>>2])|0,n[o>>2]=a,r=A+8|0,e=(0|n[15440+(12*e|0)+8>>2])+(0|n[r>>2])|0,n[r>>2]=e,i=a-s|0,(0|s)<0?(e=e-s|0,n[o>>2]=i,n[r>>2]=e,n[A>>2]=0,a=0):(i=a,a=s),(0|i)<0&&(a=a-i|0,n[A>>2]=a,e=e-i|0,n[r>>2]=e,n[o>>2]=0,i=0),t=a-e|0,s=i-e|0,(0|e)<0?(n[A>>2]=t,n[o>>2]=s,n[r>>2]=0,a=t,e=0):s=i,(0|(i=(0|e)<(0|(i=(0|s)<(0|a)?s:a))?e:i))<=0||(n[A>>2]=a-i,n[o>>2]=s-i,n[r>>2]=e-i))}function bA(A){var e,t,r,o=0,i=0,a=0,s=0;s=0|n[(A|=0)>>2],a=(o=0|n[(t=A+4|0)>>2])+s|0,s=(i=0|n[(r=A+8|0)>>2])+s|0,n[A>>2]=s,n[t>>2]=a,o=i+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,a=0):(i=a,a=s),(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function pA(A){var e,t,r,o=0,i=0,a=0,s=0;o=0|n[(A|=0)>>2],a=0|n[(t=A+4|0)>>2],i=0|n[(r=A+8|0)>>2],s=a+o|0,n[A>>2]=s,a=i+a|0,n[t>>2]=a,o=i+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,a=0):(i=a,a=s),(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function vA(A){switch(0|(A|=0)){case 1:A=5;break;case 5:A=4;break;case 4:A=6;break;case 6:A=2;break;case 2:A=3;break;case 3:A=1}return 0|A}function yA(A){switch(0|(A|=0)){case 1:A=3;break;case 3:A=2;break;case 2:A=6;break;case 6:A=4;break;case 4:A=5;break;case 5:A=1}return 0|A}function wA(A){var e,t,r,o=0,i=0,a=0,s=0;o=0|n[(A|=0)>>2],i=0|n[(t=A+4|0)>>2],a=0|n[(r=A+8|0)>>2],s=i+(o<<1)|0,n[A>>2]=s,i=a+(i<<1)|0,n[t>>2]=i,o=(a<<1)+o|0,n[r>>2]=o,a=i-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=a,n[r>>2]=o,n[A>>2]=0,i=a,a=0):a=s,(0|i)<0&&(a=a-i|0,n[A>>2]=a,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=a-o|0,s=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=s,n[r>>2]=0,a=e,o=0):s=i,(0|(i=(0|o)<(0|(i=(0|s)<(0|a)?s:a))?o:i))<=0||(n[A>>2]=a-i,n[t>>2]=s-i,n[r>>2]=o-i)}function xA(A){var e,t,r,o=0,i=0,a=0,s=0;s=0|n[(A|=0)>>2],a=((o=0|n[(t=A+4|0)>>2])<<1)+s|0,s=(i=0|n[(r=A+8|0)>>2])+(s<<1)|0,n[A>>2]=s,n[t>>2]=a,o=(i<<1)+o|0,n[r>>2]=o,i=a-s|0,(0|s)<0?(o=o-s|0,n[t>>2]=i,n[r>>2]=o,n[A>>2]=0,s=0):i=a,(0|i)<0&&(s=s-i|0,n[A>>2]=s,o=o-i|0,n[r>>2]=o,n[t>>2]=0,i=0),e=s-o|0,a=i-o|0,(0|o)<0?(n[A>>2]=e,n[t>>2]=a,n[r>>2]=0,s=e,o=0):a=i,(0|(i=(0|o)<(0|(i=(0|a)<(0|s)?a:s))?o:i))<=0||(n[A>>2]=s-i,n[t>>2]=a-i,n[r>>2]=o-i)}function kA(A,e){e|=0;var t,r,o,i=0,a=0,s=0;return o=(0|(r=(0|n[(A|=0)>>2])-(0|n[e>>2])|0))<0,t=(0|(a=(0|n[A+4>>2])-(0|n[e+4>>2])-(o?r:0)|0))<0,e=(e=(A=(0|(s=(o?0-r|0:0)+(0|n[A+8>>2])-(0|n[e+8>>2])+(t?0-a|0:0)|0))<0)?0:s)-((a=(0|(A=(0|e)<(0|(A=(0|(i=(t?0:a)-(A?s:0)|0))<(0|(s=(o?0:r)-(t?a:0)-(A?s:0)|0))?i:s))?e:A))>0)?A:0)|0,i=i-(a?A:0)|0,0|((0|(A=(0|(A=s-(a?A:0)|0))>-1?A:0-A|0))>(0|(e=(0|(i=(0|i)>-1?i:0-i|0))>(0|(e=(0|e)>-1?e:0-e|0))?i:e))?A:e)}function CA(A){var e,t,r,o;t=(o=0|n[(e=8+(A|=0)|0)>>2])-(0|n[A>>2])|0,n[A>>2]=t,A=(0|n[(r=A+4|0)>>2])-o|0,n[r>>2]=A,n[e>>2]=0-(A+t)}function BA(A){var e,t,r=0,o=0,i=0,a=0,s=0;r=0-(o=0|n[(A|=0)>>2])|0,n[A>>2]=r,n[(e=A+8|0)>>2]=0,a=(i=0|n[(t=A+4|0)>>2])+o|0,(0|o)>0?(n[t>>2]=a,n[e>>2]=o,n[A>>2]=0,r=0,i=a):o=0,(0|i)<0?(s=r-i|0,n[A>>2]=s,o=o-i|0,n[e>>2]=o,n[t>>2]=0,a=s-o|0,r=0-o|0,(0|o)<0?(n[A>>2]=a,n[t>>2]=r,n[e>>2]=0,i=r,o=0):(i=0,a=s)):a=r,(0|(r=(0|o)<(0|(r=(0|i)<(0|a)?i:a))?o:r))<=0||(n[A>>2]=a-r,n[t>>2]=i-r,n[e>>2]=o-r)}function MA(A,e){var t=0;switch(t=0|tt(0|(A|=0),0|(e|=0),56),B(),7&t){case 0:case 7:return 0}return t=-2130706433&e|134217728,!0&268435456==(2013265920&e)?!0&16777216==(117440512&e)&!!(0|zA(A,t))?0|(t=0):0|(t=0|LA(A,t)):0|(t=0)}function DA(A,e,t){t|=0;var r,o,i=0,a=0;return o=S,S=S+16|0,r=o,a=-2130706433&(e|=0)|134217728,!0&268435456==(2013265920&e)?(i=0|tt(0|(A|=0),0|e,56),B(),i=0|function(A,e,t){t|=0;var r,o=0,i=0;if(r=S,S=S+16|0,i=r,o=0|zA(A|=0,e|=0),(t+-1|0)>>>0>5)return S=r,-1;if(1==(0|t)&(o=!!(0|o)))return S=r,-1;do{if(!(0|Fe(A,e,i))){if(o){o=(5+(0|n[26352+(t<<2)>>2])-(0|n[i>>2])|0)%5|0;break}o=(6+(0|n[26384+(t<<2)>>2])-(0|n[i>>2])|0)%6|0;break}o=-1}while(0);return S=r,0|(i=o)}(A,a,7&i),-1==(0|i)?(n[t>>2]=0,S=o,0|(a=6)):(0|qA(A,a,r)&&M(27795,26932,282,26947),e=0|tt(0|A,0|e,52),B(),e&=15,0|zA(A,a)?jA(r,e,i,2,t):FA(r,e,i,2,t),S=o,0|(a=0))):(S=o,0|(a=6))}function EA(A,e,t,r,i){e|=0,t|=0,r|=0,i|=0;var a,s=0,u=0;if(s=+function(A){var e,t;return t=+o[(A|=0)>>3],e=+o[A+8>>3],+ +c(+(t*t+e*e))}(A|=0),s<1e-16)return e=15600+(e<<4)|0,n[i>>2]=n[e>>2],n[i+4>>2]=n[e+4>>2],n[i+8>>2]=n[e+8>>2],void(n[i+12>>2]=n[e+12>>2]);if(u=+p(+ +o[A+8>>3],+ +o[A>>3]),(0|t)>0){A=0;do{s*=.37796447300922725,A=A+1|0}while((0|A)!=(0|t))}a=.3333333333333333*s,r?(t=!(0|ZA(t)),s=+b(.381966011250105*(t?a:.37796447300922725*a))):(s=+b(.381966011250105*s),0|ZA(t)&&(u=+ne(u+.3334731722518321))),function(A,e,t,r){A|=0,e=+e,r|=0;var i=0,a=0,s=0,c=0;if((t=+t)<1e-16)return n[r>>2]=n[A>>2],n[r+4>>2]=n[A+4>>2],n[r+8>>2]=n[A+8>>2],void(n[r+12>>2]=n[A+12>>2]);a=e<0?e+6.283185307179586:e,a=e>=6.283185307179586?a+-6.283185307179586:a;do{if(!(a<1e-16)){if(i=+l(+(a+-3.141592653589793))<1e-16,e=+o[A>>3],i){e-=t,o[r>>3]=e,i=r;break}if(s=+d(+t),t=+f(+t),e=s*+f(+e)+ +d(+a)*(t*+d(+e)),e=+m(+((e=e>1?1:e)<-1?-1:e)),o[r>>3]=e,+l(+(e+-1.5707963267948966))<1e-16)return o[r>>3]=1.5707963267948966,void(o[r+8>>3]=0);if(+l(+(e+1.5707963267948966))<1e-16)return o[r>>3]=-1.5707963267948966,void(o[r+8>>3]=0);if(c=1/+d(+e),a=t*+f(+a)*c,t=+o[A>>3],e=c*((s-+f(+e)*+f(+t))/+d(+t)),s=a>1?1:a,e=e>1?1:e,(e=+o[A+8>>3]+ +p(+(s<-1?-1:s),+(e<-1?-1:e)))>3.141592653589793)do{e+=-6.283185307179586}while(e>3.141592653589793);if(e<-3.141592653589793)do{e+=6.283185307179586}while(e<-3.141592653589793);return void(o[r+8>>3]=e)}e=+o[A>>3]+t,o[r>>3]=e,i=r}while(0);if(+l(+(e+-1.5707963267948966))<1e-16)return o[i>>3]=1.5707963267948966,void(o[r+8>>3]=0);if(+l(+(e+1.5707963267948966))<1e-16)return o[i>>3]=-1.5707963267948966,void(o[r+8>>3]=0);if((e=+o[A+8>>3])>3.141592653589793)do{e+=-6.283185307179586}while(e>3.141592653589793);if(e<-3.141592653589793)do{e+=6.283185307179586}while(e<-3.141592653589793);o[r+8>>3]=e}(15600+(e<<4)|0,+ne(+o[15920+(24*e|0)>>3]-u),s,i)}function jA(A,e,t,r,i){A|=0,e|=0,t|=0,r|=0,i|=0;var a,s,l,c,u,d,f,g,h,m,b,p,v,y,w,x,k,C,B,D,E,j,Q=0,N=0,F=0,P=0,T=0,L=0;if(j=S,S=S+272|0,P=j+240|0,B=j,D=j+224|0,E=j+208|0,b=j+176|0,p=j+160|0,v=j+192|0,y=j+144|0,w=j+128|0,x=j+112|0,k=j+96|0,C=j+80|0,n[(Q=j+256|0)>>2]=e,n[P>>2]=n[A>>2],n[P+4>>2]=n[A+4>>2],n[P+8>>2]=n[A+8>>2],n[P+12>>2]=n[A+12>>2],QA(P,Q,B),n[i>>2]=0,(0|(P=r+t+(5==(0|r)&1)|0))<=(0|t))S=j;else{s=D+4|0,l=b+4|0,c=t+5|0,u=16880+((a=0|n[Q>>2])<<2)|0,d=16960+(a<<2)|0,f=w+8|0,g=x+8|0,h=k+8|0,m=E+4|0,F=t;A:for(;;){N=B+((0|F)%5<<4)|0,n[E>>2]=n[N>>2],n[E+4>>2]=n[N+4>>2],n[E+8>>2]=n[N+8>>2],n[E+12>>2]=n[N+12>>2];do{}while(2==(0|NA(E,a,0,1)));if((0|F)>(0|t)&!!(0|ZA(e))){if(n[b>>2]=n[E>>2],n[b+4>>2]=n[E+4>>2],n[b+8>>2]=n[E+8>>2],n[b+12>>2]=n[E+12>>2],oA(s,p),r=0|n[b>>2],Q=0|n[17040+(80*r|0)+(n[D>>2]<<2)>>2],n[b>>2]=n[18640+(80*r|0)+(20*Q|0)>>2],(0|(N=0|n[18640+(80*r|0)+(20*Q|0)+16>>2]))>0){A=0;do{bA(l),A=A+1|0}while((0|A)<(0|N))}switch(N=18640+(80*r|0)+(20*Q|0)+4|0,n[v>>2]=n[N>>2],n[v+4>>2]=n[N+4>>2],n[v+8>>2]=n[N+8>>2],sA(v,3*(0|n[u>>2])|0),iA(l,v,l),nA(l),oA(l,y),T=+(0|n[d>>2]),o[w>>3]=3*T,o[f>>3]=0,L=-1.5*T,o[x>>3]=L,o[g>>3]=2.598076211353316*T,o[k>>3]=L,o[h>>3]=-2.598076211353316*T,0|n[17040+(80*(0|n[b>>2])|0)+(n[E>>2]<<2)>>2]){case 1:A=x,r=w;break;case 3:A=k,r=x;break;case 2:A=w,r=k;break;default:A=12;break A}Qe(p,y,r,A,C),EA(C,0|n[b>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2])}if((0|F)<(0|c)&&(oA(m,b),EA(b,0|n[E>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2])),n[D>>2]=n[E>>2],n[D+4>>2]=n[E+4>>2],n[D+8>>2]=n[E+8>>2],n[D+12>>2]=n[E+12>>2],(0|(F=F+1|0))>=(0|P)){A=3;break}}3!=(0|A)?12==(0|A)&&M(26970,27017,572,27027):S=j}}function QA(A,e,t){A|=0,e|=0,t|=0;var r,o=0,i=0,a=0,s=0,l=0;r=S,S=S+128|0,i=r,s=20240,l=60+(a=o=r+64|0)|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));s=20304,l=(a=i)+60|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));o=(l=!(0|ZA(0|n[e>>2])))?o:i,wA(i=A+4|0),xA(i),0|ZA(0|n[e>>2])&&(hA(i),n[e>>2]=1+(0|n[e>>2])),n[t>>2]=n[A>>2],iA(i,o,e=t+4|0),nA(e),n[t+16>>2]=n[A>>2],iA(i,o+12|0,e=t+20|0),nA(e),n[t+32>>2]=n[A>>2],iA(i,o+24|0,e=t+36|0),nA(e),n[t+48>>2]=n[A>>2],iA(i,o+36|0,e=t+52|0),nA(e),n[t+64>>2]=n[A>>2],iA(i,o+48|0,t=t+68|0),nA(t),S=r}function NA(A,e,t,r){t|=0,r|=0;var o,i,a,s,l,c,u=0,d=0,f=0,g=0,h=0;if(c=S,S=S+32|0,l=c+12|0,i=c,h=4+(A|=0)|0,g=0|n[16960+((e|=0)<<2)>>2],g=(s=!!(0|r))?3*g|0:g,u=0|n[h>>2],o=0|n[(a=A+8|0)>>2],s){if((0|(u=o+u+(r=0|n[(d=A+12|0)>>2])|0))==(0|g))return S=c,1;f=d}else u=o+u+(r=0|n[(f=A+12|0)>>2])|0;if((0|u)<=(0|g))return S=c,0;do{if((0|r)>0){if(r=0|n[A>>2],(0|o)>0){d=18640+(80*r|0)+60|0,r=A;break}r=18640+(80*r|0)+40|0,t?(rA(l,g,0,0),aA(h,l,i),pA(i),iA(i,l,h),d=r,r=A):(d=r,r=A)}else d=18640+(80*(0|n[A>>2])|0)+20|0,r=A}while(0);if(n[r>>2]=n[d>>2],(0|n[(u=d+16|0)>>2])>0){r=0;do{bA(h),r=r+1|0}while((0|r)<(0|n[u>>2]))}return A=d+4|0,n[l>>2]=n[A>>2],n[l+4>>2]=n[A+4>>2],n[l+8>>2]=n[A+8>>2],e=0|n[16880+(e<<2)>>2],sA(l,s?3*e|0:e),iA(h,l,h),nA(h),r=s&&((0|n[a>>2])+(0|n[h>>2])+(0|n[f>>2])|0)==(0|g)?1:2,S=c,0|r}function SA(A,e){A|=0,e|=0;var t=0;do{t=0|NA(A,e,0,1)}while(2==(0|t));return 0|t}function FA(A,e,t,r,i){A|=0,e|=0,t|=0,r|=0,i|=0;var a,s,l,c,u,d,f,g,h,m,b,p,v,y,w,x,k,C,B=0,D=0,E=0,j=0,Q=0;if(C=S,S=S+240|0,y=C+208|0,w=C,x=C+192|0,k=C+176|0,h=C+160|0,m=C+144|0,b=C+128|0,p=C+112|0,v=C+96|0,n[(B=C+224|0)>>2]=e,n[y>>2]=n[A>>2],n[y+4>>2]=n[A+4>>2],n[y+8>>2]=n[A+8>>2],n[y+12>>2]=n[A+12>>2],PA(y,B,w),n[i>>2]=0,(0|(g=r+t+(6==(0|r)&1)|0))<=(0|t))S=C;else{s=t+6|0,l=16960+((a=0|n[B>>2])<<2)|0,c=m+8|0,u=b+8|0,d=p+8|0,f=x+4|0,D=0,E=t,r=-1;A:for(;;){if(A=w+((B=(0|E)%6|0)<<4)|0,n[x>>2]=n[A>>2],n[x+4>>2]=n[A+4>>2],n[x+8>>2]=n[A+8>>2],n[x+12>>2]=n[A+12>>2],A=D,D=0|NA(x,a,0,1),(0|E)>(0|t)&!!(0|ZA(e))&&1!=(0|A)&&(0|n[x>>2])!=(0|r)){switch(oA(w+((B+5|0)%6<<4)+4|0,k),oA(w+(B<<4)+4|0,h),j=+(0|n[l>>2]),o[m>>3]=3*j,o[c>>3]=0,Q=-1.5*j,o[b>>3]=Q,o[u>>3]=2.598076211353316*j,o[p>>3]=Q,o[d>>3]=-2.598076211353316*j,B=0|n[y>>2],0|n[17040+(80*B|0)+(((0|r)==(0|B)?n[x>>2]:r)<<2)>>2]){case 1:A=b,r=m;break;case 3:A=p,r=b;break;case 2:A=m,r=p;break;default:A=8;break A}Qe(k,h,r,A,v),0|Ne(k,v)||0|Ne(h,v)||(EA(v,0|n[y>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2]))}if((0|E)<(0|s)&&(oA(f,k),EA(k,0|n[x>>2],a,1,i+8+(n[i>>2]<<4)|0),n[i>>2]=1+(0|n[i>>2])),(0|(E=E+1|0))>=(0|g)){A=3;break}r=0|n[x>>2]}3!=(0|A)?8==(0|A)&&M(27054,27017,737,27099):S=C}}function PA(A,e,t){A|=0,e|=0,t|=0;var r,o=0,i=0,a=0,s=0,l=0;r=S,S=S+160|0,i=r,s=20368,l=72+(a=o=r+80|0)|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));s=20448,l=(a=i)+72|0;do{n[a>>2]=n[s>>2],a=a+4|0,s=s+4|0}while((0|a)<(0|l));o=(l=!(0|ZA(0|n[e>>2])))?o:i,wA(i=A+4|0),xA(i),0|ZA(0|n[e>>2])&&(hA(i),n[e>>2]=1+(0|n[e>>2])),n[t>>2]=n[A>>2],iA(i,o,e=t+4|0),nA(e),n[t+16>>2]=n[A>>2],iA(i,o+12|0,e=t+20|0),nA(e),n[t+32>>2]=n[A>>2],iA(i,o+24|0,e=t+36|0),nA(e),n[t+48>>2]=n[A>>2],iA(i,o+36|0,e=t+52|0),nA(e),n[t+64>>2]=n[A>>2],iA(i,o+48|0,e=t+68|0),nA(e),n[t+80>>2]=n[A>>2],iA(i,o+60|0,t=t+84|0),nA(t),S=r}function TA(A,e){return e=0|tt(0|(A|=0),0|(e|=0),45),B(),127&e}function LA(A,e){A|=0;var t=0,n=0,o=0,i=0;return!0&134217728==(-16777216&(e|=0))?(n=0|tt(0|A,0|e,52),B(),n&=15,t=0|tt(0|A,0|e,45),B(),(t&=127)>>>0>121?0|(A=0):!(613566756&(i=0|rt(0|(o=0|tt(0|A,0|e,0|(i=3*(15^n)|0))),0|B(),0|i))&Ze(-1227133514,-1171,0|i,0|(o=0|B())))&!(4681&o&B())&&15==(0|n)|!(0|(i=0|tt(0|rt(0|~A,0|~e,0|(i=19+(3*n|0)|0)),0|B(),0|i)))&!(0|B())?0|r[20528+t|0]?!(0|A)&!(0|(e&=8191))?0|(i=1):(i=0|nt(0|A,0|e),B(),0|!!((63-i|0)%3|0)):0|(i=1):0|(i=0)):0|(A=0)}function IA(A,e,t,r){A|=0,t|=0,r|=0;var o=0,i=0,a=0,s=0;if(o=0|rt(0|(e|=0),0,52),i=0|B(),t=0|rt(0|t,0,45),t=0|i|B()|134225919,(0|e)<1)return i=-1,r=t,n[(e=A)>>2]=i,void(n[(A=A+4|0)>>2]=r);for(i=1,o=-1;s=0|rt(7,0,0|(a=3*(15-i|0)|0)),t&=~B(),o=o&~s|(a=0|rt(0|r,0,0|a)),t=0|t|B(),(0|i)!=(0|e);)i=i+1|0;n[(a=s=A)>>2]=o,n[(s=s+4|0)>>2]=t}function RA(A,e,t,r){t|=0,r|=0;var o=0,i=0;if(i=0|tt(0|(A|=0),0|(e|=0),52),B(),t>>>0>15)return 4;if((0|(i&=15))<(0|t))return 12;if((0|i)==(0|t))return n[r>>2]=A,n[r+4>>2]=e,0;if(o=0|rt(0|t,0,52),o|=A,A=B()|-15728641&e,(0|i)>(0|t))do{e=0|rt(7,0,3*(14-t|0)|0),t=t+1|0,o|=e,A=0|B()|A}while((0|t)<(0|i));return n[r>>2]=o,n[r+4>>2]=A,0}function _A(A,e,t,r){t|=0,r|=0;var o=0,i=0,a=0;if(i=0|tt(0|(A|=0),0|(e|=0),52),B(),!((0|t)<16&(0|(i&=15))<=(0|t)))return 4;o=t-i|0,t=0|tt(0|A,0|e,45),B();A:do{if(0|H(127&t)){e:do{if(0|i){for(t=1;!((a=0|rt(7,0,3*(15-t|0)|0))&A)&!((0|B())&e);){if(!(t>>>0>>0))break e;t=t+1|0}t=0|pe(7,0,o,((0|o)<0)<<31>>31),o=0|B();break A}}while(0);t=0|We(0|(t=0|Xe(0|(t=0|pe(7,0,o,((0|o)<0)<<31>>31)),0|B(),5,0)),0|B(),-5,-1),t=0|We(0|(t=0|qe(0|t,0|B(),6,0)),0|B(),1,0),o=0|B()}else t=0|pe(7,0,o,((0|o)<0)<<31>>31),o=0|B()}while(0);return n[(a=r)>>2]=t,n[a+4>>2]=o,0}function zA(A,e){var t=0,r=0,n=0;if(n=0|tt(0|(A|=0),0|(e|=0),45),B(),!(0|H(127&n)))return 0;n=0|tt(0|A,0|e,52),B(),n&=15;A:do{if(n)for(r=1;;){if(t=0|tt(0|A,0|e,3*(15-r|0)|0),B(),0|(t&=7))break A;if(!(r>>>0>>0)){t=0;break}r=r+1|0}else t=0}while(0);return 1&!(0|t)}function HA(A,e,t,r){return A|=0,e|=0,(0|(r|=0))<(0|(t|=0))?(r=A,C(0|(t=e)),0|r):(t=0|rt(-1,-1,3+(3*(r-t|0)|0)|0),r=0|rt(0|~t,0|~B(),3*(15-r|0)|0),t=~B()&e,r=~r&A,C(0|t),0|r)}function GA(A,e,t,r){t|=0,r|=0;var o=0;return o=0|tt(0|(A|=0),0|(e|=0),52),B(),(0|t)<16&(0|(o&=15))<=(0|t)?((0|o)<(0|t)&&(o=0|rt(-1,-1,3+(3*(t+-1-o|0)|0)|0),o=0|rt(0|~o,0|~B(),3*(15-t|0)|0),e=~B()&e,A&=~o),o=0|rt(0|t,0,52),t=-15728641&e|B(),n[r>>2]=A|o,n[r+4>>2]=t,0|(r=0)):0|(r=4)}function UA(A,e){var t=0,r=0,n=0;if(n=0|tt(0|(A|=0),0|(e|=0),52),B(),!(n&=15))return 0;for(r=1;;){if(t=0|tt(0|A,0|e,3*(15-r|0)|0),B(),0|(t&=7)){r=5;break}if(!(r>>>0>>0)){t=0,r=5;break}r=r+1|0}return 5==(0|r)?0|t:0}function OA(A,e){var t=0,r=0,n=0,o=0,i=0,a=0,s=0;if(s=0|tt(0|(A|=0),0|(e|=0),52),B(),!(s&=15))return s=A,C(0|(a=e)),0|s;for(a=1,t=0;;){r=0|rt(7,0,0|(o=3*(15-a|0)|0)),n=0|B(),i=0|tt(0|A,0|e,0|o),B(),A=(o=0|rt(0|vA(7&i),0,0|o))|A&~r,e=(i=0|B())|e&~n;A:do{if(!t)if(!(o&r|0)&!(i&n|0))t=0;else if(r=0|tt(0|A,0|e,52),B(),r&=15){t=1;e:for(;;){switch(i=0|tt(0|A,0|e,3*(15-t|0)|0),B(),7&i){case 1:break e;case 0:break;default:t=1;break A}if(!(t>>>0>>0)){t=1;break A}t=t+1|0}for(t=1;;){if(n=0|tt(0|A,0|e,0|(i=3*(15-t|0)|0)),B(),o=0|rt(7,0,0|i),e&=~B(),A=A&~o|(i=0|rt(0|vA(7&n),0,0|i)),e=0|e|B(),!(t>>>0>>0)){t=1;break}t=t+1|0}}else t=1}while(0);if(!(a>>>0>>0))break;a=a+1|0}return C(0|e),0|A}function YA(A,e){var t=0,r=0,n=0,o=0,i=0;if(r=0|tt(0|(A|=0),0|(e|=0),52),B(),!(r&=15))return r=A,C(0|(t=e)),0|r;for(t=1;i=0|tt(0|A,0|e,0|(o=3*(15-t|0)|0)),B(),n=0|rt(7,0,0|o),e&=~B(),A=(o=0|rt(0|vA(7&i),0,0|o))|A&~n,e=0|B()|e,t>>>0>>0;)t=t+1|0;return C(0|e),0|A}function VA(A,e){var t=0,r=0,n=0,o=0,i=0,a=0,s=0;if(s=0|tt(0|(A|=0),0|(e|=0),52),B(),!(s&=15))return s=A,C(0|(a=e)),0|s;for(a=1,t=0;;){r=0|rt(7,0,0|(o=3*(15-a|0)|0)),n=0|B(),i=0|tt(0|A,0|e,0|o),B(),A=(o=0|rt(0|yA(7&i),0,0|o))|A&~r,e=(i=0|B())|e&~n;A:do{if(!t)if(!(o&r|0)&!(i&n|0))t=0;else if(r=0|tt(0|A,0|e,52),B(),r&=15){t=1;e:for(;;){switch(i=0|tt(0|A,0|e,3*(15-t|0)|0),B(),7&i){case 1:break e;case 0:break;default:t=1;break A}if(!(t>>>0>>0)){t=1;break A}t=t+1|0}for(t=1;;){if(o=0|rt(7,0,0|(n=3*(15-t|0)|0)),i=e&~B(),e=0|tt(0|A,0|e,0|n),B(),A=A&~o|(e=0|rt(0|yA(7&e),0,0|n)),e=0|i|B(),!(t>>>0>>0)){t=1;break}t=t+1|0}}else t=1}while(0);if(!(a>>>0>>0))break;a=a+1|0}return C(0|e),0|A}function WA(A,e){var t=0,r=0,n=0,o=0,i=0;if(r=0|tt(0|(A|=0),0|(e|=0),52),B(),!(r&=15))return r=A,C(0|(t=e)),0|r;for(t=1;o=0|rt(7,0,0|(i=3*(15-t|0)|0)),n=e&~B(),e=0|tt(0|A,0|e,0|i),B(),A=(e=0|rt(0|yA(7&e),0,0|i))|A&~o,e=0|B()|n,t>>>0>>0;)t=t+1|0;return C(0|e),0|A}function ZA(A){return(0|(A|=0))%2|0}function KA(A,e,t){t|=0;var r,i=0;return r=S,S=S+16|0,i=r,(e|=0)>>>0>15?(S=r,0|(i=4)):2146435072&~n[4+(A|=0)>>2]&&2146435072&~n[A+8+4>>2]?(function(A,e,t){var r,i;r=S,S=S+16|0,function(A,e,t,r){e|=0,r|=0;var i,a=0,s=0,l=0,c=0;if(i=S,S=S+16|0,function(A,e,t){e|=0,t|=0;var r,i,a=0;i=S,S=S+32|0,function(A,e){e|=0;var t,r,n=0;n=+o[(A|=0)>>3],t=+d(+n),n=+f(+n),o[e+16>>3]=n,n=+o[A+8>>3],r=t*+d(+n),o[e>>3]=r,n=t*+f(+n),o[e+8>>3]=n}(A|=0,r=i),n[e>>2]=0,o[t>>3]=5,(a=+Se(16400,r))<+o[t>>3]&&(n[e>>2]=0,o[t>>3]=a),(a=+Se(16424,r))<+o[t>>3]&&(n[e>>2]=1,o[t>>3]=a),(a=+Se(16448,r))<+o[t>>3]&&(n[e>>2]=2,o[t>>3]=a),(a=+Se(16472,r))<+o[t>>3]&&(n[e>>2]=3,o[t>>3]=a),(a=+Se(16496,r))<+o[t>>3]&&(n[e>>2]=4,o[t>>3]=a),(a=+Se(16520,r))<+o[t>>3]&&(n[e>>2]=5,o[t>>3]=a),(a=+Se(16544,r))<+o[t>>3]&&(n[e>>2]=6,o[t>>3]=a),(a=+Se(16568,r))<+o[t>>3]&&(n[e>>2]=7,o[t>>3]=a),(a=+Se(16592,r))<+o[t>>3]&&(n[e>>2]=8,o[t>>3]=a),(a=+Se(16616,r))<+o[t>>3]&&(n[e>>2]=9,o[t>>3]=a),(a=+Se(16640,r))<+o[t>>3]&&(n[e>>2]=10,o[t>>3]=a),(a=+Se(16664,r))<+o[t>>3]&&(n[e>>2]=11,o[t>>3]=a),(a=+Se(16688,r))<+o[t>>3]&&(n[e>>2]=12,o[t>>3]=a),(a=+Se(16712,r))<+o[t>>3]&&(n[e>>2]=13,o[t>>3]=a),(a=+Se(16736,r))<+o[t>>3]&&(n[e>>2]=14,o[t>>3]=a),(a=+Se(16760,r))<+o[t>>3]&&(n[e>>2]=15,o[t>>3]=a),(a=+Se(16784,r))<+o[t>>3]&&(n[e>>2]=16,o[t>>3]=a),(a=+Se(16808,r))<+o[t>>3]&&(n[e>>2]=17,o[t>>3]=a),(a=+Se(16832,r))<+o[t>>3]&&(n[e>>2]=18,o[t>>3]=a),(a=+Se(16856,r))<+o[t>>3]?(n[e>>2]=19,o[t>>3]=a,S=i):S=i}(A|=0,t|=0,c=i),(s=+h(+(1-.5*+o[c>>3])))<1e-16)return n[r>>2]=0,n[r+4>>2]=0,n[r+8>>2]=0,n[r+12>>2]=0,void(S=i);if(c=0|n[t>>2],a=+ne((a=+o[15920+(24*c|0)>>3])-+ne(+function(A,e){var t,r,n,i,a;return A|=0,i=+o[(e|=0)>>3],r=+d(+i),n=+o[e+8>>3]-+o[A+8>>3],a=r*+f(+n),t=+o[A>>3],+ +p(+a,+(+f(+i)*+d(+t)-+d(+n)*(r*+f(+t))))}(15600+(c<<4)|0,A))),l=0|ZA(e)?+ne(a+-.3334731722518321):a,a=2.618033988749896*+g(+s),(0|e)>0){A=0;do{a*=2.6457513110645907,A=A+1|0}while((0|A)!=(0|e))}s=+d(+l)*a,o[r>>3]=s,l=+f(+l)*a,o[r+8>>3]=l,S=i}(A|=0,e|=0,t|=0,i=r),function(A,e){A|=0;var t,r,i,a,s=0,c=0,u=0,d=0,f=0,g=0,h=0;n[(a=8+(e|=0)|0)>>2]=0,r=+o[A>>3],d=+l(+r),i=+o[A+8>>3],d+=.5*(f=1.1547005383792515*+l(+i)),d-=+(0|(s=~~d)),f-=+(0|(A=~~f));do{if(d<.5){if(d<.3333333333333333){if(n[e>>2]=s,f<.5*(d+1)){n[e+4>>2]=A;break}A=A+1|0,n[e+4>>2]=A;break}if(A=(1&!(f<(h=1-d)))+A|0,n[e+4>>2]=A,h<=f&f<2*d){s=s+1|0,n[e>>2]=s;break}n[e>>2]=s;break}if(!(d<.6666666666666666)){if(s=s+1|0,n[e>>2]=s,f<.5*d){n[e+4>>2]=A;break}A=A+1|0,n[e+4>>2]=A;break}if(f<1-d){if(n[e+4>>2]=A,2*d-1>2]=s;break}}else A=A+1|0,n[e+4>>2]=A;s=s+1|0,n[e>>2]=s}while(0);do{if(r<0){if(1&A){s=~~(+(0|s)-(2*(+((g=0|Ze(0|s,((0|s)<0)<<31>>31,0|(g=(A+1|0)/2|0),((0|g)<0)<<31>>31))>>>0)+4294967296*+(0|B()))+1)),n[e>>2]=s;break}s=~~(+(0|s)-2*(+((g=0|Ze(0|s,((0|s)<0)<<31>>31,0|(g=(0|A)/2|0),((0|g)<0)<<31>>31))>>>0)+4294967296*+(0|B()))),n[e>>2]=s;break}}while(0);g=e+4|0,i<0&&(s=s-((1|A<<1)/2|0)|0,n[e>>2]=s,A=0-A|0,n[g>>2]=A),c=A-s|0,(0|s)<0?(u=0-s|0,n[g>>2]=c,n[a>>2]=u,n[e>>2]=0,A=c,s=0):u=0,(0|A)<0&&(s=s-A|0,n[e>>2]=s,u=u-A|0,n[a>>2]=u,n[g>>2]=0,A=0),t=s-u|0,c=A-u|0,(0|u)<0&&(n[e>>2]=t,n[g>>2]=c,n[a>>2]=0,A=c,s=t,u=0),(0|(c=(0|u)<(0|(c=(0|A)<(0|s)?A:s))?u:c))<=0||(n[e>>2]=s-c,n[g>>2]=A-c,n[a>>2]=u-c)}(i,t+4|0),S=r}(A,e,i),e=0|function(A,e){A|=0;var t,r=0,o=0,i=0,a=0,s=0,l=0,c=0,u=0;if(t=S,S=S+64|0,l=t+40|0,o=t+24|0,i=t+12|0,a=t,rt(0|(e|=0),0,52),r=134225919|B(),!e)return(0|n[A+4>>2])>2||(0|n[A+8>>2])>2||(0|n[A+12>>2])>2?(l=0,C(0|(s=0)),S=t,0|l):(rt(0|U(A),0,45),s=0|B()|r,l=-1,C(0|s),S=t,0|l);if(n[l>>2]=n[A>>2],n[l+4>>2]=n[A+4>>2],n[l+8>>2]=n[A+8>>2],n[l+12>>2]=n[A+12>>2],s=l+4|0,(0|e)>0)for(A=-1;n[o>>2]=n[s>>2],n[o+4>>2]=n[s+4>>2],n[o+8>>2]=n[s+8>>2],1&e?(dA(s),n[i>>2]=n[s>>2],n[i+4>>2]=n[s+4>>2],n[i+8>>2]=n[s+8>>2],gA(i)):(fA(s),n[i>>2]=n[s>>2],n[i+4>>2]=n[s+4>>2],n[i+8>>2]=n[s+8>>2],hA(i)),aA(o,i,a),nA(a),c=0|rt(7,0,0|(u=3*(15-e|0)|0)),r&=~B(),A=(u=0|rt(0|lA(a),0,0|u))|A&~c,r=0|B()|r,(0|e)>1;)e=e+-1|0;else A=-1;A:do{if((0|n[s>>2])<=2&&(0|n[l+8>>2])<=2&&(0|n[l+12>>2])<=2){if(e=0|rt(0|(o=0|U(l)),0,45),e|=A,A=B()|-1040385&r,a=0|O(l),!(0|H(o))){if((0|a)<=0)break;for(i=0;;){if(o=0|tt(0|e,0|A,52),B(),o&=15)for(r=1;l=0|tt(0|e,0|A,0|(u=3*(15-r|0)|0)),B(),c=0|rt(7,0,0|u),A&=~B(),e=e&~c|(u=0|rt(0|vA(7&l),0,0|u)),A=0|A|B(),r>>>0>>0;)r=r+1|0;if((0|(i=i+1|0))==(0|a))break A}}i=0|tt(0|e,0|A,52),B(),i&=15;e:do{if(i){r=1;t:for(;;){switch(u=0|tt(0|e,0|A,3*(15-r|0)|0),B(),7&u){case 1:break t;case 0:break;default:break e}if(!(r>>>0>>0))break e;r=r+1|0}if(0|Y(o,0|n[l>>2]))for(r=1;c=0|rt(7,0,0|(l=3*(15-r|0)|0)),u=A&~B(),A=0|tt(0|e,0|A,0|l),B(),e=e&~c|(A=0|rt(0|yA(7&A),0,0|l)),A=0|u|B(),r>>>0>>0;)r=r+1|0;else for(r=1;l=0|tt(0|e,0|A,0|(u=3*(15-r|0)|0)),B(),c=0|rt(7,0,0|u),A&=~B(),e=e&~c|(u=0|rt(0|vA(7&l),0,0|u)),A=0|A|B(),r>>>0>>0;)r=r+1|0}}while(0);if((0|a)>0){r=0;do{e=0|OA(e,A),A=0|B(),r=r+1|0}while((0|r)!=(0|a))}}else e=0,A=0}while(0);return u=e,C(0|(c=A)),S=t,0|u}(i,e),i=0|B(),n[t>>2]=e,n[t+4>>2]=i,!(0|e)&!(0|i)&&M(27795,27122,1050,27145),S=r,0|(i=0)):(S=r,0|(i=3))}function JA(A,e,t){var r,o=0,i=0,a=0;if(r=4+(t|=0)|0,i=0|tt(0|(A|=0),0|(e|=0),52),B(),i&=15,a=0|tt(0|A,0|e,45),B(),o=!(0|i),0|H(127&a)){if(o)return 1;o=1}else{if(o)return 0;o=0|n[r>>2]||0|n[t+8>>2]?1:1&!!(0|n[t+12>>2])}for(t=1;1&t?gA(r):hA(r),a=0|tt(0|A,0|e,3*(15-t|0)|0),B(),mA(r,7&a),t>>>0>>0;)t=t+1|0;return 0|o}function qA(A,e,t){t|=0;var r,o,i=0,a=0,s=0,l=0,c=0,u=0;if(o=S,S=S+16|0,r=o,u=0|tt(0|(A|=0),0|(e|=0),45),B(),(u&=127)>>>0>121)return n[t>>2]=0,n[t+4>>2]=0,n[t+8>>2]=0,n[t+12>>2]=0,S=o,5;A:do{if(0|H(u)&&(s=0|tt(0|A,0|e,52),B(),0|(s&=15))){i=1;e:for(;;){switch(c=0|tt(0|A,0|e,3*(15-i|0)|0),B(),7&c){case 5:break e;case 0:break;default:i=e;break A}if(!(i>>>0>>0)){i=e;break A}i=i+1|0}for(a=1,i=e;l=0|rt(7,0,0|(e=3*(15-a|0)|0)),c=i&~B(),i=0|tt(0|A,0|i,0|e),B(),A=A&~l|(i=0|rt(0|yA(7&i),0,0|e)),i=0|c|B(),a>>>0>>0;)a=a+1|0}else i=e}while(0);if(c=7696+(28*u|0)|0,n[t>>2]=n[c>>2],n[t+4>>2]=n[c+4>>2],n[t+8>>2]=n[c+8>>2],n[t+12>>2]=n[c+12>>2],!(0|JA(A,i,t)))return S=o,0;if(l=t+4|0,n[r>>2]=n[l>>2],n[r+4>>2]=n[l+4>>2],n[r+8>>2]=n[l+8>>2],s=0|tt(0|A,0|i,52),B(),c=15&s,1&s?(hA(l),s=c+1|0):s=c,0|H(u)){A:do{if(c)for(e=1;;){if(a=0|tt(0|A,0|i,3*(15-e|0)|0),B(),0|(a&=7)){i=a;break A}if(!(e>>>0>>0)){i=0;break}e=e+1|0}else i=0}while(0);i=4==(0|i)&1}else i=0;if(0|NA(t,s,i,0)){if(0|H(u))do{}while(0|NA(t,s,0,0));(0|s)!=(0|c)&&fA(l)}else(0|s)!=(0|c)&&(n[l>>2]=n[r>>2],n[l+4>>2]=n[r+4>>2],n[l+8>>2]=n[r+8>>2]);return S=o,0}function XA(A,e,t){t|=0;var r,o,i=0;return o=S,S=S+16|0,0|(i=0|qA(A|=0,e|=0,r=o))?(S=o,0|i):(i=0|tt(0|A,0|e,52),B(),function(A,e,t){var r,o;e|=0,t|=0,r=S,S=S+16|0,oA(4+(A|=0)|0,o=r),EA(o,0|n[A>>2],e,0,t),S=r}(r,15&i,t),S=o,0|(i=0))}function $A(A,e,t){t|=0;var r,n=0,o=0,i=0;if(r=S,S=S+16|0,0|(n=0|qA(A|=0,e|=0,i=r)))return S=r,0|n;n=0|tt(0|A,0|e,45),B(),n=!(0|H(127&n)),o=0|tt(0|A,0|e,52),B(),o&=15;A:do{if(!n){if(0|o)for(n=1;;){if(!(!((0|rt(7,0,3*(15-n|0)|0))&A)&!((0|B())&e)))break A;if(!(n>>>0>>0))break;n=n+1|0}return jA(i,o,0,5,t),S=r,0}}while(0);return FA(i,o,0,6,t),S=r,0}function Ae(A,e){e|=0;var t=0,r=0,o=0,i=0,a=0,s=0,l=0;if((A|=0)>>>0>15)return 4;if(rt(0|A,0,52),s=134225919|B(),!A){t=0,r=0;do{0|H(r)&&(rt(0|r,0,45),a=0|s|B(),n[(A=e+(t<<3)|0)>>2]=-1,n[A+4>>2]=a,t=t+1|0),r=r+1|0}while(122!=(0|r));return 0}t=0,a=0;do{if(0|H(a)){for(rt(0|a,0,45),r=1,o=-1,i=0|s|B();o&=~(l=0|rt(7,0,3*(15-r|0)|0)),i&=~B(),(0|r)!=(0|A);)r=r+1|0;n[(l=e+(t<<3)|0)>>2]=o,n[l+4>>2]=i,t=t+1|0}a=a+1|0}while(122!=(0|a));return 0}function ee(A,e,t,r){A|=0,r|=0;var o=0,i=0,a=0;o=0|tt(0|(e|=0),0|(t|=0),52),B(),!(0|e)&!(0|t)|(0|r)>15|(0|(o&=15))>(0|r)?(i=-1,e=-1,t=0,o=0):(e=0|HA(e,t,o+1|0,r),a=-15728641&B(),t=0|rt(0|r,0,52),i=o,e=(e=!(0|zA(t|=e,a=0|a|B())))?-1:r,o=a),n[(a=A)>>2]=t,n[a+4>>2]=o,n[A+8>>2]=i,n[A+12>>2]=e}function te(A,e,t,r){t|=0,r|=0;var o=0,i=0;return o=0|tt(0|(A|=0),0|(e|=0),52),B(),o&=15,n[(i=r+8|0)>>2]=o,!(0|A)&!(0|e)|(0|t)>15|(0|o)>(0|t)?(n[(t=r)>>2]=0,n[t+4>>2]=0,n[i>>2]=-1,void(n[r+12>>2]=-1)):(A=0|HA(A,e,o+1|0,t),i=-15728641&B(),o=0|rt(0|t,0,52),o|=A,i=0|i|B(),n[(A=r)>>2]=o,n[A+4>>2]=i,A=r+12|0,0|zA(o,i)?void(n[A>>2]=t):void(n[A>>2]=-1))}function re(A){var e,t=0,r=0,o=0,i=0,a=0,s=0,l=0,c=0;if(!(!(0|(t=0|n[(r=A|=0)>>2]))&!(0|(r=0|n[r+4>>2]))||(o=0|tt(0|t,0|r,52),B(),t=0|We(0|(l=0|rt(1,0,3*(15^(o&=15))|0)),0|B(),0|t,0|r),r=0|B(),n[(l=A)>>2]=t,n[l+4>>2]=r,(0|o)<(0|(s=0|n[(l=A+8|0)>>2]))))){for(e=A+12|0,a=o;;){if((0|a)==(0|s)){o=5;break}if(c=(0|a)==(0|n[e>>2]),o=0|tt(0|t,0|r,0|(i=3*(15-a|0)|0)),B(),c&1==(0|(o&=7))&!0){o=7;break}if(!(7==(0|o)&!0)){o=10;break}if(t=0|We(0|t,0|r,0|(c=0|rt(1,0,0|i)),0|B()),r=0|B(),n[(c=A)>>2]=t,n[c+4>>2]=r,!((0|a)>(0|s))){o=10;break}a=a+-1|0}if(5==(0|o))return n[(c=A)>>2]=0,n[c+4>>2]=0,n[l>>2]=-1,void(n[e>>2]=-1);if(7==(0|o))return s=0|We(0|t,0|r,0|(s=0|rt(1,0,0|i)),0|B()),l=0|B(),n[(c=A)>>2]=s,n[c+4>>2]=l,void(n[e>>2]=a+-1)}}function ne(A){var e;return e=(A=+A)<0?A+6.283185307179586:A,+(A>=6.283185307179586?e+-6.283185307179586:e)}function oe(A,e){return e|=0,+l(+(+o[(A|=0)>>3]-+o[e>>3]))<17453292519943298e-27?0|(e=+l(+(+o[A+8>>3]-+o[e+8>>3]))<17453292519943298e-27):0|(e=0)}function ie(A,e){switch(A=+A,0|(e|=0)){case 1:A=A<0?A+6.283185307179586:A;break;case 2:A=A>0?A+-6.283185307179586:A}return+A}function ae(A,e){A|=0;var t,r,n,i=0;return r=+o[(e|=0)>>3],t=+o[A>>3],i=(n=+f(.5*(r-t)))*n+(i=+f(.5*(+o[e+8>>3]-+o[A+8>>3])))*(+d(+r)*+d(+t)*i),2*+p(+ +c(+i),+ +c(+(1-i)))*6371.007180918475}function se(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[20656+(A<<3)>>3],0|(e=0))}function le(A,e){e|=0;var t=0;return(A|=0)>>>0>15?0|(e=4):(t=0|Xe(0|(t=0|pe(7,0,A,((0|A)<0)<<31>>31)),0|B(),120,0),A=0|B(),n[e>>2]=2|t,n[e+4>>2]=A,0|(e=0))}function ce(A,e,t){A|=0,t|=0;var r,n,i,a,s=0,l=0,u=0,h=0,m=0,v=0;return v=+o[(e|=0)>>3],i=+o[A>>3],m=+f(.5*(v-i)),u=+o[e+8>>3],n=+o[A+8>>3],h=+f(.5*(u-n)),r=+d(+i),a=+d(+v),h=2*+p(+ +c(+(h=m*m+h*(a*r*h))),+ +c(+(1-h))),m=+o[t>>3],v=+f(.5*(m-v)),s=+o[t+8>>3],u=+f(.5*(s-u)),l=+d(+m),u=2*+p(+ +c(+(u=v*v+u*(a*l*u))),+ +c(+(1-u))),m=+f(.5*(i-m)),s=+f(.5*(n-s)),s=2*+p(+ +c(+(s=m*m+s*(r*l*s))),+ +c(+(1-s))),4*+b(+ +c(+ +g(.5*(l=.5*(h+u+s)))*+g(.5*(l-h))*+g(.5*(l-u))*+g(.5*(l-s))))}function ue(A,e,t){t|=0;var r,i,a,s=0,l=0;if(a=S,S=S+192|0,i=a,0|(l=0|XA(A|=0,e|=0,r=a+168|0)))return S=a,0|l;if(0|$A(A,e,i)&&M(27795,27190,415,27199),(0|(e=0|n[i>>2]))>0){if(s=+ce(i+8|0,i+8+((1!=(0|e)&1)<<4)|0,r)+0,1!=(0|e)){A=1;do{s+=+ce(i+8+((l=A)<<4)|0,i+8+((0|(A=A+1|0))%(0|e)<<4)|0,r)}while((0|A)<(0|e))}}else s=0;return o[t>>3]=s,S=a,0}function de(A){A|=0;var e,t,r=0;return(e=0|Ve(1,12))||M(27280,27235,49,27293),0|(r=0|n[(t=A+4|0)>>2])?(n[(r=r+8|0)>>2]=e,n[t>>2]=e,0|e):(0|n[A>>2]&&M(27310,27235,61,27333),n[(r=A)>>2]=e,n[t>>2]=e,0|e)}function fe(A,e){var t,r;return A|=0,e|=0,(r=0|Oe(24))||M(27347,27235,78,27361),n[r>>2]=n[e>>2],n[r+4>>2]=n[e+4>>2],n[r+8>>2]=n[e+8>>2],n[r+12>>2]=n[e+12>>2],n[r+16>>2]=0,0|(t=0|n[(e=A+4|0)>>2])?(n[t+16>>2]=r,n[e>>2]=r,0|r):(0|n[A>>2]&&M(27376,27235,82,27361),n[A>>2]=r,n[e>>2]=r,0|r)}function ge(A){var e=0,t=0,r=0,o=0;if(A|=0)for(r=1;;){if(0|(e=0|n[A>>2]))do{if(0|(t=0|n[e>>2]))do{o=t,t=0|n[t+16>>2],Ye(o)}while(0|t);o=e,e=0|n[e+8>>2],Ye(o)}while(0|e);if(e=A,A=0|n[A+8>>2],r||Ye(e),!A)break;r=0}}function he(A,e,t){A|=0;var r=0,i=0,a=0,s=0,l=0,c=0,u=0,d=0;if(!(0|q(e|=0,t|=0)))return 0;if(e=0|K(e),r=+o[t>>3],i=e&(i=+o[t+8>>3])<0?i+6.283185307179586:i,!(A=0|n[A>>2]))return 0;if(e){e=0,u=i,t=A;A:for(;;){for(;s=+o[t>>3],i=+o[t+8>>3],d=0|n[(t=t+16|0)>>2],a=+o[(d=0|d?d:A)>>3],l=+o[d+8>>3],s>a?(c=s,s=l):(c=a,a=s,s=i,i=l),(r=r==a|r==c?r+2220446049250313e-31:r)c;)if(!(t=0|n[t>>2])){t=22;break A}if(((c=(l=s<0?s+6.283185307179586:s)+(r-a)/(c-a)*((s=i<0?i+6.283185307179586:i)-l))<0?c+6.283185307179586:c)>(u=l==u|s==u?u+-2220446049250313e-31:u)&&(e^=1),!(t=0|n[t>>2])){t=22;break}}if(22==(0|t))return 0|e}else{e=0,u=i,t=A;A:for(;;){for(;s=+o[t>>3],i=+o[t+8>>3],d=0|n[(t=t+16|0)>>2],a=+o[(d=0|d?d:A)>>3],l=+o[d+8>>3],s>a?(c=s,s=l):(c=a,a=s,s=i,i=l),(r=r==a|r==c?r+2220446049250313e-31:r)c;)if(!(t=0|n[t>>2])){t=22;break A}if(s+(r-a)/(c-a)*(i-s)>(u=s==u|i==u?u+-2220446049250313e-31:u)&&(e^=1),!(t=0|n[t>>2])){t=22;break}}if(22==(0|t))return 0|e}return 0}function me(A,e,t,o,i){t|=0,o|=0,i|=0;var a,s,l,c,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0;if(c=S,S=S+32|0,y=c+16|0,l=c,u=0|tt(0|(A|=0),0|(e|=0),52),B(),u&=15,b=0|tt(0|t,0|o,52),B(),(0|u)!=(15&b))return S=c,12;if(h=0|tt(0|A,0|e,45),B(),h&=127,m=0|tt(0|t,0|o,45),B(),h>>>0>121|(m&=127)>>>0>121)return S=c,5;if(b=(0|h)!=(0|m)){if(7==(0|(f=0|W(h,m))))return S=c,1;7==(0|(g=0|W(m,h)))?M(27514,27538,161,27548):(p=f,d=g)}else p=0,d=0;a=0|H(h),s=0|H(m),n[y>>2]=0,n[y+4>>2]=0,n[y+8>>2]=0,n[y+12>>2]=0;do{if(p){if(f=(0|(m=0|n[4272+(28*h|0)+(p<<2)>>2]))>0,s)if(f){h=0,g=t,f=o;do{g=0|VA(g,f),f=0|B(),1==(0|(d=0|yA(d)))&&(d=0|yA(1)),h=h+1|0}while((0|h)!=(0|m));m=d,h=g,g=f}else m=d,h=t,g=o;else if(f){h=0,g=t,f=o;do{g=0|WA(g,f),f=0|B(),d=0|yA(d),h=h+1|0}while((0|h)!=(0|m));m=d,h=g,g=f}else m=d,h=t,g=o;if(JA(h,g,y),b||M(27563,27538,191,27548),(f=!!(0|a))&(d=!!(0|s))&&M(27590,27538,192,27548),f){if(7==(0|(d=0|UA(A,e)))){u=5;break}if(0|r[22e3+(7*d|0)+p|0]){u=1;break}h=g=0|n[21168+(28*d|0)+(p<<2)>>2]}else if(d){if(7==(0|(d=0|UA(h,g)))){u=5;break}if(0|r[22e3+(7*d|0)+m|0]){u=1;break}h=0,g=0|n[21168+(28*m|0)+(d<<2)>>2]}else h=0,g=0;if((h|g|0)<0)u=5;else{if((0|g)>0){f=y+4|0,d=0;do{pA(f),d=d+1|0}while((0|d)!=(0|g))}if(n[l>>2]=0,n[l+4>>2]=0,n[l+8>>2]=0,mA(l,p),0|u)for(;0|ZA(u)?gA(l):hA(l),(0|u)>1;)u=u+-1|0;if((0|h)>0){u=0;do{pA(l),u=u+1|0}while((0|u)!=(0|h))}iA(v=y+4|0,l,v),nA(v),v=51}}else if(JA(t,o,y),!!(0|a)&!!(0|s))if((0|m)!=(0|h)&&M(27621,27538,261,27548),7==(0|(d=0|UA(A,e)))|7==(0|(u=0|UA(t,o))))u=5;else if(0|r[22e3+(7*d|0)+u|0])u=1;else if((0|(d=0|n[21168+(28*d|0)+(u<<2)>>2]))>0){f=y+4|0,u=0;do{pA(f),u=u+1|0}while((0|u)!=(0|d));v=51}else v=51;else v=51}while(0);return 51==(0|v)&&(u=y+4|0,n[i>>2]=n[u>>2],n[i+4>>2]=n[u+4>>2],n[i+8>>2]=n[u+8>>2],u=0),S=c,0|u}function be(A,e,t,r){t|=0,r|=0;var o,i,a,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0;if(a=S,S=S+48|0,o=a+36|0,c=a+24|0,u=a+12|0,d=a,s=0|tt(0|(A|=0),0|(e|=0),52),B(),s&=15,g=0|tt(0|A,0|e,45),B(),(g&=127)>>>0>121)return S=a,5;if(i=0|H(g),rt(0|s,0,52),b=134225919|B(),n[(l=r)>>2]=-1,n[l+4>>2]=b,!s)return 7==(0|(s=0|lA(t)))||127==(0|(s=0|V(g,s)))?(S=a,0|(b=1)):(h=0|rt(0|s,0,45),m=0|B(),m=-1040385&n[(g=r)+4>>2]|m,n[(b=r)>>2]=n[g>>2]|h,n[b+4>>2]=m,S=a,0|(b=0));for(n[o>>2]=n[t>>2],n[o+4>>2]=n[t+4>>2],n[o+8>>2]=n[t+8>>2],t=s;;){if(l=t,t=t+-1|0,n[c>>2]=n[o>>2],n[c+4>>2]=n[o+4>>2],n[c+8>>2]=n[o+8>>2],0|ZA(l)){if(0|(s=0|cA(o))){t=13;break}n[u>>2]=n[o>>2],n[u+4>>2]=n[o+4>>2],n[u+8>>2]=n[o+8>>2],gA(u)}else{if(0|(s=0|uA(o))){t=13;break}n[u>>2]=n[o>>2],n[u+4>>2]=n[o+4>>2],n[u+8>>2]=n[o+8>>2],hA(u)}if(aA(c,u,d),nA(d),v=0|n[(s=r)>>2],s=0|n[s+4>>2],p=0|rt(7,0,0|(y=3*(15-l|0)|0)),s&=~B(),y=0|rt(0|lA(d),0,0|y),s=0|B()|s,n[(b=r)>>2]=y|v&~p,n[b+4>>2]=s,(0|l)<=1){t=14;break}}A:do{if(13!=(0|t)&&14==(0|t))if((0|n[o>>2])<=1&&(0|n[o+4>>2])<=1&&(0|n[o+8>>2])<=1){d=127==(0|(s=0|V(g,t=0|lA(o))))?0:0|H(s);e:do{if(t){if(i){if(7==(0|(s=0|UA(A,e)))){s=5;break A}if((0|(l=0|n[21376+(28*s|0)+(t<<2)>>2]))>0){s=t,t=0;do{s=0|vA(s),t=t+1|0}while((0|t)!=(0|l))}else s=t;if(1==(0|s)){s=9;break A}127==(0|(t=0|V(g,s)))&&M(27648,27538,411,27678),0|H(t)?M(27693,27538,412,27678):(m=t,h=l,f=s)}else m=s,h=0,f=t;if((0|(u=0|n[4272+(28*g|0)+(f<<2)>>2]))<=-1&&M(27724,27538,419,27678),!d){if((0|h)<0){s=5;break A}if(0|h){s=0,t=0|n[(l=r)>>2],l=0|n[l+4>>2];do{t=0|YA(t,l),l=0|B(),n[(y=r)>>2]=t,n[y+4>>2]=l,s=s+1|0}while((0|s)<(0|h))}if((0|u)<=0){s=m,t=58;break}for(s=0,t=0|n[(l=r)>>2],l=0|n[l+4>>2];;)if(t=0|YA(t,l),l=0|B(),n[(y=r)>>2]=t,n[y+4>>2]=l,(0|(s=s+1|0))==(0|u)){s=m,t=58;break e}}if(7==(0|(c=0|W(m,g)))&&M(27514,27538,428,27678),t=0|n[(s=r)>>2],s=0|n[s+4>>2],(0|u)>0){l=0;do{t=0|YA(t,s),s=0|B(),n[(y=r)>>2]=t,n[y+4>>2]=s,l=l+1|0}while((0|l)!=(0|u))}if(7==(0|(s=0|UA(t,s)))&&M(27795,27538,440,27678),t=0|G(m),(0|(t=0|n[(t?21792:21584)+(28*c|0)+(s<<2)>>2]))<0&&M(27795,27538,454,27678),t){s=0,l=0|n[(c=r)>>2],c=0|n[c+4>>2];do{l=0|OA(l,c),c=0|B(),n[(y=r)>>2]=l,n[y+4>>2]=c,s=s+1|0}while((0|s)<(0|t));s=m,t=58}else s=m,t=58}else if(!!(0|i)&!!(0|d)){if(7==(0|(t=0|UA(A,e)))|7==(0|(l=0|UA(0|n[(l=r)>>2],0|n[l+4>>2])))){s=5;break A}if((0|(l=0|n[21376+(28*t|0)+(l<<2)>>2]))<0){s=5;break A}if(l){t=0,c=0|n[(u=r)>>2],u=0|n[u+4>>2];do{c=0|YA(c,u),u=0|B(),n[(y=r)>>2]=c,n[y+4>>2]=u,t=t+1|0}while((0|t)<(0|l));t=58}else t=59}else t=58}while(0);if(58==(0|t)&&d&&(t=59),59==(0|t)&&1==(0|UA(0|n[(y=r)>>2],0|n[y+4>>2]))){s=9;break}p=0|n[(y=r)>>2],y=-1040385&n[y+4>>2],v=0|rt(0|s,0,45),y=0|y|B(),n[(s=r)>>2]=p|v,n[s+4>>2]=y,s=0}else s=1}while(0);return S=a,0|s}function pe(A,e,t,r){A|=0,e|=0;var n=0,o=0,i=0;if(!(0|(t|=0))&!(0|(r|=0)))return o=1,C(0|(n=0)),0|o;o=A,n=e,A=1,e=0;do{A=0|Xe(0|((i=!0&!(1&t))?1:o),0|(i?0:n),0|A,0|e),e=0|B(),t=0|et(0|t,0|r,1),r=0|B(),o=0|Xe(0|o,0|n,0|o,0|n),n=0|B()}while(!(!(0|t)&!(0|r)));return C(0|e),0|A}function ve(A,e,t,r){t|=0,r|=0;var i,a=0,s=0,l=0,c=0,u=0,f=0;i=S,S=S+16|0,s=i,l=0|tt(0|(A|=0),0|(e|=0),52),B(),l&=15;do{if(l){if(!(a=0|XA(A,e,s))){u=+o[s>>3],c=1/+d(+u),f=+o[25968+(l<<3)>>3],o[t>>3]=u+f,o[t+8>>3]=u-f,u=+o[s+8>>3],c*=f,o[t+16>>3]=c+u,o[t+24>>3]=u-c;break}return S=i,0|a}if(a=0|tt(0|A,0|e,45),B(),(a&=127)>>>0>121)return S=i,5;s=22064+(a<<5)|0,n[t>>2]=n[s>>2],n[t+4>>2]=n[s+4>>2],n[t+8>>2]=n[s+8>>2],n[t+12>>2]=n[s+12>>2],n[t+16>>2]=n[s+16>>2],n[t+20>>2]=n[s+20>>2],n[t+24>>2]=n[s+24>>2],n[t+28>>2]=n[s+28>>2];break}while(0);return function(A,e){e=+e;var t,r,n,i,a,s,l,c=0,u=0;c=(i=+o[(n=16+(A|=0)|0)>>3])-(r=+o[(t=A+24|0)>>3]),c=i>3],c=.5*(c*e-c),u+=e=.5*((l=u-(s=+o[(a=A+8|0)>>3]))*e-l),o[A>>3]=u>1.5707963267948966?1.5707963267948966:u,e=s-e,o[a>>3]=e<-1.5707963267948966?-1.5707963267948966:e,e=(e=i+c)>3.141592653589793?e+-6.283185307179586:e,o[n>>3]=e<-3.141592653589793?e+6.283185307179586:e,e=(e=r-c)>3.141592653589793?e+-6.283185307179586:e,o[t>>3]=e<-3.141592653589793?e+6.283185307179586:e}(t,r?1.4:1.1),(0|n[(r=26096+(l<<3)|0)>>2])==(0|A)&&(0|n[r+4>>2])==(0|e)&&(o[t>>3]=1.5707963267948966),(0|n[(l=26224+(l<<3)|0)>>2])==(0|A)&&(0|n[l+4>>2])==(0|e)&&(o[t+8>>3]=-1.5707963267948966),1.5707963267948966!=+o[t>>3]&&-1.5707963267948966!=+o[t+8>>3]?(S=i,0|(l=0)):(o[t+16>>3]=3.141592653589793,o[t+24>>3]=-3.141592653589793,S=i,0|(l=0))}function ye(A){var e,t,o,i,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0;if(i=S,S=S+336|0,e=i+168|0,t=i,!(0|(s=0|n[(l=A|=0)>>2]))&!(0|(l=0|n[l+4>>2])))S=i;else{if(0|r[0|(a=A+28|0)]?(s=0|we(s,l),l=0|B()):r[0|a]=1,!(0|n[n[(o=A+20|0)>>2]>>2]))return 0|(s=0|n[(a=A+24|0)>>2])&&Ye(s),n[(x=A)>>2]=0,n[x+4>>2]=0,n[A+8>>2]=0,n[o>>2]=0,n[A+12>>2]=-1,n[A+16>>2]=0,n[a>>2]=0,void(S=i);c=15&(a=0|n[(x=A+16|0)>>2]);A:do{if(!(0|s)&!(0|l))w=A+24|0;else{v=A+12|0,b=3==(0|c),m=255&a,g=3==(1|c),p=A+24|0,h=(c+-1|0)>>>0<3,d=3==(2|c),f=t+8|0;e:for(;;){if(u=0|tt(0|s,0|l,52),B(),(0|(u&=15))==(0|n[v>>2])){switch(15&m){case 0:case 2:case 3:if(0|(c=0|XA(s,l,e))){y=15;break e}if(0|Me(0|n[o>>2],0|n[p>>2],e)){y=19;break e}}if(g&&(c=0|n[4+(0|n[o>>2])>>2],n[e>>2]=n[c>>2],n[e+4>>2]=n[c+4>>2],n[e+8>>2]=n[c+8>>2],n[e+12>>2]=n[c+12>>2],0|q(26832,e))){if(0|KA(0|n[4+(0|n[o>>2])>>2],u,t)){y=25;break}if((0|n[(c=t)>>2])==(0|s)&&(0|n[c+4>>2])==(0|l)){y=29;break}}if(h){if(0|(c=0|$A(s,l,e))){y=32;break}if(0|ve(s,l,t,0)){y=36;break}if(d&&0|De(0|n[o>>2],0|n[p>>2],e,t)){y=42;break}if(g&&0|je(0|n[o>>2],0|n[p>>2],e,t)){y=42;break}}if(b){if(a=0|ve(s,l,e,1),c=0|n[p>>2],0|a){y=45;break}if(0|X(c,e)){if(AA(t,e),0|$(e,0|n[p>>2])){y=53;break}if(0|Me(0|n[o>>2],0|n[p>>2],f)){y=53;break}if(0|je(0|n[o>>2],0|n[p>>2],t,e)){y=53;break}}}}do{if((0|u)<(0|n[v>>2])){if(a=0|ve(s,l,e,1),c=0|n[p>>2],0|a){y=58;break e}if(!(0|X(c,e))){y=73;break}if(0|$(0|n[p>>2],e)&&(AA(t,e),0|De(0|n[o>>2],0|n[p>>2],t,e))){y=65;break e}if(0|(s=0|GA(s,l,u+1|0,t))){y=67;break e}s=0|n[(l=t)>>2],l=0|n[l+4>>2]}else y=73}while(0);if(73==(0|y)&&(y=0,s=0|we(s,l),l=0|B()),!(0|s)&!(0|l)){w=p;break A}}switch(0|y){case 15:0|(a=0|n[p>>2])&&Ye(a),n[(y=A)>>2]=0,n[y+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=c,y=20;break;case 19:n[A>>2]=s,n[A+4>>2]=l,y=20;break;case 25:M(27795,27761,470,27772);break;case 29:case 42:return n[A>>2]=s,n[A+4>>2]=l,void(S=i);case 32:return 0|(a=0|n[p>>2])&&Ye(a),n[(w=A)>>2]=0,n[w+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=c,void(S=i);case 36:M(27795,27761,493,27772);break;case 45:0|c&&Ye(c),n[(y=A)>>2]=0,n[y+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=a,y=55;break;case 53:n[A>>2]=s,n[A+4>>2]=l,y=55;break;case 58:0|c&&Ye(c),n[(y=A)>>2]=0,n[y+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=a,y=71;break;case 65:n[A>>2]=s,n[A+4>>2]=l,y=71;break;case 67:return 0|(a=0|n[p>>2])&&Ye(a),n[(w=A)>>2]=0,n[w+4>>2]=0,n[o>>2]=0,n[v>>2]=-1,n[x>>2]=0,n[p>>2]=0,n[A+8>>2]=s,void(S=i)}if(20==(0|y))return void(S=i);if(55==(0|y))return void(S=i);if(71==(0|y))return void(S=i)}}while(0);0|(a=0|n[w>>2])&&Ye(a),n[(y=A)>>2]=0,n[y+4>>2]=0,n[A+8>>2]=0,n[o>>2]=0,n[A+12>>2]=-1,n[x>>2]=0,n[w>>2]=0,S=i}}function we(A,e){var t,r=0,o=0,i=0,a=0,s=0,l=0,c=0,u=0,d=0;t=S,S=S+16|0,d=t,o=0|tt(0|(A|=0),0|(e|=0),52),B(),o&=15,r=0|tt(0|A,0|e,45),B();do{if(o){for(;r=0|rt(o+4095|0,0,52),i=B()|-15728641&e,r=r|A|(s=0|rt(7,0,0|(a=3*(15-o|0)|0))),i|=l=0|B(),c=0|tt(0|A,0|e,0|a),B(),o=o+-1|0,!((c&=7)>>>0<6);){if(!o){u=4;break}e=i,A=r}if(4==(0|u)){r=0|tt(0|r,0|i,45),B();break}return d=0|rt(((d=!(0|c)&!!(0|zA(r,i)))?2:1)+c|0,0,0|a),u=0|B()|e&~l,d|=A&~s,C(0|u),S=t,0|d}}while(0);return(r&=127)>>>0>120?(d=0,C(0|(u=0)),S=t,0|d):(IA(d,0,r+1|0,0),u=0|n[d+4>>2],d=0|n[d>>2],C(0|u),S=t,0|d)}function xe(A,e,t){A|=0;var r,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0;if(!(0|q(e|=0,t|=0)))return 0;if(e=0|K(e),i=+o[t>>3],a=e&(a=+o[t+8>>3])<0?a+6.283185307179586:a,(0|(g=0|n[A>>2]))<=0)return 0;if(r=0|n[A+4>>2],e){e=0,f=a,t=-1,A=0;A:for(;;){for(d=A;l=+o[r+(d<<4)>>3],a=+o[r+(d<<4)+8>>3],s=+o[r+((A=(t+2|0)%(0|g)|0)<<4)>>3],c=+o[r+(A<<4)+8>>3],l>s?(u=l,l=c):(u=s,s=l,l=a,a=c),(i=i==s|i==u?i+2220446049250313e-31:i)u;){if((0|(t=d+1|0))>=(0|g)){t=22;break A}A=d,d=t,t=A}if(((u=(c=l<0?l+6.283185307179586:l)+(i-s)/(u-s)*((l=a<0?a+6.283185307179586:a)-c))<0?u+6.283185307179586:u)>(f=c==f|l==f?f+-2220446049250313e-31:f)&&(e^=1),(0|(A=d+1|0))>=(0|g)){t=22;break}t=d}if(22==(0|t))return 0|e}else{e=0,f=a,t=-1,A=0;A:for(;;){for(d=A;l=+o[r+(d<<4)>>3],a=+o[r+(d<<4)+8>>3],s=+o[r+((A=(t+2|0)%(0|g)|0)<<4)>>3],c=+o[r+(A<<4)+8>>3],l>s?(u=l,l=c):(u=s,s=l,l=a,a=c),(i=i==s|i==u?i+2220446049250313e-31:i)u;){if((0|(t=d+1|0))>=(0|g)){t=22;break A}A=d,d=t,t=A}if(l+(i-s)/(u-s)*(a-l)>(f=l==f|a==f?f+-2220446049250313e-31:f)&&(e^=1),(0|(A=d+1|0))>=(0|g)){t=22;break}t=d}if(22==(0|t))return 0|e}return 0}function ke(A,e){e|=0;var t,r,i,a,s,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0;if(!(r=0|n[(A|=0)>>2]))return n[e>>2]=0,n[e+4>>2]=0,n[e+8>>2]=0,n[e+12>>2]=0,n[e+16>>2]=0,n[e+20>>2]=0,n[e+24>>2]=0,void(n[e+28>>2]=0);if(o[(i=e+8|0)>>3]=17976931348623157e292,o[(a=e+24|0)>>3]=17976931348623157e292,o[e>>3]=-17976931348623157e292,o[(s=e+16|0)>>3]=-17976931348623157e292,!((0|r)<=0)){for(t=0|n[A+4>>2],b=17976931348623157e292,p=-17976931348623157e292,v=0,A=-1,f=17976931348623157e292,g=17976931348623157e292,m=-17976931348623157e292,u=-17976931348623157e292,y=0;c=+o[t+(y<<4)>>3],h=+o[t+(y<<4)+8>>3],d=+o[t+(((0|(A=A+2|0))==(0|r)?0:A)<<4)+8>>3],c>3]=c,f=c),h>3]=h,g=h),c>m?o[e>>3]=c:c=m,h>u&&(o[s>>3]=h,u=h),b=h>0&hp?h:p,v|=+l(+(h-d))>3.141592653589793,(0|(A=y+1|0))!=(0|r);)w=y,m=c,y=A,A=w;v&&(o[s>>3]=p,o[a>>3]=b)}}function Ce(A){return 0|((A|=0)>>>0<4?0:15)}function Be(A,e){e|=0;var t,r=0,i=0,a=0,s=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,B=0,M=0;if(p=0|n[(A|=0)>>2]){if(o[(v=e+8|0)>>3]=17976931348623157e292,o[(y=e+24|0)>>3]=17976931348623157e292,o[e>>3]=-17976931348623157e292,o[(w=e+16|0)>>3]=-17976931348623157e292,(0|p)>0){for(a=0|n[A+4>>2],m=17976931348623157e292,b=-17976931348623157e292,i=0,r=-1,d=17976931348623157e292,f=17976931348623157e292,h=-17976931348623157e292,c=-17976931348623157e292,x=0;s=+o[a+(x<<4)>>3],g=+o[a+(x<<4)+8>>3],u=+o[a+(((0|(B=r+2|0))==(0|p)?0:B)<<4)+8>>3],s>3]=s,d=s),g>3]=g,f=g),s>h?o[e>>3]=s:s=h,g>c&&(o[w>>3]=g,c=g),m=g>0&gb?g:b,i|=+l(+(g-u))>3.141592653589793,(0|(r=x+1|0))!=(0|p);)B=x,h=s,x=r,r=B;i&&(o[w>>3]=b,o[y>>3]=m)}}else n[e>>2]=0,n[e+4>>2]=0,n[e+8>>2]=0,n[e+12>>2]=0,n[e+16>>2]=0,n[e+20>>2]=0,n[e+24>>2]=0,n[e+28>>2]=0;if(!((0|(r=0|n[(B=A+8|0)>>2]))<=0)){t=A+12|0,C=0;do{if(a=0|n[t>>2],i=C,y=e+((C=C+1|0)<<5)|0,w=0|n[a+(i<<3)>>2]){if(o[(x=e+(C<<5)+8|0)>>3]=17976931348623157e292,o[(A=e+(C<<5)+24|0)>>3]=17976931348623157e292,o[y>>3]=-17976931348623157e292,o[(k=e+(C<<5)+16|0)>>3]=-17976931348623157e292,(0|w)>0){for(p=0|n[a+(i<<3)+4>>2],m=17976931348623157e292,b=-17976931348623157e292,a=0,i=-1,v=0,d=17976931348623157e292,f=17976931348623157e292,g=-17976931348623157e292,c=-17976931348623157e292;s=+o[p+(v<<4)>>3],h=+o[p+(v<<4)+8>>3],u=+o[p+(((0|(i=i+2|0))==(0|w)?0:i)<<4)+8>>3],s>3]=s,d=s),h>3]=h,f=h),s>g?o[y>>3]=s:s=g,h>c&&(o[k>>3]=h,c=h),m=h>0&hb?h:b,a|=+l(+(h-u))>3.141592653589793,(0|(i=v+1|0))!=(0|w);)M=v,v=i,g=s,i=M;a&&(o[k>>3]=b,o[A>>3]=m)}}else n[y>>2]=0,n[y+4>>2]=0,n[y+8>>2]=0,n[y+12>>2]=0,n[y+16>>2]=0,n[y+20>>2]=0,n[y+24>>2]=0,n[y+28>>2]=0,r=0|n[B>>2]}while((0|C)<(0|r))}}function Me(A,e,t){var r=0,o=0,i=0;if(!(0|xe(A|=0,e|=0,t|=0)))return 0;if((0|n[(o=A+8|0)>>2])<=0)return 1;for(r=A+12|0,A=0;;){if(i=A,A=A+1|0,0|xe((0|n[r>>2])+(i<<3)|0,e+(A<<5)|0,t)){A=0,r=6;break}if((0|A)>=(0|n[o>>2])){A=1,r=6;break}}return 6==(0|r)?0|A:0}function De(A,e,t,r){r|=0;var o,i,a=0,s=0,l=0,c=0,u=0;if(i=S,S=S+16|0,o=i,!(0|xe(A|=0,e|=0,l=8+(t|=0)|0)))return S=i,0;c=A+8|0;A:do{if((0|n[c>>2])>0){for(s=A+12|0,a=0;;){if(u=a,a=a+1|0,0|xe((0|n[s>>2])+(u<<3)|0,e+(a<<5)|0,l)){a=0;break}if((0|a)>=(0|n[c>>2]))break A}return S=i,0|a}}while(0);if(0|Ee(A,e,t,r))return S=i,0;n[o>>2]=n[t>>2],n[o+4>>2]=l,a=0|n[c>>2];A:do{if((0|a)>0)for(A=A+12|0,l=0,s=a;;){if(a=0|n[A>>2],(0|n[a+(l<<3)>>2])>0){if(0|xe(o,r,0|n[a+(l<<3)+4>>2])){a=0;break A}if(a=l+1|0,0|Ee((0|n[A>>2])+(l<<3)|0,e+(a<<5)|0,t,r)){a=0;break A}s=0|n[c>>2]}else a=l+1|0;if(!((0|a)<(0|s))){a=1;break}l=a}else a=1}while(0);return S=i,0|a}function Ee(A,e,t,r){A|=0,t|=0;var i,a,s,l,c,u,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,B=0,M=0;if(u=S,S=S+176|0,l=u+172|0,d=u+168|0,c=u,!(0|X(e|=0,r|=0)))return S=u,0;if(function(A,e,t,r){var i,a,s,l,c;e|=0,t|=0,r|=0,A=(a=+o[16+(A|=0)>>3])<(c=+o[A+24>>3]),i=(l=+o[e+16>>3])<(s=+o[e+24>>3]),e=c-l>2]=A?i|e?1:2:0,n[r>>2]=i?A?1:e?2:1:0}(e,r,l,d),st(0|c,0|t,168),(0|n[t>>2])>0){e=0;do{x=+ie(+o[(B=c+8+(e<<4)+8|0)>>3],0|n[d>>2]),o[B>>3]=x,e=e+1|0}while((0|e)<(0|n[t>>2]))}a=+o[r>>3],s=+o[r+8>>3],x=+ie(+o[r+16>>3],0|n[d>>2]),i=+ie(+o[r+24>>3],0|n[d>>2]);A:do{if((0|n[A>>2])>0){if(r=A+4|0,(0|(d=0|n[c>>2]))<=0)for(e=0;;)if((0|(e=e+1|0))>=(0|n[A>>2])){e=0;break A}for(t=0;;){if(e=0|n[r>>2],y=+o[e+(t<<4)>>3],w=+ie(+o[e+(t<<4)+8>>3],0|n[l>>2]),e=0|n[r>>2],B=(0|(t=t+1|0))%(0|n[A>>2])|0,f=+o[e+(B<<4)>>3],g=+ie(+o[e+(B<<4)+8>>3],0|n[l>>2]),!(y>=a)|!(f>=a)&&!(y<=s)|!(f<=s)&&!(w<=i)|!(g<=i)&&!(w>=x)|!(g>=x)){v=f-y,b=g-w,e=0;do{if(M=e,B=(0|(e=e+1|0))==(0|d)?0:e,f=+o[c+8+(M<<4)+8>>3],g=+o[c+8+(B<<4)+8>>3]-f,h=+o[c+8+(M<<4)>>3],!(0==(p=v*g-b*(m=+o[c+8+(B<<4)>>3]-h))||(k=w-f,C=y-h,m=(k*m-g*C)/p,m<0|m>1))&&(p=(v*k-b*C)/p)>=0&p<=1){e=1;break A}}while((0|e)<(0|d))}if((0|t)>=(0|n[A>>2])){e=0;break}}}else e=0}while(0);return S=u,0|e}function je(A,e,t,r){var o=0,i=0,a=0;if(0|Ee(A|=0,e|=0,t|=0,r|=0))return 1;if((0|n[(i=A+8|0)>>2])<=0)return 0;for(o=A+12|0,A=0;;){if(a=A,A=A+1|0,0|Ee((0|n[o>>2])+(a<<3)|0,e+(A<<5)|0,t,r)){A=1,o=6;break}if((0|A)>=(0|n[i>>2])){A=0,o=6;break}}return 6==(0|o)?0|A:0}function Qe(A,e,t,r,n){e|=0,t|=0,r|=0,n|=0;var i,a,s,l,c,u,d,f=0;l=+o[(A|=0)>>3],s=+o[e>>3]-l,a=+o[A+8>>3],i=+o[e+8>>3]-a,u=+o[t>>3],f=((f=+o[r>>3]-u)*(a-(d=+o[t+8>>3]))-(l-u)*(c=+o[r+8>>3]-d))/(s*c-i*f),o[n>>3]=l+s*f,o[n+8>>3]=a+i*f}function Ne(A,e){return e|=0,+l(+(+o[(A|=0)>>3]-+o[e>>3]))<1.1920928955078125e-7?0|(e=+l(+(+o[A+8>>3]-+o[e+8>>3]))<1.1920928955078125e-7):0|(e=0)}function Se(A,e){var t,r,n;return e|=0,+((n=+o[(A|=0)>>3]-+o[e>>3])*n+(r=+o[A+8>>3]-+o[e+8>>3])*r+(t=+o[A+16>>3]-+o[e+16>>3])*t)}function Fe(A,e,t){t|=0;var r,o,i,a,s=0,l=0,c=0,u=0;if(a=S,S=S+32|0,u=a,0|(s=0|qA(A|=0,e|=0,o=a+16|0)))return S=a,0|s;r=0|TA(A,e),i=0|UA(A,e),function(A,e){A=7696+(28*(A|=0)|0)|0,n[(e|=0)>>2]=n[A>>2],n[e+4>>2]=n[A+4>>2],n[e+8>>2]=n[A+8>>2],n[e+12>>2]=n[A+12>>2]}(r,u),s=0|function(A,e){A|=0;var t=0,r=0;if((e|=0)>>>0>20)return-1;do{if((0|n[11120+(216*e|0)>>2])!=(0|A))if((0|n[11120+(216*e|0)+8>>2])!=(0|A))if((0|n[11120+(216*e|0)+16>>2])!=(0|A))if((0|n[11120+(216*e|0)+24>>2])!=(0|A))if((0|n[11120+(216*e|0)+32>>2])!=(0|A))if((0|n[11120+(216*e|0)+40>>2])!=(0|A))if((0|n[11120+(216*e|0)+48>>2])!=(0|A))if((0|n[11120+(216*e|0)+56>>2])!=(0|A))if((0|n[11120+(216*e|0)+64>>2])!=(0|A))if((0|n[11120+(216*e|0)+72>>2])!=(0|A))if((0|n[11120+(216*e|0)+80>>2])!=(0|A))if((0|n[11120+(216*e|0)+88>>2])!=(0|A))if((0|n[11120+(216*e|0)+96>>2])!=(0|A))if((0|n[11120+(216*e|0)+104>>2])!=(0|A))if((0|n[11120+(216*e|0)+112>>2])!=(0|A))if((0|n[11120+(216*e|0)+120>>2])!=(0|A))if((0|n[11120+(216*e|0)+128>>2])!=(0|A)){if((0|n[11120+(216*e|0)+136>>2])!=(0|A)){if((0|n[11120+(216*e|0)+144>>2])==(0|A)){A=0,t=2,r=0;break}if((0|n[11120+(216*e|0)+152>>2])==(0|A)){A=0,t=2,r=1;break}if((0|n[11120+(216*e|0)+160>>2])==(0|A)){A=0,t=2,r=2;break}if((0|n[11120+(216*e|0)+168>>2])==(0|A)){A=1,t=2,r=0;break}if((0|n[11120+(216*e|0)+176>>2])==(0|A)){A=1,t=2,r=1;break}if((0|n[11120+(216*e|0)+184>>2])==(0|A)){A=1,t=2,r=2;break}if((0|n[11120+(216*e|0)+192>>2])==(0|A)){A=2,t=2,r=0;break}if((0|n[11120+(216*e|0)+200>>2])==(0|A)){A=2,t=2,r=1;break}if((0|n[11120+(216*e|0)+208>>2])==(0|A)){A=2,t=2,r=2;break}return-1}A=2,t=1,r=2}else A=2,t=1,r=1;else A=2,t=1,r=0;else A=1,t=1,r=2;else A=1,t=1,r=1;else A=1,t=1,r=0;else A=0,t=1,r=2;else A=0,t=1,r=1;else A=0,t=1,r=0;else A=2,t=0,r=2;else A=2,t=0,r=1;else A=2,t=0,r=0;else A=1,t=0,r=2;else A=1,t=0,r=1;else A=1,t=0,r=0;else A=0,t=0,r=2;else A=0,t=0,r=1;else A=0,t=0,r=0}while(0);return 0|n[11120+(216*e|0)+(72*t|0)+(24*A|0)+(r<<3)+4>>2]}(r,0|n[o>>2]);do{if(0|H(r)){switch(0|r){case 4:l=0;break;case 14:l=1;break;case 24:l=2;break;case 38:l=3;break;case 49:l=4;break;case 58:l=5;break;case 63:l=6;break;case 72:l=7;break;case 83:l=8;break;case 97:l=9;break;case 107:l=10;break;case 117:l=11;break;default:M(27795,27797,75,27806)}if(c=0|n[26416+(24*l|0)+8>>2],e=0|n[26416+(24*l|0)+16>>2],(0|(A=0|n[o>>2]))!=(0|n[u>>2])&&(u=0|G(r))|(0|(A=0|n[o>>2]))==(0|e)&&(s=(s+1|0)%6|0),3==(0|i)&(0|A)==(0|e)){s=(s+5|0)%6|0;break}5==(0|i)&(0|A)==(0|c)&&(s=(s+1|0)%6|0)}}while(0);return n[t>>2]=s,S=a,0}function Pe(A,e,t,r){t|=0,r|=0;var o,i,a,s,l,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0;if(l=S,S=S+32|0,y=l+24|0,s=l+20|0,a=l+8|0,i=l+16|0,o=l,g=(g=!(0|zA(A|=0,e|=0)))?6:5,m=0|tt(0|A,0|e,52),B(),g>>>0<=t>>>0)return S=l,2;!(b=!(0|(m&=15)))&&!((p=0|rt(7,0,3*(15^m)|0))&A)&!((0|B())&e)?c=t:u=4;A:do{if(4==(0|u)){if((0|((c=!!(0|zA(A,e)))?4:5))<(0|t))return S=l,1;if(0|Fe(A,e,y))return S=l,1;if(u=(0|n[y>>2])+t|0,7==(0|(p=0|n[(c=c?26704+((0|u)%5<<2)|0:26736+((0|u)%6<<2)|0)>>2])))return S=l,1;n[s>>2]=0,c=0|I(A,e,p,s,a);do{if(!c){if(h=0|n[(f=a)>>2],u=(d=(f=0|n[f+4>>2])>>>0>>0|(0|f)==(0|e)&h>>>0>>0)?h:A,d=d?f:e,!b&&!(h&(b=0|rt(7,0,3*(15^m)|0)))&!(f&(0|B())))c=t;else{if(f=(t+-1+g|0)%(0|g)|0,c=0|zA(A,e),(0|f)<0&&M(27795,27797,248,27822),(0|((g=!!(0|c))?4:5))<(0|f)&&M(27795,27797,248,27822),0|Fe(A,e,y)&&M(27795,27797,248,27822),c=(0|n[y>>2])+f|0,7==(0|(f=0|n[(c=g?26704+((0|c)%5<<2)|0:26736+((0|c)%6<<2)|0)>>2]))&&M(27795,27797,248,27822),n[i>>2]=0,0|(c=0|I(A,e,f,i,o)))break;g=0|n[(h=o)>>2],h=0|n[h+4>>2];do{if(h>>>0>>0|(0|h)==(0|d)&g>>>0>>0){if(u=0|zA(g,h)?0|_(g,h,A,e):0|n[26800+(((0|n[i>>2])+(0|n[26768+(f<<2)>>2])|0)%6<<2)>>2],c=0|zA(g,h),(u+-1|0)>>>0>5){c=-1,u=g,d=h;break}if(1==(0|u)&(c=!!(0|c))){c=-1,u=g,d=h;break}do{if(!(0|Fe(g,h,y))){if(c){c=(5+(0|n[26352+(u<<2)>>2])-(0|n[y>>2])|0)%5|0;break}c=(6+(0|n[26384+(u<<2)>>2])-(0|n[y>>2])|0)%6|0;break}c=-1}while(0);u=g,d=h}else c=t}while(0);h=0|n[(f=a)>>2],f=0|n[f+4>>2]}if((0|u)==(0|h)&(0|d)==(0|f)){if(A=(g=!!(0|zA(h,f)))?0|_(h,f,A,e):0|n[26800+(((0|n[s>>2])+(0|n[26768+(p<<2)>>2])|0)%6<<2)>>2],c=0|zA(h,f),(A+-1|0)>>>0<=5&&!(1==(0|A)&(v=!!(0|c))))do{if(!(0|Fe(h,f,y))){if(v){c=(5+(0|n[26352+(A<<2)>>2])-(0|n[y>>2])|0)%5|0;break}c=(6+(0|n[26384+(A<<2)>>2])-(0|n[y>>2])|0)%6|0;break}c=-1}while(0);else c=-1;c=6==(0|(c=c+1|0))|g&5==(0|c)?0:c}e=d,A=u;break A}}while(0);return S=l,0|c}}while(0);return v=0|rt(0|c,0,56),y=B()|-2130706433&e|536870912,n[r>>2]=v|A,n[r+4>>2]=y,S=l,0}function Te(A,e){A|=0;var t,r,o=0,i=0;return r=S,S=S+16|0,t=r,!0&536870912==(2013265920&(e|=0))&&0|LA(A,o=-2130706433&e|134217728)?(i=0|tt(0|A,0|e,56),B(),o=(i=!(0|Pe(A,o,7&i,t)))&((0|n[(o=t)>>2])==(0|A)?(0|n[o+4>>2])==(0|e):0)&1,S=r,0|o):(S=r,0|(o=0))}function Le(A,e,t){A|=0,t|=0;var r=0;(0|(e|=0))>0?(r=0|Ve(e,4),n[A>>2]=r,r||M(27835,27858,40,27872)):n[A>>2]=0,n[A+4>>2]=e,n[A+8>>2]=0,n[A+12>>2]=t}function Ie(A){var e,t,r,i=0,a=0,s=0,c=0;e=4+(A|=0)|0,t=A+12|0,r=A+8|0;A:for(;;){for(a=0|n[e>>2],i=0;;){if((0|i)>=(0|a))break A;if(s=0|n[A>>2],c=0|n[s+(i<<2)>>2])break;i=i+1|0}i=s+(~~(+l(+ +u(10,+ +(15-(0|n[t>>2])|0))*(+o[c>>3]+ +o[c+8>>3]))%+(0|a))>>>0<<2)|0,a=0|n[i>>2];e:do{if(0|a){if(s=c+32|0,(0|a)==(0|c))n[i>>2]=n[s>>2];else{if(!(i=0|n[(a=a+32|0)>>2]))break;for(;(0|i)!=(0|c);)if(!(i=0|n[(a=i+32|0)>>2]))break e;n[a>>2]=n[s>>2]}Ye(c),n[r>>2]=(0|n[r>>2])-1}}while(0)}Ye(0|n[A>>2])}function Re(A){var e,t=0,r=0;for(e=0|n[4+(A|=0)>>2],r=0;;){if((0|r)>=(0|e)){t=0,r=4;break}if(t=0|n[(0|n[A>>2])+(r<<2)>>2]){r=4;break}r=r+1|0}return 4==(0|r)?0|t:0}function _e(A,e){e|=0;var t=0,r=0,i=0,a=0;if(t=~~(+l(+ +u(10,+ +(15-(0|n[12+(A|=0)>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,t=(0|n[A>>2])+(t<<2)|0,!(r=0|n[t>>2]))return 1;a=e+32|0;do{if((0|r)!=(0|e)){if(!(t=0|n[r+32>>2]))return 1;for(i=t;;){if((0|i)==(0|e)){i=8;break}if(!(t=0|n[i+32>>2])){t=1,i=10;break}r=i,i=t}if(8==(0|i)){n[r+32>>2]=n[a>>2];break}if(10==(0|i))return 0|t}else n[t>>2]=n[a>>2]}while(0);return Ye(e),n[(a=A+8|0)>>2]=(0|n[a>>2])-1,0}function ze(A,e,t){A|=0,e|=0,t|=0;var r,i=0,a=0,s=0;(r=0|Oe(40))||M(27888,27858,98,27901),n[r>>2]=n[e>>2],n[r+4>>2]=n[e+4>>2],n[r+8>>2]=n[e+8>>2],n[r+12>>2]=n[e+12>>2],n[(a=r+16|0)>>2]=n[t>>2],n[a+4>>2]=n[t+4>>2],n[a+8>>2]=n[t+8>>2],n[a+12>>2]=n[t+12>>2],n[r+32>>2]=0,a=~~(+l(+ +u(10,+ +(15-(0|n[A+12>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,a=(0|n[A>>2])+(a<<2)|0,i=0|n[a>>2];do{if(i){for(;!(0|oe(i,e)&&0|oe(i+16|0,t));)if(a=0|n[i+32>>2],!(0|n[(i=0|a?a:i)+32>>2])){s=10;break}if(10==(0|s)){n[i+32>>2]=r;break}return Ye(r),0|i}n[a>>2]=r}while(0);return n[(s=A+8|0)>>2]=1+(0|n[s>>2]),0|r}function He(A,e,t){e|=0,t|=0;var r=0,i=0;if(i=~~(+l(+ +u(10,+ +(15-(0|n[12+(A|=0)>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,!(i=0|n[(0|n[A>>2])+(i<<2)>>2]))return 0;if(!t){for(A=i;;){if(0|oe(A,e)){r=10;break}if(!(A=0|n[A+32>>2])){A=0,r=10;break}}if(10==(0|r))return 0|A}for(A=i;;){if(0|oe(A,e)&&0|oe(A+16|0,t)){r=10;break}if(!(A=0|n[A+32>>2])){A=0,r=10;break}}return 10==(0|r)?0|A:0}function Ge(A,e){e|=0;var t=0;if(t=~~(+l(+ +u(10,+ +(15-(0|n[12+(A|=0)>>2])|0))*(+o[e>>3]+ +o[e+8>>3]))%+(0|n[A+4>>2]))>>>0,!(A=0|n[(0|n[A>>2])+(t<<2)>>2]))return 0;for(;;){if(0|oe(A,e)){e=5;break}if(!(A=0|n[A+32>>2])){A=0,e=5;break}}return 5==(0|e)?0|A:0}function Ue(A){return 0|+ct(+(A=+A))}function Oe(A){A|=0;var e,t=0,r=0,o=0,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0;e=S,S=S+16|0,g=e;do{if(A>>>0<245){if(A=(u=A>>>0<11?16:A+11&-8)>>>3,3&(r=(f=0|n[6981])>>>A))return o=0|n[(r=8+(A=27964+((t=(1&r^1)+A|0)<<1<<2)|0)|0)>>2],(0|(a=0|n[(i=o+8|0)>>2]))==(0|A)?n[6981]=f&~(1<>2]=A,n[r>>2]=a),x=t<<3,n[o+4>>2]=3|x,n[(x=o+x+4|0)>>2]=1|n[x>>2],S=e,0|i;if(u>>>0>(d=0|n[6983])>>>0){if(0|r)return t=((t=r<>>=l=t>>>12&16)>>>5&8)|l|(a=(t>>>=r)>>>2&4)|(A=(t>>>=a)>>>1&2)|(o=(t>>>=A)>>>1&1))+(t>>>o)|0)<<1<<2)|0)|0)>>2],(0|(r=0|n[(l=a+8|0)>>2]))==(0|t)?(A=f&~(1<>2]=t,n[A>>2]=r,A=f),s=(x=o<<3)-u|0,n[a+4>>2]=3|u,n[4+(i=a+u|0)>>2]=1|s,n[a+x>>2]=s,0|d&&(o=0|n[6986],r=27964+((t=d>>>3)<<1<<2)|0,A&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=o,n[t+12>>2]=o,n[o+8>>2]=t,n[o+12>>2]=r),n[6983]=s,n[6986]=i,S=e,0|l;if(a=0|n[6982]){for(r=(a&0-a)-1|0,r=c=0|n[28228+(((o=(r>>>=i=r>>>12&16)>>>5&8)|i|(s=(r>>>=o)>>>2&4)|(l=(r>>>=s)>>>1&2)|(c=(r>>>=l)>>>1&1))+(r>>>c)<<2)>>2],l=c,c=(-8&n[c+4>>2])-u|0;(A=0|n[r+16>>2])||(A=0|n[r+20>>2]);)r=A,l=(i=(s=(-8&n[A+4>>2])-u|0)>>>0>>0)?A:l,c=i?s:c;if((s=l+u|0)>>>0>l>>>0){i=0|n[l+24>>2],t=0|n[l+12>>2];do{if((0|t)==(0|l)){if(!(t=0|n[(A=l+20|0)>>2])&&!(t=0|n[(A=l+16|0)>>2])){r=0;break}for(;;)if(r=0|n[(o=t+20|0)>>2])t=r,A=o;else{if(!(r=0|n[(o=t+16|0)>>2]))break;t=r,A=o}n[A>>2]=0,r=t}else r=0|n[l+8>>2],n[r+12>>2]=t,n[t+8>>2]=r,r=t}while(0);do{if(0|i){if(t=0|n[l+28>>2],(0|l)==(0|n[(A=28228+(t<<2)|0)>>2])){if(n[A>>2]=r,!r){n[6982]=a&~(1<>2])==(0|l)?x:i+20)>>2]=r,!r)break;n[r+24>>2]=i,0|(t=0|n[l+16>>2])&&(n[r+16>>2]=t,n[t+24>>2]=r),0|(t=0|n[l+20>>2])&&(n[r+20>>2]=t,n[t+24>>2]=r)}}while(0);return c>>>0<16?(x=c+u|0,n[l+4>>2]=3|x,n[(x=l+x+4|0)>>2]=1|n[x>>2]):(n[l+4>>2]=3|u,n[s+4>>2]=1|c,n[s+c>>2]=c,0|d&&(o=0|n[6986],r=27964+((t=d>>>3)<<1<<2)|0,(t=1<>2]:(n[6981]=t|f,t=r,A=r+8|0),n[A>>2]=o,n[t+12>>2]=o,n[o+8>>2]=t,n[o+12>>2]=r),n[6983]=c,n[6986]=s),S=e,0|l+8}f=u}else f=u}else f=u}else if(A>>>0<=4294967231)if(u=-8&(A=A+11|0),o=0|n[6982]){i=0-u|0,c=(A>>>=8)?u>>>0>16777215?31:u>>>(7+(c=14-((l=(520192+(b=A<<(f=(A+1048320|0)>>>16&8))|0)>>>16&4)|f|(c=(245760+(b<<=l)|0)>>>16&2))+(b<>>15)|0)|0)&1|c<<1:0,r=0|n[28228+(c<<2)>>2];A:do{if(r)for(A=0,l=u<<(31==(0|c)?0:25-(c>>>1)|0),a=0;;){if((s=(-8&n[r+4>>2])-u|0)>>>0>>0){if(!s){A=r,i=0,b=65;break A}A=r,i=s}if(a=!(0|(b=0|n[r+20>>2]))|(0|b)==(0|(r=0|n[r+16+(l>>>31<<2)>>2]))?a:b,!r){r=a,b=61;break}l<<=1}else r=0,A=0,b=61}while(0);if(61==(0|b)){if(!(0|r)&!(0|A)){if(!(A=((A=2<>>=s=f>>>12&16)>>>5&8)|s|(l=(f>>>=a)>>>2&4)|(c=(f>>>=l)>>>1&2)|(r=(f>>>=c)>>>1&1))+(f>>>r)<<2)>>2]}r?b=65:(l=A,s=i)}if(65==(0|b))for(a=r;;){if(i=(r=(f=(-8&n[a+4>>2])-u|0)>>>0>>0)?f:i,A=r?a:A,(r=0|n[a+16>>2])||(r=0|n[a+20>>2]),!r){l=A,s=i;break}a=r}if(0|l&&s>>>0<((0|n[6983])-u|0)>>>0&&(d=l+u|0)>>>0>l>>>0){a=0|n[l+24>>2],t=0|n[l+12>>2];do{if((0|t)==(0|l)){if(!(t=0|n[(A=l+20|0)>>2])&&!(t=0|n[(A=l+16|0)>>2])){t=0;break}for(;;)if(r=0|n[(i=t+20|0)>>2])t=r,A=i;else{if(!(r=0|n[(i=t+16|0)>>2]))break;t=r,A=i}n[A>>2]=0}else x=0|n[l+8>>2],n[x+12>>2]=t,n[t+8>>2]=x}while(0);do{if(a){if(A=0|n[l+28>>2],(0|l)==(0|n[(r=28228+(A<<2)|0)>>2])){if(n[r>>2]=t,!t){o&=~(1<>2])==(0|l)?x:a+20)>>2]=t,!t)break;n[t+24>>2]=a,0|(A=0|n[l+16>>2])&&(n[t+16>>2]=A,n[A+24>>2]=t),(A=0|n[l+20>>2])&&(n[t+20>>2]=A,n[A+24>>2]=t)}}while(0);A:do{if(s>>>0<16)x=s+u|0,n[l+4>>2]=3|x,n[(x=l+x+4|0)>>2]=1|n[x>>2];else{if(n[l+4>>2]=3|u,n[d+4>>2]=1|s,n[d+s>>2]=s,t=s>>>3,s>>>0<256){r=27964+(t<<1<<2)|0,(A=0|n[6981])&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=d,n[t+12>>2]=d,n[d+8>>2]=t,n[d+12>>2]=r;break}if(t=28228+((r=(t=s>>>8)?s>>>0>16777215?31:s>>>(7+(r=14-((y=(520192+(x=t<<(w=(t+1048320|0)>>>16&8))|0)>>>16&4)|w|(r=(245760+(x<<=y)|0)>>>16&2))+(x<>>15)|0)|0)&1|r<<1:0)<<2)|0,n[d+28>>2]=r,n[4+(A=d+16|0)>>2]=0,n[A>>2]=0,!(o&(A=1<>2]=d,n[d+24>>2]=t,n[d+12>>2]=d,n[d+8>>2]=d;break}t=0|n[t>>2];e:do{if((-8&n[t+4>>2])!=(0|s)){for(o=s<<(31==(0|r)?0:25-(r>>>1)|0);A=0|n[(r=t+16+(o>>>31<<2)|0)>>2];){if((-8&n[A+4>>2])==(0|s)){t=A;break e}o<<=1,t=A}n[r>>2]=d,n[d+24>>2]=t,n[d+12>>2]=d,n[d+8>>2]=d;break A}}while(0);x=0|n[(w=t+8|0)>>2],n[x+12>>2]=d,n[w>>2]=d,n[d+8>>2]=x,n[d+12>>2]=t,n[d+24>>2]=0}}while(0);return S=e,0|l+8}f=u}else f=u;else f=-1}while(0);if((r=0|n[6983])>>>0>=f>>>0)return t=r-f|0,A=0|n[6986],t>>>0>15?(x=A+f|0,n[6986]=x,n[6983]=t,n[x+4>>2]=1|t,n[A+r>>2]=t,n[A+4>>2]=3|f):(n[6983]=0,n[6986]=0,n[A+4>>2]=3|r,n[(x=A+r+4|0)>>2]=1|n[x>>2]),S=e,0|A+8;if((s=0|n[6984])>>>0>f>>>0)return y=s-f|0,n[6984]=y,w=(x=0|n[6987])+f|0,n[6987]=w,n[w+4>>2]=1|y,n[x+4>>2]=3|f,S=e,0|x+8;if(0|n[7099]?A=0|n[7101]:(n[7101]=4096,n[7100]=4096,n[7102]=-1,n[7103]=-1,n[7104]=0,n[7092]=0,n[7099]=-16&g^1431655768,A=4096),l=f+48|0,(u=(a=A+(c=f+47|0)|0)&(i=0-A|0))>>>0<=f>>>0)return S=e,0;if(0|(A=0|n[7091])&&(g=(d=0|n[7089])+u|0)>>>0<=d>>>0|g>>>0>A>>>0)return S=e,0;A:do{if(4&n[7092])t=0,b=143;else{r=0|n[6987];e:do{if(r){for(o=28372;!((g=0|n[o>>2])>>>0<=r>>>0&&(g+(0|n[o+4>>2])|0)>>>0>r>>>0);){if(!(A=0|n[o+8>>2])){b=128;break e}o=A}if((t=a-s&i)>>>0<2147483647)if((0|(A=0|ut(0|t)))==((0|n[o>>2])+(0|n[o+4>>2])|0)){if(-1!=(0|A)){s=t,a=A,b=145;break A}}else o=A,b=136;else t=0}else b=128}while(0);do{if(128==(0|b))if(-1!=(0|(r=0|ut(0)))&&(t=r,m=(t=((m=(h=0|n[7100])-1|0)&t?(m+t&0-h)-t|0:0)+u|0)+(h=0|n[7089])|0,t>>>0>f>>>0&t>>>0<2147483647)){if(0|(g=0|n[7091])&&m>>>0<=h>>>0|m>>>0>g>>>0){t=0;break}if((0|(A=0|ut(0|t)))==(0|r)){s=t,a=r,b=145;break A}o=A,b=136}else t=0}while(0);do{if(136==(0|b)){if(r=0-t|0,!(l>>>0>t>>>0&t>>>0<2147483647&-1!=(0|o))){if(-1==(0|o)){t=0;break}s=t,a=o,b=145;break A}if((A=c-t+(A=0|n[7101])&0-A)>>>0>=2147483647){s=t,a=o,b=145;break A}if(-1==(0|ut(0|A))){ut(0|r),t=0;break}s=A+t|0,a=o,b=145;break A}}while(0);n[7092]=4|n[7092],b=143}}while(0);if(143==(0|b)&&u>>>0<2147483647&&!(-1==(0|(y=0|ut(0|u)))|1^(v=(p=(m=0|ut(0))-y|0)>>>0>(f+40|0)>>>0)|y>>>0>>0&-1!=(0|y)&-1!=(0|m)^1)&&(s=v?p:t,a=y,b=145),145==(0|b)){t=(0|n[7089])+s|0,n[7089]=t,t>>>0>(0|n[7090])>>>0&&(n[7090]=t),c=0|n[6987];A:do{if(c){for(t=28372;;){if((0|a)==((A=0|n[t>>2])+(r=0|n[t+4>>2])|0)){b=154;break}if(!(o=0|n[t+8>>2]))break;t=o}if(!(154!=(0|b)||(w=t+4|0,8&n[t+12>>2]))&&a>>>0>c>>>0&A>>>0<=c>>>0){n[w>>2]=r+s,w=c+(y=7&(y=c+8|0)?0-y&7:0)|0,y=(x=(0|n[6984])+s|0)-y|0,n[6987]=w,n[6984]=y,n[w+4>>2]=1|y,n[c+x+4>>2]=40,n[6988]=n[7103];break}for(a>>>0<(0|n[6985])>>>0&&(n[6985]=a),r=a+s|0,t=28372;;){if((0|n[t>>2])==(0|r)){b=162;break}if(!(A=0|n[t+8>>2]))break;t=A}if(162==(0|b)&&!(8&n[t+12>>2])){n[t>>2]=a,n[(d=t+4|0)>>2]=(0|n[d>>2])+s,u=(d=a+(7&(d=a+8|0)?0-d&7:0)|0)+f|0,l=(t=r+(7&(t=r+8|0)?0-t&7:0)|0)-d-f|0,n[d+4>>2]=3|f;e:do{if((0|c)==(0|t))x=(0|n[6984])+l|0,n[6984]=x,n[6987]=u,n[u+4>>2]=1|x;else{if((0|n[6986])==(0|t)){x=(0|n[6983])+l|0,n[6983]=x,n[6986]=u,n[u+4>>2]=1|x,n[u+x>>2]=x;break}if(1==(3&(A=0|n[t+4>>2]))){s=-8&A,o=A>>>3;t:do{if(A>>>0<256){if(A=0|n[t+8>>2],(0|(r=0|n[t+12>>2]))==(0|A)){n[6981]=n[6981]&~(1<>2]=r,n[r+8>>2]=A;break}a=0|n[t+24>>2],A=0|n[t+12>>2];do{if((0|A)==(0|t)){if(A=0|n[(o=4+(r=t+16|0)|0)>>2])r=o;else if(!(A=0|n[r>>2])){A=0;break}for(;;)if(o=0|n[(i=A+20|0)>>2])A=o,r=i;else{if(!(o=0|n[(i=A+16|0)>>2]))break;A=o,r=i}n[r>>2]=0}else x=0|n[t+8>>2],n[x+12>>2]=A,n[A+8>>2]=x}while(0);if(!a)break;o=28228+((r=0|n[t+28>>2])<<2)|0;do{if((0|n[o>>2])==(0|t)){if(n[o>>2]=A,0|A)break;n[6982]=n[6982]&~(1<>2])==(0|t)?x:a+20)>>2]=A,!A)break t}while(0);if(n[A+24>>2]=a,0|(o=0|n[(r=t+16|0)>>2])&&(n[A+16>>2]=o,n[o+24>>2]=A),!(r=0|n[r+4>>2]))break;n[A+20>>2]=r,n[r+24>>2]=A}while(0);t=t+s|0,i=s+l|0}else i=l;if(n[(t=t+4|0)>>2]=-2&n[t>>2],n[u+4>>2]=1|i,n[u+i>>2]=i,t=i>>>3,i>>>0<256){r=27964+(t<<1<<2)|0,(A=0|n[6981])&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=u,n[t+12>>2]=u,n[u+8>>2]=t,n[u+12>>2]=r;break}t=i>>>8;do{if(t){if(i>>>0>16777215){o=31;break}o=i>>>(7+(o=14-((y=(520192+(x=t<<(w=(t+1048320|0)>>>16&8))|0)>>>16&4)|w|(o=(245760+(x<<=y)|0)>>>16&2))+(x<>>15)|0)|0)&1|o<<1}else o=0}while(0);if(t=28228+(o<<2)|0,n[u+28>>2]=o,n[4+(A=u+16|0)>>2]=0,n[A>>2]=0,!((A=0|n[6982])&(r=1<>2]=u,n[u+24>>2]=t,n[u+12>>2]=u,n[u+8>>2]=u;break}t=0|n[t>>2];t:do{if((-8&n[t+4>>2])!=(0|i)){for(o=i<<(31==(0|o)?0:25-(o>>>1)|0);A=0|n[(r=t+16+(o>>>31<<2)|0)>>2];){if((-8&n[A+4>>2])==(0|i)){t=A;break t}o<<=1,t=A}n[r>>2]=u,n[u+24>>2]=t,n[u+12>>2]=u,n[u+8>>2]=u;break e}}while(0);x=0|n[(w=t+8|0)>>2],n[x+12>>2]=u,n[w>>2]=u,n[u+8>>2]=x,n[u+12>>2]=t,n[u+24>>2]=0}}while(0);return S=e,0|d+8}for(t=28372;!((A=0|n[t>>2])>>>0<=c>>>0&&(x=A+(0|n[t+4>>2])|0)>>>0>c>>>0);)t=0|n[t+8>>2];t=(A=(A=(i=x+-47|0)+(7&(A=i+8|0)?0-A&7:0)|0)>>>0<(i=c+16|0)>>>0?c:A)+8|0,w=a+(y=7&(y=a+8|0)?0-y&7:0)|0,y=(r=s+-40|0)-y|0,n[6987]=w,n[6984]=y,n[w+4>>2]=1|y,n[a+r+4>>2]=40,n[6988]=n[7103],n[(r=A+4|0)>>2]=27,n[t>>2]=n[7093],n[t+4>>2]=n[7094],n[t+8>>2]=n[7095],n[t+12>>2]=n[7096],n[7093]=a,n[7094]=s,n[7096]=0,n[7095]=t,t=A+24|0;do{w=t,n[(t=t+4|0)>>2]=7}while((w+8|0)>>>0>>0);if((0|A)!=(0|c)){if(a=A-c|0,n[r>>2]=-2&n[r>>2],n[c+4>>2]=1|a,n[A>>2]=a,t=a>>>3,a>>>0<256){r=27964+(t<<1<<2)|0,(A=0|n[6981])&(t=1<>2]:(n[6981]=A|t,t=r,A=r+8|0),n[A>>2]=c,n[t+12>>2]=c,n[c+8>>2]=t,n[c+12>>2]=r;break}if(r=28228+((o=(t=a>>>8)?a>>>0>16777215?31:a>>>(7+(o=14-((y=(520192+(x=t<<(w=(t+1048320|0)>>>16&8))|0)>>>16&4)|w|(o=(245760+(x<<=y)|0)>>>16&2))+(x<>>15)|0)|0)&1|o<<1:0)<<2)|0,n[c+28>>2]=o,n[c+20>>2]=0,n[i>>2]=0,!((t=0|n[6982])&(A=1<>2]=c,n[c+24>>2]=r,n[c+12>>2]=c,n[c+8>>2]=c;break}t=0|n[r>>2];e:do{if((-8&n[t+4>>2])!=(0|a)){for(o=a<<(31==(0|o)?0:25-(o>>>1)|0);A=0|n[(r=t+16+(o>>>31<<2)|0)>>2];){if((-8&n[A+4>>2])==(0|a)){t=A;break e}o<<=1,t=A}n[r>>2]=c,n[c+24>>2]=t,n[c+12>>2]=c,n[c+8>>2]=c;break A}}while(0);x=0|n[(w=t+8|0)>>2],n[x+12>>2]=c,n[w>>2]=c,n[c+8>>2]=x,n[c+12>>2]=t,n[c+24>>2]=0}}else!(0|(x=0|n[6985]))|a>>>0>>0&&(n[6985]=a),n[7093]=a,n[7094]=s,n[7096]=0,n[6990]=n[7099],n[6989]=-1,n[6994]=27964,n[6993]=27964,n[6996]=27972,n[6995]=27972,n[6998]=27980,n[6997]=27980,n[7e3]=27988,n[6999]=27988,n[7002]=27996,n[7001]=27996,n[7004]=28004,n[7003]=28004,n[7006]=28012,n[7005]=28012,n[7008]=28020,n[7007]=28020,n[7010]=28028,n[7009]=28028,n[7012]=28036,n[7011]=28036,n[7014]=28044,n[7013]=28044,n[7016]=28052,n[7015]=28052,n[7018]=28060,n[7017]=28060,n[7020]=28068,n[7019]=28068,n[7022]=28076,n[7021]=28076,n[7024]=28084,n[7023]=28084,n[7026]=28092,n[7025]=28092,n[7028]=28100,n[7027]=28100,n[7030]=28108,n[7029]=28108,n[7032]=28116,n[7031]=28116,n[7034]=28124,n[7033]=28124,n[7036]=28132,n[7035]=28132,n[7038]=28140,n[7037]=28140,n[7040]=28148,n[7039]=28148,n[7042]=28156,n[7041]=28156,n[7044]=28164,n[7043]=28164,n[7046]=28172,n[7045]=28172,n[7048]=28180,n[7047]=28180,n[7050]=28188,n[7049]=28188,n[7052]=28196,n[7051]=28196,n[7054]=28204,n[7053]=28204,n[7056]=28212,n[7055]=28212,w=a+(y=7&(y=a+8|0)?0-y&7:0)|0,y=(x=s+-40|0)-y|0,n[6987]=w,n[6984]=y,n[w+4>>2]=1|y,n[a+x+4>>2]=40,n[6988]=n[7103]}while(0);if((t=0|n[6984])>>>0>f>>>0)return y=t-f|0,n[6984]=y,w=(x=0|n[6987])+f|0,n[6987]=w,n[w+4>>2]=1|y,n[x+4>>2]=3|f,S=e,0|x+8}return n[(x=27920)>>2]=12,S=e,0}function Ye(A){var e=0,t=0,r=0,o=0,i=0,a=0,s=0,l=0;if(A|=0){t=A+-8|0,o=0|n[6985],l=t+(e=-8&(A=0|n[A+-4>>2]))|0;do{if(1&A)s=t,a=t;else{if(r=0|n[t>>2],!(3&A))return;if(i=r+e|0,(a=t+(0-r)|0)>>>0>>0)return;if((0|n[6986])==(0|a)){if(3&~(e=0|n[(A=l+4|0)>>2])){s=a,e=i;break}return n[6983]=i,n[A>>2]=-2&e,n[a+4>>2]=1|i,void(n[a+i>>2]=i)}if(t=r>>>3,r>>>0<256){if(A=0|n[a+8>>2],(0|(e=0|n[a+12>>2]))==(0|A)){n[6981]=n[6981]&~(1<>2]=e,n[e+8>>2]=A,s=a,e=i;break}o=0|n[a+24>>2],A=0|n[a+12>>2];do{if((0|A)==(0|a)){if(A=0|n[(t=4+(e=a+16|0)|0)>>2])e=t;else if(!(A=0|n[e>>2])){A=0;break}for(;;)if(t=0|n[(r=A+20|0)>>2])A=t,e=r;else{if(!(t=0|n[(r=A+16|0)>>2]))break;A=t,e=r}n[e>>2]=0}else s=0|n[a+8>>2],n[s+12>>2]=A,n[A+8>>2]=s}while(0);if(o){if(e=0|n[a+28>>2],(0|n[(t=28228+(e<<2)|0)>>2])==(0|a)){if(n[t>>2]=A,!A){n[6982]=n[6982]&~(1<>2])==(0|a)?s:o+20)>>2]=A,!A){s=a,e=i;break}n[A+24>>2]=o,0|(t=0|n[(e=a+16|0)>>2])&&(n[A+16>>2]=t,n[t+24>>2]=A),(e=0|n[e+4>>2])?(n[A+20>>2]=e,n[e+24>>2]=A,s=a,e=i):(s=a,e=i)}else s=a,e=i}}while(0);if(!(a>>>0>=l>>>0)&&1&(r=0|n[(A=l+4|0)>>2])){if(2&r)n[A>>2]=-2&r,n[s+4>>2]=1|e,n[a+e>>2]=e,o=e;else{if((0|n[6987])==(0|l)){if(l=(0|n[6984])+e|0,n[6984]=l,n[6987]=s,n[s+4>>2]=1|l,(0|s)!=(0|n[6986]))return;return n[6986]=0,void(n[6983]=0)}if((0|n[6986])==(0|l))return l=(0|n[6983])+e|0,n[6983]=l,n[6986]=a,n[s+4>>2]=1|l,void(n[a+l>>2]=l);o=(-8&r)+e|0,t=r>>>3;do{if(r>>>0<256){if(e=0|n[l+8>>2],(0|(A=0|n[l+12>>2]))==(0|e)){n[6981]=n[6981]&~(1<>2]=A,n[A+8>>2]=e;break}i=0|n[l+24>>2],A=0|n[l+12>>2];do{if((0|A)==(0|l)){if(A=0|n[(t=4+(e=l+16|0)|0)>>2])e=t;else if(!(A=0|n[e>>2])){t=0;break}for(;;)if(t=0|n[(r=A+20|0)>>2])A=t,e=r;else{if(!(t=0|n[(r=A+16|0)>>2]))break;A=t,e=r}n[e>>2]=0,t=A}else t=0|n[l+8>>2],n[t+12>>2]=A,n[A+8>>2]=t,t=A}while(0);if(0|i){if(A=0|n[l+28>>2],(0|n[(e=28228+(A<<2)|0)>>2])==(0|l)){if(n[e>>2]=t,!t){n[6982]=n[6982]&~(1<>2])==(0|l)?r:i+20)>>2]=t,!t)break;n[t+24>>2]=i,0|(e=0|n[(A=l+16|0)>>2])&&(n[t+16>>2]=e,n[e+24>>2]=t),0|(A=0|n[A+4>>2])&&(n[t+20>>2]=A,n[A+24>>2]=t)}}while(0);if(n[s+4>>2]=1|o,n[a+o>>2]=o,(0|s)==(0|n[6986]))return void(n[6983]=o)}if(A=o>>>3,o>>>0<256)return t=27964+(A<<1<<2)|0,(e=0|n[6981])&(A=1<>2]:(n[6981]=e|A,A=t,e=t+8|0),n[e>>2]=s,n[A+12>>2]=s,n[s+8>>2]=A,void(n[s+12>>2]=t);A=28228+((r=(A=o>>>8)?o>>>0>16777215?31:o>>>(7+(r=14-((i=(520192+(l=A<<(a=(A+1048320|0)>>>16&8))|0)>>>16&4)|a|(r=(245760+(l<<=i)|0)>>>16&2))+(l<>>15)|0)|0)&1|r<<1:0)<<2)|0,n[s+28>>2]=r,n[s+20>>2]=0,n[s+16>>2]=0,e=0|n[6982],t=1<>2];e:do{if((-8&n[A+4>>2])!=(0|o)){for(r=o<<(31==(0|r)?0:25-(r>>>1)|0);e=0|n[(t=A+16+(r>>>31<<2)|0)>>2];){if((-8&n[e+4>>2])==(0|o)){A=e;break e}r<<=1,A=e}n[t>>2]=s,n[s+24>>2]=A,n[s+12>>2]=s,n[s+8>>2]=s;break A}}while(0);l=0|n[(a=A+8|0)>>2],n[l+12>>2]=s,n[a>>2]=s,n[s+8>>2]=l,n[s+12>>2]=A,n[s+24>>2]=0}else n[6982]=e|t,n[A>>2]=s,n[s+24>>2]=A,n[s+12>>2]=s,n[s+8>>2]=s}while(0);if(l=(0|n[6989])-1|0,n[6989]=l,!(0|l)){for(A=28380;A=0|n[A>>2];)A=A+8|0;n[6989]=-1}}}}function Ve(A,e){e|=0;var t=0;return(A|=0)?(t=0|y(e,A),(e|A)>>>0>65535&&(t=((t>>>0)/(A>>>0)|0)==(0|e)?t:-1)):t=0,(A=0|Oe(t))&&3&n[A+-4>>2]?(lt(0|A,0,0|t),0|A):0|A}function We(A,e,t,r){return 0|(C((e|=0)+(r|=0)+((t=(A|=0)+(t|=0)>>>0)>>>0>>0|0)>>>0|0),t)}function Ze(A,e,t,r){return 0|(C(0|(r=(e|=0)-(r|=0)-((t|=0)>>>0>(A|=0)>>>0|0)>>>0)),A-t>>>0)}function Ke(A){return 0|((A|=0)?31-(0|k(A^A-1)):32)}function Je(A,e,t,r,o){o|=0;var i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0;if(u=A|=0,a=t|=0,s=f=r|=0,!(c=l=e|=0))return i=!!(0|o),s?i?(n[o>>2]=0|A,n[o+4>>2]=0&e,o=0,0|(C(0|(f=0)),o)):(o=0,0|(C(0|(f=0)),o)):(i&&(n[o>>2]=(u>>>0)%(a>>>0),n[o+4>>2]=0),o=(u>>>0)/(a>>>0)>>>0,0|(C(0|(f=0)),o));i=!(0|s);do{if(a){if(!i){if((i=(0|k(0|s))-(0|k(0|c))|0)>>>0<=31){a=d=i+1|0,A=u>>>(d>>>0)&(e=i-31>>31)|c<<(s=31-i|0),e&=c>>>(d>>>0),i=0,s=u<>2]=0|A,n[o+4>>2]=l|0&e,o=0,0|(C(0|(f=0)),o)):(o=0,0|(C(0|(f=0)),o))}if((i=a-1|0)&a){a=s=33+(0|k(0|a))-(0|k(0|c))|0,A=(d=32-s|0)-1>>31&c>>>((g=s-32|0)>>>0)|(c<>>(s>>>0))&(e=g>>31),e&=c>>>(s>>>0),i=u<<(h=64-s|0)&(l=d>>31),s=(c<>>(g>>>0))&l|u<>31;break}return 0|o&&(n[o>>2]=i&u,n[o+4>>2]=0),1==(0|a)?(h=0|A,0|(C(0|(g=l|0&e)),h)):(g=c>>>((h=0|Ke(0|a))>>>0)|0,h=c<<32-h|u>>>(h>>>0),0|(C(0|g),h))}if(i)return 0|o&&(n[o>>2]=(c>>>0)%(a>>>0),n[o+4>>2]=0),h=(c>>>0)/(a>>>0)>>>0,0|(C(0|(g=0)),h);if(!u)return 0|o&&(n[o>>2]=0,n[o+4>>2]=(c>>>0)%(s>>>0)),h=(c>>>0)/(s>>>0)>>>0,0|(C(0|(g=0)),h);if(!((i=s-1|0)&s))return 0|o&&(n[o>>2]=0|A,n[o+4>>2]=i&c|0&e),g=0,h=c>>>((0|Ke(0|s))>>>0),0|(C(0|g),h);if((i=(0|k(0|s))-(0|k(0|c))|0)>>>0<=30){a=e=i+1|0,A=c<<(s=31-i|0)|u>>>(e>>>0),e=c>>>(e>>>0),i=0,s=u<>2]=0|A,n[o+4>>2]=l|0&e,h=0,0|(C(0|(g=0)),h)):(h=0,0|(C(0|(g=0)),h))}while(0);if(a){c=0|We(0|(d=0|t),0|(u=f|0&r),-1,-1),t=0|B(),l=s,s=0;do{r=l,l=i>>>31|l<<1,i=s|i<<1,Ze(0|c,0|t,0|(r=A<<1|r>>>31),0|(f=A>>>31|e<<1)),s=1&(g=(h=0|B())>>31|((0|h)<0?-1:0)<<1),A=0|Ze(0|r,0|f,g&d|0,(((0|h)<0?-1:0)>>31|((0|h)<0?-1:0)<<1)&u),e=0|B(),a=a-1|0}while(0|a);c=l,l=0}else c=s,l=0,s=0;return a=0,0|o&&(n[o>>2]=A,n[o+4>>2]=e),h=i<<1&-2|s,0|(C(0|(g=(0|i)>>>31|(c|a)<<1|l)),h)}function qe(A,e,t,r){var n,o,i,a,s;return t|=0,o=(r|=0)>>31|((0|r)<0?-1:0)<<1,n=((0|r)<0?-1:0)>>31|((0|r)<0?-1:0)<<1,i=0|Ze((s=(e|=0)>>31|((0|e)<0?-1:0)<<1)^(A|=0),(a=((0|e)<0?-1:0)>>31|((0|e)<0?-1:0)<<1)^e,0|s,0|a),A=o^s,e=n^a,0|Ze((0|Je(i,0|B(),0|Ze(o^t|0,n^r|0,0|o,0|n),0|B(),0))^A,(0|B())^e,0|A,0|e)}function Xe(A,e,t,r){var n,o;return e|=0,r|=0,t=0|function(A,e){var t,r,n,o=0;return A=((t=0|y(o=65535&(e|=0),n=65535&(A|=0)))>>>16)+(0|y(o,r=A>>>16))|0,e=0|y(o=e>>>16,n),0|(C((A>>>16)+(0|y(o,r))+(((65535&A)+e|0)>>>16)|0),A+e<<16|65535&t)}(n=A|=0,o=t|=0),A=0|B(),0|(C((0|y(e,o))+(0|y(r,n))+A|0&A),t)}function $e(A,e,t,r){var o,i,a,s,l,c;return t|=0,o=S,S=S+16|0,s=0|o,c=(r|=0)>>31|((0|r)<0?-1:0)<<1,l=((0|r)<0?-1:0)>>31|((0|r)<0?-1:0)<<1,Je(A=0|Ze((a=(e|=0)>>31|((0|e)<0?-1:0)<<1)^(A|=0),(i=((0|e)<0?-1:0)>>31|((0|e)<0?-1:0)<<1)^e,0|a,0|i),e=0|B(),0|Ze(c^t|0,l^r|0,0|c,0|l),0|B(),s),r=0|Ze(n[s>>2]^a|0,n[s+4>>2]^i|0,0|a,0|i),t=0|B(),S=o,0|(C(0|t),r)}function At(A,e,t,r){var o,i;return i=S,S=S+16|0,Je(A|=0,e|=0,t|=0,r|=0,o=0|i),S=i,0|(C(0|n[o+4>>2]),n[o>>2])}function et(A,e,t){return A|=0,e|=0,(0|(t|=0))<32?(C(e>>t|0),A>>>t|(e&(1<>t-32)}function tt(A,e,t){return A|=0,e|=0,(0|(t|=0))<32?(C(e>>>t|0),A>>>t|(e&(1<>>t-32|0)}function rt(A,e,t){return A|=0,(0|(t|=0))<32?(C((e|=0)<>>32-t),A<=0?+s(A+.5):+v(A-.5)}function st(A,e,t){A|=0,e|=0;var o,i,a=0;if((0|(t|=0))>=8192)return j(0|A,0|e,0|t),0|A;if(i=0|A,o=A+t|0,(3&A)==(3&e)){for(;3&A;){if(!t)return 0|i;r[0|A]=0|r[0|e],A=A+1|0,e=e+1|0,t=t-1|0}for(a=(t=-4&o)-64|0;(0|A)<=(0|a);)n[A>>2]=n[e>>2],n[A+4>>2]=n[e+4>>2],n[A+8>>2]=n[e+8>>2],n[A+12>>2]=n[e+12>>2],n[A+16>>2]=n[e+16>>2],n[A+20>>2]=n[e+20>>2],n[A+24>>2]=n[e+24>>2],n[A+28>>2]=n[e+28>>2],n[A+32>>2]=n[e+32>>2],n[A+36>>2]=n[e+36>>2],n[A+40>>2]=n[e+40>>2],n[A+44>>2]=n[e+44>>2],n[A+48>>2]=n[e+48>>2],n[A+52>>2]=n[e+52>>2],n[A+56>>2]=n[e+56>>2],n[A+60>>2]=n[e+60>>2],A=A+64|0,e=e+64|0;for(;(0|A)<(0|t);)n[A>>2]=n[e>>2],A=A+4|0,e=e+4|0}else for(t=o-4|0;(0|A)<(0|t);)r[0|A]=0|r[0|e],r[A+1|0]=0|r[e+1|0],r[A+2|0]=0|r[e+2|0],r[A+3|0]=0|r[e+3|0],A=A+4|0,e=e+4|0;for(;(0|A)<(0|o);)r[0|A]=0|r[0|e],A=A+1|0,e=e+1|0;return 0|i}function lt(A,e,t){e|=0;var o,i=0,a=0,s=0;if(o=(A|=0)+(t|=0)|0,e&=255,(0|t)>=67){for(;3&A;)r[0|A]=e,A=A+1|0;for(s=e|e<<8|e<<16|e<<24,a=(i=-4&o)-64|0;(0|A)<=(0|a);)n[A>>2]=s,n[A+4>>2]=s,n[A+8>>2]=s,n[A+12>>2]=s,n[A+16>>2]=s,n[A+20>>2]=s,n[A+24>>2]=s,n[A+28>>2]=s,n[A+32>>2]=s,n[A+36>>2]=s,n[A+40>>2]=s,n[A+44>>2]=s,n[A+48>>2]=s,n[A+52>>2]=s,n[A+56>>2]=s,n[A+60>>2]=s,A=A+64|0;for(;(0|A)<(0|i);)n[A>>2]=s,A=A+4|0}for(;(0|A)<(0|o);)r[0|A]=e,A=A+1|0;return o-t|0}function ct(A){return(A=+A)>=0?+s(A+.5):+v(A-.5)}function ut(A){var e,t,r;return A|=0,r=0|E(),(0|A)>0&(0|(e=(t=0|n[a>>2])+A|0))<(0|t)|(0|e)<0?(N(0|e),D(12),-1):(0|e)>(0|r)&&!(0|Q(0|e))?(D(12),-1):(n[a>>2]=e,0|t)}return{___divdi3:qe,___muldi3:Xe,___remdi3:$e,___uremdi3:At,_areNeighborCells:function(A,e,t,r,o){o|=0;var i,a,s,l=0,c=0,u=0,d=0;if(s=S,S=S+64|0,a=s,i=s+56|0,!(!0&134217728==(2013265920&(e|=0))&!0&134217728==(2013265920&(r|=0))))return S=s,5;if((0|(A|=0))==(0|(t|=0))&(0|e)==(0|r))return n[o>>2]=0,S=s,0;if(c=0|tt(0|A,0|e,52),B(),c&=15,d=0|tt(0|t,0|r,52),B(),(0|c)!=(15&d))return S=s,12;if(l=c+-1|0,c>>>0>1){RA(A,e,l,a),RA(t,r,l,i),u=0|n[(d=a)>>2],d=0|n[d+4>>2];A:do{if((0|u)==(0|n[i>>2])&&(0|d)==(0|n[i+4>>2])){l=0|tt(0|A,0|e,0|(c=3*(15^c)|0)),B(),l&=7,c=0|tt(0|t,0|r,0|c),B(),c&=7;do{if(!(0|l)|!(0|c))n[o>>2]=1,l=0;else if(7==(0|l))l=5;else{if(1==(0|l)|1==(0|c)&&0|zA(u,d)){l=5;break}if((0|n[15536+(l<<2)>>2])!=(0|c)&&(0|n[15568+(l<<2)>>2])!=(0|c))break A;n[o>>2]=1,l=0}}while(0);return S=s,0|l}}while(0)}c=(l=a)+56|0;do{n[l>>2]=0,l=l+4|0}while((0|l)<(0|c));return F(A,e,1,a),l=(0|n[(e=a)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+8|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+16|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+24|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+32|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)||(0|n[(e=a+40|0)>>2])==(0|t)&&(0|n[e+4>>2])==(0|r)?1:1&((0|n[(l=a+48|0)>>2])==(0|t)?(0|n[l+4>>2])==(0|r):0),n[o>>2]=l,S=s,0},_bitshift64Ashr:et,_bitshift64Lshr:tt,_bitshift64Shl:rt,_calloc:Ve,_cellAreaKm2:function(A,e,t){return 0|(A=0|ue(A|=0,e|=0,t|=0))||(o[t>>3]=6371.007180918475*+o[t>>3]*6371.007180918475),0|A},_cellAreaM2:function(A,e,t){return 0|(A=0|ue(A|=0,e|=0,t|=0))||(o[t>>3]=6371.007180918475*+o[t>>3]*6371.007180918475*1e3*1e3),0|A},_cellAreaRads2:ue,_cellToBoundary:$A,_cellToCenterChild:GA,_cellToChildPos:function(A,e,t,r){t|=0,r|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0;if(o=S,S=S+16|0,p=o,v=0|tt(0|(A|=0),0|(e|=0),52),B(),t>>>0>15)return S=o,4;if((0|(v&=15))<(0|t))return S=o,12;if((0|v)!=(0|t))if(a=0|rt(0|t,0,52),a|=A,l=B()|-15728641&e,(0|v)>(0|t)){c=t;do{b=0|rt(7,0,3*(14-c|0)|0),c=c+1|0,a|=b,l=0|B()|l}while((0|c)<(0|v));b=a}else b=a;else b=A,l=e;m=0|tt(0|b,0|l,45),B();A:do{if(0|H(127&m)){if(c=0|tt(0|b,0|l,52),B(),0|(c&=15))for(a=1;;){if(!(!((m=0|rt(7,0,3*(15-a|0)|0))&b)&!((0|B())&l))){u=33;break A}if(!(a>>>0>>0))break;a=a+1|0}if(n[(m=r)>>2]=0,n[m+4>>2]=0,(0|v)>(0|t)){for(m=-15728641&e,h=v;;){if(g=h,(h=h+-1|0)>>>0>15|(0|v)<(0|h)){u=19;break}if((0|v)!=(0|h))if(a=0|rt(0|h,0,52),a|=A,c=0|B()|m,(0|v)<(0|g))f=a;else{u=h;do{f=0|rt(7,0,3*(14-u|0)|0),u=u+1|0,a|=f,c=0|B()|c}while((0|u)<(0|v));f=a}else f=A,c=e;if(d=0|tt(0|f,0|c,45),B(),0|H(127&d)){d=0|tt(0|f,0|c,52),B(),d&=15;e:do{if(d)for(u=1;;){if(a=0|tt(0|f,0|c,3*(15-u|0)|0),B(),0|(a&=7))break e;if(!(u>>>0>>0)){a=0;break}u=u+1|0}else a=0}while(0);a=1&!(0|a)}else a=0;if(c=0|tt(0|A,0|e,3*(15-g|0)|0),B(),7==(0|(c&=7))){i=5,u=42;break}if(1==(0|c)&(a=!!(0|a))){i=5,u=42;break}if(0|(f=c+((!!(0|c)&a)<<31>>31)|0)&&(u=0|pe(7,0,u=v-g|0,((0|u)<0)<<31>>31),d=0|B(),a?(a=0|We(0|(a=0|Xe(0|u,0|d,5,0)),0|B(),-5,-1),a=0|We(0|(a=0|qe(0|a,0|B(),6,0)),0|B(),1,0),c=0|B()):(a=u,c=d),g=0|We(0|a,0|c,0|(g=0|Xe(0|u,0|d,0|(g=f+-1|0),((0|g)<0)<<31>>31)),0|B()),d=0|We(0|g,0|(f=0|B()),0|n[(d=r)>>2],0|n[d+4>>2]),f=0|B(),n[(g=r)>>2]=d,n[g+4>>2]=f),(0|h)<=(0|t)){u=37;break}}if(19==(0|u))M(27795,27122,1367,27158);else{if(37==(0|u)){i=0|n[(s=r)+4>>2],s=0|n[s>>2];break}if(42==(0|u))return S=o,0|i}}else i=0,s=0}else u=33}while(0);A:do{if(33==(0|u)){if(n[(m=r)>>2]=0,n[m+4>>2]=0,(0|v)>(0|t)){for(a=v;;){if(i=0|tt(0|A,0|e,3*(15-a|0)|0),B(),7==(0|(i&=7))){i=5;break}if(i=0|Xe(0|(s=0|pe(7,0,s=v-a|0,((0|s)<0)<<31>>31)),0|B(),0|i,0),s=0|B(),s=0|We(0|n[(m=r)>>2],0|n[m+4>>2],0|i,0|s),i=0|B(),n[(m=r)>>2]=s,n[m+4>>2]=i,(0|(a=a+-1|0))<=(0|t))break A}return S=o,0|i}i=0,s=0}}while(0);return 0|_A(b,l,v,p)&&M(27795,27122,1327,27173),((0|i)>-1|-1==(0|i)&s>>>0>4294967295)&((0|(p=0|n[(v=p)+4>>2]))>(0|i)|((0|p)==(0|i)?(0|n[v>>2])>>>0>s>>>0:0))?(S=o,0|(v=0)):(M(27795,27122,1407,27158),0)},_cellToChildren:function(A,e,t,r){r|=0;var o,i,a=0,s=0;if(i=S,S=S+16|0,ee(o=i,A|=0,e|=0,t|=0),!(0|(A=0|n[(e=o)>>2]))&!(0|(e=0|n[e+4>>2])))return S=i,0;a=0,t=0;do{n[(s=r+(a<<3)|0)>>2]=A,n[s+4>>2]=e,a=0|We(0|a,0|t,1,0),t=0|B(),re(o),A=0|n[(s=o)>>2],e=0|n[s+4>>2]}while(!(!(0|A)&!(0|e)));return S=i,0},_cellToChildrenSize:_A,_cellToLatLng:XA,_cellToLocalIj:function(A,e,t,r,o,i){var a,s;return A|=0,i|=0,s=S,S=S+16|0,a=s,(o|=0)?A=15:(A=0|me(A,e|=0,t|=0,r|=0,a))||(function(A,e){var t;e|=0,t=0|n[8+(A|=0)>>2],n[e>>2]=(0|n[A>>2])-t,n[e+4>>2]=(0|n[A+4>>2])-t}(a,i),A=0),S=s,0|A},_cellToParent:RA,_cellToVertex:Pe,_cellToVertexes:function(A,e,t){t|=0;var r,o=0,i=0;return i=!(0|zA(A|=0,e|=0)),r=!(0|(o=0|Pe(A,e,0,t))),i?r?0|(o=0|Pe(A,e,1,t+8|0))||0|(o=0|Pe(A,e,2,t+16|0))||0|(o=0|Pe(A,e,3,t+24|0))||(o=0|Pe(A,e,4,t+32|0))?0|(i=o):0|Pe(A,e,5,t+40|0):0|(i=o):r?0|(o=0|Pe(A,e,1,t+8|0))||0|(o=0|Pe(A,e,2,t+16|0))||0|(o=0|Pe(A,e,3,t+24|0))||0|(o=0|Pe(A,e,4,t+32|0))?0|(i=o):(n[(i=t+40|0)>>2]=0,n[i+4>>2]=0,0|(i=0)):0|(i=o)},_cellsToDirectedEdge:function(A,e,t,r,o){return o|=0,7==(0|(t=0|_(A|=0,e|=0,t|=0,r|=0)))?0|(o=11):(r=0|rt(0|t,0,56),e=-2130706433&e|B()|268435456,n[o>>2]=A|r,n[o+4>>2]=e,0|(o=0))},_cellsToLinkedMultiPolygon:function(A,e,t){t|=0;var r,i,a,s=0;if(a=S,S=S+32|0,r=a,0|(A=0|function(A,e,t){A|=0,t|=0;var r,o,i=0,a=0,s=0,l=0,c=0,u=0;if(o=S,S=S+176|0,r=o,(0|(e|=0))<1)return Le(t,0,0),S=o,0;for(c=0|tt(0|n[(c=A)>>2],0|n[c+4>>2],52),B(),Le(t,(0|e)>6?e:6,15&c),c=0;!(0|(i=0|$A(0|n[(i=A+(c<<3)|0)>>2],0|n[i+4>>2],r)));){if((0|(i=0|n[r>>2]))>0){l=0;do{s=r+8+(l<<4)|0,(a=0|He(t,i=r+8+((0|(l=l+1|0))%(0|i)<<4)|0,s))?_e(t,a):ze(t,s,i),i=0|n[r>>2]}while((0|l)<(0|i))}if((0|(c=c+1|0))>=(0|e)){i=0,u=13;break}}return 13==(0|u)?(S=o,0|i):(Ie(t),S=o,0|(u=i))}(A|=0,e|=0,i=a+16|0)))return S=a,0|A;if(n[t>>2]=0,n[t+4>>2]=0,n[t+8>>2]=0,0|(A=0|Re(i)))do{e=0|de(t);do{fe(e,A),s=A+16|0,n[r>>2]=n[s>>2],n[r+4>>2]=n[s+4>>2],n[r+8>>2]=n[s+8>>2],n[r+12>>2]=n[s+12>>2],_e(i,A),A=0|Ge(i,r)}while(0|A);A=0|Re(i)}while(0|A);return Ie(i),(A=0|function(A){var e,t,r=0,i=0,a=0,s=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,B=0,D=0,E=0,j=0,Q=0,N=0,S=0,F=0,P=0,T=0,L=0;if(0|n[(s=(A|=0)+8|0)>>2])return 1;if(!(a=0|n[A>>2]))return 0;r=a,i=0;do{i=i+1|0,r=0|n[r+8>>2]}while(0|r);if(i>>>0<2)return 0;(t=0|Oe(i<<2))||M(27396,27235,317,27415),(e=0|Oe(i<<5))||M(27437,27235,321,27415),n[A>>2]=0,n[(E=A+4|0)>>2]=0,n[s>>2]=0,i=0,P=0,D=0,m=0;A:for(;;){if(h=0|n[a>>2]){c=0,u=h;do{if(f=+o[u+8>>3],r=u,u=0|n[u+16>>2],d=+o[(s=(g=!(0|u))?h:u)+8>>3],+l(+(f-d))>3.141592653589793){L=14;break}c+=(d-f)*(+o[r>>3]+ +o[s>>3])}while(!g);if(14==(0|L)){L=0,c=0,r=h;do{B=+o[r+8>>3],S=0|n[(F=r+16|0)>>2],C=+o[(S=0|S?S:h)+8>>3],c+=(+o[r>>3]+ +o[S>>3])*((C<0?C+6.283185307179586:C)-(B<0?B+6.283185307179586:B)),r=0|n[(0|r?F:a)>>2]}while(0|r)}c>0?(n[t+(P<<2)>>2]=a,P=P+1|0,s=D,r=m):L=19}else L=19;if(19==(0|L)){L=0;do{if(!i){if(m){s=E,u=m+8|0,r=a,i=A;break}if(0|n[A>>2]){L=27;break A}s=E,u=A,r=a,i=A;break}if(0|n[(r=i+8|0)>>2]){L=21;break A}if(!(i=0|Ve(1,12))){L=23;break A}n[r>>2]=i,s=i+4|0,u=i,r=m}while(0);if(n[u>>2]=a,n[s>>2]=a,u=e+(D<<5)|0,g=0|n[a>>2]){for(o[(h=e+(D<<5)+8|0)>>3]=17976931348623157e292,o[(m=e+(D<<5)+24|0)>>3]=17976931348623157e292,o[u>>3]=-17976931348623157e292,o[(b=e+(D<<5)+16|0)>>3]=-17976931348623157e292,x=17976931348623157e292,k=-17976931348623157e292,s=0,p=g,f=17976931348623157e292,y=17976931348623157e292,w=-17976931348623157e292,d=-17976931348623157e292;c=+o[p>>3],B=+o[p+8>>3],p=0|n[p+16>>2],C=+o[((v=!(0|p))?g:p)+8>>3],c>3]=c,f=c),B>3]=B,y=B),c>w?o[u>>3]=c:c=w,B>d&&(o[b>>3]=B,d=B),x=B>0&Bk?B:k,s|=+l(+(B-C))>3.141592653589793,!v;)w=c;s&&(o[b>>3]=k,o[m>>3]=x)}else n[u>>2]=0,n[u+4>>2]=0,n[u+8>>2]=0,n[u+12>>2]=0,n[u+16>>2]=0,n[u+20>>2]=0,n[u+24>>2]=0,n[u+28>>2]=0;s=D+1|0}if(a=0|n[(F=a+8|0)>>2],n[F>>2]=0,!a){L=45;break}D=s,m=r}if(21==(0|L))M(27213,27235,35,27247);else if(23==(0|L))M(27267,27235,37,27247);else if(27==(0|L))M(27310,27235,61,27333);else if(45==(0|L)){A:do{if((0|P)>0){for(F=!(0|s),N=s<<2,S=!(0|A),Q=0,r=0;;){if(j=0|n[t+(Q<<2)>>2],F)L=73;else{if(!(D=0|Oe(N))){L=50;break}if(!(E=0|Oe(N))){L=52;break}e:do{if(S)i=0;else{for(s=0,i=0,u=A;a=e+(s<<5)|0,0|he(0|n[u>>2],a,0|n[j>>2])?(n[D+(i<<2)>>2]=u,n[E+(i<<2)>>2]=a,v=i+1|0):v=i,u=0|n[u+8>>2];)s=s+1|0,i=v;if((0|v)>0)if(a=0|n[D>>2],1==(0|v))i=a;else for(b=0,p=-1,i=a,m=a;;){for(g=0|n[m>>2],a=0,u=0;h=(0|(s=0|n[n[D+(u<<2)>>2]>>2]))==(0|g)?a:a+(1&he(s,0|n[E+(u<<2)>>2],0|n[g>>2]))|0,(0|(u=u+1|0))!=(0|v);)a=h;if(i=(s=(0|h)>(0|p))?m:i,(0|(a=b+1|0))==(0|v))break e;b=a,p=s?h:p,m=0|n[D+(a<<2)>>2]}else i=0}}while(0);if(Ye(D),Ye(E),i){if(a=0|n[(s=i+4|0)>>2])i=a+8|0;else if(0|n[i>>2]){L=70;break}n[i>>2]=j,n[s>>2]=j}else L=73}if(73==(0|L)){if(L=0,0|(r=0|n[j>>2]))do{E=r,r=0|n[r+16>>2],Ye(E)}while(0|r);Ye(j),r=1}if((0|(Q=Q+1|0))>=(0|P)){T=r;break A}}50==(0|L)?M(27452,27235,249,27471):52==(0|L)?M(27490,27235,252,27471):70==(0|L)&&M(27310,27235,61,27333)}else T=0}while(0);return Ye(t),Ye(e),0|T}return 0}(t))?(ge(t),S=a,0|(s=A)):(S=a,0|(s=0))},_childPosToCell:function(A,e,t,r,o,i){A|=0,e|=0,i|=0;var a,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0;if(a=S,S=S+16|0,s=a,(o|=0)>>>0>15)return S=a,4;if(l=0|tt(0|(t|=0),0|(r|=0),52),B(),(0|(l&=15))>(0|o))return S=a,12;if(0|_A(t,r,o,s)&&M(27795,27122,1327,27173),!(((0|e)>-1|-1==(0|e)&A>>>0>4294967295)&((0|(u=0|n[(d=s)+4>>2]))>(0|e)|((0|u)==(0|e)?(0|n[d>>2])>>>0>A>>>0:0))))return S=a,2;d=o-l|0,o=0|rt(0|o,0,52),c=B()|-15728641&r,n[(u=i)>>2]=o|t,n[u+4>>2]=c,u=0|tt(0|t,0|r,45),B();A:do{if(0|H(127&u)){if(0|l)for(s=1;;){if(!(!((u=0|rt(7,0,3*(15-s|0)|0))&t)&!((0|B())&r)))break A;if(!(s>>>0>>0))break;s=s+1|0}if((0|d)<1)return S=a,0;for(u=15^l,r=-1,c=1,s=1;;){l=0|pe(7,0,l=d-c|0,((0|l)<0)<<31>>31),t=0|B();do{if(s){if(s=0|qe(0|(s=0|We(0|(s=0|Xe(0|l,0|t,5,0)),0|B(),-5,-1)),0|B(),6,0),(0|e)>(0|(o=0|B()))|(0|e)==(0|o)&A>>>0>s>>>0){e=0|Ze(0|(e=0|We(0|A,0|e,-1,-1)),0|B(),0|s,0|o),s=0|B(),h=0|n[(f=i)>>2],f=0|n[f+4>>2],g=0|rt(7,0,0|(m=3*(u+r|0)|0)),f&=~B(),m=0|rt(0|(o=0|We(0|(r=0|qe(0|e,0|s,0|l,0|t)),0|(A=0|B()),2,0)),0|B(),0|m),f=0|B()|f,n[(o=i)>>2]=m|h&~g,n[o+4>>2]=f,A=0|Ze(0|e,0|s,0|(A=0|Xe(0|r,0|A,0|l,0|t)),0|B()),s=0,e=0|B();break}g=0|n[(m=i)>>2],m=0|n[m+4>>2],h=0|rt(7,0,3*(u+r|0)|0),m&=~B(),n[(s=i)>>2]=g&~h,n[s+4>>2]=m,s=1;break}o=0|n[(g=i)>>2],g=0|n[g+4>>2],f=0|rt(7,0,0|(r=3*(u+r|0)|0)),g&=~B(),r=0|rt(0|(m=0|qe(0|A,0|e,0|l,0|t)),0|(s=0|B()),0|r),g=0|B()|g,n[(h=i)>>2]=r|o&~f,n[h+4>>2]=g,A=0|Ze(0|A,0|e,0|(s=0|Xe(0|m,0|s,0|l,0|t)),0|B()),s=0,e=0|B()}while(0);if(!((0|d)>(0|c))){e=0;break}r=~c,c=c+1|0}return S=a,0|e}}while(0);if((0|d)<1)return S=a,0;for(o=15^l,s=1;;){if(h=0|pe(7,0,h=d-s|0,((0|h)<0)<<31>>31),m=0|B(),t=0|n[(c=i)>>2],c=0|n[c+4>>2],r=0|rt(7,0,0|(l=3*(o-s|0)|0)),c&=~B(),l=0|rt(0|(f=0|qe(0|A,0|e,0|h,0|m)),0|(g=0|B()),0|l),c=0|B()|c,n[(u=i)>>2]=l|t&~r,n[u+4>>2]=c,A=0|Ze(0|A,0|e,0|(m=0|Xe(0|f,0|g,0|h,0|m)),0|B()),e=0|B(),(0|d)<=(0|s)){e=0;break}s=s+1|0}return S=a,0|e},_compactCells:function(A,e,t,r){e|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,D=0,E=0,j=0,Q=0,N=0,S=0;if(!(0|(t|=0))&!(0|(r|=0)))return 0;if(a=0|n[(i=A|=0)>>2],!0&!(15728640&(i=0|n[i+4>>2]))){if(!((0|r)>0|!(0|r)&t>>>0>0))return 0;if(n[(S=e)>>2]=a,n[S+4>>2]=i,1==(0|t)&!(0|r))return 0;i=1,a=0;do{N=0|n[4+(Q=A+(i<<3)|0)>>2],n[(S=e+(i<<3)|0)>>2]=n[Q>>2],n[S+4>>2]=N,i=0|We(0|i,0|a,1,0),a=0|B()}while((0|a)<(0|r)|(0|a)==(0|r)&i>>>0>>0);return 0}if(!(N=0|Oe(o=t<<3)))return 13;if(st(0|N,0|A,0|o),!(Q=0|Ve(t,8)))return Ye(N),13;A:for(;;){E=0|tt(0|(u=0|n[(i=N)>>2]),0|(i=0|n[i+4>>2]),52),B(),j=(E&=15)-1|0,D=!!(0|E),C=(0|r)>0|!(0|r)&t>>>0>0;e:do{if(D&C){if(y=0|rt(0|j,0,52),w=0|B(),j>>>0>15){if(!(!(0|u)&!(0|i))){S=16;break A}for(a=0,A=0;;){if(a=0|We(0|a,0|A,1,0),!((0|(A=0|B()))<(0|r)|(0|A)==(0|r)&a>>>0>>0))break e;if(!(!(0|(k=0|n[(s=N+(a<<3)|0)>>2]))&!(0|(s=0|n[s+4>>2])))){i=s,S=16;break A}}}for(l=u,A=i,a=0,s=0;;){if(!(!(0|l)&!(0|A))){if(!(!0&!(117440512&A))){S=21;break A}if(d=0|tt(0|l,0|A,52),B(),(0|(d&=15))<(0|j)){i=12,S=27;break A}if((0|d)!=(0|j)&&(l|=y,A=-15728641&A|w,d>>>0>=E>>>0)){c=j;do{k=0|rt(7,0,3*(14-c|0)|0),c=c+1|0,l|=k,A=0|B()|A}while(c>>>0>>0)}if(g=0|At(0|l,0|A,0|t,0|r),h=0|B(),!(!(0|(f=0|n[(d=c=Q+(g<<3)|0)>>2]))&!(0|(d=0|n[d+4>>2])))){p=0,v=0;do{if((0|p)>(0|r)|(0|p)==(0|r)&v>>>0>t>>>0){S=31;break A}if((0|f)==(0|l)&(-117440513&d)==(0|A)){m=0|tt(0|f,0|d,56),B(),b=1+(m&=7)|0,k=0|tt(0|f,0|d,45),B();t:do{if(0|H(127&k)){if(f=0|tt(0|f,0|d,52),B(),!(f&=15)){d=6;break}for(d=1;;){if(!(!((k=0|rt(7,0,3*(15-d|0)|0))&l)&!((0|B())&A))){d=7;break t}if(!(d>>>0>>0)){d=6;break}d=d+1|0}}else d=7}while(0);if((m+2|0)>>>0>d>>>0){S=41;break A}k=0|rt(0|b,0,56),A=B()|-117440513&A,n[(x=c)>>2]=0,n[x+4>>2]=0,l|=k}else g=0|$e(0|(g=0|We(0|g,0|h,1,0)),0|B(),0|t,0|r),h=0|B();v=0|We(0|v,0|p,1,0),p=0|B(),f=0|n[(d=c=Q+(g<<3)|0)>>2],d=0|n[d+4>>2]}while(!(!(0|f)&!(0|d)))}n[(k=c)>>2]=l,n[k+4>>2]=A}if(a=0|We(0|a,0|s,1,0),!((0|(s=0|B()))<(0|r)|(0|s)==(0|r)&a>>>0>>0))break e;l=0|n[(A=N+(a<<3)|0)>>2],A=0|n[A+4>>2]}}}while(0);if(k=0|We(0|t,0|r,5,0),(x=0|B())>>>0<0|!(0|x)&k>>>0<11){S=85;break}if(k=0|qe(0|t,0|r,6,0),B(),!(k=0|Ve(k,8))){S=48;break}do{if(C){for(b=0,A=0,m=0,p=0;;){if(!(0|(a=0|n[(s=d=Q+(b<<3)|0)>>2]))&!(0|(s=0|n[s+4>>2])))x=m;else{f=0|tt(0|a,0|s,56),B(),l=1+(f&=7)|0,g=-117440513&s,x=0|tt(0|a,0|s,45),B();e:do{if(0|H(127&x)){if(h=0|tt(0|a,0|s,52),B(),0|(h&=15))for(c=1;;){if(!(!(a&(x=0|rt(7,0,3*(15-c|0)|0)))&!(g&(0|B()))))break e;if(!(c>>>0>>0))break;c=c+1|0}a|=s=0|rt(0|l,0,56),s=0|B()|g,n[(l=d)>>2]=a,n[l+4>>2]=s,l=f+2|0}}while(0);7==(0|l)?(n[(x=k+(A<<3)|0)>>2]=a,n[x+4>>2]=-117440513&s,A=0|We(0|A,0|m,1,0),x=0|B()):x=m}if(b=0|We(0|b,0|p,1,0),!((0|(p=0|B()))<(0|r)|(0|p)==(0|r)&b>>>0>>0))break;m=x}if(C){if(v=j>>>0>15,y=0|rt(0|j,0,52),w=0|B(),!D){for(a=0,c=0,l=0,s=0;!(0|u)&!(0|i)||(n[(j=e+(a<<3)|0)>>2]=u,n[j+4>>2]=i,a=0|We(0|a,0|c,1,0),c=0|B()),l=0|We(0|l,0|s,1,0),(0|(s=0|B()))<(0|r)|(0|s)==(0|r)&l>>>0>>0;)u=0|n[(i=N+(l<<3)|0)>>2],i=0|n[i+4>>2];i=x;break}for(a=0,c=0,s=0,l=0;;){do{if(!(!(0|u)&!(0|i))){if(h=0|tt(0|u,0|i,52),B(),v|(0|(h&=15))<(0|j)){S=80;break A}if((0|h)!=(0|j)){if(d=u|y,f=-15728641&i|w,h>>>0>=E>>>0){g=j;do{D=0|rt(7,0,3*(14-g|0)|0),g=g+1|0,d|=D,f=0|B()|f}while(g>>>0>>0)}}else d=u,f=i;m=0|At(0|d,0|f,0|t,0|r),g=0,h=0,p=0|B();do{if((0|g)>(0|r)|(0|g)==(0|r)&h>>>0>t>>>0){S=81;break A}if((-117440513&(b=0|n[4+(D=Q+(m<<3)|0)>>2]))==(0|f)&&(0|n[D>>2])==(0|d)){S=65;break}m=0|$e(0|(D=0|We(0|m,0|p,1,0)),0|B(),0|t,0|r),p=0|B(),h=0|We(0|h,0|g,1,0),g=0|B(),D=Q+(m<<3)|0}while((0|n[D>>2])!=(0|d)||(0|n[D+4>>2])!=(0|f));if(65==(0|S)&&(S=0,!0&100663296==(117440512&b)))break;n[(D=e+(a<<3)|0)>>2]=u,n[D+4>>2]=i,a=0|We(0|a,0|c,1,0),c=0|B()}}while(0);if(s=0|We(0|s,0|l,1,0),!((0|(l=0|B()))<(0|r)|(0|l)==(0|r)&s>>>0>>0))break;u=0|n[(i=N+(s<<3)|0)>>2],i=0|n[i+4>>2]}i=x}else a=0,i=x}else a=0,A=0,i=0}while(0);if(lt(0|Q,0,0|o),st(0|N,0|k,A<<3),Ye(k),!(0|A)&!(0|i)){S=89;break}e=e+(a<<3)|0,r=i,t=A}if(16==(0|S))!0&!(117440512&i)?(i=4,S=27):S=21;else if(31==(0|S))M(27795,27122,620,27132);else{if(41==(0|S))return Ye(N),Ye(Q),10;if(48==(0|S))return Ye(N),Ye(Q),13;80==(0|S)?M(27795,27122,711,27132):81==(0|S)?M(27795,27122,723,27132):85==(0|S)&&(st(0|e,0|N,t<<3),S=89)}return 21==(0|S)?(Ye(N),Ye(Q),0|(S=5)):27==(0|S)?(Ye(N),Ye(Q),0|(S=i)):89==(0|S)?(Ye(N),Ye(Q),0|(S=0)):0},_constructCell:function(A,e,t,o){t|=0,o|=0;var i=0,a=0,s=0,l=0,c=0,u=0;if((A|=0)>>>0>15)return 4;if((e|=0)>>>0>121)return 17;s=0|rt(0|A,0,52),i=0|B(),l=0|rt(0|e,0,45),i=0|i|B()|134225919;A:do{if((0|A)>=1){for(l=1,s=!!(0|r[20528+e|0]),a=-1;;){if((e=0|n[t+(l+-1<<2)>>2])>>>0>6){i=18,e=10;break}if(!(!(0|e)|1^s)){if(1==(0|e)){i=19,e=10;break}s=0}if(c=0|rt(7,0,0|(u=3*(15-l|0)|0)),i&=~B(),a=(e=0|rt(0|e,((0|e)<0)<<31>>31,0|u))|a&~c,i=0|B()|i,!((0|l)<(0|A)))break A;l=l+1|0}if(10==(0|e))return 0|i}else a=-1}while(0);return n[(u=o)>>2]=a,n[u+4>>2]=i,0},_destroyLinkedMultiPolygon:ge,_directedEdgeToBoundary:DA,_directedEdgeToCells:function(A,e,t){A|=0;var r,o,i,a=0;return r=S,S=S+16|0,a=r,!0&268435456==(2013265920&(e|=0))?(o=-2130706433&e|134217728,n[(i=t|=0)>>2]=A,n[i+4>>2]=o,n[a>>2]=0,e=0|tt(0|A,0|e,56),B(),a=0|I(A,o,7&e,a,t+8|0),S=r,0|a):(S=r,0|(a=6))},_edgeLengthKm:function(A,e,t){t|=0;var r,i=0,a=0,s=0,l=0,u=0,g=0,h=0;if(r=S,S=S+176|0,0|(A=0|DA(A|=0,e|=0,l=r)))return l=A,s=+o[t>>3],s*=6371.007180918475,o[t>>3]=s,S=r,0|l;if(o[t>>3]=0,(0|(A=0|n[l>>2]))<=1)return l=0,s=0,s*=6371.007180918475,o[t>>3]=s,S=r,0|l;e=A+-1|0,A=0,i=+o[l+8>>3],a=+o[l+16>>3],s=0;do{g=i,i=+o[l+8+((A=A+1|0)<<4)>>3],h=+f(.5*(i-g)),u=a,a=+o[l+8+(A<<4)+8>>3],u=h*h+(u=+f(.5*(a-u)))*(+d(+g)*+d(+i)*u),s+=2*+p(+ +c(+u),+ +c(+(1-u)))}while((0|A)!=(0|e));return o[t>>3]=s,l=0,h=s,h*=6371.007180918475,o[t>>3]=h,S=r,0|l},_edgeLengthM:function(A,e,t){t|=0;var r,i=0,a=0,s=0,l=0,u=0,g=0,h=0;if(r=S,S=S+176|0,0|(A=0|DA(A|=0,e|=0,l=r)))return l=A,s=+o[t>>3],s*=6371.007180918475,s*=1e3,o[t>>3]=s,S=r,0|l;if(o[t>>3]=0,(0|(A=0|n[l>>2]))<=1)return l=0,s=0,s*=6371.007180918475,s*=1e3,o[t>>3]=s,S=r,0|l;e=A+-1|0,A=0,i=+o[l+8>>3],a=+o[l+16>>3],s=0;do{g=i,i=+o[l+8+((A=A+1|0)<<4)>>3],h=+f(.5*(i-g)),u=a,a=+o[l+8+(A<<4)+8>>3],u=h*h+(u=+f(.5*(a-u)))*(+d(+g)*+d(+i)*u),s+=2*+p(+ +c(+u),+ +c(+(1-u)))}while((0|A)!=(0|e));return o[t>>3]=s,l=0,h=s,h*=6371.007180918475,h*=1e3,o[t>>3]=h,S=r,0|l},_edgeLengthRads:function(A,e,t){t|=0;var r,i=0,a=0,s=0,l=0,u=0,g=0,h=0;if(r=S,S=S+176|0,0|(A=0|DA(A|=0,e|=0,l=r)))return S=r,0|A;if(o[t>>3]=0,(0|(A=0|n[l>>2]))<=1)return S=r,0;e=A+-1|0,A=0,i=+o[l+8>>3],a=+o[l+16>>3],s=0;do{g=i,i=+o[l+8+((A=A+1|0)<<4)>>3],h=+f(.5*(i-g)),u=a,a=+o[l+8+(A<<4)+8>>3],u=h*h+(u=+f(.5*(a-u)))*(+d(+i)*+d(+g)*u),s+=2*+p(+ +c(+u),+ +c(+(1-u)))}while((0|A)<(0|e));return o[t>>3]=s,S=r,0},_emscripten_replace_memory:function(A){return r=new Int8Array(A),n=new Int32Array(A),o=new Float64Array(A),t=A,!0},_free:Ye,_getBaseCellNumber:TA,_getDirectedEdgeDestination:function(A,e,t){A|=0,e|=0,t|=0;var r,o,i=0;return r=S,S=S+16|0,n[(i=r)>>2]=0,!0&268435456==(2013265920&e)?(o=0|tt(0|A,0|e,56),B(),i=0|I(A,-2130706433&e|134217728,7&o,i,t),S=r,0|i):(S=r,0|(i=6))},_getDirectedEdgeOrigin:function(A,e,t){return A|=0,t|=0,!0&268435456==(2013265920&(e|=0))?(n[t>>2]=A,n[t+4>>2]=-2130706433&e|134217728,0|(t=0)):0|(t=6)},_getHexagonAreaAvgKm2:se,_getHexagonAreaAvgM2:function(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[20784+(A<<3)>>3],0|(e=0))},_getHexagonEdgeLengthAvgKm:function(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[20912+(A<<3)>>3],0|(e=0))},_getHexagonEdgeLengthAvgM:function(A,e){return e|=0,(A|=0)>>>0>15?0|(e=4):(o[e>>3]=+o[21040+(A<<3)>>3],0|(e=0))},_getIcosahedronFaces:function A(e,t,r){r|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0;o=S,S=S+128|0,d=o+112|0,s=o+96|0,f=o,a=0|tt(0|(e|=0),0|(t|=0),52),B(),c=15&a,n[d>>2]=c,l=0|tt(0|e,0|t,45),B(),l&=127;A:do{if(0|H(l)){if(0|c)for(i=1;;){if(!(!((u=0|rt(7,0,3*(15-i|0)|0))&e)&!((0|B())&t))){a=0;break A}if(!(i>>>0>>0))break;i=i+1|0}if(!(1&a))return u=0|rt(c+1|0,0,52),f=B()|-15728641&t,f=0|A((u|e)&~(d=0|rt(7,0,3*(14-c|0)|0)),f&~B(),r),S=o,0|f;a=1}else a=0}while(0);if(!(i=0|qA(e,t,s))){a?(QA(s,d,f),u=5):(PA(s,d,f),u=6);A:do{if(0|H(l))if(c)for(i=1;;){if(!(!((l=0|rt(7,0,3*(15-i|0)|0))&e)&!((0|B())&t))){e=2;break A}if(!(i>>>0>>0)){e=5;break}i=i+1|0}else e=5;else e=2}while(0);lt(0|r,-1,e<<2);A:do{if(a)for(s=0;;){if(SA(l=f+(s<<4)|0,0|n[d>>2]),l=0|n[l>>2],-1==(0|(c=0|n[r>>2]))|(0|c)==(0|l))i=r;else{a=0;do{if((a=a+1|0)>>>0>=e>>>0){i=1;break A}c=0|n[(i=r+(a<<2)|0)>>2]}while(!(-1==(0|c)|(0|c)==(0|l)))}if(n[i>>2]=l,(s=s+1|0)>>>0>=u>>>0){i=0;break}}else for(s=0;;){if(NA(l=f+(s<<4)|0,0|n[d>>2],0,1),l=0|n[l>>2],-1==(0|(c=0|n[r>>2]))|(0|c)==(0|l))i=r;else{a=0;do{if((a=a+1|0)>>>0>=e>>>0){i=1;break A}c=0|n[(i=r+(a<<2)|0)>>2]}while(!(-1==(0|c)|(0|c)==(0|l)))}if(n[i>>2]=l,(s=s+1|0)>>>0>=u>>>0){i=0;break}}}while(0)}return S=o,0|i},_getIndexDigit:function(A,e,t,r){return r|=0,((t|=0)-1|0)>>>0>14?0|(r=4):(t=0|tt(0|(A|=0),0|(e|=0),3*(15-t|0)|0),B(),n[r>>2]=7&t,0|(r=0))},_getNumCells:le,_getPentagons:Ae,_getRes0Cells:function(A){A|=0;var e=0,t=0,r=0;e=0;do{rt(0|e,0,45),r=134225919|B(),n[(t=A+(e<<3)|0)>>2]=-1,n[t+4>>2]=r,e=e+1|0}while(122!=(0|e));return 0},_getResolution:function(A,e){return e=0|tt(0|(A|=0),0|(e|=0),52),B(),15&e},_greatCircleDistanceKm:ae,_greatCircleDistanceM:function(A,e){A|=0;var t,r,n,i=0;return r=+o[(e|=0)>>3],t=+o[A>>3],i=(n=+f(.5*(r-t)))*n+(i=+f(.5*(+o[e+8>>3]-+o[A+8>>3])))*(+d(+r)*+d(+t)*i),2*+p(+ +c(+i),+ +c(+(1-i)))*6371.007180918475*1e3},_greatCircleDistanceRads:function(A,e){A|=0;var t,r,n,i=0;return r=+o[(e|=0)>>3],t=+o[A>>3],i=(n=+f(.5*(r-t)))*n+(i=+f(.5*(+o[e+8>>3]-+o[A+8>>3])))*(+d(+r)*+d(+t)*i),2*+p(+ +c(+i),+ +c(+(1-i)))},_gridDisk:F,_gridDiskDistances:P,_gridDistance:function(A,e,t,r,o){t|=0,r|=0,o|=0;var i,a,s=0,l=0;return a=S,S=S+32|0,l=a,0|(i=0|me(A|=0,e|=0,A,e,s=a+12|0))?(S=a,0|(l=i)):0|(A=0|me(A,e,t,r,l))?(S=a,0|(l=A)):(s=0|kA(s,l),n[(l=o)>>2]=s,n[l+4>>2]=((0|s)<0)<<31>>31,S=a,0|(l=0))},_gridPathCells:function(A,e,t,r,o){t|=0,r|=0,o|=0;var i,a,s=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,D=0,E=0;if(a=S,S=S+48|0,c=a+12|0,D=a,!(s=0|me(A|=0,e|=0,A,e,i=a+24|0))&&!(s=0|me(A,e,t,r,c))){C=((0|(k=0|kA(i,c)))<0)<<31>>31,n[i>>2]=0,n[i+4>>2]=0,n[i+8>>2]=0,n[c>>2]=0,n[c+4>>2]=0,n[c+8>>2]=0,0|me(A,e,A,e,i)&&M(27795,27538,692,27747),0|me(A,e,t,r,c)&&M(27795,27538,697,27747),CA(i),CA(c),g=0|k?1/+(0|k):0,t=0|n[i>>2],v=g*+((0|n[c>>2])-t|0),r=0|n[(y=i+4|0)>>2],w=g*+((0|n[c+4>>2])-r|0),s=0|n[(x=i+8|0)>>2],g*=+((0|n[c+8>>2])-s|0),n[D>>2]=t,n[(h=D+4|0)>>2]=r,n[(m=D+8|0)>>2]=s;A:do{if((0|k)<0)s=0;else for(b=0,p=0;;){E=v*(d=+(p>>>0)+4294967296*+(0|b))+ +(0|t),u=w*d+ +(0|r),d=g*d+ +(0|s),t=~~+at(+E),c=~~+at(+u),s=~~+at(+d),E=+l(+(+(0|t)-E)),u=+l(+(+(0|c)-u)),d=+l(+(+(0|s)-d));do{if(!(E>u&E>d)){if(f=0-t|0,u>d){r=f-s|0;break}r=c,s=f-c|0;break}t=0-(c+s)|0,r=c}while(0);if(n[D>>2]=t,n[h>>2]=r,n[m>>2]=s,BA(D),0|(s=0|be(A,e,D,o+(p<<3)|0)))break A;if(!((0|b)<(0|C)|(0|b)==(0|C)&p>>>0>>0)){s=0;break A}t=0|We(0|p,0|b,1,0),b=r=0|B(),p=t,t=0|n[i>>2],r=0|n[y>>2],s=0|n[x>>2]}}while(0);return S=a,0|s}return S=a,0|s},_gridPathCellsSize:function(A,e,t,r,o){t|=0,r|=0,o|=0;var i,a=0,s=0,l=0;return i=S,S=S+32|0,l=i,(a=0|me(A|=0,e|=0,A,e,s=i+12|0))||(a=0|me(A,e,t,r,l))?(S=i,0|(l=a)):(r=0|We(0|(r=0|kA(s,l)),((0|r)<0)<<31>>31,1,0),s=0|B(),n[(l=o)>>2]=r,n[l+4>>2]=s,S=i,0|(l=0))},_gridRing:function(A,e,t,r){return 0|R(A|=0,e|=0,t|=0,r|=0)?(lt(0|r,0,48*t|0),0|(r=0|function(A,e,t,r){A|=0,e|=0,r|=0;var o,i=0,a=0,s=0,l=0,c=0,u=0,d=0,f=0;if(o=S,S=S+16|0,s=o,!(t|=0))return n[r>>2]=A,n[r+4>>2]=e,S=o,0;do{if((0|t)>=0){if((0|t)>13780509){if(0|(i=0|le(15,s)))break;i=0|n[(a=s)>>2],a=0|n[a+4>>2]}else d=0|Xe(0|t,0|(i=((0|t)<0)<<31>>31),3,0),a=0|B(),i=0|We(0|t,0|i,1,0),i=0|We(0|(i=0|Xe(0|d,0|a,0|i,0|B())),0|B(),1,0),a=0|B(),n[(d=s)>>2]=i,n[d+4>>2]=a;if(u=0|Ve(i,8)){if(!(d=0|Ve(i,4))){Ye(u),i=13;break}if(0|(i=0|L(A,e,t,u,d,i,a,0))){Ye(u),Ye(d);break}if(e=0|n[s>>2],(0|(s=0|n[s+4>>2]))>0|!(0|s)&e>>>0>0){i=0,l=0,c=0;do{!(0|(a=0|n[(A=u+(l<<3)|0)>>2]))&!(0|(A=0|n[A+4>>2]))||(0|n[d+(l<<2)>>2])!=(0|t)||(n[(f=r+(i<<3)|0)>>2]=a,n[f+4>>2]=A,i=i+1|0),l=0|We(0|l,0|c,1,0),c=0|B()}while((0|c)<(0|s)|(0|c)==(0|s)&l>>>0>>0)}Ye(u),Ye(d),i=0}else i=13}else i=2}while(0);return S=o,0|i}(A,e,t,r))):0|(r=0)},_gridRingUnsafe:R,_i64Add:We,_i64Subtract:Ze,_isPentagon:zA,_isResClassIII:function(A,e){return e=0|tt(0|(A|=0),0|(e|=0),52),B(),1&e},_isValidCell:LA,_isValidDirectedEdge:MA,_isValidIndex:function(A,e){A|=0;var t=0,n=0,o=0,i=0;if(!0&134217728==(-16777216&(e|=0))&&(n=0|tt(0|A,0|e,52),B(),n&=15,t=0|tt(0|A,0|e,45),B(),(t&=127)>>>0<=121)&&!(613566756&(i=0|rt(0|(o=0|tt(0|A,0|e,0|(i=3*(15^n)|0))),0|B(),0|i))&Ze(-1227133514,-1171,0|i,0|(o=0|B())))&!(4681&o&B())&&15==(0|n)|!(0|(i=0|tt(0|rt(0|~A,0|~e,0|(i=19+(3*n|0)|0)),0|B(),0|i)))&!(0|B())){if(!(0|r[20528+t|0]))return 1;if(!(0|A)&!(0|(t=8191&e)))return 1;if(i=0|nt(0|A,0|t),B(),(63-i|0)%3|0)return 1}return 0|MA(A,e)?0|(i=1):0|(i=1&!!(0|Te(A,e)))},_isValidVertex:Te,_latLngToCell:KA,_llvm_ctlz_i64:nt,_llvm_maxnum_f64:ot,_llvm_minnum_f64:it,_llvm_round_f64:at,_localIjToCell:function(A,e,t,r,o){var i,a;return A|=0,e|=0,t|=0,o|=0,a=S,S=S+16|0,i=a,(r|=0)?t=15:(t=0|function(A,e){e|=0;var t,r,o,i=0,a=0,s=0;if(a=0|n[(A|=0)>>2],n[e>>2]=a,s=0|n[A+4>>2],n[(r=e+4|0)>>2]=s,n[(o=e+8|0)>>2]=0,A=(i=(0|s)<(0|a))?a:s,(0|(i=i?s:a))<0){if(-2147483648==(0|i)||((0|A)>0?(2147483647-A|0)<(0|i):(-2147483648-A|0)>(0|i)))return 1;if((0|A)>-1?(-2147483648|A)>=(0|i):(-2147483648^A)<(0|i))return 1}return A=s-a|0,(0|a)<0?(i=0-a|0,n[r>>2]=A,n[o>>2]=i,n[e>>2]=0,a=0):(A=s,i=0),(0|A)<0&&(a=a-A|0,n[e>>2]=a,i=i-A|0,n[o>>2]=i,n[r>>2]=0,A=0),t=a-i|0,s=A-i|0,(0|i)<0?(n[e>>2]=t,n[r>>2]=s,n[o>>2]=0,A=s,s=t,i=0):s=a,(0|(a=(0|i)<(0|(a=(0|A)<(0|s)?A:s))?i:a))<=0||(n[e>>2]=s-a,n[r>>2]=A-a,n[o>>2]=i-a),0}(t,i))||(t=0|be(A,e,i,o)),S=a,0|t},_malloc:Oe,_maxFaceCount:function(A,e,t){t|=0;var r=0,o=0;if(o=0|tt(0|(A|=0),0|(e|=0),45),B(),!(0|H(127&o)))return o=2,n[t>>2]=o,0;if(o=0|tt(0|A,0|e,52),B(),!(o&=15))return o=5,n[t>>2]=o,0;for(r=1;;){if(!(!((0|rt(7,0,3*(15-r|0)|0))&A)&!((0|B())&e))){r=2,A=6;break}if(!(r>>>0>>0)){r=5,A=6;break}r=r+1|0}return 6==(0|A)?(n[t>>2]=r,0):0},_maxGridDiskSize:function(A,e){e|=0;var t=0,r=0,o=0;return(0|(A|=0))<0?0|(e=2):(0|A)>13780509?0|(e=0|le(15,e)):(o=0|Xe(0|A,0|(t=((0|A)<0)<<31>>31),3,0),r=0|B(),t=0|We(0|A,0|t,1,0),t=0|We(0|(t=0|Xe(0|o,0|r,0|t,0|B())),0|B(),1,0),A=0|B(),n[e>>2]=t,n[e+4>>2]=A,0|(e=0))},_maxPolygonToCellsSize:function(A,e,t,r){A|=0,e|=0,r|=0;var o,i=0,a=0,s=0,l=0,c=0;if(o=S,S=S+48|0,i=o+16|0,a=o+8|0,s=o,0|(t=0|Ce(t|=0)))return S=o,0|t;if(l=0|n[(c=A)+4>>2],n[(t=a)>>2]=n[c>>2],n[t+4>>2]=l,ke(a,i),!(t=0|eA(i,e,s))){if(e=0|n[a>>2],(0|(a=0|n[A+8>>2]))>0){i=0|n[A+12>>2],t=0;do{e=(0|n[i+(t<<3)>>2])+e|0,t=t+1|0}while((0|t)<(0|a))}i=0|n[(t=s)>>2],(0|(t=0|n[t+4>>2]))<(0|(a=((0|e)<0)<<31>>31))|(0|t)==(0|a)&i>>>0>>0?(n[(t=s)>>2]=e,n[t+4>>2]=a,t=a):e=i,l=0|We(0|e,0|t,12,0),c=0|B(),n[(t=s)>>2]=l,n[t+4>>2]=c,n[(t=r)>>2]=l,n[t+4>>2]=c,t=0}return S=o,0|t},_maxPolygonToCellsSizeExperimental:function(A,e,t,i){e|=0,t|=0,i|=0;var a,s,c=0,u=0,f=0,g=0,h=0,m=0,b=0,p=0;if(s=S,S=S+48|0,h=s+32|0,g=s+40|0,a=s,!(0|n[(A|=0)>>2]))return n[(m=i)>>2]=0,n[m+4>>2]=0,S=s,0;IA(h,0,0,0),c=0|n[(f=h)>>2],f=0|n[f+4>>2];do{if(e>>>0>15)n[(m=a)>>2]=0,n[m+4>>2]=0,n[a+8>>2]=4,n[a+12>>2]=-1,t=a+29|0,n[(m=a+16|0)>>2]=0,n[m+4>>2]=0,n[m+8>>2]=0,r[m+12|0]=0,r[0|t]=0|r[0|g],r[t+1|0]=0|r[g+1|0],r[t+2|0]=0|r[g+2|0],t=4,m=9;else{if(0|(t=0|Ce(t))){n[(h=a)>>2]=0,n[h+4>>2]=0,n[a+8>>2]=t,n[a+12>>2]=-1,m=a+29|0,n[(h=a+16|0)>>2]=0,n[h+4>>2]=0,n[h+8>>2]=0,r[h+12|0]=0,r[0|m]=0|r[0|g],r[m+1|0]=0|r[g+1|0],r[m+2|0]=0|r[g+2|0],m=9;break}if(!(t=0|Ve(1+(0|n[A+8>>2])|0,32))){n[(m=a)>>2]=0,n[m+4>>2]=0,n[a+8>>2]=13,n[a+12>>2]=-1,t=a+29|0,n[(m=a+16|0)>>2]=0,n[m+4>>2]=0,n[m+8>>2]=0,r[m+12|0]=0,r[0|t]=0|r[0|g],r[t+1|0]=0|r[g+1|0],r[t+2|0]=0|r[g+2|0],t=13,m=9;break}Be(A,t),n[(p=a)>>2]=c,n[p+4>>2]=f,n[(f=a+8|0)>>2]=0,n[a+12>>2]=e,n[a+20>>2]=A,n[a+24>>2]=t,r[a+28|0]=0,r[0|(c=a+29|0)]=0|r[0|g],r[c+1|0]=0|r[g+1|0],r[c+2|0]=0|r[g+2|0],n[a+16>>2]=3,b=+J(t),b*=+Z(t),u=+l(+ +o[t>>3]),u=b/+d(+ +it(+u,+ +l(+ +o[t+8>>3])))*6371.007180918475*6371.007180918475,t=0|n[(c=a+12|0)>>2];A:do{if((0|t)>0)do{if(se(t+-1|0,h),!(u/+o[h>>3]>10))break A;t=(p=0|n[c>>2])-1|0,n[c>>2]=t}while((0|p)>1)}while(0);if(ye(a),n[(c=i)>>2]=0,n[c+4>>2]=0,!(!(0|(t=0|n[(c=a)>>2]))&!(0|(c=0|n[c+4>>2]))))do{_A(t,c,e,h),g=h,g=0|We(0|n[(A=i)>>2],0|n[A+4>>2],0|n[g>>2],0|n[g+4>>2]),A=0|B(),n[(p=i)>>2]=g,n[p+4>>2]=A,ye(a),t=0|n[(p=a)>>2],c=0|n[p+4>>2]}while(!(!(0|t)&!(0|c)));t=0|n[f>>2]}}while(0);return S=s,0|t},_memcpy:st,_memset:lt,_originToDirectedEdges:function(A,e,t){t|=0;var r,o=0;return r=!(0|zA(A|=0,e|=0)),e&=-2130706433,n[(o=t)>>2]=r?A:0,n[o+4>>2]=r?285212672|e:0,n[(o=t+8|0)>>2]=A,n[o+4>>2]=301989888|e,n[(o=t+16|0)>>2]=A,n[o+4>>2]=318767104|e,n[(o=t+24|0)>>2]=A,n[o+4>>2]=335544320|e,n[(o=t+32|0)>>2]=A,n[o+4>>2]=352321536|e,n[(t=t+40|0)>>2]=A,n[t+4>>2]=369098752|e,0},_pentagonCount:function(){return 12},_polygonToCells:function(A,e,t,r){A|=0,e|=0,r|=0;var o,i,a,s,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0,v=0,y=0,w=0,x=0,k=0,C=0,M=0,D=0,E=0,j=0,Q=0,N=0,F=0,P=0,I=0,R=0,_=0;if(s=S,S=S+112|0,o=s+80|0,f=s+72|0,i=s,a=s+56|0,0|(l=0|Ce(t|=0)))return S=s,0|l;if(!(_=0|Oe(32+(n[(g=A+8|0)>>2]<<5)|0)))return S=s,13;if(Be(A,_),!(l=0|Ce(t))){if(R=0|n[(I=A)+4>>2],n[(l=f)>>2]=n[I>>2],n[l+4>>2]=R,ke(f,o),l=0|eA(o,e,i))I=0,R=0;else{if(l=0|n[f>>2],(0|(c=0|n[g>>2]))>0){u=0|n[A+12>>2],t=0;do{l=(0|n[u+(t<<3)>>2])+l|0,t=t+1|0}while((0|t)!=(0|c));t=l}else t=l;c=0|n[(l=i)>>2],(0|(l=0|n[l+4>>2]))<(0|(u=((0|t)<0)<<31>>31))|(0|l)==(0|u)&c>>>0>>0?(n[(l=i)>>2]=t,n[l+4>>2]=u,l=u):t=c,I=0|We(0|t,0|l,12,0),R=0|B(),n[(l=i)>>2]=I,n[l+4>>2]=R,l=0}if(!l){if(!(t=0|Ve(I,8)))return Ye(_),S=s,13;if(!(d=0|Ve(I,8)))return Ye(_),Ye(t),S=s,13;n[(F=o)>>2]=0,n[F+4>>2]=0,P=0|n[(F=A)+4>>2],n[(l=f)>>2]=n[F>>2],n[l+4>>2]=P,l=0|z(f,I,R,e,o,t,d);A:do{if(l)Ye(t),Ye(d),Ye(_);else{e:do{if((0|n[g>>2])>0){for(u=A+12|0,c=0;l=0|z((0|n[u>>2])+(c<<3)|0,I,R,e,o,t,d),c=c+1|0,!(0|l);)if((0|c)>=(0|n[g>>2]))break e;Ye(t),Ye(d),Ye(_);break A}}while(0);(0|R)>0|!(0|R)&I>>>0>0&<(0|d,0,I<<3),F=0|n[(P=o)+4>>2];e:do{if((0|F)>0|!(0|F)&(0|n[P>>2])>>>0>0){j=t,Q=d,N=t,F=d,P=t,l=t,M=t,D=d,E=d,t=d;t:for(;;){for(w=0,x=0,k=0,C=0,c=0,u=0;;){f=(d=i)+56|0;do{n[d>>2]=0,d=d+4|0}while((0|d)<(0|f));if(0|T(g=0|n[(e=j+(w<<3)|0)>>2],e=0|n[e+4>>2],1,i,0)){f=(d=i)+56|0;do{n[d>>2]=0,d=d+4|0}while((0|d)<(0|f));0|(d=0|Ve(7,4))&&(L(g,e,1,i,d,7,0,0),Ye(d))}for(y=0;;){p=0|n[(v=i+(y<<3)|0)>>2],v=0|n[v+4>>2];r:do{if(!(0|p)&!(0|v))d=c,f=u;else{if(h=0|At(0|p,0|v,0|I,0|R),g=0|B(),!(!(0|(f=0|n[(e=d=r+(h<<3)|0)>>2]))&!(0|(e=0|n[e+4>>2])))){m=0,b=0;do{if((0|m)>(0|R)|(0|m)==(0|R)&b>>>0>I>>>0)break t;if((0|f)==(0|p)&(0|e)==(0|v)){d=c,f=u;break r}h=0|$e(0|(d=0|We(0|h,0|g,1,0)),0|B(),0|I,0|R),g=0|B(),b=0|We(0|b,0|m,1,0),m=0|B(),f=0|n[(e=d=r+(h<<3)|0)>>2],e=0|n[e+4>>2]}while(!(!(0|f)&!(0|e)))}if(!(0|p)&!(0|v)){d=c,f=u;break}XA(p,v,a),0|Me(A,_,a)&&(b=0|We(0|c,0|u,1,0),u=0|B(),n[(m=d)>>2]=p,n[m+4>>2]=v,n[(c=Q+(c<<3)|0)>>2]=p,n[c+4>>2]=v,c=b),d=c,f=u}}while(0);if((y=y+1|0)>>>0>=7)break;c=d,u=f}if(w=0|We(0|w,0|x,1,0),x=0|B(),k=0|We(0|k,0|C,1,0),C=0|B(),c=0|n[(u=o)>>2],!((0|C)<(0|(u=0|n[u+4>>2]))|(0|C)==(0|u)&k>>>0>>0))break;c=d,u=f}if((0|u)>0|!(0|u)&c>>>0>0){c=0,u=0;do{n[(C=j+(c<<3)|0)>>2]=0,n[C+4>>2]=0,c=0|We(0|c,0|u,1,0),u=0|B(),k=0|n[(C=o)+4>>2]}while((0|u)<(0|k)|((0|u)==(0|k)?c>>>0<(0|n[C>>2])>>>0:0))}if(n[(C=o)>>2]=d,n[C+4>>2]=f,!((0|f)>0|!(0|f)&d>>>0>0))break e;y=t,w=E,x=P,k=D,C=Q,t=M,E=l,D=N,M=y,l=w,P=F,F=x,N=k,Q=j,j=C}Ye(N),Ye(F),Ye(_),l=1;break A}l=d}while(0);Ye(_),Ye(t),Ye(l),l=0}}while(0);return S=s,0|l}}return Ye(_),S=s,0|l},_polygonToCellsExperimental:function(A,e,t,o,i,a){o|=0,i|=0,a|=0;var s,l,c,u=0,d=0,f=0,g=0,h=0,m=0,b=0,p=0;c=S,S=S+160|0,d=c+64|0,h=c+112|0,p=c,function(A,e,t,o){A|=0,e|=0,t|=0,o|=0;var i,a,s,l=0,c=0,u=0,d=0;s=S,S=S+48|0,i=s+40|0,a=s,IA(c=s+32|0,0,0,0),u=0|n[c>>2],c=0|n[c+4>>2];do{if(t>>>0<=15){if(0|(l=0|Ce(o))){n[(o=a)>>2]=0,n[o+4>>2]=0,n[a+8>>2]=l,n[a+12>>2]=-1,u=a+29|0,n[(o=a+16|0)>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,r[o+12|0]=0,r[0|u]=0|r[0|i],r[u+1|0]=0|r[i+1|0],r[u+2|0]=0|r[i+2|0];break}if(l=0|Ve(1+(0|n[e+8>>2])|0,32)){Be(e,l),n[(d=a)>>2]=u,n[d+4>>2]=c,n[a+8>>2]=0,n[a+12>>2]=t,n[a+16>>2]=o,n[a+20>>2]=e,n[a+24>>2]=l,r[a+28|0]=0,r[0|(u=a+29|0)]=0|r[0|i],r[u+1|0]=0|r[i+1|0],r[u+2|0]=0|r[i+2|0];break}n[(o=a)>>2]=0,n[o+4>>2]=0,n[a+8>>2]=13,n[a+12>>2]=-1,u=a+29|0,n[(o=a+16|0)>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,r[o+12|0]=0,r[0|u]=0|r[0|i],r[u+1|0]=0|r[i+1|0],r[u+2|0]=0|r[i+2|0];break}n[(u=a)>>2]=0,n[u+4>>2]=0,n[a+8>>2]=4,n[a+12>>2]=-1,d=a+29|0,n[(u=a+16|0)>>2]=0,n[u+4>>2]=0,n[u+8>>2]=0,r[u+12|0]=0,r[0|d]=0|r[0|i],r[d+1|0]=0|r[i+1|0],r[d+2|0]=0|r[i+2|0]}while(0);ye(a),n[A>>2]=n[a>>2],n[A+4>>2]=n[a+4>>2],n[A+8>>2]=n[a+8>>2],n[A+12>>2]=n[a+12>>2],n[A+16>>2]=n[a+16>>2],n[A+20>>2]=n[a+20>>2],n[A+24>>2]=n[a+24>>2],n[A+28>>2]=n[a+28>>2],S=s}(g=c+80|0,A|=0,e|=0,t|=0),ee(d,0|n[(f=g)>>2],0|n[f+4>>2],e),s=0|n[(f=d)>>2],f=0|n[f+4>>2],u=0|n[g+8>>2],n[(m=h+4|0)>>2]=n[g>>2],n[m+4>>2]=n[g+4>>2],n[m+8>>2]=n[g+8>>2],n[m+12>>2]=n[g+12>>2],n[m+16>>2]=n[g+16>>2],n[m+20>>2]=n[g+20>>2],n[m+24>>2]=n[g+24>>2],n[m+28>>2]=n[g+28>>2],n[(m=p)>>2]=s,n[m+4>>2]=f,n[(m=p+8|0)>>2]=u,e=h,t=36+(A=p+12|0)|0;do{n[A>>2]=n[e>>2],A=A+4|0,e=e+4|0}while((0|A)<(0|t));if(n[(h=p+48|0)>>2]=n[d>>2],n[h+4>>2]=n[d+4>>2],n[h+8>>2]=n[d+8>>2],n[h+12>>2]=n[d+12>>2],!(0|s)&!(0|f))return S=c,0|u;t=p+16|0,l=p+24|0,g=p+28|0,u=0,d=0,e=s,A=f;do{if(!((0|u)<(0|i)|(0|u)==(0|i)&d>>>0>>0)){b=4;break}if(f=d,d=0|We(0|d,0|u,1,0),u=0|B(),n[(f=a+(f<<3)|0)>>2]=e,n[f+4>>2]=A,re(h),!(0|(e=0|n[(A=h)>>2]))&!(0|(A=0|n[A+4>>2]))){if(ye(t),!(0|(A=0|n[(e=t)>>2]))&!(0|(e=0|n[e+4>>2]))){b=10;break}te(A,e,0|n[g>>2],h),e=0|n[(A=h)>>2],A=0|n[A+4>>2]}n[(f=p)>>2]=e,n[f+4>>2]=A}while(!(!(0|e)&!(0|A)));return 4==(0|b)?(0|(e=0|n[(A=p+40|0)>>2])&&Ye(e),n[(b=p+16|0)>>2]=0,n[b+4>>2]=0,n[l>>2]=0,n[p+36>>2]=0,n[g>>2]=-1,n[p+32>>2]=0,n[A>>2]=0,te(0,0,0,h),n[p>>2]=0,n[p+4>>2]=0,n[m>>2]=0,S=c,0|(p=14)):(10==(0|b)&&(n[p>>2]=0,n[p+4>>2]=0,n[m>>2]=n[l>>2]),p=0|n[m>>2],S=c,0|p)},_readInt64AsDoubleFromPointer:function(A){return+(+((0|n[(A|=0)>>2])>>>0)+4294967296*+(0|n[A+4>>2]))},_res0CellCount:function(){return 122},_round:ct,_sbrk:ut,_sizeOfCellBoundary:function(){return 168},_sizeOfCoordIJ:function(){return 8},_sizeOfGeoLoop:function(){return 8},_sizeOfGeoPolygon:function(){return 16},_sizeOfH3Index:function(){return 8},_sizeOfLatLng:function(){return 16},_sizeOfLinkedGeoPolygon:function(){return 12},_uncompactCells:function(A,e,t,r,o,i,a){A|=0,r|=0,o|=0,i|=0;var s,l=0,c=0,u=0,d=0,f=0,g=0,h=0,m=0;if(s=S,S=S+16|0,m=s,!((0|(t|=0))>0|!(0|t)&(e|=0)>>>0>0))return S=s,0;if((0|(a|=0))>=16)return S=s,12;g=0,h=0,f=0,l=0;A:for(;;){if(d=0|tt(0|(c=0|n[(u=A+(g<<3)|0)>>2]),0|(u=0|n[u+4>>2]),52),B(),(15&d)>(0|a)){l=12,c=11;break}if(ee(m,c,u,a),!(0|(u=0|n[(d=m)>>2]))&!(0|(d=0|n[d+4>>2])))c=f;else{c=f;do{if(!((0|l)<(0|i)|(0|l)==(0|i)&c>>>0>>0)){c=10;break A}n[(f=r+(c<<3)|0)>>2]=u,n[f+4>>2]=d,c=0|We(0|c,0|l,1,0),l=0|B(),re(m),u=0|n[(f=m)>>2],d=0|n[f+4>>2]}while(!(!(0|u)&!(0|d)))}if(g=0|We(0|g,0|h,1,0),!((0|(h=0|B()))<(0|t)|(0|h)==(0|t)&g>>>0>>0)){l=0,c=11;break}f=c}return 10==(0|c)?(S=s,0|(m=14)):11==(0|c)?(S=s,0|l):0},_uncompactCellsSize:function(A,e,t,r,o){A|=0,e|=0,t|=0,r|=0,o|=0;var i,a,s=0,l=0,c=0,u=0,d=0,f=0;a=S,S=S+16|0,i=a;A:do{if((0|t)>0|!(0|t)&e>>>0>0){for(d=0,l=0,s=0,f=0;;){if(!(!(0|(c=0|n[(u=A+(d<<3)|0)>>2]))&!(0|(u=0|n[u+4>>2]))||(u=!(0|_A(c,u,r,i)),l=0|We(0|n[(c=i)>>2],0|n[c+4>>2],0|l,0|s),s=0|B(),u))){s=12;break}if(d=0|We(0|d,0|f,1,0),!((0|(f=0|B()))<(0|t)|(0|f)==(0|t)&d>>>0>>0))break A}return S=a,0|s}l=0,s=0}while(0);return n[o>>2]=l,n[o+4>>2]=s,S=a,0},_vertexToLatLng:function(A,e,t){t|=0;var r,o,i,a,s=0,l=0;return a=S,S=S+192|0,o=a,i=a+168|0,s=0|tt(0|(A|=0),0|(e|=0),56),B(),s&=7,0|(r=0|qA(A,l=-2130706433&e|134217728,i))?(S=a,0|(l=r)):(e=0|tt(0|A,0|e,52),B(),e&=15,0|zA(A,l)?jA(i,e,s,1,o):FA(i,e,s,1,o),l=o+8|0,n[t>>2]=n[l>>2],n[t+4>>2]=n[l+4>>2],n[t+8>>2]=n[l+8>>2],n[t+12>>2]=n[l+12>>2],S=a,0|(l=0))},establishStackSpace:function(A,e){S=A|=0},stackAlloc:function(A){var e;return e=S,S=15+(S=S+(A|=0)|0)&-16,0|e},stackRestore:function(A){S=A|=0},stackSave:function(){return 0|S}}}({Math:Math,Int8Array:Int8Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Float32Array:Float32Array,Float64Array:Float64Array},{b:function(A){s=A},c:function(){return s},d:function(A,e,t,r){tA("Assertion failed: "+v(A)+", at: "+[e?v(e):"unknown filename",t,r?v(r):"unknown function"])},e:function(A){return t.___errno_location&&(h[t.___errno_location()>>2]=A),A},f:H,g:function(A,e,t){f.set(f.subarray(e,e+t),A)},h:function(A){var e=H(),t=16777216,r=2130706432;if(A>r)return!1;for(var n=Math.max(e,16777216);n0))return 0;for(var n=t+r-1,o=0;o=55296&&i<=57343&&(i=65536+((1023&i)<<10)|1023&A.charCodeAt(++o)),i<=127){if(t>=n)break;e[t++]=i}else if(i<=2047){if(t+1>=n)break;e[t++]=192|i>>6,e[t++]=128|63&i}else if(i<=65535){if(t+2>=n)break;e[t++]=224|i>>12,e[t++]=128|i>>6&63,e[t++]=128|63&i}else{if(t+3>=n)break;e[t++]=240|i>>18,e[t++]=128|i>>12&63,e[t++]=128|i>>6&63,e[t++]=128|63&i}}e[t]=0}(A,f,e,t)}(A,e=Z(t),t)}return e},array:function(A){var e,t,r=Z(A.length);return e=A,t=r,d.set(e,t),r}},o=c(A),i=[],a=0;if(r)for(var s=0;s>1]=e;break;case"i32":h[A>>2]=e;break;case"i64":I=[e>>>0,(L=e,+Q(L)>=1?L>0?(0|F(+S(L/4294967296),4294967295))>>>0:~~+N((L-+(~~L>>>0))/4294967296)>>>0:0)],h[A>>2]=I[0],h[A+4>>2]=I[1];break;case"float":m[A>>2]=e;break;case"double":b[A>>3]=e;break;default:tA("invalid type for setValue: "+t)}},t.getValue=function(A,e,t){switch("*"===(e=e||"i8").charAt(e.length-1)&&(e="i32"),e){case"i1":case"i8":return d[0|A];case"i16":return g[A>>1];case"i32":case"i64":return h[A>>2];case"float":return m[A>>2];case"double":return b[A>>3];default:tA("invalid type for getValue: "+e)}return null},R){z(R)||(V=R,R=t.locateFile?t.locateFile(V,o):o+V),P++,t.monitorRunDependencies&&t.monitorRunDependencies(P);var q=function(A){A.byteLength&&(A=new Uint8Array(A)),f.set(A,8),t.memoryInitializerRequest&&delete t.memoryInitializerRequest.response,function(){if(P--,t.monitorRunDependencies&&t.monitorRunDependencies(P),0==P&&T){var A=T;T=null,A()}}()},X=function(){n(R,q,function(){throw"could not load memory initializer "+R})},$=U(R);if($)q($.buffer);else if(t.memoryInitializerRequest){var AA=function(){var A=t.memoryInitializerRequest,e=A.response;if(200!==A.status&&0!==A.status){var r=U(t.memoryInitializerRequestURL);if(!r)return void X();e=r.buffer}q(e)};t.memoryInitializerRequest.response?setTimeout(AA,0):t.memoryInitializerRequest.addEventListener("load",AA)}else X()}function eA(A){function e(){W||(W=!0,l||(k(B),k(M),t.onRuntimeInitialized&&t.onRuntimeInitialized(),function(){if(t.postRun)for("function"==typeof t.postRun&&(t.postRun=[t.postRun]);t.postRun.length;)j(t.postRun.shift());k(D)}()))}P>0||(function(){if(t.preRun)for("function"==typeof t.preRun&&(t.preRun=[t.preRun]);t.preRun.length;)E(t.preRun.shift());k(C)}(),P>0||(t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),e()},1)):e()))}function tA(A){throw t.onAbort&&t.onAbort(A),i(A+=""),a(A),l=!0,"abort("+A+"). Build with -s ASSERTIONS=1 for more info."}if(T=function A(){W||eA(),W||(T=A)},t.run=eA,t.abort=tA,t.preInit)for("function"==typeof t.preInit&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return eA(),A}("object"==typeof Ke?Ke:{}),Je="number",qe={0:"Success",1:"The operation failed but a more specific error is not available",2:"Argument was outside of acceptable range",3:"Latitude or longitude arguments were outside of acceptable range",4:"Resolution argument was outside of acceptable range",5:"Cell argument was not valid",6:"Directed edge argument was not valid",7:"Undirected edge argument was not valid",8:"Vertex argument was not valid",9:"Pentagon distortion was encountered",10:"Duplicate input",11:"Cell arguments were not neighbors",12:"Cell arguments had incompatible resolutions",13:"Memory allocation failed",14:"Bounds of provided memory were insufficient",15:"Mode or flags argument was not valid",16:"Index argument was not valid",17:"Base cell number was outside of acceptable range",18:"Child indexing digits invalid",19:"Child indexing digits refer to a deleted subsequence"},Xe={1e3:"Unknown unit",1001:"Array length out of bounds",1002:"Got unexpected null value for H3 index"};function $e(A,e,t){var r=t&&"value"in t,n=new Error((A[e]||"Unknown error")+" (code: "+e+(r?", value: "+t.value:"")+")");return n.code=e,n}function At(A){if(0!==A)throw function(A,e){return $e(qe,A,2===arguments.length?{value:e}:{})}(A)}var et={};[["sizeOfH3Index",Je],["sizeOfLatLng",Je],["sizeOfCellBoundary",Je],["sizeOfGeoLoop",Je],["sizeOfGeoPolygon",Je],["sizeOfLinkedGeoPolygon",Je],["sizeOfCoordIJ",Je],["readInt64AsDoubleFromPointer",Je],["isValidCell",Je,[Je,Je]],["isValidIndex",Je,[Je,Je]],["latLngToCell",Je,[Je,Je,Je,Je]],["cellToLatLng",Je,[Je,Je,Je]],["cellToBoundary",Je,[Je,Je,Je]],["maxGridDiskSize",Je,[Je,Je]],["gridDisk",Je,[Je,Je,Je,Je]],["gridDiskDistances",Je,[Je,Je,Je,Je,Je]],["gridRing",Je,[Je,Je,Je,Je]],["gridRingUnsafe",Je,[Je,Je,Je,Je]],["maxPolygonToCellsSize",Je,[Je,Je,Je,Je]],["polygonToCells",Je,[Je,Je,Je,Je]],["maxPolygonToCellsSizeExperimental",Je,[Je,Je,Je,Je]],["polygonToCellsExperimental",Je,[Je,Je,Je,Je,Je,Je]],["cellsToLinkedMultiPolygon",Je,[Je,Je,Je]],["destroyLinkedMultiPolygon",null,[Je]],["compactCells",Je,[Je,Je,Je,Je]],["uncompactCells",Je,[Je,Je,Je,Je,Je,Je]],["uncompactCellsSize",Je,[Je,Je,Je,Je,Je]],["isPentagon",Je,[Je,Je]],["isResClassIII",Je,[Je,Je]],["getBaseCellNumber",Je,[Je,Je]],["getResolution",Je,[Je,Je]],["getIndexDigit",Je,[Je,Je,Je]],["constructCell",Je,[Je,Je,Je,Je]],["maxFaceCount",Je,[Je,Je,Je]],["getIcosahedronFaces",Je,[Je,Je,Je]],["cellToParent",Je,[Je,Je,Je,Je]],["cellToChildren",Je,[Je,Je,Je,Je]],["cellToCenterChild",Je,[Je,Je,Je,Je]],["cellToChildrenSize",Je,[Je,Je,Je,Je]],["cellToChildPos",Je,[Je,Je,Je,Je]],["childPosToCell",Je,[Je,Je,Je,Je,Je,Je]],["areNeighborCells",Je,[Je,Je,Je,Je,Je]],["cellsToDirectedEdge",Je,[Je,Je,Je,Je,Je]],["getDirectedEdgeOrigin",Je,[Je,Je,Je]],["getDirectedEdgeDestination",Je,[Je,Je,Je]],["isValidDirectedEdge",Je,[Je,Je]],["directedEdgeToCells",Je,[Je,Je,Je]],["originToDirectedEdges",Je,[Je,Je,Je]],["directedEdgeToBoundary",Je,[Je,Je,Je]],["gridDistance",Je,[Je,Je,Je,Je,Je]],["gridPathCells",Je,[Je,Je,Je,Je,Je]],["gridPathCellsSize",Je,[Je,Je,Je,Je,Je]],["cellToLocalIj",Je,[Je,Je,Je,Je,Je,Je]],["localIjToCell",Je,[Je,Je,Je,Je,Je]],["getHexagonAreaAvgM2",Je,[Je,Je]],["getHexagonAreaAvgKm2",Je,[Je,Je]],["getHexagonEdgeLengthAvgM",Je,[Je,Je]],["getHexagonEdgeLengthAvgKm",Je,[Je,Je]],["greatCircleDistanceM",Je,[Je,Je]],["greatCircleDistanceKm",Je,[Je,Je]],["greatCircleDistanceRads",Je,[Je,Je]],["cellAreaM2",Je,[Je,Je,Je]],["cellAreaKm2",Je,[Je,Je,Je]],["cellAreaRads2",Je,[Je,Je,Je]],["edgeLengthM",Je,[Je,Je,Je]],["edgeLengthKm",Je,[Je,Je,Je]],["edgeLengthRads",Je,[Je,Je,Je]],["getNumCells",Je,[Je,Je]],["getRes0Cells",Je,[Je]],["res0CellCount",Je],["getPentagons",Je,[Je,Je]],["pentagonCount",Je],["cellToVertex",Je,[Je,Je,Je,Je]],["cellToVertexes",Je,[Je,Je,Je]],["vertexToLatLng",Je,[Je,Je,Je]],["isValidVertex",Je,[Je,Je]]].forEach(function(A){et[A[0]]=Ke.cwrap.apply(Ke,A)});var tt=16,rt=et.sizeOfH3Index(),nt=et.sizeOfLatLng(),ot=et.sizeOfCellBoundary();et.sizeOfGeoPolygon(),et.sizeOfGeoLoop(),et.sizeOfLinkedGeoPolygon(),et.sizeOfCoordIJ();var it=/[^0-9a-fA-F]/;function at(A){if(A>=0)return A.toString(tt);var e=st(8,(A&=2147483647).toString(tt));return(parseInt(e[0],tt)+8).toString(tt)+e.substring(1)}function st(A,e){for(var t=A-e.length,r="",n=0;n.85?.9+(i-.85)/.15*.1:.1+(i-.15)/.7*.8;var i;return pt(r[Math.min(23,Math.floor(24*o))])}function yt({coveragePoints:t,visible:r,terrainEnabled:n=!1,brightness:i=.7,basemapMode:a="dark"}){const{current:s}=o(),[l,c]=A.useState(null);A.useEffect(()=>{const A=()=>{var A;const e=null==(A=null==s?void 0:s.getMap)?void 0:A.call(s);e&&!l&&c(e)};A();const e=setInterval(A,50),t=setTimeout(()=>clearInterval(e),5e3);return()=>{clearInterval(e),clearTimeout(t)}},[s,l]);const[u,d]=A.useState(null),[f,g]=A.useState(!1),h=A.useRef({aborted:!1}),m=A.useRef(0),b=A.useRef(a),p=function(e){const[t,r]=A.useState(e);return A.useEffect(()=>{const A=setTimeout(()=>r(e),300);return()=>clearTimeout(A)},[e,300]),t}(t),v=A.useMemo(()=>function(A="dark"){var e;if("light"===A)return bt;const t=rA();return 24===t.length&&0!==(null==(e=t[0])?void 0:e[0])?t:mt}(a),[a]);A.useEffect(()=>{if(!p||!Array.isArray(p)||0===p.length)return void queueMicrotask(()=>{d(null),m.current=0});const A=b.current!==a;if(p.length===m.current&&u&&!A)return;m.current=p.length,b.current=a,h.current.aborted=!0,h.current={aborted:!1};const e=h.current;g(!0);const{cells:t,minQuality:r,maxQuality:n}=function(A){const e=new Map;for(const o of A){if("number"!=typeof o.lat||"number"!=typeof o.lon||isNaN(o.lat)||isNaN(o.lon))continue;const A=ut(o.lat,o.lon,8),t=e.get(A),r=o.weight;t?(t.count++,t.qualitySum+=r):e.set(A,{count:1,qualitySum:r})}const t=[];let r=1/0,n=-1/0;for(const[o,i]of e.entries()){const A=i.qualitySum/i.count;t.push({hexId:o,count:i.count,avgQuality:A}),r=Math.min(r,A),n=Math.max(n,A)}return{cells:t,minQuality:t.length>0?r:0,maxQuality:t.length>0?n:0}}(p);if(0===t.length)return d(null),void g(!1);if(t.length<500){const A=function(A,e,t,r){const n=[];for(const o of A){const A=dt(o.hexId).map(([A,e])=>[e,A]);A.push(A[0]);const i=vt(o.avgQuality,e,t,r);n.push({type:"Feature",properties:{color:i,quality:o.avgQuality,count:o.count},geometry:{type:"Polygon",coordinates:[A]}})}return{type:"FeatureCollection",features:n}}(t,r,n,v);return void(e.aborted||(d(A),g(!1)))}return async function(A,e,t,r,n){const o=[];let i=0;for(;i[e,A]);a.push(a[0]);const s=vt(n.avgQuality,e,t,r);o.push({type:"Feature",properties:{color:s,quality:n.avgQuality,count:n.count},geometry:{type:"Polygon",coordinates:[a]}})}irequestAnimationFrame(A))}return{type:"FeatureCollection",features:o}}(t,r,n,v,e).then(A=>{!e.aborted&&A&&d(A)}).finally(()=>{e.aborted||g(!1)}),()=>{e.aborted=!0}},[p,v]),A.useEffect(()=>{if(!l)return;const A=()=>{var A,e;try{const t=l.getLayer(ht),n=l.getSource(gt);if(r&&u&&u.features.length>0){if(n?l.getSource(gt).setData(u):l.addSource(gt,{type:"geojson",data:u}),!t){const t=l.getLayer("topology-weak-edges-native"),r=null==(e=null==(A=l.getStyle())?void 0:A.layers)?void 0:e.find(A=>"symbol"===A.type),n=t?"topology-weak-edges-native":null==r?void 0:r.id;l.addLayer({id:ht,type:"fill",source:gt,paint:{"fill-color":["get","color"],"fill-opacity":i}},n)}}else t&&l.removeLayer(ht),n&&l.removeSource(gt)}catch(t){}};l.isStyleLoaded()?A():l.once("style.load",A)},[l,r,u,n]),A.useEffect(()=>{if(l&&r)try{l.getLayer(ht)&&l.setPaintProperty(ht,"fill-opacity",i)}catch{}},[l,i,r]),A.useEffect(()=>()=>{if(l)try{l.getLayer(ht)&&l.removeLayer(ht),l.getSource(gt)&&l.removeSource(gt)}catch{}},[l]);const y=(null==u?void 0:u.features.length)??0;return y>0&&r?e.jsx("div",{"data-testid":"wardriving-hexlayer-maplibre-active","data-point-count":(null==t?void 0:t.length)||0,"data-cell-count":y,"data-terrain-enabled":n,"data-is-processing":f,style:{display:"none"}}):null}const wt="https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png",xt="terrarium",kt="terrain-dem",Ct="hillshade-dem",Bt="terrain-hillshade";function Mt({enabled:e,exaggeration:t=4}){const{current:r}=o(),[n,i]=A.useState(null),a=A.useRef(null);return A.useEffect(()=>{const A=()=>{var A;const e=null==(A=null==r?void 0:r.getMap)?void 0:A.call(r);e&&!n&&i(e)};A();const e=setInterval(A,50),t=setTimeout(()=>clearInterval(e),5e3);return()=>{clearInterval(e),clearTimeout(t)}},[r,n]),A.useEffect(()=>{if(!n)return;let A=!0;const e=()=>{var e,t;if(A)try{if(n.getSource(Ct)||n.addSource(Ct,{type:"raster-dem",tiles:[wt],encoding:xt,tileSize:256,maxzoom:14}),!n.getLayer(Bt)){const A=null==(t=null==(e=n.getStyle())?void 0:e.layers)?void 0:t.find(A=>"symbol"===A.type);n.addLayer({id:Bt,type:"hillshade",source:Ct,paint:{"hillshade-shadow-color":"rgba(10, 10, 10, 0.6)","hillshade-highlight-color":"rgba(245, 240, 230, 0.4)","hillshade-accent-color":"rgba(90, 75, 65, 0.3)","hillshade-illumination-direction":315,"hillshade-exaggeration":.35}},null==A?void 0:A.id)}n.getSource(kt)||n.addSource(kt,{type:"raster-dem",tiles:[wt],encoding:xt,tileSize:256,maxzoom:14})}catch(r){}};return n.isStyleLoaded()?e():(n.once("style.load",e),n.once("load",()=>{A&&!n.getSource(Ct)&&e()})),()=>{A=!1}},[n]),A.useEffect(()=>{if(!n)return;let A=!0,r=!1;const o=()=>{if(A&&n.getSource(kt))try{e?(n.setCenterClampedToGround(!1),n.setTerrain({source:kt,exaggeration:t}),n.setMaxPitch(70),!r&&n.getPitch()<30&&!n.isMoving()&&(r=!0,null!==a.current&&clearTimeout(a.current),a.current=window.setTimeout(()=>{a.current=null,A&&!n.isMoving()&&n.getPitch()<30&&n.easeTo({pitch:45,duration:1e3})},200))):(n.setTerrain(null),n.setCenterClampedToGround(!0),n.getPitch()>0&&!n.isMoving()&&n.easeTo({pitch:0,duration:800}),n.setMaxPitch(60))}catch(o){}};if(n.isStyleLoaded()&&n.getSource(kt))o();else{const A=()=>{n.getSource(kt)&&o()};n.once("idle",A)}return()=>{A=!1,null!==a.current&&(clearTimeout(a.current),a.current=null)}},[n,e,t]),A.useEffect(()=>()=>{var A;try{(null==(A=null==n?void 0:n.getStyle)?void 0:A.call(n))&&n.isStyleLoaded()&&(n.setTerrain(null),n.getLayer(Bt)&&n.removeLayer(Bt),n.getSource(Ct)&&n.removeSource(Ct),n.getSource(kt)&&n.removeSource(kt))}catch{}},[n]),null}function Dt(A,e){let t=0;for(let r=0;r0)for(let t=0;t=A.length)return A;const t=[],r=A.length/e;for(let n=0;no.has(A.fromHash)&&o.has(A.toHash));if(0===i.length)return null;const a=function(A,e,t,r){const n=e.length,o=new Map(e.map((A,e)=>[A,e])),i=Array(n).fill(null).map(()=>Array(n).fill(0));for(const a of A){const A=o.get(a.fromHash),e=o.get(a.toHash);if(void 0!==A&&void 0!==e&&A!==e){const n=a.strength*a.certainCount;let o=1;if(t){const A=t.get(a.fromHash),e=t.get(a.toHash);A&&e&&(o=Nt(GA(A[0],A[1],e[0],e[1])/1e3))}let s=1;if(r){const A=[a.fromHash,a.toHash].sort().join("-");s=1-.7*(r.get(A)??0)}const l=.3+.7*(a.symmetryRatio??0),c=Math.pow(n,.7)*Math.pow(o,.3)*s*l;i[A][e]=c,i[e][A]=c}}return i}(i,e,t,r),s=function(A){const e=A.length,t=Array(e).fill(null).map(()=>Array(e).fill(0));for(let r=0;rArray(e).fill(0));for(let a=0;a43758.5453*Math.sin(12.9898*e)%1-.5);jt(o,t),Et(o);let i=0;for(let a=0;a<100;a++){const A=Qt(n,o);jt(A,t);const e=Dt(A,A)/Dt(o,A);if(Et(A),o=A,Math.abs(e-i)<1e-8)return{vector:o,eigenvalue:r-e};i=e}return{vector:o,eigenvalue:r-i}}(s);if(c<.001)return null;const u=[],d=[];for(let f=0;f0&&A.push([A[0][0],A[0][1]]),t=A}return t}function zt(A,e={}){const t=function(A,e={}){if(A.length<3)return{coordinates:[],valid:!1};const{bandwidth:t=Lt,threshold:n=It,cellSize:o=Rt}=e,i=function(A,e){let t=1/0,r=-1/0,n=1/0,o=-1/0;for(const[i,a]of A)ir&&(r=i),ao&&(o=a);return t-=e,r+=e,n-=e,o+=e,{minX:t,minY:n,maxX:r,maxY:o,width:r-t,height:o-n}}(A,.02),a=Math.ceil(i.width/(t/2)),s=Math.ceil(i.height/(t/2)),l=Math.min(1,200/Math.max(a,s)),c=Math.max(10,Math.ceil(a*l)),u=Math.max(10,Math.ceil(s*l)),d=A=>A/c*i.width+i.minX,f=A=>A/u*i.height+i.minY,g=t/i.width*c;try{const e=r().x(A=>(A[0]-i.minX)/i.width*c).y(A=>(A[1]-i.minY)/i.height*u).size([c,u]).bandwidth(Math.max(5,g)).cellSize(o)(A);if(0===e.length)return{coordinates:[],valid:!1};const t=Math.max(...e.map(A=>A.value))*n;let a=e[0],s=1/0;for(const A of e){const e=Math.abs(A.value-t);e0){const e=A[0],t=A[A.length-1];e[0]===t[0]&&e[1]===t[1]||A.push([e[0],e[1]])}if(A.length>=4){const t=_t(A);e.push(t)}}e.length>0&&l.push(e)}const h=[];for(const A of l)for(const e of A)h.push(e);return{coordinates:l,valid:l.length>0}}catch(h){return{coordinates:[],valid:!1}}}(A,e);return t.valid&&0!==t.coordinates.length?1===t.coordinates.length?{type:"Polygon",coordinates:t.coordinates[0]}:{type:"MultiPolygon",coordinates:t.coordinates}:null}function Ht(A,e,t){return(e[0]-A[0])*(t[1]-A[1])-(e[1]-A[1])*(t[0]-A[0])}function Gt(A,e,t,r,n){const o=n*n,i=o*n;return[.5*(2*e[0]+(-A[0]+t[0])*n+(2*A[0]-5*e[0]+4*t[0]-r[0])*o+(-A[0]+3*e[0]-3*t[0]+r[0])*i),.5*(2*e[1]+(-A[1]+t[1])*n+(2*A[1]-5*e[1]+4*t[1]-r[1])*o+(-A[1]+3*e[1]-3*t[1]+r[1])*i)]}function Ut(A){let e=function(A){if(A.length<3)return A;const e=[...A].sort((A,e)=>A[0]-e[0]||A[1]-e[1]),t=[];for(const n of e){for(;t.length>=2&&Ht(t[t.length-2],t[t.length-1],n)<=0;)t.pop();t.push(n)}const r=[];for(let n=e.length-1;n>=0;n--){const A=e[n];for(;r.length>=2&&Ht(r[r.length-2],r[r.length-1],A)<=0;)r.pop();r.push(A)}return t.pop(),r.pop(),t.concat(r)}(A);if(e.length<3)return null;e=function(A){if(A.length<3)return A;let e=0,t=0;for(const[r,n]of A)e+=r,t+=n;return e/=A.length,t/=A.length,A.map(([A,r])=>{const n=A-e,o=r-t,i=Math.sqrt(n*n+o*o);if(i<1e-4)return[A,r];const a=(i+.008)/i;return[e+n*a,t+o*a]})}(e);const t=function(A){if(A.length<3)return A;const e=[],t=A.length;for(let r=0;rt?function(A,e,t,r){const n=[];for(const[o,i]of A.communities){const A=[];for(const t of i){const r=e.get(t);r&&A.push([r[1],r[0]])}if(A.length<3)continue;let a=zt(A,{bandwidth:t,threshold:r});a||(a=Ut(A)),a&&n.push({type:"Feature",properties:{community:o,color:Pt(o),borderColor:Tt(o),nodeCount:i.length},geometry:a})}return{type:"FeatureCollection",features:n}}(t,r,s,l):{type:"FeatureCollection",features:[]},[t,r,s,l]),d=n?o:0,f={"fill-color":["get","color"],"fill-opacity":d},g={"line-color":["get","borderColor"],"line-width":c,"line-opacity":d};return e.jsxs(i,{id:"mincut-partition",type:"geojson",data:u,children:[e.jsx(a,{id:"mincut-partition-fill",type:"fill",paint:f}),e.jsx(a,{id:"mincut-partition-stroke",type:"line",paint:g})]})}const Yt={showTopology:!1,showNeighborLines:!0,show3DTerrain:!1,showMinCut:!1,nodeFilter:"all"},Vt=mA()(bA(A=>({viewState:null,setViewState:e=>A({viewState:e,lastSavedAt:Date.now()}),toggles:Yt,setToggle:(e,t)=>A(A=>({toggles:{...A.toggles,[e]:t},lastSavedAt:Date.now()})),setToggles:e=>A(A=>({toggles:{...A.toggles,...e},lastSavedAt:Date.now()})),hasAnalyzed:!1,setHasAnalyzed:e=>A({hasAnalyzed:e,lastSavedAt:Date.now()}),lastSavedAt:null,reset:()=>A({viewState:null,toggles:Yt,hasAnalyzed:!1,lastSavedAt:null})}),{name:"pymc-map-view",partialize:A=>({viewState:A.viewState,toggles:A.toggles,hasAnalyzed:A.hasAnalyzed,lastSavedAt:A.lastSavedAt})}));function Wt(A,e=!1,t=!1,r=!1,n=.7,o){const i=eA(o);return r?n>=.75?i.restBright:i.rest:n>=.85?i.rest:i.restDim}function Zt(A){return[A[1],A[0]]}function Kt(A,e,t,r=12){const[n,o]=A,[i,a]=e,s=[];for(let l=0;l<=r;l++){const A=l/r,e=o+(a-o)*A,c=n+(i-n)*A,u=4*t*A*(1-A);s.push([e,c,u])}return s}function Jt(A){return A<.5?4*A*A*A:1-Math.pow(-2*A+2,3)/2}function qt(A,e,t,r,n,o,i,a,s,l,c,u="dark"){const d=YA(),f=[];let g=1/0,h=-1/0;const m=[];for(const p of A){const A=.7*(p.edge.avgConfidence??(e?.7:.5))+p.edge.certainCount/Math.max(i,1)*.3+(e?.5:0);m.push({polyline:p,brightnessScore:A}),g=Math.min(g,A),h=Math.max(h,A)}if(0===m.length)return{type:"FeatureCollection",features:[]};const b=h-g||1;m.sort((A,e)=>A.brightnessScore-e.brightnessScore);for(const{polyline:p,brightnessScore:v}of m){const{from:A,to:i,edge:h}=p,m=t.get(h.key)??0;if(m<=0)continue;const y=a.has(h.key),w=s.has(h.key),x=h.avgConfidence??(e?.7:.5),k=l===h.key,C=c[h.fromHash],B=c[h.toHash],M=(null==C?void 0:C.node_name)||(null==C?void 0:C.name)||h.fromHash.slice(0,8),D=(null==B?void 0:B.node_name)||(null==B?void 0:B.name)||h.toHash.slice(0,8),E=[A[0]+(i[0]-A[0])*m,A[1]+(i[1]-A[1])*m];let j,Q,N,S;if(e){const A=o.get(h.key)??UA(h.certainCount),e=n.get(h.key)??A;j=e+(A-e)*r,k?j=Math.max(1.6*j,4.5):w&&(j*=1.3)}else j=1.5;if(Q=k?d.edges.highlight:Wt(0,h.isDirectPathEdge??!1,y,w,x,u),N=k?d.edges.highlight:h.isDirectPathEdge?d.edges.hoverDirect:y?d.edges.hoverLoop:d.edges.hoverStandard,e){const A=Math.min(1.5*m,1)*d.edgeOpacity;S=w?1.15*A:A}else S=(.3+.3*x)*m;k&&(S=.95);const F=(v-g)/b;f.push({type:"Feature",properties:{key:h.key,baseColor:Q,hoverColor:N,baseWidth:j,baseOpacity:S,brightnessScore:F,isLoopEdge:y,isBackbone:w,isDirectPath:h.isDirectPathEdge??!1,isHubConnection:h.isHubConnection??!1,isZeroHop:h.isZeroHop??!1,isValidated:e,certainCount:h.certainCount,confidence:x,symmetryRatio:h.symmetryRatio??1,dominantDirection:h.dominantDirection??"balanced",fromName:M,toName:D,fromHash:h.fromHash,toHash:h.toHash},geometry:{type:"LineString",coordinates:[Zt(A),Zt(E)]}})}return{type:"FeatureCollection",features:f}}function Xt(A,e){const t=YA(),r=[];let n=0;for(const o of A){const A=e.get(o.hash);A&&A.blendedScore>n&&(n=A.blendedScore)}for(const o of A){const{from:A,to:i,hash:a,neighbor:s,lastHopData:l}=o,c=`neighbor-${a}`,u=(null==l?void 0:l.avgRssi)??s.rssi??null,d=(null==l?void 0:l.avgSnr)??s.snr??null,f=(null==l?void 0:l.count)??0,g=(null==l?void 0:l.confidence)??1,h=e.get(a),m=(null==h?void 0:h.listenerScore)??0,b=(null==h?void 0:h.loudScore)??0,p=(null==h?void 0:h.blendedScore)??0,v=n>0?p/n:0,y=o.rxAdvertCount??0,w=o.txProxyCount??0,x=y+w,k=x>0?(w-y)/x:0,C=Kt(A,i,150,8);r.push({type:"Feature",properties:{key:c,hash:a,name:s.node_name||s.name||a.slice(0,8),prefix:a.slice(2,4).toUpperCase(),color:t.neighborColor,width:2.5,opacity:.85,rssi:u,snr:d,packetCount:f,confidence:g,hasAvgRssi:void 0!==(null==l?void 0:l.avgRssi),hasAvgSnr:void 0!==(null==l?void 0:l.avgSnr),isNeighborEdge:!0,listenerScore:m,loudScore:b,blendedScore:p,trafficWeight:v,linkAsymmetry:k,rxAdvertCount:y,txProxyCount:w},geometry:{type:"LineString",coordinates:C}})}return{type:"FeatureCollection",features:r}}function $t(A){return A<.5?4*A*A*A:1-Math.pow(-2*A+2,3)/2}function Ar(A,e){if(A<240)return.5;if(A<480)return 1;const t=(A-480)/(e-480);return Math.max(0,.33*(1-t))}function er(A,e,t){const r=t?I(t):null,n=[];for(const o of A){if(r&&o.toUpperCase()===r){t&&n.push(t);continue}const A=e.get(o.toUpperCase());A&&n.push(A)}return n}const tr="edge-blink-source",rr="edge-blink-layer",nr=1e3,or=1e3,ir="node-markers-layer";function ar(A){return A<0||A>=nr?0:1-A/nr}function sr(A){if(A<0)return 0;if(A>=or)return 0;const e=A/or;return Math.pow(1-e,3)}function lr(A){return[A[1],A[0]]}function cr(A){const e=new Date(1e3*A);return`${(e.getMonth()+1).toString().padStart(2,"0")}/${e.getDate().toString().padStart(2,"0")}`}function ur({txDelayRec:t,onRemove:r}){const[n,o]=A.useState(!1),i=t.floodFactor??t.txDelayFactor,a=t.directFactor??t.directTxDelayFactor;return e.jsxs("div",{className:"flex items-center gap-2 text-[10px]",children:[e.jsxs("button",{onClick:async()=>{const A=`set txdelay ${i.toFixed(1)}\nset direct.txdelay ${a.toFixed(1)}`;try{await navigator.clipboard.writeText(A),o(!0),setTimeout(()=>o(!1),1500)}catch(e){const t=document.createElement("textarea");t.value=A,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();try{document.execCommand("copy"),o(!0),setTimeout(()=>o(!1),1500)}catch{}document.body.removeChild(t)}},className:"flex items-center gap-2 flex-1 py-1 px-1.5 bg-amber-400/5 hover:bg-amber-400/10 rounded transition-colors group",title:"Click to copy CLI commands",children:[e.jsx(_A,{className:"w-3 h-3 text-amber-400 shrink-0"}),e.jsx("span",{className:"text-text-muted",children:"TxDelay"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-text-muted",children:"F"}),e.jsxs("span",{className:"data-box data-box-compact text-amber-400",children:["×",i.toFixed(1)]})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-text-muted",children:"D"}),e.jsxs("span",{className:"data-box data-box-compact text-amber-400",children:["×",a.toFixed(1)]})]})]}),n?e.jsx(vA,{className:"w-3 h-3 text-green-400 ml-auto"}):e.jsx(yA,{className:"w-3 h-3 text-text-muted opacity-0 group-hover:opacity-100 transition-opacity ml-auto"})]}),r&&e.jsx("button",{onClick:r,className:"p-1 text-text-secondary hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",title:"Remove from contacts",children:e.jsx(W,{className:"w-3.5 h-3.5"})})]})}function dr({hash:t,hashPrefix:r,name:n,isHub:o,isGateway:i,isBackbone:a,isZeroHop:s,isMobile:l,isRoomServer:c,isStale:u,lastSeenTimestamp:d,centrality:f,affinity:g,meanSnr:h,meanRssi:m,neighbor:b,onRemove:p,txDelayRec:v}){const[y,w]=A.useState(!1),x=s?"Direct":(null==g?void 0:g.typicalHopPosition)?`${g.typicalHopPosition}-hop`:null,k=v&&!v.insufficientData;return e.jsxs("div",{className:"w-[240px] pr-2",children:[e.jsx("div",{className:"text-[14px] font-semibold text-text-primary leading-tight truncate mb-1",children:n}),e.jsxs("div",{className:"flex items-center gap-1 flex-wrap mb-1.5",children:[e.jsx("code",{className:"font-mono text-[10px] text-text-secondary bg-data-box-bg border border-data-box-border px-1 py-0.5 rounded",children:r}),e.jsx("button",{onClick:async()=>{try{await navigator.clipboard.writeText(t),w(!0),setTimeout(()=>w(!1),1500)}catch(A){const e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select();try{document.execCommand("copy"),w(!0),setTimeout(()=>w(!1),1500)}catch{}document.body.removeChild(e)}},className:"p-0.5 hover:bg-subtle-fill-hover rounded transition-colors",title:"Copy full hash",children:y?e.jsx(vA,{className:"w-3 h-3 text-sys-green"}):e.jsx(yA,{className:"w-3 h-3 text-text-secondary"})}),e.jsx(xA,{hash:t,size:"sm"}),x&&e.jsx(_,{color:s?BA.direct:BA.multihop,compact:!0,children:x}),b.is_repeater&&e.jsx(_,{color:MA.repeater,compact:!0,children:"Rptr"}),o&&e.jsx(_,{color:MA.hub,compact:!0,title:"Hub: ≥10% of last-hop traffic",children:"Hub"}),i&&!o&&e.jsx(_,{color:MA.gateway,compact:!0,title:"Gateway: 7-10% of last-hop traffic",children:"Gate"}),a&&e.jsx(_,{color:MA.backbone,compact:!0,title:"Backbone",children:"Bone"}),l&&e.jsx(_,{color:MA.mobile,compact:!0,children:"Mobile"}),c&&e.jsx(_,{color:MA.room,compact:!0,children:"Room"}),u&&d&&e.jsxs(_,{compact:!0,title:"Neighbor not heard in 7+ days",children:["Idle ",cr(d)]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-[10px] text-text-secondary mb-1.5",children:[e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(F,{className:"w-3 h-3 text-text-muted shrink-0"}),e.jsx("span",{className:"font-mono",children:z(b.last_seen)})]}),(null==g?void 0:g.distanceMeters)&&e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(kA,{className:"w-3 h-3 text-text-muted shrink-0"}),e.jsx("span",{className:"font-mono font-semibold text-text-primary",children:(C=g.distanceMeters,null===C?"—":C<1e3?`${Math.round(C)}m`:`${(C/1e3).toFixed(1)}km`)})]}),b.latitude&&b.longitude&&0!==b.latitude&&0!==b.longitude&&e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(jA,{className:"w-3 h-3 text-text-muted shrink-0"}),e.jsxs("span",{className:"font-mono text-text-muted",children:[b.latitude.toFixed(2),", ",b.longitude.toFixed(2)]})]})]}),e.jsx("div",{className:"mb-1.5",style:{width:224},children:e.jsx(CA,{nodeHash:t,width:224,height:26,showArea:!0,showTooltip:!0})}),e.jsxs("div",{className:"flex gap-3 text-[10px] mb-1.5",children:[e.jsxs("div",{className:"flex-1 space-y-1",children:[e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Packets"}),e.jsx("span",{className:"data-box data-box-compact",children:(null==g?void 0:g.frequency)||0})]}),s&&void 0!==h&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"SNR"}),e.jsxs("span",{className:"data-box data-box-compact",children:[h.toFixed(1)," dB"]})]}),k&&v.networkRole&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Role"}),e.jsx(_,{color:DA[v.networkRole],compact:!0,title:{hub:"Hub: High-connectivity node that bridges many paths",backbone:"Backbone: Critical relay with high traffic",relay:"Relay: Standard forwarding node",edge:"Edge: Peripheral node"}[v.networkRole],children:v.networkRole})]})]}),e.jsxs("div",{className:"flex-1 space-y-1",children:[e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Adverts"}),e.jsx("span",{className:"data-box data-box-compact",children:b.advert_count||0})]}),s&&void 0!==m&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"RSSI"}),e.jsxs("span",{className:"data-box data-box-compact",children:[Math.round(m)," dBm"]})]}),k&&v.dataConfidence&&e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("span",{className:"text-text-muted",children:"Data"}),e.jsx(_,{color:EA[v.dataConfidence],compact:!0,title:{high:"1000+ packets",medium:"500-999 packets",low:"100-499 packets",insufficient:"Insufficient data"}[v.dataConfidence],children:v.dataConfidence})]})]}),!k&&p&&e.jsx("button",{onClick:p,className:"p-1 self-start text-text-secondary hover:text-red-400 hover:bg-red-500/10 rounded transition-colors",title:"Remove from contacts",children:e.jsx(W,{className:"w-3.5 h-3.5"})})]}),k&&e.jsx(ur,{txDelayRec:v,onRemove:p})]});var C}const fr="node-markers-native",gr="node-markers-layer",hr="node-markers-layer-local",mr="marker-standard",br="marker-standard-neighbor",pr="marker-hub",vr="marker-hub-neighbor",yr="marker-gateway",wr="marker-gateway-neighbor",xr="marker-mobile",kr="marker-mobile-neighbor",Cr="marker-room-server",Br="marker-room-server-neighbor",Mr="marker-local",Dr="marker-stale-5day",Er="marker-stale-10day",jr="marker-blink-black",Qr="marker-blink-black-local",Nr="marker-blink",Sr="marker-blink-local";function Fr(A){if(!A)return 0;const e=(Date.now()-1e3*A)/864e5;return e>=10?2:e>=5?1:0}function Pr(A){var e;const t=null==(e=A.contact_type)?void 0:e.toLowerCase();return"room server"===t||"room_server"===t||"room"===t||"server"===t}function Tr(A){return A.startsWith("0x")?A.slice(2,4).toUpperCase():A.slice(0,2).toUpperCase()}function Lr({neighborsWithLocation:t,localNode:r,localHash:n,zeroHopNeighbors:l,lastHopNeighborMap:c,meshTopology:u,hoveredMarker:d,onMarkerHover:f,getNodeOpacity:g,shouldShowNode:h,onRequestRemove:m,openPopupId:b,onOpenPopup:p,onClosePopup:v,onNodeClick:y,blinkingNodes:w}){const{current:x}=o(),k=A.useRef(!1),[C,B]=A.useState(!1);A.useEffect(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);if(!e)return;const t=()=>{try{!function(A){const e=AA(),t=(A,e,t=0,r=!1)=>{const n=document.createElement("canvas");n.width=32,n.height=32;const o=n.getContext("2d",r?{colorSpace:"display-p3"}:void 0),i=14-t/2;return o.beginPath(),o.arc(16,16,i,0,2*Math.PI),o.fillStyle=A,o.fill(),e&&t>0&&(o.strokeStyle=e,o.lineWidth=2*t,o.stroke()),o.shadowColor="rgba(0,0,0,0.3)",o.shadowBlur=4,o.shadowOffsetY=2,{data:o.getImageData(0,0,32,32),pixelRatio:2}},r=(A,e=!1)=>{const t=document.createElement("canvas");t.width=48,t.height=48;const r=t.getContext("2d",e?{colorSpace:"display-p3"}:void 0),n=24*.35*2;return r.strokeStyle=A,r.lineWidth=5,r.lineCap="round",r.lineJoin="round",r.beginPath(),r.moveTo(24-n,24),r.lineTo(24,24-n),r.lineTo(40.8,24),r.stroke(),r.beginPath(),r.moveTo(24-.7*n,24),r.lineTo(24-.7*n,35.76),r.lineTo(35.76,35.76),r.lineTo(35.76,24),r.stroke(),r.beginPath(),r.moveTo(20.64,35.76),r.lineTo(20.64,27.36),r.lineTo(27.36,27.36),r.lineTo(27.36,35.76),r.stroke(),{data:r.getImageData(0,0,48,48),pixelRatio:2}},n=(A,e)=>{const t=document.createElement("canvas");t.width=48,t.height=48;const r=t.getContext("2d"),n=24*.35*2;return r.strokeStyle=A,r.lineWidth=5,r.lineCap="round",r.lineJoin="round",e&&(r.fillStyle=e),r.beginPath(),r.roundRect(24-n,24-.6*n,1.6*n,1.2*n,6),e&&r.fill(),r.stroke(),r.beginPath(),r.moveTo(18.96,34.08),r.lineTo(24-.6*n,40.8),r.lineTo(24,34.08),r.stroke(),{data:r.getImageData(0,0,48,48),pixelRatio:2}},o="#00FF00",i={[mr]:t(e.nodeFill),[br]:t(e.neighborColor),[pr]:t(e.hubColor),[vr]:t(e.neighborColor),[yr]:t(e.gatewayColor),[wr]:t(e.neighborColor),[xr]:t("transparent",e.mobileColor,2.5),[kr]:t(e.neighborColor),[Cr]:n(e.roomColor),[Br]:n(e.neighborColor,"#1a1a1c"),[Mr]:r(e.localColor),[Dr]:t("#808080"),[Er]:t("#404040"),[jr]:t("#000000"),[Qr]:r("#000000"),[Nr]:t(o,void 0,0,!0),[Sr]:r(o,!0)};for(const[a,s]of Object.entries(i))try{A.hasImage(a)&&A.removeImage(a),A.addImage(a,s.data,{pixelRatio:s.pixelRatio})}catch{}}(e),k.current=!0,C||B(!0)}catch(A){}};e.isStyleLoaded()?t():e.once("style.load",t);const r=()=>{e.hasImage(mr)||t()};e.on("styledata",r);const n=()=>{k.current=!1,t()},o=new MutationObserver(A=>{for(const e of A)if("data-theme"===e.attributeName){setTimeout(n,100);break}});o.observe(document.documentElement,{attributes:!0});const i=document.querySelector("[data-basemap]");let a=null;return i&&(a=new MutationObserver(A=>{for(const e of A)if("data-basemap"===e.attributeName){setTimeout(n,100);break}}),a.observe(i,{attributes:!0})),()=>{e.off("styledata",r),o.disconnect(),null==a||a.disconnect()}},[x,C]);const M=A.useMemo(()=>{var A;const e=[],r=[...t].sort(([A,e],[t,r])=>{const n=(A,e)=>{var t;return Pr(e)?5e3:l.has(A)?3e3:u.hubNodes.includes(A)?2e3:(null==(t=u.gatewayNodes)?void 0:t.includes(A))?1e3:0};return n(A,e)-n(t,r)});for(const[t,o]of r){if(!o.latitude||!o.longitude)continue;if(n&&((n.startsWith("0x")?n.slice(2,4).toLowerCase():n.slice(0,2).toLowerCase())===(t.startsWith("0x")?t.slice(2,4).toLowerCase():t.slice(0,2).toLowerCase())||t===n))continue;const r=h(t),i=g(t,r);if(i<=.01)continue;const a=l.has(t),s=u.hubNodes.includes(t),d=(null==(A=u.gatewayNodes)?void 0:A.includes(t))??!1,f=u.mobileNodes.includes(t),m=Pr(o),b=u.centrality.get(t)||0,p=c.get(t),v=o.last_seen||(null==p?void 0:p.lastSeen),y=Fr(v),w=y>0;let x=i;2===y?x=Math.min(i,.25):1===y&&(x=Math.min(i,.5));let k="standard";m?k="roomServer":s?k="hub":d?k="gateway":f&&(k="mobile");const C=u.fullAffinity.get(t),B=u.txDelayRecommendations.get(t);e.push({type:"Feature",geometry:{type:"Point",coordinates:[o.longitude,o.latitude]},properties:{hash:t,name:o.node_name||o.name||"Unknown",hashPrefix:Tr(t),iconType:k,isNeighbor:a,isHub:s,isGateway:d,isMobile:f,isRoomServer:m,isStale:w,staleTier:y,isZeroHop:a,opacity:x,blinkIntensity:0,lastSeenTimestamp:v,centrality:b,neighborJson:JSON.stringify(o),affinityJson:C?JSON.stringify(C):void 0,txDelayRecJson:B?JSON.stringify(B):void 0,meanSnr:(null==p?void 0:p.avgSnr)??void 0,meanRssi:(null==p?void 0:p.avgRssi)??void 0}})}return{type:"FeatureCollection",features:e}},[t,n,l,c,u,g,h]),D=A.useMemo(()=>(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude)?{type:"FeatureCollection",features:[{type:"Feature",geometry:{type:"Point",coordinates:[r.longitude,r.latitude]},properties:{hash:"local",name:r.name,hashPrefix:n?Tr(n):"",iconType:"local",isNeighbor:!1,isHub:!1,isGateway:!1,isMobile:!1,isRoomServer:!1,isStale:!1,staleTier:0,isZeroHop:!1,opacity:1,blinkIntensity:0,centrality:0}}]}:{type:"FeatureCollection",features:[]},[r,n]),E=A.useCallback(A=>{var e;if(!A.features||0===A.features.length)return;const t=null==(e=A.features[0].properties)?void 0:e.hash;t&&(p&&p(t),y&&"local"!==t&&y(t))},[p,y]),j=A.useCallback(A=>{var e,t;if(!A.features||0===A.features.length)return;const r=null==(e=null==x?void 0:x.getMap)?void 0:e.call(x);r&&(r.getCanvas().style.cursor="pointer");const n=null==(t=A.features[0].properties)?void 0:t.hash;n&&f(n)},[x,f]),Q=A.useCallback(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);e&&(e.getCanvas().style.cursor=""),f(null)},[x,f]);A.useEffect(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);if(!e||!C)return;const t=[gr,hr];for(const r of t)e.on("click",r,E),e.on("mouseenter",r,j),e.on("mouseleave",r,Q);return()=>{for(const A of t)e.off("click",A,E),e.off("mouseenter",A,j),e.off("mouseleave",A,Q)}},[x,C,E,j,Q]);const N=A.useRef(M),S=A.useRef(D);A.useEffect(()=>{N.current=M,S.current=D},[M,D]),A.useEffect(()=>{var A;const e=null==(A=null==x?void 0:x.getMap)?void 0:A.call(x);if(!e||!C||!w||0===w.size)return;const t=e.getSource(fr),r=e.getSource(`${fr}-local`);if(t||r){if(t){const A=N.current;let e=!1;const r=A.features.map(A=>{const t=w.get(A.properties.hash)??0;return t!==A.properties.blinkIntensity?(e=!0,{...A,properties:{...A.properties,blinkIntensity:t}}):A});e&&t.setData({type:"FeatureCollection",features:r})}if(r&&n){const A=w.get(n)??0,e=S.current;e.features.length>0&&e.features[0].properties.blinkIntensity!==A&&r.setData({type:"FeatureCollection",features:[{...e.features[0],properties:{...e.features[0].properties,blinkIntensity:A}}]})}}},[x,C,w,n]);const F=A.useMemo(()=>{if(!b)return null;if("local"===b&&r)return{longitude:r.longitude,latitude:r.latitude,isLocal:!0,name:r.name,hash:n};const A=M.features.find(A=>A.properties.hash===b);if(!A)return null;const e=A.properties,t=e.txDelayRecJson?JSON.parse(e.txDelayRecJson):void 0;return{longitude:A.geometry.coordinates[0],latitude:A.geometry.coordinates[1],isLocal:!1,hash:e.hash,hashPrefix:e.hashPrefix,name:e.name,isHub:e.isHub,isGateway:e.isGateway,isBackbone:"backbone"===(null==t?void 0:t.networkRole),isZeroHop:e.isZeroHop,isMobile:e.isMobile,isRoomServer:e.isRoomServer,isStale:e.isStale,lastSeenTimestamp:e.lastSeenTimestamp,centrality:e.centrality,neighbor:e.neighborJson?JSON.parse(e.neighborJson):void 0,affinity:e.affinityJson?JSON.parse(e.affinityJson):void 0,txDelayRec:t,meanSnr:e.meanSnr,meanRssi:e.meanRssi}},[b,r,n,M]);if(!C)return null;const P=AA(),T=["case",[">",["get","blinkIntensity"],.66],Nr,[">",["get","blinkIntensity"],.33],jr,["==",["get","staleTier"],2],Er,["==",["get","staleTier"],1],Dr,["==",["get","iconType"],"roomServer"],["case",["get","isNeighbor"],Br,Cr],["==",["get","iconType"],"hub"],["case",["get","isNeighbor"],vr,pr],["==",["get","iconType"],"gateway"],["case",["get","isNeighbor"],wr,yr],["==",["get","iconType"],"mobile"],["case",["get","isNeighbor"],kr,xr],["case",["get","isNeighbor"],br,mr]],L=["interpolate",["linear"],["zoom"],6,.25,10,1];return e.jsxs(e.Fragment,{children:[e.jsx(i,{id:fr,type:"geojson",data:M,children:e.jsx(a,{id:gr,type:"symbol",layout:{"icon-image":T,"icon-size":L,"icon-allow-overlap":!0,"icon-ignore-placement":!0,"symbol-sort-key":["get","opacity"]},paint:{"icon-opacity":["get","opacity"]}})}),e.jsx(i,{id:`${fr}-local`,type:"geojson",data:D,children:e.jsx(a,{id:hr,type:"symbol",layout:{"icon-image":["case",[">",["get","blinkIntensity"],.66],Sr,[">",["get","blinkIntensity"],.33],Qr,Mr],"icon-size":L,"icon-allow-overlap":!0,"icon-ignore-placement":!0},paint:{"icon-opacity":1}})}),F&&v&&e.jsx(s,{longitude:F.longitude,latitude:F.latitude,offset:{center:[0,0],top:[0,12],"top-left":[6,12],"top-right":[-6,12],bottom:[0,-12],"bottom-left":[6,-12],"bottom-right":[-6,-12],left:[12,0],right:[-12,0]},maxWidth:"280px",closeOnClick:!0,onClose:v,className:"maplibre-popup",children:F.isLocal?e.jsxs("div",{className:"text-sm",children:[e.jsx("strong",{className:"text-base",children:F.name}),F.hash&&e.jsx("span",{className:"ml-2 font-mono text-xs text-text-muted surface-badge px-1.5 py-0.5 rounded",children:Tr(F.hash)}),e.jsx("br",{}),e.jsx("span",{style:{color:P.localColor},className:"font-medium",children:"This Node (Local)"}),e.jsx("br",{}),r&&e.jsxs("span",{className:"text-xs text-text-muted",children:[r.latitude.toFixed(5),", ",r.longitude.toFixed(5)]})]}):F.neighbor&&F.hash?e.jsx(dr,{hash:F.hash,hashPrefix:F.hashPrefix,name:F.name,isHub:F.isHub,isGateway:F.isGateway,isBackbone:F.isBackbone,isZeroHop:F.isZeroHop,isMobile:F.isMobile,isRoomServer:F.isRoomServer,isStale:F.isStale,lastSeenTimestamp:F.lastSeenTimestamp,centrality:F.centrality,affinity:F.affinity,meanSnr:F.meanSnr,meanRssi:F.meanRssi,neighbor:F.neighbor,txDelayRec:F.txDelayRec,onRemove:m?()=>m(F.hash,F.name):void 0}):null})]})}const Ir=[gr,hr];A.createContext(null);const Rr="topology-validated-edges-native",_r="topology-weak-edges-native",zr="neighbor-edges-native",Hr="topology-weak-edges-native",Gr="topology-validated-edges-native",Ur="neighbor-edges-native",Or={type:"FeatureCollection",features:[]},Yr={"line-cap":"round","line-join":"round"},Vr={"line-color":"transparent","line-width":16,"line-opacity":0};function Wr({showTopology:t,isExiting:r,hoveredEdgeKey:n,highlightedLoopEdges:s,highlightedFocusEdges:l,onEdgeHover:c,onLoopHover:u,loops:d=[],neighborNames:g={},opacityBias:h=.5,widthMultiplier:m=1,trafficFilter:b=0,showNeighborLines:p=!0,disableHover:v=!1}){const{current:y}=o(),w=t||r,x=!0,k=p?"visible":"none",C=v||r,B=A.useRef(null),M=A.useRef(C),D=A.useRef(new Map),E=A.useRef(g),j=A.useRef(u);A.useLayoutEffect(()=>{M.current=C,E.current=g,j.current=u});const Q=A.useMemo(()=>function(A){const e=new Map;for(const t of A)for(const A of t.edgeKeys){const r=e.get(A)??[];r.push(t),e.set(A,r)}return e}(d),[d]);A.useLayoutEffect(()=>{D.current=Q},[Q]);const N=A.useCallback(A=>{var e,t;if(M.current)return;if(!A.features||0===A.features.length)return;const r=A.features[0].properties;if(!(null==r?void 0:r.key))return;const n=r.key;if(n!==B.current){B.current=n;const o=!0===r.isNeighborEdge||"true"===r.isNeighborEdge,i=!0===r.isLoopEdge||"true"===r.isLoopEdge;if(o){const t={key:n,fromName:"Local",toName:r.name,certainCount:Number(r.packetCount)||0,confidence:1,isBackbone:!1,isLoopEdge:!1,isDirectPath:!0,isZeroHop:!0,symmetryRatio:1,dominantDirection:"balanced",isHubConnection:!1};c(n,[A.lngLat.lng,A.lngLat.lat],t),null==(e=j.current)||e.call(j,null)}else if(i&&j.current){const e=D.current.get(n)??[];if(e.length>0){const t=new Set;for(const A of e)for(const e of A.edgeKeys)t.add(e);const r={loops:e,highlightedEdgeKeys:t,hoveredEdgeKey:n,nodeNames:e[0].nodes.map(A=>E.current[A]||A.substring(0,4))};j.current(r,[A.lngLat.lng,A.lngLat.lat]),c(n)}else{const e={key:n,fromName:r.fromName,toName:r.toName,certainCount:Number(r.certainCount),confidence:Number(r.confidence),isBackbone:!0===r.isBackbone||"true"===r.isBackbone,isLoopEdge:!0,isDirectPath:!0===r.isDirectPath||"true"===r.isDirectPath,isZeroHop:!0===r.isZeroHop||"true"===r.isZeroHop,symmetryRatio:Number(r.symmetryRatio),dominantDirection:r.dominantDirection,isHubConnection:!0===r.isHubConnection||"true"===r.isHubConnection};c(n,[A.lngLat.lng,A.lngLat.lat],e)}}else{const e={key:n,fromName:r.fromName,toName:r.toName,certainCount:Number(r.certainCount),confidence:Number(r.confidence),isBackbone:!0===r.isBackbone||"true"===r.isBackbone,isLoopEdge:i,isDirectPath:!0===r.isDirectPath||"true"===r.isDirectPath,isZeroHop:!0===r.isZeroHop||"true"===r.isZeroHop,symmetryRatio:Number(r.symmetryRatio),dominantDirection:r.dominantDirection,isHubConnection:!0===r.isHubConnection||"true"===r.isHubConnection};c(n,[A.lngLat.lng,A.lngLat.lat],e),null==(t=j.current)||t.call(j,null)}}},[c]),S=A.useCallback(()=>{var A;null!==B.current&&(B.current=null,c(null),null==(A=j.current)||A.call(j,null))},[c]);A.useEffect(()=>{var A;const e=null==(A=null==y?void 0:y.getMap)?void 0:A.call(y);if(!e||!w)return;const t="topology-validated-edges-hitarea-native",r=()=>{try{return e.getStyle()&&e.getLayer(t)}catch{return!1}},n=()=>!!r()&&(e.on("mousemove",t,N),e.on("mouseleave",t,S),!0);if(!n()){const A=()=>{n()&&e.off("styledata",A)};return e.on("styledata",A),()=>{try{e.off("styledata",A),r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}}return()=>{try{r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}},[y,w,N,S]),A.useEffect(()=>{var A;const e=null==(A=null==y?void 0:y.getMap)?void 0:A.call(y);if(!e||!p)return;const t="neighbor-edges-hitarea-native",r=()=>{try{return e.getStyle()&&e.getLayer(t)}catch{return!1}},n=()=>!!r()&&(e.on("mousemove",t,N),e.on("mouseleave",t,S),!0);if(!n()){const A=()=>{n()&&e.off("styledata",A)};return e.on("styledata",A),()=>{try{e.off("styledata",A),r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}}return()=>{try{r()&&(e.off("mousemove",t,N),e.off("mouseleave",t,S))}catch{}}},[y,x,p,N,S]),A.useEffect(()=>{var A;const e=null==(A=null==y?void 0:y.getMap)?void 0:A.call(y);if(!e)return;let t=null;const r=(A,t)=>{try{if(e.getLayer(A)&&e.getLayer(t))return e.moveLayer(A,t),!0}catch{}return!1},n=()=>{try{if(!e.getLayer("node-markers-layer"))return;r(Ur,"node-markers-layer"),r("neighbor-edges-hitarea-native",Ur),(r(Gr,"neighbor-edges-hitarea-native")||r(Gr,"node-markers-layer"))&&r("topology-validated-edges-hitarea-native",Gr),r(Hr,"topology-validated-edges-hitarea-native")}catch{}},o=()=>{t&&clearTimeout(t),t=setTimeout(n,50)},i=setTimeout(n,100);e.on("styledata",o);const a=A=>{(A.sourceId===Rr||A.sourceId===_r||A.sourceId===zr)&&o()};return e.on("sourcedata",a),()=>{clearTimeout(i),t&&clearTimeout(t);try{e.off("styledata",o),e.off("sourcedata",a)}catch{}}},[y,w,x,p]);const F=C?null:n,P=function(A,e,t,r,n,o){const i=YA(),a=null!==A,s=n&&n.size>0,l=o&&o.size>0,c=s?Array.from(n):[],u=l?Array.from(o):[],d=e<=0?["get","baseColor"]:["case",[">=",["get","brightnessScore"],1-.5*e],"#FFFFFF",["get","baseColor"]],f=e<=0?1:["max",.1,["+",1,["*",e,3,["-",["get","brightnessScore"],.5]]]],g=s?["in",["get","key"],["literal",c]]:l?["in",["get","key"],["literal",u]]:!!a&&["==",["get","key"],A],h=a||s||l,m=i.edges.hoverLoop??"#A78BFA";return{"line-color":h?["case",g,s?m:l?"#FFD700":["get","hoverColor"],d]:d,"line-width":h?["case",g,["max",["*",["get","baseWidth"],t,1.3],3.5],["*",["get","baseWidth"],t]]:["*",["get","baseWidth"],t],"line-opacity":["case",["<",["get","brightnessScore"],r],0,h?["case",g,["min",["*",["get","baseOpacity"],1.25],1],["*",["get","baseOpacity"],f,.35]]:["*",["get","baseOpacity"],f]]}}(F,h,m,b,C?null:s,l??null),T=function(A){const e=null!==A,{YELLOW:t,GREEN:r,RED:n,GRAY:o}=f,i=["to-number",["get","listenerScore"],0],a=["to-number",["get","loudScore"],0],s=["/",i,["max",["+",i,a],1]],l=["*",["+",.2,["*",["to-number",["get","trafficWeight"],0],.8]],8];return{"line-color":["case",["all",["==",i,0],["==",a,0]],o,[">=",s,.97],r,["<=",s,.03],n,["interpolate",["linear"],s,.03,n,.5,t,.97,r]],"line-width":["interpolate",["linear"],["zoom"],6,e?["case",["==",["get","key"],A],["max",["*",l,.25],1.25],["*",l,.25]]:["*",l,.25],10,e?["case",["==",["get","key"],A],["max",l,5],l]:l],"line-opacity":e?["case",["==",["get","key"],A],1,.35]:.9}}(F);return e.jsxs(e.Fragment,{children:[w&&e.jsx(i,{id:_r,type:"geojson",data:Or,children:e.jsx(a,{id:Hr,type:"line",paint:P,layout:{...Yr,visibility:k}})}),w&&e.jsxs(i,{id:Rr,type:"geojson",data:Or,children:[e.jsx(a,{id:"topology-validated-edges-hitarea-native",type:"line",paint:Vr,layout:{...Yr,visibility:k}}),e.jsx(a,{id:Gr,type:"line",paint:P,layout:{...Yr,visibility:k}})]}),e.jsxs(i,{id:zr,type:"geojson",data:Or,children:[e.jsx(a,{id:"neighbor-edges-hitarea-native",type:"line",paint:Vr,layout:{...Yr,visibility:k}}),e.jsx(a,{id:Ur,type:"line",paint:T,layout:{...Yr,visibility:k}})]})]})}const Zr=["topology-validated-edges-hitarea-native","topology-validated-edges-native","topology-weak-edges-native","neighbor-edges-hitarea-native","neighbor-edges-native"];function Kr({targetHash:e,nodeCoordinates:t,onComplete:r}){const{current:n}=o(),i=A.useRef(null);return A.useEffect(()=>{if(!n||!e||e===i.current)return;const A=t.get(e);if(!A)return;const o=n.getMap();o.isMoving()&&o.stop(),i.current=e;const[a,s]=A;n.flyTo({center:[s,a],zoom:10,duration:2500,essential:!0}),setTimeout(()=>{null==r||r()},2600)},[e,t,n,r]),null}function Jr({highlightedEdgeKey:e,validatedPolylines:t,weakPolylines:r,onEnsureTopology:n}){const{current:i}=o(),a=A.useRef(null);return A.useEffect(()=>{if(!i||!e)return;if(e===a.current)return;a.current=e,n();const A=t.find(A=>A.edge.key===e)||r.find(A=>A.edge.key===e);if(!A)return;if(i.getMap().isMoving())return;const o=(A.from[0]+A.to[0])/2,s=(A.from[1]+A.to[1])/2,l=i.getZoom(),c=Math.max(l,11);i.easeTo({center:[s,o],zoom:c,duration:500})},[e,t,r,i,n]),null}function qr(A,e,t,r=64){const n=[],o=t/6371e3*(180/Math.PI),i=o/Math.cos(e*Math.PI/180);for(let a=0;a<=r;a++){const t=a/r*2*Math.PI,s=A+i*Math.cos(t),l=e+o*Math.sin(t);n.push([s,l])}return{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[n]}}}function Xr({ghost:t,neighborCoordinates:r,onHighlightedNeighborsChange:n}){const{current:s}=o(),l=A.useRef(null),c=A.useRef(null),u=A.useMemo(()=>t?new Set(t.commonNeighbors):new Set,[t]);A.useEffect(()=>{null==n||n(u)},[u,n]);const d=A.useMemo(()=>{if(!(null==t?void 0:t.commonNeighbors)||t.commonNeighbors.length<2)return 8e3;let A=0;const e=[];for(const n of t.commonNeighbors){const A=r.get(n);A&&e.push(A)}t.estimatedLocation&&e.push([t.estimatedLocation.lat,t.estimatedLocation.lon]);for(let t=0;tA&&(A=n)}return Math.max(A,2e3)},[t,r]),f=A.useMemo(()=>{if(!(null==t?void 0:t.estimatedLocation))return{type:"FeatureCollection",features:[]};const{lat:A,lon:e,uncertaintyM:r}=t.estimatedLocation,n=.5*d,o=r>0?r:2e3;return{type:"FeatureCollection",features:[qr(e,A,Math.max(500,Math.min(o,n)))]}},[t,d]);if(A.useEffect(()=>{if(!s)return;const A=s.getMap();if(t&&t.prefix!==c.current){if(c.current=t.prefix,!l.current&&A.getZoom()>3){const e=A.getCenter();l.current={center:[e.lng,e.lat],zoom:A.getZoom(),pitch:A.getPitch(),bearing:A.getBearing()}}const e=[];for(const A of t.commonNeighbors){const t=r.get(A);t&&e.push([t[1],t[0]])}if(t.estimatedLocation&&e.push([t.estimatedLocation.lon,t.estimatedLocation.lat]),e.length>0){const r=()=>{var n;if(A.isMoving())setTimeout(r,100);else if(1===e.length)s.flyTo({center:e[0],zoom:13,duration:1500});else{let A=1/0,r=-1/0,o=1/0,i=-1/0;for(const[t,n]of e)A=Math.min(A,t),r=Math.max(r,t),o=Math.min(o,n),i=Math.max(i,n);if(null==(n=t.estimatedLocation)?void 0:n.uncertaintyM){const e=t.estimatedLocation.uncertaintyM/111e3;A-=e,r+=e,o-=e,i+=e}s.fitBounds([[A,o],[r,i]],{padding:{top:60,bottom:60,left:60,right:60},maxZoom:14,duration:1500})}};setTimeout(r,50)}}if(!t&&null!==c.current&&(c.current=null,l.current)){const e=l.current,t=()=>{A.isMoving()?setTimeout(t,100):(s.flyTo({center:e.center,zoom:e.zoom,pitch:e.pitch,bearing:e.bearing,duration:1e3}),l.current=null)};setTimeout(t,50)}},[t,s,r]),!(null==t?void 0:t.estimatedLocation))return null;return e.jsx(i,{id:"ghost-uncertainty-circle",type:"geojson",data:f,children:e.jsx(a,{id:"ghost-uncertainty-fill",type:"fill",paint:{"fill-color":"rgba(167, 139, 250, 0.15)","fill-opacity":.8}})})}!function(A){const e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(A);e&&(parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16))}(OA.edges.neighborHover);const $r={version:8,sources:{},layers:[],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},An={longitude:0,latitude:0,zoom:2};function en({data:A}){const t=A.subtitle&&"loop"===A.type,r=A.subtitle&&"loop"!==A.type;return e.jsxs("div",{className:"w-[540px]",children:[e.jsxs("div",{className:"flex items-center justify-between h-5",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[A.title.icon&&e.jsx("span",{className:`${A.title.color} text-base leading-none flex-shrink-0`,children:A.title.icon}),e.jsx("span",{className:`${A.title.color} font-semibold text-[13px] truncate`,children:A.title.text}),r&&e.jsx("span",{className:`${A.subtitle.color} text-[11px] flex-shrink-0`,children:A.subtitle.text})]}),A.badges.length>0&&e.jsx("div",{className:"flex items-center gap-2 flex-shrink-0 ml-3",children:A.badges.map((A,t)=>e.jsx("span",{className:`${A.color} text-[11px] font-medium`,children:A.text},t))})]}),t&&e.jsx("div",{className:"h-4 mt-0.5 overflow-hidden",children:e.jsx("span",{className:"font-mono text-[10px] text-text-muted truncate block",children:A.subtitle.text})}),e.jsx("div",{className:`flex items-center gap-4 h-4 ${t?"mt-1":"mt-1.5"} text-[11px]`,children:A.stats.map((A,t)=>e.jsxs("span",{className:"whitespace-nowrap",children:[e.jsx("span",{className:`font-mono tabular-nums font-semibold ${A.color??"text-text-primary"}`,children:A.value}),e.jsx("span",{className:"text-text-muted ml-1",children:A.label}),A.unit&&e.jsx("span",{className:"text-text-muted/50 ml-0.5",children:A.unit})]},t))})]})}function tn({neighbors:t,localNode:r,localHash:o,onRemoveNode:i,selectedNodeHash:a,onNodeSelected:s,highlightedEdgeKey:f,highlightedGhost:g}){const h=A.useRef(null),b=H(),p=G(),v=U(),y=O(),[w,x]=A.useState(!1),k=Vt(A=>A.viewState),C=Vt(A=>A.toggles),B=Vt(A=>A.hasAnalyzed),M=Vt(A=>A.setViewState),D=Vt(A=>A.setToggle),E=Vt(A=>A.setHasAnalyzed),j=Y(A=>A.preloadFromNodes),Q=Y(A=>A.isLoading),N=Y(A=>A.terrainGrid),S=o??y,F=A.useMemo(()=>{const A=[];for(const[,e]of Object.entries(t))e.latitude&&e.longitude&&A.push([e.latitude,e.longitude]);return A},[t]),_=A.useMemo(()=>function(A,e){let t=[...A];if((null==e?void 0:e.latitude)&&(null==e?void 0:e.longitude)&&t.push([e.latitude,e.longitude]),0===t.length)return null;if(1===t.length){const[A,e]=t[0];return{longitude:e,latitude:A,zoom:14}}t=function(A,e){if(A.length<=2)return A;let t,r;if((null==e?void 0:e.latitude)&&(null==e?void 0:e.longitude))t=e.latitude,r=e.longitude;else{let e=0,n=0;for(const[t,r]of A)e+=t,n+=r;t=e/A.length,r=n/A.length}const n=A.map(([A,e])=>{return{pos:[A,e],dist:(n=t,o=r,i=A,a=e,GA(n,o,i,a)/1e3)};var n,o,i,a});n.sort((A,e)=>A.dist-e.dist);const o=n[Math.floor(n.length/2)].dist,i=Math.max(3*o,50),a=n.filter(A=>A.dist<=i).map(A=>A.pos);return a.length<.5*A.length?A:a}(t,e);let r=1/0,n=-1/0,o=1/0,i=-1/0;for(const[f,g]of t)r=Math.min(r,g),n=Math.max(n,g),o=Math.min(o,f),i=Math.max(i,f);const a=(r+n)/2,s=(o+i)/2,l=i-o,c=n-r,u=Math.max(l,c);let d=16;return u>0&&(d=Math.floor(Math.log2(360/u*1.2)),d=Math.max(1,Math.min(14,d))),d=Math.min(d+1,12),{longitude:a,latitude:s,zoom:d}}(F,r),[F,r]),[z,V]=A.useState(()=>k??_??An),W=A.useCallback(A=>{V(A),queueMicrotask(()=>M(A))},[M]),K=A.useRef(!!k);A.useEffect(()=>{K.current||!_||k?k&&setTimeout(()=>x(!0),50):(V(_),queueMicrotask(()=>M(_)),K.current=!0,setTimeout(()=>x(!0),50))},[_,k,M]);const[J,q]=A.useState(!1),[X,AA]=A.useState(()=>!(C.showTopology&&!v.topologyLoadComplete)&&C.showTopology),[eA,tA]=A.useState(C.showNeighborLines),[rA,nA]=A.useState(!1),[oA,iA]=A.useState(C.showMinCut),[aA,sA]=A.useState(_e),[lA,cA]=A.useState(C.show3DTerrain),[uA,dA]=A.useState(C.nodeFilter),fA=A.useCallback(A=>{AA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("showTopology",t)),t})},[D]),gA=A.useCallback(A=>{tA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("showNeighborLines",t)),t})},[D]),hA=A.useCallback(A=>{iA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("showMinCut",t)),t})},[D]),mA=A.useCallback(A=>{cA(e=>{const t="function"==typeof A?A(e):A;return queueMicrotask(()=>D("show3DTerrain",t)),t})},[D]),bA=A.useCallback(A=>{dA(A),queueMicrotask(()=>D("nodeFilter",A))},[D]),[pA,vA]=A.useState(null),[yA,wA]=A.useState(null),[xA,kA]=A.useState(null),[CA]=A.useState(0),[BA]=A.useState(.5),[MA]=A.useState(0),[DA,EA]=A.useState(null),[jA,QA]=A.useState(""),[NA,SA]=A.useState(!1),[FA,PA]=A.useState(!1),[TA,LA]=A.useState(()=>!(B&&!v.topologyLoadComplete)&&B);A.useEffect(()=>{if(v.topologyLoadComplete)return;const A=B&&!TA,e=C.showTopology&&!X;(A||e)&&queueMicrotask(()=>{A&&E(!1),e&&D("showTopology",!1)})},[B,C.showTopology,v.topologyLoadComplete,TA,X,E,D]);const IA=A.useCallback(A=>{LA(A),queueMicrotask(()=>E(A))},[E]),[RA,_A]=A.useState(null),zA=A.useCallback(A=>_A(A),[]),HA=A.useCallback(()=>_A(null),[]),[,OA]=A.useState(new Set),YA=Ce(A=>A.coveragePoints),WA=Ce(A=>A.isVisible),ZA=Ce(A=>A.brightness),KA=Ce(A=>A.openModal),JA=Ze(A=>A.isEnabled),qA=Ze(A=>A.toggle),XA=n(),$A=l(),Ae=A.useRef(!1);A.useEffect(()=>{YA.length>0&&WA&&!Ae.current&&(gA(!1),Ae.current=!0)},[YA.length,WA]);const ee=A.useRef(null);A.useEffect(()=>{if(a&&a!==ee.current){ee.current=a;const A=setTimeout(()=>{_A(a)},1250);return()=>clearTimeout(A)}},[a]);const[te,re]=A.useState(null),[ne,ae]=A.useState(null),se=A.useCallback((A,e,t)=>{wA(A),A&&e&&t?re({longitude:e[0],latitude:e[1],type:"topology",properties:{key:t.key,fromName:t.fromName,toName:t.toName,certainCount:t.certainCount,confidence:t.confidence,isBackbone:t.isBackbone,isLoopEdge:t.isLoopEdge,isDirectPath:t.isDirectPath,isHubConnection:t.isHubConnection,symmetryRatio:t.symmetryRatio,dominantDirection:t.dominantDirection}}):A||re(null)},[]),ue=A.useCallback((A,e)=>{ae(A),A&&re(null)},[]),de=A.useMemo(()=>{var A;if(!X)return null;if(!pA)return null;if(yA)return null;const e=b.loops;if(0===e.length)return null;const r=function(A,e,t){const r=function(A,e){return e.filter(e=>e.nodes.includes(A)).sort((A,e)=>e.avgCertainCount-A.avgCertainCount)}(A,e),n=new Set,o=[];for(const i of r)for(const A of i.edgeKeys)if(!n.has(A)){n.add(A);const e=t.get(A);o.push({key:A,certainCount:(null==e?void 0:e.certainCount)??0})}return o.sort((A,e)=>e.certainCount-A.certainCount),{loops:r,highlightedEdgeKeys:n,sortedEdges:o}}(pA,e,b.edgeMap);if(0===r.loops.length)return null;const n=r.loops[0].nodes.map(A=>{var e,r;return A===S?"You":(null==(e=t[A])?void 0:e.node_name)||(null==(r=t[A])?void 0:r.name)||A.substring(0,4)});return{loops:r.loops,highlightedEdgeKeys:r.highlightedEdgeKeys,hoveredEdgeKey:(null==(A=r.sortedEdges[0])?void 0:A.key)||"",nodeNames:n}},[X,pA,yA,b.loops,b.edgeMap,t,S]);A.useEffect(()=>{yA||ae(de)},[de,yA]);const fe=A.useMemo(()=>{const A={};for(const[e,r]of Object.entries(t))A[e]=r.node_name||r.name||e.substring(0,4);return S&&(A[S]="You"),A},[t,S]),he=A.useMemo(()=>Object.entries(t).filter(([,A])=>A.latitude&&A.longitude),[t]),me=A.useMemo(()=>{const A=new Map;S&&(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude)&&A.set(S,[r.latitude,r.longitude]);for(const[e,t]of he)t.latitude&&t.longitude&&A.set(e,[t.latitude,t.longitude]);return A},[S,r,he]),be=A.useMemo(()=>{const A=new Map;for(const e of p)"expired"!==e.status&&A.set(e.hash,{hash:e.hash,prefix:e.prefix,count:e.count,avgRssi:e.avgRssi,avgSnr:e.avgSnr,lastSeen:e.lastSeen,confidence:1,status:e.status});return A},[p]),pe=A.useMemo(()=>{var A,e;const r=new Set;for(const n of be.keys())(null==(A=t[n])?void 0:A.latitude)&&(null==(e=t[n])?void 0:e.longitude)&&r.add(n);return r},[be,t]),ve=A.useMemo(()=>{if(0===pe.size||!S)return new Map;const A=T.getPackets();if(0===A.length)return new Map;const e=I(S);return m(A,pe,e).scores},[pe,S,v.packetCount]),ye=A.useCallback(A=>!!(S&&(A.fromHash===S&&pe.has(A.toHash)||A.toHash===S&&pe.has(A.fromHash))),[S,pe]),we=A.useMemo(()=>{var A,e;if(0===p.length||!S)return[];if(v.backgroundLoadComplete)return[];const r=[];for(const n of p){if("expired"===n.status)continue;if(!(null==(A=t[n.hash])?void 0:A.latitude)||!(null==(e=t[n.hash])?void 0:e.longitude))continue;const o=[S,n.hash].sort(),i=`${o[0]}~${o[1]}`;r.push({fromHash:S,toHash:n.hash,key:i,packetCount:n.count,avgConfidence:1,strength:.8,avgRecency:1,hopDistanceFromLocal:0,isHubConnection:!1,isCertain:!0,certainCount:n.count,isLoopEdge:!1,forwardCount:n.count,reverseCount:0,symmetryRatio:0,dominantDirection:"forward",floodCount:n.count,directCount:0,isDirectPathEdge:!1,isZeroHop:!0,avgRssi:n.avgRssi,avgSnr:n.avgSnr})}return r},[p,S,v.backgroundLoadComplete,t]),xe=A.useMemo(()=>{const A=[];if(we.length>0&&!v.backgroundLoadComplete){for(const e of we){const t=me.get(e.fromHash),r=me.get(e.toHash);t&&r&&A.push({from:t,to:r,edge:e})}return A}for(const e of b.validatedEdges){if(ye(e))continue;const t=me.get(e.fromHash),r=me.get(e.toHash);t&&r&&A.push({from:t,to:r,edge:e})}return A},[b.validatedEdges,me,ye,we,v.backgroundLoadComplete]),ke=A.useMemo(()=>{const A=[];for(const e of b.weakEdges){if(ye(e))continue;const t=me.get(e.fromHash),r=me.get(e.toHash);t&&r&&A.push({from:t,to:r,edge:e})}return A},[b.weakEdges,me,ye]),Be=A.useMemo(()=>{if(!(null==r?void 0:r.latitude)||!(null==r?void 0:r.longitude))return[];const A=[],e=[r.latitude,r.longitude],n=new Map;for(const t of b.lastHopNeighbors)n.set(t.hash,t.count);const o=new Map;for(const t of p)o.set(t.hash,t.count);for(const r of pe){const i=t[r];if(!(null==i?void 0:i.latitude)||!(null==i?void 0:i.longitude))continue;const a=o.get(r),s=n.get(r);A.push({from:e,to:[i.latitude,i.longitude],hash:r,neighbor:i,lastHopData:be.get(r)??null,rxAdvertCount:a,txProxyCount:s})}return A},[r,pe,t,be,b.lastHopNeighbors,p]),Me=A.useMemo(()=>new Set(b.loopEdgeKeys),[b.loopEdgeKeys]),De=A.useMemo(()=>new Set(b.backboneEdges),[b.backboneEdges]),Ee=A.useMemo(()=>{if(!xA)return null;const A=b.validatedEdges.filter(A=>A.fromHash===xA||A.toHash===xA);if(0===A.length)return null;const e=[...A].sort((A,e)=>e.certainCount-A.certainCount),t=Math.max(1,Math.ceil(.2*e.length)),r=e.slice(0,t);return new Set(r.map(A=>A.key))},[xA,b.validatedEdges]),je=A.useMemo(()=>{let A=0;if(we.length>0&&!v.backgroundLoadComplete){for(const e of we)e.certainCount>A&&(A=e.certainCount);return A||1}for(const e of b.validatedEdges)e.certainCount>A&&(A=e.certainCount);return A||1},[b.validatedEdges,we,v.backgroundLoadComplete]),Qe=A.useMemo(()=>{if(0===b.validatedEdges.length)return null;const A=new Set;for(const r of b.validatedEdges)A.add(r.fromHash),A.add(r.toHash);const e=Array.from(A).filter(A=>me.has(A)).sort();if(e.length<3)return null;const t=new Map;for(const r of e){const A=me.get(r);A&&t.set(r,A)}return function(A,e,t,r){const n=e.length;if(n<3)return{communities:new Map([[0,e]]),nodePartitions:e.map(A=>({hash:A,community:0,fiedlerValue:0})),numCommunities:1,fiedlerValue:0,isConnected:n<=1};const o=[];let i=1/0;const a=[[e,0]];for(;a.length>0;){const[e,n]=a.shift();if((t?St(e,t):0)>20&&n<4&&e.length>=10){const o=Ft(A,e,t,r);if(o){i=Math.min(i,o.fiedlerValue),a.push([o.group0,n+1]),a.push([o.group1,n+1]);continue}}o.push(e)}const s=new Map,l=[],c=new Map;for(let u=0;u{hA(A=>{const e=!A;if(e&&Qe&&h.current){const A=h.current.getMap();if(!A)return e;let t=1/0,r=-1/0,n=1/0,o=-1/0,i=!1;for(const[,e]of Qe.communities)for(const A of e){const e=me.get(A);if(e){const[A,a]=e;n=Math.min(n,A),o=Math.max(o,A),t=Math.min(t,a),r=Math.max(r,a),i=!0}}i&&A.fitBounds([[t,n],[r,o]],{padding:{top:60,bottom:100,left:60,right:320},duration:800,maxZoom:14})}return e})},[Qe,me]),Se=A.useRef(null);A.useLayoutEffect(()=>{var A,e;Se.current=(null==(e=null==(A=h.current)?void 0:A.getMap)?void 0:e.call(A))??null});const Fe=P(),Pe=A.useMemo(()=>T.getPackets(),[Fe]);!function({map:e,nodeCoordinates:t,packets:r,localHash:n,neighbors:o,meshTopology:i,enabled:a=!0}){const s=A.useRef(null),l=e&&"current"in e?e.current:e;A.useEffect(()=>{s.current=l},[l]);const c=A.useRef(!1),u=A.useRef(null),d=A.useRef([]),f=A.useRef(0),g=A.useRef(!1),[h,m]=A.useState(!1),b=A.useRef(null),p=A.useRef([]),v=A.useRef(new Map),y=A.useRef(t);A.useEffect(()=>{y.current=t},[t]),A.useEffect(()=>{v.current=function(A,e){const t=new Map;for(const r of Object.keys(A)){const A=I(r);t.has(A)||t.set(A,r)}if(e){const A=I(e);t.set(A,e)}return t}(o,n)},[o,n]),A.useEffect(()=>{if(!a){b.current&&(clearTimeout(b.current),b.current=null),p.current=[],null!==u.current&&(cancelAnimationFrame(u.current),u.current=null),d.current=[];const A=s.current;if(A&&c.current){const e=A.getSource(tr);e&&e.setData({type:"FeatureCollection",features:[]})}g.current=!1,f.current=0}},[a]),A.useEffect(()=>{const A=l;if(!A)return;let e=null,t=!1;const r=()=>{if(!t&&!c.current)try{A.getLayer(rr)&&A.removeLayer(rr),A.getSource(tr)&&A.removeSource(tr),A.addSource(tr,{type:"geojson",data:{type:"FeatureCollection",features:[]}});const t=A.getLayer(ir)?ir:void 0;A.addLayer({id:rr,type:"line",source:tr,layout:{"line-cap":"round","line-join":"round"},paint:{"line-color":["case",["any",["==",["get","isSpeculative"],!0],["==",["get","isSpeculative"],"true"]],"#8B7BAD","#12A594"],"line-width":["case",["any",["==",["get","isSpeculative"],!0],["==",["get","isSpeculative"],"true"]],1.875,2.5],"line-opacity":["*",["get","opacityMult"],["interpolate",["linear"],["get","intensity"],0,0,.1,.8,.5,1,1,1]]}},t),c.current=!0,m(!0),e&&(clearInterval(e),e=null)}catch{}};return A.isStyleLoaded()&&r(),A.once("style.load",()=>{r()}),c.current||(e=setInterval(()=>{c.current?e&&clearInterval(e):r()},100),setTimeout(()=>{e&&(clearInterval(e),e=null)},5e3)),()=>{t=!0,e&&clearInterval(e),null!==u.current&&(cancelAnimationFrame(u.current),u.current=null);const A=s.current;if(A&&c.current){try{A.getLayer(rr)&&A.removeLayer(rr),A.getSource(tr)&&A.removeSource(tr)}catch{}c.current=!1,m(!1)}}},[l]);const w=A.useRef(()=>{});A.useEffect(()=>{w.current=()=>{const A=s.current;if(!A)return;const e=A.getSource(tr);if(!e)return;const t=performance.now(),r=d.current,n=[],o=[];for(const i of r){const A=t-i.startTime-i.delay;if(A<(i.isSpeculative?or:nr)){o.push(i);const e=i.isSpeculative?sr(A):ar(A);e>0&&n.push({type:"Feature",properties:{intensity:e,opacityMult:i.isSpeculative?.5:1,isSpeculative:i.isSpeculative??!1},geometry:{type:"LineString",coordinates:[i.fromCoord,i.toCoord]}})}}e.setData({type:"FeatureCollection",features:n}),d.current=o,o.length>0?u.current=requestAnimationFrame(()=>w.current()):u.current=null}},[]);const x=A.useCallback(()=>{const A=s.current;A&&function(A){if(!A.getLayer(rr))return;const e=A.getLayer(ir)?ir:void 0;try{A.moveLayer(rr,e)}catch{}}(A),null===u.current&&(u.current=requestAnimationFrame(()=>w.current()))},[]),k=A.useCallback(()=>{if(!s.current||!c.current)return;const A=p.current;if(p.current=[],b.current=null,0===A.length)return;const e=v.current,t=y.current;if(0===e.size)return;const r=performance.now();let o=0,a=!1;const l=new Set;for(const s of A){const A=L(s,n);if(!A||A.original.length<2)continue;const c=A.original;let u=0,f=null;for(let n=0;n0){A.sort((A,e)=>e.confidence-A.confidence);const e=Math.max(1,Math.ceil(.25*A.length)),n=A.slice(0,e),i=o+150*u;for(const{edgeKey:A,otherHash:o}of n){const e=t.get(f),n=t.get(o);d.current.push({edgeKey:A,fromCoord:lr(e),toCoord:lr(n),startTime:r,delay:i,isSpeculative:!0}),l.add(A),a=!0}}}u>0&&(o+=150*u*.5)}a&&x()},[n,i,x]);A.useEffect(()=>{const A=s.current;if(!a)return;if(!A)return;if(!h)return;if(0===r.length)return;const e=Date.now(),t=f.current;if(!g.current){g.current=!0;const A=(e-3e4)/1e3,t=r.filter(e=>(e.timestamp??0)>=A);let n=0;for(const e of r){const A=e.timestamp??0;A>n&&(n=A)}if(f.current=n,t.length>0){t.sort((A,e)=>(A.timestamp??0)-(e.timestamp??0));const A=t.slice(-20);p.current.push(...A),k()}return}const n=r.filter(A=>(A.timestamp??0)>t);if(0===n.length)return;let o=0;for(const r of n){const A=r.timestamp??0;A>o&&(o=A)}f.current=o,p.current.push(...n),b.current&&clearTimeout(b.current),b.current=setTimeout(k,175)},[a,r,k,h]),A.useEffect(()=>()=>{b.current&&clearTimeout(b.current)},[])}({map:Se,nodeCoordinates:me,packets:Pe,localHash:S,neighbors:t,meshTopology:b,enabled:JA});const{isExiting:Te,isAnimating:Le,resetAnimationState:Ie}=function({map:e,showTopology:t,validatedPolylines:r,weakPolylines:n,maxCertainCount:o,loopEdgeKeys:i,backboneEdgeKeys:a,highlightedEdgeKey:s,neighbors:l,validatedSourceId:c,weakSourceId:u,neighborPolylines:d=[],showNeighborLines:f=!0,neighborSourceId:g,neighborLinkScores:h=new Map,basemapMode:m}){const b=A.useRef(null);A.useEffect(()=>{const A=e&&"current"in e?e.current:e;b.current=A});const p=A.useRef(new Map),v=A.useRef(1),y=A.useRef(new Map),w=A.useRef(new Map),x=A.useRef(!1),k=A.useRef(null),C=A.useRef(t),B=A.useRef(new Set),M=A.useRef(""),D=A.useRef(new Map),E=A.useRef(""),j=A.useRef(""),Q=A.useRef(""),N=A.useRef(r),S=A.useRef(n),F=A.useRef(o),P=A.useRef(i),T=A.useRef(a),L=A.useRef(s),I=A.useRef(l),R=A.useRef(d),_=A.useRef(f),z=A.useRef(h),H=A.useRef(m);A.useEffect(()=>{N.current=r,S.current=n,F.current=o,P.current=i,T.current=a,L.current=s,I.current=l,R.current=d,_.current=f,z.current=h,H.current=m},[r,n,o,i,a,s,l,d,f,h,m]);const G=A.useCallback((A=!1)=>{var e,t,r,n,o,i,a,s,l,d;const f=b.current;if(!f)return;const h=f.getSource(c),m=f.getSource(u),x=f.getSource(g);if(h){const o=qt(N.current,!0,p.current,v.current,y.current,w.current,F.current,P.current,T.current,L.current,I.current,H.current),i=`${o.features.length}:${(null==(t=null==(e=o.features[0])?void 0:e.properties)?void 0:t.key)??""}:${(null==(n=null==(r=o.features[o.features.length-1])?void 0:r.properties)?void 0:n.key)??""}:${Array.from(p.current.values()).reduce((A,e)=>A+e,0).toFixed(2)}`;(A||i!==E.current)&&(h.setData(o),E.current=i)}if(m){const e=qt(S.current,!1,p.current,v.current,y.current,w.current,F.current,P.current,T.current,L.current,I.current,H.current),t=`${e.features.length}:${(null==(i=null==(o=e.features[0])?void 0:o.properties)?void 0:i.key)??""}:${(null==(s=null==(a=e.features[e.features.length-1])?void 0:a.properties)?void 0:s.key)??""}`;(A||t!==j.current)&&(m.setData(e),j.current=t)}if(x&&R.current.length>0){const e=Xt(R.current,z.current),t=`${e.features.length}:${(null==(d=null==(l=e.features[0])?void 0:l.properties)?void 0:d.hash)??""}`;(A||t!==Q.current)&&(x.setData(e),Q.current=t)}},[c,u,g]),U=A.useCallback(()=>{k.current&&(cancelAnimationFrame(k.current),k.current=null),p.current=new Map,v.current=1,y.current=new Map,w.current=new Map,x.current=!1,B.current=new Set,M.current="",D.current=new Map},[]);A.useEffect(()=>{const A=C.current,e=t;if(C.current=t,b.current){if(k.current&&(cancelAnimationFrame(k.current),k.current=null),A&&!e&&!x.current){x.current=!0;const A=new Map(p.current);let e=null;const t=r=>{e||(e=r);const n=r-e,o=Math.min(n/500,1),i=(a=o,1-Math.pow(1-a,3));var a;for(const[e,t]of A)p.current.set(e,t*(1-i));G(!0),o<1?k.current=requestAnimationFrame(t):(x.current=!1,p.current=new Map,B.current=new Set,M.current="",y.current=new Map,w.current=new Map,k.current=null,G(!0))};k.current=requestAnimationFrame(t)}!A&&e&&(p.current=new Map,B.current=new Set,M.current="")}},[t,G]),A.useEffect(()=>{const A=b.current;if(!t||x.current||!A)return;const e=[...r,...n],o=e.map(A=>`${A.edge.key}:${A.edge.certainCount}`).sort().join(","),i=0===B.current.size,a=""!==M.current&&M.current!==o;if(!i&&!a)return void G();const s=[],l=[];for(const{edge:t}of e)B.current.has(t.key)?l.push(t.key):s.push(t.key);a&&l.length>0&&(y.current=new Map(D.current),v.current=0),w.current=new Map;for(const{edge:t}of r){const A=UA(t.certainCount);w.current.set(t.key,A)}for(const t of s)p.current.set(t,0);for(const t of l)p.current.has(t)||p.current.set(t,1);if(s.length>0||a&&l.length>0){k.current&&(cancelAnimationFrame(k.current),k.current=null);let A=null;const e=Math.min(100,VA/Math.max(s.length,1)/2),t=r=>{A||(A=r);const n=r-A;for(let A=0;A0){const A=Math.min(n/VA,1);v.current=Jt(A)}G(!0);const o=VA+(s.length-1)*e;k.current=n{const A=b.current;if(!A||!g)return;const e=()=>{const e=A.getSource(g);if(!e)return!1;if(d.length>0){const A=Xt(d,h);e.setData(A)}else e.setData({type:"FeatureCollection",features:[]});return!0};if(e())return;const t=r=>{r.sourceId===g&&e()&&A.off("sourcedata",t)};A.on("sourcedata",t);const r=()=>{e()&&(A.off("styledata",r),A.off("sourcedata",t))};return A.on("styledata",r),()=>{A.off("sourcedata",t),A.off("styledata",r)}},[g,d,h]);const O=A.useRef(m);return A.useEffect(()=>{m!==O.current&&(O.current=m,E.current="",j.current="",Q.current="",G(!0))},[m,G]),A.useEffect(()=>()=>{k.current&&(cancelAnimationFrame(k.current),k.current=null)},[]),{isExiting:x.current,isAnimating:null!==k.current,resetAnimationState:U,weightAnimProgress:v.current,animStartWeights:y.current,animTargetWeights:w.current}}({map:Se,showTopology:X,validatedPolylines:xe,weakPolylines:ke,maxCertainCount:je,loopEdgeKeys:Me,backboneEdgeKeys:De,highlightedEdgeKey:f,neighbors:t,validatedSourceId:Rr,weakSourceId:_r,neighborPolylines:Be,showNeighborLines:eA,neighborSourceId:zr,neighborLinkScores:ve,basemapMode:XA}),ze=A.useMemo(()=>{const A=new Set;for(const e of b.hubNodes){A.add(e);for(const t of b.validatedEdges)t.fromHash===e&&A.add(t.toHash),t.toHash===e&&A.add(t.fromHash)}return A},[b.hubNodes,b.validatedEdges]),He=A.useMemo(()=>{const A=new Set;if(!o)return A;for(const e of b.validatedEdges)e.fromHash===o&&A.add(e.toHash),e.toHash===o&&A.add(e.fromHash);return A},[o,b.validatedEdges]),{getNodeOpacity:Ge}=function({soloDirect:e,soloHubs:t,neighborHashes:r,hubConnectedNodes:n,directNodeSet:o,localConnectedNodes:i,showTopology:a}){const[s,l]=A.useState(new Map),c=A.useRef(e),u=A.useRef(t),d=A.useRef(new Map),f=A.useRef(null),g=A.useRef(n),h=A.useRef(o),m=A.useRef(i),b=A.useRef(a);return A.useEffect(()=>{g.current=n,h.current=o,m.current=i,b.current=a},[n,o,i,a]),A.useEffect(()=>{const A=c.current,n=u.current,o=e,i=t;if(c.current=e,u.current=t,A===o&&n===i)return;f.current&&(cancelAnimationFrame(f.current),f.current=null);const a=g.current,s=h.current,p=m.current,v=b.current;for(const e of r)d.current.has(e)||d.current.set(e,Math.random());const y=(A,e,t)=>{const r=a.has(A),n=s.has(A),o=v&&p.has(A);return!e&&!t||(e&&t?r||n||o:t?r:!e||n||o)},w=[];for(const e of r){const t=y(e,A,n),r=y(e,o,i);t!==r&&w.push({hash:e,startOpacity:t?1:0,targetOpacity:r?1:0})}if(0===w.length)return;l(A=>{const e=new Map(A);for(const{hash:t,startOpacity:r}of w)e.set(t,r);return e});const x=w;let k=null;const C=A=>{k||(k=A);const e=A-k;let t=!0;l(()=>{const A=new Map;for(const{hash:r,startOpacity:n,targetOpacity:o}of x){const i=250*(d.current.get(r)??0),a=Math.max(0,e-i),s=Math.min(a/500,1),l=n+(o-n)*$t(s);A.set(r,l),s<1&&(t=!1)}return A}),e<750&&!t?f.current=requestAnimationFrame(C):(f.current=null,l(new Map))};return f.current=requestAnimationFrame(C),()=>{f.current&&(cancelAnimationFrame(f.current),f.current=null)}},[e,t,r]),{nodeOpacities:s,getNodeOpacity:(A,e)=>s.has(A)?s.get(A):e?1:0}}({soloDirect:"direct"===uA,soloHubs:"hubs"===uA,neighborHashes:he.map(([A])=>A),hubConnectedNodes:ze,directNodeSet:pe,localConnectedNodes:He,showTopology:X}),{blinkingNodes:Ue,blinkColor:Oe}=function({neighbors:e,localHash:t,enabled:r=!0}){const[n,o]=A.useState(new Map),i=P(),a=A.useRef(T.getPackets());A.useEffect(()=>{a.current=T.getPackets()},[i]);const s=A.useRef(0),l=A.useRef(null),c=A.useRef(new Map),u=A.useRef(new Map);A.useEffect(()=>{u.current=function(A){const e=new Map;for(const t of Object.keys(A)){const A=I(t);e.has(A)||e.set(A,t)}return e}(e)},[e]);const d=A.useRef(null);return A.useEffect(()=>{d.current=()=>{const A=performance.now(),e=c.current;if(0===e.size)return l.current=null,void o(new Map);const t=new Map,r=[];for(const[n,{startTime:o,staggerDelay:i}]of e){const e=A-o-i;if(e<0);else if(e>=750)r.push(n);else{const A=Ar(e,750);A>0&&t.set(n,A)}}for(const n of r)e.delete(n);o(t),e.size>0&&d.current?l.current=requestAnimationFrame(d.current):l.current=null}},[]),A.useEffect(()=>{if(!r)return;const A=a.current;if(0===A.length)return;const e=s.current,n=A.filter(A=>(A.timestamp??0)>e);if(0===e){const e=A.reduce((A,e)=>Math.max(A,e.timestamp??0),0);return void(s.current=e)}if(0===n.length)return;const o=n.reduce((A,e)=>Math.max(A,e.timestamp??0),0);s.current=o;const i=performance.now();let f=0;for(const r of n){const A=L(r,t);if(!A||0===A.original.length)continue;const e=er(A.original,u.current,t);if(0===e.length)continue;const n=375;for(let t=0;t()=>{null!==l.current&&(cancelAnimationFrame(l.current),l.current=null)},[]),{blinkingNodes:n,blinkColor:"#00FF00"}}({neighbors:t,localHash:o,enabled:JA}),Ye=A.useCallback(A=>{if("all"===uA)return!0;if("direct"===uA)return pe.has(A);if("hubs"===uA){if(b.hubNodes.includes(A))return!0;for(const e of b.validatedEdges){if(e.fromHash===A&&b.hubNodes.includes(e.toHash))return!0;if(e.toHash===A&&b.hubNodes.includes(e.fromHash))return!0}return!1}return!0},[uA,pe,b.hubNodes,b.validatedEdges]),We=A.useCallback(()=>{PA(!0),SA(!0)},[]),Ke=A.useCallback(()=>{TA?fA(A=>!A):We()},[TA,We]),Je=A.useCallback(A=>{W(A.viewState),(A.viewState.pitch??0)>10&&!lA&&mA(!0)},[lA]),qe=A.useCallback(()=>{q(A=>{var e,t,r,n,o,i,a;const s=!A,l=null==(r=null==(t=null==(e=h.current)?void 0:e.getContainer())?void 0:t.closest(".map-container-fullscreen, .map-container-16-9"))?void 0:r.parentElement;return s?l&&document.fullscreenEnabled?null==(n=l.requestFullscreen)||n.call(l).catch(()=>{}):l&&document.webkitFullscreenEnabled&&(null==(o=l.webkitRequestFullscreen)||o.call(l)):document.fullscreenElement?null==(i=document.exitFullscreen)||i.call(document).catch(()=>{}):document.webkitFullscreenElement&&(null==(a=document.webkitExitFullscreen)||a.call(document)),s})},[]),Xe=A.useCallback(A=>{bA(A)},[]),$e=A.useCallback(()=>{gA(A=>!A)},[]),At=A.useCallback(()=>{nA(A=>!A)},[]),et=A.useCallback(()=>{mA(A=>{const e=!A;if(h.current){const A=h.current.getMap();A&&A.stop()}if(e&&h.current){const A=h.current.getMap();A&&A.easeTo({pitch:45,duration:1500,easing:A=>1-Math.pow(1-A,3)})}if(!e&&h.current){const A=h.current.getMap();A&&A.easeTo({pitch:0,bearing:0,duration:800,easing:A=>1-Math.pow(1-A,2)})}return e})},[]),tt=A.useCallback(()=>{X||fA(!0)},[X]),rt=A.useCallback((A,e)=>{EA(A),QA(e)},[]),nt=A.useCallback(()=>{DA&&i&&i(DA),EA(null),QA("")},[DA,i]),ot=A.useMemo(()=>[...Zr,...Ir],[]),it=A.useRef(!1);A.useEffect(()=>{it.current="ontouchstart"in window||navigator.maxTouchPoints>0},[]);const at=A.useCallback(A=>{A.features&&0!==A.features.length||(it.current&&te&&(re(null),wA(null)),xA&&kA(null))},[te,xA]),st=A.useCallback(A=>{kA(e=>e===A?null:A)},[]),lt=A.useCallback(A=>{var e,t;if(!A.features||0===A.features.length)return;if(A.features.some(A=>{var e,t;return null==(t=null==(e=A.layer)?void 0:e.id)?void 0:t.startsWith("node-markers-")}))return void(yA&&(wA(null),re(null)));const r=A.features.find(A=>{var e;const t=null==(e=A.layer)?void 0:e.id;return(null==t?void 0:t.startsWith("topology-"))||(null==t?void 0:t.startsWith("neighbor-"))});if(!r)return;const n=null==(e=r.layer)?void 0:e.id,o=r.properties;if(!(null==o?void 0:o.key))return;const i=null==n?void 0:n.startsWith("topology-"),a=null==n?void 0:n.startsWith("neighbor-");if(i||a){const e=o.key.replace(/-loop[12]$/,"");wA(e),A.lngLat&&re({longitude:A.lngLat.lng,latitude:A.lngLat.lat,type:i?"topology":"neighbor",properties:o})}try{(null==(t=h.current)?void 0:t.getCanvas())&&(h.current.getCanvas().style.cursor="pointer")}catch{}},[yA]),ct=A.useCallback(()=>{var A;wA(null),re(null);try{(null==(A=h.current)?void 0:A.getCanvas())&&(h.current.getCanvas().style.cursor="")}catch{}},[]),ut=J?"map-container-fullscreen":"map-container-16-9",dt=F.length>0||(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude),ft=!w||!dt,gt=dt;return e.jsxs("div",{className:`relative ${ut}`,role:"application","aria-label":"Mesh network contacts map","aria-describedby":"map-instructions","data-basemap":XA,children:[e.jsx("span",{id:"map-instructions",className:"sr-only",children:"Interactive map showing mesh network contacts. Use mouse or touch to pan and zoom. Press Tab to navigate map controls. Press Escape to exit fullscreen mode."}),ft&&e.jsx("div",{className:"absolute inset-0 z-50 surface-base rounded-2xl flex items-center justify-center","aria-hidden":"true",children:e.jsxs("div",{className:"flex flex-col items-center gap-3",children:[e.jsx("div",{className:"w-6 h-6 border-2 border-accent-primary border-t-transparent rounded-full animate-spin"}),e.jsx("span",{className:"text-sm text-text-muted",children:"Loading map..."})]})}),gt&&e.jsx("div",{className:`relative w-full h-full ${J?"":"rounded-[1.125rem] overflow-hidden"} ${ft?"opacity-0":"opacity-100 transition-opacity duration-300"}`,children:e.jsxs(c,{ref:h,...z,onMove:Je,mapStyle:$r,style:{width:"100%",height:"100%"},attributionControl:!1,interactiveLayerIds:ot,onMouseMove:lt,onMouseLeave:ct,onClick:at,onError:A=>{},onIdle:()=>{if(!N&&!Q&&h.current){const A=h.current.getMap();if(A){const e=Object.values(t).filter(A=>A.latitude&&A.longitude).map(A=>({latitude:A.latitude,longitude:A.longitude}));(null==r?void 0:r.latitude)&&(null==r?void 0:r.longitude)&&e.push({latitude:r.latitude,longitude:r.longitude}),e.length>0&&j(e,A)}}},children:[e.jsx(u,{position:"bottom-right"}),e.jsx(d,{mode:XA}),e.jsx(Mt,{enabled:lA,exaggeration:4}),e.jsx(yt,{coveragePoints:YA,visible:YA.length>0&&WA,terrainEnabled:lA,brightness:ZA,basemapMode:XA}),e.jsx(Ot,{partition:Qe,nodeCoordinates:me,visible:oA&&TA,opacity:aA.opacity,bandwidth:aA.bandwidth,threshold:aA.threshold,strokeWidth:aA.strokeWidth}),e.jsx(Wr,{showTopology:X,isExiting:Te,hoveredEdgeKey:yA,highlightedLoopEdges:null==ne?void 0:ne.highlightedEdgeKeys,highlightedFocusEdges:Ee,onEdgeHover:se,onLoopHover:ue,loops:b.loops,neighborNames:fe,opacityBias:CA,widthMultiplier:BA,trafficFilter:MA,showNeighborLines:eA,disableHover:Le||FA}),a&&e.jsx(Kr,{targetHash:a,nodeCoordinates:me,onComplete:s}),f&&e.jsx(Jr,{highlightedEdgeKey:f,validatedPolylines:xe,weakPolylines:ke,onEnsureTopology:tt}),e.jsx(Xr,{ghost:g??null,neighborCoordinates:me,onHighlightedNeighborsChange:OA}),e.jsx(Lr,{neighborsWithLocation:he,localNode:r,localHash:o,zeroHopNeighbors:pe,lastHopNeighborMap:be,meshTopology:b,hoveredMarker:pA,onMarkerHover:vA,getNodeOpacity:Ge,shouldShowNode:Ye,onRequestRemove:i?rt:void 0,openPopupId:RA,onOpenPopup:zA,onClosePopup:HA,onNodeClick:st,blinkingNodes:Ue,blinkColor:Oe})]})}),(()=>{const A=function(A,e,t){if(e){const A=e.loops[0],t=e.loops.length,r=[{label:"hops",value:A.size},{label:"seen",value:A.minCertainCount}],n=[];return A.includesLocal&&n.push({text:"★ Includes your node",color:"text-amber-400"}),t>1&&n.push({text:`+${t-1} overlapping`,color:"text-violet-400/70"}),{type:"loop",title:{icon:"⟳",text:"Redundant Path"+(t>1?"s":""),color:"text-violet-400"},subtitle:{text:`${e.nodeNames.join(" → ")} → ${e.nodeNames[0]}`,color:"text-text-secondary",mono:!0},stats:r,badges:n}}if("neighbor"===(null==A?void 0:A.type)){const e=A.properties,t=[];void 0!==e.rssi&&null!==e.rssi&&t.push({label:"RSSI",value:`${Math.round(e.rssi)} dBm`,unit:e.hasAvgRssi?"avg":void 0}),void 0!==e.snr&&null!==e.snr&&t.push({label:"SNR",value:`${Number(e.snr).toFixed(1)} dB`,unit:e.hasAvgSnr?"avg":void 0});const r=e.listenerScore??0,n=e.loudScore??0,o=r>0||n>0;return o&&(t.push({label:"listener",value:r,color:"text-accent-success"}),t.push({label:"loud",value:n,color:"text-accent-danger"})),void 0===e.packetCount||o||t.push({label:"packets",value:Number(e.packetCount).toLocaleString()}),{type:"neighbor",title:{icon:"●",text:e.prefix?`${e.name} (${e.prefix})`:e.name,color:"text-amber-400"},subtitle:{text:"Direct RF Neighbor",color:"text-amber-400/70"},stats:t,badges:[]}}if("topology"===(null==A?void 0:A.type)){const e=A.properties,r=t>0?Number(e.certainCount)/t:0,n=[{label:"validations",value:e.certainCount},{label:"of max traffic",value:`${Math.round(100*r)}%`},{label:"confidence",value:`${Math.round(100*Number(e.confidence))}%`}];if(void 0!==e.symmetryRatio&&e.symmetryRatio<1){const A="forward"===e.dominantDirection?"→":"reverse"===e.dominantDirection?"←":"↔";n.push({label:"symmetric",value:`${A} ${Math.round(100*e.symmetryRatio)}%`,color:"text-text-muted"})}const o=[];return e.isBackbone&&o.push({text:"Backbone",color:"text-gray-300"}),e.isLoopEdge&&o.push({text:"Redundant",color:"text-violet-400"}),e.isDirectPath&&o.push({text:"Direct Path",color:"text-teal-400"}),{type:"topology",title:{icon:"",text:`${e.fromName} ↔ ${e.toName}`,color:"text-text-primary"},stats:n,badges:o}}return null}(te?{type:te.type,properties:te.properties}:null,ne,je);return A&&e.jsx("div",{className:"map-edge-tooltip",children:e.jsx("div",{className:"map-control-glass map-edge-tooltip-inner",children:e.jsx(en,{data:A})})})})(),e.jsx(ie,{mapRef:h,showNeighborLines:eA,onToggleNeighborLines:$e,hasNeighborPolylines:Be.length>0,nodeFilter:uA,onNodeFilterChange:Xe,hasHubNodes:b.hubNodes.length>0,hasZeroHopNeighbors:pe.size>0,showCoverage:rA,onToggleCoverage:At,showMinCut:oA,onToggleMinCut:Ne,hasMinCutData:TA&&null!==Qe&&Qe.numCommunities>1,show3DTerrain:lA,onToggle3DTerrain:et,basemapMode:XA,onToggleBasemap:$A,isFullscreen:J,onToggleFullscreen:qe}),e.jsxs("div",{className:"map-legend-stack",children:[e.jsx(le,{isActive:X,hasAnalyzed:TA,isLoading:FA,onClick:Ke,basemapMode:XA}),e.jsx(ce,{isActive:JA,onClick:qA,basemapMode:XA}),e.jsx(ge,{isActive:YA.length>0&&WA,onClick:KA,basemapMode:XA}),e.jsx(oe,{showTopology:X,validatedPolylineCount:xe.length,filteredNeighborCount:he.length,hasLocalNode:!(!(null==r?void 0:r.latitude)||!(null==r?void 0:r.longitude)),meshTopology:b,zeroHopNeighbors:pe,neighborsWithLocation:he,basemapMode:XA})]}),!J&&e.jsx("div",{className:"glass-card-frame absolute inset-0 pointer-events-none rounded-[1.125rem]",style:{zIndex:9999},"aria-hidden":"true"}),e.jsx(Z,{isOpen:null!==DA,onCancel:()=>EA(null),onConfirm:nt,title:"Remove Node?",message:`Remove "${jA}" from the contacts list? This will hide the node until it sends a new packet.`,confirmLabel:"Remove",cancelLabel:"Cancel",variant:"danger"}),e.jsx($,{isOpen:NA,onClose:()=>{SA(!1),PA(!1),Ie(),IA(!0),setTimeout(()=>fA(!0),150)}}),e.jsx(Re,{}),e.jsx(Ve,{visible:oA&&TA,onClose:()=>hA(!1),settings:aA,onSettingsChange:sA,partition:Qe,totalNodes:Object.keys(t).length,basemapMode:XA})]})}export{tn as default}; diff --git a/frontend/dist/assets/Dashboard-BSUVzNBC.js b/frontend/dist/assets/Dashboard-BSUVzNBC.js deleted file mode 100644 index 4fa26aea..00000000 --- a/frontend/dist/assets/Dashboard-BSUVzNBC.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e,j as t,c as s,R as n,g as a,Y as i,i as l}from"./vendor-react-DFCqJxYC.js";import{c as r,a as o,f as c,b as d,J as m,u,d as h,e as x,h as f,M as p,j as g,k as v,A as j,m as y,S as b,B as N,n as w,o as k,p as M,q as C,w as B,R as S,L as T,r as L,t as _,v as D,D as R,x as F,y as A,z as H,T as $,C as P,E,F as z,G as I,H as W,I as O,K as q,N as V,O as U,Q as G,U as K,V as J,W as Y,X as Q}from"./index-CZBrdv20.js";import{C as X,S as Z,a as ee,P as te,b as se,B as ne}from"./PageLayout-Dz1NyqHa.js";import{u as ae}from"./useThemeColors-CzhUM4y-.js";import{S as ie,M as le,c as re}from"./link-scoring-BY8TYwtV.js";import{A as oe,E as ce,T as de}from"./TimeRangeSelector-CDHWyMqL.js";import{S as me,A as ue,P as he,T as xe}from"./PacketList-C0Zwn6jt.js";import{T as fe,a as pe,M as ge,b as ve}from"./trending-up-xQoBxaWx.js";import{C as je,a as ye}from"./DataBox-BuwfTaKv.js";import{L as be,b as Ne}from"./vendor-core-Dhs13Wlh.js";import{s as we,C as ke}from"./SignalIndicator-FtRKgdkw.js";import{Z as Me}from"./zap-DOkzycJm.js";import{N as Ce}from"./NodeInformationCard-D_WIPYcK.js";import{C as Be}from"./chevron-right-CchtyLvr.js";import{H as Se}from"./route-CHkUVMnV.js";import{L as Te}from"./loader-circle-BLG0SL8e.js";import{u as Le}from"./index-BKfnA8uz.js";import{H as _e}from"./house-BPemXMFi.js";import{R as De,C as Re}from"./Grid-TNw012c2.js";import{C as Fe}from"./Card-BiYlryJL.js";import"./deckgl-DTsmDcfs.js";import"./arrow-up-Bv56Dbd2.js";import"./map-pin-BnrkOs2D.js";import"./triangle-alert-DlaBoont.js";import"./packet-CCmg5Y4j.js";import"./chevron-up-Cn6bmTpb.js";import"./circle-check-BQrKpAc_.js";const Ae=r("arrow-up-right",[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]),He=r("audio-waveform",[["path",{d:"M2 13a2 2 0 0 0 2-2V7a2 2 0 0 1 4 0v13a2 2 0 0 0 4 0V4a2 2 0 0 1 4 0v13a2 2 0 0 0 4 0v-4a2 2 0 0 1 2-2",key:"57tc96"}]]),$e=r("ear",[["path",{d:"M6 8.5a6.5 6.5 0 1 1 13 0c0 6-6 6-6 10a3.5 3.5 0 1 1-7 0",key:"1dfaln"}],["path",{d:"M15 8.5a2.5 2.5 0 0 0-5 0v1a2 2 0 1 1 0 4",key:"1qnva7"}]]),Pe=r("megaphone",[["path",{d:"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z",key:"q8bfy3"}],["path",{d:"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14",key:"1853fq"}],["path",{d:"M8 6v8",key:"15ugcq"}]]),Ee=r("message-square-text",[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}],["path",{d:"M7 11h10",key:"1twpyw"}],["path",{d:"M7 15h6",key:"d9of3u"}],["path",{d:"M7 7h8",key:"af5zfr"}]]),ze=r("satellite-dish",[["path",{d:"M4 10a7.31 7.31 0 0 0 10 10Z",key:"1fzpp3"}],["path",{d:"m9 15 3-3",key:"88sc13"}],["path",{d:"M17 13a6 6 0 0 0-6-6",key:"15cc6u"}],["path",{d:"M21 13A10 10 0 0 0 11 3",key:"11nf8s"}]]),Ie=r("square-activity",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M17 12h-2l-2 5-2-10-2 5H7",key:"15hlnc"}]]),We=r("timer",[["line",{x1:"10",x2:"14",y1:"2",y2:"2",key:"14vaq8"}],["line",{x1:"12",x2:"15",y1:"14",y2:"11",key:"17fdiu"}],["circle",{cx:"12",cy:"14",r:"8",key:"1e1u0o"}]]);function Oe(e,t){return t?e+t:e}function qe(e){return"number"==typeof e?e:parseFloat(e)}function Ve(e,t){const s=Le(t()),n=()=>s.set(t());return n(),u(()=>{const t=()=>c.preRender(n,!1,!0),s=e.map(e=>e.on("change",t));return()=>{s.forEach(e=>e()),h(n)}}),s}function Ue(e,t){const s=f(()=>[]);return Ve(e,()=>{s.length=0;const n=e.length;for(let t=0;td(t)?t.get():t;if(n)return function(e,t,s,n){if("function"==typeof e)return function(e){x.current=[],e();const t=Ve(x.current,e);return x.current=void 0,t}(e);const a=function(...e){const t=!Array.isArray(e[0]),s=t?0:-1,n=e[0+s],a=e[1+s],i=e[2+s],l=e[3+s],r=o(a,i,l);return t?r(n):r}(t,s,n);return Array.isArray(e)?Ue(e,a):Ue([e],([e])=>a(e))}(a);const i=Le(a());return e.useInsertionEffect(()=>function(e,t,s={}){const n=e.get();let a,i=null,l=n;const r="string"==typeof n?n.replace(/[\d.-]/g,""):void 0,o=()=>{i&&(i.stop(),i=null)};if(e.attach((t,n)=>{l=t,a=e=>n(Oe(e,r)),c.postRender(()=>{var t;(()=>{o();const t=qe(e.get()),n=qe(l);t!==n&&(i=new m({keyframes:[t,n],velocity:e.getVelocity(),type:"spring",restDelta:.001,restSpeed:.01,...s,onUpdate:a}))})(),null==(t=e.events.animationStart)||t.notify(),null==i||i.then(()=>{var t;null==(t=e.events.animationComplete)||t.notify()})})},o),d(t)){const s=t.on("change",t=>e.set(Oe(t,r))),n=e.on("destroy",s);return()=>{s(),n()}}return o}(i,t,s),[i,JSON.stringify(s)]),i}(t,{type:"spring",...s})}function Ke(e){return e<1024?`${e}B`:e<1048576?`${(e/1024).toFixed(1)}K`:`${(e/1048576).toFixed(1)}M`}const Je=e.memo(function({items:e,direction:n="horizontal",size:a="sm",className:i,highlightedKey:l,onItemClick:r,onItemHover:o}){const c="horizontal"===n,d="sm"===a;return t.jsx("div",{className:s("flex font-mono",c?"flex-wrap gap-x-4 gap-y-1":"flex-col gap-1",d?"text-xs":"text-sm",i),children:e.map(e=>{const n=null!=l&&l!==e.key,a=r||o;return t.jsxs("div",{className:s("flex items-center gap-1.5 transition-opacity",n&&"opacity-30",a&&"cursor-pointer hover:opacity-80"),onClick:()=>null==r?void 0:r(e.key),onMouseEnter:()=>null==o?void 0:o(e.key),onMouseLeave:()=>null==o?void 0:o(null),children:[t.jsx("div",{className:s("shrink-0 rounded-xs",d?"w-3 h-3":"w-4 h-4"),style:{backgroundColor:e.color}}),t.jsx("span",{className:"text-text-secondary whitespace-nowrap",children:e.label}),void 0!==e.value&&t.jsx("span",{className:"text-text-muted tabular-nums",children:e.formatValue?e.formatValue(e.value):e.value})]},e.key)})})}),Ye="#AD7F58",Qe={4:"#3B82F6",5:"#5B5BD6",6:"#8E4EC6",0:"#00A2C7",2:"#12A594",7:"#46A758",1:"#F5D90A",10:"#FFB224",8:"#F76B15",9:"#E5484D",3:"#D6409F",15:Ye},Xe=Ye;function Ze(e){return Qe[e]??Xe}function et({activeTypes:e,totalByType:s}){const n=[...e].reverse().map(e=>({key:String(e),label:g[e]??`TYPE_${e}`,color:Ze(e),value:s[e]??0,formatValue:e=>Ke(e)}));return t.jsx(Je,{items:n})}const tt=e.memo(function({buckets:s,activeTypes:n,onHover:a,gridColor:i="rgba(255,255,255,0.1)",axisTickColor:l="rgba(255,255,255,0.6)"}){const r=e.useRef(null),o=e.useRef(s),c=e.useRef(n);o.current=s,c.current=n;const d=e.useMemo(()=>[s.map(e=>e.start),s.map(()=>1)],[s]);return e.useEffect(()=>{if(!r.current||0===s.length)return;const e=r.current,t=e.getBoundingClientRect(),n={width:Math.floor(t.width)||400,height:Math.floor(t.height)||200,padding:[8,8,28,48],cursor:{show:!0,x:!0,y:!1,points:{show:!1}},scales:{x:{time:!1},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],legend:{show:!1},hooks:{draw:[e=>{const t=e.ctx,{left:s,top:n,width:a,height:r}=e.bbox,d=window.devicePixelRatio||1;!function(e,t,s,n,a,i,l){if(0===t.length||0===s.length)return;const r=t.length,o=i/r;let c=0;for(const d of t)d.totalBytes>c&&(c=d.totalBytes);0===c&&(c=1);for(let d=0;dc&&(c=g.totalBytes);if(0===c)return;const d=getComputedStyle(document.documentElement).getPropertyValue("--font-data").trim()||'"JetBrains Mono", ui-monospace, monospace';e.save(),e.strokeStyle=l,e.lineWidth=1*o,e.setLineDash([]);const m=[0,.25,.5,.75,1];for(const g of m){const t=Math.round(n+i*(1-g))+.5;e.beginPath(),e.moveTo(s,t),e.lineTo(s+a,t),e.stroke()}e.restore(),e.save(),e.font=`bold ${10*o}px ${d}`,e.fillStyle=r,e.textBaseline="middle",e.textAlign="left";const u=4*o;for(const g of m){if(0===g)continue;const t=n+i*(1-g),s=Ke(Math.round(c*g));e.fillText(s,u,t)}e.restore(),e.save(),e.font=`${12*o}px ${d}`,e.fillStyle=r,e.textBaseline="top",e.textAlign="center";const h=8*o,x=t.length,f=Math.max(1,Math.floor(x/6)),p=a/x;for(let g=0;g{const t=e.cursor.idx,s=e.cursor.left,n=e.bbox.width/(window.devicePixelRatio||1),i=null!=s&&n>0?Math.max(0,Math.min(1,s/n)):null;null!=t&&t>=0&&t{const t=e.getBoundingClientRect();t.width>0&&t.height>0&&m.setSize({width:Math.floor(t.width),height:Math.floor(t.height)})});return u.observe(e),()=>{u.disconnect(),m.destroy()}},[d,i,l,a,s.length]),0===s.length?t.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):t.jsx("div",{ref:r,className:"w-full h-full",onMouseLeave:()=>null==a?void 0:a(null,null,null)})});function st({packets:s,rangeMinutes:n,bucketCount:a}){const i=ae(),[l,r]=e.useState(null),[o,c]=e.useState(null),[d,m]=e.useState(null),{buckets:u,activeTypes:h,totalByType:x}=e.useMemo(()=>function(e,t,s){const n=Date.now()/1e3,a=60*t,i=n-a,l=a/s,r=[];for(let c=0;cn)continue;const t=Math.min(s-1,Math.floor((e-i)/l)),a=c.type??c.payload_type??0,d=c.length??c.payload_length??0,m=r[t];m.bytesByType[a]=(m.bytesByType[a]??0)+d,m.totalBytes+=d,o[a]=(o[a]??0)+d}return{buckets:r,activeTypes:Object.keys(o).map(e=>parseInt(e,10)).filter(e=>o[e]>0).sort((e,t)=>o[t]-o[e]),totalByType:o}}(s,n,a),[s,n,a]),f=e.useCallback((e,t,s)=>{r(t),c(s)},[]);if(0===u.length||0===h.length)return t.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No packet data"});const p=l?function(e){const t=new Date(1e3*e).getHours();return t>=6&&t<18}(l.start):null,g=l?(v=l.start,new Date(1e3*v).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1})):"";var v;const b=null!==d&&null!==p&&d!==p;return p!==d&&m(p),t.jsxs("div",{className:"flex flex-col h-full relative",children:[t.jsx("div",{className:"h-5 relative mb-1",children:l&&null!==o&&t.jsxs("div",{className:"absolute flex items-center gap-1.5 text-sm font-mono tabular-nums -translate-x-1/2",style:{left:`calc(48px + ${100*o}% * (1 - 48px / 100%))`},children:[t.jsx(j,{mode:"wait",children:t.jsx(y.span,{initial:!!b&&{opacity:0,scale:.5,rotate:-90},animate:{opacity:1,scale:1,rotate:0},exit:{opacity:0,scale:.5,rotate:90},transition:{duration:.25,ease:"easeOut"},children:p?t.jsx(ie,{className:"w-4 h-4 text-amber-400"}):t.jsx(le,{className:"w-4 h-4 text-blue-400"})},p?"sun":"moon")}),t.jsx("span",{className:"text-text-secondary",children:g})]})}),t.jsx("div",{className:"flex-1 min-h-0",children:t.jsx(tt,{buckets:u,activeTypes:h,gridColor:i.grid,axisTickColor:i.axisTick,onHover:f})}),t.jsxs("div",{className:"pt-2 px-1 pb-2",children:[" ",t.jsx(et,{activeTypes:h,totalByType:x})]})]})}const nt=e.memo(function({buckets:s,activeTypes:n}){const a=e.useRef(null),i=e.useRef(s),l=e.useRef(n);i.current=s,l.current=n;const r=e.useMemo(()=>[s.map(e=>e.start),s.map(()=>1)],[s]);return e.useEffect(()=>{if(!a.current||0===s.length)return;const e=a.current,t=e.getBoundingClientRect(),n=Math.floor(t.width)||200,o=Math.floor(t.height)||60,c=new v({width:n,height:o,padding:[0,0,0,0],cursor:{show:!1},scales:{x:{time:!1},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],legend:{show:!1},hooks:{draw:[e=>{const t=e.ctx,{left:s,top:n,width:a,height:r}=e.bbox;!function(e,t,s,n,a,i,l){if(0===t.length)return;const r=function(e,t,s){var n,a;if(e.length<=s)return e;const i=e.length/s,l=[];for(let r=0;r0&&(d.bytesByType[s]=(d.bytesByType[s]??0)+t)}}l.push(d)}return l}(t,s,b.statsCard),o=r.length,c=i/o,d=r.map(e=>e.totalBytes).filter(e=>e>0);if(0===d.length)return;const m=Math.max(...d),u=Math.min(...d),h=m-u;for(let x=0;x{const t=e.getBoundingClientRect();t.width>0&&t.height>0&&c.setSize({width:Math.floor(t.width),height:Math.floor(t.height)})});return d.observe(e),()=>{d.disconnect(),c.destroy()}},[r,s.length]),0===s.length?t.jsx("div",{className:"h-full flex items-center justify-center",children:t.jsx("div",{className:"w-full h-0.5 rounded-full bg-text-muted/15"})}):t.jsx("div",{ref:a,className:"w-full h-full"})});function at({value:s,receivedCount:n,packets:a,rangeMinutes:i,bucketCount:l,timeRangeLabel:r,icon:o,isLoaded:c=!0}){const{buckets:d,activeTypes:m,ratePerHour:u}=e.useMemo(()=>function(e,t,s){const n=Date.now()/1e3,a=60*t,i=n-a,l=a/s,r=[];for(let m=0;mn)continue;const t=Math.min(s-1,Math.floor((e-i)/l)),a=m.type??m.payload_type??0,d=m.length??m.payload_length??0,u=r[t];u.bytesByType[a]=(u.bytesByType[a]??0)+d,u.totalBytes+=d,o[a]=(o[a]??0)+d,c++}const d=t/60;return{buckets:r,activeTypes:Object.keys(o).map(e=>parseInt(e,10)).filter(e=>o[e]>0).sort((e,t)=>o[t]-o[e]),ratePerHour:d>0?Math.round(c/d):0}}(a,i,l),[a,i,l]),h=n>0?(s/n*100).toFixed(1):null;return c?t.jsxs("div",{className:"data-card flex flex-col relative",children:[t.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 mb-2 sm:mb-3",children:[o&&t.jsx("span",{className:"icon-sm text-icon-card-title",children:o}),t.jsx("span",{className:"type-micro",children:"FORWARDED"}),r&&t.jsx(N,{color:"zinc",className:"hidden sm:inline-flex",children:r})]}),t.jsx("div",{className:"type-data-xl text-text-primary",children:t.jsx(oe,{value:s,className:"font-mono tabular-nums",priority:"high"})}),t.jsx("div",{className:"flex-1 mt-1 overflow-hidden min-h-[40px] sm:min-h-[60px]",children:m.length>0?t.jsx(nt,{buckets:d,activeTypes:m}):t.jsx("div",{className:"w-full h-full flex items-center justify-center",children:t.jsx("div",{className:"w-full h-0.5 rounded-full bg-text-muted/15"})})}),t.jsx("div",{className:"pt-1.5 sm:pt-2 mt-1",children:t.jsxs("div",{className:"flex gap-2 sm:gap-3",children:[t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Rate"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[u,"/hr"]})]}),null!==h&&t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Ratio"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[h,"%"]})]})]})})]}):t.jsx("div",{className:"data-card flex flex-col relative",children:t.jsx(X,{})})}function it({value:s,receivedCount:n,packets:a,rangeMinutes:i,bucketCount:l,timeRangeLabel:r,icon:o,isLoaded:c=!0}){const{buckets:d,activeTypes:m,ratePerHour:u}=e.useMemo(()=>function(e,t,s){const n=Date.now()/1e3,a=60*t,i=n-a,l=a/s,r=[];for(let m=0;mn)continue;const t=Math.min(s-1,Math.floor((e-i)/l)),a=m.type??m.payload_type??0,d=m.length??m.payload_length??0,u=r[t];u.bytesByType[a]=(u.bytesByType[a]??0)+d,u.totalBytes+=d,o[a]=(o[a]??0)+d,c++}const d=t/60;return{buckets:r,activeTypes:Object.keys(o).map(e=>parseInt(e,10)).filter(e=>o[e]>0).sort((e,t)=>o[t]-o[e]),ratePerHour:d>0?Math.round(c/d):0}}(a,i,l),[a,i,l]),h=n>0?(s/n*100).toFixed(1):null;return c?t.jsxs("div",{className:"data-card flex flex-col relative",children:[t.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 mb-2 sm:mb-3",children:[o&&t.jsx("span",{className:"icon-sm text-icon-card-title",children:o}),t.jsx("span",{className:"type-micro",children:"DROPPED"}),r&&t.jsx(N,{color:"zinc",className:"hidden sm:inline-flex",children:r})]}),t.jsx("div",{className:"type-data-xl text-text-primary",children:t.jsx(oe,{value:s,className:"font-mono tabular-nums",priority:"high"})}),t.jsx("div",{className:"flex-1 mt-1 overflow-hidden min-h-[40px] sm:min-h-[60px]",children:m.length>0?t.jsx(nt,{buckets:d,activeTypes:m}):t.jsx("div",{className:"w-full h-full flex items-center justify-center",children:t.jsx("div",{className:"w-full h-0.5 rounded-full bg-text-muted/15"})})}),t.jsx("div",{className:"pt-1.5 sm:pt-2 mt-1",children:t.jsxs("div",{className:"flex gap-2 sm:gap-3",children:[t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Rate"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[u,"/hr"]})]}),null!==h&&t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Drop %"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[h,"%"]})]})]})})]}):t.jsx("div",{className:"data-card flex flex-col relative",children:t.jsx(X,{})})}const lt={",":"punc",".":"punc-period",":":"punc-colon","/":"punc-slash"},rt=/([,\.:\/])/g,ot=e.memo(function({children:s,className:n="",as:a="span"}){const i=e.useMemo(()=>{let e;return e="number"==typeof s?s.toLocaleString():Array.isArray(s)?s.join(""):String(s??""),rt.test(e)?(rt.lastIndex=0,e.split(rt).map((e,s)=>{const n=lt[e];return n?t.jsx("span",{className:n,children:e},s):e})):e},[s]);return t.jsx(a,{className:`data-tight ${n}`.trim(),children:i})}),ct=.2;function dt(e,t=1){return Math.floor(5*t*e)}function mt(e){const t=Math.round(e/ct)*ct;return Math.max(0,Math.min(5,t))}function ut({stats:s,receivedBuckets:n,droppedBuckets:a,forwardedBuckets:i,bucketDurationSeconds:l,timeRangeLabel:r,isLoaded:o=!0}){var c,d,m,u;const[h,x]=e.useState(!1);if(!o)return t.jsx("div",{className:"data-card flex flex-col relative",children:t.jsx(X,{})});const f=function(e,t,s,n,a){var i,l;const r=e=>(null==e?void 0:e.reduce((e,t)=>e+t.count,0))??0,o=r(t),c=r(s),d=r(n),m=o||(null==e?void 0:e.rx_count)||1,u=c||(null==e?void 0:e.dropped_count)||0,h=m>0?u/(m+u)*100:0;let x=0;if((null==n?void 0:n.length)&&a)x=100*d/(n.length*a*1e3)*100;else if(e){const t=1e3*(e.uptime_seconds||1);x=(e.total_airtime_ms||e.airtime_used_ms||0)/t*100}const f=(null==e?void 0:e.neighbors)??{},p=Object.values(f).filter(e=>e.zero_hop).length;let g=1;h<3?g-=ct:h>15?g+=.4:h>10&&(g+=ct),x>5&&(g+=ct),p>10&&(g+=ct);const v=mt(g),j=mt(.28*v),y=dt(v),b=dt(j),N=dt((null==(l=null==(i=null==e?void 0:e.config)?void 0:i.delays)?void 0:l.tx_delay_factor)??1);return{floodFactor:v,directFactor:j,floodSlots:y,directSlots:b,adjustment:y>N?"increase":y{const e=`set txdelay ${f.floodFactor.toFixed(1)}\nset direct.txdelay ${f.directFactor.toFixed(1)}`;try{await navigator.clipboard.writeText(e),x(!0),setTimeout(()=>x(!1),1500)}catch(t){const s=document.createElement("textarea");s.value=e,s.style.position="fixed",s.style.opacity="0",document.body.appendChild(s),s.select();try{document.execCommand("copy"),x(!0),setTimeout(()=>x(!1),1500)}catch{}document.body.removeChild(s)}},className:"flex gap-3 mb-2 sm:mb-3 w-full text-left hover:bg-white/[0.02] radius-inner transition-base p-1 -m-1 group",title:"Click to copy CLI commands",children:[t.jsxs("div",{className:"flex-1 flex flex-col",children:[t.jsx("span",{className:"type-data-hero text-text-primary",children:t.jsxs(ot,{children:["×",f.floodFactor.toFixed(1)]})}),t.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide mt-0.5 sm:mt-1",children:"Flood"})]}),t.jsxs("div",{className:"flex-1 flex flex-col",children:[t.jsx("span",{className:"type-data-hero text-accent-primary",children:t.jsxs(ot,{children:["×",f.directFactor.toFixed(1)]})}),t.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide mt-0.5 sm:mt-1",children:"Direct"})]}),t.jsx("div",{className:"flex items-center self-center opacity-0 group-hover:opacity-100 transition-opacity",children:h?t.jsx(je,{className:"w-4 h-4 text-green-400"}):t.jsx(ye,{className:"w-4 h-4 text-text-muted"})})]}),t.jsx("div",{className:"flex-1 py-2",children:t.jsxs("div",{className:"flex gap-3",children:[t.jsxs("div",{className:"flex-1",children:[t.jsx("div",{className:"data-box-label",children:"Dupe"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left "+(f.duplicateRate>10?"text-accent-warning":""),children:[f.duplicateRate.toFixed(1),"%"]})]}),t.jsxs("div",{className:"flex-1",children:[t.jsx("div",{className:"data-box-label",children:"TX Util"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[f.txUtilization.toFixed(2),"%"]})]})]})}),t.jsxs("div",{className:"pt-2 mt-2",children:[t.jsx("div",{className:"data-box-label",children:"Current"}),t.jsx("div",{className:"flex gap-2",children:null!==p?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"data-box",children:["×",p.toFixed(2)]}),t.jsxs("div",{className:"data-box",style:{color:"var(--accent-primary)"},children:["×",(null==g?void 0:g.toFixed(2))??"—"]})]}):t.jsx("span",{className:"text-sm text-text-muted",children:"No config"})})]})]})}function ht(){const s=w(),n=k(),a=M(),i=C(),[l,r]=e.useState([]);e.useEffect(()=>{const e=B.subscribe(e=>{r(e)});return r(B.getPendingPackets()),e},[]);const o=e.useMemo(()=>{const e=s.length<=100?s:s.slice(-100),t=new Set(e.map(e=>e.packet_hash));return[...l.filter(e=>!t.has(e.packet.packet_hash)).map(e=>({...e.packet,isPending:!0})),...e].sort((e,t)=>(t.timestamp??0)-(e.timestamp??0))},[s,l]),c=null==i?void 0:i.local_hash,d=null==i?void 0:i.neighbors;return t.jsxs("div",{className:"chart-container h-full flex flex-col !overflow-visible",children:[t.jsxs("div",{className:"chart-header",children:[t.jsxs("div",{className:"chart-title",children:[t.jsx(S,{className:"chart-title-icon"}),"Recent Packets"]}),t.jsxs("div",{className:"flex items-center gap-3",children:[a&&t.jsx(T,{showLabel:!0}),t.jsxs(be,{to:"/packets",className:"pill-subtle",children:["View all ",t.jsx(ue,{className:"w-3 h-3"})]})]})]}),t.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto px-1",children:t.jsx(he,{packets:o,allPackets:s,localHash:c,neighbors:d,loading:n,maxPackets:50,showPagination:!1,flashNewest:!0,emptyMessage:"No packets received",footerAction:t.jsxs(be,{to:"/packets",className:"pill-subtle",children:["View all ",t.jsx(ue,{className:"w-3 h-3"})]})})})]})}const xt={stable:"M5 12h14",up:"M5 15l7-7 7 7",down:"M19 9l-7 7-7-7"};function ft({trend:e}){return t.jsx("span",{className:`mini-widget-trend ${e}`,children:t.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:xt[e]})})})}function pt(){return t.jsx("div",{className:"mini-widget-loading",children:t.jsx("div",{className:"mini-widget-loading-spinner"})})}function gt({message:e}){return t.jsx("div",{className:"mini-widget-error",children:t.jsx("span",{title:e,children:"No data"})})}function vt({title:e,icon:s,value:n,unit:a,valueSize:i="md",status:l,subtitle:r,trend:o,children:c,isLoading:d=!1,error:m,className:u="",onClick:h}){const x=["mini-widget-value","lg"===i&&"mini-widget-value-lg","sm"===i&&"mini-widget-value-sm"].filter(Boolean).join(" "),f=["mini-widget",h&&"cursor-pointer",u].filter(Boolean).join(" ");return t.jsxs("div",{className:f,onClick:h,role:h?"button":void 0,children:[t.jsxs("div",{className:"mini-widget-header",children:[s,t.jsx("span",{className:"mini-widget-title",children:e}),l&&"unknown"!==l&&t.jsx("div",{className:`mini-widget-status-dot ${l}`}),o&&t.jsx(ft,{trend:o})]}),d?t.jsx(pt,{}):m?t.jsx(gt,{message:m}):t.jsxs(t.Fragment,{children:[void 0!==n&&t.jsxs("div",{className:x,children:["number"==typeof n?t.jsx(oe,{value:n,className:"font-mono tabular-nums",priority:"medium",format:Number.isInteger(n)?void 0:{minimumFractionDigits:1,maximumFractionDigits:1}}):t.jsx(ot,{children:n}),a&&t.jsx("span",{className:"mini-widget-unit",children:a})]}),r&&t.jsx("div",{className:"mini-widget-subtitle",children:r}),c]})]})}const jt={DELTA_CRITICAL:10,SLOPE_CRITICAL:4,JITTER_CRITICAL:6,DELTA_WARNING:5,SLOPE_WARNING:2,JITTER_WARNING:4},yt={baselineMedian:null,baselineP10:null,baselineP90:null,currentMedian:null,currentSampleCount:0,delta:0,slope:0,jitter:0,penalty:0,penaltyReason:null,computedAt:0,isReliable:!1};function bt(e,t){if(0===e.length)return null;const s=[...e].sort((e,t)=>e-t),n=t/100*(s.length-1),a=Math.floor(n),i=Math.ceil(n);return a===i?s[a]:s[a]+(s[i]-s[a])*(n-a)}function Nt(e){return bt(e,50)}function wt(e){if(!e)return[];try{const t=JSON.parse(e);if(Array.isArray(t))return t.map(Number).filter(e=>!isNaN(e))}catch{}return[]}function kt(e){return null!=e&&0!==e&&!Object.is(e,-0)&&!(e>-50||e<-130)}function Mt(e,t,s=2,n=!1){if(null===t)return"stable";const a=e-t;return(0!==t?100*Math.abs(a/t):Math.abs(a))0?"up":"down":a>0?"down":"up"}const Ct={lbtStats:null,noiseFloor:null,sparklineNoiseFloor:[],linkQuality:null,channelHealth:null,nfTrend:yt,radioConfig:null,trends:null,stats:null,recentPackets:[],quickNeighbors:[],isLoading:!0,error:null,refresh:async()=>{}},Bt=e.createContext(Ct);function St({children:s}){var n;const a=C(),i=w(),l=L(),r=_(),o=D(),c=R[o],d=Math.max(1,c.minutes/60),m=null===a,u=e.useMemo(()=>function(e,t){const s=3600*t,n=Math.floor(Date.now()/1e3)-s,a=e.filter(e=>e.timestamp>=n&&void 0!==e.lbt_attempts&&e.lbt_attempts>0),i=a.length,l=a.filter(e=>(e.lbt_attempts??0)>1).length,r=i>0?l/i*100:0,o=a.filter(e=>(e.lbt_attempts??0)>1),c=o.length>0?o.reduce((e,t)=>e+(t.lbt_attempts??0),0)/o.length:0,d=a.filter(e=>(e.lbt_attempts??0)>=5).length,m=i>0?d/i*100:0,u=[];for(const y of a){const e=wt(y.lbt_backoff_delays_ms);u.push(...e)}const h=u.reduce((e,t)=>e+t,0),x=u.length>0?h/u.length:0,f=u.length>0?Math.min(...u):0,p=u.length>0?Math.max(...u):0,g=s/24,v=[],j=[];for(let y=0;y<24;y++){const e=n+y*g,t=e+g,s=a.filter(s=>s.timestamp>=e&&s.timestamp(e.lbt_attempts??0)>1).length,l=s.length>0?i/s.length*100:0,r=[];for(const n of s){const e=wt(n.lbt_backoff_delays_ms);r.push(...e)}const o=r.length>0?r.reduce((e,t)=>e+t,0)/r.length:0;if(v.push(o),0===s.length)j.push(0);else{const e=s.filter(e=>(e.lbt_attempts??0)>=5).length,t=r.length>0?Math.max(...r):0,n=Math.min(s.length/5,1),a=.15,i=Math.log(1+l*a)/Math.log(1+100*a)*40,c=e/s.length*100,d=Math.min(.5*c,25);let m=0;o>100&&(m=Math.min(8*Math.log10(o/100),15));let u=0;t>500&&o>0&&t>2*o&&(u=Math.min((t-500)/200,5));const h=i+d+m+u;j.push(Math.min(h*n,85))}}return{totalPacketsWithLBT:i,packetsWithRetries:l,retryRate:r,avgRetries:c,channelBusyCount:d,channelBusyRate:m,avgBackoffMs:x,minBackoffMs:f,maxBackoffMs:p,totalBackoffMs:h,sparklineBackoff:v,sparklineCollisionRisk:j,windowHours:t,packetCount:e.length}}(i,d),[i,d]),h=(null==a?void 0:a.noise_floor_dbm)??null,x=e.useMemo(()=>kt(h)?h:null,[h]),f=e.useMemo(()=>{var e;const t=null==(e=null==a?void 0:a.config)?void 0:e.radio;return t?{sf:t.spreading_factor??7,bwHz:t.bandwidth??125e3}:null},[null==(n=null==a?void 0:a.config)?void 0:n.radio]),[p,g]=e.useState([]),v=e.useRef({time:0,hours:0});e.useEffect(()=>{const e=async()=>{var e;const t=Date.now(),s=Math.ceil(d);if(0===v.current.time||v.current.hours!==s||t-v.current.time>=6e4){v.current={time:t,hours:s};try{const t=await F(Math.max(s,24));t.success&&(null==(e=t.data)?void 0:e.history)&&g(t.data.history)}catch{}}};e();const t=setInterval(e,6e4);return()=>clearInterval(t)},[d]);const j=e.useMemo(()=>function(e,t){if(0===e.length)return[];const s=e.reduce((e,t)=>Math.max(e,t.timestamp),0);if(0===s)return[];const n=3600*t,a=s-n,i=n/24,l=[];for(let r=0;r<24;r++){const t=a+r*i,s=t+i,n=e.filter(e=>e.timestamp>=t&&e.timestamp0){const e=n.reduce((e,t)=>e+t.noise_floor_dbm,0)/n.length;l.push(e)}else l.push(l.length>0?l[l.length-1]:-100)}return l}(p,d),[p,d]),y=null==a?void 0:a.neighbors,b=e.useMemo(()=>{const e=y??{};return Object.fromEntries(Object.entries(e).filter(([e])=>!r.has(e)))},[y,r]),N=e.useMemo(()=>l.filter(e=>!r.has(e.hash)),[l,r]),k=e.useMemo(()=>function(e){if(0===e.length)return{...yt,computedAt:Math.floor(Date.now()/1e3)};const t=Math.floor(Date.now()/1e3),s=e.filter(e=>Number.isFinite(e)),n=e.length>0?[e[e.length-1]]:[],a=e.slice(-4).filter(e=>Number.isFinite(e)),i=Nt(s),l=bt(s,10),r=bt(s,90),o=Nt(n),c=null!==o&&null!==l?o-l:0,d=function(e){if(e.length<2)return 0;const t=e.length;let s=0,n=0,a=0,i=0;const l=e[0].timestamp;for(const o of e){const e=(o.timestamp-l)/3600,t=o.value;s+=e,n+=t,a+=e*t,i+=e*e}const r=t*i-s*s;return Math.abs(r)<1e-4?0:(t*a-s*n)/r}(a.map((e,s)=>({timestamp:t-3600*(a.length-1-s),value:e}))),m=function(e){if(e.length<2)return 0;const t=e.reduce((e,t)=>e+t,0)/e.length,s=e.map(e=>Math.pow(e-t,2)).reduce((e,t)=>e+t,0)/e.length;return Math.sqrt(s)}(a),u=s.length>=12,[h,x]=u?function(e,t,s){const n=jt;return e>=n.DELTA_CRITICAL?[2,`Noise floor ${e.toFixed(1)} dB above baseline`]:t>=n.SLOPE_CRITICAL?[2,`Noise floor rising ${t.toFixed(1)} dB/hour`]:s>=n.JITTER_CRITICAL?[2,`Noise floor unstable (±${s.toFixed(1)} dB)`]:e>=n.DELTA_WARNING?[1,`Noise floor ${e.toFixed(1)} dB above baseline`]:t>=n.SLOPE_WARNING?[1,`Noise floor rising ${t.toFixed(1)} dB/hour`]:s>=n.JITTER_WARNING?[1,`Noise floor variable (±${s.toFixed(1)} dB)`]:[0,null]}(c,d,m):[0,null];return{baselineMedian:i,baselineP10:l,baselineP90:r,currentMedian:o,currentSampleCount:n.length,delta:c,slope:d,jitter:m,penalty:h,penaltyReason:x,computedAt:t,isReliable:u}}(j),[j]),M=e.useMemo(()=>function(e,t,s){if(0===e.length)return{neighbors:[],networkScore:0,neighborCount:0,bestLink:null,worstLink:null};const n=e.map(e=>{const n=function(e,t,s){const n=we(e,t,s,0);if(n)switch(n.finalGrade){case"excellent":return 100;case"good":return 80;case"fair":return 60;case"poor":return 40;case"critical":return 20}const a=void 0===e?50:e>=10?100:e>=5?80:e>=0?60:e>=-5?40:20,i=void 0===t?50:t>=-70?100:t>=-80?80:t>=-90?60:t>=-100?40:20;return Math.round(.6*a+.4*i)}(e.avgSnr??void 0,e.avgRssi??void 0,s),a=t[e.hash];return{name:(null==a?void 0:a.name)||(null==a?void 0:a.node_name)||e.prefix,hash:e.hash,rssi:e.avgRssi??-100,snr:e.avgSnr??-10,score:n,advertCount:e.count}});n.sort((e,t)=>t.score-e.score);const a=n.length>0?n.reduce((e,t)=>e+t.score,0)/n.length:0;return{neighbors:n,networkScore:Math.round(a),neighborCount:n.length,bestLink:n.length>0?{name:n[0].name,score:n[0].score}:null,worstLink:n.length>0?{name:n[n.length-1].name,score:n[n.length-1].score}:null}}(N,b,f),[N,b,f]),B=e.useMemo(()=>function(e,t,s){const n=e?Math.max(0,Math.min(100,100-5*e.retryRate)):50;let a=50;null!==t&&(a=Math.max(0,Math.min(100,(t+120)/30*100)));const i=(null==s?void 0:s.networkScore)??50,l=Math.round(.35*n+.25*a+.4*i);let r;return r=l>=85?"excellent":l>=70?"good":l>=50?"fair":l>=30?"congested":"critical",{score:l,status:r,components:{lbtHealth:Math.round(n),noiseHealth:Math.round(a),linkHealth:Math.round(i)}}}(u,x,M),[u,x,M]),[S,T]=e.useState({noiseFloor:null,networkScore:null,channelHealth:null}),A=e.useRef(0);e.useEffect(()=>{const e=()=>{const e=Date.now();e-A.current>3e4&&(A.current=e,T({noiseFloor:x,networkScore:(null==M?void 0:M.networkScore)??null,channelHealth:(null==B?void 0:B.score)??null}))};e();const t=setInterval(e,5e3);return()=>clearInterval(t)},[x,null==M?void 0:M.networkScore,null==B?void 0:B.score]);const H=e.useMemo(()=>({noiseFloor:{current:x,previous:S.noiseFloor,trend:null!==x?Mt(x,S.noiseFloor,2,!0):"stable"},networkScore:{current:(null==M?void 0:M.networkScore)??0,previous:S.networkScore,trend:Mt((null==M?void 0:M.networkScore)??0,S.networkScore,3,!1)},channelHealth:{current:(null==B?void 0:B.score)??0,previous:S.channelHealth,trend:Mt((null==B?void 0:B.score)??0,S.channelHealth,3,!1)}}),[x,null==M?void 0:M.networkScore,null==B?void 0:B.score,S]),$={lbtStats:u,noiseFloor:x,sparklineNoiseFloor:j,linkQuality:M,channelHealth:B,nfTrend:k,radioConfig:f,trends:H,stats:a,recentPackets:i,quickNeighbors:l,isLoading:m,error:null,refresh:async()=>{}};return t.jsx(Bt.Provider,{value:$,children:s})}function Tt(){const t=e.useContext(Bt);if(void 0===t)throw new Error("useLBTData must be used within an LBTDataProvider");return t}function Lt(e,t){return 0===e?"No backoffs":`${t.toFixed(0)}% retry rate`}function _t(){const{lbtStats:s,isLoading:r,error:o}=Tt(),c=Ne(),d=(null==s?void 0:s.avgBackoffMs)??0,m=(null==s?void 0:s.retryRate)??0,u=s?(h=d)<100?"excellent":h<250?"good":h<500?"fair":h<1e3?"congested":"critical":"unknown";var h;const x=null==s?void 0:s.sparklineBackoff,{chartData:f,yDomain:p}=e.useMemo(()=>{if(!x||x.length<2)return{chartData:[],yDomain:[0,100]};const e=x.map(e=>({value:e})),t=x.filter(e=>e>0);if(0===t.length)return{chartData:e,yDomain:[0,100]};const s=Math.min(...t),n=Math.max(...t),a=n-s,i=Math.max(.2*a,.1*n,10);return{chartData:e,yDomain:[Math.max(0,s-i),n+i]}},[x]);return t.jsx(vt,{title:"LBT Backoff",icon:t.jsx(We,{className:"mini-widget-icon"}),value:Math.round(d),unit:"ms",status:u,subtitle:s?Lt(d,m):void 0,isLoading:r,error:o,onClick:()=>c("/packets"),children:t.jsx("div",{className:"mini-widget-sparkline",children:f.length>0?t.jsx(n,{width:"100%",height:24,children:t.jsxs(a,{data:f,margin:{top:2,right:2,bottom:2,left:2},children:[t.jsx(i,{domain:p,hide:!0}),t.jsx(l,{type:"monotone",dataKey:"value",stroke:"var(--accent-primary)",strokeWidth:2,dot:!1,isAnimationActive:!1})]})}):t.jsx("div",{className:"h-full"})})})}function Dt(e){return 0===e?"—":e<1?"<1":Math.round(e).toString()}function Rt(){const{lbtStats:e,isLoading:s,error:n}=Tt(),a=Ne(),i=(null==e?void 0:e.channelBusyCount)??0,l=(null==e?void 0:e.totalPacketsWithLBT)??0,r=(null==e?void 0:e.channelBusyRate)??0,o=(null==e?void 0:e.retryRate)??0,c=(null==e?void 0:e.avgBackoffMs)??0,d=(null==e?void 0:e.minBackoffMs)??0,m=(null==e?void 0:e.maxBackoffMs)??0,u=o>0?Math.max(0,(o-r)/o*100):100;return t.jsx(vt,{title:"Ch. Busy",icon:t.jsx(ce,{className:"mini-widget-icon"}),isLoading:s,error:n,onClick:()=>a("/packets"),children:t.jsx("div",{className:"flex-1 flex items-end",children:t.jsxs("div",{className:"grid grid-cols-[auto_minmax(0,1fr)_auto_minmax(0,1fr)] gap-x-2 gap-y-2 w-full items-baseline",children:[t.jsx("span",{className:"data-box-label mb-0",title:`${i} packets exceeded max CAD attempts (5) out of ${l} total transmissions.`,children:"Failed:"}),t.jsxs("div",{className:"data-box justify-self-start",title:`${i} packets exceeded max CAD attempts (5) out of ${l} total transmissions.`,children:[t.jsx(ot,{children:i}),t.jsx("span",{className:"text-text-muted punc-slash",children:"/"}),t.jsx(ot,{children:l})]}),t.jsx("span",{className:"data-box-label mb-0",title:`${u.toFixed(1)}% of packets that needed LBT retries were sent successfully.`,children:"Sent:"}),t.jsx("div",{className:"data-box justify-self-start",title:`${u.toFixed(1)}% of packets that needed LBT retries were sent successfully.`,children:t.jsxs(ot,{children:[u.toFixed(0),"%"]})}),t.jsx("span",{className:"data-box-label mb-0",title:`Average LBT backoff delay: ${c.toFixed(0)}ms.`,children:"Mean:"}),t.jsxs("div",{className:"data-box justify-self-start",title:`Average LBT backoff delay: ${c.toFixed(0)}ms.`,children:[t.jsx(ot,{children:Dt(c)}),t.jsx("span",{className:"text-text-muted text-xs",children:"ms"})]}),t.jsx("span",{className:"data-box-label mb-0",title:`Backoff range: ${d.toFixed(0)}ms min, ${m.toFixed(0)}ms max.`,children:"Range:"}),t.jsxs("div",{className:"data-box justify-self-start",title:`Backoff range: ${d.toFixed(0)}ms min, ${m.toFixed(0)}ms max.`,children:[t.jsx(ot,{children:Dt(d)}),t.jsx("span",{className:"text-text-muted punc-slash",children:"/"}),t.jsx(ot,{children:Dt(m)})]})]})})})}function Ft(e){return null===e?"No reading":e<-115?"Very quiet":e<-105?"Quiet":e<-95?"Moderate":e<-85?"Elevated":"High interference"}function At(){const{noiseFloor:s,sparklineNoiseFloor:r,trends:o,isLoading:c,error:d}=Tt(),m=null===(u=s)||u<-110?"excellent":u<-100?"good":u<-90?"fair":u<-80?"congested":"critical";var u;const h=null==o?void 0:o.noiseFloor.trend,{chartData:x,yDomain:f}=e.useMemo(()=>{if(!r||r.length<2)return{chartData:[],yDomain:[-120,-90]};const e=r.map(e=>({value:e})),t=r.filter(e=>-100!==e&&e<-50);if(0===t.length)return{chartData:e,yDomain:[-120,-90]};const s=Math.min(...t),n=Math.max(...t),a=n-s,i=Math.max(.2*a,3);return{chartData:e,yDomain:[s-i,n+i]}},[r]),p=null!==s?Math.round(s):"—";return t.jsx(vt,{title:"Noise Floor",icon:t.jsx(He,{className:"mini-widget-icon"}),value:p,unit:null!==s?"dBm":void 0,status:m,trend:h,subtitle:Ft(s),isLoading:c,error:d,children:t.jsx("div",{className:"mini-widget-sparkline",children:x.length>0?t.jsx(n,{width:"100%",height:24,children:t.jsxs(a,{data:x,margin:{top:2,right:2,bottom:2,left:2},children:[t.jsx(i,{domain:f,hide:!0}),t.jsx(l,{type:"monotone",dataKey:"value",stroke:"var(--accent-primary)",strokeWidth:2,dot:!1,isAnimationActive:!1})]})}):t.jsx("div",{className:"h-full"})})})}function Ht(){const s=Ne(),n=L(),a=w(),i=C(),l=D(),r=60*R[l].minutes,o=A(),c=e.useMemo(()=>{if(0===o)return a;const e=o-r;return a.filter(t=>t.timestamp>=e)},[a,r,o]),d=null===i,m=(null==i?void 0:i.local_hash)?H(i.local_hash):"",u=(null==i?void 0:i.neighbors)??{},{neighborHashes:h,neighborNames:x}=e.useMemo(()=>{const e=new Set,t=new Map;for(const s of n){e.add(s.hash);const n=u[s.hash],a=(null==n?void 0:n.name)||(null==n?void 0:n.node_name)||s.prefix;t.set(s.hash,a)}return{neighborHashes:e,neighborNames:t}},[n,u]),f=e.useMemo(()=>{if(0===h.size||0===c.length||!m)return{champion:null,listener:null,loudest:null};const{scores:e}=re(c,h,m),t=[];for(const[i,l]of e)0!==l.blendedScore&&t.push({...l,name:x.get(i)??H(i)});let s=null,n=null,a=null;for(const i of t)(!s||i.blendedScore>s.blendedScore)&&(s=i),(!n||i.listenerScore>n.listenerScore)&&(n=i),(!a||i.loudScore>a.loudScore)&&(a=i);return{champion:s,listener:n,loudest:a}},[c,h,m,x]),{champion:p,listener:g,loudest:v}=f,j=p||g||v?t.jsxs("div",{className:"flex flex-col gap-0.5 mt-auto",children:[p&&t.jsx($,{content:(y=p,t.jsxs("div",{className:"max-w-[220px]",children:[t.jsxs("div",{className:"font-semibold mb-1",children:["🏆 Champion: ",y.name]}),t.jsxs("div",{className:"text-text-muted mb-1",children:["Blended Score: ",y.blendedScore,t.jsx("span",{className:"text-text-muted/60 ml-1",children:"(Listener + Loud)"})]}),t.jsxs("div",{className:"border-t border-border-subtle pt-1 mt-1 space-y-0.5",children:[t.jsxs("div",{children:["Listener: ",y.listenerScore,"/100 (",y.listenerCount," shared paths)"]}),t.jsxs("div",{children:["Loud: ",y.loudScore,"/100 (",y.loudCount," packets relayed)"]})]})]})),children:t.jsxs("div",{className:"flex items-center gap-1 text-sm radius-badge px-1 -mx-1 hover-bg transition-base cursor-default",children:[t.jsx(xe,{className:"w-3 h-3 text-map-neighbor-color flex-shrink-0"}),t.jsx("span",{className:"font-semibold text-map-neighbor-color font-mono truncate flex-1 min-w-0",children:p.name}),t.jsx("span",{className:"text-map-neighbor-color pl-2 tabular-nums flex-shrink-0 w-9 text-right",children:p.blendedScore})]})}),g&&t.jsx($,{content:(e=>t.jsxs("div",{className:"max-w-[220px]",children:[t.jsxs("div",{className:"font-semibold mb-1",children:["👂 Best Listener: ",e.name]}),t.jsxs("div",{className:"text-text-muted mb-1",children:["Score: ",e.listenerScore,"/100"]}),t.jsx("div",{className:"border-t border-border-subtle pt-1 mt-1",children:t.jsxs("div",{children:[e.listenerCount," packets where they heard your transmissions"]})})]}))(g),children:t.jsxs("div",{className:"flex items-center gap-1 text-sm radius-badge px-1 -mx-1 hover-bg transition-base cursor-default",children:[t.jsx($e,{className:"w-3 h-3 text-text-muted flex-shrink-0"}),t.jsx("span",{className:"text-text-muted font-mono truncate flex-1 min-w-0",children:g.name}),t.jsx("span",{className:"text-text-muted pl-2 tabular-nums flex-shrink-0 w-9 text-right",children:g.listenerScore})]})}),v&&t.jsx($,{content:(e=>t.jsxs("div",{className:"max-w-[220px]",children:[t.jsxs("div",{className:"font-semibold mb-1",children:["📢 Loudest: ",e.name]}),t.jsxs("div",{className:"text-text-muted mb-1",children:["Score: ",e.loudScore,"/100"]}),t.jsx("div",{className:"border-t border-border-subtle pt-1 mt-1",children:t.jsxs("div",{children:[e.loudCount," packets they relayed directly to you"]})})]}))(v),children:t.jsxs("div",{className:"flex items-center gap-1 text-sm radius-badge px-1 -mx-1 hover-bg transition-base cursor-default",children:[t.jsx(Pe,{className:"w-3 h-3 text-text-muted flex-shrink-0"}),t.jsx("span",{className:"text-text-muted font-mono truncate flex-1 min-w-0",children:v.name}),t.jsx("span",{className:"text-text-muted pl-2 tabular-nums flex-shrink-0 w-9 text-right",children:v.loudScore})]})})]}):0===n.length?t.jsx("div",{className:"flex items-center justify-center text-sm text-text-muted mt-auto",children:"No direct neighbors"}):t.jsx("div",{className:"flex items-center justify-center text-sm text-text-muted mt-auto",children:"No routing data yet"});var y;return t.jsx(vt,{title:"Link Leaders",icon:t.jsx(ze,{className:"mini-widget-icon"}),isLoading:d,onClick:()=>s("/contacts"),children:j})}function $t(){const{lbtStats:s,isLoading:r,error:o}=Tt(),c=s?function(e){const{retryRate:t,channelBusyCount:s,totalPacketsWithLBT:n,avgBackoffMs:a,maxBackoffMs:i}=e;if(0===n)return 0;const l=Math.min(n/10,1),r=Math.log(1+.15*t)/Math.log(16)*40,o=s/n*100,c=Math.min(.5*o,25);let d=0;a>100&&(d=Math.min(8*Math.log10(a/100),15));let m=0;i>500&&a>0&&i>2*a&&(m=Math.min((i-500)/200,5));const u=(r+c+d+m)*l;return Math.min(u,85)}(s):0,d=s?(m=c)<15?"excellent":m<30?"good":m<45?"fair":m<60?"congested":"critical":"unknown";var m;const u=(null==s?void 0:s.maxBackoffMs)??0,h=s?u>200?`Max backoff: ${Math.round(u)}ms`:function(e){return e<15?"Clear channel":e<30?"Light traffic":e<45?"Moderate traffic":e<60?"Heavy traffic":e<75?"Congested":"Severe congestion"}(c):void 0,x=null==s?void 0:s.sparklineCollisionRisk,{chartData:f,yDomain:p}=e.useMemo(()=>{if(!x||x.length<2)return{chartData:[],yDomain:[0,85]};const e=x.map(e=>({value:e})),t=x.filter(e=>e>0);if(0===t.length)return{chartData:e,yDomain:[0,85]};const s=Math.min(...t),n=Math.max(...t),a=n-s,i=Math.max(.2*a,5);return{chartData:e,yDomain:[Math.max(0,s-i),Math.min(85,n+i)]}},[x]),g=Math.round(10*c)/10;return t.jsx(vt,{title:"Collision Risk",icon:t.jsx(Me,{className:"mini-widget-icon"}),value:g,unit:"%",status:d,subtitle:h,isLoading:r,error:o,children:t.jsx("div",{className:"mini-widget-sparkline",children:f.length>0?t.jsx(n,{width:"100%",height:24,children:t.jsxs(a,{data:f,margin:{top:2,right:2,bottom:2,left:2},children:[t.jsx(i,{domain:p,hide:!0}),t.jsx(l,{type:"monotone",dataKey:"value",stroke:"var(--accent-primary)",strokeWidth:2,dot:!1,isAnimationActive:!1})]})}):t.jsx("div",{className:"h-full"})})})}function Pt(){const[s,n]=e.useState(!1),[a]=e.useState(0),{stats:i,lbtStats:l,isLoading:r}=Tt(),o=e.useMemo(()=>{if(!i)return null;const e=i.airtime_used_ms??0,t=i.max_airtime_ms??1;return{usedMs:e,maxMs:t,remainingMs:i.airtime_remaining_ms??0,utilizationPercent:i.utilization_percent??(t>0?e/t*100:0)}},[i]),c=e.useMemo(()=>l&&0!==l.totalPacketsWithLBT?(l.totalPacketsWithLBT-l.packetsWithRetries)/l.totalPacketsWithLBT*100:100,[l]),d=(null==o?void 0:o.utilizationPercent)??0,m=(u=d)<30?"excellent":u<50?"good":u<70?"fair":u<90?"congested":"critical";var u;const h=(null==o?void 0:o.remainingMs)??0,x=c<95?`${c.toFixed(0)}% clean TX`:((f=h)<1e3?`${Math.round(f)}ms`:f<6e4?`${(f/1e3).toFixed(1)}s`:`${(f/6e4).toFixed(1)}m`)+" remaining";var f;const p=o?t.jsx("div",{className:"mini-widget-progress mt-auto",children:t.jsx("div",{className:`mini-widget-progress-bar ${m}`,style:{width:`${Math.min(d,100)}%`}})}):null;return t.jsx(vt,{title:"Duty Cycle",icon:t.jsx(S,{className:"mini-widget-icon"}),value:d.toFixed(1),unit:"%",status:m,subtitle:x,isLoading:r,children:p})}function Et(){return t.jsxs("div",{className:"mini-widget",children:[t.jsxs("div",{className:"mini-widget-header",children:[t.jsx(Z,{className:"w-4 h-4"}),t.jsx(Z,{className:"h-3 w-16"})]}),t.jsx(Z,{className:"h-7 w-12 mt-2"}),t.jsx(Z,{className:"h-3 w-20 mt-2"})]})}function zt(){return t.jsx("div",{className:"widget-row",children:Array.from({length:6}).map((e,s)=>t.jsx(Et,{},s))})}function It({className:e="",isLoaded:s=!0}){return t.jsxs("div",{className:`mesh-health-container relative ${e}`,children:[t.jsxs("div",{className:"mesh-health-header",children:[t.jsx(Ie,{className:"w-4 h-4 text-accent-primary"}),t.jsx("span",{className:"type-label text-text-muted",children:"MESH HEALTH"})]}),s?t.jsx(St,{children:t.jsxs("div",{className:"widget-row",children:[t.jsx(_t,{}),t.jsx($t,{}),t.jsx(At,{}),t.jsx(Pt,{}),t.jsx(Rt,{}),t.jsx(Ht,{})]})}):t.jsx(zt,{})]})}const Wt={sm:{button:"w-3 h-3",icon:"w-1.5 h-1.5",stroke:"ring-1"},md:{button:"w-3.5 h-3.5",icon:"w-2 h-2",stroke:"ring-1"},lg:{button:"w-4 h-4",icon:"w-2.5 h-2.5",stroke:"ring-[1.5px]"}},Ot=e.forwardRef(function({size:e="md",showIconOnHover:n=!0,className:a,...i},l){const r=Wt[e];return t.jsx("button",{ref:l,type:"button","aria-label":"Close",className:s("group relative inline-flex items-center justify-center rounded-full","transition-all duration-150 ease-out",r.button,"bg-[#FF5F57]",r.stroke,"ring-inset ring-[#E0443E]","hover:bg-[#FF6961]","active:bg-[#E04840] active:scale-95","focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2","focus-visible:ring-[#FF5F57] focus-visible:ring-offset-bg-base",a),...i,children:n&&t.jsx("svg",{className:s(r.icon,"opacity-0 group-hover:opacity-100 transition-opacity duration-100","text-[#4A0000]"),fill:"none",viewBox:"0 0 10 10",stroke:"currentColor",strokeWidth:2.5,strokeLinecap:"round",children:t.jsx("path",{d:"M2.5 2.5L7.5 7.5M7.5 2.5L2.5 7.5"})})})});let qt="",Vt="",Ut="";function Gt(e){!function(){const e=new Date,t=e.toDateString();if(t!==Ut){Ut=t,qt=t;const s=new Date(e);s.setDate(s.getDate()-1),Vt=s.toDateString()}}();const t=new Date(1e3*e).toDateString();return t===qt?"Today":t===Vt?"Yesterday":new Date(1e3*e).toLocaleDateString([],{weekday:"short",month:"short",day:"numeric"})}function Kt(e){const t=["#22c55e","#3b82f6","#f59e0b","#ec4899","#8b5cf6","#06b6d4","#f97316","#84cc16"];let s=0;for(let n=0;n0?{emoji:t[0],cleanName:e.replace(Jt,"").trim()||e}:{emoji:null,cleanName:e}}function Qt(e){const{cleanName:t}=Yt(e),s=t.split(/[\s-_]+/).filter(Boolean);return s.length>=2?(s[0][0]+s[1][0]).toUpperCase():t.slice(0,2).toUpperCase()}function Xt(e,t,s){return`${e||""}|${t}|${s}`}const Zt={stiffness:600,damping:50,mass:.3},es={duration:.15,ease:[.4,0,.2,1]};function ts(e){const s=/@\[([^\]]+)\]/g,n=[];let a,i=0;for(;null!==(a=s.exec(e));)a.index>i&&n.push(e.slice(i,a.index)),n.push(t.jsx("span",{className:"font-extrabold text-white",children:a[1]},a.index)),i=a.index+a[0].length;return i0?n:e}const ss=e.memo(function({message:e,onChannelClick:n,isChannelSelected:a}){const i=e.senderName||"Unknown",{emoji:l,cleanName:r}=Yt(i),o=Kt(r),c=Qt(i),d=e.channelName||e.channelHash.slice(0,6);return t.jsxs("div",{className:"flex items-stretch gap-3 w-full",children:[t.jsxs("div",{className:"flex-shrink-0 flex flex-col items-center justify-between py-0.5",children:[t.jsx("div",{className:s("w-9 h-9 rounded-full flex items-center justify-center","shadow-md ring-1 ring-white/10",l?"text-lg p-1":"text-white text-[13px] font-bold tracking-tight"),style:{backgroundColor:o},children:l||c}),t.jsx("span",{className:"text-[10px] text-text-muted tabular-nums",children:(m=e.timestamp,new Date(1e3*m).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}))})]}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[t.jsx("span",{className:"text-[13px] font-medium",style:{color:o},children:r}),t.jsx("button",{onClick:()=>null==n?void 0:n(e.channelHash),className:s("px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",a?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:d})]}),t.jsx("div",{className:s("inline-block px-3.5 py-2.5","rounded-2xl rounded-tl-md","bg-[#007AFF]"),children:t.jsx("p",{className:"text-[14px] text-white leading-relaxed tracking-wide whitespace-pre-wrap break-words",children:ts(e.text)})})]})]});var m},function(e,t){const s=e.message,n=t.message;return s.timestamp===n.timestamp&&s.text===n.text&&s.senderName===n.senderName&&s.channelHash===n.channelHash&&s.channelName===n.channelName&&e.isChannelSelected===t.isChannelSelected&&e.onChannelClick===t.onChannelClick});function ns({open:n,onClose:a,messages:i,onDecodeMore:l,hasMoreToLoad:r,isDecoding:o}){const c=e.useRef(null),d=e.useRef(!1),m=e.useRef(0),u=e.useRef(!1),h=Le(0),x=Ge(h,Zt),f=e.useRef(0),p=e.useRef(null),g=e.useCallback(()=>{f.current=0,h.set(0)},[h]);e.useEffect(()=>()=>{p.current&&clearTimeout(p.current)},[]);const v=e.useCallback(e=>{const t=e.currentTarget,{scrollTop:s,scrollHeight:n,clientHeight:a}=t,i=s<=0,l=s>=n-a-1,r=e.deltaY<0,o=e.deltaY>0;if(i&&r||l&&o){e.preventDefault();const t=i?1:-1,s=.4,n=80;f.current+=e.deltaY*s*-t,f.current=Math.max(-n,Math.min(n,f.current));const a=f.current/n,l=Math.sign(a)*Math.pow(Math.abs(a),.7)*n;h.set(l*t),p.current&&clearTimeout(p.current),p.current=setTimeout(g,16)}else 0!==f.current&&g()},[h,g]),b=D(),N=O(),w=e.useMemo(()=>{const e=Date.now()/1e3-60*R[b].minutes;return[...i].filter(t=>t.timestamp>=e).sort((e,t)=>e.timestamp-t.timestamp)},[i,b]);e.useEffect(()=>{n||(d.current=!1,m.current=0,u.current=!1)},[n]);const k=e.useCallback(()=>{const e=c.current;if(!e)return;const{scrollTop:t,scrollHeight:s,clientHeight:n}=e,a=t+n>=s-50;!a&&s>n&&(d.current=!0),a&&(d.current=!1)},[]);e.useEffect(()=>{if(!n)return;const e=c.current;if(!e)return;const t=setTimeout(()=>{e.scrollTo({top:e.scrollHeight,behavior:"instant"})},50);return()=>clearTimeout(t)},[n]),e.useEffect(()=>{const e=c.current;if(!e||!n||0===w.length)return;const t=w.length,s=t>m.current,a=u.current&&!o;(a||s&&!o&&!d.current)&&requestAnimationFrame(()=>{const t=a?"instant":"smooth";e.scrollTo({top:e.scrollHeight,behavior:t})}),m.current=t,u.current=o},[w.length,n,o]);const M=e.useMemo(()=>{const e=new Map;for(const t of w){const s=t.channelHash,n=e.get(s);n?n.count++:e.set(s,{name:t.channelName||t.channelHash.slice(0,6),hash:t.channelHash,count:1})}return Array.from(e.values()).sort((e,t)=>t.count-e.count)},[w]),C=M.length,[B,S]=e.useState(null),[T,L]=e.useState(!1),_=e.useMemo(()=>B?w.filter(e=>e.channelHash===B):w,[w,B]),F=e.useMemo(()=>{const e=[];let t="";for(const s of _){const n=Gt(s.timestamp);n!==t&&(e.push({type:"date",date:n}),t=n),e.push({type:"message",message:s})}return e},[_]),A=M.slice(0,11),H=M.slice(11),$=H.length>0;return t.jsxs(q,{open:n,onClose:a,size:"lg",motionPlus:!0,solid:!0,children:[t.jsx(Ot,{onClick:a,size:"md",style:{position:"absolute",top:12,right:12,zIndex:10}}),t.jsxs(V,{className:"p-0 flex flex-col h-[80vh] max-h-[700px] rounded-2xl overflow-hidden",children:[t.jsx("div",{className:"flex-shrink-0 px-5 py-4 pr-12",children:t.jsxs("div",{className:"flex items-center justify-between gap-3",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx(Ee,{className:"size-5 text-icon-card-title flex-shrink-0"}),t.jsx("h2",{className:"text-base font-semibold text-text-primary",children:"Public Channels"})]}),t.jsx(de,{ranges:R,selectedIndex:b,onSelect:N,size:"micro"})]})}),C>0&&t.jsx("div",{className:"flex-shrink-0 px-3 pb-2",children:t.jsxs("div",{className:"flex flex-wrap gap-1",children:[t.jsx("button",{onClick:()=>S(null),className:s("px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",null===B?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:"All"}),A.map(e=>t.jsx("button",{onClick:()=>S(e.hash),className:s("flex items-center gap-1 px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",B===e.hash?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:t.jsx("span",{className:"truncate max-w-[80px]",children:e.name})},e.hash)),$&&t.jsxs("div",{className:"relative",children:[t.jsxs("button",{onClick:()=>L(!T),className:s("flex items-center gap-0.5 px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",T||H.some(e=>e.hash===B)?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:["+",H.length,t.jsx(U,{className:s("size-3 transition-transform",T&&"rotate-180")})]}),T&&t.jsx("div",{className:s("absolute top-full left-0 mt-1 z-20","min-w-[140px] max-h-[200px] overflow-y-auto","p-1 rounded-lg","bg-bg-elevated/95 backdrop-blur-md","ring-1 ring-border-subtle shadow-lg"),children:H.map(e=>t.jsxs("button",{onClick:()=>{S(e.hash),L(!1)},className:s("w-full flex items-center gap-1.5 px-2 py-1 rounded text-[10px] font-medium transition-all text-left",B===e.hash?"bg-accent-primary/20 text-accent-primary":"text-text-secondary hover:bg-white/10"),children:[t.jsx(Se,{className:"size-2.5 opacity-60 flex-shrink-0"}),t.jsx("span",{className:"truncate",children:e.name}),t.jsxs("span",{className:"opacity-60 ml-auto",children:["(",e.count,")"]})]},e.hash))})]})]})}),t.jsx("div",{ref:c,className:s("flex-1 overflow-y-auto overflow-x-hidden","mx-3 mb-3 rounded-md","bg-bg-0","ring-1 ring-inset ring-white/10"),style:{minHeight:0},onWheel:v,onScroll:k,children:t.jsx(y.div,{className:"px-4 py-4 space-y-3",style:{y:x},children:o&&0===_.length?t.jsxs("div",{className:"flex flex-col items-center justify-center h-full min-h-[300px] text-text-muted",children:[t.jsx(Te,{className:"size-12 mb-4 text-accent-purple animate-spin"}),t.jsx("p",{className:"text-lg font-medium",children:"Loading messages..."})]}):0===_.length?t.jsxs("div",{className:"flex flex-col items-center justify-center h-full min-h-[300px] text-text-muted",children:[t.jsx(ve,{className:"size-16 mb-4 opacity-20"}),t.jsx("p",{className:"text-lg font-medium",children:"No messages yet"}),t.jsx("p",{className:"text-sm mt-1 opacity-70",children:B?"No messages in this channel":"Public channel messages will appear here"})]}):t.jsxs(t.Fragment,{children:[o?t.jsx("div",{className:"space-y-3",children:F.map((e,n)=>{if("date"===e.type)return t.jsx("div",{className:"flex justify-center my-5",children:t.jsx("span",{className:s("px-3.5 py-1.5 rounded-full","bg-white/5 backdrop-blur-sm","text-[11px] text-text-muted/80 font-medium","ring-1 ring-white/5"),children:e.date})},`date-${e.date}-${n}`);const a=`msg-${e.message.timestamp}-${e.message.senderName||"anon"}-${e.message.channelHash}`;return t.jsx("div",{children:t.jsx(ss,{message:e.message,onChannelClick:S,isChannelSelected:B===e.message.channelHash})},a)})}):t.jsx(j,{initial:!1,mode:"sync",children:F.map((e,n)=>{if("date"===e.type)return t.jsx(y.div,{initial:{opacity:0,y:12},animate:{opacity:1,y:0},transition:es,className:"flex justify-center my-5",children:t.jsx("span",{className:s("px-3.5 py-1.5 rounded-full","bg-white/5 backdrop-blur-sm","text-[11px] text-text-muted/80 font-medium","ring-1 ring-white/5"),children:e.date})},`date-${e.date}-${n}`);const a=`msg-${e.message.timestamp}-${e.message.senderName||"anon"}-${e.message.channelHash}`;return t.jsx(y.div,{initial:{opacity:0,y:12},animate:{opacity:1,y:0},transition:es,children:t.jsx(ss,{message:e.message,onChannelClick:S,isChannelSelected:B===e.message.channelHash})},a)})}),t.jsx("div",{className:"h-2"})]})})}),t.jsx("div",{className:"flex-shrink-0 px-5 py-2 text-center",children:t.jsxs("p",{className:"text-[11px] text-text-muted",children:[_.length," messages · ",C," ",1===C?"channel":"channels",o&&t.jsxs("span",{className:"ml-2 text-accent-purple",children:[t.jsx(Te,{className:"inline size-3 animate-spin mr-1"}),"Decrypting..."]})]})})]})]})}function as({isLoaded:n=!0}){const a=w(),[i,l]=e.useState(!1),r=e.useCallback(()=>{l(!0),P.getState().queueDecryption(a)},[a]),o=E(),c=z(),d=e.useMemo(()=>function(e){const t=[],s=new Set;for(const n of e.values()){const e=n.decoded;if(!e||!e.decrypted||e.macCorrupted||!e.text)continue;const a=Xt(e.senderName,e.channelHash,e.text);s.has(a)||(s.add(a),t.push({timestamp:n.timestamp,channelName:e.channelName,channelHash:e.channelHash,senderName:e.senderName,text:e.text,rssi:n.rssi,snr:n.snr}))}return t}(o),[o]),m=e.useMemo(()=>0===d.length?null:d.reduce((e,t)=>t.timestamp>e.timestamp?t:e),[d]),u=e.useMemo(()=>a.filter(e=>(e.type??e.payload_type)===I.GRP_TXT&&e.raw_packet).length,[a]),h=c.isDecoding,x=c.processed{},[]);return n?t.jsxs(t.Fragment,{children:[t.jsx("div",{onClick:r,className:s("group cursor-pointer rounded-xl transition-all duration-150","ring-1 ring-inset ring-white/10 hover:ring-accent-primary/50","hover:bg-white/[0.02]","px-3 py-2.5 sm:px-4 sm:py-3"),children:t.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[t.jsxs("div",{className:"flex items-center gap-2 sm:gap-3 flex-shrink-0",children:[t.jsx(Ee,{className:"size-4 text-icon-card-title flex-shrink-0"}),t.jsx("span",{className:"type-micro",children:"CHAT ACTIVITY"}),u>0&&t.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded-md bg-white/5 ring-1 ring-inset ring-white/10 text-sm tabular-nums text-text-secondary",children:u}),t.jsx(Be,{className:"size-4 text-text-muted group-hover:text-accent-purple transition-colors ml-auto sm:hidden"})]}),t.jsxs("div",{className:"flex items-center gap-2 sm:gap-1.5 min-w-0",children:[m?t.jsxs(t.Fragment,{children:[m.channelName&&t.jsxs("span",{className:"hidden sm:inline-flex items-center px-2 py-1 rounded-md bg-white/5 ring-1 ring-inset ring-white/10 text-sm text-text-secondary flex-shrink-0",children:["#",m.channelName.replace(/^#/,"")]}),t.jsx("div",{className:"hidden sm:flex w-[30px] h-[30px] rounded-full items-center justify-center flex-shrink-0 ring-1 ring-white/10",style:{backgroundColor:Kt(Yt(m.senderName||"").cleanName)},children:Yt(m.senderName||"").emoji?t.jsx("span",{className:"text-base",children:Yt(m.senderName||"").emoji}):t.jsx("span",{className:"text-white text-xs font-bold tracking-tighter",children:Qt(m.senderName||"")})}),t.jsx("div",{className:"inline-flex items-center px-3 py-1.5 rounded-2xl rounded-tr-md bg-[#007AFF] shadow-sm min-w-0 flex-1 sm:flex-initial sm:max-w-xs sm:-ml-px",children:t.jsx("span",{className:"text-sm text-white truncate tracking-wide",children:ts(m.text)})}),t.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded-md bg-white/5 ring-1 ring-inset ring-white/10 text-sm tabular-nums text-text-secondary flex-shrink-0",children:W(m.timestamp)})]}):t.jsx("span",{className:"text-sm text-text-muted italic",children:"No messages yet"}),t.jsx(Be,{className:"size-4 text-text-muted group-hover:text-accent-purple transition-colors flex-shrink-0 hidden sm:block ml-1"})]})]})}),t.jsx(ns,{open:i,onClose:()=>l(!1),messages:d,onDecodeMore:f,hasMoreToLoad:x,isDecoding:h})]}):t.jsx("div",{className:"h-14 rounded-xl bg-bg-elevated/50 animate-pulse"})}function is(){var s,n;const a=C(),i=G(),l=w(),r=K(),o=D(),c=O(),d=J(),m=R[o],u=5===o&&!d.threeDayLoadComplete,h=6===o&&!d.sevenDayLoadComplete,x=7===o&&!d.fourteenDayLoadComplete,f=d.isBackgroundLoading&&(u||h||x),p=null==(s=null==a?void 0:a.config)?void 0:s.radio,g=e.useMemo(()=>p?{sf:p.spreading_factor??10,bw:p.bandwidth??25e4,cr:p.coding_rate??5,preamble:p.preamble_length??8}:null,[p]),v=l.length,j=e.useMemo(()=>v?Y(m.minutes,m.buckets,l,a):null,[v,m.minutes,m.buckets,g]),y=e.useMemo(()=>{const e=e=>(null==e?void 0:e.reduce((e,t)=>e+t.count,0))??0,t=e(null==j?void 0:j.received),s=e(null==j?void 0:j.unique_received),n=e(null==j?void 0:j.forwarded),a=e(null==j?void 0:j.dropped),i=e(null==j?void 0:j.transmitted),l=((null==j?void 0:j.time_range_minutes)??m.minutes)/60;return{received:t,uniqueReceived:s,forwarded:n,dropped:a,transmitted:i,rxPerHour:l>0?Math.round(t/l):0,fwdPerHour:l>0?Math.round(n/l):0}},[j,m.minutes]),b=e.useMemo(()=>{if(!l.length)return{totalBytes:0,kbPerHour:0};const e=Date.now()/1e3,t=e-60*m.minutes;let s=0;for(const a of l)a.transmitted||a.timestampe||(s+=a.length??a.payload_length??0);const n=m.minutes/60;return{totalBytes:s,kbPerHour:n>0?Math.round(s/1024/n):0}},[l,m.minutes]),k=(null==a?void 0:a.node_name)??(null==(n=null==a?void 0:a.config)?void 0:n.node_name)??"Unknown Node";return e.useEffect(()=>{k&&"Unknown Node"!==k&&(document.title=`pyMC: ${k}`)},[k]),i?t.jsxs(ee,{className:"p-8 text-center",children:[t.jsx("p",{className:"type-subheading text-accent-red mb-2",children:"Failed to connect to backend"}),t.jsx("p",{className:"type-body text-white/50",children:i}),t.jsx("p",{className:"type-data-sm text-white/40 mt-4",children:"Make sure the backend is running on port 8000"})]}):t.jsxs(te,{children:[t.jsx(se,{title:k,icon:t.jsx(_e,{}),controls:t.jsx(de,{ranges:R,selectedIndex:o,onSelect:c,isPending:f})}),t.jsxs(ne,{children:[t.jsx(as,{isLoaded:r}),t.jsx(De,{template:"hero",children:t.jsxs(ee,{compact:!0,children:[t.jsx(Fe,{icon:t.jsx(Q,{}),title:"PACKETS RECEIVED",badge:m.label,badgeColor:"zinc",actions:r?t.jsxs("div",{className:"data-box",children:[b.kbPerHour," KB/hr"]}):t.jsx("div",{className:"data-box opacity-0",children:"0 KB/hr"})}),t.jsxs("div",{className:"flex flex-wrap gap-4 sm:gap-8",children:[t.jsxs("div",{className:"flex items-end gap-2",children:[t.jsx("div",{className:"type-data-xl text-text-primary",children:r?t.jsx(oe,{value:y.received,className:"font-mono tabular-nums",priority:"high"}):t.jsx("span",{className:"opacity-30",children:"—"})}),t.jsx(N,{color:"zinc",className:"mb-0.5 sm:mb-1",children:"Total Rx"})]}),t.jsxs("div",{className:"flex items-end gap-2",children:[t.jsx("div",{className:"type-data-xl text-text-primary",children:r?t.jsx(oe,{value:y.uniqueReceived,className:"font-mono tabular-nums",priority:"high"}):t.jsx("span",{className:"opacity-30",children:"—"})}),t.jsx(N,{color:"zinc",className:"mb-0.5 sm:mb-1",children:"Unique"})]})]}),t.jsxs("div",{className:"mt-2 packet-byte-chart-height relative",children:[t.jsx("div",{className:"absolute inset-0 flex items-end gap-1 transition-opacity duration-300 "+(r?"opacity-0 pointer-events-none":"opacity-100"),"aria-hidden":r,children:[45,72,33,58,80,42,65,28,55,75,38,62].map((e,s)=>t.jsx("div",{className:"flex-1 bg-subtle-fill rounded-sm animate-pulse",style:{height:`${e}%`}},s))}),t.jsx("div",{className:"h-full transition-opacity duration-300 "+(r?"opacity-100":"opacity-0"),children:t.jsx(st,{packets:l,rangeMinutes:m.minutes,bucketCount:m.buckets})})]})]})}),t.jsxs(De,{template:"compact",children:[t.jsx(Re,{span:6,lg:4,children:t.jsx(at,{value:y.forwarded,receivedCount:y.received,packets:l,rangeMinutes:m.minutes,bucketCount:m.buckets,timeRangeLabel:m.label,icon:t.jsx(Ae,{className:"w-4 h-4"}),isLoaded:r})}),t.jsx(Re,{span:6,lg:4,children:t.jsx(it,{value:y.dropped,receivedCount:y.received,packets:l,rangeMinutes:m.minutes,bucketCount:m.buckets,timeRangeLabel:m.label,icon:t.jsx(ke,{className:"w-4 h-4"}),isLoaded:r})}),t.jsx(Re,{span:12,lg:4,children:t.jsx(ut,{stats:a,receivedBuckets:null==j?void 0:j.received,droppedBuckets:null==j?void 0:j.dropped,forwardedBuckets:null==j?void 0:j.forwarded,bucketDurationSeconds:null==j?void 0:j.bucket_duration_seconds,timeRangeLabel:m.label,isLoaded:r})})]}),t.jsx(It,{isLoaded:r}),t.jsx(ht,{}),a&&t.jsx(De,{template:"auto",children:t.jsx(Ce,{nodeName:k,repeaterVersion:a.version,coreVersion:a.core_version,localHash:a.local_hash,publicKey:a.public_key})})]})]})}export{is as default}; diff --git a/frontend/dist/assets/Dashboard-Hxpnr4og.js b/frontend/dist/assets/Dashboard-Hxpnr4og.js new file mode 100644 index 00000000..a90d8889 --- /dev/null +++ b/frontend/dist/assets/Dashboard-Hxpnr4og.js @@ -0,0 +1 @@ +import{r as e,j as t,c as s,R as n,g as a,Y as i,i as l}from"./vendor-react-Cwum97tW.js";import{c as r,a as o,u as c,A as d,m,S as u,B as h,b as x,d as p,e as f,f as g,w as v,R as j,L as b,h as y,j as N,k as w,D as k,n as M,o as C,p as B,T as S,q as L,r as T,t as _,v as D,x as F,y as R,z as A,C as H,E as P,F as $,G as E,H as z,I,J as q,K as W}from"./index-D22MpaCY.js";import{C as O,S as V,a as G,P as K,b as U,B as J}from"./PageLayout-B53JpmK1.js";import{u as Y}from"./useThemeColors-S-uaxvPT.js";import{S as Q,M as X,c as Z}from"./link-scoring-BnkyjnFT.js";import{A as ee,E as te,T as se}from"./TimeRangeSelector-C89_yLwH.js";import{S as ne,A as ae,P as ie,T as le}from"./PacketList-DSZP-sF4.js";import{T as re,a as oe,M as ce,b as de}from"./trending-up-D5ntwkR1.js";import{C as me,a as ue}from"./DataBox-Bl0vntck.js";import{L as he,b as xe}from"./vendor-core-CDrKesoV.js";import{s as pe,C as fe}from"./SignalIndicator-CBL6VSNS.js";import{Z as ge}from"./zap-Cpbok2bP.js";import{N as ve}from"./NodeInformationCard-CJnzzUo0.js";import{C as je}from"./chevron-right-CZNwXWtt.js";import{H as be}from"./route-ExVvvUtv.js";import{L as ye}from"./loader-circle-2q9lT2qG.js";import{H as Ne}from"./house-D2cJ2w9-.js";import{R as we,C as ke}from"./Grid-BVGRgue6.js";import{C as Me}from"./Card-CCBguhJs.js";import"./deckgl-DTsmDcfs.js";import"./index-bDa2a9Y2.js";import"./payload-decoders-B_w2m9Or.js";import"./arrow-up-DysUUcGL.js";import"./map-pin-kiJDSdn0.js";import"./triangle-alert-TfoZuZfW.js";import"./activity-Cb8TQBuo.js";import"./circle-check-CKXuJpMJ.js";const Ce=r("arrow-up-right",[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]),Be=r("audio-waveform",[["path",{d:"M2 13a2 2 0 0 0 2-2V7a2 2 0 0 1 4 0v13a2 2 0 0 0 4 0V4a2 2 0 0 1 4 0v13a2 2 0 0 0 4 0v-4a2 2 0 0 1 2-2",key:"57tc96"}]]),Se=r("ear",[["path",{d:"M6 8.5a6.5 6.5 0 1 1 13 0c0 6-6 6-6 10a3.5 3.5 0 1 1-7 0",key:"1dfaln"}],["path",{d:"M15 8.5a2.5 2.5 0 0 0-5 0v1a2 2 0 1 1 0 4",key:"1qnva7"}]]),Le=r("megaphone",[["path",{d:"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z",key:"q8bfy3"}],["path",{d:"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14",key:"1853fq"}],["path",{d:"M8 6v8",key:"15ugcq"}]]),Te=r("message-square-text",[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}],["path",{d:"M7 11h10",key:"1twpyw"}],["path",{d:"M7 15h6",key:"d9of3u"}],["path",{d:"M7 7h8",key:"af5zfr"}]]),_e=r("satellite-dish",[["path",{d:"M4 10a7.31 7.31 0 0 0 10 10Z",key:"1fzpp3"}],["path",{d:"m9 15 3-3",key:"88sc13"}],["path",{d:"M17 13a6 6 0 0 0-6-6",key:"15cc6u"}],["path",{d:"M21 13A10 10 0 0 0 11 3",key:"11nf8s"}]]),De=r("square-activity",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M17 12h-2l-2 5-2-10-2 5H7",key:"15hlnc"}]]),Fe=r("timer",[["line",{x1:"10",x2:"14",y1:"2",y2:"2",key:"14vaq8"}],["line",{x1:"12",x2:"15",y1:"14",y2:"11",key:"17fdiu"}],["circle",{cx:"12",cy:"14",r:"8",key:"1e1u0o"}]]);function Re(e){return e<1024?`${e}B`:e<1048576?`${(e/1024).toFixed(1)}K`:`${(e/1048576).toFixed(1)}M`}const Ae=e.memo(function({items:e,direction:n="horizontal",size:a="sm",className:i,highlightedKey:l,onItemClick:r,onItemHover:o}){const c="horizontal"===n,d="sm"===a;return t.jsx("div",{className:s("flex font-mono",c?"flex-wrap gap-x-4 gap-y-1":"flex-col gap-1",d?"text-xs":"text-sm",i),children:e.map(e=>{const n=null!=l&&l!==e.key,a=r||o;return t.jsxs("div",{className:s("flex items-center gap-1.5 transition-opacity",n&&"opacity-30",a&&"cursor-pointer hover:opacity-80"),onClick:()=>null==r?void 0:r(e.key),onMouseEnter:()=>null==o?void 0:o(e.key),onMouseLeave:()=>null==o?void 0:o(null),children:[t.jsx("div",{className:s("shrink-0 rounded-xs",d?"w-3 h-3":"w-4 h-4"),style:{backgroundColor:e.color}}),t.jsx("span",{className:"text-text-secondary whitespace-nowrap",children:e.label}),void 0!==e.value&&t.jsx("span",{className:"text-text-muted tabular-nums",children:e.formatValue?e.formatValue(e.value):e.value})]},e.key)})})}),He="#AD7F58",Pe={4:"#3B82F6",5:"#5B5BD6",6:"#8E4EC6",0:"#00A2C7",2:"#12A594",7:"#46A758",1:"#F5D90A",10:"#FFB224",8:"#F76B15",9:"#E5484D",3:"#D6409F",15:He},$e=He;function Ee(e){return Pe[e]??$e}let ze=null,Ie=0;const qe=1e3;function We({activeTypes:e,totalByType:s}){const n=[...e].reverse().map(e=>({key:String(e),label:o[e]??`TYPE_${e}`,color:Ee(e),value:s[e]??0,formatValue:e=>Re(e)}));return t.jsx(Ae,{items:n})}const Oe=e.memo(function({buckets:s,activeTypes:n,onHover:a,gridColor:i="rgba(255,255,255,0.1)",axisTickColor:l="rgba(255,255,255,0.6)"}){const r=e.useRef(null),o=e.useRef(s),d=e.useRef(n);o.current=s,d.current=n;const m=e.useMemo(()=>[s.map(e=>e.start),s.map(()=>1)],[s]);return e.useEffect(()=>{if(!r.current||0===s.length)return;const e=r.current,t=e.getBoundingClientRect(),n={width:Math.floor(t.width)||400,height:Math.floor(t.height)||200,padding:[8,8,28,48],cursor:{show:!0,x:!0,y:!1,points:{show:!1}},scales:{x:{time:!1},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],legend:{show:!1},hooks:{draw:[e=>{const t=e.ctx,{left:s,top:n,width:a,height:r}=e.bbox,c=window.devicePixelRatio||1;!function(e,t,s,n,a,i,l){if(0===t.length||0===s.length)return;const r=t.length,o=i/r;let c=0;for(const d of t)d.totalBytes>c&&(c=d.totalBytes);0===c&&(c=1);for(let d=0;dc&&(c=g.totalBytes);if(0===c)return;const d=function(){const e=performance.now();if(ze&&e-Ie{const t=e.cursor.idx,s=e.cursor.left,n=e.bbox.width/(window.devicePixelRatio||1),i=null!=s&&n>0?Math.max(0,Math.min(1,s/n)):null;null!=t&&t>=0&&t{const t=e.getBoundingClientRect();t.width>0&&t.height>0&&u.setSize({width:Math.floor(t.width),height:Math.floor(t.height)})});return h.observe(e),()=>{h.disconnect(),u.destroy()}},[m,i,l,a,s.length]),0===s.length?t.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):t.jsx("div",{ref:r,className:"w-full h-full",onMouseLeave:()=>null==a?void 0:a(null,null,null)})});function Ve({packets:s,rangeMinutes:n,bucketCount:a}){const i=Y(),[l,r]=e.useState(null),[o,c]=e.useState(null),[u,h]=e.useState(null),{buckets:x,activeTypes:p,totalByType:f}=e.useMemo(()=>function(e,t,s){const n=Date.now()/1e3,a=60*t,i=n-a,l=a/s,r=[];for(let c=0;cn)continue;const t=Math.min(s-1,Math.floor((e-i)/l)),a=c.type??c.payload_type??0,d=c.length??c.payload_length??0,m=r[t];m.bytesByType[a]=(m.bytesByType[a]??0)+d,m.totalBytes+=d,o[a]=(o[a]??0)+d}return{buckets:r,activeTypes:Object.keys(o).map(e=>parseInt(e,10)).filter(e=>o[e]>0).sort((e,t)=>o[t]-o[e]),totalByType:o}}(s,n,a),[s,n,a]),g=e.useCallback((e,t,s)=>{r(t),c(s)},[]);if(0===x.length||0===p.length)return t.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No packet data"});const v=l?function(e){const t=new Date(1e3*e).getHours();return t>=6&&t<18}(l.start):null,j=l?(b=l.start,new Date(1e3*b).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1})):"";var b;const y=null!==u&&null!==v&&u!==v;return v!==u&&h(v),t.jsxs("div",{className:"flex flex-col h-full relative",children:[t.jsx("div",{className:"h-5 relative mb-1",children:l&&null!==o&&t.jsxs("div",{className:"absolute flex items-center gap-1.5 text-sm font-mono tabular-nums -translate-x-1/2",style:{left:`calc(48px + ${100*o}% * (1 - 48px / 100%))`},children:[t.jsx(d,{mode:"wait",children:t.jsx(m.span,{initial:!!y&&{opacity:0,scale:.5,rotate:-90},animate:{opacity:1,scale:1,rotate:0},exit:{opacity:0,scale:.5,rotate:90},transition:{duration:.25,ease:"easeOut"},children:v?t.jsx(Q,{className:"w-4 h-4 text-amber-400"}):t.jsx(X,{className:"w-4 h-4 text-blue-400"})},v?"sun":"moon")}),t.jsx("span",{className:"text-text-secondary",children:j})]})}),t.jsx("div",{className:"flex-1 min-h-0",children:t.jsx(Oe,{buckets:x,activeTypes:p,gridColor:i.grid,axisTickColor:i.axisTick,onHover:g})}),t.jsxs("div",{className:"pt-2 px-1 pb-2",children:[" ",t.jsx(We,{activeTypes:p,totalByType:f})]})]})}const Ge=e.memo(function({buckets:s,activeTypes:n}){const a=e.useRef(null),i=e.useRef(s),l=e.useRef(n);i.current=s,l.current=n;const r=e.useMemo(()=>[s.map(e=>e.start),s.map(()=>1)],[s]);return e.useEffect(()=>{if(!a.current||0===s.length)return;const e=a.current,t=e.getBoundingClientRect(),n=Math.floor(t.width)||200,o=Math.floor(t.height)||60,d=new c({width:n,height:o,padding:[0,0,0,0],cursor:{show:!1},scales:{x:{time:!1},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],legend:{show:!1},hooks:{draw:[e=>{const t=e.ctx,{left:s,top:n,width:a,height:r}=e.bbox;!function(e,t,s,n,a,i,l){if(0===t.length)return;const r=function(e,t,s){var n,a;if(e.length<=s)return e;const i=e.length/s,l=[];for(let r=0;r0&&(d.bytesByType[s]=(d.bytesByType[s]??0)+t)}}l.push(d)}return l}(t,s,u.statsCard),o=r.length,c=i/o,d=r.map(e=>e.totalBytes).filter(e=>e>0);if(0===d.length)return;const m=Math.max(...d),h=Math.min(...d),x=m-h;for(let u=0;u{const t=e.getBoundingClientRect();t.width>0&&t.height>0&&d.setSize({width:Math.floor(t.width),height:Math.floor(t.height)})});return m.observe(e),()=>{m.disconnect(),d.destroy()}},[r,s.length]),0===s.length?t.jsx("div",{className:"h-full flex items-center justify-center",children:t.jsx("div",{className:"w-full h-0.5 rounded-full bg-text-muted/15"})}):t.jsx("div",{ref:a,className:"w-full h-full"})});function Ke({value:s,receivedCount:n,packets:a,rangeMinutes:i,bucketCount:l,timeRangeLabel:r,icon:o,isLoaded:c=!0}){const{buckets:d,activeTypes:m,ratePerHour:u}=e.useMemo(()=>function(e,t,s){const n=Date.now()/1e3,a=60*t,i=n-a,l=a/s,r=[];for(let m=0;mn)continue;const t=Math.min(s-1,Math.floor((e-i)/l)),a=m.type??m.payload_type??0,d=m.length??m.payload_length??0,u=r[t];u.bytesByType[a]=(u.bytesByType[a]??0)+d,u.totalBytes+=d,o[a]=(o[a]??0)+d,c++}const d=t/60;return{buckets:r,activeTypes:Object.keys(o).map(e=>parseInt(e,10)).filter(e=>o[e]>0).sort((e,t)=>o[t]-o[e]),ratePerHour:d>0?Math.round(c/d):0}}(a,i,l),[a,i,l]),x=n>0?(s/n*100).toFixed(1):null;return c?t.jsxs("div",{className:"data-card flex flex-col relative",children:[t.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 mb-2 sm:mb-3",children:[o&&t.jsx("span",{className:"icon-sm text-icon-card-title",children:o}),t.jsx("span",{className:"type-micro",children:"FORWARDED"}),r&&t.jsx(h,{color:"zinc",className:"hidden sm:inline-flex",children:r})]}),t.jsx("div",{className:"type-data-xl text-text-primary",children:t.jsx(ee,{value:s,className:"font-mono tabular-nums",priority:"high"})}),t.jsx("div",{className:"flex-1 mt-1 overflow-hidden min-h-[40px] sm:min-h-[60px]",children:m.length>0?t.jsx(Ge,{buckets:d,activeTypes:m}):t.jsx("div",{className:"w-full h-full flex items-center justify-center",children:t.jsx("div",{className:"w-full h-0.5 rounded-full bg-text-muted/15"})})}),t.jsx("div",{className:"pt-1.5 sm:pt-2 mt-1",children:t.jsxs("div",{className:"flex gap-2 sm:gap-3",children:[t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Rate"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[u,"/hr"]})]}),null!==x&&t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Ratio"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[x,"%"]})]})]})})]}):t.jsx("div",{className:"data-card flex flex-col relative",children:t.jsx(O,{})})}function Ue({value:s,receivedCount:n,packets:a,rangeMinutes:i,bucketCount:l,timeRangeLabel:r,icon:o,isLoaded:c=!0}){const{buckets:d,activeTypes:m,ratePerHour:u}=e.useMemo(()=>function(e,t,s){const n=Date.now()/1e3,a=60*t,i=n-a,l=a/s,r=[];for(let m=0;mn)continue;const t=Math.min(s-1,Math.floor((e-i)/l)),a=m.type??m.payload_type??0,d=m.length??m.payload_length??0,u=r[t];u.bytesByType[a]=(u.bytesByType[a]??0)+d,u.totalBytes+=d,o[a]=(o[a]??0)+d,c++}const d=t/60;return{buckets:r,activeTypes:Object.keys(o).map(e=>parseInt(e,10)).filter(e=>o[e]>0).sort((e,t)=>o[t]-o[e]),ratePerHour:d>0?Math.round(c/d):0}}(a,i,l),[a,i,l]),x=n>0?(s/n*100).toFixed(1):null;return c?t.jsxs("div",{className:"data-card flex flex-col relative",children:[t.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 mb-2 sm:mb-3",children:[o&&t.jsx("span",{className:"icon-sm text-icon-card-title",children:o}),t.jsx("span",{className:"type-micro",children:"DROPPED"}),r&&t.jsx(h,{color:"zinc",className:"hidden sm:inline-flex",children:r})]}),t.jsx("div",{className:"type-data-xl text-text-primary",children:t.jsx(ee,{value:s,className:"font-mono tabular-nums",priority:"high"})}),t.jsx("div",{className:"flex-1 mt-1 overflow-hidden min-h-[40px] sm:min-h-[60px]",children:m.length>0?t.jsx(Ge,{buckets:d,activeTypes:m}):t.jsx("div",{className:"w-full h-full flex items-center justify-center",children:t.jsx("div",{className:"w-full h-0.5 rounded-full bg-text-muted/15"})})}),t.jsx("div",{className:"pt-1.5 sm:pt-2 mt-1",children:t.jsxs("div",{className:"flex gap-2 sm:gap-3",children:[t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Rate"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[u,"/hr"]})]}),null!==x&&t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"data-box-label",children:"Drop %"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[x,"%"]})]})]})})]}):t.jsx("div",{className:"data-card flex flex-col relative",children:t.jsx(O,{})})}const Je={",":"punc",".":"punc-period",":":"punc-colon","/":"punc-slash"},Ye=/([,\.:\/])/g,Qe=e.memo(function({children:s,className:n="",as:a="span"}){const i=e.useMemo(()=>{let e;return e="number"==typeof s?s.toLocaleString():Array.isArray(s)?s.join(""):String(s??""),Ye.test(e)?(Ye.lastIndex=0,e.split(Ye).map((e,s)=>{const n=Je[e];return n?t.jsx("span",{className:n,children:e},s):e})):e},[s]);return t.jsx(a,{className:`data-tight ${n}`.trim(),children:i})}),Xe=.2;function Ze(e,t=1){return Math.floor(5*t*e)}function et(e){const t=Math.round(e/Xe)*Xe;return Math.max(0,Math.min(5,t))}function tt({stats:s,receivedBuckets:n,droppedBuckets:a,forwardedBuckets:i,bucketDurationSeconds:l,timeRangeLabel:r,isLoaded:o=!0}){var c,d,m,u;const[x,p]=e.useState(!1);if(!o)return t.jsx("div",{className:"data-card flex flex-col relative",children:t.jsx(O,{})});const f=function(e,t,s,n,a){var i,l;const r=e=>(null==e?void 0:e.reduce((e,t)=>e+t.count,0))??0,o=r(t),c=r(s),d=r(n),m=o||(null==e?void 0:e.rx_count)||1,u=c||(null==e?void 0:e.dropped_count)||0,h=m>0?u/(m+u)*100:0;let x=0;if((null==n?void 0:n.length)&&a)x=100*d/(n.length*a*1e3)*100;else if(e){const t=1e3*(e.uptime_seconds||1);x=(e.total_airtime_ms||e.airtime_used_ms||0)/t*100}const p=(null==e?void 0:e.neighbors)??{},f=Object.values(p).filter(e=>e.zero_hop).length;let g=1;h<3?g-=Xe:h>15?g+=.4:h>10&&(g+=Xe),x>5&&(g+=Xe),f>10&&(g+=Xe);const v=et(g),j=et(.28*v),b=Ze(v),y=Ze(j),N=Ze((null==(l=null==(i=null==e?void 0:e.config)?void 0:i.delays)?void 0:l.tx_delay_factor)??1);return{floodFactor:v,directFactor:j,floodSlots:b,directSlots:y,adjustment:b>N?"increase":b{const e=`set txdelay ${f.floodFactor.toFixed(1)}\nset direct.txdelay ${f.directFactor.toFixed(1)}`;try{await navigator.clipboard.writeText(e),p(!0),setTimeout(()=>p(!1),1500)}catch(t){const s=document.createElement("textarea");s.value=e,s.style.position="fixed",s.style.opacity="0",document.body.appendChild(s),s.select();try{document.execCommand("copy"),p(!0),setTimeout(()=>p(!1),1500)}catch{}document.body.removeChild(s)}},className:"flex gap-3 mb-2 sm:mb-3 w-full text-left hover:bg-white/[0.02] radius-inner transition-base p-1 -m-1 group",title:"Click to copy CLI commands",children:[t.jsxs("div",{className:"flex-1 flex flex-col",children:[t.jsx("span",{className:"type-data-xl text-text-primary",children:t.jsxs(Qe,{children:["×",f.floodFactor.toFixed(1)]})}),t.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide mt-0.5 sm:mt-1",children:"Flood"})]}),t.jsxs("div",{className:"flex-1 flex flex-col",children:[t.jsx("span",{className:"type-data-xl text-accent-primary",children:t.jsxs(Qe,{children:["×",f.directFactor.toFixed(1)]})}),t.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide mt-0.5 sm:mt-1",children:"Direct"})]}),t.jsx("div",{className:"flex items-center self-center opacity-0 group-hover:opacity-100 transition-opacity",children:x?t.jsx(me,{className:"w-4 h-4 text-green-400"}):t.jsx(ue,{className:"w-4 h-4 text-text-muted"})})]}),t.jsx("div",{className:"flex-1 py-2",children:t.jsxs("div",{className:"flex gap-3",children:[t.jsxs("div",{className:"flex-1",children:[t.jsx("div",{className:"data-box-label",children:"Dupe"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left "+(f.duplicateRate>10?"text-accent-warning":""),children:[f.duplicateRate.toFixed(1),"%"]})]}),t.jsxs("div",{className:"flex-1",children:[t.jsx("div",{className:"data-box-label",children:"TX Util"}),t.jsxs("div",{className:"data-box data-box-fill data-box-left",children:[f.txUtilization.toFixed(2),"%"]})]})]})}),t.jsxs("div",{className:"pt-2 mt-2",children:[t.jsx("div",{className:"data-box-label",children:"Current"}),t.jsx("div",{className:"flex gap-2",children:null!==g?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"data-box",children:["×",g.toFixed(2)]}),t.jsxs("div",{className:"data-box",style:{color:"var(--accent-primary)"},children:["×",(null==v?void 0:v.toFixed(2))??"—"]})]}):t.jsx("span",{className:"text-sm text-text-muted",children:"No config"})})]})]})}function st(){const s=x(),n=p(),a=f(),i=g(),[l,r]=e.useState([]);e.useEffect(()=>{const e=v.subscribe(e=>{r(e)});return r(v.getPendingPackets()),e},[]);const o=e.useMemo(()=>{const e=s.length<=100?s:s.slice(-100),t=new Set(e.map(e=>e.packet_hash));return[...l.filter(e=>!t.has(e.packet.packet_hash)).map(e=>({...e.packet,isPending:!0})),...e].sort((e,t)=>(t.timestamp??0)-(e.timestamp??0))},[s,l]),c=null==i?void 0:i.local_hash,d=null==i?void 0:i.neighbors;return t.jsxs("div",{className:"chart-container h-full flex flex-col !overflow-visible",children:[t.jsxs("div",{className:"chart-header",children:[t.jsxs("div",{className:"chart-title",children:[t.jsx(j,{className:"chart-title-icon"}),"Recent Packets"]}),t.jsxs("div",{className:"flex items-center gap-3",children:[a&&t.jsx(b,{showLabel:!0}),t.jsxs(he,{to:"/packets",className:"pill-subtle",children:["View all ",t.jsx(ae,{className:"w-3 h-3"})]})]})]}),t.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto px-1",children:t.jsx(ie,{packets:o,allPackets:s,localHash:c,neighbors:d,loading:n,maxPackets:50,showPagination:!1,flashNewest:!0,emptyMessage:"No packets received",footerAction:t.jsxs(he,{to:"/packets",className:"pill-subtle",children:["View all ",t.jsx(ae,{className:"w-3 h-3"})]})})})]})}const nt={stable:"M5 12h14",up:"M5 15l7-7 7 7",down:"M19 9l-7 7-7-7"};function at({trend:e}){return t.jsx("span",{className:`mini-widget-trend ${e}`,children:t.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:nt[e]})})})}function it(){return t.jsx("div",{className:"mini-widget-loading",children:t.jsx("div",{className:"mini-widget-loading-spinner"})})}function lt({message:e}){return t.jsx("div",{className:"mini-widget-error",children:t.jsx("span",{title:e,children:"No data"})})}function rt({title:e,icon:s,value:n,unit:a,valueSize:i="md",status:l,subtitle:r,trend:o,children:c,isLoading:d=!1,error:m,className:u="",onClick:h}){const x=["mini-widget-value","lg"===i&&"mini-widget-value-lg","sm"===i&&"mini-widget-value-sm"].filter(Boolean).join(" "),p=["mini-widget",h&&"cursor-pointer",u].filter(Boolean).join(" ");return t.jsxs("div",{className:p,onClick:h,role:h?"button":void 0,children:[t.jsxs("div",{className:"mini-widget-header",children:[s,t.jsx("span",{className:"mini-widget-title",children:e}),l&&"unknown"!==l&&t.jsx("div",{className:`mini-widget-status-dot ${l}`}),o&&t.jsx(at,{trend:o})]}),d?t.jsx(it,{}):m?t.jsx(lt,{message:m}):t.jsxs(t.Fragment,{children:[void 0!==n&&t.jsxs("div",{className:x,children:["number"==typeof n?t.jsx(ee,{value:n,className:"font-mono tabular-nums",priority:"medium",format:Number.isInteger(n)?void 0:{minimumFractionDigits:1,maximumFractionDigits:1}}):t.jsx(Qe,{children:n}),a&&t.jsx("span",{className:"mini-widget-unit",children:a})]}),r&&t.jsx("div",{className:"mini-widget-subtitle",children:r}),c]})]})}const ot={DELTA_CRITICAL:10,SLOPE_CRITICAL:4,JITTER_CRITICAL:6,DELTA_WARNING:5,SLOPE_WARNING:2,JITTER_WARNING:4},ct={baselineMedian:null,baselineP10:null,baselineP90:null,currentMedian:null,currentSampleCount:0,delta:0,slope:0,jitter:0,penalty:0,penaltyReason:null,computedAt:0,isReliable:!1};function dt(e,t){if(0===e.length)return null;const s=[...e].sort((e,t)=>e-t),n=t/100*(s.length-1),a=Math.floor(n),i=Math.ceil(n);return a===i?s[a]:s[a]+(s[i]-s[a])*(n-a)}function mt(e){return dt(e,50)}function ut(e){if(!e)return[];try{const t=JSON.parse(e);if(Array.isArray(t))return t.map(Number).filter(e=>!isNaN(e))}catch{}return[]}function ht(e){return null!=e&&0!==e&&!Object.is(e,-0)&&!(e>-50||e<-130)}function xt(e,t,s=2,n=!1){if(null===t)return"stable";const a=e-t;return(0!==t?100*Math.abs(a/t):Math.abs(a))0?"up":"down":a>0?"down":"up"}const pt={lbtStats:null,noiseFloor:null,sparklineNoiseFloor:[],linkQuality:null,channelHealth:null,nfTrend:ct,radioConfig:null,trends:null,stats:null,recentPackets:[],quickNeighbors:[],isLoading:!0,error:null,refresh:async()=>{}},ft=e.createContext(pt);function gt({children:s}){var n;const a=g(),i=x(),l=y(),r=N(),o=w(),c=k[o],d=Math.max(1,c.minutes/60),m=null===a,u=e.useMemo(()=>function(e,t){const s=3600*t,n=Math.floor(Date.now()/1e3)-s,a=e.filter(e=>e.timestamp>=n&&void 0!==e.lbt_attempts&&e.lbt_attempts>0),i=a.length,l=a.filter(e=>(e.lbt_attempts??0)>1).length,r=i>0?l/i*100:0,o=a.filter(e=>(e.lbt_attempts??0)>1),c=o.length>0?o.reduce((e,t)=>e+(t.lbt_attempts??0),0)/o.length:0,d=a.filter(e=>(e.lbt_attempts??0)>=5).length,m=i>0?d/i*100:0,u=[];for(const b of a){const e=ut(b.lbt_backoff_delays_ms);u.push(...e)}const h=u.reduce((e,t)=>e+t,0),x=u.length>0?h/u.length:0,p=u.length>0?Math.min(...u):0,f=u.length>0?Math.max(...u):0,g=s/24,v=[],j=[];for(let b=0;b<24;b++){const e=n+b*g,t=e+g,s=a.filter(s=>s.timestamp>=e&&s.timestamp(e.lbt_attempts??0)>1).length,l=s.length>0?i/s.length*100:0,r=[];for(const n of s){const e=ut(n.lbt_backoff_delays_ms);r.push(...e)}const o=r.length>0?r.reduce((e,t)=>e+t,0)/r.length:0;if(v.push(o),0===s.length)j.push(0);else{const e=s.filter(e=>(e.lbt_attempts??0)>=5).length,t=r.length>0?Math.max(...r):0,n=Math.min(s.length/5,1),a=.15,i=Math.log(1+l*a)/Math.log(1+100*a)*40,c=e/s.length*100,d=Math.min(.5*c,25);let m=0;o>100&&(m=Math.min(8*Math.log10(o/100),15));let u=0;t>500&&o>0&&t>2*o&&(u=Math.min((t-500)/200,5));const h=i+d+m+u;j.push(Math.min(h*n,85))}}return{totalPacketsWithLBT:i,packetsWithRetries:l,retryRate:r,avgRetries:c,channelBusyCount:d,channelBusyRate:m,avgBackoffMs:x,minBackoffMs:p,maxBackoffMs:f,totalBackoffMs:h,sparklineBackoff:v,sparklineCollisionRisk:j,windowHours:t,packetCount:e.length}}(i,d),[i,d]),h=(null==a?void 0:a.noise_floor_dbm)??null,p=e.useMemo(()=>ht(h)?h:null,[h]),f=e.useMemo(()=>{var e;const t=null==(e=null==a?void 0:a.config)?void 0:e.radio;return t?{sf:t.spreading_factor??7,bwHz:t.bandwidth??125e3}:null},[null==(n=null==a?void 0:a.config)?void 0:n.radio]),[v,j]=e.useState([]),b=e.useRef({time:0,hours:0});e.useEffect(()=>{const e=async()=>{var e;const t=Date.now(),s=Math.ceil(d);if(0===b.current.time||b.current.hours!==s||t-b.current.time>=6e4){b.current={time:t,hours:s};try{const t=await M(Math.max(s,24));t.success&&(null==(e=t.data)?void 0:e.history)&&j(t.data.history)}catch{}}};e();const t=setInterval(e,6e4);return()=>clearInterval(t)},[d]);const C=e.useMemo(()=>function(e,t){if(0===e.length)return[];const s=e.reduce((e,t)=>Math.max(e,t.timestamp),0);if(0===s)return[];const n=3600*t,a=s-n,i=n/24,l=[];for(let r=0;r<24;r++){const t=a+r*i,s=t+i,n=e.filter(e=>e.timestamp>=t&&e.timestamp0){const e=n.reduce((e,t)=>e+t.noise_floor_dbm,0)/n.length;l.push(e)}else l.push(l.length>0?l[l.length-1]:-100)}return l}(v,d),[v,d]),B=null==a?void 0:a.neighbors,S=e.useMemo(()=>{const e=B??{};return Object.fromEntries(Object.entries(e).filter(([e])=>!r.has(e)))},[B,r]),L=e.useMemo(()=>l.filter(e=>!r.has(e.hash)),[l,r]),T=e.useMemo(()=>function(e){if(0===e.length)return{...ct,computedAt:Math.floor(Date.now()/1e3)};const t=Math.floor(Date.now()/1e3),s=e.filter(e=>Number.isFinite(e)),n=e.length>0?[e[e.length-1]]:[],a=e.slice(-4).filter(e=>Number.isFinite(e)),i=mt(s),l=dt(s,10),r=dt(s,90),o=mt(n),c=null!==o&&null!==l?o-l:0,d=function(e){if(e.length<2)return 0;const t=e.length;let s=0,n=0,a=0,i=0;const l=e[0].timestamp;for(const o of e){const e=(o.timestamp-l)/3600,t=o.value;s+=e,n+=t,a+=e*t,i+=e*e}const r=t*i-s*s;return Math.abs(r)<1e-4?0:(t*a-s*n)/r}(a.map((e,s)=>({timestamp:t-3600*(a.length-1-s),value:e}))),m=function(e){if(e.length<2)return 0;const t=e.reduce((e,t)=>e+t,0)/e.length,s=e.map(e=>Math.pow(e-t,2)).reduce((e,t)=>e+t,0)/e.length;return Math.sqrt(s)}(a),u=s.length>=12,[h,x]=u?function(e,t,s){const n=ot;return e>=n.DELTA_CRITICAL?[2,`Noise floor ${e.toFixed(1)} dB above baseline`]:t>=n.SLOPE_CRITICAL?[2,`Noise floor rising ${t.toFixed(1)} dB/hour`]:s>=n.JITTER_CRITICAL?[2,`Noise floor unstable (±${s.toFixed(1)} dB)`]:e>=n.DELTA_WARNING?[1,`Noise floor ${e.toFixed(1)} dB above baseline`]:t>=n.SLOPE_WARNING?[1,`Noise floor rising ${t.toFixed(1)} dB/hour`]:s>=n.JITTER_WARNING?[1,`Noise floor variable (±${s.toFixed(1)} dB)`]:[0,null]}(c,d,m):[0,null];return{baselineMedian:i,baselineP10:l,baselineP90:r,currentMedian:o,currentSampleCount:n.length,delta:c,slope:d,jitter:m,penalty:h,penaltyReason:x,computedAt:t,isReliable:u}}(C),[C]),_=e.useMemo(()=>function(e,t,s){if(0===e.length)return{neighbors:[],networkScore:0,neighborCount:0,bestLink:null,worstLink:null};const n=e.map(e=>{const n=function(e,t,s){const n=pe(e,t,s,0);if(n)switch(n.finalGrade){case"excellent":return 100;case"good":return 80;case"fair":return 60;case"poor":return 40;case"critical":return 20}const a=void 0===e?50:e>=10?100:e>=5?80:e>=0?60:e>=-5?40:20,i=void 0===t?50:t>=-70?100:t>=-80?80:t>=-90?60:t>=-100?40:20;return Math.round(.6*a+.4*i)}(e.avgSnr??void 0,e.avgRssi??void 0,s),a=t[e.hash];return{name:(null==a?void 0:a.name)||(null==a?void 0:a.node_name)||e.prefix,hash:e.hash,rssi:e.avgRssi??-100,snr:e.avgSnr??-10,score:n,advertCount:e.count}});n.sort((e,t)=>t.score-e.score);const a=n.length>0?n.reduce((e,t)=>e+t.score,0)/n.length:0;return{neighbors:n,networkScore:Math.round(a),neighborCount:n.length,bestLink:n.length>0?{name:n[0].name,score:n[0].score}:null,worstLink:n.length>0?{name:n[n.length-1].name,score:n[n.length-1].score}:null}}(L,S,f),[L,S,f]),D=e.useMemo(()=>function(e,t,s){const n=e?Math.max(0,Math.min(100,100-5*e.retryRate)):50;let a=50;null!==t&&(a=Math.max(0,Math.min(100,(t+120)/30*100)));const i=(null==s?void 0:s.networkScore)??50,l=Math.round(.35*n+.25*a+.4*i);let r;return r=l>=85?"excellent":l>=70?"good":l>=50?"fair":l>=30?"congested":"critical",{score:l,status:r,components:{lbtHealth:Math.round(n),noiseHealth:Math.round(a),linkHealth:Math.round(i)}}}(u,p,_),[u,p,_]),[F,R]=e.useState({noiseFloor:null,networkScore:null,channelHealth:null}),A=e.useRef(0);e.useEffect(()=>{const e=()=>{const e=Date.now();e-A.current>3e4&&(A.current=e,R({noiseFloor:p,networkScore:(null==_?void 0:_.networkScore)??null,channelHealth:(null==D?void 0:D.score)??null}))};e();const t=setInterval(e,5e3);return()=>clearInterval(t)},[p,null==_?void 0:_.networkScore,null==D?void 0:D.score]);const H=e.useMemo(()=>({noiseFloor:{current:p,previous:F.noiseFloor,trend:null!==p?xt(p,F.noiseFloor,2,!0):"stable"},networkScore:{current:(null==_?void 0:_.networkScore)??0,previous:F.networkScore,trend:xt((null==_?void 0:_.networkScore)??0,F.networkScore,3,!1)},channelHealth:{current:(null==D?void 0:D.score)??0,previous:F.channelHealth,trend:xt((null==D?void 0:D.score)??0,F.channelHealth,3,!1)}}),[p,null==_?void 0:_.networkScore,null==D?void 0:D.score,F]),P={lbtStats:u,noiseFloor:p,sparklineNoiseFloor:C,linkQuality:_,channelHealth:D,nfTrend:T,radioConfig:f,trends:H,stats:a,recentPackets:i,quickNeighbors:l,isLoading:m,error:null,refresh:async()=>{}};return t.jsx(ft.Provider,{value:P,children:s})}function vt(){const t=e.useContext(ft);if(void 0===t)throw new Error("useLBTData must be used within an LBTDataProvider");return t}function jt(e,t){return 0===e?"No backoffs":`${t.toFixed(0)}% retry rate`}function bt(){const{lbtStats:s,isLoading:r,error:o}=vt(),c=xe(),d=(null==s?void 0:s.avgBackoffMs)??0,m=(null==s?void 0:s.retryRate)??0,u=s?(h=d)<100?"excellent":h<250?"good":h<500?"fair":h<1e3?"congested":"critical":"unknown";var h;const x=null==s?void 0:s.sparklineBackoff,{chartData:p,yDomain:f}=e.useMemo(()=>{if(!x||x.length<2)return{chartData:[],yDomain:[0,100]};const e=x.map(e=>({value:e})),t=x.filter(e=>e>0);if(0===t.length)return{chartData:e,yDomain:[0,100]};const s=Math.min(...t),n=Math.max(...t),a=n-s,i=Math.max(.2*a,.1*n,10);return{chartData:e,yDomain:[Math.max(0,s-i),n+i]}},[x]);return t.jsx(rt,{title:"LBT Backoff",icon:t.jsx(Fe,{className:"mini-widget-icon"}),value:Math.round(d),unit:"ms",status:u,subtitle:s?jt(d,m):void 0,isLoading:r,error:o,onClick:()=>c("/packets"),children:t.jsx("div",{className:"mini-widget-sparkline",children:p.length>0?t.jsx(n,{width:"100%",height:24,children:t.jsxs(a,{data:p,margin:{top:2,right:2,bottom:2,left:2},children:[t.jsx(i,{domain:f,hide:!0}),t.jsx(l,{type:"monotone",dataKey:"value",stroke:"var(--accent-primary)",strokeWidth:2,dot:!1,isAnimationActive:!1})]})}):t.jsx("div",{className:"h-full"})})})}function yt(e){return 0===e?"—":e<1?"<1":Math.round(e).toString()}function Nt(){const{lbtStats:e,isLoading:s,error:n}=vt(),a=xe(),i=(null==e?void 0:e.channelBusyCount)??0,l=(null==e?void 0:e.totalPacketsWithLBT)??0,r=(null==e?void 0:e.channelBusyRate)??0,o=(null==e?void 0:e.retryRate)??0,c=(null==e?void 0:e.avgBackoffMs)??0,d=(null==e?void 0:e.minBackoffMs)??0,m=(null==e?void 0:e.maxBackoffMs)??0,u=o>0?Math.max(0,(o-r)/o*100):100;return t.jsx(rt,{title:"Ch. Busy",icon:t.jsx(te,{className:"mini-widget-icon"}),isLoading:s,error:n,onClick:()=>a("/packets"),children:t.jsx("div",{className:"flex-1 flex items-end",children:t.jsxs("div",{className:"grid grid-cols-[auto_minmax(0,1fr)_auto_minmax(0,1fr)] gap-x-2 gap-y-2 w-full items-baseline",children:[t.jsx("span",{className:"data-box-label mb-0",title:`${i} packets exceeded max CAD attempts (5) out of ${l} total transmissions.`,children:"Failed:"}),t.jsxs("div",{className:"data-box justify-self-start",title:`${i} packets exceeded max CAD attempts (5) out of ${l} total transmissions.`,children:[t.jsx(Qe,{children:i}),t.jsx("span",{className:"text-text-muted punc-slash",children:"/"}),t.jsx(Qe,{children:l})]}),t.jsx("span",{className:"data-box-label mb-0",title:`${u.toFixed(1)}% of packets that needed LBT retries were sent successfully.`,children:"Sent:"}),t.jsx("div",{className:"data-box justify-self-start",title:`${u.toFixed(1)}% of packets that needed LBT retries were sent successfully.`,children:t.jsxs(Qe,{children:[u.toFixed(0),"%"]})}),t.jsx("span",{className:"data-box-label mb-0",title:`Average LBT backoff delay: ${c.toFixed(0)}ms.`,children:"Mean:"}),t.jsxs("div",{className:"data-box justify-self-start",title:`Average LBT backoff delay: ${c.toFixed(0)}ms.`,children:[t.jsx(Qe,{children:yt(c)}),t.jsx("span",{className:"text-text-muted text-xs",children:"ms"})]}),t.jsx("span",{className:"data-box-label mb-0",title:`Backoff range: ${d.toFixed(0)}ms min, ${m.toFixed(0)}ms max.`,children:"Range:"}),t.jsxs("div",{className:"data-box justify-self-start",title:`Backoff range: ${d.toFixed(0)}ms min, ${m.toFixed(0)}ms max.`,children:[t.jsx(Qe,{children:yt(d)}),t.jsx("span",{className:"text-text-muted punc-slash",children:"/"}),t.jsx(Qe,{children:yt(m)})]})]})})})}function wt(e){return null===e?"No reading":e<-115?"Very quiet":e<-105?"Quiet":e<-95?"Moderate":e<-85?"Elevated":"High interference"}function kt(){const{noiseFloor:s,sparklineNoiseFloor:r,trends:o,isLoading:c,error:d}=vt(),m=null===(u=s)||u<-110?"excellent":u<-100?"good":u<-90?"fair":u<-80?"congested":"critical";var u;const h=null==o?void 0:o.noiseFloor.trend,{chartData:x,yDomain:p}=e.useMemo(()=>{if(!r||r.length<2)return{chartData:[],yDomain:[-120,-90]};const e=r.map(e=>({value:e})),t=r.filter(e=>-100!==e&&e<-50);if(0===t.length)return{chartData:e,yDomain:[-120,-90]};const s=Math.min(...t),n=Math.max(...t),a=n-s,i=Math.max(.2*a,3);return{chartData:e,yDomain:[s-i,n+i]}},[r]),f=null!==s?Math.round(s):"—";return t.jsx(rt,{title:"Noise Floor",icon:t.jsx(Be,{className:"mini-widget-icon"}),value:f,unit:null!==s?"dBm":void 0,status:m,trend:h,subtitle:wt(s),isLoading:c,error:d,children:t.jsx("div",{className:"mini-widget-sparkline",children:x.length>0?t.jsx(n,{width:"100%",height:24,children:t.jsxs(a,{data:x,margin:{top:2,right:2,bottom:2,left:2},children:[t.jsx(i,{domain:p,hide:!0}),t.jsx(l,{type:"monotone",dataKey:"value",stroke:"var(--accent-primary)",strokeWidth:2,dot:!1,isAnimationActive:!1})]})}):t.jsx("div",{className:"h-full"})})})}function Mt(){const s=xe(),n=y(),a=x(),i=g(),l=w(),r=60*k[l].minutes,o=C(),c=e.useMemo(()=>{if(0===o)return a;const e=o-r;return a.filter(t=>t.timestamp>=e)},[a,r,o]),d=null===i,m=(null==i?void 0:i.local_hash)?B(i.local_hash):"",u=(null==i?void 0:i.neighbors)??{},{neighborHashes:h,neighborNames:p}=e.useMemo(()=>{const e=new Set,t=new Map;for(const s of n){e.add(s.hash);const n=u[s.hash],a=(null==n?void 0:n.name)||(null==n?void 0:n.node_name)||s.prefix;t.set(s.hash,a)}return{neighborHashes:e,neighborNames:t}},[n,u]),f=e.useMemo(()=>{if(0===h.size||0===c.length||!m)return{champion:null,listener:null,loudest:null};const{scores:e}=Z(c,h,m),t=[];for(const[i,l]of e)0!==l.blendedScore&&t.push({...l,name:p.get(i)??B(i)});let s=null,n=null,a=null;for(const i of t)(!s||i.blendedScore>s.blendedScore)&&(s=i),(!n||i.listenerScore>n.listenerScore)&&(n=i),(!a||i.loudScore>a.loudScore)&&(a=i);return{champion:s,listener:n,loudest:a}},[c,h,m,p]),{champion:v,listener:j,loudest:b}=f,N=v||j||b?t.jsxs("div",{className:"flex flex-col gap-0.5 mt-auto",children:[v&&t.jsx(S,{content:(M=v,t.jsxs("div",{className:"max-w-[220px]",children:[t.jsxs("div",{className:"font-semibold mb-1",children:["🏆 Champion: ",M.name]}),t.jsxs("div",{className:"text-text-muted mb-1",children:["Blended Score: ",M.blendedScore,t.jsx("span",{className:"text-text-muted/60 ml-1",children:"(Listener + Loud)"})]}),t.jsxs("div",{className:"border-t border-border-subtle pt-1 mt-1 space-y-0.5",children:[t.jsxs("div",{children:["Listener: ",M.listenerScore,"/100 (",M.listenerCount," shared paths)"]}),t.jsxs("div",{children:["Loud: ",M.loudScore,"/100 (",M.loudCount," packets relayed)"]})]})]})),children:t.jsxs("div",{className:"flex items-center gap-1 text-sm radius-badge px-1 -mx-1 hover-bg transition-base cursor-default",children:[t.jsx(le,{className:"w-3 h-3 text-map-neighbor-color flex-shrink-0"}),t.jsx("span",{className:"font-semibold text-map-neighbor-color font-mono truncate flex-1 min-w-0",children:v.name}),t.jsx("span",{className:"text-map-neighbor-color pl-2 tabular-nums flex-shrink-0 w-9 text-right",children:v.blendedScore})]})}),j&&t.jsx(S,{content:(e=>t.jsxs("div",{className:"max-w-[220px]",children:[t.jsxs("div",{className:"font-semibold mb-1",children:["👂 Best Listener: ",e.name]}),t.jsxs("div",{className:"text-text-muted mb-1",children:["Score: ",e.listenerScore,"/100"]}),t.jsx("div",{className:"border-t border-border-subtle pt-1 mt-1",children:t.jsxs("div",{children:[e.listenerCount," packets where they heard your transmissions"]})})]}))(j),children:t.jsxs("div",{className:"flex items-center gap-1 text-sm radius-badge px-1 -mx-1 hover-bg transition-base cursor-default",children:[t.jsx(Se,{className:"w-3 h-3 text-text-muted flex-shrink-0"}),t.jsx("span",{className:"text-text-muted font-mono truncate flex-1 min-w-0",children:j.name}),t.jsx("span",{className:"text-text-muted pl-2 tabular-nums flex-shrink-0 w-9 text-right",children:j.listenerScore})]})}),b&&t.jsx(S,{content:(e=>t.jsxs("div",{className:"max-w-[220px]",children:[t.jsxs("div",{className:"font-semibold mb-1",children:["📢 Loudest: ",e.name]}),t.jsxs("div",{className:"text-text-muted mb-1",children:["Score: ",e.loudScore,"/100"]}),t.jsx("div",{className:"border-t border-border-subtle pt-1 mt-1",children:t.jsxs("div",{children:[e.loudCount," packets they relayed directly to you"]})})]}))(b),children:t.jsxs("div",{className:"flex items-center gap-1 text-sm radius-badge px-1 -mx-1 hover-bg transition-base cursor-default",children:[t.jsx(Le,{className:"w-3 h-3 text-text-muted flex-shrink-0"}),t.jsx("span",{className:"text-text-muted font-mono truncate flex-1 min-w-0",children:b.name}),t.jsx("span",{className:"text-text-muted pl-2 tabular-nums flex-shrink-0 w-9 text-right",children:b.loudScore})]})})]}):0===n.length?t.jsx("div",{className:"flex items-center justify-center text-sm text-text-muted mt-auto",children:"No direct neighbors"}):t.jsx("div",{className:"flex items-center justify-center text-sm text-text-muted mt-auto",children:"No routing data yet"});var M;return t.jsx(rt,{title:"Link Leaders",icon:t.jsx(_e,{className:"mini-widget-icon"}),isLoading:d,onClick:()=>s("/contacts"),children:N})}function Ct(){const{lbtStats:s,isLoading:r,error:o}=vt(),c=s?function(e){const{retryRate:t,channelBusyCount:s,totalPacketsWithLBT:n,avgBackoffMs:a,maxBackoffMs:i}=e;if(0===n)return 0;const l=Math.min(n/10,1),r=Math.log(1+.15*t)/Math.log(16)*40,o=s/n*100,c=Math.min(.5*o,25);let d=0;a>100&&(d=Math.min(8*Math.log10(a/100),15));let m=0;i>500&&a>0&&i>2*a&&(m=Math.min((i-500)/200,5));const u=(r+c+d+m)*l;return Math.min(u,85)}(s):0,d=s?(m=c)<15?"excellent":m<30?"good":m<45?"fair":m<60?"congested":"critical":"unknown";var m;const u=(null==s?void 0:s.maxBackoffMs)??0,h=s?u>200?`Max backoff: ${Math.round(u)}ms`:function(e){return e<15?"Clear channel":e<30?"Light traffic":e<45?"Moderate traffic":e<60?"Heavy traffic":e<75?"Congested":"Severe congestion"}(c):void 0,x=null==s?void 0:s.sparklineCollisionRisk,{chartData:p,yDomain:f}=e.useMemo(()=>{if(!x||x.length<2)return{chartData:[],yDomain:[0,85]};const e=x.map(e=>({value:e})),t=x.filter(e=>e>0);if(0===t.length)return{chartData:e,yDomain:[0,85]};const s=Math.min(...t),n=Math.max(...t),a=n-s,i=Math.max(.2*a,5);return{chartData:e,yDomain:[Math.max(0,s-i),Math.min(85,n+i)]}},[x]),g=Math.round(10*c)/10;return t.jsx(rt,{title:"Collision Risk",icon:t.jsx(ge,{className:"mini-widget-icon"}),value:g,unit:"%",status:d,subtitle:h,isLoading:r,error:o,children:t.jsx("div",{className:"mini-widget-sparkline",children:p.length>0?t.jsx(n,{width:"100%",height:24,children:t.jsxs(a,{data:p,margin:{top:2,right:2,bottom:2,left:2},children:[t.jsx(i,{domain:f,hide:!0}),t.jsx(l,{type:"monotone",dataKey:"value",stroke:"var(--accent-primary)",strokeWidth:2,dot:!1,isAnimationActive:!1})]})}):t.jsx("div",{className:"h-full"})})})}function Bt(){const[s,n]=e.useState(!1),[a]=e.useState(0),{stats:i,lbtStats:l,isLoading:r}=vt(),o=e.useMemo(()=>{if(!i)return null;const e=i.airtime_used_ms??0,t=i.max_airtime_ms??1;return{usedMs:e,maxMs:t,remainingMs:i.airtime_remaining_ms??0,utilizationPercent:i.utilization_percent??(t>0?e/t*100:0)}},[i]),c=e.useMemo(()=>l&&0!==l.totalPacketsWithLBT?(l.totalPacketsWithLBT-l.packetsWithRetries)/l.totalPacketsWithLBT*100:100,[l]),d=(null==o?void 0:o.utilizationPercent)??0,m=(u=d)<30?"excellent":u<50?"good":u<70?"fair":u<90?"congested":"critical";var u;const h=(null==o?void 0:o.remainingMs)??0,x=c<95?`${c.toFixed(0)}% clean TX`:((p=h)<1e3?`${Math.round(p)}ms`:p<6e4?`${(p/1e3).toFixed(1)}s`:`${(p/6e4).toFixed(1)}m`)+" remaining";var p;const f=o?t.jsx("div",{className:"mini-widget-progress mt-auto",children:t.jsx("div",{className:`mini-widget-progress-bar ${m}`,style:{width:`${Math.min(d,100)}%`}})}):null;return t.jsx(rt,{title:"Duty Cycle",icon:t.jsx(j,{className:"mini-widget-icon"}),value:d.toFixed(1),unit:"%",status:m,subtitle:x,isLoading:r,children:f})}function St(){return t.jsxs("div",{className:"mini-widget",children:[t.jsxs("div",{className:"mini-widget-header",children:[t.jsx(V,{className:"w-4 h-4"}),t.jsx(V,{className:"h-3 w-16"})]}),t.jsx(V,{className:"h-7 w-12 mt-2"}),t.jsx(V,{className:"h-3 w-20 mt-2"})]})}function Lt(){return t.jsx("div",{className:"widget-row",children:Array.from({length:6}).map((e,s)=>t.jsx(St,{},s))})}function Tt({className:e="",isLoaded:s=!0}){return t.jsxs("div",{className:`mesh-health-container relative ${e}`,children:[t.jsxs("div",{className:"mesh-health-header",children:[t.jsx(De,{className:"w-4 h-4 text-accent-primary"}),t.jsx("span",{className:"type-label text-text-muted",children:"MESH HEALTH"})]}),s?t.jsx(gt,{children:t.jsxs("div",{className:"widget-row",children:[t.jsx(bt,{}),t.jsx(Ct,{}),t.jsx(kt,{}),t.jsx(Bt,{}),t.jsx(Nt,{}),t.jsx(Mt,{})]})}):t.jsx(Lt,{})]})}const _t={sm:{button:"w-3 h-3",icon:"w-1.5 h-1.5",stroke:"ring-1"},md:{button:"w-3.5 h-3.5",icon:"w-2 h-2",stroke:"ring-1"},lg:{button:"w-4 h-4",icon:"w-2.5 h-2.5",stroke:"ring-[1.5px]"}},Dt=e.forwardRef(function({size:e="md",showIconOnHover:n=!0,className:a,...i},l){const r=_t[e];return t.jsx("button",{ref:l,type:"button","aria-label":"Close",className:s("group relative inline-flex items-center justify-center rounded-full","transition-all duration-150 ease-out",r.button,"bg-[#FF5F57]",r.stroke,"ring-inset ring-[#E0443E]","hover:bg-[#FF6961]","active:bg-[#E04840] active:scale-95","focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2","focus-visible:ring-[#FF5F57] focus-visible:ring-offset-bg-base",a),...i,children:n&&t.jsx("svg",{className:s(r.icon,"opacity-0 group-hover:opacity-100 transition-opacity duration-100","text-[#4A0000]"),fill:"none",viewBox:"0 0 10 10",stroke:"currentColor",strokeWidth:2.5,strokeLinecap:"round",children:t.jsx("path",{d:"M2.5 2.5L7.5 7.5M7.5 2.5L2.5 7.5"})})})});let Ft="",Rt="",At="";function Ht(e){!function(){const e=new Date,t=e.toDateString();if(t!==At){At=t,Ft=t;const s=new Date(e);s.setDate(s.getDate()-1),Rt=s.toDateString()}}();const t=new Date(1e3*e).toDateString();return t===Ft?"Today":t===Rt?"Yesterday":new Date(1e3*e).toLocaleDateString([],{weekday:"short",month:"short",day:"numeric"})}function Pt(e){const t=["#22c55e","#3b82f6","#f59e0b","#ec4899","#8b5cf6","#06b6d4","#f97316","#84cc16"];let s=0;for(let n=0;n0?{emoji:t[0],cleanName:e.replace($t,"").trim()||e}:{emoji:null,cleanName:e}}function zt(e){const{cleanName:t}=Et(e),s=t.split(/[\s-_]+/).filter(Boolean);return s.length>=2?((Array.from(s[0])[0]||"")+(Array.from(s[1])[0]||"")).toUpperCase():Array.from(t).slice(0,2).join("").toUpperCase()}function It(e,t,s){return`${e||""}|${t}|${s}`}function qt(e){const s=/@\[([^\]]+)\]/g,n=[];let a,i=0;for(;null!==(a=s.exec(e));)a.index>i&&n.push(e.slice(i,a.index)),n.push(t.jsx("span",{className:"font-extrabold text-white",children:a[1]},a.index)),i=a.index+a[0].length;return i0?n:e}const Wt=e.memo(function({message:e,onChannelClick:n,isChannelSelected:a}){const i=e.senderName||"Unknown",{emoji:l,cleanName:r}=Et(i),o=Pt(r),c=zt(i),d=e.channelName||e.channelHash.slice(0,6);return t.jsxs("div",{className:"flex items-stretch gap-3 w-full",children:[t.jsxs("div",{className:"flex-shrink-0 flex flex-col items-center justify-between py-0.5",children:[t.jsx("div",{className:s("w-9 h-9 rounded-full flex items-center justify-center","shadow-md ring-1 ring-white/10",l?"text-lg p-1":"text-white text-[13px] font-bold tracking-tight"),style:{backgroundColor:o},children:l||c}),t.jsx("span",{className:"text-[10px] text-text-muted tabular-nums",children:(m=e.timestamp,new Date(1e3*m).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}))})]}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[t.jsx("span",{className:"text-[13px] font-medium",style:{color:o},children:r}),t.jsx("button",{onClick:()=>null==n?void 0:n(e.channelHash),className:s("px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",a?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:d})]}),t.jsx("div",{className:s("inline-block px-3.5 py-2.5","rounded-2xl rounded-tl-md","bg-[#007AFF]"),children:t.jsx("p",{className:"text-[14px] text-white leading-relaxed tracking-wide whitespace-pre-wrap break-words",children:qt(e.text)})})]})]});var m},function(e,t){const s=e.message,n=t.message;return s.timestamp===n.timestamp&&s.text===n.text&&s.senderName===n.senderName&&s.channelHash===n.channelHash&&s.channelName===n.channelName&&e.isChannelSelected===t.isChannelSelected&&e.onChannelClick===t.onChannelClick});function Ot({open:n,onClose:a,messages:i,onLoadMore:l,hasMoreToLoad:r,isDecoding:o}){const c=e.useRef(null),d=e.useRef(!0),m=e.useRef(!1),u=e.useRef(0),h=w(),x=A(),p=e.useMemo(()=>{const e=Date.now()/1e3-60*k[h].minutes;return[...i].filter(t=>t.timestamp>=e).sort((e,t)=>e.timestamp-t.timestamp)},[i,h]);e.useEffect(()=>{n||(m.current=!1,d.current=!0,u.current=0)},[n]);const f=e.useCallback(()=>{const e=c.current;if(!e)return;const{scrollTop:t,scrollHeight:s,clientHeight:n}=e;d.current=t+n>=s-50},[]);e.useEffect(()=>{if(!n||m.current)return;const e=c.current;e&&0!==p.length&&requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight,m.current=!0})},[n,p.length]);const g=e.useRef(p.length);e.useEffect(()=>{const e=c.current;if(!e||!n)return;const t=g.current,s=p.length;g.current=s,s>t&&d.current&&m.current&&requestAnimationFrame(()=>{e.scrollTo({top:e.scrollHeight,behavior:"smooth"})})},[p.length,n]);const v=e.useCallback(()=>{const e=c.current;e&&(u.current=e.scrollHeight,l())},[l]);e.useEffect(()=>{const e=c.current;if(!e||0===u.current)return;const t=u.current,s=e.scrollHeight;if(s>t){const n=s-t;e.scrollTop+=n}u.current=0},[p.length]);const j=e.useMemo(()=>{const e=new Map;for(const t of p){const s=t.channelHash,n=e.get(s);n?n.count++:e.set(s,{name:t.channelName||t.channelHash.slice(0,6),hash:t.channelHash,count:1})}return Array.from(e.values()).sort((e,t)=>t.count-e.count)},[p]),b=j.length,[y,N]=e.useState(null),[M,C]=e.useState(!1),B=e.useMemo(()=>y?p.filter(e=>e.channelHash===y):p,[p,y]),S=e.useMemo(()=>{const e=[];let t="";for(const s of B){const n=Ht(s.timestamp);n!==t&&(e.push({type:"date",date:n}),t=n),e.push({type:"message",message:s})}return e},[B]),L=j.slice(0,11),T=j.slice(11),_=T.length>0;return t.jsxs(H,{open:n,onClose:a,size:"lg",motionPlus:!0,solid:!0,children:[t.jsx(Dt,{onClick:a,size:"md",style:{position:"absolute",top:12,right:12,zIndex:10}}),t.jsxs(P,{className:"p-0 flex flex-col h-[80vh] max-h-[700px] rounded-2xl overflow-hidden",children:[t.jsx("div",{className:"flex-shrink-0 px-5 py-4 pr-12",children:t.jsxs("div",{className:"flex items-center justify-between gap-3",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx(Te,{className:"size-5 text-icon-card-title flex-shrink-0"}),t.jsx("h2",{className:"text-base font-semibold text-text-primary",children:"Public Channels"})]}),t.jsx(se,{ranges:k,selectedIndex:h,onSelect:x,size:"micro"})]})}),b>0&&t.jsx("div",{className:"flex-shrink-0 px-3 pb-2",children:t.jsxs("div",{className:"flex flex-wrap gap-1",children:[t.jsx("button",{onClick:()=>N(null),className:s("px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",null===y?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:"All"}),L.map(e=>t.jsx("button",{onClick:()=>N(e.hash),className:s("flex items-center gap-1 px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",y===e.hash?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:t.jsx("span",{className:"truncate max-w-[80px]",children:e.name})},e.hash)),_&&t.jsxs("div",{className:"relative",children:[t.jsxs("button",{onClick:()=>C(!M),className:s("flex items-center gap-0.5 px-2 py-0.5 rounded text-[10px] font-medium transition-all","ring-1 ring-inset",M||T.some(e=>e.hash===y)?"bg-accent-primary/20 text-accent-primary ring-accent-primary/30":"bg-white/5 text-text-secondary ring-white/10 hover:bg-white/10"),children:["+",T.length,t.jsx($,{className:s("size-3 transition-transform",M&&"rotate-180")})]}),M&&t.jsx("div",{className:s("absolute top-full left-0 mt-1 z-20","min-w-[140px] max-h-[200px] overflow-y-auto","p-1 rounded-lg","bg-bg-elevated/95 backdrop-blur-md","ring-1 ring-border-subtle shadow-lg"),children:T.map(e=>t.jsxs("button",{onClick:()=>{N(e.hash),C(!1)},className:s("w-full flex items-center gap-1.5 px-2 py-1 rounded text-[10px] font-medium transition-all text-left",y===e.hash?"bg-accent-primary/20 text-accent-primary":"text-text-secondary hover:bg-white/10"),children:[t.jsx(be,{className:"size-2.5 opacity-60 flex-shrink-0"}),t.jsx("span",{className:"truncate",children:e.name}),t.jsxs("span",{className:"opacity-60 ml-auto",children:["(",e.count,")"]})]},e.hash))})]})]})}),t.jsx("div",{ref:c,className:s("flex-1 overflow-y-auto overflow-x-hidden","mx-3 mb-3 rounded-md","bg-bg-0","ring-1 ring-inset ring-white/10","overscroll-contain"),style:{minHeight:0},onScroll:f,children:t.jsx("div",{className:"px-4 py-4 space-y-3",children:o&&0===B.length?t.jsxs("div",{className:"flex flex-col items-center justify-center h-full min-h-[300px] text-text-muted",children:[t.jsx(ye,{className:"size-12 mb-4 text-accent-purple animate-spin"}),t.jsx("p",{className:"text-lg font-medium",children:"Loading messages..."})]}):0===B.length?t.jsxs("div",{className:"flex flex-col items-center justify-center h-full min-h-[300px] text-text-muted",children:[t.jsx(de,{className:"size-16 mb-4 opacity-20"}),t.jsx("p",{className:"text-lg font-medium",children:"No messages yet"}),t.jsx("p",{className:"text-sm mt-1 opacity-70",children:y?"No messages in this channel":"Public channel messages will appear here"})]}):t.jsxs(t.Fragment,{children:[r&&t.jsx("div",{className:"flex justify-center mb-4",children:t.jsx("button",{onClick:v,disabled:o,className:s("px-4 py-1.5 rounded-full","text-[11px] font-medium","transition-all duration-150","ring-1 ring-inset",o?"bg-white/5 text-text-muted ring-white/5 cursor-wait":"bg-accent-primary/10 text-accent-primary ring-accent-primary/20 hover:bg-accent-primary/20 hover:ring-accent-primary/30"),children:o?t.jsxs("span",{className:"flex items-center gap-1.5",children:[t.jsx(ye,{className:"size-3 animate-spin"}),"Loading..."]}):"Load older messages"})}),S.map((e,n)=>{if("date"===e.type)return t.jsx("div",{className:"flex justify-center my-5",children:t.jsx("span",{className:s("px-3.5 py-1.5 rounded-full","bg-white/5 backdrop-blur-sm","text-[11px] text-text-muted/80 font-medium","ring-1 ring-white/5"),children:e.date})},`date-${e.date}-${n}`);const a=`msg-${e.message.timestamp}-${e.message.senderName||"anon"}-${e.message.channelHash}`;return t.jsx("div",{children:t.jsx(Wt,{message:e.message,onChannelClick:N,isChannelSelected:y===e.message.channelHash})},a)}),t.jsx("div",{className:"h-2"})]})})}),t.jsx("div",{className:"flex-shrink-0 px-5 py-2 text-center",children:t.jsxs("p",{className:"text-[11px] text-text-muted",children:[B.length," messages · ",b," ",1===b?"channel":"channels",o&&t.jsxs("span",{className:"ml-2 text-accent-purple",children:[t.jsx(ye,{className:"inline size-3 animate-spin mr-1"}),"Decrypting..."]})]})})]})]})}function Vt({isLoaded:n=!0}){const a=x(),[i,l]=e.useState(!1),r=w(),o=e.useCallback(()=>{l(!0),L.getState().queueDecryption(a)},[a]),c=T(),u=_(),h=D(),p=e.useMemo(()=>function(e){const t=[],s=new Set;for(const n of e.values()){const e=n.decoded;if(!e||!e.decrypted||e.macCorrupted||!e.text)continue;const a=It(e.senderName,e.channelHash,e.text);s.has(a)||(s.add(a),t.push({timestamp:n.timestamp,channelName:e.channelName,channelHash:e.channelHash,senderName:e.senderName,text:e.text,rssi:n.rssi,snr:n.snr}))}return t}(c),[c]),f=e.useMemo(()=>{const e=Date.now()/1e3-60*k[r].minutes;return p.filter(t=>t.timestamp>=e)},[p,r]),g=e.useMemo(()=>0===f.length?null:f.reduce((e,t)=>t.timestamp>e.timestamp?t:e),[f]),v=f.length,j=u.isDecoding,b=e.useMemo(()=>a.filter(e=>(e.type??e.payload_type)===F.GRP_TXT).length,[a])>p.length,y=e.useCallback(()=>{j||L.getState().queueDecryption(a)},[a,j]);return n?t.jsxs(t.Fragment,{children:[t.jsx("div",{onClick:o,className:s("group cursor-pointer rounded-xl transition-all duration-150","ring-1 ring-inset ring-white/10 hover:ring-accent-primary/50","hover:bg-white/[0.02]","px-3 py-2.5 sm:px-4 sm:py-3"),children:t.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[t.jsxs("div",{className:"flex items-center gap-2 sm:gap-3 flex-shrink-0",children:[t.jsx(Te,{className:"size-4 text-icon-card-title flex-shrink-0"}),t.jsx("span",{className:"type-micro",children:"CHAT ACTIVITY"}),v>0&&t.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded-md bg-white/5 ring-1 ring-inset ring-white/10 text-sm tabular-nums text-text-secondary",children:v}),t.jsx(je,{className:"size-4 text-text-muted group-hover:text-accent-purple transition-colors ml-auto sm:hidden"})]}),t.jsxs("div",{className:"flex items-center gap-2 sm:gap-1.5 min-w-0 overflow-hidden",children:[t.jsx(d,{mode:"wait",initial:!1,children:g?t.jsxs(m.div,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},exit:{opacity:0,y:-16},transition:{duration:.2,ease:[.4,0,.2,1]},className:"flex items-center gap-2 sm:gap-1.5 min-w-0",children:[g.channelName&&t.jsxs("span",{className:"hidden sm:inline-flex items-center px-2 py-1 rounded-md bg-white/5 ring-1 ring-inset ring-white/10 text-sm text-text-secondary flex-shrink-0",children:["#",g.channelName.replace(/^#/,"")]}),t.jsx("div",{className:"hidden sm:flex w-[30px] h-[30px] rounded-full items-center justify-center flex-shrink-0 ring-1 ring-white/10",style:{backgroundColor:Pt(Et(g.senderName||"").cleanName)},children:Et(g.senderName||"").emoji?t.jsx("span",{className:"text-base",children:Et(g.senderName||"").emoji}):t.jsx("span",{className:"text-white text-xs font-bold tracking-tighter",children:zt(g.senderName||"")})}),t.jsx("div",{className:"inline-flex items-center px-3 py-1.5 rounded-2xl rounded-tr-md bg-[#007AFF] shadow-sm min-w-0 flex-1 sm:flex-initial sm:max-w-xs sm:-ml-px",children:t.jsx("span",{className:"text-sm text-white truncate tracking-wide",children:qt(g.text)})}),t.jsx("span",{className:"inline-flex items-center px-2 py-1 rounded-md bg-white/5 ring-1 ring-inset ring-white/10 text-sm tabular-nums text-text-secondary flex-shrink-0",children:R(g.timestamp)})]},`msg-${g.timestamp}-${g.senderName}-${g.channelHash}`):h?t.jsx(m.span,{initial:{opacity:0},animate:{opacity:1},className:"text-sm text-text-muted italic",children:"No messages yet"},"empty"):t.jsxs(m.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0,y:-16},transition:{duration:.15},className:"flex items-center gap-2 sm:gap-1.5",children:[t.jsx("div",{className:"hidden sm:block w-8 h-4 rounded bg-white/10 animate-pulse"}),t.jsx("div",{className:"hidden sm:block w-[30px] h-[30px] rounded-full bg-white/10 animate-pulse"}),t.jsx("div",{className:"h-8 w-32 sm:w-48 rounded-2xl bg-white/10 animate-pulse"}),t.jsx("div",{className:"w-12 h-6 rounded-md bg-white/10 animate-pulse"})]},"skeleton")}),t.jsx(je,{className:"size-4 text-text-muted group-hover:text-accent-purple transition-colors flex-shrink-0 hidden sm:block ml-1"})]})]})}),t.jsx(Ot,{open:i,onClose:()=>l(!1),messages:p,onLoadMore:y,hasMoreToLoad:b,isDecoding:j})]}):t.jsx("div",{className:"h-14 rounded-xl bg-bg-elevated/50 animate-pulse"})}function Gt(){var s,n;const a=g(),i=E(),l=x(),r=z(),o=w(),c=A(),d=I(),m=k[o],u=5===o&&!d.threeDayLoadComplete,p=6===o&&!d.sevenDayLoadComplete,f=7===o&&!d.fourteenDayLoadComplete,v=d.isBackgroundLoading&&(u||p||f),j=null==(s=null==a?void 0:a.config)?void 0:s.radio,b=e.useMemo(()=>j?{sf:j.spreading_factor??10,bw:j.bandwidth??25e4,cr:j.coding_rate??5,preamble:j.preamble_length??8}:null,[j]),y=l.length,N=e.useMemo(()=>y?q(m.minutes,m.buckets,l,a):null,[y,m.minutes,m.buckets,b]),M=e.useMemo(()=>{const e=e=>(null==e?void 0:e.reduce((e,t)=>e+t.count,0))??0,t=e(null==N?void 0:N.received),s=e(null==N?void 0:N.unique_received),n=e(null==N?void 0:N.forwarded),a=e(null==N?void 0:N.dropped),i=e(null==N?void 0:N.transmitted),l=((null==N?void 0:N.time_range_minutes)??m.minutes)/60;return{received:t,uniqueReceived:s,forwarded:n,dropped:a,transmitted:i,rxPerHour:l>0?Math.round(t/l):0,fwdPerHour:l>0?Math.round(n/l):0}},[N,m.minutes]),C=e.useMemo(()=>{if(!l.length)return{totalBytes:0,kbPerHour:0};const e=Date.now()/1e3,t=e-60*m.minutes;let s=0;for(const a of l)a.transmitted||a.timestampe||(s+=a.length??a.payload_length??0);const n=m.minutes/60;return{totalBytes:s,kbPerHour:n>0?Math.round(s/1024/n):0}},[l,m.minutes]),B=(null==a?void 0:a.node_name)??(null==(n=null==a?void 0:a.config)?void 0:n.node_name)??"Unknown Node";return e.useEffect(()=>{B&&"Unknown Node"!==B&&(document.title=`pyMC: ${B}`)},[B]),i?t.jsxs(G,{className:"p-8 text-center",children:[t.jsx("p",{className:"type-subheading text-accent-red mb-2",children:"Failed to connect to backend"}),t.jsx("p",{className:"type-body text-white/50",children:i}),t.jsx("p",{className:"type-data-sm text-white/40 mt-4",children:"Make sure the backend is running on port 8000"})]}):t.jsxs(K,{children:[t.jsx(U,{title:B,icon:t.jsx(Ne,{}),controls:t.jsx(se,{ranges:k,selectedIndex:o,onSelect:c,isPending:v})}),t.jsxs(J,{children:[t.jsx(Vt,{isLoaded:r}),t.jsx(we,{template:"hero",children:t.jsxs(G,{compact:!0,children:[t.jsx(Me,{icon:t.jsx(W,{}),title:"PACKETS RECEIVED",badge:m.label,badgeColor:"zinc",actions:r?t.jsxs("div",{className:"data-box",children:[C.kbPerHour," KB/hr"]}):t.jsx("div",{className:"data-box opacity-0",children:"0 KB/hr"})}),t.jsxs("div",{className:"flex flex-wrap gap-4 sm:gap-8",children:[t.jsxs("div",{className:"flex items-end gap-2",children:[t.jsx("div",{className:"type-data-xl text-text-primary",children:r?t.jsx(ee,{value:M.received,className:"font-mono tabular-nums",priority:"high"}):t.jsx("span",{className:"opacity-30",children:"—"})}),t.jsx(h,{color:"zinc",className:"mb-0.5 sm:mb-1",children:"Total Rx"})]}),t.jsxs("div",{className:"flex items-end gap-2",children:[t.jsx("div",{className:"type-data-xl text-text-primary",children:r?t.jsx(ee,{value:M.uniqueReceived,className:"font-mono tabular-nums",priority:"high"}):t.jsx("span",{className:"opacity-30",children:"—"})}),t.jsx(h,{color:"zinc",className:"mb-0.5 sm:mb-1",children:"Unique"})]})]}),t.jsxs("div",{className:"mt-2 packet-byte-chart-height relative",children:[t.jsx("div",{className:"absolute inset-0 flex items-end gap-1 transition-opacity duration-300 "+(r?"opacity-0 pointer-events-none":"opacity-100"),"aria-hidden":r,children:[45,72,33,58,80,42,65,28,55,75,38,62].map((e,s)=>t.jsx("div",{className:"flex-1 bg-subtle-fill rounded-sm animate-pulse",style:{height:`${e}%`}},s))}),t.jsx("div",{className:"h-full transition-opacity duration-300 "+(r?"opacity-100":"opacity-0"),children:t.jsx(Ve,{packets:l,rangeMinutes:m.minutes,bucketCount:m.buckets})})]})]})}),t.jsxs(we,{template:"compact",children:[t.jsx(ke,{span:6,lg:4,children:t.jsx(Ke,{value:M.forwarded,receivedCount:M.received,packets:l,rangeMinutes:m.minutes,bucketCount:m.buckets,timeRangeLabel:m.label,icon:t.jsx(Ce,{className:"w-4 h-4"}),isLoaded:r})}),t.jsx(ke,{span:6,lg:4,children:t.jsx(Ue,{value:M.dropped,receivedCount:M.received,packets:l,rangeMinutes:m.minutes,bucketCount:m.buckets,timeRangeLabel:m.label,icon:t.jsx(fe,{className:"w-4 h-4"}),isLoaded:r})}),t.jsx(ke,{span:12,lg:4,children:t.jsx(tt,{stats:a,receivedBuckets:null==N?void 0:N.received,droppedBuckets:null==N?void 0:N.dropped,forwardedBuckets:null==N?void 0:N.forwarded,bucketDurationSeconds:null==N?void 0:N.bucket_duration_seconds,timeRangeLabel:m.label,isLoaded:r})})]}),t.jsx(Tt,{isLoaded:r}),t.jsx(st,{}),a&&t.jsx(we,{template:"auto",children:t.jsx(ve,{nodeName:B,repeaterVersion:a.version,coreVersion:a.core_version,localHash:a.local_hash,publicKey:a.public_key})})]})]})}export{Gt as default}; diff --git a/frontend/dist/assets/DataBox-BuwfTaKv.js b/frontend/dist/assets/DataBox-Bl0vntck.js similarity index 94% rename from frontend/dist/assets/DataBox-BuwfTaKv.js rename to frontend/dist/assets/DataBox-Bl0vntck.js index 91f4da83..135c4385 100644 --- a/frontend/dist/assets/DataBox-BuwfTaKv.js +++ b/frontend/dist/assets/DataBox-Bl0vntck.js @@ -1 +1 @@ -import{r as e,j as t,c as o}from"./vendor-react-DFCqJxYC.js";import{c}from"./index-CZBrdv20.js";const a=c("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]),n=c("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]),s={standard:"w-3 h-3",compact:"w-2.5 h-2.5",responsive:"w-2.5 h-2.5 sm:w-3 sm:h-3"};function r({children:c,copyValue:r,copy:i=!1,size:l="standard",className:p,title:d,color:u,truncate:m}){const[h,x]=e.useState(!1),[y,w]=e.useState(!1),f=e.useRef(null),v=r??("string"==typeof c?c:""),b=s[l],g=(()=>{if(!m||"string"!=typeof c)return c;const e=c,[t,o]=!0===m?[6,4]:m;return e.length<=t+o+3?e:`${e.slice(0,t)}…${e.slice(-o)}`})(),j=e.useCallback(e=>{i&&(e.preventDefault(),e.stopPropagation(),f.current&&clearTimeout(f.current),function(e){var t;if("undefined"!=typeof window&&(window.isSecureContext||"https:"===window.location.protocol||"localhost"===window.location.hostname)&&(null==(t=navigator.clipboard)?void 0:t.writeText))return navigator.clipboard.writeText(e).catch(()=>{}),!0;try{const{scrollX:t,scrollY:o}=window,c=document.createElement("textarea");c.value=e,c.style.cssText="position:fixed;left:-9999px;top:-9999px;opacity:0;pointer-events:none",c.setAttribute("readonly",""),document.body.appendChild(c),c.focus({preventScroll:!0}),c.select(),c.setSelectionRange(0,e.length);const a=document.execCommand("copy");return document.body.removeChild(c),window.scrollTo(t,o),a}catch(o){return!1}}(v),x(!0),f.current=setTimeout(()=>x(!1),2e3))},[i,v]),C="compact"===l?"data-box-compact":"responsive"===l?"data-box-responsive":"",k=i?d||`Click to copy: ${v}`:d;return i?t.jsxs("button",{type:"button",onClick:j,onMouseEnter:()=>w(!0),onMouseLeave:()=>w(!1),className:o("data-box interactive",C,"cursor-pointer select-none gap-1","hover-bg",u,p),title:k,"aria-label":`Copy ${v}`,children:[t.jsx("span",{className:o("transition-colors duration-200",h?"text-accent-success":""),children:g}),t.jsx("span",{className:o("flex items-center justify-center","compact"===l?"w-3 h-3":"w-3.5 h-3.5"),children:h?t.jsx(a,{className:o("text-accent-success",b)}):t.jsx(n,{className:o("transition-opacity duration-200",y?"opacity-70":"opacity-40",b)})})]}):t.jsx("span",{className:o("data-box",C,u,p),title:k,children:g})}export{a as C,r as D,n as a}; +import{r as e,j as t,c as o}from"./vendor-react-Cwum97tW.js";import{c}from"./index-D22MpaCY.js";const a=c("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]),n=c("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]),s={standard:"w-3 h-3",compact:"w-2.5 h-2.5",responsive:"w-2.5 h-2.5 sm:w-3 sm:h-3"};function r({children:c,copyValue:r,copy:i=!1,size:l="standard",className:p,title:d,color:u,truncate:m}){const[h,x]=e.useState(!1),[y,w]=e.useState(!1),f=e.useRef(null),v=r??("string"==typeof c?c:""),b=s[l],g=(()=>{if(!m||"string"!=typeof c)return c;const e=c,[t,o]=!0===m?[6,4]:m;return e.length<=t+o+3?e:`${e.slice(0,t)}…${e.slice(-o)}`})(),j=e.useCallback(e=>{i&&(e.preventDefault(),e.stopPropagation(),f.current&&clearTimeout(f.current),function(e){var t;if("undefined"!=typeof window&&(window.isSecureContext||"https:"===window.location.protocol||"localhost"===window.location.hostname)&&(null==(t=navigator.clipboard)?void 0:t.writeText))return navigator.clipboard.writeText(e).catch(()=>{}),!0;try{const{scrollX:t,scrollY:o}=window,c=document.createElement("textarea");c.value=e,c.style.cssText="position:fixed;left:-9999px;top:-9999px;opacity:0;pointer-events:none",c.setAttribute("readonly",""),document.body.appendChild(c),c.focus({preventScroll:!0}),c.select(),c.setSelectionRange(0,e.length);const a=document.execCommand("copy");return document.body.removeChild(c),window.scrollTo(t,o),a}catch(o){return!1}}(v),x(!0),f.current=setTimeout(()=>x(!1),2e3))},[i,v]),C="compact"===l?"data-box-compact":"responsive"===l?"data-box-responsive":"",k=i?d||`Click to copy: ${v}`:d;return i?t.jsxs("button",{type:"button",onClick:j,onMouseEnter:()=>w(!0),onMouseLeave:()=>w(!1),className:o("data-box interactive",C,"cursor-pointer select-none gap-1","hover-bg",u,p),title:k,"aria-label":`Copy ${v}`,children:[t.jsx("span",{className:o("transition-colors duration-200",h?"text-accent-success":""),children:g}),t.jsx("span",{className:o("flex items-center justify-center","compact"===l?"w-3 h-3":"w-3.5 h-3.5"),children:h?t.jsx(a,{className:o("text-accent-success",b)}):t.jsx(n,{className:o("transition-opacity duration-200",y?"opacity-70":"opacity-40",b)})})]}):t.jsx("span",{className:o("data-box",C,u,p),title:k,children:g})}export{a as C,r as D,n as a}; diff --git a/frontend/dist/assets/DeepAnalysisModal-Ckyyxl1o.js b/frontend/dist/assets/DeepAnalysisModal-DSV1q_wY.js similarity index 74% rename from frontend/dist/assets/DeepAnalysisModal-Ckyyxl1o.js rename to frontend/dist/assets/DeepAnalysisModal-DSV1q_wY.js index e3e41eb2..230666e4 100644 --- a/frontend/dist/assets/DeepAnalysisModal-Ckyyxl1o.js +++ b/frontend/dist/assets/DeepAnalysisModal-DSV1q_wY.js @@ -1 +1 @@ -import{c as e,aA as t,cj as a,ck as s,K as i,cl as n,N as c,m as r,av as o}from"./index-CZBrdv20.js";import{r as l,j as d,c as m}from"./vendor-react-DFCqJxYC.js";import{e as p,d as x}from"./config-C7QO3CEB.js";import{C as h}from"./DataBox-BuwfTaKv.js";import{G as g}from"./git-branch-CU4ha9LK.js";import{D as y}from"./house-BPemXMFi.js";import{L as f}from"./loader-circle-BLG0SL8e.js";const j=e("download",[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]]),u=e("eye-off",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]),v=e("maximize-2",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]]),b=e("minimize-2",[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]]),k={hidden:{opacity:0,scale:.9},visible:{opacity:1,scale:1,transition:{type:"spring",stiffness:400,damping:15}},exit:{opacity:0,scale:.9,transition:{duration:x.fast}}},N={hidden:{opacity:0,y:"100%"},visible:{opacity:1,y:0,transition:{type:"spring",stiffness:400,damping:30}},exit:{opacity:0,y:"100%",transition:{duration:x.medium,ease:p.easeIn}}};function w({label:e,icon:t,status:a,detail:s}){return d.jsxs("div",{className:m("flex items-center gap-3 py-3 px-4 radius-inset transition-base","active"===a&&"bg-accent-primary/10","complete"===a&&"bg-accent-primary/10 ring-2 ring-inset ring-accent-primary","pending"===a&&"opacity-40"),children:[d.jsx("div",{className:m("w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 transition-all duration-300","active"===a&&"bg-accent-primary/20","complete"===a&&"bg-accent-primary/20","pending"===a&&"bg-subtle-fill"),children:"complete"===a?d.jsx(h,{className:"w-4 h-4 text-accent-primary"}):"active"===a?d.jsx(f,{className:"w-4 h-4 animate-spin text-accent-primary"}):d.jsx("span",{className:"text-text-muted",children:t})}),d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsx("div",{className:m("text-sm font-medium transition-colors","active"===a&&"text-accent-primary","complete"===a&&"text-accent-primary","pending"===a&&"text-text-muted"),children:e}),s&&"pending"!==a&&d.jsx("div",{className:"text-xs text-text-muted mt-0.5 truncate",children:s})]})]})}const M=l.memo(function({isOpen:e,onClose:m}){const{packetCacheState:p,triggerDeepAnalysis:x}=t(),f=a(),u=s(),v=p.packetCount,[b,N]=l.useState("fetching");l.useEffect(()=>{e&&x()},[e,x]),l.useEffect(()=>{if(e)if(p.isTopologyLoading)N("fetching");else if(f)N("analyzing"),setTimeout(()=>N("building"),500),setTimeout(()=>N("discovering"),1e3);else if(u>0&&!p.isTopologyLoading){N("complete");const e=setTimeout(()=>{m()},1500);return()=>clearTimeout(e)}},[e,p.isTopologyLoading,f,u,m]);const M="complete"===b,T=p.loadProgress,z=l.useMemo(()=>T&&T.target>0?`Loading... ${(T.loaded/1e3).toFixed(1)}k / ${(T.target/1e3).toFixed(1)}k packets (${T.percent}%)`:v>0?`${v.toLocaleString()} packets loaded`:"Connecting to database...",[T,v]),C=e=>{const t=["fetching","analyzing","building","discovering","complete"],a=t.indexOf(b),s=t.indexOf(e);return s{};return d.jsx(i,{open:e,onClose:D,size:"sm",bottomSheet:!1,children:d.jsx(n,{isLoading:!M,borderRadius:16,children:d.jsx(c,{className:"p-6 radius-card overflow-hidden",children:M?d.jsxs("div",{className:"flex flex-col items-center py-6",children:[d.jsx(r.div,{variants:k,initial:"hidden",animate:"visible",className:"w-16 h-16 rounded-full flex items-center justify-center mb-4 bg-accent-primary/20",children:d.jsx(h,{className:"w-8 h-8 text-accent-primary"})}),d.jsx("h3",{className:"text-lg font-semibold text-accent-primary",children:"Ready!"})]}):d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"flex items-center gap-3 mb-5",children:[d.jsx("div",{className:"w-10 h-10 radius-inset flex items-center justify-center bg-accent-primary/15",children:d.jsx(g,{className:"w-5 h-5 text-accent-primary"})}),d.jsxs("div",{children:[d.jsx("h3",{className:"text-base font-semibold text-text-primary",children:"Deep Analysis"}),d.jsx("p",{className:"text-xs text-text-muted",children:"Building mesh topology"})]})]}),d.jsxs("div",{className:"space-y-2",children:[d.jsx(w,{label:"Fetching Packets",icon:d.jsx(j,{className:"w-4 h-4"}),status:C("fetching"),detail:z}),d.jsx(w,{label:"Analyzing Database",icon:d.jsx(y,{className:"w-4 h-4"}),status:C("analyzing"),detail:"Processing packet paths"}),d.jsx(w,{label:"Building Topology",icon:d.jsx(g,{className:"w-4 h-4"}),status:C("building"),detail:"Computing mesh edges"}),d.jsx(w,{label:"Discovering Nodes",icon:d.jsx(o,{className:"w-4 h-4"}),status:C("discovering"),detail:"Viterbi HMM ghost detection"})]}),d.jsx("p",{className:"text-xs text-text-muted text-center mt-5",children:"This may take a few seconds..."})]})})})})});export{M as D,u as E,b as M,v as a,j as b,N as s}; +import{c as e,aq as t,cA as a,cB as s,C as i,cC as n,E as c,m as r,al as o}from"./index-D22MpaCY.js";import{r as l,j as d,c as m}from"./vendor-react-Cwum97tW.js";import{e as p,d as x}from"./config-C7QO3CEB.js";import{C as h}from"./DataBox-Bl0vntck.js";import{G as g}from"./git-branch-Cev-c9BQ.js";import{D as y}from"./house-D2cJ2w9-.js";import{L as f}from"./loader-circle-2q9lT2qG.js";const u=e("download",[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]]),j=e("eye-off",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]),v=e("maximize-2",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]]),b=e("minimize-2",[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]]),k={hidden:{opacity:0,scale:.9},visible:{opacity:1,scale:1,transition:{type:"spring",stiffness:400,damping:15}},exit:{opacity:0,scale:.9,transition:{duration:x.fast}}},N={hidden:{opacity:0,y:"100%"},visible:{opacity:1,y:0,transition:{type:"spring",stiffness:400,damping:30}},exit:{opacity:0,y:"100%",transition:{duration:x.medium,ease:p.easeIn}}};function w({label:e,icon:t,status:a,detail:s}){return d.jsxs("div",{className:m("flex items-center gap-3 py-3 px-4 radius-inset transition-base","active"===a&&"bg-accent-primary/10","complete"===a&&"bg-accent-primary/10 ring-2 ring-inset ring-accent-primary","pending"===a&&"opacity-40"),children:[d.jsx("div",{className:m("w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 transition-all duration-300","active"===a&&"bg-accent-primary/20","complete"===a&&"bg-accent-primary/20","pending"===a&&"bg-subtle-fill"),children:"complete"===a?d.jsx(h,{className:"w-4 h-4 text-accent-primary"}):"active"===a?d.jsx(f,{className:"w-4 h-4 animate-spin text-accent-primary"}):d.jsx("span",{className:"text-text-muted",children:t})}),d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsx("div",{className:m("text-sm font-medium transition-colors","active"===a&&"text-accent-primary","complete"===a&&"text-accent-primary","pending"===a&&"text-text-muted"),children:e}),s&&"pending"!==a&&d.jsx("div",{className:"text-xs text-text-muted mt-0.5 truncate",children:s})]})]})}const M=l.memo(function({isOpen:e,onClose:m}){const{packetCacheState:p,triggerDeepAnalysis:x}=t(),f=a(),j=s(),v=p.packetCount,[b,N]=l.useState("fetching");l.useEffect(()=>{e&&x()},[e,x]),l.useEffect(()=>{if(e)if(p.isTopologyLoading)N("fetching");else if(f)N("analyzing"),setTimeout(()=>N("building"),500),setTimeout(()=>N("discovering"),1e3);else if(j>0&&!p.isTopologyLoading){N("complete");const e=setTimeout(()=>{m()},1500);return()=>clearTimeout(e)}},[e,p.isTopologyLoading,f,j,m]);const M="complete"===b,C=p.loadProgress,T=l.useMemo(()=>C&&C.target>0?`Loading... ${(C.loaded/1e3).toFixed(1)}k / ${(C.target/1e3).toFixed(1)}k packets (${C.percent}%)`:v>0?`${v.toLocaleString()} packets loaded`:"Connecting to database...",[C,v]),z=e=>{const t=["fetching","analyzing","building","discovering","complete"],a=t.indexOf(b),s=t.indexOf(e);return s{};return d.jsx(i,{open:e,onClose:D,size:"sm",bottomSheet:!1,children:d.jsx(n,{isLoading:!M,borderRadius:16,children:d.jsx(c,{className:"p-6 radius-card overflow-hidden",children:M?d.jsxs("div",{className:"flex flex-col items-center py-6",children:[d.jsx(r.div,{variants:k,initial:"hidden",animate:"visible",className:"w-16 h-16 rounded-full flex items-center justify-center mb-4 bg-accent-primary/20",children:d.jsx(h,{className:"w-8 h-8 text-accent-primary"})}),d.jsx("h3",{className:"text-lg font-semibold text-accent-primary",children:"Ready!"})]}):d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"flex items-center gap-3 mb-5",children:[d.jsx("div",{className:"w-10 h-10 radius-inset flex items-center justify-center bg-accent-primary/15",children:d.jsx(g,{className:"w-5 h-5 text-accent-primary"})}),d.jsxs("div",{children:[d.jsx("h3",{className:"text-base font-semibold text-text-primary",children:"Deep Analysis"}),d.jsx("p",{className:"text-xs text-text-muted",children:"Building mesh topology"})]})]}),d.jsxs("div",{className:"space-y-2",children:[d.jsx(w,{label:"Fetching Packets",icon:d.jsx(u,{className:"w-4 h-4"}),status:z("fetching"),detail:T}),d.jsx(w,{label:"Analyzing Database",icon:d.jsx(y,{className:"w-4 h-4"}),status:z("analyzing"),detail:"Processing packet paths"}),d.jsx(w,{label:"Building Topology",icon:d.jsx(g,{className:"w-4 h-4"}),status:z("building"),detail:"Computing mesh edges"}),d.jsx(w,{label:"Discovering Nodes",icon:d.jsx(o,{className:"w-4 h-4"}),status:z("discovering"),detail:"Viterbi HMM ghost detection"})]}),d.jsx("p",{className:"text-xs text-text-muted text-center mt-5",children:"This may take a few seconds..."})]})})})})});export{M as D,j as E,b as M,v as a,u as b,N as s}; diff --git a/frontend/dist/assets/Grid-TNw012c2.js b/frontend/dist/assets/Grid-BVGRgue6.js similarity index 94% rename from frontend/dist/assets/Grid-TNw012c2.js rename to frontend/dist/assets/Grid-BVGRgue6.js index 15981284..d8c66cc8 100644 --- a/frontend/dist/assets/Grid-TNw012c2.js +++ b/frontend/dist/assets/Grid-BVGRgue6.js @@ -1 +1 @@ -import{r as o,j as e,c as l}from"./vendor-react-DFCqJxYC.js";const t={hero:{mobile:12},"hero-tall":{mobile:12},"hero-auto":{mobile:12},panel:{mobile:12,md:6},feature:{mobile:12,md:6,lg:4},standard:{mobile:12,sm:6,lg:4,xl:3},compact:{mobile:6,lg:3},widget:{mobile:6,sm:4,md:3,lg:2},auto:{mobile:12}},a={hero:"bento-row-hero","hero-tall":"bento-row-hero-tall","hero-auto":"bento-row-hero-auto",panel:"bento-row-panel",feature:"bento-row-feature",standard:"bento-row-standard",compact:"bento-row-compact",widget:"bento-row-widget",auto:"bento-row-auto"};function n({template:n,children:r,className:s,gap:c}){const i=t[n],b=a[n],d="none"===c?"gap-0":"sm"===c?"bento-gap-sm":"lg"===c?"bento-gap-lg":"bento-gap",p=o.Children.map(r,l=>o.isValidElement(l)?l.type===m?l:e.jsx(m,{span:i.mobile,sm:i.sm,md:i.md,lg:i.lg,xl:i.xl,children:l}):l);return e.jsx("div",{className:l("bento-row",b,d,s),children:p})}function r(o,e=""){const l=e?`${e}:`:"";return"full"===o?`${l}col-span-full`:"auto"===o?`${l}col-auto`:1.5===o?`${l}bento-col-1-5`:`${l}bento-col-${o}`}function m({children:o,span:t,sm:a,md:n,lg:m,xl:s,className:c}){const i=l("bento-cell",r(t),a&&r(a,"sm"),n&&r(n,"md"),m&&r(m,"lg"),s&&r(s,"xl"),c);return e.jsx("div",{className:i,children:o})}export{m as C,n as R}; +import{r as o,j as e,c as l}from"./vendor-react-Cwum97tW.js";const t={hero:{mobile:12},"hero-tall":{mobile:12},"hero-auto":{mobile:12},panel:{mobile:12,md:6},feature:{mobile:12,md:6,lg:4},standard:{mobile:12,sm:6,lg:4,xl:3},compact:{mobile:6,lg:3},widget:{mobile:6,sm:4,md:3,lg:2},auto:{mobile:12}},a={hero:"bento-row-hero","hero-tall":"bento-row-hero-tall","hero-auto":"bento-row-hero-auto",panel:"bento-row-panel",feature:"bento-row-feature",standard:"bento-row-standard",compact:"bento-row-compact",widget:"bento-row-widget",auto:"bento-row-auto"};function n({template:n,children:r,className:s,gap:c}){const i=t[n],b=a[n],d="none"===c?"gap-0":"sm"===c?"bento-gap-sm":"lg"===c?"bento-gap-lg":"bento-gap",p=o.Children.map(r,l=>o.isValidElement(l)?l.type===m?l:e.jsx(m,{span:i.mobile,sm:i.sm,md:i.md,lg:i.lg,xl:i.xl,children:l}):l);return e.jsx("div",{className:l("bento-row",b,d,s),children:p})}function r(o,e=""){const l=e?`${e}:`:"";return"full"===o?`${l}col-span-full`:"auto"===o?`${l}col-auto`:1.5===o?`${l}bento-col-1-5`:`${l}bento-col-${o}`}function m({children:o,span:t,sm:a,md:n,lg:m,xl:s,className:c}){const i=l("bento-cell",r(t),a&&r(a,"sm"),n&&r(n,"md"),m&&r(m,"lg"),s&&r(s,"xl"),c);return e.jsx("div",{className:i,children:o})}export{m as C,n as R}; diff --git a/frontend/dist/assets/Login-X6H6_R2y.js b/frontend/dist/assets/Login-DJBcf-C6.js similarity index 98% rename from frontend/dist/assets/Login-X6H6_R2y.js rename to frontend/dist/assets/Login-DJBcf-C6.js index 60c9435a..3674ef4f 100644 --- a/frontend/dist/assets/Login-X6H6_R2y.js +++ b/frontend/dist/assets/Login-DJBcf-C6.js @@ -1 +1 @@ -import{r as e,j as t,c as s}from"./vendor-react-DFCqJxYC.js";import{g as a,i,s as r,l as n,m as o,P as l,A as c}from"./index-CZBrdv20.js";import{s as d,a as m}from"./config-C7QO3CEB.js";import{b as h}from"./vendor-core-Dhs13Wlh.js";import"./deckgl-DTsmDcfs.js";const x=e.memo(function({width:e,height:s,className:a="",fill:i="currentColor"}){return t.jsxs("svg",{viewBox:"0 0 134 15",width:e,height:s,className:a,role:"img","aria-label":"MeshCore",style:{fillRule:"evenodd",clipRule:"evenodd"},children:[t.jsx("path",{fill:i,d:"M3.277,0.053C2.829,0.053 2.401,0.41 2.321,0.851L0.013,13.623C-0.067,14.064 0.232,14.421 0.681,14.421L3.13,14.421C3.578,14.421 4.006,14.064 4.086,13.623L5.004,8.54L6.684,13.957C6.766,14.239 7.02,14.421 7.337,14.421L10.58,14.421C10.897,14.421 11.217,14.239 11.401,13.957L15.043,8.513L14.119,13.623C14.038,14.064 14.338,14.421 14.787,14.421L17.236,14.421C17.684,14.421 18.112,14.064 18.192,13.623L20.5,0.851C20.582,0.41 20.283,0.053 19.834,0.053L16.69,0.053C16.373,0.053 16.053,0.235 15.87,0.517L9.897,9.473C9.803,9.616 9.578,9.578 9.528,9.41L7.074,0.517C6.992,0.235 6.738,0.053 6.421,0.053L3.277,0.053Z"}),t.jsx("path",{fill:i,d:"M21.146,14.421C21.146,14.421 33.257,14.421 33.257,14.421C33.526,14.421 33.784,14.205 33.831,13.942L34.337,11.128C34.385,10.863 34.206,10.649 33.936,10.649L25.519,10.649C25.429,10.649 25.37,10.576 25.385,10.488L25.635,9.105C25.65,9.017 25.736,8.944 25.826,8.944L32.596,8.944C32.865,8.944 33.123,8.728 33.171,8.465L33.621,5.974C33.669,5.709 33.49,5.495 33.221,5.495L26.45,5.495C26.361,5.495 26.301,5.423 26.317,5.335L26.584,3.852C26.599,3.764 26.685,3.691 26.775,3.691L35.192,3.691C35.462,3.691 35.719,3.476 35.767,3.21L36.258,0.498C36.306,0.235 36.126,0.019 35.857,0.019L23.746,0.019C23.297,0.019 22.867,0.378 22.788,0.819L20.474,13.621C20.396,14.062 20.695,14.421 21.146,14.421Z"}),t.jsx("path",{fill:i,d:"M45.926,14.419L45.926,14.421L46.346,14.421C48.453,14.421 50.465,12.742 50.839,10.67L51.081,9.327C51.456,7.256 50.05,5.576 47.943,5.576L41.455,5.576C41.186,5.576 41.007,5.363 41.054,5.097L41.218,4.192C41.266,3.927 41.524,3.713 41.793,3.713L50.569,3.713C51.018,3.713 51.446,3.356 51.526,2.915L51.9,0.85C51.98,0.407 51.68,0.05 51.232,0.05L41.638,0.05C39.531,0.05 37.519,1.73 37.145,3.801L36.88,5.267C36.505,7.339 37.91,9.018 40.018,9.018L46.506,9.018C46.775,9.018 46.954,9.231 46.907,9.497L46.785,10.176C46.737,10.441 46.479,10.655 46.21,10.655L37.189,10.655C36.741,10.655 36.313,11.012 36.233,11.453L35.841,13.621C35.761,14.062 36.061,14.419 36.51,14.419L45.926,14.419Z"}),t.jsx("path",{fill:i,d:"M68.008,0.046C68.008,0.046 65.296,0.046 65.296,0.046C64.847,0.046 64.42,0.403 64.34,0.844L63.532,5.31C63.517,5.398 63.431,5.469 63.341,5.469L58.085,5.469C57.995,5.469 57.936,5.398 57.951,5.31L58.758,0.844C58.837,0.403 58.539,0.046 58.09,0.046L55.378,0.046C54.93,0.046 54.502,0.403 54.422,0.844L52.112,13.623C52.032,14.064 52.331,14.421 52.78,14.421L55.492,14.421C55.941,14.421 56.369,14.064 56.449,13.623L57.272,9.074C57.287,8.986 57.373,8.914 57.462,8.914L62.719,8.914C62.809,8.914 62.868,8.985 62.853,9.074L62.032,13.623C61.952,14.064 62.252,14.421 62.7,14.421L65.413,14.421C65.861,14.421 66.289,14.064 66.369,13.623L68.678,0.844C68.755,0.403 68.457,0.046 68.008,0.046Z"}),t.jsx("path",{fill:i,d:"M72.099,14.421C72.099,14.421 80.066,14.421 80.066,14.421C80.515,14.421 80.943,14.064 81.022,13.623L81.414,11.453C81.494,11.012 81.194,10.655 80.746,10.655L73.828,10.655C73.559,10.655 73.38,10.441 73.427,10.176L74.51,4.215C74.558,3.951 74.815,3.736 75.082,3.736L82,3.736C82.448,3.736 82.876,3.379 82.956,2.938L83.34,0.817C83.42,0.376 83.12,0.019 82.672,0.019L74.724,0.019C72.622,0.019 70.614,1.691 70.236,3.757L68.965,10.665C68.587,12.738 69.99,14.421 72.099,14.421Z"}),t.jsx("path",{fill:i,d:"M97.176,-0C97.176,0 88.882,0 88.882,0C86.775,0 84.763,1.68 84.389,3.751L83.139,10.67C82.765,12.741 84.169,14.421 86.277,14.421L94.571,14.421C96.678,14.421 98.69,12.741 99.064,10.67L100.314,3.751C100.689,1.68 99.284,-0 97.176,-0ZM94.798,10.178C94.75,10.443 94.492,10.657 94.223,10.657L87.978,10.657C87.709,10.657 87.529,10.443 87.577,10.178L88.659,4.192C88.707,3.927 88.964,3.713 89.234,3.713L95.477,3.713C95.747,3.713 95.926,3.927 95.878,4.192L94.798,10.178Z"}),t.jsx("path",{fill:i,d:"M101.284,14.421L103.995,14.421C104.443,14.421 104.871,14.065 104.951,13.624L105.43,10.97C105.446,10.882 105.531,10.81 105.621,10.81L108.902,10.806C109.064,10.806 109.2,10.886 109.267,11.018L110.813,14.035C110.992,14.392 111.319,14.434 112.303,14.419C112.88,14.426 113.756,14.382 115.169,14.382C115.623,14.382 115.902,13.907 115.678,13.51L113.989,10.569C113.945,10.491 113.993,10.386 114.086,10.34C115.39,9.707 116.423,8.477 116.681,7.055L117.27,3.785C117.646,1.713 116.242,0.033 114.134,0.033L103.884,0.033C103.436,0.033 103.008,0.39 102.928,0.831L100.616,13.623C100.536,14.064 100.836,14.421 101.284,14.421L101.284,14.421ZM106.73,3.791C106.745,3.703 106.831,3.631 106.921,3.631L112.225,3.631C112.626,3.631 112.891,3.949 112.821,4.343L112.431,6.494C112.359,6.885 111.979,7.204 111.58,7.204L106.276,7.204C106.186,7.204 106.127,7.133 106.142,7.043L106.73,3.791Z"}),t.jsx("path",{fill:i,d:"M118.277,14.421C118.277,14.421 130.388,14.421 130.388,14.421C130.657,14.421 130.915,14.205 130.963,13.942L131.468,11.128C131.516,10.863 131.337,10.649 131.068,10.649L122.65,10.649C122.56,10.649 122.501,10.576 122.516,10.488L122.766,9.105C122.781,9.017 122.867,8.944 122.957,8.944L129.728,8.944C129.997,8.944 130.254,8.728 130.302,8.465L130.753,5.974C130.801,5.709 130.621,5.495 130.352,5.495L123.581,5.495C123.492,5.495 123.432,5.423 123.448,5.335L123.715,3.852C123.73,3.764 123.816,3.691 123.906,3.691L132.324,3.691C132.593,3.691 132.851,3.476 132.898,3.21L133.389,0.498C133.437,0.235 133.257,0.019 132.988,0.019L120.877,0.019C120.428,0.019 119.999,0.378 119.919,0.819L117.605,13.621C117.527,14.062 117.827,14.421 118.277,14.421Z"})]})}),u="#9cf15b",p={container:{hidden:{opacity:0},visible:{opacity:1,transition:{staggerChildren:d.normal,delayChildren:.1}}},item:{hidden:{opacity:0,y:12},visible:{opacity:1,y:0,transition:m.smooth}},footer:{hidden:{opacity:0,y:20},visible:{opacity:1,y:0,transition:{...m.gentle,delay:.4}}},error:{hidden:{opacity:0,height:0,marginTop:0},visible:{opacity:1,height:"auto",marginTop:24,transition:m.snappy},exit:{opacity:0,height:0,marginTop:0,transition:{duration:.15}}}},C=s("block font-mono text-xs font-medium uppercase tracking-wider text-text-secondary"),L=s("block w-full rounded-md px-3 py-2","font-mono text-sm font-semibold text-text-primary","border border-transparent outline-none","placeholder:text-text-muted/60 placeholder:font-normal","transition-shadow duration-150","surface-input"),f=s("flex w-full justify-center rounded-md px-3 py-2","font-mono text-sm font-semibold uppercase tracking-wide text-black shadow-sm","focus-visible:outline-2 focus-visible:outline-offset-2","disabled:opacity-50 disabled:cursor-not-allowed","transition-colors duration-150"),j=e.memo(function({className:e}){return t.jsxs("svg",{className:s("animate-spin",e),viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]})}),g=e.memo(function({id:a,value:i,onChange:r,autoComplete:n="current-password",required:o=!1}){const[l,c]=e.useState(!1),d="×".repeat(i.length);return t.jsxs("div",{className:"relative",children:[t.jsx("input",{id:a,name:a,type:l?"text":"password",value:i,onChange:r,autoComplete:n,required:o,className:s(L,"pr-10",!l&&"password-mask"),style:l?void 0:{fontFamily:"var(--font-data)",color:"transparent",caretColor:"var(--text-primary)"}}),!l&&i.length>0&&t.jsx("div",{className:s("pointer-events-none absolute inset-0 flex items-center","px-3 font-mono text-sm font-semibold text-text-primary"),"aria-hidden":"true",children:d}),t.jsx("button",{type:"button",onClick:()=>c(e=>!e),className:s("absolute inset-y-0 right-0 flex items-center pr-3","text-text-muted hover:text-text-secondary transition-colors"),"aria-label":l?"Hide password":"Show password",children:l?t.jsx("svg",{className:"size-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,"aria-hidden":"true",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88"})}):t.jsxs("svg",{className:"size-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,"aria-hidden":"true",children:[t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z"}),t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})})]})}),v=e.memo(function({id:e,checked:a,onChange:i,label:r}){return t.jsxs("div",{className:"flex gap-3",children:[t.jsx("div",{className:"flex h-6 shrink-0 items-center",children:t.jsxs("div",{className:"group grid size-4 grid-cols-1",children:[t.jsx("input",{id:e,name:e,type:"checkbox",checked:a,onChange:e=>i(e.target.checked),className:s("col-start-1 row-start-1 appearance-none rounded-sm","surface-checkbox","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent-primary","forced-colors:appearance-auto")}),t.jsx("svg",{fill:"none",viewBox:"0 0 14 14","aria-hidden":"true",className:s("pointer-events-none col-start-1 row-start-1","size-3.5 self-center justify-self-center stroke-white","group-has-[:disabled]:stroke-gray-950/25"),children:t.jsx("path",{d:"M3 8L6 11L11 3.5",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",className:s("transition-opacity",a?"opacity-100":"opacity-0")})})]})}),t.jsx("label",{htmlFor:e,className:"block font-mono text-xs uppercase tracking-wider text-text-secondary cursor-pointer select-none",children:r})]})}),b=e.memo(function({href:e,children:s}){return t.jsx(o.a,{href:e,target:"_blank",rel:"noopener noreferrer",whileHover:{scale:1.05},whileTap:{scale:.98},className:"inline-flex items-center gap-1.5 opacity-60 hover:opacity-100 transition-opacity",children:s})}),y=()=>t.jsx("span",{className:"text-white/20 text-xs","aria-hidden":"true",children:"•"}),w=e.memo(function(){return t.jsx("div",{className:"fixed inset-0 -z-10",style:{backgroundColor:"#09090b"},"aria-hidden":"true"})}),k=e.memo(function(){return t.jsxs(o.footer,{variants:p.footer,initial:"hidden",animate:"visible",className:"fixed bottom-0 inset-x-0 px-4 py-6",children:[t.jsx("p",{className:"text-center font-mono text-[10px] uppercase tracking-widest text-white/40 mb-3",children:"Powered By"}),t.jsx("div",{className:"mx-auto max-w-xs",children:t.jsxs("div",{className:"flex items-center justify-center gap-4",children:[t.jsx(b,{href:"https://github.com/rightup/pyMC_Repeater",children:t.jsxs("span",{className:"font-mono text-sm font-semibold tracking-tight",children:[t.jsx("span",{style:{color:u},children:"py"}),t.jsx("span",{className:"text-white",children:"MC"})]})}),t.jsx(y,{}),t.jsx(b,{href:"https://meshcore.co.uk",children:t.jsx(x,{height:12,className:"text-white"})}),t.jsx(y,{}),t.jsxs(b,{href:"https://wcmesh.com",children:[t.jsx("div",{className:"size-6 overflow-hidden radius-badge border border-white/10",children:t.jsx("img",{src:"/assets/WCM_Waves-RN-_ocPH.gif",alt:"",className:"size-full object-cover"})}),t.jsx("span",{className:"font-mono text-sm font-semibold tracking-tight text-white",children:"WCM"})]})]})})]})});function N(){const s=h(),[d,m]=e.useState("admin"),[x,b]=e.useState(""),[y,N]=e.useState(a),[M,z]=e.useState(!1),[S,Z]=e.useState(null),T=d.length>0&&x.length>0&&!M;e.useEffect(()=>{i()&&s("/",{replace:!0})},[s]);const W=e.useCallback(()=>Z(null),[]),B=e.useCallback(e=>{m(e.target.value),S&&W()},[S,W]),F=e.useCallback(e=>{b(e.target.value),S&&W()},[S,W]),R=e.useCallback(e=>{N(e),r(e)},[]),A=e.useCallback(async e=>{if(e.preventDefault(),!T)return;z(!0),Z(null);const t=await n(d,x,y);z(!1),t.success?window.location.href="/":Z(t.error??"Login failed")},[T,d,x,y]);return t.jsxs(t.Fragment,{children:[t.jsx(w,{}),t.jsx("main",{className:"flex min-h-svh items-center justify-center px-4 py-12 sm:px-6 lg:px-8",children:t.jsxs(o.div,{variants:p.container,initial:"hidden",animate:"visible",className:"w-full max-w-sm space-y-10",children:[t.jsx(o.div,{variants:p.item,className:"flex justify-center",children:t.jsx(l,{height:32})}),t.jsxs(o.form,{variants:p.item,onSubmit:A,className:"space-y-6",children:[t.jsxs("div",{children:[t.jsx("label",{htmlFor:"username",className:C,children:"Username"}),t.jsx("div",{className:"mt-2",children:t.jsx("input",{id:"username",name:"username",type:"text",value:d,onChange:B,required:!0,autoComplete:"username",autoFocus:!0,className:L})})]}),t.jsxs("div",{children:[t.jsx("label",{htmlFor:"password",className:C,children:"Password"}),t.jsx("div",{className:"mt-2",children:t.jsx(g,{id:"password",value:x,onChange:F,required:!0})})]}),t.jsx(v,{id:"remember-me",checked:y,onChange:R,label:"Remember me"}),t.jsx(c,{mode:"wait",children:S&&t.jsx(o.div,{variants:p.error,initial:"hidden",animate:"visible",exit:"exit",role:"alert",className:"rounded-md bg-accent-danger/10 p-3 overflow-hidden",children:t.jsx("p",{className:"text-sm text-accent-danger text-center",children:S})},"error")}),t.jsx(o.div,{whileTap:T?{scale:.98}:void 0,children:t.jsx("button",{type:"submit",disabled:!T,className:f,style:{backgroundColor:u,"--tw-ring-color":u},onMouseEnter:e=>e.currentTarget.style.backgroundColor="#8de04a",onMouseLeave:e=>e.currentTarget.style.backgroundColor=u,children:M?t.jsxs("span",{className:"flex items-center gap-2",children:[t.jsx(j,{className:"size-4"}),"Signing in…"]}):"Sign in"})})]}),t.jsxs(o.p,{variants:p.item,className:"text-center text-sm/6 text-text-muted",children:["A ",t.jsx("span",{style:{color:u},children:"@RightUp"})," X"," ",t.jsx("span",{style:{color:u},children:"@Treehouse⚡"})," Collab"]})]})}),t.jsx(k,{})]})}export{N as default}; +import{r as e,j as t,c as s}from"./vendor-react-Cwum97tW.js";import{g as a,i,s as r,l as n,m as o,P as l,A as c}from"./index-D22MpaCY.js";import{s as d,a as m}from"./config-C7QO3CEB.js";import{b as h}from"./vendor-core-CDrKesoV.js";import"./deckgl-DTsmDcfs.js";const x=e.memo(function({width:e,height:s,className:a="",fill:i="currentColor"}){return t.jsxs("svg",{viewBox:"0 0 134 15",width:e,height:s,className:a,role:"img","aria-label":"MeshCore",style:{fillRule:"evenodd",clipRule:"evenodd"},children:[t.jsx("path",{fill:i,d:"M3.277,0.053C2.829,0.053 2.401,0.41 2.321,0.851L0.013,13.623C-0.067,14.064 0.232,14.421 0.681,14.421L3.13,14.421C3.578,14.421 4.006,14.064 4.086,13.623L5.004,8.54L6.684,13.957C6.766,14.239 7.02,14.421 7.337,14.421L10.58,14.421C10.897,14.421 11.217,14.239 11.401,13.957L15.043,8.513L14.119,13.623C14.038,14.064 14.338,14.421 14.787,14.421L17.236,14.421C17.684,14.421 18.112,14.064 18.192,13.623L20.5,0.851C20.582,0.41 20.283,0.053 19.834,0.053L16.69,0.053C16.373,0.053 16.053,0.235 15.87,0.517L9.897,9.473C9.803,9.616 9.578,9.578 9.528,9.41L7.074,0.517C6.992,0.235 6.738,0.053 6.421,0.053L3.277,0.053Z"}),t.jsx("path",{fill:i,d:"M21.146,14.421C21.146,14.421 33.257,14.421 33.257,14.421C33.526,14.421 33.784,14.205 33.831,13.942L34.337,11.128C34.385,10.863 34.206,10.649 33.936,10.649L25.519,10.649C25.429,10.649 25.37,10.576 25.385,10.488L25.635,9.105C25.65,9.017 25.736,8.944 25.826,8.944L32.596,8.944C32.865,8.944 33.123,8.728 33.171,8.465L33.621,5.974C33.669,5.709 33.49,5.495 33.221,5.495L26.45,5.495C26.361,5.495 26.301,5.423 26.317,5.335L26.584,3.852C26.599,3.764 26.685,3.691 26.775,3.691L35.192,3.691C35.462,3.691 35.719,3.476 35.767,3.21L36.258,0.498C36.306,0.235 36.126,0.019 35.857,0.019L23.746,0.019C23.297,0.019 22.867,0.378 22.788,0.819L20.474,13.621C20.396,14.062 20.695,14.421 21.146,14.421Z"}),t.jsx("path",{fill:i,d:"M45.926,14.419L45.926,14.421L46.346,14.421C48.453,14.421 50.465,12.742 50.839,10.67L51.081,9.327C51.456,7.256 50.05,5.576 47.943,5.576L41.455,5.576C41.186,5.576 41.007,5.363 41.054,5.097L41.218,4.192C41.266,3.927 41.524,3.713 41.793,3.713L50.569,3.713C51.018,3.713 51.446,3.356 51.526,2.915L51.9,0.85C51.98,0.407 51.68,0.05 51.232,0.05L41.638,0.05C39.531,0.05 37.519,1.73 37.145,3.801L36.88,5.267C36.505,7.339 37.91,9.018 40.018,9.018L46.506,9.018C46.775,9.018 46.954,9.231 46.907,9.497L46.785,10.176C46.737,10.441 46.479,10.655 46.21,10.655L37.189,10.655C36.741,10.655 36.313,11.012 36.233,11.453L35.841,13.621C35.761,14.062 36.061,14.419 36.51,14.419L45.926,14.419Z"}),t.jsx("path",{fill:i,d:"M68.008,0.046C68.008,0.046 65.296,0.046 65.296,0.046C64.847,0.046 64.42,0.403 64.34,0.844L63.532,5.31C63.517,5.398 63.431,5.469 63.341,5.469L58.085,5.469C57.995,5.469 57.936,5.398 57.951,5.31L58.758,0.844C58.837,0.403 58.539,0.046 58.09,0.046L55.378,0.046C54.93,0.046 54.502,0.403 54.422,0.844L52.112,13.623C52.032,14.064 52.331,14.421 52.78,14.421L55.492,14.421C55.941,14.421 56.369,14.064 56.449,13.623L57.272,9.074C57.287,8.986 57.373,8.914 57.462,8.914L62.719,8.914C62.809,8.914 62.868,8.985 62.853,9.074L62.032,13.623C61.952,14.064 62.252,14.421 62.7,14.421L65.413,14.421C65.861,14.421 66.289,14.064 66.369,13.623L68.678,0.844C68.755,0.403 68.457,0.046 68.008,0.046Z"}),t.jsx("path",{fill:i,d:"M72.099,14.421C72.099,14.421 80.066,14.421 80.066,14.421C80.515,14.421 80.943,14.064 81.022,13.623L81.414,11.453C81.494,11.012 81.194,10.655 80.746,10.655L73.828,10.655C73.559,10.655 73.38,10.441 73.427,10.176L74.51,4.215C74.558,3.951 74.815,3.736 75.082,3.736L82,3.736C82.448,3.736 82.876,3.379 82.956,2.938L83.34,0.817C83.42,0.376 83.12,0.019 82.672,0.019L74.724,0.019C72.622,0.019 70.614,1.691 70.236,3.757L68.965,10.665C68.587,12.738 69.99,14.421 72.099,14.421Z"}),t.jsx("path",{fill:i,d:"M97.176,-0C97.176,0 88.882,0 88.882,0C86.775,0 84.763,1.68 84.389,3.751L83.139,10.67C82.765,12.741 84.169,14.421 86.277,14.421L94.571,14.421C96.678,14.421 98.69,12.741 99.064,10.67L100.314,3.751C100.689,1.68 99.284,-0 97.176,-0ZM94.798,10.178C94.75,10.443 94.492,10.657 94.223,10.657L87.978,10.657C87.709,10.657 87.529,10.443 87.577,10.178L88.659,4.192C88.707,3.927 88.964,3.713 89.234,3.713L95.477,3.713C95.747,3.713 95.926,3.927 95.878,4.192L94.798,10.178Z"}),t.jsx("path",{fill:i,d:"M101.284,14.421L103.995,14.421C104.443,14.421 104.871,14.065 104.951,13.624L105.43,10.97C105.446,10.882 105.531,10.81 105.621,10.81L108.902,10.806C109.064,10.806 109.2,10.886 109.267,11.018L110.813,14.035C110.992,14.392 111.319,14.434 112.303,14.419C112.88,14.426 113.756,14.382 115.169,14.382C115.623,14.382 115.902,13.907 115.678,13.51L113.989,10.569C113.945,10.491 113.993,10.386 114.086,10.34C115.39,9.707 116.423,8.477 116.681,7.055L117.27,3.785C117.646,1.713 116.242,0.033 114.134,0.033L103.884,0.033C103.436,0.033 103.008,0.39 102.928,0.831L100.616,13.623C100.536,14.064 100.836,14.421 101.284,14.421L101.284,14.421ZM106.73,3.791C106.745,3.703 106.831,3.631 106.921,3.631L112.225,3.631C112.626,3.631 112.891,3.949 112.821,4.343L112.431,6.494C112.359,6.885 111.979,7.204 111.58,7.204L106.276,7.204C106.186,7.204 106.127,7.133 106.142,7.043L106.73,3.791Z"}),t.jsx("path",{fill:i,d:"M118.277,14.421C118.277,14.421 130.388,14.421 130.388,14.421C130.657,14.421 130.915,14.205 130.963,13.942L131.468,11.128C131.516,10.863 131.337,10.649 131.068,10.649L122.65,10.649C122.56,10.649 122.501,10.576 122.516,10.488L122.766,9.105C122.781,9.017 122.867,8.944 122.957,8.944L129.728,8.944C129.997,8.944 130.254,8.728 130.302,8.465L130.753,5.974C130.801,5.709 130.621,5.495 130.352,5.495L123.581,5.495C123.492,5.495 123.432,5.423 123.448,5.335L123.715,3.852C123.73,3.764 123.816,3.691 123.906,3.691L132.324,3.691C132.593,3.691 132.851,3.476 132.898,3.21L133.389,0.498C133.437,0.235 133.257,0.019 132.988,0.019L120.877,0.019C120.428,0.019 119.999,0.378 119.919,0.819L117.605,13.621C117.527,14.062 117.827,14.421 118.277,14.421Z"})]})}),u="#9cf15b",p={container:{hidden:{opacity:0},visible:{opacity:1,transition:{staggerChildren:d.normal,delayChildren:.1}}},item:{hidden:{opacity:0,y:12},visible:{opacity:1,y:0,transition:m.smooth}},footer:{hidden:{opacity:0,y:20},visible:{opacity:1,y:0,transition:{...m.gentle,delay:.4}}},error:{hidden:{opacity:0,height:0,marginTop:0},visible:{opacity:1,height:"auto",marginTop:24,transition:m.snappy},exit:{opacity:0,height:0,marginTop:0,transition:{duration:.15}}}},C=s("block font-mono text-xs font-medium uppercase tracking-wider text-text-secondary"),L=s("block w-full rounded-md px-3 py-2","font-mono text-sm font-semibold text-text-primary","border border-transparent outline-none","placeholder:text-text-muted/60 placeholder:font-normal","transition-shadow duration-150","surface-input"),f=s("flex w-full justify-center rounded-md px-3 py-2","font-mono text-sm font-semibold uppercase tracking-wide text-black shadow-sm","focus-visible:outline-2 focus-visible:outline-offset-2","disabled:opacity-50 disabled:cursor-not-allowed","transition-colors duration-150"),j=e.memo(function({className:e}){return t.jsxs("svg",{className:s("animate-spin",e),viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]})}),g=e.memo(function({id:a,value:i,onChange:r,autoComplete:n="current-password",required:o=!1}){const[l,c]=e.useState(!1),d="×".repeat(i.length);return t.jsxs("div",{className:"relative",children:[t.jsx("input",{id:a,name:a,type:l?"text":"password",value:i,onChange:r,autoComplete:n,required:o,className:s(L,"pr-10",!l&&"password-mask"),style:l?void 0:{fontFamily:"var(--font-data)",color:"transparent",caretColor:"var(--text-primary)"}}),!l&&i.length>0&&t.jsx("div",{className:s("pointer-events-none absolute inset-0 flex items-center","px-3 font-mono text-sm font-semibold text-text-primary"),"aria-hidden":"true",children:d}),t.jsx("button",{type:"button",onClick:()=>c(e=>!e),className:s("absolute inset-y-0 right-0 flex items-center pr-3","text-text-muted hover:text-text-secondary transition-colors"),"aria-label":l?"Hide password":"Show password",children:l?t.jsx("svg",{className:"size-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,"aria-hidden":"true",children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88"})}):t.jsxs("svg",{className:"size-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,"aria-hidden":"true",children:[t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z"}),t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})})]})}),v=e.memo(function({id:e,checked:a,onChange:i,label:r}){return t.jsxs("div",{className:"flex gap-3",children:[t.jsx("div",{className:"flex h-6 shrink-0 items-center",children:t.jsxs("div",{className:"group grid size-4 grid-cols-1",children:[t.jsx("input",{id:e,name:e,type:"checkbox",checked:a,onChange:e=>i(e.target.checked),className:s("col-start-1 row-start-1 appearance-none rounded-sm","surface-checkbox","focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent-primary","forced-colors:appearance-auto")}),t.jsx("svg",{fill:"none",viewBox:"0 0 14 14","aria-hidden":"true",className:s("pointer-events-none col-start-1 row-start-1","size-3.5 self-center justify-self-center stroke-white","group-has-[:disabled]:stroke-gray-950/25"),children:t.jsx("path",{d:"M3 8L6 11L11 3.5",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",className:s("transition-opacity",a?"opacity-100":"opacity-0")})})]})}),t.jsx("label",{htmlFor:e,className:"block font-mono text-xs uppercase tracking-wider text-text-secondary cursor-pointer select-none",children:r})]})}),b=e.memo(function({href:e,children:s}){return t.jsx(o.a,{href:e,target:"_blank",rel:"noopener noreferrer",whileHover:{scale:1.05},whileTap:{scale:.98},className:"inline-flex items-center gap-1.5 opacity-60 hover:opacity-100 transition-opacity",children:s})}),y=()=>t.jsx("span",{className:"text-white/20 text-xs","aria-hidden":"true",children:"•"}),w=e.memo(function(){return t.jsx("div",{className:"fixed inset-0 -z-10",style:{backgroundColor:"#09090b"},"aria-hidden":"true"})}),k=e.memo(function(){return t.jsxs(o.footer,{variants:p.footer,initial:"hidden",animate:"visible",className:"fixed bottom-0 inset-x-0 px-4 py-6",children:[t.jsx("p",{className:"text-center font-mono text-[10px] uppercase tracking-widest text-white/40 mb-3",children:"Powered By"}),t.jsx("div",{className:"mx-auto max-w-xs",children:t.jsxs("div",{className:"flex items-center justify-center gap-4",children:[t.jsx(b,{href:"https://github.com/rightup/pyMC_Repeater",children:t.jsxs("span",{className:"font-mono text-sm font-semibold tracking-tight",children:[t.jsx("span",{style:{color:u},children:"py"}),t.jsx("span",{className:"text-white",children:"MC"})]})}),t.jsx(y,{}),t.jsx(b,{href:"https://meshcore.co.uk",children:t.jsx(x,{height:12,className:"text-white"})}),t.jsx(y,{}),t.jsxs(b,{href:"https://wcmesh.com",children:[t.jsx("div",{className:"size-6 overflow-hidden radius-badge border border-white/10",children:t.jsx("img",{src:"/assets/WCM_Waves-RN-_ocPH.gif",alt:"",className:"size-full object-cover"})}),t.jsx("span",{className:"font-mono text-sm font-semibold tracking-tight text-white",children:"WCM"})]})]})})]})});function N(){const s=h(),[d,m]=e.useState("admin"),[x,b]=e.useState(""),[y,N]=e.useState(a),[M,z]=e.useState(!1),[S,Z]=e.useState(null),T=d.length>0&&x.length>0&&!M;e.useEffect(()=>{i()&&s("/",{replace:!0})},[s]);const W=e.useCallback(()=>Z(null),[]),B=e.useCallback(e=>{m(e.target.value),S&&W()},[S,W]),F=e.useCallback(e=>{b(e.target.value),S&&W()},[S,W]),R=e.useCallback(e=>{N(e),r(e)},[]),A=e.useCallback(async e=>{if(e.preventDefault(),!T)return;z(!0),Z(null);const t=await n(d,x,y);z(!1),t.success?window.location.href="/":Z(t.error??"Login failed")},[T,d,x,y]);return t.jsxs(t.Fragment,{children:[t.jsx(w,{}),t.jsx("main",{className:"flex min-h-svh items-center justify-center px-4 py-12 sm:px-6 lg:px-8",children:t.jsxs(o.div,{variants:p.container,initial:"hidden",animate:"visible",className:"w-full max-w-sm space-y-10",children:[t.jsx(o.div,{variants:p.item,className:"flex justify-center",children:t.jsx(l,{height:32})}),t.jsxs(o.form,{variants:p.item,onSubmit:A,className:"space-y-6",children:[t.jsxs("div",{children:[t.jsx("label",{htmlFor:"username",className:C,children:"Username"}),t.jsx("div",{className:"mt-2",children:t.jsx("input",{id:"username",name:"username",type:"text",value:d,onChange:B,required:!0,autoComplete:"username",autoFocus:!0,className:L})})]}),t.jsxs("div",{children:[t.jsx("label",{htmlFor:"password",className:C,children:"Password"}),t.jsx("div",{className:"mt-2",children:t.jsx(g,{id:"password",value:x,onChange:F,required:!0})})]}),t.jsx(v,{id:"remember-me",checked:y,onChange:R,label:"Remember me"}),t.jsx(c,{mode:"wait",children:S&&t.jsx(o.div,{variants:p.error,initial:"hidden",animate:"visible",exit:"exit",role:"alert",className:"rounded-md bg-accent-danger/10 p-3 overflow-hidden",children:t.jsx("p",{className:"text-sm text-accent-danger text-center",children:S})},"error")}),t.jsx(o.div,{whileTap:T?{scale:.98}:void 0,children:t.jsx("button",{type:"submit",disabled:!T,className:f,style:{backgroundColor:u,"--tw-ring-color":u},onMouseEnter:e=>e.currentTarget.style.backgroundColor="#8de04a",onMouseLeave:e=>e.currentTarget.style.backgroundColor=u,children:M?t.jsxs("span",{className:"flex items-center gap-2",children:[t.jsx(j,{className:"size-4"}),"Signing in…"]}):"Sign in"})})]}),t.jsxs(o.p,{variants:p.item,className:"text-center text-sm/6 text-text-muted",children:["A ",t.jsx("span",{style:{color:u},children:"@RightUp"})," X"," ",t.jsx("span",{style:{color:u},children:"@Treehouse⚡"})," Collab"]})]})}),t.jsx(k,{})]})}export{N as default}; diff --git a/frontend/dist/assets/Logs-C-eWV8pL.js b/frontend/dist/assets/Logs-C6iBCeIs.js similarity index 76% rename from frontend/dist/assets/Logs-C-eWV8pL.js rename to frontend/dist/assets/Logs-C6iBCeIs.js index 22b8f69a..b5e0fac0 100644 --- a/frontend/dist/assets/Logs-C-eWV8pL.js +++ b/frontend/dist/assets/Logs-C6iBCeIs.js @@ -1 +1 @@ -import{r as e,j as s,c as a}from"./vendor-react-DFCqJxYC.js";import{c as t,b3 as l,b4 as r,p as c,b5 as i,b6 as n,b7 as o,b1 as m,b8 as x}from"./index-CZBrdv20.js";import{u as d}from"./usePolling-ZH_j5bYw.js";import{P as p,b as h,B as g,a as j,L as u}from"./PageLayout-Dz1NyqHa.js";import{C as b}from"./Card-BiYlryJL.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-Dhs13Wlh.js";const y=t("circle-play",[["path",{d:"M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z",key:"kmsa83"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),f=t("circle-stop",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["rect",{x:"9",y:"9",width:"6",height:"6",rx:"1",key:"1ssd4o"}]]),v=e.memo(function({log:e}){return s.jsx("div",{className:"p-3 radius-card bg-subtle-fill hover:bg-subtle-fill-strong transition-base",children:s.jsxs("div",{className:"flex items-baseline gap-3",children:[s.jsx("span",{className:a("type-data-sm w-14 shrink-0",x(e.level)),children:e.level}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsx("p",{className:"type-data-sm text-text-primary break-words whitespace-pre-wrap",children:e.message}),s.jsx("p",{className:"type-data-xs text-text-muted mt-1",children:new Date(e.timestamp).toLocaleString()})]})]})})});function N({showDebug:e,onToggle:t}){return s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:a("type-data-sm",e?"text-accent-tertiary":"text-accent-primary"),children:e?"DEBUG":"INFO"}),s.jsx("button",{onClick:t,className:a("relative w-10 h-5 rounded-full transition-base",e?"bg-accent-tertiary":"bg-accent-primary"),role:"switch","aria-checked":e,children:s.jsx("span",{className:a("absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full shadow-sm transition-transform duration-200",e?"translate-x-5":"translate-x-0")})})]})}function w(){const t=l(),x=r(),w=c(),k=i(),P=n(),[C,D]=e.useState(!1),L=e.useCallback(()=>{D(e=>!e)},[]),B=C?t:t.filter(e=>"DEBUG"!==e.level);return d(k,m.logs,w),s.jsxs(p,{children:[s.jsx(h,{title:"System Logs",icon:s.jsx(o,{}),controls:s.jsx(N,{showDebug:C,onToggle:L})}),s.jsx(g,{children:s.jsxs(j,{noPadding:!0,children:[s.jsx(b,{listHeader:!0,icon:s.jsx(o,{className:"icon-sm"}),title:"Log Entries",actions:s.jsx("button",{onClick:()=>P(!w),className:a("transition-base",w?"text-signal-critical hover:text-signal-critical/80":"text-accent-primary hover:text-accent-primary/80 animate-pulse-slow"),title:w?"Pause":"Resume",children:w?s.jsx(f,{className:"w-5 h-5"}):s.jsx(y,{className:"w-5 h-5"})})}),s.jsx("div",{className:"space-y-2 max-h-[calc(100vh-300px)] sm:max-h-[calc(100vh-250px)] overflow-y-auto p-4",children:x&&0===t.length?s.jsx(u,{count:10}):0===B.length?s.jsx("div",{className:"text-center py-12 text-text-muted",children:0===t.length?"No logs available":"No logs match selected filters"}):B.map((e,a)=>s.jsx(v,{log:e},`${e.timestamp}-${a}`))})]})})]})}export{w as default}; +import{r as e,j as s,c as a}from"./vendor-react-Cwum97tW.js";import{c as t,aW as l,aX as r,e as c,aY as i,aZ as n,a_ as o,aO as m,a$ as x}from"./index-D22MpaCY.js";import{u as d}from"./usePolling-XMUhKpB6.js";import{P as p,b as h,B as g,a as j,L as u}from"./PageLayout-B53JpmK1.js";import{C as y}from"./Card-CCBguhJs.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-CDrKesoV.js";const f=t("circle-play",[["path",{d:"M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z",key:"kmsa83"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),b=t("circle-stop",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["rect",{x:"9",y:"9",width:"6",height:"6",rx:"1",key:"1ssd4o"}]]),v=e.memo(function({log:e}){return s.jsx("div",{className:"p-3 radius-card bg-subtle-fill hover:bg-subtle-fill-strong transition-base",children:s.jsxs("div",{className:"flex items-baseline gap-3",children:[s.jsx("span",{className:a("type-data-sm w-14 shrink-0",x(e.level)),children:e.level}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsx("p",{className:"type-data-sm text-text-primary break-words whitespace-pre-wrap",children:e.message}),s.jsx("p",{className:"type-data-xs text-text-muted mt-1",children:new Date(e.timestamp).toLocaleString()})]})]})})});function N({showDebug:e,onToggle:t}){return s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:a("type-data-sm",e?"text-accent-tertiary":"text-accent-primary"),children:e?"DEBUG":"INFO"}),s.jsx("button",{onClick:t,className:a("relative w-10 h-5 rounded-full transition-base",e?"bg-accent-tertiary":"bg-accent-primary"),role:"switch","aria-checked":e,children:s.jsx("span",{className:a("absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full shadow-sm transition-transform duration-200",e?"translate-x-5":"translate-x-0")})})]})}function w(){const t=l(),x=r(),w=c(),k=i(),P=n(),[C,D]=e.useState(!1),L=e.useCallback(()=>{D(e=>!e)},[]),B=C?t:t.filter(e=>"DEBUG"!==e.level);return d(k,m.logs,w),s.jsxs(p,{children:[s.jsx(h,{title:"System Logs",icon:s.jsx(o,{}),controls:s.jsx(N,{showDebug:C,onToggle:L})}),s.jsx(g,{children:s.jsxs(j,{noPadding:!0,children:[s.jsx(y,{listHeader:!0,icon:s.jsx(o,{className:"icon-sm"}),title:"Log Entries",actions:s.jsx("button",{onClick:()=>P(!w),className:a("transition-base",w?"text-signal-critical hover:text-signal-critical/80":"text-accent-primary hover:text-accent-primary/80 animate-pulse-slow"),title:w?"Pause":"Resume",children:w?s.jsx(b,{className:"w-5 h-5"}):s.jsx(f,{className:"w-5 h-5"})})}),s.jsx("div",{className:"space-y-2 max-h-[calc(100vh-300px)] sm:max-h-[calc(100vh-250px)] overflow-y-auto p-4",children:x&&0===t.length?s.jsx(u,{count:10}):0===B.length?s.jsx("div",{className:"text-center py-12 text-text-muted",children:0===t.length?"No logs available":"No logs match selected filters"}):B.map((e,a)=>s.jsx(v,{log:e},`${e.timestamp}-${a}`))})]})})]})}export{w as default}; diff --git a/frontend/dist/assets/MeshGraph-CbZRxc5R.js b/frontend/dist/assets/MeshGraph-jA9fGpu6.js similarity index 85% rename from frontend/dist/assets/MeshGraph-CbZRxc5R.js rename to frontend/dist/assets/MeshGraph-jA9fGpu6.js index efc07733..8d8e5a79 100644 --- a/frontend/dist/assets/MeshGraph-CbZRxc5R.js +++ b/frontend/dist/assets/MeshGraph-jA9fGpu6.js @@ -1 +1 @@ -import{r as e,j as t,o as s,p as a}from"./vendor-react-DFCqJxYC.js";import{c as n,aE as i,aV as r,aW as o,q as l,aF as c,aQ as d,B as u,T as h,A as x,m,_ as p,R as g,Z as f,aX as b,aY as y}from"./index-CZBrdv20.js";import{D as v,M as j,s as w,E as N,a as k}from"./DeepAnalysisModal-Ckyyxl1o.js";import{D as C}from"./DataBox-BuwfTaKv.js";import{L as S}from"./loader-circle-BLG0SL8e.js";import{S as M,T as L,E as F}from"./target-5KyqyCil.js";import{C as E,Z as D}from"./zap-DOkzycJm.js";import{G as H}from"./git-branch-CU4ha9LK.js";import{H as B}from"./house-BPemXMFi.js";import{N as P}from"./network-Did0WXxt.js";import{C as $}from"./chevron-right-CchtyLvr.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-Dhs13Wlh.js";import"./config-C7QO3CEB.js";const R=n("arrow-down-up",[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"m21 8-4-4-4 4",key:"1c9v7m"}],["path",{d:"M17 4v16",key:"7dpous"}]]),z=n("circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),I=n("focus",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}]]),G=n("move",[["path",{d:"M12 2v20",key:"t6zp3m"}],["path",{d:"m15 19-3 3-3-3",key:"11eu04"}],["path",{d:"m19 9 3 3-3 3",key:"1mg7y2"}],["path",{d:"M2 12h20",key:"9i4pu4"}],["path",{d:"m5 9-3 3 3 3",key:"j64kie"}],["path",{d:"m9 5 3-3 3 3",key:"l8vdw6"}]]),T=n("tally-5",[["path",{d:"M4 4v16",key:"6qkkli"}],["path",{d:"M9 4v16",key:"81ygyz"}],["path",{d:"M14 4v16",key:"12vmem"}],["path",{d:"M19 4v16",key:"8ij5ei"}],["path",{d:"M22 6 2 18",key:"h9moai"}]]);function A(t,s=1e3){const[a,n]=e.useState(t),i=e.useRef(Date.now()),r=e.useRef(null);return e.useEffect(()=>{const e=Date.now(),a=s-(e-i.current);return a<=0?(n(t),i.current=e):(r.current&&clearTimeout(r.current),r.current=setTimeout(()=>{n(t),i.current=Date.now()},a)),()=>{r.current&&clearTimeout(r.current)}},[t,s]),a}const Z=Math.PI/180;let O=null,W=null,V=0;function K(){const e=Date.now();if(O&&e-V<1e3)return O;V=e;const t=getComputedStyle(document.documentElement).getPropertyValue("--accent-primary").trim();if(t.startsWith("color(display-p3")){const e=t.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(e){const t=Math.round(255*parseFloat(e[1])),s=Math.round(255*parseFloat(e[2])),a=Math.round(255*parseFloat(e[3]));return O=`#${t.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`,O}}if(t.startsWith("rgb")){const e=t.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);if(e){const t=parseInt(e[1]),s=parseInt(e[2]),a=parseInt(e[3]);return O=`#${t.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`,O}}return O=t.startsWith("#")?t:"#719CDF",O}function _(){const e=Date.now();if(W&&e-V<1e3)return W;V=e;const t=getComputedStyle(document.documentElement).getPropertyValue("--bg-body").trim();return W=t.startsWith("#")?t:"#171717",W}function q(e,t){if(e<=0)return 0;const s=t-e;if(s>1209600)return 0;if(s<0)return 1;const a=s/3600;return Math.exp(-a/12)}const X={spaceSize:4096,simulationRepulsion:1.2,simulationLinkDistance:30,simulationGravity:.2,simulationCenter:.5,simulationFriction:.92,simulationDecay:600,simulationLinkSpring:.6,simulationClusterStrength:.5,simulationRepulsionTheta:1.5};function Y(e,t,s,a,n=3){const i=e<=0?0:Math.log10(e+1),r=Math.log10(5001),o=Math.min(1,i/r),l=6+18*Math.pow(o,n);if(a)return l;const c=s-t;return c>=te?Math.max(6,.5*l):c>=ee?Math.max(6,.7*l):l}const Q={local:"#FFFFFF",hub:"#E0E0E0",gateway:"#C8C8C8",backbone:"#B0B0B0",neighbor:"#F0F0F0",mobile:"#A0A0A0",ghost:"#505050",standard:"#808080"},U={local:"Local Node",hub:"Hub (≥10% traffic)",gateway:"Gateway (7-10%)",backbone:"Backbone",neighbor:"Direct RF Neighbor",mobile:"Mobile/Volatile",ghost:"Discovered (unconfirmed)",standard:"Standard Node"},J={local:B,hub:D,gateway:H,backbone:H,neighbor:g,mobile:G,ghost:E,standard:z},ee=432e3,te=864e3;function se(e,t,s,a,n={x:0,y:0}){const i=e*Z,r=s*Z,o=(t-a)*Z,l=(e-s)*Z,c=637100;return n.x=o*Math.cos(.5*(i+r))*c,n.y=l*c,n}const ae={background:`linear-gradient(to right, ${["#2A2A2A","#3D3D3D","#505050","#636363","#767676","#898989","#9C9C9C","#AFAFAF","#C2C2C2","#D5D5D5","#E8E8E8","#F5F5F5","#FFFFFF"].join(", ")})`},ne=["#FBBF24","#F97316","#EF4444","#A855F7","#3B82F6","#6366F1","#6B7280"],ie=["Local","1","2","3","4","5","6+"];function re({isOpen:s,onToggle:a,children:n,className:i=""}){const[r,o]=e.useState(356),l=e.useRef(null);return e.useEffect(()=>{if(!l.current)return;const e=()=>{var e;const t=(null==(e=l.current)?void 0:e.offsetWidth)??380;o(t-24)};e();const t=new ResizeObserver(e);return t.observe(l.current),()=>t.disconnect()},[]),e.useEffect(()=>{},[s,r]),t.jsx(m.div,{className:i||void 0,initial:!1,animate:{x:s?0:r},transition:{duration:.25,ease:[.4,0,.2,1]},style:{willChange:"transform"},children:t.jsxs("div",{ref:l,className:"surface-control radius-inset flex items-stretch w-[240px] sm:w-[320px] lg:w-[380px] ring-1 ring-white/10",children:[t.jsxs("button",{onClick:a,className:"relative flex items-center justify-center w-6 shrink-0 border-r border-border-subtle/50 hover:bg-white/5 transition-base group",title:s?"Hide panel":"Show panel",children:[t.jsx("span",{className:"absolute -inset-y-0 -left-2 right-0 min-h-[44px]","aria-hidden":"true"}),t.jsx(m.div,{initial:!1,animate:{rotate:s?0:180},transition:{duration:.25,ease:[.4,0,.2,1]},children:t.jsx($,{className:"w-3.5 h-3.5 text-text-muted group-hover:text-text-secondary"})})]}),t.jsx(m.div,{className:"flex-1 min-w-0 overflow-hidden",initial:!1,animate:{opacity:s?1:0},transition:{duration:.15},children:n})]})})}const oe="▁▂▃▄▅▆▇█",le=[-5,0,4,7],ce=[-115,-105,-95,-80],de=["text-signal-critical","text-signal-poor","text-accent-secondary","text-accent-secondary","text-accent-success"],ue=["text-signal-critical","text-signal-poor","text-accent-secondary","text-accent-success","text-accent-success"],he=["░░░░","▂░░░","▂▃░░","▂▄▅░","▂▄▆█"],xe={active:{color:"green",label:"Active"},recent:{color:"yellow",label:"Recent"},stale:{color:"orange",label:"Stale"},inactive:{color:"zinc",label:"Offline"}},me=(e,t,s=6)=>{const a=t?Math.min(1,e/t):0,n=Math.floor(a*s),i=Math.floor(8*(a*s-n));return oe[7].repeat(n)+(n"●".repeat(Math.round(e*t))+"○".repeat(t-Math.round(e*t)),ge=(e,t)=>{const s=t?de:ue,a=(t?le:ce).findIndex(t=>ee.isZeroHop?["◉","text-sys-amber"]:e.isDirectPath?["→","text-sys-cyan"]:e.isLoopEdge?["↺","text-sys-purple"]:["─","text-text-muted"])(e);return t.jsxs("li",{className:"flex items-center gap-1.5 py-0.5 px-1 radius-badge hover:bg-subtle-fill/30 transition-base",children:[t.jsx("span",{className:`w-3 text-center shrink-0 ${n}`,children:a}),t.jsx("span",{className:"size-1.5 shrink-0 rounded-full",style:{backgroundColor:Q[e.nodeClass]}}),t.jsx("code",{className:"shrink-0 text-text-primary",children:e.prefix}),t.jsx("span",{className:"flex-1 min-w-0 truncate text-text-muted",children:e.name||""}),t.jsx("span",{className:"text-accent-secondary tracking-tighter shrink-0",children:me(e.packetCount,s,4)}),t.jsx("span",{className:"tabular-nums text-text-secondary shrink-0 w-8 text-right",children:e.packetCount>=1e3?`${(e.packetCount/1e3).toFixed(1)}k`:e.packetCount})]})}),be=e.memo(function({node:s,connections:a,onClose:n}){const i=e.useMemo(()=>Math.max(s.packetCount,...a.map(e=>e.packetCount),1),[s.packetCount,a]),r=e.useMemo(()=>[...a].sort((e,t)=>e.isZeroHop!==t.isZeroHop?e.isZeroHop?-1:1:e.isDirectPath!==t.isDirectPath?e.isDirectPath?-1:1:t.packetCount-e.packetCount),[a]),o=xe[s.activityLevel]??{color:"zinc",label:s.activityLevel};return t.jsxs(m.div,{variants:w,initial:"hidden",animate:"visible",exit:"exit",className:"absolute inset-x-3 bottom-3 z-20 surface-elevated radius-inset shadow-xl",children:[t.jsxs("div",{className:"flex items-center justify-between px-4 py-2.5 border-b border-border-subtle/50",children:[t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:"size-2 shrink-0 rounded-full",style:{backgroundColor:Q[s.nodeClass]}}),t.jsx("code",{className:"text-sm font-semibold text-text-primary shrink-0",children:s.prefix}),s.name&&t.jsx("span",{className:"text-sm text-text-secondary truncate",children:s.name}),t.jsxs("div",{className:"flex gap-1 shrink-0",children:[s.isLocal&&t.jsx(u,{color:"yellow",compact:!0,children:"LOCAL"}),void 0!==s.hopDistance&&!s.isLocal&&t.jsxs(u,{color:1===s.hopDistance?"orange":2===s.hopDistance?"red":s.hopDistance<=3?"violet":"sky",compact:!0,children:[s.hopDistance,"-HOP"]}),s.isHub&&t.jsx(u,{color:"indigo",compact:!0,children:"HUB"}),s.isGateway&&t.jsx(u,{color:"violet",compact:!0,children:"GW"}),s.isBackbone&&t.jsx(u,{color:"emerald",compact:!0,children:"BONE"}),s.isMobile&&t.jsx(u,{color:"orange",compact:!0,children:"MOB"}),s.isZeroHop&&t.jsx(u,{color:"amber",compact:!0,children:"RF"})]})]}),t.jsx(f,{plain:!0,onClick:n,title:"Close",className:"shrink-0",children:t.jsx(p,{className:"size-4"})})]}),t.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 p-3 font-mono text-[11px]",children:[t.jsxs("div",{className:"space-y-3",children:[t.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[t.jsx(u,{color:o.color,compact:!0,children:o.label}),t.jsx("span",{className:"text-text-muted",children:"•"}),t.jsx("span",{className:"text-text-secondary",children:U[s.nodeClass]}),s.hasGeo&&t.jsx(u,{color:"cyan",compact:!0,children:"GPS"}),s.hasCollision&&t.jsx(u,{color:"red",compact:!0,children:"⚠ COLLISION"})]}),t.jsx(C,{copy:!0,size:"compact",truncate:[10,6],className:"w-full",children:s.hash}),t.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"Packets"}),t.jsx("div",{className:"text-text-primary tabular-nums",children:s.packetCount.toLocaleString()}),t.jsx("div",{className:"text-accent-primary tracking-tighter",children:me(s.packetCount,i,6)})]}),t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"Degree"}),t.jsx("div",{className:"text-text-primary tabular-nums",children:s.degree}),t.jsx("div",{className:"text-accent-secondary tracking-tighter",children:me(s.degree,Math.max(s.degree,10),6)})]}),t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"Central"}),t.jsxs("div",{className:"text-text-primary tabular-nums",children:[(100*s.betweenness).toFixed(0),"%"]}),t.jsx("div",{className:"text-accent-primary tracking-tighter",children:pe(s.betweenness,6)})]})]}),s.isZeroHop&&(null!==s.avgRssi||null!==s.avgSnr)&&t.jsxs("div",{className:"flex gap-4 pt-2 border-t border-border-subtle/30",children:[null!==s.avgRssi&&(()=>{const[e,a]=ge(s.avgRssi,!1);return t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"RSSI"}),t.jsxs("div",{className:"flex items-baseline gap-1",children:[t.jsx("span",{className:`${a} tracking-tight`,children:e}),t.jsx("span",{className:"tabular-nums text-text-secondary",children:s.avgRssi.toFixed(0)}),t.jsx("span",{className:"text-[9px] text-text-muted",children:"dBm"})]})]})})(),null!==s.avgSnr&&(()=>{const[e,a]=ge(s.avgSnr,!0);return t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"SNR"}),t.jsxs("div",{className:"flex items-baseline gap-1",children:[t.jsx("span",{className:`${a} tracking-tight`,children:e}),t.jsx("span",{className:"tabular-nums text-text-secondary",children:s.avgSnr.toFixed(1)}),t.jsx("span",{className:"text-[9px] text-text-muted",children:"dB"})]})]})})()]})]}),t.jsxs("div",{className:"space-y-2",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("span",{className:"text-[9px] text-text-muted uppercase",children:"Connections"}),t.jsx(u,{color:"zinc",compact:!0,children:a.length})]}),r.length>0?t.jsxs("ul",{className:"max-h-32 overflow-y-auto space-y-0.5 scrollbar-thin",children:[r.slice(0,20).map(e=>t.jsx(fe,{c:e,maxPkts:i},e.hash)),r.length>20&&t.jsxs("li",{className:"text-center text-text-muted py-1",children:["+",r.length-20," more"]})]}):t.jsx("p",{className:"text-text-muted italic",children:"No connections"})]}),t.jsxs("div",{className:"hidden lg:flex lg:flex-col lg:gap-3",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1",children:[void 0!==s.hopDistance&&t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{className:"text-text-muted",children:"Hop Dist"}),t.jsx("span",{className:"tabular-nums",style:{color:ne[Math.min(s.hopDistance,ne.length-1)]},children:0===s.hopDistance?"Local":`${s.hopDistance} hop${s.hopDistance>1?"s":""}`})]}),t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{className:"text-text-muted",children:"Cluster"}),t.jsxs("span",{className:"text-text-secondary",children:["#",s.communityId]})]}),t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{className:"text-text-muted",children:"Edges"}),t.jsx("span",{className:"text-text-secondary",children:s.edgeCount})]}),s.hasCollision&&t.jsxs("div",{className:"flex justify-between col-span-2",children:[t.jsx("span",{className:"text-signal-poor",children:"Prefix Conf."}),t.jsxs("span",{className:"text-signal-poor tabular-nums",children:[(100*s.prefixConfidence).toFixed(0),"%"]})]})]}),t.jsxs("div",{className:"mt-auto pt-2 border-t border-border-subtle/30",children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase mb-1.5",children:"Edge Types"}),t.jsxs("div",{className:"grid grid-cols-3 gap-1 text-[10px]",children:[t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-sys-amber",children:"◉"}),t.jsx("span",{className:"text-text-muted",children:"RF"})]}),t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-sys-cyan",children:"→"}),t.jsx("span",{className:"text-text-muted",children:"Direct"})]}),t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-sys-purple",children:"↺"}),t.jsx("span",{className:"text-text-muted",children:"Loop"})]})]})]})]})]})]})});function ye(){return t.jsxs("div",{className:"flex flex-col items-center justify-center gap-6 text-center px-8",children:[t.jsx("div",{className:"p-4 radius-pill bg-subtle-fill",children:t.jsx(P,{className:"w-8 h-8 text-text-muted"})}),t.jsxs("div",{className:"space-y-2",children:[t.jsx("h2",{className:"type-subheading text-text-primary",children:"No Topology Data"}),t.jsx("p",{className:"type-body text-text-muted max-w-sm",children:"The mesh topology will appear here once packets are received and processed. This typically takes a few minutes after starting."})]}),t.jsxs("div",{className:"flex items-center gap-2 type-data-xs text-text-muted",children:[t.jsx(g,{className:"w-4 h-4 animate-pulse"}),t.jsx("span",{children:"Waiting for mesh traffic..."})]})]})}function ve(){var n;const g=i(),[f,w]=e.useState(!1),[C,E]=e.useState(!1),D=e.useRef(!1);e.useEffect(()=>{g&&!D.current&&(D.current=!0,E(!0))},[g]);const H=e.useCallback(()=>{E(!1),w(!0)},[]),B=r(),P=A(o(),2e3),$=l(),z=c(),[G,Z]=e.useState(!0),[O,W]=e.useState(null),V=e.useRef(void 0),[U,ee]=e.useState(""),[te,oe]=e.useState(!1),le=e.useRef(null),[ce]=e.useState(1),[de]=e.useState(.15),[ue]=e.useState(2.75),[he]=e.useState(3),xe=A(ue,300),me=A(he,300),pe=e.useRef(ce),ge=e.useRef(de);e.useEffect(()=>{pe.current=ce},[ce]),e.useEffect(()=>{ge.current=de},[de]);const fe=e.useRef({node:null,x:0,y:0}),ve=e.useRef(null),[je,we]=e.useState(!1),[Ne,ke]=e.useState("force"),[Ce,Se]=e.useState(!0);e.useEffect(()=>{const e=e=>{var t,s;if(!(e.target instanceof HTMLInputElement))switch(e.key.toLowerCase()){case"f":e.metaKey||e.ctrlKey||(e.preventDefault(),null==(t=Xe.current)||t.fitView(800));break;case"escape":te?(oe(!1),ee("")):O&&(V.current=void 0,W(null),null==(s=Xe.current)||s.unselectAllPoints());break;case"/":te||(e.preventDefault(),oe(!0),setTimeout(()=>{var e;return null==(e=le.current)?void 0:e.focus()},50));break;case" ":e.preventDefault();{const e=Xe.current;e&&(G?e.pause():e.start(),Z(e=>!e))}}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[te,O,G]);const Me=(null==z?void 0:z.latitude)??0,Le=(null==z?void 0:z.longitude)??0,Fe=null!==z,[Ee,De]=e.useState(Math.floor(Date.now()/1e3));e.useEffect(()=>{const e=setInterval(()=>{De(Math.floor(Date.now()/1e3))},3e5);return()=>clearInterval(e)},[]);const He=e.useMemo(()=>{var e;if(!P||0===P.size||!f)return[];const t=[],s=(null==$?void 0:$.node_name)??(null==(e=null==$?void 0:$.config)?void 0:e.node_name)??null,a={x:0,y:0},n=[];for(const i of P.values()){const e=i.isLocal?1:q(i.lastSeen,Ee);if(0===e&&!i.isLocal)continue;i.isLocal||n.push(i.packetCount);const r=i.packetCount>0?Math.log10(i.packetCount+1):0,o=Math.log10(5001),l=Math.min(1,r/o);let c;c=i.isLocal?4:l<.2?0:l<.4?1:l<.6?2:l<.8?3:4;const d="#FFFFFF",u=Y(i.packetCount,i.lastSeen,Ee,i.isLocal,ue),h=i.isLocal?s??i.name:i.name;let x,m,p=!1;Fe&&(i.isLocal?(x=0,m=0,p=!0):i.latitude&&i.longitude&&(se(i.latitude,i.longitude,Me,Le,a),x=a.x,m=a.y,p=!0)),t.push({id:i.hash,label:h?`${i.prefix} ${h}`:i.prefix,color:d,trafficCategory:c,size:u,x:x,y:m,recencyWeight:e,nodeClass:i.nodeClass,name:h,prefix:i.prefix,packetCount:i.packetCount,betweenness:i.betweenness,communityId:i.communityId,isLocal:i.isLocal,isHub:i.isHub,isGateway:i.isGateway,isBackbone:i.isBackbone,isMobile:i.isMobile,isGhost:i.isGhost,isInLoop:i.isInLoop,isZeroHop:i.isZeroHop,hasGeo:p,avgRssi:i.avgRssi,avgSnr:i.avgSnr,degree:i.degree,activityLevel:i.activityLevel,prefixConfidence:i.prefixConfidence,hasCollision:i.hasCollision,lastSeen:i.lastSeen})}if(n.length>0){n.sort((e,t)=>e-t);const e=n[Math.floor(.99*n.length)]??n[n.length-1]??1/0;for(const s of t)!s.isLocal&&s.packetCount>=e&&(s.trafficCategory=5)}return t},[P,f,Fe,Me,Le,null==$?void 0:$.node_name,null==(n=null==$?void 0:$.config)?void 0:n.node_name,Ee,ue]),Be=e.useMemo(()=>{const e=new Set;for(const t of He)e.add(t.id);return e},[He]),{rawLinks:Pe}=e.useMemo(()=>{const e=(null==B?void 0:B.edges)??[];if(!e||0===e.length||!f)return{rawLinks:[],maxCertainCount:0,hasZeroHopEdges:!1,hasLoopEdges:!1,hasDirectPathEdges:!1};const t=K(),s=[];let a=!1,n=!1,i=!1;const r=[],o=5-4*Math.min(1,Math.max(0,(he-.05)/2.95));for(const l of e){if(!Be.has(l.fromHash)||!Be.has(l.toHash))continue;s.push(l.certainCount),a=a||!0===l.isZeroHop,n=n||!0===l.isLoopEdge,i=i||!0===l.isDirectPathEdge;const e=l.avgRecency,t=e<0,o=null==P?void 0:P.get(l.fromHash),c=null==P?void 0:P.get(l.toHash),d=(null==o?void 0:o.isHub)||(null==o?void 0:o.isGateway)||(null==o?void 0:o.isBackbone)||(null==o?void 0:o.isLocal),u=(null==c?void 0:c.isHub)||(null==c?void 0:c.isGateway)||(null==c?void 0:c.isBackbone)||(null==c?void 0:c.isLocal);let h=0,x=300;t||(d&&u?(h=.8,x=250):d||u?(h=.4,x=50):(h=.1,x=300)),r.push({source:l.fromHash,target:l.toHash,color:t?"#1E293B":"#808080",width:t?.1:1,strength:h,distance:x,arrow:!t,trafficCategory:t?0:2,recencyWeight:e,packetCount:l.packetCount,certainCount:l.certainCount,isZeroHop:l.isZeroHop??!1,isLoopEdge:l.isLoopEdge??!1,isDirectPath:l.isDirectPathEdge,avgConfidence:l.avgConfidence})}if(s.length>0){s.sort((e,t)=>e-t);const e=s[Math.floor(.98*s.length)]??s[s.length-1]??1,a=Math.max(1,e),n=Math.log10(a+1),i=s[Math.floor(.99*s.length)]??s[s.length-1]??1/0;for(const s of r){if(0===s.trafficCategory)continue;const e=s.certainCount>0?Math.log10(s.certainCount+1):0,a=Math.min(1,e/n),r=Math.pow(a,he),l=Math.pow(a,de);if(s.width=.1+r*(o-.1),s.certainCount>=i)s.color=t,s.trafficCategory=5;else{const e=Math.round(80+144*l).toString(16).padStart(2,"0");s.color=`#${e}${e}${e}`,s.trafficCategory=a<.25?1:a<.5?2:a<.75?3:4}}}return{rawLinks:r,maxCertainCount:s.length>0?Math.max(...s):0,hasZeroHopEdges:a,hasLoopEdges:n,hasDirectPathEdges:i}},[null==B?void 0:B.edges,f,Be,P,he,de]),$e=e.useMemo(()=>{const e=new Map;for(const t of Pe)e.set(t.source,(e.get(t.source)??0)+1),e.set(t.target,(e.get(t.target)??0)+1);return e},[Pe]),Re=e.useMemo(()=>{const e=new Map;for(const t of He)e.set(t.id,t);return e},[He]),ze=e.useMemo(()=>{const e=new Map;for(const t of Pe)e.has(t.source)||e.set(t.source,[]),e.get(t.source).push({link:t,otherHash:t.target,direction:"outbound"}),e.has(t.target)||e.set(t.target,[]),e.get(t.target).push({link:t,otherHash:t.source,direction:"inbound"});return e},[Pe]),Ie=e.useMemo(()=>{if(!O)return[];const e=ze.get(O.hash);if(!e)return[];const t=[];for(const{link:s,otherHash:a,direction:n}of e){const e=Re.get(a);e&&t.push({hash:a,prefix:e.prefix,name:e.name,nodeClass:e.nodeClass,packetCount:s.packetCount,certainCount:s.certainCount,isZeroHop:s.isZeroHop,isDirectPath:s.isDirectPath,isLoopEdge:s.isLoopEdge,direction:n})}return t},[O,ze,Re]),Ge=e.useMemo(()=>{const e=new Map;for(const t of He)e.set(t.label,t.trafficCategory),e.set(t.prefix,t.trafficCategory);return e},[He]),Te=e.useMemo(()=>{if(0===Pe.length||0===He.length)return null;const e=new Map;for(const l of Pe)e.has(l.source)||e.set(l.source,new Set),e.has(l.target)||e.set(l.target,new Set),e.get(l.source).add(l.target),e.get(l.target).add(l.source);const t=He.find(e=>e.isLocal);if(!t)return null;const s=new Map,a=[t.id];s.set(t.id,0);let n=0;for(;a.length>0;){const t=a.shift(),i=s.get(t),r=e.get(t);if(r)for(const e of r)if(!s.has(e)){const t=i+1;s.set(e,t),n=Math.max(n,t),a.push(e)}}for(const l of He)s.has(l.id)||s.set(l.id,n+1);const i=new Map;for(const l of s.values())i.set(l,(i.get(l)??0)+1);const r=new Set;for(const[l,c]of s)c<=2&&r.add(l);const o=new Set;for(const l of Pe)r.has(l.source)&&r.has(l.target)&&(o.add(`${l.source}-${l.target}`),o.add(`${l.target}-${l.source}`));return{hopDistance:s,maxHops:n,nodesPerHop:i,backboneSet:r,backboneEdgeSet:o,localNodeId:t.id}},[Pe,He]),Ae=Te,Ze=e.useCallback(()=>{const e=document.querySelectorAll(".css-label--label");if(0===e.length||0===Ge.size)return;const t=["meshgraph-label-cat-0","meshgraph-label-cat-1","meshgraph-label-cat-2","meshgraph-label-cat-3","meshgraph-label-cat-4","meshgraph-label-cat-5"];e.forEach(e=>{var s;const a=(null==(s=e.textContent)?void 0:s.trim())??"",n=Ge.get(a);void 0!==n&&(e.classList.remove(...t),e.classList.add(`meshgraph-label-cat-${n}`))})},[Ge]),[Oe,We]=e.useState(null),[Ve,Ke]=e.useState(null),[_e,qe]=e.useState({}),Xe=e.useRef(null);e.useEffect(()=>()=>{var e;try{null==(e=Xe.current)||e.destroy()}catch{}Xe.current=null},[]);const Ye=e.useRef(!1),Qe=e.useRef(!1),Ue=e.useRef(!1),Je=e.useRef(""),et=e.useRef(!1),[tt,st]=e.useState(!0),[at,nt]=e.useState(0),it=e.useCallback(()=>{const e=Xe.current;e&&(Ue.current=!1,et.current=!1,st(!0),Z(!0),e.start())},[]),rt=e.useRef(Ne);e.useEffect(()=>{if(0===He.length)return We(null),Ke(null),void(Je.current="");const e=rt.current!==Ne;e&&(rt.current=Ne);const t=`${He.length}-${Pe.length}-${xe.toFixed(2)}-${me.toFixed(2)}-${Ne}`,s=Je.current;if(!e&&s&&Qe.current){const[e,t]=s.split("-").map(Number),a=Math.abs(He.length-e)/Math.max(e,1),n=Math.abs(Pe.length-t)/Math.max(t,1),i=!s.includes(`${xe.toFixed(2)}-${me.toFixed(2)}`);if(a<.05&&n<.05&&!i)return}let n=!1,i=null;return e&&(Ye.current=!1),i=setTimeout(async()=>{if(!Ye.current){Ye.current=!0,Qe.current=!0,st(!0);try{const i=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,r=186,o=255,l=92,c=pe.current;let d;d=c<=1?o-c*(o-r):r-(c-1)*(r-l);const u=e=>{const t=Math.max(0,Math.min(255,Math.round(e))).toString(16).padStart(2,"0");return`#${t}${t}${t}`},h=e=>u(d+(o-d)*e),x=K(),m=document.documentElement;m.style.setProperty("--meshgraph-label-0",h(0)),m.style.setProperty("--meshgraph-label-1",h(.33)),m.style.setProperty("--meshgraph-label-2",h(.66)),m.style.setProperty("--meshgraph-label-3",h(1)),m.style.setProperty("--meshgraph-label-4","#FFFFFF"),m.style.setProperty("--meshgraph-label-5",x);const p=e=>{if(g&&Te){const t=Te.hopDistance.get(e.id)??99;return 0===t?"Local":1===t?"Hop-1":2===t?"Hop-2":3===t?"Hop-3":"Hop-4+"}return e.isLocal?"Local":e.isHub?"Hub":e.isGateway?"Gateway":e.isBackbone?"Backbone":"Node"},g="backbone"===Ne&&Te,f=(null==Te?void 0:Te.maxHops)??5,b=["#FBBF24","#F97316","#EF4444","#A855F7","#3B82F6","#6366F1","#6B7280"],y=[...He].sort((e,t)=>{if(g){const s=Te.hopDistance.get(e.id)??f+1,a=Te.hopDistance.get(t.id)??f+1;if(s!==a)return a-s}const s=5===e.trafficCategory,a=5===t.trafficCategory;return s&&!a?1:!s&&a?-1:e.size-t.size}).map(e=>{const t=(null==Te?void 0:Te.hopDistance.get(e.id))??99,s=t<=2;let a,n;if(g){if(5===e.trafficCategory)a=x;else if(e.isLocal)a=b[0];else{const e=Math.min(t,b.length-1);a=b[e]}n=(e.isLocal?32:s?20:12)*(.8+e.trafficCategory/4*.4)}else{if(5===e.trafficCategory)a=x;else{const t=100+e.trafficCategory/4*140,s=Math.round(t).toString(16).padStart(2,"0");a=`#${s}${s}${s}`}n=i(e.size,8)}return{id:e.id,label:e.label,color:a,trafficCategory:e.trafficCategory,size:n,groupLabel:p(e)}}),v=[...Pe].sort((e,t)=>(t.certainCount??t.packetCount??0)-(e.certainCount??e.packetCount??0)),j=Math.floor(1*v.length),w=new Set(v.slice(0,Math.max(j,10)).map(e=>`${e.source}-${e.target}`)),N=Math.max(1,...Pe.map(e=>e.certainCount)),k=new Map;for(const e of(null==B?void 0:B.edges)??[]){const t=`${e.fromHash}-${e.toHash}`,s=`${e.toHash}-${e.fromHash}`,a={symmetryRatio:e.symmetryRatio??.5,forwardCount:e.forwardCount??0,reverseCount:e.reverseCount??0};k.set(t,a),k.set(s,a)}const C=Pe.filter(e=>w.has(`${e.source}-${e.target}`)).sort((e,t)=>{if(g&&Te){const s=Te.backboneEdgeSet.has(`${e.source}-${e.target}`),a=Te.backboneEdgeSet.has(`${t.source}-${t.target}`);if(s&&!a)return 1;if(!s&&a)return-1}const s=5===e.trafficCategory,a=5===t.trafficCategory;return s&&!a?1:!s&&a?-1:e.width-t.width}).map(e=>{const t=(null==Te?void 0:Te.hopDistance.get(e.source))??f,s=(null==Te?void 0:Te.hopDistance.get(e.target))??f,a=Math.min(t,s),n=Math.max(t,s)-a,r=k.get(`${e.source}-${e.target}`),o=(null==r?void 0:r.symmetryRatio)??.5,l=Math.log10(e.certainCount+1)/Math.log10(N+1);let c,d,u,h;if(g){0===n?(d=40+30*(1-l),c=.8):(d=120*n*(1+.2*a),c=.15/n);const e=(t+s)/2;e<=1.5?(u="#FB923C",h=2+4*o):e<=2.5?(u="#F87171",h=1.5+2.5*o):e<=3.5?(u="#C084FC",h=1+2*o):(u="#60A5FA",h=.5+1.5*o)}else{const t=l*(.3+.7*o);c=.1+1.9*t,d=20+180*(1-t),u=e.color,h=i(e.width,1)}return{source:e.source,target:e.target,color:u,trafficCategory:e.trafficCategory,width:h,strength:c,distance:d}}),S=y,M=C,L=S.length>0,F=new Set(M.map(e=>e.width)),E=M.length>0,D=1===F.size?F.values().next().value:null,H=new Set(M.map(e=>e.strength)),P=M.length>=2&&H.size>=2,$=new Set(M.map(e=>e.distance)),R=M.length>=2&&$.size>=2,z=new Set(S.map(e=>e.groupLabel)).size>=2,I=(e=!1)=>({points:{pointIdBy:"id",pointColorBy:"color",pointColorStrategy:"direct",pointDefaultColor:"#FFFFFF",pointLabelBy:"label",pointGreyoutOpacity:.5,pointDefaultSize:8,pointSizeScale:1,...e?{}:{pointMass:e=>1+((e.size??8)-6)/18*10},...!e&&L?{pointSizeBy:"size",pointSizeStrategy:"direct"}:{},...!e&&z?{pointClusterBy:"groupLabel"}:{},...!e&&E?{linkWidthBy:"width",linkWidthStrategy:"direct"}:{},...!e&&P?{linkStrengthBy:"strength",linkStrengthStrategy:"direct"}:{}},links:{linkSourceBy:"source",linkTargetsBy:["target"],linkColorBy:"color",linkColorStrategy:"direct",linkDefaultWidth:null!==D?D:1,linkWidthScale:1,linkDefaultColor:"#505050",linkGreyoutOpacity:.15,...!e&&E?{linkWidthBy:"width",linkWidthStrategy:"direct"}:{},...!e&&R?{linkDistanceBy:"distance",linkDistanceStrategy:"direct"}:{}}});let G;try{G=await a(I(!1),S,M)}catch(s){G=await a(I(!0),S,M)}if(n||!G)return;const T=G.points??null,A=G.links??null,Z=G.cosmographConfig;We(T),Ke(A),qe({...Z,fitViewOnInit:!1,...X}),Je.current=t,e&&nt(e=>e+1)}catch(i){st(!1)}finally{Ye.current=!1}}},500),()=>{n=!0,i&&clearTimeout(i)}},[He,Pe,!1,null,xe,me,Ne,Ae,null==B?void 0:B.edges]);const ot=e.useCallback(e=>{e&&(Xe.current=e,it())},[it]),lt=e.useCallback(()=>{var e;null==(e=Xe.current)||e.fitView(800)},[]),ct=e.useCallback(()=>{var e,t,s;const a=Xe.current;if(a){if(Ue.current||(Ue.current=!0,a.fitView(800)),st(!1),!et.current){et.current=!0;try{const n=a._internalApi;null==(e=null==n?void 0:n.initializeLabels)||e.call(n),null==(s=null==(t=null==n?void 0:n.labels)?void 0:t.update)||s.call(t),setTimeout(()=>Ze(),100)}catch{}}Z(!1)}},[Ze]),dt=e.useCallback(()=>{const e=Xe.current;e&&(G?e.pause():e.start(),Z(!G))},[G]),ut=e.useCallback(async e=>{const t=Xe.current;if(t)try{const s=await t.getPointIndicesByIds([e]);s&&s.length>0&&void 0!==s[0]&&t.zoomToPoint(s[0],400,2.5)}catch{}},[]),ht=e.useMemo(()=>{if(!te||!U.trim())return[];const e=U.toLowerCase();return He.filter(t=>{var s;return t.prefix.toLowerCase().includes(e)||(null==(s=t.name)?void 0:s.toLowerCase().includes(e))||t.id.toLowerCase().includes(e)}).slice(0,8)},[He,U,te]),xt=e.useCallback(e=>{ut(e.id),oe(!1),ee(""),W({hash:e.id,name:e.name,prefix:e.prefix,nodeClass:e.nodeClass,packetCount:e.packetCount,edgeCount:$e.get(e.id)??0,betweenness:e.betweenness,communityId:e.communityId,degree:e.degree,hasGeo:e.hasGeo,isLocal:e.isLocal,isHub:e.isHub,isGateway:e.isGateway,isBackbone:e.isBackbone,isMobile:e.isMobile,isInLoop:e.isInLoop,isZeroHop:e.isZeroHop,avgRssi:e.avgRssi,avgSnr:e.avgSnr,activityLevel:e.activityLevel,prefixConfidence:e.prefixConfidence,hasCollision:e.hasCollision,hopDistance:null==Te?void 0:Te.hopDistance.get(e.id)})},[ut,$e,Te]),mt=e.useRef(void 0),pt=e.useRef(0),gt=e.useCallback(async(e,t,s)=>{const a=Date.now();if(s&&a-pt.current>=16&&(pt.current=a,fe.current.x=s.clientX,fe.current.y=s.clientY,fe.current.node&&window.dispatchEvent(new CustomEvent("meshgraph:hover"))),e===mt.current)return;mt.current=e,ve.current&&(clearTimeout(ve.current),ve.current=null);const n=Xe.current;if(n)if(void 0!==e)try{const t=await n.getPointIdsByIndices([e]);if(!t||0===t.length)return;const s=t[0],a=Re.get(s);if(!a)return;fe.current.node=a,window.dispatchEvent(new CustomEvent("meshgraph:hover")),n.selectPoint(e,!1,!0)}catch{fe.current.node=null,window.dispatchEvent(new CustomEvent("meshgraph:hover"))}else ve.current=setTimeout(()=>{fe.current.node=null,window.dispatchEvent(new CustomEvent("meshgraph:hover")),void 0!==V.current?n.selectPoint(V.current,!1,!0):n.unselectAllPoints()},100)},[Re,O]),ft=e.useCallback(()=>{we(e=>!e)},[]),bt=e.useCallback(async(e,t,s)=>{var a;if(fe.current.node=null,window.dispatchEvent(new CustomEvent("meshgraph:hover")),mt.current=void 0,void 0===e)return V.current=void 0,W(null),void(null==(a=Xe.current)||a.unselectAllPoints());const n=Xe.current;if(n)try{const t=await n.getPointIdsByIndices([e]);if(!t||0===t.length)return;const s=t[0],a=Re.get(s);if(!a)return;V.current=e,n.selectPoint(e,!1,!0),W({hash:s,name:a.name,prefix:a.prefix,nodeClass:a.nodeClass,packetCount:a.packetCount,edgeCount:$e.get(s)??0,betweenness:a.betweenness,communityId:a.communityId,degree:a.degree,hasGeo:a.hasGeo,isLocal:a.isLocal,isHub:a.isHub,isGateway:a.isGateway,isBackbone:a.isBackbone,isMobile:a.isMobile,isInLoop:a.isInLoop,isZeroHop:a.isZeroHop,avgRssi:a.avgRssi,avgSnr:a.avgSnr,activityLevel:a.activityLevel,prefixConfidence:a.prefixConfidence,hasCollision:a.hasCollision,hopDistance:null==Te?void 0:Te.hopDistance.get(s)})}catch{}},[Re,$e]),[yt,vt]=e.useState(!0),[jt,wt]=e.useState(!0),Nt=yt&&!O,kt=jt&&!O,Ct=()=>t.jsx("div",{className:"px-2 py-1.5 sm:px-2.5 sm:py-2",children:t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] sm:text-[11px] text-text-secondary tabular-nums whitespace-nowrap",children:[t.jsx("span",{children:He.length}),t.jsx("span",{className:"text-text-muted",children:"•"}),t.jsx("span",{children:Pe.length}),tt&&t.jsx(S,{className:"w-3 h-3 animate-spin text-accent-primary ml-0.5"})]}),t.jsx("div",{className:"w-px h-4 bg-border-subtle/50"}),t.jsxs("div",{className:"flex items-center gap-0.5 shrink-0",children:[t.jsx(h,{content:"force"===Ne?"Backbone view":"Force layout",children:t.jsx("button",{onClick:()=>ke(e=>"force"===e?"backbone":"force"),className:"p-1.5 radius-inner transition-base "+("backbone"===Ne?"bg-accent-primary/30 text-accent-primary":"hover:bg-white/10 text-text-secondary"),children:"force"===Ne?t.jsx(T,{className:"w-4 h-4"}):t.jsx(R,{className:"w-4 h-4"})})}),t.jsx(h,{content:Ce?"Hide labels":"Show labels",children:t.jsx("button",{onClick:()=>Se(e=>!e),className:"p-1.5 radius-inner transition-base "+(Ce?"hover:bg-white/10 text-text-secondary":"bg-white/5 text-text-muted"),children:Ce?t.jsx(F,{className:"w-4 h-4"}):t.jsx(N,{className:"w-4 h-4"})})}),t.jsx(h,{content:"Search (/)",children:t.jsx("button",{onClick:()=>{oe(!0),setTimeout(()=>{var e;return null==(e=le.current)?void 0:e.focus()},50)},className:"p-1.5 radius-inner transition-base "+(te?"bg-accent-primary/30 text-accent-primary":"hover:bg-white/10 text-text-secondary"),children:t.jsx(M,{className:"w-4 h-4"})})}),t.jsx(h,{content:G?"Pause (Space)":"Play (Space)",children:t.jsx("button",{onClick:dt,className:"p-1.5 radius-inner hover:bg-white/10 transition-base",children:G?t.jsx(b,{className:"w-4 h-4 text-accent-success"}):t.jsx(y,{className:"w-4 h-4 text-text-secondary"})})}),t.jsx(h,{content:"Fit view (F)",children:t.jsx("button",{onClick:lt,className:"p-1.5 radius-inner hover:bg-white/10 transition-base",children:t.jsx(I,{className:"w-4 h-4 text-text-secondary"})})}),t.jsx(h,{content:je?"Exit fullscreen":"Fullscreen",children:t.jsx("button",{onClick:ft,className:"p-1.5 radius-inner hover:bg-white/10 transition-base",children:je?t.jsx(j,{className:"w-4 h-4 text-text-secondary"}):t.jsx(k,{className:"w-4 h-4 text-text-secondary"})})})]})]})}),St=()=>{const e="backbone"===Ne,s=Math.min(((null==Te?void 0:Te.maxHops)??3)+2,7);return t.jsx("div",{className:"p-1.5 sm:p-2",children:e?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-[9px] font-medium text-text-muted uppercase tracking-wide mr-0.5 hidden sm:inline",children:"Hops"}),ne.slice(0,s).map((e,s)=>{const a=(null==Te?void 0:Te.nodesPerHop.get(s))??0;return t.jsxs("div",{className:"flex items-center gap-0.5 px-1 py-0.5 radius-badge bg-white/10 shrink-0",title:`${ie[s]}: ${a} nodes`,children:[t.jsx("div",{className:"w-1.5 h-1.5 rounded-full",style:{backgroundColor:e}}),t.jsx("span",{className:"text-[9px] text-text-secondary tabular-nums",children:ie[s]})]},s)}),t.jsxs("div",{className:"flex items-center gap-0.5 px-1 py-0.5 radius-badge bg-white/10 shrink-0 ml-auto",children:[t.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"}),t.jsx("span",{className:"text-[9px] text-text-secondary",children:"p99"})]})]}):t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-[9px] text-text-secondary tabular-nums shrink-0",children:"0"}),t.jsx("div",{className:"flex-1 min-w-0 h-2 rounded-sm",style:ae}),t.jsx("span",{className:"text-[9px] text-text-secondary tabular-nums shrink-0",children:"10K+"}),t.jsxs("div",{className:"flex items-center gap-0.5 px-1 py-0.5 radius-badge bg-white/10 shrink-0 ml-1",children:[t.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"}),t.jsx("span",{className:"text-[9px] text-text-secondary",children:"p99"})]})]})})},Mt=()=>t.jsxs("div",{className:"absolute top-10 sm:top-11 right-2 sm:right-3 z-10 flex flex-col gap-1.5 sm:gap-2 pointer-events-auto",children:[t.jsx(re,{isOpen:Nt,onToggle:()=>vt(e=>!e),children:t.jsx(Ct,{})}),t.jsx(re,{isOpen:kt,onToggle:()=>wt(e=>!e),children:t.jsx(St,{})})]}),Lt=()=>t.jsx("div",{className:"absolute top-0 left-0 z-20 px-4 py-3 pointer-events-none",children:t.jsxs("h1",{className:"type-title text-text-primary flex items-center gap-2 sm:gap-3 pointer-events-auto",children:[t.jsx(d,{className:"w-5 h-5 sm:w-6 sm:h-6 text-icon-page-title"}),t.jsx("span",{children:"MeshGraph"}),t.jsx(u,{color:"sky",compact:!0,children:"Beta"})]})});return f?0===He.length?t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsx("div",{className:"absolute inset-0 bg-bg-body flex items-center justify-center",children:t.jsx(ye,{})})]}):Oe?je?t.jsxs("div",{className:"fixed inset-0 z-50 bg-bg-body flex flex-col overflow-hidden",children:[t.jsxs("div",{className:"flex items-center justify-between px-4 py-2.5 surface-header z-10",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx(d,{className:"w-5 h-5 text-icon-page-title"}),t.jsxs("h1",{className:"type-title text-text-primary flex items-center gap-2",children:["MeshGraph",t.jsx(u,{color:"sky",compact:!0,children:"Beta"})]}),t.jsxs("span",{className:"text-[10px] text-text-muted tabular-nums hidden sm:inline",children:[He.length," nodes • ",Pe.length," edges"]}),tt&&t.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-accent-primary",children:[t.jsx(S,{className:"w-3 h-3 animate-spin"}),t.jsx("span",{className:"hidden sm:inline",children:"Stabilizing"})]})]}),t.jsx(h,{content:"Exit fullscreen",children:t.jsx("button",{onClick:ft,className:"p-1.5 radius-inner hover-bg transition-base",children:t.jsx(j,{className:"w-4 h-4 text-text-muted"})})})]}),t.jsxs("div",{className:"flex-1 relative min-h-0 m-2 surface-base radius-inset overflow-hidden border border-border-subtle",children:[t.jsx(s,{className:"absolute inset-0",points:Oe,links:Ve,..._e,backgroundColor:_(),fitViewOnInit:!1,initialZoomLevel:10,simulationClusterStrength:.8,showLabels:Ce,showDynamicLabels:Ce,showTopLabels:Ce,showTopLabelsLimit:100,showHoveredPointLabel:!0,pointLabelFontSize:11,showClusterLabels:!1,onClick:bt,onMouseMove:gt,onMount:ot,onSimulationEnd:ct,renderHoveredPointRing:!0,hoveredPointRingColor:"#FBBF24",hoveredPointCursor:"pointer",pointGreyoutOpacity:.2,linkGreyoutOpacity:.15},at),t.jsx(x,{children:te&&t.jsx(m.div,{initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.15},className:"absolute top-4 left-1/2 -translate-x-1/2 z-30 w-80",children:t.jsxs("div",{className:"surface-elevated radius-inset shadow-2xl overflow-hidden",children:[t.jsxs("div",{className:"flex items-center gap-2 px-3 py-2.5 border-b border-border-subtle",children:[t.jsx(M,{className:"w-4 h-4 text-text-muted shrink-0"}),t.jsx("input",{ref:le,type:"text",value:U,onChange:e=>ee(e.target.value),placeholder:"Search by name or prefix...",className:"flex-1 bg-transparent text-sm text-text-primary placeholder:text-text-muted focus:outline-none",onKeyDown:e=>{"Escape"===e.key?(oe(!1),ee("")):"Enter"===e.key&&ht.length>0&&xt(ht[0])}}),U&&t.jsx("button",{onClick:()=>ee(""),className:"p-0.5 radius-badge hover-bg transition-base",children:t.jsx(p,{className:"w-3 h-3 text-text-muted"})})]}),ht.length>0&&t.jsx("div",{className:"max-h-64 overflow-y-auto",children:ht.map((e,s)=>{const a=J[e.nodeClass];return t.jsxs("button",{onClick:()=>xt(e),className:"w-full flex items-center gap-3 px-3 py-2 text-left hover:bg-subtle-fill transition-base "+(0===s?"bg-subtle-fill/50":""),children:[t.jsx("span",{className:"w-2.5 h-2.5 rounded-full shrink-0",style:{backgroundColor:Q[e.nodeClass]}}),t.jsx(a,{className:"w-3.5 h-3.5 text-text-muted shrink-0"}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"text-sm text-text-primary truncate",children:e.name||e.prefix}),e.name&&t.jsx("div",{className:"text-[10px] text-text-muted",children:e.prefix})]}),t.jsx(L,{className:"w-3 h-3 text-text-muted shrink-0"})]},e.id)})}),U&&0===ht.length&&t.jsx("div",{className:"px-3 py-4 text-center text-sm text-text-muted",children:"No nodes found"}),!U&&t.jsx("div",{className:"px-3 py-2 text-[10px] text-text-muted",children:"Type to search • Enter to select • Esc to close"})]})})}),t.jsx(Mt,{}),t.jsxs(m.div,{className:"absolute right-4 z-10 hidden lg:flex items-center gap-3 type-data-xs text-text-muted/60",initial:!1,animate:{bottom:O?280:16},transition:{type:"spring",stiffness:400,damping:30},children:[t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"/"})," Search"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"F"})," Fit"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Space"})," Pause"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Esc"})," Clear"]})]}),t.jsx(x,{children:O&&t.jsx(be,{node:O,connections:Ie,onClose:()=>{var e;V.current=void 0,W(null),null==(e=Xe.current)||e.unselectAllPoints()}})})]})]}):t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsxs("div",{className:"absolute inset-0",children:[t.jsx(s,{className:"absolute inset-0",points:Oe,links:Ve,..._e,backgroundColor:_(),fitViewOnInit:!1,initialZoomLevel:10,simulationClusterStrength:.8,showLabels:Ce,showDynamicLabels:Ce,showTopLabels:Ce,showTopLabelsLimit:100,showHoveredPointLabel:!0,pointLabelFontSize:11,showClusterLabels:!1,onClick:bt,onMouseMove:gt,onMount:ot,onSimulationEnd:ct,renderHoveredPointRing:!0,hoveredPointRingColor:"#FBBF24",hoveredPointCursor:"pointer",pointGreyoutOpacity:.2,linkGreyoutOpacity:.15},at),t.jsx(x,{children:te&&t.jsx(m.div,{initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.15},className:"absolute top-4 left-1/2 -translate-x-1/2 z-30 w-80",children:t.jsxs("div",{className:"surface-elevated radius-inset shadow-2xl overflow-hidden",children:[t.jsxs("div",{className:"flex items-center gap-2 px-3 py-2.5 border-b border-border-subtle",children:[t.jsx(M,{className:"w-4 h-4 text-text-muted shrink-0"}),t.jsx("input",{ref:le,type:"text",value:U,onChange:e=>ee(e.target.value),placeholder:"Search by name or prefix...",className:"flex-1 bg-transparent text-sm text-text-primary placeholder:text-text-muted focus:outline-none",onKeyDown:e=>{"Escape"===e.key?(oe(!1),ee("")):"Enter"===e.key&&ht.length>0&&xt(ht[0])}}),U&&t.jsx("button",{onClick:()=>ee(""),className:"p-0.5 radius-badge hover-bg transition-base",children:t.jsx(p,{className:"w-3 h-3 text-text-muted"})})]}),ht.length>0&&t.jsx("div",{className:"max-h-64 overflow-y-auto",children:ht.map((e,s)=>{const a=J[e.nodeClass];return t.jsxs("button",{onClick:()=>xt(e),className:"w-full flex items-center gap-3 px-3 py-2 text-left hover-bg transition-base "+(0===s?"bg-subtle-fill/50":""),children:[t.jsx("span",{className:"w-2.5 h-2.5 rounded-full shrink-0",style:{backgroundColor:Q[e.nodeClass]}}),t.jsx(a,{className:"w-3.5 h-3.5 text-text-muted shrink-0"}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"text-sm text-text-primary truncate",children:e.name||e.prefix}),e.name&&t.jsx("div",{className:"text-[10px] text-text-muted",children:e.prefix})]}),t.jsx(L,{className:"w-3 h-3 text-text-muted shrink-0"})]},e.id)})}),U&&0===ht.length&&t.jsx("div",{className:"px-3 py-4 text-center text-sm text-text-muted",children:"No nodes found"}),!U&&t.jsx("div",{className:"px-3 py-2 type-data-xs text-text-muted",children:"Type to search • Enter to select • Esc to close"})]})})}),t.jsx(Mt,{}),t.jsxs(m.div,{className:"absolute right-4 z-10 hidden lg:flex items-center gap-3 type-data-xs text-text-muted/60",initial:!1,animate:{bottom:O?280:16},transition:{type:"spring",stiffness:400,damping:30},children:[t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"/"})," Search"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"F"})," Fit"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Space"})," Pause"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Esc"})," Clear"]})]}),t.jsx(x,{children:O&&t.jsx(be,{node:O,connections:Ie,onClose:()=>{var e;V.current=void 0,W(null),null==(e=Xe.current)||e.unselectAllPoints()}})})]})]}):t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsxs("div",{className:"absolute inset-0 bg-bg-body flex flex-col items-center justify-center gap-3",children:[t.jsx(S,{className:"w-8 h-8 text-accent-primary animate-spin"}),t.jsx("span",{className:"type-body text-text-muted",children:"Preparing graph..."})]})]}):t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsxs("div",{className:"absolute inset-0 bg-bg-body flex items-center justify-center",children:[t.jsx(v,{isOpen:C,onClose:H}),!C&&t.jsx(S,{className:"w-8 h-8 text-accent-primary animate-spin"})]})]})}export{ve as default}; +import{r as e,j as t,o as s,p as a}from"./vendor-react-Cwum97tW.js";import{c as n,au as i,aK as r,aL as o,f as l,av as c,aF as d,B as u,T as h,A as x,m,X as p,R as g,N as f,aM as b,aN as y}from"./index-D22MpaCY.js";import{D as v,M as j,s as w,E as N,a as k}from"./DeepAnalysisModal-DSV1q_wY.js";import{D as C}from"./DataBox-Bl0vntck.js";import{L as S}from"./loader-circle-2q9lT2qG.js";import{S as M,T as L,E as F}from"./target-BlWNMuhi.js";import{C as D,Z as E}from"./zap-Cpbok2bP.js";import{G as H}from"./git-branch-Cev-c9BQ.js";import{H as B}from"./house-D2cJ2w9-.js";import{N as P}from"./network-Dz5VqBhN.js";import{C as $}from"./chevron-right-CZNwXWtt.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-CDrKesoV.js";import"./config-C7QO3CEB.js";const R=n("arrow-down-up",[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"m21 8-4-4-4 4",key:"1c9v7m"}],["path",{d:"M17 4v16",key:"7dpous"}]]),z=n("circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),I=n("focus",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}]]),G=n("move",[["path",{d:"M12 2v20",key:"t6zp3m"}],["path",{d:"m15 19-3 3-3-3",key:"11eu04"}],["path",{d:"m19 9 3 3-3 3",key:"1mg7y2"}],["path",{d:"M2 12h20",key:"9i4pu4"}],["path",{d:"m5 9-3 3 3 3",key:"j64kie"}],["path",{d:"m9 5 3-3 3 3",key:"l8vdw6"}]]),T=n("tally-5",[["path",{d:"M4 4v16",key:"6qkkli"}],["path",{d:"M9 4v16",key:"81ygyz"}],["path",{d:"M14 4v16",key:"12vmem"}],["path",{d:"M19 4v16",key:"8ij5ei"}],["path",{d:"M22 6 2 18",key:"h9moai"}]]);function A(t,s=1e3){const[a,n]=e.useState(t),i=e.useRef(Date.now()),r=e.useRef(null);return e.useEffect(()=>{const e=Date.now(),a=s-(e-i.current);return a<=0?(n(t),i.current=e):(r.current&&clearTimeout(r.current),r.current=setTimeout(()=>{n(t),i.current=Date.now()},a)),()=>{r.current&&clearTimeout(r.current)}},[t,s]),a}const O=Math.PI/180;let Z=null,W=null,V=0;function K(){const e=Date.now();if(Z&&e-V<1e3)return Z;V=e;const t=getComputedStyle(document.documentElement).getPropertyValue("--accent-primary").trim();if(t.startsWith("color(display-p3")){const e=t.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(e){const t=Math.round(255*parseFloat(e[1])),s=Math.round(255*parseFloat(e[2])),a=Math.round(255*parseFloat(e[3]));return Z=`#${t.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`,Z}}if(t.startsWith("rgb")){const e=t.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);if(e){const t=parseInt(e[1]),s=parseInt(e[2]),a=parseInt(e[3]);return Z=`#${t.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`,Z}}return Z=t.startsWith("#")?t:"#719CDF",Z}function _(){const e=Date.now();if(W&&e-V<1e3)return W;V=e;const t=getComputedStyle(document.documentElement).getPropertyValue("--bg-body").trim();return W=t.startsWith("#")?t:"#171717",W}function q(e,t){if(e<=0)return 0;const s=t-e;if(s>1209600)return 0;if(s<0)return 1;const a=s/3600;return Math.exp(-a/12)}const U={spaceSize:4096,simulationRepulsion:1.2,simulationLinkDistance:30,simulationGravity:.2,simulationCenter:.5,simulationFriction:.92,simulationDecay:600,simulationLinkSpring:.6,simulationClusterStrength:.5,simulationRepulsionTheta:1.5};function X(e,t,s,a,n=3){const i=e<=0?0:Math.log10(e+1),r=Math.log10(5001),o=Math.min(1,i/r),l=6+18*Math.pow(o,n);if(a)return l;const c=s-t;return c>=te?Math.max(6,.5*l):c>=ee?Math.max(6,.7*l):l}const Y={local:"#FFFFFF",hub:"#E0E0E0",gateway:"#C8C8C8",backbone:"#B0B0B0",neighbor:"#F0F0F0",mobile:"#A0A0A0",ghost:"#505050",standard:"#808080"},J={local:"Local Node",hub:"Hub (≥10% traffic)",gateway:"Gateway (7-10%)",backbone:"Backbone",neighbor:"Direct RF Neighbor",mobile:"Mobile/Volatile",ghost:"Discovered (unconfirmed)",standard:"Standard Node"},Q={local:B,hub:E,gateway:H,backbone:H,neighbor:g,mobile:G,ghost:D,standard:z},ee=432e3,te=864e3;function se(e,t,s,a,n={x:0,y:0}){const i=e*O,r=s*O,o=(t-a)*O,l=(e-s)*O,c=637100;return n.x=o*Math.cos(.5*(i+r))*c,n.y=l*c,n}const ae={background:`linear-gradient(to right, ${["#2A2A2A","#3D3D3D","#505050","#636363","#767676","#898989","#9C9C9C","#AFAFAF","#C2C2C2","#D5D5D5","#E8E8E8","#F5F5F5","#FFFFFF"].join(", ")})`},ne=["#FBBF24","#F97316","#EF4444","#A855F7","#3B82F6","#6366F1","#6B7280"],ie=["Local","1","2","3","4","5","6+"];function re({isOpen:s,onToggle:a,children:n,className:i=""}){const[r,o]=e.useState(356),l=e.useRef(null);return e.useEffect(()=>{if(!l.current)return;const e=()=>{var e;const t=(null==(e=l.current)?void 0:e.offsetWidth)??380;o(t-24)};e();const t=new ResizeObserver(e);return t.observe(l.current),()=>t.disconnect()},[]),e.useEffect(()=>{},[s,r]),t.jsx(m.div,{className:i||void 0,initial:!1,animate:{x:s?0:r},transition:{duration:.25,ease:[.4,0,.2,1]},style:{willChange:"transform"},children:t.jsxs("div",{ref:l,className:"surface-control radius-inset flex items-stretch w-[240px] sm:w-[320px] lg:w-[380px] ring-1 ring-white/10",children:[t.jsxs("button",{onClick:a,className:"relative flex items-center justify-center w-6 shrink-0 border-r border-border-subtle/50 hover:bg-white/5 transition-base group",title:s?"Hide panel":"Show panel",children:[t.jsx("span",{className:"absolute -inset-y-0 -left-2 right-0 min-h-[44px]","aria-hidden":"true"}),t.jsx(m.div,{initial:!1,animate:{rotate:s?0:180},transition:{duration:.25,ease:[.4,0,.2,1]},children:t.jsx($,{className:"w-3.5 h-3.5 text-text-muted group-hover:text-text-secondary"})})]}),t.jsx(m.div,{className:"flex-1 min-w-0 overflow-hidden",initial:!1,animate:{opacity:s?1:0},transition:{duration:.15},children:n})]})})}const oe="▁▂▃▄▅▆▇█",le=[-5,0,4,7],ce=[-115,-105,-95,-80],de=["text-signal-critical","text-signal-poor","text-accent-secondary","text-accent-secondary","text-accent-success"],ue=["text-signal-critical","text-signal-poor","text-accent-secondary","text-accent-success","text-accent-success"],he=["░░░░","▂░░░","▂▃░░","▂▄▅░","▂▄▆█"],xe={active:{color:"green",label:"Active"},recent:{color:"yellow",label:"Recent"},stale:{color:"orange",label:"Stale"},inactive:{color:"zinc",label:"Offline"}},me=(e,t,s=6)=>{const a=t?Math.min(1,e/t):0,n=Math.floor(a*s),i=Math.floor(8*(a*s-n));return oe[7].repeat(n)+(n"●".repeat(Math.round(e*t))+"○".repeat(t-Math.round(e*t)),ge=(e,t)=>{const s=t?de:ue,a=(t?le:ce).findIndex(t=>ee.isZeroHop?["◉","text-sys-amber"]:e.isDirectPath?["→","text-sys-cyan"]:e.isLoopEdge?["↺","text-sys-purple"]:["─","text-text-muted"])(e);return t.jsxs("li",{className:"flex items-center gap-1.5 py-0.5 px-1 radius-badge hover:bg-subtle-fill/30 transition-base",children:[t.jsx("span",{className:`w-3 text-center shrink-0 ${n}`,children:a}),t.jsx("span",{className:"size-1.5 shrink-0 rounded-full",style:{backgroundColor:Y[e.nodeClass]}}),t.jsx("code",{className:"shrink-0 text-text-primary",children:e.prefix}),t.jsx("span",{className:"flex-1 min-w-0 truncate text-text-muted",children:e.name||""}),t.jsx("span",{className:"text-accent-secondary tracking-tighter shrink-0",children:me(e.packetCount,s,4)}),t.jsx("span",{className:"tabular-nums text-text-secondary shrink-0 w-8 text-right",children:e.packetCount>=1e3?`${(e.packetCount/1e3).toFixed(1)}k`:e.packetCount})]})}),be=e.memo(function({node:s,connections:a,onClose:n}){const i=e.useMemo(()=>Math.max(s.packetCount,...a.map(e=>e.packetCount),1),[s.packetCount,a]),r=e.useMemo(()=>[...a].sort((e,t)=>e.isZeroHop!==t.isZeroHop?e.isZeroHop?-1:1:e.isDirectPath!==t.isDirectPath?e.isDirectPath?-1:1:t.packetCount-e.packetCount),[a]),o=xe[s.activityLevel]??{color:"zinc",label:s.activityLevel};return t.jsxs(m.div,{variants:w,initial:"hidden",animate:"visible",exit:"exit",className:"absolute inset-x-3 bottom-3 z-20 surface-elevated radius-inset shadow-xl",children:[t.jsxs("div",{className:"flex items-center justify-between px-4 py-2.5 border-b border-border-subtle/50",children:[t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:"size-2 shrink-0 rounded-full",style:{backgroundColor:Y[s.nodeClass]}}),t.jsx("code",{className:"text-sm font-semibold text-text-primary shrink-0",children:s.prefix}),s.name&&t.jsx("span",{className:"text-sm text-text-secondary truncate",children:s.name}),t.jsxs("div",{className:"flex gap-1 shrink-0",children:[s.isLocal&&t.jsx(u,{color:"yellow",compact:!0,children:"LOCAL"}),void 0!==s.hopDistance&&!s.isLocal&&t.jsxs(u,{color:1===s.hopDistance?"orange":2===s.hopDistance?"red":s.hopDistance<=3?"violet":"sky",compact:!0,children:[s.hopDistance,"-HOP"]}),s.isHub&&t.jsx(u,{color:"indigo",compact:!0,children:"HUB"}),s.isGateway&&t.jsx(u,{color:"violet",compact:!0,children:"GW"}),s.isBackbone&&t.jsx(u,{color:"emerald",compact:!0,children:"BONE"}),s.isMobile&&t.jsx(u,{color:"orange",compact:!0,children:"MOB"}),s.isZeroHop&&t.jsx(u,{color:"amber",compact:!0,children:"RF"})]})]}),t.jsx(f,{plain:!0,onClick:n,title:"Close",className:"shrink-0",children:t.jsx(p,{className:"size-4"})})]}),t.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 p-3 font-mono text-[11px]",children:[t.jsxs("div",{className:"space-y-3",children:[t.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[t.jsx(u,{color:o.color,compact:!0,children:o.label}),t.jsx("span",{className:"text-text-muted",children:"•"}),t.jsx("span",{className:"text-text-secondary",children:J[s.nodeClass]}),s.hasGeo&&t.jsx(u,{color:"cyan",compact:!0,children:"GPS"}),s.hasCollision&&t.jsx(u,{color:"red",compact:!0,children:"⚠ COLLISION"})]}),t.jsx(C,{copy:!0,size:"compact",truncate:[10,6],className:"w-full",children:s.hash}),t.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"Packets"}),t.jsx("div",{className:"text-text-primary tabular-nums",children:s.packetCount.toLocaleString()}),t.jsx("div",{className:"text-accent-primary tracking-tighter",children:me(s.packetCount,i,6)})]}),t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"Degree"}),t.jsx("div",{className:"text-text-primary tabular-nums",children:s.degree}),t.jsx("div",{className:"text-accent-secondary tracking-tighter",children:me(s.degree,Math.max(s.degree,10),6)})]}),t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"Central"}),t.jsxs("div",{className:"text-text-primary tabular-nums",children:[(100*s.betweenness).toFixed(0),"%"]}),t.jsx("div",{className:"text-accent-primary tracking-tighter",children:pe(s.betweenness,6)})]})]}),s.isZeroHop&&(null!==s.avgRssi||null!==s.avgSnr)&&t.jsxs("div",{className:"flex gap-4 pt-2 border-t border-border-subtle/30",children:[null!==s.avgRssi&&(()=>{const[e,a]=ge(s.avgRssi,!1);return t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"RSSI"}),t.jsxs("div",{className:"flex items-baseline gap-1",children:[t.jsx("span",{className:`${a} tracking-tight`,children:e}),t.jsx("span",{className:"tabular-nums text-text-secondary",children:s.avgRssi.toFixed(0)}),t.jsx("span",{className:"text-[9px] text-text-muted",children:"dBm"})]})]})})(),null!==s.avgSnr&&(()=>{const[e,a]=ge(s.avgSnr,!0);return t.jsxs("div",{children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase",children:"SNR"}),t.jsxs("div",{className:"flex items-baseline gap-1",children:[t.jsx("span",{className:`${a} tracking-tight`,children:e}),t.jsx("span",{className:"tabular-nums text-text-secondary",children:s.avgSnr.toFixed(1)}),t.jsx("span",{className:"text-[9px] text-text-muted",children:"dB"})]})]})})()]})]}),t.jsxs("div",{className:"space-y-2",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("span",{className:"text-[9px] text-text-muted uppercase",children:"Connections"}),t.jsx(u,{color:"zinc",compact:!0,children:a.length})]}),r.length>0?t.jsxs("ul",{className:"max-h-32 overflow-y-auto space-y-0.5 scrollbar-thin",children:[r.slice(0,20).map(e=>t.jsx(fe,{c:e,maxPkts:i},e.hash)),r.length>20&&t.jsxs("li",{className:"text-center text-text-muted py-1",children:["+",r.length-20," more"]})]}):t.jsx("p",{className:"text-text-muted italic",children:"No connections"})]}),t.jsxs("div",{className:"hidden lg:flex lg:flex-col lg:gap-3",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1",children:[void 0!==s.hopDistance&&t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{className:"text-text-muted",children:"Hop Dist"}),t.jsx("span",{className:"tabular-nums",style:{color:ne[Math.min(s.hopDistance,ne.length-1)]},children:0===s.hopDistance?"Local":`${s.hopDistance} hop${s.hopDistance>1?"s":""}`})]}),t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{className:"text-text-muted",children:"Cluster"}),t.jsxs("span",{className:"text-text-secondary",children:["#",s.communityId]})]}),t.jsxs("div",{className:"flex justify-between",children:[t.jsx("span",{className:"text-text-muted",children:"Edges"}),t.jsx("span",{className:"text-text-secondary",children:s.edgeCount})]}),s.hasCollision&&t.jsxs("div",{className:"flex justify-between col-span-2",children:[t.jsx("span",{className:"text-signal-poor",children:"Prefix Conf."}),t.jsxs("span",{className:"text-signal-poor tabular-nums",children:[(100*s.prefixConfidence).toFixed(0),"%"]})]})]}),t.jsxs("div",{className:"mt-auto pt-2 border-t border-border-subtle/30",children:[t.jsx("div",{className:"text-[9px] text-text-muted uppercase mb-1.5",children:"Edge Types"}),t.jsxs("div",{className:"grid grid-cols-3 gap-1 text-[10px]",children:[t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-sys-amber",children:"◉"}),t.jsx("span",{className:"text-text-muted",children:"RF"})]}),t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-sys-cyan",children:"→"}),t.jsx("span",{className:"text-text-muted",children:"Direct"})]}),t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-sys-purple",children:"↺"}),t.jsx("span",{className:"text-text-muted",children:"Loop"})]})]})]})]})]})]})});function ye(){return t.jsxs("div",{className:"flex flex-col items-center justify-center gap-6 text-center px-8",children:[t.jsx("div",{className:"p-4 radius-pill bg-subtle-fill",children:t.jsx(P,{className:"w-8 h-8 text-text-muted"})}),t.jsxs("div",{className:"space-y-2",children:[t.jsx("h2",{className:"type-subheading text-text-primary",children:"No Topology Data"}),t.jsx("p",{className:"type-body text-text-muted max-w-sm",children:"The mesh topology will appear here once packets are received and processed. This typically takes a few minutes after starting."})]}),t.jsxs("div",{className:"flex items-center gap-2 type-data-xs text-text-muted",children:[t.jsx(g,{className:"w-4 h-4 animate-pulse"}),t.jsx("span",{children:"Waiting for mesh traffic..."})]})]})}function ve(){var n;const g=i(),[f,w]=e.useState(!1),[C,D]=e.useState(!1),E=e.useRef(!1);e.useEffect(()=>{g&&!E.current&&(E.current=!0,D(!0))},[g]);const H=e.useCallback(()=>{D(!1),w(!0)},[]),B=r(),P=A(o(),2e3),$=l(),z=c(),[G,O]=e.useState(!0),[Z,W]=e.useState(null),V=e.useRef(void 0),[J,ee]=e.useState(""),[te,oe]=e.useState(!1),le=e.useRef(null),[ce]=e.useState(1),[de]=e.useState(.15),[ue]=e.useState(2.75),[he]=e.useState(3),xe=A(ue,300),me=A(he,300),pe=e.useRef(ce),ge=e.useRef(de);e.useEffect(()=>{pe.current=ce},[ce]),e.useEffect(()=>{ge.current=de},[de]);const fe=e.useRef({node:null,x:0,y:0}),ve=e.useRef(null),[je,we]=e.useState(!1),[Ne,ke]=e.useState("force"),[Ce,Se]=e.useState(!0);e.useEffect(()=>{const e=e=>{var t,s;if(!(e.target instanceof HTMLInputElement))switch(e.key.toLowerCase()){case"f":e.metaKey||e.ctrlKey||(e.preventDefault(),null==(t=Ue.current)||t.fitView(800));break;case"escape":te?(oe(!1),ee("")):Z&&(V.current=void 0,W(null),null==(s=Ue.current)||s.unselectAllPoints());break;case"/":te||(e.preventDefault(),oe(!0),setTimeout(()=>{var e;return null==(e=le.current)?void 0:e.focus()},50));break;case" ":e.preventDefault();{const e=Ue.current;e&&(G?e.pause():e.start(),O(e=>!e))}}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[te,Z,G]);const Me=(null==z?void 0:z.latitude)??0,Le=(null==z?void 0:z.longitude)??0,Fe=null!==z,[De,Ee]=e.useState(Math.floor(Date.now()/1e3));e.useEffect(()=>{const e=setInterval(()=>{Ee(Math.floor(Date.now()/1e3))},3e5);return()=>clearInterval(e)},[]);const He=e.useMemo(()=>{var e;if(!P||0===P.size||!f)return[];const t=[],s=(null==$?void 0:$.node_name)??(null==(e=null==$?void 0:$.config)?void 0:e.node_name)??null,a={x:0,y:0},n=[];for(const i of P.values()){const e=i.isLocal?1:q(i.lastSeen,De);if(0===e&&!i.isLocal)continue;i.isLocal||n.push(i.packetCount);const r=i.packetCount>0?Math.log10(i.packetCount+1):0,o=Math.log10(5001),l=Math.min(1,r/o);let c;c=i.isLocal?4:l<.2?0:l<.4?1:l<.6?2:l<.8?3:4;const d="#FFFFFF",u=X(i.packetCount,i.lastSeen,De,i.isLocal,ue),h=i.isLocal?s??i.name:i.name;let x,m,p=!1;Fe&&(i.isLocal?(x=0,m=0,p=!0):i.latitude&&i.longitude&&(se(i.latitude,i.longitude,Me,Le,a),x=a.x,m=a.y,p=!0)),t.push({id:i.hash,label:h?`${i.prefix} ${h}`:i.prefix,color:d,trafficCategory:c,size:u,x:x,y:m,recencyWeight:e,nodeClass:i.nodeClass,name:h,prefix:i.prefix,packetCount:i.packetCount,betweenness:i.betweenness,communityId:i.communityId,isLocal:i.isLocal,isHub:i.isHub,isGateway:i.isGateway,isBackbone:i.isBackbone,isMobile:i.isMobile,isGhost:i.isGhost,isInLoop:i.isInLoop,isZeroHop:i.isZeroHop,hasGeo:p,avgRssi:i.avgRssi,avgSnr:i.avgSnr,degree:i.degree,activityLevel:i.activityLevel,prefixConfidence:i.prefixConfidence,hasCollision:i.hasCollision,lastSeen:i.lastSeen})}if(n.length>0){n.sort((e,t)=>e-t);const e=n[Math.floor(.99*n.length)]??n[n.length-1]??1/0;for(const s of t)!s.isLocal&&s.packetCount>=e&&(s.trafficCategory=5)}return t},[P,f,Fe,Me,Le,null==$?void 0:$.node_name,null==(n=null==$?void 0:$.config)?void 0:n.node_name,De,ue]),Be=e.useMemo(()=>{const e=new Set;for(const t of He)e.add(t.id);return e},[He]),{rawLinks:Pe}=e.useMemo(()=>{const e=(null==B?void 0:B.edges)??[];if(!e||0===e.length||!f)return{rawLinks:[],maxCertainCount:0,hasZeroHopEdges:!1,hasLoopEdges:!1,hasDirectPathEdges:!1};const t=K(),s=[];let a=!1,n=!1,i=!1;const r=[],o=5-4*Math.min(1,Math.max(0,(he-.05)/2.95));for(const l of e){if(!Be.has(l.fromHash)||!Be.has(l.toHash))continue;s.push(l.certainCount),a=a||!0===l.isZeroHop,n=n||!0===l.isLoopEdge,i=i||!0===l.isDirectPathEdge;const e=l.avgRecency,t=e<0,o=null==P?void 0:P.get(l.fromHash),c=null==P?void 0:P.get(l.toHash),d=(null==o?void 0:o.isHub)||(null==o?void 0:o.isGateway)||(null==o?void 0:o.isBackbone)||(null==o?void 0:o.isLocal),u=(null==c?void 0:c.isHub)||(null==c?void 0:c.isGateway)||(null==c?void 0:c.isBackbone)||(null==c?void 0:c.isLocal);let h=0,x=300;t||(d&&u?(h=.8,x=250):d||u?(h=.4,x=50):(h=.1,x=300)),r.push({source:l.fromHash,target:l.toHash,color:t?"#1E293B":"#808080",width:t?.1:1,strength:h,distance:x,arrow:!t,trafficCategory:t?0:2,recencyWeight:e,packetCount:l.packetCount,certainCount:l.certainCount,isZeroHop:l.isZeroHop??!1,isLoopEdge:l.isLoopEdge??!1,isDirectPath:l.isDirectPathEdge,avgConfidence:l.avgConfidence})}if(s.length>0){s.sort((e,t)=>e-t);const e=s[Math.floor(.98*s.length)]??s[s.length-1]??1,a=Math.max(1,e),n=Math.log10(a+1),i=s[Math.floor(.99*s.length)]??s[s.length-1]??1/0;for(const s of r){if(0===s.trafficCategory)continue;const e=s.certainCount>0?Math.log10(s.certainCount+1):0,a=Math.min(1,e/n),r=Math.pow(a,he),l=Math.pow(a,de);if(s.width=.1+r*(o-.1),s.certainCount>=i)s.color=t,s.trafficCategory=5;else{const e=Math.round(80+144*l).toString(16).padStart(2,"0");s.color=`#${e}${e}${e}`,s.trafficCategory=a<.25?1:a<.5?2:a<.75?3:4}}}return{rawLinks:r,maxCertainCount:s.length>0?Math.max(...s):0,hasZeroHopEdges:a,hasLoopEdges:n,hasDirectPathEdges:i}},[null==B?void 0:B.edges,f,Be,P,he,de]),$e=e.useMemo(()=>{const e=new Map;for(const t of Pe)e.set(t.source,(e.get(t.source)??0)+1),e.set(t.target,(e.get(t.target)??0)+1);return e},[Pe]),Re=e.useMemo(()=>{const e=new Map;for(const t of He)e.set(t.id,t);return e},[He]),ze=e.useMemo(()=>{const e=new Map;for(const t of Pe)e.has(t.source)||e.set(t.source,[]),e.get(t.source).push({link:t,otherHash:t.target,direction:"outbound"}),e.has(t.target)||e.set(t.target,[]),e.get(t.target).push({link:t,otherHash:t.source,direction:"inbound"});return e},[Pe]),Ie=e.useMemo(()=>{if(!Z)return[];const e=ze.get(Z.hash);if(!e)return[];const t=[];for(const{link:s,otherHash:a,direction:n}of e){const e=Re.get(a);e&&t.push({hash:a,prefix:e.prefix,name:e.name,nodeClass:e.nodeClass,packetCount:s.packetCount,certainCount:s.certainCount,isZeroHop:s.isZeroHop,isDirectPath:s.isDirectPath,isLoopEdge:s.isLoopEdge,direction:n})}return t},[Z,ze,Re]),Ge=e.useMemo(()=>{const e=new Map;for(const t of He)e.set(t.label,t.trafficCategory),e.set(t.prefix,t.trafficCategory);return e},[He]),Te=e.useMemo(()=>{if(0===Pe.length||0===He.length)return null;const e=new Map;for(const l of Pe)e.has(l.source)||e.set(l.source,new Set),e.has(l.target)||e.set(l.target,new Set),e.get(l.source).add(l.target),e.get(l.target).add(l.source);const t=He.find(e=>e.isLocal);if(!t)return null;const s=new Map,a=[t.id];s.set(t.id,0);let n=0;for(;a.length>0;){const t=a.shift(),i=s.get(t),r=e.get(t);if(r)for(const e of r)if(!s.has(e)){const t=i+1;s.set(e,t),n=Math.max(n,t),a.push(e)}}for(const l of He)s.has(l.id)||s.set(l.id,n+1);const i=new Map;for(const l of s.values())i.set(l,(i.get(l)??0)+1);const r=new Set;for(const[l,c]of s)c<=2&&r.add(l);const o=new Set;for(const l of Pe)r.has(l.source)&&r.has(l.target)&&(o.add(`${l.source}-${l.target}`),o.add(`${l.target}-${l.source}`));return{hopDistance:s,maxHops:n,nodesPerHop:i,backboneSet:r,backboneEdgeSet:o,localNodeId:t.id}},[Pe,He]),Ae=Te,Oe=e.useCallback(()=>{const e=document.querySelectorAll(".css-label--label");if(0===e.length||0===Ge.size)return;const t=["meshgraph-label-cat-0","meshgraph-label-cat-1","meshgraph-label-cat-2","meshgraph-label-cat-3","meshgraph-label-cat-4","meshgraph-label-cat-5"];e.forEach(e=>{var s;const a=(null==(s=e.textContent)?void 0:s.trim())??"",n=Ge.get(a);void 0!==n&&(e.classList.remove(...t),e.classList.add(`meshgraph-label-cat-${n}`))})},[Ge]),[Ze,We]=e.useState(null),[Ve,Ke]=e.useState(null),[_e,qe]=e.useState({}),Ue=e.useRef(null);e.useEffect(()=>()=>{var e;try{null==(e=Ue.current)||e.destroy()}catch{}Ue.current=null},[]);const Xe=e.useRef(!1),Ye=e.useRef(!1),Je=e.useRef(!1),Qe=e.useRef(""),et=e.useRef(!1),[tt,st]=e.useState(!0),[at,nt]=e.useState(0),it=e.useCallback(()=>{const e=Ue.current;e&&(Je.current=!1,et.current=!1,st(!0),O(!0),e.start())},[]),rt=e.useRef(Ne);e.useEffect(()=>{if(0===He.length)return We(null),Ke(null),void(Qe.current="");const e=rt.current!==Ne;e&&(rt.current=Ne);const t=`${He.length}-${Pe.length}-${xe.toFixed(2)}-${me.toFixed(2)}-${Ne}`,s=Qe.current;if(!e&&s&&Ye.current){const[e,t]=s.split("-").map(Number),a=Math.abs(He.length-e)/Math.max(e,1),n=Math.abs(Pe.length-t)/Math.max(t,1),i=!s.includes(`${xe.toFixed(2)}-${me.toFixed(2)}`);if(a<.05&&n<.05&&!i)return}let n=!1,i=null;return e&&(Xe.current=!1),i=setTimeout(async()=>{if(!Xe.current){Xe.current=!0,Ye.current=!0,st(!0);try{const i=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,r=186,o=255,l=92,c=pe.current;let d;d=c<=1?o-c*(o-r):r-(c-1)*(r-l);const u=e=>{const t=Math.max(0,Math.min(255,Math.round(e))).toString(16).padStart(2,"0");return`#${t}${t}${t}`},h=e=>u(d+(o-d)*e),x=K(),m=document.documentElement;m.style.setProperty("--meshgraph-label-0",h(0)),m.style.setProperty("--meshgraph-label-1",h(.33)),m.style.setProperty("--meshgraph-label-2",h(.66)),m.style.setProperty("--meshgraph-label-3",h(1)),m.style.setProperty("--meshgraph-label-4","#FFFFFF"),m.style.setProperty("--meshgraph-label-5",x);const p=e=>{if(g&&Te){const t=Te.hopDistance.get(e.id)??99;return 0===t?"Local":1===t?"Hop-1":2===t?"Hop-2":3===t?"Hop-3":"Hop-4+"}return e.isLocal?"Local":e.isHub?"Hub":e.isGateway?"Gateway":e.isBackbone?"Backbone":"Node"},g="backbone"===Ne&&Te,f=(null==Te?void 0:Te.maxHops)??5,b=["#FBBF24","#F97316","#EF4444","#A855F7","#3B82F6","#6366F1","#6B7280"],y=[...He].sort((e,t)=>{if(g){const s=Te.hopDistance.get(e.id)??f+1,a=Te.hopDistance.get(t.id)??f+1;if(s!==a)return a-s}const s=5===e.trafficCategory,a=5===t.trafficCategory;return s&&!a?1:!s&&a?-1:e.size-t.size}).map(e=>{const t=(null==Te?void 0:Te.hopDistance.get(e.id))??99,s=t<=2;let a,n;if(g){if(5===e.trafficCategory)a=x;else if(e.isLocal)a=b[0];else{const e=Math.min(t,b.length-1);a=b[e]}n=(e.isLocal?32:s?20:12)*(.8+e.trafficCategory/4*.4)}else{if(5===e.trafficCategory)a=x;else{const t=100+e.trafficCategory/4*140,s=Math.round(t).toString(16).padStart(2,"0");a=`#${s}${s}${s}`}n=i(e.size,8)}return{id:e.id,label:e.label,color:a,trafficCategory:e.trafficCategory,size:n,groupLabel:p(e)}}),v=[...Pe].sort((e,t)=>(t.certainCount??t.packetCount??0)-(e.certainCount??e.packetCount??0)),j=Math.floor(1*v.length),w=new Set(v.slice(0,Math.max(j,10)).map(e=>`${e.source}-${e.target}`)),N=Math.max(1,...Pe.map(e=>e.certainCount)),k=new Map;for(const e of(null==B?void 0:B.edges)??[]){const t=`${e.fromHash}-${e.toHash}`,s=`${e.toHash}-${e.fromHash}`,a={symmetryRatio:e.symmetryRatio??.5,forwardCount:e.forwardCount??0,reverseCount:e.reverseCount??0};k.set(t,a),k.set(s,a)}const C=Pe.filter(e=>w.has(`${e.source}-${e.target}`)).sort((e,t)=>{if(g&&Te){const s=Te.backboneEdgeSet.has(`${e.source}-${e.target}`),a=Te.backboneEdgeSet.has(`${t.source}-${t.target}`);if(s&&!a)return 1;if(!s&&a)return-1}const s=5===e.trafficCategory,a=5===t.trafficCategory;return s&&!a?1:!s&&a?-1:e.width-t.width}).map(e=>{const t=(null==Te?void 0:Te.hopDistance.get(e.source))??f,s=(null==Te?void 0:Te.hopDistance.get(e.target))??f,a=Math.min(t,s),n=Math.max(t,s)-a,r=k.get(`${e.source}-${e.target}`),o=(null==r?void 0:r.symmetryRatio)??.5,l=Math.log10(e.certainCount+1)/Math.log10(N+1);let c,d,u,h;if(g){0===n?(d=40+30*(1-l),c=.8):(d=120*n*(1+.2*a),c=.15/n);const e=(t+s)/2;e<=1.5?(u="#FB923C",h=2+4*o):e<=2.5?(u="#F87171",h=1.5+2.5*o):e<=3.5?(u="#C084FC",h=1+2*o):(u="#60A5FA",h=.5+1.5*o)}else{const t=l*(.3+.7*o);c=.1+1.9*t,d=20+180*(1-t),u=e.color,h=i(e.width,1)}return{source:e.source,target:e.target,color:u,trafficCategory:e.trafficCategory,width:h,strength:c,distance:d}}),S=y,M=C,L=S.length>0,F=new Set(M.map(e=>e.width)),D=M.length>0,E=1===F.size?F.values().next().value:null,H=new Set(M.map(e=>e.strength)),P=M.length>=2&&H.size>=2,$=new Set(M.map(e=>e.distance)),R=M.length>=2&&$.size>=2,z=new Set(S.map(e=>e.groupLabel)).size>=2,I=(e=!1)=>({points:{pointIdBy:"id",pointColorBy:"color",pointColorStrategy:"direct",pointDefaultColor:"#FFFFFF",pointLabelBy:"label",pointGreyoutOpacity:.5,pointDefaultSize:8,pointSizeScale:1,...e?{}:{pointMass:e=>1+((e.size??8)-6)/18*10},...!e&&L?{pointSizeBy:"size",pointSizeStrategy:"direct"}:{},...!e&&z?{pointClusterBy:"groupLabel"}:{},...!e&&D?{linkWidthBy:"width",linkWidthStrategy:"direct"}:{},...!e&&P?{linkStrengthBy:"strength",linkStrengthStrategy:"direct"}:{}},links:{linkSourceBy:"source",linkTargetsBy:["target"],linkColorBy:"color",linkColorStrategy:"direct",linkDefaultWidth:null!==E?E:1,linkWidthScale:1,linkDefaultColor:"#505050",linkGreyoutOpacity:.15,...!e&&D?{linkWidthBy:"width",linkWidthStrategy:"direct"}:{},...!e&&R?{linkDistanceBy:"distance",linkDistanceStrategy:"direct"}:{}}});let G;try{G=await a(I(!1),S,M)}catch(s){G=await a(I(!0),S,M)}if(n||!G)return;const T=G.points??null,A=G.links??null,O=G.cosmographConfig;We(T),Ke(A),qe({...O,fitViewOnInit:!1,...U}),Qe.current=t,e&&nt(e=>e+1)}catch(i){st(!1)}finally{Xe.current=!1}}},500),()=>{n=!0,i&&clearTimeout(i)}},[He,Pe,!1,null,xe,me,Ne,Ae,null==B?void 0:B.edges]);const ot=e.useCallback(e=>{e&&(Ue.current=e,it())},[it]),lt=e.useCallback(()=>{var e;null==(e=Ue.current)||e.fitView(800)},[]),ct=e.useCallback(()=>{var e,t,s;const a=Ue.current;if(a){if(Je.current||(Je.current=!0,a.fitView(800)),st(!1),!et.current){et.current=!0;try{const n=a._internalApi;null==(e=null==n?void 0:n.initializeLabels)||e.call(n),null==(s=null==(t=null==n?void 0:n.labels)?void 0:t.update)||s.call(t),setTimeout(()=>Oe(),100)}catch{}}O(!1)}},[Oe]),dt=e.useCallback(()=>{const e=Ue.current;e&&(G?e.pause():e.start(),O(!G))},[G]),ut=e.useCallback(async e=>{const t=Ue.current;if(t)try{const s=await t.getPointIndicesByIds([e]);s&&s.length>0&&void 0!==s[0]&&t.zoomToPoint(s[0],400,2.5)}catch{}},[]),ht=e.useMemo(()=>{if(!te||!J.trim())return[];const e=J.toLowerCase();return He.filter(t=>{var s;return t.prefix.toLowerCase().includes(e)||(null==(s=t.name)?void 0:s.toLowerCase().includes(e))||t.id.toLowerCase().includes(e)}).slice(0,8)},[He,J,te]),xt=e.useCallback(e=>{ut(e.id),oe(!1),ee(""),W({hash:e.id,name:e.name,prefix:e.prefix,nodeClass:e.nodeClass,packetCount:e.packetCount,edgeCount:$e.get(e.id)??0,betweenness:e.betweenness,communityId:e.communityId,degree:e.degree,hasGeo:e.hasGeo,isLocal:e.isLocal,isHub:e.isHub,isGateway:e.isGateway,isBackbone:e.isBackbone,isMobile:e.isMobile,isInLoop:e.isInLoop,isZeroHop:e.isZeroHop,avgRssi:e.avgRssi,avgSnr:e.avgSnr,activityLevel:e.activityLevel,prefixConfidence:e.prefixConfidence,hasCollision:e.hasCollision,hopDistance:null==Te?void 0:Te.hopDistance.get(e.id)})},[ut,$e,Te]),mt=e.useRef(void 0),pt=e.useRef(0),gt=e.useCallback(async(e,t,s)=>{const a=Date.now();if(s&&a-pt.current>=16&&(pt.current=a,fe.current.x=s.clientX,fe.current.y=s.clientY,fe.current.node&&window.dispatchEvent(new CustomEvent("meshgraph:hover"))),e===mt.current)return;mt.current=e,ve.current&&(clearTimeout(ve.current),ve.current=null);const n=Ue.current;if(n)if(void 0!==e)try{const t=await n.getPointIdsByIndices([e]);if(!t||0===t.length)return;const s=t[0],a=Re.get(s);if(!a)return;fe.current.node=a,window.dispatchEvent(new CustomEvent("meshgraph:hover")),n.selectPoint(e,!1,!0)}catch{fe.current.node=null,window.dispatchEvent(new CustomEvent("meshgraph:hover"))}else ve.current=setTimeout(()=>{fe.current.node=null,window.dispatchEvent(new CustomEvent("meshgraph:hover")),void 0!==V.current?n.selectPoint(V.current,!1,!0):n.unselectAllPoints()},100)},[Re,Z]),ft=e.useCallback(()=>{we(e=>!e)},[]),bt=e.useCallback(async(e,t,s)=>{var a;if(fe.current.node=null,window.dispatchEvent(new CustomEvent("meshgraph:hover")),mt.current=void 0,void 0===e)return V.current=void 0,W(null),void(null==(a=Ue.current)||a.unselectAllPoints());const n=Ue.current;if(n)try{const t=await n.getPointIdsByIndices([e]);if(!t||0===t.length)return;const s=t[0],a=Re.get(s);if(!a)return;V.current=e,n.selectPoint(e,!1,!0),W({hash:s,name:a.name,prefix:a.prefix,nodeClass:a.nodeClass,packetCount:a.packetCount,edgeCount:$e.get(s)??0,betweenness:a.betweenness,communityId:a.communityId,degree:a.degree,hasGeo:a.hasGeo,isLocal:a.isLocal,isHub:a.isHub,isGateway:a.isGateway,isBackbone:a.isBackbone,isMobile:a.isMobile,isInLoop:a.isInLoop,isZeroHop:a.isZeroHop,avgRssi:a.avgRssi,avgSnr:a.avgSnr,activityLevel:a.activityLevel,prefixConfidence:a.prefixConfidence,hasCollision:a.hasCollision,hopDistance:null==Te?void 0:Te.hopDistance.get(s)})}catch{}},[Re,$e]),[yt,vt]=e.useState(!0),[jt,wt]=e.useState(!0),Nt=yt&&!Z,kt=jt&&!Z,Ct=()=>t.jsx("div",{className:"px-2 py-1.5 sm:px-2.5 sm:py-2",children:t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] sm:text-[11px] text-text-secondary tabular-nums whitespace-nowrap",children:[t.jsx("span",{children:He.length}),t.jsx("span",{className:"text-text-muted",children:"•"}),t.jsx("span",{children:Pe.length}),tt&&t.jsx(S,{className:"w-3 h-3 animate-spin text-accent-primary ml-0.5"})]}),t.jsx("div",{className:"w-px h-4 bg-border-subtle/50"}),t.jsxs("div",{className:"flex items-center gap-0.5 shrink-0",children:[t.jsx(h,{content:"force"===Ne?"Backbone view":"Force layout",children:t.jsx("button",{onClick:()=>ke(e=>"force"===e?"backbone":"force"),className:"p-1.5 radius-inner transition-base "+("backbone"===Ne?"bg-accent-primary/30 text-accent-primary":"hover:bg-white/10 text-text-secondary"),children:"force"===Ne?t.jsx(T,{className:"w-4 h-4"}):t.jsx(R,{className:"w-4 h-4"})})}),t.jsx(h,{content:Ce?"Hide labels":"Show labels",children:t.jsx("button",{onClick:()=>Se(e=>!e),className:"p-1.5 radius-inner transition-base "+(Ce?"hover:bg-white/10 text-text-secondary":"bg-white/5 text-text-muted"),children:Ce?t.jsx(F,{className:"w-4 h-4"}):t.jsx(N,{className:"w-4 h-4"})})}),t.jsx(h,{content:"Search (/)",children:t.jsx("button",{onClick:()=>{oe(!0),setTimeout(()=>{var e;return null==(e=le.current)?void 0:e.focus()},50)},className:"p-1.5 radius-inner transition-base "+(te?"bg-accent-primary/30 text-accent-primary":"hover:bg-white/10 text-text-secondary"),children:t.jsx(M,{className:"w-4 h-4"})})}),t.jsx(h,{content:G?"Pause (Space)":"Play (Space)",children:t.jsx("button",{onClick:dt,className:"p-1.5 radius-inner hover:bg-white/10 transition-base",children:G?t.jsx(b,{className:"w-4 h-4 text-accent-success"}):t.jsx(y,{className:"w-4 h-4 text-text-secondary"})})}),t.jsx(h,{content:"Fit view (F)",children:t.jsx("button",{onClick:lt,className:"p-1.5 radius-inner hover:bg-white/10 transition-base",children:t.jsx(I,{className:"w-4 h-4 text-text-secondary"})})}),t.jsx(h,{content:je?"Exit fullscreen":"Fullscreen",children:t.jsx("button",{onClick:ft,className:"p-1.5 radius-inner hover:bg-white/10 transition-base",children:je?t.jsx(j,{className:"w-4 h-4 text-text-secondary"}):t.jsx(k,{className:"w-4 h-4 text-text-secondary"})})})]})]})}),St=()=>{const e="backbone"===Ne,s=Math.min(((null==Te?void 0:Te.maxHops)??3)+2,7);return t.jsx("div",{className:"p-1.5 sm:p-2",children:e?t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-[9px] font-medium text-text-muted uppercase tracking-wide mr-0.5 hidden sm:inline",children:"Hops"}),ne.slice(0,s).map((e,s)=>{const a=(null==Te?void 0:Te.nodesPerHop.get(s))??0;return t.jsxs("div",{className:"flex items-center gap-0.5 px-1 py-0.5 radius-badge bg-white/10 shrink-0",title:`${ie[s]}: ${a} nodes`,children:[t.jsx("div",{className:"w-1.5 h-1.5 rounded-full",style:{backgroundColor:e}}),t.jsx("span",{className:"text-[9px] text-text-secondary tabular-nums",children:ie[s]})]},s)}),t.jsxs("div",{className:"flex items-center gap-0.5 px-1 py-0.5 radius-badge bg-white/10 shrink-0 ml-auto",children:[t.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"}),t.jsx("span",{className:"text-[9px] text-text-secondary",children:"p99"})]})]}):t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("span",{className:"text-[9px] text-text-secondary tabular-nums shrink-0",children:"0"}),t.jsx("div",{className:"flex-1 min-w-0 h-2 rounded-sm",style:ae}),t.jsx("span",{className:"text-[9px] text-text-secondary tabular-nums shrink-0",children:"10K+"}),t.jsxs("div",{className:"flex items-center gap-0.5 px-1 py-0.5 radius-badge bg-white/10 shrink-0 ml-1",children:[t.jsx("div",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"}),t.jsx("span",{className:"text-[9px] text-text-secondary",children:"p99"})]})]})})},Mt=()=>t.jsxs("div",{className:"absolute top-10 sm:top-11 right-2 sm:right-3 z-10 flex flex-col gap-1.5 sm:gap-2 pointer-events-auto",children:[t.jsx(re,{isOpen:Nt,onToggle:()=>vt(e=>!e),children:t.jsx(Ct,{})}),t.jsx(re,{isOpen:kt,onToggle:()=>wt(e=>!e),children:t.jsx(St,{})})]}),Lt=()=>t.jsx("div",{className:"absolute top-0 left-0 z-20 px-4 py-3 pointer-events-none",children:t.jsxs("h1",{className:"type-title text-text-primary flex items-center gap-2 sm:gap-3 pointer-events-auto",children:[t.jsx(d,{className:"w-5 h-5 sm:w-6 sm:h-6 text-icon-page-title"}),t.jsx("span",{children:"MeshGraph"}),t.jsx(u,{color:"sky",compact:!0,children:"Beta"})]})});return f?0===He.length?t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsx("div",{className:"absolute inset-0 bg-bg-body flex items-center justify-center",children:t.jsx(ye,{})})]}):Ze?je?t.jsxs("div",{className:"fixed inset-0 z-50 bg-bg-body flex flex-col overflow-hidden",children:[t.jsxs("div",{className:"flex items-center justify-between px-4 py-2.5 surface-header z-10",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx(d,{className:"w-5 h-5 text-icon-page-title"}),t.jsxs("h1",{className:"type-title text-text-primary flex items-center gap-2",children:["MeshGraph",t.jsx(u,{color:"sky",compact:!0,children:"Beta"})]}),t.jsxs("span",{className:"text-[10px] text-text-muted tabular-nums hidden sm:inline",children:[He.length," nodes • ",Pe.length," edges"]}),tt&&t.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-accent-primary",children:[t.jsx(S,{className:"w-3 h-3 animate-spin"}),t.jsx("span",{className:"hidden sm:inline",children:"Stabilizing"})]})]}),t.jsx(h,{content:"Exit fullscreen",children:t.jsx("button",{onClick:ft,className:"p-1.5 radius-inner hover-bg transition-base",children:t.jsx(j,{className:"w-4 h-4 text-text-muted"})})})]}),t.jsxs("div",{className:"flex-1 relative min-h-0 m-2 surface-base radius-inset overflow-hidden border border-border-subtle",children:[t.jsx(s,{className:"absolute inset-0",points:Ze,links:Ve,..._e,backgroundColor:_(),fitViewOnInit:!1,initialZoomLevel:10,simulationClusterStrength:.8,showLabels:Ce,showDynamicLabels:Ce,showTopLabels:Ce,showTopLabelsLimit:100,showHoveredPointLabel:!0,pointLabelFontSize:11,showClusterLabels:!1,onClick:bt,onMouseMove:gt,onMount:ot,onSimulationEnd:ct,renderHoveredPointRing:!0,hoveredPointRingColor:"#FBBF24",hoveredPointCursor:"pointer",pointGreyoutOpacity:.2,linkGreyoutOpacity:.15},at),t.jsx(x,{children:te&&t.jsx(m.div,{initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.15},className:"absolute top-4 left-1/2 -translate-x-1/2 z-30 w-80",children:t.jsxs("div",{className:"surface-elevated radius-inset shadow-2xl overflow-hidden",children:[t.jsxs("div",{className:"flex items-center gap-2 px-3 py-2.5 border-b border-border-subtle",children:[t.jsx(M,{className:"w-4 h-4 text-text-muted shrink-0"}),t.jsx("input",{ref:le,type:"text",value:J,onChange:e=>ee(e.target.value),placeholder:"Search by name or prefix...",className:"flex-1 bg-transparent text-sm text-text-primary placeholder:text-text-muted focus:outline-none",onKeyDown:e=>{"Escape"===e.key?(oe(!1),ee("")):"Enter"===e.key&&ht.length>0&&xt(ht[0])}}),J&&t.jsx("button",{onClick:()=>ee(""),className:"p-0.5 radius-badge hover-bg transition-base",children:t.jsx(p,{className:"w-3 h-3 text-text-muted"})})]}),ht.length>0&&t.jsx("div",{className:"max-h-64 overflow-y-auto",children:ht.map((e,s)=>{const a=Q[e.nodeClass];return t.jsxs("button",{onClick:()=>xt(e),className:"w-full flex items-center gap-3 px-3 py-2 text-left hover:bg-subtle-fill transition-base "+(0===s?"bg-subtle-fill/50":""),children:[t.jsx("span",{className:"w-2.5 h-2.5 rounded-full shrink-0",style:{backgroundColor:Y[e.nodeClass]}}),t.jsx(a,{className:"w-3.5 h-3.5 text-text-muted shrink-0"}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"text-sm text-text-primary truncate",children:e.name||e.prefix}),e.name&&t.jsx("div",{className:"text-[10px] text-text-muted",children:e.prefix})]}),t.jsx(L,{className:"w-3 h-3 text-text-muted shrink-0"})]},e.id)})}),J&&0===ht.length&&t.jsx("div",{className:"px-3 py-4 text-center text-sm text-text-muted",children:"No nodes found"}),!J&&t.jsx("div",{className:"px-3 py-2 text-[10px] text-text-muted",children:"Type to search • Enter to select • Esc to close"})]})})}),t.jsx(Mt,{}),t.jsxs(m.div,{className:"absolute right-4 z-10 hidden lg:flex items-center gap-3 type-data-xs text-text-muted/60",initial:!1,animate:{bottom:Z?280:16},transition:{type:"spring",stiffness:400,damping:30},children:[t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"/"})," Search"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"F"})," Fit"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Space"})," Pause"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Esc"})," Clear"]})]}),t.jsx(x,{children:Z&&t.jsx(be,{node:Z,connections:Ie,onClose:()=>{var e;V.current=void 0,W(null),null==(e=Ue.current)||e.unselectAllPoints()}})})]})]}):t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsxs("div",{className:"absolute inset-0",children:[t.jsx(s,{className:"absolute inset-0",points:Ze,links:Ve,..._e,backgroundColor:_(),fitViewOnInit:!1,initialZoomLevel:10,simulationClusterStrength:.8,showLabels:Ce,showDynamicLabels:Ce,showTopLabels:Ce,showTopLabelsLimit:100,showHoveredPointLabel:!0,pointLabelFontSize:11,showClusterLabels:!1,onClick:bt,onMouseMove:gt,onMount:ot,onSimulationEnd:ct,renderHoveredPointRing:!0,hoveredPointRingColor:"#FBBF24",hoveredPointCursor:"pointer",pointGreyoutOpacity:.2,linkGreyoutOpacity:.15},at),t.jsx(x,{children:te&&t.jsx(m.div,{initial:{opacity:0,y:-10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.15},className:"absolute top-4 left-1/2 -translate-x-1/2 z-30 w-80",children:t.jsxs("div",{className:"surface-elevated radius-inset shadow-2xl overflow-hidden",children:[t.jsxs("div",{className:"flex items-center gap-2 px-3 py-2.5 border-b border-border-subtle",children:[t.jsx(M,{className:"w-4 h-4 text-text-muted shrink-0"}),t.jsx("input",{ref:le,type:"text",value:J,onChange:e=>ee(e.target.value),placeholder:"Search by name or prefix...",className:"flex-1 bg-transparent text-sm text-text-primary placeholder:text-text-muted focus:outline-none",onKeyDown:e=>{"Escape"===e.key?(oe(!1),ee("")):"Enter"===e.key&&ht.length>0&&xt(ht[0])}}),J&&t.jsx("button",{onClick:()=>ee(""),className:"p-0.5 radius-badge hover-bg transition-base",children:t.jsx(p,{className:"w-3 h-3 text-text-muted"})})]}),ht.length>0&&t.jsx("div",{className:"max-h-64 overflow-y-auto",children:ht.map((e,s)=>{const a=Q[e.nodeClass];return t.jsxs("button",{onClick:()=>xt(e),className:"w-full flex items-center gap-3 px-3 py-2 text-left hover-bg transition-base "+(0===s?"bg-subtle-fill/50":""),children:[t.jsx("span",{className:"w-2.5 h-2.5 rounded-full shrink-0",style:{backgroundColor:Y[e.nodeClass]}}),t.jsx(a,{className:"w-3.5 h-3.5 text-text-muted shrink-0"}),t.jsxs("div",{className:"flex-1 min-w-0",children:[t.jsx("div",{className:"text-sm text-text-primary truncate",children:e.name||e.prefix}),e.name&&t.jsx("div",{className:"text-[10px] text-text-muted",children:e.prefix})]}),t.jsx(L,{className:"w-3 h-3 text-text-muted shrink-0"})]},e.id)})}),J&&0===ht.length&&t.jsx("div",{className:"px-3 py-4 text-center text-sm text-text-muted",children:"No nodes found"}),!J&&t.jsx("div",{className:"px-3 py-2 type-data-xs text-text-muted",children:"Type to search • Enter to select • Esc to close"})]})})}),t.jsx(Mt,{}),t.jsxs(m.div,{className:"absolute right-4 z-10 hidden lg:flex items-center gap-3 type-data-xs text-text-muted/60",initial:!1,animate:{bottom:Z?280:16},transition:{type:"spring",stiffness:400,damping:30},children:[t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"/"})," Search"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"F"})," Fit"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Space"})," Pause"]}),t.jsxs("span",{children:[t.jsx("kbd",{className:"px-1 py-0.5 radius-badge bg-subtle-fill/50 font-mono",children:"Esc"})," Clear"]})]}),t.jsx(x,{children:Z&&t.jsx(be,{node:Z,connections:Ie,onClose:()=>{var e;V.current=void 0,W(null),null==(e=Ue.current)||e.unselectAllPoints()}})})]})]}):t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsxs("div",{className:"absolute inset-0 bg-bg-body flex flex-col items-center justify-center gap-3",children:[t.jsx(S,{className:"w-8 h-8 text-accent-primary animate-spin"}),t.jsx("span",{className:"type-body text-text-muted",children:"Preparing graph..."})]})]}):t.jsxs("div",{className:"relative h-[calc(100dvh-56px)] lg:h-dvh min-h-[500px] -mx-4 sm:-mx-6 lg:-mx-8 -mt-5 -mb-4 sm:-mb-6 lg:-mb-8 overflow-hidden",children:[t.jsx(Lt,{}),t.jsxs("div",{className:"absolute inset-0 bg-bg-body flex items-center justify-center",children:[t.jsx(v,{isOpen:C,onClose:H}),!C&&t.jsx(S,{className:"w-8 h-8 text-accent-primary animate-spin"})]})]})}export{ve as default}; diff --git a/frontend/dist/assets/MeshGraphLabelTest-9WwHSZHg.js b/frontend/dist/assets/MeshGraphLabelTest-Cv3ODNn6.js similarity index 95% rename from frontend/dist/assets/MeshGraphLabelTest-9WwHSZHg.js rename to frontend/dist/assets/MeshGraphLabelTest-Cv3ODNn6.js index 06a200fa..e64c4601 100644 --- a/frontend/dist/assets/MeshGraphLabelTest-9WwHSZHg.js +++ b/frontend/dist/assets/MeshGraphLabelTest-Cv3ODNn6.js @@ -1 +1 @@ -import{r as e,j as l,o as s,p as t}from"./vendor-react-DFCqJxYC.js";import{L as o}from"./loader-circle-BLG0SL8e.js";import"./deckgl-DTsmDcfs.js";import"./index-CZBrdv20.js";import"./vendor-core-Dhs13Wlh.js";const a=[{id:"node-1",label:"Alpha Hub",color:"#FFFFFF",size:20},{id:"node-2",label:"Beta Gateway",color:"#E0E0E0",size:15},{id:"node-3",label:"Gamma Relay",color:"#C0C0C0",size:12},{id:"node-4",label:"Delta Edge",color:"#A0A0A0",size:10},{id:"node-5",label:"Epsilon Leaf",color:"#808080",size:8}],n=[{source:"node-1",target:"node-2",color:"#666666",width:2},{source:"node-1",target:"node-3",color:"#666666",width:2},{source:"node-2",target:"node-4",color:"#444444",width:1},{source:"node-3",target:"node-5",color:"#444444",width:1}];function i(){const[i,r]=e.useState(null),[c,d]=e.useState(null),[m,p]=e.useState({}),[u,h]=e.useState([]),b=e.useRef(null),g=e.useCallback(e=>{h(l=>[...l.slice(-20),`${(new Date).toISOString().slice(11,19)} ${e}`])},[]);e.useEffect(()=>{(async()=>{var e,l,s;g("Starting data preparation..."),g(`Input nodes: ${JSON.stringify(a.map(e=>({id:e.id,label:e.label})))}`);try{const o=await t({points:{pointIdBy:"id",pointLabelBy:"label",pointColorBy:"color",pointColorStrategy:"direct",pointSizeBy:"size",pointSizeStrategy:"direct",pointDefaultSize:10,pointDefaultColor:"#FFFFFF",pointGreyoutOpacity:.3,pointSizeScale:1},links:{linkSourceBy:"source",linkTargetsBy:["target"],linkColorBy:"color",linkColorStrategy:"direct",linkWidthBy:"width",linkWidthStrategy:"direct",linkDefaultWidth:1,linkDefaultColor:"#444444",linkGreyoutOpacity:.1,linkWidthScale:1}},a,n);if(!o)return void g("ERROR: prepareCosmographData returned undefined");if(g("Preparation complete!"),g("result.points: "+(o.points?"present":"null")),g("result.links: "+(o.links?"present":"null")),g(`result.cosmographConfig keys: ${Object.keys(o.cosmographConfig??{}).join(", ")}`),o.points){const t=(null==(l=null==(e=o.points.schema)?void 0:e.fields)?void 0:l.map(e=>e.name))??[];g(`Arrow table columns: ${t.join(", ")}`);const a=t.includes("label");g("Has 'label' column in Arrow table: "+(a?"YES ✓":"NO ✗"));const n=null==(s=o.cosmographConfig)?void 0:s.pointLabelBy;g(`pointLabelBy in cosmographConfig: ${n??"NOT SET"}`)}r(o.points??null),d(o.links??null),p(o.cosmographConfig??{})}catch(o){g(`ERROR: ${o}`)}})()},[g]);const f=e.useCallback(e=>{b.current=e,g("Cosmograph mounted"),setTimeout(()=>{const e=document.querySelector(".css-label--labels-container"),l=document.querySelectorAll('[class*="css-label"]'),s=document.querySelectorAll('[class*="cosmograph"][class*="label"]');g("Label containers found: "+(e?"YES":"NO")),g(`Elements with css-label class: ${l.length}`),g(`Elements with cosmograph+label class: ${s.length}`),l.forEach((e,l)=>{});const t=document.querySelector(".cosmograph");if(t){const e=Array.from(t.children);g(`Cosmograph container children: ${e.map(e=>e.tagName+"."+e.className.split(" ")[0]).join(", ")}`)}},2e3)},[g]),x=e.useCallback(()=>{var e,l,s,t,o;g("Simulation ended"),null==(e=b.current)||e.fitView(500);const a=null==(l=b.current)?void 0:l._internalApi;if(a){g("Attempting to initialize labels via internal API...");try{null==(s=a.initializeLabels)||s.call(a),null==(o=null==(t=a.labels)?void 0:t.update)||o.call(t),g("Labels API called successfully")}catch(n){g(`Labels init error: ${n}`)}}else g("No internal API access")},[g]);return i?l.jsxs("div",{className:"h-screen flex flex-col bg-black text-white",children:[l.jsxs("div",{className:"px-4 py-2 border-b border-gray-800 flex items-center justify-between",children:[l.jsx("h1",{className:"text-lg font-semibold",children:"Label Rendering Test"}),l.jsxs("span",{className:"text-sm text-gray-400",children:[a.length," nodes • Check if labels appear below"]})]}),l.jsxs("div",{className:"flex-1 flex",children:[l.jsx("div",{className:"flex-1 relative",children:l.jsx(s,{className:"absolute inset-0",points:i,links:c,...m,backgroundColor:"#000000",fitViewOnInit:!0,showLabels:!0,showDynamicLabels:!0,showTopLabels:!0,showTopLabelsLimit:10,showHoveredPointLabel:!0,pointLabelColor:"#FFFF00",pointLabelFontSize:14,onMount:f,onSimulationEnd:x})}),l.jsxs("div",{className:"w-80 border-l border-gray-800 p-4 overflow-auto",children:[l.jsx("h2",{className:"text-sm font-semibold mb-2",children:"Debug Log"}),l.jsx("div",{className:"space-y-1 text-xs font-mono text-gray-400",children:u.map((e,s)=>l.jsx("div",{children:e},s))}),l.jsx("h2",{className:"text-sm font-semibold mt-4 mb-2",children:"Config from prepareCosmographData"}),l.jsx("pre",{className:"text-xs font-mono text-gray-400 whitespace-pre-wrap",children:JSON.stringify(m,null,2)}),l.jsx("h2",{className:"text-sm font-semibold mt-4 mb-2",children:"Expected Labels"}),l.jsx("ul",{className:"text-xs space-y-1",children:a.map(e=>l.jsxs("li",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"w-3 h-3 rounded-full",style:{backgroundColor:e.color}}),l.jsx("span",{children:e.label})]},e.id))})]})]})]}):l.jsx("div",{className:"h-screen flex items-center justify-center bg-black",children:l.jsx(o,{className:"w-8 h-8 animate-spin text-white"})})}export{i as default}; +import{r as e,j as l,o as s,p as t}from"./vendor-react-Cwum97tW.js";import{L as o}from"./loader-circle-2q9lT2qG.js";import"./deckgl-DTsmDcfs.js";import"./index-D22MpaCY.js";import"./vendor-core-CDrKesoV.js";const a=[{id:"node-1",label:"Alpha Hub",color:"#FFFFFF",size:20},{id:"node-2",label:"Beta Gateway",color:"#E0E0E0",size:15},{id:"node-3",label:"Gamma Relay",color:"#C0C0C0",size:12},{id:"node-4",label:"Delta Edge",color:"#A0A0A0",size:10},{id:"node-5",label:"Epsilon Leaf",color:"#808080",size:8}],n=[{source:"node-1",target:"node-2",color:"#666666",width:2},{source:"node-1",target:"node-3",color:"#666666",width:2},{source:"node-2",target:"node-4",color:"#444444",width:1},{source:"node-3",target:"node-5",color:"#444444",width:1}];function i(){const[i,r]=e.useState(null),[c,d]=e.useState(null),[m,p]=e.useState({}),[u,h]=e.useState([]),b=e.useRef(null),g=e.useCallback(e=>{h(l=>[...l.slice(-20),`${(new Date).toISOString().slice(11,19)} ${e}`])},[]);e.useEffect(()=>{(async()=>{var e,l,s;g("Starting data preparation..."),g(`Input nodes: ${JSON.stringify(a.map(e=>({id:e.id,label:e.label})))}`);try{const o=await t({points:{pointIdBy:"id",pointLabelBy:"label",pointColorBy:"color",pointColorStrategy:"direct",pointSizeBy:"size",pointSizeStrategy:"direct",pointDefaultSize:10,pointDefaultColor:"#FFFFFF",pointGreyoutOpacity:.3,pointSizeScale:1},links:{linkSourceBy:"source",linkTargetsBy:["target"],linkColorBy:"color",linkColorStrategy:"direct",linkWidthBy:"width",linkWidthStrategy:"direct",linkDefaultWidth:1,linkDefaultColor:"#444444",linkGreyoutOpacity:.1,linkWidthScale:1}},a,n);if(!o)return void g("ERROR: prepareCosmographData returned undefined");if(g("Preparation complete!"),g("result.points: "+(o.points?"present":"null")),g("result.links: "+(o.links?"present":"null")),g(`result.cosmographConfig keys: ${Object.keys(o.cosmographConfig??{}).join(", ")}`),o.points){const t=(null==(l=null==(e=o.points.schema)?void 0:e.fields)?void 0:l.map(e=>e.name))??[];g(`Arrow table columns: ${t.join(", ")}`);const a=t.includes("label");g("Has 'label' column in Arrow table: "+(a?"YES ✓":"NO ✗"));const n=null==(s=o.cosmographConfig)?void 0:s.pointLabelBy;g(`pointLabelBy in cosmographConfig: ${n??"NOT SET"}`)}r(o.points??null),d(o.links??null),p(o.cosmographConfig??{})}catch(o){g(`ERROR: ${o}`)}})()},[g]);const f=e.useCallback(e=>{b.current=e,g("Cosmograph mounted"),setTimeout(()=>{const e=document.querySelector(".css-label--labels-container"),l=document.querySelectorAll('[class*="css-label"]'),s=document.querySelectorAll('[class*="cosmograph"][class*="label"]');g("Label containers found: "+(e?"YES":"NO")),g(`Elements with css-label class: ${l.length}`),g(`Elements with cosmograph+label class: ${s.length}`),l.forEach((e,l)=>{});const t=document.querySelector(".cosmograph");if(t){const e=Array.from(t.children);g(`Cosmograph container children: ${e.map(e=>e.tagName+"."+e.className.split(" ")[0]).join(", ")}`)}},2e3)},[g]),x=e.useCallback(()=>{var e,l,s,t,o;g("Simulation ended"),null==(e=b.current)||e.fitView(500);const a=null==(l=b.current)?void 0:l._internalApi;if(a){g("Attempting to initialize labels via internal API...");try{null==(s=a.initializeLabels)||s.call(a),null==(o=null==(t=a.labels)?void 0:t.update)||o.call(t),g("Labels API called successfully")}catch(n){g(`Labels init error: ${n}`)}}else g("No internal API access")},[g]);return i?l.jsxs("div",{className:"h-screen flex flex-col bg-black text-white",children:[l.jsxs("div",{className:"px-4 py-2 border-b border-gray-800 flex items-center justify-between",children:[l.jsx("h1",{className:"text-lg font-semibold",children:"Label Rendering Test"}),l.jsxs("span",{className:"text-sm text-gray-400",children:[a.length," nodes • Check if labels appear below"]})]}),l.jsxs("div",{className:"flex-1 flex",children:[l.jsx("div",{className:"flex-1 relative",children:l.jsx(s,{className:"absolute inset-0",points:i,links:c,...m,backgroundColor:"#000000",fitViewOnInit:!0,showLabels:!0,showDynamicLabels:!0,showTopLabels:!0,showTopLabelsLimit:10,showHoveredPointLabel:!0,pointLabelColor:"#FFFF00",pointLabelFontSize:14,onMount:f,onSimulationEnd:x})}),l.jsxs("div",{className:"w-80 border-l border-gray-800 p-4 overflow-auto",children:[l.jsx("h2",{className:"text-sm font-semibold mb-2",children:"Debug Log"}),l.jsx("div",{className:"space-y-1 text-xs font-mono text-gray-400",children:u.map((e,s)=>l.jsx("div",{children:e},s))}),l.jsx("h2",{className:"text-sm font-semibold mt-4 mb-2",children:"Config from prepareCosmographData"}),l.jsx("pre",{className:"text-xs font-mono text-gray-400 whitespace-pre-wrap",children:JSON.stringify(m,null,2)}),l.jsx("h2",{className:"text-sm font-semibold mt-4 mb-2",children:"Expected Labels"}),l.jsx("ul",{className:"text-xs space-y-1",children:a.map(e=>l.jsxs("li",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"w-3 h-3 rounded-full",style:{backgroundColor:e.color}}),l.jsx("span",{children:e.label})]},e.id))})]})]})]}):l.jsx("div",{className:"h-screen flex items-center justify-center bg-black",children:l.jsx(o,{className:"w-8 h-8 animate-spin text-white"})})}export{i as default}; diff --git a/frontend/dist/assets/NodeInformationCard-D_WIPYcK.js b/frontend/dist/assets/NodeInformationCard-CJnzzUo0.js similarity index 87% rename from frontend/dist/assets/NodeInformationCard-D_WIPYcK.js rename to frontend/dist/assets/NodeInformationCard-CJnzzUo0.js index 55f77f4e..54301123 100644 --- a/frontend/dist/assets/NodeInformationCard-D_WIPYcK.js +++ b/frontend/dist/assets/NodeInformationCard-CJnzzUo0.js @@ -1 +1 @@ -import{j as e}from"./vendor-react-DFCqJxYC.js";import{a as s}from"./PageLayout-Dz1NyqHa.js";import{D as t}from"./DataBox-BuwfTaKv.js";import{R as a,b9 as r}from"./index-CZBrdv20.js";import{C as l}from"./Card-BiYlryJL.js";function c({nodeName:c,repeaterVersion:m,coreVersion:i,localHash:n,publicKey:d}){return e.jsxs(s,{children:[e.jsx(l,{icon:e.jsx(a,{}),title:"Node Information",largeTitle:!0}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3 sm:gap-4",children:[e.jsxs("div",{className:"min-w-0 col-span-2 sm:col-span-1",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Node Name"}),e.jsx("p",{className:"type-body text-text-primary mt-0.5 sm:mt-1 truncate",title:c,children:c})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Repeater"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${m}`,children:["v",m]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Core"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${i}`,children:["v",i]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Console"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${r}`,children:["v",r]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Local Hash"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:n?e.jsx(t,{copy:!0,size:"compact",children:n}):e.jsx("span",{className:"type-data-sm text-text-secondary",children:"N/A"})})]})]}),d&&e.jsxs("div",{className:"mt-3 sm:mt-4 pt-3 sm:pt-4 border-t border-border-subtle",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Public Key"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:e.jsx(t,{copy:!0,size:"responsive",children:d})})]})]})}export{c as N}; +import{j as e}from"./vendor-react-Cwum97tW.js";import{a as s}from"./PageLayout-B53JpmK1.js";import{D as t}from"./DataBox-Bl0vntck.js";import{R as a,b0 as r}from"./index-D22MpaCY.js";import{C as l}from"./Card-CCBguhJs.js";function c({nodeName:c,repeaterVersion:m,coreVersion:i,localHash:n,publicKey:d}){return e.jsxs(s,{children:[e.jsx(l,{icon:e.jsx(a,{}),title:"Node Information",largeTitle:!0}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3 sm:gap-4",children:[e.jsxs("div",{className:"min-w-0 col-span-2 sm:col-span-1",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Node Name"}),e.jsx("p",{className:"type-body text-text-primary mt-0.5 sm:mt-1 truncate",title:c,children:c})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Repeater"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${m}`,children:["v",m]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Core"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${i}`,children:["v",i]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Console"}),e.jsxs("p",{className:"type-data text-text-primary mt-0.5 sm:mt-1 truncate",title:`v${r}`,children:["v",r]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Local Hash"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:n?e.jsx(t,{copy:!0,size:"compact",children:n}):e.jsx("span",{className:"type-data-sm text-text-secondary",children:"N/A"})})]})]}),d&&e.jsxs("div",{className:"mt-3 sm:mt-4 pt-3 sm:pt-4 border-t border-border-subtle",children:[e.jsx("span",{className:"type-label text-text-secondary",children:"Public Key"}),e.jsx("div",{className:"mt-0.5 sm:mt-1",children:e.jsx(t,{copy:!0,size:"responsive",children:d})})]})]})}export{c as N}; diff --git a/frontend/dist/assets/PacketList-C0Zwn6jt.js b/frontend/dist/assets/PacketList-C0Zwn6jt.js deleted file mode 100644 index 2d56290e..00000000 --- a/frontend/dist/assets/PacketList-C0Zwn6jt.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PathMapMapLibre-DyVKbFr_.js","assets/vendor-react-DFCqJxYC.js","assets/BasemapLayer-B5scdheQ.js","assets/vendor-core-Dhs13Wlh.js","assets/useThemeColors-CzhUM4y-.js","assets/index-CZBrdv20.js","assets/house-BPemXMFi.js","assets/SignalIndicator-FtRKgdkw.js","assets/arrow-up-Bv56Dbd2.js","assets/DataBox-BuwfTaKv.js","assets/chevron-right-CchtyLvr.js","assets/loader-circle-BLG0SL8e.js","assets/map-pin-BnrkOs2D.js","assets/zap-DOkzycJm.js","assets/triangle-alert-DlaBoont.js","assets/packet-CCmg5Y4j.js","assets/route-CHkUVMnV.js","assets/chevron-up-Cn6bmTpb.js","assets/circle-check-BQrKpAc_.js","assets/index-BKfnA8uz.js","assets/maplibre-gl-B1CfjdFi.css","assets/index-DVRwteP8.css"])))=>i.map(i=>d[i]); -import{j as e,c as t,r as s}from"./vendor-react-DFCqJxYC.js";import{c as a,$ as n,a0 as r,h as i,u as l,Z as c,a1 as o,a2 as d,a3 as x,a4 as m,a5 as h,B as p,a6 as u,a7 as g,a8 as f,a9 as j,aa as y,z as b,ab as N,ac as v,ad as w,ae as k,m as C,G as S,af as H,ag as P,ah as M,ai as _,R as T,aj as B,q as F,ak as L,al as z,am as D,an as A,K as E,N as R,A as U,ao as $,O as I,ap as V,aq as O,ar as Q}from"./index-CZBrdv20.js";import{D as W,S as q,R as G,P as K,a as Y,g as J}from"./SignalIndicator-FtRKgdkw.js";import{a as Z,A as X}from"./arrow-up-Bv56Dbd2.js";import{a as ee,D as te}from"./DataBox-BuwfTaKv.js";import{C as se}from"./chevron-right-CchtyLvr.js";import{L as ae}from"./loader-circle-BLG0SL8e.js";import{_ as ne}from"./deckgl-DTsmDcfs.js";import{M as re}from"./map-pin-BnrkOs2D.js";import{C as ie,Z as le}from"./zap-DOkzycJm.js";import{T as ce}from"./triangle-alert-DlaBoont.js";import{P as oe}from"./packet-CCmg5Y4j.js";import{L as de,H as xe,R as me}from"./route-CHkUVMnV.js";import{A as he,C as pe}from"./chevron-up-Cn6bmTpb.js";import{C as ue}from"./circle-check-BQrKpAc_.js";import{D as ge,H as fe}from"./house-BPemXMFi.js";import{g as je,s as ye}from"./useThemeColors-CzhUM4y-.js";import{A as be}from"./index-BKfnA8uz.js";const Ne=a("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]),ve=a("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]),we=a("corner-down-right",[["path",{d:"m15 10 5 5-5 5",key:"qqa56n"}],["path",{d:"M4 4v7a4 4 0 0 0 4 4h12",key:"z08zvw"}]]),ke=a("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]),Ce=a("reply",[["path",{d:"M20 18v-2a4 4 0 0 0-4-4H4",key:"5vmcpk"}],["path",{d:"m9 17-5-5 5-5",key:"nvlc11"}]]),Se=a("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]),He=a("stethoscope",[["path",{d:"M11 2v2",key:"1539x4"}],["path",{d:"M5 2v2",key:"1yf1q8"}],["path",{d:"M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1",key:"rb5t3r"}],["path",{d:"M8 15a6 6 0 0 0 12 0v-3",key:"x18d4x"}],["circle",{cx:"20",cy:"10",r:"2",key:"ts1r5v"}]]),Pe=a("trophy",[["path",{d:"M10 14.66v1.626a2 2 0 0 1-.976 1.696A5 5 0 0 0 7 21.978",key:"1n3hpd"}],["path",{d:"M14 14.66v1.626a2 2 0 0 0 .976 1.696A5 5 0 0 1 17 21.978",key:"rfe1zi"}],["path",{d:"M18 9h1.5a1 1 0 0 0 0-5H18",key:"7xy6bh"}],["path",{d:"M4 22h16",key:"57wxv0"}],["path",{d:"M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z",key:"1mhfuq"}],["path",{d:"M6 9H4.5a1 1 0 0 1 0-5H6",key:"tex48p"}]]),Me=a("user",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);function _e(e,t){[...t].reverse().forEach(s=>{const a=e.getVariant(s);a&&r(e,a),e.variantChildren&&e.variantChildren.forEach(e=>{_e(e,t)})})}function Te(){const e=new Set,t={subscribe:t=>(e.add(t),()=>{e.delete(t)}),start(t,s){const a=[];return e.forEach(e=>{a.push(n(e,t,{transitionOverride:s}))}),Promise.all(a)},set:t=>e.forEach(e=>{!function(e,t){Array.isArray(t)?_e(e,t):"string"==typeof t?_e(e,[t]):r(e,t)}(e,t)}),stop(){e.forEach(e=>{!function(e){e.values.forEach(e=>e.stop())}(e)})},mount:()=>()=>{t.stop()}};return t}function Be(){const e=i(Te);return l(e.mount,[]),e}function Fe({"aria-label":s="Page navigation",className:a,...n}){return e.jsx("nav",{"aria-label":s,...n,className:t("flex gap-x-2",a)})}function Le({onClick:s,disabled:a=!1,className:n,children:r="Previous"}){return e.jsx("span",{className:t("grow basis-0",n),children:e.jsxs(c,{plain:!0,onClick:s,disabled:a,"aria-label":"Previous page",className:t("gap-1",a&&"invisible"),children:[e.jsx("svg",{className:"size-4 stroke-current",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:e.jsx("path",{d:"M2.75 8H13.25M2.75 8L5.25 5.5M2.75 8L5.25 10.5",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})}),r]})})}function ze({onClick:s,disabled:a=!1,className:n,children:r="Next"}){return e.jsx("span",{className:t("flex grow basis-0 justify-end",n),children:e.jsxs(c,{plain:!0,onClick:s,disabled:a,"aria-label":"Next page",className:t("gap-1",a&&"invisible"),children:[r,e.jsx("svg",{className:"size-4 stroke-current",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:e.jsx("path",{d:"M13.25 8L2.75 8M13.25 8L10.75 10.5M13.25 8L10.75 5.5",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})})]})})}function De({className:s,...a}){return e.jsx("span",{...a,className:t("hidden items-baseline gap-x-2 sm:flex",s)})}function Ae({page:s,current:a=!1,onClick:n,className:r,children:i}){return e.jsx(c,{plain:!a,outline:a,onClick:()=>null==n?void 0:n(s),"aria-label":`Page ${s}`,"aria-current":a?"page":void 0,className:t("min-w-[2.25rem] before:absolute before:-inset-px before:rounded-lg",a&&"before:bg-white/5",r),children:i??s})}function Ee({className:s,...a}){return e.jsx("span",{"aria-hidden":"true",...a,className:t("w-[2.25rem] select-none text-center text-sm text-text-muted",s),children:"…"})}function Re(e){if(!e||e.length<8)return null;const t=parseInt(e.slice(0,2),16),s=parseInt(e.slice(2,4),16),a=parseInt(e.slice(4,6),16),n=parseInt(e.slice(6,8),16);return isNaN(t)||isNaN(s)||isNaN(a)||isNaN(n)?null:((t|s<<8|a<<16|n<<24)>>>0).toString(16).toUpperCase().padStart(8,"0")}function Ue(e){return e>=10?"excellent":e>=5?"good":e>=0?"fair":e>=-5?"poor":"critical"}function $e(e){if(!e.payload)return null;try{const t=m(e.payload),s=function(e){const t=e.original_path||e.forwarded_path||[];if("string"==typeof t)try{const e=JSON.parse(t);if(Array.isArray(e))return e.map(e=>parseInt(e,16))}catch{return[]}else if(Array.isArray(t))return t.map(e=>parseInt(e,16));return[]}(e),a=h(t,s);return a?{packet:e,decoded:a,timestamp:e.timestamp??0,hopCount:a.snrValues.length,rssi:e.rssi,snr:e.snr}:null}catch{return null}}const Ie={rx:{icon:X,label:"Rx",badgeColor:W.rx,avatarBg:"bg-emerald-500/15",avatarText:"text-emerald-400"},forward:{icon:Ne,label:"Fwd",badgeColor:W.forward,avatarBg:"bg-sky-500/15",avatarText:"text-sky-400"},duplicate:{icon:ee,label:"Dupe",badgeColor:W.duplicate,avatarBg:"bg-zinc-500/15",avatarText:"text-zinc-400"},tx:{icon:Z,label:"Tx",badgeColor:W.tx,avatarBg:"bg-violet-500/15",avatarText:"text-violet-400"},dropped:{icon:we,label:"Drop",badgeColor:W.dropped,avatarBg:"bg-amber-500/15",avatarText:"text-amber-400"}},Ve={sm:"w-3 h-3",md:"w-3.5 h-3.5",lg:"w-4 h-4"},Oe={sm:"w-7 h-7",md:"w-8 h-8",lg:"w-9 h-9"};function Qe(e){return"tx_local"===e.packet_origin?"tx":"tx_forward"===e.packet_origin?"forward":e.is_duplicate?"duplicate":e.transmitted?"forward":e.drop_reason?"dropped":"rx"}const We=s.memo(function({packet:s,showLabel:a=!0,variant:n="avatar",size:r="sm"}){const i=Qe(s),l=Ie[i],c=l.icon;return"avatar"===n?e.jsx("div",{className:t("flex items-center justify-center rounded-full flex-shrink-0",l.avatarBg,Oe[r]),children:e.jsx(c,{className:t(Ve[r],l.avatarText)})}):e.jsxs(p,{color:l.badgeColor,children:[e.jsx(c,{className:Ve[r]}),a&&l.label]})}),qe=s.memo(function({path:s,localHash:a,className:n}){if(!s||0===s.length)return e.jsx("span",{className:t("text-white/30 text-[10px]",n),children:"—"});const r=a?(a.startsWith("0x")?a.slice(2,4):a.slice(0,2)).toUpperCase():null;return e.jsx("span",{className:t("flex items-center gap-0.5 font-mono text-[10px] overflow-hidden",n),children:s.map((t,a)=>{const n=a===s.length-1,i=r&&t.toUpperCase()===r;return e.jsxs("span",{className:"flex items-center flex-shrink-0",children:[i?e.jsx("span",{className:"px-1 py-0.5 rounded bg-amber-500/20 text-amber-400 text-[9px] font-medium",children:"You"}):e.jsx("span",{className:"px-1 py-0.5 rounded bg-white/[0.06] text-white/60",children:t.toUpperCase()}),!n&&e.jsx(se,{className:"w-2.5 h-2.5 text-white/20 mx-0.5 flex-shrink-0"})]},`${t}-${a}`)})})}),Ge=s.memo(function({count:s,className:a}){const n=s>=2;return e.jsxs("span",{className:t("font-mono text-xs tabular-nums",n?"text-white/70":"text-white/30",a),children:[s,e.jsx("span",{className:"text-white/20",children:"→"})]})});function Ke(e){const t=e.payload_type_name||f(e.payload_type??e.type),s=e.route_type_name||j(e.route_type??e.route);return{payloadType:t,routeType:s,payloadColor:K[t]??"zinc",routeColor:G[s]??"zinc"}}function Ye(e){if(!e)return[];if(Array.isArray(e))return e;try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Je(e,t){if(!e||!t)return null;const s=e.startsWith("0x")?e.slice(2):e;for(const[a,n]of Object.entries(t))if((a.startsWith("0x")?a.slice(2):a).toLowerCase().startsWith(s.toLowerCase()))return n.name||n.node_name||null;return null}const Ze=s.memo(function({packet:a,onClick:n,localHash:r,neighbors:i,isFlashing:l=!1,isPending:c,isTraceHighlighted:o,onTraceHover:d,traceTag:x,onViewTraceReport:m,dupeGroupPosition:h,isDupeGroupHovered:f=!1,onDupeGroupHover:j}){const y=u(a.is_duplicate),b=void 0!==h,{payloadType:N,routeType:v,payloadColor:w,routeColor:k}=Ke(a),C="tx_local"===a.packet_origin,S=c??a.isPending,H="TRACE"===N,P=Ye(a.original_path),M=Ye(a.forwarded_path),_=M.length>0?M:P,T=_.length,B=a.src_hash?(a.src_hash.startsWith("0x")?a.src_hash.slice(2,6):a.src_hash.slice(0,4)).toUpperCase():null,F=Je(a.src_hash,i),L=a.payload_length??a.length??0;a.lbt_attempts;const z=s.useCallback(()=>{H&&x&&m?m(x):n(a)},[H,x,m,n,a]),D=s.useCallback(()=>{H&&x&&d&&d(x),b&&j&&a.packet_hash&&j(a.packet_hash)},[H,x,d,b,j,a.packet_hash]),A=s.useCallback(()=>{d&&d(null),j&&j(null)},[d,j]),E={lime:"rgb(132, 204, 22)",cyan:"rgb(34, 211, 238)",amber:"rgb(251, 191, 36)",violet:"rgb(167, 139, 250)",rose:"rgb(251, 113, 133)",emerald:"rgb(52, 211, 153)",sky:"rgb(56, 189, 248)",orange:"rgb(251, 146, 60)",pink:"rgb(244, 114, 182)",zinc:"rgb(161, 161, 170)",purple:"rgb(168, 85, 247)",indigo:"rgb(129, 140, 248)",teal:"rgb(45, 212, 191)",fuchsia:"rgb(232, 121, 249)",blue:"rgb(59, 130, 246)",green:"rgb(34, 197, 94)",yellow:"rgb(250, 204, 21)",red:"rgb(239, 68, 68)",brown:"rgb(168, 133, 107)"},R=E[w]||E.zinc,U=f;return e.jsxs("div",{onClick:z,onMouseEnter:D,onMouseLeave:A,className:t("group relative cursor-pointer","hover:bg-white/[0.02]",y&&!f&&"opacity-40",l&&"flash-row",S&&"opacity-70",C&&"bg-violet-500/5",o&&"bg-teal-500/10"),children:[e.jsx("div",{className:t("absolute pointer-events-none transition-opacity duration-75",b?U?"opacity-100":"opacity-0":"opacity-0 group-hover:opacity-100"),style:(()=>{const e={pointerEvents:"none"};return"first"===h?{...e,borderTop:`2px solid ${R}`,borderLeft:`2px solid ${R}`,borderRight:`2px solid ${R}`,borderBottom:"none",borderRadius:"8px 8px 0 0",inset:"-2px -2px 0 -2px"}:"middle"===h?{...e,borderTop:"none",borderLeft:`2px solid ${R}`,borderRight:`2px solid ${R}`,borderBottom:"none",borderRadius:0,inset:"0 -2px"}:"last"===h?{...e,borderTop:"none",borderLeft:`2px solid ${R}`,borderRight:`2px solid ${R}`,borderBottom:`2px solid ${R}`,borderRadius:"0 0 8px 8px",inset:"0 -2px -2px -2px"}:{...e,border:`2px solid ${R}`,borderRadius:"8px",inset:"-2px"}})()}),e.jsxs("div",{className:"relative flex items-center gap-2 min-[600px]:gap-3 px-2 py-2 min-[600px]:px-3 min-[600px]:py-2.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5 flex-shrink-0",children:[e.jsxs("div",{className:"relative flex-shrink-0",children:[e.jsx(We,{packet:a,variant:"avatar",size:"sm"}),S&&e.jsx(ae,{className:"absolute -right-1 -bottom-1 w-3 h-3 text-amber-400 animate-spin"})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"font-bold text-[13px] text-white font-sans truncate",children:B||"—"}),F&&e.jsx("div",{className:"hidden min-[900px]:block text-[9px] text-white/40 truncate max-w-[70px]",children:F})]})]}),e.jsxs("div",{className:"flex-1 flex items-center gap-1 min-[600px]:gap-1.5 min-[900px]:gap-2 min-w-0",children:[e.jsx("span",{className:"text-[10px] min-[600px]:text-[11px] text-white/50 font-mono tabular-nums whitespace-nowrap flex-shrink-0",children:g(a.timestamp)}),e.jsx(p,{color:w,className:"flex-shrink-0",children:N}),e.jsx("span",{className:"min-[600px]:hidden text-[10px] font-mono text-white/40 flex-shrink-0",children:v.charAt(0)}),e.jsx(p,{color:k,className:"flex-shrink-0 hidden min-[600px]:inline-flex",children:v}),e.jsx("div",{className:"flex-shrink-0 flex items-center",children:e.jsx(Ge,{count:T})}),e.jsxs("span",{className:"hidden min-[520px]:inline text-[10px] text-white/40 font-mono flex-shrink-0",children:[L,"B"]}),e.jsx("div",{className:"flex-1 min-w-0 overflow-hidden",children:e.jsx(qe,{path:_,localHash:r})})]}),e.jsx("div",{className:"flex-shrink-0",children:e.jsx(q,{rssi:a.rssi,snr:a.snr,compact:!0,showValues:!0})})]})]})}),Xe=s.memo(function({packet:s,onClick:a,localHash:n,neighbors:r,isFlashing:i=!1,isPending:l,isTraceHighlighted:c,traceTag:o,onViewTraceReport:d,dupeGroupPosition:x,isDupeGroupHovered:m=!1,onDupeGroupHover:h}){const{payloadType:f,routeType:j,payloadColor:y,routeColor:b}=Ke(s),N="tx_local"===s.packet_origin,v=l??s.isPending,w="TRACE"===f,k=u(s.is_duplicate),C=Ye(s.original_path),S=Ye(s.forwarded_path),H=S.length>0?S:C,P=H.length,M=s.src_hash?(s.src_hash.startsWith("0x")?s.src_hash.slice(2,6):s.src_hash.slice(0,4)).toUpperCase():null,_=Je(s.src_hash,r),T=s.payload_length??s.length??0,B=s.lbt_attempts??0,F={lime:"rgb(132, 204, 22)",cyan:"rgb(34, 211, 238)",amber:"rgb(251, 191, 36)",violet:"rgb(167, 139, 250)",rose:"rgb(251, 113, 133)",emerald:"rgb(52, 211, 153)",sky:"rgb(56, 189, 248)",orange:"rgb(251, 146, 60)",pink:"rgb(244, 114, 182)",zinc:"rgb(161, 161, 170)",purple:"rgb(168, 85, 247)",indigo:"rgb(129, 140, 248)",teal:"rgb(45, 212, 191)",fuchsia:"rgb(232, 121, 249)",blue:"rgb(59, 130, 246)",green:"rgb(34, 197, 94)",yellow:"rgb(250, 204, 21)",red:"rgb(239, 68, 68)"},L=F[y]||F.zinc;return e.jsxs("div",{onClick:()=>{w&&o&&d?d(o):a(s)},className:t("relative pl-3 pr-2.5 py-2 cursor-pointer","active:bg-white/[0.04]",k&&"opacity-40",i&&"flash-row",v&&"opacity-70",N&&"bg-violet-500/5",c&&"bg-teal-500/10"),children:[e.jsx("div",{className:"absolute left-0 transition-all",style:(()=>{if(!x)return{opacity:0};const e=m?1:.4,t=m?"3px":"2px";return"first"===x?{backgroundColor:L,opacity:e,width:t,top:"6px",bottom:0,borderRadius:"0 9999px 0 0"}:"middle"===x?{backgroundColor:L,opacity:e,width:t,top:0,bottom:0,borderRadius:0}:"last"===x?{backgroundColor:L,opacity:e,width:t,top:0,bottom:"6px",borderRadius:"0 0 9999px 0"}:{backgroundColor:L,opacity:e,width:t,top:"6px",bottom:"6px",borderRadius:"9999px"}})()}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsxs("div",{className:"relative flex-shrink-0 mt-0.5",children:[e.jsx(We,{packet:s,variant:"avatar",size:"sm"}),v&&e.jsx(ae,{className:"absolute -right-1 -bottom-1 w-2.5 h-2.5 text-amber-400 animate-spin"})]}),e.jsxs("div",{className:"flex-1 min-w-0 space-y-0.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-semibold text-[14px] text-white tracking-tight",children:M||"—"}),_&&e.jsx("span",{className:"text-[12px] text-white/40 truncate max-w-[80px]",children:_}),e.jsx("div",{className:"flex-1"}),e.jsx(p,{color:y,className:"flex-shrink-0 !text-[9px] !px-1.5 !py-0",children:f}),e.jsxs("div",{className:"flex items-center gap-1 flex-shrink-0",children:[e.jsx("span",{className:"text-[10px] font-mono text-white/50 tabular-nums w-[28px] text-right",children:s.rssi}),e.jsx(q,{rssi:s.rssi,compact:!0,showValues:!1})]})]}),e.jsxs("div",{className:"flex items-center gap-1 text-[10px] text-white/40 font-mono",children:[e.jsx("span",{className:"tabular-nums",children:g(s.timestamp)}),e.jsx(p,{color:b,className:"!text-[8px] !px-1 !py-0 !leading-none",children:j.charAt(0)}),P>0&&e.jsxs("span",{className:"text-white/30",children:[P,"h"]}),T>0&&e.jsxs("span",{className:"text-white/30",children:[T,"B"]}),B>0&&e.jsxs("span",{className:B>1?"text-amber-400/60":"text-white/30",children:["LBT:",B]}),null!=s.snr&&e.jsxs("span",{className:"text-white/30",children:[s.snr.toFixed(0),"dB"]})]}),P>0&&e.jsx("div",{className:"pt-0.5",children:e.jsx(qe,{path:H,localHash:n})})]})]})]})});function et(e){if(e.contact_type){const t=e.contact_type.toLowerCase();if("repeater"===t||"rep"===t)return!0;if("companion"===t||"client"===t||"cli"===t)return!1;if("room server"===t||"room_server"===t||"room"===t||"server"===t)return!1}return!0===e.is_repeater||(e.is_repeater,!1)}const tt=s.lazy(()=>ne(()=>import("./PathMapMapLibre-DyVKbFr_.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21])));function st(e){return`${(100*e).toFixed(0)}%`}function at(e,t){const s=document.documentElement,a=getComputedStyle(s),n={success:a.getPropertyValue("--accent-success").trim()||"#39D98A",secondary:a.getPropertyValue("--accent-secondary").trim()||"#F9D26F",poor:a.getPropertyValue("--signal-poor").trim()||"#FF8A5C",danger:a.getPropertyValue("--accent-danger").trim()||"#FF5C7A",muted:a.getPropertyValue("--text-muted").trim()||"#767688"};let r;return r=0===t?n.muted:e>=1?n.success:e>=.5?n.secondary:e>=.25?n.poor:e>0?n.danger:n.muted,{color:r}}class nt extends s.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}render(){return this.state.hasError?e.jsxs("div",{className:"h-[200px] flex items-center justify-center text-text-muted",children:[e.jsx(ce,{className:"w-4 h-4 mr-2"}),"Map failed to load"]}):this.props.children}}function rt({path:a,neighbors:n,localNode:r,localHash:i,srcHash:l,dstHash:c,neighborAffinity:o,prefixLookup:d,hubNodes:x,traceSnr:m,advertiserSource:h}){const[p,u]=s.useState(null),g=s.useMemo(()=>{if(!h)return null;const e="wardrive"===h.nodeType;return{prefix:h.prefix||"??",candidates:[{hash:h.publicKey||h.prefix||"source",name:h.name,latitude:h.latitude,longitude:h.longitude,probability:1,isLocal:!1,isWardrive:e}],confidence:1,totalMatches:1,isSource:!0}},[h]),f=s.useMemo(()=>{if(h)return null;if(!l)return null;const e=b(l),t=n[l];if((null==t?void 0:t.latitude)&&(null==t?void 0:t.longitude)&&(0!==t.latitude||0!==t.longitude))return{prefix:e,candidates:[{hash:l,name:t.node_name||t.name||"Source",latitude:t.latitude,longitude:t.longitude,probability:1,isLocal:!1,isDirectNeighbor:!0===t.zero_hop}],confidence:1,totalMatches:1,isSource:!0};const s=(null==t?void 0:t.node_name)||(null==t?void 0:t.name)||l.slice(0,8);return{prefix:e,candidates:[{hash:l,name:s,latitude:0,longitude:0,probability:1,isLocal:!1}],confidence:1,totalMatches:1,isSource:!0}},[h,l,n]),j=s.useMemo(()=>{const e=(null==c?void 0:c.startsWith("0x"))?c.slice(2):c;if((!e||"00"===e||"0000000000000000"===e)&&r&&i){const e=b(i),t=0!==r.latitude||0!==r.longitude;return{prefix:e,candidates:[{hash:i,name:r.name||"Local Node",latitude:t?r.latitude:0,longitude:t?r.longitude:0,probability:1,isLocal:!0}],confidence:1,totalMatches:1,isDestination:!0}}if(!c)return null;const t=b(c);if(i&&c===i&&r){const e=0!==r.latitude||0!==r.longitude;return{prefix:t,candidates:[{hash:c,name:r.name||"Local Node",latitude:e?r.latitude:0,longitude:e?r.longitude:0,probability:1,isLocal:!0}],confidence:1,totalMatches:1,isDestination:!0}}const s=n[c];if((null==s?void 0:s.latitude)&&(null==s?void 0:s.longitude)&&(0!==s.latitude||0!==s.longitude))return{prefix:t,candidates:[{hash:c,name:s.node_name||s.name||"Destination",latitude:s.latitude,longitude:s.longitude,probability:1,isLocal:!1,isDirectNeighbor:!0===s.zero_hop}],confidence:1,totalMatches:1,isDestination:!0};const a=(null==s?void 0:s.node_name)||(null==s?void 0:s.name)||c.slice(0,8);return{prefix:t,candidates:[{hash:c,name:a,latitude:0,longitude:0,probability:1,isLocal:!1}],confidence:1,totalMatches:1,isDestination:!0}},[c,n,r,i]),N=s.useMemo(()=>function(e,t,s,a,n,r){if(!e||0===e.length)return{hops:[],overallConfidence:0,hasValidPath:!1};const i=e.length-1,l=e.map((l,c)=>{const o=c===i,d=e.length-c,{candidates:x,totalMatches:m}=function(e,t,s,a,n=!1,r,i,l){const c=function(e){const t={};for(const[s,a]of Object.entries(e))et(a)&&(t[s]=a);return t}(t);let o;if(i){const t=function(e,t,s){const a=t.toUpperCase(),n=e.get(a);if(!n||0===n.candidates.length)return{hash:null,confidence:0};if(null==s?void 0:s.isLastHop)return{hash:n.bestMatch,confidence:n.confidence};if(1===(null==s?void 0:s.position))return{hash:n.bestMatch,confidence:n.confidence};if((null==s?void 0:s.position)&&n.bestMatchForPosition.has(s.position)){const e=n.bestMatchForPosition.get(s.position),t=Math.max(e.confidence,n.confidence);return{hash:e.hash,confidence:t}}if((null==s?void 0:s.adjacentPrefixes)&&s.adjacentPrefixes.length>0){let e=n.bestMatch,t=0;for(const a of n.candidates){let n=0;for(const e of s.adjacentPrefixes)n+=a.adjacentPrefixCounts.get(e.toUpperCase())||0;const r=a.combinedScore+n/Math.max(1,a.totalAdjacentObservations)*.3;r>t&&(t=r,e=a.hash)}return{hash:e,confidence:n.confidence}}return{hash:n.bestMatch,confidence:n.confidence}}(i,e,{position:l,isLastHop:n});o=t.confidence}const{matches:d,probability:x}=function(e,t,s,a,n=!1){const r=e.toUpperCase(),i=[],l=s&&y(r,s);l&&i.push(s);for(const h of Object.keys(t))y(r,h)&&i.push(h);if(n&&l&&s&&1===i.length)return{matches:i,probability:1,bestMatch:s};if(n&&l&&i.length>1){const e=i.filter(e=>e!==s);if(1===e.length)return{matches:i,probability:1,bestMatch:e[0]}}const c=i.length>0?1/i.length:0,o=[...i].sort();let d=null,x=-1;if(1===o.length)d=o[0];else if(o.length>1&&a){for(const e of o){const t=a.get(e),s=t?"number"==typeof t?t:t.combinedScore:0;s>x&&(x=s,d=e)}d||(d=o[0])}else o.length>0&&(d=o[0]);let m=c;if(i.length>1&&a&&x>0){let e=0;for(const t of i){const s=a.get(t);e+=s?"number"==typeof s?s:s.combinedScore:0}e>0&&(m=Math.min(.95,x/e))}return{matches:i,probability:m,bestMatch:d}}(e,c,a,r,n),m=d.length,h=[],p=e.toUpperCase(),u=s&&void 0!==s.latitude&&void 0!==s.longitude&&(0!==s.latitude||0!==s.longitude);for(const f of d){if(a&&y(p,a)&&f===a&&u&&s){h.push({hash:f,name:s.name||"Local Node",latitude:s.latitude,longitude:s.longitude,probability:n?1:x,isLocal:!0});continue}const e=c[f];(null==e?void 0:e.latitude)&&(null==e?void 0:e.longitude)&&(0!==e.latitude||0!==e.longitude)&&h.push({hash:f,name:e.node_name||e.name||"Unknown",latitude:e.latitude,longitude:e.longitude,probability:x,isLocal:!1,isDirectNeighbor:!0===e.zero_hop})}const g=h.length;if(1===g)h[0].probability=o??1;else if(g>1)if(void 0!==o&&o>0){h[0].probability=o;const e=1-o,t=g-1;h.slice(1).forEach(s=>{s.probability=e/t})}else{let e=0;const t=h.map(t=>{if(t.isLocal)return{candidate:t,score:1};const a=null==r?void 0:r.get(t.hash);let n=.5;var i;let l;return u&&s&&(n=(i=function(e,t,s,a){const n=(s-e)*Math.PI/180,r=(a-t)*Math.PI/180,i=Math.sin(n/2)*Math.sin(n/2)+Math.cos(e*Math.PI/180)*Math.cos(s*Math.PI/180)*Math.sin(r/2)*Math.sin(r/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371e3}(s.latitude,s.longitude,t.latitude,t.longitude))<100?1:i<500?.9:i<1e3?.7:i<5e3?.5:i<1e4?.3:.1),a?l=.3*n+.3*a.hopConsistencyScore+.4*a.frequencyScore:(l=n,t.isDirectNeighbor&&(l=Math.max(l,.8))),e+=l,{candidate:t,score:l}});if(e>0)t.forEach(({candidate:t,score:s})=>{t.probability=Math.min(.95,s/e)});else{const e=1/g;h.forEach(t=>t.probability=e)}}return{candidates:h,totalMatches:m}}(l,t,s,a,o,n,r,d),h=x.length>0?Math.max(...x.map(e=>e.probability)):0;return{prefix:l,candidates:x,confidence:h,totalMatches:m}}),c=l.reduce((e,t)=>0===t.confidence?0:e*t.confidence,1),o=l.some(e=>e.candidates.length>0);return{hops:l,overallConfidence:c,hasValidPath:o}}(a,n,r,i,o,d),[a,n,r,i,o,d]),v=s.useMemo(()=>{const e=[];g?e.push(g):f&&e.push(f),e.push(...N.hops),j&&e.push(j);const t=e.reduce((e,t)=>0===t.confidence?0:e*t.confidence,1),s=e.some(e=>e.candidates.some(e=>0!==e.latitude||0!==e.longitude));return{hops:e,overallConfidence:t,hasValidPath:s}},[g,f,N,j]);return v.hasValidPath?e.jsxs("div",{className:"h-full flex flex-col space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-text-muted",children:"Path Confidence:"}),e.jsx("span",{className:(w=v.overallConfidence,w>=1?"text-accent-success":w>=.5?"text-accent-secondary":w>=.25?"text-signal-poor":w>0?"text-accent-danger":"text-text-muted"),children:st(v.overallConfidence)}),e.jsx("button",{className:"text-text-muted hover:text-text-secondary transition-colors",title:"Confidence is calculated based on how many known nodes match each path prefix. Multiple matches reduce confidence due to collision probability.",children:e.jsx(ie,{className:"w-3 h-3"})})]}),e.jsxs("div",{className:"flex items-center gap-2 text-[10px]",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-accent-success"}),e.jsx("span",{className:"text-text-muted",children:"Exact"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-accent-secondary"}),e.jsx("span",{className:"text-text-muted",children:"Multi"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-text-muted"}),e.jsx("span",{className:"text-text-muted",children:"Unknown"})]})]})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:e.jsx(nt,{children:e.jsx(s.Suspense,{fallback:e.jsx("div",{className:"h-full bg-bg-elevated flex items-center justify-center text-text-muted text-sm",children:"Loading map..."}),children:e.jsx(tt,{resolvedPath:v,localNode:r,hubNodes:x,hoveredHopIndex:p,onHoverHop:u,traceSnr:m})})})}),e.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:v.hops.map((s,a)=>{var n,r,i;const l=!0===s.isSource,c=!0===s.isDestination,o=p===a;let d;return d=l?`Source: ${(null==(n=s.candidates[0])?void 0:n.name)||"Unknown"}`:c?`Destination: ${(null==(r=s.candidates[0])?void 0:r.name)||"Unknown"}`:0===s.totalMatches?"No matching nodes found":1===s.totalMatches?`Exact match: ${(null==(i=s.candidates[0])?void 0:i.name)||"Unknown"}`:`${s.totalMatches} possible matches (${(100*s.confidence).toFixed(0)}% confidence)`,e.jsxs("div",{className:t("flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer transition-all",o?"bg-accent-primary/20 ring-1 ring-accent-primary/50":"bg-bg-elevated hover:bg-bg-subtle",l&&"border border-accent-success/30",c&&"border border-accent-primary/30"),title:d,onMouseEnter:()=>u(a),onMouseLeave:()=>u(null),children:[l&&e.jsx("span",{className:"text-accent-success text-[8px] mr-0.5",children:"SRC"}),c&&e.jsx("span",{className:"text-accent-primary text-[8px] mr-0.5",children:"DST"}),e.jsx("span",{style:at(s.confidence,s.totalMatches),children:s.prefix}),!l&&!c&&s.totalMatches>1&&e.jsxs("span",{className:"text-text-muted",children:["×",s.totalMatches]}),!l&&!c&&0===s.totalMatches&&e.jsx("span",{className:"text-text-muted",children:"?"})]},a)})})]}):e.jsxs("div",{className:"flex items-center justify-center text-text-muted text-xs py-4",children:[e.jsx(re,{className:"w-3.5 h-3.5 mr-1.5 opacity-50"}),"No location data available for path nodes"]});var w}function it(e){return e.match(/.{1,2}/g)||[]}function lt(e){return null!==e&&e.startsWith("payload:")}const ct={red:"var(--sys-red)",orange:"var(--sys-orange)",amber:"var(--sys-amber)",yellow:"var(--sys-yellow)",lime:"var(--sys-green)",green:"var(--sys-green)",emerald:"var(--sys-green)",teal:"var(--sys-teal)",cyan:"var(--sys-cyan)",sky:"var(--sys-cyan)",blue:"var(--sys-blue)",indigo:"var(--sys-indigo)",violet:"var(--sys-indigo)",purple:"var(--sys-purple)",fuchsia:"var(--sys-pink)",pink:"var(--sys-pink)",rose:"var(--sys-red)",brown:"var(--sys-brown)",zinc:"var(--text-muted)"},ot=15,dt="color-mix(in srgb, var(--bg-elevated) 60%, var(--bg-body))",xt="\n inset 0 0 0 1px color-mix(in srgb, var(--text-primary) 6%, transparent),\n inset 0 1px 0 color-mix(in srgb, white 3%, transparent),\n 0 1px 2px color-mix(in srgb, black 5%, transparent)\n ",mt=2,ht={type:"tween",duration:.25,ease:[.25,.1,.25,1]};function pt(e,t){return e?`inset 0 0 0 ${mt}px ${ct[t]}`:xt}function ut(e,t){return e?t:`color-mix(in srgb, ${t} ${ot}%, transparent)`}function gt({segments:t,selectedSegment:a,onSegmentClick:n}){const[r,i]=s.useState(null),[l,c]=s.useState(null),o=t.some(e=>void 0!==e.id)&&n,d=[];for(const e of t){const t=it(e.hex);for(const s of t)d.push({byte:s.toUpperCase(),color:e.color,id:e.id})}const x=[];for(let e=0;e{const d=t.length<16;return e.jsx("div",{className:"flex rounded-md overflow-hidden",children:t.map(({byte:s,color:x,id:m},h)=>{const p=h===t.length-1,u=d&&p,g=ct[x],f=m?r===m:l===x,j=Boolean(m&&a===m),y=f||j;return e.jsx("span",{className:"w-[1.75rem] text-xs text-center py-0.5 font-mono select-none "+(o?"cursor-pointer":""),style:{backgroundColor:ut(y,g),color:y?"rgba(255,255,255,0.95)":g,transition:y?"none":"background-color 0.15s ease-out, color 0.15s ease-out",touchAction:"manipulation",...u?{borderRadius:"0 0.375rem 0.375rem 0"}:{}},onMouseEnter:()=>{m?i(m):c(x)},onMouseLeave:()=>{i(null),c(null)},onClick:()=>m&&(null==n?void 0:n(m)),onTouchStart:()=>{m?i(m):c(x)},onTouchEnd:()=>{i(null),c(null)},children:s},h)})},s)})})}function ft({bits:t,field:s,value:a,binary:n}){return e.jsxs("tr",{children:[e.jsx("td",{className:"py-1.5 text-xs text-text-muted tabular-nums",children:t}),e.jsx("td",{className:"py-1.5 text-sm text-text-secondary",children:s}),e.jsx("td",{className:"py-1.5",children:(()=>{if("Payload Type"===s){const t=K[a]||"zinc";return e.jsx(p,{color:t,children:a})}if("Route Type"===s){const t=G[a]||"zinc";return e.jsx(p,{color:t,children:a})}return e.jsx("span",{className:"text-sm text-text-primary",children:a})})()}),e.jsx("td",{className:"py-1.5 font-mono text-xs text-sys-cyan",children:n})]})}function jt({id:t,title:s,color:a,hexBytes:n,startByte:r,endByte:i,isSelected:l,children:c}){const o=n?it(n):[];return e.jsxs(C.div,{layout:"position",layoutId:t,transition:ht,className:"w-full min-w-0 overflow-hidden rounded-xl p-4 sm:p-5 space-y-4",style:{backgroundColor:dt,boxShadow:pt(l,a)},children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 min-w-0",children:[e.jsx(p,{color:a,children:s}),o.length>0&&o.length<=16&&o.map((t,s)=>e.jsx(p,{color:a,className:"font-mono",children:t.toUpperCase()},s))]}),e.jsxs("span",{className:"text-[10px] text-text-muted font-mono flex-shrink-0",children:["Bytes ",r,"-",i]})]}),e.jsx("div",{className:"min-w-0 overflow-hidden",children:c})]})}function yt({advert:t,timestamp:s}){const a=P(s||t.timestamp);return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-purple-500/10 dark:bg-purple-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-purple) 0%, var(--sys-blue) 100%)"},children:e.jsx(T,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:t.name||"Unknown Node"}),e.jsx("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:t.nodeType})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-2",children:[void 0!==t.latitude&&void 0!==t.longitude&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(re,{className:"w-4 h-4 text-purple-600 dark:text-purple-400 flex-shrink-0"}),e.jsxs("span",{className:"text-sm text-text-secondary font-mono",children:[t.latitude.toFixed(5),"°, ",t.longitude.toFixed(5),"°"]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(M,{className:"w-4 h-4 text-purple-600 dark:text-purple-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]})]})]})})}function bt({decoded:t,timestamp:s}){const a=s?P(s):"Unknown";return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-teal-500/10 dark:bg-teal-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-teal) 0%, var(--sys-cyan) 100%)"},children:e.jsx(ge,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:t.channelName||"Channel Data"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:[t.dataLength," bytes • ",t.decrypted?"Decrypted":"Encrypted"]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(xe,{className:"w-4 h-4 text-teal-600 dark:text-teal-400 flex-shrink-0"}),e.jsxs("span",{className:"text-sm text-text-secondary font-sans",children:["Channel: ",e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(M,{className:"w-4 h-4 text-teal-600 dark:text-teal-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]}),t.decrypted&&t.decryptedHex&&e.jsxs("div",{className:"mt-2 pt-2 border-t border-black/10 dark:border-white/10",children:[e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mb-1 font-sans",children:"Decrypted Data"}),e.jsx("div",{className:"max-w-full overflow-x-auto",children:e.jsx(te,{size:"compact",copy:!0,className:"inline-block",children:e.jsx("span",{className:"break-all text-xs",children:t.decryptedHex.toUpperCase()})})})]})]})]})})}function Nt({decoded:t,timestamp:a,isLoading:n=!1,onDecrypted:r}){const i=a?P(a):"Unknown",[l,c]=s.useState(""),[o,d]=s.useState(!1),[x,h]=s.useState(null),[p,u]=s.useState(!1),g=s.useCallback(async()=>{if(l.trim()&&t.ciphertextHex&&t.macHex){d(!0),h(null);try{const e=parseInt(t.channelHash,16),s=m(t.macHex),a=m(t.ciphertextHex),n=await _(l.trim(),e,s,a);if(n.success){const e=n.result.plaintext,s=new TextDecoder("utf-8",{fatal:!1}).decode(e.slice(5)),a=s.indexOf(": "),i={...t,channelName:n.result.channelName,decrypted:!0,timestamp:e[0]|e[1]<<8|e[2]<<16|e[3]<<24,flags:e[4],senderName:a>0?s.slice(0,a):void 0,text:a>0?s.slice(a+2):s};null==r||r(i),c(""),u(!1)}else h(n.error)}catch(e){h(e instanceof Error?e.message:"Unknown error")}finally{d(!1)}}},[l,t,r]);return n?e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-xl p-4 sm:p-5",style:{backgroundColor:"color-mix(in srgb, var(--bg-elevated) 60%, var(--bg-body))",boxShadow:"\n inset 0 0 0 1px color-mix(in srgb, var(--text-primary) 6%, transparent),\n inset 0 1px 0 color-mix(in srgb, white 3%, transparent),\n 0 1px 2px color-mix(in srgb, black 5%, transparent)\n "},children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3 h-[15px]",children:[e.jsx("div",{className:"h-2.5 w-12 rounded bg-white/[0.08] animate-pulse"}),e.jsx("div",{className:"h-2.5 w-16 rounded bg-white/[0.08] animate-pulse"})]}),e.jsx("div",{className:"inline-block max-w-[85%] px-3.5 py-2 rounded-2xl rounded-tl-md",style:{background:"color-mix(in srgb, var(--sys-blue) 30%, transparent)"},children:e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-3.5 w-48 rounded bg-white/[0.15] animate-pulse"}),e.jsx("div",{className:"h-3.5 w-32 rounded bg-white/[0.15] animate-pulse"})]})})]})}):t.decrypted?e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-xl p-4 sm:p-5",style:{backgroundColor:"color-mix(in srgb, var(--bg-elevated) 60%, var(--bg-body))",boxShadow:"\n inset 0 0 0 1px color-mix(in srgb, var(--text-primary) 6%, transparent),\n inset 0 1px 0 color-mix(in srgb, white 3%, transparent),\n 0 1px 2px color-mix(in srgb, black 5%, transparent)\n "},children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[t.senderName&&e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:["From ",e.jsx("span",{className:"text-text-secondary font-medium",children:t.senderName})]}),t.channelName&&e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:["in ",e.jsx("span",{className:"text-sys-cyan font-medium",children:t.channelName})]})]}),e.jsx("div",{className:"inline-block max-w-[85%] px-3.5 py-2 rounded-2xl rounded-tl-md",style:{background:"linear-gradient(135deg, var(--sys-blue) 0%, color-mix(in srgb, var(--sys-blue) 85%, var(--sys-cyan)) 100%)"},children:e.jsx("p",{className:"text-sm text-white font-sans leading-relaxed whitespace-pre-wrap break-words",children:t.text})})]})}):e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-zinc-500/10 dark:bg-zinc-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-zinc) 0%, color-mix(in srgb, var(--sys-zinc) 70%, black) 100%)"},children:e.jsx(ke,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:t.isPublicHashChannel?"Public Hash Channel":"Encrypted Message"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:["Channel hash: ",e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(M,{className:"w-4 h-4 text-zinc-500 dark:text-zinc-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:i})]}),t.ciphertextHex&&t.macHex&&e.jsx("div",{className:"space-y-2",children:p?e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:l,onChange:e=>c(e.target.value),placeholder:"Channel name (e.g. south-bay)",className:"flex-1 px-3 py-1.5 text-sm rounded-lg bg-black/20 border border-white/10 text-text-primary placeholder:text-text-muted focus:outline-none focus:border-zinc-500",onKeyDown:e=>"Enter"===e.key&&g(),disabled:o}),e.jsx("button",{onClick:g,disabled:o||!l.trim(),className:"px-3 py-1.5 text-sm font-medium rounded-lg bg-zinc-600 hover:bg-zinc-500 text-white disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:o?"Testing...":"Try"}),e.jsx("button",{onClick:()=>{u(!1),h(null),c("")},className:"px-2 py-1.5 text-sm rounded-lg hover:bg-white/10 text-text-muted transition-colors",children:"×"})]}),x&&e.jsx("p",{className:"text-xs text-red-400",children:x})]}):e.jsx("button",{onClick:()=>u(!0),className:"text-xs text-zinc-400 hover:text-zinc-300 underline underline-offset-2 transition-colors",children:"Know the channel name? Try to decrypt"})}),!p&&e.jsx("p",{className:"text-xs text-text-muted",children:t.isPublicHashChannel?"Public hash channel message. Key not in common channel list.":"Unknown hash channel. Channel name required for decryption."})]})]})})}function vt({decoded:t,timestamp:s}){const a=s?P(s):"Unknown";return e.jsxs("div",{className:"mb-4 flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center shadow-md",style:{background:"linear-gradient(135deg, var(--sys-green) 0%, var(--sys-teal) 100%)"},children:e.jsx(ue,{className:"w-5 h-5 text-white"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-semibold text-text-primary font-sans",children:"Acknowledgment"}),e.jsxs("p",{className:"text-xs text-text-muted font-sans mt-0.5",children:["CRC: ",e.jsxs("span",{className:"font-mono text-sys-green",children:["0x",t.crc]})," · ",a]})]})]})}function wt({decoded:t,timestamp:s}){const a=s?P(s):"Unknown",n=t.path.length;return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-amber-500/10 dark:bg-amber-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-amber) 0%, var(--sys-orange) 100%)"},children:e.jsx(me,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:"Path Response"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:[n," ",1===n?"hop":"hops"]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(M,{className:"w-4 h-4 text-amber-600 dark:text-amber-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]}),t.path.length>0&&e.jsx("div",{className:"mt-2 pt-2 border-t border-black/10 dark:border-white/10",children:e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:t.path.map((t,s)=>e.jsxs("div",{className:"flex items-center gap-2",children:[s>0&&e.jsx(Ne,{className:"w-4 h-4 text-amber-500 dark:text-amber-400"}),e.jsx(p,{color:"amber",className:"font-mono",children:t})]},s))})})]})]})})}function kt({decoded:t,timestamp:s}){const a=s?P(s):"Unknown",n=t.pathHashes.length,r=t.snrValues.length;return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-blue-500/10 dark:bg-blue-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-blue) 0%, var(--sys-indigo) 100%)"},children:e.jsx(he,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("h3",{className:"text-lg font-medium text-text-primary truncate leading-tight",children:["Trace ",t.isComplete?"Complete":"In Progress"]}),e.jsxs("p",{className:"text-sm text-text-muted mt-0.5",children:["Tag: 0x",t.traceTag.slice(0,8),t.isComplete&&" • ✓"]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(M,{className:"w-4 h-4 text-blue-600 dark:text-blue-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary",children:a})]}),e.jsxs("div",{className:"flex items-center gap-4 text-xs text-text-muted",children:[e.jsxs("span",{children:[n," target ",1===n?"hop":"hops"]}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:[r," SNR ",1===r?"sample":"samples"]}),0!==t.authCode&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"•"}),e.jsxs("span",{children:["Auth: ",t.authCode]})]})]}),t.pathHashes.length>0&&e.jsx("div",{className:"flex flex-wrap items-center gap-2 pt-1",children:t.pathHashes.map((s,a)=>{const n=t.snrValues[a],r=void 0!==n?(e=>e>=7?"green":e>=0?"yellow":e>=-5?"orange":"red")(n):"zinc",i=void 0!==n;return e.jsxs("div",{className:"flex items-center gap-2",children:[a>0&&e.jsx(Ne,{className:"w-4 h-4 text-blue-500 dark:text-blue-400 flex-shrink-0"}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(p,{color:i?"blue":"zinc",className:"font-mono",children:s}),i&&e.jsxs(p,{color:r,className:"font-mono",children:[n>=0?"+":"",Number.isInteger(n)?n:n.toFixed(1),"dB"]})]})]},a)})})]})]})})}function Ct({decoded:t,timestamp:s}){const a=s?P(s):"Unknown";return t.encrypted?e.jsxs("div",{className:"mb-4 flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center shadow-md",style:{background:"linear-gradient(135deg, var(--sys-purple) 0%, var(--sys-indigo) 100%)"},children:e.jsx(ke,{className:"w-5 h-5 text-white"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-semibold text-text-primary font-sans",children:"Encrypted Message"}),e.jsxs("p",{className:"text-xs text-text-muted font-sans mt-0.5",children:[t.srcHash," → ",t.destHash," · ",a]})]})]}):e.jsxs("div",{className:"mb-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1.5 px-1",children:[e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:[e.jsx("span",{className:"font-mono text-text-secondary",children:t.srcHash})," → ",e.jsx("span",{className:"font-mono text-text-secondary",children:t.destHash})]}),e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:["· ",a]})]}),e.jsx("div",{className:"inline-block max-w-[85%] px-3.5 py-2 rounded-2xl rounded-tr-md ml-auto",style:{background:"linear-gradient(135deg, var(--sys-green) 0%, var(--sys-teal) 100%)"},children:e.jsx("p",{className:"text-sm text-white font-sans leading-relaxed whitespace-pre-wrap break-words",children:t.text})})]})}function St({decoded:t,timestamp:s}){const a=s?P(s):"Unknown",n=(t.partNumber+1)/t.totalParts*100;return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-yellow-500/10 dark:bg-yellow-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-yellow) 0%, var(--sys-amber) 100%)"},children:e.jsx(de,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:"Multipart Segment"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:["Part ",t.partNumber+1," of ",t.totalParts]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[e.jsx("div",{children:e.jsx("div",{className:"h-2 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${n}%`,background:"linear-gradient(90deg, var(--sys-yellow), var(--sys-amber))"}})})}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(xe,{className:"w-4 h-4 text-yellow-600 dark:text-yellow-400 flex-shrink-0"}),e.jsxs("span",{className:"text-sm text-text-secondary font-sans",children:["Message ID: ",e.jsx("span",{className:"font-mono",children:t.messageId})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(M,{className:"w-4 h-4 text-yellow-600 dark:text-yellow-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]})]})]})})}function Ht({decoded:t,timestamp:s,payloadType:a}){const n=s?P(s):"Unknown",r=(()=>{switch(a){case S.REQ:return{icon:B,gradient:"var(--sys-orange), var(--sys-red)",bg:"rgba(249, 115, 22, 0.15)",label:"Request"};case S.RESPONSE:return{icon:Ce,gradient:"var(--sys-green), var(--sys-teal)",bg:"rgba(34, 197, 94, 0.15)",label:"Response"};case S.ANON_REQ:return{icon:ke,gradient:"var(--sys-purple), var(--sys-pink)",bg:"rgba(168, 85, 247, 0.15)",label:"Anonymous Request"};default:return{icon:Y,gradient:"var(--sys-gray), var(--sys-slate)",bg:"rgba(107, 114, 128, 0.15)",label:t.payloadTypeName}}})(),i=r.icon;return e.jsxs("div",{className:"mb-4 flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center shadow-md",style:{background:`linear-gradient(135deg, ${r.gradient})`},children:e.jsx(i,{className:"w-5 h-5 text-white"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-semibold text-text-primary font-sans",children:r.label}),e.jsxs("p",{className:"text-xs text-text-muted font-sans mt-0.5",children:[t.length," bytes · ",n]})]})]})}function Pt({pathHex:t}){if(!t)return null;const s=it(t);return e.jsx("div",{className:"flex flex-wrap items-center gap-2 py-2",children:s.map((t,s)=>e.jsxs("div",{className:"flex items-center gap-2",children:[s>0&&e.jsx(Ne,{className:"w-4 h-4 text-sys-amber flex-shrink-0"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(te,{size:"compact",copy:!0,children:t.toUpperCase()}),e.jsx("span",{className:"text-[10px] text-text-muted font-sans tabular-nums w-4 text-left",children:s+1})]})]},s))})}function Mt({decoded:t,payloadType:s}){const a=H[s]||`TYPE_${s}`;switch(t.type){case"advert":{const s="chat"===t.nodeType?"companion":t.nodeType.replace("_"," "),a=void 0!==t.latitude&&void 0!==t.longitude&&!(0===t.latitude&&0===t.longitude);return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Role:"})," ",s]}),t.name&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Name:"})," ",t.name]}),a&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Location:"})," ",t.latitude.toFixed(4),"°, ",t.longitude.toFixed(4),"°"]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Time:"})," ",P(t.timestamp)]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Flags:"})," ",t.flagsDescription]})]})}case"ack":return e.jsx("div",{className:"text-xs text-text-primary space-y-0.5",children:e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"CRC:"})," 0x",t.crc]})});case"path":return e.jsx("div",{className:"text-xs text-text-primary space-y-1",children:e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Path:"})," ",t.pathString||"(empty)"]})});case"trace":return e.jsxs("div",{className:"text-xs text-text-primary space-y-1",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Tag:"})," 0x",t.traceTag]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Target Path:"})," ",t.pathString||"(empty)"]}),t.snrValues.length>0&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"SNR:"})," ",t.snrValues.map(e=>`${e>=0?"+":""}${Number.isInteger(e)?e:e.toFixed(1)}dB`).join(" → ")]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Status:"})," ",t.isComplete?"✓ Complete":`In progress (${t.snrValues.length}/${t.pathHashes.length})`]})]});case"txt_msg":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Dest:"})," ",t.destHash]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Src:"})," ",t.srcHash]}),t.encrypted?e.jsx("p",{className:"text-text-muted italic",children:"Encrypted content"}):e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Text:"})," ",t.text]})]});case"grp_txt":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Channel:"})," ",t.channelName?e.jsx("span",{className:"text-accent-success",children:t.channelName}):t.isPublicHashChannel?e.jsx("span",{className:"text-accent-secondary",children:"Public Hash Channel"}):e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]}),t.decrypted?e.jsxs(e.Fragment,{children:[t.senderName&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"From:"})," ",t.senderName]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Text:"})," ",t.text]})]}):t.isPublicHashChannel?e.jsx("p",{className:"text-text-muted italic",children:"Encrypted (public hash channel)"}):e.jsx("p",{className:"text-text-muted italic",children:"Encrypted (unknown channel)"})]});case"grp_data":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Channel:"})," ",t.channelName?e.jsx("span",{className:"text-sys-teal",children:t.channelName}):e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Data:"})," ",t.dataLength," bytes ",t.decrypted?"(decrypted)":"(encrypted)"]})]});case"multipart":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Part:"})," ",t.partNumber+1,"/",t.totalParts]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Message ID:"})," ",t.messageId]})]});default:return e.jsxs("p",{className:"text-xs text-text-secondary",children:[a," (",t.length," bytes)"]})}}const _t=s.memo(function({packet:t}){var a,n;const r=t.raw_packet||"",i=r.length/2,l=N(),[c,m]=s.useState(null),[h,u]=s.useState(null),[g,f]=s.useState(!1),[j,y]=s.useState(null),b=s.useCallback(e=>{y(t=>t===e?null:e)},[]),H=s.useMemo(()=>function(e){if(!e||e.length<4)return null;const t=oe.fromHex(e);if(!t.success||!t.packet)return null;const s=t.packet,a=function(e){const t=3&e,s=e>>2&15,a=e>>6&3;return[{bits:"0-1",field:"Route Type",value:d(t),binary:(3&t).toString(2).padStart(2,"0")},{bits:"2-5",field:"Payload Type",value:x(s),binary:(15&s).toString(2).padStart(4,"0")},{bits:"6-7",field:"Version",value:a.toString(),binary:(3&a).toString(2).padStart(2,"0")}]}(s.header),n=e.slice(0,2);let r=2,i="";s.hasTransportCodes()&&(i=e.slice(2,10),r=10);const l=e.slice(r,r+2),c=r+2,m=c+2*s.pathLen,h=e.slice(c,m),p=e.slice(m),u=o(s);return{packet:s,headerHex:n,headerFields:a,transportCodesHex:i,pathLengthHex:l,pathDataHex:h,payloadHex:p,payloadStartByte:Math.floor(m/2),decoded:u}}(r),[r]),M=null==(a=null==H?void 0:H.packet)?void 0:a.payloadType,_=(null==H?void 0:H.payloadHex)||"",T=null==(n=null==H?void 0:H.packet)?void 0:n.payload,B=M===S.GRP_TXT,F=M===S.GRP_DATA,L=B&&(!l||g);if(s.useEffect(()=>{if(m(null),f(!1),!B||!T||T.length<4)return;if(!l)return void f(!0);f(!0);let e=!1;return v(T).then(t=>{e||(m(t),f(!1))}),()=>{e=!0}},[_,B,l]),s.useEffect(()=>{if(u(null),!F||!T||T.length<4)return;if(!l)return;let e=!1;return w(T).then(t=>{e||u(t)}),()=>{e=!0}},[_,F,l]),!H||0===r.length)return e.jsx("div",{className:"p-4 text-center text-text-muted",children:e.jsx("p",{className:"text-sm",children:"No raw packet data available"})});const{packet:z}=H;let D=H.decoded;c&&"grp_txt"===H.decoded.type?D=c:h&&"grp_data"===H.decoded.type&&(D=h);const A=s.useMemo(()=>function(t,s){switch(t.type){case"advert":return function(t,s){const a=[];let n=0;const r=s.slice(0,64);a.push({id:"payload:publicKey",title:"Public Key",color:"pink",hex:r,startByte:n,endByte:n+31,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:t.publicKey.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Ed25519 public key (32 bytes)"})]})}),n+=32;const i=s.slice(64,72);a.push({id:"payload:timestamp",title:"Timestamp",color:"orange",hex:i,startByte:n,endByte:n+3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:i.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:[t.timestamp," (",P(t.timestamp),")"]})]})}),n+=4;const l=s.slice(72,200);a.push({id:"payload:signature",title:"Signature",color:"teal",hex:l,startByte:n,endByte:n+63,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:t.signature.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Ed25519 signature (64 bytes)"})]})}),n+=64;const c=s.slice(200,202);if(a.push({id:"payload:flags",title:"Flags",color:"blue",hex:c,startByte:n,endByte:n,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(te,{size:"standard",copy:!0,children:["0x",t.flags.toString(16).padStart(2,"0").toUpperCase()]}),e.jsx("p",{className:"text-xs text-text-primary mt-1",children:t.flagsDescription}),e.jsxs("p",{className:"text-xs text-text-muted",children:["Node Type: ",t.nodeType]})]})}),n+=1,void 0!==t.latitude){const r=s.slice(2*n,2*n+8);a.push({id:"payload:latitude",title:"Latitude",color:"green",hex:r,startByte:n,endByte:n+3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:r.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:[t.latitude.toFixed(6),"°"]})]})}),n+=4}if(void 0!==t.longitude){const r=s.slice(2*n,2*n+8);a.push({id:"payload:longitude",title:"Longitude",color:"purple",hex:r,startByte:n,endByte:n+3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:r.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:[t.longitude.toFixed(6),"°"]})]})}),n+=4}if(t.name){const r=s.slice(2*n),i=r.length/2;a.push({id:"payload:name",title:"Name",color:"amber",hex:r,startByte:n,endByte:n+i-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:r.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:['"',t.name,'"']})]})})}return a}(t,s);case"ack":return function(t,s){return[{id:"payload:crc",title:"CRC",color:"green",hex:s.slice(0,8),startByte:0,endByte:3,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(te,{size:"standard",copy:!0,children:["0x",t.crc]}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"CRC32 of acknowledged packet"})]})}]}(t,s);case"grp_txt":return function(t,s){const a=[];a.push({id:"payload:channelHash",title:"Channel Hash",color:"blue",hex:s.slice(0,2),startByte:0,endByte:0,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(te,{size:"standard",copy:!0,children:["0x",t.channelHash]}),t.channelName&&e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:["Channel: ",t.channelName]})]})}),t.macHex&&a.push({id:"payload:mac",title:"MAC",color:"purple",hex:s.slice(2,6),startByte:1,endByte:2,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:t.macHex.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Truncated HMAC-SHA256"})]})});const n=s.slice(6);return n&&a.push({id:"payload:ciphertext",title:t.decrypted?"Message":"Ciphertext",color:t.decrypted?"green":"zinc",hex:n,startByte:3,endByte:3+n.length/2-1,decoded:t.decrypted?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-primary",children:['"',t.text,'"']}),t.senderName&&e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:["From: ",t.senderName]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:n.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"AES-128-ECB encrypted"})]})}),a}(t,s);case"grp_data":return function(t,s){const a=[];a.push({id:"payload:channelHash",title:"Channel Hash",color:"blue",hex:s.slice(0,2),startByte:0,endByte:0,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(te,{size:"standard",copy:!0,children:["0x",t.channelHash]}),t.channelName&&e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:["Channel: ",t.channelName]})]})}),t.macHex&&a.push({id:"payload:mac",title:"MAC",color:"purple",hex:s.slice(2,6),startByte:1,endByte:2,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:t.macHex.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Truncated HMAC-SHA256"})]})});const n=s.slice(6);return n&&a.push({id:"payload:ciphertext",title:t.decrypted?"Decrypted Data":"Encrypted Data",color:t.decrypted?"green":"zinc",hex:n,startByte:3,endByte:3+n.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:(t.decryptedHex||n).toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[t.dataLength," bytes",t.decrypted?"":" (AES-128-ECB encrypted)"]})]})}),a}(t,s);case"path":return function(t,s){return[{id:"payload:path",title:"Path Hops",color:"amber",hex:s,startByte:0,endByte:s.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1",children:t.path.map((t,s)=>e.jsxs("span",{className:"flex items-center gap-1",children:[s>0&&e.jsx(Ne,{className:"w-3 h-3 text-text-muted"}),e.jsx(p,{color:"amber",className:"font-mono",children:t})]},s))}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[t.path.length," hops"]})]})}]}(t,s);case"trace":return function(t,s){const a=[];a.push({id:"payload:crc",title:"Trace Tag",color:"blue",hex:s.slice(0,8),startByte:0,endByte:3,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(te,{size:"standard",copy:!0,children:["0x",t.traceTag]}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Unique trace request identifier"})]})}),a.push({id:"payload:mac",title:"Auth Code",color:"purple",hex:s.slice(8,16),startByte:4,endByte:7,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:t.authCode}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Authentication/verification code"})]})}),a.push({id:"payload:flags",title:"Flags",color:"amber",hex:s.slice(16,18),startByte:8,endByte:8,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(te,{size:"standard",copy:!0,children:["0x",t.flags.toString(16).toUpperCase().padStart(2,"0")]}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:0===t.flags?"No flags set":`Flags: ${t.flags.toString(2).padStart(8,"0")}b`})]})});const n=s.slice(18);if(n){const s=e=>e>=7?"green":e>=0?"yellow":e>=-5?"orange":"red";a.push({id:"payload:path",title:"Target Path",color:"indigo",hex:n,startByte:9,endByte:9+n.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1",children:t.pathHashes.map((a,n)=>{const r=t.snrValues[n],i=void 0!==r?s(r):"zinc";return e.jsxs("span",{className:"flex items-center gap-1",children:[n>0&&e.jsx(Ne,{className:"w-3 h-3 text-text-muted"}),e.jsx(p,{color:"indigo",className:"font-mono",children:a}),void 0!==r&&e.jsxs(p,{color:i,className:"font-mono",children:[r>=0?"+":"",Number.isInteger(r)?r:r.toFixed(1),"dB"]})]},n)})}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[t.pathHashes.length," target ",1===t.pathHashes.length?"hop":"hops",t.snrValues.length>0&&` • ${t.snrValues.length} SNR ${1===t.snrValues.length?"value":"values"} collected`,t.isComplete&&" • ✓ Complete"]})]})})}return a}(t,s);case"multipart":return function(t,s){const a=[];a.push({id:"payload:msgId",title:"Message ID",color:"blue",hex:s.slice(0,4),startByte:0,endByte:1,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:t.messageId.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Unique message identifier"})]})}),a.push({id:"payload:partNum",title:"Part Number",color:"amber",hex:s.slice(4,6),startByte:2,endByte:2,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:t.partNumber}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"0-indexed part number"})]})}),a.push({id:"payload:totalParts",title:"Total Parts",color:"orange",hex:s.slice(6,8),startByte:3,endByte:3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(te,{size:"standard",copy:!0,children:t.totalParts}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:["Part ",t.partNumber+1," of ",t.totalParts]})]})});const n=s.slice(8);return n&&a.push({id:"payload:partData",title:"Part Data",color:"cyan",hex:n,startByte:4,endByte:4+n.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:n.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[n.length/2," bytes"]})]})}),a}(t,s);default:return[{id:"payload:ciphertext",title:"Raw Data",color:"zinc",hex:s,startByte:0,endByte:s.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:s.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[s.length/2," bytes"]})]})}]}}(D,H.payloadHex),[D,H.payloadHex]),E="payload"===j||lt(j),R=s.useMemo(()=>{const e=[{id:"header",hex:H.headerHex,color:"red"},...H.transportCodesHex?[{id:"transportCodes",hex:H.transportCodesHex,color:"purple"}]:[],{id:"pathLength",hex:H.pathLengthHex,color:"green"},...H.pathDataHex?[{id:"pathData",hex:H.pathDataHex,color:"amber"}]:[]];return E?[...e,...(t=A,t.map(e=>({id:e.id,hex:e.hex,color:e.color})))]:[...e,{id:"payload",hex:H.payloadHex,color:"cyan"}];var t},[H,E,A]);return e.jsxs("div",{className:"font-mono space-y-2 min-w-0 overflow-hidden",children:[(()=>{switch(D.type){case"advert":return e.jsx(yt,{advert:D,timestamp:t.timestamp});case"grp_data":return e.jsx(bt,{decoded:D,timestamp:t.timestamp});case"grp_txt":return e.jsx(Nt,{decoded:D,timestamp:t.timestamp,isLoading:L,onDecrypted:m});case"ack":return e.jsx(vt,{decoded:D,timestamp:t.timestamp});case"path":return e.jsx(wt,{decoded:D,timestamp:t.timestamp});case"trace":return e.jsx(kt,{decoded:D,timestamp:t.timestamp});case"txt_msg":return e.jsx(Ct,{decoded:D,timestamp:t.timestamp});case"multipart":return e.jsx(St,{decoded:D,timestamp:t.timestamp});case"generic":return z.payloadType===S.REQ||z.payloadType===S.RESPONSE||z.payloadType===S.ANON_REQ?e.jsx(Ht,{decoded:D,timestamp:t.timestamp,payloadType:z.payloadType}):null;default:return null}})(),e.jsx("div",{className:"bg-black rounded-2xl p-6",children:e.jsx(gt,{segments:R,selectedSegment:j,onSegmentClick:b})}),e.jsx(k,{children:e.jsx(C.div,{layout:!0,transition:ht,className:"space-y-2 min-w-0",children:(()=>{var t,s,a,n;const r=[{id:"header",title:"Header",color:"red",startByte:0,endByte:0,hexBytes:`0x${H.headerHex.toUpperCase()}`,condition:!0,content:e.jsxs("table",{className:"w-full text-left",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-[10px] uppercase tracking-wide text-text-muted border-b border-border-subtle font-sans",children:[e.jsx("th",{className:"py-1 font-medium",children:"Bits"}),e.jsx("th",{className:"py-1 font-medium",children:"Field"}),e.jsx("th",{className:"py-1 font-medium",children:"Value"}),e.jsx("th",{className:"py-1 font-medium",children:"Binary"})]})}),e.jsx("tbody",{children:H.headerFields.map(t=>e.jsx(ft,{...t},t.bits))})]})},{id:"transportCodes",title:"Transport Codes",color:"purple",startByte:1,endByte:4,hexBytes:(null==(t=H.transportCodesHex)?void 0:t.toUpperCase())||"",condition:!!H.transportCodesHex,content:e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-xs text-text-muted",children:"Two 16-bit transport codes for encrypted routing"}),e.jsxs("div",{className:"mt-1 text-xs text-text-secondary",children:["Code 1: 0x",null==(s=H.transportCodesHex)?void 0:s.slice(0,4).toUpperCase()," | Code 2: 0x",null==(a=H.transportCodesHex)?void 0:a.slice(4,8).toUpperCase()]})]})},{id:"pathLength",title:"Path Length",color:"green",startByte:H.transportCodesHex?5:1,endByte:H.transportCodesHex?5:1,hexBytes:`0x${H.pathLengthHex.toUpperCase()}`,condition:!0,content:e.jsxs("p",{className:"text-xs text-text-muted pt-1",children:[z.pathLen," bytes showing route taken (increases as packet floods)"]})},{id:"pathData",title:"Path Data",color:"amber",startByte:H.transportCodesHex?6:2,endByte:(H.transportCodesHex?5:1)+z.pathLen,hexBytes:(null==(n=H.pathDataHex)?void 0:n.toUpperCase())||"",condition:z.pathLen>0,content:e.jsxs("div",{className:"space-y-3",children:[e.jsx(Pt,{pathHex:H.pathDataHex}),e.jsx("p",{className:"text-xs text-text-muted",children:"Historical route taken (bytes are added as packet floods through network)"})]})},{id:"payload",title:"Payload",color:"cyan",startByte:H.payloadStartByte,endByte:i-1,hexBytes:H.payloadHex.toUpperCase(),condition:!0,content:e.jsxs(e.Fragment,{children:[!lt(j)&&e.jsxs("div",{className:"p-3 rounded-lg bg-black",children:[e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mb-1.5 font-sans",children:"Decoded"}),e.jsx(Mt,{decoded:D,payloadType:z.payloadType})]}),!lt(j)&&A.length>0&&e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mt-3 font-sans",children:"Click a field below to highlight its bytes"}),lt(j)&&e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted font-sans",children:"↑ Selected field above • Other fields below ↓"})]})}].filter(e=>e.condition),l=lt(j)?A.find(e=>e.id===j):null,c=lt(j)?[...r].sort((e,t)=>"payload"===e.id?-1:"payload"===t.id?1:0):[...r].sort((e,t)=>e.id===j?-1:t.id===j?1:0),o=lt(j)?A.filter(e=>e.id!==j):[];return e.jsxs(e.Fragment,{children:[l&&e.jsx(jt,{id:`subfield-${l.id}`,title:l.title,color:l.color,startByte:H.payloadStartByte+l.startByte,endByte:H.payloadStartByte+l.endByte,hexBytes:l.hex.toUpperCase(),isSelected:!0,children:l.decoded},l.id),c.map(t=>e.jsx(jt,{id:`section-${t.id}`,title:t.title,color:t.color,startByte:t.startByte,endByte:t.endByte,hexBytes:t.hexBytes,isSelected:t.id===j,children:t.content},t.id)),o.map(t=>e.jsxs(C.div,{layout:"position",layoutId:`subfield-${t.id}`,transition:ht,className:"w-full min-w-0 overflow-hidden rounded-xl p-4 sm:p-5 space-y-4",style:{backgroundColor:dt,boxShadow:xt},children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 min-w-0",children:[e.jsx(p,{color:t.color,children:t.title}),t.hex.length<=32&&it(t.hex).map((s,a)=>e.jsx(p,{color:t.color,className:"font-mono",children:s.toUpperCase()},a))]}),e.jsxs("span",{className:"text-[10px] text-text-muted font-mono flex-shrink-0",children:["Bytes ",H.payloadStartByte+t.startByte,"-",H.payloadStartByte+t.endByte]})]}),e.jsx("div",{className:"min-w-0 overflow-hidden p-3 rounded-lg bg-black",children:t.decoded})]},t.id))]})})()})})]})});function Tt(e){if(!e)return[];if(Array.isArray(e))return e;try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Bt(e){return e?(e.startsWith("0x")?e.slice(2):e).slice(0,2).toUpperCase():""}function Ft({hop:a,compact:n=!1,index:r=0,highlightIndex:i=-1,isTrace:l=!1}){var c;const o=r===i,d=Be();return s.useEffect(()=>{o&&l&&d.start({boxShadow:["0 0 0 0px rgba(113, 156, 223, 0)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 0px rgba(113, 156, 223, 0)"],transition:{duration:.5,times:[0,.2,.7,1],ease:"easeInOut"}})},[o,l,d]),e.jsxs(C.div,{className:t("flex items-center gap-1.5",n?"flex-row":"flex-col"),animate:{scale:o?1.05:1,opacity:o?1:.85},transition:{duration:.3,ease:"easeInOut"},children:[e.jsxs(C.div,{className:t("flex items-center gap-1.5 px-2.5 py-1 rounded-md","font-mono text-xs font-semibold",a.isLocal?"bg-amber-500/20 text-amber-300 ring-1 ring-amber-500/30":"bg-zinc-700/50 text-zinc-200 ring-1 ring-zinc-600/50"),animate:d,initial:{boxShadow:"0 0 0 0px rgba(113, 156, 223, 0)"},children:[a.isLocal&&e.jsx(fe,{className:"w-3 h-3"}),e.jsx("span",{children:a.prefix}),void 0!==a.confidence&&a.confidence<.9&&e.jsxs("span",{className:"text-[9px] opacity-70",children:[(100*a.confidence).toFixed(0),"%"]})]}),!n&&(null==(c=a.neighborInfo)?void 0:c.name)&&e.jsx("span",{className:"text-[10px] text-text-muted truncate max-w-[80px]",children:a.neighborInfo.name})]})}function Lt({snr:t}){const s=ye(t),a=je()[s]||"#6b7280",n=Number.isInteger(t)?t.toString():t.toFixed(1);return e.jsxs(p,{customColor:a,compact:!0,className:"font-mono",children:[t>=0?"+":"",n,"dB"]})}function zt({hops:a,compact:n,isTrace:r=!1}){const[i,l]=s.useState(-1);return s.useEffect(()=>{if(0===a.length)return;const e=setTimeout(()=>{l(0)},400),t=setInterval(()=>{l(e=>{const s=e+1;return s>=a.length?(clearInterval(t),-1):s})},r?500:600);return()=>{clearTimeout(e),clearInterval(t)}},[a.length,r]),e.jsx("div",{className:"p-6",style:{display:"grid",gridTemplateColumns:"1fr auto 1fr",gap:"4px 8px"},children:a.map((s,l)=>{const c=l%2==0,o=l===a.length-1;return e.jsxs("div",{className:"contents",children:[e.jsx("div",{className:t("flex items-center","justify-end"),children:c&&e.jsx(Ft,{hop:s,compact:n,index:l,highlightIndex:i,isTrace:r})}),e.jsx("div",{className:"flex flex-col items-center justify-center min-h-[28px]",children:!o&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-px flex-1 bg-zinc-600/40 min-h-[8px]"}),void 0!==s.snr&&e.jsx(Lt,{snr:s.snr}),e.jsx("svg",{className:"w-3 h-3 text-zinc-500 flex-shrink-0",viewBox:"0 0 12 12",fill:"none",children:e.jsx("path",{d:"M6 2v8M3 7l3 3 3-3",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]})}),e.jsx("div",{className:t("flex items-center","justify-start"),children:!c&&e.jsx(Ft,{hop:s,compact:n,index:l,highlightIndex:i,isTrace:r})})]},`${s.prefix}-${l}`)})})}const Dt=s.memo(function({packet:a,neighbors:n,localHash:r,neighborAffinity:i,ghostPrefixes:l,direction:c="horizontal",compact:o=!1,traceSnr:d,overridePath:x}){const m=void 0!==d&&d.length>0,h=Tt(a.original_path),p=Tt(a.forwarded_path),u=x??(p.length>0?p:h),g=Bt(r),f=s.useMemo(()=>u.map((e,t)=>{const s=e.toUpperCase(),a=s===g,r=(null==l?void 0:l.has(s))??!1,c=function(e,t,s){const a=e.toUpperCase();if(s){let e=null,n=0;if(s.forEach((t,s)=>{if(Bt(s)===a){const a=t.combinedScore??0;a>n&&(n=a,e=s)}}),e&&t[e])return{hash:e,info:t[e],confidence:n}}for(const[n,r]of Object.entries(t))if(Bt(n)===a)return{hash:n,info:r,confidence:void 0};return null}(s,n,i);return{prefix:s,fullHash:null==c?void 0:c.hash,neighborInfo:null==c?void 0:c.info,isLocal:a,isGhost:r,confidence:null==c?void 0:c.confidence,snr:null==d?void 0:d[t]}}),[u,n,i,g,l,d]);if(0===f.length)return e.jsxs("div",{className:"flex items-center gap-2 text-text-muted text-xs",children:[e.jsx(T,{className:"w-4 h-4 opacity-50"}),e.jsx("span",{children:"Direct / No path data"})]});if("flowchart"===c)return e.jsx(zt,{hops:f,compact:o,isTrace:m});const j="horizontal"===c?Ne:X;return e.jsx("div",{className:t("flex gap-1.5","horizontal"===c?"flex-row flex-wrap items-center":"flex-col items-start"),children:f.map((s,a)=>e.jsxs("div",{className:t("flex items-center gap-1.5","vertical"===c&&"flex-col"),children:[e.jsx(Ft,{hop:s,compact:o}),a0,l=ai&&n(a-1),disabled:!i,className:t("p-0.5 radius-badge transition-base",i?"text-text-muted hover:text-text-primary hover-bg":"text-white/20 cursor-not-allowed"),"aria-label":"Previous observation",children:e.jsx(ve,{className:r?"size-3":"size-4"})}),e.jsx("div",{className:"flex items-center gap-0.5",children:s.map((s,i)=>{const l=i===a,c=new Date(1e3*s.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});return e.jsx($,{color:l?"cyan":"zinc",filled:l,compact:r,onClick:()=>n(i),title:`Observation ${i+1} at ${c}`,className:t("transition-all duration-150",!l&&"opacity-60 hover:opacity-100"),children:r?e.jsx("span",{className:"tabular-nums",children:i+1}):e.jsxs("span",{className:"tabular-nums text-[10px]",children:["#",i+1,null!=s.rssi&&e.jsx("span",{className:"ml-1 opacity-70",children:s.rssi})]})},`${s.timestamp}_${i}`)})}),e.jsx("button",{onClick:()=>l&&n(a+1),disabled:!l,className:t("p-0.5 radius-badge transition-base",l?"text-text-muted hover:text-text-primary hover-bg":"text-white/20 cursor-not-allowed"),"aria-label":"Next observation",children:e.jsx(se,{className:r?"size-3":"size-4"})}),e.jsxs("span",{className:t("text-text-muted ml-1",r?"text-[9px]":"text-[10px]"),children:[e.jsx(ee,{className:"inline size-3 mr-0.5 opacity-50"}),s.length]})]})}function Rt({icon:s,label:a,disabled:n=!1}){return e.jsx(C.div,{className:"flex items-center gap-1 text-[10px]",title:a,animate:{opacity:n?.25:.6},transition:{duration:.15,ease:[.4,0,.2,1]},children:e.jsx("span",{className:t("flex items-center justify-center size-5 radius-badge border-control transition-base",n?"bg-white/[0.02] border-white/5":"bg-white/5"),children:s})})}function Ut({hasDuplicates:t,hasPrev:s,hasNext:a,canPrevDupe:n,canNextDupe:r}){return e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx(Rt,{icon:e.jsx(pe,{className:"size-3"}),label:"Previous packet (↑)",disabled:!s}),e.jsx(Rt,{icon:e.jsx(I,{className:"size-3"}),label:"Next packet (↓)",disabled:!a})]}),t&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-px h-3 bg-white/10"}),e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx(Rt,{icon:e.jsx(ve,{className:"size-3"}),label:"Previous observation (←)",disabled:!n}),e.jsx(Rt,{icon:e.jsx(se,{className:"size-3"}),label:"Next observation (→)",disabled:!r})]})]})]})}const $t=s.memo(function({packets:t,initialIndex:a=0,onClose:n,onNavigatePrev:r,onNavigateNext:i,hasPrev:l=!1,hasNext:c=!1}){const[o,d]=s.useState(a),x=t[o]??t[0],u=t.length>1,g=o>0,y=o{d(Math.max(0,Math.min(e,t.length-1)))},[t.length]);s.useEffect(()=>{const e=e=>{if(!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement))switch(e.key){case"ArrowUp":e.preventDefault(),null==r||r();break;case"ArrowDown":e.preventDefault(),null==i||i();break;case"ArrowLeft":e.preventDefault(),g&&d(e=>e-1);break;case"ArrowRight":e.preventDefault(),y&&d(e=>e+1)}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[r,i,g,y]);const N=F(),w=L(),k=z(),H=D(),P=s.useMemo(()=>new Set(H.map(e=>e.prefix.toUpperCase())),[H]),_=x.payload_type_name||f(x.payload_type??x.type),B=x.route_type_name||j(x.route_type??x.route),$=x.payload_length??x.length??0,I=At(x.original_path),V=At(x.forwarded_path),O=I.length>0||V.length>0,Q=V.length>0?V:I,W=s.useMemo(()=>{var e;if(null==(e=null==N?void 0:N.config)?void 0:e.repeater)return{latitude:N.config.repeater.latitude,longitude:N.config.repeater.longitude,name:N.config.node_name||"Local Node"}},[N]),G=(null==N?void 0:N.neighbors)??{},Y=k.size>0?k:void 0,Z=x.raw_packet&&x.raw_packet.length>0,X=s.useMemo(()=>{if((x.payload_type??x.type)!==S.TRACE||!x.payload)return null;try{const e=m(x.payload),t=x.original_path||x.forwarded_path||[];let s=[];if("string"==typeof t)try{const e=JSON.parse(t);Array.isArray(e)&&(s=e.map(e=>parseInt(e,16)))}catch{s=[]}else Array.isArray(t)&&(s=t.map(e=>parseInt(e,16)));return h(e,s)}catch{return null}},[x]),ee=null==X?void 0:X.snrValues,te=s.useMemo(()=>{if((x.payload_type??x.type)!==S.ADVERT||!x.payload)return null;try{const e=m(x.payload),t=A(e);if(!t)return null;const s=t.publicKey.slice(0,2).toUpperCase();return{...t,prefix:s}}catch{return null}},[x]),se=s.useMemo(()=>{if((null==te?void 0:te.latitude)&&(null==te?void 0:te.longitude))return{latitude:te.latitude,longitude:te.longitude,name:te.name||`Node ${te.prefix||"??"}`,prefix:te.prefix,publicKey:te.publicKey}},[te]),ae=e=>e&&0!==e?new Date(1e3*e).toLocaleString():"Unknown",[ne,ie]=s.useState(null);s.useEffect(()=>{if((x.payload_type??x.type)!==S.GRP_TXT||!x.payload)return void ie(null);let e=!1;const t=m(x.payload);return v(t).then(t=>{!e&&t&&ie(t)}),()=>{e=!0}},[x]);const le=s.useCallback(e=>{if(!e)return null;const t=e.trim().match(/(-?\d+\.?\d*)\s*[,\s]\s*(-?\d+\.?\d*)/);if(!t)return null;const s=parseFloat(t[1]),a=parseFloat(t[2]);return isNaN(s)||isNaN(a)||s<-90||s>90||a<-180||a>180||0===s&&0===a?null:{lat:s,lon:a}},[]),ce=s.useMemo(()=>{var e,t;if(!(null==ne?void 0:ne.decrypted))return;if(!(null==(e=ne.channelName)?void 0:e.toLowerCase().includes("wardrive")))return;const s=le(ne.text);return s?{latitude:s.lat,longitude:s.lon,name:ne.senderName||"Wardrive Ping",prefix:(null==(t=ne.senderName)?void 0:t.slice(0,2).toUpperCase())||"WD",nodeType:"wardrive"}:void 0},[ne,le]),oe=(x.payload_type??x.type)===S.ADVERT&&(void 0!==se||O),de=void 0!==ce,xe=se??ce;if(0===Q.length)return null;const me=(null==N?void 0:N.local_hash)?(N.local_hash.startsWith("0x")?N.local_hash.slice(2,4):N.local_hash.slice(0,2)).toUpperCase():"";for(const e of Q){const t=e.toUpperCase();if(t!==me)if(Y){let e=0,s=0;if(Y.forEach((a,n)=>{(n.startsWith("0x")?n.slice(2,4):n.slice(0,2)).toUpperCase()===t&&(e++,s=Math.max(s,a.combinedScore??0))}),0===e)for(const a of Object.keys(G))if((a.startsWith("0x")?a.slice(2,4):a.slice(0,2)).toUpperCase()===t)break}else for(const e of Object.keys(G))if((e.startsWith("0x")?e.slice(2,4):e.slice(0,2)).toUpperCase()===t)break}const he={lime:"rgb(132, 204, 22)",cyan:"rgb(34, 211, 238)",amber:"rgb(251, 191, 36)",violet:"rgb(167, 139, 250)",rose:"rgb(251, 113, 133)",emerald:"rgb(52, 211, 153)",sky:"rgb(56, 189, 248)",orange:"rgb(251, 146, 60)",pink:"rgb(244, 114, 182)",zinc:"rgb(161, 161, 170)",purple:"rgb(168, 85, 247)",indigo:"rgb(129, 140, 248)",teal:"rgb(45, 212, 191)",fuchsia:"rgb(232, 121, 249)",blue:"rgb(59, 130, 246)",green:"rgb(34, 197, 94)",yellow:"rgb(250, 204, 21)",red:"rgb(239, 68, 68)"},pe=he[K[_]??"zinc"]||he.zinc;return e.jsxs(E,{open:!0,onClose:n,size:"5xl",motionPlus:!0,className:"sm:h-[85vh] sm:max-h-[800px] md:h-[80vh] md:max-h-[900px]",children:[e.jsxs("div",{className:"sm:hidden",children:[e.jsx("div",{className:"flex justify-center pt-2 pb-1",children:e.jsx("div",{className:"w-9 h-1 rounded-full bg-white/30","aria-hidden":"true"})}),e.jsxs("div",{className:"flex items-center justify-between px-3 pb-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(p,{color:K[_]??"zinc",className:"!text-[9px] !px-1.5 !py-0",children:_}),e.jsx(p,{color:"DIRECT"===B||"T_DIRECT"===B?"cyan":"amber",className:"!text-[9px] !px-1.5 !py-0",children:B}),e.jsxs(p,{color:"zinc",className:"!text-[9px] !px-1.5 !py-0",children:[$,"B"]})]}),e.jsx("button",{onClick:n,className:"px-3 py-1.5 text-[15px] font-medium text-blue-400 active:text-blue-300 transition-base flex-shrink-0 radius-inner active:bg-white/5",children:"Done"})]}),u&&e.jsx("div",{className:"px-3 pb-2",children:e.jsx(Et,{packets:t,selectedIndex:o,onSelect:b,compact:!0})})]}),e.jsx("div",{className:"hidden sm:block px-6 pt-5 pb-4",children:e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{color:K[_]??"zinc",children:_}),e.jsx(p,{color:"DIRECT"===B||"T_DIRECT"===B?"cyan":"amber",children:B}),e.jsxs(p,{color:"zinc",children:[$,"B"]}),u&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-px h-4 bg-white/10"}),e.jsx(Et,{packets:t,selectedIndex:o,onSelect:b})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(Ut,{hasDuplicates:u,hasPrev:l,hasNext:c,canPrevDupe:g,canNextDupe:y}),e.jsx("button",{onClick:n,className:"p-1.5 -m-1.5 text-text-muted hover:text-text-primary transition-base radius-inner hover:bg-bg-elevated flex-shrink-0",children:e.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]})]})}),e.jsx("div",{className:"sm:hidden h-[2px]",style:{backgroundColor:pe,opacity:.6}}),e.jsxs(R,{className:"p-0 overflow-hidden flex-1 flex flex-col min-h-0",children:[e.jsx("div",{className:"md:hidden flex-1 overflow-y-auto overflow-x-hidden",children:e.jsxs("div",{className:"p-2 space-y-2",children:[(null!=x.rssi||null!=x.snr)&&e.jsxs("div",{className:"relative flex items-center justify-between px-2 py-1.5 radius-inner bg-white/[0.03]",children:[e.jsx(U,{mode:"popLayout",initial:!1,children:e.jsxs(C.div,{className:"flex items-center gap-3",initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{duration:.15,ease:[.4,0,.2,1]},children:[e.jsx(q,{rssi:x.rssi,snr:x.snr,compact:!0,showValues:!0}),e.jsx("span",{className:"text-[11px] text-white/50",children:J(x.rssi)})]},o)}),Q.length>0&&e.jsxs("span",{className:"text-[10px] font-mono text-white/40",children:[Q.length," hop",1!==Q.length?"s":""]})]}),(O&&Q.length>0||oe||de)&&e.jsx("div",{className:"overflow-hidden radius-inset",children:e.jsx("div",{className:"aspect-[4/3] w-full",children:e.jsx(rt,{path:Q,neighbors:G,localNode:W,localHash:null==N?void 0:N.local_hash,srcHash:x.src_hash,dstHash:x.dst_hash,neighborAffinity:Y,hubNodes:[...w],traceSnr:ee,advertiserSource:xe})})}),X&&X.pathHashes.length>0&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsx("div",{className:"px-3 py-2 space-y-1.5",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[10px] font-medium text-text-muted uppercase tracking-wide",children:"Trace Route"}),e.jsx("div",{className:"flex items-center gap-1.5",children:e.jsx(p,{color:X.isComplete?"green":"amber",compact:!0,children:X.isComplete?"Complete":"In Progress"})})]})}),e.jsx(Dt,{packet:x,neighbors:G,localHash:null==N?void 0:N.local_hash,neighborAffinity:Y,ghostPrefixes:P,direction:"flowchart",compact:!0,overridePath:X.pathHashes,traceSnr:X.snrValues})]}),O&&!X&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2",children:[e.jsx("span",{className:"text-[10px] font-medium text-text-muted uppercase tracking-wide",children:"Path"}),e.jsxs(p,{color:"zinc",compact:!0,children:[Q.length," hop",1!==Q.length?"s":""]})]}),e.jsx(Dt,{packet:x,neighbors:G,localHash:null==N?void 0:N.local_hash,neighborAffinity:Y,ghostPrefixes:P,direction:"flowchart",compact:!0,traceSnr:ee})]}),te&&e.jsxs("div",{className:"radius-inset bg-white/[0.03] overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-white/5",children:[e.jsx("span",{className:"text-[10px] font-medium text-text-muted uppercase tracking-wide",children:"Advertiser Info"}),e.jsx(p,{color:"lime",compact:!0,children:te.nodeType})]}),e.jsxs("div",{className:"p-3 space-y-2",children:[te.name&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Me,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary truncate",children:te.name})]}),te.latitude&&te.longitude&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(re,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[te.latitude.toFixed(5),", ",te.longitude.toFixed(5)]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Se,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-[10px] font-mono text-text-muted truncate",children:[te.publicKey.slice(0,16),"...",te.publicKey.slice(-8)]})]}),te.timestamp>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-xs text-text-muted",children:ae(te.timestamp)})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(T,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-[10px] text-text-muted",children:te.flagsDescription||`Flags: 0x${te.flags.toString(16).padStart(2,"0")}`})]})]})]}),Z&&e.jsx("div",{className:"pt-1",children:e.jsx(_t,{packet:x})})]})}),e.jsxs("div",{className:"hidden md:grid md:grid-cols-2 flex-1 overflow-hidden",children:[e.jsx("div",{className:"overflow-y-auto overflow-x-hidden scrollbar-none p-4 border-r border-border-subtle",children:Z&&e.jsx(_t,{packet:x})}),e.jsxs("div",{className:"grid overflow-hidden",style:{gridTemplateRows:"minmax(280px, 1fr) auto"},children:[e.jsx("div",{className:"overflow-hidden p-2",children:O&&Q.length>0||oe||de?e.jsx("div",{className:"h-full w-full",children:e.jsx(rt,{path:Q,neighbors:G,localNode:W,localHash:null==N?void 0:N.local_hash,srcHash:x.src_hash,dstHash:x.dst_hash,neighborAffinity:Y,hubNodes:[...w],traceSnr:ee,advertiserSource:xe})}):e.jsxs("div",{className:"h-full w-full flex flex-col items-center justify-center text-center px-4",children:[e.jsx(T,{className:"w-8 h-8 text-text-muted/50 mb-2"}),e.jsx("span",{className:"text-sm text-text-muted",children:"Direct Reception"}),e.jsx("span",{className:"text-xs text-text-muted/70 mt-1",children:"Zero-hop packet — received directly from sender"})]})}),e.jsxs("div",{className:"overflow-y-auto max-h-[200px] p-2 space-y-2",children:[!X&&Q.length<=1&&(null!=x.rssi||null!=x.snr)&&e.jsx("div",{className:"surface-base radius-inset p-4",children:e.jsxs("dl",{className:"text-xs grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-text-muted mb-1",children:"Signal"}),e.jsx(U,{mode:"popLayout",initial:!1,children:e.jsxs(C.dd,{className:"flex items-center gap-2",initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{duration:.15,ease:[.4,0,.2,1]},children:[e.jsx(q,{rssi:x.rssi,snr:x.snr}),e.jsx("span",{className:"font-medium text-text-primary",children:J(x.rssi)})]},o)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-text-muted mb-1",children:"RF"}),e.jsx(U,{mode:"popLayout",initial:!1,children:e.jsxs(C.dd,{className:"font-mono text-text-secondary tabular-nums",initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{duration:.15,ease:[.4,0,.2,1]},children:[null!=x.rssi&&`${x.rssi} dBm`,null!=x.snr&&` · ${x.snr.toFixed(1)} dB`]},o)})]})]})}),te&&e.jsxs("div",{className:"radius-inset bg-white/[0.03] overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-b border-white/5",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Advertiser"}),e.jsx(p,{color:"lime",compact:!0,children:te.nodeType})]}),e.jsxs("div",{className:"p-4 space-y-2.5",children:[te.name&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Me,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary truncate",children:te.name})]}),te.latitude&&te.longitude&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(re,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[te.latitude.toFixed(5),", ",te.longitude.toFixed(5)]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Se,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-[11px] font-mono text-text-muted truncate",children:[te.publicKey.slice(0,16),"...",te.publicKey.slice(-8)]})]}),te.timestamp>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-xs text-text-muted",children:ae(te.timestamp)})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(T,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-[11px] text-text-muted",children:te.flagsDescription||`Flags: 0x${te.flags.toString(16).padStart(2,"0")}`})]})]})]}),X&&X.pathHashes.length>0&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"px-4 py-2 flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Trace Route"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(p,{color:X.isComplete?"green":"amber",compact:!0,children:X.isComplete?"Complete":"In Progress"}),e.jsxs(p,{color:"teal",compact:!0,children:[X.pathHashes.length,"h"]})]})]}),e.jsx(Dt,{packet:x,neighbors:G,localHash:null==N?void 0:N.local_hash,neighborAffinity:Y,ghostPrefixes:P,direction:"flowchart",compact:!0,overridePath:X.pathHashes,traceSnr:X.snrValues})]}),O&&!X&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-2",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Path"}),e.jsxs(p,{color:"zinc",compact:!0,children:[Q.length,"h"]})]}),e.jsx(Dt,{packet:x,neighbors:G,localHash:null==N?void 0:N.local_hash,neighborAffinity:Y,ghostPrefixes:P,direction:"flowchart",compact:!0,traceSnr:ee})]})]})]})]})]})]})}),It={type:"spring",visualDuration:.6,bounce:.25,opacity:{duration:.2,ease:"linear"}};function Vt({value:t,format:a,prefix:n,className:r}){const[i,l]=s.useState("waiting");if(s.useEffect(()=>{const e=setTimeout(()=>{l("mounted")},400);return()=>clearTimeout(e)},[]),s.useEffect(()=>{if("mounted"===i){const e=requestAnimationFrame(()=>{l("animating")});return()=>cancelAnimationFrame(e)}},[i]),"waiting"===i){const t=(0).toLocaleString(void 0,a);return e.jsxs("span",{className:r,children:[n,t]})}return e.jsx(be,{className:r,format:a,prefix:n,transition:It,children:"animating"===i?t:0})}function Ot({label:t,numericValue:s,unit:a,icon:n,subtext:r,showSign:i=!1}){return e.jsxs("div",{className:"radius-inner p-3 sm:radius-inset sm:p-4 bg-white/[0.03] ring-1 ring-inset ring-white/[0.06]",children:[e.jsx("div",{className:"mb-1.5 sm:mb-2",children:e.jsx("span",{className:"text-[10px] sm:text-[11px] font-medium uppercase tracking-wide text-text-muted",children:t})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Vt,{value:s,format:{minimumFractionDigits:1,maximumFractionDigits:1,signDisplay:i?"always":"auto"},className:"font-mono text-xl sm:text-2xl font-semibold tabular-nums tracking-tight text-white"}),e.jsxs("div",{className:"flex flex-col items-center justify-center",children:[e.jsx(n,{className:"w-[14px] h-[14px] text-text-muted"}),a&&e.jsx("span",{className:"text-[10px] sm:text-xs font-medium leading-tight text-text-muted",children:a})]})]}),r&&e.jsx("p",{className:"mt-1.5 sm:mt-2 font-mono text-[10px] sm:text-[11px] text-text-muted/80 truncate",children:r})]})}function Qt({snr:s}){const a=s>=5?"bg-sys-teal":s>=0?"bg-sys-green":s>=-5?"bg-sys-amber":s>=-10?"bg-sys-orange":"bg-sys-red";return e.jsx("span",{className:t("w-1.5 h-1.5 rounded-full flex-shrink-0",a),title:`SNR: ${s.toFixed(1)} dB`})}function Wt({fromPrefix:s,toPrefix:a,fromName:n,toName:r,snr:i,maxSnr:l,isWeakest:c,isStrongest:o,index:d=0}){const x=Math.max(l+5,15),m=Math.max(0,Math.min(100,(i- -20)/(x- -20)*100)),h="bg-[#0074BE]",u=i>=5?"bg-sys-teal":i>=0?"bg-sys-green":i>=-5?"bg-sys-amber":i>=-10?"bg-sys-orange":"bg-sys-red",g=.3+.15*d;return e.jsxs("div",{className:"relative p-3 pl-5 radius-inner bg-white/[0.03] ring-1 ring-inset ring-white/[0.06]",children:[e.jsx("span",{className:t("absolute left-0 top-1/2 -translate-y-1/2 h-4 w-0.5 rounded-full",u)}),e.jsx("span",{className:"absolute -top-0.5 -right-0.5",children:e.jsx(Qt,{snr:i})}),e.jsxs("div",{className:"sm:hidden",children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0 flex-1",children:[e.jsx("span",{className:"text-[13px] font-medium text-white/70 truncate",children:n||s}),e.jsx(Ne,{className:"w-3 h-3 text-white/30 flex-shrink-0"}),e.jsx("span",{className:"text-[13px] font-semibold text-white truncate",children:r||a})]}),e.jsxs("div",{className:"flex items-center gap-1.5 ml-2 flex-shrink-0",children:[c&&e.jsx(p,{color:"red",compact:!0,children:"Low"}),o&&!c&&e.jsxs(p,{color:"amber",compact:!0,children:[e.jsx(Pe,{className:"w-2.5 h-2.5"}),"Best"]}),e.jsxs("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[12px] font-mono font-bold tabular-nums bg-white/[0.06] text-text-primary ring-1 ring-inset ring-white/[0.1]",children:[i>=0?"+":"−",Math.abs(i).toFixed(1)]})]})]}),e.jsx("div",{className:"h-1.5 bg-white/10 rounded-full overflow-hidden",children:e.jsx(C.div,{className:t("h-full rounded-full",h),initial:{width:0},animate:{width:`${m}%`},transition:{duration:1.5,delay:g,ease:[.25,.1,.25,1]}})})]}),e.jsxs("div",{className:"hidden sm:block",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("code",{className:"font-mono text-xs text-text-muted",children:s}),n&&e.jsx("span",{className:"text-xs text-text-secondary truncate max-w-[100px]",children:n})]}),e.jsx(Ne,{className:"w-3 h-3 text-text-muted/40 flex-shrink-0"}),e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("code",{className:"font-mono text-xs font-semibold text-text-primary",children:a}),r&&e.jsx("span",{className:"text-xs text-text-secondary truncate max-w-[100px]",children:r})]})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[c&&e.jsx(p,{color:"red",compact:!0,children:"Bottleneck"}),o&&!c&&e.jsxs(p,{color:"amber",compact:!0,children:[e.jsx(Pe,{className:"w-3 h-3"}),"Strongest"]}),e.jsxs("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-sm font-mono font-semibold tabular-nums bg-white/[0.06] text-text-primary ring-1 ring-inset ring-white/[0.1]",children:[i>=0?"+":"−",Math.abs(i).toFixed(1)]})]})]}),e.jsx("div",{className:"h-1.5 bg-bg-elevated rounded-full overflow-hidden",children:e.jsx(C.div,{className:t("h-full rounded-full",h),initial:{width:0},animate:{width:`${m}%`},transition:{duration:1.5,delay:g,ease:[.25,.1,.25,1]}})})]})]})}function qt(e,t){if("You"===e)return"You";const s=e.toUpperCase();for(const[a,n]of Object.entries(t))if((a.startsWith("0x")?a.slice(2,4):a.slice(0,2)).toUpperCase()===s)return n.name||n.node_name||void 0}const Gt=s.memo(function({report:t,onClose:s}){var a,n;const r=F(),i=(null==r?void 0:r.neighbors)??{},l=(null==(a=null==r?void 0:r.config)?void 0:a.repeater)?{latitude:r.config.repeater.latitude,longitude:r.config.repeater.longitude,name:r.config.node_name||"Local Node"}:void 0,c=null==(n=t.bestObservation)?void 0:n.decoded.snrValues,o=t.linkQuality?t.linkQuality.avgSnr>=5?"excellent":t.linkQuality.avgSnr>=0?"good":t.linkQuality.avgSnr>=-5?"fair":"poor":"unknown",d={excellent:"var(--signal-excellent)",good:"var(--signal-good)",fair:"var(--signal-fair)",poor:"var(--signal-poor)",unknown:"var(--text-muted)"}[o];return e.jsxs(E,{open:!0,onClose:s,size:"5xl",motionPlus:!0,children:[e.jsxs("div",{className:"sm:hidden",children:[e.jsx("div",{className:"flex justify-center pt-2 pb-1",children:e.jsx("div",{className:"w-9 h-1 rounded-full bg-white/30","aria-hidden":"true"})}),e.jsxs("div",{className:"flex items-center justify-between px-4 pb-2",children:[e.jsx("h2",{className:"font-semibold text-[17px] text-white",children:"Trace Report"}),e.jsx("button",{onClick:s,className:"text-[17px] font-medium text-blue-400 active:text-blue-300",children:"Done"})]})]}),e.jsx("div",{className:"sm:hidden h-[2px]",style:{backgroundColor:d,opacity:.6}}),e.jsx("div",{className:"hidden sm:block px-6 pt-5 pb-4",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 sm:gap-3",children:[e.jsx("h2",{className:"text-base sm:text-lg font-semibold text-text-primary",children:"Trace Report"}),e.jsxs(p,{color:"excellent"===o||"good"===o?"green":"fair"===o?"amber":"red",children:[e.jsx(He,{className:"w-3 h-3 mr-1"}),"excellent"===o?"Excellent":"good"===o?"Good":"fair"===o?"Fair":"Poor"]})]}),e.jsx("p",{className:"mt-1 text-xs sm:text-sm font-mono text-text-muted tabular-nums",children:t.traceTag})]}),e.jsx("button",{onClick:s,className:"p-1.5 -m-1.5 text-text-muted hover:text-text-primary transition-base radius-inner hover:bg-bg-elevated flex-shrink-0",children:e.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]})}),e.jsxs("div",{className:"hidden sm:flex flex-wrap items-center gap-1.5 sm:gap-2 px-4 sm:px-6 pb-3 sm:pb-4 border-b border-border-subtle",children:[e.jsxs(p,{color:"teal",children:[e.jsx("span",{className:"font-mono tabular-nums",children:t.targetHopCount}),e.jsxs("span",{className:"ml-1",children:["hop",1!==t.targetHopCount?"s":""]})]}),e.jsxs(p,{color:"zinc",children:[e.jsx("span",{className:"font-mono tabular-nums",children:t.observationCount}),e.jsx("span",{className:"ml-1",children:"obs"})]}),t.linkQuality&&e.jsxs(p,{color:"purple",children:[e.jsx("span",{className:"font-mono tabular-nums",children:t.linkQuality.avgSnr.toFixed(1)}),e.jsx("span",{className:"ml-1",children:"dB avg"})]}),e.jsx("span",{className:"font-mono text-xs text-text-muted tabular-nums",children:V(t.duration)}),t.linkQuality&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-text-muted/40",children:"•"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-sys-red/15 text-sys-red ring-1 ring-inset ring-sys-red/25",children:[e.jsx("span",{className:"opacity-70",children:"Min"}),e.jsx("span",{className:"font-mono tabular-nums",children:t.linkQuality.minSnr.toFixed(1)})]}),e.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-sys-teal/15 text-sys-teal ring-1 ring-inset ring-sys-teal/25",children:[e.jsx("span",{className:"opacity-70",children:"Max"}),e.jsx("span",{className:"font-mono tabular-nums",children:t.linkQuality.maxSnr.toFixed(1)})]})]})]})]}),e.jsxs(R,{className:"p-0 overflow-hidden",children:[e.jsx("div",{className:"md:hidden h-[75vh] max-h-[calc(100vh-80px)] overflow-y-auto overflow-x-hidden",children:e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[t.linkQuality&&e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{className:"radius-inner bg-white/[0.03] ring-1 ring-inset ring-white/[0.06] p-2.5 text-center",children:[e.jsx(Vt,{value:Math.abs(t.linkQuality.minSnr),format:{maximumFractionDigits:0,signDisplay:"never"},prefix:t.linkQuality.minSnr<0?"-":"",className:"text-[20px] font-bold font-mono tabular-nums flex items-center justify-center text-white"}),e.jsxs("div",{className:"flex items-center justify-center gap-1 mt-1",children:[e.jsx(ce,{className:"w-2.5 h-2.5 text-text-muted"}),e.jsx("span",{className:"text-[10px] text-white/40",children:"Min dB"})]})]}),e.jsxs("div",{className:"radius-inner bg-white/[0.03] ring-1 ring-inset ring-white/[0.06] p-2.5 text-center",children:[e.jsx(Vt,{value:t.linkQuality.maxSnr,format:{maximumFractionDigits:0,signDisplay:"always"},className:"text-[20px] font-bold font-mono text-white tabular-nums flex items-center justify-center"}),e.jsxs("div",{className:"flex items-center justify-center gap-1 mt-1",children:[e.jsx(le,{className:"w-2.5 h-2.5 text-text-muted"}),e.jsx("span",{className:"text-[10px] text-white/40",children:"Max dB"})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs(p,{color:"excellent"===o||"good"===o?"green":"fair"===o?"amber":"red",compact:!0,children:[e.jsx(He,{className:"w-2.5 h-2.5 mr-0.5"}),"excellent"===o?"Excellent":"good"===o?"Good":"fair"===o?"Fair":"Poor"]}),e.jsxs(p,{color:"teal",compact:!0,children:[t.targetHopCount," hops"]}),e.jsxs(p,{color:"zinc",compact:!0,children:[t.observationCount," obs"]}),e.jsx("span",{className:"text-[10px] font-mono text-white/30 ml-auto",children:t.traceTag.slice(0,8)})]}),t.targetPath.length>0&&e.jsx("div",{className:"overflow-hidden radius-inset",children:e.jsx("div",{className:"aspect-[4/3] w-full",children:e.jsx(rt,{path:t.targetPath,neighbors:i,localNode:l,localHash:null==r?void 0:r.local_hash,srcHash:t.srcHash,dstHash:t.dstHash,traceSnr:c})})}),e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-white/5",children:[e.jsx("span",{className:"text-[11px] font-medium text-white/60",children:"Route Path"}),t.linkQuality&&e.jsxs("span",{className:"text-[10px] font-mono text-white/40",children:["SNR ",t.linkQuality.minSnr.toFixed(1)," → ",t.linkQuality.maxSnr.toFixed(1)," dB"]})]}),t.bestObservation?e.jsx(Dt,{packet:t.bestObservation.packet,neighbors:i,localHash:null==r?void 0:r.local_hash,direction:"flowchart",compact:!0,overridePath:t.targetPath,traceSnr:t.bestObservation.decoded.snrValues}):e.jsx("div",{className:"p-6 text-center text-text-muted text-[11px]",children:"No path data available"})]}),e.jsxs("div",{children:[e.jsxs("h3",{className:"text-[11px] font-medium uppercase tracking-wide text-white/40 mb-2",children:["Link Quality · ",t.hopStats.length," hops"]}),e.jsx("div",{className:"space-y-1.5",children:t.hopStats.length>0?t.hopStats.map((s,a)=>{var n,r,l;const c=a{const s=t.targetPath[t.linkQuality.weakestLinkPosition],a=t.targetPath[t.linkQuality.weakestLinkPosition+1]||"You",n=qt(s,i),r=qt(a,i),l=t.targetPath[t.linkQuality.strongestLinkPosition],c=t.targetPath[t.linkQuality.strongestLinkPosition+1]||"You",o=qt(l,i),d=qt(c,i);return e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(Ot,{label:"Weakest Link",numericValue:t.linkQuality.minSnr,unit:"dB",icon:ce,subtext:`${n||s} → ${r||a}`}),e.jsx(Ot,{label:"Best Link",numericValue:t.linkQuality.maxSnr,showSign:!0,unit:"dB",icon:le,subtext:`${o||l} → ${d||c}`})]})})(),e.jsxs("div",{children:[e.jsx("h3",{className:"text-[11px] font-medium uppercase tracking-wide text-text-muted mb-3",children:"Link Details"}),e.jsx("div",{className:"space-y-2",children:t.hopStats.length>0?t.hopStats.map((s,a)=>{var n,r,l;const c=a0&&e.jsx("div",{className:"overflow-hidden",children:e.jsx("div",{className:"aspect-square w-full",children:e.jsx(rt,{path:t.targetPath,neighbors:i,localNode:l,localHash:null==r?void 0:r.local_hash,srcHash:t.srcHash,dstHash:t.dstHash,traceSnr:c})})}),e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Trace Route"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(p,{color:t.isComplete?"green":"amber",compact:!0,children:t.isComplete?"Complete":`${t.maxHopsObserved}/${t.targetHopCount}`}),e.jsxs(p,{color:"teal",compact:!0,children:[t.targetHopCount," hop",1!==t.targetHopCount?"s":""]})]})]}),t.linkQuality&&t.bestObservation&&e.jsxs("div",{className:"flex items-center gap-4 px-4 pb-2 font-mono text-[10px] text-text-muted",children:[e.jsxs("span",{children:[e.jsx("span",{className:"opacity-60",children:"Tag"})," ",e.jsx("code",{className:"text-teal-400 tabular-nums",children:t.traceTag.slice(0,8)})]}),e.jsxs("span",{children:[e.jsx("span",{className:"opacity-60",children:"SNR"})," ",e.jsxs("code",{className:"text-accent-secondary tabular-nums",children:[t.linkQuality.minSnr.toFixed(1),"–",t.linkQuality.maxSnr.toFixed(1)]}),e.jsx("span",{className:"opacity-60",children:" dB"})]})]}),t.bestObservation?e.jsx(Dt,{packet:t.bestObservation.packet,neighbors:i,localHash:null==r?void 0:r.local_hash,direction:"flowchart",compact:!0,overridePath:t.targetPath,traceSnr:t.bestObservation.decoded.snrValues}):e.jsx("div",{className:"p-8 text-center text-text-muted text-xs",children:"No path data available"})]})]})]})]})]})});function Kt({message:t}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-14 text-center",children:[e.jsx(T,{className:"size-6 text-text-muted mb-2"}),e.jsx("p",{className:"text-sm text-text-primary",children:t}),e.jsx("p",{className:"text-xs text-text-muted",children:"Packets will appear here"})]})}function Yt(){return e.jsx("div",{className:"py-14 text-center text-sm text-text-muted",children:"Loading packets…"})}function Jt({showPagination:t,currentPage:s,perPage:a,displayCount:n,totalCount:r,action:i}){const l=t?(s-1)*a+1:1,c=t?Math.min(s*a,r):n;return e.jsxs("div",{className:"flex items-center justify-between gap-4 border-t border-white/5 px-4 py-3 text-xs text-text-muted sm:px-6",children:[e.jsxs("span",{children:["Showing"," ",e.jsx("span",{className:"font-medium text-text-secondary",children:t?`${l}–${c}`:n})," ","of"," ",e.jsx("span",{className:"font-medium text-text-secondary",children:r})," ","packets"]}),i]})}function Zt({packets:a,allPackets:n,localHash:r,neighbors:i,loading:l=!1,maxPackets:c,perPage:o=50,showPagination:d=!1,onPacketSelect:x,flashNewest:m=!1,emptyMessage:h="No packets found",className:p,footerAction:u}){const[g,f]=s.useState(null),[j,y]=s.useState(null),[b,N]=s.useState({traceTag:null,dupeGroup:null});s.useLayoutEffect(()=>{N({traceTag:null,dupeGroup:null})},[a]);const v=n??a,w=s.useMemo(()=>c&&c>0?a.slice(0,c):a,[a,c]),{currentPage:k,totalPages:C,goToPage:S,pageRange:H}=function(e,t,a){const[n,r]=s.useState(1),i=a?Math.ceil(e/t):1;s.useEffect(()=>{n>i&&i>0&&queueMicrotask(()=>r(1))},[i,n]);const l=s.useCallback(e=>r(Math.max(1,Math.min(e,i))),[i]),c=s.useMemo(()=>function(e,t,s=1){if(t<=7)return Array.from({length:t},(e,t)=>t+1);const a=Math.max(e-s,1),n=Math.min(e+s,t),r=a>2,i=nt+1),"gap",t]}if(r&&!i){const e=3+2*s;return[1,"gap",...Array.from({length:e},(s,a)=>t-e+a+1)]}return[1,"gap",...Array.from({length:n-a+1},(e,t)=>a+t),"gap",t]}(n,i),[n,i]);return{currentPage:n,totalPages:i,goToPage:l,pageRange:c}}(w.length,o,d),P=s.useMemo(()=>{if(!d)return w;const e=(k-1)*o;return w.slice(e,e+o)},[w,d,k,o]),M=s.useMemo(()=>function(e){const t=new Map;for(const s of e)if((s.payload_type??s.type)===Q.TRACE&&s.payload&&s.packet_hash){const e=Re(s.payload);e&&t.set(s.packet_hash,e)}return t}(P),[P]),_=s.useMemo(()=>function(e){const t=new Map;if(0===e.length)return t;for(let s=0;s{var s,a;if(!t||!e.length)return;const i=(null==(s=e[0])?void 0:s.timestamp)??0,l=i>r.current&&r.current>0;if(r.current=i,!l)return;const c=null==(a=e[0])?void 0:a.packet_hash;if(!c)return;const o=requestAnimationFrame(()=>n(c)),d=setTimeout(()=>n(null),600);return()=>{cancelAnimationFrame(o),clearTimeout(d)}},[e,t]),a}(a,m),B=s.useCallback((e,t)=>{var s,a;const n=e.packet_hash;if(!n)return[e];let r=t;for(;r>0&&(null==(s=P[r-1])?void 0:s.packet_hash)===n;)r--;let i=t;for(;i{var t,s;const a=null==(t=P[e])?void 0:t.packet_hash;if(!a)return e;let n=e;for(;n>0&&(null==(s=P[n-1])?void 0:s.packet_hash)===a;)n--;return n},[P]),L=s.useCallback(e=>{var t,s;const a=null==(t=P[e])?void 0:t.packet_hash;if(!a)return e;let n=e;for(;n{if(x)x(e);else if(void 0!==t){const s=B(e,t),a=s.indexOf(e);f({packets:s,initialIndex:a>=0?a:0,rowIndex:t})}else f({packets:[e],initialIndex:0,rowIndex:0})},[x,B]),D=s.useCallback(()=>{if(!g)return;const e=F(g.rowIndex)-1;if(e<0)return;const t=P[e];if(!t)return;const s=B(t,e);f({packets:s,initialIndex:0,rowIndex:e})},[g,P,F,B]),A=s.useCallback(()=>{if(!g)return;const e=L(g.rowIndex)+1;if(e>=P.length)return;const t=P[e];if(!t)return;const s=B(t,e);f({packets:s,initialIndex:0,rowIndex:e})},[g,P,L,B]),E=s.useMemo(()=>!!g&&F(g.rowIndex)>0,[g,F]),R=s.useMemo(()=>!!g&&L(g.rowIndex)N(t=>({...t,traceTag:e})),[]),$=s.useCallback(e=>N(t=>({...t,dupeGroup:e})),[]),I=s.useCallback(()=>{N({traceTag:null,dupeGroup:null})},[]),V=s.useCallback(e=>{const t=v.filter(t=>(t.payload_type??t.type)===Q.TRACE&&t.payload&&Re(t.payload)===e);if(0===t.length)return;const s=function(e){const t=new Map;for(const s of e){const e=$e(s);if(!e)continue;const a=e.decoded.traceTag,n=t.get(a)||[];n.push(e),t.set(a,n)}for(const[s,a]of t)a.sort((e,t)=>e.timestamp-t.timestamp),t.set(s,a);return t}(t),a=s.get(e);(null==a?void 0:a.length)&&y(function(e,t){if(0===t.length)return{traceTag:e,traceTagValue:0,targetPath:[],targetHopCount:0,observations:[],observationCount:0,firstSeen:0,lastSeen:0,duration:0,isComplete:!1,maxHopsObserved:0,progressPercent:0,bestObservation:null,hopStats:[],linkQuality:null};const s=[...t].sort((e,t)=>e.timestamp-t.timestamp),a=s.reduce((e,t)=>t.hopCount>e.hopCount?t:e,s[0]),n=s[0].timestamp,r=s[s.length-1].timestamp,i=a.decoded.pathHashes,l=i.length,c=a.hopCount,o=a.decoded.isComplete,d=[],x=a.decoded.snrValues;for(let h=0;h0){const e=Math.min(...x),t=Math.max(...x);m={minSnr:e,maxSnr:t,avgSnr:x.reduce((e,t)=>e+t,0)/x.length,weakestLinkPosition:x.indexOf(e),strongestLinkPosition:x.indexOf(t)}}return{traceTag:e,traceTagValue:a.decoded.traceTagValue,targetPath:i,targetHopCount:l,observations:s,observationCount:s.length,firstSeen:n,lastSeen:r,duration:r-n,isComplete:o,maxHopsObserved:c,progressPercent:l>0?Math.round(c/l*100):0,bestObservation:a,hopStats:d,linkQuality:m,srcHash:a.packet.src_hash,dstHash:a.packet.dst_hash}}(e,a))},[v]),O=s.useCallback(e=>{const t=v.find(t=>t.packet_hash===e);t&&(y(null),z(t))},[v,z]),W=t=>{if(l&&0===a.length)return e.jsx(Yt,{});if(0===P.length)return e.jsx(Kt,{message:h});const s=t?Xe:Ze;return P.map((t,a)=>{const n=t.packet_hash?M.get(t.packet_hash):void 0,l=null!==b.traceTag&&n===b.traceTag,c=_.get(a),o=void 0!==c&&null!==b.dupeGroup&&t.packet_hash===b.dupeGroup;return e.jsx(s,{packet:t,onClick:e=>z(e,a),localHash:r,neighbors:i,isFlashing:m&&T===t.packet_hash,traceTag:n,isTraceHighlighted:l,onTraceHover:U,onViewTraceReport:V,dupeGroupPosition:c,isDupeGroupHovered:o,onDupeGroupHover:$},`${t.packet_hash}_${t.timestamp}_${a}`)})};return e.jsxs("div",{className:t("flex flex-col",p),onMouseLeave:I,children:[e.jsx("div",{className:"hidden divide-y divide-white/5 py-1 sm:block",children:W(!1)}),e.jsx("div",{className:"divide-y divide-white/5 sm:hidden",children:W(!0)}),d&&C>1&&e.jsx("nav",{className:"border-t border-white/5 px-4 py-3",children:e.jsxs(Fe,{className:"justify-center",children:[e.jsx(Le,{onClick:()=>S(k-1),disabled:1===k}),e.jsx(De,{children:H.map((t,s)=>"gap"===t?e.jsx(Ee,{},`gap-${s}`):e.jsx(Ae,{page:t,current:t===k,onClick:S},t))}),e.jsx(ze,{onClick:()=>S(k+1),disabled:k===C})]})}),e.jsx(Jt,{showPagination:d,currentPage:k,perPage:o,displayCount:P.length,totalCount:d?w.length:a.length,action:u}),!x&&g&&e.jsx($t,{packets:g.packets,initialIndex:g.initialIndex,onClose:()=>f(null),onNavigatePrev:D,onNavigateNext:A,hasPrev:E,hasNext:R}),j&&e.jsx(Gt,{report:j,onClose:()=>y(null),onViewPacket:O})]})}export{Ne as A,Zt as P,He as S,Pe as T,Qe as g,Be as u}; diff --git a/frontend/dist/assets/PacketList-DSZP-sF4.js b/frontend/dist/assets/PacketList-DSZP-sF4.js new file mode 100644 index 00000000..66612bd1 --- /dev/null +++ b/frontend/dist/assets/PacketList-DSZP-sF4.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PathMapMapLibre-CFZlE15b.js","assets/vendor-react-Cwum97tW.js","assets/BasemapLayer-C9wiTbJT.js","assets/vendor-core-CDrKesoV.js","assets/useThemeColors-S-uaxvPT.js","assets/index-D22MpaCY.js","assets/house-D2cJ2w9-.js","assets/payload-decoders-B_w2m9Or.js","assets/SignalIndicator-CBL6VSNS.js","assets/arrow-up-DysUUcGL.js","assets/DataBox-Bl0vntck.js","assets/chevron-right-CZNwXWtt.js","assets/loader-circle-2q9lT2qG.js","assets/map-pin-kiJDSdn0.js","assets/zap-Cpbok2bP.js","assets/triangle-alert-TfoZuZfW.js","assets/route-ExVvvUtv.js","assets/activity-Cb8TQBuo.js","assets/circle-check-CKXuJpMJ.js","assets/index-bDa2a9Y2.js","assets/maplibre-gl-B1CfjdFi.css","assets/index-DWq9tBbL.css"])))=>i.map(i=>d[i]); +import{j as e,c as t,r as s}from"./vendor-react-Cwum97tW.js";import{c as a,O as n,Q as r,U as i,V as l,N as c,W as o,Y as d,Z as x,B as m,_ as h,$ as p,a0 as u,a1 as g,a2 as f,p as j,a3 as y,a4 as b,m as N,x as v,a5 as w,a6 as k,a7 as C,a8 as S,R as H,a9 as P,f as M,aa as _,ab as T,ac as B,ad as F,C as L,E as z,A as D,ae as A,F as E,af as R,ag as U,ah as $}from"./index-D22MpaCY.js";import{P as I,d as V,a as O,b as Q,c as W,e as G}from"./payload-decoders-B_w2m9Or.js";import{D as q,S as K,R as Y,P as J,a as Z,g as X,b as ee}from"./SignalIndicator-CBL6VSNS.js";import{a as te,A as se}from"./arrow-up-DysUUcGL.js";import{a as ae,D as ne}from"./DataBox-Bl0vntck.js";import{C as re}from"./chevron-right-CZNwXWtt.js";import{L as ie}from"./loader-circle-2q9lT2qG.js";import{_ as le}from"./deckgl-DTsmDcfs.js";import{M as ce}from"./map-pin-kiJDSdn0.js";import{C as oe,Z as de}from"./zap-Cpbok2bP.js";import{T as xe}from"./triangle-alert-TfoZuZfW.js";import{L as me,H as he,R as pe}from"./route-ExVvvUtv.js";import{A as ue}from"./activity-Cb8TQBuo.js";import{C as ge}from"./circle-check-CKXuJpMJ.js";import{D as fe,H as je}from"./house-D2cJ2w9-.js";import{g as ye,s as be}from"./useThemeColors-S-uaxvPT.js";import{A as Ne}from"./index-bDa2a9Y2.js";const ve=a("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]),we=a("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]),ke=a("corner-down-right",[["path",{d:"m15 10 5 5-5 5",key:"qqa56n"}],["path",{d:"M4 4v7a4 4 0 0 0 4 4h12",key:"z08zvw"}]]),Ce=a("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]),Se=a("reply",[["path",{d:"M20 18v-2a4 4 0 0 0-4-4H4",key:"5vmcpk"}],["path",{d:"m9 17-5-5 5-5",key:"nvlc11"}]]),He=a("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]),Pe=a("stethoscope",[["path",{d:"M11 2v2",key:"1539x4"}],["path",{d:"M5 2v2",key:"1yf1q8"}],["path",{d:"M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1",key:"rb5t3r"}],["path",{d:"M8 15a6 6 0 0 0 12 0v-3",key:"x18d4x"}],["circle",{cx:"20",cy:"10",r:"2",key:"ts1r5v"}]]),Me=a("trophy",[["path",{d:"M10 14.66v1.626a2 2 0 0 1-.976 1.696A5 5 0 0 0 7 21.978",key:"1n3hpd"}],["path",{d:"M14 14.66v1.626a2 2 0 0 0 .976 1.696A5 5 0 0 1 17 21.978",key:"rfe1zi"}],["path",{d:"M18 9h1.5a1 1 0 0 0 0-5H18",key:"7xy6bh"}],["path",{d:"M4 22h16",key:"57wxv0"}],["path",{d:"M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z",key:"1mhfuq"}],["path",{d:"M6 9H4.5a1 1 0 0 1 0-5H6",key:"tex48p"}]]),_e=a("user",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);function Te(e,t){[...t].reverse().forEach(s=>{const a=e.getVariant(s);a&&r(e,a),e.variantChildren&&e.variantChildren.forEach(e=>{Te(e,t)})})}function Be(){const e=new Set,t={subscribe:t=>(e.add(t),()=>{e.delete(t)}),start(t,s){const a=[];return e.forEach(e=>{a.push(n(e,t,{transitionOverride:s}))}),Promise.all(a)},set:t=>e.forEach(e=>{!function(e,t){Array.isArray(t)?Te(e,t):"string"==typeof t?Te(e,[t]):r(e,t)}(e,t)}),stop(){e.forEach(e=>{!function(e){e.values.forEach(e=>e.stop())}(e)})},mount:()=>()=>{t.stop()}};return t}function Fe(){const e=i(Be);return l(e.mount,[]),e}function Le({"aria-label":s="Page navigation",className:a,...n}){return e.jsx("nav",{"aria-label":s,...n,className:t("flex gap-x-2",a)})}function ze({onClick:s,disabled:a=!1,className:n,children:r="Previous"}){return e.jsx("span",{className:t("grow basis-0",n),children:e.jsxs(c,{plain:!0,onClick:s,disabled:a,"aria-label":"Previous page",className:t("gap-1",a&&"invisible"),children:[e.jsx("svg",{className:"size-4 stroke-current",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:e.jsx("path",{d:"M2.75 8H13.25M2.75 8L5.25 5.5M2.75 8L5.25 10.5",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})}),r]})})}function De({onClick:s,disabled:a=!1,className:n,children:r="Next"}){return e.jsx("span",{className:t("flex grow basis-0 justify-end",n),children:e.jsxs(c,{plain:!0,onClick:s,disabled:a,"aria-label":"Next page",className:t("gap-1",a&&"invisible"),children:[r,e.jsx("svg",{className:"size-4 stroke-current",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:e.jsx("path",{d:"M13.25 8L2.75 8M13.25 8L10.75 10.5M13.25 8L10.75 5.5",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})})]})})}function Ae({className:s,...a}){return e.jsx("span",{...a,className:t("hidden items-baseline gap-x-2 sm:flex",s)})}function Ee({page:s,current:a=!1,onClick:n,className:r,children:i}){return e.jsx(c,{plain:!a,outline:a,onClick:()=>null==n?void 0:n(s),"aria-label":`Page ${s}`,"aria-current":a?"page":void 0,className:t("min-w-[2.25rem] before:absolute before:-inset-px before:rounded-lg",a&&"before:bg-white/5",r),children:i??s})}function Re({className:s,...a}){return e.jsx("span",{"aria-hidden":"true",...a,className:t("w-[2.25rem] select-none text-center text-sm text-text-muted",s),children:"…"})}function Ue(e){if(!e||e.length<8)return null;const t=parseInt(e.slice(0,2),16),s=parseInt(e.slice(2,4),16),a=parseInt(e.slice(4,6),16),n=parseInt(e.slice(6,8),16);return isNaN(t)||isNaN(s)||isNaN(a)||isNaN(n)?null:((t|s<<8|a<<16|n<<24)>>>0).toString(16).toUpperCase().padStart(8,"0")}function $e(e){return e>=10?"excellent":e>=5?"good":e>=0?"fair":e>=-5?"poor":"critical"}function Ie(e){if(!e.payload)return null;try{const t=x(e.payload),s=function(e){const t=e.original_path||e.forwarded_path||[];if("string"==typeof t)try{const e=JSON.parse(t);if(Array.isArray(e))return e.map(e=>parseInt(e,16))}catch{return[]}else if(Array.isArray(t))return t.map(e=>parseInt(e,16));return[]}(e),a=O(t,s);return a?{packet:e,decoded:a,timestamp:e.timestamp??0,hopCount:a.snrValues.length,rssi:e.rssi,snr:e.snr}:null}catch{return null}}const Ve={rx:{icon:se,label:"Rx",badgeColor:q.rx,avatarBg:"bg-emerald-500/15",avatarText:"text-emerald-400"},forward:{icon:ve,label:"Fwd",badgeColor:q.forward,avatarBg:"bg-sky-500/15",avatarText:"text-sky-400"},duplicate:{icon:ae,label:"Dupe",badgeColor:q.duplicate,avatarBg:"bg-zinc-500/15",avatarText:"text-zinc-400"},tx:{icon:te,label:"Tx",badgeColor:q.tx,avatarBg:"bg-violet-500/15",avatarText:"text-violet-400"},dropped:{icon:ke,label:"Drop",badgeColor:q.dropped,avatarBg:"bg-amber-500/15",avatarText:"text-amber-400"}},Oe={sm:"w-3 h-3",md:"w-3.5 h-3.5",lg:"w-4 h-4"},Qe={sm:"w-7 h-7",md:"w-8 h-8",lg:"w-9 h-9"};function We(e){return"tx_local"===e.packet_origin?"tx":"tx_forward"===e.packet_origin?"forward":e.is_duplicate?"duplicate":e.transmitted?"forward":e.drop_reason?"dropped":"rx"}const Ge=s.memo(function({packet:s,showLabel:a=!0,variant:n="avatar",size:r="sm"}){const i=We(s),l=Ve[i],c=l.icon;return"avatar"===n?e.jsx("div",{className:t("flex items-center justify-center rounded-full flex-shrink-0",l.avatarBg,Qe[r]),children:e.jsx(c,{className:t(Oe[r],l.avatarText)})}):e.jsxs(m,{color:l.badgeColor,children:[e.jsx(c,{className:Oe[r]}),a&&l.label]})}),qe=s.memo(function({path:s,localHash:a,className:n}){if(!s||0===s.length)return e.jsx("span",{className:t("text-white/30 text-[10px]",n),children:"—"});const r=a?(a.startsWith("0x")?a.slice(2,4):a.slice(0,2)).toUpperCase():null;return e.jsx("span",{className:t("flex items-center gap-0.5 font-mono text-[10px] overflow-hidden",n),children:s.map((t,a)=>{const n=a===s.length-1,i=r&&t.toUpperCase()===r;return e.jsxs("span",{className:"flex items-center flex-shrink-0",children:[i?e.jsx("span",{className:"px-1 py-0.5 rounded bg-amber-500/20 text-amber-400 text-[9px] font-medium",children:"You"}):e.jsx("span",{className:"px-1 py-0.5 rounded bg-white/[0.06] text-white/60",children:t.toUpperCase()}),!n&&e.jsx(re,{className:"w-2.5 h-2.5 text-white/20 mx-0.5 flex-shrink-0"})]},`${t}-${a}`)})})}),Ke=s.memo(function({count:s,className:a}){const n=s>=2;return e.jsxs("span",{className:t("font-mono text-xs tabular-nums",n?"text-white/70":"text-white/30",a),children:[s,e.jsx("span",{className:"text-white/20",children:"→"})]})});function Ye(e){const t=e.payload_type_name||u(e.payload_type??e.type),s=e.route_type_name||g(e.route_type??e.route);return{payloadType:t,routeType:s,payloadColor:J[t]??"zinc",routeColor:Y[s]??"zinc"}}function Je(e){if(!e)return[];if(Array.isArray(e))return e;try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Ze(e,t){if(!e||!t)return null;const s=e.startsWith("0x")?e.slice(2):e;for(const[a,n]of Object.entries(t))if((a.startsWith("0x")?a.slice(2):a).toLowerCase().startsWith(s.toLowerCase()))return n.name||n.node_name||null;return null}const Xe=s.memo(function({packet:a,onClick:n,localHash:r,neighbors:i,isFlashing:l=!1,isPending:c,isTraceHighlighted:o,onTraceHover:d,traceTag:x,onViewTraceReport:u,dupeGroupPosition:g,isDupeGroupHovered:f=!1,onDupeGroupHover:j}){const y=h(a.is_duplicate),b=void 0!==g,{payloadType:N,routeType:v,payloadColor:w,routeColor:k}=Ye(a),C="tx_local"===a.packet_origin,S=c??a.isPending,H="TRACE"===N,P=Je(a.original_path),M=Je(a.forwarded_path),_=M.length>0?M:P,T=_.length,B=a.src_hash?(a.src_hash.startsWith("0x")?a.src_hash.slice(2,6):a.src_hash.slice(0,4)).toUpperCase():null,F=Ze(a.src_hash,i),L=a.payload_length??a.length??0;a.lbt_attempts;const z=s.useCallback(()=>{H&&x&&u?u(x):n(a)},[H,x,u,n,a]),D=s.useCallback(()=>{H&&x&&d&&d(x),b&&j&&a.packet_hash&&j(a.packet_hash)},[H,x,d,b,j,a.packet_hash]),A=s.useCallback(()=>{d&&d(null),j&&j(null)},[d,j]),E={lime:"rgb(132, 204, 22)",cyan:"rgb(34, 211, 238)",amber:"rgb(251, 191, 36)",violet:"rgb(167, 139, 250)",rose:"rgb(251, 113, 133)",emerald:"rgb(52, 211, 153)",sky:"rgb(56, 189, 248)",orange:"rgb(251, 146, 60)",pink:"rgb(244, 114, 182)",zinc:"rgb(161, 161, 170)",purple:"rgb(168, 85, 247)",indigo:"rgb(129, 140, 248)",teal:"rgb(45, 212, 191)",fuchsia:"rgb(232, 121, 249)",blue:"rgb(59, 130, 246)",green:"rgb(34, 197, 94)",yellow:"rgb(250, 204, 21)",red:"rgb(239, 68, 68)",brown:"rgb(168, 133, 107)"},R=E[w]||E.zinc,U=f;return e.jsxs("div",{onClick:z,onMouseEnter:D,onMouseLeave:A,className:t("group relative cursor-pointer","hover:bg-white/[0.02]",y&&!f&&"opacity-40",l&&"flash-row",S&&"opacity-70",C&&"bg-violet-500/5",o&&"bg-teal-500/10"),children:[e.jsx("div",{className:t("absolute pointer-events-none transition-opacity duration-75",b?U?"opacity-100":"opacity-0":"opacity-0 group-hover:opacity-100"),style:(()=>{const e={pointerEvents:"none"};return"first"===g?{...e,borderTop:`2px solid ${R}`,borderLeft:`2px solid ${R}`,borderRight:`2px solid ${R}`,borderBottom:"none",borderRadius:"8px 8px 0 0",inset:"-2px -2px 0 -2px"}:"middle"===g?{...e,borderTop:"none",borderLeft:`2px solid ${R}`,borderRight:`2px solid ${R}`,borderBottom:"none",borderRadius:0,inset:"0 -2px"}:"last"===g?{...e,borderTop:"none",borderLeft:`2px solid ${R}`,borderRight:`2px solid ${R}`,borderBottom:`2px solid ${R}`,borderRadius:"0 0 8px 8px",inset:"0 -2px -2px -2px"}:{...e,border:`2px solid ${R}`,borderRadius:"8px",inset:"-2px"}})()}),e.jsxs("div",{className:"relative flex items-center gap-2 min-[600px]:gap-3 px-2 py-2 min-[600px]:px-3 min-[600px]:py-2.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5 flex-shrink-0",children:[e.jsxs("div",{className:"relative flex-shrink-0",children:[e.jsx(Ge,{packet:a,variant:"avatar",size:"sm"}),S&&e.jsx(ie,{className:"absolute -right-1 -bottom-1 w-3 h-3 text-amber-400 animate-spin"})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"font-bold text-[13px] text-white font-sans truncate",children:B||"—"}),F&&e.jsx("div",{className:"hidden min-[900px]:block text-[9px] text-white/40 truncate max-w-[70px]",children:F})]})]}),e.jsxs("div",{className:"flex-1 flex items-center gap-1 min-[600px]:gap-1.5 min-[900px]:gap-2 min-w-0",children:[e.jsx("span",{className:"text-[10px] min-[600px]:text-[11px] text-white/50 font-mono tabular-nums whitespace-nowrap flex-shrink-0",children:p(a.timestamp)}),e.jsx(m,{color:w,className:"flex-shrink-0",children:N}),e.jsx("span",{className:"min-[600px]:hidden text-[10px] font-mono text-white/40 flex-shrink-0",children:v.charAt(0)}),e.jsx(m,{color:k,className:"flex-shrink-0 hidden min-[600px]:inline-flex",children:v}),e.jsx("div",{className:"flex-shrink-0 flex items-center",children:e.jsx(Ke,{count:T})}),e.jsxs("span",{className:"hidden min-[520px]:inline text-[10px] text-white/40 font-mono flex-shrink-0",children:[L,"B"]}),e.jsx("div",{className:"flex-1 min-w-0 overflow-hidden",children:e.jsx(qe,{path:_,localHash:r})})]}),e.jsx("div",{className:"flex-shrink-0",children:e.jsx(K,{rssi:a.rssi,snr:a.snr,compact:!0,showValues:!0})})]})]})}),et=s.memo(function({packet:s,onClick:a,localHash:n,neighbors:r,isFlashing:i=!1,isPending:l,isTraceHighlighted:c,traceTag:o,onViewTraceReport:d,dupeGroupPosition:x,isDupeGroupHovered:u=!1,onDupeGroupHover:g}){const{payloadType:f,routeType:j,payloadColor:y,routeColor:b}=Ye(s),N="tx_local"===s.packet_origin,v=l??s.isPending,w="TRACE"===f,k=h(s.is_duplicate),C=Je(s.original_path),S=Je(s.forwarded_path),H=S.length>0?S:C,P=H.length,M=s.src_hash?(s.src_hash.startsWith("0x")?s.src_hash.slice(2,6):s.src_hash.slice(0,4)).toUpperCase():null,_=Ze(s.src_hash,r),T=s.payload_length??s.length??0,B=s.lbt_attempts??0,F={lime:"rgb(132, 204, 22)",cyan:"rgb(34, 211, 238)",amber:"rgb(251, 191, 36)",violet:"rgb(167, 139, 250)",rose:"rgb(251, 113, 133)",emerald:"rgb(52, 211, 153)",sky:"rgb(56, 189, 248)",orange:"rgb(251, 146, 60)",pink:"rgb(244, 114, 182)",zinc:"rgb(161, 161, 170)",purple:"rgb(168, 85, 247)",indigo:"rgb(129, 140, 248)",teal:"rgb(45, 212, 191)",fuchsia:"rgb(232, 121, 249)",blue:"rgb(59, 130, 246)",green:"rgb(34, 197, 94)",yellow:"rgb(250, 204, 21)",red:"rgb(239, 68, 68)"},L=F[y]||F.zinc;return e.jsxs("div",{onClick:()=>{w&&o&&d?d(o):a(s)},className:t("relative pl-3 pr-2.5 py-2 cursor-pointer","active:bg-white/[0.04]",k&&"opacity-40",i&&"flash-row",v&&"opacity-70",N&&"bg-violet-500/5",c&&"bg-teal-500/10"),children:[e.jsx("div",{className:"absolute left-0 transition-all",style:(()=>{if(!x)return{opacity:0};const e=u?1:.4,t=u?"3px":"2px";return"first"===x?{backgroundColor:L,opacity:e,width:t,top:"6px",bottom:0,borderRadius:"0 9999px 0 0"}:"middle"===x?{backgroundColor:L,opacity:e,width:t,top:0,bottom:0,borderRadius:0}:"last"===x?{backgroundColor:L,opacity:e,width:t,top:0,bottom:"6px",borderRadius:"0 0 9999px 0"}:{backgroundColor:L,opacity:e,width:t,top:"6px",bottom:"6px",borderRadius:"9999px"}})()}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsxs("div",{className:"relative flex-shrink-0 mt-0.5",children:[e.jsx(Ge,{packet:s,variant:"avatar",size:"sm"}),v&&e.jsx(ie,{className:"absolute -right-1 -bottom-1 w-2.5 h-2.5 text-amber-400 animate-spin"})]}),e.jsxs("div",{className:"flex-1 min-w-0 space-y-0.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-semibold text-[14px] text-white tracking-tight",children:M||"—"}),_&&e.jsx("span",{className:"text-[12px] text-white/40 truncate max-w-[80px]",children:_}),e.jsx("div",{className:"flex-1"}),e.jsx(m,{color:y,className:"flex-shrink-0 !text-[9px] !px-1.5 !py-0",children:f}),e.jsxs("div",{className:"flex items-center gap-1 flex-shrink-0",children:[e.jsx("span",{className:"text-[10px] font-mono text-white/50 tabular-nums w-[28px] text-right",children:s.rssi}),e.jsx(K,{rssi:s.rssi,compact:!0,showValues:!1})]})]}),e.jsxs("div",{className:"flex items-center gap-1 text-[10px] text-white/40 font-mono",children:[e.jsx("span",{className:"tabular-nums",children:p(s.timestamp)}),e.jsx(m,{color:b,className:"!text-[8px] !px-1 !py-0 !leading-none",children:j.charAt(0)}),P>0&&e.jsxs("span",{className:"text-white/30",children:[P,"h"]}),T>0&&e.jsxs("span",{className:"text-white/30",children:[T,"B"]}),B>0&&e.jsxs("span",{className:B>1?"text-amber-400/60":"text-white/30",children:["LBT:",B]}),null!=s.snr&&e.jsxs("span",{className:"text-white/30",children:[s.snr.toFixed(0),"dB"]})]}),P>0&&e.jsx("div",{className:"pt-0.5",children:e.jsx(qe,{path:H,localHash:n})})]})]})]})});function tt(e){if(e.contact_type){const t=e.contact_type.toLowerCase();if("repeater"===t||"rep"===t)return!0;if("companion"===t||"client"===t||"cli"===t)return!1;if("room server"===t||"room_server"===t||"room"===t||"server"===t)return!1}return!0===e.is_repeater||(e.is_repeater,!1)}const st=s.lazy(()=>le(()=>import("./PathMapMapLibre-CFZlE15b.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21])));function at(e){return`${(100*e).toFixed(0)}%`}function nt(e,t){const s=document.documentElement,a=getComputedStyle(s),n={success:a.getPropertyValue("--accent-success").trim()||"#39D98A",secondary:a.getPropertyValue("--accent-secondary").trim()||"#F9D26F",poor:a.getPropertyValue("--signal-poor").trim()||"#FF8A5C",danger:a.getPropertyValue("--accent-danger").trim()||"#FF5C7A",muted:a.getPropertyValue("--text-muted").trim()||"#767688"};let r;return r=0===t?n.muted:e>=1?n.success:e>=.5?n.secondary:e>=.25?n.poor:e>0?n.danger:n.muted,{color:r}}class rt extends s.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}render(){return this.state.hasError?e.jsxs("div",{className:"h-[200px] flex items-center justify-center text-text-muted",children:[e.jsx(xe,{className:"w-4 h-4 mr-2"}),"Map failed to load"]}):this.props.children}}function it({path:a,neighbors:n,localNode:r,localHash:i,srcHash:l,dstHash:c,neighborAffinity:o,prefixLookup:d,hubNodes:x,traceSnr:m,advertiserSource:h}){const[p,u]=s.useState(null),g=s.useMemo(()=>{if(!h)return null;const e="wardrive"===h.nodeType;return{prefix:h.prefix||"??",candidates:[{hash:h.publicKey||h.prefix||"source",name:h.name,latitude:h.latitude,longitude:h.longitude,probability:1,isLocal:!1,isWardrive:e}],confidence:1,totalMatches:1,isSource:!0}},[h]),y=s.useMemo(()=>{if(h)return null;if(!l)return null;const e=j(l),t=n[l];if((null==t?void 0:t.latitude)&&(null==t?void 0:t.longitude)&&(0!==t.latitude||0!==t.longitude))return{prefix:e,candidates:[{hash:l,name:t.node_name||t.name||"Source",latitude:t.latitude,longitude:t.longitude,probability:1,isLocal:!1,isDirectNeighbor:!0===t.zero_hop}],confidence:1,totalMatches:1,isSource:!0};const s=(null==t?void 0:t.node_name)||(null==t?void 0:t.name)||l.slice(0,8);return{prefix:e,candidates:[{hash:l,name:s,latitude:0,longitude:0,probability:1,isLocal:!1}],confidence:1,totalMatches:1,isSource:!0}},[h,l,n]),b=s.useMemo(()=>{const e=(null==c?void 0:c.startsWith("0x"))?c.slice(2):c;if((!e||"00"===e||"0000000000000000"===e)&&r&&i){const e=j(i),t=0!==r.latitude||0!==r.longitude;return{prefix:e,candidates:[{hash:i,name:r.name||"Local Node",latitude:t?r.latitude:0,longitude:t?r.longitude:0,probability:1,isLocal:!0}],confidence:1,totalMatches:1,isDestination:!0}}if(!c)return null;const t=j(c);if(i&&c===i&&r){const e=0!==r.latitude||0!==r.longitude;return{prefix:t,candidates:[{hash:c,name:r.name||"Local Node",latitude:e?r.latitude:0,longitude:e?r.longitude:0,probability:1,isLocal:!0}],confidence:1,totalMatches:1,isDestination:!0}}const s=n[c];if((null==s?void 0:s.latitude)&&(null==s?void 0:s.longitude)&&(0!==s.latitude||0!==s.longitude))return{prefix:t,candidates:[{hash:c,name:s.node_name||s.name||"Destination",latitude:s.latitude,longitude:s.longitude,probability:1,isLocal:!1,isDirectNeighbor:!0===s.zero_hop}],confidence:1,totalMatches:1,isDestination:!0};const a=(null==s?void 0:s.node_name)||(null==s?void 0:s.name)||c.slice(0,8);return{prefix:t,candidates:[{hash:c,name:a,latitude:0,longitude:0,probability:1,isLocal:!1}],confidence:1,totalMatches:1,isDestination:!0}},[c,n,r,i]),N=s.useMemo(()=>function(e,t,s,a,n,r){if(!e||0===e.length)return{hops:[],overallConfidence:0,hasValidPath:!1};const i=e.length-1,l=e.map((l,c)=>{const o=c===i,d=e.length-c,{candidates:x,totalMatches:m}=function(e,t,s,a,n=!1,r,i,l){const c=function(e){const t={};for(const[s,a]of Object.entries(e))tt(a)&&(t[s]=a);return t}(t);let o;if(i){const t=function(e,t,s){const a=t.toUpperCase(),n=e.get(a);if(!n||0===n.candidates.length)return{hash:null,confidence:0};if(null==s?void 0:s.isLastHop)return{hash:n.bestMatch,confidence:n.confidence};if(1===(null==s?void 0:s.position))return{hash:n.bestMatch,confidence:n.confidence};if((null==s?void 0:s.position)&&n.bestMatchForPosition.has(s.position)){const e=n.bestMatchForPosition.get(s.position),t=Math.max(e.confidence,n.confidence);return{hash:e.hash,confidence:t}}if((null==s?void 0:s.adjacentPrefixes)&&s.adjacentPrefixes.length>0){let e=n.bestMatch,t=0;for(const a of n.candidates){let n=0;for(const e of s.adjacentPrefixes)n+=a.adjacentPrefixCounts.get(e.toUpperCase())||0;const r=a.combinedScore+n/Math.max(1,a.totalAdjacentObservations)*.3;r>t&&(t=r,e=a.hash)}return{hash:e,confidence:n.confidence}}return{hash:n.bestMatch,confidence:n.confidence}}(i,e,{position:l,isLastHop:n});o=t.confidence}const{matches:d,probability:x}=function(e,t,s,a,n=!1){const r=e.toUpperCase(),i=[],l=s&&f(r,s);l&&i.push(s);for(const h of Object.keys(t))f(r,h)&&i.push(h);if(n&&l&&s&&1===i.length)return{matches:i,probability:1,bestMatch:s};if(n&&l&&i.length>1){const e=i.filter(e=>e!==s);if(1===e.length)return{matches:i,probability:1,bestMatch:e[0]}}const c=i.length>0?1/i.length:0,o=[...i].sort();let d=null,x=-1;if(1===o.length)d=o[0];else if(o.length>1&&a){for(const e of o){const t=a.get(e),s=t?"number"==typeof t?t:t.combinedScore:0;s>x&&(x=s,d=e)}d||(d=o[0])}else o.length>0&&(d=o[0]);let m=c;if(i.length>1&&a&&x>0){let e=0;for(const t of i){const s=a.get(t);e+=s?"number"==typeof s?s:s.combinedScore:0}e>0&&(m=Math.min(.95,x/e))}return{matches:i,probability:m,bestMatch:d}}(e,c,a,r,n),m=d.length,h=[],p=e.toUpperCase(),u=s&&void 0!==s.latitude&&void 0!==s.longitude&&(0!==s.latitude||0!==s.longitude);for(const j of d){if(a&&f(p,a)&&j===a&&u&&s){h.push({hash:j,name:s.name||"Local Node",latitude:s.latitude,longitude:s.longitude,probability:n?1:x,isLocal:!0});continue}const e=c[j];(null==e?void 0:e.latitude)&&(null==e?void 0:e.longitude)&&(0!==e.latitude||0!==e.longitude)&&h.push({hash:j,name:e.node_name||e.name||"Unknown",latitude:e.latitude,longitude:e.longitude,probability:x,isLocal:!1,isDirectNeighbor:!0===e.zero_hop})}const g=h.length;if(1===g)h[0].probability=o??1;else if(g>1)if(void 0!==o&&o>0){h[0].probability=o;const e=1-o,t=g-1;h.slice(1).forEach(s=>{s.probability=e/t})}else{let e=0;const t=h.map(t=>{if(t.isLocal)return{candidate:t,score:1};const a=null==r?void 0:r.get(t.hash);let n=.5;var i;let l;return u&&s&&(n=(i=function(e,t,s,a){const n=(s-e)*Math.PI/180,r=(a-t)*Math.PI/180,i=Math.sin(n/2)*Math.sin(n/2)+Math.cos(e*Math.PI/180)*Math.cos(s*Math.PI/180)*Math.sin(r/2)*Math.sin(r/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371e3}(s.latitude,s.longitude,t.latitude,t.longitude))<100?1:i<500?.9:i<1e3?.7:i<5e3?.5:i<1e4?.3:.1),a?l=.3*n+.3*a.hopConsistencyScore+.4*a.frequencyScore:(l=n,t.isDirectNeighbor&&(l=Math.max(l,.8))),e+=l,{candidate:t,score:l}});if(e>0)t.forEach(({candidate:t,score:s})=>{t.probability=Math.min(.95,s/e)});else{const e=1/g;h.forEach(t=>t.probability=e)}}return{candidates:h,totalMatches:m}}(l,t,s,a,o,n,r,d),h=x.length>0?Math.max(...x.map(e=>e.probability)):0;return{prefix:l,candidates:x,confidence:h,totalMatches:m}}),c=l.reduce((e,t)=>0===t.confidence?0:e*t.confidence,1),o=l.some(e=>e.candidates.length>0);return{hops:l,overallConfidence:c,hasValidPath:o}}(a,n,r,i,o,d),[a,n,r,i,o,d]),v=s.useMemo(()=>{const e=[];g?e.push(g):y&&e.push(y),e.push(...N.hops),b&&e.push(b);const t=e.reduce((e,t)=>0===t.confidence?0:e*t.confidence,1),s=e.some(e=>e.candidates.some(e=>0!==e.latitude||0!==e.longitude));return{hops:e,overallConfidence:t,hasValidPath:s}},[g,y,N,b]);return v.hasValidPath?e.jsxs("div",{className:"h-full flex flex-col space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-text-muted",children:"Path Confidence:"}),e.jsx("span",{className:(w=v.overallConfidence,w>=1?"text-accent-success":w>=.5?"text-accent-secondary":w>=.25?"text-signal-poor":w>0?"text-accent-danger":"text-text-muted"),children:at(v.overallConfidence)}),e.jsx("button",{className:"text-text-muted hover:text-text-secondary transition-colors",title:"Confidence is calculated based on how many known nodes match each path prefix. Multiple matches reduce confidence due to collision probability.",children:e.jsx(oe,{className:"w-3 h-3"})})]}),e.jsxs("div",{className:"flex items-center gap-2 text-[10px]",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-accent-success"}),e.jsx("span",{className:"text-text-muted",children:"Exact"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-accent-secondary"}),e.jsx("span",{className:"text-text-muted",children:"Multi"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("div",{className:"w-2 h-2 rounded-full bg-text-muted"}),e.jsx("span",{className:"text-text-muted",children:"Unknown"})]})]})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:e.jsx(rt,{children:e.jsx(s.Suspense,{fallback:e.jsx("div",{className:"h-full bg-bg-elevated flex items-center justify-center text-text-muted text-sm",children:"Loading map..."}),children:e.jsx(st,{resolvedPath:v,localNode:r,hubNodes:x,hoveredHopIndex:p,onHoverHop:u,traceSnr:m})})})}),e.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:v.hops.map((s,a)=>{var n,r,i;const l=!0===s.isSource,c=!0===s.isDestination,o=p===a;let d;return d=l?`Source: ${(null==(n=s.candidates[0])?void 0:n.name)||"Unknown"}`:c?`Destination: ${(null==(r=s.candidates[0])?void 0:r.name)||"Unknown"}`:0===s.totalMatches?"No matching nodes found":1===s.totalMatches?`Exact match: ${(null==(i=s.candidates[0])?void 0:i.name)||"Unknown"}`:`${s.totalMatches} possible matches (${(100*s.confidence).toFixed(0)}% confidence)`,e.jsxs("div",{className:t("flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer transition-all",o?"bg-accent-primary/20 ring-1 ring-accent-primary/50":"bg-bg-elevated hover:bg-bg-subtle",l&&"border border-accent-success/30",c&&"border border-accent-primary/30"),title:d,onMouseEnter:()=>u(a),onMouseLeave:()=>u(null),children:[l&&e.jsx("span",{className:"text-accent-success text-[8px] mr-0.5",children:"SRC"}),c&&e.jsx("span",{className:"text-accent-primary text-[8px] mr-0.5",children:"DST"}),e.jsx("span",{style:nt(s.confidence,s.totalMatches),children:s.prefix}),!l&&!c&&s.totalMatches>1&&e.jsxs("span",{className:"text-text-muted",children:["×",s.totalMatches]}),!l&&!c&&0===s.totalMatches&&e.jsx("span",{className:"text-text-muted",children:"?"})]},a)})})]}):e.jsxs("div",{className:"flex items-center justify-center text-text-muted text-xs py-4",children:[e.jsx(ce,{className:"w-3.5 h-3.5 mr-1.5 opacity-50"}),"No location data available for path nodes"]});var w}function lt(e){return e.match(/.{1,2}/g)||[]}function ct(e){return null!==e&&e.startsWith("payload:")}const ot={red:"var(--sys-red)",orange:"var(--sys-orange)",amber:"var(--sys-amber)",yellow:"var(--sys-yellow)",lime:"var(--sys-green)",green:"var(--sys-green)",emerald:"var(--sys-green)",teal:"var(--sys-teal)",cyan:"var(--sys-cyan)",sky:"var(--sys-cyan)",blue:"var(--sys-blue)",indigo:"var(--sys-indigo)",violet:"var(--sys-indigo)",purple:"var(--sys-purple)",fuchsia:"var(--sys-pink)",pink:"var(--sys-pink)",rose:"var(--sys-red)",brown:"var(--sys-brown)",zinc:"var(--text-muted)"},dt=15,xt="color-mix(in srgb, var(--bg-elevated) 60%, var(--bg-body))",mt="\n inset 0 0 0 1px color-mix(in srgb, var(--text-primary) 6%, transparent),\n inset 0 1px 0 color-mix(in srgb, white 3%, transparent),\n 0 1px 2px color-mix(in srgb, black 5%, transparent)\n ",ht=2,pt={type:"tween",duration:.25,ease:[.25,.1,.25,1]};function ut(e,t){return e?`inset 0 0 0 ${ht}px ${ot[t]}`:mt}function gt(e,t){return e?t:`color-mix(in srgb, ${t} ${dt}%, transparent)`}function ft({segments:t,selectedSegment:a,onSegmentClick:n}){const[r,i]=s.useState(null),[l,c]=s.useState(null),o=t.some(e=>void 0!==e.id)&&n,d=[];for(const e of t){const t=lt(e.hex);for(const s of t)d.push({byte:s.toUpperCase(),color:e.color,id:e.id})}const x=[];for(let e=0;e{const d=t.length<16;return e.jsx("div",{className:"flex rounded-md overflow-hidden",children:t.map(({byte:s,color:x,id:m},h)=>{const p=h===t.length-1,u=d&&p,g=ot[x],f=m?r===m:l===x,j=Boolean(m&&a===m),y=f||j;return e.jsx("span",{className:"w-[1.75rem] text-xs text-center py-0.5 font-mono select-none "+(o?"cursor-pointer":""),style:{backgroundColor:gt(y,g),color:y?"rgba(255,255,255,0.95)":g,transition:y?"none":"background-color 0.15s ease-out, color 0.15s ease-out",touchAction:"manipulation",...u?{borderRadius:"0 0.375rem 0.375rem 0"}:{}},onMouseEnter:()=>{m?i(m):c(x)},onMouseLeave:()=>{i(null),c(null)},onClick:()=>m&&(null==n?void 0:n(m)),onTouchStart:()=>{m?i(m):c(x)},onTouchEnd:()=>{i(null),c(null)},children:s},h)})},s)})})}function jt({bits:t,field:s,value:a,binary:n}){return e.jsxs("tr",{children:[e.jsx("td",{className:"py-1.5 text-xs text-text-muted tabular-nums",children:t}),e.jsx("td",{className:"py-1.5 text-sm text-text-secondary",children:s}),e.jsx("td",{className:"py-1.5",children:(()=>{if("Payload Type"===s){const t=J[a]||"zinc";return e.jsx(m,{color:t,children:a})}if("Route Type"===s){const t=Y[a]||"zinc";return e.jsx(m,{color:t,children:a})}return e.jsx("span",{className:"text-sm text-text-primary",children:a})})()}),e.jsx("td",{className:"py-1.5 font-mono text-xs text-sys-cyan",children:n})]})}function yt({id:t,title:s,color:a,hexBytes:n,startByte:r,endByte:i,isSelected:l,children:c}){const o=n?lt(n):[];return e.jsxs(N.div,{layout:"position",layoutId:t,transition:pt,className:"w-full min-w-0 overflow-hidden rounded-xl p-4 sm:p-5 space-y-4",style:{backgroundColor:xt,boxShadow:ut(l,a)},children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 min-w-0",children:[e.jsx(m,{color:a,children:s}),o.length>0&&o.length<=16&&o.map((t,s)=>e.jsx(m,{color:a,className:"font-mono",children:t.toUpperCase()},s))]}),e.jsxs("span",{className:"text-[10px] text-text-muted font-mono flex-shrink-0",children:["Bytes ",r,"-",i]})]}),e.jsx("div",{className:"min-w-0 overflow-hidden",children:c})]})}function bt({advert:t,timestamp:s}){const a=k(s||t.timestamp);return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-purple-500/10 dark:bg-purple-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-purple) 0%, var(--sys-blue) 100%)"},children:e.jsx(H,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:t.name||"Unknown Node"}),e.jsx("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:t.nodeType})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-2",children:[void 0!==t.latitude&&void 0!==t.longitude&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(ce,{className:"w-4 h-4 text-purple-600 dark:text-purple-400 flex-shrink-0"}),e.jsxs("span",{className:"text-sm text-text-secondary font-mono",children:[t.latitude.toFixed(5),"°, ",t.longitude.toFixed(5),"°"]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{className:"w-4 h-4 text-purple-600 dark:text-purple-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]})]})]})})}function Nt({decoded:t,timestamp:s}){const a=s?k(s):"Unknown";return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-teal-500/10 dark:bg-teal-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-teal) 0%, var(--sys-cyan) 100%)"},children:e.jsx(fe,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:t.channelName||"Channel Data"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:[t.dataLength," bytes • ",t.decrypted?"Decrypted":"Encrypted"]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(he,{className:"w-4 h-4 text-teal-600 dark:text-teal-400 flex-shrink-0"}),e.jsxs("span",{className:"text-sm text-text-secondary font-sans",children:["Channel: ",e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{className:"w-4 h-4 text-teal-600 dark:text-teal-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]}),t.decrypted&&t.decryptedHex&&e.jsxs("div",{className:"mt-2 pt-2 border-t border-black/10 dark:border-white/10",children:[e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mb-1 font-sans",children:"Decrypted Data"}),e.jsx("div",{className:"max-w-full overflow-x-auto",children:e.jsx(ne,{size:"compact",copy:!0,className:"inline-block",children:e.jsx("span",{className:"break-all text-xs",children:t.decryptedHex.toUpperCase()})})})]})]})]})})}function vt({decoded:t,timestamp:a,isLoading:n=!1,onDecrypted:r}){const i=a?k(a):"Unknown",[l,c]=s.useState(""),[o,d]=s.useState(!1),[m,h]=s.useState(null),[p,u]=s.useState(!1),g=s.useCallback(async()=>{if(l.trim()&&t.ciphertextHex&&t.macHex){d(!0),h(null);try{const e=parseInt(t.channelHash,16),s=x(t.macHex),a=x(t.ciphertextHex),n=await S(l.trim(),e,s,a);if(n.success){const e=n.result.plaintext,s=new TextDecoder("utf-8",{fatal:!1}).decode(e.slice(5)),a=s.indexOf(": "),i={...t,channelName:n.result.channelName,decrypted:!0,timestamp:e[0]|e[1]<<8|e[2]<<16|e[3]<<24,flags:e[4],senderName:a>0?s.slice(0,a):void 0,text:a>0?s.slice(a+2):s};null==r||r(i),c(""),u(!1)}else h(n.error)}catch(e){h(e instanceof Error?e.message:"Unknown error")}finally{d(!1)}}},[l,t,r]);return n?e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-xl p-4 sm:p-5",style:{backgroundColor:"color-mix(in srgb, var(--bg-elevated) 60%, var(--bg-body))",boxShadow:"\n inset 0 0 0 1px color-mix(in srgb, var(--text-primary) 6%, transparent),\n inset 0 1px 0 color-mix(in srgb, white 3%, transparent),\n 0 1px 2px color-mix(in srgb, black 5%, transparent)\n "},children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3 h-[15px]",children:[e.jsx("div",{className:"h-2.5 w-12 rounded bg-white/[0.08] animate-pulse"}),e.jsx("div",{className:"h-2.5 w-16 rounded bg-white/[0.08] animate-pulse"})]}),e.jsx("div",{className:"inline-block max-w-[85%] px-3.5 py-2 rounded-2xl rounded-tl-md",style:{background:"color-mix(in srgb, var(--sys-blue) 30%, transparent)"},children:e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"h-3.5 w-48 rounded bg-white/[0.15] animate-pulse"}),e.jsx("div",{className:"h-3.5 w-32 rounded bg-white/[0.15] animate-pulse"})]})})]})}):t.decrypted?e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-xl p-4 sm:p-5",style:{backgroundColor:"color-mix(in srgb, var(--bg-elevated) 60%, var(--bg-body))",boxShadow:"\n inset 0 0 0 1px color-mix(in srgb, var(--text-primary) 6%, transparent),\n inset 0 1px 0 color-mix(in srgb, white 3%, transparent),\n 0 1px 2px color-mix(in srgb, black 5%, transparent)\n "},children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[t.senderName&&e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:["From ",e.jsx("span",{className:"text-text-secondary font-medium",children:t.senderName})]}),t.channelName&&e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:["in ",e.jsx("span",{className:"text-sys-cyan font-medium",children:t.channelName})]})]}),e.jsx("div",{className:"inline-block max-w-[85%] px-3.5 py-2 rounded-2xl rounded-tl-md",style:{background:"linear-gradient(135deg, var(--sys-blue) 0%, color-mix(in srgb, var(--sys-blue) 85%, var(--sys-cyan)) 100%)"},children:e.jsx("p",{className:"text-sm text-white font-sans leading-relaxed whitespace-pre-wrap break-words",children:t.text})})]})}):e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-zinc-500/10 dark:bg-zinc-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-zinc) 0%, color-mix(in srgb, var(--sys-zinc) 70%, black) 100%)"},children:e.jsx(Ce,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:t.isPublicHashChannel?"Public Hash Channel":"Encrypted Message"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:["Channel hash: ",e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{className:"w-4 h-4 text-zinc-500 dark:text-zinc-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:i})]}),t.ciphertextHex&&t.macHex&&e.jsx("div",{className:"space-y-2",children:p?e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"text",value:l,onChange:e=>c(e.target.value),placeholder:"Channel name (e.g. south-bay)",className:"flex-1 px-3 py-1.5 text-sm rounded-lg bg-black/20 border border-white/10 text-text-primary placeholder:text-text-muted focus:outline-none focus:border-zinc-500",onKeyDown:e=>"Enter"===e.key&&g(),disabled:o}),e.jsx("button",{onClick:g,disabled:o||!l.trim(),className:"px-3 py-1.5 text-sm font-medium rounded-lg bg-zinc-600 hover:bg-zinc-500 text-white disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:o?"Testing...":"Try"}),e.jsx("button",{onClick:()=>{u(!1),h(null),c("")},className:"px-2 py-1.5 text-sm rounded-lg hover:bg-white/10 text-text-muted transition-colors",children:"×"})]}),m&&e.jsx("p",{className:"text-xs text-red-400",children:m})]}):e.jsx("button",{onClick:()=>u(!0),className:"text-xs text-zinc-400 hover:text-zinc-300 underline underline-offset-2 transition-colors",children:"Know the channel name? Try to decrypt"})}),!p&&e.jsx("p",{className:"text-xs text-text-muted",children:t.isPublicHashChannel?"Public hash channel message. Key not in common channel list.":"Unknown hash channel. Channel name required for decryption."})]})]})})}function wt({decoded:t,timestamp:s}){const a=s?k(s):"Unknown";return e.jsxs("div",{className:"mb-4 flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center shadow-md",style:{background:"linear-gradient(135deg, var(--sys-green) 0%, var(--sys-teal) 100%)"},children:e.jsx(ge,{className:"w-5 h-5 text-white"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-semibold text-text-primary font-sans",children:"Acknowledgment"}),e.jsxs("p",{className:"text-xs text-text-muted font-sans mt-0.5",children:["CRC: ",e.jsxs("span",{className:"font-mono text-sys-green",children:["0x",t.crc]})," · ",a]})]})]})}function kt({decoded:t,timestamp:s}){const a=s?k(s):"Unknown",n=t.path.length;return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-amber-500/10 dark:bg-amber-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-amber) 0%, var(--sys-orange) 100%)"},children:e.jsx(pe,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:"Path Response"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:[n," ",1===n?"hop":"hops"]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{className:"w-4 h-4 text-amber-600 dark:text-amber-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]}),t.path.length>0&&e.jsx("div",{className:"mt-2 pt-2 border-t border-black/10 dark:border-white/10",children:e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:t.path.map((t,s)=>e.jsxs("div",{className:"flex items-center gap-2",children:[s>0&&e.jsx(ve,{className:"w-4 h-4 text-amber-500 dark:text-amber-400"}),e.jsx(m,{color:"amber",className:"font-mono",children:t})]},s))})})]})]})})}function Ct({decoded:t,timestamp:s}){const a=s?k(s):"Unknown",n=t.pathHashes.length,r=t.snrValues.length;return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-blue-500/10 dark:bg-blue-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-blue) 0%, var(--sys-indigo) 100%)"},children:e.jsx(ue,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("h3",{className:"text-lg font-medium text-text-primary truncate leading-tight",children:["Trace ",t.isComplete?"Complete":"In Progress"]}),e.jsxs("p",{className:"text-sm text-text-muted mt-0.5",children:["Tag: 0x",t.traceTag.slice(0,8),t.isComplete&&" • ✓"]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{className:"w-4 h-4 text-blue-600 dark:text-blue-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary",children:a})]}),e.jsxs("div",{className:"flex items-center gap-4 text-xs text-text-muted",children:[e.jsxs("span",{children:[n," target ",1===n?"hop":"hops"]}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:[r," SNR ",1===r?"sample":"samples"]}),0!==t.authCode&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"•"}),e.jsxs("span",{children:["Auth: ",t.authCode]})]})]}),t.pathHashes.length>0&&e.jsx("div",{className:"flex flex-wrap items-center gap-2 pt-1",children:t.pathHashes.map((s,a)=>{const n=t.snrValues[a],r=void 0!==n?(e=>e>=7?"green":e>=0?"yellow":e>=-5?"orange":"red")(n):"zinc",i=void 0!==n;return e.jsxs("div",{className:"flex items-center gap-2",children:[a>0&&e.jsx(ve,{className:"w-4 h-4 text-blue-500 dark:text-blue-400 flex-shrink-0"}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(m,{color:i?"blue":"zinc",className:"font-mono",children:s}),i&&e.jsxs(m,{color:r,className:"font-mono",children:[n>=0?"+":"",Number.isInteger(n)?n:n.toFixed(1),"dB"]})]})]},a)})})]})]})})}function St({decoded:t,timestamp:s}){const a=s?k(s):"Unknown";return t.encrypted?e.jsxs("div",{className:"mb-4 flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center shadow-md",style:{background:"linear-gradient(135deg, var(--sys-purple) 0%, var(--sys-indigo) 100%)"},children:e.jsx(Ce,{className:"w-5 h-5 text-white"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-semibold text-text-primary font-sans",children:"Encrypted Message"}),e.jsxs("p",{className:"text-xs text-text-muted font-sans mt-0.5",children:[t.srcHash," → ",t.destHash," · ",a]})]})]}):e.jsxs("div",{className:"mb-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1.5 px-1",children:[e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:[e.jsx("span",{className:"font-mono text-text-secondary",children:t.srcHash})," → ",e.jsx("span",{className:"font-mono text-text-secondary",children:t.destHash})]}),e.jsxs("span",{className:"text-[11px] text-text-muted font-sans",children:["· ",a]})]}),e.jsx("div",{className:"inline-block max-w-[85%] px-3.5 py-2 rounded-2xl rounded-tr-md ml-auto",style:{background:"linear-gradient(135deg, var(--sys-green) 0%, var(--sys-teal) 100%)"},children:e.jsx("p",{className:"text-sm text-white font-sans leading-relaxed whitespace-pre-wrap break-words",children:t.text})})]})}function Ht({decoded:t,timestamp:s}){const a=s?k(s):"Unknown",n=(t.partNumber+1)/t.totalParts*100;return e.jsx("div",{className:"mb-4",children:e.jsxs("div",{className:"rounded-2xl overflow-hidden bg-yellow-500/10 dark:bg-yellow-400/10",style:{backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"},children:[e.jsxs("div",{className:"px-4 pt-4 pb-3 flex items-center gap-3",children:[e.jsx("div",{className:"w-12 h-12 rounded-xl flex items-center justify-center shadow-lg",style:{background:"linear-gradient(135deg, var(--sys-yellow) 0%, var(--sys-amber) 100%)"},children:e.jsx(me,{className:"w-6 h-6 text-white"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("h3",{className:"text-lg font-semibold text-text-primary font-sans truncate leading-tight",children:"Multipart Segment"}),e.jsxs("p",{className:"text-sm text-text-muted font-sans mt-0.5",children:["Part ",t.partNumber+1," of ",t.totalParts]})]})]}),e.jsx("div",{className:"mx-4 border-t border-black/10 dark:border-white/10"}),e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[e.jsx("div",{children:e.jsx("div",{className:"h-2 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${n}%`,background:"linear-gradient(90deg, var(--sys-yellow), var(--sys-amber))"}})})}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(he,{className:"w-4 h-4 text-yellow-600 dark:text-yellow-400 flex-shrink-0"}),e.jsxs("span",{className:"text-sm text-text-secondary font-sans",children:["Message ID: ",e.jsx("span",{className:"font-mono",children:t.messageId})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(C,{className:"w-4 h-4 text-yellow-600 dark:text-yellow-400 flex-shrink-0"}),e.jsx("span",{className:"text-sm text-text-secondary font-sans",children:a})]})]})]})})}function Pt({decoded:t,timestamp:s,payloadType:a}){const n=s?k(s):"Unknown",r=(()=>{switch(a){case v.REQ:return{icon:P,gradient:"var(--sys-orange), var(--sys-red)",bg:"rgba(249, 115, 22, 0.15)",label:"Request"};case v.RESPONSE:return{icon:Se,gradient:"var(--sys-green), var(--sys-teal)",bg:"rgba(34, 197, 94, 0.15)",label:"Response"};case v.ANON_REQ:return{icon:Ce,gradient:"var(--sys-purple), var(--sys-pink)",bg:"rgba(168, 85, 247, 0.15)",label:"Anonymous Request"};default:return{icon:Z,gradient:"var(--sys-gray), var(--sys-slate)",bg:"rgba(107, 114, 128, 0.15)",label:t.payloadTypeName}}})(),i=r.icon;return e.jsxs("div",{className:"mb-4 flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl flex items-center justify-center shadow-md",style:{background:`linear-gradient(135deg, ${r.gradient})`},children:e.jsx(i,{className:"w-5 h-5 text-white"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-semibold text-text-primary font-sans",children:r.label}),e.jsxs("p",{className:"text-xs text-text-muted font-sans mt-0.5",children:[t.length," bytes · ",n]})]})]})}function Mt({pathHex:t}){if(!t)return null;const s=lt(t);return e.jsx("div",{className:"flex flex-wrap items-center gap-2 py-2",children:s.map((t,s)=>e.jsxs("div",{className:"flex items-center gap-2",children:[s>0&&e.jsx(ve,{className:"w-4 h-4 text-sys-amber flex-shrink-0"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(ne,{size:"compact",copy:!0,children:t.toUpperCase()}),e.jsx("span",{className:"text-[10px] text-text-muted font-sans tabular-nums w-4 text-left",children:s+1})]})]},s))})}function _t({decoded:t,payloadType:s}){const a=w[s]||`TYPE_${s}`;switch(t.type){case"advert":{const s="chat"===t.nodeType?"companion":t.nodeType.replace("_"," "),a=void 0!==t.latitude&&void 0!==t.longitude&&!(0===t.latitude&&0===t.longitude);return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Role:"})," ",s]}),t.name&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Name:"})," ",t.name]}),a&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Location:"})," ",t.latitude.toFixed(4),"°, ",t.longitude.toFixed(4),"°"]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Time:"})," ",k(t.timestamp)]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Flags:"})," ",t.flagsDescription]})]})}case"ack":return e.jsx("div",{className:"text-xs text-text-primary space-y-0.5",children:e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"CRC:"})," 0x",t.crc]})});case"path":return e.jsx("div",{className:"text-xs text-text-primary space-y-1",children:e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Path:"})," ",t.pathString||"(empty)"]})});case"trace":return e.jsxs("div",{className:"text-xs text-text-primary space-y-1",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Tag:"})," 0x",t.traceTag]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Target Path:"})," ",t.pathString||"(empty)"]}),t.snrValues.length>0&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"SNR:"})," ",t.snrValues.map(e=>`${e>=0?"+":""}${Number.isInteger(e)?e:e.toFixed(1)}dB`).join(" → ")]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Status:"})," ",t.isComplete?"✓ Complete":`In progress (${t.snrValues.length}/${t.pathHashes.length})`]})]});case"txt_msg":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Dest:"})," ",t.destHash]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Src:"})," ",t.srcHash]}),t.encrypted?e.jsx("p",{className:"text-text-muted italic",children:"Encrypted content"}):e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Text:"})," ",t.text]})]});case"grp_txt":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Channel:"})," ",t.channelName?e.jsx("span",{className:"text-accent-success",children:t.channelName}):t.isPublicHashChannel?e.jsx("span",{className:"text-accent-secondary",children:"Public Hash Channel"}):e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]}),t.decrypted?e.jsxs(e.Fragment,{children:[t.senderName&&e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"From:"})," ",t.senderName]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Text:"})," ",t.text]})]}):t.isPublicHashChannel?e.jsx("p",{className:"text-text-muted italic",children:"Encrypted (public hash channel)"}):e.jsx("p",{className:"text-text-muted italic",children:"Encrypted (unknown channel)"})]});case"grp_data":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Channel:"})," ",t.channelName?e.jsx("span",{className:"text-sys-teal",children:t.channelName}):e.jsxs("span",{className:"font-mono",children:["0x",t.channelHash]})]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Data:"})," ",t.dataLength," bytes ",t.decrypted?"(decrypted)":"(encrypted)"]})]});case"multipart":return e.jsxs("div",{className:"text-xs text-text-primary space-y-0.5",children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Part:"})," ",t.partNumber+1,"/",t.totalParts]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-text-muted",children:"Message ID:"})," ",t.messageId]})]});default:return e.jsxs("p",{className:"text-xs text-text-secondary",children:[a," (",t.length," bytes)"]})}}const Tt=s.memo(function({packet:t}){var a,n;const r=t.raw_packet||"",i=r.length/2,l=y(),[c,x]=s.useState(null),[h,p]=s.useState(null),[u,g]=s.useState(!1),[f,j]=s.useState(null),w=s.useCallback(e=>{j(t=>t===e?null:e)},[]),C=s.useMemo(()=>function(e){if(!e||e.length<4)return null;const t=I.fromHex(e);if(!t.success||!t.packet)return null;const s=t.packet,a=function(e){const t=3&e,s=e>>2&15,a=e>>6&3;return[{bits:"0-1",field:"Route Type",value:o(t),binary:(3&t).toString(2).padStart(2,"0")},{bits:"2-5",field:"Payload Type",value:d(s),binary:(15&s).toString(2).padStart(4,"0")},{bits:"6-7",field:"Version",value:a.toString(),binary:(3&a).toString(2).padStart(2,"0")}]}(s.header),n=e.slice(0,2);let r=2,i="";s.hasTransportCodes()&&(i=e.slice(2,10),r=10);const l=e.slice(r,r+2),c=r+2,x=c+2*s.pathLen,m=e.slice(c,x),h=e.slice(x),p=V(s);return{packet:s,headerHex:n,headerFields:a,transportCodesHex:i,pathLengthHex:l,pathDataHex:m,payloadHex:h,payloadStartByte:Math.floor(x/2),decoded:p}}(r),[r]),S=null==(a=null==C?void 0:C.packet)?void 0:a.payloadType,H=(null==C?void 0:C.payloadHex)||"",P=null==(n=null==C?void 0:C.packet)?void 0:n.payload,M=S===v.GRP_TXT,_=S===v.GRP_DATA,T=M&&(!l||u);if(s.useEffect(()=>{if(x(null),g(!1),!M||!P||P.length<4)return;if(!l)return void g(!0);g(!0);let e=!1;return Q(P).then(t=>{e||(x(t),g(!1))}),()=>{e=!0}},[H,M,l]),s.useEffect(()=>{if(p(null),!_||!P||P.length<4)return;if(!l)return;let e=!1;return W(P).then(t=>{e||p(t)}),()=>{e=!0}},[H,_,l]),!C||0===r.length)return e.jsx("div",{className:"p-4 text-center text-text-muted",children:e.jsx("p",{className:"text-sm",children:"No raw packet data available"})});const{packet:B}=C;let F=C.decoded;c&&"grp_txt"===C.decoded.type?F=c:h&&"grp_data"===C.decoded.type&&(F=h);const L=s.useMemo(()=>function(t,s){switch(t.type){case"advert":return function(t,s){const a=[];let n=0;const r=s.slice(0,64);a.push({id:"payload:publicKey",title:"Public Key",color:"pink",hex:r,startByte:n,endByte:n+31,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:t.publicKey.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Ed25519 public key (32 bytes)"})]})}),n+=32;const i=s.slice(64,72);a.push({id:"payload:timestamp",title:"Timestamp",color:"orange",hex:i,startByte:n,endByte:n+3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:i.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:[t.timestamp," (",k(t.timestamp),")"]})]})}),n+=4;const l=s.slice(72,200);a.push({id:"payload:signature",title:"Signature",color:"teal",hex:l,startByte:n,endByte:n+63,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:t.signature.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Ed25519 signature (64 bytes)"})]})}),n+=64;const c=s.slice(200,202);if(a.push({id:"payload:flags",title:"Flags",color:"blue",hex:c,startByte:n,endByte:n,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(ne,{size:"standard",copy:!0,children:["0x",t.flags.toString(16).padStart(2,"0").toUpperCase()]}),e.jsx("p",{className:"text-xs text-text-primary mt-1",children:t.flagsDescription}),e.jsxs("p",{className:"text-xs text-text-muted",children:["Node Type: ",t.nodeType]})]})}),n+=1,void 0!==t.latitude){const r=s.slice(2*n,2*n+8);a.push({id:"payload:latitude",title:"Latitude",color:"green",hex:r,startByte:n,endByte:n+3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:r.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:[t.latitude.toFixed(6),"°"]})]})}),n+=4}if(void 0!==t.longitude){const r=s.slice(2*n,2*n+8);a.push({id:"payload:longitude",title:"Longitude",color:"purple",hex:r,startByte:n,endByte:n+3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:r.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:[t.longitude.toFixed(6),"°"]})]})}),n+=4}if(t.name){const r=s.slice(2*n),i=r.length/2;a.push({id:"payload:name",title:"Name",color:"amber",hex:r,startByte:n,endByte:n+i-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:r.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:['"',t.name,'"']})]})})}return a}(t,s);case"ack":return function(t,s){return[{id:"payload:crc",title:"CRC",color:"green",hex:s.slice(0,8),startByte:0,endByte:3,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(ne,{size:"standard",copy:!0,children:["0x",t.crc]}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"CRC32 of acknowledged packet"})]})}]}(t,s);case"grp_txt":return function(t,s){const a=[];a.push({id:"payload:channelHash",title:"Channel Hash",color:"blue",hex:s.slice(0,2),startByte:0,endByte:0,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(ne,{size:"standard",copy:!0,children:["0x",t.channelHash]}),t.channelName&&e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:["Channel: ",t.channelName]})]})}),t.macHex&&a.push({id:"payload:mac",title:"MAC",color:"purple",hex:s.slice(2,6),startByte:1,endByte:2,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:t.macHex.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Truncated HMAC-SHA256"})]})});const n=s.slice(6);return n&&a.push({id:"payload:ciphertext",title:t.decrypted?"Message":"Ciphertext",color:t.decrypted?"green":"zinc",hex:n,startByte:3,endByte:3+n.length/2-1,decoded:t.decrypted?e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-primary",children:['"',t.text,'"']}),t.senderName&&e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:["From: ",t.senderName]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:n.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"AES-128-ECB encrypted"})]})}),a}(t,s);case"grp_data":return function(t,s){const a=[];a.push({id:"payload:channelHash",title:"Channel Hash",color:"blue",hex:s.slice(0,2),startByte:0,endByte:0,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(ne,{size:"standard",copy:!0,children:["0x",t.channelHash]}),t.channelName&&e.jsxs("p",{className:"text-xs text-text-primary mt-1",children:["Channel: ",t.channelName]})]})}),t.macHex&&a.push({id:"payload:mac",title:"MAC",color:"purple",hex:s.slice(2,6),startByte:1,endByte:2,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:t.macHex.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Truncated HMAC-SHA256"})]})});const n=s.slice(6);return n&&a.push({id:"payload:ciphertext",title:t.decrypted?"Decrypted Data":"Encrypted Data",color:t.decrypted?"green":"zinc",hex:n,startByte:3,endByte:3+n.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:(t.decryptedHex||n).toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[t.dataLength," bytes",t.decrypted?"":" (AES-128-ECB encrypted)"]})]})}),a}(t,s);case"path":return function(t,s){return[{id:"payload:path",title:"Path Hops",color:"amber",hex:s,startByte:0,endByte:s.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1",children:t.path.map((t,s)=>e.jsxs("span",{className:"flex items-center gap-1",children:[s>0&&e.jsx(ve,{className:"w-3 h-3 text-text-muted"}),e.jsx(m,{color:"amber",className:"font-mono",children:t})]},s))}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[t.path.length," hops"]})]})}]}(t,s);case"trace":return function(t,s){const a=[];a.push({id:"payload:crc",title:"Trace Tag",color:"blue",hex:s.slice(0,8),startByte:0,endByte:3,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(ne,{size:"standard",copy:!0,children:["0x",t.traceTag]}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Unique trace request identifier"})]})}),a.push({id:"payload:mac",title:"Auth Code",color:"purple",hex:s.slice(8,16),startByte:4,endByte:7,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:t.authCode}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Authentication/verification code"})]})}),a.push({id:"payload:flags",title:"Flags",color:"amber",hex:s.slice(16,18),startByte:8,endByte:8,decoded:e.jsxs(e.Fragment,{children:[e.jsxs(ne,{size:"standard",copy:!0,children:["0x",t.flags.toString(16).toUpperCase().padStart(2,"0")]}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:0===t.flags?"No flags set":`Flags: ${t.flags.toString(2).padStart(8,"0")}b`})]})});const n=s.slice(18);if(n){const s=e=>e>=7?"green":e>=0?"yellow":e>=-5?"orange":"red";a.push({id:"payload:path",title:"Target Path",color:"indigo",hex:n,startByte:9,endByte:9+n.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1",children:t.pathHashes.map((a,n)=>{const r=t.snrValues[n],i=void 0!==r?s(r):"zinc";return e.jsxs("span",{className:"flex items-center gap-1",children:[n>0&&e.jsx(ve,{className:"w-3 h-3 text-text-muted"}),e.jsx(m,{color:"indigo",className:"font-mono",children:a}),void 0!==r&&e.jsxs(m,{color:i,className:"font-mono",children:[r>=0?"+":"",Number.isInteger(r)?r:r.toFixed(1),"dB"]})]},n)})}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[t.pathHashes.length," target ",1===t.pathHashes.length?"hop":"hops",t.snrValues.length>0&&` • ${t.snrValues.length} SNR ${1===t.snrValues.length?"value":"values"} collected`,t.isComplete&&" • ✓ Complete"]})]})})}return a}(t,s);case"multipart":return function(t,s){const a=[];a.push({id:"payload:msgId",title:"Message ID",color:"blue",hex:s.slice(0,4),startByte:0,endByte:1,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:t.messageId.toUpperCase()}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"Unique message identifier"})]})}),a.push({id:"payload:partNum",title:"Part Number",color:"amber",hex:s.slice(4,6),startByte:2,endByte:2,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:t.partNumber}),e.jsx("p",{className:"text-xs text-text-muted mt-1",children:"0-indexed part number"})]})}),a.push({id:"payload:totalParts",title:"Total Parts",color:"orange",hex:s.slice(6,8),startByte:3,endByte:3,decoded:e.jsxs(e.Fragment,{children:[e.jsx(ne,{size:"standard",copy:!0,children:t.totalParts}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:["Part ",t.partNumber+1," of ",t.totalParts]})]})});const n=s.slice(8);return n&&a.push({id:"payload:partData",title:"Part Data",color:"cyan",hex:n,startByte:4,endByte:4+n.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:n.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[n.length/2," bytes"]})]})}),a}(t,s);default:return[{id:"payload:ciphertext",title:"Raw Data",color:"zinc",hex:s,startByte:0,endByte:s.length/2-1,decoded:e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"text-[11px] text-text-secondary break-all p-2 rounded bg-bg-body/50 font-mono",children:s.toUpperCase()}),e.jsxs("p",{className:"text-xs text-text-muted mt-1",children:[s.length/2," bytes"]})]})}]}}(F,C.payloadHex),[F,C.payloadHex]),z="payload"===f||ct(f),D=s.useMemo(()=>{const e=[{id:"header",hex:C.headerHex,color:"red"},...C.transportCodesHex?[{id:"transportCodes",hex:C.transportCodesHex,color:"purple"}]:[],{id:"pathLength",hex:C.pathLengthHex,color:"green"},...C.pathDataHex?[{id:"pathData",hex:C.pathDataHex,color:"amber"}]:[]];return z?[...e,...(t=L,t.map(e=>({id:e.id,hex:e.hex,color:e.color})))]:[...e,{id:"payload",hex:C.payloadHex,color:"cyan"}];var t},[C,z,L]);return e.jsxs("div",{className:"font-mono space-y-2 min-w-0 overflow-hidden",children:[(()=>{switch(F.type){case"advert":return e.jsx(bt,{advert:F,timestamp:t.timestamp});case"grp_data":return e.jsx(Nt,{decoded:F,timestamp:t.timestamp});case"grp_txt":return e.jsx(vt,{decoded:F,timestamp:t.timestamp,isLoading:T,onDecrypted:x});case"ack":return e.jsx(wt,{decoded:F,timestamp:t.timestamp});case"path":return e.jsx(kt,{decoded:F,timestamp:t.timestamp});case"trace":return e.jsx(Ct,{decoded:F,timestamp:t.timestamp});case"txt_msg":return e.jsx(St,{decoded:F,timestamp:t.timestamp});case"multipart":return e.jsx(Ht,{decoded:F,timestamp:t.timestamp});case"generic":return B.payloadType===v.REQ||B.payloadType===v.RESPONSE||B.payloadType===v.ANON_REQ?e.jsx(Pt,{decoded:F,timestamp:t.timestamp,payloadType:B.payloadType}):null;default:return null}})(),e.jsx("div",{className:"bg-black rounded-2xl p-6",children:e.jsx(ft,{segments:D,selectedSegment:f,onSegmentClick:w})}),e.jsx(b,{children:e.jsx(N.div,{layout:!0,transition:pt,className:"space-y-2 min-w-0",children:(()=>{var t,s,a,n;const r=[{id:"header",title:"Header",color:"red",startByte:0,endByte:0,hexBytes:`0x${C.headerHex.toUpperCase()}`,condition:!0,content:e.jsxs("table",{className:"w-full text-left",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-[10px] uppercase tracking-wide text-text-muted border-b border-border-subtle font-sans",children:[e.jsx("th",{className:"py-1 font-medium",children:"Bits"}),e.jsx("th",{className:"py-1 font-medium",children:"Field"}),e.jsx("th",{className:"py-1 font-medium",children:"Value"}),e.jsx("th",{className:"py-1 font-medium",children:"Binary"})]})}),e.jsx("tbody",{children:C.headerFields.map(t=>e.jsx(jt,{...t},t.bits))})]})},{id:"transportCodes",title:"Transport Codes",color:"purple",startByte:1,endByte:4,hexBytes:(null==(t=C.transportCodesHex)?void 0:t.toUpperCase())||"",condition:!!C.transportCodesHex,content:e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-xs text-text-muted",children:"Two 16-bit transport codes for encrypted routing"}),e.jsxs("div",{className:"mt-1 text-xs text-text-secondary",children:["Code 1: 0x",null==(s=C.transportCodesHex)?void 0:s.slice(0,4).toUpperCase()," | Code 2: 0x",null==(a=C.transportCodesHex)?void 0:a.slice(4,8).toUpperCase()]})]})},{id:"pathLength",title:"Path Length",color:"green",startByte:C.transportCodesHex?5:1,endByte:C.transportCodesHex?5:1,hexBytes:`0x${C.pathLengthHex.toUpperCase()}`,condition:!0,content:e.jsxs("p",{className:"text-xs text-text-muted pt-1",children:[B.pathLen," bytes showing route taken (increases as packet floods)"]})},{id:"pathData",title:"Path Data",color:"amber",startByte:C.transportCodesHex?6:2,endByte:(C.transportCodesHex?5:1)+B.pathLen,hexBytes:(null==(n=C.pathDataHex)?void 0:n.toUpperCase())||"",condition:B.pathLen>0,content:e.jsxs("div",{className:"space-y-3",children:[e.jsx(Mt,{pathHex:C.pathDataHex}),e.jsx("p",{className:"text-xs text-text-muted",children:"Historical route taken (bytes are added as packet floods through network)"})]})},{id:"payload",title:"Payload",color:"cyan",startByte:C.payloadStartByte,endByte:i-1,hexBytes:C.payloadHex.toUpperCase(),condition:!0,content:e.jsxs(e.Fragment,{children:[!ct(f)&&e.jsxs("div",{className:"p-3 rounded-lg bg-black",children:[e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mb-1.5 font-sans",children:"Decoded"}),e.jsx(_t,{decoded:F,payloadType:B.payloadType})]}),!ct(f)&&L.length>0&&e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted mt-3 font-sans",children:"Click a field below to highlight its bytes"}),ct(f)&&e.jsx("p",{className:"text-[10px] uppercase tracking-wide text-text-muted font-sans",children:"↑ Selected field above • Other fields below ↓"})]})}].filter(e=>e.condition),l=ct(f)?L.find(e=>e.id===f):null,c=ct(f)?[...r].sort((e,t)=>"payload"===e.id?-1:"payload"===t.id?1:0):[...r].sort((e,t)=>e.id===f?-1:t.id===f?1:0),o=ct(f)?L.filter(e=>e.id!==f):[];return e.jsxs(e.Fragment,{children:[l&&e.jsx(yt,{id:`subfield-${l.id}`,title:l.title,color:l.color,startByte:C.payloadStartByte+l.startByte,endByte:C.payloadStartByte+l.endByte,hexBytes:l.hex.toUpperCase(),isSelected:!0,children:l.decoded},l.id),c.map(t=>e.jsx(yt,{id:`section-${t.id}`,title:t.title,color:t.color,startByte:t.startByte,endByte:t.endByte,hexBytes:t.hexBytes,isSelected:t.id===f,children:t.content},t.id)),o.map(t=>e.jsxs(N.div,{layout:"position",layoutId:`subfield-${t.id}`,transition:pt,className:"w-full min-w-0 overflow-hidden rounded-xl p-4 sm:p-5 space-y-4",style:{backgroundColor:xt,boxShadow:mt},children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 min-w-0",children:[e.jsx(m,{color:t.color,children:t.title}),t.hex.length<=32&<(t.hex).map((s,a)=>e.jsx(m,{color:t.color,className:"font-mono",children:s.toUpperCase()},a))]}),e.jsxs("span",{className:"text-[10px] text-text-muted font-mono flex-shrink-0",children:["Bytes ",C.payloadStartByte+t.startByte,"-",C.payloadStartByte+t.endByte]})]}),e.jsx("div",{className:"min-w-0 overflow-hidden p-3 rounded-lg bg-black",children:t.decoded})]},t.id))]})})()})})]})});function Bt(e){if(!e)return[];if(Array.isArray(e))return e;try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Ft(e){return e?(e.startsWith("0x")?e.slice(2):e).slice(0,2).toUpperCase():""}function Lt({hop:a,compact:n=!1,index:r=0,highlightIndex:i=-1,isTrace:l=!1}){var c;const o=r===i,d=Fe();return s.useEffect(()=>{o&&l&&d.start({boxShadow:["0 0 0 0px rgba(113, 156, 223, 0)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 0px rgba(113, 156, 223, 0)"],transition:{duration:.5,times:[0,.2,.7,1],ease:"easeInOut"}})},[o,l,d]),e.jsxs(N.div,{className:t("flex items-center gap-1.5",n?"flex-row":"flex-col"),animate:{scale:o?1.05:1,opacity:o?1:.85},transition:{duration:.3,ease:"easeInOut"},children:[e.jsxs(N.div,{className:t("flex items-center gap-1.5 px-2.5 py-1 rounded-md","font-mono text-xs font-semibold",a.isLocal?"bg-amber-500/20 text-amber-300 ring-1 ring-amber-500/30":"bg-zinc-700/50 text-zinc-200 ring-1 ring-zinc-600/50"),animate:d,initial:{boxShadow:"0 0 0 0px rgba(113, 156, 223, 0)"},children:[a.isLocal&&e.jsx(je,{className:"w-3 h-3"}),e.jsx("span",{children:a.prefix}),void 0!==a.confidence&&a.confidence<.9&&e.jsxs("span",{className:"text-[9px] opacity-70",children:[(100*a.confidence).toFixed(0),"%"]})]}),!n&&(null==(c=a.neighborInfo)?void 0:c.name)&&e.jsx("span",{className:"text-[10px] text-text-muted truncate max-w-[80px]",children:a.neighborInfo.name})]})}function zt({snr:t}){const s=be(t),a=ye()[s]||"#6b7280",n=Number.isInteger(t)?t.toString():t.toFixed(1);return e.jsxs(m,{customColor:a,compact:!0,className:"font-mono",children:[t>=0?"+":"",n,"dB"]})}function Dt({hops:a,compact:n,isTrace:r=!1}){const[i,l]=s.useState(-1);return s.useEffect(()=>{if(0===a.length)return;const e=setTimeout(()=>{l(0)},400),t=setInterval(()=>{l(e=>{const s=e+1;return s>=a.length?(clearInterval(t),-1):s})},r?500:600);return()=>{clearTimeout(e),clearInterval(t)}},[a.length,r]),e.jsx("div",{className:"p-6",style:{display:"grid",gridTemplateColumns:"1fr auto 1fr",gap:"4px 8px"},children:a.map((s,l)=>{const c=l%2==0,o=l===a.length-1;return e.jsxs("div",{className:"contents",children:[e.jsx("div",{className:t("flex items-center","justify-end"),children:c&&e.jsx(Lt,{hop:s,compact:n,index:l,highlightIndex:i,isTrace:r})}),e.jsx("div",{className:"flex flex-col items-center justify-center min-h-[28px]",children:!o&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-px flex-1 bg-zinc-600/40 min-h-[8px]"}),void 0!==s.snr&&e.jsx(zt,{snr:s.snr}),e.jsx("svg",{className:"w-3 h-3 text-zinc-500 flex-shrink-0",viewBox:"0 0 12 12",fill:"none",children:e.jsx("path",{d:"M6 2v8M3 7l3 3 3-3",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]})}),e.jsx("div",{className:t("flex items-center","justify-start"),children:!c&&e.jsx(Lt,{hop:s,compact:n,index:l,highlightIndex:i,isTrace:r})})]},`${s.prefix}-${l}`)})})}const At=s.memo(function({packet:a,neighbors:n,localHash:r,neighborAffinity:i,ghostPrefixes:l,direction:c="horizontal",compact:o=!1,traceSnr:d,overridePath:x}){const m=void 0!==d&&d.length>0,h=Bt(a.original_path),p=Bt(a.forwarded_path),u=x??(p.length>0?p:h),g=Ft(r),f=s.useMemo(()=>u.map((e,t)=>{const s=e.toUpperCase(),a=s===g,r=(null==l?void 0:l.has(s))??!1,c=function(e,t,s){const a=e.toUpperCase();if(s){let e=null,n=0;if(s.forEach((t,s)=>{if(Ft(s)===a){const a=t.combinedScore??0;a>n&&(n=a,e=s)}}),e&&t[e])return{hash:e,info:t[e],confidence:n}}for(const[n,r]of Object.entries(t))if(Ft(n)===a)return{hash:n,info:r,confidence:void 0};return null}(s,n,i);return{prefix:s,fullHash:null==c?void 0:c.hash,neighborInfo:null==c?void 0:c.info,isLocal:a,isGhost:r,confidence:null==c?void 0:c.confidence,snr:null==d?void 0:d[t]}}),[u,n,i,g,l,d]);if(0===f.length)return e.jsxs("div",{className:"flex items-center gap-2 text-text-muted text-xs",children:[e.jsx(H,{className:"w-4 h-4 opacity-50"}),e.jsx("span",{children:"Direct / No path data"})]});if("flowchart"===c)return e.jsx(Dt,{hops:f,compact:o,isTrace:m});const j="horizontal"===c?ve:se;return e.jsx("div",{className:t("flex gap-1.5","horizontal"===c?"flex-row flex-wrap items-center":"flex-col items-start"),children:f.map((s,a)=>e.jsxs("div",{className:t("flex items-center gap-1.5","vertical"===c&&"flex-col"),children:[e.jsx(Lt,{hop:s,compact:o}),a0,l=ai&&n(a-1),disabled:!i,className:t("p-0.5 radius-badge transition-base",i?"text-text-muted hover:text-text-primary hover-bg":"text-white/20 cursor-not-allowed"),"aria-label":"Previous observation",children:e.jsx(we,{className:r?"size-3":"size-4"})}),e.jsx("div",{className:"flex items-center gap-0.5",children:s.map((s,i)=>{const l=i===a,c=new Date(1e3*s.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});return e.jsx(A,{color:l?"cyan":"zinc",filled:l,compact:r,onClick:()=>n(i),title:`Observation ${i+1} at ${c}`,className:t("transition-all duration-150",!l&&"opacity-60 hover:opacity-100"),children:r?e.jsx("span",{className:"tabular-nums",children:i+1}):e.jsxs("span",{className:"tabular-nums text-[10px]",children:["#",i+1,null!=s.rssi&&e.jsx("span",{className:"ml-1 opacity-70",children:s.rssi})]})},`${s.timestamp}_${i}`)})}),e.jsx("button",{onClick:()=>l&&n(a+1),disabled:!l,className:t("p-0.5 radius-badge transition-base",l?"text-text-muted hover:text-text-primary hover-bg":"text-white/20 cursor-not-allowed"),"aria-label":"Next observation",children:e.jsx(re,{className:r?"size-3":"size-4"})}),e.jsxs("span",{className:t("text-text-muted ml-1",r?"text-[9px]":"text-[10px]"),children:[e.jsx(ae,{className:"inline size-3 mr-0.5 opacity-50"}),s.length]})]})}function Ut({icon:s,label:a,disabled:n=!1}){return e.jsx(N.div,{className:"flex items-center gap-1 text-[10px]",title:a,animate:{opacity:n?.25:.6},transition:{duration:.15,ease:[.4,0,.2,1]},children:e.jsx("span",{className:t("flex items-center justify-center size-5 radius-badge border-control transition-base",n?"bg-white/[0.02] border-white/5":"bg-white/5"),children:s})})}function $t({hasDuplicates:t,hasPrev:s,hasNext:a,canPrevDupe:n,canNextDupe:r}){return e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx(Ut,{icon:e.jsx(ee,{className:"size-3"}),label:"Previous packet (↑)",disabled:!s}),e.jsx(Ut,{icon:e.jsx(E,{className:"size-3"}),label:"Next packet (↓)",disabled:!a})]}),t&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-px h-3 bg-white/10"}),e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx(Ut,{icon:e.jsx(we,{className:"size-3"}),label:"Previous observation (←)",disabled:!n}),e.jsx(Ut,{icon:e.jsx(re,{className:"size-3"}),label:"Next observation (→)",disabled:!r})]})]})]})}const It=s.memo(function({packets:t,initialIndex:a=0,onClose:n,onNavigatePrev:r,onNavigateNext:i,hasPrev:l=!1,hasNext:c=!1}){const[o,d]=s.useState(a),h=t[o]??t[0],p=t.length>1,f=o>0,j=o{d(Math.max(0,Math.min(e,t.length-1)))},[t.length]);s.useEffect(()=>{const e=e=>{if(!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement))switch(e.key){case"ArrowUp":e.preventDefault(),null==r||r();break;case"ArrowDown":e.preventDefault(),null==i||i();break;case"ArrowLeft":e.preventDefault(),f&&d(e=>e-1);break;case"ArrowRight":e.preventDefault(),j&&d(e=>e+1)}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[r,i,f,j]);const b=M(),w=_(),k=T(),S=B(),P=s.useMemo(()=>new Set(S.map(e=>e.prefix.toUpperCase())),[S]),A=h.payload_type_name||u(h.payload_type??h.type),E=h.route_type_name||g(h.route_type??h.route),R=h.payload_length??h.length??0,U=Et(h.original_path),$=Et(h.forwarded_path),I=U.length>0||$.length>0,V=$.length>0?$:U,Q=s.useMemo(()=>{var e;if(null==(e=null==b?void 0:b.config)?void 0:e.repeater)return{latitude:b.config.repeater.latitude,longitude:b.config.repeater.longitude,name:b.config.node_name||"Local Node"}},[b]),W=(null==b?void 0:b.neighbors)??{},q=k.size>0?k:void 0,Y=h.raw_packet&&h.raw_packet.length>0,Z=s.useMemo(()=>{if((h.payload_type??h.type)!==v.TRACE||!h.payload)return null;try{const e=x(h.payload),t=h.original_path||h.forwarded_path||[];let s=[];if("string"==typeof t)try{const e=JSON.parse(t);Array.isArray(e)&&(s=e.map(e=>parseInt(e,16)))}catch{s=[]}else Array.isArray(t)&&(s=t.map(e=>parseInt(e,16)));return O(e,s)}catch{return null}},[h]),ee=null==Z?void 0:Z.snrValues,te=s.useMemo(()=>{if((h.payload_type??h.type)!==v.ADVERT||!h.payload)return null;try{const e=x(h.payload),t=G(e);if(!t)return null;const s=t.publicKey.slice(0,2).toUpperCase();return{...t,prefix:s}}catch{return null}},[h]),se=s.useMemo(()=>{if((null==te?void 0:te.latitude)&&(null==te?void 0:te.longitude))return{latitude:te.latitude,longitude:te.longitude,name:te.name||`Node ${te.prefix||"??"}`,prefix:te.prefix,publicKey:te.publicKey}},[te]),ae=e=>e&&0!==e?new Date(1e3*e).toLocaleString():"Unknown",ne=F(h.packet_hash),re=s.useMemo(()=>{if((h.payload_type??h.type)!==v.GRP_TXT)return null;if(!(null==ne?void 0:ne.decoded))return null;const e=ne.decoded;return{type:"grp_txt",channelHash:e.channelHash,channelName:e.channelName,text:e.text??"",decrypted:e.decrypted,senderName:e.senderName,timestamp:e.timestamp,flags:e.flags,macCorrupted:e.macCorrupted}},[h,ne]),ie=s.useCallback(e=>{if(!e)return null;const t=e.trim().match(/(-?\d+\.?\d*)\s*[,\s]\s*(-?\d+\.?\d*)/);if(!t)return null;const s=parseFloat(t[1]),a=parseFloat(t[2]);return isNaN(s)||isNaN(a)||s<-90||s>90||a<-180||a>180||0===s&&0===a?null:{lat:s,lon:a}},[]),le=s.useMemo(()=>{var e,t;if(!(null==re?void 0:re.decrypted))return;if(!(null==(e=re.channelName)?void 0:e.toLowerCase().includes("wardrive")))return;const s=ie(re.text);return s?{latitude:s.lat,longitude:s.lon,name:re.senderName||"Wardrive Ping",prefix:(null==(t=re.senderName)?void 0:t.slice(0,2).toUpperCase())||"WD",nodeType:"wardrive"}:void 0},[re,ie]),oe=(h.payload_type??h.type)===v.ADVERT&&(void 0!==se||I),de=void 0!==le,xe=se??le;if(0===V.length)return null;const me=(null==b?void 0:b.local_hash)?(b.local_hash.startsWith("0x")?b.local_hash.slice(2,4):b.local_hash.slice(0,2)).toUpperCase():"";for(const e of V){const t=e.toUpperCase();if(t!==me)if(q){let e=0,s=0;if(q.forEach((a,n)=>{(n.startsWith("0x")?n.slice(2,4):n.slice(0,2)).toUpperCase()===t&&(e++,s=Math.max(s,a.combinedScore??0))}),0===e)for(const a of Object.keys(W))if((a.startsWith("0x")?a.slice(2,4):a.slice(0,2)).toUpperCase()===t)break}else for(const e of Object.keys(W))if((e.startsWith("0x")?e.slice(2,4):e.slice(0,2)).toUpperCase()===t)break}const he={lime:"rgb(132, 204, 22)",cyan:"rgb(34, 211, 238)",amber:"rgb(251, 191, 36)",violet:"rgb(167, 139, 250)",rose:"rgb(251, 113, 133)",emerald:"rgb(52, 211, 153)",sky:"rgb(56, 189, 248)",orange:"rgb(251, 146, 60)",pink:"rgb(244, 114, 182)",zinc:"rgb(161, 161, 170)",purple:"rgb(168, 85, 247)",indigo:"rgb(129, 140, 248)",teal:"rgb(45, 212, 191)",fuchsia:"rgb(232, 121, 249)",blue:"rgb(59, 130, 246)",green:"rgb(34, 197, 94)",yellow:"rgb(250, 204, 21)",red:"rgb(239, 68, 68)"},pe=he[J[A]??"zinc"]||he.zinc;return e.jsxs(L,{open:!0,onClose:n,size:"5xl",motionPlus:!0,className:"sm:h-[85vh] sm:max-h-[800px] md:h-[80vh] md:max-h-[900px]",children:[e.jsxs("div",{className:"sm:hidden",children:[e.jsx("div",{className:"flex justify-center pt-2 pb-1",children:e.jsx("div",{className:"w-9 h-1 rounded-full bg-white/30","aria-hidden":"true"})}),e.jsxs("div",{className:"flex items-center justify-between px-3 pb-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(m,{color:J[A]??"zinc",className:"!text-[9px] !px-1.5 !py-0",children:A}),e.jsx(m,{color:"DIRECT"===E||"T_DIRECT"===E?"cyan":"amber",className:"!text-[9px] !px-1.5 !py-0",children:E}),e.jsxs(m,{color:"zinc",className:"!text-[9px] !px-1.5 !py-0",children:[R,"B"]})]}),e.jsx("button",{onClick:n,className:"px-3 py-1.5 text-[15px] font-medium text-blue-400 active:text-blue-300 transition-base flex-shrink-0 radius-inner active:bg-white/5",children:"Done"})]}),p&&e.jsx("div",{className:"px-3 pb-2",children:e.jsx(Rt,{packets:t,selectedIndex:o,onSelect:y,compact:!0})})]}),e.jsx("div",{className:"hidden sm:block px-6 pt-5 pb-4",children:e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(m,{color:J[A]??"zinc",children:A}),e.jsx(m,{color:"DIRECT"===E||"T_DIRECT"===E?"cyan":"amber",children:E}),e.jsxs(m,{color:"zinc",children:[R,"B"]}),p&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"w-px h-4 bg-white/10"}),e.jsx(Rt,{packets:t,selectedIndex:o,onSelect:y})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx($t,{hasDuplicates:p,hasPrev:l,hasNext:c,canPrevDupe:f,canNextDupe:j}),e.jsx("button",{onClick:n,className:"p-1.5 -m-1.5 text-text-muted hover:text-text-primary transition-base radius-inner hover:bg-bg-elevated flex-shrink-0",children:e.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]})]})}),e.jsx("div",{className:"sm:hidden h-[2px]",style:{backgroundColor:pe,opacity:.6}}),e.jsxs(z,{className:"p-0 overflow-hidden flex-1 flex flex-col min-h-0",children:[e.jsx("div",{className:"md:hidden flex-1 overflow-y-auto overflow-x-hidden",children:e.jsxs("div",{className:"p-2 space-y-2",children:[(null!=h.rssi||null!=h.snr)&&e.jsxs("div",{className:"relative flex items-center justify-between px-2 py-1.5 radius-inner bg-white/[0.03]",children:[e.jsx(D,{mode:"popLayout",initial:!1,children:e.jsxs(N.div,{className:"flex items-center gap-3",initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{duration:.15,ease:[.4,0,.2,1]},children:[e.jsx(K,{rssi:h.rssi,snr:h.snr,compact:!0,showValues:!0}),e.jsx("span",{className:"text-[11px] text-white/50",children:X(h.rssi)})]},o)}),V.length>0&&e.jsxs("span",{className:"text-[10px] font-mono text-white/40",children:[V.length," hop",1!==V.length?"s":""]})]}),(I&&V.length>0||oe||de)&&e.jsx("div",{className:"overflow-hidden radius-inset",children:e.jsx("div",{className:"aspect-[4/3] w-full",children:e.jsx(it,{path:V,neighbors:W,localNode:Q,localHash:null==b?void 0:b.local_hash,srcHash:h.src_hash,dstHash:h.dst_hash,neighborAffinity:q,hubNodes:[...w],traceSnr:ee,advertiserSource:xe})})}),Z&&Z.pathHashes.length>0&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsx("div",{className:"px-3 py-2 space-y-1.5",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[10px] font-medium text-text-muted uppercase tracking-wide",children:"Trace Route"}),e.jsx("div",{className:"flex items-center gap-1.5",children:e.jsx(m,{color:Z.isComplete?"green":"amber",compact:!0,children:Z.isComplete?"Complete":"In Progress"})})]})}),e.jsx(At,{packet:h,neighbors:W,localHash:null==b?void 0:b.local_hash,neighborAffinity:q,ghostPrefixes:P,direction:"flowchart",compact:!0,overridePath:Z.pathHashes,traceSnr:Z.snrValues})]}),I&&!Z&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2",children:[e.jsx("span",{className:"text-[10px] font-medium text-text-muted uppercase tracking-wide",children:"Path"}),e.jsxs(m,{color:"zinc",compact:!0,children:[V.length," hop",1!==V.length?"s":""]})]}),e.jsx(At,{packet:h,neighbors:W,localHash:null==b?void 0:b.local_hash,neighborAffinity:q,ghostPrefixes:P,direction:"flowchart",compact:!0,traceSnr:ee})]}),te&&e.jsxs("div",{className:"radius-inset bg-white/[0.03] overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-white/5",children:[e.jsx("span",{className:"text-[10px] font-medium text-text-muted uppercase tracking-wide",children:"Advertiser Info"}),e.jsx(m,{color:"lime",compact:!0,children:te.nodeType})]}),e.jsxs("div",{className:"p-3 space-y-2",children:[te.name&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_e,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary truncate",children:te.name})]}),te.latitude&&te.longitude&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ce,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[te.latitude.toFixed(5),", ",te.longitude.toFixed(5)]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(He,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-[10px] font-mono text-text-muted truncate",children:[te.publicKey.slice(0,16),"...",te.publicKey.slice(-8)]})]}),te.timestamp>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(C,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-xs text-text-muted",children:ae(te.timestamp)})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(H,{className:"w-3.5 h-3.5 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-[10px] text-text-muted",children:te.flagsDescription||`Flags: 0x${te.flags.toString(16).padStart(2,"0")}`})]})]})]}),Y&&e.jsx("div",{className:"pt-1",children:e.jsx(Tt,{packet:h})})]})}),e.jsxs("div",{className:"hidden md:grid md:grid-cols-2 flex-1 overflow-hidden",children:[e.jsx("div",{className:"overflow-y-auto overflow-x-hidden scrollbar-none p-4 border-r border-border-subtle",children:Y&&e.jsx(Tt,{packet:h})}),e.jsxs("div",{className:"grid overflow-hidden",style:{gridTemplateRows:"minmax(280px, 1fr) auto"},children:[e.jsx("div",{className:"overflow-hidden p-2",children:I&&V.length>0||oe||de?e.jsx("div",{className:"h-full w-full",children:e.jsx(it,{path:V,neighbors:W,localNode:Q,localHash:null==b?void 0:b.local_hash,srcHash:h.src_hash,dstHash:h.dst_hash,neighborAffinity:q,hubNodes:[...w],traceSnr:ee,advertiserSource:xe})}):e.jsxs("div",{className:"h-full w-full flex flex-col items-center justify-center text-center px-4",children:[e.jsx(H,{className:"w-8 h-8 text-text-muted/50 mb-2"}),e.jsx("span",{className:"text-sm text-text-muted",children:"Direct Reception"}),e.jsx("span",{className:"text-xs text-text-muted/70 mt-1",children:"Zero-hop packet — received directly from sender"})]})}),e.jsxs("div",{className:"overflow-y-auto max-h-[200px] p-2 space-y-2",children:[!Z&&V.length<=1&&(null!=h.rssi||null!=h.snr)&&e.jsx("div",{className:"surface-base radius-inset p-4",children:e.jsxs("dl",{className:"text-xs grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-text-muted mb-1",children:"Signal"}),e.jsx(D,{mode:"popLayout",initial:!1,children:e.jsxs(N.dd,{className:"flex items-center gap-2",initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{duration:.15,ease:[.4,0,.2,1]},children:[e.jsx(K,{rssi:h.rssi,snr:h.snr}),e.jsx("span",{className:"font-medium text-text-primary",children:X(h.rssi)})]},o)})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-text-muted mb-1",children:"RF"}),e.jsx(D,{mode:"popLayout",initial:!1,children:e.jsxs(N.dd,{className:"font-mono text-text-secondary tabular-nums",initial:{opacity:0,scale:.96},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.96},transition:{duration:.15,ease:[.4,0,.2,1]},children:[null!=h.rssi&&`${h.rssi} dBm`,null!=h.snr&&` · ${h.snr.toFixed(1)} dB`]},o)})]})]})}),te&&e.jsxs("div",{className:"radius-inset bg-white/[0.03] overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-2 border-b border-white/5",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Advertiser"}),e.jsx(m,{color:"lime",compact:!0,children:te.nodeType})]}),e.jsxs("div",{className:"p-4 space-y-2.5",children:[te.name&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_e,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary truncate",children:te.name})]}),te.latitude&&te.longitude&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ce,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[te.latitude.toFixed(5),", ",te.longitude.toFixed(5)]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(He,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsxs("span",{className:"text-[11px] font-mono text-text-muted truncate",children:[te.publicKey.slice(0,16),"...",te.publicKey.slice(-8)]})]}),te.timestamp>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(C,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-xs text-text-muted",children:ae(te.timestamp)})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(H,{className:"w-4 h-4 text-text-muted flex-shrink-0"}),e.jsx("span",{className:"text-[11px] text-text-muted",children:te.flagsDescription||`Flags: 0x${te.flags.toString(16).padStart(2,"0")}`})]})]})]}),Z&&Z.pathHashes.length>0&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"px-4 py-2 flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Trace Route"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(m,{color:Z.isComplete?"green":"amber",compact:!0,children:Z.isComplete?"Complete":"In Progress"}),e.jsxs(m,{color:"teal",compact:!0,children:[Z.pathHashes.length,"h"]})]})]}),e.jsx(At,{packet:h,neighbors:W,localHash:null==b?void 0:b.local_hash,neighborAffinity:q,ghostPrefixes:P,direction:"flowchart",compact:!0,overridePath:Z.pathHashes,traceSnr:Z.snrValues})]}),I&&!Z&&e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-2",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Path"}),e.jsxs(m,{color:"zinc",compact:!0,children:[V.length,"h"]})]}),e.jsx(At,{packet:h,neighbors:W,localHash:null==b?void 0:b.local_hash,neighborAffinity:q,ghostPrefixes:P,direction:"flowchart",compact:!0,traceSnr:ee})]})]})]})]})]})]})}),Vt={type:"spring",visualDuration:.6,bounce:.25,opacity:{duration:.2,ease:"linear"}};function Ot({value:t,format:a,prefix:n,className:r}){const[i,l]=s.useState("waiting");if(s.useEffect(()=>{const e=setTimeout(()=>{l("mounted")},400);return()=>clearTimeout(e)},[]),s.useEffect(()=>{if("mounted"===i){const e=requestAnimationFrame(()=>{l("animating")});return()=>cancelAnimationFrame(e)}},[i]),"waiting"===i){const t=(0).toLocaleString(void 0,a);return e.jsxs("span",{className:r,children:[n,t]})}return e.jsx(Ne,{className:r,format:a,prefix:n,transition:Vt,children:"animating"===i?t:0})}function Qt({label:t,numericValue:s,unit:a,icon:n,subtext:r,showSign:i=!1}){return e.jsxs("div",{className:"radius-inner p-3 sm:radius-inset sm:p-4 bg-white/[0.03] ring-1 ring-inset ring-white/[0.06]",children:[e.jsx("div",{className:"mb-1.5 sm:mb-2",children:e.jsx("span",{className:"text-[10px] sm:text-[11px] font-medium uppercase tracking-wide text-text-muted",children:t})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ot,{value:s,format:{minimumFractionDigits:1,maximumFractionDigits:1,signDisplay:i?"always":"auto"},className:"font-mono text-xl sm:text-2xl font-semibold tabular-nums tracking-tight text-white"}),e.jsxs("div",{className:"flex flex-col items-center justify-center",children:[e.jsx(n,{className:"w-[14px] h-[14px] text-text-muted"}),a&&e.jsx("span",{className:"text-[10px] sm:text-xs font-medium leading-tight text-text-muted",children:a})]})]}),r&&e.jsx("p",{className:"mt-1.5 sm:mt-2 font-mono text-[10px] sm:text-[11px] text-text-muted/80 truncate",children:r})]})}function Wt({snr:s}){const a=s>=5?"bg-sys-teal":s>=0?"bg-sys-green":s>=-5?"bg-sys-amber":s>=-10?"bg-sys-orange":"bg-sys-red";return e.jsx("span",{className:t("w-1.5 h-1.5 rounded-full flex-shrink-0",a),title:`SNR: ${s.toFixed(1)} dB`})}function Gt({fromPrefix:s,toPrefix:a,fromName:n,toName:r,snr:i,maxSnr:l,isWeakest:c,isStrongest:o,index:d=0}){const x=Math.max(l+5,15),h=Math.max(0,Math.min(100,(i- -20)/(x- -20)*100)),p="bg-[#0074BE]",u=i>=5?"bg-sys-teal":i>=0?"bg-sys-green":i>=-5?"bg-sys-amber":i>=-10?"bg-sys-orange":"bg-sys-red",g=.3+.15*d;return e.jsxs("div",{className:"relative p-3 pl-5 radius-inner bg-white/[0.03] ring-1 ring-inset ring-white/[0.06]",children:[e.jsx("span",{className:t("absolute left-0 top-1/2 -translate-y-1/2 h-4 w-0.5 rounded-full",u)}),e.jsx("span",{className:"absolute -top-0.5 -right-0.5",children:e.jsx(Wt,{snr:i})}),e.jsxs("div",{className:"sm:hidden",children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0 flex-1",children:[e.jsx("span",{className:"text-[13px] font-medium text-white/70 truncate",children:n||s}),e.jsx(ve,{className:"w-3 h-3 text-white/30 flex-shrink-0"}),e.jsx("span",{className:"text-[13px] font-semibold text-white truncate",children:r||a})]}),e.jsxs("div",{className:"flex items-center gap-1.5 ml-2 flex-shrink-0",children:[c&&e.jsx(m,{color:"red",compact:!0,children:"Low"}),o&&!c&&e.jsxs(m,{color:"amber",compact:!0,children:[e.jsx(Me,{className:"w-2.5 h-2.5"}),"Best"]}),e.jsxs("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[12px] font-mono font-bold tabular-nums bg-white/[0.06] text-text-primary ring-1 ring-inset ring-white/[0.1]",children:[i>=0?"+":"−",Math.abs(i).toFixed(1)]})]})]}),e.jsx("div",{className:"h-1.5 bg-white/10 rounded-full overflow-hidden",children:e.jsx(N.div,{className:t("h-full rounded-full",p),initial:{width:0},animate:{width:`${h}%`},transition:{duration:1.5,delay:g,ease:[.25,.1,.25,1]}})})]}),e.jsxs("div",{className:"hidden sm:block",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("code",{className:"font-mono text-xs text-text-muted",children:s}),n&&e.jsx("span",{className:"text-xs text-text-secondary truncate max-w-[100px]",children:n})]}),e.jsx(ve,{className:"w-3 h-3 text-text-muted/40 flex-shrink-0"}),e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("code",{className:"font-mono text-xs font-semibold text-text-primary",children:a}),r&&e.jsx("span",{className:"text-xs text-text-secondary truncate max-w-[100px]",children:r})]})]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[c&&e.jsx(m,{color:"red",compact:!0,children:"Bottleneck"}),o&&!c&&e.jsxs(m,{color:"amber",compact:!0,children:[e.jsx(Me,{className:"w-3 h-3"}),"Strongest"]}),e.jsxs("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-sm font-mono font-semibold tabular-nums bg-white/[0.06] text-text-primary ring-1 ring-inset ring-white/[0.1]",children:[i>=0?"+":"−",Math.abs(i).toFixed(1)]})]})]}),e.jsx("div",{className:"h-1.5 bg-bg-elevated rounded-full overflow-hidden",children:e.jsx(N.div,{className:t("h-full rounded-full",p),initial:{width:0},animate:{width:`${h}%`},transition:{duration:1.5,delay:g,ease:[.25,.1,.25,1]}})})]})]})}function qt(e,t){if("You"===e)return"You";const s=e.toUpperCase();for(const[a,n]of Object.entries(t))if((a.startsWith("0x")?a.slice(2,4):a.slice(0,2)).toUpperCase()===s)return n.name||n.node_name||void 0}const Kt=s.memo(function({report:t,onClose:s}){var a,n;const r=M(),i=(null==r?void 0:r.neighbors)??{},l=(null==(a=null==r?void 0:r.config)?void 0:a.repeater)?{latitude:r.config.repeater.latitude,longitude:r.config.repeater.longitude,name:r.config.node_name||"Local Node"}:void 0,c=null==(n=t.bestObservation)?void 0:n.decoded.snrValues,o=t.linkQuality?t.linkQuality.avgSnr>=5?"excellent":t.linkQuality.avgSnr>=0?"good":t.linkQuality.avgSnr>=-5?"fair":"poor":"unknown",d={excellent:"var(--signal-excellent)",good:"var(--signal-good)",fair:"var(--signal-fair)",poor:"var(--signal-poor)",unknown:"var(--text-muted)"}[o];return e.jsxs(L,{open:!0,onClose:s,size:"5xl",motionPlus:!0,children:[e.jsxs("div",{className:"sm:hidden",children:[e.jsx("div",{className:"flex justify-center pt-2 pb-1",children:e.jsx("div",{className:"w-9 h-1 rounded-full bg-white/30","aria-hidden":"true"})}),e.jsxs("div",{className:"flex items-center justify-between px-4 pb-2",children:[e.jsx("h2",{className:"font-semibold text-[17px] text-white",children:"Trace Report"}),e.jsx("button",{onClick:s,className:"text-[17px] font-medium text-blue-400 active:text-blue-300",children:"Done"})]})]}),e.jsx("div",{className:"sm:hidden h-[2px]",style:{backgroundColor:d,opacity:.6}}),e.jsx("div",{className:"hidden sm:block px-6 pt-5 pb-4",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 sm:gap-3",children:[e.jsx("h2",{className:"text-base sm:text-lg font-semibold text-text-primary",children:"Trace Report"}),e.jsxs(m,{color:"excellent"===o||"good"===o?"green":"fair"===o?"amber":"red",children:[e.jsx(Pe,{className:"w-3 h-3 mr-1"}),"excellent"===o?"Excellent":"good"===o?"Good":"fair"===o?"Fair":"Poor"]})]}),e.jsx("p",{className:"mt-1 text-xs sm:text-sm font-mono text-text-muted tabular-nums",children:t.traceTag})]}),e.jsx("button",{onClick:s,className:"p-1.5 -m-1.5 text-text-muted hover:text-text-primary transition-base radius-inner hover:bg-bg-elevated flex-shrink-0",children:e.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]})}),e.jsxs("div",{className:"hidden sm:flex flex-wrap items-center gap-1.5 sm:gap-2 px-4 sm:px-6 pb-3 sm:pb-4 border-b border-border-subtle",children:[e.jsxs(m,{color:"teal",children:[e.jsx("span",{className:"font-mono tabular-nums",children:t.targetHopCount}),e.jsxs("span",{className:"ml-1",children:["hop",1!==t.targetHopCount?"s":""]})]}),e.jsxs(m,{color:"zinc",children:[e.jsx("span",{className:"font-mono tabular-nums",children:t.observationCount}),e.jsx("span",{className:"ml-1",children:"obs"})]}),t.linkQuality&&e.jsxs(m,{color:"purple",children:[e.jsx("span",{className:"font-mono tabular-nums",children:t.linkQuality.avgSnr.toFixed(1)}),e.jsx("span",{className:"ml-1",children:"dB avg"})]}),e.jsx("span",{className:"font-mono text-xs text-text-muted tabular-nums",children:R(t.duration)}),t.linkQuality&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-text-muted/40",children:"•"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-sys-red/15 text-sys-red ring-1 ring-inset ring-sys-red/25",children:[e.jsx("span",{className:"opacity-70",children:"Min"}),e.jsx("span",{className:"font-mono tabular-nums",children:t.linkQuality.minSnr.toFixed(1)})]}),e.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-sys-teal/15 text-sys-teal ring-1 ring-inset ring-sys-teal/25",children:[e.jsx("span",{className:"opacity-70",children:"Max"}),e.jsx("span",{className:"font-mono tabular-nums",children:t.linkQuality.maxSnr.toFixed(1)})]})]})]})]}),e.jsxs(z,{className:"p-0 overflow-hidden",children:[e.jsx("div",{className:"md:hidden h-[75vh] max-h-[calc(100vh-80px)] overflow-y-auto overflow-x-hidden",children:e.jsxs("div",{className:"px-4 py-3 space-y-3",children:[t.linkQuality&&e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{className:"radius-inner bg-white/[0.03] ring-1 ring-inset ring-white/[0.06] p-2.5 text-center",children:[e.jsx(Ot,{value:Math.abs(t.linkQuality.minSnr),format:{maximumFractionDigits:0,signDisplay:"never"},prefix:t.linkQuality.minSnr<0?"-":"",className:"text-[20px] font-bold font-mono tabular-nums flex items-center justify-center text-white"}),e.jsxs("div",{className:"flex items-center justify-center gap-1 mt-1",children:[e.jsx(xe,{className:"w-2.5 h-2.5 text-text-muted"}),e.jsx("span",{className:"text-[10px] text-white/40",children:"Min dB"})]})]}),e.jsxs("div",{className:"radius-inner bg-white/[0.03] ring-1 ring-inset ring-white/[0.06] p-2.5 text-center",children:[e.jsx(Ot,{value:t.linkQuality.maxSnr,format:{maximumFractionDigits:0,signDisplay:"always"},className:"text-[20px] font-bold font-mono text-white tabular-nums flex items-center justify-center"}),e.jsxs("div",{className:"flex items-center justify-center gap-1 mt-1",children:[e.jsx(de,{className:"w-2.5 h-2.5 text-text-muted"}),e.jsx("span",{className:"text-[10px] text-white/40",children:"Max dB"})]})]})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs(m,{color:"excellent"===o||"good"===o?"green":"fair"===o?"amber":"red",compact:!0,children:[e.jsx(Pe,{className:"w-2.5 h-2.5 mr-0.5"}),"excellent"===o?"Excellent":"good"===o?"Good":"fair"===o?"Fair":"Poor"]}),e.jsxs(m,{color:"teal",compact:!0,children:[t.targetHopCount," hops"]}),e.jsxs(m,{color:"zinc",compact:!0,children:[t.observationCount," obs"]}),e.jsx("span",{className:"text-[10px] font-mono text-white/30 ml-auto",children:t.traceTag.slice(0,8)})]}),t.targetPath.length>0&&e.jsx("div",{className:"overflow-hidden radius-inset",children:e.jsx("div",{className:"aspect-[4/3] w-full",children:e.jsx(it,{path:t.targetPath,neighbors:i,localNode:l,localHash:null==r?void 0:r.local_hash,srcHash:t.srcHash,dstHash:t.dstHash,traceSnr:c})})}),e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-white/5",children:[e.jsx("span",{className:"text-[11px] font-medium text-white/60",children:"Route Path"}),t.linkQuality&&e.jsxs("span",{className:"text-[10px] font-mono text-white/40",children:["SNR ",t.linkQuality.minSnr.toFixed(1)," → ",t.linkQuality.maxSnr.toFixed(1)," dB"]})]}),t.bestObservation?e.jsx(At,{packet:t.bestObservation.packet,neighbors:i,localHash:null==r?void 0:r.local_hash,direction:"flowchart",compact:!0,overridePath:t.targetPath,traceSnr:t.bestObservation.decoded.snrValues}):e.jsx("div",{className:"p-6 text-center text-text-muted text-[11px]",children:"No path data available"})]}),e.jsxs("div",{children:[e.jsxs("h3",{className:"text-[11px] font-medium uppercase tracking-wide text-white/40 mb-2",children:["Link Quality · ",t.hopStats.length," hops"]}),e.jsx("div",{className:"space-y-1.5",children:t.hopStats.length>0?t.hopStats.map((s,a)=>{var n,r,l;const c=a{const s=t.targetPath[t.linkQuality.weakestLinkPosition],a=t.targetPath[t.linkQuality.weakestLinkPosition+1]||"You",n=qt(s,i),r=qt(a,i),l=t.targetPath[t.linkQuality.strongestLinkPosition],c=t.targetPath[t.linkQuality.strongestLinkPosition+1]||"You",o=qt(l,i),d=qt(c,i);return e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(Qt,{label:"Weakest Link",numericValue:t.linkQuality.minSnr,unit:"dB",icon:xe,subtext:`${n||s} → ${r||a}`}),e.jsx(Qt,{label:"Best Link",numericValue:t.linkQuality.maxSnr,showSign:!0,unit:"dB",icon:de,subtext:`${o||l} → ${d||c}`})]})})(),e.jsxs("div",{children:[e.jsx("h3",{className:"text-[11px] font-medium uppercase tracking-wide text-text-muted mb-3",children:"Link Details"}),e.jsx("div",{className:"space-y-2",children:t.hopStats.length>0?t.hopStats.map((s,a)=>{var n,r,l;const c=a0&&e.jsx("div",{className:"overflow-hidden",children:e.jsx("div",{className:"aspect-square w-full",children:e.jsx(it,{path:t.targetPath,neighbors:i,localNode:l,localHash:null==r?void 0:r.local_hash,srcHash:t.srcHash,dstHash:t.dstHash,traceSnr:c})})}),e.jsxs("div",{className:"radius-inset bg-black overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsx("span",{className:"text-xs font-medium text-text-muted uppercase tracking-wide",children:"Trace Route"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(m,{color:t.isComplete?"green":"amber",compact:!0,children:t.isComplete?"Complete":`${t.maxHopsObserved}/${t.targetHopCount}`}),e.jsxs(m,{color:"teal",compact:!0,children:[t.targetHopCount," hop",1!==t.targetHopCount?"s":""]})]})]}),t.linkQuality&&t.bestObservation&&e.jsxs("div",{className:"flex items-center gap-4 px-4 pb-2 font-mono text-[10px] text-text-muted",children:[e.jsxs("span",{children:[e.jsx("span",{className:"opacity-60",children:"Tag"})," ",e.jsx("code",{className:"text-teal-400 tabular-nums",children:t.traceTag.slice(0,8)})]}),e.jsxs("span",{children:[e.jsx("span",{className:"opacity-60",children:"SNR"})," ",e.jsxs("code",{className:"text-accent-secondary tabular-nums",children:[t.linkQuality.minSnr.toFixed(1),"–",t.linkQuality.maxSnr.toFixed(1)]}),e.jsx("span",{className:"opacity-60",children:" dB"})]})]}),t.bestObservation?e.jsx(At,{packet:t.bestObservation.packet,neighbors:i,localHash:null==r?void 0:r.local_hash,direction:"flowchart",compact:!0,overridePath:t.targetPath,traceSnr:t.bestObservation.decoded.snrValues}):e.jsx("div",{className:"p-8 text-center text-text-muted text-xs",children:"No path data available"})]})]})]})]})]})}),Yt="(min-width: 640px)";let Jt=null;function Zt(e){return"undefined"==typeof window?()=>{}:(Jt||(Jt=window.matchMedia(Yt)),Jt.addEventListener("change",e),()=>null==Jt?void 0:Jt.removeEventListener("change",e))}function Xt(){return"undefined"==typeof window||(Jt||(Jt=window.matchMedia(Yt)),Jt.matches)}function es({message:t}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-14 text-center",children:[e.jsx(H,{className:"size-6 text-text-muted mb-2"}),e.jsx("p",{className:"text-sm text-text-primary",children:t}),e.jsx("p",{className:"text-xs text-text-muted",children:"Packets will appear here"})]})}function ts(){return e.jsx("div",{className:"py-14 text-center text-sm text-text-muted",children:"Loading packets…"})}function ss({showPagination:t,currentPage:s,perPage:a,displayCount:n,totalCount:r,action:i}){const l=t?(s-1)*a+1:1,c=t?Math.min(s*a,r):n;return e.jsxs("div",{className:"flex items-center justify-between gap-4 border-t border-white/5 px-4 py-3 text-xs text-text-muted sm:px-6",children:[e.jsxs("span",{children:["Showing"," ",e.jsx("span",{className:"font-medium text-text-secondary",children:t?`${l}–${c}`:n})," ","of"," ",e.jsx("span",{className:"font-medium text-text-secondary",children:r})," ","packets"]}),i]})}function as({packets:a,allPackets:n,localHash:r,neighbors:i,loading:l=!1,maxPackets:c,perPage:o=50,showPagination:d=!1,onPacketSelect:x,flashNewest:m=!1,emptyMessage:h="No packets found",className:p,footerAction:u}){const[g,f]=s.useState(null),[j,y]=s.useState(null),[b,N]=s.useState({traceTag:null,dupeGroup:null});s.useLayoutEffect(()=>{N({traceTag:null,dupeGroup:null})},[a]);const v=n??a,w=s.useMemo(()=>c&&c>0?a.slice(0,c):a,[a,c]),{currentPage:k,totalPages:C,goToPage:S,pageRange:H}=function(e,t,a){const[n,r]=s.useState(1),i=a?Math.ceil(e/t):1;s.useEffect(()=>{n>i&&i>0&&queueMicrotask(()=>r(1))},[i,n]);const l=s.useCallback(e=>r(Math.max(1,Math.min(e,i))),[i]),c=s.useMemo(()=>function(e,t,s=1){if(t<=7)return Array.from({length:t},(e,t)=>t+1);const a=Math.max(e-s,1),n=Math.min(e+s,t),r=a>2,i=nt+1),"gap",t]}if(r&&!i){const e=3+2*s;return[1,"gap",...Array.from({length:e},(s,a)=>t-e+a+1)]}return[1,"gap",...Array.from({length:n-a+1},(e,t)=>a+t),"gap",t]}(n,i),[n,i]);return{currentPage:n,totalPages:i,goToPage:l,pageRange:c}}(w.length,o,d),P=s.useMemo(()=>{if(!d)return w;const e=(k-1)*o;return w.slice(e,e+o)},[w,d,k,o]),M=s.useMemo(()=>function(e){const t=new Map;for(const s of e)if((s.payload_type??s.type)===$.TRACE&&s.payload&&s.packet_hash){const e=Ue(s.payload);e&&t.set(s.packet_hash,e)}return t}(P),[P]),_=s.useMemo(()=>function(e){const t=new Map;if(0===e.length)return t;for(let s=0;s{var s,a;if(!t||!e.length)return;const i=(null==(s=e[0])?void 0:s.timestamp)??0,l=i>r.current&&r.current>0;if(r.current=i,!l)return;const c=null==(a=e[0])?void 0:a.packet_hash;if(!c)return;const o=requestAnimationFrame(()=>n(c)),d=setTimeout(()=>n(null),600);return()=>{cancelAnimationFrame(o),clearTimeout(d)}},[e,t]),a}(a,m),B=s.useCallback((e,t)=>{var s,a;const n=e.packet_hash;if(!n)return[e];let r=t;for(;r>0&&(null==(s=P[r-1])?void 0:s.packet_hash)===n;)r--;let i=t;for(;i{var t,s;const a=null==(t=P[e])?void 0:t.packet_hash;if(!a)return e;let n=e;for(;n>0&&(null==(s=P[n-1])?void 0:s.packet_hash)===a;)n--;return n},[P]),L=s.useCallback(e=>{var t,s;const a=null==(t=P[e])?void 0:t.packet_hash;if(!a)return e;let n=e;for(;n{if(x)x(e);else if(void 0!==t){const s=B(e,t),a=s.indexOf(e);f({packets:s,initialIndex:a>=0?a:0,rowIndex:t})}else f({packets:[e],initialIndex:0,rowIndex:0})},[x,B]),D=s.useCallback(()=>{if(!g)return;const e=F(g.rowIndex)-1;if(e<0)return;const t=P[e];if(!t)return;const s=B(t,e);f({packets:s,initialIndex:0,rowIndex:e})},[g,P,F,B]),A=s.useCallback(()=>{if(!g)return;const e=L(g.rowIndex)+1;if(e>=P.length)return;const t=P[e];if(!t)return;const s=B(t,e);f({packets:s,initialIndex:0,rowIndex:e})},[g,P,L,B]),E=s.useMemo(()=>!!g&&F(g.rowIndex)>0,[g,F]),R=s.useMemo(()=>!!g&&L(g.rowIndex)N(t=>({...t,traceTag:e})),[]),I=s.useCallback(e=>N(t=>({...t,dupeGroup:e})),[]),V=s.useCallback(()=>{N({traceTag:null,dupeGroup:null})},[]),O=s.useCallback(e=>{const t=v.filter(t=>(t.payload_type??t.type)===$.TRACE&&t.payload&&Ue(t.payload)===e);if(0===t.length)return;const s=function(e){const t=new Map;for(const s of e){const e=Ie(s);if(!e)continue;const a=e.decoded.traceTag,n=t.get(a)||[];n.push(e),t.set(a,n)}for(const[s,a]of t)a.sort((e,t)=>e.timestamp-t.timestamp),t.set(s,a);return t}(t),a=s.get(e);(null==a?void 0:a.length)&&y(function(e,t){if(0===t.length)return{traceTag:e,traceTagValue:0,targetPath:[],targetHopCount:0,observations:[],observationCount:0,firstSeen:0,lastSeen:0,duration:0,isComplete:!1,maxHopsObserved:0,progressPercent:0,bestObservation:null,hopStats:[],linkQuality:null};const s=[...t].sort((e,t)=>e.timestamp-t.timestamp),a=s.reduce((e,t)=>t.hopCount>e.hopCount?t:e,s[0]),n=s[0].timestamp,r=s[s.length-1].timestamp,i=a.decoded.pathHashes,l=i.length,c=a.hopCount,o=a.decoded.isComplete,d=[],x=a.decoded.snrValues;for(let h=0;h0){const e=Math.min(...x),t=Math.max(...x);m={minSnr:e,maxSnr:t,avgSnr:x.reduce((e,t)=>e+t,0)/x.length,weakestLinkPosition:x.indexOf(e),strongestLinkPosition:x.indexOf(t)}}return{traceTag:e,traceTagValue:a.decoded.traceTagValue,targetPath:i,targetHopCount:l,observations:s,observationCount:s.length,firstSeen:n,lastSeen:r,duration:r-n,isComplete:o,maxHopsObserved:c,progressPercent:l>0?Math.round(c/l*100):0,bestObservation:a,hopStats:d,linkQuality:m,srcHash:a.packet.src_hash,dstHash:a.packet.dst_hash}}(e,a))},[v]),Q=s.useCallback(e=>{const t=v.find(t=>t.packet_hash===e);t&&(y(null),z(t))},[v,z]),W=s.useSyncExternalStore(Zt,Xt,()=>!0);return e.jsxs("div",{className:t("flex flex-col",p),onMouseLeave:V,children:[e.jsx("div",{className:"divide-y divide-white/5 py-1",children:(()=>{if(l&&0===a.length)return e.jsx(ts,{});if(0===P.length)return e.jsx(es,{message:h});const t=W?Xe:et;return P.map((s,a)=>{const n=s.packet_hash?M.get(s.packet_hash):void 0,l=null!==b.traceTag&&n===b.traceTag,c=_.get(a),o=void 0!==c&&null!==b.dupeGroup&&s.packet_hash===b.dupeGroup;return e.jsx(t,{packet:s,onClick:e=>z(e,a),localHash:r,neighbors:i,isFlashing:m&&T===s.packet_hash,traceTag:n,isTraceHighlighted:l,onTraceHover:U,onViewTraceReport:O,dupeGroupPosition:c,isDupeGroupHovered:o,onDupeGroupHover:I},`${s.packet_hash}_${s.timestamp}_${a}`)})})()}),d&&C>1&&e.jsx("nav",{className:"border-t border-white/5 px-4 py-3",children:e.jsxs(Le,{className:"justify-center",children:[e.jsx(ze,{onClick:()=>S(k-1),disabled:1===k}),e.jsx(Ae,{children:H.map((t,s)=>"gap"===t?e.jsx(Re,{},`gap-${s}`):e.jsx(Ee,{page:t,current:t===k,onClick:S},t))}),e.jsx(De,{onClick:()=>S(k+1),disabled:k===C})]})}),e.jsx(ss,{showPagination:d,currentPage:k,perPage:o,displayCount:P.length,totalCount:d?w.length:a.length,action:u}),!x&&g&&e.jsx(It,{packets:g.packets,initialIndex:g.initialIndex,onClose:()=>f(null),onNavigatePrev:D,onNavigateNext:A,hasPrev:E,hasNext:R}),j&&e.jsx(Kt,{report:j,onClose:()=>y(null),onViewPacket:Q})]})}export{ve as A,as as P,Pe as S,Me as T,We as g,Fe as u}; diff --git a/frontend/dist/assets/Packets-5FmM_VMr.js b/frontend/dist/assets/Packets-5FmM_VMr.js new file mode 100644 index 00000000..834e89b8 --- /dev/null +++ b/frontend/dist/assets/Packets-5FmM_VMr.js @@ -0,0 +1 @@ +import{r as e,j as a,H as s,c as l,k as t,B as r,U as i,l as o}from"./vendor-react-Cwum97tW.js";import{F as n,b as c,f as d,a as m,M as u,L as p,N as x,R as h,X as b}from"./index-D22MpaCY.js";import{C as j,a as v}from"./DataBox-Bl0vntck.js";import{g,A as f,P as y}from"./PacketList-DSZP-sF4.js";import{A as N}from"./arrow-up-DysUUcGL.js";import{C as w}from"./SignalIndicator-CBL6VSNS.js";import{U as k,F as C}from"./users-dFI4fg5G.js";import{P as S,b as R,B as P,a as M}from"./PageLayout-B53JpmK1.js";import{C as F}from"./Card-CCBguhJs.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-CDrKesoV.js";import"./payload-decoders-B_w2m9Or.js";import"./chevron-right-CZNwXWtt.js";import"./loader-circle-2q9lT2qG.js";import"./map-pin-kiJDSdn0.js";import"./zap-Cpbok2bP.js";import"./triangle-alert-TfoZuZfW.js";import"./route-ExVvvUtv.js";import"./activity-Cb8TQBuo.js";import"./circle-check-CKXuJpMJ.js";import"./house-D2cJ2w9-.js";import"./useThemeColors-S-uaxvPT.js";import"./index-bDa2a9Y2.js";function L({options:o,value:c,onChange:d,defaultValue:m,displayValue:u,filter:p,placeholder:x,disabled:h,invalid:b,name:j,"aria-label":v,className:g,children:f}){const[y,N]=e.useState(""),w=u??(e=>null!=e?String(e):""),k=p??((e,a)=>w(e).toLowerCase().includes(a.toLowerCase())),C=e.useMemo(()=>y?o.filter(e=>k(e,y)):o,[o,y,k]);return a.jsx(s,{value:c,onChange:d,defaultValue:m,disabled:h,name:j,onClose:()=>N(""),children:a.jsxs("div",{className:l("relative",g),children:[a.jsxs("div",{className:"relative",children:[a.jsx(t,{"aria-label":v,displayValue:w,onChange:e=>N(e.target.value),placeholder:x,className:l(["w-full radius-inner py-2 pl-3 pr-10","text-sm text-text-primary placeholder:text-text-muted","bg-bg-subtle",b?"border border-accent-danger":"border-control","ring-focus-inset","hover:border-border-strong","disabled:opacity-40 disabled:pointer-events-none disabled:cursor-not-allowed","transition-colors"])}),a.jsx(r,{className:"absolute inset-y-0 right-0 flex items-center pr-3 group",children:a.jsx(n,{className:"w-4 h-4 text-text-muted transition-transform duration-200 group-data-[open]:rotate-180"})})]}),a.jsx(i,{anchor:"bottom start",transition:!0,className:l(["w-[var(--input-width)] min-w-[180px]","max-h-60 overflow-y-auto overscroll-contain scroll-py-1","radius-inset p-1 mt-1","surface-elevated","focus:outline-none","transition-opacity","data-[closed]:opacity-0","data-[enter]:duration-150 data-[leave]:duration-100","z-50"]),children:0===C.length&&""!==y?a.jsx("div",{className:"px-3 py-2 text-sm text-text-muted",children:"No results found"}):C.map((s,l)=>a.jsx(e.Fragment,{children:f(s)},l))})]})})}function A({value:s,disabled:t,className:r,children:i}){return a.jsx(o,{as:e.Fragment,value:s,disabled:t,children:({selected:e,focus:s})=>a.jsxs("div",{className:l("flex items-center gap-2 px-3 py-2 radius-control cursor-default","text-sm",s&&"bg-accent-primary text-white",!s&&"text-text-primary",e&&!s&&"text-accent-primary",t&&"opacity-50 cursor-not-allowed",r),children:[a.jsx("span",{className:"w-4 flex-shrink-0",children:e&&a.jsx(j,{className:"w-4 h-4"})}),a.jsx("span",{className:"truncate flex-1",children:i})]})})}function _({className:e,...s}){return a.jsx("span",{...s,className:l("truncate",e)})}function D({value:e,onChange:s,options:l,placeholder:t,disabled:r,className:i,"aria-label":o}){const n=l.find(a=>a.value===e);return a.jsx(L,{options:l,value:n,onChange:e=>{e&&s(e.value)},displayValue:e=>(null==e?void 0:e.label)??"",filter:(e,a)=>e.label.toLowerCase().includes(a.toLowerCase()),placeholder:t,disabled:r,className:i,"aria-label":o,children:e=>a.jsx(A,{value:e,disabled:e.disabled,children:a.jsx(_,{children:e.label})})})}function B({icon:e,label:s,value:t,color:r,percentage:i}){return a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("div",{className:l("p-1.5 rounded-md",r),children:e}),a.jsxs("div",{className:"flex flex-col",children:[a.jsx("span",{className:"text-sm font-semibold text-text-primary",children:t.toLocaleString()}),a.jsxs("span",{className:"text-[10px] text-text-muted leading-tight",children:[s,void 0!==i&&a.jsxs("span",{className:"ml-1 opacity-70",children:["(",i,"%)"]})]})]})]})}const T=e.memo(function({packets:s}){const l=e.useMemo(()=>{let e=0,a=0,l=0;const t=new Set;let r=0,i=0;for(const c of s){switch(g(c)){case"forward":e++;break;case"dropped":a++;break;case"duplicate":l++}c.src_hash&&t.add(c.src_hash),c.rssi&&(r+=c.rssi,i++)}const o=s.length,n=i>0?Math.round(r/i):0;return{total:o,rx:o,fwd:e,dropped:a,duplicate:l,uniqueSources:t.size,avgRssi:n,rxPercent:100,fwdPercent:o>0?Math.round(e/o*100):0,droppedPercent:o>0?Math.round(a/o*100):0}},[s]);return 0===s.length?null:a.jsx("div",{className:"surface-base rounded-2xl p-3 pr-4",children:a.jsxs("div",{className:"grid grid-cols-2 gap-3 sm:flex sm:items-center sm:justify-between sm:gap-6",children:[a.jsx(B,{icon:a.jsx(N,{className:"w-3.5 h-3.5 text-accent-primary"}),label:"Received",value:l.rx,color:"bg-accent-primary/10",percentage:l.rxPercent}),a.jsx(B,{icon:a.jsx(f,{className:"w-3.5 h-3.5 text-accent-success"}),label:"Forwarded",value:l.fwd,color:"bg-accent-success/10",percentage:l.fwdPercent}),a.jsx(B,{icon:a.jsx(w,{className:"w-3.5 h-3.5 text-accent-danger"}),label:"Dropped",value:l.dropped,color:"bg-accent-danger/10",percentage:l.droppedPercent}),a.jsx(B,{icon:a.jsx(v,{className:"w-3.5 h-3.5 text-text-muted"}),label:"Duplicates",value:l.duplicate,color:"bg-white/5"}),a.jsxs("div",{className:"hidden sm:flex items-center gap-6 ml-auto",children:[a.jsx(B,{icon:a.jsx(k,{className:"w-3.5 h-3.5 text-accent-secondary"}),label:"Sources",value:l.uniqueSources,color:"bg-accent-secondary/10"}),a.jsxs("div",{className:"flex flex-col items-end pr-1",children:[a.jsxs("span",{className:"text-sm font-mono text-text-secondary",children:[l.avgRssi," dBm"]}),a.jsx("span",{className:"text-[10px] text-text-muted",children:"Avg Signal"})]})]})]})})});function V(){const s=c(),t=d(),r=null==t?void 0:t.local_hash,i=null==t?void 0:t.neighbors,[o,n]=e.useState(!1),[j,v]=e.useState({limit:500,status:"all"}),[f,N]=e.useState(Date.now);e.useEffect(()=>{j.timeRange&&j.timeRange>0&&queueMicrotask(()=>N(Date.now()))},[j.timeRange,s]);const w=e.useMemo(()=>{const e=j.limit??500;return[...s.length<=e?s:s.slice(-e)].sort((e,a)=>(a.timestamp??0)-(e.timestamp??0))},[s,j.limit]),k=0===s.length,L=e.useMemo(()=>{let e=w;if(void 0!==j.type){const a=m[j.type];e=e.filter(e=>{const s=e.type??e.payload_type,l=e.payload_type_name;return s===j.type||l===a})}if(void 0!==j.route){const a=u[j.route];e=e.filter(e=>{const s=e.route??e.route_type,l=e.route_type_name;return s===j.route||l===a})}if(j.status&&"all"!==j.status&&(e=e.filter(e=>g(e)===j.status)),void 0!==j.signalMin&&(e=e.filter(e=>e.rssi>=j.signalMin)),j.timeRange&&j.timeRange>0){const a=f/1e3-3600*j.timeRange;e=e.filter(e=>e.timestamp>=a)}return e},[w,j.type,j.route,j.status,j.signalMin,j.timeRange,f]),A=(e,a)=>v(s=>({...s,[e]:a})),_=void 0!==j.type||void 0!==j.route||j.status&&"all"!==j.status||void 0!==j.signalMin||j.timeRange&&j.timeRange>0;return a.jsxs(S,{children:[a.jsx(R,{title:"Packet History",icon:a.jsx(h,{}),controls:a.jsxs(a.Fragment,{children:[a.jsx(p,{showLabel:!0}),a.jsxs(x,{outline:!0,color:_?"primary":"muted",onClick:()=>n(!o),className:"sm:hidden",children:[a.jsx(C,{"data-slot":"icon"}),_&&a.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"})]})]})}),a.jsxs(P,{children:[a.jsxs(M,{noPadding:!0,className:l("overflow-hidden transition-all duration-200",o?"max-h-96 opacity-100":"max-h-0 opacity-0 sm:max-h-96 sm:opacity-100"),children:[a.jsx(F,{listHeader:!0,icon:a.jsx(C,{className:"icon-sm"}),title:"Filters",actions:_?a.jsxs(x,{plain:!0,color:"muted",onClick:()=>v({limit:j.limit,status:"all"}),className:"!text-xs !py-0.5 !px-1.5",children:[a.jsx(b,{"data-slot":"icon",className:"!w-3 !h-3"}),"Clear"]}):void 0}),a.jsx("div",{className:"p-3 sm:p-4",children:a.jsxs("div",{className:"grid grid-cols-2 sm:flex sm:flex-wrap gap-3",children:[a.jsxs("div",{className:"flex-1 min-w-[140px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Type"}),a.jsx(D,{value:j.type??"",onChange:e=>A("type",""===e?void 0:Number(e)),options:[{value:"",label:"All Types"},...Object.entries(m).map(([e,a])=>({value:Number(e),label:a}))],placeholder:"Search types...","aria-label":"Filter by packet type"})]}),a.jsxs("div",{className:"flex-1 min-w-[140px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Route"}),a.jsx(D,{value:j.route??"",onChange:e=>A("route",""===e?void 0:Number(e)),options:[{value:"",label:"All Routes"},...Object.entries(u).map(([e,a])=>({value:Number(e),label:a}))],placeholder:"Search routes...","aria-label":"Filter by route type"})]}),a.jsxs("div",{className:"flex-1 min-w-[140px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Status"}),a.jsx(D,{value:j.status??"all",onChange:e=>A("status",e),options:[{value:"all",label:"All Status"},{value:"rx",label:"Received"},{value:"forward",label:"Forwarded"},{value:"dropped",label:"Dropped"},{value:"duplicate",label:"Duplicate"}],placeholder:"Search status...","aria-label":"Filter by status"})]}),a.jsxs("div",{className:"flex-1 min-w-[120px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Time"}),a.jsx(D,{value:j.timeRange??0,onChange:e=>A("timeRange",0===e?void 0:e),options:[{value:0,label:"All Time"},{value:1,label:"Last 1h"},{value:6,label:"Last 6h"},{value:24,label:"Last 24h"},{value:168,label:"Last 7d"}],placeholder:"Search time...","aria-label":"Filter by time range"})]}),a.jsxs("div",{className:"flex-1 min-w-[130px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Signal"}),a.jsx(D,{value:j.signalMin??"",onChange:e=>A("signalMin",""===e?void 0:Number(e)),options:[{value:"",label:"Any Signal"},{value:-90,label:"Strong (≥-90)"},{value:-100,label:"Good (≥-100)"},{value:-110,label:"Fair (≥-110)"},{value:-120,label:"Weak (≥-120)"}],placeholder:"Search signal...","aria-label":"Filter by signal strength"})]}),a.jsxs("div",{className:"flex-1 min-w-[100px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Limit"}),a.jsx(D,{value:j.limit??500,onChange:e=>A("limit",e),options:[{value:100,label:"100"},{value:200,label:"200"},{value:500,label:"500"},{value:1e3,label:"1000"},{value:2e3,label:"2000"}],placeholder:"Limit...","aria-label":"Packet limit"})]})]})})]}),a.jsx(T,{packets:L}),a.jsx(M,{noPadding:!0,className:"!overflow-visible",children:a.jsx(y,{packets:L,allPackets:s,localHash:r,neighbors:i,loading:k,showPagination:!0,perPage:50,emptyMessage:"No packets found"})})]})]})}export{V as default}; diff --git a/frontend/dist/assets/Packets-9uyPWOef.js b/frontend/dist/assets/Packets-9uyPWOef.js deleted file mode 100644 index a1ee99a3..00000000 --- a/frontend/dist/assets/Packets-9uyPWOef.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e,j as a,H as s,c as l,k as t,B as r,U as i,l as n}from"./vendor-react-DFCqJxYC.js";import{O as o,n as c,q as d,j as m,Y as u,L as p,Z as x,R as h,_ as b}from"./index-CZBrdv20.js";import{C as j,a as v}from"./DataBox-BuwfTaKv.js";import{g,A as f,P as y}from"./PacketList-C0Zwn6jt.js";import{A as N}from"./arrow-up-Bv56Dbd2.js";import{C as w}from"./SignalIndicator-FtRKgdkw.js";import{U as k,F as C}from"./users-DbmAVTAI.js";import{P as S,b as R,B as P,a as L}from"./PageLayout-Dz1NyqHa.js";import{C as M}from"./Card-BiYlryJL.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-Dhs13Wlh.js";import"./chevron-right-CchtyLvr.js";import"./loader-circle-BLG0SL8e.js";import"./map-pin-BnrkOs2D.js";import"./zap-DOkzycJm.js";import"./triangle-alert-DlaBoont.js";import"./packet-CCmg5Y4j.js";import"./route-CHkUVMnV.js";import"./chevron-up-Cn6bmTpb.js";import"./circle-check-BQrKpAc_.js";import"./house-BPemXMFi.js";import"./useThemeColors-CzhUM4y-.js";import"./index-BKfnA8uz.js";function F({options:n,value:c,onChange:d,defaultValue:m,displayValue:u,filter:p,placeholder:x,disabled:h,invalid:b,name:j,"aria-label":v,className:g,children:f}){const[y,N]=e.useState(""),w=u??(e=>null!=e?String(e):""),k=p??((e,a)=>w(e).toLowerCase().includes(a.toLowerCase())),C=e.useMemo(()=>y?n.filter(e=>k(e,y)):n,[n,y,k]);return a.jsx(s,{value:c,onChange:d,defaultValue:m,disabled:h,name:j,onClose:()=>N(""),children:a.jsxs("div",{className:l("relative",g),children:[a.jsxs("div",{className:"relative",children:[a.jsx(t,{"aria-label":v,displayValue:w,onChange:e=>N(e.target.value),placeholder:x,className:l(["w-full radius-inner py-2 pl-3 pr-10","text-sm text-text-primary placeholder:text-text-muted","bg-bg-subtle",b?"border border-accent-danger":"border-control","ring-focus-inset","hover:border-border-strong","disabled:opacity-40 disabled:pointer-events-none disabled:cursor-not-allowed","transition-colors"])}),a.jsx(r,{className:"absolute inset-y-0 right-0 flex items-center pr-3 group",children:a.jsx(o,{className:"w-4 h-4 text-text-muted transition-transform duration-200 group-data-[open]:rotate-180"})})]}),a.jsx(i,{anchor:"bottom start",transition:!0,className:l(["w-[var(--input-width)] min-w-[180px]","max-h-60 overflow-y-auto overscroll-contain scroll-py-1","radius-inset p-1 mt-1","surface-elevated","focus:outline-none","transition-opacity","data-[closed]:opacity-0","data-[enter]:duration-150 data-[leave]:duration-100","z-50"]),children:0===C.length&&""!==y?a.jsx("div",{className:"px-3 py-2 text-sm text-text-muted",children:"No results found"}):C.map((s,l)=>a.jsx(e.Fragment,{children:f(s)},l))})]})})}function _({value:s,disabled:t,className:r,children:i}){return a.jsx(n,{as:e.Fragment,value:s,disabled:t,children:({selected:e,focus:s})=>a.jsxs("div",{className:l("flex items-center gap-2 px-3 py-2 radius-control cursor-default","text-sm",s&&"bg-accent-primary text-white",!s&&"text-text-primary",e&&!s&&"text-accent-primary",t&&"opacity-50 cursor-not-allowed",r),children:[a.jsx("span",{className:"w-4 flex-shrink-0",children:e&&a.jsx(j,{className:"w-4 h-4"})}),a.jsx("span",{className:"truncate flex-1",children:i})]})})}function A({className:e,...s}){return a.jsx("span",{...s,className:l("truncate",e)})}function D({value:e,onChange:s,options:l,placeholder:t,disabled:r,className:i,"aria-label":n}){const o=l.find(a=>a.value===e);return a.jsx(F,{options:l,value:o,onChange:e=>{e&&s(e.value)},displayValue:e=>(null==e?void 0:e.label)??"",filter:(e,a)=>e.label.toLowerCase().includes(a.toLowerCase()),placeholder:t,disabled:r,className:i,"aria-label":n,children:e=>a.jsx(_,{value:e,disabled:e.disabled,children:a.jsx(A,{children:e.label})})})}function q({icon:e,label:s,value:t,color:r,percentage:i}){return a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("div",{className:l("p-1.5 rounded-md",r),children:e}),a.jsxs("div",{className:"flex flex-col",children:[a.jsx("span",{className:"text-sm font-semibold text-text-primary",children:t.toLocaleString()}),a.jsxs("span",{className:"text-[10px] text-text-muted leading-tight",children:[s,void 0!==i&&a.jsxs("span",{className:"ml-1 opacity-70",children:["(",i,"%)"]})]})]})]})}const B=e.memo(function({packets:s}){const l=e.useMemo(()=>{let e=0,a=0,l=0;const t=new Set;let r=0,i=0;for(const c of s){switch(g(c)){case"forward":e++;break;case"dropped":a++;break;case"duplicate":l++}c.src_hash&&t.add(c.src_hash),c.rssi&&(r+=c.rssi,i++)}const n=s.length,o=i>0?Math.round(r/i):0;return{total:n,rx:n,fwd:e,dropped:a,duplicate:l,uniqueSources:t.size,avgRssi:o,rxPercent:100,fwdPercent:n>0?Math.round(e/n*100):0,droppedPercent:n>0?Math.round(a/n*100):0}},[s]);return 0===s.length?null:a.jsx("div",{className:"surface-base rounded-2xl p-3 pr-4",children:a.jsxs("div",{className:"grid grid-cols-2 gap-3 sm:flex sm:items-center sm:justify-between sm:gap-6",children:[a.jsx(q,{icon:a.jsx(N,{className:"w-3.5 h-3.5 text-accent-primary"}),label:"Received",value:l.rx,color:"bg-accent-primary/10",percentage:l.rxPercent}),a.jsx(q,{icon:a.jsx(f,{className:"w-3.5 h-3.5 text-accent-success"}),label:"Forwarded",value:l.fwd,color:"bg-accent-success/10",percentage:l.fwdPercent}),a.jsx(q,{icon:a.jsx(w,{className:"w-3.5 h-3.5 text-accent-danger"}),label:"Dropped",value:l.dropped,color:"bg-accent-danger/10",percentage:l.droppedPercent}),a.jsx(q,{icon:a.jsx(v,{className:"w-3.5 h-3.5 text-text-muted"}),label:"Duplicates",value:l.duplicate,color:"bg-white/5"}),a.jsxs("div",{className:"hidden sm:flex items-center gap-6 ml-auto",children:[a.jsx(q,{icon:a.jsx(k,{className:"w-3.5 h-3.5 text-accent-secondary"}),label:"Sources",value:l.uniqueSources,color:"bg-accent-secondary/10"}),a.jsxs("div",{className:"flex flex-col items-end pr-1",children:[a.jsxs("span",{className:"text-sm font-mono text-text-secondary",children:[l.avgRssi," dBm"]}),a.jsx("span",{className:"text-[10px] text-text-muted",children:"Avg Signal"})]})]})]})})});function T(){const s=c(),t=d(),r=null==t?void 0:t.local_hash,i=null==t?void 0:t.neighbors,[n,o]=e.useState(!1),[j,v]=e.useState({limit:500,status:"all"}),[f,N]=e.useState(Date.now);e.useEffect(()=>{j.timeRange&&j.timeRange>0&&queueMicrotask(()=>N(Date.now()))},[j.timeRange,s]);const w=e.useMemo(()=>{const e=j.limit??500;return[...s.length<=e?s:s.slice(-e)].sort((e,a)=>(a.timestamp??0)-(e.timestamp??0))},[s,j.limit]),k=0===s.length,F=e.useMemo(()=>{let e=w;if(void 0!==j.type){const a=m[j.type];e=e.filter(e=>{const s=e.type??e.payload_type,l=e.payload_type_name;return s===j.type||l===a})}if(void 0!==j.route){const a=u[j.route];e=e.filter(e=>{const s=e.route??e.route_type,l=e.route_type_name;return s===j.route||l===a})}if(j.status&&"all"!==j.status&&(e=e.filter(e=>g(e)===j.status)),void 0!==j.signalMin&&(e=e.filter(e=>e.rssi>=j.signalMin)),j.timeRange&&j.timeRange>0){const a=f/1e3-3600*j.timeRange;e=e.filter(e=>e.timestamp>=a)}return e},[w,j.type,j.route,j.status,j.signalMin,j.timeRange,f]),_=(e,a)=>v(s=>({...s,[e]:a})),A=void 0!==j.type||void 0!==j.route||j.status&&"all"!==j.status||void 0!==j.signalMin||j.timeRange&&j.timeRange>0;return a.jsxs(S,{children:[a.jsx(R,{title:"Packet History",icon:a.jsx(h,{}),controls:a.jsxs(a.Fragment,{children:[a.jsx(p,{showLabel:!0}),a.jsxs(x,{outline:!0,color:A?"primary":"muted",onClick:()=>o(!n),className:"sm:hidden",children:[a.jsx(C,{"data-slot":"icon"}),A&&a.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-accent-primary"})]})]})}),a.jsxs(P,{children:[a.jsxs(L,{noPadding:!0,className:l("overflow-hidden transition-all duration-200",n?"max-h-96 opacity-100":"max-h-0 opacity-0 sm:max-h-96 sm:opacity-100"),children:[a.jsx(M,{listHeader:!0,icon:a.jsx(C,{className:"icon-sm"}),title:"Filters",actions:A?a.jsxs(x,{plain:!0,color:"muted",onClick:()=>v({limit:j.limit,status:"all"}),className:"!text-xs !py-0.5 !px-1.5",children:[a.jsx(b,{"data-slot":"icon",className:"!w-3 !h-3"}),"Clear"]}):void 0}),a.jsx("div",{className:"p-3 sm:p-4",children:a.jsxs("div",{className:"grid grid-cols-2 sm:flex sm:flex-wrap gap-3",children:[a.jsxs("div",{className:"flex-1 min-w-[140px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Type"}),a.jsx(D,{value:j.type??"",onChange:e=>_("type",""===e?void 0:Number(e)),options:[{value:"",label:"All Types"},...Object.entries(m).map(([e,a])=>({value:Number(e),label:a}))],placeholder:"Search types...","aria-label":"Filter by packet type"})]}),a.jsxs("div",{className:"flex-1 min-w-[140px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Route"}),a.jsx(D,{value:j.route??"",onChange:e=>_("route",""===e?void 0:Number(e)),options:[{value:"",label:"All Routes"},...Object.entries(u).map(([e,a])=>({value:Number(e),label:a}))],placeholder:"Search routes...","aria-label":"Filter by route type"})]}),a.jsxs("div",{className:"flex-1 min-w-[140px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Status"}),a.jsx(D,{value:j.status??"all",onChange:e=>_("status",e),options:[{value:"all",label:"All Status"},{value:"rx",label:"Received"},{value:"forward",label:"Forwarded"},{value:"dropped",label:"Dropped"},{value:"duplicate",label:"Duplicate"}],placeholder:"Search status...","aria-label":"Filter by status"})]}),a.jsxs("div",{className:"flex-1 min-w-[120px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Time"}),a.jsx(D,{value:j.timeRange??0,onChange:e=>_("timeRange",0===e?void 0:e),options:[{value:0,label:"All Time"},{value:1,label:"Last 1h"},{value:6,label:"Last 6h"},{value:24,label:"Last 24h"},{value:168,label:"Last 7d"}],placeholder:"Search time...","aria-label":"Filter by time range"})]}),a.jsxs("div",{className:"flex-1 min-w-[130px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Signal"}),a.jsx(D,{value:j.signalMin??"",onChange:e=>_("signalMin",""===e?void 0:Number(e)),options:[{value:"",label:"Any Signal"},{value:-90,label:"Strong (≥-90)"},{value:-100,label:"Good (≥-100)"},{value:-110,label:"Fair (≥-110)"},{value:-120,label:"Weak (≥-120)"}],placeholder:"Search signal...","aria-label":"Filter by signal strength"})]}),a.jsxs("div",{className:"flex-1 min-w-[100px]",children:[a.jsx("label",{className:"type-micro block mb-1",children:"Limit"}),a.jsx(D,{value:j.limit??500,onChange:e=>_("limit",e),options:[{value:100,label:"100"},{value:200,label:"200"},{value:500,label:"500"},{value:1e3,label:"1000"},{value:2e3,label:"2000"}],placeholder:"Limit...","aria-label":"Packet limit"})]})]})})]}),a.jsx(B,{packets:F}),a.jsx(L,{noPadding:!0,className:"!overflow-visible",children:a.jsx(y,{packets:F,allPackets:s,localHash:r,neighbors:i,loading:k,showPagination:!0,perPage:50,emptyMessage:"No packets found"})})]})]})}export{T as default}; diff --git a/frontend/dist/assets/PageLayout-Dz1NyqHa.js b/frontend/dist/assets/PageLayout-B53JpmK1.js similarity index 96% rename from frontend/dist/assets/PageLayout-Dz1NyqHa.js rename to frontend/dist/assets/PageLayout-B53JpmK1.js index 04abd387..52c5756f 100644 --- a/frontend/dist/assets/PageLayout-Dz1NyqHa.js +++ b/frontend/dist/assets/PageLayout-B53JpmK1.js @@ -1 +1 @@ -import{j as s,c as e}from"./vendor-react-DFCqJxYC.js";import"./index-CZBrdv20.js";const a=[45,72,33,58,80,42,65,28,55,75,38,62];function l({className:a,style:l}){return s.jsx("div",{className:e("animate-pulse bg-subtle-fill radius-badge",a),style:l})}function c(){return s.jsx("div",{className:"p-3 radius-inner border-card bg-bg-subtle",children:s.jsxs("div",{className:"flex items-start gap-3",children:[s.jsx(l,{className:"w-14 h-6 rounded shrink-0"}),s.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[s.jsx(l,{className:"h-4 w-full"}),s.jsx(l,{className:"h-4 w-3/4"}),s.jsx(l,{className:"h-3 w-32 mt-1"})]})]})})}function r({count:e=8}){return s.jsx("div",{className:"space-y-2",children:Array.from({length:e}).map((e,a)=>s.jsx(c,{},a))})}function i(){return s.jsxs("div",{className:"flex flex-col gap-3 h-full","aria-hidden":"true",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(l,{className:"w-5 h-5"}),s.jsx(l,{className:"h-4 w-24"})]}),s.jsx(l,{className:"h-8 w-20"}),s.jsxs("div",{className:"flex-1 flex flex-col justify-end gap-2",children:[s.jsx(l,{className:"h-3 w-full"}),s.jsx(l,{className:"h-3 w-3/4"})]})]})}function n(){return s.jsxs("div",{className:"flex flex-col gap-3 h-full","aria-hidden":"true",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(l,{className:"w-5 h-5"}),s.jsx(l,{className:"h-4 w-24"})]}),s.jsx("div",{className:"flex-1 flex items-end gap-1",children:a.slice(0,8).map((e,a)=>s.jsx(l,{className:"flex-1",style:{height:`${e}%`}},a))})]})}function t({rows:e=5}){return s.jsxs("div",{className:"flex flex-col h-full","aria-hidden":"true",children:[s.jsx("div",{className:"pb-3 border-b border-border-subtle",children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(l,{className:"w-5 h-5"}),s.jsx(l,{className:"h-4 w-24"})]})}),s.jsx("div",{className:"flex-1 pt-3 flex flex-col gap-3",children:Array.from({length:e}).map((e,a)=>s.jsx(l,{className:"h-6 w-full"},a))})]})}function d({children:a,className:l}){return s.jsx("div",{className:e("section-gap",l),children:a})}function x({children:a,className:l}){return s.jsx("div",{className:e("bento-section",l),children:a})}function m({title:e,icon:a,controls:l,subtitle:c}){return s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between sm:gap-3",children:[s.jsxs("h1",{className:"type-title text-text-primary flex items-center gap-2 sm:gap-3 h-9 min-w-0",children:[a&&s.jsx("span",{className:"w-5 h-5 sm:w-6 sm:h-6 text-icon-page-title flex-shrink-0",children:a}),s.jsx("span",{className:"truncate",children:e})]}),l&&s.jsx("div",{className:"flex items-center gap-2 sm:gap-3 h-9 flex-shrink-0",children:l})]}),c&&s.jsx("div",{children:c})]})}const h={sm:"card-sm",md:"card-md",lg:"card-lg",hero:"card-hero",auto:"card-auto"};function f({children:a,size:l,compact:c,noPadding:r,className:d,style:x,onClick:m,isLoaded:f=!0,skeletonType:o="card"}){return s.jsxs("div",{className:e("surface-base rounded-2xl h-full flex flex-col relative",!r&&(c?"card-padding-sm":"card-padding"),l&&h[l],d),style:x,onClick:m,children:[a,!f&&(()=>{switch(o){case"chart":return s.jsx(n,{});case"list":return s.jsx(t,{});default:return s.jsx(i,{})}})()]})}export{x as B,i as C,r as L,d as P,l as S,f as a,m as b}; +import{j as s,c as e}from"./vendor-react-Cwum97tW.js";import"./index-D22MpaCY.js";const a=[45,72,33,58,80,42,65,28,55,75,38,62];function l({className:a,style:l}){return s.jsx("div",{className:e("animate-pulse bg-subtle-fill radius-badge",a),style:l})}function c(){return s.jsx("div",{className:"p-3 radius-inner border-card bg-bg-subtle",children:s.jsxs("div",{className:"flex items-start gap-3",children:[s.jsx(l,{className:"w-14 h-6 rounded shrink-0"}),s.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[s.jsx(l,{className:"h-4 w-full"}),s.jsx(l,{className:"h-4 w-3/4"}),s.jsx(l,{className:"h-3 w-32 mt-1"})]})]})})}function r({count:e=8}){return s.jsx("div",{className:"space-y-2",children:Array.from({length:e}).map((e,a)=>s.jsx(c,{},a))})}function i(){return s.jsxs("div",{className:"flex flex-col gap-3 h-full","aria-hidden":"true",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(l,{className:"w-5 h-5"}),s.jsx(l,{className:"h-4 w-24"})]}),s.jsx(l,{className:"h-8 w-20"}),s.jsxs("div",{className:"flex-1 flex flex-col justify-end gap-2",children:[s.jsx(l,{className:"h-3 w-full"}),s.jsx(l,{className:"h-3 w-3/4"})]})]})}function n(){return s.jsxs("div",{className:"flex flex-col gap-3 h-full","aria-hidden":"true",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(l,{className:"w-5 h-5"}),s.jsx(l,{className:"h-4 w-24"})]}),s.jsx("div",{className:"flex-1 flex items-end gap-1",children:a.slice(0,8).map((e,a)=>s.jsx(l,{className:"flex-1",style:{height:`${e}%`}},a))})]})}function t({rows:e=5}){return s.jsxs("div",{className:"flex flex-col h-full","aria-hidden":"true",children:[s.jsx("div",{className:"pb-3 border-b border-border-subtle",children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(l,{className:"w-5 h-5"}),s.jsx(l,{className:"h-4 w-24"})]})}),s.jsx("div",{className:"flex-1 pt-3 flex flex-col gap-3",children:Array.from({length:e}).map((e,a)=>s.jsx(l,{className:"h-6 w-full"},a))})]})}function d({children:a,className:l}){return s.jsx("div",{className:e("section-gap",l),children:a})}function x({children:a,className:l}){return s.jsx("div",{className:e("bento-section",l),children:a})}function m({title:e,icon:a,controls:l,subtitle:c}){return s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between sm:gap-3",children:[s.jsxs("h1",{className:"type-title text-text-primary flex items-center gap-2 sm:gap-3 h-9 min-w-0",children:[a&&s.jsx("span",{className:"w-5 h-5 sm:w-6 sm:h-6 text-icon-page-title flex-shrink-0",children:a}),s.jsx("span",{className:"truncate",children:e})]}),l&&s.jsx("div",{className:"flex items-center gap-2 sm:gap-3 h-9 flex-shrink-0",children:l})]}),c&&s.jsx("div",{children:c})]})}const h={sm:"card-sm",md:"card-md",lg:"card-lg",hero:"card-hero",auto:"card-auto"};function f({children:a,size:l,compact:c,noPadding:r,className:d,style:x,onClick:m,isLoaded:f=!0,skeletonType:o="card"}){return s.jsxs("div",{className:e("surface-base rounded-2xl h-full flex flex-col relative",!r&&(c?"card-padding-sm":"card-padding"),l&&h[l],d),style:x,onClick:m,children:[a,!f&&(()=>{switch(o){case"chart":return s.jsx(n,{});case"list":return s.jsx(t,{});default:return s.jsx(i,{})}})()]})}export{x as B,i as C,r as L,d as P,l as S,f as a,m as b}; diff --git a/frontend/dist/assets/PathMapMapLibre-CFZlE15b.js b/frontend/dist/assets/PathMapMapLibre-CFZlE15b.js new file mode 100644 index 00000000..a5b27848 --- /dev/null +++ b/frontend/dist/assets/PathMapMapLibre-CFZlE15b.js @@ -0,0 +1 @@ +import{r as e,j as t,c as o}from"./vendor-react-Cwum97tW.js";import{u as r,M as i,B as n,S as a,L as s,a as l,P as d}from"./BasemapLayer-C9wiTbJT.js";import"./maplibre-gl-Bk5DsYkB.js";import{h as c,s as u,p as m}from"./useThemeColors-S-uaxvPT.js";import{c as p,a3 as h,B as x,m as g}from"./index-D22MpaCY.js";import{H as f}from"./house-D2cJ2w9-.js";import{u as b}from"./PacketList-DSZP-sF4.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-CDrKesoV.js";import"./payload-decoders-B_w2m9Or.js";import"./SignalIndicator-CBL6VSNS.js";import"./arrow-up-DysUUcGL.js";import"./DataBox-Bl0vntck.js";import"./chevron-right-CZNwXWtt.js";import"./loader-circle-2q9lT2qG.js";import"./map-pin-kiJDSdn0.js";import"./zap-Cpbok2bP.js";import"./triangle-alert-TfoZuZfW.js";import"./route-ExVvvUtv.js";import"./activity-Cb8TQBuo.js";import"./circle-check-CKXuJpMJ.js";import"./index-bDa2a9Y2.js";const v=p("car",[["path",{d:"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2",key:"5owen"}],["circle",{cx:"7",cy:"17",r:"2",key:"u2ysq9"}],["path",{d:"M9 17h6",key:"r8uit2"}],["circle",{cx:"17",cy:"17",r:"2",key:"axvx0g"}]]),y={version:8,sources:{},layers:[],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},j={nodeColor:"#4338CA",localColor:"#4F46E5",hubColor:"#6366F1",edgeColor:"#3B3F4A",ambiguousColor:"#F9D26F",highlightColor:"#B49DFF",sourceColor:"#39D98A",destinationColor:"#B49DFF"};function C(e,t){if(!e)return t;if(e.startsWith("#"))return e;const o=m(e);return o?`#${o.r.toString(16).padStart(2,"0")}${o.g.toString(16).padStart(2,"0")}${o.b.toString(16).padStart(2,"0")}`:t}function k(){if("undefined"==typeof document)return j;const e=document.documentElement,t=getComputedStyle(e);return{nodeColor:C(t.getPropertyValue("--map-node-stroke").trim(),j.nodeColor),localColor:C(t.getPropertyValue("--map-local-color").trim(),j.localColor),hubColor:C(t.getPropertyValue("--map-hub-color").trim(),j.hubColor),edgeColor:C(t.getPropertyValue("--map-edge-rest").trim(),j.edgeColor),ambiguousColor:C(t.getPropertyValue("--accent-secondary").trim(),j.ambiguousColor),highlightColor:C(t.getPropertyValue("--accent-primary").trim(),j.highlightColor),sourceColor:C(t.getPropertyValue("--accent-success").trim(),j.sourceColor),destinationColor:C(t.getPropertyValue("--accent-primary").trim(),j.destinationColor)}}function N({prefix:r,isLocal:i,isSource:n,isDestination:a,isLastHop:s,isHighlighted:l,isAnimating:d,isWardrive:c,candidate:u,onHover:m,onLeave:p,onClick:h}){const y=b(),[j,C]=e.useState(!1);e.useEffect(()=>{d&&y.start({boxShadow:["0 0 0 0px rgba(113, 156, 223, 0)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 0px rgba(113, 156, 223, 0)"],transition:{duration:.5,times:[0,.2,.7,1],ease:"easeInOut"}})},[d,y]);const k=e.useCallback(()=>{C(!0),m()},[m]),N=e.useCallback(()=>{C(!1),p()},[p]);return c?t.jsxs(g.div,{className:o("flex items-center cursor-pointer","transition-all duration-150",l&&"ring-2 ring-accent-primary/50 rounded-full",j&&"relative z-50"),animate:y,initial:{boxShadow:"0 0 0 0px rgba(249, 115, 22, 0)"},onMouseEnter:k,onMouseLeave:N,onClick:h,style:{pointerEvents:"auto"},children:[t.jsx("div",{className:o("flex items-center justify-center","w-7 h-7 rounded-full","bg-orange-500 text-white","shadow-lg border-2 border-orange-300/50","transition-transform duration-150",j&&"scale-110"),children:t.jsx(v,{className:"w-4 h-4",strokeWidth:2.5})}),j&&t.jsxs(x,{color:"orange",filled:!0,className:"ml-1 text-[10px] font-mono shadow-lg",children:[r,u.name&&t.jsx("span",{className:"ml-1 opacity-75",children:u.name})]})]}):t.jsx(g.div,{className:o("flex items-center cursor-pointer","transition-all duration-150",l&&"ring-2 ring-accent-primary/50 rounded",j&&"relative z-50"),animate:y,initial:{boxShadow:"0 0 0 0px rgba(113, 156, 223, 0)"},onMouseEnter:k,onMouseLeave:N,onClick:h,style:{pointerEvents:"auto"},children:t.jsxs(x,{color:c?"orange":i?"amber":n?"green":s?"amber":a?"purple":"blue",filled:!0,className:"font-mono text-[10px] shadow-lg border border-current/30",children:[i&&t.jsx(f,{className:"w-2.5 h-2.5 mr-1"}),r,j&&u.name&&t.jsx("span",{className:"ml-1 opacity-75",children:u.name})]})})}function S({hopNumber:e,snr:o,edgeColor:r}){return t.jsxs("div",{className:"flex flex-col items-center gap-0.5 pointer-events-none",children:[t.jsx("span",{className:"w-3.5 h-3.5 rounded-full flex items-center justify-center font-mono font-bold tabular-nums shadow-md",style:{backgroundColor:r||"#71717a",color:"#fff",fontSize:"8px",lineHeight:1,textShadow:"0 1px 1px rgba(0,0,0,0.4)"},children:e}),void 0!==o&&t.jsx(x,{color:"zinc",compact:!0,className:"!text-[9px] font-mono tabular-nums shadow-sm",children:o.toFixed(1)})]})}function w({resolvedPath:m,localNode:p,hubNodes:x=[],hoveredHopIndex:g,onHoverHop:f,traceSnr:b}){const v=void 0!==b&&b.length>0,j=e.useRef(null),C=r(),w=e.useMemo(()=>new Set(x),[x]),[F,L]=e.useState(null),D=h(),[E,M]=e.useState(!1),[P,H]=e.useState(0);e.useEffect(()=>{var e;const t=null==(e=j.current)?void 0:e.getMap();if(!t)return;const o=t.getCanvas();if(!o)return;const r=e=>{e.preventDefault()},i=()=>{H(e=>e+1)};return o.addEventListener("webglcontextlost",r),o.addEventListener("webglcontextrestored",i),()=>{o.removeEventListener("webglcontextlost",r),o.removeEventListener("webglcontextrestored",i)}},[P]);const{positions:$,markers:B,edges:A}=e.useMemo(()=>{const e=[],t=[],o=[],r=[];let i=0,n=!1;return m.hops.forEach((a,s)=>{const l=a.candidates.filter(e=>{return t=e.latitude,o=e.longitude,0!==t||0!==o;var t,o});if(0===l.length)return;const d=[...l].sort((e,t)=>t.probability-e.probability)[0],m=[d.longitude,d.latitude];if(r.push(m),r.length>=2){const e=r[r.length-2],t=r.length-2,i=null==b?void 0:b[t],a=m[0]-e[0],s=m[1]-e[1],l=Math.atan2(a,s)*(180/Math.PI),d=k();let p;p=n?"#F97316":void 0!==i?c()[u(i)]||"#71717a":d.edgeColor,o.push({from:e,to:m,snrFwd:i,midpoint:[(e[0]+m[0])/2,(e[1]+m[1])/2],bearing:l,color:p,isFromWardrive:n})}const p=!0===a.isSource,h=!0===a.isDestination,x=!0===d.isWardrive;n=x,l.forEach((o,r)=>{const n=[o.latitude,o.longitude];e.push(n);const d=0===r;t.push({position:n,prefix:a.prefix,confidence:a.confidence,candidateCount:l.length,hopIndex:s,candidate:o,isHub:w.has(o.hash),isPrimary:d,isSource:p,isDestination:h,validIndex:i})}),i++}),{positions:e,markers:t,edges:o}},[m,w,b]),I=e.useMemo(()=>{const e=B.filter(e=>e.isPrimary&&(e.confidence>=.5||e.isSource||e.isDestination));if(0===e.length)return null;let t=1/0,o=-1/0,r=1/0,i=-1/0;for(const n of e){const[e,a]=n.position;eo&&(o=e),ai&&(i=a)}return[[r,t],[i,o]]},[B]),V=e.useMemo(()=>{if(0===$.length)return p?[p.longitude,p.latitude]:[0,0];let e=0,t=0;for(const[o,r]of $)e+=o,t+=r;return[t/$.length,e/$.length]},[$,p]),W=e.useCallback(()=>{var e;const t=null==(e=j.current)?void 0:e.getMap();t&&I?(t.fitBounds(I,{padding:{top:50,bottom:50,left:50,right:50},maxZoom:15,duration:0}),setTimeout(()=>{M(!0)},50)):M(!0)},[I]),z=e.useMemo(()=>I?`${I[0][0].toFixed(5)},${I[0][1].toFixed(5)},${I[1][0].toFixed(5)},${I[1][1].toFixed(5)}`:"",[I]);e.useEffect(()=>{var e;if(!E)return;const t=null==(e=j.current)?void 0:e.getMap();t&&I&&t.fitBounds(I,{padding:{top:50,bottom:50,left:50,right:50},maxZoom:15,duration:300})},[z,E,I]);const R=D&&E,O=e.useCallback(e=>{L({longitude:e.position[1],latitude:e.position[0],marker:e})},[]);return 0===$.length?t.jsx("div",{className:"h-full flex items-center justify-center text-text-muted text-sm bg-bg-elevated",children:"No mappable path data"}):t.jsxs("div",{className:"h-full w-full relative",children:[t.jsx("div",{className:o("absolute inset-0 bg-bg-elevated flex items-center justify-center","transition-opacity duration-200 ease-out pointer-events-none",R?"opacity-0":"opacity-100"),children:t.jsx("div",{className:"w-5 h-5 border-2 border-text-muted/30 border-t-text-muted rounded-full animate-spin"})}),t.jsx("div",{className:"h-full w-full transition-opacity duration-300 ease-out",style:{opacity:R?1:0},children:t.jsxs(i,{ref:j,initialViewState:{longitude:V[0],latitude:V[1],zoom:10},onLoad:W,style:{height:"100%",width:"100%"},mapStyle:y,attributionControl:!1,children:[t.jsx(n,{mode:C}),A.map((e,o)=>{const r={type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:[e.from,e.to]}}]};return t.jsx(a,{id:`edge-${o}`,type:"geojson",data:r,children:t.jsx(s,{id:`edge-line-${o}`,type:"line",paint:{"line-color":e.color,"line-width":4,"line-opacity":1},layout:{"line-cap":"round","line-join":"round"}})},`edge-${o}`)}),A.map((e,o)=>t.jsx(l,{longitude:e.midpoint[0],latitude:e.midpoint[1],anchor:"center",children:t.jsx(S,{hopNumber:o+1,snr:v?e.snrFwd:void 0,edgeColor:e.color})},`hop-${o}`)),(()=>{const e=B.filter(e=>e.isPrimary),o=e.length>1?e.length-2:-1;return e.map((e,r)=>{const i=g===e.hopIndex,n=r===o&&!e.candidate.isLocal&&!e.isDestination;return t.jsx(l,{longitude:e.position[1],latitude:e.position[0],anchor:"center",children:t.jsx(N,{prefix:e.prefix,isLocal:e.candidate.isLocal||!1,isSource:e.isSource,isDestination:e.isDestination,isLastHop:n,isHighlighted:i,isAnimating:!1,isWardrive:e.candidate.isWardrive||!1,candidate:e.candidate,onHover:()=>null==f?void 0:f(e.hopIndex),onLeave:()=>null==f?void 0:f(null),onClick:()=>O(e)})},`${e.hopIndex}-${e.candidate.hash}`)})})(),F&&t.jsx(d,{longitude:F.longitude,latitude:F.latitude,anchor:"bottom",offset:[0,-12],closeOnClick:!1,onClose:()=>L(null),className:"maplibre-popup",children:t.jsxs("div",{className:"text-xs",children:[t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("span",{className:"font-semibold",children:F.marker.candidate.name}),(()=>{const e=k();return t.jsxs(t.Fragment,{children:[F.marker.isSource&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.sourceColor,color:"#000"},children:"SRC"}),F.marker.isDestination&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.destinationColor,color:"#000"},children:"DST"}),F.marker.isHub&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.hubColor,color:"#000"},children:"HUB"}),F.marker.candidate.isLocal&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.localColor,color:"#fff"},children:"LOCAL"}),F.marker.candidate.isWardrive&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:"#F97316",color:"#fff"},children:"WARDRIVE"})]})})()]}),t.jsxs("div",{className:"text-text-muted font-mono text-[10px]",children:[F.marker.prefix," • ",F.marker.candidate.hash.slice(0,10),"..."]}),!F.marker.isPrimary&&F.marker.candidateCount>1&&t.jsxs("div",{style:{color:k().ambiguousColor},children:["Alternative (",(100*F.marker.candidate.probability).toFixed(0),"%)"]}),F.marker.isPrimary&&F.marker.candidateCount>1&&t.jsxs("div",{className:"text-text-muted",children:[F.marker.candidateCount," candidates"]})]})})]},P)})]})}export{w as default}; diff --git a/frontend/dist/assets/PathMapMapLibre-DyVKbFr_.js b/frontend/dist/assets/PathMapMapLibre-DyVKbFr_.js deleted file mode 100644 index ffe67947..00000000 --- a/frontend/dist/assets/PathMapMapLibre-DyVKbFr_.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e,j as t,c as o}from"./vendor-react-DFCqJxYC.js";import{u as r,M as n,B as i,S as a,L as s,a as l,P as d}from"./BasemapLayer-B5scdheQ.js";import"./maplibre-gl-Bk5DsYkB.js";import{f as c,s as u,p as m}from"./useThemeColors-CzhUM4y-.js";import{c as p,ab as h,B as x,m as g}from"./index-CZBrdv20.js";import{H as f}from"./house-BPemXMFi.js";import{u as b}from"./PacketList-C0Zwn6jt.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-Dhs13Wlh.js";import"./SignalIndicator-FtRKgdkw.js";import"./arrow-up-Bv56Dbd2.js";import"./DataBox-BuwfTaKv.js";import"./chevron-right-CchtyLvr.js";import"./loader-circle-BLG0SL8e.js";import"./map-pin-BnrkOs2D.js";import"./zap-DOkzycJm.js";import"./triangle-alert-DlaBoont.js";import"./packet-CCmg5Y4j.js";import"./route-CHkUVMnV.js";import"./chevron-up-Cn6bmTpb.js";import"./circle-check-BQrKpAc_.js";import"./index-BKfnA8uz.js";const v=p("car",[["path",{d:"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2",key:"5owen"}],["circle",{cx:"7",cy:"17",r:"2",key:"u2ysq9"}],["path",{d:"M9 17h6",key:"r8uit2"}],["circle",{cx:"17",cy:"17",r:"2",key:"axvx0g"}]]),y={version:8,sources:{},layers:[],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},j={nodeColor:"#4338CA",localColor:"#4F46E5",hubColor:"#6366F1",edgeColor:"#3B3F4A",ambiguousColor:"#F9D26F",highlightColor:"#B49DFF",sourceColor:"#39D98A",destinationColor:"#B49DFF"};function C(e,t){if(!e)return t;if(e.startsWith("#"))return e;const o=m(e);return o?`#${o.r.toString(16).padStart(2,"0")}${o.g.toString(16).padStart(2,"0")}${o.b.toString(16).padStart(2,"0")}`:t}function k(){if("undefined"==typeof document)return j;const e=document.documentElement,t=getComputedStyle(e);return{nodeColor:C(t.getPropertyValue("--map-node-stroke").trim(),j.nodeColor),localColor:C(t.getPropertyValue("--map-local-color").trim(),j.localColor),hubColor:C(t.getPropertyValue("--map-hub-color").trim(),j.hubColor),edgeColor:C(t.getPropertyValue("--map-edge-rest").trim(),j.edgeColor),ambiguousColor:C(t.getPropertyValue("--accent-secondary").trim(),j.ambiguousColor),highlightColor:C(t.getPropertyValue("--accent-primary").trim(),j.highlightColor),sourceColor:C(t.getPropertyValue("--accent-success").trim(),j.sourceColor),destinationColor:C(t.getPropertyValue("--accent-primary").trim(),j.destinationColor)}}function N({prefix:r,isLocal:n,isSource:i,isDestination:a,isLastHop:s,isHighlighted:l,isAnimating:d,isWardrive:c,candidate:u,onHover:m,onLeave:p,onClick:h}){const y=b(),[j,C]=e.useState(!1);e.useEffect(()=>{d&&y.start({boxShadow:["0 0 0 0px rgba(113, 156, 223, 0)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 2px rgba(113, 156, 223, 0.5)","0 0 0 0px rgba(113, 156, 223, 0)"],transition:{duration:.5,times:[0,.2,.7,1],ease:"easeInOut"}})},[d,y]);const k=e.useCallback(()=>{C(!0),m()},[m]),N=e.useCallback(()=>{C(!1),p()},[p]);return c?t.jsxs(g.div,{className:o("flex items-center cursor-pointer","transition-all duration-150",l&&"ring-2 ring-accent-primary/50 rounded-full",j&&"relative z-50"),animate:y,initial:{boxShadow:"0 0 0 0px rgba(249, 115, 22, 0)"},onMouseEnter:k,onMouseLeave:N,onClick:h,style:{pointerEvents:"auto"},children:[t.jsx("div",{className:o("flex items-center justify-center","w-7 h-7 rounded-full","bg-orange-500 text-white","shadow-lg border-2 border-orange-300/50","transition-transform duration-150",j&&"scale-110"),children:t.jsx(v,{className:"w-4 h-4",strokeWidth:2.5})}),j&&t.jsxs(x,{color:"orange",filled:!0,className:"ml-1 text-[10px] font-mono shadow-lg",children:[r,u.name&&t.jsx("span",{className:"ml-1 opacity-75",children:u.name})]})]}):t.jsx(g.div,{className:o("flex items-center cursor-pointer","transition-all duration-150",l&&"ring-2 ring-accent-primary/50 rounded",j&&"relative z-50"),animate:y,initial:{boxShadow:"0 0 0 0px rgba(113, 156, 223, 0)"},onMouseEnter:k,onMouseLeave:N,onClick:h,style:{pointerEvents:"auto"},children:t.jsxs(x,{color:c?"orange":n?"amber":i?"green":s?"amber":a?"purple":"blue",filled:!0,className:"font-mono text-[10px] shadow-lg border border-current/30",children:[n&&t.jsx(f,{className:"w-2.5 h-2.5 mr-1"}),r,j&&u.name&&t.jsx("span",{className:"ml-1 opacity-75",children:u.name})]})})}function S({hopNumber:e,snr:o,edgeColor:r}){return t.jsxs("div",{className:"flex flex-col items-center gap-0.5 pointer-events-none",children:[t.jsx("span",{className:"w-3.5 h-3.5 rounded-full flex items-center justify-center font-mono font-bold tabular-nums shadow-md",style:{backgroundColor:r||"#71717a",color:"#fff",fontSize:"8px",lineHeight:1,textShadow:"0 1px 1px rgba(0,0,0,0.4)"},children:e}),void 0!==o&&t.jsx(x,{color:"zinc",compact:!0,className:"!text-[9px] font-mono tabular-nums shadow-sm",children:o.toFixed(1)})]})}function w({resolvedPath:m,localNode:p,hubNodes:x=[],hoveredHopIndex:g,onHoverHop:f,traceSnr:b}){const v=void 0!==b&&b.length>0,j=e.useRef(null),C=r(),w=e.useMemo(()=>new Set(x),[x]),[F,L]=e.useState(null),D=h(),[E,M]=e.useState(!1),[P,H]=e.useState(0);e.useEffect(()=>{var e;const t=null==(e=j.current)?void 0:e.getMap();if(!t)return;const o=t.getCanvas();if(!o)return;const r=e=>{e.preventDefault()},n=()=>{H(e=>e+1)};return o.addEventListener("webglcontextlost",r),o.addEventListener("webglcontextrestored",n),()=>{o.removeEventListener("webglcontextlost",r),o.removeEventListener("webglcontextrestored",n)}},[P]);const{positions:$,markers:B,edges:A}=e.useMemo(()=>{const e=[],t=[],o=[],r=[];let n=0,i=!1;return m.hops.forEach((a,s)=>{const l=a.candidates.filter(e=>{return t=e.latitude,o=e.longitude,0!==t||0!==o;var t,o});if(0===l.length)return;const d=[...l].sort((e,t)=>t.probability-e.probability)[0],m=[d.longitude,d.latitude];if(r.push(m),r.length>=2){const e=r[r.length-2],t=r.length-2,n=null==b?void 0:b[t],a=m[0]-e[0],s=m[1]-e[1],l=Math.atan2(a,s)*(180/Math.PI),d=k();let p;p=i?"#F97316":void 0!==n?c()[u(n)]||"#71717a":d.edgeColor,o.push({from:e,to:m,snrFwd:n,midpoint:[(e[0]+m[0])/2,(e[1]+m[1])/2],bearing:l,color:p,isFromWardrive:i})}const p=!0===a.isSource,h=!0===a.isDestination,x=!0===d.isWardrive;i=x,l.forEach((o,r)=>{const i=[o.latitude,o.longitude];e.push(i);const d=0===r;t.push({position:i,prefix:a.prefix,confidence:a.confidence,candidateCount:l.length,hopIndex:s,candidate:o,isHub:w.has(o.hash),isPrimary:d,isSource:p,isDestination:h,validIndex:n})}),n++}),{positions:e,markers:t,edges:o}},[m,w,b]),I=e.useMemo(()=>{const e=B.filter(e=>e.isPrimary&&(e.confidence>=.5||e.isSource||e.isDestination));if(0===e.length)return null;let t=1/0,o=-1/0,r=1/0,n=-1/0;for(const i of e){const[e,a]=i.position;eo&&(o=e),an&&(n=a)}return[[r,t],[n,o]]},[B]),V=e.useMemo(()=>{if(0===$.length)return p?[p.longitude,p.latitude]:[0,0];let e=0,t=0;for(const[o,r]of $)e+=o,t+=r;return[t/$.length,e/$.length]},[$,p]),W=e.useCallback(()=>{var e;const t=null==(e=j.current)?void 0:e.getMap();t&&I?(t.fitBounds(I,{padding:{top:50,bottom:50,left:50,right:50},maxZoom:15,duration:0}),setTimeout(()=>{M(!0)},50)):M(!0)},[I]),z=e.useMemo(()=>I?`${I[0][0].toFixed(5)},${I[0][1].toFixed(5)},${I[1][0].toFixed(5)},${I[1][1].toFixed(5)}`:"",[I]);e.useEffect(()=>{var e;if(!E)return;const t=null==(e=j.current)?void 0:e.getMap();t&&I&&t.fitBounds(I,{padding:{top:50,bottom:50,left:50,right:50},maxZoom:15,duration:300})},[z,E,I]);const R=D&&E,O=e.useCallback(e=>{L({longitude:e.position[1],latitude:e.position[0],marker:e})},[]);return 0===$.length?t.jsx("div",{className:"h-full flex items-center justify-center text-text-muted text-sm bg-bg-elevated",children:"No mappable path data"}):t.jsxs("div",{className:"h-full w-full relative",children:[t.jsx("div",{className:o("absolute inset-0 bg-bg-elevated flex items-center justify-center","transition-opacity duration-200 ease-out pointer-events-none",R?"opacity-0":"opacity-100"),children:t.jsx("div",{className:"w-5 h-5 border-2 border-text-muted/30 border-t-text-muted rounded-full animate-spin"})}),t.jsx("div",{className:"h-full w-full transition-opacity duration-300 ease-out",style:{opacity:R?1:0},children:t.jsxs(n,{ref:j,initialViewState:{longitude:V[0],latitude:V[1],zoom:10},onLoad:W,style:{height:"100%",width:"100%"},mapStyle:y,attributionControl:!1,children:[t.jsx(i,{mode:C}),A.map((e,o)=>{const r={type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:[e.from,e.to]}}]};return t.jsx(a,{id:`edge-${o}`,type:"geojson",data:r,children:t.jsx(s,{id:`edge-line-${o}`,type:"line",paint:{"line-color":e.color,"line-width":4,"line-opacity":1},layout:{"line-cap":"round","line-join":"round"}})},`edge-${o}`)}),A.map((e,o)=>t.jsx(l,{longitude:e.midpoint[0],latitude:e.midpoint[1],anchor:"center",children:t.jsx(S,{hopNumber:o+1,snr:v?e.snrFwd:void 0,edgeColor:e.color})},`hop-${o}`)),(()=>{const e=B.filter(e=>e.isPrimary),o=e.length>1?e.length-2:-1;return e.map((e,r)=>{const n=g===e.hopIndex,i=r===o&&!e.candidate.isLocal&&!e.isDestination;return t.jsx(l,{longitude:e.position[1],latitude:e.position[0],anchor:"center",children:t.jsx(N,{prefix:e.prefix,isLocal:e.candidate.isLocal||!1,isSource:e.isSource,isDestination:e.isDestination,isLastHop:i,isHighlighted:n,isAnimating:!1,isWardrive:e.candidate.isWardrive||!1,candidate:e.candidate,onHover:()=>null==f?void 0:f(e.hopIndex),onLeave:()=>null==f?void 0:f(null),onClick:()=>O(e)})},`${e.hopIndex}-${e.candidate.hash}`)})})(),F&&t.jsx(d,{longitude:F.longitude,latitude:F.latitude,anchor:"bottom",offset:[0,-12],closeOnClick:!1,onClose:()=>L(null),className:"maplibre-popup",children:t.jsxs("div",{className:"text-xs",children:[t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("span",{className:"font-semibold",children:F.marker.candidate.name}),(()=>{const e=k();return t.jsxs(t.Fragment,{children:[F.marker.isSource&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.sourceColor,color:"#000"},children:"SRC"}),F.marker.isDestination&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.destinationColor,color:"#000"},children:"DST"}),F.marker.isHub&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.hubColor,color:"#000"},children:"HUB"}),F.marker.candidate.isLocal&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:e.localColor,color:"#fff"},children:"LOCAL"}),F.marker.candidate.isWardrive&&t.jsx("span",{className:"px-1 py-0.5 text-[8px] font-bold rounded",style:{backgroundColor:"#F97316",color:"#fff"},children:"WARDRIVE"})]})})()]}),t.jsxs("div",{className:"text-text-muted font-mono text-[10px]",children:[F.marker.prefix," • ",F.marker.candidate.hash.slice(0,10),"..."]}),!F.marker.isPrimary&&F.marker.candidateCount>1&&t.jsxs("div",{style:{color:k().ambiguousColor},children:["Alternative (",(100*F.marker.candidate.probability).toFixed(0),"%)"]}),F.marker.isPrimary&&F.marker.candidateCount>1&&t.jsxs("div",{className:"text-text-muted",children:[F.marker.candidateCount," candidates"]})]})})]},P)})]})}export{w as default}; diff --git a/frontend/dist/assets/SignalIndicator-CBL6VSNS.js b/frontend/dist/assets/SignalIndicator-CBL6VSNS.js new file mode 100644 index 00000000..60c7c83b --- /dev/null +++ b/frontend/dist/assets/SignalIndicator-CBL6VSNS.js @@ -0,0 +1 @@ +import{c as e}from"./index-D22MpaCY.js";import{c as n,j as a,r}from"./vendor-react-Cwum97tW.js";const t=e("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]),s=e("circle-x",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]),i=e("signal-high",[["path",{d:"M2 20h.01",key:"4haj6o"}],["path",{d:"M7 20v-4",key:"j294jx"}],["path",{d:"M12 20v-8",key:"i3yub9"}],["path",{d:"M17 20V8",key:"1tkaf5"}]]),o=e("signal-low",[["path",{d:"M2 20h.01",key:"4haj6o"}],["path",{d:"M7 20v-4",key:"j294jx"}]]),l=e("signal-medium",[["path",{d:"M2 20h.01",key:"4haj6o"}],["path",{d:"M7 20v-4",key:"j294jx"}],["path",{d:"M12 20v-8",key:"i3yub9"}]]),c=e("signal-zero",[["path",{d:"M2 20h.01",key:"4haj6o"}]]),u=e("signal",[["path",{d:"M2 20h.01",key:"4haj6o"}],["path",{d:"M7 20v-4",key:"j294jx"}],["path",{d:"M12 20v-8",key:"i3yub9"}],["path",{d:"M17 20V8",key:"1tkaf5"}],["path",{d:"M22 4v16",key:"sih9yq"}]]),d={ADVERT:"purple",ACK:"emerald",REQ:"sky",RESPONSE:"sky",TXT_MSG:"teal",GRP_TXT:"teal",FLOOD:"sky",GRP_DATA:"indigo",PATH:"amber",MULTIPART:"violet",TRACE:"orange",ANON_REQ:"pink",RAW_CUSTOM:"fuchsia"},p={FLOOD:"sky",T_FLOOD:"sky",DIRECT:"cyan",T_DIRECT:"cyan"},x={rx:"sky",forward:"teal",duplicate:"zinc",tx:"amber",dropped:"rose"},h={neighbor:"amber",hub:"purple",gateway:"indigo",backbone:"purple",repeater:"teal",room:"pink",companion:"blue",client:"indigo",mobile:"orange"},f={hub:"amber",backbone:"purple",relay:"cyan",edge:"brown"},g={high:"green",medium:"amber",low:"orange",insufficient:"brown"},m={direct:"amber",multihop:"brown"},y={5:-2.5,6:-5,7:-7.5,8:-10,9:-12.5,10:-15,11:-17.5,12:-20},M={62500:{5:-123,6:-125,7:-127,8:-130,9:-133,10:-136,11:-138,12:-140},125e3:{5:-120,6:-122,7:-124,8:-127,9:-130,10:-133,11:-135,12:-137},25e4:{5:-117,6:-119,7:-121,8:-124,9:-127,10:-130,11:-132,12:-134},5e5:{5:-114,6:-116,7:-118,8:-121,9:-124,10:-127,11:-129,12:-131}};function k(e,n,a){if(null==e||!Number.isFinite(e))return null;if(null==n||!Number.isFinite(n))return null;const{sf:r,bwHz:t}=a,s=function(e){const n=Math.max(5,Math.min(12,Math.round(e)));return y[n]??y[7]}(r),i=function(e,n){let a=62500;a=e>=375e3?5e5:e>=187500?25e4:e>=93750?125e3:62500;const r=M[a];return r[Math.max(5,Math.min(12,Math.round(n)))]??r[7]}(t,r),o=e-s,l=n-i;return{snrMargin:o,rssiMargin:l,worstMargin:Math.min(o,l)}}const b={EXCELLENT:6,GOOD:3,FAIR:0},w={EXCELLENT:10,GOOD:6,FAIR:2},j=["excellent","good","fair","poor","critical"];function N(e,n){return e>=n.EXCELLENT?"excellent":e>=n.GOOD?"good":e>=n.FAIR?"fair":e>=n.FAIR-3?"poor":"critical"}function v(e,n){if(0===n)return e;const a=j.indexOf(e),r=Math.min(a+n,j.length-1);return j[r]}function E(e,n,a,r){const t=(s=N(e.snrMargin,b),i=N(e.rssiMargin,w),j.indexOf(s)>=j.indexOf(i)?s:i);var s,i;const o=v(t,n);return{baseGrade:t,finalGrade:o,snrMargin:e.snrMargin,rssiMargin:e.rssiMargin,worstMargin:e.worstMargin,nfPenalty:n,wasDowngraded:n>0&&o!==t,confidence:a,isMarginBased:r}}function A(e,n,a,r=0){return a&&null!=e?function(e,n,a,r=0){const t=k(e,n,a);return t?E(t,r,"high",!0):null}(e,n,a,r):null!=e&&null!=n?function(e,n,a=0){const r=function(e,n){return k(e,n,{sf:7,bwHz:62500})}(e,n);return r?E(r,a,"low",!0):null}(e,n,r):function(e,n=0){if(null==e||!Number.isFinite(e))return null;const a=function(e){return e>=-90?"excellent":e>=-100?"good":e>=-110?"fair":e>=-120?"poor":"critical"}(e),r=v(a,n);return{baseGrade:a,finalGrade:r,snrMargin:null,rssiMargin:null,worstMargin:null,nfPenalty:n,wasDowngraded:n>0&&r!==a,confidence:"low",isMarginBased:!1}}(n,r)}const O={excellent:"color(display-p3 0.00 1.00 0.00)",good:"color(display-p3 0.55 0.90 0.15)",fair:"color(display-p3 1.00 0.85 0.00)",weak:"color(display-p3 1.00 0.55 0.15)",poor:"color(display-p3 1.00 0.20 0.20)"},T={excellent:"#4ADE80",good:"#A3E635",fair:"#FACC15",weak:"#FB923C",poor:"#EF4444"};function C(e){return e>=-90?"excellent":e>=-100?"good":e>=-110?"fair":e>=-120?"weak":"poor"}function R(e,n){return n?{backgroundColor:T[e],"--p3-color":O[e]}:{backgroundColor:"rgba(255, 255, 255, 0.1)"}}function D(e){return e?"signal-bar-active":""}function F({rssi:e,className:r="w-4 h-4"}){const t=C(e),s=function(e){switch(e){case"excellent":return"text-signal-excellent";case"good":return"text-signal-good";case"fair":return"text-signal-fair";case"weak":return"text-signal-poor";case"poor":return"text-signal-critical";default:return"text-text-muted"}}(t),d=n(s,r);switch(t){case"excellent":return a.jsx(u,{className:d});case"good":return a.jsx(i,{className:d});case"fair":return a.jsx(l,{className:d});case"weak":return a.jsx(o,{className:d});default:return a.jsx(c,{className:d})}}const G=r.memo(function({rssi:e,snr:r,compact:t=!1,showValues:s=!0,radioConfig:i,nfPenalty:o=0}){const l=void 0!==r?function(e,n,a,r=0){const t=A(n,e,a,r);return t?function(e){switch(e){case"excellent":return"excellent";case"good":return"good";case"fair":return"fair";case"poor":return"weak";case"critical":return"poor"}}(t.finalGrade):C(e)}(e,r,i,o):C(e),c={excellent:4,good:3,fair:2,weak:1,poor:0}[l];return t?a.jsxs("div",{className:"flex items-center gap-1.5",children:[s&&a.jsx("span",{className:"text-[10px] font-mono text-text-secondary tabular-nums w-[32px] text-left",children:e}),a.jsx("div",{className:"flex items-end gap-[2px] h-3 w-[14px]",children:Array.from({length:4}).map((e,r)=>a.jsx("div",{className:n("w-[3px] rounded-[1px] transition-colors",D(ra.jsx("div",{className:n("w-[3px] rounded-[1px] transition-colors",D(r=375e3?5e5:e>=187500?25e4:e>=93750?125e3:62500;const r=y[a];return r[Math.max(5,Math.min(12,Math.round(n)))]??r[7]}(t,r),o=e-s,l=n-i;return{snrMargin:o,rssiMargin:l,worstMargin:Math.min(o,l)}}const k={EXCELLENT:6,GOOD:3,FAIR:0},b={EXCELLENT:10,GOOD:6,FAIR:2},w=["excellent","good","fair","poor","critical"];function j(e,n){return e>=n.EXCELLENT?"excellent":e>=n.GOOD?"good":e>=n.FAIR?"fair":e>=n.FAIR-3?"poor":"critical"}function N(e,n){if(0===n)return e;const a=w.indexOf(e),r=Math.min(a+n,w.length-1);return w[r]}function v(e,n,a,r){const t=(s=j(e.snrMargin,k),i=j(e.rssiMargin,b),w.indexOf(s)>=w.indexOf(i)?s:i);var s,i;const o=N(t,n);return{baseGrade:t,finalGrade:o,snrMargin:e.snrMargin,rssiMargin:e.rssiMargin,worstMargin:e.worstMargin,nfPenalty:n,wasDowngraded:n>0&&o!==t,confidence:a,isMarginBased:r}}function E(e,n,a,r=0){return a&&null!=e?function(e,n,a,r=0){const t=M(e,n,a);return t?v(t,r,"high",!0):null}(e,n,a,r):null!=e&&null!=n?function(e,n,a=0){const r=function(e,n){return M(e,n,{sf:7,bwHz:62500})}(e,n);return r?v(r,a,"low",!0):null}(e,n,r):function(e,n=0){if(null==e||!Number.isFinite(e))return null;const a=function(e){return e>=-90?"excellent":e>=-100?"good":e>=-110?"fair":e>=-120?"poor":"critical"}(e),r=N(a,n);return{baseGrade:a,finalGrade:r,snrMargin:null,rssiMargin:null,worstMargin:null,nfPenalty:n,wasDowngraded:n>0&&r!==a,confidence:"low",isMarginBased:!1}}(n,r)}const A={excellent:"color(display-p3 0.00 1.00 0.00)",good:"color(display-p3 0.55 0.90 0.15)",fair:"color(display-p3 1.00 0.85 0.00)",weak:"color(display-p3 1.00 0.55 0.15)",poor:"color(display-p3 1.00 0.20 0.20)"},O={excellent:"#4ADE80",good:"#A3E635",fair:"#FACC15",weak:"#FB923C",poor:"#EF4444"};function T(e){return e>=-90?"excellent":e>=-100?"good":e>=-110?"fair":e>=-120?"weak":"poor"}function C(e,n){return n?{backgroundColor:O[e],"--p3-color":A[e]}:{backgroundColor:"rgba(255, 255, 255, 0.1)"}}function R(e){return e?"signal-bar-active":""}function D({rssi:e,className:r="w-4 h-4"}){const t=T(e),u=function(e){switch(e){case"excellent":return"text-signal-excellent";case"good":return"text-signal-good";case"fair":return"text-signal-fair";case"weak":return"text-signal-poor";case"poor":return"text-signal-critical";default:return"text-text-muted"}}(t),d=n(u,r);switch(t){case"excellent":return a.jsx(c,{className:d});case"good":return a.jsx(s,{className:d});case"fair":return a.jsx(o,{className:d});case"weak":return a.jsx(i,{className:d});default:return a.jsx(l,{className:d})}}const F=r.memo(function({rssi:e,snr:r,compact:t=!1,showValues:s=!0,radioConfig:i,nfPenalty:o=0}){const l=void 0!==r?function(e,n,a,r=0){const t=E(n,e,a,r);return t?function(e){switch(e){case"excellent":return"excellent";case"good":return"good";case"fair":return"fair";case"poor":return"weak";case"critical":return"poor"}}(t.finalGrade):T(e)}(e,r,i,o):T(e),c={excellent:4,good:3,fair:2,weak:1,poor:0}[l];return t?a.jsxs("div",{className:"flex items-center gap-1.5",children:[s&&a.jsx("span",{className:"text-[10px] font-mono text-text-secondary tabular-nums w-[32px] text-left",children:e}),a.jsx("div",{className:"flex items-end gap-[2px] h-3 w-[14px]",children:Array.from({length:4}).map((e,r)=>a.jsx("div",{className:n("w-[3px] rounded-[1px] transition-colors",R(ra.jsx("div",{className:n("w-[3px] rounded-[1px] transition-colors",R(r((e,t,a)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a)(e,"symbol"!=typeof t?t+"":t,a);import{r as n,j as r,R as l,m as i,g as o,C as c,n as C,Y as A,T as D,i as B}from"./vendor-react-DFCqJxYC.js";import{aG as F,aH as E,aI as m,ar as d,c as u,k as h,aJ as x,aK as p,ah as g,aL as f,j as y,aM as b,aN as v,aO as j,au as k,aP as N,aQ as w,av as M,q as S,t as T,r as P,n as R,aE as $,V as L,v as z,I as H,aR as _,x as O,aS as W,X as I,R as q,aT as V}from"./index-CZBrdv20.js";import{u as G}from"./usePolling-ZH_j5bYw.js";import{a as K,b as X,u as Y,c as Q,d as U,e as Z,s as J}from"./useThemeColors-CzhUM4y-.js";import{L as ee,H as te,R as se}from"./route-CHkUVMnV.js";import{C as ae}from"./compass-ipowibkG.js";import{E as ne,A as re,T as le}from"./TimeRangeSelector-CDHWyMqL.js";import{a as ie,P as oe,b as ce,B as Ce}from"./PageLayout-Dz1NyqHa.js";import{D as Ae}from"./DataBox-BuwfTaKv.js";import{C as De}from"./CollisionExplorerModal-CX6f3IBB.js";import{C as Be,a as Fe}from"./Card-BiYlryJL.js";import{I as Ee}from"./info-pu09_Xxl.js";import{T as me}from"./triangle-alert-DlaBoont.js";import{G as de}from"./git-branch-CU4ha9LK.js";import{R as ue,C as he}from"./Grid-TNw012c2.js";import{N as xe}from"./network-Did0WXxt.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-Dhs13Wlh.js";import"./index-BKfnA8uz.js";import"./BasemapLayer-B5scdheQ.js";import"./maplibre-gl-Bk5DsYkB.js";import"./map-pin-BnrkOs2D.js";const pe={acton:{discrete:["#260D40","#2B1345","#2F194B","#342152","#382657","#3C2C5C","#403261","#443766","#483E6C","#4C4371","#504876","#544D7B","#57527F","#5D5884","#625C88","#685F8A","#6E618C","#74628D","#7B638D","#81638E","#88648E","#8E648E","#95658F","#9D658F","#A4668F","#AB6690","#B26790","#BB6992","#C26B94","#C86F97","#CD749B","#D07AA0","#D382A7","#D688AC","#D88FB2","#D995B8","#DB9CBD","#DEA4C4","#DFABC9","#E1B1CE","#E3B7D3","#E5BED8","#E6C5DE","#E8CBE2","#E9D0E6","#EBD6EA","#ECDBEE","#EDE1F3","#EFE6F6","#F0EAFA"],categorical:["#260D40","#F0EAFA","#A76690","#DDA1C2","#585380","#7D638E","#E8CAE1","#CF789E","#403261","#4C4371","#ECDBEE","#69608B","#E3B6D2","#D78CB0","#91648F","#BE6A92","#342152","#EAD3E8","#524B79","#73628D","#463A69","#605B86","#E5C0DA","#D382A7","#C86F97","#86648E","#EEE3F4","#DA97B9","#9B658F","#B26790","#2D1749","#E0ACCA","#3A2959","#8B648E","#311C4D","#EBD7EB","#EDDFF1","#AC6790","#A1668F","#6E618C","#E6C5DE","#78628D","#433665","#DEA7C6","#81638E","#554F7C","#B86891","#3D2D5D","#4F4775","#EFE7F7","#E9CEE4","#D27DA3","#2A1244","#655D89","#C36C94","#E1B1CE","#493F6D","#5C5783","#CC739A","#DB9CBD","#D892B4","#D587AB","#96658F","#E4BBD6","#362455","#4E4573","#7F638E","#D37FA5","#E1AECC","#382657","#EBD9ED","#DFA9C8","#A4668F","#8E648E","#99658F","#675F8A","#B56891","#BB6992","#E5BED8","#E2B4D0","#D07AA0","#71618C","#E6C2DC","#AA6690","#625C88","#EDE1F3","#E8CCE3","#AF6790","#CA7199","#C16B93","#453867","#57517E","#84638E","#4B416F","#E7C7DF","#423463","#514977","#3E2F5F","#544D7B","#93658F"]},bam:{discrete:["#65024B","#701057","#7B1B61","#88276E","#923078","#9B3881","#A4418A","#AC4993","#B5549C","#BC5CA3","#C266AB","#C970B2","#CF7AB9","#D587C1","#DA93C8","#DF9ECE","#E3AAD4","#E7B5DA","#EBC2E0","#EECCE5","#F1D5E9","#F3DDED","#F5E4F0","#F6EBF1","#F6EFF1","#F5F2F0","#F3F3ED","#EFF3E6","#EBF1DF","#E5EFD5","#DDEBCA","#D4E6BD","#C8DEAB","#BCD79B","#B0CE8C","#A3C67D","#97BC6F","#88B161","#7CA856","#72A04D","#679845","#5E903D","#538735","#4B7F2E","#427827","#397021","#306819","#245D10","#195507","#0D4C00"],categorical:["#65024B","#701057","#7B1B61","#88276E","#923078","#9B3881","#A4418A","#AC4993","#B5549C","#BC5CA3","#C266AB","#C970B2","#CF7AB9","#D587C1","#DA93C8","#DF9ECE","#E3AAD4","#E7B5DA","#EBC2E0","#EECCE5","#F1D5E9","#F3DDED","#F5E4F0","#F6EBF1","#F6EFF1","#F5F2F0","#F3F3ED","#EFF3E6","#EBF1DF","#E5EFD5","#DDEBCA","#D4E6BD","#C8DEAB","#BCD79B","#B0CE8C","#A3C67D","#97BC6F","#88B161","#7CA856","#72A04D","#679845","#5E903D","#538735","#4B7F2E","#427827","#397021","#306819","#245D10","#195507","#0D4C00"]},bamako:{discrete:["#003B47","#023C46","#053E45","#083F43","#0A4141","#0D4340","#0F443E","#12463C","#16483A","#194A38","#1C4D36","#204F34","#235132","#28542F","#2C572C","#305A2A","#355C27","#395F24","#3F6321","#44661E","#49691A","#4E6D17","#537014","#5A7410","#5F780D","#657C09","#6A7F05","#718302","#788501","#7F8700","#858800","#8C8A00","#948C01","#9B8E04","#A1920B","#A89713","#AE9C1B","#B7A225","#BEA82E","#C5AD37","#CBB341","#D2B84D","#D9BF5B","#DEC567","#E4CA73","#E9D07E","#EFD58A","#F5DB97","#FAE0A3","#FFE5AD"],categorical:["#003B47","#FFE5AD","#61790B","#B4A022","#245231","#406420","#898900","#DDC464","#0F443E","#EFD58A","#CAB23F","#194A38","#748401","#506E16","#9E9108","#315A29","#083F43","#A99815","#948C01","#6A7F05","#BFA930","#7F8700","#14473B","#1E4E35","#F7DD9C","#2A562D","#043D45","#597411","#E6CC77","#385F25","#48691B","#D4BB51","#0B4241","#8F8A00","#44661E","#1B4C37","#547113","#6F8203","#12463D","#998E03","#27542F","#4C6B18","#A4940E","#2E582B","#355C27","#B9A529","#215033","#EAD181","#FBE1A5","#C5AD37","#3C6122","#848800","#063E44","#E2C86E","#D9BF5B","#CFB648","#16493A","#798600","#023C46","#667C08","#5D770E","#0D433F","#AE9C1B","#F3D993","#094042","#A69611","#8C8A00","#053E45","#0C4240","#365E26","#6D8004","#9C8F05","#4A6A1A","#D6BD56","#B19E1F","#F9DFA0","#647B0A","#2F592A","#10453D","#818800","#C7AF3B","#46681C","#0E443F","#265330","#174A39","#335B28","#5B750F","#778501","#5F780D","#E8CF7C","#718302","#F1D78E","#978D02","#F5DB97","#204F34","#AC9A18","#29552E","#A1920B","#B7A225","#033C46"]},bamo:{discrete:["#4F3043","#56304B","#603354","#6D3961","#793F6B","#834675","#8D4E7E","#965587","#A05E91","#A86698","#B06EA0","#B877A7","#BF81AF","#C78DB8","#CD98BE","#D2A3C4","#D6ADC8","#D9B5CB","#DABECC","#DAC3CC","#D9C7CA","#D8CAC8","#D6CBC6","#D4CDC2","#D1CDBE","#CCCDB9","#C6CBB1","#BCC5A4","#B2BE97","#A7B58A","#9CAB7E","#92A174","#889669","#808D62","#79855C","#737D56","#6D7552","#666C4C","#616548","#5C5D45","#575642","#54503F","#50493D","#4D453C","#4B403B","#4A3C3A","#49393A","#49343B","#4A313E","#4E3042"],categorical:["#4F3043","#56304B","#603354","#6D3961","#793F6B","#834675","#8D4E7E","#965587","#A05E91","#A86698","#B06EA0","#B877A7","#BF81AF","#C78DB8","#CD98BE","#D2A3C4","#D6ADC8","#D9B5CB","#DABECC","#DAC3CC","#D9C7CA","#D8CAC8","#D6CBC6","#D4CDC2","#D1CDBE","#CCCDB9","#C6CBB1","#BCC5A4","#B2BE97","#A7B58A","#9CAB7E","#92A174","#889669","#808D62","#79855C","#737D56","#6D7552","#666C4C","#616548","#5C5D45","#575642","#54503F","#50493D","#4D453C","#4B403B","#4A3C3A","#49393A","#49343B","#4A313E","#4E3042"]},batlow:{discrete:["#011959","#06215B","#0A285C","#0D315D","#0E375E","#103D5F","#114260","#124761","#144D62","#165162","#195662","#1C5A62","#205E61","#26635F","#2C665D","#33695A","#3A6C57","#416F53","#4A724E","#52744A","#5A7745","#627941","#6A7B3D","#747E38","#7D8134","#868330","#8F862D","#9B892B","#A58B2C","#AF8D2E","#B98F32","#C29037","#CD923F","#D69446","#DE964F","#E69858","#ED9A62","#F39E70","#F8A17B","#FAA587","#FCA993","#FDAC9E","#FDB1AB","#FDB4B6","#FDB8C0","#FDBCCB","#FCBFD6","#FCC4E3","#FBC8EF","#FACCFA"],categorical:["#011959","#FACCFA","#828231","#226061","#F29D6D","#4D734D","#114360","#C09036","#FDB4B4","#DD954D","#356A59","#FCBFD6","#175262","#677B3E","#A18A2B","#0D315D","#FCA890","#FBC6E8","#2B655E","#B18D2F","#5A7745","#FDAEA2","#CF9340","#0F3B5F","#E9995C","#FDBAC4","#416F53","#91862D","#1B5962","#08255B","#747E38","#134B61","#F9A380","#8A842F","#0E365E","#124761","#154F62","#E39754","#7B8034","#1E5D62","#99882C","#195662","#0B2B5C","#FDB7BC","#C8913B","#FCC3DF","#EE9B64","#A98C2C","#FDB1AB","#FDBCCD","#FBC9F1","#051F5A","#F6A077","#607942","#FDAB9A","#477150","#3B6D56","#B98F32","#26635F","#537549","#D69446","#6D7C3B","#30685C","#103F60","#FBA689","#BD8F34","#CB923E","#EB9A60","#FDB8C0","#FBC7EC","#F09C69","#8E852E","#FDBBC9","#7F8133","#031C5A","#114160","#FDAC9E","#5D7844","#FCA995","#185462","#787F36","#A58B2C","#0A285C","#9D892B","#33695A","#0D335E","#637A40","#165062","#124561","#205E61","#144D62","#1D5B62","#0C2E5D","#D9954A","#3E6E55","#AD8C2D","#F49F72","#868330","#B58E30","#577647"]},batlowk:{discrete:["#04050A","#0A0D15","#0F141E","#121B29","#152233","#18293D","#1C3146","#21384F","#274156","#2C485B","#314E5E","#36535F","#3B575F","#405C5E","#445F5D","#49625B","#4D6558","#526756","#586B52","#5E6E4F","#63724B","#6A7548","#717845","#797D41","#81813E","#8A853B","#938839","#9F8D38","#A99139","#B3943B","#BE973E","#C89A43","#D39D4C","#DB9F54","#E2A15D","#E8A366","#EEA570","#F3A77C","#F6A986","#F8AC91","#FAAE9A","#FCB1A4","#FDB4B0","#FDB7B9","#FDBAC3","#FDBDCD","#FDC1D8","#FCC5E4","#FBC8EF","#FACCFA"],categorical:["#04050A","#FDC0D6","#787C41","#38555F","#E5A160","#536855","#AF933A","#FAAE9A","#1A2E43","#FDB6B7","#294458","#455F5C","#63724B","#CD9B47","#91883A","#F3A77E","#111A27","#F7AB8D","#FDBBC5","#FCB2AA","#D99E52","#A18E38","#4C6459","#21384F","#3F5B5E","#152335","#0C1019","#EEA570","#5B6D50","#6C7647","#314E5E","#85823D","#BE973E","#7E7F3F","#FBB0A2","#49625B","#576A53","#0F151F","#2D495B","#DFA059","#727944","#FDBDCD","#253E54","#EAA368","#C69942","#3C585F","#998B38","#677449","#F1A678","#F9AC92","#141F2F","#1D3248","#506657","#090C13","#A99139","#5F6F4E","#35525F","#435D5D","#FDB8BD","#F5A984","#B5953B","#FDB5B2","#17273B","#D39D4C","#8C853B","#9D8C38","#415C5E","#1F354B","#33505E","#FCB1A6","#101723","#3E595F","#121C2B","#757B43","#06080F","#FCB3AE","#3A565F","#274156","#61704D","#88843C","#2B475A","#FDBED1","#6A7548","#596C51","#192B3F","#6F7845","#233B51","#C99A45","#F0A574","#DC9F55","#2F4B5D","#47615C","#F6AA88","#FDB9C1","#C29840","#4A635A","#FAAD96","#81813E","#7B7E40","#E7A264"]},batloww:{discrete:["#011959","#06215B","#0A285C","#0D315D","#0E375E","#103D5F","#114260","#124761","#144C62","#165062","#185562","#1B5962","#1F5D62","#246261","#2A665F","#30695D","#366C5A","#3D7056","#467352","#4E764E","#56794A","#5E7C46","#667F42","#70823D","#798539","#828936","#8C8C33","#989032","#A29433","#AD9738","#B79B3F","#C19E48","#CBA154","#D3A45E","#D9A669","#DFA872","#E4AA7C","#E9AC88","#EEAF91","#F2B39C","#F6B9A8","#F9C0B5","#FCCAC4","#FED3CF","#FFDBDA","#FFE3E2","#FFEAEA","#FFF2F2","#FFF8F8","#FFFEFE"],categorical:["#FFFEFE","#011959","#7E8737","#205F61","#E7AB84","#497451","#114360","#FED1CD","#BF9D46","#637E44","#9E9233","#FFEAEA","#0D315D","#326B5C","#F5B7A6","#165162","#D7A564","#0F3B5F","#1A5862","#3D7056","#FFF5F5","#FFDFDD","#FAC3BA","#134A61","#08255B","#70823D","#EEB094","#56794A","#E0A874","#8E8D33","#28655F","#AF9839","#CBA154","#EBAD8B","#1D5C62","#051F5A","#124761","#FFE5E4","#B79B3F","#A79535","#386D59","#5C7B47","#185562","#DBA76D","#F8BDAF","#FFF0F0","#246261","#F2B39C","#868A35","#4F774D","#E4AA7C","#2D685E","#77853A","#FED8D6","#103F60","#FFFAF9","#968F32","#D1A35C","#144E62","#FCCAC4","#437254","#698040","#0E365E","#0B2B5C","#C59F4C","#30695D","#1C5A62","#A29433","#407155","#FFDBDA","#0C2E5D","#F7BAAA","#E5AB80","#175362","#828936","#1F5D62","#BB9C42","#E9AC88","#FFF7F7","#3A6E58","#9A9132","#8A8B34","#4C754F","#FFEDED","#D9A669","#144C62","#266460","#FDCDC9","#FCC6BF","#FFE2E1","#FFFCFC","#7B8639","#2B675E","#155062","#5F7C45","#F9C0B5","#356C5A","#F3B5A1","#EDAF8F","#FED5D2"]},berlin:{discrete:["#9EB0FF","#93AFFA","#87ADF4","#79ABED","#6CA9E6","#60A5DF","#54A0D5","#489ACA","#3E90BC","#3787AF","#327EA3","#2D7597","#296B8B","#25607C","#225771","#1E4E65","#1B465A","#183D4F","#153342","#122C38","#11242E","#101D25","#11181C","#121214","#160E0D","#1B0B07","#210B03","#270D01","#2D0E00","#340F00","#3B1100","#421301","#4B1602","#541905","#5D1E09","#68240F","#732B16","#803620","#8A3F2A","#944834","#9E513F","#A85A4A","#B46658","#BE6F63","#C8796F","#D2837A","#DD8D86","#EA9995","#F4A3A1","#FFADAD"],categorical:["#9EB0FF","#93AFFA","#87ADF4","#79ABED","#6CA9E6","#60A5DF","#54A0D5","#489ACA","#3E90BC","#3787AF","#327EA3","#2D7597","#296B8B","#25607C","#225771","#1E4E65","#1B465A","#183D4F","#153342","#122C38","#11242E","#101D25","#11181C","#121214","#160E0D","#1B0B07","#210B03","#270D01","#2D0E00","#340F00","#3B1100","#421301","#4B1602","#541905","#5D1E09","#68240F","#732B16","#803620","#8A3F2A","#944834","#9E513F","#A85A4A","#B46658","#BE6F63","#C8796F","#D2837A","#DD8D86","#EA9995","#F4A3A1","#FFADAD"]},bilbao:{discrete:["#4C0001","#54070B","#5B0E13","#64161A","#6B1D20","#712227","#77282D","#7D2E34","#84343B","#8A3A41","#8F4047","#94464B","#984C4F","#9B5253","#9D5754","#9E5C56","#A06057","#A16458","#A26959","#A36D5A","#A4715B","#A5745B","#A6785C","#A77C5D","#A8805E","#A9845F","#AA875F","#AC8C60","#AD9061","#AE9463","#AF9864","#B19D68","#B3A36E","#B6A975","#B8AD7E","#BBB287","#BDB590","#C0B99A","#C2BCA3","#C4BFAA","#C6C2B2","#C8C5B9","#CBCAC1","#CFCEC9","#D5D4D1","#DBDBDA","#E3E3E2","#EDEDED","#F6F6F6","#FFFFFF"],categorical:["#4C0001","#F8F8F8","#A9815E","#984D50","#BEB794","#AF9965","#CCCAC3","#78292F","#A26A59","#9F5D56","#64161A","#B6AA77","#C4C0AC","#A6765C","#8A3A41","#AC8C60","#DDDDDB","#A16358","#C7C5B7","#B3A16B","#A4705A","#6E2024","#EAEAE9","#92434A","#BAB185","#9C5554","#AD9262","#580B10","#813137","#C1BCA1","#AA865F","#D2D2CE","#A77C5D","#D7D7D4","#BCB48D","#B4A571","#C0B99A","#9E5955","#AB8960","#A6795C","#A36D5A","#8E3F46","#85353C","#A16758","#732529","#CAC7BD","#F1F1F0","#520509","#AC8F61","#5E1115","#C6C2B2","#E3E3E2","#691B1F","#B8AD7E","#95484D","#AE9663","#B19D68","#A5735B","#A06057","#9A5152","#A87E5D","#7D2E34","#A9835E","#C3BEA6","#CFCEC9","#A46E5A","#F4F4F4","#DADAD8","#B29F69","#EDEDED","#BBB289","#9D5754","#AF9764","#904148","#994F51","#B3A36E","#A87F5E","#A26859","#AC8D61","#BDB590","#AA875F","#A77A5D","#AB8A60","#A4715B","#611418","#BFB897","#E6E6E6","#9B5353","#D5D4D1","#974A4F","#C8C6BA","#A16558","#9F5E56","#76272C","#67191D","#8C3C43","#B9AF82","#C3BFA9","#B5A874","#4F0205"]},broc:{discrete:["#2C1A4C","#2B2154","#2B295B","#2A3164","#29396C","#284174","#29497C","#2A5183","#305C8C","#376593","#416D9A","#4B76A0","#567FA6","#6489AD","#6F92B3","#7B9BBA","#86A3C0","#92ACC6","#A0B7CD","#ACC0D3","#B8C9DA","#C4D2E0","#D0DBE6","#DEE5EC","#E7ECED","#EDEFE9","#EDEEE1","#E9E9D4","#E4E4C8","#DEDEBD","#D8D8B1","#D2D2A5","#C9C996","#C1C18A","#B8B87E","#AEAE73","#A3A369","#97975E","#8D8D56","#83834D","#797945","#70703D","#646434","#5B5B2C","#525224","#49491D","#404016","#36360F","#2E2E08","#262600"],categorical:["#2C1A4C","#2B2154","#2B295B","#2A3164","#29396C","#284174","#29497C","#2A5183","#305C8C","#376593","#416D9A","#4B76A0","#567FA6","#6489AD","#6F92B3","#7B9BBA","#86A3C0","#92ACC6","#A0B7CD","#ACC0D3","#B8C9DA","#C4D2E0","#D0DBE6","#DEE5EC","#E7ECED","#EDEFE9","#EDEEE1","#E9E9D4","#E4E4C8","#DEDEBD","#D8D8B1","#D2D2A5","#C9C996","#C1C18A","#B8B87E","#AEAE73","#A3A369","#97975E","#8D8D56","#83834D","#797945","#70703D","#646434","#5B5B2C","#525224","#49491D","#404016","#36360F","#2E2E08","#262600"]},broco:{discrete:["#372F38","#36303D","#363144","#36354E","#363957","#373F60","#39456A","#3C4D75","#415780","#47608A","#4D6992","#55729A","#5D7BA2","#6886AA","#728FB1","#7C97B7","#86A0BD","#91A8C2","#9DB2C8","#A7BACC","#B1C1CE","#BAC8D0","#C2CDD0","#CAD1CD","#CED3C8","#CFD3C2","#CFD1B9","#CBCCAD","#C6C6A2","#BFBF96","#B8B78B","#AFAF7F","#A4A472","#9B9A68","#91915E","#888755","#7E7E4C","#737243","#6B693D","#626137","#5B5932","#54512E","#4C482B","#474229","#423D29","#3F3829","#3C352B","#39322E","#383032","#372F37"],categorical:["#372F38","#36303D","#363144","#36354E","#363957","#373F60","#39456A","#3C4D75","#415780","#47608A","#4D6992","#55729A","#5D7BA2","#6886AA","#728FB1","#7C97B7","#86A0BD","#91A8C2","#9DB2C8","#A7BACC","#B1C1CE","#BAC8D0","#C2CDD0","#CAD1CD","#CED3C8","#CFD3C2","#CFD1B9","#CBCCAD","#C6C6A2","#BFBF96","#B8B78B","#AFAF7F","#A4A472","#9B9A68","#91915E","#888755","#7E7E4C","#737243","#6B693D","#626137","#5B5932","#54512E","#4C482B","#474229","#423D29","#3F3829","#3C352B","#39322E","#383032","#372F37"]},buda:{discrete:["#B301B3","#B30BAE","#B314AA","#B31CA6","#B323A2","#B3289F","#B32E9D","#B4339A","#B53998","#B63E96","#B84394","#B94892","#BB4C91","#BD528F","#BE568D","#C05B8C","#C15F8A","#C36389","#C46987","#C66D86","#C77184","#C97583","#CA7982","#CB7E80","#CD837F","#CE877E","#CF8B7D","#D0917B","#D1957A","#D29979","#D49E78","#D5A277","#D6A776","#D7AC75","#D8B073","#D9B572","#DAB971","#DCBF70","#DDC36F","#DEC86E","#DFCC6C","#E0D16B","#E2D76A","#E4DC69","#E6E168","#E9E667","#EDEC67","#F3F366","#F9F966","#FFFF66"],categorical:["#B301B3","#FFFF66","#CD857E","#BC4E90","#DBBD70","#C56A87","#B32F9C","#E3DB69","#D4A177","#EDEC67","#D1937B","#B73F95","#C05C8B","#DFCB6D","#C97882","#B31CA6","#D8AE74","#E7E368","#DAB572","#B311AC","#D39A79","#C36389","#C77184","#B53798","#E1D36B","#BE558E","#B94793","#CB7E80","#CF8C7C","#DDC46E","#B326A0","#F6F566","#D6A875","#DAB971","#C66E86","#E2D76A","#B32B9E","#B317A9","#B4339A","#BA4B91","#C46788","#C2608A","#B309AF","#D49E78","#B63B97","#BD528F","#DCC06F","#EAE767","#FAFA66","#D2977A","#F1F066","#D0907C","#CE897D","#C87483","#CC827F","#D5A576","#B321A3","#E5DF68","#B84394","#D9B273","#E0CF6C","#CA7B81","#DEC86E","#BF598C","#D7AB75","#E6E168","#D1957A","#CC8080","#D39C78","#E0CD6C","#CD847F","#B63D96","#C87384","#C66C86","#F8F866","#D49F78","#D9B473","#DAB772","#BF578D","#CB7D81","#CF8A7D","#B32D9D","#D08E7C","#DBBB71","#C2628A","#E2D56A","#DCBF70","#BC508F","#C46987","#C05B8C","#DFCA6D","#DDC26F","#C15E8B","#D7AD74","#F3F366","#DEC66E","#D5A377","#B31AA7","#BA4992","#CE877E"]},bukavu:{discrete:["#1A3333","#1B373D","#1C3C47","#1E4255","#1F4762","#214E71","#235582","#255E92","#2969A1","#2C73AD","#2F7CB8","#3485C2","#3B8EC7","#4799C8","#50A1C9","#59AAC9","#62B2CA","#6BBACB","#76C3CB","#81CCCD","#92D5D1","#A4DED5","#B6E7DA","#CCF2DF","#DDFBE3","#034224","#08491F","#115119","#1C5914","#2B6212","#3D6915","#4E6E1B","#617224","#6F742B","#7B7631","#867836","#917B3C","#9E7E45","#AA844F","#B48D5D","#BC976C","#C3A27C","#CAB08F","#CFBBA0","#D5C6B0","#DACFC1","#DFD7D0","#E4DFE0","#E9E6ED","#EDEDFC"],categorical:["#1A3333","#1B373D","#1C3C47","#1E4255","#1F4762","#214E71","#235582","#255E92","#2969A1","#2C73AD","#2F7CB8","#3485C2","#3B8EC7","#4799C8","#50A1C9","#59AAC9","#62B2CA","#6BBACB","#76C3CB","#81CCCD","#92D5D1","#A4DED5","#B6E7DA","#CCF2DF","#DDFBE3","#034224","#08491F","#115119","#1C5914","#2B6212","#3D6915","#4E6E1B","#617224","#6F742B","#7B7631","#867836","#917B3C","#9E7E45","#AA844F","#B48D5D","#BC976C","#C3A27C","#CAB08F","#CFBBA0","#D5C6B0","#DACFC1","#DFD7D0","#E4DFE0","#E9E6ED","#EDEDFC"]},cork:{discrete:["#2C194C","#2B2254","#2B295C","#2A3265","#293A6D","#284275","#284A7C","#2A5284","#2F5C8D","#366493","#3F6C99","#49749F","#527CA4","#5E85AA","#688DB0","#7395B6","#7E9DBB","#8AA6C2","#99B1C9","#A5BBD0","#B2C5D7","#C0CFDE","#CDD9E5","#DCE5EB","#E5ECED","#E6EEEA","#E0EAE1","#D4E2D4","#C8DBC8","#BCD3BC","#B0CAB0","#A4C2A3","#95B895","#89B088","#7DA87D","#71A071","#669966","#599059","#4F894E","#458244","#3B7B3A","#317430","#266A25","#1F611D","#1A5816","#174E12","#14450E","#123A0A","#103107","#0F2903"],categorical:["#2C194C","#2B2254","#2B295C","#2A3265","#293A6D","#284275","#284A7C","#2A5284","#2F5C8D","#366493","#3F6C99","#49749F","#527CA4","#5E85AA","#688DB0","#7395B6","#7E9DBB","#8AA6C2","#99B1C9","#A5BBD0","#B2C5D7","#C0CFDE","#CDD9E5","#DCE5EB","#E5ECED","#E6EEEA","#E0EAE1","#D4E2D4","#C8DBC8","#BCD3BC","#B0CAB0","#A4C2A3","#95B895","#89B088","#7DA87D","#71A071","#669966","#599059","#4F894E","#458244","#3B7B3A","#317430","#266A25","#1F611D","#1A5816","#174E12","#14450E","#123A0A","#103107","#0F2903"]},corko:{discrete:["#3F3E3A","#3E3D3F","#3E3D44","#3E3D4B","#3E3F52","#3E425A","#3F4762","#414C6C","#445578","#485D82","#4E658B","#546E94","#5C779C","#6581A5","#6E8AAC","#7792B2","#809BB8","#89A3BD","#94ACC2","#9CB3C5","#A3BAC7","#A9C0C8","#AEC5C7","#B0C9C4","#B0CABF","#ADCAB9","#A9C9B2","#A2C5A8","#9BC19F","#93BC95","#8BB68B","#82B081","#78A775","#709F6A","#689760","#608E56","#5A864C","#537B42","#4F733B","#4B6B35","#486431","#465D2E","#44562C","#43512C","#424D2D","#42492E","#414630","#404333","#404036","#3F3E3A"],categorical:["#3F3E3A","#3E3D3F","#3E3D44","#3E3D4B","#3E3F52","#3E425A","#3F4762","#414C6C","#445578","#485D82","#4E658B","#546E94","#5C779C","#6581A5","#6E8AAC","#7792B2","#809BB8","#89A3BD","#94ACC2","#9CB3C5","#A3BAC7","#A9C0C8","#AEC5C7","#B0C9C4","#B0CABF","#ADCAB9","#A9C9B2","#A2C5A8","#9BC19F","#93BC95","#8BB68B","#82B081","#78A775","#709F6A","#689760","#608E56","#5A864C","#537B42","#4F733B","#4B6B35","#486431","#465D2E","#44562C","#43512C","#424D2D","#42492E","#414630","#404333","#404036","#3F3E3A"]},davos:{discrete:["#00054A","#010E51","#041459","#081C61","#0C2368","#102A6F","#133075","#17377C","#1C3F83","#204588","#244C8D","#295291","#2D5895","#335F98","#38649A","#3C699C","#416E9D","#46729D","#4C779D","#517B9C","#567F9B","#5A829A","#5F8598","#658996","#698C94","#6E8F92","#739290","#78968D","#7D998C","#829D8A","#88A089","#8DA488","#95AA87","#9BAF88","#A3B489","#ABBB8C","#B4C190","#BFCA96","#C9D29E","#D2D9A6","#DBE0AF","#E3E7B8","#EBEDC4","#F0F1CD","#F4F4D6","#F7F7DE","#FAF9E6","#FCFCF0","#FDFDF7","#FEFEFE"],categorical:["#00054A","#FDFDF4","#688B94","#2D5895","#B2C08F","#E8EBC0","#87A089","#133075","#4B769D","#5A829A","#204588","#76958E","#D0D8A4","#99AD88","#F6F6DB","#3C699C","#081C61","#031256","#1A3B7F","#537C9C","#A4B68A","#C1CC98","#7E9A8B","#FAFAE8","#356199","#0E266B","#DEE3B3","#274F90","#6F9091","#618697","#8FA588","#F0F1CD","#43709D","#1D4084","#47739D","#F3F4D4","#658996","#567F9B","#17367A","#FCFBEE","#4F799D","#C9D29E","#93A987","#39659B","#D8DEAB","#ABBB8C","#739290","#B9C693","#F8F8E1","#234A8C","#112B70","#7A978D","#9EB188","#315C97","#829D8A","#05175B","#010C50","#3F6C9D","#0B2065","#5D8499","#2A5392","#8BA388","#6B8D93","#EDEFC7","#E3E7B8","#22488A","#638897","#122E73","#00094D","#AEBD8D","#4D789D","#CDD5A1","#5F8598","#58819A","#071A5E","#0C2368","#18387D","#91A787","#37639A","#EBEDC4","#F2F2D0","#FBFBEB","#74938F","#2F5A96","#335F98","#809B8B","#BDC995","#49759D","#719191","#9BAF88","#F7F7DE","#1B3E82","#A8B88B","#849E89","#557E9B","#E6E9BC","#45719D","#1E4386","#96AB87","#89A188"]},devon:{discrete:["#2C1A4C","#2B1E51","#2B2356","#2A295B","#2A2D60","#293265","#29376A","#283B6E","#274174","#27467A","#274C7F","#275186","#28568C","#2A5C95","#2D609C","#3064A3","#3468AA","#396BB1","#3F70B9","#4774C0","#4F79C6","#597DCC","#6382D1","#6F88D7","#798CDB","#8290DF","#8C95E2","#969AE6","#9E9EE9","#A6A3EB","#ACA7ED","#B1ACEF","#B7B1F0","#BBB5F1","#BFB9F2","#C3BEF3","#C7C2F4","#CCC7F4","#D0CCF5","#D4D0F6","#D8D4F7","#DCD9F8","#E1DEF9","#E5E3FA","#E9E7FB","#EDECFB","#F2F0FC","#F7F6FD","#FBFAFE","#FFFFFF"],categorical:["#2C1A4C","#F8F8FE","#758AD9","#C6C0F3","#28568C","#29376A","#AAA5ED","#DEDCF8","#3D6EB7","#EBE9FB","#9197E4","#3063A2","#274579","#577CCB","#D2CEF6","#2A285A","#BAB3F1","#B2ADEF","#F2F0FC","#274E82","#2A2F62","#CCC7F4","#9E9EE9","#4875C1","#C0BAF2","#2B5D98","#3669AD","#2B2154","#E4E2FA","#8290DF","#D8D4F7","#6784D3","#283E71","#C9C4F4","#BDB7F1","#DBD8F8","#283A6D","#4F79C6","#A4A2EB","#EEEDFC","#CFCBF5","#E8E5FA","#5F80CF","#4272BC","#B6B0F0","#2B1D50","#AEA9EE","#275287","#2A2B5E","#989BE7","#293366","#27497D","#8A94E1","#295A92","#3266A7","#F5F4FD","#7B8DDC","#274174","#2D609C","#2B2558","#6F88D7","#E1DEF9","#3A6CB2","#D5D1F6","#C3BEF3","#2E629F","#3165A4","#8D95E3","#3468AA","#DAD6F7","#D1CDF5","#9B9CE8","#275084","#B8B2F0","#27477B","#6382D1","#4573BF","#A2A0EA","#F7F6FD","#C7C2F4","#F3F2FD","#274376","#8692E0","#2B1F52","#CAC6F4","#ACA7ED","#E3E0F9","#F0EEFC","#E6E4FA","#386AB0","#2C1C4E","#6B86D5","#28396B","#283C6F","#2A5C95","#2A2D60","#BEB9F2","#C2BCF2","#7E8FDD","#3F70B9"]},fes:{discrete:["#0D0D0D","#181818","#212121","#2B2B2B","#343434","#3C3C3C","#454545","#4D4D4D","#565656","#5E5E5E","#656565","#6D6D6D","#747474","#7C7C7C","#848484","#8B8B8B","#939393","#9C9C9C","#A7A7A7","#B1B1B1","#BBBBBB","#C5C5C5","#D1D1D1","#DFDFDF","#ECECEC","#094225","#184822","#2B4F20","#3A5420","#485822","#555B24","#615E26","#6F6229","#7A652B","#86682E","#926B30","#9F7035","#AD7940","#B6834D","#BD8E5C","#C2996C","#C6A47C","#CCB18F","#D1BCA0","#D5C6B0","#DACFC1","#DFD7CF","#E4DFE0","#E8E6ED","#EDEDFC"],categorical:["#0D0D0D","#181818","#212121","#2B2B2B","#343434","#3C3C3C","#454545","#4D4D4D","#565656","#5E5E5E","#656565","#6D6D6D","#747474","#7C7C7C","#848484","#8B8B8B","#939393","#9C9C9C","#A7A7A7","#B1B1B1","#BBBBBB","#C5C5C5","#D1D1D1","#DFDFDF","#ECECEC","#094225","#184822","#2B4F20","#3A5420","#485822","#555B24","#615E26","#6F6229","#7A652B","#86682E","#926B30","#9F7035","#AD7940","#B6834D","#BD8E5C","#C2996C","#C6A47C","#CCB18F","#D1BCA0","#D5C6B0","#DACFC1","#DFD7CF","#E4DFE0","#E8E6ED","#EDEDFC"]},glasgow:{discrete:["#361338","#3B1434","#401530","#45172C","#491828","#4D1924","#511B21","#561C1D","#5B1E18","#602014","#662210","#6B260B","#6F2B07","#723203","#743802","#743E01","#754300","#744900","#744F01","#745402","#735905","#725F0B","#716413","#70691E","#6E6E27","#6C7231","#6B763A","#697B46","#677F4F","#658359","#648763","#628B6C","#618F78","#609381","#60978A","#619B94","#659F9D","#6CA5A8","#74A9B0","#7DADB8","#86B1BF","#8EB4C6","#99B9CE","#A1BCD5","#AABFDB","#B2C3E1","#BBC6E7","#C6CBF0","#D0CFF7","#DBD3FF"],categorical:["#361338","#DBD3FF","#6D702B","#69A3A5","#702D06","#A0BBD3","#638968","#521B20","#745101","#84B0BE","#754001","#5F9587","#BBC6E7","#612013","#45172C","#687D4A","#726210","#618F78","#4B1926","#3E1532","#629C96","#658359","#CACCF3","#76AAB2","#6B763A","#744900","#6A250C","#ADC1DD","#735905","#92B6C9","#591D1A","#743702","#70681C","#4F1A23","#754400","#6D2909","#60998E","#41162F","#744D00","#745503","#B4C3E2","#697A42","#7DADB8","#628C70","#8BB3C3","#561C1D","#D2D0F9","#99B9CE","#3A1435","#6F6C23","#743B01","#60927F","#662210","#648661","#659F9D","#678051","#725E0A","#481829","#6FA6AB","#6C7332","#5D1E17","#A6BED8","#C2C9ED","#723203","#716617","#68240E","#6F6A20","#C6CBF0","#79ABB5","#72600D","#754200","#43162D","#67A1A1","#6B7536","#5F1F15","#735B07","#571C1B","#72A8AF","#744F01","#BEC8EA","#381337","#8EB4C6","#628B6C","#677E4D","#60917B","#639E9A","#4A1827","#A3BDD6","#3C1433","#743901","#632112","#B7C5E5","#4D1924","#65845D","#618E74","#609483","#9CBAD1","#46172A","#87B1C1","#6D712F"]},grayc:{discrete:["#000000","#090909","#111111","#171717","#1C1C1C","#212121","#252525","#2A2A2A","#303030","#343434","#393939","#3D3D3D","#424242","#474747","#4B4B4B","#505050","#545454","#585858","#5D5D5D","#616161","#656565","#696969","#6D6D6D","#717171","#757575","#797979","#7D7D7D","#818181","#858585","#898989","#8E8E8E","#929292","#979797","#9C9C9C","#A1A1A1","#A6A6A6","#ABABAB","#B1B1B1","#B6B6B6","#BCBCBC","#C1C1C1","#C7C7C7","#CECECE","#D5D5D5","#DBDBDB","#E2E2E2","#E8E8E8","#F1F1F1","#F8F8F8","#FFFFFF"],categorical:["#070707","#F9F9F9","#777777","#454545","#AEAEAE","#909090","#292929","#5F5F5F","#D1D1D1","#9E9E9E","#525252","#E4E4E4","#6C6C6C","#BFBFBF","#1A1A1A","#373737","#848484","#595959","#222222","#B6B6B6","#A6A6A6","#3E3E3E","#7D7D7D","#666666","#969696","#8A8A8A","#4B4B4B","#DADADA","#C8C8C8","#313131","#717171","#131313","#EFEFEF","#C4C4C4","#A2A2A2","#424242","#878787","#252525","#2D2D2D","#4F4F4F","#3B3B3B","#808080","#1E1E1E","#BBBBBB","#AAAAAA","#EAEAEA","#696969","#7A7A7A","#DFDFDF","#636363","#565656","#B2B2B2","#0E0E0E","#9A9A9A","#5C5C5C","#747474","#F3F3F3","#333333","#6E6E6E","#D5D5D5","#8D8D8D","#939393","#494949","#CCCCCC","#171717","#BDBDBD","#575757","#C1C1C1","#404040","#828282","#E2E2E2","#151515","#1C1C1C","#0B0B0B","#9C9C9C","#858585","#2F2F2F","#B4B4B4","#888888","#242424","#272727","#3C3C3C","#B0B0B0","#353535","#545454","#5B5B5B","#393939","#D7D7D7","#A4A4A4","#A8A8A8","#959595","#767676","#646464","#989898","#444444","#474747","#111111","#F6F6F6","#ECECEC","#4D4D4D"]},hawaii:{discrete:["#8C0273","#8E0D6E","#8F1569","#901D63","#91235F","#91285A","#922D56","#933252","#94384D","#943D4A","#954246","#964742","#964C3F","#97523B","#985638","#985C34","#996131","#9A662E","#9B6C2A","#9B7226","#9C7823","#9C7E20","#9D841E","#9D8C1C","#9C921C","#9B991D","#9AA021","#97A828","#94AE30","#91B439","#8CB942","#88BE4C","#82C359","#7EC663","#79CA6E","#74CE79","#70D183","#6AD591","#66D89C","#62DCA7","#60DFB2","#5FE2BD","#61E6CA","#67E9D5","#6FEBDE","#7AEEE7","#87EFEE","#98F1F5","#A6F1F9","#B3F2FD"],categorical:["#8C0273","#B3F2FD","#9C951C","#6CD48C","#964D3E","#8ABC48","#9B6D29","#66E8D3","#922E55","#9C801F","#87EFEE","#995D34","#7BC969","#901D63","#60DEB0","#96AA2B","#943D4A","#975439","#82C359","#5FE4C2","#9AA021","#73CE7B","#65D99E","#954544","#9D8A1C","#8E126B","#91B439","#9DF1F7","#73ECE2","#91265C","#9C7724","#9A652E","#93364F","#922A59","#996131","#9D851D","#9D901C","#9A692C","#68D695","#902160","#9B9A1E","#985836","#9B7226","#933252","#77CC72","#9C7B21","#954147","#8D0A6F","#93AF32","#62DCA7","#92F0F3","#8F1867","#7DEEE8","#97513C","#6CEBDB","#61E6CA","#A8F2FA","#964941","#7FC661","#86BF50","#98A526","#70D183","#5FE1B9","#8DB840","#94394D","#9C7923","#8F1569","#985A35","#60E0B4","#9A6B2A","#91245E","#97A828","#9B7425","#6AD591","#95AD2E","#5FE2BD","#60E5C6","#953F48","#933054","#63E7CF","#84C154","#8D0671","#82EFEB","#9B9D1F","#99A323","#88BE4C","#6ED288","#6FEBDE","#9A672D","#91285A","#75CD76","#995F32","#68E9D7","#9B7028","#61DDAB","#943B4B","#933450","#8DF0F0","#8F1A65","#81C45D"]},imola:{discrete:["#1A33B3","#1C37B1","#1E3AAF","#203EAD","#2242AB","#2345AA","#2548A8","#274CA6","#2950A4","#2A53A3","#2C56A1","#2E599F","#2F5D9E","#32609B","#346499","#366797","#386A95","#3B6C92","#3E708F","#41738C","#44768A","#467987","#4A7C85","#4E8082","#518480","#56887E","#5A8C7D","#5F927B","#64967A","#689B79","#6DA078","#72A576","#78AB75","#7DB074","#82B572","#87BA71","#8CBF70","#93C66E","#98CB6D","#9ED06C","#A4D66A","#ACDB69","#B5E268","#BFE767","#C8EB67","#D3F066","#DDF466","#EAF866","#F5FB66","#FFFF66"],categorical:["#1A33B3","#FFFF66","#54867F","#305E9D","#91C36F","#3F718E","#2549A8","#BDE667","#70A377","#2B53A2","#376896","#80B373","#A3D56B","#DDF466","#203EAD","#487B86","#62947A","#2D59A0","#88BB71","#5B8D7D","#CDED66","#4E8082","#EEF966","#33639A","#284EA5","#44768A","#2344AA","#AFDE69","#3B6C92","#78AB75","#1D39B0","#99CC6D","#699C79","#3D6F90","#2C56A1","#2F5B9E","#5E917B","#4B7D84","#9ED06C","#1F3CAE","#C4EA67","#84B772","#274CA6","#D5F066","#2951A4","#74A776","#578A7E","#2446A9","#1C36B1","#A9D96A","#95C86E","#467888","#2141AC","#7CAF74","#356598","#B5E268","#66987A","#396A94","#F7FC66","#8CBF70","#E6F666","#32609B","#518380","#41738C","#6DA078","#6B9E78","#B9E468","#7AAD74","#528580","#32629B","#86B971","#3C6E91","#5C8F7C","#C8EB67","#ACDB69","#D1EF66","#E2F566","#97CA6D","#1B35B2","#1C37B0","#2345AA","#2F5D9E","#1F3DAE","#457789","#3A6B93","#598B7D","#D9F266","#346499","#386995","#A6D76A","#366797","#274DA6","#56887E","#A1D36B","#42748B","#7EB173","#72A576","#477987","#4C7F83","#F2FB66"]},lajolla:{discrete:["#191900","#1E1B02","#221C05","#271E08","#2C200B","#31220E","#362411","#3C2614","#442817","#4B2B1B","#532D1F","#5B3023","#633328","#6E362D","#783932","#813C37","#8B3F3B","#96423F","#A24543","#AD4746","#B74A48","#C04D49","#C9514B","#D1564C","#D75C4D","#DB634E","#DD694F","#E0714F","#E17750","#E37D50","#E48351","#E58951","#E79052","#E89652","#E99C52","#EAA253","#EBA853","#EDAF54","#EEB555","#F0BC57","#F1C25A","#F3CA5F","#F5D369","#F7DA74","#F9E282","#FBE890","#FCEF9F","#FDF5B0","#FEFABE","#FFFECB"],categorical:["#191900","#FFFECB","#D85F4D","#ECAC54","#653329","#F7D971","#A44544","#E58751","#362411","#E1744F","#C44E4A","#E99A52","#4B2B1B","#833D38","#F1C159","#FCEF9F","#271E08","#FEF7B6","#402716","#D0554C","#FAE587","#E79052","#EFB655","#B54947","#201C04","#E37D50","#743830","#DD694F","#EBA353","#94413E","#572F21","#F4CD61","#2E210C","#FDF3AB","#32220F","#241D06","#F5D369","#7B3B34","#1D1B02","#F0BC57","#5E3125","#F8DF7C","#512D1E","#CA514B","#E48251","#E68C51","#EA9E53","#E89552","#BC4C49","#6C362C","#EDB154","#9C4341","#E27950","#FBEA93","#3B2513","#FEFBC0","#452918","#EBA853","#F2C75C","#8B3F3B","#DB644E","#AD4746","#DF6E4F","#D55A4D","#2B200A","#783932","#E79352","#D75C4D","#FEF9BB","#EDAF54","#E0714F","#7F3C36","#613227","#F7DC77","#C7504B","#F1C45A","#30210D","#F4D065","#1E1B03","#FAE78D","#F9E282","#DA614E","#392412","#4E2C1D","#E99C52","#EFB956","#221C05","#EBA553","#FDF5B0","#984240","#E38050","#8F403D","#542E20","#ECAA54","#E68E51","#70372E","#DE6C4F","#B94A48","#291F09","#1B1A01"]},lapaz:{discrete:["#1A0C64","#1C1368","#1E196D","#202071","#212675","#222B79","#23317D","#253681","#263C85","#274189","#29478C","#2A4C8F","#2C5192","#2E5795","#305C98","#32609A","#35659C","#386A9E","#3C70A0","#3F74A1","#4379A2","#487DA3","#4D81A3","#5386A4","#588AA3","#5E8EA3","#6591A2","#6C95A1","#7398A0","#7A9A9E","#809D9D","#879F9B","#90A199","#97A397","#9EA596","#A5A795","#ADAA95","#B7AD96","#BFB199","#C8B69C","#D2BBA2","#DAC1A8","#E4C9B2","#EBCFBB","#F1D5C4","#F5DBCD","#F9E1D6","#FBE8E1","#FDEDEA","#FEF2F3"],categorical:["#1A0C64","#FEF2F3","#5B8BA3","#B3AC96","#2C5292","#3C70A0","#EACEB9","#859E9C","#24327E","#6F96A1","#33619A","#202071","#D0BAA0","#9BA496","#F9E1D6","#4A7FA3","#284289","#90A199","#FCEAE5","#1D176B","#37699D","#F3D8C8","#A7A895","#5285A4","#7A9A9E","#2F5A97","#4278A2","#263A84","#6591A2","#C1B299","#DEC3AB","#222978","#2A4B8E","#5688A4","#D7BEA6","#FDEEEC","#608EA3","#EFD3C0","#A1A696","#6A94A1","#FBE6DD","#ADAA95","#F6DDCF","#4E82A3","#2E5695","#3A6D9F","#C8B69C","#1C1268","#232D7B","#3F74A1","#467BA3","#1E1C6E","#7F9C9D","#BAAF97","#253681","#315E99","#29478C","#E4C9B2","#74989F","#273E87","#212575","#95A398","#8AA09A","#35659C","#2B4F91","#23307C","#E7CBB5","#F1D5C4","#2B4D90","#202373","#588AA3","#D3BCA3","#5487A4","#447AA2","#6792A2","#24347F","#253882","#ECD0BD","#879F9B","#305C98","#E1C6AF","#1E196D","#5D8DA3","#AAA995","#386B9E","#487DA3","#77999F","#F7DFD3","#BEB098","#1F1E70","#325F99","#4176A2","#F4DACB","#4C80A3","#2D5494","#8DA099","#6C95A1","#FAE3DA","#FDECE8","#B7AD96"]},lipari:{discrete:["#031326","#05192F","#062038","#092844","#0C2E4D","#103557","#163C5F","#1E4368","#294B70","#345075","#3E5578","#47587A","#4F5B7B","#575C7A","#5D5D79","#635E78","#695E76","#6E5F75","#765F73","#7C6071","#826070","#89606E","#90616C","#98616A","#A06268","#A86266","#B06364","#BA6462","#C36660","#CB685F","#D46B5E","#DB705F","#E27760","#E77E63","#E98567","#EA8D6B","#EA946F","#E89C75","#E7A279","#E6A87E","#E5AF84","#E5B58A","#E6BD92","#E7C49A","#EACCA3","#EDD3AD","#F0DBB7","#F5E5C4","#F9EDCF","#FDF5DA"],categorical:["#031326","#FDF5DA","#A56267","#525B7A","#E99B74","#785F72","#DA6F5E","#183E61","#E7C398","#8D616D","#365176","#092844","#655E77","#E98466","#BF6561","#F0DBB7","#E5AD82","#B26364","#EBCFA7","#5C5D79","#061D35","#25486D","#0E3353","#EA906D","#98616A","#E37861","#E5B88C","#826070","#CD685F","#6E5F75","#45587A","#F6E8C9","#E7A37A","#615E78","#E77E63","#D46B5E","#9F6268","#E99570","#93616B","#87606E","#7D6071","#F3E1C0","#575C7A","#0B2D4B","#2D4D72","#E6A87E","#E9C99F","#FAEED1","#1E4368","#EA8A69","#B86462","#6A5E76","#AB6365","#735F74","#DF735F","#E5B287","#13385A","#05182D","#E6BD92","#3E5578","#EDD5AF","#07223C","#C6665F","#4C5A7A","#E8A077","#B56363","#FBF1D6","#A26267","#E6C095","#0A2A48","#F8EBCD","#EACCA3","#AE6364","#7A5F72","#635E78","#E98768","#041629","#715F74","#ECD2AB","#A86266","#8A606E","#96616B","#545C7A","#EFD8B3","#F5E5C4","#9B6169","#F2DEBB","#765F73","#6C5F75","#294B70","#22466B","#E89D76","#E88165","#BC6461","#E6A67C","#85606F","#C36660","#1B4064","#D06A5E","#103557"]},lisbon:{discrete:["#E6E5FF","#D8DCF7","#CBD2EF","#BBC6E5","#ADBCDE","#A0B3D6","#93A9CE","#86A0C6","#7794BD","#6A8BB5","#5E81AC","#5177A4","#456E9B","#38628F","#2F5984","#274F78","#20476D","#1B3F61","#173653","#142E48","#12283E","#112233","#111D2A","#121921","#15181B","#181A18","#1E1D17","#252419","#2D2B1C","#353220","#3E3A25","#46422A","#514C31","#5A5536","#645E3C","#6D6741","#777047","#837B4F","#8D8556","#988F5E","#A29A67","#ADA470","#B9B17D","#C3BC89","#CDC795","#D7D2A2","#E0DCAF","#ECE9BE","#F5F4CB","#FFFFD9"],categorical:["#E6E5FF","#D8DCF7","#CBD2EF","#BBC6E5","#ADBCDE","#A0B3D6","#93A9CE","#86A0C6","#7794BD","#6A8BB5","#5E81AC","#5177A4","#456E9B","#38628F","#2F5984","#274F78","#20476D","#1B3F61","#173653","#142E48","#12283E","#112233","#111D2A","#121921","#15181B","#181A18","#1E1D17","#252419","#2D2B1C","#353220","#3E3A25","#46422A","#514C31","#5A5536","#645E3C","#6D6741","#777047","#837B4F","#8D8556","#988F5E","#A29A67","#ADA470","#B9B17D","#C3BC89","#CDC795","#D7D2A2","#E0DCAF","#ECE9BE","#F5F4CB","#FFFFD9"]},managua:{discrete:["#FFCF67","#F9C564","#F3BB60","#EBB05D","#E5A659","#DF9D56","#D99554","#D38C51","#CC824D","#C67B4B","#C07348","#B96C46","#B36444","#AB5C41","#A4553F","#9D4F3D","#95483C","#8E423A","#843B39","#7C3639","#743139","#6D2D3A","#662A3D","#5F2941","#5A2846","#552A4C","#522C53","#4F315D","#4D3566","#4C3B6F","#4C4179","#4C4883","#4D518E","#4F5897","#51609F","#5367A7","#556FAE","#5878B6","#5B80BC","#5E88C2","#6190C8","#6498CE","#68A3D5","#6BACDB","#6FB5E1","#72BEE6","#76C7EC","#7AD3F3","#7DDDF9","#81E7FF"],categorical:["#FFCF67","#F9C564","#F3BB60","#EBB05D","#E5A659","#DF9D56","#D99554","#D38C51","#CC824D","#C67B4B","#C07348","#B96C46","#B36444","#AB5C41","#A4553F","#9D4F3D","#95483C","#8E423A","#843B39","#7C3639","#743139","#6D2D3A","#662A3D","#5F2941","#5A2846","#552A4C","#522C53","#4F315D","#4D3566","#4C3B6F","#4C4179","#4C4883","#4D518E","#4F5897","#51609F","#5367A7","#556FAE","#5878B6","#5B80BC","#5E88C2","#6190C8","#6498CE","#68A3D5","#6BACDB","#6FB5E1","#72BEE6","#76C7EC","#7AD3F3","#7DDDF9","#81E7FF"]},navia:{discrete:["#031327","#041930","#051E3A","#052546","#062B50","#06315A","#073764","#083E6D","#0B4578","#0E4C80","#115286","#15588B","#195E8E","#1E6491","#216991","#246D91","#27718F","#2A748E","#2D788C","#307A8A","#337D89","#368087","#398385","#3C8683","#3F8981","#428C7F","#468F7D","#4A937A","#4E9678","#529A76","#579E73","#5BA271","#62A86E","#67AD6B","#6EB269","#76B768","#7FBD68","#8CC56A","#98CB6F","#A4D176","#B1D67F","#BCDB89","#C9E096","#D3E3A1","#DCE7AC","#E3EAB6","#EAEDBF","#F1F0CA","#F7F2D2","#FCF4D9"],categorical:["#031327","#FCF4D9","#408A80","#87C269","#1B608F","#59A072","#073966","#D1E39F","#2F798B","#EAEDBF","#052546","#266F90","#6BB06A","#0E4D81","#AED57D","#4C947A","#378186","#DFE8B0","#337D89","#2A748E","#14578A","#051C36","#9ACC70","#0A4374","#468F7D","#529A76","#F4F1CD","#062F56","#C1DC8D","#206891","#78B968","#62A86E","#3C8583","#569D74","#236C91","#F8F3D3","#D8E5A8","#0C487B","#04182E","#71B469","#B8D985","#07345E","#05213E","#4F9778","#5DA470","#3E8882","#062A4E","#7FBD68","#EFEFC6","#C9E096","#115286","#2C768D","#1E6491","#49917B","#66AC6C","#28718F","#A4D176","#90C76C","#438C7F","#175C8D","#083E6D","#E5EAB8","#317B8A","#357F87","#398385","#B3D781","#0D4A7E","#1C6290","#052342","#579F73","#9FCE73","#448D7E","#051A32","#FAF3D6","#428B7F","#29738F","#104F84","#5FA66F","#509877","#8CC56A","#094071","#2D788C","#083B6A","#D5E4A3","#2B758D","#226A91","#04162B","#BCDB89","#47907C","#4D9579","#E2E9B4","#7BBB68","#6EB269","#135488","#4A937A","#F1F0CA","#5BA271","#C5DE92","#F6F2D0","#CDE19B"]},naviaw:{discrete:["#041427","#051A31","#05203B","#062747","#072D52","#08345C","#0A3A66","#0C416F","#0F4979","#135080","#175686","#1B5D8A","#1F628D","#23698F","#276D8F","#2A728F","#2D758E","#30798D","#347D8B","#378089","#3A8388","#3D8686","#408984","#448C82","#489080","#4B937E","#50977C","#559C79","#5AA077","#5FA575","#65AA73","#6CAF71","#76B671","#7FBD71","#89C474","#95CB78","#A2D27F","#B1D98A","#BEDF95","#C9E5A1","#D3E9AD","#DBEDB9","#E4F1C6","#E9F4D0","#EEF6D9","#F2F8E1","#F6FAE9","#F9FCF1","#FCFDF7","#FEFEFD"],categorical:["#041427","#FBFDF6","#478F80","#9FD07D","#1F628D","#64A973","#E3F0C4","#0A3A66","#337C8B","#C7E49E","#7DBC71","#549B7A","#2A718F","#135080","#F2F8E1","#3C8586","#062747","#D7EBB2","#418A83","#B4DB8C","#2E778D","#6FB271","#EBF5D4","#0E4574","#051D37","#4D957D","#256B8F","#195A88","#388189","#F7FAEC","#5CA276","#8CC574","#073056","#31798C","#367E8A","#69AD72","#E7F3CC","#104A7A","#95CB78","#EFF6DB","#0B406D","#2C748E","#4A927F","#DDEEBB","#50987C","#165584","#589E78","#76B671","#3F8785","#05192F","#BEDF95","#448C82","#22678E","#06223F","#A9D684","#08355E","#CFE8A8","#F9FCF1","#286E8F","#85C172","#072C50","#F5F9E7","#1C5F8B","#3A8387","#60A675","#F3F9E4","#0C4271","#266D8F","#81BE72","#0A3D6A","#4B937E","#9ACD7B","#EDF5D7","#90C876","#A4D381","#378089","#1B5D8A","#489080","#145282","#DAECB6","#67AB73","#CBE6A3","#B9DD90","#3D8686","#23698F","#6CAF71","#FAFCF3","#79B971","#D3E9AD","#5AA077","#458E81","#72B471","#327B8C","#E5F1C8","#051B33","#F8FBEE","#062443","#398288","#2B728F","#06294C"]},nuuk:{discrete:["#05598C","#0E5B8B","#155C89","#1C5E87","#226085","#276184","#2C6383","#326682","#386982","#3E6C82","#446F82","#4A7283","#517584","#587A86","#5F7D88","#66818A","#6C858C","#73898E","#7B8E91","#819192","#879594","#8D9996","#939C97","#99A097","#9EA498","#A2A798","#A6AA97","#ABAD96","#AEAF95","#B1B194","#B3B492","#B6B690","#B8B88E","#BABA8C","#BDBC8A","#BFBE88","#C1C187","#C4C385","#C7C684","#CAC983","#CDCD83","#D2D184","#D7D787","#DDDD8B","#E3E290","#E8E895","#EEEE9C","#F4F4A4","#F9F9AB","#FEFEB2"],categorical:["#05598C","#FEFEB2","#A1A698","#537785","#C3C385","#B5B591","#7D8F91","#2D6483","#DDDD8B","#919B96","#BCBC8B","#3F6C82","#CDCD83","#1C5E87","#ADAE95","#68838B","#EEEE9C","#A7AA97","#879594","#C8C783","#F6F6A7","#135C89","#B9B98E","#497183","#73898E","#366882","#C0BF88","#D4D486","#99A097","#B1B293","#5E7D88","#256185","#E6E693","#829293","#788C90","#9DA398","#AAAC96","#E1E18F","#3B6A82","#638089","#B3B492","#A4A897","#446F82","#BABA8C","#D8D888","#185D88","#8C9895","#215F86","#BEBD89","#B7B78F","#CACA83","#4E7484","#C1C186","#959E97","#F2F2A1","#AFB094","#326682","#587A86","#296284","#FAFAAD","#6E868C","#C5C584","#D1D084","#0D5B8B","#E9E997","#DFDF8D","#66818A","#B0B194","#5B7B87","#2B6383","#859493","#CCCB83","#F8F8AA","#D2D285","#1F5F86","#70878D","#4B7383","#768B8F","#FCFCAF","#A9AB97","#BFBE88","#C9C983","#346782","#DBDA89","#236085","#BDBD8A","#BAB98D","#B8B88E","#2F6583","#939C97","#9FA498","#A2A798","#CFCF84","#B4B591","#C4C485","#979F97","#F0F09E","#155C89","#9BA298","#517584"]},oleron:{discrete:["#1A2659","#212E61","#293568","#323F72","#3A477A","#424F82","#4A578A","#535F92","#5D699C","#6572A5","#6E7BAE","#7784B7","#808DC0","#8B97CA","#94A1D3","#9DAADC","#A6B3E5","#AFBCEC","#B9C6F2","#C0CDF5","#C7D4F7","#CEDAF9","#D4E1FB","#DCE9FD","#E3F0FE","#1F4E00","#2C5100","#3A5600","#445900","#4F5C02","#5A6005","#65660C","#736D18","#7E7423","#8A7B2E","#94823A","#9F8945","#AC9253","#B79A5E","#C3A36A","#CEAC75","#D9B581","#E5C090","#EDC99D","#F2D2A9","#F6DAB5","#F8E2C0","#FAECCE","#FBF4DA","#FDFDE6"],categorical:["#1A2659","#212E61","#293568","#323F72","#3A477A","#424F82","#4A578A","#535F92","#5D699C","#6572A5","#6E7BAE","#7784B7","#808DC0","#8B97CA","#94A1D3","#9DAADC","#A6B3E5","#AFBCEC","#B9C6F2","#C0CDF5","#C7D4F7","#CEDAF9","#D4E1FB","#DCE9FD","#E3F0FE","#1F4E00","#2C5100","#3A5600","#445900","#4F5C02","#5A6005","#65660C","#736D18","#7E7423","#8A7B2E","#94823A","#9F8945","#AC9253","#B79A5E","#C3A36A","#CEAC75","#D9B581","#E5C090","#EDC99D","#F2D2A9","#F6DAB5","#F8E2C0","#FAECCE","#FBF4DA","#FDFDE6"]},oslo:{discrete:["#010101","#04070B","#060C13","#0A121B","#0C1620","#0D1927","#0E1D2D","#0F2133","#10263C","#112A43","#122E4A","#133251","#153758","#173C61","#194169","#1B4670","#1E4A78","#214F80","#255589","#295A91","#2E5F99","#3364A1","#3A6AA9","#4371B2","#4B77B9","#537DBE","#5B83C3","#6489C6","#6B8EC8","#7292C9","#7896C9","#7E9ACA","#859ECA","#8BA2C9","#91A6C9","#97A9C9","#9DADC9","#A4B2CA","#AAB6CA","#B1BBCB","#B8BFCD","#BFC5CF","#C7CCD3","#CFD2D8","#D7D9DD","#DEE0E2","#E6E7E9","#EFF0F1","#F7F7F8","#FFFFFF"],categorical:["#030609","#F9F9F9","#507BBC","#163B5E","#A0AFC9","#7B98CA","#27588E","#0E2032","#CACED5","#122D48","#3767A6","#1D4875","#8DA3C9","#E2E3E5","#678BC7","#B4BDCC","#0C151F","#BFC5CF","#97A9C9","#4371B2","#10263D","#080E16","#7292C9","#215081","#2E5F99","#AAB6CA","#ECEDEE","#0D1A28","#143454","#D5D8DC","#5B83C3","#19426A","#859ECA","#13314E","#0E1D2D","#3D6CAC","#6C8FC8","#7795C9","#F3F3F4","#4976B8","#245488","#DBDDE0","#112A43","#92A6C9","#C5C9D2","#809BCA","#0F2337","#3263A0","#050A10","#B9C1CD","#1F4C7B","#183E64","#A5B3CA","#0A121B","#9CACC9","#6187C5","#0D1824","#8AA1CA","#2A5B93","#547EBF","#D1D3D9","#E6E7E9","#1B456F","#B0BACB","#153758","#7494C9","#D8DADE","#6A8DC8","#90A5C9","#99ABC9","#235285","#133251","#060C13","#406EAF","#7E9ACA","#173C61","#4C78BA","#122F4B","#1C4772","#87A0CA","#CED1D7","#C2C7D1","#0F253A","#2C5D96","#C7CCD3","#112B45","#EFF0F1","#6F90C9","#0E1E2F","#ADB8CB","#7997CA","#4673B5","#15395B","#091018","#194067","#30619C","#94A8C9","#F6F6F6","#0F2135","#A3B1CA"]},roma:{discrete:["#7E1700","#832504","#883008","#8F3C0C","#934610","#984E14","#9C5717","#A05F1B","#A5681F","#A97023","#AD7826","#B0802B","#B58930","#BA9437","#BE9D3E","#C2A647","#C7B051","#CBBA5D","#CFC66D","#D1CF7B","#D2D78A","#D2DE98","#D0E4A6","#CBE8B4","#C4EABE","#BDEAC6","#B3E9CD","#A6E6D2","#9BE2D5","#8EDDD7","#81D7D7","#74CFD6","#64C6D5","#59BDD2","#4FB5D0","#46ACCC","#3EA4C9","#379AC5","#3292C2","#2E8ABF","#2B82BB","#287AB8","#2471B4","#2269B0","#1F60AD","#1C58A9","#194FA5","#1344A0","#0C3B9C","#033198"],categorical:["#7E1700","#832504","#883008","#8F3C0C","#934610","#984E14","#9C5717","#A05F1B","#A5681F","#A97023","#AD7826","#B0802B","#B58930","#BA9437","#BE9D3E","#C2A647","#C7B051","#CBBA5D","#CFC66D","#D1CF7B","#D2D78A","#D2DE98","#D0E4A6","#CBE8B4","#C4EABE","#BDEAC6","#B3E9CD","#A6E6D2","#9BE2D5","#8EDDD7","#81D7D7","#74CFD6","#64C6D5","#59BDD2","#4FB5D0","#46ACCC","#3EA4C9","#379AC5","#3292C2","#2E8ABF","#2B82BB","#287AB8","#2471B4","#2269B0","#1F60AD","#1C58A9","#194FA5","#1344A0","#0C3B9C","#033198"]},romao:{discrete:["#733957","#773850","#7A3849","#7E3942","#823C3D","#863F38","#8A4334","#8E4831","#94502E","#98572C","#9D5F2B","#A3672C","#A8712E","#AF7D32","#B58837","#BB933F","#C19F47","#C6AA52","#CDB761","#D1C26E","#D4CB7B","#D6D388","#D5D995","#D3DEA3","#CEE0AD","#C8E1B6","#C1E1BE","#B6DEC5","#ABDBC9","#A0D6CC","#94D0CE","#88C9CF","#7BC0CE","#70B8CD","#67AFCA","#5FA6C7","#589CC4","#5291BE","#4F88B9","#4E7EB3","#4F75AC","#516BA4","#55609A","#595891","#5D5087","#62497D","#664474","#6B3F69","#6F3B60","#723959"],categorical:["#733957","#773850","#7A3849","#7E3942","#823C3D","#863F38","#8A4334","#8E4831","#94502E","#98572C","#9D5F2B","#A3672C","#A8712E","#AF7D32","#B58837","#BB933F","#C19F47","#C6AA52","#CDB761","#D1C26E","#D4CB7B","#D6D388","#D5D995","#D3DEA3","#CEE0AD","#C8E1B6","#C1E1BE","#B6DEC5","#ABDBC9","#A0D6CC","#94D0CE","#88C9CF","#7BC0CE","#70B8CD","#67AFCA","#5FA6C7","#589CC4","#5291BE","#4F88B9","#4E7EB3","#4F75AC","#516BA4","#55609A","#595891","#5D5087","#62497D","#664474","#6B3F69","#6F3B60","#723959"]},tofino:{discrete:["#DED9FF","#D0CFF9","#C3C6F3","#B3BBEC","#A6B1E6","#98A8E1","#8B9FDB","#7E95D4","#6E89CB","#617FC3","#5575B8","#4A6BAC","#4262A0","#395790","#334F83","#2E4776","#293F6A","#24385D","#1F304F","#1B2943","#172338","#141D2E","#111824","#0F151B","#0D1516","#0D1712","#0F1B12","#112113","#142716","#162F19","#1A361C","#1D3E20","#224825","#26512A","#2A5A2E","#2E6233","#336C38","#39773E","#3F8144","#488B4A","#529551","#5FA059","#70AB63","#7FB46B","#8EBD73","#9DC57B","#ACCD83","#BDD68C","#CCDE94","#DBE69B"],categorical:["#DED9FF","#D0CFF9","#C3C6F3","#B3BBEC","#A6B1E6","#98A8E1","#8B9FDB","#7E95D4","#6E89CB","#617FC3","#5575B8","#4A6BAC","#4262A0","#395790","#334F83","#2E4776","#293F6A","#24385D","#1F304F","#1B2943","#172338","#141D2E","#111824","#0F151B","#0D1516","#0D1712","#0F1B12","#112113","#142716","#162F19","#1A361C","#1D3E20","#224825","#26512A","#2A5A2E","#2E6233","#336C38","#39773E","#3F8144","#488B4A","#529551","#5FA059","#70AB63","#7FB46B","#8EBD73","#9DC57B","#ACCD83","#BDD68C","#CCDE94","#DBE69B"]},tokyo:{discrete:["#1C0E34","#241036","#2D1339","#37163D","#3F1A40","#481E43","#4F2345","#562948","#5D304A","#62354C","#663B4D","#69404E","#6B454F","#6D4B50","#6E4F50","#6F5251","#6F5651","#705951","#715C52","#715F52","#716252","#726452","#726753","#736B53","#736E53","#747153","#757554","#757A54","#767E55","#778355","#788856","#798E57","#7B9558","#7C9B5A","#7EA25C","#81A95E","#84B062","#88B968","#8DC16E","#93CA76","#9BD27F","#A4DA8A","#AFE398","#BAEAA4","#C5EFB0","#CFF4BB","#D8F7C5","#E2F9CF","#E9FBD7","#EFFCDD"],categorical:["#1C0E34","#EFFCDD","#747053","#6C4750","#87B666","#B8E8A1","#512446","#715D52","#798B56","#7D9F5B","#37163D","#726653","#99D07D","#63374C","#6F5451","#D8F7C5","#767C54","#705951","#5B2D49","#7B9558","#441D41","#291238","#E5FAD2","#C9F1B4","#716252","#81AA5F","#683F4E","#736B53","#6E4E50","#757654","#8EC370","#A7DD8E","#778455","#747354","#84B062","#231036","#93CA76","#DFF9CC","#30143A","#A0D785","#7FA45D","#EAFBD8","#6A434F","#C1EDAB","#736D53","#562948","#6D4B50","#7A9057","#7C9A59","#4B2044","#715F52","#663B4D","#D1F4BD","#705651","#8ABD6A","#6E5151","#AFE398","#5F324B","#757954","#3E193F","#726853","#726452","#778055","#705B52","#788756","#61344C","#746E53","#ABE093","#532747","#85B364","#7EA25C","#261137","#736C53","#E8FBD5","#4E2245","#88B968","#798E57","#767E55","#726753","#757754","#715E52","#3A183E","#6E4F51","#778255","#7B9759","#DCF8C9","#EDFCDA","#411B40","#7D9C5A","#767B54","#726352","#6F5551","#726552","#82AD60","#D5F6C1","#34153C","#9CD481","#747454","#C5EFB0","#481E43"]},turku:{discrete:["#000000","#090908","#111110","#181816","#1D1D1A","#22221F","#272723","#2C2C27","#33322B","#38382F","#3D3D32","#424235","#474738","#4E4D3C","#53523E","#585841","#5D5D43","#626246","#686848","#6E6D4B","#73724D","#797750","#7F7D52","#878356","#8E8859","#968E5C","#9D9360","#A79864","#AF9C68","#B69F6C","#BEA270","#C4A474","#CCA579","#D1A67D","#D7A781","#DBA886","#E0A98B","#E6AB92","#EAAD98","#EFB09F","#F2B4A7","#F6B9AE","#F9BFB7","#FBC4BF","#FDC9C6","#FECFCC","#FED4D3","#FFDBDA","#FFE0E0","#FFE6E6"],categorical:["#070707","#FFE6E6","#948D5B","#E5AA90","#4D4C3B","#2C2C27","#C3A374","#6D6C4A","#FBC4BF","#D6A780","#F2B4A7","#1C1C19","#3D3D32","#AC9A67","#7E7C52","#FED6D4","#5D5D43","#35342D","#DDA888","#141312","#55543F","#242420","#FDCDCA","#F7BCB3","#898456","#B8A06D","#ECAE9B","#CDA57A","#FFDEDD","#646447","#454537","#9F9461","#76744E","#71704C","#30302A","#414135","#181816","#FCC8C4","#EFB1A1","#838054","#F5B8AD","#E1A98C","#C8A477","#686848","#595941","#20201D","#8E8859","#D1A67D","#B29D6A","#E9AC95","#BEA270","#FED1CF","#0E0E0D","#A59764","#DAA784","#282823","#F9C0B9","#51503D","#393930","#FFDAD9","#49493A","#606045","#FFE2E1","#9A915E","#797750","#F4B6AA","#F6BAB0","#CBA578","#FFD8D6","#FECFCC","#262622","#C0A272","#868255","#1A1A18","#FAC2BC","#8B8658","#E3AA8E","#161614","#4F4E3C","#C6A475","#2E2E28","#BBA16F","#6B6A49","#E7AB93","#CFA67C","#626246","#53523E","#5B5B42","#FED3D1","#7C7A51","#817E53","#73724D","#FFDCDB","#37372E","#F8BEB6","#0B0B0A","#575740","#DFA98A","#474738","#B59F6C"]},vanimo:{discrete:["#FFCDFD","#F7BEF2","#F0B0E8","#E6A0DC","#DE93D2","#D786C8","#CF7ABF","#C76FB5","#BD63AA","#B45AA1","#AB5198","#A1498E","#964184","#883977","#7C326B","#6E2C60","#612654","#542148","#451C3B","#391931","#2F1728","#281521","#22141C","#1D1417","#1A1414","#191612","#191811","#1B1D11","#1D2212","#212913","#253014","#2B3916","#324419","#384D1B","#3F561E","#456021","#4C6924","#547427","#5A7C2A","#60852E","#678E32","#6E9737","#77A33F","#7FAE47","#88BA51","#92C65D","#9CD26B","#A9E27F","#B3EF92","#BEFDA5"],categorical:["#FFCDFD","#F7BEF2","#F0B0E8","#E6A0DC","#DE93D2","#D786C8","#CF7ABF","#C76FB5","#BD63AA","#B45AA1","#AB5198","#A1498E","#964184","#883977","#7C326B","#6E2C60","#612654","#542148","#451C3B","#391931","#2F1728","#281521","#22141C","#1D1417","#1A1414","#191612","#191811","#1B1D11","#1D2212","#212913","#253014","#2B3916","#324419","#384D1B","#3F561E","#456021","#4C6924","#547427","#5A7C2A","#60852E","#678E32","#6E9737","#77A33F","#7FAE47","#88BA51","#92C65D","#9CD26B","#A9E27F","#B3EF92","#BEFDA5"]},vik:{discrete:["#001261","#011A66","#02226B","#022B71","#023376","#023A7B","#034280","#034A85","#06548B","#0B5D91","#136697","#1E6F9D","#2B79A4","#3C85AC","#4B90B3","#5A9ABA","#6AA4C1","#7AAEC8","#8DBAD0","#9DC4D6","#ADCDDD","#BDD6E3","#CCDFE8","#DEE6E9","#E8E7E5","#EEE3DC","#EEDBD0","#EBD0C0","#E7C6B2","#E3BCA5","#DFB298","#DBA88B","#D69D7C","#D29470","#CE8B64","#CA8258","#C6794C","#C26E3F","#BE6533","#B85C28","#B2511D","#A94512","#9C3709","#912D06","#872406","#7E1D06","#741506","#6A0D07","#620607","#590008"],categorical:["#001261","#011A66","#02226B","#022B71","#023376","#023A7B","#034280","#034A85","#06548B","#0B5D91","#136697","#1E6F9D","#2B79A4","#3C85AC","#4B90B3","#5A9ABA","#6AA4C1","#7AAEC8","#8DBAD0","#9DC4D6","#ADCDDD","#BDD6E3","#CCDFE8","#DEE6E9","#E8E7E5","#EEE3DC","#EEDBD0","#EBD0C0","#E7C6B2","#E3BCA5","#DFB298","#DBA88B","#D69D7C","#D29470","#CE8B64","#CA8258","#C6794C","#C26E3F","#BE6533","#B85C28","#B2511D","#A94512","#9C3709","#912D06","#872406","#7E1D06","#741506","#6A0D07","#620607","#590008"]},viko:{discrete:["#4F1A3D","#4B1D43","#48214A","#432653","#3F2C5B","#3C3263","#38396C","#354174","#334B7F","#345487","#365E8F","#3B6797","#42719E","#4D7DA6","#5787AD","#6391B4","#709ABA","#7DA4BF","#8EAEC4","#9BB5C7","#A9BBC8","#B5C0C8","#C0C2C5","#CBC2BF","#D2C0B8","#D6BDAF","#D9B7A6","#D9AF99","#D8A88D","#D6A082","#D39776","#CF8D6B","#C8825D","#C27752","#BB6D47","#B3623D","#AA5633","#9F492A","#953E25","#8C3521","#822C1F","#7A251E","#721F1F","#6B1A21","#661824","#611627","#5C152B","#571631","#531736","#50193C"],categorical:["#4F1A3D","#4B1D43","#48214A","#432653","#3F2C5B","#3C3263","#38396C","#354174","#334B7F","#345487","#365E8F","#3B6797","#42719E","#4D7DA6","#5787AD","#6391B4","#709ABA","#7DA4BF","#8EAEC4","#9BB5C7","#A9BBC8","#B5C0C8","#C0C2C5","#CBC2BF","#D2C0B8","#D6BDAF","#D9B7A6","#D9AF99","#D8A88D","#D6A082","#D39776","#CF8D6B","#C8825D","#C27752","#BB6D47","#B3623D","#AA5633","#9F492A","#953E25","#8C3521","#822C1F","#7A251E","#721F1F","#6B1A21","#661824","#611627","#5C152B","#571631","#531736","#50193C"]}};function ge(e){const t=e.replace("#","");return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}}const fe={waves:"batlow",blksand:"tokyo",breeze:"imola",magma:"batlow",ribbon:"hawaii",stars:"batlow",folds:"imola"},ye={[d.ADVERT]:1,[d.TXT_MSG]:4,[d.GRP_TXT]:2,[d.RESPONSE]:8,[d.REQ]:13,[d.ANON_REQ]:7,[d.ACK]:11,[d.PATH]:24,[d.TRACE]:16,[d.GRP_DATA]:34,[d.MULTIPART]:52,[d.RAW_CUSTOM]:14};function be(){let e="waves",t=!0;if("undefined"!=typeof window){e=localStorage.getItem("pymc-color-scheme")||"waves";const s=m(e);t=(null==s?void 0:s.meta.isDark)??!0}const s=fe[e]??"batlow",a=pe[s],n=a.discrete.length,r=Math.floor(n/2);return{colormap:a,colormapName:s,isDark:t,baseIndex:t?r:0,halfSize:r}}let ve=null;function je(e){const{colormap:t,isDark:s}=be();if("number"!=typeof e)return s?"#A5A5A5":"#666666";const a=ye[e];if(void 0===a)return s?"#A5A5A5":"#666666";const n=t.categorical;return n[Math.min(a,n.length-1)]}function ke(e){return ge(je(e))}const Ne=u("chart-line",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]]),we=u("circle-check-big",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]),Me=u("columns-2",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M12 3v18",key:"108xh3"}]]),Se=u("columns-3",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"M15 3v18",key:"14nvp0"}]]),Te=u("columns-4",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M7.5 3v18",key:"w0wo6v"}],["path",{d:"M12 3v18",key:"108xh3"}],["path",{d:"M16.5 3v18",key:"10tjh1"}]]),Pe=u("grid-3x3",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"M15 3v18",key:"14nvp0"}]]),Re=u("grip",[["circle",{cx:"12",cy:"5",r:"1",key:"gxeob9"}],["circle",{cx:"19",cy:"5",r:"1",key:"w8mnmm"}],["circle",{cx:"5",cy:"5",r:"1",key:"lttvr7"}],["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}],["circle",{cx:"12",cy:"19",r:"1",key:"lyex9k"}],["circle",{cx:"19",cy:"19",r:"1",key:"shf9b7"}],["circle",{cx:"5",cy:"19",r:"1",key:"bfqh0e"}]]),$e=u("id-card",[["path",{d:"M16 10h2",key:"8sgtl7"}],["path",{d:"M16 14h2",key:"epxaof"}],["path",{d:"M6.17 15a3 3 0 0 1 5.66 0",key:"n6f512"}],["circle",{cx:"9",cy:"11",r:"2",key:"yxgjnd"}],["rect",{x:"2",y:"5",width:"20",height:"14",rx:"2",key:"qneu4z"}]]),Le=u("radar",[["path",{d:"M19.07 4.93A10 10 0 0 0 6.99 3.34",key:"z3du51"}],["path",{d:"M4 6h.01",key:"oypzma"}],["path",{d:"M2.29 9.62A10 10 0 1 0 21.31 8.35",key:"qzzz0"}],["path",{d:"M16.24 7.76A6 6 0 1 0 8.23 16.67",key:"1yjesh"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M17.99 11.66A6 6 0 0 1 15.77 16.67",key:"1u2y91"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}],["path",{d:"m13.41 10.59 5.66-5.66",key:"mhq4k0"}]]),ze=u("settings-2",[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]),He=u("sparkle",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}]]),_e=u("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),Oe=u("waves",[["path",{d:"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"knzxuh"}],["path",{d:"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"2jd2cc"}],["path",{d:"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"rd2r6e"}]]),We={useAbsoluteThresholds:!0,baselinePercentile:6,spikePercentile:50,baselineDbm:-107,spikeDbm:-100,mergeGapSeconds:45,minSequenceLength:16,similarityToleranceDbm:5};function Ie(e,t){if(0===e.length)return 0;const s=t/100*(e.length-1),a=Math.floor(s),n=Math.ceil(s);return a===n?e[a]:e[a]+(e[n]-e[a])*(s-a)}function qe(e){if(0===e.length)return{median:0,p90:0,p95:0,p99:0,max:0,min:0};const t=[...e].sort((e,t)=>e-t);return{median:Ie(t,50),p90:Ie(t,90),p95:Ie(t,95),p99:Ie(t,99),max:t[t.length-1],min:t[0]}}function Ve(e,t,s){const a=s-t;if(0===a)return"moderate";const n=(e-t)/a;return n>.66?"critical":n>.33?"severe":"moderate"}n.memo(function({options:e,data:t,className:s="",onCreate:a}){const l=n.useRef(null),i=n.useRef(null);return n.useEffect(()=>{const s=l.current;if(!s)return;const n=s.getBoundingClientRect(),r=Math.floor(n.width)||400,o=Math.floor(n.height)||200,c=new h({...e,width:r,height:o},t,s);return i.current=c,null==a||a(c),()=>{c.destroy(),i.current=null}},[e]),n.useEffect(()=>{i.current&&t&&i.current.setData(t)},[t]),n.useEffect(()=>{const e=l.current;if(!e)return;const t=new ResizeObserver(e=>{const t=e[0];if(!t||!i.current)return;const{width:s,height:a}=t.contentRect;s>0&&a>0&&i.current.setSize({width:Math.floor(s),height:Math.floor(a)})});return t.observe(e),()=>{t.disconnect()}},[]),r.jsx("div",{ref:l,className:`w-full h-full ${s}`,style:{minHeight:100}})});const Ge=new Map;function Ke(e){var t;if(!e.startsWith("var("))return e;const s=Ge.get(e);if(s)return s;const a=e.match(/var\(([^,)]+)(?:,\s*([^)]+))?\)/);if(!a)return e;const n=a[1].trim(),r=(null==(t=a[2])?void 0:t.trim())||"#888888",l=getComputedStyle(document.documentElement).getPropertyValue(n).trim()||r;return Ge.set(e,l),l}function Xe(e,t,s=!1){if(t.length<2)return;if(e.beginPath(),e.moveTo(t[0].x,t[0].y),2===t.length)return void e.lineTo(t[1].x,t[1].y);const a=.5;for(let n=0;n{F.current=e,E.current=t,m.current=a,d.current=s});const x=n.useRef({band:l,innerBand:i,mean:o,median:c,average:C,cursor:A});n.useLayoutEffect(()=>{x.current={band:l,innerBand:i,mean:o,median:c,average:C,cursor:A}});const p=n.useMemo(()=>[e.map(e=>e.timestamp),e.map(e=>e.max)],[e]),g=n.useMemo(()=>{const e=function(e,t,s,a){return{hooks:{draw:n=>{const r=e.current,l=t.current,i=s.current,o=a.current;if(0===r.length)return;const c=n.ctx,C=n.bbox,A=C.left,D=C.top,B=C.width,F=C.height;if(B<=0||F<=0)return;const E=n.data[0],m=E.length;if(0===m)return;const d=E[0],u=E[m-1]-d||1,h=e=>A+(e-d)/u*B,x=e=>D+F*(1-e/l),p={min:r.map(e=>({x:h(e.timestamp),y:x(e.min)})),max:r.map(e=>({x:h(e.timestamp),y:x(e.max)})),p5:r.map(e=>({x:h(e.timestamp),y:x(e.p5)})),p95:r.map(e=>({x:h(e.timestamp),y:x(e.p95)})),p25:r.map(e=>({x:h(e.timestamp),y:x(e.p25)})),p75:r.map(e=>({x:h(e.timestamp),y:x(e.p75)})),mean:r.map(e=>({x:h(e.timestamp),y:x(e.mean)})),median:r.map(e=>({x:h(e.timestamp),y:x(e.median)})),average:r.map(e=>({x:h(e.timestamp),y:x(e.average)}))},g=(e,t)=>i?i===e?Math.min(1,1.5*t):"minMax"===i||"p5p95"===i||"p25p75"===i?.3*t:t:t,f=e=>i?i===e?1:"mean"===i||"median"===i||"average"===i?.3:1:1,y={band:Ke(o.band),innerBand:Ke(o.innerBand),mean:Ke(o.mean),median:Ke(o.median),average:Ke(o.average)};c.save(),c.strokeStyle=y.average,c.lineWidth=4,c.globalAlpha=f("average"),Xe(c,p.average),c.stroke(),c.globalAlpha=g("minMax",.15),c.fillStyle=y.band,c.beginPath(),Xe(c,p.max);const b=[...p.min].reverse();for(const e of b)c.lineTo(e.x,e.y);c.closePath(),c.fill(),c.globalAlpha=g("p5p95",.3),c.fillStyle=y.band,c.beginPath(),Xe(c,p.p95);const v=[...p.p5].reverse();for(const e of v)c.lineTo(e.x,e.y);c.closePath(),c.fill(),c.globalAlpha=g("p25p75",.55),c.fillStyle=y.innerBand,c.beginPath(),Xe(c,p.p75);const j=[...p.p25].reverse();for(const e of j)c.lineTo(e.x,e.y);c.closePath(),c.fill(),c.strokeStyle=y.median,c.lineWidth=1.5,c.globalAlpha=f("median"),c.setLineDash([4,4]),Xe(c,p.median),c.stroke(),c.strokeStyle=y.mean,c.lineWidth=1.5,c.globalAlpha=f("mean"),c.setLineDash([]),Xe(c,p.mean),c.stroke(),c.restore()}}}}(F,E,m,x);return{width:400,height:200,padding:[4,4,4,4],cursor:{show:!0,x:!0,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,t]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],hooks:{setCursor:[e=>{var t,s;const a=e.cursor.idx;null!=a&&a>=0?null==(t=d.current)||t.call(d,a):null==(s=d.current)||s.call(d,null)}]},plugins:[e]}},[t]);n.useEffect(()=>{const t=D.current;if(!t||0===e.length)return;const s=u.current,a=e.length,n=Math.abs(a-s);if(!(!B.current||n>100||s>0&&n/s>.1)&&B.current)return B.current.setData(p),void(u.current=a);B.current&&B.current.destroy();const r=t.getBoundingClientRect(),l=Math.floor(r.width)||400,i=Math.floor(r.height)||200,o=new h({...g,width:l,height:i},p,t);return B.current=o,u.current=a,()=>{o.destroy(),B.current=null}},[g,p,e.length]),n.useEffect(()=>{const e=D.current;if(!e)return;const t=new ResizeObserver(e=>{const t=e[0];if(!t||!B.current)return;const{width:s,height:a}=t.contentRect;s>0&&a>0&&B.current.setSize({width:Math.floor(s),height:Math.floor(a)})});return t.observe(e),()=>{t.disconnect()}},[]),n.useEffect(()=>{B.current&&B.current.redraw()},[a,e]);const f=n.useCallback(()=>{null==s||s(null)},[s]);return 0===e.length?r.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):r.jsx("div",{ref:D,className:"w-full h-full rounded-2xl overflow-hidden",onMouseLeave:f})});const Ye="undefined"!=typeof window&&(null==(t=null==(e=window.matchMedia)?void 0:e.call(window,"(color-gamut: p3)"))?void 0:t.matches);function Qe(){const e=getComputedStyle(document.documentElement);return{fontFamily:e.getPropertyValue("--font-data").trim()||'"JetBrains Mono", ui-monospace, monospace',axisColor:e.getPropertyValue("--chart-axis-tick").trim()||"rgba(255, 255, 255, 0.4)",gridColor:e.getPropertyValue("--chart-grid").trim()||"rgba(255, 255, 255, 0.06)",textMuted:e.getPropertyValue("--text-muted").trim()||"#727272",textPrimary:e.getPropertyValue("--text-primary").trim()||"#FFFFFF"}}const Ue=["min","max","p75","p95","p99","mean","median","average","midpoint"];function Ze(e){const t=ge(function(e){const{colormap:t,baseIndex:s,halfSize:a}=be(),n=Math.max(0,Math.min(1,e)),r=Math.min(s+Math.floor(n*(a-1)),t.discrete.length-1);return t.discrete[r]}(e)),s=`color(display-p3 ${(t.r/255).toFixed(3)} ${(t.g/255).toFixed(3)} ${(t.b/255).toFixed(3)})`;return{...t,p3:s}}function Je(e,t,s,a,n,r,l,i,o,c=null,C=null,A=1,D=null,B="airtime",F=.5){if(0===t.length)return;const E=e.ctx,{left:m,top:d,width:u,height:h}=e.bbox,x=window.devicePixelRatio||1;if(u<=0||h<=0)return;const p=e.data[0],g=p.length;if(0===g)return;const f=p[0],y=p[g-1],b=s,v="share"===B,j=v?function(e){const t=[10,20,25,50,100,200,250,500,1e3],s=e/4.5;for(const a of t)if(a>=s)return a;return e>5e3?1e3*Math.ceil(s/1e3):100*Math.ceil(s/100)}(b):5,k=getComputedStyle(document.documentElement),N=k.getPropertyValue("--signal-critical").trim()||"#EF4444",w=k.getPropertyValue("--bg-body").trim()||"#171717";E.save(),E.fillStyle="#000000";const M=8*x;E.beginPath(),E.roundRect(m,d,u,h,M),E.fill(),E.restore();const S=parseInt(w.slice(1,3),16)||23,T=parseInt(w.slice(3,5),16)||23,P=parseInt(w.slice(5,7),16)||23;if(!v&&b>=20){E.save();const e=d+h*(1-20/b);E.fillStyle=`rgba(${S}, ${T}, ${P}, 0.5)`,E.fillRect(m,d,u,e-d),E.restore()}E.save(),E.lineWidth=1*x,E.setLineDash([4*x,4*x]);for(let $=j;$s+n)return;const i=getComputedStyle(document.documentElement).getPropertyValue("--text-primary").trim()||"#FFFFFF";e.save(),e.strokeStyle=i,e.globalAlpha=.5,e.lineWidth=1*l,e.setLineDash([4*l,4*l]),e.beginPath(),e.moveTo(Math.round(t)+.5,a),e.lineTo(Math.round(t)+.5,a+r),e.stroke(),e.restore()}(E,D,m,d,u,h,x),l){!function(e,t,s,a,n,r,l=null,i=null,o=1,c=25){const{points:C,rawValues:A,count:D,packetTypes:B,timestamps:F}=t,E=1*o*(window.devicePixelRatio||1);e.globalCompositeOperation="source-over";const m=l?parseInt(l.replace("TYPE_",""),10):null;for(let d=0;d=i.start&&e0&&function(e,t,s,a,n,r,l,i,o,c,C=.5){if(0===t.length)return;const A=o-i||1,D=function(e,t=1.3,s=.15){const a=function(e){const t=e.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(t){const e=parseFloat(t[1]),s=parseFloat(t[2]),a=parseFloat(t[3]);return{r:Math.round(255*e),g:Math.round(255*s),b:Math.round(255*a),p3r:e,p3g:s,p3b:a}}if(e.startsWith("#")){const t=e.replace("#",""),s=parseInt(t.slice(0,2),16),a=parseInt(t.slice(2,4),16),n=parseInt(t.slice(4,6),16);return{r:s,g:a,b:n,p3r:s/255,p3g:a/255,p3b:n/255}}const s=e.match(/rgba?\(([\d.]+),?\s*([\d.]+),?\s*([\d.]+)/);if(s){const e=Math.round(parseFloat(s[1])),t=Math.round(parseFloat(s[2])),a=Math.round(parseFloat(s[3]));return{r:e,g:t,b:a,p3r:e/255,p3g:t/255,p3b:a/255}}return{r:255,g:255,b:255,p3r:1,p3g:1,p3b:1}}(e),n=function(e,t,s,a=1.25,n=.15){const r=(Math.max(e,t,s)+Math.min(e,t,s))/2;return{p3r:Math.min(1,r+(e-r)*a+n),p3g:Math.min(1,r+(t-r)*a+n),p3b:Math.min(1,r+(s-r)*a+n)}}(a.p3r,a.p3g,a.p3b,t,s);return{r:Math.round(255*Math.min(1,n.p3r)),g:Math.round(255*Math.min(1,n.p3g)),b:Math.round(255*Math.min(1,n.p3b)),p3r:Math.min(1,n.p3r),p3g:Math.min(1,n.p3g),p3b:Math.min(1,n.p3b)}}(getComputedStyle(document.documentElement).getPropertyValue("--signal-critical").trim()||"#EF4444");e.save(),e.globalAlpha=C,e.fillStyle=Ye?`color(display-p3 ${D.p3r} ${D.p3g} ${D.p3b})`:`rgb(${D.r}, ${D.g}, ${D.b})`;for(const B of t){if(B.endTso)continue;const t=a+(Math.max(B.startTs,i)-i)/A*r,s=a+(Math.min(B.endTs,o)-i)/A*r,C=Math.max(s-t,2*c);e.fillRect(t,n,C,l)}e.restore()}(E,i,0,m,d,u,h,f,y,x,C?Math.max(.03,.03*F):F)}const et=n.memo(function({data:e,maxValue:t,visibleLines:s=Ue,highlightedLine:a=null,onHover:l,scatterData:i=null,noiseFloorAnomalies:o=null,showNoiseFloorOverlay:c=!1,overlayOpacity:C=.5,highlightedType:A=null,hoveredTimeRange:D=null,timeRangeHours:B=24,yAxisMode:F="airtime"}){const E=n.useRef(null),m=n.useRef(null),d=n.useRef(e),u=n.useRef(t),x=n.useRef(s),p=n.useRef(a),g=n.useRef(l),f=n.useRef(i),y=n.useRef(o),b=n.useRef(c),v=n.useRef(A),j=n.useRef(D),k=n.useRef(null),N=n.useRef(null),w=n.useRef(F),M=n.useRef(C),S=B<=12?1.2:1,T=n.useRef(S),P=n.useRef(e.length);n.useLayoutEffect(()=>{d.current=e,u.current=t,x.current=s,p.current=a,g.current=l,f.current=i,y.current=o,b.current=c,v.current=A,j.current=D,T.current=S,w.current=F,M.current=C}),n.useEffect(()=>{k.current=Qe()},[]);const R=n.useMemo(()=>[e.map(e=>e.timestamp),new Array(e.length).fill(1)],[e]),$=n.useMemo(()=>({hooks:{draw:e=>{const t=k.current||Qe();Je(e,d.current,u.current,x.current,p.current,t,f.current,y.current,b.current,v.current,j.current,T.current,N.current,w.current,M.current)}}}),[]),L=n.useMemo(()=>({width:400,height:200,padding:[8,0,8,28],cursor:{show:!1,x:!1,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],plugins:[$]}),[$]);n.useEffect(()=>{const t=E.current;if(!t||0===e.length)return;const s=P.current,a=e.length,n=Math.abs(a-s);if(!(!m.current||n>100||s>0&&n/s>.1)&&m.current)return m.current.setData(R),void(P.current=a);m.current&&m.current.destroy();const r=t.getBoundingClientRect(),l=Math.floor(r.width)||400,i=Math.floor(r.height)||200,o=new h({...L,width:l,height:i},R,t);return m.current=o,P.current=a,()=>{o.destroy(),m.current=null}},[L,R,e.length]),n.useEffect(()=>{const e=E.current;if(!e)return;const t=new ResizeObserver(e=>{const t=e[0];if(!t||!m.current)return;const{width:s,height:a}=t.contentRect;s>0&&a>0&&m.current.setSize({width:Math.floor(s),height:Math.floor(a)})});return t.observe(e),()=>{t.disconnect()}},[]),n.useEffect(()=>{m.current&&m.current.redraw()},[a,s,e,i,o,c,C,A,D,S]);const z=n.useCallback(t=>{var s,a;const n=E.current,r=m.current;if(!n||!r||0===e.length)return;const l=n.getBoundingClientRect(),i=t.clientX-l.left,o=window.devicePixelRatio||1,c=r.bbox,C=c.left/o,A=c.width/o;if(iC+A)return N.current=null,r.redraw(),void(null==(s=g.current)||s.call(g,null));N.current=i*o;const D=(i-C)/A,B=e.length,F=Math.floor(D*B),d=Math.max(0,Math.min(B-1,F));r.redraw(),null==(a=g.current)||a.call(g,d)},[e.length]),H=n.useCallback(()=>{var e;N.current=null,m.current&&m.current.redraw(),null==(e=g.current)||e.call(g,null)},[]);return 0===e.length?r.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):r.jsx("div",{ref:E,className:"w-full h-full rounded-lg overflow-hidden",onMouseMove:z,onMouseLeave:H})}),tt=function(e){const t=je(e);return null===ve&&(ve=E()),ve?F(t):t};function st({sortedTypes:e,highlightedType:t,onTypeHover:s,aggregateShares:a,hoverData:l}){const i=n.useMemo(()=>{if(!l)return null;const e=new Map;for(const t of l.items)e.set(t.key,t.value);return e},[l]),o=null!==i;return r.jsx("div",{className:"flex-shrink-0 pt-3 mt-2",children:r.jsx("div",{className:"grid ml-9 gap-y-0.5",style:{gridTemplateColumns:"repeat(auto-fill, minmax(105px, 1fr))"},onMouseLeave:()=>s(null),children:e.map(e=>{const n=tt(e.typeNum),l=(null==i?void 0:i.get(e.key))??0,c=a.get(e.key)??0,C=o?l:c,A=C>1e-4,D=t===e.key,B=["legend-item",D&&"legend-item-active",(t&&!D||o&&l<=1e-4)&&"legend-item-dimmed",!t&&o&&l>1e-4&&"legend-item-chart-active"].filter(Boolean).join(" ");return r.jsxs("div",{className:B,onMouseEnter:()=>s(e.key),children:[r.jsx("div",{className:"flex-shrink-0",style:{backgroundColor:n,width:9,height:16,borderRadius:1}}),r.jsx("span",{className:"legend-label",children:e.label}),A&&r.jsxs("span",{className:"legend-value "+(o?"legend-value-live":""),children:[(100*C).toFixed(1),"%"]})]},e.key)})})})}const at='ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace';function nt({x:e,y:t,width:s,height:a,name:n,size:l,index:i,depth:o,hoveredIndex:c,onHover:C,total:A,typeNum:D}){if(1!==o)return null;const B=null!==c&&!(c===i),F=tt(D),E=A>0?l/A*100:0,m=s>36&&a>20,d=s>36&&a>32;return r.jsxs("g",{onMouseEnter:e=>C(i,e),onMouseLeave:()=>C(null),style:{cursor:"default"},children:[r.jsx("rect",{x:e,y:t,width:s,height:a,fill:F,opacity:B?.4:1,stroke:"rgba(0,0,0,0.2)",strokeWidth:1,rx:3,style:{transition:"opacity 150ms ease"}}),m&&r.jsxs(r.Fragment,{children:[d&&r.jsxs("text",{x:e+4,y:t+a-4-11,textAnchor:"start",dominantBaseline:"auto",fill:"rgba(0,0,0,0.6)",fontSize:8,fontFamily:at,fontWeight:500,style:{pointerEvents:"none"},children:[E.toFixed(1),"%"]}),r.jsx("text",{x:e+4,y:t+a-4,textAnchor:"start",dominantBaseline:"auto",fill:"rgba(0,0,0,0.85)",fontSize:9,fontFamily:at,fontWeight:600,style:{pointerEvents:"none"},children:n})]})]})}function rt({data:e,total:t,color:s,position:a,containerWidth:n}){if(!e||!a)return null;const l=(e.value/t*100).toFixed(1),i=n-a.x<184?Math.max(8,a.x-160-8):a.x+16;return r.jsx("div",{className:"absolute z-50 pointer-events-none",style:{left:i,top:Math.max(8,a.y-60)},children:r.jsxs("div",{className:"bg-tooltip-bg border border-border-subtle rounded-lg px-3 py-2 shadow-xl min-w-[140px]",children:[r.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[r.jsx("span",{className:"w-2.5 h-2.5 rounded-sm flex-shrink-0",style:{backgroundColor:s}}),r.jsx("span",{className:"type-data-sm font-semibold text-text-primary",children:e.name})]}),r.jsxs("div",{className:"space-y-0.5 type-data-xs text-text-muted",children:[r.jsxs("div",{className:"flex justify-between gap-4",children:[r.jsx("span",{children:"Count"}),r.jsx("span",{className:"text-text-primary tabular-nums font-medium",children:e.value.toLocaleString()})]}),r.jsxs("div",{className:"flex justify-between gap-4",children:[r.jsx("span",{children:"Share"}),r.jsxs("span",{className:"text-text-primary tabular-nums font-medium",children:[l,"%"]})]}),r.jsxs("div",{className:"flex justify-between gap-4",children:[r.jsx("span",{children:"Total"}),r.jsx("span",{className:"text-text-primary tabular-nums font-medium",children:t.toLocaleString()})]})]})]})})}function lt({sortedTypes:e,aggregateShares:t}){var s,a,o;const[c,C]=n.useState(null),[A,D]=n.useState(null),[B,F]=n.useState(0),[E,m]=n.useState(null),d=n.useRef(null),u=n.useMemo(()=>e.reduce((e,t)=>e+t.totalCount,0),[e]),h=n.useMemo(()=>e.map((e,t)=>({name:e.label,size:e.totalCount,index:t,typeNum:e.typeNum,key:e.key})),[e]),x=n.useCallback((e,t)=>{if(C(e),t&&null!==e){const e=d.current;if(e){const s=e.getBoundingClientRect();F(s.width),D({x:t.clientX-s.left,y:t.clientY-s.top})}}else D(null)},[]),p=n.useCallback(e=>{if(m(e),e){const t=h.findIndex(t=>t.key===e);C(t>=0?t:null)}else C(null)},[h]),g=null!==c?{name:(null==(s=h[c])?void 0:s.name)??"",value:(null==(a=h[c])?void 0:a.size)??0}:null,f=null!==c?tt(null==(o=h[c])?void 0:o.typeNum):"";return 0===e.length||0===u?r.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[r.jsx(ee,{className:"w-6 h-6 mr-2 opacity-50"}),r.jsx("span",{children:"No packet type data available"})]}):r.jsxs("div",{className:"flex flex-col",children:[r.jsxs("div",{className:"analyzer-chart-height relative flex-shrink-0",ref:d,children:[r.jsx(l,{width:"100%",height:"100%",children:r.jsx(i,{data:h,dataKey:"size",aspectRatio:4/3,stroke:"none",isAnimationActive:!1,content:r.jsx(nt,{x:0,y:0,width:0,height:0,name:"",size:0,index:0,depth:0,hoveredIndex:c,onHover:x,total:u,typeNum:0})})}),r.jsx(rt,{data:g,total:u,color:f,position:A,containerWidth:B})]}),r.jsx(st,{sortedTypes:e,highlightedType:E,onTypeHover:p,aggregateShares:t})]})}function it(e){return e>=1e9?`${(e/1e9).toFixed(1)} Gb`:e>=1e6?`${(e/1e6).toFixed(1)} Mb`:e>=1e3?`${(e/1e3).toFixed(1)} Kb`:`${e.toFixed(0)} B`}function ot({active:e,payload:t,label:s,mode:a}){if(!e||!t||0===t.length)return null;const n=t.filter(e=>null!==e.value&&void 0!==e.value);if(0===n.length)return null;const l=s?new Date(1e3*s).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}):"";return r.jsxs("div",{className:"bg-tooltip-bg border border-border-subtle rounded-lg px-3 py-2 text-sm shadow-xl",children:[r.jsx("div",{className:"font-medium text-text-primary mb-1 font-mono",children:l}),n.map((e,t)=>r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("div",{className:"w-3 h-0.5",style:{backgroundColor:e.color}}),r.jsxs("span",{className:"text-text-muted",children:[e.name,":"]}),r.jsx("span",{className:"text-text-primary tabular-nums font-mono",children:"share"===a?`${Number(e.value).toLocaleString()} B`:`${Number(e.value).toFixed(2)}%`})]},t))]})}function ct({packets:e,mode:t,startTs:s,endTs:a,radioConfig:i,bucketCount:F}){const E=K(),m=X(),d=E.primary,u=E.tertiary,[h,f]=n.useState(null),{trendData:y,totals:b}=n.useMemo(()=>{if(0===e.length)return{trendData:[],totals:{rxBytes:0,txBytes:0,rxAirtime:0,txAirtime:0}};const n=a-s,r=Math.min(Math.ceil(n/300),F),l=n/r,o=[];let c=0,C=0,A=0,D=0;for(const t of e){const e=t.timestamp;if(e=a)continue;const n=x(t),r=p(t,{spreadingFactor:i.sf,bandwidthHz:i.bw,codingRate:i.cr,preambleLength:i.preamble}),l={timestamp:e,rxAirtime:0,txAirtime:0,rxBytes:0,txBytes:0};t.transmitted?(l.txAirtime=r,l.txBytes=n,C+=n,D+=r):(l.rxAirtime=r,l.rxBytes=n,c+=n,A+=r),o.push(l)}o.sort((e,t)=>e.timestamp-t.timestamp);const B=new Float64Array(o.length+1),E=new Float64Array(o.length+1),m=new Float64Array(o.length+1),d=new Float64Array(o.length+1),u=new Float64Array(o.length);for(let e=0;e{let t=0,s=u.length;for(;t>>1;u[a]0?e:null,tx:t>0?t:null})}else{const e=(B[i]-B[r])/f*100,t=(E[i]-E[r])/f*100;g.push({timestamp:a,rx:e>0?e:null,tx:t>0?t:null})}}const y=2/31;let b=null;return{trendData:g.map(e=>{const t=e.rx;return null!==t&&t>0&&(b=null===b?t:y*t+(1-y)*b),{...e,rxSmooth:null!==b&&b>0?b:null}}),totals:{rxBytes:c,txBytes:C,rxAirtime:A,txAirtime:D}}},[e,s,a,F,t,i]),v=n.useMemo(()=>{if(0===y.length)return"share"===t?100:10;let e=0;for(const t of y){const s=t.rx??0,a=t.tx??0;s>e&&(e=s),a>e&&(e=a)}const s=1.1*e;return"share"===t?s<=100?100:s<=500?100*Math.ceil(s/100):s<=1e3?200*Math.ceil(s/200):s<=5e3?500*Math.ceil(s/500):s<=1e4?1e3*Math.ceil(s/1e3):5e3*Math.ceil(s/5e3):Math.max(1,Math.ceil(s))},[y,t]),j=n.useMemo(()=>{if(null!==h&&y[h]){const e=y[h],s=e.rx??0,a=e.tx??0;return"share"===t?{rx:it(s),tx:it(a),total:it(s+a),isHovered:!0}:{rx:`${s.toFixed(2)}%`,tx:`${a.toFixed(2)}%`,total:`${(s+a).toFixed(2)}%`,isHovered:!0}}if("share"===t)return{rx:it(b.rxBytes),tx:it(b.txBytes),total:it(b.rxBytes+b.txBytes),isHovered:!1};{let e=0,t=0,s=0;for(const r of y)null===r.rx&&null===r.tx||(e+=r.rx??0,t+=r.tx??0,s++);const a=s>0?e/s:0,n=s>0?t/s:0;return{rx:`${a.toFixed(2)}%`,tx:`${n.toFixed(2)}%`,total:`${(a+n).toFixed(2)}%`,isHovered:!1}}},[h,y,b,t]),k=n.useMemo(()=>{const e=a-s,t=e/3600;return[0,.25,.5,.75,1].map(a=>{const n=new Date(1e3*(s+e*a)),r=n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),l=n.toLocaleDateString([],{weekday:"short"});return{pct:a,label:t>24?`${l} ${r}`:r,mobileHidden:.25===a||.75===a}})},[s,a]),N=n.useCallback(e=>{const t=null==e?void 0:e.activeTooltipIndex;f("number"==typeof t?t:null)},[]),w=n.useCallback(e=>"share"===t?e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(0)}K`:e.toFixed(0):`${e.toFixed(0)}%`,[t]);return 0===y.length?r.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[r.jsx(ee,{className:"w-6 h-6 mr-2 opacity-50"}),r.jsx("span",{children:"No packet data available"})]}):r.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[r.jsx("div",{className:"flex items-center flex-shrink-0 text-text-secondary",style:{height:20,paddingLeft:44,paddingRight:8},children:r.jsx("div",{className:"relative w-full h-full flex items-center",children:k.map((e,t)=>r.jsxs("div",{className:"absolute flex items-center gap-0.5 sm:gap-1 type-data-xs "+(e.mobileHidden?"hidden sm:flex":""),style:{left:100*e.pct+"%",transform:0===e.pct?"translateX(0)":1===e.pct?"translateX(-100%)":"translateX(-50%)"},children:[r.jsx(g,{className:"w-2.5 h-2.5 opacity-60 hidden sm:block"}),r.jsx("span",{className:"tabular-nums",children:e.label})]},t))})}),r.jsx("div",{className:"flex-1 min-h-0 relative overflow-hidden",children:r.jsx(l,{width:"100%",height:"100%",minWidth:1,minHeight:1,children:r.jsxs(o,{data:y,margin:{top:4,right:8,bottom:4,left:0},onMouseMove:N,onMouseLeave:()=>f(null),children:[r.jsx(c,{strokeDasharray:"3 3",stroke:m.secondary,strokeOpacity:.3,vertical:!1}),r.jsx(C,{dataKey:"timestamp",type:"number",domain:[s,a],axisLine:!1,tickLine:!1,tick:!1,height:0}),r.jsx(A,{axisLine:!1,tickLine:!1,tick:{fill:m.secondary,fontSize:10,fontFamily:'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace'},dx:-8,width:44,tickFormatter:w,domain:[0,v]}),r.jsx(D,{content:r.jsx(ot,{mode:t})}),r.jsx(B,{type:"linear",dataKey:"rx",name:"RX",stroke:d,strokeWidth:2.5,strokeOpacity:.9,dot:!1,connectNulls:!1,isAnimationActive:!1}),r.jsx(B,{type:"linear",dataKey:"tx",name:"TX",stroke:u,strokeWidth:2.5,strokeOpacity:.9,dot:!1,connectNulls:!1,isAnimationActive:!1}),r.jsx(B,{type:"basis",dataKey:"rxSmooth",name:"RX Avg",stroke:"var(--sys-brown)",strokeWidth:2,strokeOpacity:1,dot:!1,connectNulls:!0,isAnimationActive:!1})]})})}),r.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between mt-1.5 sm:mt-2",children:[r.jsxs("div",{className:"flex items-center gap-2 sm:gap-4 text-xs font-mono pl-2 sm:pl-11",children:[r.jsxs("div",{className:"flex items-center gap-1",children:[r.jsx("div",{className:"w-3 sm:w-4 h-0.5",style:{backgroundColor:d}}),r.jsx("span",{className:"text-text-secondary",children:"RX"})]}),r.jsxs("div",{className:"flex items-center gap-1",children:[r.jsx("div",{className:"w-3 sm:w-4 h-0.5",style:{backgroundColor:u}}),r.jsx("span",{className:"text-text-secondary",children:"TX"})]}),r.jsxs("div",{className:"hidden sm:flex items-center gap-1.5",children:[r.jsx("div",{className:"w-4 h-0.5",style:{backgroundColor:"var(--sys-brown)"}}),r.jsx("span",{className:"text-text-secondary",children:"Avg"})]})]}),r.jsxs("div",{className:"flex items-center gap-2 sm:gap-4 text-right pr-1 sm:pr-2 font-mono",children:[r.jsxs("div",{className:"flex items-center gap-1 sm:gap-1.5",children:[r.jsx("span",{className:"text-xs font-medium",style:{color:d},children:"RX"}),r.jsx("span",{className:"font-bold text-lg sm:text-xl text-text-primary",children:j.rx})]}),r.jsxs("div",{className:"flex items-center gap-1 sm:gap-1.5",children:[r.jsx("span",{className:"text-xs font-medium",style:{color:u},children:"TX"}),r.jsx("span",{className:"font-bold text-lg sm:text-xl text-text-primary",children:j.tx})]}),j.isHovered&&r.jsx("span",{className:"text-xs text-text-muted hidden sm:inline",children:"bucket"})]})]})]})}function Ct(e){const{values:t,sum:s}=e;if(0===t.length)return{min:0,mean:0,median:0,p75:0,p95:0,p99:0,max:0};const a=[...t].sort((e,t)=>e-t),n=a.length,r=s/n,l=a[0],i=a[n-1],o=e=>{const t=Math.min(Math.ceil(e*n)-1,n-1);return a[Math.max(0,t)]};return{min:l,mean:r,median:n%2==0?(a[n/2-1]+a[n/2])/2:a[Math.floor(n/2)],p75:o(.75),p95:o(.95),p99:o(.99),max:i}}function At({statsBuckets:e,mode:t,packets:s,startTs:a,endTs:l,radioConfig:i,sortedTypes:o,aggregateShares:c,noiseFloorAnomalies:C,showNoiseFloorOverlay:A,overlayOpacity:D=.5}){const[B,F]=n.useState(null),[E,m]=n.useState(null),d=n.useMemo(()=>(l-a)/3600,[a,l]),u=n.useCallback(e=>{m(e)},[]),h=function(e,t,s,a,r){return n.useMemo(()=>{if(0===e.length||!r)return null;const n=e.filter(e=>e.timestamp>=t&&e.timestamp<=s);if(0===n.length)return null;const l=[],i=new Map;for(const e of n){const s=e.type??e.payload_type??-1,n=x(e);let o;if(o="airtime"===a?p(e,{spreadingFactor:r.sf,bandwidthHz:r.bw,codingRate:r.cr,preambleLength:r.preamble}):1,n<=0)continue;const c=Math.floor((e.timestamp-t)/300),C={timestamp:e.timestamp,airtimeMs:o,byteSize:n,packetType:s,bucketIndex:c};l.push(C),i.has(c)||i.set(c,[]),i.get(c).push(C)}if(0===l.length)return null;const o=[],c=[],C=[],A=new Map;if("share"===a)for(const[,e]of i)for(const t of e)A.set(t,t.byteSize);else for(const[,e]of i){const t=e.reduce((e,t)=>e+t.airtimeMs,0)/3e5*100;let s=0;for(const a of e)a.airtimeMs>s&&(s=a.airtimeMs);for(const a of e){const e=a.airtimeMs/s*t;A.set(a,e)}}for(const e of l){const t=A.get(e);void 0!==t&&(o.push(t),c.push(e.timestamp),C.push(e.packetType))}let D=c[0],B=c[0];for(let e=1;eB&&(B=c[e]);const F=B-D||1,E=[...o].sort((e,t)=>e-t),m=E[0],d=E[E.length-1],u=Math.floor(.05*E.length),h=Math.floor(.5*E.length),g=Math.min(Math.ceil(.95*E.length),E.length-1),f=E[u],y=E[h],b=E[g],v=new Map;for(const e of o){const t=Math.round(100*e)/100;v.set(t,(v.get(t)??0)+1)}const j=v.size,k=[...v.entries()].sort((e,t)=>t[1]-e[1]).slice(0,5).map(([e,t])=>({value:e,count:t,percent:t/o.length*100}));let N;if("share"===a)N=200;else{const e=5,t=Math.ceil(d/e)*e;N=t<=10?10:t+e}const w=new Float32Array(2*o.length),M=new Float32Array(o.length),S=new Uint8Array(o.length),T=new Float32Array(o.length);for(let e=0;e=0?C[e]:255,T[e]=c[e]}return{points:w,rawValues:M,packetTypes:S,timestamps:T,count:o.length,minTime:D,maxTime:B,minValue:0,maxValue:N,rawMinValue:m,rawMaxValue:d,unit:"%",stats:{p5:f,p50:y,p95:b,uniqueValues:j,topValues:k}}},[e,t,s,a,r])}(s,a,l,"share"===t?"share":"airtime",i),{data:g}=n.useMemo(()=>function(e,t){var s;const a=e.length;if(0===a)return{data:[],windowSize:0,windowDurationMs:0};const n=(null==(s=e[0])?void 0:s.bucketDurationMs)??1e3,r=Math.min(Math.max(5,Math.round(3e5/n)),a),l=Math.floor(r/2),i=[];let o=0,c=0;for(let C=0;Cg.map(e=>({timestamp:e.timestamp,min:e.min,max:e.max,p75:e.p75,p95:e.p95,p99:e.p99,mean:e.mean,median:e.median,average:e.average,midpoint:e.midpoint})),[g]),y=n.useMemo(()=>(null==h?void 0:h.maxValue)?h.maxValue:"share"===t?200:10,[h,t]),b=n.useCallback(e=>{F(e)},[]),v=n.useMemo(()=>{if(null===B||!g[B])return null;const e=g[B];let t;t=d>=168?75:d>=72?35:d>=24?15:d>=3?10:5;const s=60*t/2,a=e.timestamp;return{start:a-s,end:a+s}},[B,g,d]),j=n.useMemo(()=>{if(null===B||!g[B]||!v)return null;const e=g[B].time,{start:a,end:n}=v,r=s.filter(e=>e.timestamp>=a&&e.timestamp({key:e.key,label:e.label,value:0,color:tt(e.typeNum)}))};const l=new Map,c=new Map;let C=0,A=0;for(const t of r){const e=`TYPE_${t.type??t.payload_type??-1}`;if(l.set(e,(l.get(e)??0)+1),C++,i){const s=p(t,{spreadingFactor:i.sf,bandwidthHz:i.bw,codingRate:i.cr,preambleLength:i.preamble});c.set(e,(c.get(e)??0)+s),A+=s}}const D=o.map(e=>{let s;return s="airtime"===t?A>0?(c.get(e.key)??0)/A:0:C>0?(l.get(e.key)??0)/C:0,{key:e.key,label:e.label,value:s,color:tt(e.typeNum)}});return{timestamp:g[B].timestamp,timeLabel:e,items:D}},[B,g,v,s,o,t,i]);if(0===g.length)return r.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[r.jsx(ee,{className:"w-6 h-6 mr-2 opacity-50"}),r.jsx("span",{children:"No packet data available"})]});const k=(null==j?void 0:j.timeLabel)??null;return r.jsxs("div",{className:"flex flex-col",children:[r.jsxs("div",{className:"analyzer-chart-height relative flex-shrink-0",children:[r.jsx("div",{className:"absolute inset-0 rounded-lg overflow-hidden",children:r.jsx(et,{data:f,maxValue:y,onHover:b,scatterData:h,noiseFloorAnomalies:C,showNoiseFloorOverlay:A,overlayOpacity:D,highlightedType:E,hoveredTimeRange:v,timeRangeHours:d,yAxisMode:"share"===t?"share":"airtime"})}),k&&r.jsx("div",{className:"absolute top-1 right-1 px-2 py-0.5 bg-bg-elevated/90 rounded text-xs text-accent-secondary font-mono pointer-events-none",children:k})]}),r.jsx(st,{sortedTypes:o,highlightedType:E,onTypeHover:u,aggregateShares:c,hoverData:j})]})}const Dt=new class{constructor(){a(this,"buckets",new Map),a(this,"lastProcessedTimestamp",0),a(this,"processedPacketCount",0),a(this,"cacheKey",null),a(this,"bucketDuration",60),a(this,"bucketDurationMs",6e4)}getBuckets(e,t,s,a){const n={startTs:t,endTs:s,radioConfigHash:this.hashRadioConfig(a)};return this.isCacheValid(n)?this.processPackets(e,t,s,a,!1):(this.invalidate(n),this.processPackets(e,t,s,a,!0)),this.toBucketDataArray(t,s)}processPackets(e,t,s,a,n){const r=Math.ceil((s-t)/this.bucketDuration);let l=0;for(const i of e){const e=i.timestamp;if(e=s)continue;if(!n&&e<=this.lastProcessedTimestamp)continue;const o=Math.min(Math.floor((e-t)/this.bucketDuration),r-1),c=this.buckets.get(o)??{total:0,totalAirtime:0};c.total+=1,c.totalAirtime+=p(i,{spreadingFactor:a.sf,bandwidthHz:a.bw,codingRate:a.cr,preambleLength:a.preamble}),this.buckets.set(o,c),e>this.lastProcessedTimestamp&&(this.lastProcessedTimestamp=e),l++}this.processedPacketCount+=l}toBucketDataArray(e,t){const s=t-e,a=Math.ceil(s/this.bucketDuration),n=s/3600,r=[];for(let l=0;l24?s.toLocaleDateString([],{weekday:"short",hour:"2-digit",minute:"2-digit",hour12:!1}):s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),i=this.buckets.get(l)??{total:0,totalAirtime:0};r.push({timestamp:t,time:a,total:i.total,totalAirtime:i.totalAirtime,bucketDurationMs:this.bucketDurationMs})}return r}isCacheValid(e){return!!this.cacheKey&&this.cacheKey.startTs===e.startTs&&this.cacheKey.endTs===e.endTs&&this.cacheKey.radioConfigHash===e.radioConfigHash}invalidate(e){this.buckets.clear(),this.lastProcessedTimestamp=0,this.processedPacketCount=0,this.cacheKey=e}hashRadioConfig(e){return`${e.sf}-${e.bw}-${e.cr}-${e.preamble}`}clear(){this.buckets.clear(),this.lastProcessedTimestamp=0,this.processedPacketCount=0,this.cacheKey=null}getStats(){return{bucketCount:this.buckets.size,processedPackets:this.processedPacketCount,lastTimestamp:this.lastProcessedTimestamp,cacheKey:this.cacheKey}}};function Bt({mode:e,onChange:t}){return r.jsxs("div",{className:"toggle-group toggle-group-sm",children:[r.jsx("button",{onClick:()=>t("share"),className:"toggle-group-item "+("share"===e?"active":""),children:"Total"}),r.jsx("button",{onClick:()=>t("airtime"),className:"toggle-group-item "+("airtime"===e?"active":""),children:"Airtime"})]})}function Ft({smoothing:e,onChange:t}){return r.jsxs("div",{className:"toggle-group toggle-group-sm",children:[r.jsx("button",{onClick:()=>t("stats"),className:"toggle-group-item "+("stats"===e?"active":""),title:"Statistics view (scatter plot)",children:r.jsx(Re,{className:"w-3.5 h-3.5"})}),r.jsx("button",{onClick:()=>t("trend"),className:"toggle-group-item "+("trend"===e?"active":""),title:"Trend line chart",children:r.jsx(Ne,{className:"w-3.5 h-3.5"})}),r.jsx("button",{onClick:()=>t("raw"),className:"toggle-group-item "+("raw"===e?"active":""),title:"No smoothing (raw values)",children:r.jsx(Te,{className:"w-3.5 h-3.5"})}),r.jsx("button",{onClick:()=>t("zlema"),className:"toggle-group-item "+("zlema"===e?"active":""),title:"Light smoothing",children:r.jsx(Se,{className:"w-3.5 h-3.5"})}),r.jsx("button",{onClick:()=>t("ema"),className:"toggle-group-item "+("ema"===e?"active":""),title:"Moderate smoothing",children:r.jsx(Me,{className:"w-3.5 h-3.5"})}),r.jsx("button",{onClick:()=>t("smooth"),className:"toggle-group-item "+("smooth"===e?"active":""),title:"Heavy smoothing",children:r.jsx(_e,{className:"w-3.5 h-3.5"})}),r.jsx("button",{onClick:()=>t("ultra"),className:"toggle-group-item "+("ultra"===e?"active":""),title:"Ultra smoothing",children:r.jsx(Oe,{className:"w-3.5 h-3.5"})}),r.jsx("button",{onClick:()=>t("mosaic"),className:"toggle-group-item "+("mosaic"===e?"active":""),title:"Mosaic view (treemap)",children:r.jsx(Pe,{className:"w-3.5 h-3.5"})})]})}function Et({enabled:e,onChange:t,anomalyCount:s=0,showTuning:a=!1,onTuningChange:n}){return r.jsxs("div",{className:"relative inline-flex items-center gap-1",children:[e&&n&&r.jsx("button",{onClick:()=>n(!a),className:"toggle-group toggle-group-sm "+(a?"active":""),title:a?"Hide tuning panel":"Show tuning panel",children:r.jsx("span",{className:"toggle-group-item "+(a?"active":""),children:r.jsx(ze,{className:"w-3.5 h-3.5"})})}),r.jsx("button",{onClick:()=>t(!e),className:"toggle-group toggle-group-sm "+(e?"active":""),title:e?"Hide noise floor anomalies":"Show noise floor anomalies",children:r.jsx("span",{className:"toggle-group-item "+(e?"active":""),children:r.jsx(ne,{className:"w-3.5 h-3.5"})})}),s>0&&r.jsx("span",{className:"absolute -top-2 -right-2 min-w-[18px] h-[18px] px-1 rounded-full bg-accent-danger text-white text-[10px] font-bold flex items-center justify-center pointer-events-none z-10",children:s>99?"99+":s})]})}const mt={sf:10,bw:25e4,cr:5,preamble:8};function dt(e){return y[e]??`TYPE_${e.toString(16).toUpperCase()}`}function ut(e,t){if(0===e.length)return[];const s=Math.floor((t-1)/2),a=[];for(let n=0;n=s?e[n-s]:e[0];a.push(e[n]+(e[n]-t))}return function(e,t){if(0===e.length)return[];const s=2/(t+1),a=[e[0]];for(let n=1;n{const t=Math.abs(e.length-x.current);if(0===t&&d.length>0)return;h.current&&clearTimeout(h.current);const s=t>100?50:500;return h.current=setTimeout(()=>{x.current=e.length,u(e)},s),()=>{h.current&&clearTimeout(h.current)}},[e,d.length]);const g=n.useMemo(()=>function(e,t){const s=new Map;for(const n of e){const e=n.type??n.payload_type??-1,a=p(n,{spreadingFactor:t.sf,bandwidthHz:t.bw,codingRate:t.cr,preambleLength:t.preamble}),r=s.get(e)??{count:0,airtime:0};s.set(e,{count:r.count+1,airtime:r.airtime+a})}const a=[];for(const[n,r]of s)a.push({typeNum:n,key:`TYPE_${n}`,label:dt(n),totalCount:r.count,totalAirtime:r.airtime});return a.sort((e,t)=>t.totalCount-e.totalCount)}(d,l),[d,l]),y=n.useMemo(()=>function(e,t,s,a,n,r){const l=s-t,i=l/a,o=1e3*i,c=l/3600,C=[];for(let A=0;A24?s.toLocaleDateString([],{weekday:"short",hour:"2-digit",minute:"2-digit",hour12:!1}):s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),counts:{},shares:{},airtimes:{},total:0,totalAirtime:0,bucketDurationMs:o};for(const t of r)a.counts[t.key]=0,a.airtimes[t.key]=0;C.push(a)}for(const A of e){const e=A.timestamp;if(e=s)continue;const r=Math.min(Math.floor((e-t)/i),a-1),l=`TYPE_${A.type??A.payload_type??-1}`;C[r].counts[l]=(C[r].counts[l]??0)+1,C[r].total++;const o=p(A,{spreadingFactor:n.sf,bandwidthHz:n.bw,codingRate:n.cr,preambleLength:n.preamble});C[r].airtimes[l]=(C[r].airtimes[l]??0)+o,C[r].totalAirtime+=o}for(const A of C)for(const e of r)A.shares[e.key]=A.total>0?A.counts[e.key]/A.total*100:0;return C}(d,t,s,a,l,g),[d,t,s,a,l,g]),b=n.useMemo(()=>Dt.getBuckets(d,t,s,l),[d,t,s,l]),v=n.useMemo(()=>g.reduce((e,t)=>e+t.totalCount,0),[g]),j=n.useMemo(()=>g.reduce((e,t)=>e+t.totalAirtime,0),[g]),{sortedTypes:k,aggregateShares:N}=n.useMemo(()=>{const e=new Map,t="share"===i?v:j;if(t>0)for(const s of g){const a="share"===i?s.totalCount:s.totalAirtime;e.set(s.key,a/t)}return{sortedTypes:[...g].sort((t,s)=>(e.get(s.key)??0)-(e.get(t.key)??0)),aggregateShares:e}},[g,v,j,i]),w=n.useMemo(()=>function(e,t,s,a="raw"){const n=function(e,t,s){if(e.length<=360)return e;const a=Math.ceil(e.length/360),n=[];for(let r=0;r0?l.counts[e.key]/l.total*100:0;n.push(l)}return n}(e,0,s),r=n.length,l=s.length,i=Array.from({length:l},()=>new Array(r).fill(0));for(let D=0;D0?(e.counts[s[t].key]??0)/e.total:0;else{let t=0;for(let a=0;a0?(e.airtimes[s[a].key]??0)/t:0}}const o=Array.from({length:l},()=>new Array(r).fill(0));for(let D=0;Dfunction(e,t){switch(t){case"zlema":return ut(e,6);case"ema":return ut(e,12);case"smooth":return ut(e,24);case"ultra":return ut(e,96);default:return e}}(e,a)),C=Array.from({length:l},()=>new Array(r).fill(0));for(let D=0;D0?c[D-1][e]:0;C[D][e]=Math.min(1,Math.max(0,c[D][e]-t))}for(let D=0;D0&&Math.abs(e-1)>1e-6){const t=1/e;for(let e=0;eF(e),[]),S=n.useCallback(e=>m(e),[]),T=n.useMemo(()=>{if(null===E||!w[E])return null;const e=w[E];return{timestamp:e.timestamp,timeLabel:e.time,items:k.map(t=>({key:t.key,label:t.label,value:e[t.key]??0,color:tt(t.typeNum)}))}},[E,w,k]),P=n.useMemo(()=>({timestamps:w.map(e=>e.timestamp),series:k.map(e=>({key:e.key,label:e.label,color:tt(e.typeNum),values:w.map(t=>t[e.key]??0)}))}),[w,k]);return 0===d.length?0===e.length?r.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[r.jsx(ee,{className:"w-6 h-6 mr-2 opacity-50"}),r.jsx("span",{children:"No packet data available"})]}):null:"mosaic"===o?r.jsx(lt,{sortedTypes:k,aggregateShares:N}):"stats"===o?r.jsx(At,{statsBuckets:b,mode:i,packets:d,startTs:t,endTs:s,radioConfig:l,sortedTypes:k,aggregateShares:N,noiseFloorAnomalies:c,showNoiseFloorOverlay:C,overlayOpacity:A}):"trend"===o?r.jsx(ct,{packets:d,mode:i,startTs:t,endTs:s,radioConfig:l,bucketCount:a}):r.jsxs("div",{className:"flex flex-col",children:[r.jsx("div",{className:"analyzer-chart-height relative flex-shrink-0",children:r.jsx("div",{className:"absolute inset-0 rounded-lg overflow-hidden",children:r.jsx(f,{timestamps:P.timestamps,series:P.series,highlightedKey:B,cursorColor:D.cursor,onHover:S})})}),r.jsx(st,{sortedTypes:k,highlightedType:B,onTypeHover:M,aggregateShares:N,hoverData:T})]})}),xt={"1x":1,"2x":2,"4x":4,"8x":8,"16x":16,"36x":36},pt=[1,5,10,25,50,100,150];function gt(e,t,s,a){const n=Math.PI/180,r=(a-t)*n,l=e*n,i=s*n,o=Math.sin(r)*Math.cos(i),c=Math.cos(l)*Math.sin(i)-Math.sin(l)*Math.cos(i)*Math.cos(r);return(180*Math.atan2(o,c)/Math.PI+360)%360}function ft(e,t,s,a){const n=Math.PI/180,r=(s-e)*n,l=(a-t)*n,i=Math.sin(r/2)**2+Math.cos(e*n)*Math.cos(s*n)*Math.sin(l/2)**2;return 12742*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))}const yt=[{min:10,label:"Excellent"},{min:7,label:"Very Good"},{min:4,label:"Good"},{min:1,label:"Fair+"},{min:-2,label:"Fair"},{min:-5,label:"Fair-"},{min:-8,label:"Poor"},{min:-11,label:"Bad"},{min:-1/0,label:"Critical"}];function bt(e,t){return t[J(e)]||"#808080"}const vt=n.memo(function({neighbors:e,quickNeighbors:t,localLat:s,localLon:a,onStatsChange:l}){const[i,o]=n.useState(null),[c,C]=n.useState(new Set),[A,D]=n.useState({width:0,height:0}),[B,F]=n.useState("1x"),[E,m]=n.useState(1),d=n.useRef(null),u=n.useRef({}),h=n.useRef(null),x=n.useRef(null),p=n.useRef(E);p.current=E;const g=Q(),f=K(),y=U(),v=X(),j=Z(),k=j?v.secondary:v.primary,N=j?.4:.15,w=j?.25:.08,M=j?v.primary:f.primary;n.useEffect(()=>{const e=x.current;if(!e)return;const t=new ResizeObserver(e=>{for(const t of e){const{width:e,height:s}=t.contentRect;e>0&&s>0&&D({width:e,height:s})}});t.observe(e);const s=e.getBoundingClientRect();return s.width>0&&s.height>0&&D({width:s.width,height:s.height}),()=>t.disconnect()},[]);const S=n.useMemo(()=>{const e=new Set;if(t)for(const s of t)e.add(s.hash);return e},[t]),T=n.useMemo(()=>{const e=new Map;if(t)for(const s of t)e.set(s.hash,{snr:s.avgSnr,rssi:s.avgRssi});return e},[t]),{processedNeighbors:P,maxDistance:R,totalNeighbors:$,zeroHopCount:L}=n.useMemo(()=>{const t=[];for(const[r,l]of Object.entries(e)){if(!l.latitude||!l.longitude||0===l.latitude||0===l.longitude)continue;if(!S.has(r))continue;const e=gt(s,a,l.latitude,l.longitude),n=ft(s,a,l.latitude,l.longitude),i=T.get(r);t.push({hash:r.slice(0,8),name:l.node_name||l.name||"Unknown",snr:(null==i?void 0:i.snr)??l.snr??null,rssi:(null==i?void 0:i.rssi)??l.rssi??null,bearing:e,distance:n,normalizedDistance:0,lastSeen:l.last_seen,isZeroHop:!0})}const n=1.08*(t.length>0?Math.max(...t.map(e=>e.distance)):0);return t.sort((e,t)=>(e.snr??-1/0)-(t.snr??-1/0)),{processedNeighbors:t,maxDistance:n,totalNeighbors:t.length,zeroHopCount:t.length}},[e,s,a,S,T]);n.useEffect(()=>{null==l||l({zeroHopCount:L,totalCount:$,maxDistanceKm:R})},[L,$,R]),n.useEffect(()=>{const e=xt[B],t=p.current;d.current&&cancelAnimationFrame(d.current);const s=performance.now(),a=n=>{const r=n-s,l=Math.min(r/400,1),i=(o=l)<.5?8*o*o*o*o:1-Math.pow(-2*o+2,4)/2;var o;m(t+(e-t)*i),d.current=l<1?requestAnimationFrame(a):null};return d.current=requestAnimationFrame(a),()=>{d.current&&cancelAnimationFrame(d.current)}},[B]);const z=R/E,H=n.useMemo(()=>pt.filter(e=>e<=1.1*z),[z]);n.useEffect(()=>{const e=[];for(const s of P){const t=u.current[s.hash];void 0!==t&&t!==s.lastSeen&&e.push(s.hash),u.current[s.hash]=s.lastSeen}if(0===e.length)return;queueMicrotask(()=>{C(t=>new Set([...t,...e]))});const t=setTimeout(()=>{C(t=>{const s=new Set(t);return e.forEach(e=>s.delete(e)),s})},600);return()=>clearTimeout(t)},[P]);const _=0!==s&&0!==a,O=n.useMemo(()=>{const{width:e,height:t}=A,s=e/2,a=t/2,n=Math.max(10,e/2-12),r=Math.max(10,t/2-12),l=Math.max(10,n-16),i=Math.max(10,r-16);return{width:e,height:t,centerX:s,centerY:a,maxRadiusX:l,maxRadiusY:i,labelRadiusX:n,labelRadiusY:r,cornerRadius:.2*Math.min(l,i)}},[A]),{width:W,height:I,centerX:q,centerY:V,maxRadiusX:G,maxRadiusY:Y,labelRadiusX:J,labelRadiusY:ee,cornerRadius:te}=O,se=n.useCallback((e,t=1)=>{const s=G*t,a=Y*t,n=Math.min(te*t,s,a),r=(e%360+360)%360,l=r*Math.PI/180,i=180*Math.atan2(a-n,s-n)/Math.PI;let o,c;if(r<=45-i||r>315+i){const e=Math.tan(l);o=Math.max(q-s+n,Math.min(q+s-n,q+a*e*(s/a))),c=V-a}else if(r>45-i&&r<=45+i)o=q+s-n+n*Math.sin(l),c=V-a+n-n*Math.cos(l);else if(r>45+i&&r<=135-i){const e=1/Math.tan(l);c=Math.max(V-a+n,Math.min(V+a-n,V-s*e*(a/s))),o=q+s}else if(r>135-i&&r<=135+i)o=q+s-n+n*Math.sin(l),c=V+a-n-n*Math.cos(l);else if(r>135+i&&r<=225-i){const e=Math.tan(l);o=Math.max(q-s+n,Math.min(q+s-n,q-a*e*(s/a))),c=V+a}else if(r>225-i&&r<=225+i)o=q-s+n+n*Math.sin(l),c=V+a-n-n*Math.cos(l);else if(r>225+i&&r<=315-i){const e=1/Math.tan(l);c=Math.max(V-a+n,Math.min(V+a-n,V-s*e*(a/s))),o=q-s}else o=q-s+n+n*Math.sin(l),c=V-a+n-n*Math.cos(l);return{x:o,y:c}},[q,V,G,Y,te]),ne=n.useCallback((e,t)=>{const s=se(e,1);return{x:q+(s.x-q)*t,y:V+(s.y-V)*t}},[se,q,V]),re=n.useCallback(e=>({N:{x:q,y:V-ee},S:{x:q,y:V+ee},E:{x:q+J,y:V},W:{x:q-J,y:V},NE:{x:q+J,y:V-ee},SE:{x:q+J,y:V+ee},SW:{x:q-J,y:V+ee},NW:{x:q-J,y:V-ee}}[e]),[q,V,J,ee]),le=n.useCallback(e=>{const t=G*e,s=Y*e,a=Math.min(te*e,t,s),n=q-t,r=q+t,l=V-s,i=V+s;return[`M ${n+a} ${l}`,`L ${r-a} ${l}`,`Q ${r} ${l} ${r} ${l+a}`,`L ${r} ${i-a}`,`Q ${r} ${i} ${r-a} ${i}`,`L ${n+a} ${i}`,`Q ${n} ${i} ${n} ${i-a}`,`L ${n} ${l+a}`,`Q ${n} ${l} ${n+a} ${l}`,"Z"].join(" ")},[q,V,G,Y,te]),ie=n.useCallback(e=>{o(e)},[]),oe=n.useCallback(e=>{F(e)},[]),ce=n.useCallback(e=>R<=0?0:e/R*E,[R,E]),Ce=e=>`${e}km`,Ae=n.useMemo(()=>{const e=H.map(e=>{const t=e/R*E;return{km:e,scale:t,labelY:V-Y*t*.71}}).filter(e=>e.scale<=1.05&&e.scale>=.02).sort((e,t)=>t.km-e.km),t=[];for(const s of e)t.some(e=>Math.abs(e.labelY-s.labelY)<28)||t.push(s);return t},[H,R,E,V,Y]),De=A.width>0&&A.height>0;return _?0===$?r.jsxs("div",{ref:h,className:"flex flex-col items-center justify-center h-full text-text-secondary",children:[r.jsx(ae,{className:"w-8 h-8 mb-2 opacity-50"}),r.jsx("p",{children:"No nodes with location data"})]}):r.jsxs("div",{ref:h,className:"relative h-full w-full flex overflow-hidden",children:[r.jsx("div",{ref:x,className:"relative flex-1 min-w-0 h-full",children:De&&r.jsxs("svg",{width:W,height:I,className:"absolute inset-0 z-0",children:[r.jsxs("defs",{children:[r.jsx("style",{children:"\n @keyframes neighbor-blink-scale {\n 0%, 100% {\n transform: scale(1);\n opacity: 0;\n }\n 50% {\n transform: scale(1.3);\n opacity: 0.8;\n }\n }\n .neighbor-blink-ring {\n transform-origin: center;\n animation: neighbor-blink-scale 600ms ease-out forwards;\n }\n "}),r.jsx("clipPath",{id:"radar-clip",children:r.jsx("path",{d:le(1)})})]}),H.map(e=>{const t=ce(e);if(t>1.05||t<.02)return null;const s=Ae.some(t=>t.km===e),a=q+G*t*.71,n=V-Y*t*.71;return r.jsxs("g",{children:[r.jsx("path",{d:le(t),fill:"none",stroke:k,strokeOpacity:N,strokeWidth:1}),s&&r.jsx("text",{x:a+4,y:n-2,textAnchor:"start",dominantBaseline:"auto",className:"fill-text-secondary",fontSize:10,fontFamily:b,children:Ce(e)})]},`ring-${e}`)}),["N","E","S","W"].map(e=>{const t="N"===e||"S"===e,s=t?q:"E"===e?q+G:q-G,a=t?"N"===e?V-Y:V+Y:V;return r.jsx("line",{x1:q,y1:V,x2:s,y2:a,stroke:k,strokeOpacity:N,strokeWidth:1,strokeDasharray:"4 4"},e)}),["NE","SE","SW","NW"].map(e=>{const t=re(e);return r.jsx("line",{x1:q,y1:V,x2:t.x,y2:t.y,stroke:k,strokeOpacity:w,strokeWidth:1,strokeDasharray:"4 4"},`diag-${e}`)}),["N","E","S","W"].map(e=>{const t=re(e),s="E"===e?"end":"W"===e?"start":"middle",a="N"===e?"hanging":"S"===e?"auto":"middle";return r.jsx("text",{x:t.x,y:t.y,textAnchor:s,dominantBaseline:a,fill:M,fontSize:16,fontWeight:600,fontFamily:b,"aria-hidden":"true",children:e},e)}),["NE","SE","SW","NW"].map(e=>{const t=re(e),s="NE"===e||"SE"===e?"end":"start",a="NE"===e||"NW"===e?"hanging":"auto";return r.jsx("text",{x:t.x,y:t.y,textAnchor:s,dominantBaseline:a,fill:M,fontSize:16,fontWeight:600,fontFamily:b,"aria-hidden":"true",children:e},e)}),r.jsx("circle",{cx:q,cy:V,r:5,fill:y.chart6,stroke:"rgba(255,255,255,0.3)",strokeWidth:1,role:"img","aria-label":"Local node"}),r.jsx("g",{clipPath:"url(#radar-clip)",children:P.map(e=>{const t=R>0?e.distance/R*E:0;if(t>1)return null;const{x:s,y:a}=ne(e.bearing,t),n=null!==e.snr?bt(e.snr,g):"#808080",l=(null==i?void 0:i.hash)===e.hash,o=c.has(e.hash);return r.jsxs("g",{role:"img","aria-label":`${e.name}: ${e.distance.toFixed(1)}km ${e.bearing.toFixed(0)}°`,children:[o&&r.jsx("circle",{cx:s,cy:a,r:10.5,fill:"none",stroke:"rgba(255,255,255,0.9)",strokeWidth:2,className:"neighbor-blink-ring"}),l&&r.jsx("circle",{cx:s,cy:a,r:10.5,fill:n,opacity:.3}),r.jsx("circle",{cx:s,cy:a,r:l?7:5,fill:n,stroke:"rgba(0,0,0,0.5)",strokeWidth:1,style:{cursor:"pointer",transition:"r 0.15s"},onMouseEnter:()=>ie(e),onMouseLeave:()=>ie(null)})]},e.hash)})})]})}),r.jsx("div",{className:"flex flex-col h-full items-stretch gap-1 py-2 pl-2 flex-shrink-0",role:"group","aria-label":"Zoom level",children:["1x","2x","4x","8x","16x","36x"].map(e=>r.jsx("button",{onClick:()=>oe(e),"aria-pressed":B===e,className:"flex flex-1 items-center justify-center px-1.5 text-xs font-medium rounded transition-colors "+(B===e?"bg-accent-primary/20 text-accent-primary":"bg-white/5 text-text-secondary hover:bg-white/10 hover:text-text-primary"),children:e},e))}),i&&r.jsxs("div",{className:"absolute bg-tooltip-bg border border-border-subtle rounded-lg px-3 py-2 text-sm pointer-events-none z-10 shadow-xl",style:{left:"50%",bottom:8,transform:"translateX(-50%)"},children:[r.jsx("div",{className:"font-medium text-text-primary",children:i.name}),r.jsx("div",{className:"text-text-secondary text-xs font-mono",children:i.hash}),null!==i.snr?r.jsx("div",{className:"flex gap-3 mt-1 text-xs",children:r.jsxs("span",{children:[r.jsx("span",{className:"text-text-secondary",children:"SNR:"})," ",r.jsxs("span",{className:"tabular-nums",style:{color:bt(i.snr,g)},children:[i.snr.toFixed(1)," dB"]}),r.jsxs("span",{className:"text-text-secondary ml-1",children:["(",(Be=i.snr,(null==(Fe=yt.find(e=>Be>=e.min))?void 0:Fe.label)??"Critical"),")"]})]})}):r.jsx("div",{className:"text-xs text-text-secondary mt-1",children:"No SNR data"}),r.jsxs("div",{className:"flex gap-3 text-xs",children:[r.jsxs("span",{children:[r.jsx("span",{className:"text-text-secondary",children:"Distance:"})," ",r.jsxs("span",{className:"tabular-nums text-text-primary",children:[i.distance.toFixed(2)," km"]})]}),r.jsxs("span",{children:[r.jsx("span",{className:"text-text-secondary",children:"Bearing:"})," ",r.jsxs("span",{className:"tabular-nums text-text-primary",children:[i.bearing.toFixed(0),"°"]})]})]})]})]}):r.jsxs("div",{ref:h,className:"flex flex-col items-center justify-center h-full text-text-secondary",children:[r.jsx(ae,{className:"w-8 h-8 mb-2 opacity-50"}),r.jsx("p",{children:"Local node coordinates not configured"}),r.jsx("p",{className:"text-xs mt-1",children:"Set latitude/longitude in config to enable"})]});var Be,Fe}),jt={repeater:"var(--accent-primary)",companion:"var(--accent-tertiary)",room_server:"var(--accent-secondary)"};function kt(e){if(e.contact_type){const t=e.contact_type.toLowerCase();if("repeater"===t||"rep"===t)return"repeater";if("room server"===t||"room_server"===t||"room"===t||"server"===t)return"room_server";if("companion"===t||"client"===t||"cli"===t)return"companion"}return e.is_repeater?"repeater":"companion"}const Nt=n.memo(function({neighbors:e}){const t=n.useMemo(()=>{const t={repeater:0,companion:0,room_server:0};for(const a of Object.values(e)){const e=kt(a);t[e]=(t[e]||0)+1}const s=Object.values(t).reduce((e,t)=>e+t,0);return{items:[{label:"Repeaters",count:t.repeater,percent:0,color:jt.repeater},{label:"Companions",count:t.companion,percent:0,color:jt.companion},{label:"Room Servers",count:t.room_server,percent:0,color:jt.room_server}].map(e=>({...e,percent:s>0?e.count/s*100:0})).filter(e=>e.count>0).sort((e,t)=>t.count-e.count),total:s}},[e]);return 0===t.total?r.jsx("div",{className:"h-full flex items-center justify-center text-text-muted type-body-sm",children:"No neighbors discovered yet"}):r.jsxs("div",{className:"h-full flex flex-col",children:[r.jsx("div",{className:"flex-1 flex flex-col justify-evenly",children:t.items.map(e=>r.jsxs("div",{className:"flex flex-col gap-1.5",children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:"type-data-sm text-text-secondary",children:e.label}),r.jsxs("span",{className:"type-data-sm text-text-secondary tabular-nums",children:[e.count," ",r.jsxs("span",{className:"text-text-secondary/60",children:["(",e.percent.toFixed(0),"%)"]})]})]}),r.jsx("div",{className:"h-2.5 bg-bg-elevated overflow-hidden",children:r.jsx("div",{className:"h-full transition-all duration-500 ease-out",style:{width:`${e.percent}%`,backgroundColor:e.color,minWidth:e.count>0?"4px":"0"}})})]},e.label))}),r.jsxs("div",{className:"flex items-center justify-between pt-2 border-t border-border-subtle",children:[r.jsx("span",{className:"type-data-xs text-text-secondary",children:"Total Nodes"}),r.jsx("span",{className:"type-data-sm text-text-primary font-medium tabular-nums",children:t.total})]})]})});function wt({children:e,minHeight:t="100%",rootMargin:s="200px 0px",keepMounted:a=!0,className:l=""}){const i=n.useRef(null),[o,c]=n.useState(!1),[C,A]=n.useState(!1);n.useEffect(()=>{const e=i.current;if(!e)return;const t=new IntersectionObserver(([e])=>{const t=e.isIntersecting;A(t),t&&c(!0)},{rootMargin:s,threshold:0});return t.observe(e),()=>{t.disconnect()}},[s]);const D=C||a&&o;return r.jsx("div",{ref:i,className:`h-full w-full ${l}`,style:{minHeight:t},children:D?e:r.jsx("div",{className:"h-full w-full flex items-center justify-center text-text-muted/50",children:r.jsx("div",{className:"animate-pulse text-xs",children:"Loading chart..."})})})}const Mt={excellent:"text-signal-excellent",good:"text-signal-good",fair:"text-signal-fair",poor:"text-accent-primary"},St={excellent:"bg-signal-excellent/10",good:"bg-signal-good/10",fair:"bg-signal-fair/10",poor:"bg-accent-primary/10"};function Tt(){const e=v(),t=j(),[s,a]=n.useState(null),l=n.useCallback((e,t)=>{a({prefix:e,candidateHashes:t})},[]),i=n.useCallback(()=>{a(null)},[]);if(!t)return r.jsxs(ie,{children:[r.jsx(Be,{icon:r.jsx(te,{}),title:"Prefix Conflicts",largeTitle:!0}),r.jsx("div",{className:"flex-1 flex items-center justify-center",children:r.jsxs("div",{className:"text-center text-text-secondary",children:[r.jsx(Ee,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),r.jsx("p",{className:"type-data-xs",children:"No topology data available"}),r.jsx("p",{className:"type-data-xs opacity-70",children:"Run deep analysis to see stats"})]})})]});const o=(c=e.avgConfidence)>=.9?"excellent":c>=.7?"good":c>=.5?"fair":"poor";var c;const C=(A=e.collisionRate)<=10?"excellent":A<=25?"good":"poor";var A;const D="poor"===o||"poor"===C?"poor":"fair"===o||"fair"===C?"fair":"good"===o||"good"===C?"good":"excellent",B="excellent"===D||"good"===D?we:me;return r.jsxs(ie,{className:"flex flex-col overflow-hidden",children:[r.jsx(Be,{icon:r.jsx(te,{}),title:"Prefix Conflicts",largeTitle:!0,actions:r.jsxs("div",{className:`flex items-center gap-1.5 px-2.5 py-1 rounded-full ${St[D]}`,children:[r.jsx(B,{className:`w-3.5 h-3.5 ${Mt[D]}`}),r.jsx("span",{className:`type-data-xs font-medium ${Mt[D]}`,children:"excellent"===D?"Excellent":"good"===D?"Good":"fair"===D?"Fair":"Needs Attention"})]})}),r.jsxs("div",{className:"flex-1 flex flex-col min-h-0",children:[r.jsxs("div",{className:"grid grid-cols-3 gap-1.5 sm:gap-2 py-3 sm:py-4",children:[r.jsxs("div",{className:"flex flex-col items-center cursor-help bg-white/5 radius-inner sm:radius-inset py-2 sm:py-3 px-1.5 sm:px-2",title:"Total unique 2-character prefixes observed in packet paths.",children:[r.jsx(re,{value:e.totalPrefixes,className:"font-mono text-2xl sm:text-3xl font-semibold tabular-nums text-text-primary",priority:"low"}),r.jsx("span",{className:"type-data-xs sm:type-data-sm text-text-secondary mt-0.5 sm:mt-1",children:"Prefixes"})]}),r.jsxs("div",{className:"flex flex-col items-center cursor-help bg-white/5 radius-inner sm:radius-inset py-2 sm:py-3 px-1.5 sm:px-2",title:"Prefixes that map to exactly one known node. No disambiguation needed.",children:[r.jsx(re,{value:e.unambiguousPrefixes,className:"font-mono text-2xl sm:text-3xl font-semibold tabular-nums text-text-primary",priority:"low"}),r.jsx("span",{className:"type-data-xs sm:type-data-sm text-text-secondary mt-0.5 sm:mt-1",children:"Unique"})]}),r.jsxs("div",{className:"flex flex-col items-center cursor-help radius-inner sm:radius-inset py-2 sm:py-3 px-1.5 sm:px-2 "+(e.collisionPrefixes>0?"bg-accent-primary/15":"bg-white/5"),title:"Prefixes matching multiple known nodes. Click a prefix below to explore candidates.",children:[r.jsx(re,{value:e.collisionPrefixes,className:"font-mono text-2xl sm:text-3xl font-semibold tabular-nums "+(e.collisionPrefixes>0?"text-accent-primary":"text-text-primary"),priority:"low"}),r.jsx("span",{className:"type-data-xs sm:type-data-sm mt-0.5 sm:mt-1 "+(e.collisionPrefixes>0?"text-accent-primary":"text-text-secondary"),children:"Conflicts"})]})]}),e.highCollisionPrefixes.length>0&&r.jsxs("div",{children:[r.jsx("div",{className:"type-data-xs text-text-secondary mb-1.5",children:"Problem Prefixes"}),r.jsx("div",{className:"flex flex-wrap gap-1.5 content-start",children:e.highCollisionPrefixes.map(({prefix:e,candidateCount:t,candidateHashes:s})=>r.jsxs("button",{type:"button",onClick:()=>l(e,s),className:"inline-flex items-center gap-0.5 group",title:`${t} candidates - click to explore`,children:[r.jsx(Ae,{children:e}),r.jsxs("span",{className:"text-text-muted type-data-xs group-hover:text-text-secondary transition-colors",children:["×",t]})]},e))})]}),0===e.lowConfidencePrefixes.length&&0===e.collisionPrefixes&&r.jsx("div",{className:"flex-1 flex items-center",children:r.jsxs("div",{className:"flex items-center gap-1.5",children:[r.jsx(we,{className:"w-3.5 h-3.5 text-signal-excellent"}),r.jsx("span",{className:"type-data-xs text-signal-excellent",children:"All prefixes uniquely identified"})]})}),r.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mt-auto pt-3",children:[r.jsxs("div",{className:"flex items-center gap-2 cursor-help",title:"Average confidence score across all disambiguated prefixes. Higher = more certain node identification.",children:[r.jsx("span",{className:"type-data-xs text-text-secondary",children:"Confidence"}),r.jsxs("span",{className:`data-box ${Mt[o]}`,children:[(100*e.avgConfidence).toFixed(1),"%"]})]}),r.jsxs("div",{className:"flex items-center gap-2 cursor-help",title:"Percentage of 2-character prefixes that match multiple known nodes. Lower is better.",children:[r.jsx("span",{className:"type-data-xs text-text-secondary",children:"Collisions"}),r.jsxs("span",{className:`data-box ${Mt[C]}`,children:[e.collisionRate.toFixed(1),"%"]})]})]})]}),r.jsx(De,{isOpen:!!s,prefix:(null==s?void 0:s.prefix)||"",candidateHashes:(null==s?void 0:s.candidateHashes)||[],onClose:i})]})}function Pt({icon:e,label:t,value:s,sublabel:a,highlight:n,tooltip:l}){return r.jsxs("div",{className:"flex items-center justify-between gap-2 py-1.5 "+(l?"cursor-help":""),title:l,children:[r.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 min-w-0",children:[r.jsx("span",{className:"icon-xs text-icon-widget flex-shrink-0",children:e}),r.jsx("span",{className:"type-body-sm text-text-secondary truncate",children:t})]}),r.jsxs("div",{className:"flex items-center gap-1 sm:gap-1.5 flex-shrink-0",children:[r.jsx("span",{className:"data-box",style:n?{"--data-box-color":"var(--accent-primary)"}:void 0,children:s}),a&&r.jsx("span",{className:"type-data-xs text-text-secondary hidden sm:inline",children:a})]})]})}function Rt(){const e=k(),t=N().length;if(!e||0===e.totalPaths)return null;const{totalPaths:s,pathsWithGhosts:a,observationOverrideCount:n,tracePacketsProcessed:l,pathPacketsProcessed:i,distantEdgesDiscovered:o,duplicateGroupsFound:c,duplicatePathsUnique:C,echolocationEdgesInferred:A}=e,D=s>0?((s-a)/s*100).toFixed(1):"0",B=s>0?(n/s*100).toFixed(1):"0",F=l+i,E=F>0||o>0,m=c>0||A>0;return r.jsxs(ie,{children:[r.jsx(Be,{title:"Path Decoder",icon:r.jsx(se,{}),largeTitle:!0,badge:t>0?`${t} hidden`:void 0}),r.jsxs(Fe,{children:[r.jsxs("div",{children:[r.jsx(Pt,{icon:r.jsx($e,{className:"w-3.5 h-3.5"}),label:"Traceable",value:`${D}%`,sublabel:`of ${s.toLocaleString()} paths`,tooltip:"Percentage of packet journeys where every hop was identified. Higher = better visibility into how traffic flows through your mesh."}),r.jsx(Pt,{icon:r.jsx(He,{className:"w-3.5 h-3.5"}),label:"Learning Rate",value:`${B}%`,sublabel:"adapted",tooltip:"How often real traffic patterns improved our predictions over geography alone. Higher values mean the decoder is learning your mesh's actual behavior — which routes are preferred, which nodes are most active."})]}),E&&r.jsxs("div",{className:"mt-3",children:[r.jsx("p",{className:"type-micro mb-2",children:"Beyond Line-of-Sight"}),r.jsxs("div",{children:[r.jsx(Pt,{icon:r.jsx(Le,{className:"w-3.5 h-3.5"}),label:"Route Reports",value:F.toLocaleString(),sublabel:l>0?`(${l} TRACE)`:void 0,tooltip:"TRACE/PATH packets from distant nodes share their routing tables. This reveals connections we can't directly observe — mapping parts of the mesh we don't touch."}),r.jsx(Pt,{icon:r.jsx(de,{className:"w-3.5 h-3.5"}),label:"Remote Links",value:o.toLocaleString(),highlight:o>0,tooltip:"Node-to-node connections discovered from route reports. These links exist outside our RF range but help complete the topology picture."})]})]}),m&&r.jsx(Pt,{icon:r.jsx(w,{className:"w-3.5 h-3.5"}),label:"Multi-Path Packets",value:c.toLocaleString(),sublabel:C>0?`(${C} routes)`:void 0,tooltip:"Packets received via multiple paths simultaneously. Like sonar, these 'echoes' reveal redundant routes — important for understanding mesh resilience."}),t>0&&r.jsx(Pt,{icon:r.jsx(M,{className:"w-3.5 h-3.5 text-accent-primary"}),label:"Ghost Repeaters",value:t,highlight:!0,tooltip:"High-confidence hidden repeaters: appear in 10+ paths, have 2+ known neighbors, ≥30% confidence, and plausible location. View them on the Contacts map."})]})]})}function $t(){var e,t,s,a,l,i,o,c,C,A,D,B,F,E,m,d,u;const h=S(),x=T(),p=P(),g=R(),f=$(),y=L(),b=z(),v=H(),[j,k]=n.useState([]),[N,w]=n.useState(null),[M,K]=n.useState(null),[X,Y]=n.useState(!0),[Q,U]=n.useState(null),[Z,J]=n.useState(()=>{const e=localStorage.getItem("statistics-view-mode");return"share"===e||"airtime"===e?e:"airtime"});n.useEffect(()=>{localStorage.setItem("statistics-view-mode",Z)},[Z]);const[te,se]=n.useState(()=>{const e=localStorage.getItem("statistics-smoothing-mode");return["raw","ema","zlema","smooth","ultra","mosaic","stats","trend"].includes(e)?e:"trend"});n.useEffect(()=>{localStorage.setItem("statistics-smoothing-mode",te)},[te]);const[ne,re]=n.useState(!1),[Ae,De]=n.useState(!1),[Fe,Ee]=n.useState(We),[me,de]=n.useState(.5),pe=n.useMemo(()=>({0:0,1:0,2:1,3:2,4:3,5:4,6:5,7:6}[b]??3),[b]),ge=_[pe].hours,fe=60*ge,ye=_[pe],be=W(ge),ve=y.isBackgroundLoading,je=n.useCallback(e=>{v({0:1,1:2,2:3,3:4,4:5,5:6,6:7}[e]??4)},[v]),ke=n.useMemo(()=>{var e;if(!(null==(e=null==h?void 0:h.config)?void 0:e.radio))return null;const t=h.config.radio;return{sf:t.spreading_factor??10,bw:t.bandwidth??25e4,cr:t.coding_rate??5,preamble:t.preamble_length??8}},[null==(t=null==(e=null==h?void 0:h.config)?void 0:e.radio)?void 0:t.spreading_factor,null==(a=null==(s=null==h?void 0:h.config)?void 0:s.radio)?void 0:a.bandwidth,null==(i=null==(l=null==h?void 0:h.config)?void 0:l.radio)?void 0:i.coding_rate,null==(c=null==(o=null==h?void 0:h.config)?void 0:o.radio)?void 0:c.preamble_length]);n.useEffect(()=>{!async function(){var e;U(null);try{const t=await O(ge);t.success&&(null==(e=t.data)?void 0:e.history)&&k(t.data.history)}catch(t){U(t instanceof Error?t.message:"Failed to load chart data")}finally{Y(!1)}}()},[ge]);const Ne=n.useMemo(()=>72===ge?6e5:168===ge?18e5:336===ge?36e5:3e5,[ge]),we=n.useCallback(async()=>{var e;try{const t=await O(ge);t.success&&(null==(e=t.data)?void 0:e.history)&&k(t.data.history)}catch{}},[ge]);G(we,Ne,!0,!0);const Me=n.useMemo(()=>0===j.length?{timestamps:[],values:[]}:{timestamps:j.map(e=>e.timestamp),values:j.map(e=>e.noise_floor_dbm)},[j]),Se=n.useMemo(()=>{if(j.length<10)return{anomalies:[],debug:void 0};const e=function(e,t={}){const s={...We,...t};if(e.length<10)return{anomalies:[],thresholds:qe([]),totalSamples:e.length,anomalySamples:0};const a=e.map(e=>e.noise_floor_dbm),n=qe(a),r=[...a].sort((e,t)=>e-t);let l,i;s.useAbsoluteThresholds?(l=s.baselineDbm,i=s.spikeDbm):(l=Ie(r,s.baselinePercentile),i=Ie(r,s.spikePercentile));const o=[...e].sort((e,t)=>e.timestamp-t.timestamp),c=[];let C=null,A=0;for(const D of o)if(D.noise_floor_dbm>l&&D.noise_floor_dbme+t,0)/C.values.length):(C.values.length>=s.minSequenceLength&&c.push(C),C={startTs:D.timestamp,endTs:D.timestamp,values:[D.noise_floor_dbm],timestamps:[D.timestamp],rollingAvg:D.noise_floor_dbm})}else C={startTs:D.timestamp,endTs:D.timestamp,values:[D.noise_floor_dbm],timestamps:[D.timestamp],rollingAvg:D.noise_floor_dbm};else C&&C.values.length>=s.minSequenceLength&&c.push(C),C=null;return C&&C.values.length>=s.minSequenceLength&&c.push(C),0===c.length?{anomalies:[],thresholds:n,totalSamples:e.length,anomalySamples:A,debug:{baselineCutoff:l,spikeCutoff:i,midBandSamples:A}}:{anomalies:c.map(e=>{const t=Math.max(...e.values),s=e.values.reduce((e,t)=>e+t,0)/e.values.length;return{startTs:e.startTs,endTs:e.endTs,peakValue:t,avgValue:s,severity:Ve(s,l,i),sampleCount:e.values.length}}),thresholds:n,totalSamples:e.length,anomalySamples:A,debug:{baselineCutoff:l,spikeCutoff:i,midBandSamples:A}}}(j,Fe);return{anomalies:e.anomalies,debug:e.debug}},[j,Fe]),Te=Se.anomalies,Pe=n.useMemo(()=>{const e=(null==h?void 0:h.neighbors)??{};return Object.fromEntries(Object.entries(e).filter(([e])=>!x.has(e)))},[null==h?void 0:h.neighbors,x]),Re=n.useMemo(()=>{const e=Date.now()/1e3-3600*ge;return Object.fromEntries(Object.entries(Pe).filter(([,t])=>t.last_seen>=e))},[Pe,ge]),$e=n.useMemo(()=>{const e=60*fe/be,t=Math.floor(Date.now()/1e3),s=Math.floor(t/e)*e;return{start:s-60*fe,end:s}},[fe,be]);return r.jsxs(oe,{children:[r.jsx(ce,{title:"Statistics",icon:r.jsx(I,{}),controls:r.jsx(le,{ranges:_,selectedIndex:pe,onSelect:je,isPending:ve})}),Q&&r.jsx(ie,{className:"border border-accent-red/50 bg-accent-red/10",children:r.jsx("p",{className:"text-accent-red",children:Q})}),ne&&Ae&&r.jsxs(ie,{className:"border border-accent-purple/30 bg-glass-surface/50",children:[r.jsxs("div",{className:"flex items-center justify-between mb-3",children:[r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("span",{className:"type-label",children:"Anomaly Detection Tuning"}),r.jsxs("span",{className:"type-data-xs text-text-muted",children:["(",ye.label,")"]})]}),r.jsx("button",{onClick:()=>Ee(e=>({...e,useAbsoluteThresholds:!e.useAbsoluteThresholds})),className:"type-data-xs px-2 py-1 rounded transition-colors "+(Fe.useAbsoluteThresholds?"bg-accent-purple/30 text-accent-purple":"bg-glass-elevated text-text-muted hover:text-text-secondary"),children:Fe.useAbsoluteThresholds?"Absolute dBm":"Percentile"})]}),r.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-4",children:[r.jsxs("div",{children:[r.jsx("span",{className:"type-micro",children:"Baseline"}),r.jsxs("span",{className:"ml-2 type-data-sm text-status-warning",children:[(null==(A=null==(C=Se.debug)?void 0:C.baselineCutoff)?void 0:A.toFixed(1))??"—"," dBm"]})]}),r.jsxs("div",{children:[r.jsx("span",{className:"type-micro",children:"Spike"}),r.jsxs("span",{className:"ml-2 type-data-sm text-status-warning",children:[(null==(B=null==(D=Se.debug)?void 0:D.spikeCutoff)?void 0:B.toFixed(1))??"—"," dBm"]})]}),r.jsxs("div",{children:[r.jsx("span",{className:"type-micro",children:"Mid-band"}),r.jsx("span",{className:"ml-2 type-data-sm text-accent-purple",children:(null==(F=Se.debug)?void 0:F.midBandSamples)??0})]}),r.jsxs("div",{children:[r.jsx("span",{className:"type-micro",children:"Anomalies"}),r.jsx("span",{className:"ml-2 type-data-sm text-status-danger",children:Te.length})]})]}),r.jsxs("div",{className:"mt-4 pt-4 border-t border-border-subtle space-y-4",children:[Fe.useAbsoluteThresholds?r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Baseline (",Fe.baselineDbm," dBm)"]}),r.jsx("input",{type:"range",min:"-120",max:"-60",value:Fe.baselineDbm,onChange:e=>Ee(t=>({...t,baselineDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Spike (",Fe.spikeDbm," dBm)"]}),r.jsx("input",{type:"range",min:"-100",max:"-20",value:Fe.spikeDbm,onChange:e=>Ee(t=>({...t,spikeDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Merge Gap (",Fe.mergeGapSeconds,"s)"]}),r.jsx("input",{type:"range",min:"5",max:"120",step:"5",value:Fe.mergeGapSeconds,onChange:e=>Ee(t=>({...t,mergeGapSeconds:Number(e.target.value)})),className:"w-full accent-accent-purple"})]})]}),r.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Min Sequence (",Fe.minSequenceLength,")"]}),r.jsx("input",{type:"range",min:"2",max:"20",value:Fe.minSequenceLength,onChange:e=>Ee(t=>({...t,minSequenceLength:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Similarity (±",Fe.similarityToleranceDbm," dBm)"]}),r.jsx("input",{type:"range",min:"1",max:"15",value:Fe.similarityToleranceDbm,onChange:e=>Ee(t=>({...t,similarityToleranceDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Opacity (",Math.round(100*me),"%)"]}),r.jsx("input",{type:"range",min:"0.1",max:"1",step:"0.05",value:me,onChange:e=>de(Number(e.target.value)),className:"w-full accent-accent-purple"})]})]})]}):r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Baseline (P",Fe.baselinePercentile,")"]}),r.jsx("input",{type:"range",min:"1",max:"50",value:Fe.baselinePercentile,onChange:e=>Ee(t=>({...t,baselinePercentile:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Spike (P",Fe.spikePercentile,")"]}),r.jsx("input",{type:"range",min:"50",max:"99",value:Fe.spikePercentile,onChange:e=>Ee(t=>({...t,spikePercentile:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Merge Gap (",Fe.mergeGapSeconds,"s)"]}),r.jsx("input",{type:"range",min:"5",max:"120",step:"5",value:Fe.mergeGapSeconds,onChange:e=>Ee(t=>({...t,mergeGapSeconds:Number(e.target.value)})),className:"w-full accent-accent-purple"})]})]}),r.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Min Sequence (",Fe.minSequenceLength,")"]}),r.jsx("input",{type:"range",min:"2",max:"20",value:Fe.minSequenceLength,onChange:e=>Ee(t=>({...t,minSequenceLength:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Similarity (±",Fe.similarityToleranceDbm," dBm)"]}),r.jsx("input",{type:"range",min:"1",max:"15",value:Fe.similarityToleranceDbm,onChange:e=>Ee(t=>({...t,similarityToleranceDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),r.jsxs("div",{children:[r.jsxs("label",{className:"type-micro block mb-1",children:["Opacity (",Math.round(100*me),"%)"]}),r.jsx("input",{type:"range",min:"0.1",max:"1",step:"0.05",value:me,onChange:e=>de(Number(e.target.value)),className:"w-full accent-accent-purple"})]})]})]}),r.jsxs("div",{className:"mt-4 p-3 bg-glass-elevated radius-inner",children:[r.jsx("div",{className:"type-micro mb-1",children:"Config output"}),r.jsxs("div",{className:"type-data-sm text-status-success",children:[Fe.useAbsoluteThresholds?`useAbsoluteThresholds: true, baselineDbm: ${Fe.baselineDbm}, spikeDbm: ${Fe.spikeDbm}`:`useAbsoluteThresholds: false, baselinePercentile: ${Fe.baselinePercentile}, spikePercentile: ${Fe.spikePercentile}`,", mergeGapSeconds: ",Fe.mergeGapSeconds,", minSequenceLength: ",Fe.minSequenceLength,", similarityToleranceDbm: ",Fe.similarityToleranceDbm]})]})]})]}),r.jsxs(Ce,{children:[ve&&r.jsx(ue,{template:"auto",children:r.jsx(ie,{className:"border border-accent-primary/30 bg-accent-primary/5",children:r.jsxs("div",{className:"flex items-center gap-3",children:[r.jsxs("div",{className:"relative flex h-3 w-3",children:[r.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-accent-primary opacity-75"}),r.jsx("span",{className:"relative inline-flex rounded-full h-3 w-3 bg-accent-primary"})]}),r.jsxs("div",{className:"flex-1",children:[r.jsxs("p",{className:"type-body-sm text-text-primary",children:["Loading ",ye.label," data..."]}),y.loadProgress&&r.jsxs("p",{className:"type-data-xs text-text-muted mt-0.5",children:[y.loadProgress.loaded.toLocaleString()," packets (",y.loadProgress.percent,"%)"]})]})]})})}),X?r.jsx(ue,{template:"auto",children:r.jsx(ie,{className:"text-center py-12",children:r.jsx("div",{className:"animate-pulse text-text-muted",children:"Loading statistics..."})})}):r.jsxs(r.Fragment,{children:[r.jsx(ue,{template:"hero-auto",children:r.jsx(ie,{isLoaded:f,skeletonType:"chart",children:f&&r.jsxs(r.Fragment,{children:[r.jsx(Be,{icon:r.jsx(ee,{}),title:"Packet Analyzer",badge:ye.label,largeTitle:!0,stackActionsOnMobile:!0,actions:r.jsxs("div",{className:"flex flex-wrap items-center gap-2 justify-end",children:["stats"===te&&r.jsx(Et,{enabled:ne,onChange:re,anomalyCount:Te.length,showTuning:Ae,onTuningChange:De}),r.jsx(Ft,{smoothing:te,onChange:se}),r.jsx(Bt,{mode:Z,onChange:J})]})}),r.jsx("div",{className:"flex-1 min-h-0",children:r.jsx(ht,{packets:g,startTs:$e.start,endTs:$e.end,bucketCount:be,radioConfig:ke??void 0,mode:Z,smoothing:te,noiseFloorAnomalies:Te,showNoiseFloorOverlay:ne,overlayOpacity:me})})]})})}),r.jsxs(ue,{template:"panel",children:[r.jsx(he,{span:12,md:6,children:r.jsx(ie,{isLoaded:f,skeletonType:"chart",children:f&&r.jsxs(r.Fragment,{children:[r.jsx(Be,{icon:r.jsx(ae,{}),title:"Link Quality",badge:ye.label,largeTitle:!0,actions:M?r.jsxs("div",{className:"flex items-center gap-3 type-data-xs text-text-muted",children:[r.jsxs("span",{children:[r.jsx("span",{className:"text-text-secondary tabular-nums font-medium",children:M.zeroHopCount})," nbr"]}),r.jsxs("span",{children:[r.jsx("span",{className:"text-text-secondary tabular-nums font-medium",children:M.totalCount})," obs"]}),r.jsxs("span",{children:[r.jsx("span",{className:"text-text-secondary tabular-nums font-medium",children:M.maxDistanceKm.toFixed(0)})," km"]})]}):null}),r.jsx("div",{className:"flex-1 min-h-0",children:r.jsx(wt,{children:r.jsx(vt,{neighbors:Re,quickNeighbors:p,localLat:(null==(m=null==(E=null==h?void 0:h.config)?void 0:E.repeater)?void 0:m.latitude)??0,localLon:(null==(u=null==(d=null==h?void 0:h.config)?void 0:d.repeater)?void 0:u.longitude)??0,onStatsChange:K})})})]})})}),r.jsx(he,{span:12,md:6,children:r.jsx(ie,{isLoaded:f,skeletonType:"chart",children:f&&r.jsxs(r.Fragment,{children:[r.jsx(Be,{icon:r.jsx(xe,{}),title:"Network Composition",badge:ye.label,largeTitle:!0}),r.jsx("div",{className:"flex-1 min-h-0",children:r.jsx(wt,{children:r.jsx(Nt,{neighbors:Re})})})]})})})]}),r.jsxs(ue,{template:"panel",children:[r.jsx(he,{span:12,md:6,children:r.jsx(Tt,{})}),r.jsx(he,{span:12,md:6,children:r.jsx(Rt,{})})]}),r.jsx(ue,{template:"panel",children:r.jsx(he,{span:12,children:r.jsx(ie,{isLoaded:f,skeletonType:"chart",children:f&&r.jsxs(r.Fragment,{children:[r.jsx(Be,{icon:r.jsx(q,{}),title:"RF Noise Floor",largeTitle:!0,stackActionsOnMobile:!0,actions:N?r.jsxs("div",{className:"flex items-center gap-2 sm:gap-3",children:[r.jsxs("span",{className:"type-data-xs text-text-muted whitespace-nowrap",children:["min ",r.jsx("span",{className:"text-text-secondary tabular-nums",children:N.min.toFixed(0)})]}),r.jsxs("span",{className:"type-data-xs text-text-muted whitespace-nowrap",children:["avg ",r.jsx("span",{className:"text-text-secondary tabular-nums",children:N.avg.toFixed(0)})]}),r.jsxs("span",{className:"type-data-xs text-text-muted whitespace-nowrap",children:["max ",r.jsx("span",{className:"text-text-secondary tabular-nums",children:N.max.toFixed(0)})]}),r.jsx("span",{className:"type-data-xs text-text-muted",children:"dBm"})]}):r.jsx("span",{className:"type-data-xs text-text-muted",children:"dBm"})}),r.jsx("div",{className:"flex-1 min-h-0",children:r.jsx(wt,{children:r.jsx(V,{timestamps:Me.timestamps,values:Me.values,onStatsChange:w})})})]})})})})]})]})]})}export{$t as default}; diff --git a/frontend/dist/assets/Statistics-CGJSoMIn.js b/frontend/dist/assets/Statistics-CGJSoMIn.js new file mode 100644 index 00000000..8c089aee --- /dev/null +++ b/frontend/dist/assets/Statistics-CGJSoMIn.js @@ -0,0 +1 @@ +var e=Object.defineProperty,t=(t,s,a)=>((t,s,a)=>s in t?e(t,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[s]=a)(t,"symbol"!=typeof s?s+"":s,a);import{r as s,j as a,R as n,m as l,g as i,C as r,n as o,Y as c,T as m,i as d}from"./vendor-react-Cwum97tW.js";import{c as h,aw as u,ax as x,ay as p,a7 as g,az as f,aA as y,a as b,aB as j,aC as v,aD as N,ak as k,aE as w,aF as M,al as C,f as S,j as T,h as A,b as F,au as P,I as D,k as L,z as $,aG as R,n as z,aH as B,K as H,R as _,aI as E}from"./index-D22MpaCY.js";import{u as O}from"./usePolling-XMUhKpB6.js";import{a as q,b as W,u as G,c as I,d as K,e as X,s as V}from"./useThemeColors-S-uaxvPT.js";import{L as Y,H as Q,R as U}from"./route-ExVvvUtv.js";import{C as Z}from"./compass-Bsfx4e84.js";import{E as J,A as ee,T as te}from"./TimeRangeSelector-C89_yLwH.js";import{a as se,P as ae,b as ne,B as le}from"./PageLayout-B53JpmK1.js";import{D as ie}from"./DataBox-Bl0vntck.js";import{C as re}from"./CollisionExplorerModal-BmT8XQYy.js";import{C as oe,a as ce}from"./Card-CCBguhJs.js";import{I as me}from"./info-BojcGhYE.js";import{T as de}from"./triangle-alert-TfoZuZfW.js";import{G as he}from"./git-branch-Cev-c9BQ.js";import{R as ue,C as xe}from"./Grid-BVGRgue6.js";import{N as pe}from"./network-Dz5VqBhN.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-CDrKesoV.js";import"./index-bDa2a9Y2.js";import"./BasemapLayer-C9wiTbJT.js";import"./maplibre-gl-Bk5DsYkB.js";import"./map-pin-kiJDSdn0.js";const ge=h("chart-line",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"m19 9-5 5-4-4-3 3",key:"2osh9i"}]]),fe=h("circle-check-big",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]),ye=h("columns-2",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M12 3v18",key:"108xh3"}]]),be=h("columns-3",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"M15 3v18",key:"14nvp0"}]]),je=h("columns-4",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M7.5 3v18",key:"w0wo6v"}],["path",{d:"M12 3v18",key:"108xh3"}],["path",{d:"M16.5 3v18",key:"10tjh1"}]]),ve=h("grid-3x3",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"M15 3v18",key:"14nvp0"}]]),Ne=h("grip",[["circle",{cx:"12",cy:"5",r:"1",key:"gxeob9"}],["circle",{cx:"19",cy:"5",r:"1",key:"w8mnmm"}],["circle",{cx:"5",cy:"5",r:"1",key:"lttvr7"}],["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}],["circle",{cx:"12",cy:"19",r:"1",key:"lyex9k"}],["circle",{cx:"19",cy:"19",r:"1",key:"shf9b7"}],["circle",{cx:"5",cy:"19",r:"1",key:"bfqh0e"}]]),ke=h("id-card",[["path",{d:"M16 10h2",key:"8sgtl7"}],["path",{d:"M16 14h2",key:"epxaof"}],["path",{d:"M6.17 15a3 3 0 0 1 5.66 0",key:"n6f512"}],["circle",{cx:"9",cy:"11",r:"2",key:"yxgjnd"}],["rect",{x:"2",y:"5",width:"20",height:"14",rx:"2",key:"qneu4z"}]]),we=h("radar",[["path",{d:"M19.07 4.93A10 10 0 0 0 6.99 3.34",key:"z3du51"}],["path",{d:"M4 6h.01",key:"oypzma"}],["path",{d:"M2.29 9.62A10 10 0 1 0 21.31 8.35",key:"qzzz0"}],["path",{d:"M16.24 7.76A6 6 0 1 0 8.23 16.67",key:"1yjesh"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M17.99 11.66A6 6 0 0 1 15.77 16.67",key:"1u2y91"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}],["path",{d:"m13.41 10.59 5.66-5.66",key:"mhq4k0"}]]),Me=h("settings-2",[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]),Ce=h("sparkle",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}]]),Se=h("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),Te=h("waves",[["path",{d:"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"knzxuh"}],["path",{d:"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"2jd2cc"}],["path",{d:"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"rd2r6e"}]]),Ae={useAbsoluteThresholds:!0,baselinePercentile:6,spikePercentile:50,baselineDbm:-107,spikeDbm:-100,mergeGapSeconds:45,minSequenceLength:16,similarityToleranceDbm:5};function Fe(e,t){if(0===e.length)return 0;const s=t/100*(e.length-1),a=Math.floor(s),n=Math.ceil(s);return a===n?e[a]:e[a]+(e[n]-e[a])*(s-a)}function Pe(e){if(0===e.length)return{median:0,p90:0,p95:0,p99:0,max:0,min:0};const t=[...e].sort((e,t)=>e-t);return{median:Fe(t,50),p90:Fe(t,90),p95:Fe(t,95),p99:Fe(t,99),max:t[t.length-1],min:t[0]}}function De(e,t,s){const a=s-t;if(0===a)return"moderate";const n=(e-t)/a;return n>.66?"critical":n>.33?"severe":"moderate"}const Le=u;function $e({sortedTypes:e,highlightedType:t,onTypeHover:n,aggregateShares:l,hoverData:i}){const r=s.useMemo(()=>{if(!i)return null;const e=new Map;for(const t of i.items)e.set(t.key,t.value);return e},[i]),o=null!==r;return a.jsx("div",{className:"flex-shrink-0 pt-3 mt-2",children:a.jsx("div",{className:"grid ml-9 gap-y-0.5",style:{gridTemplateColumns:"repeat(auto-fill, minmax(105px, 1fr))"},onMouseLeave:()=>n(null),children:e.map(e=>{const s=Le(e.typeNum),i=(null==r?void 0:r.get(e.key))??0,c=l.get(e.key)??0,m=o?i:c,d=m>1e-4,h=t===e.key,u=["legend-item",h&&"legend-item-active",(t&&!h||o&&i<=1e-4)&&"legend-item-dimmed",!t&&o&&i>1e-4&&"legend-item-chart-active"].filter(Boolean).join(" ");return a.jsxs("div",{className:u,onMouseEnter:()=>n(e.key),children:[a.jsx("div",{className:"flex-shrink-0",style:{backgroundColor:s,width:9,height:16,borderRadius:1}}),a.jsx("span",{className:"legend-label",children:e.label}),d&&a.jsxs("span",{className:"legend-value "+(o?"legend-value-live":""),children:[(100*m).toFixed(1),"%"]})]},e.key)})})})}const Re='ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace';function ze({x:e,y:t,width:s,height:n,name:l,size:i,index:r,depth:o,hoveredIndex:c,onHover:m,total:d,typeNum:h}){if(1!==o)return null;const u=null!==c&&!(c===r),x=Le(h),p=d>0?i/d*100:0,g=s>36&&n>20,f=s>36&&n>32;return a.jsxs("g",{onMouseEnter:e=>m(r,e),onMouseLeave:()=>m(null),style:{cursor:"default"},children:[a.jsx("rect",{x:e,y:t,width:s,height:n,fill:x,opacity:u?.4:1,stroke:"rgba(0,0,0,0.2)",strokeWidth:1,rx:3,style:{transition:"opacity 150ms ease"}}),g&&a.jsxs(a.Fragment,{children:[f&&a.jsxs("text",{x:e+4,y:t+n-4-11,textAnchor:"start",dominantBaseline:"auto",fill:"rgba(0,0,0,0.6)",fontSize:8,fontFamily:Re,fontWeight:500,style:{pointerEvents:"none"},children:[p.toFixed(1),"%"]}),a.jsx("text",{x:e+4,y:t+n-4,textAnchor:"start",dominantBaseline:"auto",fill:"rgba(0,0,0,0.85)",fontSize:9,fontFamily:Re,fontWeight:600,style:{pointerEvents:"none"},children:l})]})]})}function Be({data:e,total:t,color:s,position:n,containerWidth:l}){if(!e||!n)return null;const i=(e.value/t*100).toFixed(1),r=l-n.x<184?Math.max(8,n.x-160-8):n.x+16;return a.jsx("div",{className:"absolute z-50 pointer-events-none",style:{left:r,top:Math.max(8,n.y-60)},children:a.jsxs("div",{className:"bg-tooltip-bg border border-border-subtle rounded-lg px-3 py-2 shadow-xl min-w-[140px]",children:[a.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-sm flex-shrink-0",style:{backgroundColor:s}}),a.jsx("span",{className:"type-data-sm font-semibold text-text-primary",children:e.name})]}),a.jsxs("div",{className:"space-y-0.5 type-data-xs text-text-muted",children:[a.jsxs("div",{className:"flex justify-between gap-4",children:[a.jsx("span",{children:"Count"}),a.jsx("span",{className:"text-text-primary tabular-nums font-medium",children:e.value.toLocaleString()})]}),a.jsxs("div",{className:"flex justify-between gap-4",children:[a.jsx("span",{children:"Share"}),a.jsxs("span",{className:"text-text-primary tabular-nums font-medium",children:[i,"%"]})]}),a.jsxs("div",{className:"flex justify-between gap-4",children:[a.jsx("span",{children:"Total"}),a.jsx("span",{className:"text-text-primary tabular-nums font-medium",children:t.toLocaleString()})]})]})]})})}function He({sortedTypes:e,aggregateShares:t}){var i,r,o;const[c,m]=s.useState(null),[d,h]=s.useState(null),[u,x]=s.useState(0),[p,g]=s.useState(null),f=s.useRef(null),y=s.useMemo(()=>e.reduce((e,t)=>e+t.totalCount,0),[e]),b=s.useMemo(()=>e.map((e,t)=>({name:e.label,size:e.totalCount,index:t,typeNum:e.typeNum,key:e.key})),[e]),j=s.useCallback((e,t)=>{if(m(e),t&&null!==e){const e=f.current;if(e){const s=e.getBoundingClientRect();x(s.width),h({x:t.clientX-s.left,y:t.clientY-s.top})}}else h(null)},[]),v=s.useCallback(e=>{if(g(e),e){const t=b.findIndex(t=>t.key===e);m(t>=0?t:null)}else m(null)},[b]),N=null!==c?{name:(null==(i=b[c])?void 0:i.name)??"",value:(null==(r=b[c])?void 0:r.size)??0}:null,k=null!==c?Le(null==(o=b[c])?void 0:o.typeNum):"";return 0===e.length||0===y?a.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[a.jsx(Y,{className:"w-6 h-6 mr-2 opacity-50"}),a.jsx("span",{children:"No packet type data available"})]}):a.jsxs("div",{className:"flex flex-col",children:[a.jsxs("div",{className:"analyzer-chart-height relative flex-shrink-0",ref:f,children:[a.jsx(n,{width:"100%",height:"100%",children:a.jsx(l,{data:b,dataKey:"size",aspectRatio:4/3,stroke:"none",isAnimationActive:!1,content:a.jsx(ze,{x:0,y:0,width:0,height:0,name:"",size:0,index:0,depth:0,hoveredIndex:c,onHover:j,total:y,typeNum:0})})}),a.jsx(Be,{data:N,total:y,color:k,position:d,containerWidth:u})]}),a.jsx($e,{sortedTypes:e,highlightedType:p,onTypeHover:v,aggregateShares:t})]})}function _e(e){return e>=1e9?`${(e/1e9).toFixed(1)} Gb`:e>=1e6?`${(e/1e6).toFixed(1)} Mb`:e>=1e3?`${(e/1e3).toFixed(1)} Kb`:`${e.toFixed(0)} B`}function Ee({active:e,payload:t,label:s,mode:n}){if(!e||!t||0===t.length)return null;const l=t.filter(e=>null!==e.value&&void 0!==e.value);if(0===l.length)return null;const i=s?new Date(1e3*s).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}):"";return a.jsxs("div",{className:"bg-tooltip-bg border border-border-subtle rounded-lg px-3 py-2 text-sm shadow-xl",children:[a.jsx("div",{className:"font-medium text-text-primary mb-1 font-mono",children:i}),l.map((e,t)=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("div",{className:"w-3 h-0.5",style:{backgroundColor:e.color}}),a.jsxs("span",{className:"text-text-muted",children:[e.name,":"]}),a.jsx("span",{className:"text-text-primary tabular-nums font-mono",children:"share"===n?`${Number(e.value).toLocaleString()} B`:`${Number(e.value).toFixed(2)}%`})]},t))]})}function Oe({packets:e,mode:t,startTs:l,endTs:h,radioConfig:u,bucketCount:f}){const y=q(),b=W(),j=y.primary,v=y.tertiary,[N,k]=s.useState(null),{trendData:w,totals:M}=s.useMemo(()=>{if(0===e.length)return{trendData:[],totals:{rxBytes:0,txBytes:0,rxAirtime:0,txAirtime:0}};const s=h-l,a=Math.min(Math.ceil(s/300),f),n=s/a,i=[];let r=0,o=0,c=0,m=0;for(const t of e){const e=t.timestamp;if(e=h)continue;const s=x(t),a=p(t,{spreadingFactor:u.sf,bandwidthHz:u.bw,codingRate:u.cr,preambleLength:u.preamble}),n={timestamp:e,rxAirtime:0,txAirtime:0,rxBytes:0,txBytes:0};t.transmitted?(n.txAirtime=a,n.txBytes=s,o+=s,m+=a):(n.rxAirtime=a,n.rxBytes=s,r+=s,c+=a),i.push(n)}i.sort((e,t)=>e.timestamp-t.timestamp);const d=new Float64Array(i.length+1),g=new Float64Array(i.length+1),y=new Float64Array(i.length+1),b=new Float64Array(i.length+1),j=new Float64Array(i.length);for(let e=0;e{let t=0,s=j.length;for(;t>>1;j[a]0?e:null,tx:t>0?t:null})}else{const e=(d[r]-d[i])/k*100,t=(g[r]-g[i])/k*100;N.push({timestamp:s,rx:e>0?e:null,tx:t>0?t:null})}}const w=2/31;let M=null;return{trendData:N.map(e=>{const t=e.rx;return null!==t&&t>0&&(M=null===M?t:w*t+(1-w)*M),{...e,rxSmooth:null!==M&&M>0?M:null}}),totals:{rxBytes:r,txBytes:o,rxAirtime:c,txAirtime:m}}},[e,l,h,f,t,u]),C=s.useMemo(()=>{if(0===w.length)return"share"===t?100:10;let e=0;for(const t of w){const s=t.rx??0,a=t.tx??0;s>e&&(e=s),a>e&&(e=a)}const s=1.1*e;return"share"===t?s<=100?100:s<=500?100*Math.ceil(s/100):s<=1e3?200*Math.ceil(s/200):s<=5e3?500*Math.ceil(s/500):s<=1e4?1e3*Math.ceil(s/1e3):5e3*Math.ceil(s/5e3):Math.max(1,Math.ceil(s))},[w,t]),S=s.useMemo(()=>{if(null!==N&&w[N]){const e=w[N],s=e.rx??0,a=e.tx??0;return"share"===t?{rx:_e(s),tx:_e(a),total:_e(s+a),isHovered:!0}:{rx:`${s.toFixed(2)}%`,tx:`${a.toFixed(2)}%`,total:`${(s+a).toFixed(2)}%`,isHovered:!0}}if("share"===t)return{rx:_e(M.rxBytes),tx:_e(M.txBytes),total:_e(M.rxBytes+M.txBytes),isHovered:!1};{let e=0,t=0,s=0;for(const l of w)null===l.rx&&null===l.tx||(e+=l.rx??0,t+=l.tx??0,s++);const a=s>0?e/s:0,n=s>0?t/s:0;return{rx:`${a.toFixed(2)}%`,tx:`${n.toFixed(2)}%`,total:`${(a+n).toFixed(2)}%`,isHovered:!1}}},[N,w,M,t]),T=s.useMemo(()=>{const e=h-l,t=e/3600;return[0,.25,.5,.75,1].map(s=>{const a=new Date(1e3*(l+e*s)),n=a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),i=a.toLocaleDateString([],{weekday:"short"});return{pct:s,label:t>24?`${i} ${n}`:n,mobileHidden:.25===s||.75===s}})},[l,h]),A=s.useCallback(e=>{const t=null==e?void 0:e.activeTooltipIndex;k("number"==typeof t?t:null)},[]),F=s.useCallback(e=>"share"===t?e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(0)}K`:e.toFixed(0):`${e.toFixed(0)}%`,[t]);return 0===w.length?a.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[a.jsx(Y,{className:"w-6 h-6 mr-2 opacity-50"}),a.jsx("span",{children:"No packet data available"})]}):a.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[a.jsx("div",{className:"flex items-center flex-shrink-0 text-text-secondary",style:{height:20,paddingLeft:44,paddingRight:8},children:a.jsx("div",{className:"relative w-full h-full flex items-center",children:T.map((e,t)=>a.jsxs("div",{className:"absolute flex items-center gap-0.5 sm:gap-1 type-data-xs "+(e.mobileHidden?"hidden sm:flex":""),style:{left:100*e.pct+"%",transform:0===e.pct?"translateX(0)":1===e.pct?"translateX(-100%)":"translateX(-50%)"},children:[a.jsx(g,{className:"w-2.5 h-2.5 opacity-60 hidden sm:block"}),a.jsx("span",{className:"tabular-nums",children:e.label})]},t))})}),a.jsx("div",{className:"flex-1 min-h-0 relative overflow-hidden",children:a.jsx(n,{width:"100%",height:"100%",minWidth:1,minHeight:1,children:a.jsxs(i,{data:w,margin:{top:4,right:8,bottom:4,left:0},onMouseMove:A,onMouseLeave:()=>k(null),children:[a.jsx(r,{strokeDasharray:"3 3",stroke:b.secondary,strokeOpacity:.3,vertical:!1}),a.jsx(o,{dataKey:"timestamp",type:"number",domain:[l,h],axisLine:!1,tickLine:!1,tick:!1,height:0}),a.jsx(c,{axisLine:!1,tickLine:!1,tick:{fill:b.secondary,fontSize:10,fontFamily:'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace'},dx:-8,width:44,tickFormatter:F,domain:[0,C]}),a.jsx(m,{content:a.jsx(Ee,{mode:t})}),a.jsx(d,{type:"linear",dataKey:"rx",name:"RX",stroke:j,strokeWidth:2.5,strokeOpacity:.9,dot:!1,connectNulls:!1,isAnimationActive:!1}),a.jsx(d,{type:"linear",dataKey:"tx",name:"TX",stroke:v,strokeWidth:2.5,strokeOpacity:.9,dot:!1,connectNulls:!1,isAnimationActive:!1}),a.jsx(d,{type:"basis",dataKey:"rxSmooth",name:"RX Avg",stroke:"var(--sys-brown)",strokeWidth:2,strokeOpacity:1,dot:!1,connectNulls:!0,isAnimationActive:!1})]})})}),a.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between mt-1.5 sm:mt-2",children:[a.jsxs("div",{className:"flex items-center gap-2 sm:gap-4 text-xs font-mono pl-2 sm:pl-11",children:[a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx("div",{className:"w-3 sm:w-4 h-0.5",style:{backgroundColor:j}}),a.jsx("span",{className:"text-text-secondary",children:"RX"})]}),a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx("div",{className:"w-3 sm:w-4 h-0.5",style:{backgroundColor:v}}),a.jsx("span",{className:"text-text-secondary",children:"TX"})]}),a.jsxs("div",{className:"hidden sm:flex items-center gap-1.5",children:[a.jsx("div",{className:"w-4 h-0.5",style:{backgroundColor:"var(--sys-brown)"}}),a.jsx("span",{className:"text-text-secondary",children:"Avg"})]})]}),a.jsxs("div",{className:"flex items-center gap-2 sm:gap-4 text-right pr-1 sm:pr-2 font-mono",children:[a.jsxs("div",{className:"flex items-center gap-1 sm:gap-1.5",children:[a.jsx("span",{className:"text-xs font-medium",style:{color:j},children:"RX"}),a.jsx("span",{className:"font-bold text-lg sm:text-xl text-text-primary",children:S.rx})]}),a.jsxs("div",{className:"flex items-center gap-1 sm:gap-1.5",children:[a.jsx("span",{className:"text-xs font-medium",style:{color:v},children:"TX"}),a.jsx("span",{className:"font-bold text-lg sm:text-xl text-text-primary",children:S.tx})]}),S.isHovered&&a.jsx("span",{className:"text-xs text-text-muted hidden sm:inline",children:"bucket"})]})]})]})}function qe(e){const{values:t,sum:s}=e;if(0===t.length)return{min:0,mean:0,median:0,p75:0,p95:0,p99:0,max:0};const a=[...t].sort((e,t)=>e-t),n=a.length,l=s/n,i=a[0],r=a[n-1],o=e=>{const t=Math.min(Math.ceil(e*n)-1,n-1);return a[Math.max(0,t)]};return{min:i,mean:l,median:n%2==0?(a[n/2-1]+a[n/2])/2:a[Math.floor(n/2)],p75:o(.75),p95:o(.95),p99:o(.99),max:r}}function We({statsBuckets:e,mode:t,packets:n,startTs:l,endTs:i,radioConfig:r,sortedTypes:o,aggregateShares:c,noiseFloorAnomalies:m,showNoiseFloorOverlay:d,overlayOpacity:h=.5}){const[u,g]=s.useState(null),[y,b]=s.useState(null),j=s.useMemo(()=>(i-l)/3600,[l,i]),v=s.useCallback(e=>{b(e)},[]),N=function(e,t,a,n,l){return s.useMemo(()=>{if(0===e.length||!l)return null;const s=e.filter(e=>e.timestamp>=t&&e.timestamp<=a);if(0===s.length)return null;const i=[],r=new Map;for(const e of s){const s=e.type??e.payload_type??-1,a=x(e);let o;if(o="airtime"===n?p(e,{spreadingFactor:l.sf,bandwidthHz:l.bw,codingRate:l.cr,preambleLength:l.preamble}):1,a<=0)continue;const c=Math.floor((e.timestamp-t)/300),m={timestamp:e.timestamp,airtimeMs:o,byteSize:a,packetType:s,bucketIndex:c};i.push(m),r.has(c)||r.set(c,[]),r.get(c).push(m)}if(0===i.length)return null;const o=[],c=[],m=[],d=new Map;if("share"===n)for(const[,e]of r)for(const t of e)d.set(t,t.byteSize);else for(const[,e]of r){const t=e.reduce((e,t)=>e+t.airtimeMs,0)/3e5*100;let s=0;for(const a of e)a.airtimeMs>s&&(s=a.airtimeMs);for(const a of e){const e=a.airtimeMs/s*t;d.set(a,e)}}for(const e of i){const t=d.get(e);void 0!==t&&(o.push(t),c.push(e.timestamp),m.push(e.packetType))}let h=c[0],u=c[0];for(let e=1;eu&&(u=c[e]);const g=u-h||1,f=[...o].sort((e,t)=>e-t),y=f[0],b=f[f.length-1],j=Math.floor(.05*f.length),v=Math.floor(.5*f.length),N=Math.min(Math.ceil(.95*f.length),f.length-1),k=f[j],w=f[v],M=f[N],C=new Map;for(const e of o){const t=Math.round(100*e)/100;C.set(t,(C.get(t)??0)+1)}const S=C.size,T=[...C.entries()].sort((e,t)=>t[1]-e[1]).slice(0,5).map(([e,t])=>({value:e,count:t,percent:t/o.length*100}));let A;if("share"===n)A=200;else{const e=5,t=Math.ceil(b/e)*e;A=t<=10?10:t+e}const F=new Float32Array(2*o.length),P=new Float32Array(o.length),D=new Uint8Array(o.length),L=new Float32Array(o.length);for(let e=0;e=0?m[e]:255,L[e]=c[e]}return{points:F,rawValues:P,packetTypes:D,timestamps:L,count:o.length,minTime:h,maxTime:u,minValue:0,maxValue:A,rawMinValue:y,rawMaxValue:b,unit:"%",stats:{p5:k,p50:w,p95:M,uniqueValues:S,topValues:T}}},[e,t,a,n,l])}(n,l,i,"share"===t?"share":"airtime",r),{data:k}=s.useMemo(()=>function(e,t){var s;const a=e.length;if(0===a)return{data:[],windowSize:0,windowDurationMs:0};const n=(null==(s=e[0])?void 0:s.bucketDurationMs)??1e3,l=Math.min(Math.max(5,Math.round(3e5/n)),a),i=Math.floor(l/2),r=[];let o=0,c=0;for(let m=0;mk.map(e=>({timestamp:e.timestamp,min:e.min,max:e.max,p75:e.p75,p95:e.p95,p99:e.p99,mean:e.mean,median:e.median,average:e.average,midpoint:e.midpoint})),[k]),M=s.useMemo(()=>(null==N?void 0:N.maxValue)?N.maxValue:"share"===t?200:10,[N,t]),C=s.useCallback(e=>{g(e)},[]),S=s.useMemo(()=>{if(null===u||!k[u])return null;const e=k[u];let t;t=j>=168?75:j>=72?35:j>=24?15:j>=3?10:5;const s=60*t/2,a=e.timestamp;return{start:a-s,end:a+s}},[u,k,j]),T=s.useMemo(()=>{if(null===u||!k[u]||!S)return null;const e=k[u].time,{start:s,end:a}=S,l=n.filter(e=>e.timestamp>=s&&e.timestamp({key:e.key,label:e.label,value:0,color:Le(e.typeNum)}))};const i=new Map,c=new Map;let m=0,d=0;for(const t of l){const e=`TYPE_${t.type??t.payload_type??-1}`;if(i.set(e,(i.get(e)??0)+1),m++,r){const s=p(t,{spreadingFactor:r.sf,bandwidthHz:r.bw,codingRate:r.cr,preambleLength:r.preamble});c.set(e,(c.get(e)??0)+s),d+=s}}const h=o.map(e=>{let s;return s="airtime"===t?d>0?(c.get(e.key)??0)/d:0:m>0?(i.get(e.key)??0)/m:0,{key:e.key,label:e.label,value:s,color:Le(e.typeNum)}});return{timestamp:k[u].timestamp,timeLabel:e,items:h}},[u,k,S,n,o,t,r]);if(0===k.length)return a.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[a.jsx(Y,{className:"w-6 h-6 mr-2 opacity-50"}),a.jsx("span",{children:"No packet data available"})]});const A=(null==T?void 0:T.timeLabel)??null;return a.jsxs("div",{className:"flex flex-col",children:[a.jsxs("div",{className:"analyzer-chart-height relative flex-shrink-0",children:[a.jsx("div",{className:"absolute inset-0 rounded-lg overflow-hidden",children:a.jsx(f,{data:w,maxValue:M,onHover:C,scatterData:N,noiseFloorAnomalies:m,showNoiseFloorOverlay:d,overlayOpacity:h,highlightedType:y,hoveredTimeRange:S,timeRangeHours:j,yAxisMode:"share"===t?"share":"airtime"})}),A&&a.jsx("div",{className:"absolute top-1 right-1 px-2 py-0.5 bg-bg-elevated/90 rounded text-xs text-accent-secondary font-mono pointer-events-none",children:A})]}),a.jsx($e,{sortedTypes:o,highlightedType:y,onTypeHover:v,aggregateShares:c,hoverData:T})]})}const Ge=new class{constructor(){t(this,"buckets",new Map),t(this,"lastProcessedTimestamp",0),t(this,"processedPacketCount",0),t(this,"cacheKey",null),t(this,"bucketDuration",60),t(this,"bucketDurationMs",6e4)}getBuckets(e,t,s,a){const n={startTs:t,endTs:s,radioConfigHash:this.hashRadioConfig(a)};return this.isCacheValid(n)?this.processPackets(e,t,s,a,!1):(this.invalidate(n),this.processPackets(e,t,s,a,!0)),this.toBucketDataArray(t,s)}processPackets(e,t,s,a,n){const l=Math.ceil((s-t)/this.bucketDuration);let i=0;for(const r of e){const e=r.timestamp;if(e=s)continue;if(!n&&e<=this.lastProcessedTimestamp)continue;const o=Math.min(Math.floor((e-t)/this.bucketDuration),l-1),c=this.buckets.get(o)??{total:0,totalAirtime:0};c.total+=1,c.totalAirtime+=p(r,{spreadingFactor:a.sf,bandwidthHz:a.bw,codingRate:a.cr,preambleLength:a.preamble}),this.buckets.set(o,c),e>this.lastProcessedTimestamp&&(this.lastProcessedTimestamp=e),i++}this.processedPacketCount+=i}toBucketDataArray(e,t){const s=t-e,a=Math.ceil(s/this.bucketDuration),n=s/3600,l=[];for(let i=0;i24?s.toLocaleDateString([],{weekday:"short",hour:"2-digit",minute:"2-digit",hour12:!1}):s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),r=this.buckets.get(i)??{total:0,totalAirtime:0};l.push({timestamp:t,time:a,total:r.total,totalAirtime:r.totalAirtime,bucketDurationMs:this.bucketDurationMs})}return l}isCacheValid(e){return!!this.cacheKey&&this.cacheKey.startTs===e.startTs&&this.cacheKey.endTs===e.endTs&&this.cacheKey.radioConfigHash===e.radioConfigHash}invalidate(e){this.buckets.clear(),this.lastProcessedTimestamp=0,this.processedPacketCount=0,this.cacheKey=e}hashRadioConfig(e){return`${e.sf}-${e.bw}-${e.cr}-${e.preamble}`}clear(){this.buckets.clear(),this.lastProcessedTimestamp=0,this.processedPacketCount=0,this.cacheKey=null}getStats(){return{bucketCount:this.buckets.size,processedPackets:this.processedPacketCount,lastTimestamp:this.lastProcessedTimestamp,cacheKey:this.cacheKey}}};function Ie({mode:e,onChange:t}){return a.jsxs("div",{className:"toggle-group toggle-group-sm",children:[a.jsx("button",{onClick:()=>t("share"),className:"toggle-group-item "+("share"===e?"active":""),children:"Total"}),a.jsx("button",{onClick:()=>t("airtime"),className:"toggle-group-item "+("airtime"===e?"active":""),children:"Airtime"})]})}function Ke({smoothing:e,onChange:t}){return a.jsxs("div",{className:"toggle-group toggle-group-sm",children:[a.jsx("button",{onClick:()=>t("stats"),className:"toggle-group-item "+("stats"===e?"active":""),title:"Statistics view (scatter plot)",children:a.jsx(Ne,{className:"w-3.5 h-3.5"})}),a.jsx("button",{onClick:()=>t("trend"),className:"toggle-group-item "+("trend"===e?"active":""),title:"Trend line chart",children:a.jsx(ge,{className:"w-3.5 h-3.5"})}),a.jsx("button",{onClick:()=>t("raw"),className:"toggle-group-item "+("raw"===e?"active":""),title:"No smoothing (raw values)",children:a.jsx(je,{className:"w-3.5 h-3.5"})}),a.jsx("button",{onClick:()=>t("zlema"),className:"toggle-group-item "+("zlema"===e?"active":""),title:"Light smoothing",children:a.jsx(be,{className:"w-3.5 h-3.5"})}),a.jsx("button",{onClick:()=>t("ema"),className:"toggle-group-item "+("ema"===e?"active":""),title:"Moderate smoothing",children:a.jsx(ye,{className:"w-3.5 h-3.5"})}),a.jsx("button",{onClick:()=>t("smooth"),className:"toggle-group-item "+("smooth"===e?"active":""),title:"Heavy smoothing",children:a.jsx(Se,{className:"w-3.5 h-3.5"})}),a.jsx("button",{onClick:()=>t("ultra"),className:"toggle-group-item "+("ultra"===e?"active":""),title:"Ultra smoothing",children:a.jsx(Te,{className:"w-3.5 h-3.5"})}),a.jsx("button",{onClick:()=>t("mosaic"),className:"toggle-group-item "+("mosaic"===e?"active":""),title:"Mosaic view (treemap)",children:a.jsx(ve,{className:"w-3.5 h-3.5"})})]})}function Xe({enabled:e,onChange:t,anomalyCount:s=0,showTuning:n=!1,onTuningChange:l}){return a.jsxs("div",{className:"relative inline-flex items-center gap-1",children:[e&&l&&a.jsx("button",{onClick:()=>l(!n),className:"toggle-group toggle-group-sm "+(n?"active":""),title:n?"Hide tuning panel":"Show tuning panel",children:a.jsx("span",{className:"toggle-group-item "+(n?"active":""),children:a.jsx(Me,{className:"w-3.5 h-3.5"})})}),a.jsx("button",{onClick:()=>t(!e),className:"toggle-group toggle-group-sm "+(e?"active":""),title:e?"Hide noise floor anomalies":"Show noise floor anomalies",children:a.jsx("span",{className:"toggle-group-item "+(e?"active":""),children:a.jsx(J,{className:"w-3.5 h-3.5"})})}),s>0&&a.jsx("span",{className:"absolute -top-2 -right-2 min-w-[18px] h-[18px] px-1 rounded-full bg-accent-danger text-white text-[10px] font-bold flex items-center justify-center pointer-events-none z-10",children:s>99?"99+":s})]})}const Ve={sf:10,bw:25e4,cr:5,preamble:8};function Ye(e){return b[e]??`TYPE_${e.toString(16).toUpperCase()}`}function Qe(e,t){if(0===e.length)return[];const s=Math.floor((t-1)/2),a=[];for(let n=0;n=s?e[n-s]:e[0];a.push(e[n]+(e[n]-t))}return function(e,t){if(0===e.length)return[];const s=2/(t+1),a=[e[0]];for(let n=1;n{const t=Math.abs(e.length-N.current);if(0===t&&b.length>0)return;v.current&&clearTimeout(v.current);const s=t>100?50:500;return v.current=setTimeout(()=>{N.current=e.length,j(e)},s),()=>{v.current&&clearTimeout(v.current)}},[e,b.length]);const k=s.useMemo(()=>function(e,t){const s=new Map;for(const n of e){const e=n.type??n.payload_type??-1,a=p(n,{spreadingFactor:t.sf,bandwidthHz:t.bw,codingRate:t.cr,preambleLength:t.preamble}),l=s.get(e)??{count:0,airtime:0};s.set(e,{count:l.count+1,airtime:l.airtime+a})}const a=[];for(const[n,l]of s)a.push({typeNum:n,key:`TYPE_${n}`,label:Ye(n),totalCount:l.count,totalAirtime:l.airtime});return a.sort((e,t)=>t.totalCount-e.totalCount)}(b,i),[b,i]),w=s.useMemo(()=>function(e,t,s,a,n,l){const i=s-t,r=i/a,o=1e3*r,c=i/3600,m=[];for(let d=0;d24?s.toLocaleDateString([],{weekday:"short",hour:"2-digit",minute:"2-digit",hour12:!1}):s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),counts:{},shares:{},airtimes:{},total:0,totalAirtime:0,bucketDurationMs:o};for(const t of l)a.counts[t.key]=0,a.airtimes[t.key]=0;m.push(a)}for(const d of e){const e=d.timestamp;if(e=s)continue;const l=Math.min(Math.floor((e-t)/r),a-1),i=`TYPE_${d.type??d.payload_type??-1}`;m[l].counts[i]=(m[l].counts[i]??0)+1,m[l].total++;const o=p(d,{spreadingFactor:n.sf,bandwidthHz:n.bw,codingRate:n.cr,preambleLength:n.preamble});m[l].airtimes[i]=(m[l].airtimes[i]??0)+o,m[l].totalAirtime+=o}for(const d of m)for(const e of l)d.shares[e.key]=d.total>0?d.counts[e.key]/d.total*100:0;return m}(b,t,n,l,i,k),[b,t,n,l,i,k]),M=s.useMemo(()=>Ge.getBuckets(b,t,n,i),[b,t,n,i]),C=s.useMemo(()=>k.reduce((e,t)=>e+t.totalCount,0),[k]),S=s.useMemo(()=>k.reduce((e,t)=>e+t.totalAirtime,0),[k]),{sortedTypes:T,aggregateShares:A}=s.useMemo(()=>{const e=new Map,t="share"===r?C:S;if(t>0)for(const s of k){const a="share"===r?s.totalCount:s.totalAirtime;e.set(s.key,a/t)}return{sortedTypes:[...k].sort((t,s)=>(e.get(s.key)??0)-(e.get(t.key)??0)),aggregateShares:e}},[k,C,S,r]),F=s.useMemo(()=>function(e,t,s,a="raw"){const n=function(e,t,s){if(e.length<=360)return e;const a=Math.ceil(e.length/360),n=[];for(let l=0;l0?i.counts[e.key]/i.total*100:0;n.push(i)}return n}(e,0,s),l=n.length,i=s.length,r=Array.from({length:i},()=>new Array(l).fill(0));for(let h=0;h0?(e.counts[s[t].key]??0)/e.total:0;else{let t=0;for(let a=0;a0?(e.airtimes[s[a].key]??0)/t:0}}const o=Array.from({length:i},()=>new Array(l).fill(0));for(let h=0;hfunction(e,t){switch(t){case"zlema":return Qe(e,6);case"ema":return Qe(e,12);case"smooth":return Qe(e,24);case"ultra":return Qe(e,96);default:return e}}(e,a)),m=Array.from({length:i},()=>new Array(l).fill(0));for(let h=0;h0?c[h-1][e]:0;m[h][e]=Math.min(1,Math.max(0,c[h][e]-t))}for(let h=0;h0&&Math.abs(e-1)>1e-6){const t=1/e;for(let e=0;ex(e),[]),D=s.useCallback(e=>f(e),[]),L=s.useMemo(()=>{if(null===g||!F[g])return null;const e=F[g];return{timestamp:e.timestamp,timeLabel:e.time,items:T.map(t=>({key:t.key,label:t.label,value:e[t.key]??0,color:Le(t.typeNum)}))}},[g,F,T]),$=s.useMemo(()=>({timestamps:F.map(e=>e.timestamp),series:T.map(e=>({key:e.key,label:e.label,color:Le(e.typeNum),values:F.map(t=>t[e.key]??0)}))}),[F,T]);return 0===b.length?0===e.length?a.jsxs("div",{className:"h-full flex items-center justify-center text-text-muted",children:[a.jsx(Y,{className:"w-6 h-6 mr-2 opacity-50"}),a.jsx("span",{children:"No packet data available"})]}):null:"mosaic"===o?a.jsx(He,{sortedTypes:T,aggregateShares:A}):"stats"===o?a.jsx(We,{statsBuckets:M,mode:r,packets:b,startTs:t,endTs:n,radioConfig:i,sortedTypes:T,aggregateShares:A,noiseFloorAnomalies:c,showNoiseFloorOverlay:m,overlayOpacity:d}):"trend"===o?a.jsx(Oe,{packets:b,mode:r,startTs:t,endTs:n,radioConfig:i,bucketCount:l}):a.jsxs("div",{className:"flex flex-col",children:[a.jsx("div",{className:"analyzer-chart-height relative flex-shrink-0",children:a.jsx("div",{className:"absolute inset-0 rounded-lg overflow-hidden",children:a.jsx(y,{timestamps:$.timestamps,series:$.series,highlightedKey:u,cursorColor:h.cursor,onHover:D})})}),a.jsx($e,{sortedTypes:T,highlightedType:u,onTypeHover:P,aggregateShares:A,hoverData:L})]})}),Ze={"1x":1,"2x":2,"4x":4,"8x":8,"16x":16,"36x":36},Je=[1,5,10,25,50,100,150];function et(e,t,s,a){const n=Math.PI/180,l=(a-t)*n,i=e*n,r=s*n,o=Math.sin(l)*Math.cos(r),c=Math.cos(i)*Math.sin(r)-Math.sin(i)*Math.cos(r)*Math.cos(l);return(180*Math.atan2(o,c)/Math.PI+360)%360}function tt(e,t,s,a){const n=Math.PI/180,l=(s-e)*n,i=(a-t)*n,r=Math.sin(l/2)**2+Math.cos(e*n)*Math.cos(s*n)*Math.sin(i/2)**2;return 12742*Math.atan2(Math.sqrt(r),Math.sqrt(1-r))}const st=[{min:10,label:"Excellent"},{min:7,label:"Very Good"},{min:4,label:"Good"},{min:1,label:"Fair+"},{min:-2,label:"Fair"},{min:-5,label:"Fair-"},{min:-8,label:"Poor"},{min:-11,label:"Bad"},{min:-1/0,label:"Critical"}];function at(e,t){return t[V(e)]||"#808080"}const nt=s.memo(function({neighbors:e,quickNeighbors:t,localLat:n,localLon:l,onStatsChange:i}){const[r,o]=s.useState(null),[c,m]=s.useState(new Set),[d,h]=s.useState({width:0,height:0}),[u,x]=s.useState("1x"),[p,g]=s.useState(1),f=s.useRef(null),y=s.useRef({}),b=s.useRef(null),v=s.useRef(null),N=s.useRef(p);N.current=p;const k=I(),w=q(),M=K(),C=W(),S=X(),T=S?C.secondary:C.primary,A=S?.4:.15,F=S?.25:.08,P=S?C.primary:w.primary;s.useEffect(()=>{const e=v.current;if(!e)return;const t=new ResizeObserver(e=>{for(const t of e){const{width:e,height:s}=t.contentRect;e>0&&s>0&&h({width:e,height:s})}});t.observe(e);const s=e.getBoundingClientRect();return s.width>0&&s.height>0&&h({width:s.width,height:s.height}),()=>t.disconnect()},[]);const D=s.useMemo(()=>{const e=new Set;if(t)for(const s of t)e.add(s.hash);return e},[t]),L=s.useMemo(()=>{const e=new Map;if(t)for(const s of t)e.set(s.hash,{snr:s.avgSnr,rssi:s.avgRssi});return e},[t]),{processedNeighbors:$,maxDistance:R,totalNeighbors:z,zeroHopCount:B}=s.useMemo(()=>{const t=[];for(const[a,i]of Object.entries(e)){if(!i.latitude||!i.longitude||0===i.latitude||0===i.longitude)continue;if(!D.has(a))continue;const e=et(n,l,i.latitude,i.longitude),s=tt(n,l,i.latitude,i.longitude),r=L.get(a);t.push({hash:a.slice(0,8),name:i.node_name||i.name||"Unknown",snr:(null==r?void 0:r.snr)??i.snr??null,rssi:(null==r?void 0:r.rssi)??i.rssi??null,bearing:e,distance:s,normalizedDistance:0,lastSeen:i.last_seen,isZeroHop:!0})}const s=1.08*(t.length>0?Math.max(...t.map(e=>e.distance)):0);return t.sort((e,t)=>(e.snr??-1/0)-(t.snr??-1/0)),{processedNeighbors:t,maxDistance:s,totalNeighbors:t.length,zeroHopCount:t.length}},[e,n,l,D,L]);s.useEffect(()=>{null==i||i({zeroHopCount:B,totalCount:z,maxDistanceKm:R})},[B,z,R]),s.useEffect(()=>{const e=Ze[u],t=N.current;f.current&&cancelAnimationFrame(f.current);const s=performance.now(),a=n=>{const l=n-s,i=Math.min(l/400,1),r=(o=i)<.5?8*o*o*o*o:1-Math.pow(-2*o+2,4)/2;var o;g(t+(e-t)*r),f.current=i<1?requestAnimationFrame(a):null};return f.current=requestAnimationFrame(a),()=>{f.current&&cancelAnimationFrame(f.current)}},[u]);const H=R/p,_=s.useMemo(()=>Je.filter(e=>e<=1.1*H),[H]);s.useEffect(()=>{const e=[];for(const s of $){const t=y.current[s.hash];void 0!==t&&t!==s.lastSeen&&e.push(s.hash),y.current[s.hash]=s.lastSeen}if(0===e.length)return;queueMicrotask(()=>{m(t=>new Set([...t,...e]))});const t=setTimeout(()=>{m(t=>{const s=new Set(t);return e.forEach(e=>s.delete(e)),s})},600);return()=>clearTimeout(t)},[$]);const E=0!==n&&0!==l,O=s.useMemo(()=>{const{width:e,height:t}=d,s=e/2,a=t/2,n=Math.max(10,e/2-12),l=Math.max(10,t/2-12),i=Math.max(10,n-16),r=Math.max(10,l-16);return{width:e,height:t,centerX:s,centerY:a,maxRadiusX:i,maxRadiusY:r,labelRadiusX:n,labelRadiusY:l,cornerRadius:.2*Math.min(i,r)}},[d]),{width:G,height:V,centerX:Y,centerY:Q,maxRadiusX:U,maxRadiusY:J,labelRadiusX:ee,labelRadiusY:te,cornerRadius:se}=O,ae=s.useCallback((e,t=1)=>{const s=U*t,a=J*t,n=Math.min(se*t,s,a),l=(e%360+360)%360,i=l*Math.PI/180,r=180*Math.atan2(a-n,s-n)/Math.PI;let o,c;if(l<=45-r||l>315+r){const e=Math.tan(i);o=Math.max(Y-s+n,Math.min(Y+s-n,Y+a*e*(s/a))),c=Q-a}else if(l>45-r&&l<=45+r)o=Y+s-n+n*Math.sin(i),c=Q-a+n-n*Math.cos(i);else if(l>45+r&&l<=135-r){const e=1/Math.tan(i);c=Math.max(Q-a+n,Math.min(Q+a-n,Q-s*e*(a/s))),o=Y+s}else if(l>135-r&&l<=135+r)o=Y+s-n+n*Math.sin(i),c=Q+a-n-n*Math.cos(i);else if(l>135+r&&l<=225-r){const e=Math.tan(i);o=Math.max(Y-s+n,Math.min(Y+s-n,Y-a*e*(s/a))),c=Q+a}else if(l>225-r&&l<=225+r)o=Y-s+n+n*Math.sin(i),c=Q+a-n-n*Math.cos(i);else if(l>225+r&&l<=315-r){const e=1/Math.tan(i);c=Math.max(Q-a+n,Math.min(Q+a-n,Q-s*e*(a/s))),o=Y-s}else o=Y-s+n+n*Math.sin(i),c=Q-a+n-n*Math.cos(i);return{x:o,y:c}},[Y,Q,U,J,se]),ne=s.useCallback((e,t)=>{const s=ae(e,1);return{x:Y+(s.x-Y)*t,y:Q+(s.y-Q)*t}},[ae,Y,Q]),le=s.useCallback(e=>({N:{x:Y,y:Q-te},S:{x:Y,y:Q+te},E:{x:Y+ee,y:Q},W:{x:Y-ee,y:Q},NE:{x:Y+ee,y:Q-te},SE:{x:Y+ee,y:Q+te},SW:{x:Y-ee,y:Q+te},NW:{x:Y-ee,y:Q-te}}[e]),[Y,Q,ee,te]),ie=s.useCallback(e=>{const t=U*e,s=J*e,a=Math.min(se*e,t,s),n=Y-t,l=Y+t,i=Q-s,r=Q+s;return[`M ${n+a} ${i}`,`L ${l-a} ${i}`,`Q ${l} ${i} ${l} ${i+a}`,`L ${l} ${r-a}`,`Q ${l} ${r} ${l-a} ${r}`,`L ${n+a} ${r}`,`Q ${n} ${r} ${n} ${r-a}`,`L ${n} ${i+a}`,`Q ${n} ${i} ${n+a} ${i}`,"Z"].join(" ")},[Y,Q,U,J,se]),re=s.useCallback(e=>{o(e)},[]),oe=s.useCallback(e=>{x(e)},[]),ce=s.useCallback(e=>R<=0?0:e/R*p,[R,p]),me=e=>`${e}km`,de=s.useMemo(()=>{const e=_.map(e=>{const t=e/R*p;return{km:e,scale:t,labelY:Q-J*t*.71}}).filter(e=>e.scale<=1.05&&e.scale>=.02).sort((e,t)=>t.km-e.km),t=[];for(const s of e)t.some(e=>Math.abs(e.labelY-s.labelY)<28)||t.push(s);return t},[_,R,p,Q,J]),he=d.width>0&&d.height>0;return E?0===z?a.jsxs("div",{ref:b,className:"flex flex-col items-center justify-center h-full text-text-secondary",children:[a.jsx(Z,{className:"w-8 h-8 mb-2 opacity-50"}),a.jsx("p",{children:"No nodes with location data"})]}):a.jsxs("div",{ref:b,className:"relative h-full w-full flex overflow-hidden",children:[a.jsx("div",{ref:v,className:"relative flex-1 min-w-0 h-full",children:he&&a.jsxs("svg",{width:G,height:V,className:"absolute inset-0 z-0",children:[a.jsxs("defs",{children:[a.jsx("style",{children:"\n @keyframes neighbor-blink-scale {\n 0%, 100% {\n transform: scale(1);\n opacity: 0;\n }\n 50% {\n transform: scale(1.3);\n opacity: 0.8;\n }\n }\n .neighbor-blink-ring {\n transform-origin: center;\n animation: neighbor-blink-scale 600ms ease-out forwards;\n }\n "}),a.jsx("clipPath",{id:"radar-clip",children:a.jsx("path",{d:ie(1)})})]}),_.map(e=>{const t=ce(e);if(t>1.05||t<.02)return null;const s=de.some(t=>t.km===e),n=Y+U*t*.71,l=Q-J*t*.71;return a.jsxs("g",{children:[a.jsx("path",{d:ie(t),fill:"none",stroke:T,strokeOpacity:A,strokeWidth:1}),s&&a.jsx("text",{x:n+4,y:l-2,textAnchor:"start",dominantBaseline:"auto",className:"fill-text-secondary",fontSize:10,fontFamily:j,children:me(e)})]},`ring-${e}`)}),["N","E","S","W"].map(e=>{const t="N"===e||"S"===e,s=t?Y:"E"===e?Y+U:Y-U,n=t?"N"===e?Q-J:Q+J:Q;return a.jsx("line",{x1:Y,y1:Q,x2:s,y2:n,stroke:T,strokeOpacity:A,strokeWidth:1,strokeDasharray:"4 4"},e)}),["NE","SE","SW","NW"].map(e=>{const t=le(e);return a.jsx("line",{x1:Y,y1:Q,x2:t.x,y2:t.y,stroke:T,strokeOpacity:F,strokeWidth:1,strokeDasharray:"4 4"},`diag-${e}`)}),["N","E","S","W"].map(e=>{const t=le(e),s="E"===e?"end":"W"===e?"start":"middle",n="N"===e?"hanging":"S"===e?"auto":"middle";return a.jsx("text",{x:t.x,y:t.y,textAnchor:s,dominantBaseline:n,fill:P,fontSize:16,fontWeight:600,fontFamily:j,"aria-hidden":"true",children:e},e)}),["NE","SE","SW","NW"].map(e=>{const t=le(e),s="NE"===e||"SE"===e?"end":"start",n="NE"===e||"NW"===e?"hanging":"auto";return a.jsx("text",{x:t.x,y:t.y,textAnchor:s,dominantBaseline:n,fill:P,fontSize:16,fontWeight:600,fontFamily:j,"aria-hidden":"true",children:e},e)}),a.jsx("circle",{cx:Y,cy:Q,r:5,fill:M.chart6,stroke:"rgba(255,255,255,0.3)",strokeWidth:1,role:"img","aria-label":"Local node"}),a.jsx("g",{clipPath:"url(#radar-clip)",children:$.map(e=>{const t=R>0?e.distance/R*p:0;if(t>1)return null;const{x:s,y:n}=ne(e.bearing,t),l=null!==e.snr?at(e.snr,k):"#808080",i=(null==r?void 0:r.hash)===e.hash,o=c.has(e.hash);return a.jsxs("g",{role:"img","aria-label":`${e.name}: ${e.distance.toFixed(1)}km ${e.bearing.toFixed(0)}°`,children:[o&&a.jsx("circle",{cx:s,cy:n,r:10.5,fill:"none",stroke:"rgba(255,255,255,0.9)",strokeWidth:2,className:"neighbor-blink-ring"}),i&&a.jsx("circle",{cx:s,cy:n,r:10.5,fill:l,opacity:.3}),a.jsx("circle",{cx:s,cy:n,r:i?7:5,fill:l,stroke:"rgba(0,0,0,0.5)",strokeWidth:1,style:{cursor:"pointer",transition:"r 0.15s"},onMouseEnter:()=>re(e),onMouseLeave:()=>re(null)})]},e.hash)})})]})}),a.jsx("div",{className:"flex flex-col h-full items-stretch gap-1 py-2 pl-2 flex-shrink-0",role:"group","aria-label":"Zoom level",children:["1x","2x","4x","8x","16x","36x"].map(e=>a.jsx("button",{onClick:()=>oe(e),"aria-pressed":u===e,className:"flex flex-1 items-center justify-center px-1.5 text-xs font-medium rounded transition-colors "+(u===e?"bg-accent-primary/20 text-accent-primary":"bg-white/5 text-text-secondary hover:bg-white/10 hover:text-text-primary"),children:e},e))}),r&&a.jsxs("div",{className:"absolute bg-tooltip-bg border border-border-subtle rounded-lg px-3 py-2 text-sm pointer-events-none z-10 shadow-xl",style:{left:"50%",bottom:8,transform:"translateX(-50%)"},children:[a.jsx("div",{className:"font-medium text-text-primary",children:r.name}),a.jsx("div",{className:"text-text-secondary text-xs font-mono",children:r.hash}),null!==r.snr?a.jsx("div",{className:"flex gap-3 mt-1 text-xs",children:a.jsxs("span",{children:[a.jsx("span",{className:"text-text-secondary",children:"SNR:"})," ",a.jsxs("span",{className:"tabular-nums",style:{color:at(r.snr,k)},children:[r.snr.toFixed(1)," dB"]}),a.jsxs("span",{className:"text-text-secondary ml-1",children:["(",(ue=r.snr,(null==(xe=st.find(e=>ue>=e.min))?void 0:xe.label)??"Critical"),")"]})]})}):a.jsx("div",{className:"text-xs text-text-secondary mt-1",children:"No SNR data"}),a.jsxs("div",{className:"flex gap-3 text-xs",children:[a.jsxs("span",{children:[a.jsx("span",{className:"text-text-secondary",children:"Distance:"})," ",a.jsxs("span",{className:"tabular-nums text-text-primary",children:[r.distance.toFixed(2)," km"]})]}),a.jsxs("span",{children:[a.jsx("span",{className:"text-text-secondary",children:"Bearing:"})," ",a.jsxs("span",{className:"tabular-nums text-text-primary",children:[r.bearing.toFixed(0),"°"]})]})]})]})]}):a.jsxs("div",{ref:b,className:"flex flex-col items-center justify-center h-full text-text-secondary",children:[a.jsx(Z,{className:"w-8 h-8 mb-2 opacity-50"}),a.jsx("p",{children:"Local node coordinates not configured"}),a.jsx("p",{className:"text-xs mt-1",children:"Set latitude/longitude in config to enable"})]});var ue,xe}),lt={repeater:"var(--accent-primary)",companion:"var(--accent-tertiary)",room_server:"var(--accent-secondary)"};function it(e){if(e.contact_type){const t=e.contact_type.toLowerCase();if("repeater"===t||"rep"===t)return"repeater";if("room server"===t||"room_server"===t||"room"===t||"server"===t)return"room_server";if("companion"===t||"client"===t||"cli"===t)return"companion"}return e.is_repeater?"repeater":"companion"}const rt=s.memo(function({neighbors:e}){const t=s.useMemo(()=>{const t={repeater:0,companion:0,room_server:0};for(const a of Object.values(e)){const e=it(a);t[e]=(t[e]||0)+1}const s=Object.values(t).reduce((e,t)=>e+t,0);return{items:[{label:"Repeaters",count:t.repeater,percent:0,color:lt.repeater},{label:"Companions",count:t.companion,percent:0,color:lt.companion},{label:"Room Servers",count:t.room_server,percent:0,color:lt.room_server}].map(e=>({...e,percent:s>0?e.count/s*100:0})).filter(e=>e.count>0).sort((e,t)=>t.count-e.count),total:s}},[e]);return 0===t.total?a.jsx("div",{className:"h-full flex items-center justify-center text-text-muted type-body-sm",children:"No neighbors discovered yet"}):a.jsxs("div",{className:"h-full flex flex-col",children:[a.jsx("div",{className:"flex-1 flex flex-col justify-evenly",children:t.items.map(e=>a.jsxs("div",{className:"flex flex-col gap-1.5",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsx("span",{className:"type-data-sm text-text-secondary",children:e.label}),a.jsxs("span",{className:"type-data-sm text-text-secondary tabular-nums",children:[e.count," ",a.jsxs("span",{className:"text-text-secondary/60",children:["(",e.percent.toFixed(0),"%)"]})]})]}),a.jsx("div",{className:"h-2.5 bg-bg-elevated overflow-hidden",children:a.jsx("div",{className:"h-full transition-all duration-500 ease-out",style:{width:`${e.percent}%`,backgroundColor:e.color,minWidth:e.count>0?"4px":"0"}})})]},e.label))}),a.jsxs("div",{className:"flex items-center justify-between pt-2 border-t border-border-subtle",children:[a.jsx("span",{className:"type-data-xs text-text-secondary",children:"Total Nodes"}),a.jsx("span",{className:"type-data-sm text-text-primary font-medium tabular-nums",children:t.total})]})]})});function ot({children:e,minHeight:t="100%",rootMargin:n="200px 0px",keepMounted:l=!0,className:i=""}){const r=s.useRef(null),[o,c]=s.useState(!1),[m,d]=s.useState(!1);s.useEffect(()=>{const e=r.current;if(!e)return;const t=new IntersectionObserver(([e])=>{const t=e.isIntersecting;d(t),t&&c(!0)},{rootMargin:n,threshold:0});return t.observe(e),()=>{t.disconnect()}},[n]);const h=m||l&&o;return a.jsx("div",{ref:r,className:`h-full w-full ${i}`,style:{minHeight:t},children:h?e:a.jsx("div",{className:"h-full w-full flex items-center justify-center text-text-muted/50",children:a.jsx("div",{className:"animate-pulse text-xs",children:"Loading chart..."})})})}const ct={excellent:"text-signal-excellent",good:"text-signal-good",fair:"text-signal-fair",poor:"text-accent-primary"},mt={excellent:"bg-signal-excellent/10",good:"bg-signal-good/10",fair:"bg-signal-fair/10",poor:"bg-accent-primary/10"};function dt(){const e=v(),t=N(),[n,l]=s.useState(null),i=s.useCallback((e,t)=>{l({prefix:e,candidateHashes:t})},[]),r=s.useCallback(()=>{l(null)},[]);if(!t)return a.jsxs(se,{children:[a.jsx(oe,{icon:a.jsx(Q,{}),title:"Prefix Conflicts",largeTitle:!0}),a.jsx("div",{className:"flex-1 flex items-center justify-center",children:a.jsxs("div",{className:"text-center text-text-secondary",children:[a.jsx(me,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),a.jsx("p",{className:"type-data-xs",children:"No topology data available"}),a.jsx("p",{className:"type-data-xs opacity-70",children:"Run deep analysis to see stats"})]})})]});const o=(c=e.avgConfidence)>=.9?"excellent":c>=.7?"good":c>=.5?"fair":"poor";var c;const m=(d=e.collisionRate)<=10?"excellent":d<=25?"good":"poor";var d;const h="poor"===o||"poor"===m?"poor":"fair"===o||"fair"===m?"fair":"good"===o||"good"===m?"good":"excellent",u="excellent"===h||"good"===h?fe:de;return a.jsxs(se,{className:"flex flex-col overflow-hidden",children:[a.jsx(oe,{icon:a.jsx(Q,{}),title:"Prefix Conflicts",largeTitle:!0,actions:a.jsxs("div",{className:`flex items-center gap-1.5 px-2.5 py-1 rounded-full ${mt[h]}`,children:[a.jsx(u,{className:`w-3.5 h-3.5 ${ct[h]}`}),a.jsx("span",{className:`type-data-xs font-medium ${ct[h]}`,children:"excellent"===h?"Excellent":"good"===h?"Good":"fair"===h?"Fair":"Needs Attention"})]})}),a.jsxs("div",{className:"flex-1 flex flex-col min-h-0",children:[a.jsxs("div",{className:"grid grid-cols-3 gap-1.5 sm:gap-2 py-3 sm:py-4",children:[a.jsxs("div",{className:"flex flex-col items-center cursor-help bg-white/5 radius-inner sm:radius-inset py-2 sm:py-3 px-1.5 sm:px-2",title:"Total unique 2-character prefixes observed in packet paths.",children:[a.jsx(ee,{value:e.totalPrefixes,className:"font-mono text-2xl sm:text-3xl font-semibold tabular-nums text-text-primary",priority:"low"}),a.jsx("span",{className:"type-data-xs sm:type-data-sm text-text-secondary mt-0.5 sm:mt-1",children:"Prefixes"})]}),a.jsxs("div",{className:"flex flex-col items-center cursor-help bg-white/5 radius-inner sm:radius-inset py-2 sm:py-3 px-1.5 sm:px-2",title:"Prefixes that map to exactly one known node. No disambiguation needed.",children:[a.jsx(ee,{value:e.unambiguousPrefixes,className:"font-mono text-2xl sm:text-3xl font-semibold tabular-nums text-text-primary",priority:"low"}),a.jsx("span",{className:"type-data-xs sm:type-data-sm text-text-secondary mt-0.5 sm:mt-1",children:"Unique"})]}),a.jsxs("div",{className:"flex flex-col items-center cursor-help radius-inner sm:radius-inset py-2 sm:py-3 px-1.5 sm:px-2 "+(e.collisionPrefixes>0?"bg-accent-primary/15":"bg-white/5"),title:"Prefixes matching multiple known nodes. Click a prefix below to explore candidates.",children:[a.jsx(ee,{value:e.collisionPrefixes,className:"font-mono text-2xl sm:text-3xl font-semibold tabular-nums "+(e.collisionPrefixes>0?"text-accent-primary":"text-text-primary"),priority:"low"}),a.jsx("span",{className:"type-data-xs sm:type-data-sm mt-0.5 sm:mt-1 "+(e.collisionPrefixes>0?"text-accent-primary":"text-text-secondary"),children:"Conflicts"})]})]}),e.highCollisionPrefixes.length>0&&a.jsxs("div",{children:[a.jsx("div",{className:"type-data-xs text-text-secondary mb-1.5",children:"Problem Prefixes"}),a.jsx("div",{className:"flex flex-wrap gap-1.5 content-start",children:e.highCollisionPrefixes.map(({prefix:e,candidateCount:t,candidateHashes:s})=>a.jsxs("button",{type:"button",onClick:()=>i(e,s),className:"inline-flex items-center gap-0.5 group",title:`${t} candidates - click to explore`,children:[a.jsx(ie,{children:e}),a.jsxs("span",{className:"text-text-muted type-data-xs group-hover:text-text-secondary transition-colors",children:["×",t]})]},e))})]}),0===e.lowConfidencePrefixes.length&&0===e.collisionPrefixes&&a.jsx("div",{className:"flex-1 flex items-center",children:a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx(fe,{className:"w-3.5 h-3.5 text-signal-excellent"}),a.jsx("span",{className:"type-data-xs text-signal-excellent",children:"All prefixes uniquely identified"})]})}),a.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mt-auto pt-3",children:[a.jsxs("div",{className:"flex items-center gap-2 cursor-help",title:"Average confidence score across all disambiguated prefixes. Higher = more certain node identification.",children:[a.jsx("span",{className:"type-data-xs text-text-secondary",children:"Confidence"}),a.jsxs("span",{className:`data-box ${ct[o]}`,children:[(100*e.avgConfidence).toFixed(1),"%"]})]}),a.jsxs("div",{className:"flex items-center gap-2 cursor-help",title:"Percentage of 2-character prefixes that match multiple known nodes. Lower is better.",children:[a.jsx("span",{className:"type-data-xs text-text-secondary",children:"Collisions"}),a.jsxs("span",{className:`data-box ${ct[m]}`,children:[e.collisionRate.toFixed(1),"%"]})]})]})]}),a.jsx(re,{isOpen:!!n,prefix:(null==n?void 0:n.prefix)||"",candidateHashes:(null==n?void 0:n.candidateHashes)||[],onClose:r})]})}function ht({icon:e,label:t,value:s,sublabel:n,highlight:l,tooltip:i}){return a.jsxs("div",{className:"flex items-center justify-between gap-2 py-1.5 "+(i?"cursor-help":""),title:i,children:[a.jsxs("div",{className:"flex items-center gap-1.5 sm:gap-2 min-w-0",children:[a.jsx("span",{className:"icon-xs text-icon-widget flex-shrink-0",children:e}),a.jsx("span",{className:"type-body-sm text-text-secondary truncate",children:t})]}),a.jsxs("div",{className:"flex items-center gap-1 sm:gap-1.5 flex-shrink-0",children:[a.jsx("span",{className:"data-box",style:l?{"--data-box-color":"var(--accent-primary)"}:void 0,children:s}),n&&a.jsx("span",{className:"type-data-xs text-text-secondary hidden sm:inline",children:n})]})]})}function ut(){const e=k(),t=w().length;if(!e||0===e.totalPaths)return null;const{totalPaths:s,pathsWithGhosts:n,observationOverrideCount:l,tracePacketsProcessed:i,pathPacketsProcessed:r,distantEdgesDiscovered:o,duplicateGroupsFound:c,duplicatePathsUnique:m,echolocationEdgesInferred:d}=e,h=s>0?((s-n)/s*100).toFixed(1):"0",u=s>0?(l/s*100).toFixed(1):"0",x=i+r,p=x>0||o>0,g=c>0||d>0;return a.jsxs(se,{children:[a.jsx(oe,{title:"Path Decoder",icon:a.jsx(U,{}),largeTitle:!0,badge:t>0?`${t} hidden`:void 0}),a.jsxs(ce,{children:[a.jsxs("div",{children:[a.jsx(ht,{icon:a.jsx(ke,{className:"w-3.5 h-3.5"}),label:"Traceable",value:`${h}%`,sublabel:`of ${s.toLocaleString()} paths`,tooltip:"Percentage of packet journeys where every hop was identified. Higher = better visibility into how traffic flows through your mesh."}),a.jsx(ht,{icon:a.jsx(Ce,{className:"w-3.5 h-3.5"}),label:"Learning Rate",value:`${u}%`,sublabel:"adapted",tooltip:"How often real traffic patterns improved our predictions over geography alone. Higher values mean the decoder is learning your mesh's actual behavior — which routes are preferred, which nodes are most active."})]}),p&&a.jsxs("div",{className:"mt-3",children:[a.jsx("p",{className:"type-micro mb-2",children:"Beyond Line-of-Sight"}),a.jsxs("div",{children:[a.jsx(ht,{icon:a.jsx(we,{className:"w-3.5 h-3.5"}),label:"Route Reports",value:x.toLocaleString(),sublabel:i>0?`(${i} TRACE)`:void 0,tooltip:"TRACE/PATH packets from distant nodes share their routing tables. This reveals connections we can't directly observe — mapping parts of the mesh we don't touch."}),a.jsx(ht,{icon:a.jsx(he,{className:"w-3.5 h-3.5"}),label:"Remote Links",value:o.toLocaleString(),highlight:o>0,tooltip:"Node-to-node connections discovered from route reports. These links exist outside our RF range but help complete the topology picture."})]})]}),g&&a.jsx(ht,{icon:a.jsx(M,{className:"w-3.5 h-3.5"}),label:"Multi-Path Packets",value:c.toLocaleString(),sublabel:m>0?`(${m} routes)`:void 0,tooltip:"Packets received via multiple paths simultaneously. Like sonar, these 'echoes' reveal redundant routes — important for understanding mesh resilience."}),t>0&&a.jsx(ht,{icon:a.jsx(C,{className:"w-3.5 h-3.5 text-accent-primary"}),label:"Ghost Repeaters",value:t,highlight:!0,tooltip:"High-confidence hidden repeaters: appear in 10+ paths, have 2+ known neighbors, ≥30% confidence, and plausible location. View them on the Contacts map."})]})]})}function xt(){var e,t,n,l,i,r,o,c,m,d,h,u,x,p,g,f,y;const b=S(),j=T(),v=A(),N=F(),k=P(),w=D(),M=L(),C=$(),[q,W]=s.useState([]),[G,I]=s.useState(null),[K,X]=s.useState(null),[V,Q]=s.useState(!0),[U,J]=s.useState(null),[ee,ie]=s.useState(()=>{const e=localStorage.getItem("statistics-view-mode");return"share"===e||"airtime"===e?e:"airtime"});s.useEffect(()=>{localStorage.setItem("statistics-view-mode",ee)},[ee]);const[re,ce]=s.useState(()=>{const e=localStorage.getItem("statistics-smoothing-mode");return["raw","ema","zlema","smooth","ultra","mosaic","stats","trend"].includes(e)?e:"trend"});s.useEffect(()=>{localStorage.setItem("statistics-smoothing-mode",re)},[re]);const[me,de]=s.useState(!1),[he,ge]=s.useState(!1),[fe,ye]=s.useState(Ae),[be,je]=s.useState(.5),ve=s.useMemo(()=>({0:0,1:0,2:1,3:2,4:3,5:4,6:5,7:6}[M]??3),[M]),Ne=R[ve].hours,ke=60*Ne,we=R[ve],Me=B(Ne),Ce=w.isBackgroundLoading,Se=s.useCallback(e=>{C({0:1,1:2,2:3,3:4,4:5,5:6,6:7}[e]??4)},[C]),Te=s.useMemo(()=>{var e;if(!(null==(e=null==b?void 0:b.config)?void 0:e.radio))return null;const t=b.config.radio;return{sf:t.spreading_factor??10,bw:t.bandwidth??25e4,cr:t.coding_rate??5,preamble:t.preamble_length??8}},[null==(t=null==(e=null==b?void 0:b.config)?void 0:e.radio)?void 0:t.spreading_factor,null==(l=null==(n=null==b?void 0:b.config)?void 0:n.radio)?void 0:l.bandwidth,null==(r=null==(i=null==b?void 0:b.config)?void 0:i.radio)?void 0:r.coding_rate,null==(c=null==(o=null==b?void 0:b.config)?void 0:o.radio)?void 0:c.preamble_length]);s.useEffect(()=>{!async function(){var e;J(null);try{const t=await z(Ne);t.success&&(null==(e=t.data)?void 0:e.history)&&W(t.data.history)}catch(t){J(t instanceof Error?t.message:"Failed to load chart data")}finally{Q(!1)}}()},[Ne]);const Le=s.useMemo(()=>72===Ne?6e5:168===Ne?18e5:336===Ne?36e5:3e5,[Ne]),$e=s.useCallback(async()=>{var e;try{const t=await z(Ne);t.success&&(null==(e=t.data)?void 0:e.history)&&W(t.data.history)}catch{}},[Ne]);O($e,Le,!0,!0);const Re=s.useMemo(()=>0===q.length?{timestamps:[],values:[]}:{timestamps:q.map(e=>e.timestamp),values:q.map(e=>e.noise_floor_dbm)},[q]),ze=s.useMemo(()=>{if(q.length<10)return{anomalies:[],debug:void 0};const e=function(e,t={}){const s={...Ae,...t};if(e.length<10)return{anomalies:[],thresholds:Pe([]),totalSamples:e.length,anomalySamples:0};const a=e.map(e=>e.noise_floor_dbm),n=Pe(a),l=[...a].sort((e,t)=>e-t);let i,r;s.useAbsoluteThresholds?(i=s.baselineDbm,r=s.spikeDbm):(i=Fe(l,s.baselinePercentile),r=Fe(l,s.spikePercentile));const o=[...e].sort((e,t)=>e.timestamp-t.timestamp),c=[];let m=null,d=0;for(const h of o)if(h.noise_floor_dbm>i&&h.noise_floor_dbme+t,0)/m.values.length):(m.values.length>=s.minSequenceLength&&c.push(m),m={startTs:h.timestamp,endTs:h.timestamp,values:[h.noise_floor_dbm],timestamps:[h.timestamp],rollingAvg:h.noise_floor_dbm})}else m={startTs:h.timestamp,endTs:h.timestamp,values:[h.noise_floor_dbm],timestamps:[h.timestamp],rollingAvg:h.noise_floor_dbm};else m&&m.values.length>=s.minSequenceLength&&c.push(m),m=null;return m&&m.values.length>=s.minSequenceLength&&c.push(m),0===c.length?{anomalies:[],thresholds:n,totalSamples:e.length,anomalySamples:d,debug:{baselineCutoff:i,spikeCutoff:r,midBandSamples:d}}:{anomalies:c.map(e=>{const t=Math.max(...e.values),s=e.values.reduce((e,t)=>e+t,0)/e.values.length;return{startTs:e.startTs,endTs:e.endTs,peakValue:t,avgValue:s,severity:De(s,i,r),sampleCount:e.values.length}}),thresholds:n,totalSamples:e.length,anomalySamples:d,debug:{baselineCutoff:i,spikeCutoff:r,midBandSamples:d}}}(q,fe);return{anomalies:e.anomalies,debug:e.debug}},[q,fe]),Be=ze.anomalies,He=s.useMemo(()=>{const e=(null==b?void 0:b.neighbors)??{};return Object.fromEntries(Object.entries(e).filter(([e])=>!j.has(e)))},[null==b?void 0:b.neighbors,j]),_e=s.useMemo(()=>{const e=Date.now()/1e3-3600*Ne;return Object.fromEntries(Object.entries(He).filter(([,t])=>t.last_seen>=e))},[He,Ne]),Ee=s.useMemo(()=>{const e=60*ke/Me,t=Math.floor(Date.now()/1e3),s=Math.floor(t/e)*e;return{start:s-60*ke,end:s}},[ke,Me]);return a.jsxs(ae,{children:[a.jsx(ne,{title:"Statistics",icon:a.jsx(H,{}),controls:a.jsx(te,{ranges:R,selectedIndex:ve,onSelect:Se,isPending:Ce})}),U&&a.jsx(se,{className:"border border-accent-red/50 bg-accent-red/10",children:a.jsx("p",{className:"text-accent-red",children:U})}),me&&he&&a.jsxs(se,{className:"border border-accent-purple/30 bg-glass-surface/50",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"type-label",children:"Anomaly Detection Tuning"}),a.jsxs("span",{className:"type-data-xs text-text-muted",children:["(",we.label,")"]})]}),a.jsx("button",{onClick:()=>ye(e=>({...e,useAbsoluteThresholds:!e.useAbsoluteThresholds})),className:"type-data-xs px-2 py-1 rounded transition-colors "+(fe.useAbsoluteThresholds?"bg-accent-purple/30 text-accent-purple":"bg-glass-elevated text-text-muted hover:text-text-secondary"),children:fe.useAbsoluteThresholds?"Absolute dBm":"Percentile"})]}),a.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-4",children:[a.jsxs("div",{children:[a.jsx("span",{className:"type-micro",children:"Baseline"}),a.jsxs("span",{className:"ml-2 type-data-sm text-status-warning",children:[(null==(d=null==(m=ze.debug)?void 0:m.baselineCutoff)?void 0:d.toFixed(1))??"—"," dBm"]})]}),a.jsxs("div",{children:[a.jsx("span",{className:"type-micro",children:"Spike"}),a.jsxs("span",{className:"ml-2 type-data-sm text-status-warning",children:[(null==(u=null==(h=ze.debug)?void 0:h.spikeCutoff)?void 0:u.toFixed(1))??"—"," dBm"]})]}),a.jsxs("div",{children:[a.jsx("span",{className:"type-micro",children:"Mid-band"}),a.jsx("span",{className:"ml-2 type-data-sm text-accent-purple",children:(null==(x=ze.debug)?void 0:x.midBandSamples)??0})]}),a.jsxs("div",{children:[a.jsx("span",{className:"type-micro",children:"Anomalies"}),a.jsx("span",{className:"ml-2 type-data-sm text-status-danger",children:Be.length})]})]}),a.jsxs("div",{className:"mt-4 pt-4 border-t border-border-subtle space-y-4",children:[fe.useAbsoluteThresholds?a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Baseline (",fe.baselineDbm," dBm)"]}),a.jsx("input",{type:"range",min:"-120",max:"-60",value:fe.baselineDbm,onChange:e=>ye(t=>({...t,baselineDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Spike (",fe.spikeDbm," dBm)"]}),a.jsx("input",{type:"range",min:"-100",max:"-20",value:fe.spikeDbm,onChange:e=>ye(t=>({...t,spikeDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Merge Gap (",fe.mergeGapSeconds,"s)"]}),a.jsx("input",{type:"range",min:"5",max:"120",step:"5",value:fe.mergeGapSeconds,onChange:e=>ye(t=>({...t,mergeGapSeconds:Number(e.target.value)})),className:"w-full accent-accent-purple"})]})]}),a.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Min Sequence (",fe.minSequenceLength,")"]}),a.jsx("input",{type:"range",min:"2",max:"20",value:fe.minSequenceLength,onChange:e=>ye(t=>({...t,minSequenceLength:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Similarity (±",fe.similarityToleranceDbm," dBm)"]}),a.jsx("input",{type:"range",min:"1",max:"15",value:fe.similarityToleranceDbm,onChange:e=>ye(t=>({...t,similarityToleranceDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Opacity (",Math.round(100*be),"%)"]}),a.jsx("input",{type:"range",min:"0.1",max:"1",step:"0.05",value:be,onChange:e=>je(Number(e.target.value)),className:"w-full accent-accent-purple"})]})]})]}):a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Baseline (P",fe.baselinePercentile,")"]}),a.jsx("input",{type:"range",min:"1",max:"50",value:fe.baselinePercentile,onChange:e=>ye(t=>({...t,baselinePercentile:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Spike (P",fe.spikePercentile,")"]}),a.jsx("input",{type:"range",min:"50",max:"99",value:fe.spikePercentile,onChange:e=>ye(t=>({...t,spikePercentile:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Merge Gap (",fe.mergeGapSeconds,"s)"]}),a.jsx("input",{type:"range",min:"5",max:"120",step:"5",value:fe.mergeGapSeconds,onChange:e=>ye(t=>({...t,mergeGapSeconds:Number(e.target.value)})),className:"w-full accent-accent-purple"})]})]}),a.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-4",children:[a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Min Sequence (",fe.minSequenceLength,")"]}),a.jsx("input",{type:"range",min:"2",max:"20",value:fe.minSequenceLength,onChange:e=>ye(t=>({...t,minSequenceLength:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Similarity (±",fe.similarityToleranceDbm," dBm)"]}),a.jsx("input",{type:"range",min:"1",max:"15",value:fe.similarityToleranceDbm,onChange:e=>ye(t=>({...t,similarityToleranceDbm:Number(e.target.value)})),className:"w-full accent-accent-purple"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"type-micro block mb-1",children:["Opacity (",Math.round(100*be),"%)"]}),a.jsx("input",{type:"range",min:"0.1",max:"1",step:"0.05",value:be,onChange:e=>je(Number(e.target.value)),className:"w-full accent-accent-purple"})]})]})]}),a.jsxs("div",{className:"mt-4 p-3 bg-glass-elevated radius-inner",children:[a.jsx("div",{className:"type-micro mb-1",children:"Config output"}),a.jsxs("div",{className:"type-data-sm text-status-success",children:[fe.useAbsoluteThresholds?`useAbsoluteThresholds: true, baselineDbm: ${fe.baselineDbm}, spikeDbm: ${fe.spikeDbm}`:`useAbsoluteThresholds: false, baselinePercentile: ${fe.baselinePercentile}, spikePercentile: ${fe.spikePercentile}`,", mergeGapSeconds: ",fe.mergeGapSeconds,", minSequenceLength: ",fe.minSequenceLength,", similarityToleranceDbm: ",fe.similarityToleranceDbm]})]})]})]}),a.jsxs(le,{children:[Ce&&a.jsx(ue,{template:"auto",children:a.jsx(se,{className:"border border-accent-primary/30 bg-accent-primary/5",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsxs("div",{className:"relative flex h-3 w-3",children:[a.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-accent-primary opacity-75"}),a.jsx("span",{className:"relative inline-flex rounded-full h-3 w-3 bg-accent-primary"})]}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("p",{className:"type-body-sm text-text-primary",children:["Loading ",we.label," data..."]}),w.loadProgress&&a.jsxs("p",{className:"type-data-xs text-text-muted mt-0.5",children:[w.loadProgress.loaded.toLocaleString()," packets (",w.loadProgress.percent,"%)"]})]})]})})}),V?a.jsx(ue,{template:"auto",children:a.jsx(se,{className:"text-center py-12",children:a.jsx("div",{className:"animate-pulse text-text-muted",children:"Loading statistics..."})})}):a.jsxs(a.Fragment,{children:[a.jsx(ue,{template:"hero-auto",children:a.jsx(se,{isLoaded:k,skeletonType:"chart",children:k&&a.jsxs(a.Fragment,{children:[a.jsx(oe,{icon:a.jsx(Y,{}),title:"Packet Analyzer",badge:we.label,largeTitle:!0,stackActionsOnMobile:!0,actions:a.jsxs("div",{className:"flex flex-wrap items-center gap-2 justify-end",children:["stats"===re&&a.jsx(Xe,{enabled:me,onChange:de,anomalyCount:Be.length,showTuning:he,onTuningChange:ge}),a.jsx(Ke,{smoothing:re,onChange:ce}),a.jsx(Ie,{mode:ee,onChange:ie})]})}),a.jsx("div",{className:"flex-1 min-h-0",children:a.jsx(Ue,{packets:N,startTs:Ee.start,endTs:Ee.end,bucketCount:Me,radioConfig:Te??void 0,mode:ee,smoothing:re,noiseFloorAnomalies:Be,showNoiseFloorOverlay:me,overlayOpacity:be})})]})})}),a.jsxs(ue,{template:"panel",children:[a.jsx(xe,{span:12,md:6,children:a.jsx(se,{isLoaded:k,skeletonType:"chart",children:k&&a.jsxs(a.Fragment,{children:[a.jsx(oe,{icon:a.jsx(Z,{}),title:"Link Quality",badge:we.label,largeTitle:!0,actions:K?a.jsxs("div",{className:"flex items-center gap-3 type-data-xs text-text-muted",children:[a.jsxs("span",{children:[a.jsx("span",{className:"text-text-secondary tabular-nums font-medium",children:K.zeroHopCount})," nbr"]}),a.jsxs("span",{children:[a.jsx("span",{className:"text-text-secondary tabular-nums font-medium",children:K.totalCount})," obs"]}),a.jsxs("span",{children:[a.jsx("span",{className:"text-text-secondary tabular-nums font-medium",children:K.maxDistanceKm.toFixed(0)})," km"]})]}):null}),a.jsx("div",{className:"flex-1 min-h-0",children:a.jsx(ot,{children:a.jsx(nt,{neighbors:_e,quickNeighbors:v,localLat:(null==(g=null==(p=null==b?void 0:b.config)?void 0:p.repeater)?void 0:g.latitude)??0,localLon:(null==(y=null==(f=null==b?void 0:b.config)?void 0:f.repeater)?void 0:y.longitude)??0,onStatsChange:X})})})]})})}),a.jsx(xe,{span:12,md:6,children:a.jsx(se,{isLoaded:k,skeletonType:"chart",children:k&&a.jsxs(a.Fragment,{children:[a.jsx(oe,{icon:a.jsx(pe,{}),title:"Network Composition",badge:we.label,largeTitle:!0}),a.jsx("div",{className:"flex-1 min-h-0",children:a.jsx(ot,{children:a.jsx(rt,{neighbors:_e})})})]})})})]}),a.jsxs(ue,{template:"panel",children:[a.jsx(xe,{span:12,md:6,children:a.jsx(dt,{})}),a.jsx(xe,{span:12,md:6,children:a.jsx(ut,{})})]}),a.jsx(ue,{template:"panel",children:a.jsx(xe,{span:12,children:a.jsx(se,{isLoaded:k,skeletonType:"chart",children:k&&a.jsxs(a.Fragment,{children:[a.jsx(oe,{icon:a.jsx(_,{}),title:"RF Noise Floor",largeTitle:!0,stackActionsOnMobile:!0,actions:G?a.jsxs("div",{className:"flex items-center gap-2 sm:gap-3",children:[a.jsxs("span",{className:"type-data-xs text-text-muted whitespace-nowrap",children:["min ",a.jsx("span",{className:"text-text-secondary tabular-nums",children:G.min.toFixed(0)})]}),a.jsxs("span",{className:"type-data-xs text-text-muted whitespace-nowrap",children:["avg ",a.jsx("span",{className:"text-text-secondary tabular-nums",children:G.avg.toFixed(0)})]}),a.jsxs("span",{className:"type-data-xs text-text-muted whitespace-nowrap",children:["max ",a.jsx("span",{className:"text-text-secondary tabular-nums",children:G.max.toFixed(0)})]}),a.jsx("span",{className:"type-data-xs text-text-muted",children:"dBm"})]}):a.jsx("span",{className:"type-data-xs text-text-muted",children:"dBm"})}),a.jsx("div",{className:"flex-1 min-h-0",children:a.jsx(ot,{children:a.jsx(E,{timestamps:Re.timestamps,values:Re.values,onStatsChange:I})})})]})})})})]})]})]})}export{xt as default}; diff --git a/frontend/dist/assets/System-CNFICQV5.js b/frontend/dist/assets/System-CNFICQV5.js deleted file mode 100644 index d9cf4bf3..00000000 --- a/frontend/dist/assets/System-CNFICQV5.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e,j as t,c as s,R as a,A as r,C as n,n as l,Y as c,T as i,q as o}from"./vendor-react-DFCqJxYC.js";import{c as m,aZ as x,a_ as d,a$ as p,b0 as u,S as h,b1 as j,b2 as y,O as f,aM as g}from"./index-CZBrdv20.js";import{u as v,a as b}from"./useThemeColors-CzhUM4y-.js";import{P as N,b as w,B as k,a as M}from"./PageLayout-Dz1NyqHa.js";import{R as _}from"./refresh-cw-B42SG81L.js";import{R as C,C as S}from"./Grid-TNw012c2.js";import{C as F}from"./Card-BiYlryJL.js";import{A as T,C as B}from"./chevron-up-Cn6bmTpb.js";import{a as R,A}from"./arrow-up-Bv56Dbd2.js";import{N as $}from"./network-Did0WXxt.js";import{T as L}from"./triangle-alert-DlaBoont.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-Dhs13Wlh.js";const P=m("cpu",[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]]),U=m("hard-drive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]),E=m("thermometer",[["path",{d:"M14 4v10.54a4 4 0 1 1-4 0V4a2 2 0 0 1 4 0Z",key:"17jzev"}]]),D=h.hero,G=h.hero,O={warning:80,danger:95},z={warning:85,danger:95},K={warning:70,danger:85},W=[{threshold:30,color:"var(--accent-tertiary)"},{threshold:50,color:"var(--accent-primary)"},{threshold:65,color:"var(--accent-secondary)"},{threshold:80,color:"var(--signal-poor)"}];function I(e,t,s){const a=s-t,r={cold:(30-t)/a*100,normal:(50-t)/a*100,warm:(65-t)/a*100,hot:(80-t)/a*100};return`linear-gradient(to right, ${[{pos:0,color:"var(--accent-tertiary)"},{pos:r.cold,color:"var(--accent-tertiary)"},{pos:r.cold,color:"var(--accent-primary)"},{pos:r.normal,color:"var(--accent-primary)"},{pos:r.normal,color:"var(--accent-secondary)"},{pos:r.warm,color:"var(--accent-secondary)"},{pos:r.warm,color:"var(--signal-poor)"},{pos:r.hot,color:"var(--signal-poor)"},{pos:r.hot,color:"var(--accent-danger)"},{pos:100,color:"var(--accent-danger)"}].map(t=>{const s=e>0?t.pos/e*100:0;return`${t.color} ${Math.min(s,100)}%`}).join(", ")})`}function H(e,t){return e>=t.danger?"danger":e>=t.warning?"warning":"none"}function q(e){let t="none";for(const s of Object.values(e)){const e=H(s,K);if("danger"===e)return"danger";"warning"===e&&(t="warning")}return t}function X(e){let t,s,a;return e>=1073741824?(t=e/1073741824,s="GB/s"):e>=1048576?(t=e/1048576,s="MB/s"):e>=1024?(t=e/1024,s="KB/s"):(t=e,s="B/s"),a=t>=100?t.toFixed(0):t.toFixed(1),`${a} ${s}`}function Y(e){return e>=1073741824?{value:(e/1073741824).toFixed(1),unit:"GiB"}:e>=1048576?{value:(e/1048576).toFixed(1),unit:"MiB"}:e>=1024?{value:(e/1024).toFixed(1),unit:"KiB"}:{value:String(e),unit:"B"}}const Z=e.memo(function({level:e}){return"none"===e?null:t.jsxs("span",{className:s("inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium","danger"===e&&"bg-accent-danger/20 text-accent-danger","warning"===e&&"bg-accent-secondary/20 text-accent-secondary"),children:[t.jsx(L,{className:"w-3 h-3"}),"danger"===e?"High":"Warn"]})}),V=e.memo(function({data:e,color:s,flipped:a=!1,fixedSlots:r}){const n=[...Array(Math.max(0,r-e.length)).fill(0),...e.slice(-r)],l=Math.max(...n,1),c=n.map(e=>0===e?0:Math.max(e/l*100,3));return t.jsx("div",{className:"w-full h-full flex items-end",style:{transform:a?"scaleY(-1)":void 0},children:c.map((e,a)=>t.jsx("div",{className:"flex-1 min-w-0",style:{height:e>0?`${e}%`:"0%",backgroundColor:e>0?s:"transparent"}},a))})}),J=e.memo(function({value:e,max:s=100,width:a=10,color:r="primary"}){const n=Math.min(e/s,1),l=Math.round(n*a),c=a-l,i="■".repeat(l),o="·".repeat(c),m={primary:"text-accent-primary",secondary:"text-accent-secondary",success:"text-accent-success",danger:"text-accent-danger"}[r];return t.jsxs("span",{className:"font-mono text-[10px] tracking-tight",children:[t.jsx("span",{className:m,children:i}),t.jsx("span",{className:"text-text-muted/40",children:o})]})}),Q=e.memo(function({index:e,usage:a}){const r=a>90?"danger":a>70?"secondary":"primary";return t.jsxs("div",{className:"flex items-center gap-1 text-xs font-mono",children:[t.jsxs("span",{className:"text-text-muted w-5",children:["C",e]}),t.jsx(J,{value:a,width:8,color:r}),t.jsxs("span",{className:s("w-7 text-right tabular-nums",a>90?"text-accent-danger":a>70?"text-accent-secondary":"text-accent-success"),children:[a.toFixed(0),"%"]})]})}),ee=e.memo(function({pid:e,name:a,cpu:r,mem:n,isTopCpu:l=!1,isTopMem:c=!1}){return t.jsxs("div",{className:"flex items-center gap-2 py-1 text-sm font-mono hover:bg-subtle-fill -mx-1 px-1 rounded",children:[t.jsx("span",{className:"text-text-muted w-14 tabular-nums",children:e}),t.jsx("span",{className:"flex-1 truncate text-text-primary",children:a}),t.jsx(J,{value:r,max:100,width:6,color:r>50?"danger":r>20?"secondary":"success"}),t.jsx("span",{className:s("w-12 text-right tabular-nums",l?"text-text-primary":r>50?"text-accent-danger":r>20?"text-accent-secondary":"text-text-muted"),children:r.toFixed(1)}),t.jsx("span",{className:s("w-12 text-right tabular-nums",c?"text-text-primary":n>50?"text-accent-danger":n>20?"text-accent-secondary":"text-text-muted"),children:n.toFixed(1)})]})}),te=e.memo(function({value:e,label:s,min:a=20,max:r=100}){const n=Math.min(Math.max((e-a)/(r-a)*100,0),100),l=function(e){return e<30?{text:"Cool",color:"text-accent-tertiary"}:e<50?{text:"Normal",color:"text-accent-primary"}:e<65?{text:"Warm",color:"text-accent-secondary"}:e<80?{text:"Hot",color:"text-signal-poor"}:{text:"Danger",color:"text-accent-danger"}}(e),c=r-a;return t.jsxs("div",{className:"space-y-1.5",children:[t.jsxs("div",{className:"flex justify-between items-center",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:s}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:l.text}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded text-sm font-mono tabular-nums",children:[t.jsx("span",{className:l.color,children:e.toFixed(1)}),t.jsx("span",{className:"text-text-primary",children:"°C"})]})]})]}),t.jsxs("div",{className:"relative h-3 bg-subtle-fill overflow-hidden",children:[t.jsx("div",{className:"absolute inset-y-0 left-0 transition-all duration-300 ease-out",style:{background:I(n,a,r),width:`${n}%`}}),t.jsx("div",{className:"absolute inset-0 flex items-center pointer-events-none",children:W.map(({threshold:e,color:s})=>{const r=(e-a)/c*100;return r<0||r>100?null:t.jsx("div",{className:"absolute w-px h-full",style:{left:`${r}%`,backgroundColor:s}},e)})})]})]})});function se({active:e,payload:s,label:a}){return e&&(null==s?void 0:s.length)?t.jsxs("div",{className:"bg-tooltip-bg border-control radius-inner px-3 py-2 text-sm shadow-xl",children:[t.jsx("div",{className:"font-medium text-text-primary mb-1",children:a}),s.map((e,s)=>t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:e.color}}),t.jsxs("span",{className:"text-text-muted",children:[e.name,":"]}),t.jsxs("span",{className:"text-text-primary tabular-nums",children:[e.value.toFixed(1),"%"]})]},s))]}):null}const ae=e.memo(function({data:e,cpuColor:s,memoryColor:m,chartGridColors:x}){const d=function(e){const t=[],s=Math.max(0,D-e.length),a=Date.now(),r=j.system;for(let l=0;l`${e}%`}),t.jsx(i,{content:t.jsx(se,{})}),t.jsx(o,{type:"stepAfter",dataKey:"cpu",name:"CPU",stroke:"none",fill:s,fillOpacity:1,isAnimationActive:!1,connectNulls:!1}),t.jsx(o,{type:"stepAfter",dataKey:"memory",name:"Memory",stroke:m,strokeWidth:2.5,fill:"none",isAnimationActive:!1,connectNulls:!1})]})})})});function re(){var a;const[r,n]=e.useState(null),[l,c]=e.useState([]),[i,o]=e.useState(!0),[m,g]=e.useState(null),[L,K]=e.useState(!1),[W,I]=e.useState(!1),[J,se]=e.useState([]),[re,ne]=e.useState(0),[le,ce]=e.useState(0),ie=e.useRef(null),oe=x(),me=d(),xe=v(),de=b(),pe=de.primary,ue=de.tertiary,he=function(){const[t,s]=e.useState("undefined"!=typeof window&&window.matchMedia("(max-width: 767px)").matches);return e.useEffect(()=>{const e=window.matchMedia("(max-width: 767px)");s(e.matches);const t=e=>s(e.matches);return e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),t?h.hero:40}(),je=e.useCallback(async()=>{var e;try{const[t,s]=await Promise.all([p(),u()]);if(t.success&&t.data){const e=t.data;n(e),g(null),me(e.cpu.usage_percent,e.memory.usage_percent,D);const s=Date.now(),a={timestamp:s,bytesRecv:e.network.bytes_recv,bytesSent:e.network.bytes_sent};if(ie.current){const e=(s-ie.current.timestamp)/1e3;if(e>0){const t=(a.bytesRecv-ie.current.bytesRecv)/e,s=(a.bytesSent-ie.current.bytesSent)/e;t>=0&&s>=0&&(ne(t),ce(s))}}ie.current=a,se(e=>[...e,a].slice(-G))}else g(t.error??"Failed to fetch hardware stats");s.success&&(null==(e=s.data)?void 0:e.processes)&&c(s.data.processes)}catch(t){g(t instanceof Error?t.message:"Failed to fetch hardware stats")}},[me]);return e.useEffect(()=>{let e=!0,t=null;if((async()=>{e&&(await je(),e&&o(!1))})(),"undefined"==typeof Worker){const t=setInterval(je,j.system);return()=>{e=!1,clearInterval(t)}}{const s=`setInterval(() => postMessage('tick'), ${j.system});`,a=new Blob([s],{type:"application/javascript"});t=new Worker(URL.createObjectURL(a)),t.onmessage=()=>{e&&je()}}return()=>{e=!1,null==t||t.terminate()}},[je]),t.jsxs(N,{children:[t.jsx(w,{title:"System Stats",icon:t.jsx(P,{}),controls:t.jsxs("button",{onClick:async()=>{K(!0),await je(),K(!1)},disabled:L,className:"flex items-center gap-2 px-3 py-1.5 sm:px-4 sm:py-2 bg-bg-subtle hover:bg-bg-elevated radius-inner transition-base text-sm text-text-muted hover:text-text-primary self-start sm:self-auto",children:[t.jsx(_,{className:s("w-4 h-4",L&&"animate-spin")}),"Refresh"]})}),t.jsxs(k,{children:[m&&t.jsx(M,{className:"border border-accent-danger/50 bg-accent-danger/10",children:t.jsx("p",{className:"text-accent-danger",children:m})}),i?t.jsx(M,{className:"p-12 text-center",children:t.jsx("div",{className:"animate-pulse text-text-muted",children:"Loading system stats..."})}):r?t.jsxs(t.Fragment,{children:[t.jsx(C,{template:"hero",children:t.jsxs(M,{children:[t.jsx(F,{icon:t.jsx(T,{}),title:"System Resources",largeTitle:!0,actions:t.jsxs("div",{className:"flex items-center gap-4",children:[(null==(a=r.system)?void 0:a.uptime)&&t.jsx("span",{className:"px-2 py-0.5 bg-white/[0.04] rounded text-sm font-mono tabular-nums text-text-primary",children:y(r.system.uptime)}),t.jsx(Z,{level:H(r.cpu.usage_percent,O)}),t.jsx(Z,{level:H(r.memory.usage_percent,z)}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:"CPU"}),t.jsxs("span",{className:"text-base font-mono font-semibold tabular-nums",style:{color:pe},children:[r.cpu.usage_percent.toFixed(0),"%"]})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:"MEM"}),t.jsxs("span",{className:"text-base font-mono font-semibold tabular-nums",style:{color:ue},children:[r.memory.usage_percent.toFixed(0),"%"]})]})]})}),t.jsx("div",{className:"flex-1 min-h-0 mt-2",children:t.jsx(ae,{data:oe,cpuColor:pe,memoryColor:ue,chartGridColors:xe})}),r.cpu.per_core_percent&&r.cpu.per_core_percent.length>0&&t.jsx("div",{className:"mt-3 pt-3 border-t border-border-subtle",children:t.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 gap-x-3 gap-y-0.5",children:r.cpu.per_core_percent.map((e,s)=>t.jsx(Q,{index:s,usage:e},s))})})]})}),t.jsxs(C,{template:"compact",children:[t.jsx(S,{span:12,md:6,children:t.jsxs(M,{className:"flex flex-col",children:[t.jsx(F,{icon:t.jsx($,{}),title:"Network",largeTitle:!0,actions:t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx(R,{className:"w-3.5 h-3.5",style:{color:ue}}),t.jsx("span",{className:"text-xs font-mono",style:{color:ue},children:"TX"}),t.jsx("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded text-sm font-mono tabular-nums text-text-primary",children:X(le)})]})}),t.jsxs("div",{className:"flex-1 flex flex-col min-h-[80px]",children:[t.jsx("div",{className:"flex-1 min-h-[40px]",children:t.jsx(V,{data:J.map((e,t,s)=>{if(0===t)return 0;const a=(e.timestamp-s[t-1].timestamp)/1e3;return a>0?(e.bytesSent-s[t-1].bytesSent)/a:0}),color:ue,fixedSlots:he})}),t.jsx("div",{className:"flex-1 min-h-[40px]",children:t.jsx(V,{data:J.map((e,t,s)=>{if(0===t)return 0;const a=(e.timestamp-s[t-1].timestamp)/1e3;return a>0?(e.bytesRecv-s[t-1].bytesRecv)/a:0}),color:pe,flipped:!0,fixedSlots:he})})]}),t.jsxs("div",{className:"pt-2 flex justify-between items-center text-sm font-mono",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-text-muted",children:"Total"}),t.jsxs("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded tabular-nums",children:[t.jsx("span",{className:"text-accent-tertiary",children:Y(r.network.bytes_sent).value})," ",t.jsx("span",{className:"text-text-muted",children:Y(r.network.bytes_sent).unit})]}),t.jsxs("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded tabular-nums",children:[t.jsx("span",{className:"text-accent-primary",children:Y(r.network.bytes_recv).value})," ",t.jsx("span",{className:"text-text-muted",children:Y(r.network.bytes_recv).unit})]})]}),t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx(A,{className:"w-3.5 h-3.5",style:{color:pe}}),t.jsx("span",{className:"text-xs font-mono",style:{color:pe},children:"RX"}),t.jsx("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded tabular-nums text-text-primary",children:X(re)})]})]})]})}),t.jsx(S,{span:12,md:6,children:t.jsxs(M,{className:"flex flex-col",children:[t.jsx(F,{icon:t.jsx(E,{}),title:"Temperature",largeTitle:!0,actions:r.temperatures&&t.jsx(Z,{level:q(r.temperatures)})}),t.jsx("div",{className:"flex-1 flex flex-col justify-center min-h-0",children:r.temperatures&&Object.keys(r.temperatures).length>0?t.jsxs("div",{className:"space-y-3",children:[void 0!==r.temperatures.cpu_thermal&&t.jsx(te,{value:r.temperatures.cpu_thermal,label:"CPU",min:20,max:100}),Object.entries(r.temperatures).filter(([e])=>"cpu_thermal"!==e).slice(0,2).map(([e,s])=>t.jsx(te,{value:s,label:e.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),min:20,max:100},e))]}):t.jsxs("div",{className:"flex items-center justify-center text-text-muted text-sm",children:[t.jsx(T,{className:"w-4 h-4 mr-2"}),"No sensors"]})})]})})]}),t.jsxs(C,{template:"compact",children:[t.jsx(S,{span:6,children:t.jsxs(M,{className:"flex flex-col",children:[t.jsx(F,{icon:t.jsx(T,{}),title:"Memory",largeTitle:!0,actions:t.jsxs("span",{className:"px-2 py-0.5 bg-subtle-fill-strong rounded text-base font-mono tabular-nums",style:{color:ue},children:[r.memory.usage_percent.toFixed(0),"%"]})}),t.jsxs("div",{className:"flex-1 flex flex-col justify-center min-h-0",children:[t.jsxs("div",{className:"flex gap-1 h-12",children:[t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-primary",style:{width:`${r.memory.usage_percent}%`}}),t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-tertiary",style:{width:100-r.memory.usage_percent+"%"}})]}),t.jsxs("div",{className:"flex items-center justify-between text-xs font-mono pt-2",children:[t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-primary"}),t.jsx("span",{className:"text-text-muted",children:"Used"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-primary",children:[(r.memory.used/1048576).toFixed(0)," MB"]})]}),t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-tertiary"}),t.jsx("span",{className:"text-text-muted",children:"Avail"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-muted",children:[(r.memory.available/1048576).toFixed(0)," MB"]})]})]})]})]})}),t.jsx(S,{span:6,children:t.jsxs(M,{className:"flex flex-col",children:[t.jsx(F,{icon:t.jsx(U,{}),title:"Disk",largeTitle:!0,actions:t.jsxs("span",{className:"px-2 py-0.5 bg-subtle-fill-strong rounded text-base font-mono tabular-nums",style:{color:pe},children:[r.disk.usage_percent.toFixed(0),"%"]})}),t.jsxs("div",{className:"flex-1 flex flex-col justify-center min-h-0",children:[t.jsxs("div",{className:"flex gap-1 h-12",children:[t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-primary",style:{width:`${r.disk.usage_percent}%`}}),t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-tertiary",style:{width:100-r.disk.usage_percent+"%"}})]}),t.jsxs("div",{className:"flex items-center justify-between text-xs font-mono pt-2",children:[t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-primary"}),t.jsx("span",{className:"text-text-muted",children:"Used"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-primary",children:[(r.disk.used/1073741824).toFixed(1)," GB"]})]}),t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-tertiary"}),t.jsx("span",{className:"text-text-muted",children:"Free"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-muted",children:[(r.disk.free/1073741824).toFixed(1)," GB"]})]})]})]})]})})]}),l.length>0&&t.jsx(C,{template:"auto",children:t.jsx(M,{noPadding:!0,children:t.jsxs("div",{className:"px-4 py-3",children:[t.jsx(F,{icon:t.jsx(T,{}),title:"Processes",largeTitle:!0,actions:t.jsxs("button",{onClick:()=>I(!W),className:"text-xs text-text-muted hover:text-text-primary flex items-center gap-1",children:[W?"Less":"More",W?t.jsx(B,{className:"w-3 h-3"}):t.jsx(f,{className:"w-3 h-3"})]})}),t.jsxs("div",{className:"flex items-center gap-2 py-1.5 text-sm text-text-muted border-b border-border-subtle font-mono",children:[t.jsx("span",{className:"w-14",children:"PID"}),t.jsx("span",{className:"flex-1",children:"Program"}),t.jsx("span",{className:"w-[52px]"}),t.jsx("span",{className:"w-12 text-right",children:"CPU%"}),t.jsx("span",{className:"w-12 text-right",children:"MEM%"})]}),(()=>{const e=l.slice(0,W?10:5),s=Math.max(...e.map(e=>e.cpu_percent)),a=Math.max(...e.map(e=>e.memory_percent));return e.map(e=>t.jsx(ee,{pid:e.pid,name:e.name,cpu:e.cpu_percent,mem:e.memory_percent,isTopCpu:e.cpu_percent===s&&s>0,isTopMem:e.memory_percent===a&&a>0},e.pid))})()]})})})]}):null]})]})}export{re as default}; diff --git a/frontend/dist/assets/System-bU7CQZPd.js b/frontend/dist/assets/System-bU7CQZPd.js new file mode 100644 index 00000000..1a3efa72 --- /dev/null +++ b/frontend/dist/assets/System-bU7CQZPd.js @@ -0,0 +1 @@ +import{r as e,j as t,c as s}from"./vendor-react-Cwum97tW.js";import{c as r,u as a,S as n,aO as o,aP as c,aQ as l,aR as i,aS as m,aT as d,aU as x,aV as u}from"./index-D22MpaCY.js";import{a as h,f as p}from"./useThemeColors-S-uaxvPT.js";import{a as f,P as g,b as y,B as j}from"./PageLayout-B53JpmK1.js";import{T as b}from"./triangle-alert-TfoZuZfW.js";import{C as v}from"./Card-CCBguhJs.js";import{a as w,A as N}from"./arrow-up-DysUUcGL.js";import{N as M}from"./network-Dz5VqBhN.js";import{A as k}from"./activity-Cb8TQBuo.js";import{R}from"./refresh-cw-BtHqSStQ.js";import{R as S,C}from"./Grid-BVGRgue6.js";import"./deckgl-DTsmDcfs.js";import"./vendor-core-CDrKesoV.js";const F=r("cpu",[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]]),T=r("hard-drive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]),_=r("thermometer",[["path",{d:"M14 4v10.54a4 4 0 1 1-4 0V4a2 2 0 0 1 4 0Z",key:"17jzev"}]]),P=n.hero;function B(){const e=getComputedStyle(document.documentElement);return{fontFamily:e.getPropertyValue("--font-data").trim()||'"JetBrains Mono", ui-monospace, monospace',textPrimary:e.getPropertyValue("--text-primary").trim()||"#FFFFFF",textMuted:e.getPropertyValue("--text-muted").trim()||"#727272",gridColor:e.getPropertyValue("--chart-grid").trim()||"rgba(255, 255, 255, 0.06)"}}function $(e){const t=Math.max(0,Math.min(1,e)),s=[{pos:0,color:{r:142,g:78,b:198}},{pos:.25,color:{r:91,g:91,b:214}},{pos:.5,color:{r:0,g:162,b:199}},{pos:.75,color:{r:255,g:178,b:36}},{pos:1,color:{r:229,g:72,b:77}}];let r=s[0],a=s[s.length-1];for(let c=0;c=s[c].pos&&t<=s[c+1].pos){r=s[c],a=s[c+1];break}const n=a.pos-r.pos,o=n>0?(t-r.pos)/n:0;return function(e,t,s){const r=2.2,a=1/r,n=Math.pow(e.r/255,r),o=Math.pow(e.g/255,r),c=Math.pow(e.b/255,r),l=Math.pow(t.r/255,r),i=Math.pow(t.g/255,r),m=Math.pow(t.b/255,r),d=255*Math.pow(n+s*(l-n),a),x=255*Math.pow(o+s*(i-o),a),u=255*Math.pow(c+s*(m-c),a);return{r:Math.round(Math.max(0,Math.min(255,d))),g:Math.round(Math.max(0,Math.min(255,x))),b:Math.round(Math.max(0,Math.min(255,u)))}}(r.color,a.color,o)}const E=e.memo(function({data:s,cpuColor:r,memoryColor:n}){const c=e.useRef(null),l=e.useRef(null),i=e.useRef([]),m=e.useRef(r),d=e.useRef(n),x=e.useRef(null),u=e.useRef(s.length);e.useLayoutEffect(()=>{m.current=r,d.current=n}),e.useEffect(()=>{x.current=B()},[]);const h=e.useMemo(()=>function(e){const t=[],s=Math.max(0,P-e.length),r=Date.now(),a=o.system;for(let o=0;o{i.current=h},[h]);const p=e.useMemo(()=>[h.map(e=>e.timestamp),new Array(h.length).fill(1)],[h]),f=e.useMemo(()=>({hooks:{draw:e=>{const t=x.current||B();!function(e,t,s,r,a){if(0===t.length)return;const n=e.ctx,{left:o,top:c,width:l,height:i}=e.bbox,m=window.devicePixelRatio||1;if(l<=0||i<=0)return;const d=e.data[0],x=d.length;if(0===x)return;const u=d[0],h=d[x-1]-u||1,p=e=>o+(e-u)/h*l,f=e=>{const t=Math.min(Math.max(e/100,0),1);return c+i*(1-t)};n.save(),n.strokeStyle=a.textPrimary,n.globalAlpha=.1,n.lineWidth=1*m,n.setLineDash([4*m,4*m]);for(const w of[25,50,75]){const e=Math.round(f(w))+.5;n.beginPath(),n.moveTo(Math.round(o),e),n.lineTo(Math.round(o+l),e),n.stroke()}n.restore(),n.save(),n.font=`bold ${10*m}px ${a.fontFamily}`,n.fillStyle=a.textMuted,n.textBaseline="middle",n.textAlign="left";const g=8*m;for(const w of[0,25,50,75,100]){const e=f(w),t=Math.max(c+g,Math.min(c+i-g,e));n.fillText(`${w}%`,4*m,t)}n.restore(),n.save();const y=l/x;for(let w=0;w0){const e=t[x-1],s=d[x-1];e&&(n.textAlign="right",n.fillText(e.time,p(s),c+i+6*m))}n.restore()}(e,i.current,m.current,d.current,t)}}}),[]),g=e.useMemo(()=>({width:400,height:240,padding:[8,8,24,36],cursor:{show:!1,x:!1,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,100]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],plugins:[f]}),[f]);return e.useEffect(()=>{const e=c.current;if(!e||0===h.length)return;const t=u.current,r=s.length,n=Math.abs(r-t);if(!(!l.current||n>50||t>0&&n/t>.2)&&l.current)return l.current.setData(p),void(u.current=r);l.current&&l.current.destroy();const o=e.getBoundingClientRect(),i=Math.floor(o.width)||400,m=Math.floor(o.height)||240,d=new a({...g,width:i,height:m},p,e);return l.current=d,u.current=r,()=>{d.destroy(),l.current=null}},[g,p,h.length,s.length]),e.useEffect(()=>{const e=c.current;if(!e)return;const t=new ResizeObserver(e=>{const t=e[0];if(!t||!l.current)return;const{width:s,height:r}=t.contentRect;s>0&&r>0&&l.current.setSize({width:Math.floor(s),height:Math.floor(r)})});return t.observe(e),()=>{t.disconnect()}},[]),e.useEffect(()=>{l.current&&l.current.redraw()},[r,n,h]),0===s.length?t.jsx("div",{className:"h-[240px] flex items-center justify-center text-text-muted",children:"Collecting data..."}):t.jsx("div",{ref:c,className:"w-full h-[240px] rounded-lg overflow-hidden"})});function A(e){const t=Math.max(0,Math.min(1,e)),s=[{pos:0,color:{r:142,g:78,b:198}},{pos:.25,color:{r:91,g:91,b:214}},{pos:.5,color:{r:0,g:162,b:199}},{pos:.75,color:{r:255,g:178,b:36}},{pos:1,color:{r:229,g:72,b:77}}];let r=s[0],a=s[s.length-1];for(let c=0;c=s[c].pos&&t<=s[c+1].pos){r=s[c],a=s[c+1];break}const n=a.pos-r.pos,o=n>0?(t-r.pos)/n:0;return function(e,t,s){const r=2.2,a=1/r,n=Math.pow(e.r/255,r),o=Math.pow(e.g/255,r),c=Math.pow(e.b/255,r),l=Math.pow(t.r/255,r),i=Math.pow(t.g/255,r),m=Math.pow(t.b/255,r),d=255*Math.pow(n+s*(l-n),a),x=255*Math.pow(o+s*(i-o),a),u=255*Math.pow(c+s*(m-c),a);return{r:Math.round(Math.max(0,Math.min(255,d))),g:Math.round(Math.max(0,Math.min(255,x))),b:Math.round(Math.max(0,Math.min(255,u)))}}(r.color,a.color,o)}const D=e.memo(function({data:s,color:r,flipped:n=!1,fixedSlots:o}){const c=e.useRef(null),l=e.useRef(null),i=e.useRef(s),m=e.useRef(r),d=e.useRef(n),x=e.useRef(o);e.useLayoutEffect(()=>{i.current=s,m.current=r,d.current=n,x.current=o});const u=e.useMemo(()=>[Array.from({length:o},(e,t)=>t),new Array(o).fill(1)],[o]),h=e.useMemo(()=>({hooks:{draw:e=>{!function(e,t,s,r,a){const n=e.ctx,{left:o,top:c,width:l,height:i}=e.bbox;if(l<=0||i<=0)return;const m=[...Array(Math.max(0,a-t.length)).fill(0),...t.slice(-a)],d=Math.max(...m,1),x=m.length,u=l/x,h=.03*i;n.save();for(let p=0;p({width:400,height:40,padding:[0,0,0,0],legend:{show:!1},cursor:{show:!1,x:!1,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!1},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1,label:""}],plugins:[h]}),[h]);return e.useEffect(()=>{const e=c.current;if(!e)return;l.current&&l.current.destroy();const t=e.getBoundingClientRect(),s=Math.floor(t.width)||400,r=Math.floor(t.height)||40,n=new a({...p,width:s,height:r},u,e);return l.current=n,()=>{n.destroy(),l.current=null}},[p,u]),e.useEffect(()=>{const e=c.current;if(!e)return;const t=new ResizeObserver(e=>{const t=e[0];if(!t||!l.current)return;const{width:s,height:r}=t.contentRect;s>0&&r>0&&l.current.setSize({width:Math.floor(s),height:Math.floor(r)})});return t.observe(e),()=>{t.disconnect()}},[]),e.useEffect(()=>{l.current&&l.current.redraw()},[s,r,n]),t.jsx("div",{ref:c,className:"w-full h-full"})}),L={warning:80,danger:95},U={warning:85,danger:95},z={warning:70,danger:85},O=[{threshold:30,color:"var(--accent-tertiary)"},{threshold:50,color:"var(--accent-primary)"},{threshold:65,color:"var(--accent-secondary)"},{threshold:80,color:"var(--signal-poor)"}];function H(e,t,s){const r=s-t,a={cold:(30-t)/r*100,normal:(50-t)/r*100,warm:(65-t)/r*100,hot:(80-t)/r*100};return`linear-gradient(to right, ${[{pos:0,color:"var(--accent-tertiary)"},{pos:a.cold,color:"var(--accent-tertiary)"},{pos:a.cold,color:"var(--accent-primary)"},{pos:a.normal,color:"var(--accent-primary)"},{pos:a.normal,color:"var(--accent-secondary)"},{pos:a.warm,color:"var(--accent-secondary)"},{pos:a.warm,color:"var(--signal-poor)"},{pos:a.hot,color:"var(--signal-poor)"},{pos:a.hot,color:"var(--accent-danger)"},{pos:100,color:"var(--accent-danger)"}].map(t=>{const s=e>0?t.pos/e*100:0;return`${t.color} ${Math.min(s,100)}%`}).join(", ")})`}function V(e,t){return e>=t.danger?"danger":e>=t.warning?"warning":"none"}function G(e){let t="none";for(const s of Object.values(e)){const e=V(s,z);if("danger"===e)return"danger";"warning"===e&&(t="warning")}return t}function W(e){let t,s,r;return e>=1073741824?(t=e/1073741824,s="GB/s"):e>=1048576?(t=e/1048576,s="MB/s"):e>=1024?(t=e/1024,s="KB/s"):(t=e,s="B/s"),r=t>=100?t.toFixed(0):t.toFixed(1),`${r} ${s}`}function I(e){return e>=1073741824?{value:(e/1073741824).toFixed(1),unit:"GiB"}:e>=1048576?{value:(e/1048576).toFixed(1),unit:"MiB"}:e>=1024?{value:(e/1024).toFixed(1),unit:"KiB"}:{value:String(e),unit:"B"}}const J=e.memo(function({level:e}){return"none"===e?null:t.jsxs("span",{className:s("inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium","danger"===e&&"bg-accent-danger/20 text-accent-danger","warning"===e&&"bg-accent-secondary/20 text-accent-secondary"),children:[t.jsx(b,{className:"w-3 h-3"}),"danger"===e?"High":"Warn"]})}),K=e.memo(function({value:e,max:s=100,width:r=10,color:a="primary"}){const n=Math.min(e/s,1),o=Math.round(n*r),c=r-o,l="■".repeat(o),i="·".repeat(c),m={primary:"text-accent-primary",secondary:"text-accent-secondary",success:"text-accent-success",danger:"text-accent-danger"}[a];return t.jsxs("span",{className:"font-mono text-[10px] tracking-tight",children:[t.jsx("span",{className:m,children:l}),t.jsx("span",{className:"text-text-muted/40",children:i})]})}),X=e.memo(function({index:e,usage:r}){const a=r>90?"danger":r>70?"secondary":"primary";return t.jsxs("div",{className:"flex items-center gap-1 text-xs font-mono",children:[t.jsxs("span",{className:"text-text-muted w-5",children:["C",e]}),t.jsx(K,{value:r,width:8,color:a}),t.jsxs("span",{className:s("w-7 text-right tabular-nums",r>90?"text-accent-danger":r>70?"text-accent-secondary":"text-accent-success"),children:[r.toFixed(0),"%"]})]})}),q=e.memo(function({pid:e,name:r,cpu:a,mem:n,isTopCpu:o=!1,isTopMem:c=!1}){return t.jsxs("div",{className:"flex items-center gap-2 py-1 text-sm font-mono hover:bg-subtle-fill -mx-1 px-1 rounded",children:[t.jsx("span",{className:"text-text-muted w-14 tabular-nums",children:e}),t.jsx("span",{className:"flex-1 truncate text-text-primary",children:r}),t.jsx(K,{value:a,max:100,width:6,color:a>50?"danger":a>20?"secondary":"success"}),t.jsx("span",{className:s("w-12 text-right tabular-nums",o?"text-text-primary":a>50?"text-accent-danger":a>20?"text-accent-secondary":"text-text-muted"),children:a.toFixed(1)}),t.jsx("span",{className:s("w-12 text-right tabular-nums",c?"text-text-primary":n>50?"text-accent-danger":n>20?"text-accent-secondary":"text-text-muted"),children:n.toFixed(1)})]})}),Q=e.memo(function({value:e,label:s,min:r=20,max:a=100}){const n=Math.min(Math.max((e-r)/(a-r)*100,0),100),o=function(e){return e<30?{text:"Cool",color:"text-accent-tertiary"}:e<50?{text:"Normal",color:"text-accent-primary"}:e<65?{text:"Warm",color:"text-accent-secondary"}:e<80?{text:"Hot",color:"text-signal-poor"}:{text:"Danger",color:"text-accent-danger"}}(e),c=a-r;return t.jsxs("div",{className:"space-y-1.5",children:[t.jsxs("div",{className:"flex justify-between items-center",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:s}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:o.text}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded text-sm font-mono tabular-nums",children:[t.jsx("span",{className:o.color,children:e.toFixed(1)}),t.jsx("span",{className:"text-text-primary",children:"°C"})]})]})]}),t.jsxs("div",{className:"relative h-3 bg-subtle-fill overflow-hidden",children:[t.jsx("div",{className:"absolute inset-y-0 left-0 transition-all duration-300 ease-out",style:{background:H(n,r,a),width:`${n}%`}}),t.jsx("div",{className:"absolute inset-0 flex items-center pointer-events-none",children:O.map(({threshold:e,color:s})=>{const a=(e-r)/c*100;return a<0||a>100?null:t.jsx("div",{className:"absolute w-px h-full",style:{left:`${a}%`,backgroundColor:s}},e)})})]})]})});e.memo(function({data:e,color:s,flipped:r=!1,fixedSlots:a}){const n=[...Array(Math.max(0,a-e.length)).fill(0),...e.slice(-a)],o=Math.max(...n,1),c=n.map(e=>0===e?0:Math.max(e/o*100,3));return t.jsx("div",{className:"w-full h-full flex items-end",style:{transform:r?"scaleY(-1)":void 0},children:c.map((e,r)=>t.jsx("div",{className:"flex-1 min-w-0",style:{height:e>0?`${e}%`:"0%",backgroundColor:e>0?s:"transparent"}},r))})});const Y=e.memo(function({networkHistory:e,txRate:s,rxRate:r,totalBytesSent:a,totalBytesRecv:n,cpuColor:o,memoryColor:c,networkSlots:l}){return t.jsxs(f,{className:"flex flex-col",children:[t.jsx(v,{icon:t.jsx(M,{}),title:"Network",largeTitle:!0,actions:t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx(w,{className:"w-3.5 h-3.5",style:{color:c}}),t.jsx("span",{className:"text-xs font-mono",style:{color:c},children:"TX"}),t.jsx("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded text-sm font-mono tabular-nums text-text-primary",children:W(s)})]})}),t.jsxs("div",{className:"flex flex-col h-[120px]",children:[t.jsx("div",{className:"h-[60px]",children:t.jsx(D,{data:e.map((e,t,s)=>{if(0===t)return 0;const r=(e.timestamp-s[t-1].timestamp)/1e3;return r>0?(e.bytesSent-s[t-1].bytesSent)/r:0}),color:c,fixedSlots:l})}),t.jsx("div",{className:"h-[60px]",children:t.jsx(D,{data:e.map((e,t,s)=>{if(0===t)return 0;const r=(e.timestamp-s[t-1].timestamp)/1e3;return r>0?(e.bytesRecv-s[t-1].bytesRecv)/r:0}),color:o,flipped:!0,fixedSlots:l})})]}),t.jsxs("div",{className:"pt-2 flex justify-between items-center text-sm font-mono",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-text-muted",children:"Total"}),t.jsxs("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded tabular-nums",children:[t.jsx("span",{className:"text-accent-tertiary",children:I(a).value})," ",t.jsx("span",{className:"text-text-muted",children:I(a).unit})]}),t.jsxs("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded tabular-nums",children:[t.jsx("span",{className:"text-accent-primary",children:I(n).value})," ",t.jsx("span",{className:"text-text-muted",children:I(n).unit})]})]}),t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx(N,{className:"w-3.5 h-3.5",style:{color:o}}),t.jsx("span",{className:"text-xs font-mono",style:{color:o},children:"RX"}),t.jsx("span",{className:"px-2 py-1 bg-subtle-fill-strong rounded tabular-nums text-text-primary",children:W(r)})]})]})]})}),Z=e.memo(function({temperatures:e}){return t.jsxs(f,{className:"flex flex-col",children:[t.jsx(v,{icon:t.jsx(_,{}),title:"Temperature",largeTitle:!0,actions:e&&t.jsx(J,{level:G(e)})}),t.jsx("div",{className:"flex-1 flex flex-col justify-center min-h-0",children:e&&Object.keys(e).length>0?t.jsxs("div",{className:"space-y-3",children:[void 0!==e.cpu_thermal&&t.jsx(Q,{value:e.cpu_thermal,label:"CPU",min:20,max:100}),Object.entries(e).filter(([e])=>"cpu_thermal"!==e).slice(0,2).map(([e,s])=>t.jsx(Q,{value:s,label:e.replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase()),min:20,max:100},e))]}):t.jsxs("div",{className:"flex items-center justify-center text-text-muted text-sm",children:[t.jsx(k,{className:"w-4 h-4 mr-2"}),"No sensors"]})})]})}),ee=e.memo(function({usagePercent:e,used:s,available:r,memoryColor:a}){return t.jsxs(f,{className:"flex flex-col",children:[t.jsx(v,{icon:t.jsx(k,{}),title:"Memory",largeTitle:!0,actions:t.jsxs("span",{className:"px-2 py-0.5 bg-subtle-fill-strong rounded text-base font-mono tabular-nums",style:{color:a},children:[e.toFixed(0),"%"]})}),t.jsxs("div",{className:"flex-1 flex flex-col justify-center min-h-0",children:[t.jsxs("div",{className:"flex gap-1 h-12",children:[t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-primary",style:{width:`${e}%`}}),t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-tertiary",style:{width:100-e+"%"}})]}),t.jsxs("div",{className:"flex items-center justify-between text-xs font-mono pt-2",children:[t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-primary"}),t.jsx("span",{className:"text-text-muted",children:"Used"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-primary",children:[(s/1048576).toFixed(0)," MB"]})]}),t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-tertiary"}),t.jsx("span",{className:"text-text-muted",children:"Avail"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-muted",children:[(r/1048576).toFixed(0)," MB"]})]})]})]})]})}),te=e.memo(function({usagePercent:e,used:s,free:r,cpuColor:a}){return t.jsxs(f,{className:"flex flex-col",children:[t.jsx(v,{icon:t.jsx(T,{}),title:"Disk",largeTitle:!0,actions:t.jsxs("span",{className:"px-2 py-0.5 bg-subtle-fill-strong rounded text-base font-mono tabular-nums",style:{color:a},children:[e.toFixed(0),"%"]})}),t.jsxs("div",{className:"flex-1 flex flex-col justify-center min-h-0",children:[t.jsxs("div",{className:"flex gap-1 h-12",children:[t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-primary",style:{width:`${e}%`}}),t.jsx("div",{className:"h-full transition-all duration-300 bg-accent-tertiary",style:{width:100-e+"%"}})]}),t.jsxs("div",{className:"flex items-center justify-between text-xs font-mono pt-2",children:[t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-primary"}),t.jsx("span",{className:"text-text-muted",children:"Used"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-primary",children:[(s/1073741824).toFixed(1)," GB"]})]}),t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("div",{className:"w-2.5 h-2.5 rounded-sm bg-accent-tertiary"}),t.jsx("span",{className:"text-text-muted",children:"Free"}),t.jsxs("span",{className:"px-1.5 py-0.5 bg-subtle-fill-strong rounded tabular-nums text-text-muted",children:[(r/1073741824).toFixed(1)," GB"]})]})]})]})]})}),se=e.memo(function({processes:e}){if(0===e.length)return null;const s=e.slice(0,10),r=Math.max(...s.map(e=>e.cpu_percent)),a=Math.max(...s.map(e=>e.memory_percent));return t.jsx(f,{noPadding:!0,children:t.jsxs("div",{className:"px-4 py-3",children:[t.jsx(v,{icon:t.jsx(k,{}),title:"Processes",largeTitle:!0}),t.jsxs("div",{className:"flex items-center gap-2 py-1.5 text-sm text-text-muted border-b border-border-subtle font-mono",children:[t.jsx("span",{className:"w-14",children:"PID"}),t.jsx("span",{className:"flex-1",children:"Program"}),t.jsx("span",{className:"w-[52px]"}),t.jsx("span",{className:"w-12 text-right",children:"CPU%"}),t.jsx("span",{className:"w-12 text-right",children:"MEM%"})]}),s.map(e=>t.jsx(q,{pid:e.pid,name:e.name,cpu:e.cpu_percent,mem:e.memory_percent,isTopCpu:e.cpu_percent===r&&r>0,isTopMem:e.memory_percent===a&&a>0},e.pid))]})})}),re=n.hero;function ae(){var r;const a=c(),o=l(),b=i(),w=m(),N=d(),[M,T]=e.useState([]),[_,P]=e.useState(!1),[B,$]=e.useState([]),[A,D]=e.useState(0),[z,O]=e.useState(0),H=e.useRef(null),G=h().primary,W=p().amber,I=function(){const[t,s]=e.useState("undefined"!=typeof window&&window.matchMedia("(max-width: 767px)").matches);return e.useEffect(()=>{const e=window.matchMedia("(max-width: 767px)");s(e.matches);const t=e=>s(e.matches);return e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),t?n.hero:40}();return e.useEffect(()=>{if(!a)return;const e=Date.now(),t={timestamp:e,bytesRecv:a.network.bytes_recv,bytesSent:a.network.bytes_sent};if(H.current){const s=(e-H.current.timestamp)/1e3;if(s>0){const e=(t.bytesRecv-H.current.bytesRecv)/s,r=(t.bytesSent-H.current.bytesSent)/s;e>=0&&r>=0&&(D(e),O(r))}}H.current=t,$(e=>[...e,t].slice(-re))},[a]),e.useEffect(()=>{let e=!0;const t=async()=>{var t;const s=await u();e&&s.success&&(null==(t=s.data)?void 0:t.processes)&&T(s.data.processes)};t();const s=setInterval(t,5e3);return()=>{e=!1,clearInterval(s)}},[]),t.jsxs(g,{children:[t.jsx(y,{title:"System Stats",icon:t.jsx(F,{}),controls:t.jsxs("button",{onClick:async()=>{var e;P(!0),await w();const t=await u();t.success&&(null==(e=t.data)?void 0:e.processes)&&T(t.data.processes),P(!1)},disabled:_,className:"flex items-center gap-2 px-3 py-1.5 sm:px-4 sm:py-2 bg-bg-subtle hover:bg-bg-elevated radius-inner transition-base text-sm text-text-muted hover:text-text-primary self-start sm:self-auto",children:[t.jsx(R,{className:s("w-4 h-4",_&&"animate-spin")}),"Refresh"]})}),t.jsxs(j,{children:[b&&t.jsx(f,{className:"border border-accent-danger/50 bg-accent-danger/10",children:t.jsx("p",{className:"text-accent-danger",children:b})}),o?t.jsx(f,{className:"p-12 text-center",children:t.jsx("div",{className:"animate-pulse text-text-muted",children:"Loading system stats..."})}):a?t.jsxs(t.Fragment,{children:[t.jsx(S,{template:"hero",children:t.jsxs(f,{children:[t.jsx(v,{icon:t.jsx(k,{}),title:"System Resources",largeTitle:!0,actions:t.jsxs("div",{className:"flex items-center gap-4",children:[(null==(r=a.system)?void 0:r.uptime)&&t.jsx("span",{className:"px-2 py-0.5 bg-white/[0.04] rounded text-sm font-mono tabular-nums text-text-primary",children:x(a.system.uptime)}),t.jsx(J,{level:V(a.cpu.usage_percent,L)}),t.jsx(J,{level:V(a.memory.usage_percent,U)}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:"CPU"}),t.jsxs("span",{className:"text-base font-mono font-semibold tabular-nums",style:{color:G},children:[a.cpu.usage_percent.toFixed(0),"%"]})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-sm font-mono text-text-muted",children:"MEM"}),t.jsxs("span",{className:"text-base font-mono font-semibold tabular-nums",style:{color:W},children:[a.memory.usage_percent.toFixed(0),"%"]})]})]})}),t.jsx("div",{className:"flex-1 min-h-0 mt-2",children:t.jsx(E,{data:N,cpuColor:G,memoryColor:W})}),a.cpu.per_core_percent&&a.cpu.per_core_percent.length>0&&t.jsx("div",{className:"mt-3 pt-3 border-t border-border-subtle",children:t.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 gap-x-3 gap-y-0.5",children:a.cpu.per_core_percent.map((e,s)=>t.jsx(X,{index:s,usage:e},s))})})]})}),t.jsxs(S,{template:"compact",children:[t.jsx(C,{span:12,md:6,children:t.jsx(Y,{networkHistory:B,txRate:z,rxRate:A,totalBytesSent:a.network.bytes_sent,totalBytesRecv:a.network.bytes_recv,cpuColor:G,memoryColor:W,networkSlots:I})}),t.jsx(C,{span:12,md:6,children:t.jsx(Z,{temperatures:a.temperatures})})]}),t.jsxs(S,{template:"compact",children:[t.jsx(C,{span:6,children:t.jsx(ee,{usagePercent:a.memory.usage_percent,used:a.memory.used,available:a.memory.available,memoryColor:W})}),t.jsx(C,{span:6,children:t.jsx(te,{usagePercent:a.disk.usage_percent,used:a.disk.used,free:a.disk.free,cpuColor:G})})]}),t.jsx(S,{template:"auto",children:t.jsx(se,{processes:M})})]}):null]})]})}export{ae as default}; diff --git a/frontend/dist/assets/Terminal-4b8EQwTz.js b/frontend/dist/assets/Terminal-4b8EQwTz.js deleted file mode 100644 index d6e0ebb2..00000000 --- a/frontend/dist/assets/Terminal-4b8EQwTz.js +++ /dev/null @@ -1 +0,0 @@ -import{r as e,j as t,c as a}from"./vendor-react-DFCqJxYC.js";import{b9 as r,a1 as s,a4 as n,ba as o,Y as i,j as l,q as c,n as d,bb as p,bc as m,bd as u,be as y,bf as g,bg as h,bh as f}from"./index-CZBrdv20.js";import{a as v}from"./ping-DAjkGztv.js";import{c as b}from"./vendor-core-Dhs13Wlh.js";import{P as x}from"./packet-CCmg5Y4j.js";import{P as w,b as _,B as S,a as O}from"./PageLayout-Dz1NyqHa.js";import"./deckgl-DTsmDcfs.js";function k(){const e=new Date;return`${e.toISOString().slice(0,10)}_${e.toTimeString().slice(0,8).replace(/:/g,"-")}`}function $(e,t){return`pymc-${e.toISOString().slice(0,10)}-${e.toTimeString().slice(0,5).replace(":","")}-${t}s.json`}const P=b((e,t)=>({isCapturing:!1,captureStartTime:null,captureStartPacketHashes:new Set,captureTimer:null,reports:[],startCapture:a=>{const{captureTimer:r}=t();r&&clearTimeout(r),e({isCapturing:!0,captureStartTime:new Date,captureStartPacketHashes:new Set(a.map(e=>e.packet_hash))})},stopCapture:a=>{const{isCapturing:r,captureStartTime:s,captureStartPacketHashes:n,captureTimer:o}=t();if(!r||!s)return null;o&&clearTimeout(o);const i=new Date,l=Math.round((i.getTime()-s.getTime())/1e3),c=s.getTime()/1e3,d=a.filter(e=>!n.has(e.packet_hash)&&e.timestamp>=c).sort((e,t)=>e.timestamp-t.timestamp),p={id:k(),filename:$(s,l),startTime:s,endTime:i,durationSec:l,packetCount:d.length,packets:d,sizeBytes:500*d.length};return e(e=>({isCapturing:!1,captureStartTime:null,captureStartPacketHashes:new Set,captureTimer:null,reports:[p,...e.reports].slice(0,10)})),p},getReport:e=>t().reports.find(t=>t.id===e),_setTimer:t=>e({captureTimer:t})}));function C(e){var t;return(null==(t=e.match(/.{1,2}/g))?void 0:t.join(" ").toUpperCase())||""}function T(e){return void 0===e?"UNKNOWN":l[e]??`TYPE_${e}`}function E(e){return void 0===e?"UNKNOWN":i[e]??`ROUTE_${e}`}function N(e,t){switch(e){case 4:return function(e){const t=[];let a=0;if(e.length>=32&&(t.push({name:"public_key",offset:a,length:32,bytes:C(o(e.slice(a,a+32))),decoded:{value:o(e.slice(a,a+32))}}),a+=32),e.length>=a+4){const r=e.slice(a,a+4),s=r[0]|r[1]<<8|r[2]<<16|r[3]<<24;t.push({name:"timestamp",offset:a,length:4,bytes:C(o(r)),decoded:{value:s>>>0,iso:new Date(1e3*s).toISOString()}}),a+=4}if(e.length>=a+64&&(t.push({name:"signature",offset:a,length:64,bytes:C(o(e.slice(a,a+64))),decoded:{value:o(e.slice(a,a+64))}}),a+=64),e.length>a){const r=e[a],s=[];if(1&r&&s.push("CHAT_NODE"),2&r&&s.push("REPEATER"),3&r&&s.push("ROOM_SERVER"),16&r&&s.push("HAS_LOCATION"),128&r&&s.push("HAS_NAME"),t.push({name:"flags",offset:a,length:1,bytes:C(o(e.slice(a,a+1))),decoded:{value:r,binary:r.toString(2).padStart(8,"0"),flags:s}}),a+=1,16&r&&e.length>=a+8){const r=e.slice(a,a+8),s=new ArrayBuffer(8);new Uint8Array(s).set(r);const n=new DataView(s),i=n.getInt32(0,!0),l=n.getInt32(4,!0);t.push({name:"location",offset:a,length:8,bytes:C(o(r)),decoded:{lat_raw:i,lon_raw:l,latitude:i/1e6,longitude:l/1e6}}),a+=8}if(128&r&&e.length>a){const r=e.slice(a);let s=r.indexOf(0);-1===s&&(s=r.length);const n=(new TextDecoder).decode(r.slice(0,s));t.push({name:"name",offset:a,length:s+(0===r[s]?1:0),bytes:C(o(r.slice(0,s+1))),decoded:{value:n,encoding:"utf-8",null_terminated:0===r[s]}})}}return t}(t);case 3:return function(e){if(e.length<4)return[];const t=e.slice(0,4),a=t[0]|t[1]<<8|t[2]<<16|t[3]<<24;return[{name:"crc",offset:0,length:4,bytes:C(o(t)),decoded:{value:a>>>0,hex:(a>>>0).toString(16).toUpperCase().padStart(8,"0"),note:"CRC of the acknowledged packet (little-endian)"}}]}(t);case 9:return function(e){const t=[];if(e.length<9)return t;const a=e.slice(0,4),r=a[0]|a[1]<<8|a[2]<<16|a[3]<<24;t.push({name:"trace_tag",offset:0,length:4,bytes:C(o(a)),decoded:{value:r>>>0,hex:(r>>>0).toString(16).toUpperCase().padStart(8,"0")}});const s=e.slice(4,8),n=s[0]|s[1]<<8|s[2]<<16|s[3]<<24;if(t.push({name:"auth_code",offset:4,length:4,bytes:C(o(s)),decoded:{value:n>>>0}}),t.push({name:"flags",offset:8,length:1,bytes:C(o(e.slice(8,9))),decoded:{value:e[8],binary:e[8].toString(2).padStart(8,"0")}}),e.length>9){const a=e.slice(9),r=Array.from(a).map(e=>e.toString(16).toUpperCase().padStart(2,"0"));t.push({name:"target_path",offset:9,length:a.length,bytes:C(o(a)),decoded:{hops:r,path_string:r.join("->")}})}return t}(t);case 8:return function(e){if(0===e.length)return[];const t=Array.from(e).map(e=>e.toString(16).toUpperCase().padStart(2,"0"));return[{name:"path_hops",offset:0,length:e.length,bytes:C(o(e)),decoded:{hops:t,path_string:t.join("->")}}]}(t);case 5:return function(e){const t=[];if(e.length<1)return t;if(t.push({name:"channel_hash",offset:0,length:1,bytes:C(o(e.slice(0,1))),decoded:{value:e[0].toString(16).toUpperCase().padStart(2,"0")}}),e.length>13){const a=12,r=e.length-1-a;t.push({name:"ciphertext",offset:1,length:r,bytes:C(o(e.slice(1,1+r))),decoded:{length:r,note:"Encrypted message content"}}),t.push({name:"mac",offset:1+r,length:a,bytes:C(o(e.slice(-a))),decoded:{note:"Message authentication code"}})}return t}(t);default:return function(e){return 0===e.length?[]:[{name:"raw_data",offset:0,length:e.length,bytes:C(o(e)),decoded:{length:e.length}}]}(t)}}function j(e){const t=e.type??e.payload_type??0,a=e.route??e.route_type??0,r=e.raw_packet||"";let i,l=null;if(r){const t=x.fromHex(r);if(t.success&&t.packet){const e=t.packet;try{l=s(e)}catch{l=null}const a=n(r);let c=0;const d={offset:0,length:1,bytes:C(r.slice(0,2)),decoded:{route_type:e.routeType,route_name:e.routeTypeName,payload_type:e.payloadType,payload_name:e.payloadTypeName,version:e.payloadVersion}};c+=1,e.hasTransportCodes()&&(c+=4);const p={offset:c,length:1,bytes:C(o(a.slice(c,c+1))),decoded:{value:e.pathLen}};c+=1;const m=c,u=a.slice(c,c+e.pathLen),y=Array.from(e.path).map(e=>e.toString(16).toUpperCase().padStart(2,"0")),g=9===e.payloadType,h={offset:m,length:e.pathLen,bytes:C(o(u)),decoded:{hops:y,path_string:y.length>0?y.join("->"):"(direct)",...g&&{note:"For TRACE packets, path bytes are SNR×4 values, not node hashes",snr_values:Array.from(e.path).map(e=>{let t=e;return t>127&&(t-=256),t/4})}}};c+=e.pathLen,i={header:d,path_length:p,path:h,payload:{offset:c,length:e.payload.length,bytes:C(e.payloadHex),sections:N(e.payloadType,e.payload)}}}else i=D(e)}else i=D(e);return{timestamp:e.timestamp,packet_hash:e.packet_hash,type:t,type_name:T(t),route:a,route_name:E(a),rssi:e.rssi,snr:e.snr,length:e.length??0,src_hash:e.src_hash,dst_hash:e.dst_hash,transmitted:e.transmitted,drop_reason:e.drop_reason,is_duplicate:e.is_duplicate,lbt_attempts:e.lbt_attempts,lbt_backoff_delays_ms:e.lbt_backoff_delays_ms,lbt_channel_busy:e.lbt_channel_busy,raw_packet:r,structure:i,decoded:l}}function D(e){var t;const a=e.type??e.payload_type??0,r=e.route??e.route_type??0,s=e.original_path??e.forwarded_path??[];return{header:{offset:0,length:1,bytes:"??",decoded:{route_type:r,route_name:E(r),payload_type:a,payload_name:T(a),version:0}},path_length:{offset:1,length:1,bytes:s.length.toString(16).toUpperCase().padStart(2,"0"),decoded:{value:s.length}},path:{offset:2,length:s.length,bytes:s.join(" "),decoded:{hops:s,path_string:s.length>0?s.join("->"):"(direct)"}},payload:{offset:2+s.length,length:(null==(t=e.payload)?void 0:t.length)??0,bytes:e.payload??"",sections:e.payload?N(a,n(e.payload)):[]}}}function R(e,t){const a=function(e,t){var a;return{capture:{start:e.startTime.toISOString(),end:e.endTime.toISOString(),duration_sec:e.durationSec,packet_count:e.packetCount,node_name:(null==t?void 0:t.node_name)??"unknown",local_hash:(null==t?void 0:t.local_hash)??"unknown",pymc_console_version:r,pymc_repeater_version:(null==t?void 0:t.version)??"unknown",radio_config:(null==(a=null==t?void 0:t.config)?void 0:a.radio)?{frequency:t.config.radio.frequency,tx_power:t.config.radio.tx_power,bandwidth:t.config.radio.bandwidth,spreading_factor:t.config.radio.spreading_factor}:null},packets:e.packets.map(j)}}(e,t),s=JSON.stringify(a,null,2),n=new Blob([s],{type:"application/json"}),o=URL.createObjectURL(n),i=document.createElement("a");i.href=o,i.download=e.filename,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o)}function I(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}const G=b(e=>({entries:[],commandHistory:[],isInitialized:!1,addEntry:t=>{const a="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),r={...t,id:a,timestamp:Date.now()};return e(e=>({entries:[...e.entries,r]})),a},updateEntry:(t,a)=>{e(e=>({entries:e.entries.map(e=>e.id===t?{...e,...a}:e)}))},addCommand:t=>{e(e=>({commandHistory:[...e.commandHistory,t]}))},clearEntries:()=>{e({entries:[],commandHistory:[]})},setInitialized:t=>{e({isInitialized:t})}})),A=new Set(["start ota","erase","reboot"]),L=["gps","sensor"],W=[{cmd:"help",desc:"Show available commands"},{cmd:"clear",desc:"Clear terminal screen"},{cmd:"status",desc:"Get repeater status summary"},{cmd:"uptime",desc:"Show system uptime"},{cmd:"packets",desc:"Show packet statistics"},{cmd:"board",desc:"Show board/platform info"},{cmd:"ping",desc:"Ping neighbor (name or 0xXX)",params:"{target} [timeout]",required:!0},{cmd:"convert hex",desc:"Hex → base64 (for config.yaml)",params:"{hex}",required:!0},{cmd:"convert base64",desc:"Base64 → hex",params:"{base64}",required:!0},{cmd:"cap",desc:"Show capture help"},{cmd:"start cap",desc:"Start packet capture (default 120s)",params:"[seconds]"},{cmd:"end cap",desc:"Stop current capture"},{cmd:"list cap",desc:"List capture reports (clickable download)"},{cmd:"export cap",desc:"Download a capture report",params:"{id}"},...[{name:"get adc.multiplier",category:"get",params:[],description:"Get ADC multiplier for battery",serialOnly:!1,hasParam:!1},{name:"get advert.interval",category:"get",params:[],description:"Get local advert interval (minutes)",serialOnly:!1,hasParam:!1},{name:"get af",category:"get",params:[],description:"Get airtime factor",serialOnly:!1,hasParam:!1},{name:"get agc.reset.interval",category:"get",params:[],description:"Get AGC reset interval (seconds)",serialOnly:!1,hasParam:!1},{name:"get allow.read.only",category:"get",params:[],description:"Get read-only access setting",serialOnly:!1,hasParam:!1},{name:"get bridge.baud",category:"get",params:[],description:"Get bridge baud rate",serialOnly:!1,hasParam:!1},{name:"get bridge.channel",category:"get",params:[],description:"Get bridge channel (ESP-NOW)",serialOnly:!1,hasParam:!1},{name:"get bridge.delay",category:"get",params:[],description:"Get bridge delay (ms)",serialOnly:!1,hasParam:!1},{name:"get bridge.enabled",category:"get",params:[],description:"Get bridge enabled status",serialOnly:!1,hasParam:!1},{name:"get bridge.secret",category:"get",params:[],description:"Get bridge encryption secret",serialOnly:!1,hasParam:!1},{name:"get bridge.source",category:"get",params:[],description:"Get bridge packet source",serialOnly:!1,hasParam:!1},{name:"get bridge.type",category:"get",params:[],description:"Get bridge type (rs232/espnow/none)",serialOnly:!1,hasParam:!1},{name:"get direct.txdelay",category:"get",params:[],description:"Get direct TX delay factor",serialOnly:!1,hasParam:!1},{name:"get flood.advert.interval",category:"get",params:[],description:"Get flood advert interval (hours)",serialOnly:!1,hasParam:!1},{name:"get flood.max",category:"get",params:[],description:"Get max flood hops",serialOnly:!1,hasParam:!1},{name:"get freq",category:"get",params:[],description:"Get frequency (MHz)",serialOnly:!1,hasParam:!1},{name:"get guest.password",category:"get",params:[],description:"Get guest password",serialOnly:!1,hasParam:!1},{name:"get int.thresh",category:"get",params:[],description:"Get interference threshold",serialOnly:!1,hasParam:!1},{name:"get lat",category:"get",params:[],description:"Get latitude",serialOnly:!1,hasParam:!1},{name:"get lon",category:"get",params:[],description:"Get longitude",serialOnly:!1,hasParam:!1},{name:"get multi.acks",category:"get",params:[],description:"Get multi-ack setting",serialOnly:!1,hasParam:!1},{name:"get name",category:"get",params:[],description:"Get node name",serialOnly:!1,hasParam:!1},{name:"get prv.key",category:"get",params:[],description:"Get private key (hex)",serialOnly:!1,hasParam:!1},{name:"get public.key",category:"get",params:[],description:"Get public key (hex)",serialOnly:!1,hasParam:!1},{name:"get radio",category:"get",params:[],description:"Get radio params (freq,bw,sf,cr)",serialOnly:!1,hasParam:!1},{name:"get repeat",category:"get",params:[],description:"Get repeat/forward status (on/off)",serialOnly:!1,hasParam:!1},{name:"get role",category:"get",params:[],description:"Get device role",serialOnly:!1,hasParam:!1},{name:"get rxdelay",category:"get",params:[],description:"Get RX delay base",serialOnly:!1,hasParam:!1},{name:"get tx",category:"get",params:[],description:"Get TX power (dBm)",serialOnly:!1,hasParam:!1},{name:"get txdelay",category:"get",params:[],description:"Get TX delay factor",serialOnly:!1,hasParam:!1},{name:"gps",category:"gps",params:[],description:"Show GPS status",serialOnly:!1,hasParam:!1},{name:"gps advert",category:"gps",params:[],description:"Get/set GPS advert location policy",serialOnly:!1,hasParam:!0},{name:"gps off",category:"gps",params:[],description:"Disable GPS",serialOnly:!1,hasParam:!0},{name:"gps on",category:"gps",params:[],description:"Enable GPS",serialOnly:!1,hasParam:!0},{name:"gps setloc",category:"gps",params:[],description:"Set node location from GPS",serialOnly:!1,hasParam:!0},{name:"gps sync",category:"gps",params:[],description:"Sync time from GPS",serialOnly:!1,hasParam:!0},{name:"log",category:"logging",params:[],description:"Dump log file (serial only)",serialOnly:!0,hasParam:!1},{name:"log erase",category:"logging",params:[],description:"Erase log file",serialOnly:!1,hasParam:!0},{name:"log start",category:"logging",params:[],description:"Start packet logging",serialOnly:!1,hasParam:!0},{name:"log stop",category:"logging",params:[],description:"Stop packet logging",serialOnly:!1,hasParam:!0},{name:"neighbor.remove",category:"neighbor",params:[],description:"Remove neighbor by pubkey",serialOnly:!1,hasParam:!0},{name:"neighbors",category:"neighbor",params:[],description:"List neighbors",serialOnly:!1,hasParam:!1},{name:"get",category:"other",params:[],description:"Execute get command",serialOnly:!1,hasParam:!0},{name:"set",category:"other",params:[{name:"value",type:"float"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Execute set command",serialOnly:!1,hasParam:!0},{name:"tempradio",category:"radio",params:[{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Apply temporary radio params (freq bw sf cr timeout_mins)",serialOnly:!1,hasParam:!0},{name:"sensor get",category:"sensor",params:[],description:"Get sensor/custom variable value",serialOnly:!1,hasParam:!0},{name:"sensor list",category:"sensor",params:[{name:"value",type:"int"}],description:"List all sensor/custom variables",serialOnly:!1,hasParam:!0},{name:"sensor set",category:"sensor",params:[],description:"Set sensor/custom variable value",serialOnly:!1,hasParam:!0},{name:"set adc.multiplier",category:"set",params:[{name:"value",type:"float"}],description:"Set ADC multiplier",serialOnly:!1,hasParam:!0},{name:"set advert.interval",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"string"}],description:"Set local advert interval (1-10080 min, 0=off)",serialOnly:!1,hasParam:!0},{name:"set af",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set airtime factor (0-9)",serialOnly:!1,hasParam:!0},{name:"set agc.reset.interval",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set AGC reset interval (seconds, rounded to 4)",serialOnly:!1,hasParam:!0},{name:"set allow.read.only",category:"set",params:[{name:"value",type:"int"}],description:"Set read-only access (on/off)",serialOnly:!1,hasParam:!0},{name:"set bridge.baud",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set bridge baud (9600-115200)",serialOnly:!1,hasParam:!0},{name:"set bridge.channel",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"string"}],description:"Set bridge channel (1-14)",serialOnly:!1,hasParam:!0},{name:"set bridge.delay",category:"set",params:[{name:"value",type:"int"}],description:"Set bridge delay (0-10000 ms)",serialOnly:!1,hasParam:!0},{name:"set bridge.enabled",category:"set",params:[{name:"value",type:"int"}],description:"Enable/disable bridge",serialOnly:!1,hasParam:!0},{name:"set bridge.secret",category:"set",params:[{name:"value",type:"string"},{name:"value",type:"float"}],description:"Set bridge encryption secret",serialOnly:!1,hasParam:!0},{name:"set bridge.source",category:"set",params:[{name:"value",type:"int"}],description:"Set bridge source (rx/tx)",serialOnly:!1,hasParam:!0},{name:"set direct.txdelay",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"}],description:"Set direct TX delay factor",serialOnly:!1,hasParam:!0},{name:"set flood.advert.interval",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set flood advert interval (3-48 hours, 0=off)",serialOnly:!1,hasParam:!0},{name:"set flood.max",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"float"}],description:"Set max flood hops (0-64)",serialOnly:!1,hasParam:!0},{name:"set freq",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"}],description:"Set frequency MHz (serial only, reboot required)",serialOnly:!0,hasParam:!0},{name:"set guest.password",category:"set",params:[{name:"value",type:"string"}],description:"Set guest password",serialOnly:!1,hasParam:!0},{name:"set int.thresh",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set interference threshold",serialOnly:!1,hasParam:!0},{name:"set lat",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"float"},{name:"value",type:"float"}],description:"Set latitude",serialOnly:!1,hasParam:!0},{name:"set lon",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"float"},{name:"value",type:"float"}],description:"Set longitude",serialOnly:!1,hasParam:!0},{name:"set multi.acks",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set multi-ack (0/1)",serialOnly:!1,hasParam:!0},{name:"set name",category:"set",params:[{name:"value",type:"string"},{name:"value",type:"int"}],description:"Set node name",serialOnly:!1,hasParam:!0},{name:"set prv.key",category:"set",params:[{name:"value",type:"string"}],description:"Set private key (hex, restart required)",serialOnly:!1,hasParam:!0},{name:"set radio",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set radio params (freq bw sf cr)",serialOnly:!1,hasParam:!0},{name:"set repeat",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set repeat/forward (on/off)",serialOnly:!1,hasParam:!0},{name:"set rxdelay",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"float"}],description:"Set RX delay base",serialOnly:!1,hasParam:!0},{name:"set tx",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"float"}],description:"Set TX power (dBm)",serialOnly:!1,hasParam:!0},{name:"set txdelay",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"}],description:"Set TX delay factor",serialOnly:!1,hasParam:!0},{name:"stats-core",category:"stats",params:[],description:"Show core statistics (serial only)",serialOnly:!0,hasParam:!1},{name:"stats-packets",category:"stats",params:[],description:"Show packet statistics (serial only)",serialOnly:!0,hasParam:!1},{name:"stats-radio",category:"stats",params:[],description:"Show radio statistics (serial only)",serialOnly:!0,hasParam:!1},{name:"advert",category:"system",params:[],description:"Send self advertisement",serialOnly:!1,hasParam:!1},{name:"board",category:"system",params:[],description:"Show board/manufacturer name",serialOnly:!1,hasParam:!1},{name:"clear stats",category:"system",params:[],description:"Reset statistics counters",serialOnly:!1,hasParam:!0},{name:"clock",category:"system",params:[{name:"value",type:"int"}],description:"Display current time",serialOnly:!1,hasParam:!0},{name:"clock sync",category:"system",params:[],description:"Sync clock from sender timestamp",serialOnly:!1,hasParam:!0},{name:"password",category:"system",params:[{name:"value",type:"string"}],description:"Change admin password",serialOnly:!1,hasParam:!0},{name:"reboot",category:"system",params:[],description:"Reboot the device",serialOnly:!1,hasParam:!1},{name:"start ota",category:"system",params:[{name:"value",type:"int"}],description:"Start OTA firmware update",serialOnly:!1,hasParam:!0},{name:"time",category:"system",params:[{name:"value",type:"int"}],description:"Set time to epoch seconds",serialOnly:!1,hasParam:!0},{name:"ver",category:"system",params:[],description:"Show firmware version and build date",serialOnly:!1,hasParam:!1}].filter(e=>!e.serialOnly&&!A.has(e.name)&&!L.some(t=>e.name.startsWith(t))).map(e=>({cmd:e.name,desc:e.description,params:e.hasParam?"{value}":void 0,required:e.hasParam}))],U={"set mode":["forward","monitor"],"set duty":["on","off"],"set repeat":["on","off"],"set tx":["10","14","17","20","22"],"set sf":["7","8","9","10","11","12"],"set bw":["125","250","500"],"set af":["0.5","1.0","1.5","2.0"],"set txdelay":["0.5","0.7","1.0","1.5"],"set direct.txdelay":["0.3","0.5","0.7"],"set log":["debug","info","warning"],"start cap":["30","60","120","300"]};function F(e){switch(e){case"success":return"text-accent-success";case"error":return"text-accent-danger";case"warning":return"text-amber-400";case"info":return"text-accent-tertiary";case"value":return"text-accent-primary";case"system":return"text-text-muted";default:return"text-text-secondary"}}const H=e.memo(function({entry:r}){const s=P(),n=c(),o=e.useCallback(e=>{const t=s.getReport(e);t?R(t,n):alert("Report no longer available. Captures are stored in session memory only.")},[s,n]);return"command"===r.type?t.jsxs("div",{className:"flex items-center gap-2 py-1",children:[t.jsx("span",{className:"text-text-muted font-medium select-none",children:"$"}),t.jsx("span",{className:"text-text-primary font-semibold",children:r.content})]}):"system"===r.type?t.jsx("div",{className:a("py-0.5",F(r.outputType||"system")),children:r.content}):r.content.includes("██")?t.jsx("pre",{className:a("terminal-ascii font-mono leading-none py-2 whitespace-pre",F(r.outputType||"value")),children:r.content}):t.jsx("div",{className:"ml-4 font-mono text-[13px] py-1",children:r.content.split("\n").map((e,a)=>{const s=function(e,t){if(e.startsWith("REC:::"))return[{text:"●",color:"text-red-500 animate-pulse",isRecording:!0},{text:` ${e.slice(6)}`,color:"text-text-muted"}];const a=e.trimStart();if(a.startsWith("DOWNLOAD:::")){const t=e.slice(0,e.length-a.length),r=a.slice(11).split(":::"),[s,n]=r;return[{text:`${t}⇓ download "${n}"`,color:"text-accent-primary underline cursor-pointer hover:text-accent-secondary",isDownload:!0,downloadId:s,downloadFilename:n}]}if(e.startsWith("HELP_HEADER:::"))return[{text:e.slice(14),color:"text-text-primary font-bold"}];if(e.startsWith("HELP_NOTE:::"))return[{text:e.slice(12),color:"text-text-muted italic"}];const r=e.match(/^([a-z][a-z0-9.]*(?:\s+[a-z][a-z0-9.]*)?):::(.+)$/);if(r){const[,e,t]=r,a=e.split(" "),s=a[0];let n="text-accent-tertiary";"get"===s?n="text-accent-success":"set"===s&&(n="text-amber-400");const o=[{text:` ${s}`,color:`${n} font-semibold`}];a.length>1&&o.push({text:` ${a.slice(1).join(" ")}`,color:"text-accent-primary"});const i=" ".repeat(Math.max(1,22-e.length));return o.push({text:`${i}${t}`,color:"text-text-muted"}),o}if("error"===t||"warning"===t)return[{text:e,color:F(t)}];if("value"===t)return[{text:e,color:F("value")}];const s=e.match(/^([\w\s.]+):\s*(.+)$/);if(s){const[,e,t]=s;return[{text:`${e}: `,color:"text-text-muted"},{text:t,color:"text-accent-primary font-semibold"}]}return e.startsWith("OK")?[{text:e,color:F("success")}]:[{text:e,color:F(t)}]}(e,r.outputType||"default");return t.jsx("div",{className:"leading-relaxed",children:s.map((e,a)=>e.isDownload?t.jsx("span",{className:e.color,onClick:()=>o(e.downloadId),role:"button",tabIndex:0,onKeyDown:t=>"Enter"===t.key&&o(e.downloadId),children:e.text},a):t.jsx("span",{className:e.color,children:e.text},a))},a)})})});function M(){const r=c(),s=d(),n=P(),o=G(e=>e.entries),i=G(e=>e.commandHistory),l=G(e=>e.isInitialized),{addEntry:b,updateEntry:x,addCommand:k,clearEntries:$,setInitialized:C}=G(),[T,E]=e.useState(""),[N,j]=e.useState(-1),[D,A]=e.useState(!1),[L,F]=e.useState([]),[M,q]=e.useState(0),[z,K]=e.useState(0),[B,X]=e.useState(!1),V=e.useRef(null),J=e.useRef(null),Y=e.useRef(null),Q=e.useRef(s);e.useEffect(()=>{Q.current=s},[s]),e.useEffect(()=>{l||(async()=>{b({type:"output",content:"██████ ██ ██ ███ ███ ██████\n██ ██ ██ ██ ████ ████ ██ \n██████ ████ ██ ████ ██ ██ \n██ ██ ██ ██ ██ ██ \n██ ██ ██ ██ ██████",outputType:"value"}),await new Promise(e=>setTimeout(e,200));const e=b({type:"system",content:"● Initializing terminal...",outputType:"system"});await new Promise(e=>setTimeout(e,400)),x(e,{content:"✓ Initializing terminal...",outputType:"success"});const t=b({type:"system",content:"● Connecting to repeater...",outputType:"system"});await new Promise(e=>setTimeout(e,600)),x(t,{content:"✓ Connected to repeater",outputType:"success"}),b({type:"system",content:"Ready. Type 'help' for commands.",outputType:"system"}),C(!0)})()},[l,b,x,C]),e.useEffect(()=>{J.current&&(J.current.scrollTop=J.current.scrollHeight)},[o]);const Z=e.useCallback(()=>{var e;const t=window.getSelection();t&&t.toString().length>0||null==(e=V.current)||e.focus()},[]),ee=e.useMemo(()=>(null==r?void 0:r.neighbors)?Object.values(r.neighbors).map(e=>e.node_name||e.name).filter(e=>!!e).sort():[],[null==r?void 0:r.neighbors]),te=e.useCallback(e=>{const t=e.trim().toLowerCase();if(!t)return A(!1),void F([]);const a=W.filter(e=>e.cmd.toLowerCase().startsWith(t));if(a.length>0)return F(a),q(0),void A(!0);if(t.includes(" ")){const e=t.lastIndexOf(" "),a=t.substring(0,e),r=t.substring(e+1);if("ping"===a&&ee.length>0){const e=ee.filter(e=>e.toLowerCase().startsWith(r)).slice(0,10).map(e=>({cmd:`ping ${e}`,desc:`→ ${e}`}));if(e.length>0)return F(e),q(0),void A(!0)}if("export cap"===a&&n.reports.length>0){const e=n.reports.map((e,t)=>({id:e.id,index:String(t+1),pkts:e.packetCount,duration:e.durationSec})).filter(e=>e.id.toLowerCase().startsWith(r)||e.index.startsWith(r)).slice(0,10).map(e=>({cmd:`export cap ${e.index}`,desc:`${e.pkts} pkts • ${e.duration}s`}));if(e.length>0)return F(e),q(0),void A(!0)}const s=W.find(e=>e.cmd.toLowerCase()===a);if(s&&U[s.cmd]){const e=U[s.cmd].filter(e=>e.toLowerCase().startsWith(r)).map(e=>({cmd:`${s.cmd} ${e}`,desc:`→ ${e}`}));if(e.length>0)return F(e),q(0),void A(!0)}}A(!1),F([])},[ee,n.reports]),ae=e.useCallback(e=>{var t;const a=L[e];a&&(a.required&&a.params?(E(a.cmd+" "),te(a.cmd+" ")):(E(a.cmd),A(!1)),null==(t=V.current)||t.focus())},[L,te]),re=e.useCallback(async e=>{var t,a,o,i,l,c,d,f,w;const _=e.trim();if(!_)return;const S=_.toLowerCase();if(k(_),b({type:"command",content:_}),"clear"===S)return void $();if("help"===S){const e=W.map(e=>`${e.cmd}:::${e.desc}`).join("\n");return void b({type:"output",content:`HELP_HEADER:::Available commands\n${e}\nHELP_NOTE:::Some MeshCore commands not available via HTTP.`,outputType:"default"})}const O=b({type:"output",content:"processing...",outputType:"system"});try{const e=await p();let k="",$="info";const E=e=>{const t=Math.floor(e/86400),a=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${a}h ${r}m`:a>0?`${a}h ${r}m`:`${r}m`};if("status"===S){k=`Mode: ${(null==(a=null==(t=e.config)?void 0:t.repeater)?void 0:a.mode)||"unknown"} | Neighbors: ${Object.keys(e.neighbors||{}).length} | Uptime: ${E(e.uptime_seconds||0)}`}else if("uptime"===S)k=E(e.uptime_seconds||0),$="value";else if("packets"===S)k=`rx: ${e.rx_count??0}\ntx: ${e.tx_count??0}\nfwd: ${e.forwarded_count??0}\ndrop: ${e.dropped_count??0}`;else if("neighbors"===S){const t=e.neighbors||{},a=Object.entries(t);if(0===a.length)k="No neighbors discovered yet.",$="warning";else{const e=a.map(([e,t])=>{const a=t.name||t.node_name||"Unknown";return` ${e.slice(0,8)} ${a}`});k=`Neighbors (${a.length}):\n${e.join("\n")}`}}else if("board"===S)k="pyMC_Repeater (Linux/RPi)",$="value";else if(S.startsWith("get ")){const t=S.slice(4).trim(),a=null==(o=e.config)?void 0:o.delays,r=null==(i=e.config)?void 0:i.radio,s=null==(l=e.config)?void 0:l.repeater,n=null==(c=e.config)?void 0:c.duty_cycle;switch(t){case"name":k=(null==(d=e.config)?void 0:d.node_name)||"Unknown";break;case"role":k="repeater";break;case"lat":k=null!=(null==s?void 0:s.latitude)?String(s.latitude):"not set";break;case"lon":k=null!=(null==s?void 0:s.longitude)?String(s.longitude):"not set";break;case"freq":k=(null==r?void 0:r.frequency)?(r.frequency/1e6).toFixed(3):"?";break;case"tx":k=String((null==r?void 0:r.tx_power)??"?");break;case"bw":k=(null==r?void 0:r.bandwidth)?String(r.bandwidth/1e3):"?";break;case"sf":k=String((null==r?void 0:r.spreading_factor)??"?");break;case"cr":k=String((null==r?void 0:r.coding_rate)??"?");break;case"radio":k=r?`freq: ${(r.frequency/1e6).toFixed(3)} MHz\nbw: ${r.bandwidth/1e3} kHz\nsf: ${r.spreading_factor}\ncr: 4/${r.coding_rate}`:"?";break;case"af":case"txdelay":k=String((null==a?void 0:a.tx_delay_factor)??"1.0");break;case"direct.txdelay":k=String((null==a?void 0:a.direct_tx_delay_factor)??"0.5");break;case"mode":k=(null==s?void 0:s.mode)||"forward";break;case"repeat":k="forward"===(null==s?void 0:s.mode)?"on":"off";break;case"flood.max":k=String((null==s?void 0:s.max_flood_hops)??"3");break;case"flood.advert.interval":k=null!=(null==s?void 0:s.send_advert_interval_hours)?`${s.send_advert_interval_hours}h`:"?";break;case"advert.interval":k=null!=(null==s?void 0:s.advert_interval_minutes)?`${s.advert_interval_minutes}m`:"120m";break;case"rxdelay":k=String((null==a?void 0:a.rx_delay_base)??"0.0");break;case"duty":case"duty.enabled":k=(null==n?void 0:n.enforcement_enabled)?"on":"off";break;case"duty.max":k=null!=(null==n?void 0:n.max_airtime_percent)?`${n.max_airtime_percent}%`:"?";break;case"public.key":k=e.public_key||"not available";break;case"prv.key":k="Private key stored in /etc/pymc_repeater/config.yaml\n\nTo view: sudo grep identity_key /etc/pymc_repeater/config.yaml\nTo set: sudo ./convert_firmware_key.sh <64-byte-hex>",$="info";break;case"guest.password":case"allow.read.only":k="Security settings not exposed via stats API.\nCheck /etc/pymc_repeater/config.yaml",$="warning";break;default:k=`Unknown parameter: ${t}\nAvailable: name, role, lat, lon, freq, tx, bw, sf, cr, radio, af, txdelay, direct.txdelay, rxdelay, mode, repeat, flood.max, advert.interval, duty, public.key`,$="error"}"error"!==$&&($="value")}else if("advert"===S){const e=await m();k=e.success?"OK - Advert sent":`Error: ${e.error||"Failed"}`,$=e.success?"success":"error"}else if(S.startsWith("set mode ")){const e=S.split(" ")[2];if("forward"!==e&&"monitor"!==e)k='Error: Mode must be "forward" or "monitor"',$="error";else{const t=await u(e);k=t.success?`OK - Mode set to ${e}`:"Error: Failed",$=t.success?"success":"error"}}else if(S.startsWith("set duty ")){const e=S.split(" ")[2],t="on"===e||"1"===e,a=await y(t);k=a.success?"OK - Duty cycle "+(t?"enabled":"disabled"):"Error: Failed",$=a.success?"success":"error"}else if(S.startsWith("set tx ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||e<2||e>22)k="Error: TX power must be 2-22 dBm (SX1262 chip max)",$="error";else{const t=await g({tx_power:e});k=t.success?`OK - TX power set to ${e}dBm`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set af ")||S.startsWith("set txdelay ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<0||e>5)k="Error: TX delay factor must be 0.0-5.0",$="error";else{const t=await g({tx_delay_factor:e});k=t.success?`OK - TX delay set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set direct.txdelay ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<0||e>5)k="Error: Direct TX delay must be 0.0-5.0",$="error";else{const t=await g({direct_tx_delay_factor:e});k=t.success?`OK - Direct TX delay set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set log ")){const e=null==(f=S.split(" ")[2])?void 0:f.toUpperCase();if(["DEBUG","INFO","WARNING","ERROR"].includes(e)){const t=await h(e);k=t.success?`OK - Log level set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}else k="Error: Level must be debug, info, warning, or error",$="error"}else if(S.startsWith("set rxdelay ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<0)k="Error: RX delay must be >= 0",$="error";else{const t=await g({rx_delay_base:e});k=t.success?`OK - RX delay base set to ${e}s`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set name ")){const e=_.substring(9).trim();if(e){const t=await g({node_name:e});k=t.success?`OK - Node name set to "${e}"`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}else k="Error: Node name cannot be empty",$="error"}else if(S.startsWith("set lat ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<-90||e>90)k="Error: Latitude must be -90 to 90",$="error";else{const t=await g({latitude:e});k=t.success?`OK - Latitude set to ${e}°`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set lon ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<-180||e>180)k="Error: Longitude must be -180 to 180",$="error";else{const t=await g({longitude:e});k=t.success?`OK - Longitude set to ${e}°`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set flood.max ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||e<0||e>64)k="Error: Max flood hops must be 0-64",$="error";else{const t=await g({max_flood_hops:e});k=t.success?`OK - Max flood hops set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set flood.advert.interval ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||0!==e&&(e<3||e>48))k="Error: Flood advert interval must be 0 (off) or 3-48 hours",$="error";else{const t=await g({flood_advert_interval_hours:e});k=t.success?0===e?"OK - Flood adverts disabled":`OK - Flood advert interval set to ${e}h`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set advert.interval ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||0!==e&&(e<1||e>10080))k="Error: Advert interval must be 0 (off) or 1-10080 minutes",$="error";else{const t=await g({advert_interval_minutes:e});k=t.success?0===e?"OK - Local adverts disabled":`OK - Local advert interval set to ${e}m`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set prv.key ")){const e=_.substring(12).trim();e?/^[0-9a-fA-F]+$/.test(e)?128!==e.length?(k=`Error: Key must be 64 bytes (128 hex chars), got ${e.length} chars`,$="error"):(k=`To set this key, run on the Pi:\n\n sudo ./convert_firmware_key.sh ${e}\n\nThen restart: sudo systemctl restart pymc-repeater`,$="info"):(k="Error: Private key must be a hex string",$="error"):(k="Error: Private key cannot be empty",$="error")}else if(S.startsWith("convert hex ")){const e=_.substring(12).trim();if(e)if(/^[0-9a-fA-F]+$/.test(e))if(e.length%2!=0)k="Error: Hex string must have even length",$="error";else try{const t=new Uint8Array(e.length/2);for(let s=0;s1&&!isNaN(r)&&r>0,n=s?t.slice(0,-1).join(" "):e,o=s?r:30;if(n){let e=1;const t=setInterval(()=>{e=e%3+1,x(O,{content:`Pinging ${n}${".".repeat(e)}`,outputType:"system"})},800);try{const e=await v(n,o);if(clearInterval(t),e.success&&e.data){const t=e.data,a=(null==(w=t.path)?void 0:w.length)?t.path.join(" → "):"direct";k=`Reply from ${t.target_id}\n RTT: ${t.rtt_ms.toFixed(1)}ms\n RSSI: ${t.rssi}dBm\n SNR: ${t.snr_db}dB\n Path: ${a}\n Quality: ${t.quality}`,$="success"}else k=e.error||"Ping failed",$="error"}catch(T){throw clearInterval(t),T}}else k="Usage: ping [timeout]",$="error"}else if("cap"===S||"cap help"===S){const e=n.isCapturing?'\nREC:::Recording in progress... use "end cap" to stop':"",t=n.reports.length;k=`HELP_HEADER:::Packet Capture\n\nstart cap:::Start capture (default: 120s)\nend cap:::Stop capture early\nlist cap:::List saved captures${t>0?` (${t} saved)`:""}\nexport cap:::Download capture by ID\n\nHELP_NOTE:::Captures stored in session memory. JSON includes decoded payloads.${e}`,$="info"}else if("start cap"===S||S.startsWith("start cap ")){const e=S.slice(10).trim(),t=e?parseInt(e):120;if(isNaN(t)||t<1||t>3600)k="Error: Duration must be 1-3600 seconds",$="error";else{if(!n.isCapturing){n.startCapture(s);let e=t;x(O,{content:`REC:::Capturing... ${e}s remaining`,outputType:"system"});const a=setInterval(()=>{e--;const t=P.getState();if(e>=0&&t.isCapturing){const a=Q.current.filter(e=>{if(!t.captureStartTime)return!1;const a=t.captureStartTime.getTime()/1e3;return e.timestamp>=a&&!t.captureStartPacketHashes.has(e.packet_hash)}).length;x(O,{content:`REC:::Capturing... ${e>0?`${e}s remaining`:"finishing..."} (${a} captured)`,outputType:"system"})}},1e3),r=setTimeout(()=>{clearInterval(a);const e=P.getState();if(e.isCapturing){const t=Q.current,a=e.stopCapture(t);b(a?{type:"output",content:`✓ Capture complete!\n Captured: ${a.packetCount} packets\n Duration: ${a.durationSec}s\n Size: ~${I(a.sizeBytes)}\n\nDOWNLOAD:::${a.id}:::${a.filename}`,outputType:"success"}:{type:"output",content:"Capture completed with no packets.",outputType:"warning"})}},1e3*t);return void n._setTimer(r)}k='Error: Capture already in progress. Use "end cap" first.',$="error"}}else if("end cap"===S)if(n.isCapturing){const e=n.stopCapture(s);e?(k=`✓ Capture complete!\n Captured: ${e.packetCount} packets\n Duration: ${e.durationSec}s\n Size: ~${I(e.sizeBytes)}\n\nDOWNLOAD:::${e.id}:::${e.filename}`,$="success"):(k="Capture stopped with no packets.",$="warning")}else k="No capture in progress.",$="warning";else if("list cap"===S){const e=n.reports;if(0===e.length)k="No capture reports available.\nStart a capture with: start cap [seconds]",$="info";else{const t=e.map((e,t)=>` ${t+1}. ${e.packetCount} pkts • ${e.durationSec}s • ~${I(e.sizeBytes)}\n DOWNLOAD:::${e.id}:::${e.filename}`);k=`Capture Reports (${e.length}):\n${t.join("\n")}`,$="info"}}else if("export cap"===S||S.startsWith("export cap ")){const e=S.slice(11).trim();if(e){const t=n.getReport(e);if(t)R(t,r),k=`✓ Downloading ${t.filename}...`,$="success";else{const t=parseInt(e)-1,a=n.reports[t];a?(R(a,r),k=`✓ Downloading ${a.filename}...`,$="success"):(k=`Error: Report "${e}" not found.\nUse "list cap" to see available reports.`,$="error")}}else{const e=n.reports;0===e.length?(k="No capture reports available.\nStart a capture with: start cap [seconds]",$="info"):(k=`Usage: export cap \n\nAvailable reports:\n${e.map((e,t)=>` ${t+1}. ${e.id}`).join("\n")}`,$="info")}}else k=`Unknown command: ${_}\nType 'help' for available commands.`,$="error";x(O,{content:k,outputType:$})}catch(E){x(O,{content:`Error: ${E instanceof Error?E.message:"Command failed"}`,outputType:"error"})}},[b,k,x,$,n,s,r]),se=e.useCallback(e=>{var t,a,r,s,n,o;if(D&&L.length>0){if("ArrowDown"===e.key){e.preventDefault();const s=Math.min(M+1,L.length-1);return q(s),void(null==(r=null==(a=null==(t=Y.current)?void 0:t.children[0])?void 0:a.children[s])||r.scrollIntoView({block:"nearest"}))}if("ArrowUp"===e.key){e.preventDefault();const t=Math.max(M-1,0);return q(t),void(null==(o=null==(n=null==(s=Y.current)?void 0:s.children[0])?void 0:n.children[t])||o.scrollIntoView({block:"nearest"}))}if("Tab"===e.key)return e.preventDefault(),void ae(M);if("Escape"===e.key)return e.preventDefault(),void A(!1)}if("Enter"===e.key){if(e.preventDefault(),D&&L.length>0){const e=L[M].cmd;return E(""),j(-1),A(!1),void re(e)}const t=T;return E(""),j(-1),A(!1),void re(t)}if("ArrowUp"!==e.key||D)if("ArrowDown"!==e.key||D);else if(e.preventDefault(),N>0){const e=N-1;j(e),E(i[i.length-1-e]||"")}else 0===N&&(j(-1),E(""));else if(e.preventDefault(),i.length>0&&N{E(e.target.value),K(e.target.selectionStart||e.target.value.length),te(e.target.value)},[te]),oe=e.useCallback(e=>{const t=e.target;K(t.selectionStart||0)},[]);return t.jsxs(w,{children:[t.jsx(_,{title:"Terminal",icon:t.jsx(f,{})}),t.jsx(S,{children:t.jsxs(O,{noPadding:!0,className:"terminal-card overflow-hidden flex flex-col isolate",onClick:Z,children:[t.jsx("div",{ref:J,className:"flex-1 overflow-y-auto font-mono text-sm p-3 sm:p-4 md:p-5 surface-themed","data-theme":"terminal",children:o.map(e=>t.jsx(H,{entry:e},e.id))}),t.jsxs("div",{className:"relative surface-themed","data-theme":"terminal-input",children:[t.jsxs("div",{className:"flex items-center gap-2 sm:gap-3 px-3 sm:px-4 py-2 sm:py-3",children:[t.jsx("span",{className:"text-text-muted font-mono font-bold select-none",children:"$"}),t.jsxs("div",{className:"flex-1 relative font-mono text-sm",children:[t.jsx("input",{ref:V,type:"text",value:T,onChange:ne,onKeyDown:se,onSelect:oe,onFocus:()=>X(!0),onBlur:()=>X(!1),disabled:!l,className:"absolute inset-0 w-full bg-transparent text-transparent outline-none disabled:opacity-50 selection:bg-transparent",style:{caretColor:"transparent"},autoFocus:!0,autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1}),t.jsx("div",{className:"relative pointer-events-none select-none","aria-hidden":!0,children:l?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"text-text-primary",children:T.slice(0,z)}),t.jsx("span",{className:a("inline-block w-[0.6em] h-[1.2em] align-text-bottom",B?"bg-accent-primary":"bg-text-muted/30"),style:{marginBottom:"-0.1em"},children:t.jsx("span",{className:"text-bg-primary",children:T[z]||""})}),t.jsx("span",{className:"text-text-primary",children:T.slice(z+1)})]}):t.jsx("span",{className:"text-text-muted",children:"Connecting..."})})]})]}),t.jsxs("div",{className:"px-3 sm:px-4 py-1 flex justify-between text-[10px] text-text-muted surface-themed","data-theme":"terminal-status",children:[t.jsx("span",{className:"hidden sm:inline",children:"↑↓ History"}),t.jsx("span",{className:"sm:hidden",children:"Terminal"}),(null==r?void 0:r.version)&&t.jsxs("span",{children:["pyMC v",r.version]})]})]}),D&&L.length>0&&t.jsxs("div",{ref:Y,className:"absolute left-2 right-2 bottom-[72px] radius-inset overflow-hidden z-50 surface-themed","data-theme":"terminal-autocomplete",children:[t.jsx("div",{className:"max-h-64 overflow-y-auto",children:L.map((e,r)=>t.jsxs("div",{onClick:()=>ae(r),className:a("px-4 py-2.5 cursor-pointer last:border-b-0 transition-colors surface-divider-bottom",r===M?"bg-accent-primary/25":""),"data-theme":"terminal",onMouseEnter:e=>{r!==M&&(e.currentTarget.style.background="var(--terminal-autocomplete-hover)")},onMouseLeave:e=>{r!==M&&(e.currentTarget.style.background="transparent")},children:[t.jsx("span",{className:a("font-mono text-sm",r===M?"text-accent-primary":"text-text-primary"),children:e.cmd}),t.jsx("span",{className:"text-xs text-text-muted ml-4",children:e.desc})]},e.cmd))}),t.jsx("div",{className:"px-3 py-1.5 text-[10px] text-text-muted text-right surface-divider-top","data-theme":"terminal",style:{backgroundColor:"var(--terminal-autocomplete-hover)"},children:"Tab to select"})]})]})})]})}export{M as default}; diff --git a/frontend/dist/assets/Terminal-CFdtTKrf.js b/frontend/dist/assets/Terminal-CFdtTKrf.js new file mode 100644 index 00000000..1e336bd1 --- /dev/null +++ b/frontend/dist/assets/Terminal-CFdtTKrf.js @@ -0,0 +1 @@ +import{r as e,j as t,c as a}from"./vendor-react-Cwum97tW.js";import{b0 as r,Z as s,b1 as n,M as o,a as i,f as l,b as c,b2 as d,b3 as p,b4 as m,b5 as u,b6 as y,b7 as g,b8 as h}from"./index-D22MpaCY.js";import{a as f}from"./ping-o6tDyVoV.js";import{c as v}from"./vendor-core-CDrKesoV.js";import{P as b,d as x}from"./payload-decoders-B_w2m9Or.js";import{P as w,b as _,B as S,a as O}from"./PageLayout-B53JpmK1.js";import"./deckgl-DTsmDcfs.js";function k(){const e=new Date;return`${e.toISOString().slice(0,10)}_${e.toTimeString().slice(0,8).replace(/:/g,"-")}`}function $(e,t){return`pymc-${e.toISOString().slice(0,10)}-${e.toTimeString().slice(0,5).replace(":","")}-${t}s.json`}const P=v((e,t)=>({isCapturing:!1,captureStartTime:null,captureStartPacketHashes:new Set,captureTimer:null,reports:[],startCapture:a=>{const{captureTimer:r}=t();r&&clearTimeout(r),e({isCapturing:!0,captureStartTime:new Date,captureStartPacketHashes:new Set(a.map(e=>e.packet_hash))})},stopCapture:a=>{const{isCapturing:r,captureStartTime:s,captureStartPacketHashes:n,captureTimer:o}=t();if(!r||!s)return null;o&&clearTimeout(o);const i=new Date,l=Math.round((i.getTime()-s.getTime())/1e3),c=s.getTime()/1e3,d=a.filter(e=>!n.has(e.packet_hash)&&e.timestamp>=c).sort((e,t)=>e.timestamp-t.timestamp),p={id:k(),filename:$(s,l),startTime:s,endTime:i,durationSec:l,packetCount:d.length,packets:d,sizeBytes:500*d.length};return e(e=>({isCapturing:!1,captureStartTime:null,captureStartPacketHashes:new Set,captureTimer:null,reports:[p,...e.reports].slice(0,10)})),p},getReport:e=>t().reports.find(t=>t.id===e),_setTimer:t=>e({captureTimer:t})}));function C(e){var t;return(null==(t=e.match(/.{1,2}/g))?void 0:t.join(" ").toUpperCase())||""}function T(e){return void 0===e?"UNKNOWN":i[e]??`TYPE_${e}`}function E(e){return void 0===e?"UNKNOWN":o[e]??`ROUTE_${e}`}function N(e,t){switch(e){case 4:return function(e){const t=[];let a=0;if(e.length>=32&&(t.push({name:"public_key",offset:a,length:32,bytes:C(n(e.slice(a,a+32))),decoded:{value:n(e.slice(a,a+32))}}),a+=32),e.length>=a+4){const r=e.slice(a,a+4),s=r[0]|r[1]<<8|r[2]<<16|r[3]<<24;t.push({name:"timestamp",offset:a,length:4,bytes:C(n(r)),decoded:{value:s>>>0,iso:new Date(1e3*s).toISOString()}}),a+=4}if(e.length>=a+64&&(t.push({name:"signature",offset:a,length:64,bytes:C(n(e.slice(a,a+64))),decoded:{value:n(e.slice(a,a+64))}}),a+=64),e.length>a){const r=e[a],s=[];if(1&r&&s.push("CHAT_NODE"),2&r&&s.push("REPEATER"),3&r&&s.push("ROOM_SERVER"),16&r&&s.push("HAS_LOCATION"),128&r&&s.push("HAS_NAME"),t.push({name:"flags",offset:a,length:1,bytes:C(n(e.slice(a,a+1))),decoded:{value:r,binary:r.toString(2).padStart(8,"0"),flags:s}}),a+=1,16&r&&e.length>=a+8){const r=e.slice(a,a+8),s=new ArrayBuffer(8);new Uint8Array(s).set(r);const o=new DataView(s),i=o.getInt32(0,!0),l=o.getInt32(4,!0);t.push({name:"location",offset:a,length:8,bytes:C(n(r)),decoded:{lat_raw:i,lon_raw:l,latitude:i/1e6,longitude:l/1e6}}),a+=8}if(128&r&&e.length>a){const r=e.slice(a);let s=r.indexOf(0);-1===s&&(s=r.length);const o=(new TextDecoder).decode(r.slice(0,s));t.push({name:"name",offset:a,length:s+(0===r[s]?1:0),bytes:C(n(r.slice(0,s+1))),decoded:{value:o,encoding:"utf-8",null_terminated:0===r[s]}})}}return t}(t);case 3:return function(e){if(e.length<4)return[];const t=e.slice(0,4),a=t[0]|t[1]<<8|t[2]<<16|t[3]<<24;return[{name:"crc",offset:0,length:4,bytes:C(n(t)),decoded:{value:a>>>0,hex:(a>>>0).toString(16).toUpperCase().padStart(8,"0"),note:"CRC of the acknowledged packet (little-endian)"}}]}(t);case 9:return function(e){const t=[];if(e.length<9)return t;const a=e.slice(0,4),r=a[0]|a[1]<<8|a[2]<<16|a[3]<<24;t.push({name:"trace_tag",offset:0,length:4,bytes:C(n(a)),decoded:{value:r>>>0,hex:(r>>>0).toString(16).toUpperCase().padStart(8,"0")}});const s=e.slice(4,8),o=s[0]|s[1]<<8|s[2]<<16|s[3]<<24;if(t.push({name:"auth_code",offset:4,length:4,bytes:C(n(s)),decoded:{value:o>>>0}}),t.push({name:"flags",offset:8,length:1,bytes:C(n(e.slice(8,9))),decoded:{value:e[8],binary:e[8].toString(2).padStart(8,"0")}}),e.length>9){const a=e.slice(9),r=Array.from(a).map(e=>e.toString(16).toUpperCase().padStart(2,"0"));t.push({name:"target_path",offset:9,length:a.length,bytes:C(n(a)),decoded:{hops:r,path_string:r.join("->")}})}return t}(t);case 8:return function(e){if(0===e.length)return[];const t=Array.from(e).map(e=>e.toString(16).toUpperCase().padStart(2,"0"));return[{name:"path_hops",offset:0,length:e.length,bytes:C(n(e)),decoded:{hops:t,path_string:t.join("->")}}]}(t);case 5:return function(e){const t=[];if(e.length<1)return t;if(t.push({name:"channel_hash",offset:0,length:1,bytes:C(n(e.slice(0,1))),decoded:{value:e[0].toString(16).toUpperCase().padStart(2,"0")}}),e.length>13){const a=12,r=e.length-1-a;t.push({name:"ciphertext",offset:1,length:r,bytes:C(n(e.slice(1,1+r))),decoded:{length:r,note:"Encrypted message content"}}),t.push({name:"mac",offset:1+r,length:a,bytes:C(n(e.slice(-a))),decoded:{note:"Message authentication code"}})}return t}(t);default:return function(e){return 0===e.length?[]:[{name:"raw_data",offset:0,length:e.length,bytes:C(n(e)),decoded:{length:e.length}}]}(t)}}function j(e){const t=e.type??e.payload_type??0,a=e.route??e.route_type??0,r=e.raw_packet||"";let o,i=null;if(r){const t=b.fromHex(r);if(t.success&&t.packet){const e=t.packet;try{i=x(e)}catch{i=null}const a=s(r);let l=0;const c={offset:0,length:1,bytes:C(r.slice(0,2)),decoded:{route_type:e.routeType,route_name:e.routeTypeName,payload_type:e.payloadType,payload_name:e.payloadTypeName,version:e.payloadVersion}};l+=1,e.hasTransportCodes()&&(l+=4);const d={offset:l,length:1,bytes:C(n(a.slice(l,l+1))),decoded:{value:e.pathLen}};l+=1;const p=l,m=a.slice(l,l+e.pathLen),u=Array.from(e.path).map(e=>e.toString(16).toUpperCase().padStart(2,"0")),y=9===e.payloadType,g={offset:p,length:e.pathLen,bytes:C(n(m)),decoded:{hops:u,path_string:u.length>0?u.join("->"):"(direct)",...y&&{note:"For TRACE packets, path bytes are SNR×4 values, not node hashes",snr_values:Array.from(e.path).map(e=>{let t=e;return t>127&&(t-=256),t/4})}}};l+=e.pathLen,o={header:c,path_length:d,path:g,payload:{offset:l,length:e.payload.length,bytes:C(e.payloadHex),sections:N(e.payloadType,e.payload)}}}else o=D(e)}else o=D(e);return{timestamp:e.timestamp,packet_hash:e.packet_hash,type:t,type_name:T(t),route:a,route_name:E(a),rssi:e.rssi,snr:e.snr,length:e.length??0,src_hash:e.src_hash,dst_hash:e.dst_hash,transmitted:e.transmitted,drop_reason:e.drop_reason,is_duplicate:e.is_duplicate,lbt_attempts:e.lbt_attempts,lbt_backoff_delays_ms:e.lbt_backoff_delays_ms,lbt_channel_busy:e.lbt_channel_busy,raw_packet:r,structure:o,decoded:i}}function D(e){var t;const a=e.type??e.payload_type??0,r=e.route??e.route_type??0,n=e.original_path??e.forwarded_path??[];return{header:{offset:0,length:1,bytes:"??",decoded:{route_type:r,route_name:E(r),payload_type:a,payload_name:T(a),version:0}},path_length:{offset:1,length:1,bytes:n.length.toString(16).toUpperCase().padStart(2,"0"),decoded:{value:n.length}},path:{offset:2,length:n.length,bytes:n.join(" "),decoded:{hops:n,path_string:n.length>0?n.join("->"):"(direct)"}},payload:{offset:2+n.length,length:(null==(t=e.payload)?void 0:t.length)??0,bytes:e.payload??"",sections:e.payload?N(a,s(e.payload)):[]}}}function R(e,t){const a=function(e,t){var a;return{capture:{start:e.startTime.toISOString(),end:e.endTime.toISOString(),duration_sec:e.durationSec,packet_count:e.packetCount,node_name:(null==t?void 0:t.node_name)??"unknown",local_hash:(null==t?void 0:t.local_hash)??"unknown",pymc_console_version:r,pymc_repeater_version:(null==t?void 0:t.version)??"unknown",radio_config:(null==(a=null==t?void 0:t.config)?void 0:a.radio)?{frequency:t.config.radio.frequency,tx_power:t.config.radio.tx_power,bandwidth:t.config.radio.bandwidth,spreading_factor:t.config.radio.spreading_factor}:null},packets:e.packets.map(j)}}(e,t),s=JSON.stringify(a,null,2),n=new Blob([s],{type:"application/json"}),o=URL.createObjectURL(n),i=document.createElement("a");i.href=o,i.download=e.filename,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o)}function I(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`}const A=v(e=>({entries:[],commandHistory:[],isInitialized:!1,addEntry:t=>{const a="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),r={...t,id:a,timestamp:Date.now()};return e(e=>({entries:[...e.entries,r]})),a},updateEntry:(t,a)=>{e(e=>({entries:e.entries.map(e=>e.id===t?{...e,...a}:e)}))},addCommand:t=>{e(e=>({commandHistory:[...e.commandHistory,t]}))},clearEntries:()=>{e({entries:[],commandHistory:[]})},setInitialized:t=>{e({isInitialized:t})}})),G=new Set(["start ota","erase","reboot"]),L=["gps","sensor"],W=[{cmd:"help",desc:"Show available commands"},{cmd:"clear",desc:"Clear terminal screen"},{cmd:"status",desc:"Get repeater status summary"},{cmd:"uptime",desc:"Show system uptime"},{cmd:"packets",desc:"Show packet statistics"},{cmd:"board",desc:"Show board/platform info"},{cmd:"ping",desc:"Ping neighbor (name or 0xXX)",params:"{target} [timeout]",required:!0},{cmd:"convert hex",desc:"Hex → base64 (for config.yaml)",params:"{hex}",required:!0},{cmd:"convert base64",desc:"Base64 → hex",params:"{base64}",required:!0},{cmd:"cap",desc:"Show capture help"},{cmd:"start cap",desc:"Start packet capture (default 120s)",params:"[seconds]"},{cmd:"end cap",desc:"Stop current capture"},{cmd:"list cap",desc:"List capture reports (clickable download)"},{cmd:"export cap",desc:"Download a capture report",params:"{id}"},...[{name:"get adc.multiplier",category:"get",params:[],description:"Get ADC multiplier for battery",serialOnly:!1,hasParam:!1},{name:"get advert.interval",category:"get",params:[],description:"Get local advert interval (minutes)",serialOnly:!1,hasParam:!1},{name:"get af",category:"get",params:[],description:"Get airtime factor",serialOnly:!1,hasParam:!1},{name:"get agc.reset.interval",category:"get",params:[],description:"Get AGC reset interval (seconds)",serialOnly:!1,hasParam:!1},{name:"get allow.read.only",category:"get",params:[],description:"Get read-only access setting",serialOnly:!1,hasParam:!1},{name:"get bridge.baud",category:"get",params:[],description:"Get bridge baud rate",serialOnly:!1,hasParam:!1},{name:"get bridge.channel",category:"get",params:[],description:"Get bridge channel (ESP-NOW)",serialOnly:!1,hasParam:!1},{name:"get bridge.delay",category:"get",params:[],description:"Get bridge delay (ms)",serialOnly:!1,hasParam:!1},{name:"get bridge.enabled",category:"get",params:[],description:"Get bridge enabled status",serialOnly:!1,hasParam:!1},{name:"get bridge.secret",category:"get",params:[],description:"Get bridge encryption secret",serialOnly:!1,hasParam:!1},{name:"get bridge.source",category:"get",params:[],description:"Get bridge packet source",serialOnly:!1,hasParam:!1},{name:"get bridge.type",category:"get",params:[],description:"Get bridge type (rs232/espnow/none)",serialOnly:!1,hasParam:!1},{name:"get direct.txdelay",category:"get",params:[],description:"Get direct TX delay factor",serialOnly:!1,hasParam:!1},{name:"get flood.advert.interval",category:"get",params:[],description:"Get flood advert interval (hours)",serialOnly:!1,hasParam:!1},{name:"get flood.max",category:"get",params:[],description:"Get max flood hops",serialOnly:!1,hasParam:!1},{name:"get freq",category:"get",params:[],description:"Get frequency (MHz)",serialOnly:!1,hasParam:!1},{name:"get guest.password",category:"get",params:[],description:"Get guest password",serialOnly:!1,hasParam:!1},{name:"get int.thresh",category:"get",params:[],description:"Get interference threshold",serialOnly:!1,hasParam:!1},{name:"get lat",category:"get",params:[],description:"Get latitude",serialOnly:!1,hasParam:!1},{name:"get lon",category:"get",params:[],description:"Get longitude",serialOnly:!1,hasParam:!1},{name:"get multi.acks",category:"get",params:[],description:"Get multi-ack setting",serialOnly:!1,hasParam:!1},{name:"get name",category:"get",params:[],description:"Get node name",serialOnly:!1,hasParam:!1},{name:"get prv.key",category:"get",params:[],description:"Get private key (hex)",serialOnly:!1,hasParam:!1},{name:"get public.key",category:"get",params:[],description:"Get public key (hex)",serialOnly:!1,hasParam:!1},{name:"get radio",category:"get",params:[],description:"Get radio params (freq,bw,sf,cr)",serialOnly:!1,hasParam:!1},{name:"get repeat",category:"get",params:[],description:"Get repeat/forward status (on/off)",serialOnly:!1,hasParam:!1},{name:"get role",category:"get",params:[],description:"Get device role",serialOnly:!1,hasParam:!1},{name:"get rxdelay",category:"get",params:[],description:"Get RX delay base",serialOnly:!1,hasParam:!1},{name:"get tx",category:"get",params:[],description:"Get TX power (dBm)",serialOnly:!1,hasParam:!1},{name:"get txdelay",category:"get",params:[],description:"Get TX delay factor",serialOnly:!1,hasParam:!1},{name:"gps",category:"gps",params:[],description:"Show GPS status",serialOnly:!1,hasParam:!1},{name:"gps advert",category:"gps",params:[],description:"Get/set GPS advert location policy",serialOnly:!1,hasParam:!0},{name:"gps off",category:"gps",params:[],description:"Disable GPS",serialOnly:!1,hasParam:!0},{name:"gps on",category:"gps",params:[],description:"Enable GPS",serialOnly:!1,hasParam:!0},{name:"gps setloc",category:"gps",params:[],description:"Set node location from GPS",serialOnly:!1,hasParam:!0},{name:"gps sync",category:"gps",params:[],description:"Sync time from GPS",serialOnly:!1,hasParam:!0},{name:"log",category:"logging",params:[],description:"Dump log file (serial only)",serialOnly:!0,hasParam:!1},{name:"log erase",category:"logging",params:[],description:"Erase log file",serialOnly:!1,hasParam:!0},{name:"log start",category:"logging",params:[],description:"Start packet logging",serialOnly:!1,hasParam:!0},{name:"log stop",category:"logging",params:[],description:"Stop packet logging",serialOnly:!1,hasParam:!0},{name:"neighbor.remove",category:"neighbor",params:[],description:"Remove neighbor by pubkey",serialOnly:!1,hasParam:!0},{name:"neighbors",category:"neighbor",params:[],description:"List neighbors",serialOnly:!1,hasParam:!1},{name:"get",category:"other",params:[],description:"Execute get command",serialOnly:!1,hasParam:!0},{name:"set",category:"other",params:[{name:"value",type:"float"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Execute set command",serialOnly:!1,hasParam:!0},{name:"tempradio",category:"radio",params:[{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Apply temporary radio params (freq bw sf cr timeout_mins)",serialOnly:!1,hasParam:!0},{name:"sensor get",category:"sensor",params:[],description:"Get sensor/custom variable value",serialOnly:!1,hasParam:!0},{name:"sensor list",category:"sensor",params:[{name:"value",type:"int"}],description:"List all sensor/custom variables",serialOnly:!1,hasParam:!0},{name:"sensor set",category:"sensor",params:[],description:"Set sensor/custom variable value",serialOnly:!1,hasParam:!0},{name:"set adc.multiplier",category:"set",params:[{name:"value",type:"float"}],description:"Set ADC multiplier",serialOnly:!1,hasParam:!0},{name:"set advert.interval",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"string"}],description:"Set local advert interval (1-10080 min, 0=off)",serialOnly:!1,hasParam:!0},{name:"set af",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set airtime factor (0-9)",serialOnly:!1,hasParam:!0},{name:"set agc.reset.interval",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set AGC reset interval (seconds, rounded to 4)",serialOnly:!1,hasParam:!0},{name:"set allow.read.only",category:"set",params:[{name:"value",type:"int"}],description:"Set read-only access (on/off)",serialOnly:!1,hasParam:!0},{name:"set bridge.baud",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set bridge baud (9600-115200)",serialOnly:!1,hasParam:!0},{name:"set bridge.channel",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"string"}],description:"Set bridge channel (1-14)",serialOnly:!1,hasParam:!0},{name:"set bridge.delay",category:"set",params:[{name:"value",type:"int"}],description:"Set bridge delay (0-10000 ms)",serialOnly:!1,hasParam:!0},{name:"set bridge.enabled",category:"set",params:[{name:"value",type:"int"}],description:"Enable/disable bridge",serialOnly:!1,hasParam:!0},{name:"set bridge.secret",category:"set",params:[{name:"value",type:"string"},{name:"value",type:"float"}],description:"Set bridge encryption secret",serialOnly:!1,hasParam:!0},{name:"set bridge.source",category:"set",params:[{name:"value",type:"int"}],description:"Set bridge source (rx/tx)",serialOnly:!1,hasParam:!0},{name:"set direct.txdelay",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"}],description:"Set direct TX delay factor",serialOnly:!1,hasParam:!0},{name:"set flood.advert.interval",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set flood advert interval (3-48 hours, 0=off)",serialOnly:!1,hasParam:!0},{name:"set flood.max",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"float"}],description:"Set max flood hops (0-64)",serialOnly:!1,hasParam:!0},{name:"set freq",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"}],description:"Set frequency MHz (serial only, reboot required)",serialOnly:!0,hasParam:!0},{name:"set guest.password",category:"set",params:[{name:"value",type:"string"}],description:"Set guest password",serialOnly:!1,hasParam:!0},{name:"set int.thresh",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set interference threshold",serialOnly:!1,hasParam:!0},{name:"set lat",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"float"},{name:"value",type:"float"}],description:"Set latitude",serialOnly:!1,hasParam:!0},{name:"set lon",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"float"},{name:"value",type:"float"}],description:"Set longitude",serialOnly:!1,hasParam:!0},{name:"set multi.acks",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set multi-ack (0/1)",serialOnly:!1,hasParam:!0},{name:"set name",category:"set",params:[{name:"value",type:"string"},{name:"value",type:"int"}],description:"Set node name",serialOnly:!1,hasParam:!0},{name:"set prv.key",category:"set",params:[{name:"value",type:"string"}],description:"Set private key (hex, restart required)",serialOnly:!1,hasParam:!0},{name:"set radio",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set radio params (freq bw sf cr)",serialOnly:!1,hasParam:!0},{name:"set repeat",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"int"}],description:"Set repeat/forward (on/off)",serialOnly:!1,hasParam:!0},{name:"set rxdelay",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"float"}],description:"Set RX delay base",serialOnly:!1,hasParam:!0},{name:"set tx",category:"set",params:[{name:"value",type:"int"},{name:"value",type:"float"}],description:"Set TX power (dBm)",serialOnly:!1,hasParam:!0},{name:"set txdelay",category:"set",params:[{name:"value",type:"float"},{name:"value",type:"int"}],description:"Set TX delay factor",serialOnly:!1,hasParam:!0},{name:"stats-core",category:"stats",params:[],description:"Show core statistics (serial only)",serialOnly:!0,hasParam:!1},{name:"stats-packets",category:"stats",params:[],description:"Show packet statistics (serial only)",serialOnly:!0,hasParam:!1},{name:"stats-radio",category:"stats",params:[],description:"Show radio statistics (serial only)",serialOnly:!0,hasParam:!1},{name:"advert",category:"system",params:[],description:"Send self advertisement",serialOnly:!1,hasParam:!1},{name:"board",category:"system",params:[],description:"Show board/manufacturer name",serialOnly:!1,hasParam:!1},{name:"clear stats",category:"system",params:[],description:"Reset statistics counters",serialOnly:!1,hasParam:!0},{name:"clock",category:"system",params:[{name:"value",type:"int"}],description:"Display current time",serialOnly:!1,hasParam:!0},{name:"clock sync",category:"system",params:[],description:"Sync clock from sender timestamp",serialOnly:!1,hasParam:!0},{name:"password",category:"system",params:[{name:"value",type:"string"}],description:"Change admin password",serialOnly:!1,hasParam:!0},{name:"reboot",category:"system",params:[],description:"Reboot the device",serialOnly:!1,hasParam:!1},{name:"start ota",category:"system",params:[{name:"value",type:"int"}],description:"Start OTA firmware update",serialOnly:!1,hasParam:!0},{name:"time",category:"system",params:[{name:"value",type:"int"}],description:"Set time to epoch seconds",serialOnly:!1,hasParam:!0},{name:"ver",category:"system",params:[],description:"Show firmware version and build date",serialOnly:!1,hasParam:!1}].filter(e=>!e.serialOnly&&!G.has(e.name)&&!L.some(t=>e.name.startsWith(t))).map(e=>({cmd:e.name,desc:e.description,params:e.hasParam?"{value}":void 0,required:e.hasParam}))],U={"set mode":["forward","monitor"],"set duty":["on","off"],"set repeat":["on","off"],"set tx":["10","14","17","20","22"],"set sf":["7","8","9","10","11","12"],"set bw":["125","250","500"],"set af":["0.5","1.0","1.5","2.0"],"set txdelay":["0.5","0.7","1.0","1.5"],"set direct.txdelay":["0.3","0.5","0.7"],"set log":["debug","info","warning"],"start cap":["30","60","120","300"]};function F(e){switch(e){case"success":return"text-accent-success";case"error":return"text-accent-danger";case"warning":return"text-amber-400";case"info":return"text-accent-tertiary";case"value":return"text-accent-primary";case"system":return"text-text-muted";default:return"text-text-secondary"}}const H=e.memo(function({entry:r}){const s=P(),n=l(),o=e.useCallback(e=>{const t=s.getReport(e);t?R(t,n):alert("Report no longer available. Captures are stored in session memory only.")},[s,n]);return"command"===r.type?t.jsxs("div",{className:"flex items-center gap-2 py-1",children:[t.jsx("span",{className:"text-text-muted font-medium select-none",children:"$"}),t.jsx("span",{className:"text-text-primary font-semibold",children:r.content})]}):"system"===r.type?t.jsx("div",{className:a("py-0.5",F(r.outputType||"system")),children:r.content}):r.content.includes("██")?t.jsx("pre",{className:a("terminal-ascii font-mono leading-none py-2 whitespace-pre",F(r.outputType||"value")),children:r.content}):t.jsx("div",{className:"ml-4 font-mono text-[13px] py-1",children:r.content.split("\n").map((e,a)=>{const s=function(e,t){if(e.startsWith("REC:::"))return[{text:"●",color:"text-red-500 animate-pulse",isRecording:!0},{text:` ${e.slice(6)}`,color:"text-text-muted"}];const a=e.trimStart();if(a.startsWith("DOWNLOAD:::")){const t=e.slice(0,e.length-a.length),r=a.slice(11).split(":::"),[s,n]=r;return[{text:`${t}⇓ download "${n}"`,color:"text-accent-primary underline cursor-pointer hover:text-accent-secondary",isDownload:!0,downloadId:s,downloadFilename:n}]}if(e.startsWith("HELP_HEADER:::"))return[{text:e.slice(14),color:"text-text-primary font-bold"}];if(e.startsWith("HELP_NOTE:::"))return[{text:e.slice(12),color:"text-text-muted italic"}];const r=e.match(/^([a-z][a-z0-9.]*(?:\s+[a-z][a-z0-9.]*)?):::(.+)$/);if(r){const[,e,t]=r,a=e.split(" "),s=a[0];let n="text-accent-tertiary";"get"===s?n="text-accent-success":"set"===s&&(n="text-amber-400");const o=[{text:` ${s}`,color:`${n} font-semibold`}];a.length>1&&o.push({text:` ${a.slice(1).join(" ")}`,color:"text-accent-primary"});const i=" ".repeat(Math.max(1,22-e.length));return o.push({text:`${i}${t}`,color:"text-text-muted"}),o}if("error"===t||"warning"===t)return[{text:e,color:F(t)}];if("value"===t)return[{text:e,color:F("value")}];const s=e.match(/^([\w\s.]+):\s*(.+)$/);if(s){const[,e,t]=s;return[{text:`${e}: `,color:"text-text-muted"},{text:t,color:"text-accent-primary font-semibold"}]}return e.startsWith("OK")?[{text:e,color:F("success")}]:[{text:e,color:F(t)}]}(e,r.outputType||"default");return t.jsx("div",{className:"leading-relaxed",children:s.map((e,a)=>e.isDownload?t.jsx("span",{className:e.color,onClick:()=>o(e.downloadId),role:"button",tabIndex:0,onKeyDown:t=>"Enter"===t.key&&o(e.downloadId),children:e.text},a):t.jsx("span",{className:e.color,children:e.text},a))},a)})})});function M(){const r=l(),s=c(),n=P(),o=A(e=>e.entries),i=A(e=>e.commandHistory),v=A(e=>e.isInitialized),{addEntry:b,updateEntry:x,addCommand:k,clearEntries:$,setInitialized:C}=A(),[T,E]=e.useState(""),[N,j]=e.useState(-1),[D,G]=e.useState(!1),[L,F]=e.useState([]),[M,q]=e.useState(0),[z,K]=e.useState(0),[B,X]=e.useState(!1),V=e.useRef(null),J=e.useRef(null),Q=e.useRef(null),Y=e.useRef(s);e.useEffect(()=>{Y.current=s},[s]),e.useEffect(()=>{v||(async()=>{b({type:"output",content:"██████ ██ ██ ███ ███ ██████\n██ ██ ██ ██ ████ ████ ██ \n██████ ████ ██ ████ ██ ██ \n██ ██ ██ ██ ██ ██ \n██ ██ ██ ██ ██████",outputType:"value"}),await new Promise(e=>setTimeout(e,200));const e=b({type:"system",content:"● Initializing terminal...",outputType:"system"});await new Promise(e=>setTimeout(e,400)),x(e,{content:"✓ Initializing terminal...",outputType:"success"});const t=b({type:"system",content:"● Connecting to repeater...",outputType:"system"});await new Promise(e=>setTimeout(e,600)),x(t,{content:"✓ Connected to repeater",outputType:"success"}),b({type:"system",content:"Ready. Type 'help' for commands.",outputType:"system"}),C(!0)})()},[v,b,x,C]),e.useEffect(()=>{J.current&&(J.current.scrollTop=J.current.scrollHeight)},[o]);const Z=e.useCallback(()=>{var e;const t=window.getSelection();t&&t.toString().length>0||null==(e=V.current)||e.focus()},[]),ee=e.useMemo(()=>(null==r?void 0:r.neighbors)?Object.values(r.neighbors).map(e=>e.node_name||e.name).filter(e=>!!e).sort():[],[null==r?void 0:r.neighbors]),te=e.useCallback(e=>{const t=e.trim().toLowerCase();if(!t)return G(!1),void F([]);const a=W.filter(e=>e.cmd.toLowerCase().startsWith(t));if(a.length>0)return F(a),q(0),void G(!0);if(t.includes(" ")){const e=t.lastIndexOf(" "),a=t.substring(0,e),r=t.substring(e+1);if("ping"===a&&ee.length>0){const e=ee.filter(e=>e.toLowerCase().startsWith(r)).slice(0,10).map(e=>({cmd:`ping ${e}`,desc:`→ ${e}`}));if(e.length>0)return F(e),q(0),void G(!0)}if("export cap"===a&&n.reports.length>0){const e=n.reports.map((e,t)=>({id:e.id,index:String(t+1),pkts:e.packetCount,duration:e.durationSec})).filter(e=>e.id.toLowerCase().startsWith(r)||e.index.startsWith(r)).slice(0,10).map(e=>({cmd:`export cap ${e.index}`,desc:`${e.pkts} pkts • ${e.duration}s`}));if(e.length>0)return F(e),q(0),void G(!0)}const s=W.find(e=>e.cmd.toLowerCase()===a);if(s&&U[s.cmd]){const e=U[s.cmd].filter(e=>e.toLowerCase().startsWith(r)).map(e=>({cmd:`${s.cmd} ${e}`,desc:`→ ${e}`}));if(e.length>0)return F(e),q(0),void G(!0)}}G(!1),F([])},[ee,n.reports]),ae=e.useCallback(e=>{var t;const a=L[e];a&&(a.required&&a.params?(E(a.cmd+" "),te(a.cmd+" ")):(E(a.cmd),G(!1)),null==(t=V.current)||t.focus())},[L,te]),re=e.useCallback(async e=>{var t,a,o,i,l,c,h,v,w;const _=e.trim();if(!_)return;const S=_.toLowerCase();if(k(_),b({type:"command",content:_}),"clear"===S)return void $();if("help"===S){const e=W.map(e=>`${e.cmd}:::${e.desc}`).join("\n");return void b({type:"output",content:`HELP_HEADER:::Available commands\n${e}\nHELP_NOTE:::Some MeshCore commands not available via HTTP.`,outputType:"default"})}const O=b({type:"output",content:"processing...",outputType:"system"});try{const e=await d();let k="",$="info";const E=e=>{const t=Math.floor(e/86400),a=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${a}h ${r}m`:a>0?`${a}h ${r}m`:`${r}m`};if("status"===S){k=`Mode: ${(null==(a=null==(t=e.config)?void 0:t.repeater)?void 0:a.mode)||"unknown"} | Neighbors: ${Object.keys(e.neighbors||{}).length} | Uptime: ${E(e.uptime_seconds||0)}`}else if("uptime"===S)k=E(e.uptime_seconds||0),$="value";else if("packets"===S)k=`rx: ${e.rx_count??0}\ntx: ${e.tx_count??0}\nfwd: ${e.forwarded_count??0}\ndrop: ${e.dropped_count??0}`;else if("neighbors"===S){const t=e.neighbors||{},a=Object.entries(t);if(0===a.length)k="No neighbors discovered yet.",$="warning";else{const e=a.map(([e,t])=>{const a=t.name||t.node_name||"Unknown";return` ${e.slice(0,8)} ${a}`});k=`Neighbors (${a.length}):\n${e.join("\n")}`}}else if("board"===S)k="pyMC_Repeater (Linux/RPi)",$="value";else if(S.startsWith("get ")){const t=S.slice(4).trim(),a=null==(o=e.config)?void 0:o.delays,r=null==(i=e.config)?void 0:i.radio,s=null==(l=e.config)?void 0:l.repeater,n=null==(c=e.config)?void 0:c.duty_cycle;switch(t){case"name":k=(null==(h=e.config)?void 0:h.node_name)||"Unknown";break;case"role":k="repeater";break;case"lat":k=null!=(null==s?void 0:s.latitude)?String(s.latitude):"not set";break;case"lon":k=null!=(null==s?void 0:s.longitude)?String(s.longitude):"not set";break;case"freq":k=(null==r?void 0:r.frequency)?(r.frequency/1e6).toFixed(3):"?";break;case"tx":k=String((null==r?void 0:r.tx_power)??"?");break;case"bw":k=(null==r?void 0:r.bandwidth)?String(r.bandwidth/1e3):"?";break;case"sf":k=String((null==r?void 0:r.spreading_factor)??"?");break;case"cr":k=String((null==r?void 0:r.coding_rate)??"?");break;case"radio":k=r?`freq: ${(r.frequency/1e6).toFixed(3)} MHz\nbw: ${r.bandwidth/1e3} kHz\nsf: ${r.spreading_factor}\ncr: 4/${r.coding_rate}`:"?";break;case"af":case"txdelay":k=String((null==a?void 0:a.tx_delay_factor)??"1.0");break;case"direct.txdelay":k=String((null==a?void 0:a.direct_tx_delay_factor)??"0.5");break;case"mode":k=(null==s?void 0:s.mode)||"forward";break;case"repeat":k="forward"===(null==s?void 0:s.mode)?"on":"off";break;case"flood.max":k=String((null==s?void 0:s.max_flood_hops)??"3");break;case"flood.advert.interval":k=null!=(null==s?void 0:s.send_advert_interval_hours)?`${s.send_advert_interval_hours}h`:"?";break;case"advert.interval":k=null!=(null==s?void 0:s.advert_interval_minutes)?`${s.advert_interval_minutes}m`:"120m";break;case"rxdelay":k=String((null==a?void 0:a.rx_delay_base)??"0.0");break;case"duty":case"duty.enabled":k=(null==n?void 0:n.enforcement_enabled)?"on":"off";break;case"duty.max":k=null!=(null==n?void 0:n.max_airtime_percent)?`${n.max_airtime_percent}%`:"?";break;case"public.key":k=e.public_key||"not available";break;case"prv.key":k="Private key stored in /etc/pymc_repeater/config.yaml\n\nTo view: sudo grep identity_key /etc/pymc_repeater/config.yaml\nTo set: sudo ./convert_firmware_key.sh <64-byte-hex>",$="info";break;case"guest.password":case"allow.read.only":k="Security settings not exposed via stats API.\nCheck /etc/pymc_repeater/config.yaml",$="warning";break;default:k=`Unknown parameter: ${t}\nAvailable: name, role, lat, lon, freq, tx, bw, sf, cr, radio, af, txdelay, direct.txdelay, rxdelay, mode, repeat, flood.max, advert.interval, duty, public.key`,$="error"}"error"!==$&&($="value")}else if("advert"===S){const e=await p();k=e.success?"OK - Advert sent":`Error: ${e.error||"Failed"}`,$=e.success?"success":"error"}else if(S.startsWith("set mode ")){const e=S.split(" ")[2];if("forward"!==e&&"monitor"!==e)k='Error: Mode must be "forward" or "monitor"',$="error";else{const t=await m(e);k=t.success?`OK - Mode set to ${e}`:"Error: Failed",$=t.success?"success":"error"}}else if(S.startsWith("set duty ")){const e=S.split(" ")[2],t="on"===e||"1"===e,a=await u(t);k=a.success?"OK - Duty cycle "+(t?"enabled":"disabled"):"Error: Failed",$=a.success?"success":"error"}else if(S.startsWith("set tx ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||e<2||e>22)k="Error: TX power must be 2-22 dBm (SX1262 chip max)",$="error";else{const t=await y({tx_power:e});k=t.success?`OK - TX power set to ${e}dBm`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set af ")||S.startsWith("set txdelay ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<0||e>5)k="Error: TX delay factor must be 0.0-5.0",$="error";else{const t=await y({tx_delay_factor:e});k=t.success?`OK - TX delay set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set direct.txdelay ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<0||e>5)k="Error: Direct TX delay must be 0.0-5.0",$="error";else{const t=await y({direct_tx_delay_factor:e});k=t.success?`OK - Direct TX delay set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set log ")){const e=null==(v=S.split(" ")[2])?void 0:v.toUpperCase();if(["DEBUG","INFO","WARNING","ERROR"].includes(e)){const t=await g(e);k=t.success?`OK - Log level set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}else k="Error: Level must be debug, info, warning, or error",$="error"}else if(S.startsWith("set rxdelay ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<0)k="Error: RX delay must be >= 0",$="error";else{const t=await y({rx_delay_base:e});k=t.success?`OK - RX delay base set to ${e}s`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set name ")){const e=_.substring(9).trim();if(e){const t=await y({node_name:e});k=t.success?`OK - Node name set to "${e}"`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}else k="Error: Node name cannot be empty",$="error"}else if(S.startsWith("set lat ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<-90||e>90)k="Error: Latitude must be -90 to 90",$="error";else{const t=await y({latitude:e});k=t.success?`OK - Latitude set to ${e}°`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set lon ")){const e=parseFloat(S.split(" ")[2]);if(isNaN(e)||e<-180||e>180)k="Error: Longitude must be -180 to 180",$="error";else{const t=await y({longitude:e});k=t.success?`OK - Longitude set to ${e}°`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set flood.max ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||e<0||e>64)k="Error: Max flood hops must be 0-64",$="error";else{const t=await y({max_flood_hops:e});k=t.success?`OK - Max flood hops set to ${e}`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set flood.advert.interval ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||0!==e&&(e<3||e>48))k="Error: Flood advert interval must be 0 (off) or 3-48 hours",$="error";else{const t=await y({flood_advert_interval_hours:e});k=t.success?0===e?"OK - Flood adverts disabled":`OK - Flood advert interval set to ${e}h`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set advert.interval ")){const e=parseInt(S.split(" ")[2]);if(isNaN(e)||0!==e&&(e<1||e>10080))k="Error: Advert interval must be 0 (off) or 1-10080 minutes",$="error";else{const t=await y({advert_interval_minutes:e});k=t.success?0===e?"OK - Local adverts disabled":`OK - Local advert interval set to ${e}m`:`Error: ${t.error||"Failed"}`,$=t.success?"success":"error"}}else if(S.startsWith("set prv.key ")){const e=_.substring(12).trim();e?/^[0-9a-fA-F]+$/.test(e)?128!==e.length?(k=`Error: Key must be 64 bytes (128 hex chars), got ${e.length} chars`,$="error"):(k=`To set this key, run on the Pi:\n\n sudo ./convert_firmware_key.sh ${e}\n\nThen restart: sudo systemctl restart pymc-repeater`,$="info"):(k="Error: Private key must be a hex string",$="error"):(k="Error: Private key cannot be empty",$="error")}else if(S.startsWith("convert hex ")){const e=_.substring(12).trim();if(e)if(/^[0-9a-fA-F]+$/.test(e))if(e.length%2!=0)k="Error: Hex string must have even length",$="error";else try{const t=new Uint8Array(e.length/2);for(let s=0;s1&&!isNaN(r)&&r>0,n=s?t.slice(0,-1).join(" "):e,o=s?r:30;if(n){let e=1;const t=setInterval(()=>{e=e%3+1,x(O,{content:`Pinging ${n}${".".repeat(e)}`,outputType:"system"})},800);try{const e=await f(n,o);if(clearInterval(t),e.success&&e.data){const t=e.data,a=(null==(w=t.path)?void 0:w.length)?t.path.join(" → "):"direct";k=`Reply from ${t.target_id}\n RTT: ${t.rtt_ms.toFixed(1)}ms\n RSSI: ${t.rssi}dBm\n SNR: ${t.snr_db}dB\n Path: ${a}\n Quality: ${t.quality}`,$="success"}else k=e.error||"Ping failed",$="error"}catch(T){throw clearInterval(t),T}}else k="Usage: ping [timeout]",$="error"}else if("cap"===S||"cap help"===S){const e=n.isCapturing?'\nREC:::Recording in progress... use "end cap" to stop':"",t=n.reports.length;k=`HELP_HEADER:::Packet Capture\n\nstart cap:::Start capture (default: 120s)\nend cap:::Stop capture early\nlist cap:::List saved captures${t>0?` (${t} saved)`:""}\nexport cap:::Download capture by ID\n\nHELP_NOTE:::Captures stored in session memory. JSON includes decoded payloads.${e}`,$="info"}else if("start cap"===S||S.startsWith("start cap ")){const e=S.slice(10).trim(),t=e?parseInt(e):120;if(isNaN(t)||t<1||t>3600)k="Error: Duration must be 1-3600 seconds",$="error";else{if(!n.isCapturing){n.startCapture(s);let e=t;x(O,{content:`REC:::Capturing... ${e}s remaining`,outputType:"system"});const a=setInterval(()=>{e--;const t=P.getState();if(e>=0&&t.isCapturing){const a=Y.current.filter(e=>{if(!t.captureStartTime)return!1;const a=t.captureStartTime.getTime()/1e3;return e.timestamp>=a&&!t.captureStartPacketHashes.has(e.packet_hash)}).length;x(O,{content:`REC:::Capturing... ${e>0?`${e}s remaining`:"finishing..."} (${a} captured)`,outputType:"system"})}},1e3),r=setTimeout(()=>{clearInterval(a);const e=P.getState();if(e.isCapturing){const t=Y.current,a=e.stopCapture(t);b(a?{type:"output",content:`✓ Capture complete!\n Captured: ${a.packetCount} packets\n Duration: ${a.durationSec}s\n Size: ~${I(a.sizeBytes)}\n\nDOWNLOAD:::${a.id}:::${a.filename}`,outputType:"success"}:{type:"output",content:"Capture completed with no packets.",outputType:"warning"})}},1e3*t);return void n._setTimer(r)}k='Error: Capture already in progress. Use "end cap" first.',$="error"}}else if("end cap"===S)if(n.isCapturing){const e=n.stopCapture(s);e?(k=`✓ Capture complete!\n Captured: ${e.packetCount} packets\n Duration: ${e.durationSec}s\n Size: ~${I(e.sizeBytes)}\n\nDOWNLOAD:::${e.id}:::${e.filename}`,$="success"):(k="Capture stopped with no packets.",$="warning")}else k="No capture in progress.",$="warning";else if("list cap"===S){const e=n.reports;if(0===e.length)k="No capture reports available.\nStart a capture with: start cap [seconds]",$="info";else{const t=e.map((e,t)=>` ${t+1}. ${e.packetCount} pkts • ${e.durationSec}s • ~${I(e.sizeBytes)}\n DOWNLOAD:::${e.id}:::${e.filename}`);k=`Capture Reports (${e.length}):\n${t.join("\n")}`,$="info"}}else if("export cap"===S||S.startsWith("export cap ")){const e=S.slice(11).trim();if(e){const t=n.getReport(e);if(t)R(t,r),k=`✓ Downloading ${t.filename}...`,$="success";else{const t=parseInt(e)-1,a=n.reports[t];a?(R(a,r),k=`✓ Downloading ${a.filename}...`,$="success"):(k=`Error: Report "${e}" not found.\nUse "list cap" to see available reports.`,$="error")}}else{const e=n.reports;0===e.length?(k="No capture reports available.\nStart a capture with: start cap [seconds]",$="info"):(k=`Usage: export cap \n\nAvailable reports:\n${e.map((e,t)=>` ${t+1}. ${e.id}`).join("\n")}`,$="info")}}else k=`Unknown command: ${_}\nType 'help' for available commands.`,$="error";x(O,{content:k,outputType:$})}catch(E){x(O,{content:`Error: ${E instanceof Error?E.message:"Command failed"}`,outputType:"error"})}},[b,k,x,$,n,s,r]),se=e.useCallback(e=>{var t,a,r,s,n,o;if(D&&L.length>0){if("ArrowDown"===e.key){e.preventDefault();const s=Math.min(M+1,L.length-1);return q(s),void(null==(r=null==(a=null==(t=Q.current)?void 0:t.children[0])?void 0:a.children[s])||r.scrollIntoView({block:"nearest"}))}if("ArrowUp"===e.key){e.preventDefault();const t=Math.max(M-1,0);return q(t),void(null==(o=null==(n=null==(s=Q.current)?void 0:s.children[0])?void 0:n.children[t])||o.scrollIntoView({block:"nearest"}))}if("Tab"===e.key)return e.preventDefault(),void ae(M);if("Escape"===e.key)return e.preventDefault(),void G(!1)}if("Enter"===e.key){if(e.preventDefault(),D&&L.length>0){const e=L[M].cmd;return E(""),j(-1),G(!1),void re(e)}const t=T;return E(""),j(-1),G(!1),void re(t)}if("ArrowUp"!==e.key||D)if("ArrowDown"!==e.key||D);else if(e.preventDefault(),N>0){const e=N-1;j(e),E(i[i.length-1-e]||"")}else 0===N&&(j(-1),E(""));else if(e.preventDefault(),i.length>0&&N{E(e.target.value),K(e.target.selectionStart||e.target.value.length),te(e.target.value)},[te]),oe=e.useCallback(e=>{const t=e.target;K(t.selectionStart||0)},[]);return t.jsxs(w,{children:[t.jsx(_,{title:"Terminal",icon:t.jsx(h,{})}),t.jsx(S,{children:t.jsxs(O,{noPadding:!0,className:"terminal-card overflow-hidden flex flex-col isolate",onClick:Z,children:[t.jsx("div",{ref:J,className:"flex-1 overflow-y-auto font-mono text-sm p-3 sm:p-4 md:p-5 surface-themed","data-theme":"terminal",children:o.map(e=>t.jsx(H,{entry:e},e.id))}),t.jsxs("div",{className:"relative surface-themed","data-theme":"terminal-input",children:[t.jsxs("div",{className:"flex items-center gap-2 sm:gap-3 px-3 sm:px-4 py-2 sm:py-3",children:[t.jsx("span",{className:"text-text-muted font-mono font-bold select-none",children:"$"}),t.jsxs("div",{className:"flex-1 relative font-mono text-sm",children:[t.jsx("input",{ref:V,type:"text",value:T,onChange:ne,onKeyDown:se,onSelect:oe,onFocus:()=>X(!0),onBlur:()=>X(!1),disabled:!v,className:"absolute inset-0 w-full bg-transparent text-transparent outline-none disabled:opacity-50 selection:bg-transparent",style:{caretColor:"transparent"},autoFocus:!0,autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1}),t.jsx("div",{className:"relative pointer-events-none select-none","aria-hidden":!0,children:v?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"text-text-primary",children:T.slice(0,z)}),t.jsx("span",{className:a("inline-block w-[0.6em] h-[1.2em] align-text-bottom",B?"bg-accent-primary":"bg-text-muted/30"),style:{marginBottom:"-0.1em"},children:t.jsx("span",{className:"text-bg-primary",children:T[z]||""})}),t.jsx("span",{className:"text-text-primary",children:T.slice(z+1)})]}):t.jsx("span",{className:"text-text-muted",children:"Connecting..."})})]})]}),t.jsxs("div",{className:"px-3 sm:px-4 py-1 flex justify-between text-[10px] text-text-muted surface-themed","data-theme":"terminal-status",children:[t.jsx("span",{className:"hidden sm:inline",children:"↑↓ History"}),t.jsx("span",{className:"sm:hidden",children:"Terminal"}),(null==r?void 0:r.version)&&t.jsxs("span",{children:["pyMC v",r.version]})]})]}),D&&L.length>0&&t.jsxs("div",{ref:Q,className:"absolute left-2 right-2 bottom-[72px] radius-inset overflow-hidden z-50 surface-themed","data-theme":"terminal-autocomplete",children:[t.jsx("div",{className:"max-h-64 overflow-y-auto",children:L.map((e,r)=>t.jsxs("div",{onClick:()=>ae(r),className:a("px-4 py-2.5 cursor-pointer last:border-b-0 transition-colors surface-divider-bottom",r===M?"bg-accent-primary/25":""),"data-theme":"terminal",onMouseEnter:e=>{r!==M&&(e.currentTarget.style.background="var(--terminal-autocomplete-hover)")},onMouseLeave:e=>{r!==M&&(e.currentTarget.style.background="transparent")},children:[t.jsx("span",{className:a("font-mono text-sm",r===M?"text-accent-primary":"text-text-primary"),children:e.cmd}),t.jsx("span",{className:"text-xs text-text-muted ml-4",children:e.desc})]},e.cmd))}),t.jsx("div",{className:"px-3 py-1.5 text-[10px] text-text-muted text-right surface-divider-top","data-theme":"terminal",style:{backgroundColor:"var(--terminal-autocomplete-hover)"},children:"Tab to select"})]})]})})]})}export{M as default}; diff --git a/frontend/dist/assets/TimeRangeSelector-C89_yLwH.js b/frontend/dist/assets/TimeRangeSelector-C89_yLwH.js new file mode 100644 index 00000000..e7c06a4d --- /dev/null +++ b/frontend/dist/assets/TimeRangeSelector-C89_yLwH.js @@ -0,0 +1 @@ +import{c as e,aJ as a}from"./index-D22MpaCY.js";import{r as s,j as o,c as t}from"./vendor-react-Cwum97tW.js";import{A as i}from"./index-bDa2a9Y2.js";const r=e("ear-off",[["path",{d:"M6 18.5a3.5 3.5 0 1 0 7 0c0-1.57.92-2.52 2.04-3.46",key:"1qngmn"}],["path",{d:"M6 8.5c0-.75.13-1.47.36-2.14",key:"b06bma"}],["path",{d:"M8.8 3.15A6.5 6.5 0 0 1 19 8.5c0 1.63-.44 2.81-1.09 3.76",key:"g10hsz"}],["path",{d:"M12.5 6A2.5 2.5 0 0 1 15 8.5M10 13a2 2 0 0 0 1.82-1.18",key:"ygzou7"}],["line",{x1:"2",x2:"22",y1:"2",y2:"22",key:"a6p6uj"}]]),n={type:"spring",visualDuration:.4,bounce:.15,opacity:{duration:.15,ease:"linear"}},c=s.memo(function({value:e,format:t,prefix:r,suffix:c,className:l,priority:m="medium"}){const[u,f]=s.useState(!1),[p,d]=s.useState(e);s.useEffect(()=>a(()=>{f(!0),d(0)},m),[m]),s.useEffect(()=>{u&&d(e)},[u,e]);const g=`${r??""}${e.toLocaleString(void 0,t)}${c??""}`;return u?o.jsx(i,{className:`${l??""} overflow-hidden`,format:t,prefix:r,suffix:c,transition:n,children:p}):o.jsx("span",{className:l,children:g})}),l=s.memo(function({ranges:e,selectedIndex:a,onSelect:s,isPending:i,size:r="default"}){const n="sm"===r?"toggle-group-sm":"micro"===r?"toggle-group-micro":"";return o.jsx("div",{className:t("toggle-group flex-shrink-0 overflow-x-auto",n,i&&"opacity-70"),children:e.map((e,i)=>o.jsx("button",{onClick:()=>s(i),className:t("toggle-group-item",a===i&&"active"),children:e.label},e.label))})});export{c as A,r as E,l as T}; diff --git a/frontend/dist/assets/TimeRangeSelector-CDHWyMqL.js b/frontend/dist/assets/TimeRangeSelector-CDHWyMqL.js deleted file mode 100644 index 66b8d2fa..00000000 --- a/frontend/dist/assets/TimeRangeSelector-CDHWyMqL.js +++ /dev/null @@ -1 +0,0 @@ -import{c as e,aU as a}from"./index-CZBrdv20.js";import{r as s,j as t,c as o}from"./vendor-react-DFCqJxYC.js";import{A as i}from"./index-BKfnA8uz.js";const r=e("ear-off",[["path",{d:"M6 18.5a3.5 3.5 0 1 0 7 0c0-1.57.92-2.52 2.04-3.46",key:"1qngmn"}],["path",{d:"M6 8.5c0-.75.13-1.47.36-2.14",key:"b06bma"}],["path",{d:"M8.8 3.15A6.5 6.5 0 0 1 19 8.5c0 1.63-.44 2.81-1.09 3.76",key:"g10hsz"}],["path",{d:"M12.5 6A2.5 2.5 0 0 1 15 8.5M10 13a2 2 0 0 0 1.82-1.18",key:"ygzou7"}],["line",{x1:"2",x2:"22",y1:"2",y2:"22",key:"a6p6uj"}]]),n={type:"spring",visualDuration:.4,bounce:.15,opacity:{duration:.15,ease:"linear"}},c=s.memo(function({value:e,format:o,prefix:r,suffix:c,className:l,priority:m="medium"}){const[u,f]=s.useState(!1),[p,d]=s.useState(e);s.useEffect(()=>a(()=>{f(!0),d(0)},m),[m]),s.useEffect(()=>{u&&d(e)},[u,e]);const g=`${r??""}${e.toLocaleString(void 0,o)}${c??""}`;return u?t.jsx(i,{className:l,format:o,prefix:r,suffix:c,transition:n,children:p}):t.jsx("span",{className:l,children:g})}),l=s.memo(function({ranges:e,selectedIndex:a,onSelect:s,isPending:i,size:r="default"}){const n="sm"===r?"toggle-group-sm":"micro"===r?"toggle-group-micro":"";return t.jsx("div",{className:o("toggle-group flex-shrink-0 overflow-x-auto",n,i&&"opacity-70"),children:e.map((e,i)=>t.jsx("button",{onClick:()=>s(i),className:o("toggle-group-item",a===i&&"active"),children:e.label},e.label))})});export{c as A,r as E,l as T}; diff --git a/frontend/dist/assets/activity-Cb8TQBuo.js b/frontend/dist/assets/activity-Cb8TQBuo.js new file mode 100644 index 00000000..a2efbf01 --- /dev/null +++ b/frontend/dist/assets/activity-Cb8TQBuo.js @@ -0,0 +1 @@ +import{c as a}from"./index-D22MpaCY.js";const t=a("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);export{t as A}; diff --git a/frontend/dist/assets/arrow-up-Bv56Dbd2.js b/frontend/dist/assets/arrow-up-DysUUcGL.js similarity index 75% rename from frontend/dist/assets/arrow-up-Bv56Dbd2.js rename to frontend/dist/assets/arrow-up-DysUUcGL.js index bd405958..f26a11c9 100644 --- a/frontend/dist/assets/arrow-up-Bv56Dbd2.js +++ b/frontend/dist/assets/arrow-up-DysUUcGL.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const e=a("arrow-down",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]),r=a("arrow-up",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);export{e as A,r as a}; +import{c as a}from"./index-D22MpaCY.js";const e=a("arrow-down",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]),r=a("arrow-up",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);export{e as A,r as a}; diff --git a/frontend/dist/assets/chevron-right-CZNwXWtt.js b/frontend/dist/assets/chevron-right-CZNwXWtt.js new file mode 100644 index 00000000..e35e6302 --- /dev/null +++ b/frontend/dist/assets/chevron-right-CZNwXWtt.js @@ -0,0 +1 @@ +import{c as t}from"./index-D22MpaCY.js";const h=t("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);export{h as C}; diff --git a/frontend/dist/assets/chevron-right-CchtyLvr.js b/frontend/dist/assets/chevron-right-CchtyLvr.js deleted file mode 100644 index 8a0372b7..00000000 --- a/frontend/dist/assets/chevron-right-CchtyLvr.js +++ /dev/null @@ -1 +0,0 @@ -import{c as t}from"./index-CZBrdv20.js";const h=t("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);export{h as C}; diff --git a/frontend/dist/assets/chevron-up-Cn6bmTpb.js b/frontend/dist/assets/chevron-up-Cn6bmTpb.js deleted file mode 100644 index 724e5a77..00000000 --- a/frontend/dist/assets/chevron-up-Cn6bmTpb.js +++ /dev/null @@ -1 +0,0 @@ -import{c as a}from"./index-CZBrdv20.js";const t=a("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]),e=a("chevron-up",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);export{t as A,e as C}; diff --git a/frontend/dist/assets/circle-check-BQrKpAc_.js b/frontend/dist/assets/circle-check-CKXuJpMJ.js similarity index 62% rename from frontend/dist/assets/circle-check-BQrKpAc_.js rename to frontend/dist/assets/circle-check-CKXuJpMJ.js index 78c613e9..8c7a0bef 100644 --- a/frontend/dist/assets/circle-check-BQrKpAc_.js +++ b/frontend/dist/assets/circle-check-CKXuJpMJ.js @@ -1 +1 @@ -import{c}from"./index-CZBrdv20.js";const e=c("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);export{e as C}; +import{c}from"./index-D22MpaCY.js";const e=c("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);export{e as C}; diff --git a/frontend/dist/assets/compass-ipowibkG.js b/frontend/dist/assets/compass-Bsfx4e84.js similarity index 74% rename from frontend/dist/assets/compass-ipowibkG.js rename to frontend/dist/assets/compass-Bsfx4e84.js index 0fd53259..dc5c85f4 100644 --- a/frontend/dist/assets/compass-ipowibkG.js +++ b/frontend/dist/assets/compass-Bsfx4e84.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const c=a("compass",[["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);export{c as C}; +import{c as a}from"./index-D22MpaCY.js";const c=a("compass",[["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);export{c as C}; diff --git a/frontend/dist/assets/decryption.worker-C84ax0zu.js b/frontend/dist/assets/decryption.worker-C84ax0zu.js new file mode 100644 index 00000000..e240f6b2 --- /dev/null +++ b/frontend/dist/assets/decryption.worker-C84ax0zu.js @@ -0,0 +1 @@ +!function(){"use strict";function a(a){const e=a.replace(/^0x/i,"").replace(/\s/g,"");if(e.length%2!=0)throw new Error("Invalid hex string: odd number of characters");const o=new Uint8Array(e.length/2);for(let l=0;l>>e|a<<32-e)>>>0}function r(a,e){let l=a[0],r=a[1],i=a[2],s=a[3],t=a[4],c=a[5],d=a[6],u=a[7];for(let h=0;h<64;h++){if(h>=16){const a=n(e[h-15&15],7)^n(e[h-15&15],18)^e[h-15&15]>>>3,o=n(e[h-2&15],17)^n(e[h-2&15],19)^e[h-2&15]>>>10;e[15&h]=e[15&h]+a+e[h-7&15]+o>>>0}const a=u+(n(t,6)^n(t,11)^n(t,25))+(t&c^~t&d)+o[h]+e[15&h]>>>0,m=l&r^l&i^r&i;u=d,d=c,c=t,t=s+a>>>0,s=i,i=r,r=l,l=a+((n(l,2)^n(l,13)^n(l,22))+m>>>0)>>>0}a[0]=a[0]+l>>>0,a[1]=a[1]+r>>>0,a[2]=a[2]+i>>>0,a[3]=a[3]+s>>>0,a[4]=a[4]+t>>>0,a[5]=a[5]+c>>>0,a[6]=a[6]+d>>>0,a[7]=a[7]+u>>>0}function i(a){const e=new Uint32Array(l),o=new Uint32Array(16),n=8*a.length,i=a.length+9+63&-64,s=new Uint8Array(i);s.set(a),s[a.length]=128;const t=new DataView(s.buffer);t.setUint32(i-4,n,!1);for(let l=0;l>=1}return o}function h(a){let e=a[13];a[13]=a[9],a[9]=a[5],a[5]=a[1],a[1]=e,e=a[2],a[2]=a[10],a[10]=e,e=a[6],a[6]=a[14],a[14]=e,e=a[3],a[3]=a[7],a[7]=a[11],a[11]=a[15],a[15]=e}function m(a){for(let e=0;e<16;e++)a[e]=c[a[e]]}function p(a,e){for(let o=0;o<16;o++)a[o]^=e[o]}function g(a){for(let e=0;e<4;e++){const o=4*e,l=a[o],n=a[o+1],r=a[o+2],i=a[o+3];a[o]=u(14,l)^u(11,n)^u(13,r)^u(9,i),a[o+1]=u(9,l)^u(14,n)^u(11,r)^u(13,i),a[o+2]=u(13,l)^u(9,n)^u(14,r)^u(11,i),a[o+3]=u(11,l)^u(13,n)^u(9,r)^u(14,i)}}function b(a,e){const o=new Uint8Array(a);p(o,e[10]);for(let l=9;l>=1;l--)h(o),m(o),p(o,e[l]),g(o);return h(o),m(o),p(o,e[0]),o}function v(a,e){const o=function(a){const e=[],o=new Uint8Array(176);o.set(a.slice(0,16));for(let l=16;l<176;l+=4){let a=o[l-4],e=o[l-3],n=o[l-2],r=o[l-1];if(l%16==0){const o=a;a=t[e]^d[l/16-1],e=t[n],n=t[r],r=t[o]}o[l]=o[l-16]^a,o[l+1]=o[l-15]^e,o[l+2]=o[l-14]^n,o[l+3]=o[l-13]^r}for(let l=0;l<11;l++)e.push(o.slice(16*l,16*(l+1)));return e}(a),l=new Uint8Array(e.length);for(let n=0;no?(l=new Uint8Array(o),l.set(i(a))):(l=new Uint8Array(o),l.set(a));const n=new Uint8Array(o),r=new Uint8Array(o);for(let i=0;i=2024&&o<=2030;if(!l)return{valid:!1,confidence:"low"};const n=a.slice(5);if(0===n.length)return{valid:!1,confidence:"low"};let r=0,i=!1;for(let t=0;t=32&&a<=126||0===a||10===a||13===a||9===a)&&r++,58===a&&(i=!0)}const s=r/n.length;return s>=.85&&i&&l?{valid:!0,confidence:"high"}:s>=.7&&l?{valid:!0,confidence:"medium"}:{valid:!1,confidence:"low"}}async function U(e){const o={packetHash:e.packet_hash,success:!1,channelHash:"",packetTimestamp:e.timestamp,rssi:e.rssi,snr:e.snr};if(5!==(e.type??e.payload_type))return o;const l=function(e){if(!e||e.length<4)return null;const o=3&parseInt(e.slice(0,2),16);let l=2;0!==o&&3!==o||(l=10);const n=parseInt(e.slice(l,l+2),16);l+=2,l+=2*n;const r=e.slice(l);return r.length<8?null:a(r)}(e.raw_packet);if(!l||l.length<4)return o;const n=l[0],r=l.slice(1,3),i=l.slice(3);o.channelHash=function(a,e=!0){const o=(255&a).toString(16).padStart(2,"0");return e?o.toUpperCase():o}(n,!0);const s=await async function(a,e,o){const l=(n=a,j.get(n)??[]);var n;const r=[];for(const s of l){if(await q(s,e,o))return{keys:s,plaintext:v(s.aesKey,o)};r.push(s)}let i=null;for(const s of r)try{const a=v(s.aesKey,o),e=A(a);if(e.valid){if("high"===e.confidence)return{keys:s,plaintext:a,macCorrupted:!0};"medium"!==e.confidence||i||(i={keys:s,plaintext:a,confidence:"medium"})}}catch{}return i?{keys:i.keys,plaintext:i.plaintext,macCorrupted:!0}:null}(n,r,i);if(!s)return o;const{keys:t,plaintext:c,macCorrupted:d}=s;if(c.length<5)return o;const u=((h=c)[0]|h[1]<<8|h[2]<<16|h[3]<<24)>>>0;var h;const m=c[4],p=new TextDecoder("utf-8",{fatal:!1}).decode(c.slice(5)).replace(/\uFFFD/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/g,"").replace(/\x00+$/,"").trim();o.success=!0,o.channelName=t.name,o.timestamp=u,o.flags=m,o.macCorrupted=d;const g=p.indexOf(": ");return g>0?(o.senderName=p.slice(0,g),o.text=p.slice(g+2)):o.text=p,o}self.onmessage=async a=>{const e=a.data;switch(e.type){case"decrypt":{const a=performance.now();await async function(){if(z)return;const a=w,e=(await s(a))[0],o=new Uint8Array(32);o.set(a);const l={name:"Public",channelHash:e,aesKey:a.slice(0,16),hmacKey:o};j.has(l.channelHash)||j.set(l.channelHash,[]),j.get(l.channelHash).push(l);for(const n of k)try{const a=await x(n);j.has(a.channelHash)||j.set(a.channelHash,[]),j.get(a.channelHash).push(a)}catch{}for(const n of y)try{const a=await x(n);j.has(a.channelHash)||j.set(a.channelHash,[]);const e=j.get(a.channelHash);e.some(e=>e.name===a.name)||e.push(a)}catch{}for(const n of f)try{const a=await x(n);j.has(a.channelHash)||j.set(a.channelHash,[]);const e=j.get(a.channelHash);e.some(e=>e.name===a.name)||e.push(a)}catch{}z=!0}();const o=e.packets;let l=0,n=0;for(let e=0;e100&&(self.postMessage({type:"progress",processed:e+1,total:o.length}),n=r)}const r=performance.now()-a;self.postMessage({type:"batchComplete",successCount:l,totalCount:o.length,computeTimeMs:r});break}}},self.postMessage({type:"ready"})}(); diff --git a/frontend/dist/assets/git-branch-CU4ha9LK.js b/frontend/dist/assets/git-branch-Cev-c9BQ.js similarity index 76% rename from frontend/dist/assets/git-branch-CU4ha9LK.js rename to frontend/dist/assets/git-branch-Cev-c9BQ.js index 229002b7..edfc1ec7 100644 --- a/frontend/dist/assets/git-branch-CU4ha9LK.js +++ b/frontend/dist/assets/git-branch-Cev-c9BQ.js @@ -1 +1 @@ -import{c}from"./index-CZBrdv20.js";const e=c("git-branch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);export{e as G}; +import{c}from"./index-D22MpaCY.js";const e=c("git-branch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);export{e as G}; diff --git a/frontend/dist/assets/house-BPemXMFi.js b/frontend/dist/assets/house-D2cJ2w9-.js similarity index 86% rename from frontend/dist/assets/house-BPemXMFi.js rename to frontend/dist/assets/house-D2cJ2w9-.js index 865a42ba..70975faf 100644 --- a/frontend/dist/assets/house-BPemXMFi.js +++ b/frontend/dist/assets/house-D2cJ2w9-.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const e=a("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]),s=a("house",[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"r6nss1"}]]);export{e as D,s as H}; +import{c as a}from"./index-D22MpaCY.js";const e=a("database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]),s=a("house",[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"r6nss1"}]]);export{e as D,s as H}; diff --git a/frontend/dist/assets/index-BKfnA8uz.js b/frontend/dist/assets/index-BKfnA8uz.js deleted file mode 100644 index f4d82084..00000000 --- a/frontend/dist/assets/index-BKfnA8uz.js +++ /dev/null @@ -1 +0,0 @@ -import{r as t,j as e}from"./vendor-react-DFCqJxYC.js";import{bV as n,bW as r,bX as a,bY as s,M as i,h as o,bZ as l,b_ as u,b$ as c,c0 as f,b as p,c1 as y,c2 as d,c3 as h,c4 as m,c5 as g,c6 as x,c7 as v,c8 as b,c9 as j,ca as w,cb as k,cc as A,cd as $,ce as M,m as D,cf as S,cg as C,A as R,ae as I,ch as E,ci as F}from"./index-CZBrdv20.js";function N(t,e){return n(t)?t[((t,e,n)=>{const r=e-0;return((n-0)%r+r)%r+0})(0,t.length,e)]:t}class P{constructor(t){this.stop=()=>this.runAll("stop"),this.animations=t.filter(Boolean)}get finished(){return Promise.all(this.animations.map(t=>t.finished))}getAll(t){return this.animations[0][t]}setAll(t,e){for(let n=0;ne.attachTimeline(t));return()=>{e.forEach((t,e)=>{t&&t(),this.animations[e].stop()})}}get time(){return this.getAll("time")}set time(t){this.setAll("time",t)}get speed(){return this.getAll("speed")}set speed(t){this.setAll("speed",t)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){return T(this.animations,"duration")}get iterationDuration(){return T(this.animations,"iterationDuration")}runAll(t){this.animations.forEach(e=>e[t]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}function T(t,e){let n=0;for(let r=0;rn&&(n=a)}return n}class W extends P{then(t,e){return this.finished.finally(t).then(()=>{})}}class O extends r{constructor(){super(...arguments),this.type="object"}readValueFromInstance(t,e){if(function(t,e){return t in e}(e,t)){const n=t[e];if("string"==typeof n||"number"==typeof n)return n}}getBaseTargetFromProps(){}removeValueFromRenderState(t,e){delete e.output[t]}measureInstanceViewportBox(){return a()}build(t,e){Object.assign(t.output,e)}renderInstance(t,{output:e}){Object.assign(t,e)}sortInstanceNodePosition(){return 0}}function V({children:n,isValidProp:r,...a}){r&&s(r),(a={...t.useContext(i),...a}).isStatic=o(()=>a.isStatic);const l=t.useMemo(()=>a,[JSON.stringify(a.transition),a.transformPagePoint,a.reducedMotion]);return e.jsx(i.Provider,{value:l,children:n})}function L(e){const n=o(()=>l(e)),{isStatic:r}=t.useContext(i);if(r){const[,r]=t.useState(e);t.useEffect(()=>n.on("change",r),[])}return n}function B(t){return"object"==typeof t&&!Array.isArray(t)}function z(t,e,n,r){return null==t?[]:"string"==typeof t&&B(e)?u(t,n,r):t instanceof NodeList?Array.from(t):Array.isArray(t)?t.filter(t=>null!=t):[t]}function H(t,e,n){return t*(e+1)}function X(t,e,n,r){return"number"==typeof e?e:e.startsWith("-")||e.startsWith("+")?Math.max(0,t+parseFloat(e)):"<"===e?n:e.startsWith("<")?Math.max(0,n+parseFloat(e.slice(1))):r.get(e)??t}function K(t,e,n,r,a,s){!function(t,e,n){for(let r=0;re&&a.at"number"==typeof t,U=t=>t.every(Q);function tt(t){const e={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},n=v(t)&&!b(t)?new j(e):new w(e);n.mount(t),k.set(t,n)}function et(t){const e=new O({presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}});e.mount(t),k.set(t,e)}function nt(t,e,n,r){const a=[];if(function(t,e){return p(t)||"number"==typeof t||"string"==typeof t&&!B(e)}(t,e))a.push(A(t,B(e)&&e.default||e,n&&n.default||n));else{if(null==t)return a;const s=z(t,e,r),i=s.length;for(let t=0;t{const l=q(t),{delay:u=0,times:c=y(l),type:p=e.type||"keyframes",repeat:x,repeatType:b,repeatDelay:j=0,...k}=n;let{ease:A=e.ease||"easeOut",duration:$}=n;const M="function"==typeof u?u(i,o):u,D=l.length,S=m(p)?p:null==a?void 0:a[p||"keyframes"];if(D<=2&&S){let t=100;if(2===D&&U(l)){const e=l[1]-l[0];t=Math.abs(e)}const n={...e,...k};void 0!==$&&(n.duration=g($));const r=d(n,t,S);A=r.ease,$=r.duration}$??($=s);const C=f+M;1===c.length&&0===c[0]&&(c[1]=1);const R=c.length-l.length;if(R>0&&h(c,R),1===l.length&&l.unshift(null),x){$=H($,x);const t=[...l],e=[...c];A=Array.isArray(A)?[...A]:[A];const n=[...A];for(let r=0;r{for(const a in t){const s=t[a];s.sort(J);const o=[],l=[],u=[];for(let t=0;t{r.push(...nt(n,t,e))}),r}(t,e,at);else{const{onComplete:s,...i}=n||{};"function"==typeof s&&(r=s),a=nt(t,e,i,at)}var s;const i=new W(a);return r&&i.finished.then(r),i};var at;const st="var(--mask-height, 0.15em)",it="var(--mask-width, 0.5em)",ot=`calc(${it} / var(--invert-x, 1))`,lt="#000 0, transparent 71%",ut=`linear-gradient(to right, transparent 0, #000 ${ot}, #000 calc(100% - ${ot}), transparent),linear-gradient(to bottom, transparent 0, #000 ${st}, #000 calc(100% - ${st}), transparent 100%),radial-gradient(at bottom right, ${lt}),radial-gradient(at bottom left, ${lt}), radial-gradient(at top left, ${lt}), radial-gradient(at top right, ${lt})`,ct=`100% calc(100% - ${st} * 2),calc(100% - ${ot} * 2) 100%,${ot} ${st},${ot} ${st},${ot} ${st},${ot} ${st}`;function ft({children:t,layoutDependency:n}){return e.jsx(D.span,{layout:!0,layoutDependency:n,"aria-hidden":!0,style:{display:"inline-flex","--invert-x":1,margin:`0 calc(-1*${it})`,padding:`calc(${st}/2) ${it}`,position:"relative",zIndex:-1,overflow:"clip",WebkitMaskImage:ut,WebkitMaskSize:ct,WebkitMaskPosition:"center, center, top left, top right, bottom right, bottom left",WebkitMaskRepeat:"no-repeat"},children:t})}function pt(){const e=t.useRef(!0);return t.useEffect(()=>{e.current=!1},[]),e.current}function yt(t){const{width:e,fontSize:n}=getComputedStyle(t);return parseFloat(e)/parseFloat(n)+"em"}S({"--invert-x":{correct:(t,{treeScale:e,projectionDelta:n})=>n.x.scale*e.x}});const dt=new WeakMap,ht=t.forwardRef(function({value:n,initialValue:r=n,...a},s){const{transition:o}=t.useContext(i),l=t.useRef(r).current,u=pt(),c=t.useRef(null),f=t.useRef(null);t.useImperativeHandle(s,()=>f.current,[]);const p=t.useRef(new Array(10)),y=C(),d=y?n:0;t.useLayoutEffect(()=>{c.current&&p.current[l]&&(c.current.style.width=yt(p.current[l]))},[]);const h=t.useRef(r);t.useLayoutEffect(()=>{var t;if(!c.current||d===h.current)return;const e=c.current.getBoundingClientRect(),n=null==(t=f.current)?void 0:t.getBoundingClientRect(),r=e.height*(d-h.current)+(e.top-(n?n.top||0:e.top));return rt(c.current,{y:[r,0]},o),()=>{h.current=d}},[d]);const[m,g]=t.useState();t.useEffect(()=>{if(u&&l===d)return;if(!p.current[d])return;const t=yt(p.current[d]);f.current&&dt.set(f.current,t),g(t)},[d]);const x=t=>e.jsx("span",{style:{display:"inline-block",padding:`calc(${st}/2) 0`},ref:e=>{p.current[t]=e},children:t},t);return e.jsx(D.span,{...a,ref:f,layout:"position","data-state":y?void 0:"exiting",style:{display:"inline-flex",justifyContent:"center",width:m},children:e.jsxs("span",{ref:c,style:{display:"inline-flex",justifyContent:"center",flexDirection:"column",alignItems:"center",position:"relative"},children:[0!==d&&e.jsx("span",{style:{...mt,bottom:"100%",left:0},children:new Array(d).fill(null).map((t,e)=>x(e))}),x(d),9!==d&&e.jsx("span",{style:{...mt,top:"100%",left:0},children:new Array(9-d).fill(null).map((t,e)=>x(d+e+1))})]})})}),mt={display:"flex",flexDirection:"column",alignItems:"center",position:"absolute",width:"100%"},gt=t.createContext({justify:"left"}),xt=t.forwardRef(function({partKey:n,type:r,children:a,layoutDependency:s,...i},o){const l=C(),{justify:u}=t.useContext(gt);return e.jsx(D.span,{...i,"data-state":l?void 0:"exiting",style:{display:"inline-flex",justifyContent:u,padding:`calc(${st}/2) 0`,position:"relative"},layout:"position",layoutDependency:s,ref:o,children:e.jsx(R,{mode:"popLayout",anchorX:u,initial:!1,children:e.jsx(D.span,{layout:"right"===u&&"position",layoutDependency:s,initial:{opacity:0},animate:{opacity:[null,1]},exit:{opacity:[null,0]},style:{display:"inline-block",whiteSpace:"pre"},children:a},a)})})}),vt=t.forwardRef(function({parts:n,justify:r="left",mode:a,style:s,name:i,layoutDependency:o,...l},u){const c=t.useRef(null);t.useImperativeHandle(u,()=>c.current,[]);const f=t.useMemo(()=>({justify:r}),[r]),p=t.useRef(null),y=pt(),[d,h]=t.useState();return t.useEffect(()=>{if(!p.current)return;if(y)return void(c.current&&(c.current.style.width=yt(p.current)));const t=Array.from(p.current.children).map(t=>{if(!(t instanceof HTMLElement))return;if("exiting"===t.dataset.state){const e=t.nextSibling;return t.remove(),()=>{p.current&&p.current.insertBefore(t,e)}}const e=dt.get(t);if(!e)return;const n=t.style.width;return t.style.width=e,()=>{t.style.width=n}});h(yt(p.current));for(let e=t.length-1;e>=0;e--){const n=t[e];n&&n()}},[n.map(t=>t.value).join("")]),e.jsx(gt.Provider,{value:f,children:e.jsx(D.span,{layoutDependency:o,...l,ref:c,className:`number-section-${i}`,style:{...s,display:"inline-flex",justifyContent:r,width:d},children:e.jsxs("span",{ref:p,style:{display:"inline-flex",justifyContent:"inherit",position:"relative"},children:["​",e.jsx(R,{mode:a,anchorX:r,initial:!1,children:n.map(t=>"integer"===t.type||"fraction"===t.type?e.jsx(ht,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},value:t.value,initialValue:y?void 0:0,layoutDependency:o},t.key):e.jsx(xt,{type:t.type,partKey:t.key,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},layoutDependency:o,children:t.value},"literal"===t.type?`${t.key}:${t.value}`:t.key))})]})})})}),bt={opacity:{duration:1,ease:E},layout:{type:"spring",duration:1,bounce:0},y:{type:"spring",duration:1,bounce:0}},jt=t.forwardRef(function({children:n,locales:r,format:a,transition:s,style:o,suffix:l,prefix:u,...c},f){const p=t.useMemo(()=>((t,{locales:e,format:n},r,a)=>{const s=new Intl.NumberFormat(e,n).formatToParts(Number(t));r&&s.unshift({type:"prefix",value:r}),a&&s.push({type:"suffix",value:a});const i=[],o=[],l=[],u=[],c={},f=t=>`${t}:${c[t]=(c[t]??-1)+1}`;let p="",y=!1,d=!1;for(const m of s){p+=m.value;const t="minusSign"===m.type||"plusSign"===m.type?"sign":m.type;switch(t){case"integer":y=!0,o.push(...m.value.split("").map(e=>({type:t,value:parseInt(e)})));break;case"group":o.push({type:t,value:m.value});break;case"decimal":d=!0,l.push({type:t,value:m.value,key:f(t)});break;case"fraction":l.push(...m.value.split("").map(e=>({type:t,value:parseInt(e),key:f(t)})));break;default:(y||d?u:i).push({type:t,value:m.value,key:f(t)})}}const h=[];for(let m=o.length-1;m>=0;m--)h.unshift({...o[m],key:f(o[m].type)});return{pre:i,integer:h,fraction:l,post:u,formatted:p}})(n,{locales:r,format:a},u,l),[n,r,a]),{pre:y,integer:d,fraction:h,post:m,formatted:g}=p,x=t.useContext(i).transition;s=s??x??bt;const{layoutDependency:v}=c,b=t.useMemo(()=>{if(void 0!==v)return{layoutDependency:v,value:n}},[v,n]);return e.jsx(I,{children:e.jsx(V,{transition:s,children:e.jsx(D.div,{...c,ref:f,layout:!0,layoutDependency:b,style:{lineHeight:1,...o,display:"inline-flex",isolation:"isolate",whiteSpace:"nowrap"},children:e.jsxs(D.div,{layout:!0,layoutDependency:b,"aria-label":g,style:{display:"inline-flex",direction:"ltr",isolation:"isolate",position:"relative",zIndex:-1},children:[e.jsx(vt,{style:{padding:`calc(${st}/2) 0`},layoutDependency:b,"aria-hidden":!0,justify:"right",mode:"popLayout",parts:y,name:"pre"}),e.jsxs(ft,{layoutDependency:b,children:[e.jsx(vt,{layoutDependency:b,justify:"right",parts:d,name:"integer"}),e.jsx(vt,{layout:"position",layoutDependency:b,parts:h,name:"fraction"})]}),e.jsx(vt,{style:{padding:`calc(${st}/2) 0`},"aria-hidden":!0,layout:"position",layoutDependency:b,mode:"popLayout",parts:m,name:"post"})]})})})})});function wt(t,e){return t.length>e.length||t.length>0&&!e.startsWith(t)}function kt(t,e,n){return t+(e-t)*n}D.create(t.Fragment);const At=new Set([".",",","!","?",":",";","'",'"',"-","(",")"]),$t=new Set(["!","@","#","$","%","^","&","*","(",")","_","+","{","}","|",":",'"',"<",">","?"]);const Mt={slow:130,normal:75,fast:30};t.forwardRef(function({children:n="",as:r,speed:a="normal",variance:s="natural",cursorClassName:i="motion-typewriter-cursor",cursorStyle:o,cursorBlinkDuration:l=.5,onComplete:u,play:c=!0,"aria-label":f,textClassName:p,textStyle:y,replace:d="type",backspace:h="character",backspaceFactor:m=.2,...g},x){const v=r||"span",b=t.useRef(n),j=L(""),w=t.useRef(null),k=t.useRef(null),A=t.useRef(null),$="number"==typeof a?a:Mt[a],M=()=>{var t;null==(t=w.current)||t.call(w),w.current=null},S=()=>{k.current=rt(A.current,{opacity:[1,1,0,0]},{duration:l,times:[0,.5,.5,1],ease:"linear",repeat:1/0,repeatType:"reverse"})};return t.useEffect(()=>{"all"===d&&n!==b.current&&j.set(""),b.current=n},[n,d]),t.useEffect(()=>{var t;if(!c)return S(),void M();null==(t=k.current)||t.cancel();const e=()=>{const t=function(t,e,n,r){if("type"===n&&wt(t,e)){if("all"===r)return e.slice(0,function(t,e){const n=Math.min(t.length,e.length);let r=0;for(let a=0;a=0&&/\s/.test(t[n]);)n--;for(;n>=0&&!/\s/.test(t[n]);)n--;return Math.max(0,n+1)}(t,t.length);return t.slice(0,e)}return t.slice(0,-1)}return e.slice(0,t.length+1)}(j.get(),n,d,h);j.set(t),t!==n?r():(S(),null==u||u())},r=()=>{w.current=F(e,function(t,e,n,r,a){if(wt(e,t))return n*a;if("natural"===r)return function(t,e,n){const r=e.length,a=t[r],s=t[r-1];if(!a)return n;const i=t.slice(0,r).lastIndexOf(" "),o=r-i-1,l=i+1,u=t.slice(r).indexOf(" "),c=(-1===u?t.length:r+u)-l;let f=1;s&&/[.!?]/.test(s)&&" "===a&&(f*=3),c<=3?f*=.7:(0===o&&" "!==a&&(f*=1.5),o===c-1&&(f*=1.4)),o>0&&o3&&(f*=1-Math.min(o/c,.4)),At.has(a)&&(f*=1.5),$t.has(a)&&(f*=1.5),/\d/.test(a)&&(f*=1.3),c>8&&(f*=1.3),a!==a.toLowerCase()&&(f*=1.25),r>200&&(f*=1+Math.min((r-200)/1e3,.3)),f*=1+kt(-.25,.25,Math.random());const p=n*f;return Math.max(.2*n,p)}(t,e,n);if("number"==typeof r&&r>0){const t=n*(r/100);return n+kt(-t,t,Math.random())}return n}(n,j.get(),$,s,m))};return w.current||r(),M},[c,u,n,$,s,m,h]),e.jsxs(v,{ref:x,...g,"aria-label":f||n,children:[e.jsx(D.span,{className:p,style:y,children:j}),e.jsx(D.span,{ref:A,className:i,style:{display:"inline-block",width:"2px",height:"1em",backgroundColor:"currentColor",position:"relative",top:"0.1em",left:"0.2em",...o}})]})});export{jt as A,L as u}; diff --git a/frontend/dist/assets/index-CZBrdv20.js b/frontend/dist/assets/index-CZBrdv20.js deleted file mode 100644 index 7d3002a2..00000000 --- a/frontend/dist/assets/index-CZBrdv20.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Login-X6H6_R2y.js","assets/vendor-react-DFCqJxYC.js","assets/config-C7QO3CEB.js","assets/vendor-core-Dhs13Wlh.js","assets/Dashboard-BSUVzNBC.js","assets/PageLayout-Dz1NyqHa.js","assets/useThemeColors-CzhUM4y-.js","assets/link-scoring-BY8TYwtV.js","assets/TimeRangeSelector-CDHWyMqL.js","assets/index-BKfnA8uz.js","assets/PacketList-C0Zwn6jt.js","assets/SignalIndicator-FtRKgdkw.js","assets/arrow-up-Bv56Dbd2.js","assets/DataBox-BuwfTaKv.js","assets/chevron-right-CchtyLvr.js","assets/loader-circle-BLG0SL8e.js","assets/map-pin-BnrkOs2D.js","assets/zap-DOkzycJm.js","assets/triangle-alert-DlaBoont.js","assets/packet-CCmg5Y4j.js","assets/route-CHkUVMnV.js","assets/chevron-up-Cn6bmTpb.js","assets/circle-check-BQrKpAc_.js","assets/house-BPemXMFi.js","assets/trending-up-xQoBxaWx.js","assets/NodeInformationCard-D_WIPYcK.js","assets/Card-BiYlryJL.js","assets/Grid-TNw012c2.js","assets/Packets-9uyPWOef.js","assets/users-DbmAVTAI.js","assets/Contacts-hCqb2-UP.js","assets/ping-DAjkGztv.js","assets/git-branch-CU4ha9LK.js","assets/target-5KyqyCil.js","assets/ConfirmModal-OyBnZ1Rq.js","assets/CollisionExplorerModal-CX6f3IBB.js","assets/BasemapLayer-B5scdheQ.js","assets/network-Did0WXxt.js","assets/maplibre-gl-B1CfjdFi.css","assets/Statistics-B9XmGE0m.js","assets/usePolling-ZH_j5bYw.js","assets/compass-ipowibkG.js","assets/info-pu09_Xxl.js","assets/MeshGraph-CbZRxc5R.js","assets/DeepAnalysisModal-Ckyyxl1o.js","assets/MeshGraphLabelTest-9WwHSZHg.js","assets/System-CNFICQV5.js","assets/refresh-cw-B42SG81L.js","assets/Logs-C-eWV8pL.js","assets/Terminal-4b8EQwTz.js","assets/Configuration-Df5yvVwq.js","assets/font-loader-jlbdh9Fw.js"])))=>i.map(i=>d[i]); -var e=Object.defineProperty,t=(t,n,a)=>((t,n,a)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[n]=a)(t,"symbol"!=typeof n?n+"":n,a);import{r as n,j as a,b as s,c as i,L as r,h as o,z as l,Q as c,y as u,x as d,X as h,d as m,e as p,f as g}from"./vendor-react-DFCqJxYC.js";import{_ as f}from"./deckgl-DTsmDcfs.js";import{L as y,c as b,u as v,R as w,a as k,N as x,B as S}from"./vendor-core-Dhs13Wlh.js";!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))t(e);new MutationObserver(e=>{for(const n of e)if("childList"===n.type)for(const e of n.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&t(e)}).observe(document,{childList:!0,subtree:!0})}function t(e){if(e.ep)return;e.ep=!0;const t=function(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?t.credentials="include":"anonymous"===e.crossOrigin?t.credentials="omit":t.credentials="same-origin",t}(e);fetch(e.href,t)}}();const j={surfaces:{glass:{tint:"#252525",light:"#ffffff",dark:"#000000",reflexLight:.15,reflexDark:.8,blur:6,blurElevated:8,brightness:1,opacity:8,opacityElevated:12},card:{radius:"1.125rem",padding:"1.25rem",paddingCompact:"0.75rem"},sidebar:{tint:"rgba(113, 156, 223, 0.06)",width:"16rem",drawerWidth:"85vw"},modal:{radius:"1.125rem",backdropBlur:"8px",backdropColor:"rgba(0, 0, 0, 0.6)"}},colors:{bg:{body:"#171717",surface:"#252525",elevated:"#333233",subtle:"#3F3F3F"},border:{subtle:"#4B4B4B",strong:"#616161"},text:{primary:"#E1E1E1",secondary:"#BFBFBF",muted:"#727272",inverse:"#171717"},accent:{primary:"#719CDF",secondary:"#DFBC72",tertiary:"#6FBCBD",success:"#719872",danger:"#E12672"},signal:{excellent:"#00FF00",good:"#8CE619",fair:"#FFD900",poor:"#FF8C26",critical:"#FF3333",unknown:"#616161"},status:{success:"#719872",warning:"#DFBC72",danger:"#E12672",info:"#6FBCBD",muted:"#616161"},chart:{c1:"#719CDF",c2:"#0074BE",c3:"#6FBCBD",c4:"#DFBC72",c5:"#719872",c6:"#E12672",c7:"#E17899",c8:"#999ABD",grid:"rgba(255, 255, 255, 0.06)",axis:"rgba(255, 255, 255, 0.4)",cursor:"rgba(255, 255, 255, 0.2)"},metric:{received:"#719872",forwarded:"#0074BE",transmitted:"#DFBC72",dropped:"#E12672"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#8E4EC6",local:"#FFB224",neighbor:"#46A758",mobile:"#F76B15",room:"#D6409F",edge:"#4B4B4B",edgeHover:"#6FBCBD"}},typography:{font:{title:"'Inter', system-ui, sans-serif",display:"'Inter', system-ui, sans-serif",mono:"'JetBrains Mono', 'SF Mono', Monaco, monospace"},size:{xs:"0.64rem",sm:"0.8rem",base:"1rem",md:"1.125rem",lg:"1.25rem",xl:"1.563rem",xxl:"1.953rem",hero:"3.052rem"},weight:{normal:400,medium:500,semibold:600,bold:700},leading:{tight:1.1,snug:1.25,normal:1.5},tracking:{tight:"-0.02em",normal:"0",wide:"0.05em"}},spacing:{space:{gap:"1.5rem",gapMobile:"0.75rem",page:"1.5rem",pageMobile:"1rem",section:"2rem"},radius:{sm:"0.5rem",md:"0.875rem",lg:"1.125rem",xl:"1.5rem",pill:"9999px"}},motion:{fast:"0.1s",normal:"0.15s",slow:"0.4s",easing:"ease-out"}};function C(e){const t=e.replace("#","");if(6!==t.length&&3!==t.length)return e;let n,a,s;return 3===t.length?(n=parseInt(t[0]+t[0],16)/255,a=parseInt(t[1]+t[1],16)/255,s=parseInt(t[2]+t[2],16)/255):(n=parseInt(t.slice(0,2),16)/255,a=parseInt(t.slice(2,4),16)/255,s=parseInt(t.slice(4,6),16)/255),`color(display-p3 ${n.toFixed(3)} ${a.toFixed(3)} ${s.toFixed(3)})`}function T(){return"undefined"!=typeof window&&CSS.supports("color","color(display-p3 1 1 1)")}function M(e){return T()?C(e):e}function P(e,t){const n={...e};for(const a of Object.keys(t)){const s=t[a],i=e[a];void 0!==s&&("object"!=typeof s||null===s||Array.isArray(s)||"object"!=typeof i||null===i||Array.isArray(i)?n[a]=s:n[a]=P(i,s))}return n}function E(e){return{meta:e.meta,display:e.display,surfaces:e.surfaces?P(j.surfaces,e.surfaces):j.surfaces,colors:e.colors?P(j.colors,e.colors):j.colors,typography:e.typography?P(j.typography,e.typography):j.typography,spacing:e.spacing?P(j.spacing,e.spacing):j.spacing,motion:e.motion?P(j.motion,e.motion):j.motion}}function A(e){const t=e.replace("#","");return 6===t.length?`${parseInt(t.slice(0,2),16)}, ${parseInt(t.slice(2,4),16)}, ${parseInt(t.slice(4,6),16)}`:"255, 255, 255"}function L(e){return{id:e.meta.id,colorScheme:{name:e.meta.name,dataTheme:e.meta.dataTheme,previewColor:e.meta.previewColor},background:{src:e.meta.backgroundImage,suggestedBrightness:e.meta.backgroundBrightness},display:{font:e.display.font,color:e.display.color,size:e.display.size,paletteColors:e.display.palette}}}const D="#fafafa",z="#a1a1aa",N="#71717a",F="#3f3f46",R="#27272a",I="#18181b",_="#09090b",B="#ef4444",V="#f97316",O="#f59e0b",q="#eab308",$="#22c55e",U="#10b981",W="#06b6d4",H="#3b82f6",Y="#8b5cf6",G=E({meta:{id:"",name:"",dataTheme:"",previewColor:H,backgroundImage:"",backgroundBrightness:100,isDark:!0},display:{font:"Inter, sans-serif",color:z,size:1,palette:[[H,$,q,V,B],[_,I,R,F,D]]},typography:{font:{title:"Inter, sans-serif",display:"Inter, sans-serif",mono:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace'},weight:{normal:400,medium:500,semibold:600,bold:700,badge:700},tracking:{tight:"-0.02em",normal:"0",wide:"0.025em"},badge:{textTransform:"capitalize"}},surfaces:{glass:{tint:I,light:F,dark:_,reflexLight:0,reflexDark:0,blur:0,blurElevated:0,brightness:1,opacity:100,opacityElevated:100,catalystMode:!0},sidebar:{tint:`${R}80`},card:{radius:"0.5rem"},modal:{radius:"0.75rem"}},colors:{bg:{body:_,surface:I,elevated:R,subtle:R},border:{subtle:R,strong:"#52525b"},text:{primary:"#fff",secondary:z,muted:N,inverse:_},accent:{primary:H,secondary:q,tertiary:W,success:$,danger:B},signal:{excellent:$,good:"#84cc16",fair:q,poor:V,critical:B,unknown:N},status:{success:$,warning:O,danger:B,info:H,muted:N},chart:{c1:H,c2:U,c3:O,c4:V,c5:"#f43f5e",c6:Y,c7:W,c8:N,grid:`${D}0d`,axis:`${D}33`,cursor:`${H}33`},metric:{received:H,forwarded:U,transmitted:V,dropped:B},map:{nodeFill:H,nodeStroke:`${D}e6`,hub:Y,local:O,neighbor:U,mobile:V,room:"#ec4899",edge:F,edgeHover:H}}}),K=G;L(G);const X=E({meta:{id:"",name:"",dataTheme:"",previewColor:"#B39DF3",backgroundImage:"/assets/sand.jpg",backgroundBrightness:80,isDark:!0},display:{font:"'Rubik Mono One', monospace",color:"#4A4A52",size:.8,palette:[["#B49DFF","#F9D26F","#71F8E5","#39D98A","#FF5C7A"],["#4CFFB5","#FF8A5C","#A78BFA","#60A5FA","#F472B6"]]},typography:{font:{title:"'Rubik Mono One', monospace"}},surfaces:{glass:{tint:"#252525",blur:6,blurElevated:8},sidebar:{tint:"rgba(113, 156, 223, 0.06)"}}}),J=X;L(X);const Z=E({meta:{id:"",name:"",dataTheme:"",previewColor:"#fabd2f",backgroundImage:"/assets/magma.webp",backgroundBrightness:50,isDark:!0},display:{font:"'Jacquard 12', serif",color:"#fe8019",size:1.75,palette:[["#fabd2f","#fb4934","#8ec07c","#b8bb26","#d3869b"],["#fe8019","#83a598","#d65d0e","#928374","#ebdbb2"]]},typography:{font:{title:"'Jacquard 12', serif"},size:{xxl:"2.344rem"}},surfaces:{glass:{tint:"#282828"},sidebar:{tint:"rgba(250, 189, 47, 0.06)"}},colors:{accent:{primary:"#fabd2f",secondary:"#fb4934",tertiary:"#8ec07c",success:"#b8bb26",danger:"#fb4934"},signal:{excellent:"#b8bb26",good:"#8ec07c",fair:"#fabd2f",poor:"#fe8019",critical:"#fb4934",unknown:"#928374"},status:{success:"#b8bb26",warning:"#fabd2f",danger:"#fb4934",info:"#83a598",muted:"#928374"},chart:{c1:"#fabd2f",c2:"#fe8019",c3:"#fb4934",c4:"#d3869b",c5:"#b8bb26",c6:"#8ec07c",c7:"#83a598",c8:"#d65d0e",grid:"rgba(251, 241, 199, 0.06)",axis:"rgba(251, 241, 199, 0.4)",cursor:"rgba(251, 241, 199, 0.2)"},metric:{received:"#b8bb26",forwarded:"#83a598",transmitted:"#fabd2f",dropped:"#fb4934"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#b16286",local:"#fabd2f",neighbor:"#fabd2f",mobile:"#fe8019",room:"#d3869b",edge:"#665c54",edgeHover:"#8ec07c"}}}),Q=Z;L(Z);const ee=E({meta:{id:"",name:"",dataTheme:"",previewColor:"#83a598",backgroundImage:"/assets/water.webp",backgroundBrightness:40,isDark:!0},display:{font:"'Cantora One', sans-serif",color:"#83a598",size:1.25,palette:[["#83a598","#a89984","#8ec07c","#d79921","#b16286"],["#fe8019","#cc241d","#7c6f64","#bdae93","#ebdbb2"]]},typography:{font:{title:"'Cantora One', sans-serif"},size:{xxl:"2.148rem"},weight:{semibold:500}},surfaces:{glass:{tint:"#1e1e1e"},sidebar:{tint:"rgba(131, 165, 152, 0.06)"}},colors:{accent:{primary:"#83a598",secondary:"#a89984",tertiary:"#8ec07c",success:"#8ec07c",danger:"#cc241d"},signal:{excellent:"#8ec07c",good:"#b8bb26",fair:"#d79921",poor:"#fe8019",critical:"#cc241d",unknown:"#7c6f64"},status:{success:"#8ec07c",warning:"#d79921",danger:"#cc241d",info:"#83a598",muted:"#7c6f64"},chart:{c1:"#83a598",c2:"#8ec07c",c3:"#d79921",c4:"#b16286",c5:"#fe8019",c6:"#cc241d",c7:"#a89984",c8:"#7c6f64",grid:"rgba(213, 196, 161, 0.06)",axis:"rgba(213, 196, 161, 0.4)",cursor:"rgba(213, 196, 161, 0.2)"},metric:{received:"#8ec07c",forwarded:"#83a598",transmitted:"#d79921",dropped:"#cc241d"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#b16286",local:"#d79921",neighbor:"#d79921",mobile:"#fe8019",room:"#b16286",edge:"#504945",edgeHover:"#83a598"}}}),te=ee;L(ee);const ne=E({meta:{id:"",name:"",dataTheme:"",previewColor:"#33859d",backgroundImage:"/assets/stars.jpg",backgroundBrightness:100,isDark:!0},display:{font:"'IBM Plex Mono', monospace",color:"#c23127",size:1.25,palette:[["#33859d","#edb54b","#26a98b","#c23127","#888ca6"],["#195465","#d26939","#99d1ce","#4e5165","#0c1014"]]},typography:{font:{title:"'IBM Plex Mono', monospace"}},surfaces:{glass:{tint:"#0a0e14",blur:1,blurElevated:2},sidebar:{tint:"rgba(51, 133, 157, 0.06)"}},colors:{accent:{primary:"#33859d",secondary:"#edb54b",tertiary:"#26a98b",success:"#26a98b",danger:"#c33027"},signal:{excellent:"#26a98b",good:"#7ec07c",fair:"#edb54b",poor:"#d26939",critical:"#c33027",unknown:"#195465"},status:{success:"#26a98b",warning:"#edb54b",danger:"#c33027",info:"#599caa",muted:"#195465"},chart:{c1:"#33859d",c2:"#edb54b",c3:"#26a98b",c4:"#599caa",c5:"#d26939",c6:"#c33027",c7:"#888ba5",c8:"#195465",grid:"rgba(153, 209, 206, 0.06)",axis:"rgba(153, 209, 206, 0.4)",cursor:"rgba(153, 209, 206, 0.2)"},metric:{received:"#26a98b",forwarded:"#33859d",transmitted:"#edb54b",dropped:"#c33027"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#888ba5",local:"#edb54b",neighbor:"#edb54b",mobile:"#d26939",room:"#888ba5",edge:"#245361",edgeHover:"#26a98b"}}}),ae=ne;L(ne);const se="#2D2D2D",ie="#4A4A4A",re="#7A7A7A",oe=E({meta:{id:"",name:"",dataTheme:"",previewColor:"#9ed072",backgroundImage:"",backgroundColor:"#F5F5F5",backgroundBrightness:100,isDark:!1},display:{font:"'JetBrains Mono', monospace",color:"#2D2D2D",size:1,palette:[["#9ed072","#fc5d7c","#76cce0","#e7c664","#b39df3"],["#f39660","#7f8490","#e2e2e3","#55575e","#2c2e34"]]},typography:{font:{title:"'JetBrains Mono', 'SF Mono', Monaco, monospace",display:"'Instrument Sans', system-ui, sans-serif",mono:"'JetBrains Mono', 'SF Mono', Monaco, monospace",cardTitle:"'JetBrains Mono', 'SF Mono', Monaco, monospace"},size:{xxl:"1.875rem",cardTitle:"1rem"},weight:{normal:400,medium:500,semibold:600,bold:600,cardTitle:600}},surfaces:{glass:{tint:"#FFFFFF",light:"rgba(255, 255, 255, 1)",dark:"rgba(0, 0, 0, 0.1)",reflexLight:0,reflexDark:0,blur:0,blurElevated:0,brightness:1,opacity:0,opacityElevated:0,ribbonMode:!0,ribbonBorderWidth:2,ribbonBorderColor:re},sidebar:{tint:"rgba(0, 0, 0, 0.02)"}},colors:{bg:{body:"#F5F5F5",surface:"#FFFFFF",elevated:"#FFFFFF",subtle:"#EBEBEB"},border:{subtle:"#E0E0E0",strong:"#BFBFBF"},text:{primary:se,secondary:ie,muted:re,inverse:"#FFFFFF"},accent:{primary:"#9ed072",secondary:"#e7c664",tertiary:"#76cce0",success:"#9ed072",danger:"#fc5d7c"},signal:{excellent:"#9ed072",good:"#c5d93d",fair:"#e7c664",poor:"#f39660",critical:"#fc5d7c",unknown:"#7f8490"},status:{success:"#9ed072",warning:"#e7c664",danger:"#fc5d7c",info:"#76cce0",muted:"#7f8490"},chart:{c1:"#2E8B57",c2:"#E14D6B",c3:"#D4A832",c4:"#4A9EA0",c5:"#8B6BAE",c6:"#D97A4A",c7:re,c8:ie,grid:"rgba(45, 45, 45, 0.08)",axis:"rgba(45, 45, 45, 0.5)",cursor:"rgba(45, 45, 45, 0.15)"},metric:{received:"#9ed072",forwarded:"#76cce0",transmitted:"#e7c664",dropped:"#fc5d7c"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#b39df3",local:"#e7c664",neighbor:"#e7c664",mobile:"#f39660",room:"#fc5d7c",edge:re,edgeHover:"#76cce0"},icon:{pageTitle:se,cardTitle:se,widget:ie,action:ie,nav:re,navActive:se},sidebar:{bg:"rgba(0, 0, 0, 0.02)",navHoverBg:"rgba(0, 0, 0, 0.04)",navActiveBg:"rgba(0, 0, 0, 0.06)",navActiveText:se}}}),le=oe;L(oe);const ce=E({meta:{id:"",name:"",dataTheme:"",previewColor:"#7E9CD8",backgroundImage:"/assets/folds.webp",backgroundBrightness:50,isDark:!0},display:{font:"'Inter', sans-serif",color:"#7E9CD8",size:1.25,palette:[["#7E9CD8","#E46876","#7AA89F","#DCA561","#957FB8"],["#7FB4CA","#D27E99","#98BB6C","#727169","#1F1F28"]]},typography:{font:{title:"'Inter', sans-serif"}},surfaces:{glass:{tint:"#1F1F28"},sidebar:{tint:"rgba(126, 156, 216, 0.06)"}},colors:{accent:{primary:"#7E9CD8",secondary:"#E6C384",tertiary:"#7FB4CA",success:"#98BB6C",danger:"#E46876"},signal:{excellent:"#98BB6C",good:"#B8CC5C",fair:"#E6C384",poor:"#FFA066",critical:"#E46876",unknown:"#54546D"},status:{success:"#98BB6C",warning:"#E6C384",danger:"#E46876",info:"#7FB4CA",muted:"#727169"},chart:{c1:"#7E9CD8",c2:"#E6C384",c3:"#98BB6C",c4:"#957FB8",c5:"#7FB4CA",c6:"#E46876",c7:"#FFA066",c8:"#D27E99",grid:"rgba(220, 215, 186, 0.06)",axis:"rgba(220, 215, 186, 0.4)",cursor:"rgba(220, 215, 186, 0.2)"},metric:{received:"#98BB6C",forwarded:"#7E9CD8",transmitted:"#E6C384",dropped:"#E46876"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#957FB8",local:"#E6C384",neighbor:"#E6C384",mobile:"#FFA066",room:"#D27E99",edge:"#54546D",edgeHover:"#7AA89F"}}}),ue=ce;L(ce);const de={"KDE Breeze":K,Magma:Q,Folds:ue,Ribbon:le,BLKSAND:J,Waves:te,Stars:ae};function he(e,t){const n=e.toLowerCase();return{...t,meta:{...t.meta,id:n,name:e,dataTheme:n}}}const me=Object.fromEntries(Object.entries(de).map(([e,t])=>[e,he(e,t)])),pe=Object.fromEntries(Object.entries(me).map(([e,t])=>[e,L(t)])),ge=Object.values(me);function fe(e){return ge.find(t=>t.meta.id===e)}new Map(Object.entries(me));const ye=Object.values(pe);new Map(Object.entries(pe));const be=Object.entries(pe).map(([e,t])=>function(e,t){return{id:e.id,name:e.colorScheme.name,displayName:t,colorScheme:e.id,backgroundImage:e.background.src,paletteColors:e.display.paletteColors,displayFont:e.display.font,displayColor:e.display.color,displaySize:e.display.size}}(t,e)),ve=ye.map(function(e){return{id:e.id,name:e.colorScheme.name,dataTheme:e.colorScheme.dataTheme,previewColor:e.colorScheme.previewColor}}),we=ye.map(function(e){return{id:e.id,src:e.background.src,suggestedScheme:e.id,suggestedBrightness:e.background.suggestedBrightness}}),ke=me["KDE Breeze"];pe["KDE Breeze"];const xe=ke.meta.id,Se=ke.meta.backgroundImage,je=ke.meta.backgroundBrightness,Ce=ve,Te=we,Me=be,Pe={colorScheme:xe,backgroundImage:Se,brightness:je},Ee="pymc-color-scheme",Ae="pymc-background-image",Le="pymc-bg-brightness",De="pymc-background";function ze(e){(new Image).src=e}const Ne={50:.97,100:.92,200:.84,300:.73,400:.62,500:.5,600:.4,700:.32,800:.24,900:.16},Fe=[50,100,200,300,400,500,600,700,800,900],Re=["red","orange","yellow","green","aqua","blue","purple"];function Ie(e,t,n){const a=e=>Math.round(Math.max(0,Math.min(255,e))).toString(16).padStart(2,"0");return`#${a(e)}${a(t)}${a(n)}`}function _e(e){const t=e/255;return t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Be(e){const t=e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055;return Math.round(255*t)}function Ve(e,t,n){const a=n*(Math.PI/180),s=t*Math.cos(a),i=t*Math.sin(a),r=e+.3963377774*s+.2158037573*i,o=e-.1055613458*s-.0638541728*i,l=e-.0894841775*s-1.291485548*i,c=r*r*r,u=o*o*o,d=l*l*l,h=-1.2684380046*c+2.6097574011*u-.3413193965*d,m=-.0041960863*c-.7034186147*u+1.707614701*d;return[Be(4.0767416621*c-3.3077115913*u+.2309699292*d),Be(h),Be(m)]}function Oe(e){const[t,n,a]=function(e){const t=e.replace("#","");return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}(e),[,s,i]=function(e,t,n){const a=_e(e),s=_e(t),i=_e(n),r=.4122214708*a+.5363325363*s+.0514459929*i,o=.2119034982*a+.6806995451*s+.1073969566*i,l=.0883024619*a+.2817188376*s+.6299787005*i,c=Math.cbrt(r),u=Math.cbrt(o),d=Math.cbrt(l),h=.2104542553*c+.793617785*u-.0040720468*d,m=1.9779984951*c-2.428592205*u+.4505937099*d,p=.0259040371*c+.7827717662*u-.808675766*d,g=Math.sqrt(m*m+p*p);let f=Math.atan2(p,m)*(180/Math.PI);return f<0&&(f+=360),[h,g,f]}(t,n,a),r={};for(const o of Fe){const e=Ne[o],t=s*(1-.3*Math.abs(e-.5)),[n,a,l]=Ve(e,t,i);r[o]=Ie(n,a,l)}return r}function qe(e){return"undefined"==typeof window?"":getComputedStyle(document.documentElement).getPropertyValue(e).trim()}function $e(e,t){"undefined"!=typeof document&&document.documentElement.style.setProperty(e,t)}const Ue="u-off",We="u-label",He="width",Ye="height",Ge="top",Ke="bottom",Xe="left",Je="right",Ze="#000",Qe=Ze+"0",et="mousemove",tt="mousedown",nt="mouseup",at="mouseenter",st="mouseleave",it="dblclick",rt="change",ot="dppxchange",lt="--",ct="undefined"!=typeof window,ut=ct?document:null,dt=ct?window:null,ht=ct?navigator:null;let mt,pt;function gt(e,t){if(null!=t){let n=e.classList;!n.contains(t)&&n.add(t)}}function ft(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function yt(e,t,n){e.style[t]=n+"px"}function bt(e,t,n,a){let s=ut.createElement(e);return null!=t&>(s,t),null!=n&&n.insertBefore(s,a),s}function vt(e,t){return bt("div",e,t)}const wt=new WeakMap;function kt(e,t,n,a,s){let i="translate("+t+"px,"+n+"px)";i!=wt.get(e)&&(e.style.transform=i,wt.set(e,i),t<0||n<0||t>a||n>s?gt(e,Ue):ft(e,Ue))}const xt=new WeakMap;function St(e,t,n){let a=t+n;a!=xt.get(e)&&(xt.set(e,a),e.style.background=t,e.style.borderColor=n)}const jt=new WeakMap;function Ct(e,t,n,a){let s=t+""+n;s!=jt.get(e)&&(jt.set(e,s),e.style.height=n+"px",e.style.width=t+"px",e.style.marginLeft=a?-t/2+"px":0,e.style.marginTop=a?-n/2+"px":0)}const Tt={passive:!0},Mt={...Tt,capture:!0};function Pt(e,t,n,a){t.addEventListener(e,n,a?Mt:Tt)}function Et(e,t,n,a){t.removeEventListener(e,n,Tt)}function At(e,t,n,a){let s;n=n||0;let i=(a=a||t.length-1)<=2147483647;for(;a-n>1;)s=i?n+a>>1:Kt((n+a)/2),t[s]{let s=-1,i=-1;for(let r=n;r<=a;r++)if(e(t[r])){s=r;break}for(let r=a;r>=n;r--)if(e(t[r])){i=r;break}return[s,i]}}ct&&function e(){let t=devicePixelRatio;mt!=t&&(mt=t,pt&&Et(rt,pt,e),pt=matchMedia(`(min-resolution: ${mt-.001}dppx) and (max-resolution: ${mt+.001}dppx)`),Pt(rt,pt,e),dt.dispatchEvent(new CustomEvent(ot)))}();const Dt=e=>null!=e,zt=e=>null!=e&&e>0,Nt=Lt(Dt),Ft=Lt(zt);function Rt(e,t,n,a){let s=tn(e),i=tn(t);e==t&&(-1==s?(e*=n,t/=n):(e/=n,t*=n));let r=10==n?nn:an,o=1==i?Jt:Kt,l=(1==s?Kt:Jt)(r(Gt(e))),c=o(r(Gt(t))),u=en(n,l),d=en(n,c);return 10==n&&(l<0&&(u=kn(u,-l)),c<0&&(d=kn(d,-c))),a||2==n?(e=u*s,t=d*i):(e=wn(e,u),t=vn(t,d)),[e,t]}function It(e,t,n,a){let s=Rt(e,t,n,a);return 0==e&&(s[0]=0),0==t&&(s[1]=0),s}const _t={mode:3,pad:.1},Bt={pad:0,soft:null,mode:0},Vt={min:Bt,max:Bt};function Ot(e,t,n,a){return Ln(n)?$t(e,t,n):(Bt.pad=n,Bt.soft=a?0:null,Bt.mode=a?3:0,$t(e,t,Vt))}function qt(e,t){return null==e?t:e}function $t(e,t,n){let a=n.min,s=n.max,i=qt(a.pad,0),r=qt(s.pad,0),o=qt(a.hard,-rn),l=qt(s.hard,rn),c=qt(a.soft,rn),u=qt(s.soft,-rn),d=qt(a.mode,0),h=qt(s.mode,0),m=t-e,p=nn(m),g=Qt(Gt(e),Gt(t)),f=nn(g),y=Gt(f-p);(m<1e-24||y>10)&&(m=0,0!=e&&0!=t||(m=1e-24,2==d&&c!=rn&&(i=0),2==h&&u!=-rn&&(r=0)));let b=m||g||1e3,v=nn(b),w=en(10,Kt(v)),k=kn(wn(e-b*(0==m?0==e?.1:1:i),w/10),24),x=e>=c&&(1==d||3==d&&k<=c||2==d&&k>=c)?c:rn,S=Qt(o,k=x?x:Zt(x,k)),j=kn(vn(t+b*(0==m?0==t?.1:1:r),w/10),24),C=t<=u&&(1==h||3==h&&j>=u||2==h&&j<=u)?u:-rn,T=Zt(l,j>C&&t<=C?C:Qt(C,j));return S==T&&0==S&&(T=100),[S,T]}const Ut=new Intl.NumberFormat(ct?ht.language:"en-US"),Wt=e=>Ut.format(e),Ht=Math,Yt=Ht.PI,Gt=Ht.abs,Kt=Ht.floor,Xt=Ht.round,Jt=Ht.ceil,Zt=Ht.min,Qt=Ht.max,en=Ht.pow,tn=Ht.sign,nn=Ht.log10,an=Ht.log2,sn=(e,t=1)=>Ht.asinh(e/t),rn=1/0;function on(e){return 1+(0|nn((e^e>>31)-(e>>31)))}function ln(e,t,n){return Zt(Qt(e,t),n)}function cn(e){return"function"==typeof e}function un(e){return cn(e)?e:()=>e}const dn=e=>e,hn=(e,t)=>t,mn=e=>null,pn=e=>!0,gn=(e,t)=>e==t,fn=/\.\d*?(?=9{6,}|0{6,})/gm,yn=e=>{if(En(e)||xn.has(e))return e;const t=`${e}`,n=t.match(fn);if(null==n)return e;let a=n[0].length-1;if(-1!=t.indexOf("e-")){let[e,n]=t.split("e");return+`${yn(e)}e${n}`}return kn(e,a)};function bn(e,t){return yn(kn(yn(e/t))*t)}function vn(e,t){return yn(Jt(yn(e/t))*t)}function wn(e,t){return yn(Kt(yn(e/t))*t)}function kn(e,t=0){if(En(e))return e;let n=10**t,a=e*n*(1+Number.EPSILON);return Xt(a)/n}const xn=new Map;function Sn(e){return((""+e).split(".")[1]||"").length}function jn(e,t,n,a){let s=[],i=a.map(Sn);for(let r=t;r=0?0:t)+(r>=i[o]?0:i[o]),u=10==e?l:kn(l,c);s.push(u),xn.set(u,c)}}return s}const Cn={},Tn=[],Mn=[null,null],Pn=Array.isArray,En=Number.isInteger;function An(e){return"string"==typeof e}function Ln(e){let t=!1;if(null!=e){let n=e.constructor;t=null==n||n==Object}return t}function Dn(e){return null!=e&&"object"==typeof e}const zn=Object.getPrototypeOf(Uint8Array),Nn="__proto__";function Fn(e,t=Ln){let n;if(Pn(e)){let a=e.find(e=>null!=e);if(Pn(a)||t(a)){n=Array(e.length);for(let a=0;ai){for(a=r-1;a>=0&&null==e[a];)e[a--]=null;for(a=r+1;aPromise.resolve().then(e):queueMicrotask,Bn=["January","February","March","April","May","June","July","August","September","October","November","December"],Vn=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function On(e){return e.slice(0,3)}const qn=Vn.map(On),$n=Bn.map(On),Un={MMMM:Bn,MMM:$n,WWWW:Vn,WWW:qn};function Wn(e){return(e<10?"0":"")+e}const Hn={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+"").slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>Wn(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>Wn(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>Wn(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return 0==t?12:t>12?t-12:t},AA:e=>e.getHours()>=12?"PM":"AM",aa:e=>e.getHours()>=12?"pm":"am",a:e=>e.getHours()>=12?"p":"a",mm:e=>Wn(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>Wn(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>{return((t=e.getMilliseconds())<10?"00":t<100?"0":"")+t;var t}};function Yn(e,t){t=t||Un;let n,a=[],s=/\{([a-z]+)\}|[^{]+/gi;for(;n=s.exec(e);)a.push("{"==n[0][0]?Hn[n[1]]:n[0]);return e=>{let n="";for(let s=0;se%1==0,Xn=[1,2,2.5,5],Jn=jn(10,-32,0,Xn),Zn=jn(10,0,32,Xn),Qn=Zn.filter(Kn),ea=Jn.concat(Zn),ta="{YYYY}",na="\n"+ta,aa="{M}/{D}",sa="\n"+aa,ia=sa+"/{YY}",ra="{aa}",oa="{h}:{mm}"+ra,la="\n"+oa,ca=":{ss}",ua=null;function da(e){let t=1e3*e,n=60*t,a=60*n,s=24*a,i=30*s,r=365*s;return[(1==e?jn(10,0,3,Xn).filter(Kn):jn(10,-3,0,Xn)).concat([t,5*t,10*t,15*t,30*t,n,5*n,10*n,15*n,30*n,a,2*a,3*a,4*a,6*a,8*a,12*a,s,2*s,3*s,4*s,5*s,6*s,7*s,8*s,9*s,10*s,15*s,i,2*i,3*i,4*i,6*i,r,2*r,5*r,10*r,25*r,50*r,100*r]),[[r,ta,ua,ua,ua,ua,ua,ua,1],[28*s,"{MMM}",na,ua,ua,ua,ua,ua,1],[s,aa,na,ua,ua,ua,ua,ua,1],[a,"{h}"+ra,ia,ua,sa,ua,ua,ua,1],[n,oa,ia,ua,sa,ua,ua,ua,1],[t,ca,ia+" "+oa,ua,sa+" "+oa,ua,la,ua,1],[e,ca+".{fff}",ia+" "+oa,ua,sa+" "+oa,ua,la,ua,1]],function(t){return(o,l,c,u,d,h)=>{let m=[],p=d>=r,g=d>=i&&d=s?s:d,r=v+(Kt(c)-Kt(y))+vn(y-v,i);m.push(r);let p=t(r),g=p.getHours()+p.getMinutes()/n+p.getSeconds()/a,f=d/a,b=h/o.axes[l]._space;for(;r=kn(r+d,1==e?0:3),!(r>u);)if(f>1){let e=Kt(kn(g+f,6))%24,n=t(r).getHours()-e;n>1&&(n=-1),r-=n*a,g=(g+f)%24,kn((r-m[m.length-1])/d,3)*b>=.7&&m.push(r)}else m.push(r)}return m}}]}const[ha,ma,pa]=da(1),[ga,fa,ya]=da(.001);function ba(e,t){return e.map(e=>e.map((n,a)=>0==a||8==a||null==n?n:t(1==a||0==e[8]?n:e[1]+n)))}function va(e,t){return(n,a,s,i,r)=>{let o,l,c,u,d,h,m=t.find(e=>r>=e[0])||t[t.length-1];return a.map(t=>{let n=e(t),a=n.getFullYear(),s=n.getMonth(),i=n.getDate(),r=n.getHours(),p=n.getMinutes(),g=n.getSeconds(),f=a!=o&&m[2]||s!=l&&m[3]||i!=c&&m[4]||r!=u&&m[5]||p!=d&&m[6]||g!=h&&m[7]||m[1];return o=a,l=s,c=i,u=r,d=p,h=g,f(n)})}}function wa(e,t,n){return new Date(e,t,n)}function ka(e,t){return t(e)}function xa(e,t){return(n,a,s,i)=>null==i?lt:t(e(a))}jn(2,-53,53,[1]);const Sa={show:!0,live:!0,isolate:!1,mount:()=>{},markers:{show:!0,width:2,stroke:function(e,t){let n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null},fill:function(e,t){return e.series[t].fill(e,t)},dash:"solid"},idx:null,idxs:null,values:[]},ja=[0,0];function Ca(e,t,n,a=!0){return e=>{0==e.button&&(!a||e.target==t)&&n(e)}}function Ta(e,t,n,a=!0){return e=>{(!a||e.target==t)&&n(e)}}const Ma={show:!0,x:!0,y:!0,lock:!1,move:function(e,t,n){return ja[0]=t,ja[1]=n,ja},points:{one:!1,show:function(e,t){let n=e.cursor.points,a=vt(),s=n.size(e,t);yt(a,He,s),yt(a,Ye,s);let i=s/-2;yt(a,"marginLeft",i),yt(a,"marginTop",i);let r=n.width(e,t,s);return r&&yt(a,"borderWidth",r),a},size:function(e,t){return e.series[t].points.size},width:0,stroke:function(e,t){let n=e.series[t].points;return n._stroke||n._fill},fill:function(e,t){let n=e.series[t].points;return n._fill||n._stroke}},bind:{mousedown:Ca,mouseup:Ca,click:Ca,dblclick:Ca,mousemove:Ta,mouseleave:Ta,mouseenter:Ta},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,click:(e,t)=>{t.stopPropagation(),t.stopImmediatePropagation()},_x:!1,_y:!1},focus:{dist:(e,t,n,a,s)=>a-s,prox:-1,bias:0},hover:{skip:[void 0],prox:null,bias:0},left:-10,top:-10,idx:null,dataIdx:null,idxs:null,event:null},Pa={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},Ea=Rn({},Pa,{filter:hn}),Aa=Rn({},Ea,{size:10}),La=Rn({},Pa,{show:!1}),Da='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',za="bold "+Da,Na={show:!0,scale:"x",stroke:Ze,space:50,gap:5,alignTo:1,size:50,labelGap:0,labelSize:30,labelFont:za,side:2,grid:Ea,ticks:Aa,border:La,font:Da,lineGap:1.5,rotate:0},Fa={show:!0,scale:"x",auto:!1,sorted:1,min:rn,max:-rn,idxs:[]};function Ra(e,t,n,a,s){return t.map(e=>null==e?"":Wt(e))}function Ia(e,t,n,a,s,i,r){let o=[],l=xn.get(s)||0;for(let c=n=r?n:kn(vn(n,s),l);c<=a;c=kn(c+s,l))o.push(Object.is(c,-0)?0:c);return o}function _a(e,t,n,a,s,i,r){const o=[],l=e.scales[e.axes[t].scale].log,c=Kt((10==l?nn:an)(n));s=en(l,c),10==l&&(s=ea[At(s,ea)]);let u=n,d=s*l;10==l&&(d=ea[At(d,ea)]);do{o.push(u),u+=s,10!=l||xn.has(u)||(u=kn(u,xn.get(s))),u>=d&&(d=(s=u)*l,10==l&&(d=ea[At(d,ea)]))}while(u<=a);return o}function Ba(e,t,n,a,s,i,r){let o=e.scales[e.axes[t].scale].asinh,l=a>o?_a(e,t,Qt(o,n),a,s):[o],c=a>=0&&n<=0?[0]:[];return(n<-o?_a(e,t,Qt(o,-a),-n,s):[o]).reverse().map(e=>-e).concat(c,l)}const Va=/./,Oa=/[12357]/,qa=/[125]/,$a=/1/,Ua=(e,t,n,a)=>e.map((e,s)=>4==t&&0==e||s%a==0&&n.test(e.toExponential()[e<0?1:0])?e:null);function Wa(e,t,n,a,s){let i=e.axes[n],r=i.scale,o=e.scales[r],l=e.valToPos,c=i._space,u=l(10,r),d=l(9,r)-u>=c?Va:l(7,r)-u>=c?Oa:l(5,r)-u>=c?qa:$a;if(d==$a){let e=Gt(l(1,r)-u);if(es,Ja={show:!0,auto:!0,sorted:0,gaps:Xa,alpha:1,facets:[Rn({},Ka,{scale:"x"}),Rn({},Ka,{scale:"y"})]},Za={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:Xa,alpha:1,points:{show:function(e,t){let{scale:n,idxs:a}=e.series[0],s=e._data[0],i=e.valToPos(s[a[0]],n,!0),r=e.valToPos(s[a[1]],n,!0),o=Gt(r-i)/(e.series[t].points.space*mt);return a[1]-a[0]<=o},filter:null},values:null,min:rn,max:-rn,idxs:[],path:null,clip:null};function Qa(e,t,n,a,s){return n/10}const es={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},ts=Rn({},es,{time:!1,ori:1}),ns={};function as(e,t){let n=ns[e];return n||(n={key:e,plots:[],sub(e){n.plots.push(e)},unsub(e){n.plots=n.plots.filter(t=>t!=e)},pub(e,t,a,s,i,r,o){for(let l=0;l{let g=e.pxRound;const f=o.dir*(0==o.ori?1:-1),y=0==o.ori?ps:gs;let b,v;1==f?(b=n,v=a):(b=a,v=n);let w=g(c(t[b],o,m,d)),k=g(u(r[b],l,p,h)),x=g(c(t[v],o,m,d)),S=g(u(1==i?l.max:l.min,l,p,h)),j=new Path2D(s);return y(j,x,S),y(j,w,S),y(j,w,k),j})}function ls(e,t,n,a,s,i){let r=null;if(e.length>0){r=new Path2D;const o=0==t?fs:ys;let l=n;for(let t=0;tn[0]){let e=n[0]-l;e>0&&o(r,l,a,e,a+i),l=n[1]}}let c=n+s-l,u=10;c>0&&o(r,l,a-u/2,c,a+i+u)}return r}function cs(e,t,n,a,s,i,r){let o=[],l=e.length;for(let c=1==s?n:a;c>=n&&c<=a;c+=s)if(null===t[c]){let u=c,d=c;if(1==s)for(;++c<=a&&null===t[c];)d=c;else for(;--c>=n&&null===t[c];)d=c;let h=i(e[u]),m=d==u?h:i(e[d]),p=u-s;h=r<=0&&p>=0&&p=0&&g>=0&&g=h&&o.push([h,m])}return o}function us(e){return 0==e?dn:1==e?Xt:t=>bn(t,e)}function ds(e){let t=0==e?hs:ms,n=0==e?(e,t,n,a,s,i)=>{e.arcTo(t,n,a,s,i)}:(e,t,n,a,s,i)=>{e.arcTo(n,t,s,a,i)},a=0==e?(e,t,n,a,s)=>{e.rect(t,n,a,s)}:(e,t,n,a,s)=>{e.rect(n,t,s,a)};return(e,s,i,r,o,l=0,c=0)=>{0==l&&0==c?a(e,s,i,r,o):(l=Zt(l,r/2,o/2),c=Zt(c,r/2,o/2),t(e,s+l,i),n(e,s+r,i,s+r,i+o,l),n(e,s+r,i+o,s,i+o,c),n(e,s,i+o,s,i,c),n(e,s,i,s+r,i,l),e.closePath())}}const hs=(e,t,n)=>{e.moveTo(t,n)},ms=(e,t,n)=>{e.moveTo(n,t)},ps=(e,t,n)=>{e.lineTo(t,n)},gs=(e,t,n)=>{e.lineTo(n,t)},fs=ds(0),ys=ds(1),bs=(e,t,n,a,s,i)=>{e.arc(t,n,a,s,i)},vs=(e,t,n,a,s,i)=>{e.arc(n,t,a,s,i)},ws=(e,t,n,a,s,i,r)=>{e.bezierCurveTo(t,n,a,s,i,r)},ks=(e,t,n,a,s,i,r)=>{e.bezierCurveTo(n,t,s,a,r,i)};function xs(e){return(e,t,n,a,s)=>ss(e,t,(t,i,r,o,l,c,u,d,h,m,p)=>{let g,f,{pxRound:y,points:b}=t;0==o.ori?(g=hs,f=bs):(g=ms,f=vs);const v=kn(b.width*mt,3);let w=(b.size-b.width)/2*mt,k=kn(2*w,3),x=new Path2D,S=new Path2D,{left:j,top:C,width:T,height:M}=e.bbox;fs(S,j-k,C-k,T+2*k,M+2*k);const P=e=>{if(null!=r[e]){let t=y(c(i[e],o,m,d)),n=y(u(r[e],l,p,h));g(x,t+w,n),f(x,t,n,w,0,2*Yt)}};if(s)s.forEach(P);else for(let e=n;e<=a;e++)P(e);return{stroke:v>0?x:null,fill:x,clip:S,flags:3}})}function Ss(e){return(t,n,a,s,i,r)=>{a!=s&&(i!=a&&r!=a&&e(t,n,a),i!=s&&r!=s&&e(t,n,s),e(t,n,r))}}const js=Ss(ps),Cs=Ss(gs);function Ts(e){const t=qt(null==e?void 0:e.alignGaps,0);return(e,n,a,s)=>ss(e,n,(i,r,o,l,c,u,d,h,m,p,g)=>{[a,s]=Nt(o,a,s);let f,y,b=i.pxRound,v=e=>b(u(e,l,p,h)),w=e=>b(d(e,c,g,m));0==l.ori?(f=ps,y=js):(f=gs,y=Cs);const k=l.dir*(0==l.ori?1:-1),x={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},S=x.stroke;let j=!1;if(s-a>=4*p){let t,n,i,c=t=>e.posToVal(t,l.key,!0),u=null,d=null,h=v(r[1==k?a:s]),m=v(r[a]),p=v(r[s]),g=c(1==k?m+1:p-1);for(let e=1==k?a:s;e>=a&&e<=s;e+=k){let a=r[e],s=(1==k?ag)?h:v(a),i=o[e];s==h?null!=i?(n=i,null==u?(f(S,s,w(n)),t=u=d=n):nd&&(d=n)):null===i&&(j=!0):(null!=u&&y(S,h,w(u),w(d),w(t),w(n)),null!=i?(n=i,f(S,s,w(n)),u=d=t=n):(u=d=null,null===i&&(j=!0)),h=s,g=c(h+k))}null!=u&&u!=d&&i!=h&&y(S,h,w(u),w(d),w(t),w(n))}else for(let e=1==k?a:s;e>=a&&e<=s;e+=k){let t=o[e];null===t?j=!0:null!=t&&f(S,v(r[e]),w(t))}let[C,T]=is(e,n);if(null!=i.fill||0!=C){let t=x.fill=new Path2D(S),o=w(i.fillTo(e,n,i.min,i.max,C)),l=v(r[a]),c=v(r[s]);-1==k&&([c,l]=[l,c]),f(t,c,o),f(t,l,o)}if(!i.spanGaps){let c=[];j&&c.push(...cs(r,o,a,s,k,v,t)),x.gaps=c=i.gaps(e,n,a,s,c),x.clip=ls(c,l.ori,h,m,p,g)}return 0!=T&&(x.band=2==T?[os(e,n,a,s,S,-1),os(e,n,a,s,S,1)]:os(e,n,a,s,S,T)),x})}function Ms(e,t,n,a,s,i,r=rn){if(e.length>1){let o=null;for(let l=0,c=1/0;l0!=a[e]>0?n[e]=0:(n[e]=3*(l[e-1]+l[e])/((2*l[e]+l[e-1])/a[e-1]+(l[e]+2*l[e-1])/a[e]),isFinite(n[e])||(n[e]=0));n[r-1]=a[r-2];for(let c=0;c{Us.pxRatio=mt}));const Ls=Ts(),Ds=xs();function zs(e,t,n,a){return(a?[e[0],e[1]].concat(e.slice(2)):[e[0]].concat(e.slice(1))).map((e,a)=>Ns(e,a,t,n))}function Ns(e,t,n,a){return Rn({},0==t?n:a,e)}function Fs(e,t,n){return null==t?Mn:[t,n]}const Rs=Fs;function Is(e,t,n){return null==t?Mn:Ot(t,n,.1,!0)}function _s(e,t,n,a){return null==t?Mn:Rt(t,n,e.scales[a].log,!1)}const Bs=_s;function Vs(e,t,n,a){return null==t?Mn:It(t,n,e.scales[a].log,!1)}const Os=Vs;function qs(e){let t,n;return[e=e.replace(/(\d+)px/,(e,a)=>(t=Xt((n=+a)*mt))+"px"),t,n]}function $s(e){e.show&&[e.font,e.labelFont].forEach(e=>{let t=kn(e[2]*mt,1);e[0]=e[0].replace(/[0-9.]+px/,t+"px"),e[1]=t})}function Us(e,t,n){const a={mode:qt(e.mode,1)},s=a.mode;function i(e,t,n,a){let s=t.valToPct(e);return a+n*(-1==t.dir?1-s:s)}function r(e,t,n,a){let s=t.valToPct(e);return a+n*(-1==t.dir?s:1-s)}function o(e,t,n,a){return 0==t.ori?i(e,t,n,a):r(e,t,n,a)}a.valToPosH=i,a.valToPosV=r;let l=!1;a.status=0;const c=a.root=vt("uplot");null!=e.id&&(c.id=e.id),gt(c,e.class),e.title&&(vt("u-title",c).textContent=e.title);const u=bt("canvas"),d=a.ctx=u.getContext("2d"),h=vt("u-wrap",c);Pt("click",h,e=>{e.target===p&&(Jn!=Hn||Zn!=Gn)&&ca.click(a,e)},!0);const m=a.under=vt("u-under",h);h.appendChild(u);const p=a.over=vt("u-over",h),g=+qt((e=Fn(e)).pxAlign,1),f=us(g);(e.plugins||[]).forEach(t=>{t.opts&&(e=t.opts(a,e)||e)});const y=e.ms||.001,b=a.series=1==s?zs(e.series||[],Fa,Za,!1):(v=e.series||[null],w=Ja,v.map((e,t)=>0==t?{}:Rn({},w,e)));var v,w;const k=a.axes=zs(e.axes||[],Na,Ga,!0),x=a.scales={},S=a.bands=e.bands||[];S.forEach(e=>{e.fill=un(e.fill||null),e.dir=qt(e.dir,-1)});const j=2==s?b[1].facets[0].scale:b[0].scale,C={axes:function(){for(let e=0;eVt[e]):y,v=2==m.distr?Vt[y[1]]-Vt[y[0]]:u,w=t.ticks,S=t.border,j=w.show?w.size:0,C=Xt(j*mt),T=Xt((2==t.alignTo?t._size-j-t.gap:t.gap)*mt),M=t._rotate*-Yt/180,P=f(t._pos*mt),E=P+(C+T)*c;s=0==r?E:0,n=1==r?E:0,tn(t.font[0],l,1==t.align?Xe:2==t.align?Je:M>0?Xe:M<0?Je:0==r?"center":3==i?Je:Xe,M||1==r?"middle":2==i?Ge:Ke);let A=t.font[1]*t.lineGap,L=y.map(e=>f(o(e,m,p,g))),D=t._values;for(let e=0;e0){let e=b.some(e=>e._focus)&&Bt!=Ae.alpha;e&&(d.globalAlpha=Bt=Ae.alpha),b.forEach((e,n)=>{if(n>0&&e.show&&(fn(n,!1),fn(n,!0),null==e._paths)){let i=Bt;Bt!=e.alpha&&(d.globalAlpha=Bt=e.alpha);let r=2==s?[0,t[n][0].length-1]:function(e){let t=ln($e-1,0,qe-1),n=ln(Ze+1,0,qe-1);for(;null==e[t]&&t>0;)t--;for(;null==e[n]&&n{if(t>0&&e.show){let n=Bt;Bt!=e.alpha&&(d.globalAlpha=Bt=e.alpha),null!=e._paths&&yn(t,!1);{let n=null!=e._paths?e._paths.gaps:null,s=e.points.show(a,t,$e,Ze,n),i=e.points.filter(a,t,s,n);(s||i)&&(e.points._paths=e.points.paths(a,t,$e,Ze,i),yn(t,!0))}Bt!=n&&(d.globalAlpha=Bt=n),ks("drawSeries",t)}}),e&&(d.globalAlpha=Bt=1)}}},T=(e.drawOrder||["axes","series"]).map(e=>C[e]);function M(e){const t=3==e.distr?t=>nn(t>0?t:e.clamp(a,t,e.min,e.max,e.key)):4==e.distr?t=>sn(t,e.asinh):100==e.distr?t=>e.fwd(t):e=>e;return n=>{let a=t(n),{_min:s,_max:i}=e;return(a-s)/(i-s)}}function P(t){let n=x[t];if(null==n){let a=(e.scales||Cn)[t]||Cn;if(null!=a.from){P(a.from);let e=Rn({},x[a.from],a,{key:t});e.valToPct=M(e),x[t]=e}else{n=x[t]=Rn({},t==j?es:ts,a),n.key=t;let e=n.time,i=n.range,r=Pn(i);if((t!=j||2==s&&!e)&&(!r||null!=i[0]&&null!=i[1]||(i={min:null==i[0]?_t:{mode:1,hard:i[0],soft:i[0]},max:null==i[1]?_t:{mode:1,hard:i[1],soft:i[1]}},r=!1),!r&&Ln(i))){let e=i;i=(t,n,a)=>null==n?Mn:Ot(n,a,e)}n.range=un(i||(e?Rs:t==j?3==n.distr?Bs:4==n.distr?Os:Fs:3==n.distr?_s:4==n.distr?Vs:Is)),n.auto=un(!r&&n.auto),n.clamp=un(n.clamp||Qa),n._min=n._max=null,n.valToPct=M(n)}}}P("x"),P("y"),1==s&&b.forEach(e=>{P(e.scale)}),k.forEach(e=>{P(e.scale)});for(let Ue in e.scales)P(Ue);const E=x[j],A=E.distr;let L,D;0==E.ori?(gt(c,"u-hz"),L=i,D=r):(gt(c,"u-vt"),L=r,D=i);const z={};for(let Ue in x){let e=x[Ue];null==e.min&&null==e.max||(z[Ue]={min:e.min,max:e.max},e.min=e.max=null)}const N=e.tzDate||(e=>new Date(Xt(e/y))),F=e.fmtDate||Yn,R=1==y?pa(N):ya(N),I=va(N,ba(1==y?ma:fa,F)),_=xa(N,ka("{YYYY}-{MM}-{DD} {h}:{mm}{aa}",F)),B=[],V=a.legend=Rn({},Sa,e.legend),O=a.cursor=Rn({},Ma,{drag:{y:2==s}},e.cursor),q=V.show,$=O.show,U=V.markers;let W,H,Y;V.idxs=B,U.width=un(U.width),U.dash=un(U.dash),U.stroke=un(U.stroke),U.fill=un(U.fill);let G,K=[],X=[],J=!1,Z={};if(V.live){const e=b[1]?b[1].values:null;J=null!=e,G=J?e(a,1,0):{_:0};for(let t in G)Z[t]=lt}if(q)if(W=bt("table","u-legend",c),Y=bt("tbody",null,W),V.mount(a,W),J){H=bt("thead",null,W,Y);let e=bt("tr",null,H);for(var Q in bt("th",null,e),G)bt("th",We,e).textContent=Q}else gt(W,"u-inline"),V.live&>(W,"u-live");const ee={show:!0},te={show:!1},ne=new Map;function ae(e,t,n,s=!0){const i=ne.get(t)||{},r=O.bind[e](a,t,n,s);r&&(Pt(e,t,i[e]=r),ne.set(t,i))}function se(e,t,n){const a=ne.get(t)||{};for(let s in a)null!=e&&s!=e||(Et(s,t,a[s]),delete a[s]);null==e&&ne.delete(t)}let ie=0,re=0,oe=0,le=0,ce=0,ue=0,de=ce,he=ue,me=oe,pe=le,ge=0,fe=0,ye=0,be=0;a.bbox={};let ve=!1,we=!1,ke=!1,xe=!1,Se=!1,je=!1;function Ce(e,t,n){(n||e!=a.width||t!=a.height)&&Te(e,t),Bn(!1),ke=!0,we=!0,ia()}function Te(e,t){a.width=ie=oe=e,a.height=re=le=t,ce=ue=0,function(){let e=!1,t=!1,n=!1,a=!1;k.forEach((s,i)=>{if(s.show&&s._show){let{side:i,_size:r}=s,o=i%2,l=r+(null!=s.label?s.labelSize:0);l>0&&(o?(oe-=l,3==i?(ce+=l,a=!0):n=!0):(le-=l,0==i?(ue+=l,e=!0):t=!0))}}),_e[0]=e,_e[1]=n,_e[2]=t,_e[3]=a,oe-=Oe[1]+Oe[3],ce+=Oe[3],le-=Oe[2]+Oe[0],ue+=Oe[0]}(),function(){let e=ce+oe,t=ue+le,n=ce,a=ue;function s(s,i){switch(s){case 1:return e+=i,e-i;case 2:return t+=i,t-i;case 3:return n-=i,n+i;case 0:return a-=i,a+i}}k.forEach((e,t)=>{if(e.show&&e._show){let t=e.side;e._pos=s(t,e._size),null!=e.label&&(e._lpos=s(t,e.labelSize))}})}();let n=a.bbox;ge=n.left=bn(ce*mt,.5),fe=n.top=bn(ue*mt,.5),ye=n.width=bn(oe*mt,.5),be=n.height=bn(le*mt,.5)}const Me=3;if(a.setSize=function({width:e,height:t}){Ce(e,t)},null==O.dataIdx){let e=O.hover,n=e.skip=new Set(e.skip??[]);n.add(void 0);let a=e.prox=un(e.prox),s=e.bias??(e.bias=0);O.dataIdx=(e,i,r,o)=>{if(0==i)return r;let l=r,c=a(e,i,r,o)??rn,u=c>=0&&c0;)n.has(p[e])||(t=e);if(0==s||1==s)for(e=r;null==a&&e++c&&(l=null);return l}}const Pe=e=>{O.event=e};O.idxs=B,O._lock=!1;let Ee=O.points;Ee.show=un(Ee.show),Ee.size=un(Ee.size),Ee.stroke=un(Ee.stroke),Ee.width=un(Ee.width),Ee.fill=un(Ee.fill);const Ae=a.focus=Rn({},e.focus||{alpha:.3},O.focus),Le=Ae.prox>=0,De=Le&&Ee.one;let ze=[],Ne=[],Fe=[];function Re(e,t){let n=Ee.show(a,t);if(n instanceof HTMLElement)return gt(n,"u-cursor-pt"),gt(n,e.class),kt(n,-10,-10,oe,le),p.insertBefore(n,ze[t]),n}function Ie(e,t){if(1==s||t>0){let t=1==s&&x[e.scale].time,n=e.value;e.value=t?An(n)?xa(N,ka(n,F)):n||_:n||Ya,e.label=e.label||(t?"Time":"Value")}if(De||t>0){e.width=null==e.width?1:e.width,e.paths=e.paths||Ls||mn,e.fillTo=un(e.fillTo||rs),e.pxAlign=+qt(e.pxAlign,g),e.pxRound=us(e.pxAlign),e.stroke=un(e.stroke||null),e.fill=un(e.fill||null),e._stroke=e._fill=e._paths=e._focus=null;let t=kn(1*(3+2*(Qt(1,e.width)||1)),3),n=e.points=Rn({},{size:t,width:Qt(1,.2*t),stroke:e.stroke,space:2*t,paths:Ds,_stroke:null,_fill:null},e.points);n.show=un(n.show),n.filter=un(n.filter),n.fill=un(n.fill),n.stroke=un(n.stroke),n.paths=un(n.paths),n.pxAlign=e.pxAlign}if(q){let n=function(e,t){if(0==t&&(J||!V.live||2==s))return Mn;let n=[],i=bt("tr","u-series",Y,Y.childNodes[t]);gt(i,e.class),e.show||gt(i,Ue);let r=bt("th",null,i);if(U.show){let e=vt("u-marker",r);if(t>0){let n=U.width(a,t);n&&(e.style.border=n+"px "+U.dash(a,t)+" "+U.stroke(a,t)),e.style.background=U.fill(a,t)}}let o=vt(We,r);for(var l in e.label instanceof HTMLElement?o.appendChild(e.label):o.textContent=e.label,t>0&&(U.show||(o.style.color=e.width>0?U.stroke(a,t):U.fill(a,t)),ae("click",r,t=>{if(O._lock)return;Pe(t);let n=b.indexOf(e);if((t.ctrlKey||t.metaKey)!=V.isolate){let e=b.some((e,t)=>t>0&&t!=n&&e.show);b.forEach((t,a)=>{a>0&&Pa(a,e?a==n?ee:te:ee,!0,Ss.setSeries)})}else Pa(n,{show:!e.show},!0,Ss.setSeries)},!1),Le&&ae(at,r,t=>{O._lock||(Pe(t),Pa(b.indexOf(e),Da,!0,Ss.setSeries))},!1)),G){let e=bt("td","u-value",i);e.textContent="--",n.push(e)}return[i,n]}(e,t);K.splice(t,0,n[0]),X.splice(t,0,n[1]),V.values.push(null)}if($){B.splice(t,0,null);let n=null;De?0==t&&(n=Re(e,t)):t>0&&(n=Re(e,t)),ze.splice(t,0,n),Ne.splice(t,0,0),Fe.splice(t,0,0)}ks("addSeries",t)}a.addSeries=function(e,t){t=null==t?b.length:t,e=1==s?Ns(e,t,Fa,Za):Ns(e,t,{},Ja),b.splice(t,0,e),Ie(b[t],t)},a.delSeries=function(e){if(b.splice(e,1),q){V.values.splice(e,1),X.splice(e,1);let t=K.splice(e,1)[0];se(null,t.firstChild),t.remove()}$&&(B.splice(e,1),ze.splice(e,1)[0].remove(),Ne.splice(e,1),Fe.splice(e,1)),ks("delSeries",e)};const _e=[!1,!1,!1,!1];function Be(e,t,n,a){let[s,i,r,o]=n,l=t%2,c=0;return 0==l&&(o||i)&&(c=0==t&&!s||2==t&&!r?Xt(Na.size/3):0),1==l&&(s||r)&&(c=1==t&&!i||3==t&&!o?Xt(Ga.size/2):0),c}const Ve=a.padding=(e.padding||[Be,Be,Be,Be]).map(e=>un(qt(e,Be))),Oe=a._padding=Ve.map((e,t)=>e(a,t,_e,0));let qe,$e=null,Ze=null;const rt=1==s?b[0].idxs:null;let ct,ht,pt,wt,xt,jt,Tt,Mt,Lt,Bt,Vt=null,$t=!1;function Ut(e,n){if(t=null==e?[]:e,a.data=a._data=t,2==s){qe=0;for(let e=1;e=0,je=!0,ia()}}function Wt(){let e,n;$t=!0,1==s&&(qe>0?($e=rt[0]=0,Ze=rt[1]=qe-1,e=t[0][$e],n=t[0][Ze],2==A?(e=$e,n=Ze):e==n&&(3==A?[e,n]=Rt(e,e,E.log,!1):4==A?[e,n]=It(e,e,E.log,!1):E.time?n=e+Xt(86400/y):[e,n]=Ot(e,n,.1,!0))):($e=rt[0]=e=null,Ze=rt[1]=n=null)),Ta(j,e,n)}function Kt(e,t,n,a,s,i){e??(e=Qe),n??(n=Tn),a??(a="butt"),s??(s=Qe),i??(i="round"),e!=ct&&(d.strokeStyle=ct=e),s!=ht&&(d.fillStyle=ht=s),t!=pt&&(d.lineWidth=pt=t),i!=xt&&(d.lineJoin=xt=i),a!=jt&&(d.lineCap=jt=a),n!=wt&&d.setLineDash(wt=n)}function tn(e,t,n,a){t!=ht&&(d.fillStyle=ht=t),e!=Tt&&(d.font=Tt=e),n!=Mt&&(d.textAlign=Mt=n),a!=Lt&&(d.textBaseline=Lt=a)}function an(e,t,n,s,i=0){if(s.length>0&&e.auto(a,$t)&&(null==t||null==t.min)){let t=qt($e,0),a=qt(Ze,s.length-1),r=null==n.min?function(e,t,n,a=0,s=!1){let i=s?Ft:Nt,r=s?zt:Dt;[t,n]=i(e,t,n);let o=e[t],l=e[t];if(t>-1)if(1==a)o=e[t],l=e[n];else if(-1==a)o=e[n],l=e[t];else for(let c=t;c<=n;c++){let t=e[c];r(t)&&(tl&&(l=t))}return[o??rn,l??-rn]}(s,t,a,i,3==e.distr):[n.min,n.max];e.min=Zt(e.min,n.min=r[0]),e.max=Qt(e.max,n.max=r[1])}}a.setData=Ut;const dn={min:null,max:null};function fn(e,t){let n=t?b[e].points:b[e];n._stroke=n.stroke(a,e),n._fill=n.fill(a,e)}function yn(e,n){let s=n?b[e].points:b[e],{stroke:i,fill:r,clip:o,flags:l,_stroke:c=s._stroke,_fill:u=s._fill,_width:h=s.width}=s._paths;h=kn(h*mt,3);let m=null,p=h%2/2;n&&null==u&&(u=h>0?"#fff":c);let g=1==s.pxAlign&&p>0;if(g&&d.translate(p,p),!n){let e=ge-h/2,t=fe-h/2,n=ye+h,a=be+h;m=new Path2D,m.rect(e,t,n,a)}n?wn(c,h,s.dash,s.cap,u,i,r,l,o):function(e,n,s,i,r,o,l,c,u,d,h){let m=!1;0!=u&&S.forEach((p,g)=>{if(p.series[0]==e){let e,f=b[p.series[1]],y=t[p.series[1]],v=(f._paths||Cn).band;Pn(v)&&(v=1==p.dir?v[0]:v[1]);let w=null;f.show&&v&&function(e,t,n){for(t=qt(t,0),n=qt(n,e.length-1);t<=n;){if(null!=e[t])return!0;t++}return!1}(y,$e,Ze)?(w=p.fill(a,g)||o,e=f._paths.clip):v=null,wn(n,s,i,r,w,l,c,u,d,h,e,v),m=!0}}),m||wn(n,s,i,r,o,l,c,u,d,h)}(e,c,h,s.dash,s.cap,u,i,r,l,m,o),g&&d.translate(-p,-p)}const vn=3;function wn(e,t,n,a,s,i,r,o,l,c,u,h){Kt(e,t,n,a,s),(l||c||h)&&(d.save(),l&&d.clip(l),c&&d.clip(c)),h?(o&vn)==vn?(d.clip(h),u&&d.clip(u),En(s,r),jn(e,i,t)):2&o?(En(s,r),d.clip(h),jn(e,i,t)):1&o&&(d.save(),d.clip(h),u&&d.clip(u),En(s,r),d.restore(),jn(e,i,t)):(En(s,r),jn(e,i,t)),(l||c||h)&&d.restore()}function jn(e,t,n){n>0&&(t instanceof Map?t.forEach((e,t)=>{d.strokeStyle=ct=t,d.stroke(e)}):null!=t&&e&&d.stroke(t))}function En(e,t){t instanceof Map?t.forEach((e,t)=>{d.fillStyle=ht=t,d.fill(e)}):null!=t&&e&&d.fill(t)}function zn(e,t,n,a,s,i,r,o,l,c){let u=r%2/2;1==g&&d.translate(u,u),Kt(o,r,l,c,o),d.beginPath();let h,m,p,f,y=s+(0==a||3==a?-i:i);0==n?(m=s,f=y):(h=s,p=y);for(let g=0;g{if(!n.show)return;let i=x[n.scale];if(null==i.min)return void(n._show&&(t=!1,n._show=!1,Bn(!1)));n._show||(t=!1,n._show=!0,Bn(!1));let r=n.side,o=r%2,{min:l,max:c}=i,[u,d]=function(e,t,n,s){let i,r=k[e];if(s<=0)i=[0,0];else{let o=r._space=r.space(a,e,t,n,s);i=function(e,t,n,a,s){let i=Qt(on(e),on(t)),r=t-e,o=At(s/a*r,n);do{let e=n[o],t=a*e/r;if(t>=s&&i+(e<5?xn.get(e):0)<=17)return[e,t]}while(++oVt[e]):m,g=2==i.distr?Vt[m[1]]-Vt[m[0]]:u,f=n._values=n.values(a,n.filter(a,p,s,d,g),s,d,g);n._rotate=2==r?n.rotate(a,f,s,d):0;let y=n._size;n._size=Jt(n.size(a,f,s,e)),null!=y&&n._size!=y&&(t=!1)}),t}function In(e){let t=!0;return Ve.forEach((n,s)=>{let i=n(a,s,_e,e);i!=Oe[s]&&(t=!1),Oe[s]=i}),t}function Bn(e){b.forEach((t,n)=>{n>0&&(t._paths=null,e&&(1==s?(t.min=null,t.max=null):t.facets.forEach(e=>{e.min=null,e.max=null})))})}let Vn,On,qn,$n,Un,Wn,Hn,Gn,Kn,Xn,Jn,Zn,ta=!1,na=!1,aa=[];function sa(){na=!1;for(let e=0;e0){b.forEach((n,i)=>{if(1==s){let s=n.scale,r=z[s];if(null==r)return;let o=e[s];if(0==i){let e=o.range(a,o.min,o.max,s);o.min=e[0],o.max=e[1],$e=At(o.min,t[0]),Ze=At(o.max,t[0]),Ze-$e>1&&(t[0][$e]o.max&&Ze--),n.min=Vt[$e],n.max=Vt[Ze]}else n.show&&n.auto&&an(o,r,n,t[i],n.sorted);n.idxs[0]=$e,n.idxs[1]=Ze}else if(i>0&&n.show&&n.auto){let[a,s]=n.facets,r=a.scale,o=s.scale,[l,c]=t[i],u=e[r],d=e[o];null!=u&&an(u,z[r],a,l,a.sorted),null!=d&&an(d,z[o],s,c,s.sorted),n.min=s.min,n.max=s.max}});for(let t in e){let n=e[t],s=z[t];if(null==n.from&&(null==s||null==s.min)){let e=n.range(a,n.min==rn?null:n.min,n.max==-rn?null:n.max,t);n.min=e[0],n.max=e[1]}}}for(let t in e){let n=e[t];if(null!=n.from){let s=e[n.from];if(null==s.min)n.min=n.max=null;else{let e=n.range(a,s.min,s.max,t);n.min=e[0],n.max=e[1]}}}let n={},i=!1;for(let t in e){let a=e[t],s=x[t];if(s.min!=a.min||s.max!=a.max){s.min=a.min,s.max=a.max;let e=s.distr;s._min=3==e?nn(s.min):4==e?sn(s.min,s.asinh):100==e?s.fwd(s.min):s.min,s._max=3==e?nn(s.max):4==e?sn(s.max,s.asinh):100==e?s.fwd(s.max):s.max,n[t]=i=!0}}if(i){b.forEach((e,t)=>{2==s?t>0&&n.y&&(e._paths=null):n[e.scale]&&(e._paths=null)});for(let e in n)ke=!0,ks("setScale",e);$&&O.left>=0&&(xe=je=!0)}for(let t in z)z[t]=null}(),ve=!1),ke&&(function(){let e=!1,t=0;for(;!e;){t++;let n=Nn(t),s=In(t);e=t==Me||n&&s,e||(Te(a.width,a.height),we=!0)}}(),ke=!1),we){if(yt(m,Xe,ce),yt(m,Ge,ue),yt(m,He,oe),yt(m,Ye,le),yt(p,Xe,ce),yt(p,Ge,ue),yt(p,He,oe),yt(p,Ye,le),yt(h,He,ie),yt(h,Ye,re),u.width=Xt(ie*mt),u.height=Xt(re*mt),k.forEach(({_el:e,_show:t,_size:n,_pos:a,side:s})=>{if(null!=e)if(t){let t=s%2==1;yt(e,t?"left":"top",a-(3===s||0===s?n:0)),yt(e,t?"width":"height",n),yt(e,t?"top":"left",t?ue:ce),yt(e,t?"height":"width",t?le:oe),ft(e,Ue)}else gt(e,Ue)}),ct=ht=pt=xt=jt=Tt=Mt=Lt=wt=null,Bt=1,ss(!0),ce!=de||ue!=he||oe!=me||le!=pe){Bn(!1);let e=oe/me,t=le/pe;if($&&!xe&&O.left>=0){O.left*=e,O.top*=t,qn&&kt(qn,Xt(O.left),0,oe,le),$n&&kt($n,0,Xt(O.top),oe,le);for(let n=0;n=0&&wa.width>0){wa.left*=e,wa.width*=e,wa.top*=t,wa.height*=t;for(let e in ls)yt(ja,e,wa[e])}de=ce,he=ue,me=oe,pe=le}ks("setSize"),we=!1}ie>0&&re>0&&(d.clearRect(0,0,u.width,u.height),ks("drawClear"),T.forEach(e=>e()),ks("draw")),wa.show&&Se&&(Ca(wa),Se=!1),$&&xe&&(Xa(null,!0,!1),xe=!1),V.show&&V.live&&je&&(Ua(),je=!1),l||(l=!0,a.status=1,ks("ready")),$t=!1,ta=!1}function oa(e,n){let s=x[e];if(null==s.from){if(0==qe){let t=s.range(a,n.min,n.max,e);n.min=t[0],n.max=t[1]}if(n.min>n.max){let e=n.min;n.min=n.max,n.max=e}if(qe>1&&null!=n.min&&null!=n.max&&n.max-n.min<1e-16)return;e==j&&2==s.distr&&qe>0&&(n.min=At(n.min,t[0]),n.max=At(n.max,t[0]),n.min==n.max&&n.max++),z[e]=n,ve=!0,ia()}}a.batch=function(e,t=!1){ta=!0,na=t,e(a),ra(),t&&aa.length>0&&queueMicrotask(sa)},a.redraw=(e,t)=>{ke=t||!1,!1!==e?Ta(j,E.min,E.max):ia()},a.setScale=oa;let la=!1;const ca=O.drag;let ua=ca.x,da=ca.y;$&&(O.x&&(Vn=vt("u-cursor-x",p)),O.y&&(On=vt("u-cursor-y",p)),0==E.ori?(qn=Vn,$n=On):(qn=On,$n=Vn),Jn=O.left,Zn=O.top);const wa=a.select=Rn({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),ja=wa.show?vt("u-select",wa.over?p:m):null;function Ca(e,t){if(wa.show){for(let t in e)wa[t]=e[t],t in ls&&yt(ja,t,e[t]);!1!==t&&ks("setSelect")}}function Ta(e,t,n){oa(e,{min:t,max:n})}function Pa(e,t,n,i){null!=t.focus&&function(e){if(e!=La){let t=null==e,n=1!=Ae.alpha;b.forEach((a,i)=>{if(1==s||i>0){let s=t||0==i||i==e;a._focus=t?null:s,n&&function(e,t){b[e].alpha=t,$&&null!=ze[e]&&(ze[e].style.opacity=t),q&&K[e]&&(K[e].style.opacity=t)}(i,s?1:Ae.alpha)}}),La=e,n&&ia()}}(e),null!=t.show&&b.forEach((n,a)=>{a>0&&(e==a||null==e)&&(n.show=t.show,function(e){if(b[e].show)q&&ft(K[e],Ue);else if(q&>(K[e],Ue),$){let t=De?ze[0]:ze[e];null!=t&&kt(t,-10,-10,oe,le)}}(a),2==s?(Ta(n.facets[0].scale,null,null),Ta(n.facets[1].scale,null,null)):Ta(n.scale,null,null),ia())}),!1!==n&&ks("setSeries",e,t),i&&Ts("setSeries",a,e,t)}let Ea,Aa,La;a.setSelect=Ca,a.setSeries=Pa,a.addBand=function(e,t){e.fill=un(e.fill||null),e.dir=qt(e.dir,-1),t=null==t?S.length:t,S.splice(t,0,e)},a.setBand=function(e,t){Rn(S[e],t)},a.delBand=function(e){null==e?S.length=0:S.splice(e,1)};const Da={focus:!0};function za(e,t,n){let a=x[t];n&&(e=e/mt-(1==a.ori?ue:ce));let s=oe;1==a.ori&&(s=le,e=s-e),-1==a.dir&&(e=s-e);let i=a._min,r=i+(a._max-i)*(e/s),o=a.distr;return 3==o?en(10,r):4==o?((e,t=1)=>Ht.sinh(e)*t)(r,a.asinh):100==o?a.bwd(r):r}function Va(e,t){yt(ja,Xe,wa.left=e),yt(ja,He,wa.width=t)}function Oa(e,t){yt(ja,Ge,wa.top=e),yt(ja,Ye,wa.height=t)}q&&Le&&ae(st,W,e=>{O._lock||(Pe(e),null!=La&&Pa(null,Da,!0,Ss.setSeries))}),a.valToIdx=e=>At(e,t[0]),a.posToIdx=function(e,n){return At(za(e,j,n),t[0],$e,Ze)},a.posToVal=za,a.valToPos=(e,t,n)=>0==x[t].ori?i(e,x[t],n?ye:oe,n?ge:0):r(e,x[t],n?be:le,n?fe:0),a.setCursor=(e,t,n)=>{Jn=e.left,Zn=e.top,Xa(null,t,n)};let qa=0==E.ori?Va:Oa,$a=1==E.ori?Va:Oa;function Ua(e,t){if(null!=e&&(e.idxs?e.idxs.forEach((e,t)=>{B[t]=e}):void 0!==e.idx&&B.fill(e.idx),V.idx=B[0]),q&&V.live){for(let e=0;e0||1==s&&!J)&&Ka(e,B[e]);!function(){if(q&&V.live)for(let e=2==s?1:0;eZe;Ea=rn,Aa=null;let l=0==E.ori?oe:le,c=1==E.ori?oe:le;if(Jn<0||0==qe||o){r=O.idx=null;for(let e=0;e0&&e.show){let n=null==w?-10:w==r?i:L(1==s?t[0][w]:t[f][0][w],E,l,0),y=null==k?-10:D(k,1==s?x[e.scale]:x[e.facets[1].scale],c,0);if(Le&&null!=k){let t=1==E.ori?Jn:Zn,n=Gt(Ae.dist(a,f,w,y,t));if(n=0?1:-1;i==(k>=0?1:-1)&&(1==i?1==a?k>=s:k<=s:1==a?k<=s:k>=s)&&(Ea=n,Aa=f)}else Ea=n,Aa=f}}if(je||De){let e,t;0==E.ori?(e=n,t=y):(e=y,t=n);let s,i,r,l,c,b,v=!0,w=Ee.bbox;if(null!=w){v=!1;let e=w(a,f);r=e.left,l=e.top,s=e.width,i=e.height}else r=e,l=t,s=i=Ee.size(a,f);if(b=Ee.fill(a,f),c=Ee.stroke(a,f),De)f==Aa&&Ea<=Ae.prox&&(o=r,u=l,d=s,h=i,m=v,p=b,g=c);else{let e=ze[f];null!=e&&(Ne[f]=r,Fe[f]=l,Ct(e,s,i,v),St(e,b,c),kt(e,Jt(r),Jt(l),oe,le))}}}}if(De){let e=Ae.prox;if(je||(null==La?Ea<=e:Ea>e||Aa!=La)){let e=ze[0];null!=e&&(Ne[0]=o,Fe[0]=u,Ct(e,d,h,m),St(e,p,g),kt(e,Jt(o),Jt(u),oe,le))}}}if(wa.show&&la)if(null!=e){let[t,n]=Ss.scales,[a,s]=Ss.match,[i,r]=e.cursor.sync.scales,o=e.cursor.drag;if(ua=o._x,da=o._y,ua||da){let o,u,d,h,m,{left:p,top:g,width:f,height:y}=e.select,b=e.scales[i].ori,v=e.posToVal,w=null!=t&&a(t,i),k=null!=n&&s(n,r);w&&ua?(0==b?(o=p,u=f):(o=g,u=y),d=x[t],h=L(v(o,i),d,l,0),m=L(v(o+u,i),d,l,0),qa(Zt(h,m),Gt(m-h))):qa(0,l),k&&da?(1==b?(o=p,u=f):(o=g,u=y),d=x[n],h=D(v(o,r),d,c,0),m=D(v(o+u,r),d,c,0),$a(Zt(h,m),Gt(m-h))):$a(0,c)}else cs()}else{let e=Gt(Kn-Un),t=Gt(Xn-Wn);if(1==E.ori){let n=e;e=t,t=n}ua=ca.x&&e>=ca.dist,da=ca.y&&t>=ca.dist;let n,a,s=ca.uni;null!=s?ua&&da&&(ua=e>=s,da=t>=s,ua||da||(t>e?da=!0:ua=!0)):ca.x&&ca.y&&(ua||da)&&(ua=da=!0),ua&&(0==E.ori?(n=Hn,a=Jn):(n=Gn,a=Zn),qa(Zt(n,a),Gt(a-n)),da||$a(0,c)),da&&(1==E.ori?(n=Hn,a=Jn):(n=Gn,a=Zn),$a(Zt(n,a),Gt(a-n)),ua||qa(0,l)),ua||da||(qa(0,0),$a(0,0))}if(ca._x=ua,ca._y=da,null==e){if(i){if(null!=js){let[e,t]=Ss.scales;Ss.values[0]=null!=e?za(0==E.ori?Jn:Zn,e):null,Ss.values[1]=null!=t?za(1==E.ori?Jn:Zn,t):null}Ts(et,a,Jn,Zn,oe,le,r)}if(Le){let e=i&&Ss.setSeries,t=Ae.prox;null==La?Ea<=t&&Pa(Aa,Da,!0,e):Ea>t?Pa(null,Da,!0,e):Aa!=La&&Pa(Aa,Da,!0,e)}}je&&(V.idx=r,Ua()),!1!==n&&ks("setCursor")}a.setLegend=Ua;let ns=null;function ss(e=!1){e?ns=null:(ns=p.getBoundingClientRect(),ks("syncRect",ns))}function is(e,t,n,a,s,i,r){O._lock||la&&null!=e&&0==e.movementX&&0==e.movementY||(os(e,t,n,a,s,i,0,!1,null!=e),null!=e?Xa(null,!0,!0):Xa(t,!0,!1))}function os(e,t,n,s,i,r,l,c,u){if(null==ns&&ss(!1),Pe(e),null!=e)n=e.clientX-ns.left,s=e.clientY-ns.top;else{if(n<0||s<0)return Jn=-10,void(Zn=-10);let[e,a]=Ss.scales,l=t.cursor.sync,[c,u]=l.values,[d,h]=l.scales,[m,p]=Ss.match,g=t.axes[0].side%2==1,f=0==E.ori?oe:le,y=1==E.ori?oe:le,b=g?r:i,v=g?i:r,w=g?s:n,k=g?n:s;if(n=null!=d?m(e,d)?o(c,x[e],f,0):-10:f*(w/b),s=null!=h?p(a,h)?o(u,x[a],y,0):-10:y*(k/v),1==E.ori){let e=n;n=s,s=e}}!u||null!=t&&t.cursor.event.type!=et||((n<=1||n>=oe-1)&&(n=bn(n,oe)),(s<=1||s>=le-1)&&(s=bn(s,le))),c?(Un=n,Wn=s,[Hn,Gn]=O.move(a,n,s)):(Jn=n,Zn=s)}Object.defineProperty(a,"rect",{get:()=>(null==ns&&ss(!1),ns)});const ls={width:0,height:0,left:0,top:0};function cs(){Ca(ls,!1)}let ds,hs,ms,ps;function gs(e,t,n,s,i,r,o){la=!0,ua=da=ca._x=ca._y=!1,os(e,t,n,s,i,r,0,!0,!1),null!=e&&(ae(nt,ut,fs,!1),Ts(tt,a,Hn,Gn,oe,le,null));let{left:l,top:c,width:u,height:d}=wa;ds=l,hs=c,ms=u,ps=d}function fs(e,t,n,s,i,r,o){la=ca._x=ca._y=!1,os(e,t,n,s,i,r,0,!1,!0);let{left:l,top:c,width:u,height:d}=wa,h=u>0||d>0,m=ds!=l||hs!=c||ms!=u||ps!=d;if(h&&m&&Ca(wa),ca.setScale&&h&&m){let e=l,t=u,n=c,a=d;if(1==E.ori&&(e=c,t=d,n=l,a=u),ua&&Ta(j,za(e,j),za(e+t,j)),da)for(let s in x){let e=x[s];s!=j&&null==e.from&&e.min!=rn&&Ta(s,za(n+a,s),za(n,s))}cs()}else O.lock&&(O._lock=!O._lock,Xa(t,!0,null!=e));null!=e&&(se(nt,ut),Ts(nt,a,Jn,Zn,oe,le,null))}function ys(e,t,n,s,i,r,o){O._lock||(Pe(e),Wt(),cs(),null!=e&&Ts(it,a,Jn,Zn,oe,le,null))}function bs(){k.forEach($s),Ce(a.width,a.height,!0)}Pt(ot,dt,bs);const vs={};vs.mousedown=gs,vs.mousemove=is,vs.mouseup=fs,vs.dblclick=ys,vs.setSeries=(e,t,n,s)=>{-1!=(n=(0,Ss.match[2])(a,t,n))&&Pa(n,s,!0,!1)},$&&(ae(tt,p,gs),ae(et,p,is),ae(at,p,e=>{Pe(e),ss(!1)}),ae(st,p,function(e,t,n,a,s,i,r){if(O._lock)return;Pe(e);let o=la;if(la){let e,t,n=!0,a=!0,s=10;0==E.ori?(e=ua,t=da):(e=da,t=ua),e&&t&&(n=Jn<=s||Jn>=oe-s,a=Zn<=s||Zn>=le-s),e&&n&&(Jn=Jn{e.call(null,a,t,n)})}(e.plugins||[]).forEach(e=>{for(let t in e.hooks)ws[t]=(ws[t]||[]).concat(e.hooks[t])});const xs=(e,t,n)=>n,Ss=Rn({key:null,setSeries:!1,filters:{pub:pn,sub:pn},scales:[j,b[1]?b[1].scale:null],match:[gn,gn,xs],values:[null,null]},O.sync);2==Ss.match.length&&Ss.match.push(xs),O.sync=Ss;const js=Ss.key,Cs=as(js);function Ts(e,t,n,a,s,i,r){Ss.filters.pub(e,t,n,a,s,i,r)&&Cs.pub(e,t,n,a,s,i,r)}function Ms(){ks("init",e,t),Ut(t||e.data,!1),z[j]?oa(j,z[j]):Wt(),Se=wa.show&&(wa.width>0||wa.height>0),xe=je=!0,Ce(e.width,e.height)}return Cs.sub(a),a.pub=function(e,t,n,a,s,i,r){Ss.filters.sub(e,t,n,a,s,i,r)&&vs[e](null,t,n,a,s,i,r)},a.destroy=function(){Cs.unsub(a),Es.delete(a),ne.clear(),Et(ot,dt,bs),c.remove(),null==W||W.remove(),ks("destroy")},b.forEach(Ie),k.forEach(function(e,t){if(e._show=e.show,e.show){let n=e.side%2,s=x[e.scale];null==s&&(e.scale=n?b[1].scale:j,s=x[e.scale]);let i=s.time;e.size=un(e.size),e.space=un(e.space),e.rotate=un(e.rotate),Pn(e.incrs)&&e.incrs.forEach(e=>{!xn.has(e)&&xn.set(e,Sn(e))}),e.incrs=un(e.incrs||(2==s.distr?Qn:i?1==y?ha:ga:ea)),e.splits=un(e.splits||(i&&1==s.distr?R:3==s.distr?_a:4==s.distr?Ba:Ia)),e.stroke=un(e.stroke),e.grid.stroke=un(e.grid.stroke),e.ticks.stroke=un(e.ticks.stroke),e.border.stroke=un(e.border.stroke);let r=e.values;e.values=Pn(r)&&!Pn(r[0])?un(r):i?Pn(r)?va(N,ba(r,F)):An(r)?function(e,t){let n=Yn(t);return(t,a,s,i,r)=>a.map(t=>n(e(t)))}(N,r):r||I:r||Ra,e.filter=un(e.filter||(s.distr>=3&&10==s.log?Wa:3==s.distr&&2==s.log?Ha:hn)),e.font=qs(e.font),e.labelFont=qs(e.labelFont),e._size=e.size(a,null,t,0),e._space=e._rotate=e._incrs=e._found=e._splits=e._values=null,e._size>0&&(_e[t]=!0,e._el=vt("u-axis",h))}}),n?n instanceof HTMLElement?(n.appendChild(c),Ms()):n(a,Ms):Ms(),a}Us.assign=Rn,Us.fmtNum=Wt,Us.rangeNum=Ot,Us.rangeLog=Rt,Us.rangeAsinh=It,Us.orient=ss,Us.pxRatio=mt,Us.join=function(e,t){if(function(e){let t=e[0][0],n=t.length;for(let a=1;a=a&&null==e[s];)s--;if(s<=a)return!0;const i=Qt(1,Kt((s-a+1)/t));for(let r=e[a],o=a+i;o<=s;o+=i){const t=e[o];if(null!=t){if(t<=r)return!1;r=t}}return!0}(t[0])||(t=function(e){let t=e[0],n=t.length,a=Array(n);for(let i=0;it[e]-t[n]);let s=[];for(let i=0;ie-t)],s=a[0].length,i=new Map;for(let r=0;rss(e,i,(l,c,u,d,h,m,p,g,f,y,b)=>{[r,o]=Nt(u,r,o);let v=l.pxRound,{left:w,width:k}=e.bbox,x=e=>v(m(e,d,y,g)),S=e=>v(p(e,h,b,f)),j=0==d.ori?ps:gs;const C={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},T=C.stroke,M=d.dir*(0==d.ori?1:-1);let P=S(u[1==M?r:o]),E=x(c[1==M?r:o]),A=E,L=E;s&&-1==t&&(L=w,j(T,L,P)),j(T,E,P);for(let e=1==M?r:o;e>=r&&e<=o;e+=M){let n=u[e];if(null==n)continue;let a=x(c[e]),s=S(n);1==t?j(T,a,P):j(T,A,s),j(T,a,s),P=s,A=a}let D=A;s&&1==t&&(D=w+k,j(T,D,P));let[z,N]=is(e,i);if(null!=l.fill||0!=z){let t=C.fill=new Path2D(T),n=S(l.fillTo(e,i,l.min,l.max,z));j(t,D,n),j(t,L,n)}if(!l.spanGaps){let s=[];s.push(...cs(c,u,r,o,M,x,a));let h=l.width*mt/2,m=n||1==t?h:-h,p=n||-1==t?-h:h;s.forEach(e=>{e[0]+=m,e[1]+=p}),C.gaps=s=l.gaps(e,i,r,o,s),C.clip=ls(s,d.ori,g,f,y,b)}return 0!=N&&(C.band=2==N?[os(e,i,r,o,T,-1),os(e,i,r,o,T,1)]:os(e,i,r,o,T,N)),C})},e.bars=function(e){const t=qt((e=e||Cn).size,[.6,rn,1]),n=e.align||0,a=e.gap||0;let s=e.radius;s=null==s?[0,0]:"number"==typeof s?[s,0]:s;const i=un(s),r=1-t[0],o=qt(t[1],rn),l=qt(t[2],1),c=qt(e.disp,Cn),u=qt(e.each,e=>{}),{fill:d,stroke:h}=c;return(e,t,s,m)=>ss(e,t,(p,g,f,y,b,v,w,k,x,S,j)=>{let C,T,M=p.pxRound,P=n,E=a*mt,A=o*mt,L=l*mt;0==y.ori?[C,T]=i(e,t):[T,C]=i(e,t);const D=y.dir*(0==y.ori?1:-1);let z,N,F,R=0==y.ori?fs:ys,I=0==y.ori?u:(e,t,n,a,s,i,r)=>{u(e,t,n,s,a,r,i)},_=qt(e.bands,Tn).find(e=>e.series[0]==t),B=null!=_?_.dir:0,V=p.fillTo(e,t,p.min,p.max,B),O=M(w(V,b,j,x)),q=S,$=M(p.width*mt),U=!1,W=null,H=null,Y=null,G=null;null==d||0!=$&&null==h||(U=!0,W=d.values(e,t,s,m),H=new Map,new Set(W).forEach(e=>{null!=e&&H.set(e,new Path2D)}),$>0&&(Y=h.values(e,t,s,m),G=new Map,new Set(Y).forEach(e=>{null!=e&&G.set(e,new Path2D)})));let{x0:K,size:X}=c;if(null!=K&&null!=X){P=1,g=K.values(e,t,s,m),2==K.unit&&(g=g.map(t=>e.posToVal(k+t*S,y.key,!0)));let n=X.values(e,t,s,m);N=2==X.unit?n[0]*S:v(n[0],y,S,k)-v(0,y,S,k),q=Ms(g,f,v,y,S,k,q),F=q-N+E}else q=Ms(g,f,v,y,S,k,q),F=q*r+E,N=q-F;F<1&&(F=0),$>=N/2&&($=0),F<5&&(M=dn);let J=F>0;N=M(ln(q-F-(J?$:0),L,A)),z=(0==P?N/2:P==D?0:N)-P*D*((0==P?E/2:0)+(J?$/2:0));const Z={stroke:null,fill:null,clip:null,band:null,gaps:null,flags:0},Q=U?null:new Path2D;let ee=null;if(null!=_)ee=e.data[_.series[1]];else{let{y0:n,y1:a}=c;null!=n&&null!=a&&(f=a.values(e,t,s,m),ee=n.values(e,t,s,m))}let te=C*N,ne=T*N;for(let n=1==D?s:m;n>=s&&n<=m;n+=D){let a=f[n];if(null==a)continue;if(null!=ee){let e=ee[n]??0;if(a-e==0)continue;O=w(e,b,j,x)}let s=v(2!=y.distr||null!=c?g[n]:n,y,S,k),i=w(qt(a,V),b,j,x),r=M(s-z),o=M(Qt(i,O)),l=M(Zt(i,O)),u=o-l;if(null!=a){let s=a<0?ne:te,i=a<0?te:ne;U?($>0&&null!=Y[n]&&R(G.get(Y[n]),r,l+Kt($/2),N,Qt(0,u-$),s,i),null!=W[n]&&R(H.get(W[n]),r,l+Kt($/2),N,Qt(0,u-$),s,i)):R(Q,r,l+Kt($/2),N,Qt(0,u-$),s,i),I(e,t,n,r-$/2,l,N+$,u)}}return $>0?Z.stroke=U?G:Q:U||(Z._fill=0==p.width?p._fill:p._stroke??p._fill,Z.width=0),Z.fill=U?H:Q,Z})},e.spline=function(e){return function(e,t){const n=qt(null==t?void 0:t.alignGaps,0);return(t,a,s,i)=>ss(t,a,(r,o,l,c,u,d,h,m,p,g,f)=>{[s,i]=Nt(l,s,i);let y,b,v,w=r.pxRound,k=e=>w(d(e,c,g,m)),x=e=>w(h(e,u,f,p));0==c.ori?(y=hs,v=ps,b=ws):(y=ms,v=gs,b=ks);const S=c.dir*(0==c.ori?1:-1);let j=k(o[1==S?s:i]),C=j,T=[],M=[];for(let e=1==S?s:i;e>=s&&e<=i;e+=S)if(null!=l[e]){let t=k(o[e]);T.push(C=t),M.push(x(l[e]))}const P={stroke:e(T,M,y,v,b,w),fill:null,clip:null,band:null,gaps:null,flags:1},E=P.stroke;let[A,L]=is(t,a);if(null!=r.fill||0!=A){let e=P.fill=new Path2D(E),n=x(r.fillTo(t,a,r.min,r.max,A));v(e,C,n),v(e,j,n)}if(!r.spanGaps){let e=[];e.push(...cs(o,l,s,i,S,k,n)),P.gaps=e=r.gaps(t,a,s,i,e),P.clip=ls(e,c.ori,m,p,g,f)}return 0!=L&&(P.band=2==L?[os(t,a,s,i,E,-1),os(t,a,s,i,E,1)]:os(t,a,s,i,E,L)),P})}(Ps,e)}}const Ws=new Map;function Hs(e){var t;if(!e.startsWith("var("))return e;const n=Ws.get(e);if(n)return n;const a=e.match(/var\(([^,)]+)(?:,\s*([^)]+))?\)/);if(!a)return e;const s=a[1].trim(),i=(null==(t=a[2])?void 0:t.trim())||"#888888",r=getComputedStyle(document.documentElement).getPropertyValue(s).trim()||i;return Ws.set(e,r),r}const Ys=n.memo(function({timestamps:e,series:t,onHover:s,highlightedKey:i=null,cursorColor:r="rgba(255,255,255,0.5)"}){const o=n.useRef(null),l=n.useRef(null),c=n.useRef(t),u=n.useRef(i),d=n.useRef(s),h=n.useRef(e.length);n.useLayoutEffect(()=>{c.current=t,u.current=i,d.current=s});const m=n.useMemo(()=>{const t=new Array(e.length).fill(1);return[e,t]},[e]),p=n.useMemo(()=>({hooks:{draw:e=>{!function(e,t,n){if(0===t.length)return;const a=e.ctx,s=e.bbox,i=s.left,r=s.top,o=s.width,l=s.height;if(o<=0||l<=0)return;const c=e.data[0],u=c.length;if(0===u)return;const d=c[0],h=c[u-1]-d||1,m=e=>{const t=c[e];return i+(t-d)/h*o},p=e=>r+l*(1-e);for(let g=0;g=0;t--){const e=m(t),n=p(i[t]);if(t===u-1)a.lineTo(e,n);else{const s=m(t+1);a.lineTo(s,n),a.lineTo(e,n)}}a.closePath(),a.fill(),a.restore()}}(e,c.current,u.current),function(e){const t=e.ctx,{left:n,top:a,width:s,height:i}=e.bbox,r=window.devicePixelRatio||1,o=function(){const e=getComputedStyle(document.documentElement);return{fontFamily:e.getPropertyValue("--font-data").trim()||'"JetBrains Mono", ui-monospace, monospace',textPrimary:e.getPropertyValue("--text-primary").trim()||"#FFFFFF"}}();t.save(),t.strokeStyle=o.textPrimary,t.globalAlpha=.15,t.lineWidth=1*r,t.setLineDash([4*r,4*r]);for(const c of[.2,.4,.6,.8]){const e=Math.round(a+i*(1-c))+.5;t.beginPath(),t.moveTo(Math.round(n),e),t.lineTo(Math.round(n+s),e),t.stroke()}t.restore(),t.save(),t.font=`bold ${10*r}px ${o.fontFamily}`,t.fillStyle=o.textPrimary,t.textBaseline="middle",t.textAlign="left";const l=8*r;for(const c of[0,20,40,60,80,100]){const e=a+i*(1-c/100),n=Math.max(a+l,Math.min(a+i-l,e));t.fillText(`${c}%`,0,n)}t.restore()}(e)}}}),[]),g=n.useMemo(()=>({width:400,height:200,padding:[8,0,0,32],cursor:{show:!0,x:!0,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],hooks:{setCursor:[e=>{var t,n;const a=e.cursor.idx;if(null!=a&&a>=0){const n=e.data[0][a];null==(t=d.current)||t.call(d,a,n)}else null==(n=d.current)||n.call(d,null,null)}]},plugins:[p]}),[p]);n.useEffect(()=>{const t=o.current;if(!t||0===e.length)return;const n=h.current,a=e.length,s=Math.abs(a-n);if(!(!l.current||s>100||n>0&&s/n>.1)&&l.current)return l.current.setData(m),void(h.current=a);l.current&&l.current.destroy();const i=t.getBoundingClientRect(),r=Math.floor(i.width)||400,c=Math.floor(i.height)||200,u=new Us({...g,width:r,height:c},m,t);return l.current=u,h.current=a,()=>{u.destroy(),l.current=null}},[g,m,e.length]),n.useEffect(()=>{const e=o.current;if(!e)return;const t=new ResizeObserver(e=>{const t=e[0];if(!t||!l.current)return;const{width:n,height:a}=t.contentRect;n>0&&a>0&&l.current.setSize({width:Math.floor(n),height:Math.floor(a)})});return t.observe(e),()=>{t.disconnect()}},[]),n.useEffect(()=>{l.current&&l.current.redraw()},[i,t]);const f=n.useCallback(()=>{null==s||s(null,null)},[s]);return 0===e.length?a.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):a.jsx("div",{ref:o,className:"w-full h-full rounded-2xl overflow-hidden",onMouseLeave:f})}),Gs=n.createContext(null);function Ks(e){const t=fe(e);t&&function(e){if("undefined"==typeof document)return;const t=function(e){var t;const n={},a=e.surfaces.glass;n["--glass-tint"]=a.tint,n["--glass-light"]=a.light,n["--glass-dark"]=a.dark,n["--glass-reflex-light"]=String(a.reflexLight),n["--glass-reflex-dark"]=String(a.reflexDark),n["--glass-blur"]=`${a.blur}px`,n["--glass-blur-elevated"]=`${a.blurElevated}px`,n["--glass-brightness"]=String(a.brightness),n["--glass-bg-opacity"]=`${a.opacity}%`,n["--glass-bg-opacity-elevated"]=`${a.opacityElevated}%`,n["--glass-stroke-only"]=a.strokeOnly?"1":"0",n["--glass-stroke-width"]=a.strokeWidth?`${a.strokeWidth}px`:"0px",n["--glass-stroke-color"]=a.strokeColor||"transparent",n["--glass-ribbon-mode"]=a.ribbonMode?"1":"0",n["--glass-ribbon-border-width"]=a.ribbonBorderWidth?`${a.ribbonBorderWidth}px`:"0px",n["--glass-ribbon-border-color"]=a.ribbonBorderColor||"transparent",n["--sidebar-tint"]=e.surfaces.sidebar.tint,n["--tooltip-bg"]=e.colors.bg.surface,n["--hover-tint"]=`rgba(${A(e.colors.accent.primary)}, 0.08)`,n["--shadow-tint"]=`rgba(${A(e.colors.accent.primary)}, 0.35)`,n["--bg-body"]=e.colors.bg.body,n["--bg-surface"]=e.colors.bg.surface,n["--bg-elevated"]=e.colors.bg.elevated,n["--bg-subtle"]=e.colors.bg.subtle,n["--border-subtle"]=e.colors.border.subtle,n["--border-strong"]=e.colors.border.strong,n["--text-primary"]=e.colors.text.primary,n["--text-secondary"]=e.colors.text.secondary,n["--text-muted"]=e.colors.text.muted,n["--text-invert"]=e.colors.text.inverse,n["--accent-primary"]=e.colors.accent.primary,n["--accent-secondary"]=e.colors.accent.secondary,n["--accent-tertiary"]=e.colors.accent.tertiary,n["--accent-success"]=e.colors.accent.success,n["--accent-danger"]=e.colors.accent.danger,n["--signal-excellent"]=e.colors.signal.excellent,n["--signal-good"]=e.colors.signal.good,n["--signal-fair"]=e.colors.signal.fair,n["--signal-poor"]=e.colors.signal.poor,n["--signal-critical"]=e.colors.signal.critical,n["--signal-unknown"]=e.colors.signal.unknown,n["--sparkline-excellent"]=e.colors.signal.excellent,n["--sparkline-good"]=e.colors.signal.good,n["--sparkline-fair"]=e.colors.signal.fair,n["--sparkline-poor"]=e.colors.signal.poor,n["--sparkline-critical"]=e.colors.signal.critical,n["--status-success"]=e.colors.status.success,n["--status-warning"]=e.colors.status.warning,n["--status-danger"]=e.colors.status.danger,n["--status-info"]=e.colors.status.info,n["--status-muted"]=e.colors.status.muted;const s=e.colors.chart;n["--pkt-advert"]=e.colors.accent.secondary,n["--pkt-flood"]=e.colors.accent.tertiary,n["--pkt-txt-msg"]=e.colors.accent.success,n["--pkt-ack"]=s.c8,n["--pkt-trace"]=s.c3,n["--pkt-req"]=s.c2,n["--pkt-response"]=s.c5,n["--pkt-grp-txt"]=e.colors.map.room,n["--pkt-grp-data"]=e.colors.accent.danger,n["--pkt-path"]=s.c3,n["--pkt-anon"]=e.colors.accent.secondary,n["--pkt-unknown"]=e.colors.status.muted,n["--route-flood"]=e.colors.accent.primary,n["--route-direct"]=e.colors.accent.secondary,n["--route-transport"]=s.c8,n["--chart-1"]=s.c1,n["--chart-2"]=s.c2,n["--chart-3"]=s.c3,n["--chart-4"]=s.c4,n["--chart-5"]=s.c5,n["--chart-6"]=s.c6,n["--chart-7"]=s.c7,n["--chart-8"]=s.c8,n["--chart-grid"]=s.grid,n["--chart-axis-tick"]=s.axis,n["--chart-cursor"]=s.cursor,n["--metric-received"]=e.colors.metric.received,n["--metric-forwarded"]=e.colors.metric.forwarded,n["--metric-transmitted"]=e.colors.metric.transmitted,n["--metric-dropped"]=e.colors.metric.dropped,n["--metric-neutral"]=e.colors.text.secondary,n["--log-debug"]=e.colors.status.muted,n["--log-info"]=e.colors.status.info,n["--log-warning"]=e.colors.status.warning,n["--log-error"]=e.colors.accent.danger,n["--log-critical"]=e.colors.accent.danger;const i=e.colors.map;n["--map-node-fill"]="#3B82F6",n["--map-node-stroke"]="rgba(255,255,255,0.9)",n["--map-hub-color"]="#8E4EC6",n["--map-hub-stroke"]="rgba(255,255,255,0.9)",n["--map-gateway-color"]="#5B5BD6",n["--map-gateway-stroke"]="rgba(255,255,255,0.85)",n["--map-local-color"]="#FFB224",n["--map-neighbor-color"]="#FFB224",n["--map-neighbor-stroke"]="rgba(0,0,0,0.4)",n["--map-mobile-color"]="#F76B15",n["--map-room-color"]="#D6409F",n["--map-ghost-color"]="#00A2C7",n["--map-edge-rest"]=i.edge,n["--map-edge-rest-bright"]=e.colors.border.strong,n["--map-edge-rest-dim"]=e.colors.bg.subtle,n["--map-edge-hover-direct"]=i.edgeHover,n["--map-edge-hover-loop"]="#8E4EC6",n["--map-edge-hover-standard"]=e.colors.text.muted,n["--map-edge-hover-neighbor"]="#FFB224",n["--link-strong"]=e.colors.accent.success,n["--link-medium"]=e.colors.accent.secondary,n["--link-weak"]=e.colors.accent.danger,n["--hop-0"]=e.colors.accent.tertiary,n["--hop-1"]=e.colors.accent.success,n["--hop-2"]=s.c3,n["--hop-3"]=e.colors.accent.secondary,n["--hop-distant"]=e.colors.text.muted,n["--hop-hub"]=i.local;const r=e.colors.icon;n["--icon-page-title"]=(null==r?void 0:r.pageTitle)??e.colors.accent.primary,n["--icon-card-title"]=(null==r?void 0:r.cardTitle)??e.colors.accent.primary,n["--icon-widget"]=(null==r?void 0:r.widget)??e.colors.text.secondary,n["--icon-action"]=(null==r?void 0:r.action)??e.colors.text.secondary,n["--icon-nav"]=(null==r?void 0:r.nav)??e.colors.text.muted,n["--icon-nav-active"]=(null==r?void 0:r.navActive)??e.colors.accent.primary,n["--toggle-on"]=e.colors.accent.success,n["--toggle-off"]=e.colors.bg.elevated;const o=e.colors.sidebar;n["--sidebar-bg"]=(null==o?void 0:o.bg)??"transparent",n["--sidebar-nav-hover-bg"]=(null==o?void 0:o.navHoverBg)??"rgba(255, 255, 255, 0.05)",n["--sidebar-nav-active-bg"]=(null==o?void 0:o.navActiveBg)??`color-mix(in srgb, ${e.colors.accent.primary} 15%, transparent)`,n["--sidebar-nav-active-text"]=(null==o?void 0:o.navActiveText)??e.colors.accent.primary;const l=e.meta.isDark;n["--data-box-bg"]=l?"rgba(255, 255, 255, 0.03)":"rgba(0, 0, 0, 0.03)",n["--data-box-border"]=l?"rgba(255, 255, 255, 0.06)":"rgba(0, 0, 0, 0.08)",n["--subtle-fill"]=l?"rgba(255, 255, 255, 0.03)":"rgba(0, 0, 0, 0.03)",n["--subtle-fill-hover"]=l?"rgba(255, 255, 255, 0.06)":"rgba(0, 0, 0, 0.05)",n["--subtle-fill-strong"]=l?"rgba(255, 255, 255, 0.08)":"rgba(0, 0, 0, 0.06)",n["--color-pill-bg"]=l?"rgba(0, 0, 0, 0.3)":"rgba(255, 255, 255, 0.3)",n["--terminal-bg"]=l?"rgba(0, 0, 0, 0.4)":"rgba(0, 0, 0, 0.03)",n["--terminal-bg-input"]=l?"rgba(0, 0, 0, 0.5)":"rgba(0, 0, 0, 0.05)",n["--terminal-bg-status"]=l?"rgba(0, 0, 0, 0.3)":"rgba(0, 0, 0, 0.02)",n["--terminal-border"]=l?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.08)",n["--terminal-autocomplete-bg"]=l?"rgba(0, 0, 0, 0.8)":"rgba(255, 255, 255, 0.95)",n["--terminal-autocomplete-border"]=l?"rgba(255, 255, 255, 0.2)":"rgba(0, 0, 0, 0.15)",n["--terminal-autocomplete-hover"]=l?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.05)",n["--livedot-idle"]=l?"#666677":"#999999",n["--ctrl-panel-top"]=l?"rgba(30, 30, 30, 0.95)":"rgba(240, 240, 240, 0.95)",n["--ctrl-panel-mid"]=l?"rgba(25, 25, 25, 0.95)":"rgba(235, 235, 235, 0.95)",n["--ctrl-panel-bottom"]=l?"rgba(20, 20, 20, 0.95)":"rgba(230, 230, 230, 0.95)",n["--ctrl-panel-border"]=l?"rgba(60, 60, 60, 1)":"rgba(200, 200, 200, 1)",n["--chart-grid-line"]=l?"rgba(255, 255, 255, 0.06)":"rgba(0, 0, 0, 0.08)",n["--map-control-active-amber"]=l?"rgba(251, 191, 36, 0.15)":"rgba(217, 119, 6, 0.12)",n["--map-control-active-sky"]=l?"rgba(56, 189, 248, 0.15)":"rgba(14, 165, 233, 0.12)",n["--map-control-active-teal"]=l?"rgba(45, 212, 191, 0.15)":"rgba(20, 184, 166, 0.12)",n["--sidebar-action-active-green"]=l?"rgba(10, 26, 10, 1)":"rgba(220, 252, 231, 1)",n["--sidebar-action-active-teal"]=l?"rgba(10, 36, 32, 1)":"rgba(204, 251, 241, 1)",n["--sidebar-action-active-amber"]=l?"rgba(26, 20, 8, 1)":"rgba(254, 243, 199, 1)",n["--thumbnail-brightness"]=l?"1.5":"1.8",n["--font-title"]=e.typography.font.title,n["--font-display"]=e.typography.font.display,n["--font-data"]=e.typography.font.mono,n["--font-card-title"]=e.typography.font.cardTitle??e.typography.font.display,n["--font-badge"]=e.typography.font.badge??e.typography.font.display,n["--font-normal"]=String(e.typography.weight.normal),n["--font-medium"]=String(e.typography.weight.medium),n["--font-semibold"]=String(e.typography.weight.semibold),n["--font-bold"]=String(e.typography.weight.bold),n["--font-card-title-weight"]=String(e.typography.weight.cardTitle??e.typography.weight.semibold),n["--font-badge-weight"]=String(e.typography.weight.badge??e.typography.weight.medium),n["--badge-text-transform"]=(null==(t=e.typography.badge)?void 0:t.textTransform)??"none";const c=e.typography.size;c.xxl&&(n["--text-2xl"]=c.xxl),c.xl&&(n["--text-xl"]=c.xl),c.lg&&(n["--text-lg"]=c.lg),c.md&&(n["--text-md"]=c.md),c.base&&(n["--text-base"]=c.base),c.sm&&(n["--text-sm"]=c.sm),c.xs&&(n["--text-xs"]=c.xs),c.hero&&(n["--text-5xl"]=c.hero),c.cardTitle&&(n["--text-card-title"]=c.cardTitle);const u=e.typography.tracking;return u&&(n["--tracking-tight"]=u.tight,n["--tracking-normal"]=u.normal,n["--tracking-wide"]=u.wide),n["--theme-transition"]=`${e.motion.slow} ${e.motion.easing}`,function(e){if(!T())return e;const t={},n=/^#[0-9A-Fa-f]{3,6}$/;for(const[a,s]of Object.entries(e))t[a]=n.test(s)?C(s):s;return t}(n)}(e),n=document.documentElement;for(const[a,s]of Object.entries(t))n.style.setProperty(a,s);e.surfaces.glass.strokeOnly?n.classList.add("stroke-only"):n.classList.remove("stroke-only"),e.surfaces.glass.ribbonMode?n.classList.add("ribbon-mode"):n.classList.remove("ribbon-mode"),e.surfaces.glass.catalystMode?n.classList.add("catalyst-mode"):n.classList.remove("catalyst-mode")}(t),document.documentElement.dataset.colorScheme=e}function Xs({children:e}){const[t,s]=n.useState(()=>function(){if("undefined"==typeof window)return Pe;try{let n=localStorage.getItem(Ee),a=localStorage.getItem(Ae);const s=localStorage.getItem(Le);if(!n&&!a){const e=localStorage.getItem(De);if(e){const t=Me.find(t=>t.id===e);t&&(n=t.colorScheme,a=t.backgroundImage,localStorage.setItem(Ee,n),localStorage.setItem(Ae,a),localStorage.removeItem(De))}}const i=n&&"string"==typeof(t=n)&&Ce.some(e=>e.id===t)?n:Pe.colorScheme;let r=Pe.backgroundImage;""===a?r="":a&&"string"==typeof(e=a)&&Te.some(t=>t.src===e)&&(r=a);let o=Pe.brightness;if(s){const e=parseInt(s,10);!isNaN(e)&&e>=0&&e<=100&&(o=e)}return{colorScheme:i,backgroundImage:r,brightness:o}}catch{return Pe}var e,t}()),i=n.useRef(!1),r=n.useRef(null),[o,l]=n.useState(null);n.useEffect(()=>{r.current&&(clearTimeout(r.current),r.current=null),i.current&&(l("#808080"),r.current=setTimeout(()=>{l(null),r.current=null},1800)),i.current=!0,Ks(t.colorScheme),Ws.clear(),requestAnimationFrame(()=>{!function(){if("undefined"==typeof window)return;for(const t of Re){const e=qe(`--palette-${t}-bright`),n=qe(`--palette-${t}`),a=e||n;if(!a)continue;const s=Oe(a);for(const i of Fe)$e(`--palette-${t}-${i}`,s[i])}const e=qe("--palette-bg-4");if(e){const t=Oe(e);for(const e of Fe)$e(`--palette-neutral-${e}`,t[e])}}()})},[t.colorScheme]),n.useEffect(()=>{!function(e){if("undefined"!=typeof window)try{localStorage.setItem(Ee,e.colorScheme),localStorage.setItem(Ae,e.backgroundImage),localStorage.setItem(Le,String(e.brightness))}catch{}}(t)},[t]),n.useEffect(()=>{Te.forEach(e=>{(new Image).src=e.src})},[]);const c=n.useCallback(e=>{s(t=>({...t,colorScheme:e}))},[]),u=n.useCallback(e=>{const t=Te.find(t=>t.src===e);s(n=>({...n,backgroundImage:e,brightness:(null==t?void 0:t.suggestedBrightness)??n.brightness}))},[]),d=n.useCallback(e=>{const t=Math.max(0,Math.min(100,Math.round(e)));s(e=>({...e,brightness:t}))},[]),h=n.useCallback(e=>{const t=Me.find(t=>t.id===e);if(t){const e=!t.backgroundImage,n=e?null:Te.find(e=>e.src===t.backgroundImage);s(a=>({...a,colorScheme:t.colorScheme,backgroundImage:t.backgroundImage,brightness:e?100:(null==n?void 0:n.suggestedBrightness)??a.brightness}))}},[]),m=n.useMemo(()=>({theme:t,setColorScheme:c,setBackgroundImage:u,setBrightness:d,setThemePreset:h}),[t,c,u,d,h]);return a.jsxs(Gs.Provider,{value:m,children:[e,o&&a.jsx("div",{className:"fixed inset-0 pointer-events-none z-[9999]",style:{backgroundColor:o,animation:"theme-crossfade 1.8s ease-out forwards"}},t.colorScheme),a.jsx("style",{children:"\n @keyframes theme-crossfade {\n from { opacity: 0.35; }\n to { opacity: 0; }\n }\n "})]})}function Js(){const e=n.useContext(Gs);if(!e)throw new Error("useTheme must be used within a ThemeProvider. Wrap your app with in App.tsx.");return e}const Zs=n.forwardRef(function(e,t){const{href:n,...i}=e;return n.startsWith("http://")||n.startsWith("https://")||n.startsWith("//")?a.jsx(s,{children:a.jsx("a",{...i,href:n,ref:t})}):a.jsx(s,{children:a.jsx(y,{...i,to:n,ref:t})})}),Qs={0:"REQ",1:"RESPONSE",2:"TXT_MSG",3:"ACK",4:"ADVERT",5:"GRP_TXT",6:"GRP_DATA",7:"ANON_REQ",8:"PATH",9:"TRACE",10:"MULTIPART",15:"RAW_CUSTOM"},ei={0:"T_FLOOD",1:"FLOOD",2:"DIRECT",3:"T_DIRECT"},ti={REQ:0,RESPONSE:1,TXT_MSG:2,ACK:3,ADVERT:4,GRP_TXT:5,GRP_DATA:6,ANON_REQ:7,PATH:8,TRACE:9,MULTIPART:10,RAW_CUSTOM:15};function ni(e){return 1===e||0===e}function ai(e){return null==e?"UNKNOWN":Qs[e]||`TYPE_${e}`}function si(e){return null==e?"UNKNOWN":ei[e]||`ROUTE_${e}`}function ii(e,t){return(Math.max(e,t)+.05)/(Math.min(e,t)+.05)}function ri(e){const t=function(e){const t=e.replace("#",""),n=parseInt(t.slice(0,2),16)/255,a=parseInt(t.slice(2,4),16)/255,s=parseInt(t.slice(4,6),16)/255,i=e=>e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4);return.2126*i(n)+.7152*i(a)+.0722*i(s)}(e);return ii(t,1)>ii(t,0)?"light":"dark"}function oi(e){return 1===e||!0===e}const li=i("inline-flex items-center gap-1","radius-badge px-1.5 py-0.5","text-xs"),ci={fontFamily:"var(--font-badge)",fontWeight:"var(--font-badge-weight)",textTransform:"var(--badge-text-transform, none)"},ui={red:"var(--sys-red)",orange:"var(--sys-orange)",amber:"var(--sys-amber)",yellow:"var(--sys-yellow)",lime:"var(--sys-green)",green:"var(--sys-green)",emerald:"var(--sys-green)",teal:"var(--sys-teal)",cyan:"var(--sys-cyan)",sky:"var(--sys-cyan)",blue:"var(--sys-blue)",indigo:"var(--sys-indigo)",violet:"var(--sys-indigo)",purple:"var(--sys-purple)",fuchsia:"var(--sys-pink)",pink:"var(--sys-pink)",rose:"var(--sys-red)",brown:"var(--sys-brown)",zinc:"var(--text-muted)"};function di(e){if(!e.startsWith("var("))return e;if("undefined"!=typeof window){const t=e.match(/var\((--[^,)]+)/);if(t){const e=getComputedStyle(document.documentElement).getPropertyValue(t[1]).trim();if(e&&e.startsWith("#"))return e}}return"#666666"}function hi({color:e="zinc",customColor:t,filled:s=!1,compact:r=!1,className:o,title:l,children:c}){const u=n.useMemo(()=>{const n=t??ui[e];if(s){if(t){const e=ri(di(t));return{backgroundColor:t,color:"light"===e?"rgba(255,255,255,0.95)":"rgba(0,0,0,0.85)"}}return{backgroundColor:n,color:["amber","yellow","lime"].includes(e)?"rgba(0,0,0,0.85)":"rgba(255,255,255,0.95)"}}return{backgroundColor:`color-mix(in srgb, ${n} 15%, transparent)`,color:n}},[e,t,s]);return a.jsx("span",{className:i(li,r&&"!px-1 !py-0 !text-[10px]",o),style:{...ci,...u},title:l,children:c})}const mi=n.forwardRef(function({color:e="zinc",customColor:t,filled:s=!1,compact:o=!1,className:l,children:c,...u},d){const h=n.useMemo(()=>{const n=t??ui[e];if(s){if(t){const e=ri(di(t));return{backgroundColor:t,color:"light"===e?"rgba(255,255,255,0.95)":"rgba(0,0,0,0.85)"}}return{backgroundColor:n,color:["amber","yellow","lime"].includes(e)?"rgba(0,0,0,0.85)":"rgba(255,255,255,0.95)"}}return{backgroundColor:`color-mix(in srgb, ${n} 15%, transparent)`,color:n}},[e,t,s]),m=i(li,o&&"!px-1 !py-0 !text-[10px]","interactive hover-opacity",l);return"href"in u&&void 0!==u.href?a.jsx(Zs,{...u,ref:d,className:m,style:{...ci,...h},children:c}):a.jsx(r,{...u,ref:d,className:m,style:{...ci,...h},children:c})}),pi=i("relative inline-flex items-center justify-center gap-2","text-sm font-medium whitespace-nowrap","radius-inner px-3 py-1.5","ring-focus","disabled:opacity-40 disabled:pointer-events-none disabled:cursor-not-allowed","transition-base","[&>[data-slot=icon]]:w-4 [&>[data-slot=icon]]:h-4 [&>[data-slot=icon]]:shrink-0"),gi={primary:i("bg-accent-primary text-white","hover:bg-accent-primary/90","active:bg-accent-primary/80","border border-accent-primary/20"),success:i("bg-accent-success text-white","hover:bg-accent-success/90","active:bg-accent-success/80","border border-accent-success/20"),danger:i("bg-accent-danger text-white","hover:bg-accent-danger/90","active:bg-accent-danger/80","border border-accent-danger/20"),warning:i("bg-accent-secondary text-bg-body","hover:bg-accent-secondary/90","active:bg-accent-secondary/80","border border-accent-secondary/20"),muted:i("bg-bg-elevated text-text-primary","hover:bg-bg-subtle","active:bg-bg-elevated","border border-border-subtle")},fi={primary:i("bg-transparent text-accent-primary","border border-accent-primary/30","hover:bg-accent-primary/10 hover:border-accent-primary/50","active:bg-accent-primary/20"),success:i("bg-transparent text-accent-success","border border-accent-success/30","hover:bg-accent-success/10 hover:border-accent-success/50","active:bg-accent-success/20"),danger:i("bg-transparent text-accent-danger","border border-accent-danger/30","hover:bg-accent-danger/10 hover:border-accent-danger/50","active:bg-accent-danger/20"),warning:i("bg-transparent text-accent-secondary","border border-accent-secondary/30","hover:bg-accent-secondary/10 hover:border-accent-secondary/50","active:bg-accent-secondary/20"),muted:i("bg-transparent text-text-muted","border border-border-subtle","hover:bg-bg-subtle hover:text-text-primary hover:border-border-strong","active:bg-bg-elevated")},yi={primary:i("bg-transparent text-accent-primary border-transparent","hover:bg-accent-primary/10","active:bg-accent-primary/20"),success:i("bg-transparent text-accent-success border-transparent","hover:bg-accent-success/10","active:bg-accent-success/20"),danger:i("bg-transparent text-accent-danger border-transparent","hover:bg-accent-danger/10","active:bg-accent-danger/20"),warning:i("bg-transparent text-accent-secondary border-transparent","hover:bg-accent-secondary/10","active:bg-accent-secondary/20"),muted:i("bg-transparent text-text-muted border-transparent","hover:bg-bg-subtle hover:text-text-primary","active:bg-bg-elevated")},bi=n.forwardRef(function({color:e="muted",outline:t=!1,plain:n=!1,className:s,children:o,...l},c){const u=i(pi,n?yi[e]:t?fi[e]:gi[e],s);return"href"in l&&void 0!==l.href?a.jsx(Zs,{...l,ref:c,className:u,children:o}):a.jsx(r,{...l,ref:c,className:u,children:o})}),vi=e=>{const t=(e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()))(e);return t.charAt(0).toUpperCase()+t.slice(1)},wi=(...e)=>e.filter((e,t,n)=>Boolean(e)&&""!==e.trim()&&n.indexOf(e)===t).join(" ").trim(),ki=e=>{for(const t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0};var xi={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Si=n.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:a=2,absoluteStrokeWidth:s,className:i="",children:r,iconNode:o,...l},c)=>n.createElement("svg",{ref:c,...xi,width:t,height:t,stroke:e,strokeWidth:s?24*Number(a)/Number(t):a,className:wi("lucide",i),...!r&&!ki(l)&&{"aria-hidden":"true"},...l},[...o.map(([e,t])=>n.createElement(e,t)),...Array.isArray(r)?r:[r]])),ji=(e,t)=>{const a=n.forwardRef(({className:a,...s},i)=>{return n.createElement(Si,{ref:i,iconNode:t,className:wi(`lucide-${r=vi(e),r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${e}`,a),...s});var r});return a.displayName=vi(e),a},Ci=ji("chart-column",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]]),Ti=ji("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),Mi=ji("clock",[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),Pi=ji("expand",[["path",{d:"m15 15 6 6",key:"1s409w"}],["path",{d:"m15 9 6-6",key:"ko1vev"}],["path",{d:"M21 16v5h-5",key:"1ck2sf"}],["path",{d:"M21 8V3h-5",key:"1qoq8a"}],["path",{d:"M3 16v5h5",key:"1t08am"}],["path",{d:"m3 21 6-6",key:"wwnumi"}],["path",{d:"M3 8V3h5",key:"1ln10m"}],["path",{d:"M9 9 3 3",key:"v551iv"}]]),Ei=ji("file-text",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]),Ai=ji("gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]),Li=ji("ghost",[["path",{d:"M9 10h.01",key:"qbtxuw"}],["path",{d:"M15 10h.01",key:"1qmjsl"}],["path",{d:"M12 2a8 8 0 0 0-8 8v12l3-3 2.5 2.5L12 19l2.5 2.5L17 19l3 3V10a8 8 0 0 0-8-8z",key:"uwwb07"}]]),Di=ji("layout-dashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]),zi=ji("layout-list",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}],["path",{d:"M14 4h7",key:"3xa0d5"}],["path",{d:"M14 9h7",key:"1icrd9"}],["path",{d:"M14 15h7",key:"1mj8o2"}],["path",{d:"M14 20h7",key:"11slyb"}]]),Ni=ji("log-out",[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]]),Fi=ji("map-pin-plus",[["path",{d:"M19.914 11.105A7.298 7.298 0 0 0 20 10a8 8 0 0 0-16 0c0 4.993 5.539 10.193 7.399 11.799a1 1 0 0 0 1.202 0 32 32 0 0 0 .824-.738",key:"fcdtly"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}],["path",{d:"M16 18h6",key:"987eiv"}],["path",{d:"M19 15v6",key:"10aioa"}]]),Ri=ji("menu",[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]]),Ii=ji("pause",[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]]),_i=ji("play",[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]),Bi=ji("radio",[["path",{d:"M16.247 7.761a6 6 0 0 1 0 8.478",key:"1fwjs5"}],["path",{d:"M19.075 4.933a10 10 0 0 1 0 14.134",key:"ehdyv1"}],["path",{d:"M4.925 19.067a10 10 0 0 1 0-14.134",key:"1q22gi"}],["path",{d:"M7.753 16.239a6 6 0 0 1 0-8.478",key:"r2q7qm"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]]),Vi=ji("send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]),Oi=ji("settings",[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),qi=ji("shrink",[["path",{d:"m15 15 6 6m-6-6v4.8m0-4.8h4.8",key:"17vawe"}],["path",{d:"M9 19.8V15m0 0H4.2M9 15l-6 6",key:"chjx8e"}],["path",{d:"M15 4.2V9m0 0h4.8M15 9l6-6",key:"lav6yq"}],["path",{d:"M9 4.2V9m0 0H4.2M9 9 3 3",key:"1pxi2q"}]]),$i=ji("sliders-vertical",[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]]),Ui=ji("square-terminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]),Wi=ji("waypoints",[["circle",{cx:"12",cy:"4.5",r:"2.5",key:"r5ysbb"}],["path",{d:"m10.2 6.3-3.9 3.9",key:"1nzqf6"}],["circle",{cx:"4.5",cy:"12",r:"2.5",key:"jydg6v"}],["path",{d:"M7 12h10",key:"b7w52i"}],["circle",{cx:"19.5",cy:"12",r:"2.5",key:"1piiel"}],["path",{d:"m13.8 17.7 3.9-3.9",key:"1wyg1y"}],["circle",{cx:"12",cy:"19.5",r:"2.5",key:"13o1pw"}]]),Hi=ji("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),Yi=n.createContext({});function Gi(e){const t=n.useRef(null);return null===t.current&&(t.current=e()),t.current}const Ki="undefined"!=typeof window,Xi=Ki?n.useLayoutEffect:n.useEffect,Ji=n.createContext(null);function Zi(e,t){-1===e.indexOf(t)&&e.push(t)}function Qi(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}const er=(e,t,n)=>n>t?t:n/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e);function ar(e){return"object"==typeof e&&null!==e}const sr=e=>/^0[^.\s]+$/u.test(e);function ir(e){let t;return()=>(void 0===t&&(t=e()),t)}const rr=e=>e,or=(e,t)=>n=>t(e(n)),lr=(...e)=>e.reduce(or),cr=(e,t,n)=>{const a=t-e;return 0===a?1:(n-e)/a};class ur{constructor(){this.subscriptions=[]}add(e){return Zi(this.subscriptions,e),()=>Qi(this.subscriptions,e)}notify(e,t,n){const a=this.subscriptions.length;if(a)if(1===a)this.subscriptions[0](e,t,n);else for(let s=0;s1e3*e,hr=e=>e/1e3;function mr(e,t){return t?e*(1e3/t):0}const pr=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e;function gr(e,t,n,a){if(e===t&&n===a)return rr;return s=>0===s||1===s?s:pr(function(e,t,n,a,s){let i,r,o=0;do{r=t+(n-t)/2,i=pr(r,a,s)-e,i>0?n=r:t=r}while(Math.abs(i)>1e-7&&++o<12);return r}(s,0,1,e,n),t,a)}const fr=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,yr=e=>t=>1-e(1-t),br=gr(.33,1.53,.69,.99),vr=yr(br),wr=fr(vr),kr=e=>(e*=2)<1?.5*vr(e):.5*(2-Math.pow(2,-10*(e-1))),xr=e=>1-Math.sin(Math.acos(e)),Sr=yr(xr),jr=fr(xr),Cr=gr(.42,0,1,1),Tr=gr(0,0,.58,1),Mr=gr(.42,0,.58,1),Pr=e=>Array.isArray(e)&&"number"!=typeof e[0],Er=e=>Array.isArray(e)&&"number"==typeof e[0],Ar={linear:rr,easeIn:Cr,easeInOut:Mr,easeOut:Tr,circIn:xr,circInOut:jr,circOut:Sr,backIn:vr,backInOut:wr,backOut:br,anticipate:kr},Lr=e=>{if(Er(e)){e.length;const[t,n,a,s]=e;return gr(t,n,a,s)}return"string"==typeof e?Ar[e]:e},Dr=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function zr(e,t){let n=!1,a=!0;const s={delta:0,timestamp:0,isProcessing:!1},i=()=>n=!0,r=Dr.reduce((e,t)=>(e[t]=function(e){let t=new Set,n=new Set,a=!1,s=!1;const i=new WeakSet;let r={delta:0,timestamp:0,isProcessing:!1};function o(t){i.has(t)&&(l.schedule(t),e()),t(r)}const l={schedule:(e,s=!1,r=!1)=>{const o=r&&a?t:n;return s&&i.add(e),o.has(e)||o.add(e),e},cancel:e=>{n.delete(e),i.delete(e)},process:e=>{r=e,a?s=!0:(a=!0,[t,n]=[n,t],t.forEach(o),t.clear(),a=!1,s&&(s=!1,l.process(e)))}};return l}(i),e),{}),{setup:o,read:l,resolveKeyframes:c,preUpdate:u,update:d,preRender:h,render:m,postRender:p}=r,g=()=>{const i=tr.useManualTiming?s.timestamp:performance.now();n=!1,tr.useManualTiming||(s.delta=a?1e3/60:Math.max(Math.min(i-s.timestamp,40),1)),s.timestamp=i,s.isProcessing=!0,o.process(s),l.process(s),c.process(s),u.process(s),d.process(s),h.process(s),m.process(s),p.process(s),s.isProcessing=!1,n&&t&&(a=!1,e(g))};return{schedule:Dr.reduce((t,i)=>{const o=r[i];return t[i]=(t,i=!1,r=!1)=>(n||(n=!0,a=!0,s.isProcessing||e(g)),o.schedule(t,i,r)),t},{}),cancel:e=>{for(let t=0;t(void 0===_r&&Vr.set(Rr.isProcessing||tr.useManualTiming?Rr.timestamp:performance.now()),_r),set:e=>{_r=e,queueMicrotask(Br)}},Or=e=>t=>"string"==typeof t&&t.startsWith(e),qr=Or("--"),$r=Or("var(--"),Ur=e=>!!$r(e)&&Wr.test(e.split("/*")[0].trim()),Wr=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function Hr(e){return"string"==typeof e&&e.split("/*")[0].includes("var(--")}const Yr={test:e=>"number"==typeof e,parse:parseFloat,transform:e=>e},Gr={...Yr,transform:e=>er(0,1,e)},Kr={...Yr,default:1},Xr=e=>Math.round(1e5*e)/1e5,Jr=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu,Zr=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,Qr=(e,t)=>n=>Boolean("string"==typeof n&&Zr.test(n)&&n.startsWith(e)||t&&!function(e){return null==e}(n)&&Object.prototype.hasOwnProperty.call(n,t)),eo=(e,t,n)=>a=>{if("string"!=typeof a)return a;const[s,i,r,o]=a.match(Jr);return{[e]:parseFloat(s),[t]:parseFloat(i),[n]:parseFloat(r),alpha:void 0!==o?parseFloat(o):1}},to={...Yr,transform:e=>Math.round((e=>er(0,255,e))(e))},no={test:Qr("rgb","red"),parse:eo("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:a=1})=>"rgba("+to.transform(e)+", "+to.transform(t)+", "+to.transform(n)+", "+Xr(Gr.transform(a))+")"},ao={test:Qr("#"),parse:function(e){let t="",n="",a="",s="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),a=e.substring(5,7),s=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),a=e.substring(3,4),s=e.substring(4,5),t+=t,n+=n,a+=a,s+=s),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(a,16),alpha:s?parseInt(s,16)/255:1}},transform:no.transform},so=e=>({test:t=>"string"==typeof t&&t.endsWith(e)&&1===t.split(" ").length,parse:parseFloat,transform:t=>`${t}${e}`}),io=so("deg"),ro=so("%"),oo=so("px"),lo=so("vh"),co=so("vw"),uo=(()=>({...ro,parse:e=>ro.parse(e)/100,transform:e=>ro.transform(100*e)}))(),ho={test:Qr("hsl","hue"),parse:eo("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:a=1})=>"hsla("+Math.round(e)+", "+ro.transform(Xr(t))+", "+ro.transform(Xr(n))+", "+Xr(Gr.transform(a))+")"},mo={test:e=>no.test(e)||ao.test(e)||ho.test(e),parse:e=>no.test(e)?no.parse(e):ho.test(e)?ho.parse(e):ao.parse(e),transform:e=>"string"==typeof e?e:e.hasOwnProperty("red")?no.transform(e):ho.transform(e),getAnimatableNone:e=>{const t=mo.parse(e);return t.alpha=0,mo.transform(t)}},po=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu,go="number",fo="color",yo=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function bo(e){const t=e.toString(),n=[],a={color:[],number:[],var:[]},s=[];let i=0;const r=t.replace(yo,e=>(mo.test(e)?(a.color.push(i),s.push(fo),n.push(mo.parse(e))):e.startsWith("var(")?(a.var.push(i),s.push("var"),n.push(e)):(a.number.push(i),s.push(go),n.push(parseFloat(e))),++i,"${}")).split("${}");return{values:n,split:r,indexes:a,types:s}}function vo(e){return bo(e).values}function wo(e){const{split:t,types:n}=bo(e),a=t.length;return e=>{let s="";for(let i=0;i"number"==typeof e?0:mo.test(e)?mo.getAnimatableNone(e):e,xo={test:function(e){var t,n;return isNaN(e)&&"string"==typeof e&&((null==(t=e.match(Jr))?void 0:t.length)||0)+((null==(n=e.match(po))?void 0:n.length)||0)>0},parse:vo,createTransformer:wo,getAnimatableNone:function(e){const t=vo(e);return wo(e)(t.map(ko))}};function So(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function jo(e,t){return n=>n>0?t:e}const Co=(e,t,n)=>e+(t-e)*n,To=(e,t,n)=>{const a=e*e,s=n*(t*t-a)+a;return s<0?0:Math.sqrt(s)},Mo=[ao,no,ho];function Po(e){const t=(n=e,Mo.find(e=>e.test(n)));var n;if(!Boolean(t))return!1;let a=t.parse(e);return t===ho&&(a=function({hue:e,saturation:t,lightness:n,alpha:a}){e/=360,n/=100;let s=0,i=0,r=0;if(t/=100){const a=n<.5?n*(1+t):n+t-n*t,o=2*n-a;s=So(o,a,e+1/3),i=So(o,a,e),r=So(o,a,e-1/3)}else s=i=r=n;return{red:Math.round(255*s),green:Math.round(255*i),blue:Math.round(255*r),alpha:a}}(a)),a}const Eo=(e,t)=>{const n=Po(e),a=Po(t);if(!n||!a)return jo(e,t);const s={...n};return e=>(s.red=To(n.red,a.red,e),s.green=To(n.green,a.green,e),s.blue=To(n.blue,a.blue,e),s.alpha=Co(n.alpha,a.alpha,e),no.transform(s))},Ao=new Set(["none","hidden"]);function Lo(e,t){return n=>Co(e,t,n)}function Do(e){return"number"==typeof e?Lo:"string"==typeof e?Ur(e)?jo:mo.test(e)?Eo:Fo:Array.isArray(e)?zo:"object"==typeof e?mo.test(e)?Eo:No:jo}function zo(e,t){const n=[...e],a=n.length,s=e.map((e,n)=>Do(e)(e,t[n]));return e=>{for(let t=0;t{for(const t in a)n[t]=a[t](e);return n}}const Fo=(e,t)=>{const n=xo.createTransformer(t),a=bo(e),s=bo(t);return a.indexes.var.length===s.indexes.var.length&&a.indexes.color.length===s.indexes.color.length&&a.indexes.number.length>=s.indexes.number.length?Ao.has(e)&&!s.values.length||Ao.has(t)&&!a.values.length?function(e,t){return Ao.has(e)?n=>n<=0?e:t:n=>n>=1?t:e}(e,t):lr(zo(function(e,t){const n=[],a={color:0,var:0,number:0};for(let s=0;s{const t=({timestamp:t})=>e(t);return{start:(e=!0)=>Nr.update(t,e),stop:()=>Fr(t),now:()=>Rr.isProcessing?Rr.timestamp:Vr.now()}},_o=(e,t,n=10)=>{let a="";const s=Math.max(Math.round(t/n),2);for(let i=0;i=Bo?1/0:t}function Oo(e,t=100,n){const a=n({...e,keyframes:[0,t]}),s=Math.min(Vo(a),Bo);return{type:"keyframes",ease:e=>a.next(s*e).value/t,duration:hr(s)}}function qo(e,t,n){const a=Math.max(t-5,0);return mr(n-e(a),t-a)}const $o=.01,Uo=2,Wo=.005,Ho=.5;const Yo=12;function Go(e,t){return e*Math.sqrt(1-t*t)}const Ko=["duration","bounce"],Xo=["stiffness","damping","mass"];function Jo(e,t){return t.some(t=>void 0!==e[t])}function Zo(e=.3,t=.3){const n="object"!=typeof e?{visualDuration:e,keyframes:[0,1],bounce:t}:e;let{restSpeed:a,restDelta:s}=n;const i=n.keyframes[0],r=n.keyframes[n.keyframes.length-1],o={done:!1,value:i},{stiffness:l,damping:c,mass:u,duration:d,velocity:h,isResolvedFromDuration:m}=function(e){let t={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...e};if(!Jo(e,Xo)&&Jo(e,Ko))if(e.visualDuration){const n=e.visualDuration,a=2*Math.PI/(1.2*n),s=a*a,i=2*er(.05,1,1-(e.bounce||0))*Math.sqrt(s);t={...t,mass:1,stiffness:s,damping:i}}else{const n=function({duration:e=800,bounce:t=.3,velocity:n=0,mass:a=1}){let s,i,r=1-t;r=er(.05,1,r),e=er(.01,10,hr(e)),r<1?(s=t=>{const a=t*r,s=a*e;return.001-(a-n)/Go(t,r)*Math.exp(-s)},i=t=>{const a=t*r*e,i=a*n+n,o=Math.pow(r,2)*Math.pow(t,2)*e,l=Math.exp(-a),c=Go(Math.pow(t,2),r);return(.001-s(t)>0?-1:1)*((i-o)*l)/c}):(s=t=>Math.exp(-t*e)*((t-n)*e+1)-.001,i=t=>Math.exp(-t*e)*(e*e*(n-t)));const o=function(e,t,n){let a=n;for(let s=1;s{const n=Math.exp(-g*y*t);return r-n*((p+g*y*f)/e*Math.sin(e*t)+f*Math.cos(e*t))}}else if(1===g)v=e=>r-Math.exp(-y*e)*(f+(p+y*f)*e);else{const e=y*Math.sqrt(g*g-1);v=t=>{const n=Math.exp(-g*y*t),a=Math.min(e*t,300);return r-n*((p+g*y*f)*Math.sinh(a)+e*f*Math.cosh(a))/e}}const w={calculatedDuration:m&&d||null,next:e=>{const t=v(e);if(m)o.done=e>=d;else{let n=0===e?p:0;g<1&&(n=0===e?dr(p):qo(v,e,t));const i=Math.abs(n)<=a,l=Math.abs(r-t)<=s;o.done=i&&l}return o.value=o.done?r:t,o},toString:()=>{const e=Math.min(Vo(w),Bo),t=_o(t=>w.next(e*t).value,e,30);return e+"ms "+t},toTransition:()=>{}};return w}function Qo({keyframes:e,velocity:t=0,power:n=.8,timeConstant:a=325,bounceDamping:s=10,bounceStiffness:i=500,modifyTarget:r,min:o,max:l,restDelta:c=.5,restSpeed:u}){const d=e[0],h={done:!1,value:d},m=e=>void 0===o?l:void 0===l||Math.abs(o-e)-p*Math.exp(-e/a),b=e=>f+y(e),v=e=>{const t=y(e),n=b(e);h.done=Math.abs(t)<=c,h.value=h.done?f:n};let w,k;const x=e=>{var t;t=h.value,(void 0!==o&&tl)&&(w=e,k=Zo({keyframes:[h.value,m(h.value)],velocity:qo(b,e,h.value),damping:s,stiffness:i,restDelta:c,restSpeed:u}))};return x(0),{calculatedDuration:null,next:e=>{let t=!1;return k||void 0!==w||(t=!0,v(e),x(e)),void 0!==w&&e>=w?k.next(e-w):(!t&&v(e),h)}}}function el(e,t,{clamp:n=!0,ease:a,mixer:s}={}){const i=e.length;if(t.length,1===i)return()=>t[0];if(2===i&&t[0]===t[1])return()=>t[1];const r=e[0]===e[1];e[0]>e[i-1]&&(e=[...e].reverse(),t=[...t].reverse());const o=function(e,t,n){const a=[],s=n||tr.mix||Ro,i=e.length-1;for(let r=0;r{if(r&&n1)for(;ac(er(e[0],e[i-1],t)):c}function tl(e,t){const n=e[e.length-1];for(let a=1;a<=t;a++){const s=cr(0,t,a);e.push(Co(n,1,s))}}function nl(e){const t=[0];return tl(t,e.length-1),t}function al({duration:e=300,keyframes:t,times:n,ease:a="easeInOut"}){const s=Pr(a)?a.map(Lr):Lr(a),i={done:!1,value:t[0]},r=function(e,t){return e.map(e=>e*t)}(n&&n.length===t.length?n:nl(t),e),o=el(r,t,{ease:Array.isArray(s)?s:(l=t,c=s,l.map(()=>c||Mr).splice(0,l.length-1))});var l,c;return{calculatedDuration:e,next:t=>(i.value=o(t),i.done=t>=e,i)}}Zo.applyToOptions=e=>{const t=Oo(e,100,Zo);return e.ease=t.ease,e.duration=dr(t.duration),e.type="keyframes",e};const sl=e=>null!==e;function il(e,{repeat:t,repeatType:n="loop"},a,s=1){const i=e.filter(sl),r=s<0||t&&"loop"!==n&&t%2==1?0:i.length-1;return r&&void 0!==a?a:i[r]}const rl={decay:Qo,inertia:Qo,tween:al,keyframes:al,spring:Zo};function ol(e){"string"==typeof e.type&&(e.type=rl[e.type])}class ll{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(e=>{this.resolve=e})}notifyFinished(){this.resolve()}then(e,t){return this.finished.then(e,t)}}const cl=e=>e/100;class ul extends ll{constructor(e){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{var e,t;const{motionValue:n}=this.options;n&&n.updatedAt!==Vr.now()&&this.tick(Vr.now()),this.isStopped=!0,"idle"!==this.state&&(this.teardown(),null==(t=(e=this.options).onStop)||t.call(e))},this.options=e,this.initAnimation(),this.play(),!1===e.autoplay&&this.pause()}initAnimation(){const{options:e}=this;ol(e);const{type:t=al,repeat:n=0,repeatDelay:a=0,repeatType:s,velocity:i=0}=e;let{keyframes:r}=e;const o=t||al;o!==al&&"number"!=typeof r[0]&&(this.mixKeyframes=lr(cl,Ro(r[0],r[1])),r=[0,100]);const l=o({...e,keyframes:r});"mirror"===s&&(this.mirroredGenerator=o({...e,keyframes:[...r].reverse(),velocity:-i})),null===l.calculatedDuration&&(l.calculatedDuration=Vo(l));const{calculatedDuration:c}=l;this.calculatedDuration=c,this.resolvedDuration=c+a,this.totalDuration=this.resolvedDuration*(n+1)-a,this.generator=l}updateTime(e){const t=Math.round(e-this.startTime)*this.playbackSpeed;null!==this.holdTime?this.currentTime=this.holdTime:this.currentTime=t}tick(e,t=!1){const{generator:n,totalDuration:a,mixKeyframes:s,mirroredGenerator:i,resolvedDuration:r,calculatedDuration:o}=this;if(null===this.startTime)return n.next(0);const{delay:l=0,keyframes:c,repeat:u,repeatType:d,repeatDelay:h,type:m,onUpdate:p,finalKeyframe:g}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,e):this.speed<0&&(this.startTime=Math.min(e-a/this.speed,this.startTime)),t?this.currentTime=e:this.updateTime(e);const f=this.currentTime-l*(this.playbackSpeed>=0?1:-1),y=this.playbackSpeed>=0?f<0:f>a;this.currentTime=Math.max(f,0),"finished"===this.state&&null===this.holdTime&&(this.currentTime=a);let b=this.currentTime,v=n;if(u){const e=Math.min(this.currentTime,a)/r;let t=Math.floor(e),n=e%1;!n&&e>=1&&(n=1),1===n&&t--,t=Math.min(t,u+1),Boolean(t%2)&&("reverse"===d?(n=1-n,h&&(n-=h/r)):"mirror"===d&&(v=i)),b=er(0,1,n)*r}const w=y?{done:!1,value:c[0]}:v.next(b);s&&(w.value=s(w.value));let{done:k}=w;y||null===o||(k=this.playbackSpeed>=0?this.currentTime>=a:this.currentTime<=0);const x=null===this.holdTime&&("finished"===this.state||"running"===this.state&&k);return x&&m!==Qo&&(w.value=il(c,this.options,g,this.speed)),p&&p(w.value),x&&this.finish(),w}then(e,t){return this.finished.then(e,t)}get duration(){return hr(this.calculatedDuration)}get iterationDuration(){const{delay:e=0}=this.options||{};return this.duration+hr(e)}get time(){return hr(this.currentTime)}set time(e){var t;e=dr(e),this.currentTime=e,null===this.startTime||null!==this.holdTime||0===this.playbackSpeed?this.holdTime=e:this.driver&&(this.startTime=this.driver.now()-e/this.playbackSpeed),null==(t=this.driver)||t.start(!1)}get speed(){return this.playbackSpeed}set speed(e){this.updateTime(Vr.now());const t=this.playbackSpeed!==e;this.playbackSpeed=e,t&&(this.time=hr(this.currentTime))}play(){var e,t;if(this.isStopped)return;const{driver:n=Io,startTime:a}=this.options;this.driver||(this.driver=n(e=>this.tick(e))),null==(t=(e=this.options).onPlay)||t.call(e);const s=this.driver.now();"finished"===this.state?(this.updateFinished(),this.startTime=s):null!==this.holdTime?this.startTime=s-this.holdTime:this.startTime||(this.startTime=a??s),"finished"===this.state&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(Vr.now()),this.holdTime=this.currentTime}complete(){"running"!==this.state&&this.play(),this.state="finished",this.holdTime=null}finish(){var e,t;this.notifyFinished(),this.teardown(),this.state="finished",null==(t=(e=this.options).onComplete)||t.call(e)}cancel(){var e,t;this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),null==(t=(e=this.options).onCancel)||t.call(e)}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(e){return this.startTime=0,this.tick(e,!0)}attachTimeline(e){var t;return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),null==(t=this.driver)||t.stop(),e.observe(this)}}const dl=e=>180*e/Math.PI,hl=e=>{const t=dl(Math.atan2(e[1],e[0]));return pl(t)},ml={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:hl,rotateZ:hl,skewX:e=>dl(Math.atan(e[1])),skewY:e=>dl(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},pl=e=>((e%=360)<0&&(e+=360),e),gl=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),fl=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),yl={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:gl,scaleY:fl,scale:e=>(gl(e)+fl(e))/2,rotateX:e=>pl(dl(Math.atan2(e[6],e[5]))),rotateY:e=>pl(dl(Math.atan2(-e[2],e[0]))),rotateZ:hl,rotate:hl,skewX:e=>dl(Math.atan(e[4])),skewY:e=>dl(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function bl(e){return e.includes("scale")?1:0}function vl(e,t){if(!e||"none"===e)return bl(t);const n=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let a,s;if(n)a=yl,s=n;else{const t=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);a=ml,s=t}if(!s)return bl(t);const i=a[t],r=s[1].split(",").map(wl);return"function"==typeof i?i(r):r[i]}function wl(e){return parseFloat(e.trim())}const kl=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],xl=(()=>new Set(kl))(),Sl=e=>e===Yr||e===oo,jl=new Set(["x","y","z"]),Cl=kl.filter(e=>!jl.has(e)),Tl={width:({x:e},{paddingLeft:t="0",paddingRight:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),height:({y:e},{paddingTop:t="0",paddingBottom:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:(e,{transform:t})=>vl(t,"x"),y:(e,{transform:t})=>vl(t,"y")};Tl.translateX=Tl.x,Tl.translateY=Tl.y;const Ml=new Set;let Pl=!1,El=!1,Al=!1;function Ll(){if(El){const e=Array.from(Ml).filter(e=>e.needsMeasurement),t=new Set(e.map(e=>e.element)),n=new Map;t.forEach(e=>{const t=function(e){const t=[];return Cl.forEach(n=>{const a=e.getValue(n);void 0!==a&&(t.push([n,a.get()]),a.set(n.startsWith("scale")?1:0))}),t}(e);t.length&&(n.set(e,t),e.render())}),e.forEach(e=>e.measureInitialState()),t.forEach(e=>{e.render();const t=n.get(e);t&&t.forEach(([t,n])=>{var a;null==(a=e.getValue(t))||a.set(n)})}),e.forEach(e=>e.measureEndState()),e.forEach(e=>{void 0!==e.suspendedScrollY&&window.scrollTo(0,e.suspendedScrollY)})}El=!1,Pl=!1,Ml.forEach(e=>e.complete(Al)),Ml.clear()}function Dl(){Ml.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(El=!0)})}class zl{constructor(e,t,n,a,s,i=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...e],this.onComplete=t,this.name=n,this.motionValue=a,this.element=s,this.isAsync=i}scheduleResolve(){this.state="scheduled",this.isAsync?(Ml.add(this),Pl||(Pl=!0,Nr.read(Dl),Nr.resolveKeyframes(Ll))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:e,name:t,element:n,motionValue:a}=this;if(null===e[0]){const s=null==a?void 0:a.get(),i=e[e.length-1];if(void 0!==s)e[0]=s;else if(n&&t){const a=n.readValue(t,i);null!=a&&(e[0]=a)}void 0===e[0]&&(e[0]=i),a&&void 0===s&&a.set(e[0])}!function(e){for(let t=1;tvoid 0!==window.ScrollTimeline),Fl={};function Rl(e,t){const n=ir(e);return()=>Fl[t]??n()}const Il=Rl(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch(e){return!1}return!0},"linearEasing"),_l=([e,t,n,a])=>`cubic-bezier(${e}, ${t}, ${n}, ${a})`,Bl={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:_l([0,.65,.55,1]),circOut:_l([.55,0,1,.45]),backIn:_l([.31,.01,.66,-.59]),backOut:_l([.33,1.53,.69,.99])};function Vl(e,t){return e?"function"==typeof e?Il()?_o(e,t):"ease-out":Er(e)?_l(e):Array.isArray(e)?e.map(e=>Vl(e,t)||Bl.easeOut):Bl[e]:void 0}function Ol(e,t,n,{delay:a=0,duration:s=300,repeat:i=0,repeatType:r="loop",ease:o="easeOut",times:l}={},c=void 0){const u={[t]:n};l&&(u.offset=l);const d=Vl(o,s);Array.isArray(d)&&(u.easing=d);const h={delay:a,duration:s,easing:Array.isArray(d)?"linear":d,fill:"both",iterations:i+1,direction:"reverse"===r?"alternate":"normal"};return c&&(h.pseudoElement=c),e.animate(u,h)}function ql(e){return"function"==typeof e&&"applyToOptions"in e}class $l extends ll{constructor(e){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!e)return;const{element:t,name:n,keyframes:a,pseudoElement:s,allowFlatten:i=!1,finalKeyframe:r,onComplete:o}=e;this.isPseudoElement=Boolean(s),this.allowFlatten=i,this.options=e,e.type;const l=function({type:e,...t}){return ql(e)&&Il()?e.applyToOptions(t):(t.duration??(t.duration=300),t.ease??(t.ease="easeOut"),t)}(e);this.animation=Ol(t,n,a,l,s),!1===l.autoplay&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!s){const e=il(a,this.options,r,this.speed);this.updateMotionValue?this.updateMotionValue(e):function(e,t,n){(e=>e.startsWith("--"))(t)?e.style.setProperty(t,n):e.style[t]=n}(t,n,e),this.animation.cancel()}null==o||o(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),"finished"===this.state&&this.updateFinished())}pause(){this.animation.pause()}complete(){var e,t;null==(t=(e=this.animation).finish)||t.call(e)}cancel(){try{this.animation.cancel()}catch(e){}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:e}=this;"idle"!==e&&"finished"!==e&&(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){var e,t;this.isPseudoElement||null==(t=(e=this.animation).commitStyles)||t.call(e)}get duration(){var e,t;const n=(null==(t=null==(e=this.animation.effect)?void 0:e.getComputedTiming)?void 0:t.call(e).duration)||0;return hr(Number(n))}get iterationDuration(){const{delay:e=0}=this.options||{};return this.duration+hr(e)}get time(){return hr(Number(this.animation.currentTime)||0)}set time(e){this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=dr(e)}get speed(){return this.animation.playbackRate}set speed(e){e<0&&(this.finishedTime=null),this.animation.playbackRate=e}get state(){return null!==this.finishedTime?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(e){this.manualStartTime=this.animation.startTime=e}attachTimeline({timeline:e,observe:t}){var n;return this.allowFlatten&&(null==(n=this.animation.effect)||n.updateTiming({easing:"linear"})),this.animation.onfinish=null,e&&Nl()?(this.animation.timeline=e,rr):t(this)}}const Ul={anticipate:kr,backInOut:wr,circInOut:jr};class Wl extends $l{constructor(e){var t;"string"==typeof(t=e).ease&&t.ease in Ul&&(t.ease=Ul[t.ease]),ol(e),super(e),void 0!==e.startTime&&(this.startTime=e.startTime),this.options=e}updateMotionValue(e){const{motionValue:t,onUpdate:n,onComplete:a,element:s,...i}=this.options;if(!t)return;if(void 0!==e)return void t.set(e);const r=new ul({...i,autoplay:!1}),o=Math.max(10,Vr.now()-this.startTime),l=er(0,10,o-10);t.setWithVelocity(r.sample(Math.max(0,o-l)).value,r.sample(o).value,l),r.stop()}}const Hl=(e,t)=>!("zIndex"===t||"number"!=typeof e&&!Array.isArray(e)&&("string"!=typeof e||!xo.test(e)&&"0"!==e||e.startsWith("url(")));function Yl(e){e.duration=0,e.type="keyframes"}const Gl=new Set(["opacity","clipPath","filter","transform"]),Kl=ir(()=>Object.hasOwnProperty.call(Element.prototype,"animate"));class Xl extends ll{constructor({autoplay:e=!0,delay:t=0,type:n="keyframes",repeat:a=0,repeatDelay:s=0,repeatType:i="loop",keyframes:r,name:o,motionValue:l,element:c,...u}){var d;super(),this.stop=()=>{var e,t;this._animation&&(this._animation.stop(),null==(e=this.stopTimeline)||e.call(this)),null==(t=this.keyframeResolver)||t.cancel()},this.createdAt=Vr.now();const h={autoplay:e,delay:t,type:n,repeat:a,repeatDelay:s,repeatType:i,name:o,motionValue:l,element:c,...u},m=(null==c?void 0:c.KeyframeResolver)||zl;this.keyframeResolver=new m(r,(e,t,n)=>this.onKeyframesResolved(e,t,h,!n),o,l,c),null==(d=this.keyframeResolver)||d.scheduleResolve()}onKeyframesResolved(e,t,n,a){var s,i;this.keyframeResolver=void 0;const{name:r,type:o,velocity:l,delay:c,isHandoff:u,onUpdate:d}=n;this.resolvedAt=Vr.now(),function(e,t,n,a){const s=e[0];if(null===s)return!1;if("display"===t||"visibility"===t)return!0;const i=e[e.length-1],r=Hl(s,t),o=Hl(i,t);return!(!r||!o)&&(function(e){const t=e[0];if(1===e.length)return!0;for(let n=0;n40?this.resolvedAt:this.createdAt:void 0,finalKeyframe:t,...n,keyframes:e},m=!u&&function(e){var t;const{motionValue:n,name:a,repeatDelay:s,repeatType:i,damping:r,type:o}=e;if(!((null==(t=null==n?void 0:n.owner)?void 0:t.current)instanceof HTMLElement))return!1;const{onUpdate:l,transformTemplate:c}=n.owner.getProps();return Kl()&&a&&Gl.has(a)&&("transform"!==a||!c)&&!l&&!s&&"mirror"!==i&&0!==r&&"inertia"!==o}(h),p=null==(i=null==(s=h.motionValue)?void 0:s.owner)?void 0:i.current,g=m?new Wl({...h,element:p}):new ul(h);g.finished.then(()=>{this.notifyFinished()}).catch(rr),this.pendingTimeline&&(this.stopTimeline=g.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=g}get finished(){return this._animation?this.animation.finished:this._finished}then(e,t){return this.finished.finally(e).then(()=>{})}get animation(){var e;return this._animation||(null==(e=this.keyframeResolver)||e.resume(),Al=!0,Dl(),Ll(),Al=!1),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(e){this.animation.time=e}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(e){this.animation.speed=e}get startTime(){return this.animation.startTime}attachTimeline(e){return this._animation?this.stopTimeline=this.animation.attachTimeline(e):this.pendingTimeline=e,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){var e;this._animation&&this.animation.cancel(),null==(e=this.keyframeResolver)||e.cancel()}}function Jl(e,t,n,a=0,s=1){const i=Array.from(e).sort((e,t)=>e.sortNodePosition(t)).indexOf(t),r=e.size,o=(r-1)*a;return"function"==typeof n?n(i,r):1===s?i*a:o-i*a}const Zl=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function Ql(e,t,n=1){const[a,s]=function(e){const t=Zl.exec(e);if(!t)return[,];const[,n,a,s]=t;return[`--${n??a}`,s]}(e);if(!a)return;const i=window.getComputedStyle(t).getPropertyValue(a);if(i){const e=i.trim();return nr(e)?parseFloat(e):e}return Ur(s)?Ql(s,t,n+1):s}const ec={type:"spring",stiffness:500,damping:25,restSpeed:10},tc={type:"keyframes",duration:.8},nc={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},ac=e=>null!==e;function sc(e,t){return(null==e?void 0:e[t])??(null==e?void 0:e.default)??e}const ic=(e,t,n,a={},s,i)=>r=>{const o=sc(a,e)||{},l=o.delay||a.delay||0;let{elapsed:c=0}=a;c-=dr(l);const u={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:t.getVelocity(),...o,delay:-c,onUpdate:e=>{t.set(e),o.onUpdate&&o.onUpdate(e)},onComplete:()=>{r(),o.onComplete&&o.onComplete()},name:e,motionValue:t,element:i?void 0:s};(function({when:e,delay:t,delayChildren:n,staggerChildren:a,staggerDirection:s,repeat:i,repeatType:r,repeatDelay:o,from:l,elapsed:c,...u}){return!!Object.keys(u).length})(o)||Object.assign(u,((e,{keyframes:t})=>t.length>2?tc:xl.has(e)?e.startsWith("scale")?{type:"spring",stiffness:550,damping:0===t[1]?2*Math.sqrt(550):30,restSpeed:10}:ec:nc)(e,u)),u.duration&&(u.duration=dr(u.duration)),u.repeatDelay&&(u.repeatDelay=dr(u.repeatDelay)),void 0!==u.from&&(u.keyframes[0]=u.from);let d=!1;if((!1===u.type||0===u.duration&&!u.repeatDelay)&&(Yl(u),0===u.delay&&(d=!0)),(tr.instantAnimations||tr.skipAnimations)&&(d=!0,Yl(u),u.delay=0),u.allowFlatten=!o.type&&!o.ease,d&&!i&&void 0!==t.get()){const e=function(e,{repeat:t,repeatType:n="loop"}){const a=e.filter(ac);return a[t&&"loop"!==n&&t%2==1?0:a.length-1]}(u.keyframes,o);if(void 0!==e)return void Nr.update(()=>{u.onUpdate(e),u.onComplete()})}return o.isSync?new ul(u):new Xl(u)};function rc(e){const t=[{},{}];return null==e||e.values.forEach((e,n)=>{t[0][n]=e.get(),t[1][n]=e.getVelocity()}),t}function oc(e,t,n,a){if("function"==typeof t){const[s,i]=rc(a);t=t(void 0!==n?n:e.custom,s,i)}if("string"==typeof t&&(t=e.variants&&e.variants[t]),"function"==typeof t){const[s,i]=rc(a);t=t(void 0!==n?n:e.custom,s,i)}return t}function lc(e,t,n){const a=e.getProps();return oc(a,t,void 0!==n?n:a.custom,e)}const cc=new Set(["width","height","top","left","right","bottom",...kl]),uc={current:void 0};class dc{constructor(e,t={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=e=>{var t;const n=Vr.now();if(this.updatedAt!==n&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(e),this.current!==this.prev&&(null==(t=this.events.change)||t.notify(this.current),this.dependents))for(const a of this.dependents)a.dirty()},this.hasAnimated=!1,this.setCurrent(e),this.owner=t.owner}setCurrent(e){var t;this.current=e,this.updatedAt=Vr.now(),null===this.canTrackVelocity&&void 0!==e&&(this.canTrackVelocity=(t=this.current,!isNaN(parseFloat(t))))}setPrevFrameValue(e=this.current){this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt}onChange(e){return this.on("change",e)}on(e,t){this.events[e]||(this.events[e]=new ur);const n=this.events[e].add(t);return"change"===e?()=>{n(),Nr.read(()=>{this.events.change.getSize()||this.stop()})}:n}clearListeners(){for(const e in this.events)this.events[e].clear()}attach(e,t){this.passiveEffect=e,this.stopPassiveEffect=t}set(e){this.passiveEffect?this.passiveEffect(e,this.updateAndNotify):this.updateAndNotify(e)}setWithVelocity(e,t,n){this.set(t),this.prev=void 0,this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt-n}jump(e,t=!0){this.updateAndNotify(e),this.prev=e,this.prevUpdatedAt=this.prevFrameValue=void 0,t&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){var e;null==(e=this.events.change)||e.notify(this.current)}addDependent(e){this.dependents||(this.dependents=new Set),this.dependents.add(e)}removeDependent(e){this.dependents&&this.dependents.delete(e)}get(){return uc.current&&uc.current.push(this),this.current}getPrevious(){return this.prev}getVelocity(){const e=Vr.now();if(!this.canTrackVelocity||void 0===this.prevFrameValue||e-this.updatedAt>30)return 0;const t=Math.min(this.updatedAt-this.prevUpdatedAt,30);return mr(parseFloat(this.current)-parseFloat(this.prevFrameValue),t)}start(e){return this.stop(),new Promise(t=>{this.hasAnimated=!0,this.animation=e(t),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){var e,t;null==(e=this.dependents)||e.clear(),null==(t=this.events.destroy)||t.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function hc(e,t){return new dc(e,t)}const mc=e=>Array.isArray(e);function pc(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,hc(n))}function gc(e){return mc(e)?e[e.length-1]||0:e}function fc(e,t){const n=lc(e,t);let{transitionEnd:a={},transition:s={},...i}=n||{};i={...i,...a};for(const r in i)pc(e,r,gc(i[r]))}const yc=e=>Boolean(e&&e.getVelocity);function bc(e,t){const n=e.getValue("willChange");if(a=n,Boolean(yc(a)&&a.add))return n.add(t);if(!n&&tr.WillChange){const n=new tr.WillChange("auto");e.addValue("willChange",n),n.add(t)}var a}function vc(e){return e.replace(/([A-Z])/g,e=>`-${e.toLowerCase()}`)}const wc="data-"+vc("framerAppearId");function kc(e){return e.props[wc]}function xc({protectedKeys:e,needsAnimating:t},n){const a=e.hasOwnProperty(n)&&!0!==t[n];return t[n]=!1,a}function Sc(e,t,{delay:n=0,transitionOverride:a,type:s}={}){let{transition:i=e.getDefaultTransition(),transitionEnd:r,...o}=t;a&&(i=a);const l=[],c=s&&e.animationState&&e.animationState.getState()[s];for(const u in o){const t=e.getValue(u,e.latestValues[u]??null),a=o[u];if(void 0===a||c&&xc(c,u))continue;const s={delay:n,...sc(i||{},u)},r=t.get();if(void 0!==r&&!t.isAnimating&&!Array.isArray(a)&&a===r&&!s.velocity)continue;let d=!1;if(window.MotionHandoffAnimation){const t=kc(e);if(t){const e=window.MotionHandoffAnimation(t,u,Nr);null!==e&&(s.startTime=e,d=!0)}}bc(e,u),t.start(ic(u,t,a,e.shouldReduceMotion&&cc.has(u)?{type:!1}:s,e,d));const h=t.animation;h&&l.push(h)}return r&&Promise.all(l).then(()=>{Nr.update(()=>{r&&fc(e,r)})}),l}function jc(e,t,n={}){var a;const s=lc(e,t,"exit"===n.type?null==(a=e.presenceContext)?void 0:a.custom:void 0);let{transition:i=e.getDefaultTransition()||{}}=s||{};n.transitionOverride&&(i=n.transitionOverride);const r=s?()=>Promise.all(Sc(e,s,n)):()=>Promise.resolve(),o=e.variantChildren&&e.variantChildren.size?(a=0)=>{const{delayChildren:s=0,staggerChildren:r,staggerDirection:o}=i;return function(e,t,n=0,a=0,s=0,i=1,r){const o=[];for(const l of e.variantChildren)l.notify("AnimationStart",t),o.push(jc(l,t,{...r,delay:n+("function"==typeof a?0:a)+Jl(e.variantChildren,l,a,s,i)}).then(()=>l.notify("AnimationComplete",t)));return Promise.all(o)}(e,t,a,s,r,o,n)}:()=>Promise.resolve(),{when:l}=i;if(l){const[e,t]="beforeChildren"===l?[r,o]:[o,r];return e().then(()=>t())}return Promise.all([r(),o(n.delay)])}function Cc(e,t,n={}){let a;if(e.notify("AnimationStart",t),Array.isArray(t)){const s=t.map(t=>jc(e,t,n));a=Promise.all(s)}else if("string"==typeof t)a=jc(e,t,n);else{const s="function"==typeof t?lc(e,t,n.custom):t;a=Promise.all(Sc(e,s,n))}return a.then(()=>{e.notify("AnimationComplete",t)})}const Tc=e=>t=>t.test(e),Mc=[Yr,oo,ro,io,co,lo,{test:e=>"auto"===e,parse:e=>e}],Pc=e=>Mc.find(Tc(e));function Ec(e){return"number"==typeof e?0===e:null===e||"none"===e||"0"===e||sr(e)}const Ac=new Set(["brightness","contrast","saturate","opacity"]);function Lc(e){const[t,n]=e.slice(0,-1).split("(");if("drop-shadow"===t)return e;const[a]=n.match(Jr)||[];if(!a)return e;const s=n.replace(a,"");let i=Ac.has(t)?1:0;return a!==n&&(i*=100),t+"("+i+s+")"}const Dc=/\b([a-z-]*)\(.*?\)/gu,zc={...xo,getAnimatableNone:e=>{const t=e.match(Dc);return t?t.map(Lc).join(" "):e}},Nc={...Yr,transform:Math.round},Fc={borderWidth:oo,borderTopWidth:oo,borderRightWidth:oo,borderBottomWidth:oo,borderLeftWidth:oo,borderRadius:oo,borderTopLeftRadius:oo,borderTopRightRadius:oo,borderBottomRightRadius:oo,borderBottomLeftRadius:oo,width:oo,maxWidth:oo,height:oo,maxHeight:oo,top:oo,right:oo,bottom:oo,left:oo,inset:oo,insetBlock:oo,insetBlockStart:oo,insetBlockEnd:oo,insetInline:oo,insetInlineStart:oo,insetInlineEnd:oo,padding:oo,paddingTop:oo,paddingRight:oo,paddingBottom:oo,paddingLeft:oo,paddingBlock:oo,paddingBlockStart:oo,paddingBlockEnd:oo,paddingInline:oo,paddingInlineStart:oo,paddingInlineEnd:oo,margin:oo,marginTop:oo,marginRight:oo,marginBottom:oo,marginLeft:oo,marginBlock:oo,marginBlockStart:oo,marginBlockEnd:oo,marginInline:oo,marginInlineStart:oo,marginInlineEnd:oo,fontSize:oo,backgroundPositionX:oo,backgroundPositionY:oo,rotate:io,rotateX:io,rotateY:io,rotateZ:io,scale:Kr,scaleX:Kr,scaleY:Kr,scaleZ:Kr,skew:io,skewX:io,skewY:io,distance:oo,translateX:oo,translateY:oo,translateZ:oo,x:oo,y:oo,z:oo,perspective:oo,transformPerspective:oo,opacity:Gr,originX:uo,originY:uo,originZ:oo,zIndex:Nc,fillOpacity:Gr,strokeOpacity:Gr,numOctaves:Nc},Rc={...Fc,color:mo,backgroundColor:mo,outlineColor:mo,fill:mo,stroke:mo,borderColor:mo,borderTopColor:mo,borderRightColor:mo,borderBottomColor:mo,borderLeftColor:mo,filter:zc,WebkitFilter:zc},Ic=e=>Rc[e];function _c(e,t){let n=Ic(e);return n!==zc&&(n=xo),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const Bc=new Set(["auto","none","0"]);class Vc extends zl{constructor(e,t,n,a,s){super(e,t,n,a,s,!0)}readKeyframes(){const{unresolvedKeyframes:e,element:t,name:n}=this;if(!t||!t.current)return;super.readKeyframes();for(let o=0;o{t.getValue(e).set(n)}),this.resolveNoneKeyframes()}}function Oc(e,t,n){if(null==e)return[];if(e instanceof EventTarget)return[e];if("string"==typeof e){let t=document;const a=(null==n?void 0:n[e])??t.querySelectorAll(e);return a?Array.from(a):[]}return Array.from(e).filter(e=>null!=e)}const qc=(e,t)=>t&&"number"==typeof e?t.transform(e):e;function $c(e){return ar(e)&&"offsetHeight"in e}const{schedule:Uc}=zr(queueMicrotask,!1),Wc={x:!1,y:!1};function Hc(){return Wc.x||Wc.y}function Yc(e,t){const n=Oc(e),a=new AbortController;return[n,{passive:!0,...t,signal:a.signal},()=>a.abort()]}function Gc(e){return!("touch"===e.pointerType||Hc())}const Kc=(e,t)=>!!t&&(e===t||Kc(e,t.parentElement)),Xc=e=>"mouse"===e.pointerType?"number"!=typeof e.button||e.button<=0:!1!==e.isPrimary,Jc=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function Zc(e){return Jc.has(e.tagName)||!0===e.isContentEditable}const Qc=new WeakSet;function eu(e){return t=>{"Enter"===t.key&&e(t)}}function tu(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary:!0,bubbles:!0}))}function nu(e){return Xc(e)&&!Hc()}function au(e){return ar(e)&&"ownerSVGElement"in e}function su(e){return au(e)&&"svg"===e.tagName}const iu=[...Mc,mo,xo],ru=()=>({x:{min:0,max:0},y:{min:0,max:0}}),ou={current:null},lu={current:!1},cu="undefined"!=typeof window,uu=new WeakMap;function du(e){return null!==e&&"object"==typeof e&&"function"==typeof e.start}function hu(e){return"string"==typeof e||Array.isArray(e)}const mu=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],pu=["initial",...mu];function gu(e){return du(e.animate)||pu.some(t=>hu(e[t]))}function fu(e){return Boolean(gu(e)||e.variants)}const yu=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let bu={};function vu(e){bu=e}class wu{scrapeMotionValuesFromProps(e,t,n){return{}}constructor({parent:e,props:t,presenceContext:n,reducedMotionConfig:a,blockInitialAnimation:s,visualState:i},r={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=zl,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const e=Vr.now();this.renderScheduledAtthis.bindToMotionValue(t,e)),"never"===this.reducedMotionConfig?this.shouldReduceMotion=!1:"always"===this.reducedMotionConfig?this.shouldReduceMotion=!0:(lu.current||function(){if(lu.current=!0,cu)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>ou.current=e.matches;e.addEventListener("change",t),t()}else ou.current=!1}(),this.shouldReduceMotion=ou.current),null==(t=this.parent)||t.addChild(this),this.update(this.props,this.presenceContext)}unmount(){var e;this.projection&&this.projection.unmount(),Fr(this.notifyUpdate),Fr(this.render),this.valueSubscriptions.forEach(e=>e()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),null==(e=this.parent)||e.removeChild(this);for(const t in this.events)this.events[t].clear();for(const t in this.features){const e=this.features[t];e&&(e.unmount(),e.isMounted=!1)}this.current=null}addChild(e){this.children.add(e),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(e)}removeChild(e){this.children.delete(e),this.enteringChildren&&this.enteringChildren.delete(e)}bindToMotionValue(e,t){this.valueSubscriptions.has(e)&&this.valueSubscriptions.get(e)();const n=xl.has(e);n&&this.onBindTransform&&this.onBindTransform();const a=t.on("change",t=>{this.latestValues[e]=t,this.props.onUpdate&&Nr.preRender(this.notifyUpdate),n&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let s;"undefined"!=typeof window&&window.MotionCheckAppearSync&&(s=window.MotionCheckAppearSync(this,e,t)),this.valueSubscriptions.set(e,()=>{a(),s&&s(),t.owner&&t.stop()})}sortNodePosition(e){return this.current&&this.sortInstanceNodePosition&&this.type===e.type?this.sortInstanceNodePosition(this.current,e.current):0}updateFeatures(){let e="animation";for(e in bu){const t=bu[e];if(!t)continue;const{isEnabled:n,Feature:a}=t;if(!this.features[e]&&a&&n(this.props)&&(this.features[e]=new a(this)),this.features[e]){const t=this.features[e];t.isMounted?t.update():(t.mount(),t.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):{x:{min:0,max:0},y:{min:0,max:0}}}getStaticValue(e){return this.latestValues[e]}setStaticValue(e,t){this.latestValues[e]=t}update(e,t){(e.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=e,this.prevPresenceContext=this.presenceContext,this.presenceContext=t;for(let n=0;nt.variantChildren.delete(e)}addValue(e,t){const n=this.values.get(e);t!==n&&(n&&this.removeValue(e),this.bindToMotionValue(e,t),this.values.set(e,t),this.latestValues[e]=t.get())}removeValue(e){this.values.delete(e);const t=this.valueSubscriptions.get(e);t&&(t(),this.valueSubscriptions.delete(e)),delete this.latestValues[e],this.removeValueFromRenderState(e,this.renderState)}hasValue(e){return this.values.has(e)}getValue(e,t){if(this.props.values&&this.props.values[e])return this.props.values[e];let n=this.values.get(e);return void 0===n&&void 0!==t&&(n=hc(null===t?void 0:t,{owner:this}),this.addValue(e,n)),n}readValue(e,t){let n=void 0===this.latestValues[e]&&this.current?this.getBaseTargetFromProps(this.props,e)??this.readValueFromInstance(this.current,e,this.options):this.latestValues[e];var a;return null!=n&&("string"==typeof n&&(nr(n)||sr(n))?n=parseFloat(n):(a=n,!iu.find(Tc(a))&&xo.test(t)&&(n=_c(e,t))),this.setBaseTarget(e,yc(n)?n.get():n)),yc(n)?n.get():n}setBaseTarget(e,t){this.baseTarget[e]=t}getBaseTarget(e){var t;const{initial:n}=this.props;let a;if("string"==typeof n||"object"==typeof n){const s=oc(this.props,n,null==(t=this.presenceContext)?void 0:t.custom);s&&(a=s[e])}if(n&&void 0!==a)return a;const s=this.getBaseTargetFromProps(this.props,e);return void 0===s||yc(s)?void 0!==this.initialValues[e]&&void 0===a?void 0:this.baseTarget[e]:s}on(e,t){return this.events[e]||(this.events[e]=new ur),this.events[e].add(t)}notify(e,...t){this.events[e]&&this.events[e].notify(...t)}scheduleRenderMicrotask(){Uc.render(this.render)}}class ku extends wu{constructor(){super(...arguments),this.KeyframeResolver=Vc}sortInstanceNodePosition(e,t){return 2&e.compareDocumentPosition(t)?1:-1}getBaseTargetFromProps(e,t){const n=e.style;return n?n[t]:void 0}removeValueFromRenderState(e,{vars:t,style:n}){delete t[e],delete n[e]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:e}=this.props;yc(e)&&(this.childSubscription=e.on("change",e=>{this.current&&(this.current.textContent=`${e}`)}))}}class xu{constructor(e){this.isMounted=!1,this.node=e}update(){}}function Su({top:e,left:t,right:n,bottom:a}){return{x:{min:t,max:n},y:{min:e,max:a}}}function ju(e){return void 0===e||1===e}function Cu({scale:e,scaleX:t,scaleY:n}){return!ju(e)||!ju(t)||!ju(n)}function Tu(e){return Cu(e)||Mu(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function Mu(e){return Pu(e.x)||Pu(e.y)}function Pu(e){return e&&"0%"!==e}function Eu(e,t,n){return n+t*(e-n)}function Au(e,t,n,a,s){return void 0!==s&&(e=Eu(e,s,a)),Eu(e,n,a)+t}function Lu(e,t=0,n=1,a,s){e.min=Au(e.min,t,n,a,s),e.max=Au(e.max,t,n,a,s)}function Du(e,{x:t,y:n}){Lu(e.x,t.translate,t.scale,t.originPoint),Lu(e.y,n.translate,n.scale,n.originPoint)}const zu=.999999999999,Nu=1.0000000000001;function Fu(e,t){e.min=e.min+t,e.max=e.max+t}function Ru(e,t,n,a,s=.5){Lu(e,t,n,Co(e.min,e.max,s),a)}function Iu(e,t){Ru(e.x,t.x,t.scaleX,t.scale,t.originX),Ru(e.y,t.y,t.scaleY,t.scale,t.originY)}function _u(e,t){return Su(function(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),a=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:a.y,right:a.x}}(e.getBoundingClientRect(),t))}const Bu={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},Vu=kl.length;function Ou(e,t,n){const{style:a,vars:s,transformOrigin:i}=e;let r=!1,o=!1;for(const l in t){const e=t[l];if(xl.has(l))r=!0;else if(qr(l))s[l]=e;else{const t=qc(e,Fc[l]);l.startsWith("origin")?(o=!0,i[l]=t):a[l]=t}}if(t.transform||(r||n?a.transform=function(e,t,n){let a="",s=!0;for(let i=0;i{if(!t.target)return e;if("string"==typeof e){if(!oo.test(e))return e;e=parseFloat(e)}return`${$u(e,t.target.x)}% ${$u(e,t.target.y)}%`}},Wu={correct:(e,{treeScale:t,projectionDelta:n})=>{const a=e,s=xo.parse(e);if(s.length>5)return a;const i=xo.createTransformer(e),r="number"!=typeof s[0]?1:0,o=n.x.scale*t.x,l=n.y.scale*t.y;s[0+r]/=o,s[1+r]/=l;const c=Co(o,l,.5);return"number"==typeof s[2+r]&&(s[2+r]/=c),"number"==typeof s[3+r]&&(s[3+r]/=c),i(s)}},Hu={borderRadius:{...Uu,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Uu,borderTopRightRadius:Uu,borderBottomLeftRadius:Uu,borderBottomRightRadius:Uu,boxShadow:Wu};function Yu(e){for(const t in e)Hu[t]=e[t],qr(t)&&(Hu[t].isCSSVariable=!0)}function Gu(e,{layout:t,layoutId:n}){return xl.has(e)||e.startsWith("origin")||(t||void 0!==n)&&(!!Hu[e]||"opacity"===e)}function Ku(e,t,n){var a;const s=e.style,i=null==t?void 0:t.style,r={};if(!s)return r;for(const o in s)(yc(s[o])||i&&yc(i[o])||Gu(o,e)||void 0!==(null==(a=null==n?void 0:n.getValue(o))?void 0:a.liveStyle))&&(r[o]=s[o]);return r}class Xu extends ku{constructor(){super(...arguments),this.type="html",this.renderInstance=qu}readValueFromInstance(e,t){var n,a;if(xl.has(t))return(null==(n=this.projection)?void 0:n.isProjecting)?bl(t):((e,t)=>{const{transform:n="none"}=getComputedStyle(e);return vl(n,t)})(e,t);{const n=(a=e,window.getComputedStyle(a)),s=(qr(t)?n.getPropertyValue(t):n[t])||0;return"string"==typeof s?s.trim():s}}measureInstanceViewportBox(e,{transformPagePoint:t}){return _u(e,t)}build(e,t,n){Ou(e,t,n.transformTemplate)}scrapeMotionValuesFromProps(e,t,n){return Ku(e,t,n)}}const Ju={offset:"stroke-dashoffset",array:"stroke-dasharray"},Zu={offset:"strokeDashoffset",array:"strokeDasharray"},Qu=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function ed(e,{attrX:t,attrY:n,attrScale:a,pathLength:s,pathSpacing:i=1,pathOffset:r=0,...o},l,c,u){if(Ou(e,o,c),l)return void(e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox));e.attrs=e.style,e.style={};const{attrs:d,style:h}=e;d.transform&&(h.transform=d.transform,delete d.transform),(h.transform||d.transformOrigin)&&(h.transformOrigin=d.transformOrigin??"50% 50%",delete d.transformOrigin),h.transform&&(h.transformBox=(null==u?void 0:u.transformBox)??"fill-box",delete d.transformBox);for(const m of Qu)void 0!==d[m]&&(h[m]=d[m],delete d[m]);void 0!==t&&(d.x=t),void 0!==n&&(d.y=n),void 0!==a&&(d.scale=a),void 0!==s&&function(e,t,n=1,a=0,s=!0){e.pathLength=1;const i=s?Ju:Zu;e[i.offset]=""+-a,e[i.array]=`${t} ${n}`}(d,s,i,r,!1)}const td=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),nd=e=>"string"==typeof e&&"svg"===e.toLowerCase();function ad(e,t,n){const a=Ku(e,t,n);for(const s in e)(yc(e[s])||yc(t[s]))&&(a[-1!==kl.indexOf(s)?"attr"+s.charAt(0).toUpperCase()+s.substring(1):s]=e[s]);return a}class sd extends ku{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=ru}getBaseTargetFromProps(e,t){return e[t]}readValueFromInstance(e,t){if(xl.has(t)){const e=Ic(t);return e&&e.default||0}return t=td.has(t)?t:vc(t),e.getAttribute(t)}scrapeMotionValuesFromProps(e,t,n){return ad(e,t,n)}build(e,t,n){ed(e,t,this.isSVGTag,n.transformTemplate,n.style)}renderInstance(e,t,n,a){!function(e,t,n,a){qu(e,t,void 0,a);for(const s in t.attrs)e.setAttribute(td.has(s)?s:vc(s),t.attrs[s])}(e,t,0,a)}mount(e){this.isSVGTag=nd(e.tagName),super.mount(e)}}const id=pu.length;function rd(e){if(!e)return;if(!e.isControllingVariants){const t=e.parent&&rd(e.parent)||{};return void 0!==e.props.initial&&(t.initial=e.props.initial),t}const t={};for(let n=0;nPromise.all(t.map(({animation:t,options:n})=>Cc(e,t,n)))}(e),n=md(),a=!0;const s=t=>(n,a)=>{var s;const i=lc(e,a,"exit"===t?null==(s=e.presenceContext)?void 0:s.custom:void 0);if(i){const{transition:e,transitionEnd:t,...a}=i;n={...n,...a,...t}}return n};function i(i){const{props:r}=e,o=rd(e.parent)||{},l=[],c=new Set;let u={},d=1/0;for(let t=0;td&&g,w=!1;const k=Array.isArray(p)?p:[p];let x=k.reduce(s(h),{});!1===f&&(x={});const{prevResolvedValues:S={}}=m,j={...S,...x},C=t=>{v=!0,c.has(t)&&(w=!0,c.delete(t)),m.needsAnimating[t]=!0;const n=e.getValue(t);n&&(n.liveStyle=!1)};for(const e in j){const t=x[e],n=S[e];if(u.hasOwnProperty(e))continue;let a=!1;a=mc(t)&&mc(n)?!od(t,n):t!==n,a?null!=t?C(e):c.add(e):void 0!==t&&c.has(e)?C(e):m.protectedKeys[e]=!0}m.prevProp=p,m.prevResolvedValues=x,m.isActive&&(u={...u,...x}),a&&e.blockInitialAnimation&&(v=!1);const T=y&&b;v&&(!T||w)&&l.push(...k.map(t=>{const n={type:h};if("string"==typeof t&&a&&!T&&e.manuallyAnimateOnMount&&e.parent){const{parent:a}=e,s=lc(a,t);if(a.enteringChildren&&s){const{delayChildren:t}=s.transition||{};n.delay=Jl(a.enteringChildren,e,t)}}return{animation:t,options:n}}))}if(c.size){const t={};if("boolean"!=typeof r.initial){const n=lc(e,Array.isArray(r.initial)?r.initial[0]:r.initial);n&&n.transition&&(t.transition=n.transition)}c.forEach(n=>{const a=e.getBaseTarget(n),s=e.getValue(n);s&&(s.liveStyle=!0),t[n]=a??null}),l.push({animation:t})}let h=Boolean(l.length);return!a||!1!==r.initial&&r.initial!==r.animate||e.manuallyAnimateOnMount||(h=!1),a=!1,h?t(l):Promise.resolve()}return{animateChanges:i,setActive:function(t,a){var s;if(n[t].isActive===a)return Promise.resolve();null==(s=e.variantChildren)||s.forEach(e=>{var n;return null==(n=e.animationState)?void 0:n.setActive(t,a)}),n[t].isActive=a;const r=i(t);for(const e in n)n[e].protectedKeys={};return r},setAnimateFunction:function(n){t=n(e)},getState:()=>n,reset:()=>{n=md()}}}function dd(e,t){return"string"==typeof t?t!==e:!!Array.isArray(t)&&!od(t,e)}function hd(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function md(){return{animate:hd(!0),whileInView:hd(),whileHover:hd(),whileTap:hd(),whileDrag:hd(),whileFocus:hd(),exit:hd()}}function pd(e,t){e.min=t.min,e.max=t.max}function gd(e,t){pd(e.x,t.x),pd(e.y,t.y)}function fd(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}function yd(e){return e.max-e.min}function bd(e,t,n,a=.5){e.origin=a,e.originPoint=Co(t.min,t.max,e.origin),e.scale=yd(n)/yd(t),e.translate=Co(n.min,n.max,e.origin)-e.originPoint,(e.scale>=.9999&&e.scale<=1.0001||isNaN(e.scale))&&(e.scale=1),(e.translate>=-.01&&e.translate<=.01||isNaN(e.translate))&&(e.translate=0)}function vd(e,t,n,a){bd(e.x,t.x,n.x,a?a.originX:void 0),bd(e.y,t.y,n.y,a?a.originY:void 0)}function wd(e,t,n){e.min=n.min+t.min,e.max=e.min+yd(t)}function kd(e,t,n){e.min=t.min-n.min,e.max=e.min+yd(t)}function xd(e,t,n){kd(e.x,t.x,n.x),kd(e.y,t.y,n.y)}function Sd(e,t,n,a,s){return e=Eu(e-=t,1/n,a),void 0!==s&&(e=Eu(e,1/s,a)),e}function jd(e,t,[n,a,s],i,r){!function(e,t=0,n=1,a=.5,s,i=e,r=e){if(ro.test(t)&&(t=parseFloat(t),t=Co(r.min,r.max,t/100)-r.min),"number"!=typeof t)return;let o=Co(i.min,i.max,a);e===i&&(o-=t),e.min=Sd(e.min,t,n,o,s),e.max=Sd(e.max,t,n,o,s)}(e,t[n],t[a],t[s],t.scale,i,r)}const Cd=["x","scaleX","originX"],Td=["y","scaleY","originY"];function Md(e,t,n,a){jd(e.x,t,Cd,n?n.x:void 0,a?a.x:void 0),jd(e.y,t,Td,n?n.y:void 0,a?a.y:void 0)}function Pd(e){return 0===e.translate&&1===e.scale}function Ed(e){return Pd(e.x)&&Pd(e.y)}function Ad(e,t){return e.min===t.min&&e.max===t.max}function Ld(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function Dd(e,t){return Ld(e.x,t.x)&&Ld(e.y,t.y)}function zd(e){return yd(e.x)/yd(e.y)}function Nd(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}function Fd(e){return[e("x"),e("y")]}const Rd=["TopLeft","TopRight","BottomLeft","BottomRight"],Id=Rd.length,_d=e=>"string"==typeof e?parseFloat(e):e,Bd=e=>"number"==typeof e||oo.test(e);function Vd(e,t){return void 0!==e[t]?e[t]:e.borderRadius}const Od=$d(0,.5,Sr),qd=$d(.5,.95,rr);function $d(e,t,n){return a=>at?1:n(cr(e,t,a))}function Ud(e,t,n){const a=yc(e)?e:hc(e);return a.start(ic("",a,t,n)),a.animation}function Wd(e,t,n,a={passive:!0}){return e.addEventListener(t,n,a),()=>e.removeEventListener(t,n)}const Hd=(e,t)=>e.depth-t.depth;class Yd{constructor(){this.children=[],this.isDirty=!1}add(e){Zi(this.children,e),this.isDirty=!0}remove(e){Qi(this.children,e),this.isDirty=!0}forEach(e){this.isDirty&&this.children.sort(Hd),this.isDirty=!1,this.children.forEach(e)}}function Gd(e,t){const n=Vr.now(),a=({timestamp:s})=>{const i=s-n;i>=t&&(Fr(a),e(i-t))};return Nr.setup(a,!0),()=>Fr(a)}function Kd(e){return yc(e)?e.get():e}class Xd{constructor(){this.members=[]}add(e){Zi(this.members,e),e.scheduleRender()}remove(e){if(Qi(this.members,e),e===this.prevLead&&(this.prevLead=void 0),e===this.lead){const e=this.members[this.members.length-1];e&&this.promote(e)}}relegate(e){const t=this.members.findIndex(t=>e===t);if(0===t)return!1;let n;for(let a=t;a>=0;a--){const e=this.members[a];if(!1!==e.isPresent){n=e;break}}return!!n&&(this.promote(n),!0)}promote(e,t){const n=this.lead;if(e!==n&&(this.prevLead=n,this.lead=e,e.show(),n)){n.instance&&n.scheduleRender(),e.scheduleRender();const a=n.options.layoutDependency,s=e.options.layoutDependency;void 0!==a&&void 0!==s&&a===s||(e.resumeFrom=n,t&&(e.resumeFrom.preserveOpacity=!0),n.snapshot&&(e.snapshot=n.snapshot,e.snapshot.latestValues=n.animationValues||n.latestValues),e.root&&e.root.isUpdating&&(e.isLayoutDirty=!0));const{crossfade:i}=e.options;!1===i&&n.hide()}}exitAnimationComplete(){this.members.forEach(e=>{const{options:t,resumingFrom:n}=e;t.onExitComplete&&t.onExitComplete(),n&&n.options.onExitComplete&&n.options.onExitComplete()})}scheduleRender(){this.members.forEach(e=>{e.instance&&e.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}const Jd={hasAnimatedSinceResize:!0,hasEverUpdated:!1},Zd=["","X","Y","Z"];let Qd=0;function eh(e,t,n,a){const{latestValues:s}=t;s[e]&&(n[e]=s[e],t.setStaticValue(e,0),a&&(a[e]=0))}function th(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;const{visualElement:t}=e.options;if(!t)return;const n=kc(t);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:t,layoutId:a}=e.options;window.MotionCancelOptimisedAnimation(n,"transform",Nr,!(t||a))}const{parent:a}=e;a&&!a.hasCheckedOptimisedAppear&&th(a)}function nh({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:a,resetTransform:s}){return class{constructor(e={},n=(null==t?void 0:t())){this.id=Qd++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(ih),this.nodes.forEach(hh),this.nodes.forEach(mh),this.nodes.forEach(rh)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=e,this.root=n?n.root||n:this,this.path=n?[...n.path,n]:[],this.parent=n,this.depth=n?n.depth+1:0;for(let t=0;tthis.root.updateBlockedByResize=!1;Nr.read(()=>{a=window.innerWidth}),e(t,()=>{const e=window.innerWidth;e!==a&&(a=e,this.root.updateBlockedByResize=!0,n&&n(),n=Gd(s,250),Jd.hasAnimatedSinceResize&&(Jd.hasAnimatedSinceResize=!1,this.nodes.forEach(dh)))})}n&&this.root.registerSharedNode(n,this),!1!==this.options.animate&&s&&(n||a)&&this.addEventListener("didUpdate",({delta:e,hasLayoutChanged:t,hasRelativeLayoutChanged:n,layout:a})=>{if(this.isTreeAnimationBlocked())return this.target=void 0,void(this.relativeTarget=void 0);const i=this.options.transition||s.getDefaultTransition()||vh,{onLayoutAnimationStart:r,onLayoutAnimationComplete:o}=s.getProps(),l=!this.targetLayout||!Dd(this.targetLayout,a),c=!t&&n;if(this.options.layoutRoot||this.resumeFrom||c||t&&(l||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const t={...sc(i,"layout"),onPlay:r,onComplete:o};(s.shouldReduceMotion||this.options.layoutRoot)&&(t.delay=0,t.type=!1),this.startAnimation(t),this.setAnimationOrigin(e,c)}else t||dh(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=a})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const e=this.getStack();e&&e.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),Fr(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(ph),this.animationId++)}getTransformTemplate(){const{visualElement:e}=this.options;return e&&e.getProps().transformTemplate}willUpdate(e=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked())return void(this.options.onExitComplete&&this.options.onExitComplete());if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&th(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let s=0;s{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){!this.snapshot&&this.instance&&(this.snapshot=this.measure(),!this.snapshot||yd(this.snapshot.measuredBox.x)||yd(this.snapshot.measuredBox.y)||(this.snapshot=void 0))}updateLayout(){if(!this.instance)return;if(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead()||this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let n=0;nzu&&(t.x=1),t.yzu&&(t.y=1)}(this.layoutCorrected,this.treeScale,this.path,n),!t.layout||t.target||1===this.treeScale.x&&1===this.treeScale.y||(t.target=t.layout.layoutBox,t.targetWithTransforms={x:{min:0,max:0},y:{min:0,max:0}});const{target:l}=t;l?(this.projectionDelta&&this.prevProjectionDelta?(fd(this.prevProjectionDelta.x,this.projectionDelta.x),fd(this.prevProjectionDelta.y,this.projectionDelta.y)):this.createProjectionDeltas(),vd(this.projectionDelta,this.layoutCorrected,l,this.latestValues),this.treeScale.x===r&&this.treeScale.y===o&&Nd(this.projectionDelta.x,this.prevProjectionDelta.x)&&Nd(this.projectionDelta.y,this.prevProjectionDelta.y)||(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",l))):this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender())}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(e=!0){var t;if(null==(t=this.options.visualElement)||t.scheduleRender(),e){const e=this.getStack();e&&e.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}},this.projectionDelta={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}},this.projectionDeltaWithTransform={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}}}setAnimationOrigin(e,t=!1){const n=this.snapshot,a=n?n.latestValues:{},s={...this.latestValues},i={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};this.relativeParent&&this.relativeParent.options.layoutRoot||(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!t;const r={x:{min:0,max:0},y:{min:0,max:0}},o=(n?n.source:void 0)!==(this.layout?this.layout.source:void 0),l=this.getStack(),c=!l||l.members.length<=1,u=Boolean(o&&!c&&!0===this.options.crossfade&&!this.path.some(bh));let d;this.animationProgress=0,this.mixTargetDelta=t=>{const n=t/1e3;var l,h,m,p,g,f;fh(i.x,e.x,n),fh(i.y,e.y,n),this.setTargetDelta(i),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(xd(r,this.layout.layoutBox,this.relativeParent.layout.layoutBox),m=this.relativeTarget,p=this.relativeTargetOrigin,g=r,f=n,yh(m.x,p.x,g.x,f),yh(m.y,p.y,g.y,f),d&&(l=this.relativeTarget,h=d,Ad(l.x,h.x)&&Ad(l.y,h.y))&&(this.isProjectionDirty=!1),d||(d={x:{min:0,max:0},y:{min:0,max:0}}),gd(d,this.relativeTarget)),o&&(this.animationValues=s,function(e,t,n,a,s,i){s?(e.opacity=Co(0,n.opacity??1,Od(a)),e.opacityExit=Co(t.opacity??1,0,qd(a))):i&&(e.opacity=Co(t.opacity??1,n.opacity??1,a));for(let r=0;r{Jd.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=hc(0)),this.currentAnimation=Ud(this.motionValue,[0,1e3],{...e,velocity:0,isSync:!0,onUpdate:t=>{this.mixTargetDelta(t),e.onUpdate&&e.onUpdate(t)},onStop:()=>{},onComplete:()=>{e.onComplete&&e.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const e=this.getStack();e&&e.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(1e3),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const e=this.getLead();let{targetWithTransforms:t,target:n,layout:a,latestValues:s}=e;if(t&&n&&a){if(this!==e&&this.layout&&a&&Sh(this.options.animationType,this.layout.layoutBox,a.layoutBox)){n=this.target||{x:{min:0,max:0},y:{min:0,max:0}};const t=yd(this.layout.layoutBox.x);n.x.min=e.target.x.min,n.x.max=n.x.min+t;const a=yd(this.layout.layoutBox.y);n.y.min=e.target.y.min,n.y.max=n.y.min+a}gd(t,n),Iu(t,s),vd(this.projectionDeltaWithTransform,this.layoutCorrected,t,s)}}registerSharedNode(e,t){this.sharedNodes.has(e)||this.sharedNodes.set(e,new Xd),this.sharedNodes.get(e).add(t);const n=t.options.initialPromotionConfig;t.promote({transition:n?n.transition:void 0,preserveFollowOpacity:n&&n.shouldPreserveFollowOpacity?n.shouldPreserveFollowOpacity(t):void 0})}isLead(){const e=this.getStack();return!e||e.lead===this}getLead(){var e;const{layoutId:t}=this.options;return t&&(null==(e=this.getStack())?void 0:e.lead)||this}getPrevLead(){var e;const{layoutId:t}=this.options;return t?null==(e=this.getStack())?void 0:e.prevLead:void 0}getStack(){const{layoutId:e}=this.options;if(e)return this.root.sharedNodes.get(e)}promote({needsReset:e,transition:t,preserveFollowOpacity:n}={}){const a=this.getStack();a&&a.promote(this,n),e&&(this.projectionDelta=void 0,this.needsReset=!0),t&&this.setOptions({transition:t})}relegate(){const e=this.getStack();return!!e&&e.relegate(this)}resetSkewAndRotation(){const{visualElement:e}=this.options;if(!e)return;let t=!1;const{latestValues:n}=e;if((n.z||n.rotate||n.rotateX||n.rotateY||n.rotateZ||n.skewX||n.skewY)&&(t=!0),!t)return;const a={};n.z&&eh("z",e,a,this.animationValues);for(let s=0;s{var t;return null==(t=e.currentAnimation)?void 0:t.stop()}),this.root.nodes.forEach(lh),this.root.sharedNodes.clear()}}}function ah(e){e.updateLayout()}function sh(e){var t;const n=(null==(t=e.resumeFrom)?void 0:t.snapshot)||e.snapshot;if(e.isLead()&&e.layout&&n&&e.hasListeners("didUpdate")){const{layoutBox:t,measuredBox:a}=e.layout,{animationType:s}=e.options,i=n.source!==e.layout.source;"size"===s?Fd(e=>{const a=i?n.measuredBox[e]:n.layoutBox[e],s=yd(a);a.min=t[e].min,a.max=a.min+s}):Sh(s,n.layoutBox,t)&&Fd(a=>{const s=i?n.measuredBox[a]:n.layoutBox[a],r=yd(t[a]);s.max=s.min+r,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[a].max=e.relativeTarget[a].min+r)});const r={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};vd(r,t,n.layoutBox);const o={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};i?vd(o,e.applyTransform(a,!0),n.measuredBox):vd(o,t,n.layoutBox);const l=!Ed(r);let c=!1;if(!e.resumeFrom){const a=e.getClosestProjectingParent();if(a&&!a.resumeFrom){const{snapshot:s,layout:i}=a;if(s&&i){const r={x:{min:0,max:0},y:{min:0,max:0}};xd(r,n.layoutBox,s.layoutBox);const o={x:{min:0,max:0},y:{min:0,max:0}};xd(o,t,i.layoutBox),Dd(r,o)||(c=!0),a.options.layoutRoot&&(e.relativeTarget=o,e.relativeTargetOrigin=r,e.relativeParent=a)}}}e.notifyListeners("didUpdate",{layout:t,snapshot:n,delta:o,layoutDelta:r,hasLayoutChanged:l,hasRelativeLayoutChanged:c})}else if(e.isLead()){const{onExitComplete:t}=e.options;t&&t()}e.options.transition=void 0}function ih(e){e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=Boolean(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function rh(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function oh(e){e.clearSnapshot()}function lh(e){e.clearMeasurements()}function ch(e){e.isLayoutDirty=!1}function uh(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function dh(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function hh(e){e.resolveTargetDelta()}function mh(e){e.calcProjection()}function ph(e){e.resetSkewAndRotation()}function gh(e){e.removeLeadSnapshot()}function fh(e,t,n){e.translate=Co(t.translate,0,n),e.scale=Co(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function yh(e,t,n,a){e.min=Co(t.min,n.min,a),e.max=Co(t.max,n.max,a)}function bh(e){return e.animationValues&&void 0!==e.animationValues.opacityExit}const vh={duration:.45,ease:[.4,0,.1,1]},wh=e=>"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),kh=wh("applewebkit/")&&!wh("chrome/")?Math.round:rr;function xh(e){e.min=kh(e.min),e.max=kh(e.max)}function Sh(e,t,n){return"position"===e||"preserve-aspect"===e&&(a=zd(t),s=zd(n),!(Math.abs(a-s)<=.2));var a,s}function jh(e){var t;return e!==e.root&&(null==(t=e.scroll)?void 0:t.wasRoot)}const Ch=nh({attachResizeListener:(e,t)=>Wd(e,"resize",t),measureScroll:()=>{var e,t;return{x:document.documentElement.scrollLeft||(null==(e=document.body)?void 0:e.scrollLeft)||0,y:document.documentElement.scrollTop||(null==(t=document.body)?void 0:t.scrollTop)||0}},checkIsScrollRoot:()=>!0}),Th=e=>!e.isLayoutDirty&&e.willUpdate(!1);function Mh(){const e=new Set,t=new WeakMap,n=()=>e.forEach(Th);return{add:a=>{e.add(a),t.set(a,a.addEventListener("willUpdate",n))},remove:a=>{e.delete(a);const s=t.get(a);s&&(s(),t.delete(a)),n()},dirty:n}}const Ph={current:void 0},Eh=nh({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!Ph.current){const e=new Ch({});e.mount(window),e.setOptions({layoutScroll:!0}),Ph.current=e}return Ph.current},resetTransform:(e,t)=>{e.style.transform=void 0!==t?t:"none"},checkIsScrollRoot:e=>Boolean("fixed"===window.getComputedStyle(e).position)}),Ah=n.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"});function Lh(e,t){if("function"==typeof e)return e(t);null!=e&&(e.current=t)}class Dh extends n.Component{getSnapshotBeforeUpdate(e){const t=this.props.childRef.current;if(t&&e.isPresent&&!this.props.isPresent){const e=t.offsetParent,n=$c(e)&&e.offsetWidth||0,a=$c(e)&&e.offsetHeight||0,s=this.props.sizeRef.current;s.height=t.offsetHeight||0,s.width=t.offsetWidth||0,s.top=t.offsetTop,s.left=t.offsetLeft,s.right=n-s.width-s.left,s.bottom=a-s.height-s.top}return null}componentDidUpdate(){}render(){return this.props.children}}function zh({children:e,isPresent:t,anchorX:s,anchorY:i,root:r}){var o;const l=n.useId(),c=n.useRef(null),u=n.useRef({width:0,height:0,top:0,left:0,right:0,bottom:0}),{nonce:d}=n.useContext(Ah),h=(null==(o=e.props)?void 0:o.ref)??(null==e?void 0:e.ref),m=function(...e){return n.useCallback(function(...e){return t=>{let n=!1;const a=e.map(e=>{const a=Lh(e,t);return n||"function"!=typeof a||(n=!0),a});if(n)return()=>{for(let t=0;t{const{width:e,height:n,top:a,left:o,right:h,bottom:m}=u.current;if(t||!c.current||!e||!n)return;const p="left"===s?`left: ${o}`:`right: ${h}`,g="bottom"===i?`bottom: ${m}`:`top: ${a}`;c.current.dataset.motionPopId=l;const f=document.createElement("style");d&&(f.nonce=d);const y=r??document.head;return y.appendChild(f),f.sheet&&f.sheet.insertRule(`\n [data-motion-pop-id="${l}"] {\n position: absolute !important;\n width: ${e}px !important;\n height: ${n}px !important;\n ${p}px !important;\n ${g}px !important;\n }\n `),()=>{y.contains(f)&&y.removeChild(f)}},[t]),a.jsx(Dh,{isPresent:t,childRef:c,sizeRef:u,children:n.cloneElement(e,{ref:m})})}const Nh=({children:e,initial:t,isPresent:s,onExitComplete:i,custom:r,presenceAffectsLayout:o,mode:l,anchorX:c,anchorY:u,root:d})=>{const h=Gi(Fh),m=n.useId();let p=!0,g=n.useMemo(()=>(p=!1,{id:m,initial:t,isPresent:s,custom:r,onExitComplete:e=>{h.set(e,!0);for(const t of h.values())if(!t)return;i&&i()},register:e=>(h.set(e,!1),()=>h.delete(e))}),[s,h,i]);return o&&p&&(g={...g}),n.useMemo(()=>{h.forEach((e,t)=>h.set(t,!1))},[s]),n.useEffect(()=>{!s&&!h.size&&i&&i()},[s]),"popLayout"===l&&(e=a.jsx(zh,{isPresent:s,anchorX:c,anchorY:u,root:d,children:e})),a.jsx(Ji.Provider,{value:g,children:e})};function Fh(){return new Map}function Rh(e=!0){const t=n.useContext(Ji);if(null===t)return[!0,null];const{isPresent:a,onExitComplete:s,register:i}=t,r=n.useId();n.useEffect(()=>{if(e)return i(r)},[e]);const o=n.useCallback(()=>e&&s&&s(r),[r,s,e]);return!a&&s?[!1,o]:[!0]}function Ih(){return null===(e=n.useContext(Ji))||e.isPresent;var e}const _h=e=>e.key||"";function Bh(e){const t=[];return n.Children.forEach(e,e=>{n.isValidElement(e)&&t.push(e)}),t}const Vh=({children:e,custom:t,initial:s=!0,onExitComplete:i,presenceAffectsLayout:r=!0,mode:o="sync",propagate:l=!1,anchorX:c="left",anchorY:u="top",root:d})=>{const[h,m]=Rh(l),p=n.useMemo(()=>Bh(e),[e]),g=l&&!h?[]:p.map(_h),f=n.useRef(!0),y=n.useRef(p),b=Gi(()=>new Map),v=n.useRef(new Set),[w,k]=n.useState(p),[x,S]=n.useState(p);Xi(()=>{f.current=!1,y.current=p;for(let e=0;e{const n=_h(e),w=!(l&&!h)&&(p===x||g.includes(n));return a.jsx(Nh,{isPresent:w,initial:!(f.current&&!s)&&void 0,custom:t,presenceAffectsLayout:r,mode:o,root:d,onExitComplete:w?void 0:()=>{if(v.current.has(n))return;if(v.current.add(n),!b.has(n))return;b.set(n,!0);let e=!0;b.forEach(t=>{t||(e=!1)}),e&&(null==C||C(),S(y.current),l&&(null==m||m()),i&&i())},anchorX:c,anchorY:u,children:e},n)})})},Oh=n.createContext(null);const qh=e=>!0===e,$h=({children:e,id:t,inherit:s=!0})=>{const i=n.useContext(Yi),r=n.useContext(Oh),[o,l]=function(){const e=function(){const e=n.useRef(!1);return Xi(()=>(e.current=!0,()=>{e.current=!1}),[]),e}(),[t,a]=n.useState(0),s=n.useCallback(()=>{e.current&&a(t+1)},[t]);return[n.useCallback(()=>Nr.postRender(s),[s]),t]}(),c=n.useRef(null),u=i.id||r;null===c.current&&((e=>qh(!0===e)||"id"===e)(s)&&u&&(t=t?u+"-"+t:u),c.current={id:t,group:qh(s)&&i.group||Mh()});const d=n.useMemo(()=>({...c.current,forceRender:o}),[l]);return a.jsx(Yi.Provider,{value:d,children:e})},Uh=n.createContext({strict:!1}),Wh={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let Hh=!1;function Yh(){return function(){if(Hh)return;const e={};for(const t in Wh)e[t]={isEnabled:e=>Wh[t].some(t=>!!e[t])};vu(e),Hh=!0}(),bu}const Gh=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function Kh(e){return e.startsWith("while")||e.startsWith("drag")&&"draggable"!==e||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||e.startsWith("onLayout")||Gh.has(e)}let Xh=e=>!Kh(e);function Jh(e){"function"==typeof e&&(Xh=t=>t.startsWith("on")?!Kh(t):e(t))}try{Jh(require("@emotion/is-prop-valid").default)}catch{}const Zh=n.createContext({});function Qh(e){return Array.isArray(e)?e.join(" "):e}function em(e,t,n){for(const a in t)yc(t[a])||Gu(a,n)||(e[a]=t[a])}function tm(e,t){const a={},s=function(e,t){const a={};return em(a,e.style||{},e),Object.assign(a,function({transformTemplate:e},t){return n.useMemo(()=>{const n={style:{},transform:{},transformOrigin:{},vars:{}};return Ou(n,t,e),Object.assign({},n.vars,n.style)},[t])}(e,t)),a}(e,t);return e.drag&&!1!==e.dragListener&&(a.draggable=!1,s.userSelect=s.WebkitUserSelect=s.WebkitTouchCallout="none",s.touchAction=!0===e.drag?"none":"pan-"+("x"===e.drag?"y":"x")),void 0===e.tabIndex&&(e.onTap||e.onTapStart||e.whileTap)&&(a.tabIndex=0),a.style=s,a}function nm(e,t,a,s){const i=n.useMemo(()=>{const n={style:{},transform:{},transformOrigin:{},vars:{},attrs:{}};return ed(n,t,nd(s),e.transformTemplate,e.style),{...n.attrs,style:{...n.style}}},[t]);if(e.style){const t={};em(t,e.style,e),i.style={...t,...i.style}}return i}const am=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function sm(e){return"string"==typeof e&&!e.includes("-")&&!!(am.indexOf(e)>-1||/[A-Z]/u.test(e))}function im(e,t,a,{latestValues:s},i,r=!1,o){const l=(o??sm(e)?nm:tm)(t,s,i,e),c=function(e,t,n){const a={};for(const s in e)"values"===s&&"object"==typeof e.values||(Xh(s)||!0===n&&Kh(s)||!t&&!Kh(s)||e.draggable&&s.startsWith("onDrag"))&&(a[s]=e[s]);return a}(t,"string"==typeof e,r),u=e!==n.Fragment?{...c,...l,ref:a}:{},{children:d}=t,h=n.useMemo(()=>yc(d)?d.get():d,[d]);return n.createElement(e,{...u,children:h})}function rm(e,t,n,a){const s={},i=a(e,{});for(const h in i)s[h]=Kd(i[h]);let{initial:r,animate:o}=e;const l=gu(e),c=fu(e);t&&c&&!l&&!1!==e.inherit&&(void 0===r&&(r=t.initial),void 0===o&&(o=t.animate));let u=!!n&&!1===n.initial;u=u||!1===r;const d=u?o:r;if(d&&"boolean"!=typeof d&&!du(d)){const t=Array.isArray(d)?d:[d];for(let n=0;n(t,a)=>{const s=n.useContext(Zh),i=n.useContext(Ji),r=()=>function({scrapeMotionValuesFromProps:e,createRenderState:t},n,a,s){return{latestValues:rm(n,a,s,e),renderState:t()}}(e,t,s,i);return a?r():Gi(r)},lm=om({scrapeMotionValuesFromProps:Ku,createRenderState:()=>({style:{},transform:{},transformOrigin:{},vars:{}})}),cm=om({scrapeMotionValuesFromProps:ad,createRenderState:()=>({style:{},transform:{},transformOrigin:{},vars:{},attrs:{}})}),um=Symbol.for("motionComponentSymbol");function dm(e,t,a){const s=n.useRef(a);n.useInsertionEffect(()=>{s.current=a});const i=n.useRef(null);return n.useCallback(n=>{var a;n&&(null==(a=e.onMount)||a.call(e,n)),t&&(n?t.mount(n):t.unmount());const r=s.current;if("function"==typeof r)if(n){const e=r(n);"function"==typeof e&&(i.current=e)}else i.current?(i.current(),i.current=null):r(n);else r&&(r.current=n)},[t])}const hm=n.createContext({});function mm(e){return e&&"object"==typeof e&&Object.prototype.hasOwnProperty.call(e,"current")}function pm(e,t,a,s,i,r){var o,l;const{visualElement:c}=n.useContext(Zh),u=n.useContext(Uh),d=n.useContext(Ji),h=n.useContext(Ah).reducedMotion,m=n.useRef(null),p=n.useRef(!1);s=s||u.renderer,!m.current&&s&&(m.current=s(e,{visualState:t,parent:c,props:a,presenceContext:d,blockInitialAnimation:!!d&&!1===d.initial,reducedMotionConfig:h,isSVG:r}),p.current&&m.current&&(m.current.manuallyAnimateOnMount=!0));const g=m.current,f=n.useContext(hm);!g||g.projection||!i||"html"!==g.type&&"svg"!==g.type||function(e,t,n,a){const{layoutId:s,layout:i,drag:r,dragConstraints:o,layoutScroll:l,layoutRoot:c,layoutCrossfade:u}=t;e.projection=new n(e.latestValues,t["data-framer-portal-id"]?void 0:gm(e.parent)),e.projection.setOptions({layoutId:s,layout:i,alwaysMeasureLayout:Boolean(r)||o&&mm(o),visualElement:e,animationType:"string"==typeof i?i:"both",initialPromotionConfig:a,crossfade:u,layoutScroll:l,layoutRoot:c})}(m.current,a,i,f);const y=n.useRef(!1);n.useInsertionEffect(()=>{g&&y.current&&g.update(a,d)});const b=a[wc],v=n.useRef(Boolean(b)&&!(null==(o=window.MotionHandoffIsComplete)?void 0:o.call(window,b))&&(null==(l=window.MotionHasOptimisedAnimation)?void 0:l.call(window,b)));return Xi(()=>{p.current=!0,g&&(y.current=!0,window.MotionIsMounted=!0,g.updateFeatures(),g.scheduleRenderMicrotask(),v.current&&g.animationState&&g.animationState.animateChanges())}),n.useEffect(()=>{g&&(!v.current&&g.animationState&&g.animationState.animateChanges(),v.current&&(queueMicrotask(()=>{var e;null==(e=window.MotionHandoffMarkAsComplete)||e.call(window,b)}),v.current=!1),g.enteringChildren=void 0)}),g}function gm(e){if(e)return!1!==e.options.allowProjection?e.projection:gm(e.parent)}function fm(e,{forwardMotionProps:t=!1,type:s}={},i,r){i&&function(e){const t=Yh();for(const n in e)t[n]={...t[n],...e[n]};vu(t)}(i);const o=s?"svg"===s:sm(e),l=o?cm:lm;function c(s,i){let c;const u={...n.useContext(Ah),...s,layoutId:ym(s)},{isStatic:d}=u,h=function(e){const{initial:t,animate:a}=function(e,t){if(gu(e)){const{initial:t,animate:n}=e;return{initial:!1===t||hu(t)?t:void 0,animate:hu(n)?n:void 0}}return!1!==e.inherit?t:{}}(e,n.useContext(Zh));return n.useMemo(()=>({initial:t,animate:a}),[Qh(t),Qh(a)])}(s),m=l(s,d);if(!d&&Ki){n.useContext(Uh).strict;const t=function(e){const t=Yh(),{drag:n,layout:a}=t;if(!n&&!a)return{};const s={...n,...a};return{MeasureLayout:(null==n?void 0:n.isEnabled(e))||(null==a?void 0:a.isEnabled(e))?s.MeasureLayout:void 0,ProjectionNode:s.ProjectionNode}}(u);c=t.MeasureLayout,h.visualElement=pm(e,m,u,r,t.ProjectionNode,o)}return a.jsxs(Zh.Provider,{value:h,children:[c&&h.visualElement?a.jsx(c,{visualElement:h.visualElement,...u}):null,im(e,s,dm(m,h.visualElement,i),m,d,t,o)]})}c.displayName=`motion.${"string"==typeof e?e:`create(${e.displayName??e.name??""})`}`;const u=n.forwardRef(c);return u[um]=e,u}function ym({layoutId:e}){const t=n.useContext(Yi).id;return t&&void 0!==e?t+"-"+e:e}function bm(e,t){if("undefined"==typeof Proxy)return fm;const n=new Map,a=(n,a)=>fm(n,a,e,t);return new Proxy((e,t)=>a(e,t),{get:(s,i)=>"create"===i?a:(n.has(i)||n.set(i,fm(i,void 0,e,t)),n.get(i))})}const vm=(e,t)=>t.isSVG??sm(e)?new sd(t):new Xu(t,{allowProjection:e!==n.Fragment});let wm=0;const km={animation:{Feature:class extends xu{constructor(e){super(e),e.animationState||(e.animationState=ud(e))}updateAnimationControlsSubscription(){const{animate:e}=this.node.getProps();du(e)&&(this.unmountControls=e.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:e}=this.node.getProps(),{animate:t}=this.node.prevProps||{};e!==t&&this.updateAnimationControlsSubscription()}unmount(){var e;this.node.animationState.reset(),null==(e=this.unmountControls)||e.call(this)}}},exit:{Feature:class extends xu{constructor(){super(...arguments),this.id=wm++}update(){if(!this.node.presenceContext)return;const{isPresent:e,onExitComplete:t}=this.node.presenceContext,{isPresent:n}=this.node.prevPresenceContext||{};if(!this.node.animationState||e===n)return;const a=this.node.animationState.setActive("exit",!e);t&&!e&&a.then(()=>{t(this.id)})}mount(){const{register:e,onExitComplete:t}=this.node.presenceContext||{};t&&t(this.id),e&&(this.unmount=e(this.id))}unmount(){}}}};function xm(e){return{point:{x:e.pageX,y:e.pageY}}}function Sm(e,t,n,a){return Wd(e,t,(e=>t=>Xc(t)&&e(t,xm(t)))(n),a)}const jm=({current:e})=>e?e.ownerDocument.defaultView:null,Cm=(e,t)=>Math.abs(e-t),Tm=new Set(["auto","scroll"]);class Mm{constructor(e,t,{transformPagePoint:n,contextWindow:a=window,dragSnapToOrigin:s=!1,distanceThreshold:i=3,element:r}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=e=>{this.handleScroll(e.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!this.lastMoveEvent||!this.lastMoveEventInfo)return;const e=Am(this.lastMoveEventInfo,this.history),t=null!==this.startEvent,n=function(e,t){const n=Cm(e.x,t.x),a=Cm(e.y,t.y);return Math.sqrt(n**2+a**2)}(e.offset,{x:0,y:0})>=this.distanceThreshold;if(!t&&!n)return;const{point:a}=e,{timestamp:s}=Rr;this.history.push({...a,timestamp:s});const{onStart:i,onMove:r}=this.handlers;t||(i&&i(this.lastMoveEvent,e),this.startEvent=this.lastMoveEvent),r&&r(this.lastMoveEvent,e)},this.handlePointerMove=(e,t)=>{this.lastMoveEvent=e,this.lastMoveEventInfo=Pm(t,this.transformPagePoint),Nr.update(this.updatePoint,!0)},this.handlePointerUp=(e,t)=>{this.end();const{onEnd:n,onSessionEnd:a,resumeAnimation:s}=this.handlers;if(!this.dragSnapToOrigin&&this.startEvent||s&&s(),!this.lastMoveEvent||!this.lastMoveEventInfo)return;const i=Am("pointercancel"===e.type?this.lastMoveEventInfo:Pm(t,this.transformPagePoint),this.history);this.startEvent&&n&&n(e,i),a&&a(e,i)},!Xc(e))return;this.dragSnapToOrigin=s,this.handlers=t,this.transformPagePoint=n,this.distanceThreshold=i,this.contextWindow=a||window;const o=Pm(xm(e),this.transformPagePoint),{point:l}=o,{timestamp:c}=Rr;this.history=[{...l,timestamp:c}];const{onSessionStart:u}=t;u&&u(e,Am(o,this.history)),this.removeListeners=lr(Sm(this.contextWindow,"pointermove",this.handlePointerMove),Sm(this.contextWindow,"pointerup",this.handlePointerUp),Sm(this.contextWindow,"pointercancel",this.handlePointerUp)),r&&this.startScrollTracking(r)}startScrollTracking(e){let t=e.parentElement;for(;t;){const e=getComputedStyle(t);(Tm.has(e.overflowX)||Tm.has(e.overflowY))&&this.scrollPositions.set(t,{x:t.scrollLeft,y:t.scrollTop}),t=t.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0,passive:!0}),window.addEventListener("scroll",this.onWindowScroll,{passive:!0}),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(e){const t=this.scrollPositions.get(e);if(!t)return;const n=e===window,a=n?{x:window.scrollX,y:window.scrollY}:{x:e.scrollLeft,y:e.scrollTop},s=a.x-t.x,i=a.y-t.y;0===s&&0===i||(n?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=s,this.lastMoveEventInfo.point.y+=i):this.history.length>0&&(this.history[0].x-=s,this.history[0].y-=i),this.scrollPositions.set(e,a),Nr.update(this.updatePoint,!0))}updateHandlers(e){this.handlers=e}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),Fr(this.updatePoint)}}function Pm(e,t){return t?{point:t(e.point)}:e}function Em(e,t){return{x:e.x-t.x,y:e.y-t.y}}function Am({point:e},t){return{point:e,delta:Em(e,Dm(t)),offset:Em(e,Lm(t)),velocity:zm(t,.1)}}function Lm(e){return e[0]}function Dm(e){return e[e.length-1]}function zm(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,a=null;const s=Dm(e);for(;n>=0&&(a=e[n],!(s.timestamp-a.timestamp>dr(t)));)n--;if(!a)return{x:0,y:0};const i=hr(s.timestamp-a.timestamp);if(0===i)return{x:0,y:0};const r={x:(s.x-a.x)/i,y:(s.y-a.y)/i};return r.x===1/0&&(r.x=0),r.y===1/0&&(r.y=0),r}function Nm(e,t,n){return{min:void 0!==t?e.min+t:void 0,max:void 0!==n?e.max+n-(e.max-e.min):void 0}}function Fm(e,t){let n=t.min-e.min,a=t.max-e.max;return t.max-t.min{t?(this.stopAnimation(),this.snapToCursor(xm(e).point)):this.pauseAnimation()},onStart:(e,t)=>{this.stopAnimation();const{drag:n,dragPropagation:a,onDragStart:s}=this.getProps();if(n&&!a&&(this.openDragLock&&this.openDragLock(),this.openDragLock="x"===(i=n)||"y"===i?Wc[i]?null:(Wc[i]=!0,()=>{Wc[i]=!1}):Wc.x||Wc.y?null:(Wc.x=Wc.y=!0,()=>{Wc.x=Wc.y=!1}),!this.openDragLock))return;var i;this.latestPointerEvent=e,this.latestPanInfo=t,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Fd(e=>{let t=this.getAxisMotionValue(e).get()||0;if(ro.test(t)){const{projection:n}=this.visualElement;if(n&&n.layout){const a=n.layout.layoutBox[e];a&&(t=yd(a)*(parseFloat(t)/100))}}this.originPoint[e]=t}),s&&Nr.postRender(()=>s(e,t)),bc(this.visualElement,"transform");const{animationState:r}=this.visualElement;r&&r.setActive("whileDrag",!0)},onMove:(e,t)=>{this.latestPointerEvent=e,this.latestPanInfo=t;const{dragPropagation:n,dragDirectionLock:a,onDirectionLock:s,onDrag:i}=this.getProps();if(!n&&!this.openDragLock)return;const{offset:r}=t;if(a&&null===this.currentDirection)return this.currentDirection=function(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}(r),void(null!==this.currentDirection&&s&&s(this.currentDirection));this.updateAxis("x",t.point,r),this.updateAxis("y",t.point,r),this.visualElement.render(),i&&i(e,t)},onSessionEnd:(e,t)=>{this.latestPointerEvent=e,this.latestPanInfo=t,this.stop(e,t),this.latestPointerEvent=null,this.latestPanInfo=null},resumeAnimation:()=>Fd(e=>{var t;return"paused"===this.getAnimationState(e)&&(null==(t=this.getAxisMotionValue(e).animation)?void 0:t.play())})},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:s,distanceThreshold:n,contextWindow:jm(this.visualElement),element:this.visualElement.current})}stop(e,t){const n=e||this.latestPointerEvent,a=t||this.latestPanInfo,s=this.isDragging;if(this.cancel(),!s||!a||!n)return;const{velocity:i}=a;this.startAnimation(i);const{onDragEnd:r}=this.getProps();r&&Nr.postRender(()=>r(n,a))}cancel(){this.isDragging=!1;const{projection:e,animationState:t}=this.visualElement;e&&(e.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:n}=this.getProps();!n&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),t&&t.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(e,t,n){const{drag:a}=this.getProps();if(!n||!Om(e,a,this.currentDirection))return;const s=this.getAxisMotionValue(e);let i=this.originPoint[e]+n[e];this.constraints&&this.constraints[e]&&(i=function(e,{min:t,max:n},a){return void 0!==t&&en&&(e=a?Co(n,e,a.max):Math.min(e,n)),e}(i,this.constraints[e],this.elastic[e])),s.set(i)}resolveConstraints(){var e;const{dragConstraints:t,dragElastic:n}=this.getProps(),a=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):null==(e=this.visualElement.projection)?void 0:e.layout,s=this.constraints;t&&mm(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):this.constraints=!(!t||!a)&&function(e,{top:t,left:n,bottom:a,right:s}){return{x:Nm(e.x,n,s),y:Nm(e.y,t,a)}}(a.layoutBox,t),this.elastic=function(e=Rm){return!1===e?e=0:!0===e&&(e=Rm),{x:Im(e,"left","right"),y:Im(e,"top","bottom")}}(n),s!==this.constraints&&a&&this.constraints&&!this.hasMutatedConstraints&&Fd(e=>{!1!==this.constraints&&this.getAxisMotionValue(e)&&(this.constraints[e]=function(e,t){const n={};return void 0!==t.min&&(n.min=t.min-e.min),void 0!==t.max&&(n.max=t.max-e.min),n}(a.layoutBox[e],this.constraints[e]))})}resolveRefConstraints(){const{dragConstraints:e,onMeasureDragConstraints:t}=this.getProps();if(!e||!mm(e))return!1;const n=e.current,{projection:a}=this.visualElement;if(!a||!a.layout)return!1;const s=function(e,t,n){const a=_u(e,n),{scroll:s}=t;return s&&(Fu(a.x,s.offset.x),Fu(a.y,s.offset.y)),a}(n,a.root,this.visualElement.getTransformPagePoint());let i=function(e,t){return{x:Fm(e.x,t.x),y:Fm(e.y,t.y)}}(a.layout.layoutBox,s);if(t){const e=t(function({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}(i));this.hasMutatedConstraints=!!e,e&&(i=Su(e))}return i}startAnimation(e){const{drag:t,dragMomentum:n,dragElastic:a,dragTransition:s,dragSnapToOrigin:i,onDragTransitionEnd:r}=this.getProps(),o=this.constraints||{},l=Fd(r=>{if(!Om(r,t,this.currentDirection))return;let l=o&&o[r]||{};i&&(l={min:0,max:0});const c=a?200:1e6,u=a?40:1e7,d={type:"inertia",velocity:n?e[r]:0,bounceStiffness:c,bounceDamping:u,timeConstant:750,restDelta:1,restSpeed:10,...s,...l};return this.startAxisValueAnimation(r,d)});return Promise.all(l).then(r)}startAxisValueAnimation(e,t){const n=this.getAxisMotionValue(e);return bc(this.visualElement,e),n.start(ic(e,n,0,t,this.visualElement,!1))}stopAnimation(){Fd(e=>this.getAxisMotionValue(e).stop())}pauseAnimation(){Fd(e=>{var t;return null==(t=this.getAxisMotionValue(e).animation)?void 0:t.pause()})}getAnimationState(e){var t;return null==(t=this.getAxisMotionValue(e).animation)?void 0:t.state}getAxisMotionValue(e){const t=`_drag${e.toUpperCase()}`,n=this.visualElement.getProps();return n[t]||this.visualElement.getValue(e,(n.initial?n.initial[e]:void 0)||0)}snapToCursor(e){Fd(t=>{const{drag:n}=this.getProps();if(!Om(t,n,this.currentDirection))return;const{projection:a}=this.visualElement,s=this.getAxisMotionValue(t);if(a&&a.layout){const{min:n,max:i}=a.layout.layoutBox[t],r=s.get()||0;s.set(e[t]-Co(n,i,.5)+r)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:e,dragConstraints:t}=this.getProps(),{projection:n}=this.visualElement;if(!mm(t)||!n||!this.constraints)return;this.stopAnimation();const a={x:0,y:0};Fd(e=>{const t=this.getAxisMotionValue(e);if(t&&!1!==this.constraints){const n=t.get();a[e]=function(e,t){let n=.5;const a=yd(e),s=yd(t);return s>a?n=cr(t.min,t.max-a,e.min):a>s&&(n=cr(e.min,e.max-s,t.min)),er(0,1,n)}({min:n,max:n},this.constraints[e])}});const{transformTemplate:s}=this.visualElement.getProps();this.visualElement.current.style.transform=s?s({},""):"none",n.root&&n.root.updateScroll(),n.updateLayout(),this.resolveConstraints(),Fd(t=>{if(!Om(t,e,null))return;const n=this.getAxisMotionValue(t),{min:s,max:i}=this.constraints[t];n.set(Co(s,i,a[t]))})}addListeners(){if(!this.visualElement.current)return;Bm.set(this.visualElement,this);const e=this.visualElement.current,t=Sm(e,"pointerdown",t=>{const{drag:n,dragListener:a=!0}=this.getProps(),s=t.target,i=s!==e&&Zc(s);n&&a&&!i&&this.start(t)}),n=()=>{const{dragConstraints:e}=this.getProps();mm(e)&&e.current&&(this.constraints=this.resolveRefConstraints())},{projection:a}=this.visualElement,s=a.addEventListener("measure",n);a&&!a.layout&&(a.root&&a.root.updateScroll(),a.updateLayout()),Nr.read(n);const i=Wd(window,"resize",()=>this.scalePositionWithinConstraints()),r=a.addEventListener("didUpdate",({delta:e,hasLayoutChanged:t})=>{this.isDragging&&t&&(Fd(t=>{const n=this.getAxisMotionValue(t);n&&(this.originPoint[t]+=e[t].translate,n.set(n.get()+e[t].translate))}),this.visualElement.render())});return()=>{i(),t(),s(),r&&r()}}getProps(){const e=this.visualElement.getProps(),{drag:t=!1,dragDirectionLock:n=!1,dragPropagation:a=!1,dragConstraints:s=!1,dragElastic:i=Rm,dragMomentum:r=!0}=e;return{...e,drag:t,dragDirectionLock:n,dragPropagation:a,dragConstraints:s,dragElastic:i,dragMomentum:r}}}function Om(e,t,n){return!(!0!==t&&t!==e||null!==n&&n!==e)}const qm=e=>(t,n)=>{e&&Nr.postRender(()=>e(t,n))};let $m=!1;class Um extends n.Component{componentDidMount(){const{visualElement:e,layoutGroup:t,switchLayoutGroup:n,layoutId:a}=this.props,{projection:s}=e;s&&(t.group&&t.group.add(s),n&&n.register&&a&&n.register(s),$m&&s.root.didUpdate(),s.addEventListener("animationComplete",()=>{this.safeToRemove()}),s.setOptions({...s.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),Jd.hasEverUpdated=!0}getSnapshotBeforeUpdate(e){const{layoutDependency:t,visualElement:n,drag:a,isPresent:s}=this.props,{projection:i}=n;return i?(i.isPresent=s,e.layoutDependency!==t&&i.setOptions({...i.options,layoutDependency:t}),$m=!0,a||e.layoutDependency!==t||void 0===t||e.isPresent!==s?i.willUpdate():this.safeToRemove(),e.isPresent!==s&&(s?i.promote():i.relegate()||Nr.postRender(()=>{const e=i.getStack();e&&e.members.length||this.safeToRemove()})),null):null}componentDidUpdate(){const{projection:e}=this.props.visualElement;e&&(e.root.didUpdate(),Uc.postRender(()=>{!e.currentAnimation&&e.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:e,layoutGroup:t,switchLayoutGroup:n}=this.props,{projection:a}=e;$m=!0,a&&(a.scheduleCheckAfterUnmount(),t&&t.group&&t.group.remove(a),n&&n.deregister&&n.deregister(a))}safeToRemove(){const{safeToRemove:e}=this.props;e&&e()}render(){return null}}function Wm(e){const[t,s]=Rh(),i=n.useContext(Yi);return a.jsx(Um,{...e,layoutGroup:i,switchLayoutGroup:n.useContext(hm),isPresent:t,safeToRemove:s})}const Hm={pan:{Feature:class extends xu{constructor(){super(...arguments),this.removePointerDownListener=rr}onPointerDown(e){this.session=new Mm(e,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:jm(this.node)})}createPanHandlers(){const{onPanSessionStart:e,onPanStart:t,onPan:n,onPanEnd:a}=this.node.getProps();return{onSessionStart:qm(e),onStart:qm(t),onMove:n,onEnd:(e,t)=>{delete this.session,a&&Nr.postRender(()=>a(e,t))}}}mount(){this.removePointerDownListener=Sm(this.node.current,"pointerdown",e=>this.onPointerDown(e))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}},drag:{Feature:class extends xu{constructor(e){super(e),this.removeGroupControls=rr,this.removeListeners=rr,this.controls=new Vm(e)}mount(){const{dragControls:e}=this.node.getProps();e&&(this.removeGroupControls=e.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||rr}update(){const{dragControls:e}=this.node.getProps(),{dragControls:t}=this.node.prevProps||{};e!==t&&(this.removeGroupControls(),e&&(this.removeGroupControls=e.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}},ProjectionNode:Eh,MeasureLayout:Wm}};function Ym(e,t,n){const{props:a}=e;e.animationState&&a.whileHover&&e.animationState.setActive("whileHover","Start"===n);const s=a["onHover"+n];s&&Nr.postRender(()=>s(t,xm(t)))}function Gm(e,t,n){const{props:a}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&a.whileTap&&e.animationState.setActive("whileTap","Start"===n);const s=a["onTap"+("End"===n?"":n)];s&&Nr.postRender(()=>s(t,xm(t)))}const Km=new WeakMap,Xm=new WeakMap,Jm=e=>{const t=Km.get(e.target);t&&t(e)},Zm=e=>{e.forEach(Jm)};const Qm={some:0,all:1},ep=bm({...km,inView:{Feature:class extends xu{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:e={}}=this.node.getProps(),{root:t,margin:n,amount:a="some",once:s}=e,i={root:t?t.current:void 0,rootMargin:n,threshold:"number"==typeof a?a:Qm[a]};return function(e,t,n){const a=function({root:e,...t}){const n=e||document;Xm.has(n)||Xm.set(n,{});const a=Xm.get(n),s=JSON.stringify(t);return a[s]||(a[s]=new IntersectionObserver(Zm,{root:e,...t})),a[s]}(t);return Km.set(e,n),a.observe(e),()=>{Km.delete(e),a.unobserve(e)}}(this.node.current,i,e=>{const{isIntersecting:t}=e;if(this.isInView===t)return;if(this.isInView=t,s&&!t&&this.hasEnteredView)return;t&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",t);const{onViewportEnter:n,onViewportLeave:a}=this.node.getProps(),i=t?n:a;i&&i(e)})}mount(){this.startObserver()}update(){if("undefined"==typeof IntersectionObserver)return;const{props:e,prevProps:t}=this.node;["amount","margin","root"].some(function({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}(e,t))&&this.startObserver()}unmount(){}}},tap:{Feature:class extends xu{mount(){const{current:e}=this.node;e&&(this.unmount=function(e,t,n={}){const[a,s,i]=Yc(e,n),r=e=>{const a=e.currentTarget;if(!nu(e))return;Qc.add(a);const i=t(a,e),r=(e,t)=>{window.removeEventListener("pointerup",o),window.removeEventListener("pointercancel",l),Qc.has(a)&&Qc.delete(a),nu(e)&&"function"==typeof i&&i(e,{success:t})},o=e=>{r(e,a===window||a===document||n.useGlobalTarget||Kc(a,e.target))},l=e=>{r(e,!1)};window.addEventListener("pointerup",o,s),window.addEventListener("pointercancel",l,s)};return a.forEach(e=>{(n.useGlobalTarget?window:e).addEventListener("pointerdown",r,s),$c(e)&&(e.addEventListener("focus",e=>((e,t)=>{const n=e.currentTarget;if(!n)return;const a=eu(()=>{if(Qc.has(n))return;tu(n,"down");const e=eu(()=>{tu(n,"up")});n.addEventListener("keyup",e,t),n.addEventListener("blur",()=>tu(n,"cancel"),t)});n.addEventListener("keydown",a,t),n.addEventListener("blur",()=>n.removeEventListener("keydown",a),t)})(e,s)),Zc(e)||e.hasAttribute("tabindex")||(e.tabIndex=0))}),i}(e,(e,t)=>(Gm(this.node,t,"Start"),(e,{success:t})=>Gm(this.node,e,t?"End":"Cancel")),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}},focus:{Feature:class extends xu{constructor(){super(...arguments),this.isActive=!1}onFocus(){let e=!1;try{e=this.node.current.matches(":focus-visible")}catch(t){e=!0}e&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=lr(Wd(this.node.current,"focus",()=>this.onFocus()),Wd(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}},hover:{Feature:class extends xu{mount(){const{current:e}=this.node;e&&(this.unmount=function(e,t,n={}){const[a,s,i]=Yc(e,n),r=e=>{if(!Gc(e))return;const{target:n}=e,a=t(n,e);if("function"!=typeof a||!n)return;const i=e=>{Gc(e)&&(a(e),n.removeEventListener("pointerleave",i))};n.addEventListener("pointerleave",i,s)};return a.forEach(e=>{e.addEventListener("pointerenter",r,s)}),i}(e,(e,t)=>(Ym(this.node,t,"Start"),e=>Ym(this.node,e,"End"))))}unmount(){}}},...Hm,layout:{ProjectionNode:Eh,MeasureLayout:Wm}},vm),tp={duration:.15,ease:[.4,0,.2,1]},np={type:"tween",duration:.25,ease:[.4,0,.2,1]},ap={type:"tween",duration:.3,ease:[.4,0,.2,1]},sp=n.createContext(!1);function ip(){return n.useContext(sp)}const rp=n.createContext(void 0);function op(){return n.useContext(rp)}const lp="#1A1A1A",cp="#737373",up={xs:"sm:max-w-xs",sm:"sm:max-w-sm",md:"sm:max-w-md",lg:"sm:max-w-lg",xl:"sm:max-w-xl","2xl":"sm:max-w-2xl","3xl":"sm:max-w-3xl","4xl":"sm:max-w-4xl","5xl":"sm:max-w-5xl",full:"sm:max-w-[calc(100vw-2rem)]"};function dp({open:e,onClose:t,size:s="md",className:r,children:c,bottomSheet:u=!0,motionPlus:d=!1,basemapMode:h,solid:m=!1}){const p="light"===h,[g,f]=n.useState(!1),y=n.useRef(null);n.useEffect(()=>(y.current&&(clearTimeout(y.current),y.current=null),e?y.current=setTimeout(()=>{f(!0)},350):queueMicrotask(()=>f(!1)),()=>{y.current&&(clearTimeout(y.current),y.current=null)}),[e]);const b=n.useCallback((e,n)=>{(n.offset.y>100||n.velocity.y>500)&&t()},[t]),v=d?ap:np,w=d?.98:.99,k=u?8:4;return a.jsx(Vh,{mode:"wait",children:e&&a.jsxs(o,{static:!0,open:e,onClose:t,className:"relative z-[10010]",children:[a.jsx(ep.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:tp,className:"fixed inset-0 bg-black/50 backdrop-blur-sm","aria-hidden":"true"}),a.jsx("div",{className:"fixed inset-0 overflow-y-auto",children:a.jsx("div",{className:i("flex min-h-full justify-center",u?"items-end sm:items-center sm:p-4":"items-center p-4"),children:a.jsx(ep.div,{drag:!!u&&"y",dragConstraints:{top:0,bottom:0},dragElastic:{top:0,bottom:.4},onDragEnd:b,initial:{opacity:0,scale:w,y:k},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.99,y:u?40:4},transition:v,style:{willChange:"transform, opacity"},className:i(u&&"w-full sm:w-auto"),children:a.jsx(l,{className:i("relative w-full shadow-2xl flex flex-col",!h&&!m&&"bg-bg-surface/80 backdrop-blur-xl",!h&&m&&"bg-bg-1",!h&&"ring-1 ring-inset ring-white/10",up[s],u?"radius-card overflow-hidden pb-safe":"radius-card overflow-hidden",r),style:h?{backgroundColor:p?"#F8F8F8":"var(--bg-surface)",boxShadow:"inset 0 0 0 1px "+(p?"rgba(0, 0, 0, 0.08)":"rgba(255, 255, 255, 0.1)")}:void 0,children:a.jsx(rp.Provider,{value:h,children:a.jsx(sp.Provider,{value:g,children:c})})})})})})]})})}function hp({className:e,...t}){const n=op(),s="light"===n;return a.jsx(c,{...t,className:i("text-base font-semibold sm:text-lg",!n&&"text-text-primary",e),style:n?{color:s?lp:"var(--text-primary)"}:void 0})}function mp({icon:e,title:t,onClose:n,className:s}){const r=op(),o="light"===r;return a.jsxs("div",{className:i("flex items-center justify-between p-4 border-b",!r&&"border-border-subtle",s),style:r?{borderColor:o?"rgba(0, 0, 0, 0.12)":"var(--border-subtle)"}:void 0,children:[a.jsxs("div",{className:"flex items-center gap-3",children:[e&&a.jsx("div",{className:i("p-2 radius-inner",!r&&"bg-bg-subtle text-icon-card-title"),style:r?{backgroundColor:o?"#EEEEEE":"var(--bg-subtle)",color:o?"#4A4A4A":"var(--icon-card-title)"}:void 0,children:e}),a.jsx(hp,{children:t})]}),n&&a.jsx("button",{onClick:n,className:i("p-2 radius-inner transition-colors",!r&&"text-text-muted hover:text-text-primary hover:bg-bg-subtle"),style:r?{color:o?cp:"var(--text-muted)"}:void 0,onMouseEnter:e=>{r&&(e.currentTarget.style.color=o?lp:"var(--text-primary)",e.currentTarget.style.backgroundColor=o?"rgba(0, 0, 0, 0.06)":"var(--bg-subtle)")},onMouseLeave:e=>{r&&(e.currentTarget.style.color=o?cp:"var(--text-muted)",e.currentTarget.style.backgroundColor="transparent")},"aria-label":"Close",children:a.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]})}function pp({className:e,...t}){return a.jsx("div",{...t,className:i("p-4",e)})}function gp({className:e,...t}){return a.jsx("div",{...t,className:i("flex flex-col-reverse gap-3 p-4 pt-0","sm:flex-row sm:justify-end","*:w-full sm:*:w-auto",e)})}function fp({className:e,...t}){return a.jsx("nav",{...t,className:i(e,"flex h-full min-h-0 flex-col")})}function yp({className:e,...t}){return a.jsx("div",{...t,className:i(e,"flex flex-col border-b border-border-subtle p-4","[&>[data-slot=section]+[data-slot=section]]:mt-2.5")})}function bp({className:e,...t}){return a.jsx("div",{...t,className:i(e,"flex flex-1 flex-col p-3","overflow-y-auto sidebar-scroll","[&>[data-slot=section]+[data-slot=section]]:mt-6")})}function vp({className:e,...t}){return a.jsx("div",{...t,className:i(e,"mt-auto flex flex-col border-t border-border-subtle","[&>[data-slot=section]+[data-slot=section]]:mt-2.5")})}function wp({className:e,...t}){const s=n.useId();return a.jsx($h,{id:s,children:a.jsx("div",{...t,"data-slot":"section",className:i(e,"flex flex-col gap-0.5")})})}const kp=n.forwardRef(function(e,t){const{current:n,className:s,children:o,...l}=e,c=i("flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left","min-h-[44px]","text-sm font-medium","[&>svg]:w-5 [&>svg]:h-5 [&>svg]:flex-shrink-0",n?"bg-accent-primary/15 text-accent-primary [&>svg]:text-accent-primary":"text-text-muted hover:text-text-primary hover:bg-subtle-fill [&>svg]:text-text-muted hover:[&>svg]:text-text-primary","transition-all duration-150");return a.jsxs("span",{className:i(s,"relative"),children:[n&&a.jsx(ep.span,{layoutId:"sidebar-current-indicator",className:"absolute inset-y-2 -left-3 w-0.5 rounded-full bg-accent-primary"}),"string"==typeof l.href?a.jsx(y,{to:l.href,onClick:l.onClick,onMouseEnter:l.onMouseEnter,onMouseLeave:l.onMouseLeave,className:c,"data-current":n?"true":void 0,ref:t,children:o}):a.jsx(r,{...l,className:i("cursor-default",c),"data-current":n?"true":void 0,ref:t,children:o})]})});function xp({className:e,...t}){return a.jsx("span",{...t,className:i(e,"truncate")})}function Sp({className:e,variant:t="default",...n}){return a.jsx("span",{...n,className:i("ml-auto flex items-center gap-1 px-1.5 py-0.5 rounded-full","text-xs font-medium",{default:"bg-bg-subtle text-text-muted",accent:"bg-accent-primary/20 text-accent-primary",success:"bg-accent-success/20 text-accent-success",warning:"bg-accent-secondary/20 text-accent-secondary",danger:"bg-accent-danger/20 text-accent-danger"}[t],e)})}const jp=n.createContext(null),Cp={type:"spring",visualDuration:.35,bounce:.15};function Tp({open:e,onClose:t,children:n}){return a.jsx(Vh,{children:e&&a.jsxs(o,{static:!0,open:e,onClose:t,className:"lg:hidden relative z-[10002]",children:[a.jsx(ep.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.25,ease:"easeOut"},className:"fixed inset-0 bg-black/60 backdrop-blur-sm","aria-hidden":"true"}),a.jsx(ep.div,{initial:{x:"-100%"},animate:{x:0},exit:{x:"-100%"},transition:Cp,className:"fixed inset-y-0 left-0 w-72 max-w-[85vw] z-[10003]",children:a.jsx(l,{className:"h-full",children:a.jsxs("div",{className:"flex h-full flex-col sidebar-panel",children:[a.jsx("div",{className:"absolute top-4 right-4 z-10",children:a.jsx(u,{className:"p-2 rounded-lg text-text-muted hover:text-text-primary hover:bg-subtle-fill transition-colors","aria-label":"Close navigation",children:a.jsx(Hi,{className:"w-5 h-5"})})}),n]})})})]})})}function Mp({sidebar:e,navbar:t,children:s,className:r}){const[o,l]=n.useState(!1),c=()=>l(!0),u=()=>l(!1),d={isOpen:o,open:c,close:u,toggle:()=>l(e=>!e)};return a.jsx(jp.Provider,{value:d,children:a.jsxs("div",{className:"flex h-screen overflow-hidden bg-bg-body",children:[a.jsx("aside",{className:"hidden lg:flex flex-col w-64 flex-shrink-0 h-full relative sidebar-panel",children:e}),a.jsx(Tp,{open:o,onClose:u,children:e}),a.jsxs("div",{className:"flex-1 flex flex-col min-w-0",children:[a.jsx("header",{className:"lg:hidden sticky top-0 z-[10001] h-14 mobile-header",children:a.jsxs("div",{className:"flex items-center h-full px-4",children:[a.jsx("button",{onClick:c,className:"w-10 h-10 flex items-center justify-center rounded-lg hover:bg-subtle-fill active:bg-subtle-fill transition-colors mr-2","aria-label":"Open navigation",children:a.jsx(Ri,{className:"w-5 h-5 text-text-primary"})}),a.jsx("div",{className:"flex-1 min-w-0",children:t})]})}),a.jsx("main",{className:i("flex-1 overflow-y-auto main-content",r),children:s})]})]})})}function Pp({className:e,...t}){return a.jsx("nav",{...t,className:i(e,"flex flex-1 items-center gap-3")})}function Ep({className:e,...t}){return a.jsx("div",{...t,className:i(e,"flex items-center gap-3")})}function Ap({className:e,...t}){return a.jsx("div",{"aria-hidden":"true",...t,className:i(e,"flex-1")})}const Lp="bg-bg-surface/80 backdrop-blur-lg ring-1 ring-inset ring-white/10",Dp={sm:"radius-inner",md:"radius-inset",lg:"radius-card",xl:"radius-hero",full:"radius-pill",none:"radius-none"};function zp({defaultOpen:e=!1,className:t,children:n}){return a.jsx(h,{defaultOpen:e,children:a.jsx("div",{className:i("flex flex-col",t),children:n})})}n.forwardRef(function({children:e,elevated:t,compact:n,noPadding:s,radius:r="lg",glass:o=!0,stroke:l=!0,shadow:c,reflex:u=!1,glow:d=!1,onClick:h,className:m,style:p,...g},f){const y=c??t??!1,b=u?{...p,"--surface-reflex":"1"}:p;return a.jsx("div",{ref:f,className:i(Dp[r],o&&(t?"bg-bg-surface/85 backdrop-blur-xl":"bg-bg-surface/80 backdrop-blur-lg"),!o&&"bg-bg-surface",l&&!d&&"ring-1 ring-inset ring-white/10",d&&"ring-1 ring-inset ring-accent-primary/40",y&&(t?"shadow-xl":"shadow-lg"),u&&"surface-reflex","h-full flex flex-col relative",!s&&(n?"p-3 sm:p-4":"p-4 sm:p-5"),h&&"cursor-pointer",m),style:b,onClick:h,...g,children:e})}),n.forwardRef(function({children:e,className:t,...n},s){return a.jsx("div",{ref:s,className:i("flex items-center justify-between gap-4","pb-4 mb-4","border-b border-border-subtle",t),...n,children:e})}),n.forwardRef(function({children:e,icon:t,className:n,...s},r){return a.jsxs("h3",{ref:r,className:i("flex items-center gap-2","text-base font-semibold text-text-primary",n),...s,children:[t&&a.jsx("span",{className:"text-icon-card-title w-5 h-5 flex-shrink-0",children:t}),e]})}),n.forwardRef(function({children:e,className:t,...n},s){return a.jsx("p",{ref:s,className:i("text-sm text-text-muted",t),...n,children:e})}),n.forwardRef(function({children:e,className:t,...n},s){return a.jsx("div",{ref:s,className:i("flex-1 min-h-0",t),...n,children:e})}),n.forwardRef(function({children:e,className:t,...n},s){return a.jsx("div",{ref:s,className:i("flex items-center justify-end gap-3","pt-4 mt-4","border-t border-border-subtle",t),...n,children:e})}),n.forwardRef(function({children:e,border:t,className:n,...s},r){return a.jsx("div",{ref:r,className:i(t&&"pt-4 mt-4 border-t border-border-subtle",n),...s,children:e})});const Np=n.forwardRef(function({className:e,icon:t,children:n,...s},r){return a.jsx(d,{ref:r,className:i("flex w-full items-center justify-between gap-3","px-3 py-2 radius-inner","text-sm font-medium text-text-muted","row-hover hover:text-text-primary","ring-focus",e),...s,children:({open:e})=>a.jsxs(a.Fragment,{children:[n,a.jsx("span",{className:i("transition-transform duration-200",e?"rotate-180":"rotate-0"),children:t||a.jsx(Ti,{className:"w-4 h-4"})})]})})});function Fp({direction:e="down",className:t,children:n}){const s={hidden:{height:0,opacity:0,y:"up"===e?8:-8},visible:{height:"auto",opacity:1,y:0}};return a.jsx(m,{static:!0,children:({open:r})=>a.jsx(Vh,{initial:!1,children:r&&a.jsx(ep.div,{initial:"hidden",animate:"visible",exit:"hidden",variants:s,transition:{height:{duration:.2,ease:[.4,0,.2,1]},opacity:{duration:.15},y:{duration:.15}},className:i("overflow-hidden",t),children:a.jsx("div",{className:i("up"===e?"pb-2":"pt-2"),children:n})})})})}function Rp({label:e,icon:t,defaultOpen:n=!0,direction:s="down",className:r,dataId:o,children:l}){const c=o?{[`data-${o}-disclosure`]:!0}:{},u=a.jsxs("span",{className:"flex items-center gap-3",children:[t,a.jsx("span",{className:"text-sm font-medium",children:e})]});return"up"===s?a.jsx(h,{defaultOpen:n,children:({open:n})=>a.jsxs("div",{className:i("relative",r),children:[a.jsx(m,{static:!0,className:"relative z-50",children:a.jsx(Vh,{initial:!1,mode:"wait",children:n&&a.jsxs(ep.div,{initial:{y:12,scale:.96,opacity:0},animate:{y:0,scale:1,opacity:1},exit:{y:6,scale:.98,opacity:0},transition:{type:"spring",stiffness:400,damping:30,mass:.5,opacity:{duration:.15,ease:"easeOut"}},className:"absolute bottom-full left-0 right-0 z-50 mb-1 mx-1 origin-bottom radius-inset shadow-lg border-card bg-bg-surface/80 backdrop-blur-xl",children:[a.jsxs("div",{className:"flex items-center justify-between px-3 py-2",children:[a.jsxs("span",{className:"flex items-center gap-3",children:[t,a.jsx("span",{className:"text-sm font-medium text-text-primary",children:e})]}),a.jsx(d,{className:"p-1 rounded hover:bg-white/10 transition-colors",children:a.jsx(ep.span,{initial:{rotate:0},animate:{rotate:180},exit:{rotate:0},transition:{type:"spring",stiffness:400,damping:25},children:a.jsx(Ti,{className:"w-4 h-4"})})})]}),a.jsx("div",{className:"px-3 pb-3",children:l})]})})}),a.jsx(ep.div,{animate:{opacity:n?.4:1,scale:n?.98:1},transition:{type:"spring",stiffness:500,damping:35},children:a.jsxs(d,{...c,className:i("flex w-full items-center justify-between gap-3","px-3 py-2 radius-inner","text-sm font-medium text-text-muted","row-hover hover:text-text-primary","ring-focus"),children:[u,a.jsx(ep.span,{animate:{rotate:n?180:0},transition:{type:"spring",stiffness:400,damping:25},children:a.jsx(Ti,{className:"w-4 h-4"})})]})})]})}):a.jsxs(zp,{defaultOpen:n,className:r,children:[a.jsx(Np,{...c,children:u}),a.jsx(Fp,{direction:"down",children:a.jsx("div",{className:"bg-subtle-fill radius-inset mx-1 mt-1",children:l})})]})}const Ip="0.9.212",_p="'JetBrains Mono', monospace",Bp=n.memo(function({height:e=16,responsive:t=!1,className:n=""}){const s="var(--accent-primary)",i="var(--text-primary)";if(t){const e=145,t=24;return a.jsxs("svg",{className:n,viewBox:`0 0 ${e} ${t}`,preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":"pyMC:Console",style:{display:"block",width:"80%",height:"auto"},children:[a.jsx("style",{children:`\n .logo-text {\n font-family: ${_p};\n }\n .logo-accent {\n fill: var(--accent-primary, #719CDF);\n }\n .logo-main {\n fill: var(--text-primary, #FFFFFF);\n }\n `}),a.jsxs("text",{x:"0",y:"18",className:"logo-text",fontSize:"20",fontWeight:"400",letterSpacing:"-0.02em",children:[a.jsx("tspan",{className:"logo-accent",children:"py"}),a.jsx("tspan",{className:"logo-main",children:"MC"}),a.jsx("tspan",{className:"logo-accent",children:":"}),a.jsx("tspan",{className:"logo-main",children:"Console"})]})]})}const r="string"==typeof e?parseFloat(e):e,o={fontFamily:_p,fontSize:.8*r+"px",fontWeight:400,lineHeight:1,letterSpacing:"-0.02em",whiteSpace:"nowrap"};return a.jsxs("span",{className:n,style:o,role:"img","aria-label":"pyMC:Console",children:[a.jsx("span",{style:{color:s},children:"py"}),a.jsx("span",{style:{color:i},children:"MC"}),a.jsx("span",{style:{color:s},children:":"}),a.jsx("span",{style:{color:i},children:"Console"})]})}),Vp="pymc_jwt_token",Op="pymc_client_id",qp="pymc_remember_me",$p=new Set;function Up(e){return $p.add(e),()=>$p.delete(e)}function Wp(e){for(const n of $p)try{n(e)}catch(t){}}function Hp(){let e=localStorage.getItem(Op);return e||(e=`${Date.now()}-${Math.random().toString(36).substring(2,15)}`,localStorage.setItem(Op,e)),e}function Yp(){return"true"===localStorage.getItem(qp)}function Gp(e){e?localStorage.setItem(qp,"true"):localStorage.removeItem(qp)}function Kp(){return Yp()?localStorage:sessionStorage}function Xp(){return Kp().getItem(Vp)||localStorage.getItem(Vp)||sessionStorage.getItem(Vp)}function Jp(e){Kp().setItem(Vp,e),Yp()?sessionStorage.removeItem(Vp):localStorage.removeItem(Vp),Wp(e)}function Zp(){localStorage.removeItem(Vp),sessionStorage.removeItem(Vp),Wp(null)}function Qp(){return!(!Xp()||tg()&&(Zp(),1))}function eg(e){try{const t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"),n=decodeURIComponent(atob(t).split("").map(e=>"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(n)}catch{return null}}function tg(){const e=Xp();if(!e)return!0;const t=eg(e);return!t||!t.exp||Date.now()>=1e3*t.exp-6e4}function ng(){const e=Xp();if(!e)return 0;const t=eg(e);return t&&t.exp?Math.max(0,Math.floor((1e3*t.exp-Date.now())/1e3)):0}function ag(){const e=Xp();if(!e)return!1;const t=eg(e);if(!t||!t.exp)return!1;const n=1e3*t.exp-Date.now();return n>0&&n<3e5}async function sg(e,t,n=!1){Gp(n);try{const n=await fetch("/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,password:t,client_id:Hp()})}),a=n.headers.get("content-type");if(!a||!a.includes("application/json"))return{success:!1,error:`Server error: ${n.status}`};const s=await n.json();return s.success&&s.token?(Jp(s.token),{success:!0}):{success:!1,error:s.error||"Login failed"}}catch(a){return{success:!1,error:"Connection error. Please try again."}}}async function ig(){const e=Xp();if(!e)return!1;const t=eg(e);(null==t?void 0:t.exp)&&Math.floor((1e3*t.exp-Date.now())/1e3);try{const t=await fetch("/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({client_id:Hp()})});if(!t.ok){let e="";try{const n=await t.json();e=n.error||JSON.stringify(n)}catch{e=t.statusText}return!1}const n=await t.json();if(n.success&&n.token){Jp(n.token);const e=eg(n.token);return(null==e?void 0:e.exp)&&Math.floor((1e3*e.exp-Date.now())/1e3),!0}return!1}catch(n){return!1}}let rg=null;async function og(){const e=Xp();if(!e)return!1;const t=eg(e);return(null==t?void 0:t.exp)&&Math.floor((1e3*t.exp-Date.now())/1e3),!ag()||rg||(rg=ig().finally(()=>{rg=null}),rg)}let lg=!1;const cg=new Map;let ug=!1;async function dg(e,t,n=!1){const a=function(e,t){return(null==t?void 0:t.method)&&"GET"!==t.method?"":e}(e,t);if(a){const e=cg.get(a);if(e)return e}const s=`${e}`;!n&&ag()&&await ig();const i=Xp();if(!i&&!e.includes("/auth/"))throw window.location.href="/login",new Error("Not authenticated");const r={"Accept-Encoding":"gzip, deflate",Accept:"application/json",...i?{Authorization:`Bearer ${i}`}:{}};if(null==t?void 0:t.headers){const e=t.headers;e instanceof Headers?e.forEach((e,t)=>{r[t]=e}):Array.isArray(e)?e.forEach(([e,t])=>{r[e]=t}):Object.assign(r,e)}(null==t?void 0:t.body)&&(r["Content-Type"]="application/json");const o=(async()=>{const a=await fetch(s,{...t,headers:r});if(401===a.status){if(!n&&!ug&&await ig())return dg(e,t,!0);throw ug||(ug=!0,Zp(),window.location.replace("/login")),new Error("Session expired. Please log in again.")}if(!a.ok)throw new Error(`API error: ${a.status} ${a.statusText} (${e})`);return a.json()})();return a&&(cg.set(a,o),o.finally(()=>{cg.delete(a)})),o}const hg={spreadingFactor:7,bandwidthHz:125e3,codingRate:5,preambleLength:8,crcEnabled:!0,explicitHeader:!0};function mg(e){if(e.raw_packet){const t=e.raw_packet;if(/^[0-9a-fA-F]+$/.test(t)&&t.length%2==0)return t.length/2;if(/^[A-Za-z0-9+/=]+$/.test(t)){const e=(t.match(/=+$/)||[""])[0].length;return Math.floor(3*t.length/4)-e}return t.length}if(e.length&&e.length>0)return e.length;if(e.payload_length&&e.payload_length>0)return e.payload_length;if(e.payload){const t=e.payload;return/^[0-9a-fA-F]+$/.test(t)&&t.length%2==0?t.length/2:t.length}return 32}function pg(e,t={}){return void 0!==e.airtime_ms&&e.airtime_ms>0?e.airtime_ms:function(e,t={}){const n=t.spreadingFactor??hg.spreadingFactor,a=t.bandwidthHz??hg.bandwidthHz,s=t.codingRate??hg.codingRate,i=t.preambleLength??hg.preambleLength??8,r=t.crcEnabled??hg.crcEnabled?1:0,o=t.explicitHeader??hg.explicitHeader?0:1,l=n>=11&&a<=125e3?1:0,c=a/1e3,u=Math.pow(2,n)/c,d=(i+4.25)*u,h=Math.max(8*e-4*n+28+16*r-20*o,0),m=4*(n-2*l);return d+(8+Math.ceil(h/m)*s)*u}(mg(e),t)}function gg(e){return e&&"chat node"===e.toLowerCase()?"Companion":e}async function fg(){return function(e){if(e.neighbors)for(const t of Object.values(e.neighbors))t.contact_type=gg(t.contact_type);return e}(await dg("/api/stats"))}async function yg(){return dg("/api/logs")}async function bg(e=24){return dg(`/api/noise_floor_history?hours=${e}`)}const vg=new Map;function wg(e=!1){if(e)vg.clear();else for(const[t]of vg)parseInt(t.split("-")[0],10)<=60&&vg.delete(t)}function kg(e,t,n,a){const s=60*e/t,i=Math.floor(Date.now()/1e3),r=Math.floor(i/s)*s,o=r-60*e,l=n.filter(e=>e.timestamp>=o&&e.timestamp<=r),c=a?function(e){var t;const n=null==(t=null==e?void 0:e.config)?void 0:t.radio;return{spreadingFactor:(null==n?void 0:n.spreading_factor)??hg.spreadingFactor,bandwidthHz:(null==n?void 0:n.bandwidth)??hg.bandwidthHz,codingRate:(null==n?void 0:n.coding_rate)??hg.codingRate,preambleLength:(null==n?void 0:n.preamble_length)??hg.preambleLength,crcEnabled:!0,explicitHeader:!0}}(a):hg,u=function(e,t,n,a,s){const i=new Array(t),r=new Array(t),o=new Array(t),l=new Array(t),c=new Array(t),u=new Array(t),d=new Array(t);for(let m=0;m=t)continue;const g=pg(h,s),f=h.packet_origin;if("tx_local"===f?(o[p].count++,o[p].airtime_ms+=g):"tx_forward"===f||h.transmitted?(l[p].count++,l[p].airtime_ms+=g):h.drop_reason&&(c[p].count++,c[p].airtime_ms+=g),"tx_local"!==f){i[p].count++,i[p].airtime_ms+=g,u[p].snr+=h.snr||0,u[p].rssi+=h.rssi||0,u[p].count++;const e=h.packet_hash;e&&!d[p].has(e)&&(d[p].add(e),r[p].count++,r[p].airtime_ms+=g)}}for(let m=0;m0&&(i[m].avg_snr=u[m].snr/u[m].count,i[m].avg_rssi=u[m].rssi/u[m].count);return{received:i,unique_received:r,transmitted:o,forwarded:l,dropped:c}}(l,t,o,s,c);return{time_range_minutes:e,bucket_count:t,bucket_duration_seconds:s,start_time:o,end_time:r,...u}}async function xg(){return dg("/api/hardware_stats")}async function Sg(){return dg("/api/hardware_processes")}async function jg(e){return dg("/api/update_radio_config",{method:"POST",body:JSON.stringify(e)})}async function Cg(){return dg("/api/send_advert",{method:"POST",body:"{}"})}async function Tg(e){return dg("/api/set_mode",{method:"POST",body:JSON.stringify({mode:e})})}async function Mg(e){return dg("/api/set_duty_cycle",{method:"POST",body:JSON.stringify({enabled:e})})}async function Pg(e){try{return await dg("/api/log_level",{method:"POST",body:JSON.stringify({level:e})})}catch(t){return{success:!1,error:t instanceof Error?t.message:"Unknown error"}}}const Eg=new class{constructor(){t(this,"worker",null),t(this,"isInitialized",!1),t(this,"statsListeners",new Set),t(this,"packetsListeners",new Set),t(this,"errorListeners",new Set),t(this,"readyResolve",null),t(this,"readyPromise",null),t(this,"unsubscribeTokenChange",null)}async init(e){if(!this.isInitialized&&"undefined"!=typeof window){this.readyPromise=new Promise(e=>{this.readyResolve=e});try{this.worker=new Worker(new URL("/assets/polling.worker-B_pFWyb2.js",import.meta.url),{type:"module"}),this.worker.onmessage=this.handleMessage.bind(this),this.worker.onerror=e=>{};const t={type:"init",config:{apiBaseUrl:e.apiBaseUrl,authToken:e.authToken,statsIntervalMs:e.statsIntervalMs??3e3,packetsIntervalMs:e.packetsIntervalMs??3e3}};this.worker.postMessage(t),this.isInitialized=!0,this.unsubscribeTokenChange=Up(e=>{this.setAuthToken(e)}),await this.readyPromise}catch(t){throw t}}}handleMessage(e){var t;const n=e.data;switch(n.type){case"ready":null==(t=this.readyResolve)||t.call(this);break;case"stats":for(const e of this.statsListeners)try{e(n.data,n.timestamp)}catch(a){}break;case"packets":for(const e of this.packetsListeners)try{e(n.newPackets,n.totalCount,n.newestTimestamp)}catch(a){}break;case"packetsReset":for(const e of this.packetsListeners)try{e([],0,n.newestTimestamp)}catch(a){}break;case"error":for(const e of this.errorListeners)try{e(n.source,n.error)}catch(a){}}}onStats(e){return this.statsListeners.add(e),()=>this.statsListeners.delete(e)}onPackets(e){return this.packetsListeners.add(e),()=>this.packetsListeners.delete(e)}onError(e){return this.errorListeners.add(e),()=>this.errorListeners.delete(e)}setAuthToken(e){if(!this.worker)return;const t={type:"setAuth",token:e};this.worker.postMessage(t)}setLiveMode(e){if(!this.worker)return;const t={type:"setLiveMode",enabled:e};this.worker.postMessage(t)}forceRefresh(){this.worker&&this.worker.postMessage({type:"forceRefresh"})}pausePolling(){this.worker&&this.worker.postMessage({type:"pause"})}resumePolling(){this.worker&&this.worker.postMessage({type:"resume"})}clearCache(){this.worker&&this.worker.postMessage({type:"clearCache"})}setTimeWindow(e){if(!this.worker)return;const t={type:"setTimeWindow",hours:e};this.worker.postMessage(t)}terminate(){if(this.unsubscribeTokenChange&&(this.unsubscribeTokenChange(),this.unsubscribeTokenChange=null),this.worker){const e={type:"stop"};this.worker.postMessage(e),this.worker.terminate(),this.worker=null}this.isInitialized=!1,this.statsListeners.clear(),this.packetsListeners.clear(),this.errorListeners.clear()}isReady(){return this.isInitialized}},Ag="pymc-packet-cache",Lg="pymc-packet-cache-meta",Dg=36e5,zg=5e3,Ng=2592e5,Fg=6048e5,Rg=12096e5,Ig=5e5,_g=new class{constructor(){t(this,"packets",new Map),t(this,"sortedPackets",[]),t(this,"sortedDirty",!0),t(this,"meta",{oldestTimestamp:0,newestTimestamp:0,lastUpdated:0,packetCount:0,backgroundLoadComplete:!1,topologyLoadComplete:!1,dataTier:"24h",threeDayLoadComplete:!1,sevenDayLoadComplete:!1,fourteenDayLoadComplete:!1}),t(this,"isLoading",!1),t(this,"isBackgroundLoading",!1),t(this,"isTopologyLoading",!1),t(this,"listeners",new Set),t(this,"loadProgress",null),t(this,"statusMessage",""),this.loadFromStorage()}subscribe(e){return this.listeners.add(e),e(this.getState()),()=>this.listeners.delete(e)}getState(){return{isLoading:this.isLoading,isBackgroundLoading:this.isBackgroundLoading,isTopologyLoading:this.isTopologyLoading,backgroundLoadComplete:this.meta.backgroundLoadComplete,topologyLoadComplete:this.meta.topologyLoadComplete,packetCount:this.packets.size,statusMessage:this.statusMessage,loadProgress:this.loadProgress,dataTier:this.meta.dataTier,threeDayLoadComplete:this.meta.threeDayLoadComplete,sevenDayLoadComplete:this.meta.sevenDayLoadComplete,fourteenDayLoadComplete:this.meta.fourteenDayLoadComplete}}getDataTier(){return this.meta.dataTier}getPackets(){return this.sortedDirty&&(this.sortedPackets=Array.from(this.packets.values()).sort((e,t)=>(e.timestamp??0)-(t.timestamp??0)),this.sortedDirty=!1),this.sortedPackets}getNewestTimestamp(){return this.meta.newestTimestamp}getOldestTimestamp(){return this.meta.oldestTimestamp}isStale(){return 0===this.packets.size||Date.now()-this.meta.lastUpdated>Dg}isHeavyLoadInProgress(){return this.isBackgroundLoading||this.isTopologyLoading}async initialLoad(e){if(this.isStale()&&this.packets.size>0&&this.clear(),this.meta.backgroundLoadComplete&&this.packets.size>0)return this.getPackets();this.isLoading=!0;const t=Date.now(),n=Math.floor((t-864e5)/1e3);this.packets.size>0&&(this.packets.clear(),this.sortedPackets=[],this.sortedDirty=!0,this.meta.oldestTimestamp=0,this.meta.newestTimestamp=0),this.statusMessage="Loading...",this.loadProgress={loaded:0,target:3e4,percent:0},this.notifyListeners();try{const t=await this.fetchFilteredPackets(void 0,5e4,!1,n);t.success&&t.data&&t.data.length>0&&(this.mergePackets(t.data),this.loadProgress={loaded:this.packets.size,target:this.packets.size,percent:100},this.notifyListeners(),e&&e()),this.enforceMemoryCap(),this.meta.backgroundLoadComplete=!0,this.meta.dataTier="24h",this.notifyListeners(),this.saveToStorage()}catch(a){this.statusMessage="Load failed"}finally{this.isLoading=!1,this.statusMessage="",this.loadProgress=null,this.notifyListeners()}return this.getPackets()}async quickLoad(){return this.initialLoad()}async backgroundLoad(){await this.initialLoad()}async loadThreeDays(e){this.meta.threeDayLoadComplete||this.isBackgroundLoading||await this.loadExtendedData("3d",Ng,e)}async loadSevenDays(e){this.meta.sevenDayLoadComplete||this.isBackgroundLoading||(await this.loadExtendedData("7d",Fg,e),this.meta.threeDayLoadComplete=!0)}async loadFourteenDays(e){this.meta.fourteenDayLoadComplete||this.isBackgroundLoading||(await this.loadExtendedData("14d",Rg,e),this.meta.threeDayLoadComplete=!0,this.meta.sevenDayLoadComplete=!0)}async loadExtendedData(e,t,n){this.isBackgroundLoading=!0,Eg.pausePolling();const a=Date.now(),s=Math.floor((a-t)/1e3),i=this.meta.oldestTimestamp||Math.floor(a/1e3);if(i<=s)return this.isBackgroundLoading=!1,void Eg.resumePolling();const r=3e4*("3d"===e?2:"7d"===e?6:13),o=this.packets.size,l=o+r;this.loadProgress={loaded:o,target:l,percent:0},this.statusMessage=`Loading ${e} history...`,this.notifyListeners();try{let t=i,a=0,r=0;for(;t>s&&r<3;){const e=await this.fetchChunkWithRetry(t,zg,s);if(null!==e){if(r=0,!(e.success&&e.data&&e.data.length>0))break;{const s=this.packets.size;this.mergePackets(e.data);const i=this.packets.size-s;a+=i,this.loadProgress={loaded:this.packets.size,target:Math.max(l,this.packets.size),percent:Math.min(99,Math.round(this.packets.size/l*100))},this.notifyListeners(),n&&i>0&&n();const r=Math.min(...e.data.map(e=>e.timestamp??1/0));if(!(r!==1/0&&r=Ng,this.meta.threeDayLoadComplete&&(this.meta.dataTier="3d")):"7d"===e?(this.meta.sevenDayLoadComplete=o>=Fg,this.meta.sevenDayLoadComplete&&(this.meta.dataTier="7d")):(this.meta.fourteenDayLoadComplete=o>=Rg,this.meta.fourteenDayLoadComplete&&(this.meta.dataTier="14d")),this.loadProgress={loaded:this.packets.size,target:this.packets.size,percent:100},this.notifyListeners(),this.saveToStorage()}catch(c){this.statusMessage=`${e} load failed`}finally{this.isBackgroundLoading=!1,this.statusMessage="",this.loadProgress=null,this.notifyListeners(),Eg.resumePolling()}}isDataTierAvailable(e){switch(e){case"24h":return this.meta.backgroundLoadComplete;case"3d":return this.meta.threeDayLoadComplete;case"7d":return this.meta.sevenDayLoadComplete;case"14d":return this.meta.fourteenDayLoadComplete;default:return!1}}async topologyLoad(){if(!this.meta.topologyLoadComplete&&!this.isTopologyLoading)return this.doTopologyLoad()}async forceTopologyLoad(){if(!this.isTopologyLoading)return this.meta.topologyLoadComplete=!1,this.doTopologyLoad()}async forceDeepLoad(){return this.forceTopologyLoad()}async doTopologyLoad(){this.isTopologyLoading=!0,Eg.pausePolling();const e=Date.now(),t=Math.floor((e-Rg)/1e3),n=this.meta.oldestTimestamp||Math.floor(e/1e3);if(n<=t)return this.meta.topologyLoadComplete=!0,this.isTopologyLoading=!1,void Eg.resumePolling();const a=this.packets.size,s=a+42e4;this.statusMessage="Loading topology data...",this.loadProgress={loaded:a,target:s,percent:0},this.notifyListeners();try{let e=n,a=0,i=0;for(;e>t&&i<3;){const n=await this.fetchChunkWithRetry(e,zg,t);if(null!==n){if(i=0,!(n.success&&n.data&&n.data.length>0))break;{const t=this.packets.size;this.mergePackets(n.data),a+=this.packets.size-t,this.loadProgress={loaded:this.packets.size,target:Math.max(s,this.packets.size),percent:Math.min(99,Math.round(this.packets.size/s*100))},this.notifyListeners();const i=Math.min(...n.data.map(e=>e.timestamp??1/0));if(!(i!==1/0&&it&&(this.saveToStorage(),this.notifyListeners())}}catch(e){}return this.getPackets()}clear(){this.packets.clear(),this.sortedPackets=[],this.sortedDirty=!0,this.meta={oldestTimestamp:0,newestTimestamp:0,lastUpdated:0,packetCount:0,backgroundLoadComplete:!1,topologyLoadComplete:!1,dataTier:"24h",threeDayLoadComplete:!1,sevenDayLoadComplete:!1,fourteenDayLoadComplete:!1},this.clearStorage(),this.notifyListeners()}mergePacketsDirectly(e){const t=this.packets.size;this.mergePackets(e);const n=this.packets.size-t;return n>0&&(this.enforceMemoryCap(),this.saveToStorage(),this.notifyListeners()),n}mergePackets(e){let t=!1;for(const n of e){const e=n.packet_hash;if(!e)continue;const a=n.timestamp??0,s=`${e}:${a}`;this.packets.has(s)||(this.packets.set(s,n),t=!0),(0===this.meta.oldestTimestamp||athis.meta.newestTimestamp&&(this.meta.newestTimestamp=a)}t&&(this.sortedDirty=!0),this.meta.lastUpdated=Date.now(),this.meta.packetCount=this.packets.size}notifyListeners(){const e=this.getState();for(const t of this.listeners)t(e)}delay(e){return new Promise(t=>setTimeout(t,e))}async fetchChunkWithRetry(e,t,n){for(let s=0;s<3;s++)try{return await this.fetchFilteredPackets(e,t,!1,n)}catch(a){const e=2===s,t=1e3*Math.pow(2,s);a instanceof Error&&a.name,e||(this.statusMessage=`Retry in ${Math.round(t/1e3)}s...`,this.notifyListeners(),await this.delay(t))}return null}enforceMemoryCap(){if(this.packets.size<=Ig)return;const e=this.getPackets(),t=e.length-Ig;for(let n=0;nt&&(this.meta.oldestTimestamp=e[t].timestamp??0)}loadFromStorage(){if("undefined"!=typeof window)try{const e=localStorage.getItem(Lg);e&&(this.meta=JSON.parse(e));const t=localStorage.getItem(Ag);if(t){const e=JSON.parse(t);for(const t of e)t.packet_hash&&this.packets.set(t.packet_hash,t)}if(this.meta.lastUpdated>0&&Date.now()-this.meta.lastUpdated>Dg)return void this.clear();this.meta.backgroundLoadComplete=!1,this.meta.threeDayLoadComplete=!1,this.meta.sevenDayLoadComplete=!1,this.meta.fourteenDayLoadComplete=!1,this.meta.dataTier="24h";const n=37500;this.meta.topologyLoadComplete&&this.packets.size3e3?e.slice(-3e3):e;localStorage.setItem(Ag,JSON.stringify(t))}catch(e){if(e instanceof DOMException&&"QuotaExceededError"===e.name)try{localStorage.removeItem(Ag),localStorage.setItem(Lg,JSON.stringify(this.meta))}catch{}}}clearStorage(){if("undefined"!=typeof window)try{localStorage.removeItem(Ag),localStorage.removeItem(Lg)}catch(e){}}async fetchRecentPackets(e=1e3,t=!1){const n=`/api/recent_packets?limit=${e}`,a=Xp(),s={"Accept-Encoding":"gzip, deflate",Accept:"application/json"};a&&(s.Authorization=`Bearer ${a}`);const i=await fetch(n,{headers:s});if(401===i.status&&!t&&await ig())return this.fetchRecentPackets(e,!0);if(!i.ok)throw new Error(`API error: ${i.status}`);return i.json()}async fetchFilteredPackets(e,t=5e3,n=!1,a){const s=new URLSearchParams;s.set("limit",String(t)),void 0!==e&&s.set("end_timestamp",String(e-.001)),void 0!==a&&s.set("start_timestamp",String(a));const i=`/api/filtered_packets?${s}`,r=Xp(),o={"Accept-Encoding":"gzip, deflate",Accept:"application/json"};r&&(o.Authorization=`Bearer ${r}`);const l=new AbortController,c=setTimeout(()=>l.abort(),3e4);try{const a=await fetch(i,{headers:o,signal:l.signal});if(401===a.status&&!n&&await ig())return this.fetchFilteredPackets(e,t,!0);if(!a.ok)throw new Error(`API error: ${a.status}`);return a.json()}finally{clearTimeout(c)}}};function Bg(e){return{paths:e.paths,byEndpoints:new Map(e.byEndpointsEntries),canonicalPaths:new Map(e.canonicalPathsEntries),totalObservations:e.totalObservations,uniquePathCount:e.uniquePathCount}}function Vg(){return{paths:[],byEndpoints:new Map,canonicalPaths:new Map,totalObservations:0,uniquePathCount:0}}const Og=new class{constructor(){t(this,"worker",null),t(this,"listeners",new Set),t(this,"currentTopology",{edges:[],validatedEdges:[],weakEdges:[],certainEdges:[],uncertainEdges:[],edgeMap:new Map,maxPacketCount:0,maxCertainCount:0,neighborAffinity:new Map,fullAffinity:new Map,localPrefix:null,centrality:new Map,hubNodes:[],gatewayNodes:[],loops:[],loopEdgeKeys:new Set,txDelayRecommendations:new Map,pathRegistry:Vg(),edgeBetweenness:new Map,backboneEdges:[],nodeMobility:new Map,mobileNodes:[],pathHealth:[],lastHopNeighbors:[],disambiguationStats:{totalPrefixes:0,unambiguousPrefixes:0,collisionPrefixes:0,collisionRate:0,avgConfidence:0,lowConfidencePrefixes:[],highCollisionPrefixes:[],totalResolutions:0},discoveredNodes:[],viterbiStats:{totalPaths:0,pathsWithGhosts:0,avgPathCost:0,avgPathConfidence:0,observationOverrideCount:0,tracePacketsProcessed:0,pathPacketsProcessed:0,distantEdgesDiscovered:0,duplicateGroupsFound:0,duplicatePathsUnique:0,echolocationEdgesInferred:0},nodeMetrics:new Map,communityCount:0,backboneNodes:[]}),t(this,"isComputing",!1),t(this,"pendingRequest",null),t(this,"debounceTimer",null),t(this,"debounceMs",100),this.initWorker()}initWorker(){if("undefined"!=typeof window)try{this.worker=new Worker(new URL("/assets/topology.worker-B6JO1dmH.js",import.meta.url),{type:"module"}),this.worker.onmessage=e=>{this.handleWorkerMessage(e.data)},this.worker.onerror=e=>{}}catch(e){}}handleWorkerMessage(e){if(this.isComputing=!1,"error"!==e.type){var t;this.currentTopology={edges:(t=e.payload).edges??[],validatedEdges:t.validatedEdges??[],weakEdges:t.weakEdges??[],certainEdges:t.certainEdges??[],uncertainEdges:t.uncertainEdges??[],maxPacketCount:t.maxPacketCount??0,maxCertainCount:t.maxCertainCount??0,localPrefix:t.localPrefix??null,hubNodes:t.hubNodes??[],gatewayNodes:t.gatewayNodes??[],edgeMap:new Map(t.edgeMapEntries??[]),neighborAffinity:new Map(t.neighborAffinityEntries??[]),fullAffinity:new Map(t.fullAffinityEntries??[]),centrality:new Map(t.centralityEntries??[]),loops:t.loops??[],loopEdgeKeys:new Set(t.loopEdgeKeyEntries??[]),txDelayRecommendations:new Map(t.txDelayRecommendationEntries??[]),pathRegistry:t.pathRegistry?Bg(t.pathRegistry):Vg(),edgeBetweenness:new Map(t.edgeBetweennessEntries??[]),backboneEdges:t.backboneEdges??[],nodeMobility:new Map(t.nodeMobilityEntries??[]),mobileNodes:t.mobileNodes??[],pathHealth:t.pathHealth??[],lastHopNeighbors:t.lastHopNeighbors??[],disambiguationStats:t.disambiguationStats??{totalPrefixes:0,unambiguousPrefixes:0,collisionPrefixes:0,collisionRate:0,avgConfidence:0,lowConfidencePrefixes:[],highCollisionPrefixes:[],totalResolutions:0},discoveredNodes:t.discoveredNodes??[],viterbiStats:t.viterbiStats??{totalPaths:0,pathsWithGhosts:0,avgPathCost:0,avgPathConfidence:0,observationOverrideCount:0,tracePacketsProcessed:0,pathPacketsProcessed:0,distantEdgesDiscovered:0,duplicateGroupsFound:0,duplicatePathsUnique:0,echolocationEdgesInferred:0},nodeMetrics:new Map(t.nodeMetricsEntries??[]),communityCount:t.communityCount??0,backboneNodes:t.backboneNodes??[]};for(const t of this.listeners)try{t(this.currentTopology,e.computeTimeMs)}catch(n){}if(this.pendingRequest){const e=this.pendingRequest;this.pendingRequest=null,this.computeInternal(e)}}}computeInternal(e){if(!this.worker)return;this.isComputing=!0;const t={type:"compute",payload:e};this.worker.postMessage(t)}compute(e,t,n,a,s,i,r,o){const l={packets:e,neighbors:t,localHash:n,localLat:a,localLon:s,airtimeMs:i,zeroHopNeighbors:r,terrainGrid:o,enableTerrainAware:void 0!==o};this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.isComputing?this.pendingRequest=l:this.computeInternal(l)},this.debounceMs)}subscribe(e){return this.listeners.add(e),this.currentTopology.edges.length>0&&e(this.currentTopology,0),()=>{this.listeners.delete(e)}}getTopology(){return this.currentTopology}isWorking(){return this.isComputing}terminate(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.worker&&(this.worker.terminate(),this.worker=null),this.listeners.clear()}},qg=new class{constructor(){t(this,"worker",null),t(this,"listeners",new Set),t(this,"sparklines",new Map),t(this,"isComputing",!1),t(this,"lastComputeTimeMs",0),t(this,"pendingRequest",null),t(this,"debounceTimer",null),t(this,"debounceMs",150),this.initWorker()}initWorker(){if("undefined"!=typeof window)try{this.worker=new Worker(new URL("/assets/sparkline.worker-CmKhBAy5.js",import.meta.url),{type:"module"}),this.worker.onmessage=e=>{this.handleWorkerMessage(e.data)},this.worker.onerror=e=>{this.isComputing=!1,this.notifyListeners()}}catch(e){}}handleWorkerMessage(e){if(this.isComputing=!1,"error"!==e.type){if(this.sparklines=new Map(e.payload.sparklineEntries),this.lastComputeTimeMs=e.computeTimeMs,this.notifyListeners(),this.pendingRequest){const e=this.pendingRequest;this.pendingRequest=null,this.computeInternal(e.packets,e.nodeHashes)}}else this.notifyListeners()}computeInternal(e,t){if(!this.worker)return;if(0===t.length)return this.isComputing=!1,void this.notifyListeners();this.isComputing=!0,this.notifyListeners();const n={type:"compute",payload:{packets:e,nodeHashes:t}};this.worker.postMessage(n)}notifyListeners(){for(const t of this.listeners)try{t(this.sparklines,this.isComputing)}catch(e){}}compute(e,t){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.isComputing?this.pendingRequest={packets:e,nodeHashes:t}:this.computeInternal(e,t)},this.debounceMs)}getSparkline(e){return this.sparklines.get(e)??[]}getAllSparklines(){return this.sparklines}hasSparkline(e){return this.sparklines.has(e)}isWorking(){return this.isComputing}getLastComputeTime(){return this.lastComputeTimeMs}subscribe(e){return this.listeners.add(e),e(this.sparklines,this.isComputing),()=>{this.listeners.delete(e)}}clear(){this.sparklines.clear(),this.notifyListeners()}terminate(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.worker&&(this.worker.terminate(),this.worker=null),this.listeners.clear()}},$g=new class{constructor(){t(this,"ws",null),t(this,"connectionState","disconnected"),t(this,"reconnectAttempts",0),t(this,"pingIntervalId",null),t(this,"lastPongTime",Date.now()),t(this,"reconnectTimeoutId",null),t(this,"packetListeners",new Set),t(this,"statsListeners",new Set),t(this,"systemStatsListeners",new Set),t(this,"packetStatsListeners",new Set),t(this,"connectionListeners",new Set),t(this,"unsubscribeTokenChange",null),t(this,"wsSupported",!0)}buildWsUrl(){const e=Xp(),t=Hp(),n=new URLSearchParams;e&&n.set("token",e),t&&n.set("client_id",t);const a=n.toString()?`?${n.toString()}`:"";return`${"https:"===window.location.protocol?"wss:":"ws:"}//${window.location.host}/ws/packets${a}`}connect(){var e,t;if((null==(e=this.ws)?void 0:e.readyState)!==WebSocket.OPEN&&(null==(t=this.ws)?void 0:t.readyState)!==WebSocket.CONNECTING&&this.wsSupported){this.setConnectionState("connecting");try{const e=this.buildWsUrl();this.ws=new WebSocket(e),this.ws.onopen=this.handleOpen.bind(this),this.ws.onmessage=this.handleMessage.bind(this),this.ws.onerror=this.handleError.bind(this),this.ws.onclose=this.handleClose.bind(this),this.unsubscribeTokenChange||(this.unsubscribeTokenChange=Up(e=>{e&&"connected"===this.connectionState&&(this.disconnect(),this.connect())}))}catch(n){this.wsSupported=!1,this.setConnectionState("disconnected")}}}disconnect(){this.clearPingInterval(),this.clearReconnectTimeout(),this.ws&&(this.ws.onopen=null,this.ws.onmessage=null,this.ws.onerror=null,this.ws.onclose=null,this.ws.readyState!==WebSocket.OPEN&&this.ws.readyState!==WebSocket.CONNECTING||this.ws.close(1e3,"Client disconnect"),this.ws=null),this.setConnectionState("disconnected"),this.reconnectAttempts=0}isConnected(){var e;return(null==(e=this.ws)?void 0:e.readyState)===WebSocket.OPEN}getConnectionState(){return this.connectionState}isSupported(){return this.wsSupported}resetSupported(){this.wsSupported||(this.wsSupported=!0,this.reconnectAttempts=0)}send(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return!1;try{return this.ws.send(JSON.stringify(e)),!0}catch(t){return!1}}onPacket(e){return this.packetListeners.add(e),()=>this.packetListeners.delete(e)}onStats(e){return this.statsListeners.add(e),()=>this.statsListeners.delete(e)}onSystemStats(e){return this.systemStatsListeners.add(e),()=>this.systemStatsListeners.delete(e)}onPacketStats(e){return this.packetStatsListeners.add(e),()=>this.packetStatsListeners.delete(e)}onConnectionChange(e){return this.connectionListeners.add(e),e(this.connectionState,this.reconnectAttempts),()=>this.connectionListeners.delete(e)}handleOpen(){this.setConnectionState("connected"),this.reconnectAttempts=0,this.lastPongTime=Date.now();const e=Xp();e&&this.ws&&this.ws.send(JSON.stringify({type:"auth",token:e})),this.startPingInterval()}handleMessage(e){try{const t=JSON.parse(e.data);switch(t.type){case"packet":this.notifyPacketListeners(t.data);break;case"stats":{const e=t.data;e&&"noise_floor_dbm"in e&&this.notifyStatsListeners(e),(null==e?void 0:e.packet_stats)&&this.notifyPacketStatsListeners(e.packet_stats),(null==e?void 0:e.system_stats)&&this.notifySystemStatsListeners(e.system_stats);break}case"packet_stats":{const e=t.data;this.notifyPacketStatsListeners(e);break}case"system_stats":this.notifySystemStatsListeners(t.data);break;case"ping":this.lastPongTime=Date.now(),this.send({type:"pong"});break;case"pong":this.lastPongTime=Date.now()}}catch(t){}}handleError(e){}handleClose(e){this.clearPingInterval(),1e3!==e.code?(1006===e.code&&this.reconnectAttempts,this.scheduleReconnect()):this.setConnectionState("disconnected")}setConnectionState(e){if(this.connectionState!==e){this.connectionState=e;for(const n of this.connectionListeners)try{n(e,this.reconnectAttempts)}catch(t){}}}notifyPacketListeners(e){for(const n of this.packetListeners)try{n(e)}catch(t){}}notifyStatsListeners(e){for(const n of this.statsListeners)try{n(e)}catch(t){}}notifySystemStatsListeners(e){for(const n of this.systemStatsListeners)try{n(e)}catch(t){}}notifyPacketStatsListeners(e){for(const n of this.packetStatsListeners)try{n(e)}catch(t){}}startPingInterval(){this.clearPingInterval(),this.pingIntervalId=setInterval(()=>{var e;(null==(e=this.ws)?void 0:e.readyState)===WebSocket.OPEN&&(this.send({type:"ping"}),Date.now()-this.lastPongTime>6e4&&(this.disconnect(),this.connect()))},3e4)}async verifyConnection(e=5e3){return!(!this.ws||this.ws.readyState!==WebSocket.OPEN)&&new Promise(t=>{const n=Date.now(),a=this.lastPongTime;this.send({type:"ping"});const s=setInterval(()=>{this.lastPongTime>a?(clearInterval(s),t(!0)):Date.now()-n>e&&(clearInterval(s),t(!1))},100)})}clearPingInterval(){this.pingIntervalId&&(clearInterval(this.pingIntervalId),this.pingIntervalId=null)}scheduleReconnect(){if(this.reconnectAttempts>=20)return this.wsSupported=!1,void this.setConnectionState("disconnected");this.setConnectionState("reconnecting");const e=Math.min(1e3*Math.pow(2,Math.min(this.reconnectAttempts,5)),3e4);this.reconnectAttempts++,this.reconnectTimeoutId=setTimeout(()=>{this.reconnectTimeoutId=null,this.connect()},e)}clearReconnectTimeout(){this.reconnectTimeoutId&&(clearTimeout(this.reconnectTimeoutId),this.reconnectTimeoutId=null)}terminate(){this.disconnect(),this.unsubscribeTokenChange&&(this.unsubscribeTokenChange(),this.unsubscribeTokenChange=null),this.packetListeners.clear(),this.statsListeners.clear(),this.systemStatsListeners.clear(),this.packetStatsListeners.clear(),this.connectionListeners.clear()}},Ug=3e4,Wg=new class{constructor(){t(this,"staged",new Map),t(this,"recentlyConfirmed",new Map),t(this,"listeners",new Set),t(this,"pruneIntervalId",null),this.startPruneInterval()}stage(e){const t=e.packet_hash;if(!t)return;if(this.staged.has(t))return;const n=this.recentlyConfirmed.get(t);n&&Date.now()-n=100&&this.removeOldest(),this.staged.set(t,{packet:e,stagedAt:Date.now()}),this.notifyListeners())}confirm(e){this.staged.delete(e)&&this.notifyListeners()}confirmBatch(e){let t=!1;const n=Date.now();for(const a of e)this.recentlyConfirmed.set(a,n),this.staged.delete(a)&&(t=!0);if(this.recentlyConfirmed.size>200){const e=n-Ug;for(const[t,n]of this.recentlyConfirmed)n(t.packet.timestamp??0)-(e.packet.timestamp??0))}isPending(e){return!!e&&this.staged.has(e)}getPendingCount(){return this.staged.size}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}clear(){this.staged.size>0&&(this.staged.clear(),this.notifyListeners())}terminate(){this.stopPruneInterval(),this.staged.clear(),this.listeners.clear()}notifyListeners(){const e=this.getPendingPackets();for(const n of this.listeners)try{n(e)}catch(t){}}pruneExpired(){const e=Date.now();let t=!1;for(const[n,a]of this.staged)e-a.stagedAt>Ug&&(this.staged.delete(n),t=!0);t&&this.notifyListeners()}removeOldest(){let e=null,t=1/0;for(const[n,a]of this.staged)a.stagedAtthis.pruneExpired(),1e4))}stopPruneInterval(){this.pruneIntervalId&&(clearInterval(this.pruneIntervalId),this.pruneIntervalId=null)}},Hg=b(e=>({connectionState:"disconnected",isSupported:!0,reconnectAttempt:0,lastConnected:null,initialize:()=>{$g.onConnectionChange((t,n)=>{e(e=>({connectionState:t,reconnectAttempt:n??0,isSupported:$g.isSupported(),lastConnected:"connected"===t?Date.now():e.lastConnected}))}),$g.connect()}})),Yg=.05,Gg=1e3,Kg="terrarium";function Xg(e,t,n){try{return e.queryTerrainElevation({lng:t,lat:n})??0}catch{return 0}}const Jg=b((e,t)=>({terrainGrid:null,isLoading:!1,error:null,lastLoadedAt:null,cachedBounds:null,terrainDisambiguationEnabled:!0,loadTerrain:async(n,a)=>{const s=t();if(!(s.isLoading||(i=s.cachedBounds,r=n,i&&i.minLat<=r.minLat&&i.maxLat>=r.maxLat&&i.minLng<=r.minLng&&i.maxLng>=r.maxLng))){var i,r;e({isLoading:!0,error:null});try{a.getTerrain()||(a.getSource(Kg)||(a.addSource(Kg,{type:"raster-dem",tiles:["https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png"],encoding:"terrarium",tileSize:256}),await new Promise((e,t)=>{const n=setTimeout(()=>t(new Error("Terrain source load timeout")),1e4),s=t=>{t.sourceId===Kg&&t.isSourceLoaded&&(clearTimeout(n),a.off("sourcedata",s),e())};a.on("sourcedata",s)})),a.setTerrain({source:Kg}),await new Promise(e=>setTimeout(e,500)));const t=await async function(e,t){const{minLat:n,maxLat:a,minLng:s,maxLng:i}=t;let r=Math.ceil((i-s)/.001),o=Math.ceil((a-n)/.001);r>Gg&&(r=Gg),o>Gg&&(o=Gg);const l=(i-s)/r,c=(a-n)/o,u=Math.max(l,c),d=new Float32Array(r*o);let h=0;for(let m=0;msetTimeout(e,0))}}return{origin:[n,s],cellSize:u,width:r,height:o,elevations:d}}(a,n);e({terrainGrid:t,isLoading:!1,lastLoadedAt:Date.now(),cachedBounds:n})}catch(o){const t=o instanceof Error?o.message:"Unknown error loading terrain";e({isLoading:!1,error:t})}}},preloadFromNodes:async(e,n)=>{const a=function(e){const t=e.filter(e=>void 0!==e.latitude&&void 0!==e.longitude&&(0!==e.latitude||0!==e.longitude));if(0===t.length)return null;let n=1/0,a=-1/0,s=1/0,i=-1/0;for(const r of t)n=Math.min(n,r.latitude),a=Math.max(a,r.latitude),s=Math.min(s,r.longitude),i=Math.max(i,r.longitude);return{minLat:n-Yg,maxLat:a+Yg,minLng:s-Yg,maxLng:i+Yg}}(e);a&&await t().loadTerrain(a,n)},clearTerrain:()=>{e({terrainGrid:null,cachedBounds:null,lastLoadedAt:null,error:null})},setTerrainDisambiguationEnabled:t=>{e({terrainDisambiguationEnabled:t})},getTerrainGridForDisambiguation:()=>{const e=t();return e.terrainDisambiguationEnabled?e.terrainGrid:null}})),Zg="pymc-stealth-location";function Qg(e){if("undefined"!=typeof window)try{localStorage.setItem(Zg,JSON.stringify(e))}catch{}}function ef(e){return!isNaN(e)&&e>=-90&&e<=90}function tf(e){return!isNaN(e)&&e>=-180&&e<=180}const nf=function(){if("undefined"==typeof window)return{};try{const e=localStorage.getItem(Zg);if(!e)return{};const t=JSON.parse(e);if("number"==typeof t.latitude&&"number"==typeof t.longitude&&"boolean"==typeof t.enabled&&ef(t.latitude)&&tf(t.longitude))return t}catch{}return{}}(),af=b((e,t)=>({latitude:nf.latitude??null,longitude:nf.longitude??null,enabled:nf.enabled??!1,setLocation:(n,a)=>{ef(n)&&tf(a)&&(e({latitude:n,longitude:a}),Qg({latitude:n,longitude:a,enabled:t().enabled}))},enable:()=>{const{latitude:n,longitude:a}=t();null!==n&&null!==a&&(e({enabled:!0}),Qg({latitude:n,longitude:a,enabled:!0}))},disable:()=>{e({enabled:!1});const{latitude:n,longitude:a}=t();null!==n&&null!==a&&Qg({latitude:n,longitude:a,enabled:!1})},clear:()=>{e({latitude:null,longitude:null,enabled:!1}),function(){if("undefined"!=typeof window)try{localStorage.removeItem(Zg)}catch{}}()},getEffectiveLocation:()=>{const{latitude:e,longitude:n,enabled:a}=t();return a&&null!==e&&null!==n?{latitude:e,longitude:n}:null},isActive:()=>{const{latitude:e,longitude:n,enabled:a}=t();return a&&null!==e&&null!==n}}));function sf(e,t,n,a){return!t&&a>=3?"offline":n?"connected"!==e&&t||a>0&&a<3?"degraded":"connected":"offline"}const rf=b((e,t)=>({wsState:"disconnected",wsReconnectAttempt:0,restHealthy:!0,lastSuccessfulFetch:null,consecutiveFailures:0,authValid:!0,authExpiresIn:null,health:"connected",bannerDismissed:!1,isInitializing:!0,initialize:()=>{$g.onConnectionChange((n,a)=>{const{restHealthy:s,authValid:i,consecutiveFailures:r,health:o,isInitializing:l}=t(),c=l&&"connected"===n,u=sf(n,s,i,r);e({wsState:n,wsReconnectAttempt:a??0,health:u,isInitializing:!c&&l,bannerDismissed:(u===o||"connected"!==u)&&t().bannerDismissed})}),t().updateAuthState(),setTimeout(()=>{t().isInitializing&&e({isInitializing:!1})},1e4),setInterval(()=>{t().updateAuthState()},3e4)},updateRestHealth:n=>{const{wsState:a,authValid:s,consecutiveFailures:i,health:r}=t(),o=n?0:i+1,l=n||o<3,c=n?Date.now():t().lastSuccessfulFetch,u=sf(a,l,s,o);e({restHealthy:l,lastSuccessfulFetch:c,consecutiveFailures:o,health:u,bannerDismissed:"connected"!==u&&u===r&&t().bannerDismissed})},updateAuthState:()=>{const n=Qp()&&!tg(),a=ng(),{wsState:s,restHealthy:i,consecutiveFailures:r,health:o}=t(),l=sf(s,i,n,r);e({authValid:n,authExpiresIn:a>0?a:null,health:l,bannerDismissed:l===o&&t().bannerDismissed})},dismissBanner:()=>{e({bannerDismissed:!0})}})),of=3,lf=2,cf=15,uf=6,df=3,hf=0,mf=1,pf=2,gf=3,ff={[hf]:"T_FLOOD",[mf]:"FLOOD",[pf]:"DIRECT",[gf]:"T_DIRECT"},yf=0,bf=1,vf=2,wf=3,kf=4,xf=5,Sf=6,jf=7,Cf=8,Tf=9,Mf=10,Pf=11,Ef=15,Af={REQ:0,RESPONSE:1,ADVERT:4,GRP_TXT:5,GRP_DATA:6,ANON_REQ:7,TRACE:9},Lf={[yf]:"REQ",[bf]:"RESPONSE",[vf]:"TXT_MSG",[wf]:"ACK",[kf]:"ADVERT",[xf]:"GRP_TXT",[Sf]:"GRP_DATA",[jf]:"ANON_REQ",[Cf]:"PATH",[Tf]:"TRACE",[Mf]:"MULTIPART",[Pf]:"CONTROL",[Ef]:"RAW_CUSTOM"},Df=1,zf=32,Nf=64,Ff=64,Rf=4;function If(e){return 1===e||0===e}function _f(e){return 2===e||3===e}function Bf(e){return 0===e||3===e}function Vf(e){return ff[e]??`UNKNOWN(${e})`}function Of(e){return Lf[e]??`UNKNOWN(${e})`}function qf(e){const t=e.replace(/^0x/i,"").replace(/\s/g,"");if(t.length%2!=0)throw new Error("Invalid hex string: odd number of characters");const n=new Uint8Array(t.length/2);for(let a=0;ae.toString(16).padStart(2,"0")).join("");return t&&(a=a.toUpperCase()),n&&(a="0x"+a),a}function Uf(e,t=!0){const n=(255&e).toString(16).padStart(2,"0");return t?n.toUpperCase():n}function Wf(e,t,n,a){if(e+t>n)throw new Error(a)}function Hf(e){if(e>256)throw new Error(`payload too large: ${e} > 256`)}function Yf(){return"undefined"!=typeof crypto&&void 0!==crypto.subtle&&"function"==typeof crypto.subtle.digest}const Gf=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]),Kf=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);function Xf(e,t){return(e>>>t|e<<32-t)>>>0}function Jf(e,t){let n=e[0],a=e[1],s=e[2],i=e[3],r=e[4],o=e[5],l=e[6],c=e[7];for(let u=0;u<64;u++){if(u>=16){const e=Xf(t[u-15&15],7)^Xf(t[u-15&15],18)^t[u-15&15]>>>3,n=Xf(t[u-2&15],17)^Xf(t[u-2&15],19)^t[u-2&15]>>>10;t[15&u]=t[15&u]+e+t[u-7&15]+n>>>0}const e=c+(Xf(r,6)^Xf(r,11)^Xf(r,25))+(r&o^~r&l)+Gf[u]+t[15&u]>>>0,d=n&a^n&s^a&s;c=l,l=o,o=r,r=i+e>>>0,i=s,s=a,a=n,n=e+((Xf(n,2)^Xf(n,13)^Xf(n,22))+d>>>0)>>>0}e[0]=e[0]+n>>>0,e[1]=e[1]+a>>>0,e[2]=e[2]+s>>>0,e[3]=e[3]+i>>>0,e[4]=e[4]+r>>>0,e[5]=e[5]+o>>>0,e[6]=e[6]+l>>>0,e[7]=e[7]+c>>>0}function Zf(e){const t=new Uint32Array(Kf),n=new Uint32Array(16),a=8*e.length,s=e.length+9+63&-64,i=new Uint8Array(s);i.set(e),i[e.length]=128;const r=new DataView(i.buffer);r.setUint32(s-4,a,!1);for(let c=0;c>=1}return n}function sy(e){let t=e[13];e[13]=e[9],e[9]=e[5],e[5]=e[1],e[1]=t,t=e[2],e[2]=e[10],e[10]=t,t=e[6],e[6]=e[14],e[14]=t,t=e[3],e[3]=e[7],e[7]=e[11],e[11]=e[15],e[15]=t}function iy(e){for(let t=0;t<16;t++)e[t]=ty[e[t]]}function ry(e,t){for(let n=0;n<16;n++)e[n]^=t[n]}function oy(e){for(let t=0;t<4;t++){const n=4*t,a=e[n],s=e[n+1],i=e[n+2],r=e[n+3];e[n]=ay(14,a)^ay(11,s)^ay(13,i)^ay(9,r),e[n+1]=ay(9,a)^ay(14,s)^ay(11,i)^ay(13,r),e[n+2]=ay(13,a)^ay(9,s)^ay(14,i)^ay(11,r),e[n+3]=ay(11,a)^ay(13,s)^ay(9,i)^ay(14,r)}}function ly(e,t){const n=new Uint8Array(e);ry(n,t[10]);for(let a=9;a>=1;a--)sy(n),iy(n),ry(n,t[a]),oy(n);return sy(n),iy(n),ry(n,t[0]),n}function cy(e,t){const n=function(e){const t=[],n=new Uint8Array(176);n.set(e.slice(0,16));for(let a=16;a<176;a+=4){let e=n[a-4],t=n[a-3],s=n[a-2],i=n[a-1];if(a%16==0){const n=e;e=ey[t]^ny[a/16-1],t=ey[s],s=ey[i],i=ey[n]}n[a]=n[a-16]^e,n[a+1]=n[a-15]^t,n[a+2]=n[a-14]^s,n[a+3]=n[a-13]^i}for(let a=0;a<11;a++)t.push(n.slice(16*a,16*(a+1)));return t}(e),a=new Uint8Array(t.length);for(let s=0;s>>0}function my(e,t){return e[t]|e[t+1]<<8}function py(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0}function gy(e,t,n){t[n]=255&e,t[n+1]=e>>8&255}function fy(e){return(e instanceof Uint8Array?Array.from(e):e).map(e=>Uf(e,!0)).join("->")}const yy={name:"Public",secret:"8b3387e9c5cdea6ac9e5edbaa115cd72"},by=["southbay","south-bay","bot","ventura","weather","wardrive","test","sbcountymesh","sb-county-mesh","sbcounty","sb-county","meshbud","mesh-bud","ai-bot","aibot","hdmesh","hd-mesh","hdme","hdme7","hdme7yard","hdmeyard","hdmeshtayrd","hdmestayrd","hdmestyard","hdmetayrd","hdmeshtnyard","mustard","socalmesh","socal-mesh","meshla","mesh-la","lamesh","la-mesh","westcoast","west-coast","wcmesh","wc-mesh","eastcoast","east-coast","midwest","southwest","northwest","northeast","southeast","california","cali","santaclarita","santa-clarita","scv","newhall","valencia","saugus","castaic","palmdale","lancaster","antelopevalley","antelope-valley","avmesh","av-mesh","highdesert","high-desert","mojave","victorville","hesperia","barstow","pomona","claremont","glendora","azusa","covina","westcovina","west-covina","walnut","diamondbar","diamond-bar","whittier","brea","yorbalinda","yorba-linda","montebello","montereypark","monterey-park","alhambra","arcadia","monrovia","duarte","hermosabeach","hermosa-beach","manhattanbeach","manhattan-beach","redondobeach","redondo-beach","palosverdes","palos-verdes","sanpedro","san-pedro","ojai","fillmore","santapaula","santa-paula","porthueneme","port-hueneme","general","public","main","default","chat","local","mesh","network","emergency","sos","help","news","info","status","alerts","announce","random","offtopic","off-topic","lobby","lounge","hangout","testing","dev","development","beta","alpha","experimental","personaltest","personal-test","mytest","my-test","testchannel","test-channel","meshcore","mesh-core","meshtastic","lora","lo-ra","lorawan","lora-wan","radio","ham","amateur","hamradio","ham-radio","amateurradio","repeater","repeaters","gateway","node","nodes","rf","rfmesh","offgrid","off-grid","prepper","preppers","emcomm","ares","races","socal","so-cal","southerncalifornia","southern-california","losangeles","los-angeles","la","laarea","la-area","greaterla","sfv","sfvalley","sf-valley","sanfernandovalley","san-fernando-valley","sanfernando","san-fernando","valley","thevalley","the-valley","westla","west-la","eastla","east-la","southla","south-la","dtla","downtown","downtownla","downtown-la","hollywood","beverlyhills","beverly-hills","santamonica","santa-monica","culvercity","culver-city","marinadelrey","marina-del-rey","longbeach","long-beach","torrance","carson","compton","inglewood","pasadena","glendale","burbank","noho","northhollywood","north-hollywood","encino","tarzana","woodland","woodlandhills","woodland-hills","calabasas","malibu","topanga","agoura","agourahills","agoura-hills","thousandoaks","thousand-oaks","simivalley","simi-valley","simi","venturacounty","ventura-county","oxnard","camarillo","moorpark","santabarbara","santa-barbara","sb","goleta","carpinteria","orangecounty","orange-county","oc","irvine","anaheim","fullerton","costamesa","costa-mesa","newportbeach","newport-beach","huntingtonbeach","inlandempire","inland-empire","ie","riverside","sanbernardino","san-bernardino","ontario","rancho","ranchocucamonga","rancho-cucamonga","fontana","corona","palmsprings","palm-springs","palmdesert","palm-desert","coachella","temecula","murrieta","hemet","perris","menifee","sandiego","san-diego","sd","sdmesh","sd-mesh","norcal","nor-cal","northerncalifornia","northern-california","bayarea","bay-area","sfbay","sf-bay","sfbayarea","sf-bay-area","sanfrancisco","san-francisco","sf","sfmesh","sf-mesh","oakland","berkeley","eastbay","east-bay","alameda","sanjose","san-jose","sj","southbay","south-bay","siliconvalley","silicon-valley","santaclara","santa-clara","sunnyvale","mountainview","mountain-view","paloalto","palo-alto","menlopark","menlo-park","redwoodcity","redwood-city","fremont","hayward","unioncity","union-city","newark","milpitas","santacruz","santa-cruz","watsonville","monterey","montereybay","monterey-bay","salinas","carmel","pacificgrove","pacific-grove","sacramento","sac","sactown","westsac","west-sac","roseville","folsom","fresno","bakersfield","stockton","modesto","visalia","seattle","seattlemesh","seattle-mesh","pnw","pacificnorthwest","pacific-northwest","portland","pdx","portlandmesh","portland-mesh","oregon","denver","denvermesh","denver-mesh","colorado","boulder","fortcollins","austin","austinmesh","austin-mesh","atx","texas","sanantonio","san-antonio","dallas","dfw","dallasmesh","dallas-mesh","fortworth","fort-worth","houston","houstonmesh","houston-mesh","htx","phoenix","phoenixmesh","phoenix-mesh","arizona","az","tucson","mesa","tempe","lasvegas","las-vegas","vegas","vegasmesh","vegas-mesh","nevada","henderson","saltlake","salt-lake","slc","saltlakecity","salt-lake-city","utah","chicago","chicagomesh","chicago-mesh","chitown","illinois","detroit","detroitmesh","detroit-mesh","michigan","annarbor","ann-arbor","minneapolis","twincities","twin-cities","minnesota","stpaul","st-paul","atlanta","atlantamesh","atlanta-mesh","atl","georgia","miami","miamimesh","miami-mesh","florida","tampa","orlando","jacksonville","boston","bostonmesh","boston-mesh","massachusetts","cambridge","newyork","new-york","nyc","nycmesh","nyc-mesh","brooklyn","manhattan","queens","newjersey","new-jersey","nj","jersey","philly","philadelphia","philadelphiamesh","philadelphia-mesh","pennsylvania","dc","washingtondc","washington-dc","dmv","nova","maryland","virginia","raleigh","durham","rdu","triangle","northcarolina","north-carolina","charlotte","clt","southcarolina","south-carolina","nashville","tennessee","memphis","knoxville","neworleans","new-orleans","nola","louisiana","hawaii","oahu","honolulu","maui","bigisland","big-island","alaska","anchorage","fairbanks","canada","toronto","vancouver","montreal","calgary","edmonton","ottawa","uk","london","manchester","birmingham","edinburgh","glasgow","bristol","germany","berlin","munich","hamburg","frankfurt","cologne","france","paris","lyon","marseille","spain","madrid","barcelona","italy","rome","milan","netherlands","amsterdam","rotterdam","australia","sydney","melbourne","brisbane","perth","adelaide","newzealand","new-zealand","auckland","wellington","japan","tokyo","osaka","kyoto","southkorea","south-korea","korea","seoul","taiwan","taipei","singapore","hongkong","hong-kong","india","mumbai","delhi","bangalore","brazil","saopaulo","sao-paulo","rio","mexico","mexicocity","mexico-city","guadalajara","tijuana","gps","location","tracking","tracker","position","coordinates","sensor","sensors","telemetry","data","iot","aprs","beacon","beacons","ping","pings","debug","admin","ops","operations","monitor","monitoring","security","secure","private","encrypted","hiking","camping","outdoors","outdoor","backcountry","trails","offroad","off-road","overlanding","jeep","offroading","sailing","boating","marine","maritime","aviation","flying","pilots","drone","drones","weather","wx","storm","storms","skywarn","traffic","commute","transit","community","group","team","club","family","friends","neighbors","neighborhood","block","street","local","town","city","county","region","north","south","east","west","central","downtown","uptown","midtown","home","house","cabin","ranch","farm","test1","test2","test3","test4","test5","channel1","channel2","channel3","mesh1","mesh2","mesh3","group1","group2","group3","team1","team2","team3","net1","net2","net3","relay","relays","link","links","hub","hubs","core","backbone","qso","ragchew","net","nets","roundtable","simplex","duplex","vhf","uhf","hf","2m","70cm","33cm","23cm","900mhz","915mhz","ism","ism-band","ism915","ism868","license-free","event","events","exercise","drill","training","practice","race","marathon","cycling","running","triathlon","ironman","festival","concert","gathering","meetup","meet-up","convention","hamfest","ham-fest","field-day","fieldday","winter-field-day","sota","pota","summits","parks","parks-on-the-air","2024","2025","2026","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec","winter","spring","summer","fall","autumn","mountain","mountains","hills","peak","summit","ridge","canyon","beach","coast","coastal","shore","bay","lake","river","creek","park","forest","woods","desert","island","peninsula","urban","suburban","rural","metro","area","zone","sector","base","mobile","portable","handheld","fixed","station","primary","secondary","backup","alternate","spare","alpha","bravo","charlie","delta","echo","foxtrot","red","blue","green","yellow","orange","purple","black","white","trace","traces","log","logs","metrics","stats","statistics","raw","stream","feed","live","realtime","real-time","sync","replication","mirror","copy","archive","open","closed","free","premium","pro","plus","lite","basic","new","old","legacy","current","next","future","one","two","three","four","five","six","seven","eight","nine","ten","hamradio","ham-radio","amateurradio","amateur-radio","arrl","dxcc","dxing","morsecode","morse-code","fldigi","js8call","winlink","vara","pactor","packet","ax25","aprsmesh","qrp","qro","qrz","qsl","qth","ragchew","rag-chew","elmer","elmers","technician","amateur","microwave","satellite","ariss","amsat","cubesat","sdr","rtlsdr","rtl-sdr","hackrf","portapack","yaesu","icom","kenwood","elecraft","flexradio","alinco","baofeng","quansheng","antennas","dipole","vertical","yagi","efhw","endfed","wwff","iota","contesting","cwops","auxcomm","satern","maker","makers","makerspace","maker-space","hackerspace","hacker-space","fablab","fab-lab","doityourself","homebrew","home-brew","fromscratch","arduino","esp32","esp8266","stm32","teensy","pico","rp2040","attiny","raspberrypi","raspberry-pi","rpi","beaglebone","beagle-bone","orangepi","orange-pi","kicad","eagle","altium","oshpark","jlcpcb","pcbway","soldering","throughhole","oscilloscope","multimeter","logicanalyzer","logic-analyzer","testbench","3dprinting","3d-printing","3dprint","printer","prusa","ender","creality","bambu","voron","lasercutter","laser-cutter","woodworking","metalworking","welding","resin","fdm","sla","fusion360","fusion-360","freecad","openscad","solidworks","programming","coding","software","developer","developers","devops","sysadmin","linux","unix","bsd","freebsd","openbsd","netbsd","macos","windows","android","ios","python","javascript","typescript","rust","golang","java","kotlin","swift","ruby","perl","csharp","dotnet","haskell","lisp","clojure","elixir","erlang","react","angular","svelte","nodejs","deno","nextjs","nuxt","docker","kubernetes","terraform","ansible","puppet","vagrant","github","gitlab","bitbucket","opensource","open-source","foss","floss","homelab","home-lab","selfhost","self-host","selfhosted","self-hosted","homelabbers","homeassistant","home-assistant","hass","openhab","domoticz","nodered","node-red","mqtt","zigbee","zwave","thread","wifi","bluetooth","rfid","infosec","cybersec","cybersecurity","cyber-security","netsec","opsec","hacking","hacker","hackers","pentest","pentesting","redteam","red-team","blueteam","blue-team","capture-the-flag","bugbounty","bug-bounty","vuln","exploit","malware","reverse","defcon","blackhat","bsides","shmoocon","derbycon","toorcon","hacktheplanet","lockpicking","locksport","toool","deviant","socialeng","social-eng","osint","privacy","anonymity","encryption","crypto","signal","hiking","hiker","hikers","backpacking","backpacker","thru-hike","thruhike","camper","campers","glamping","dispersed","primitive","wilderness","climbing","climber","climbers","rockclimbing","rock-climbing","bouldering","trad","sport","mountaineering","alpine","peaks","fourteeners","14ers","highpoints","skiing","skier","snowboard","snowboarder","backcountry-ski","touring","splitboard","kayak","kayaking","kayaker","canoe","canoeing","paddle","paddling","paddleboard","surfing","surfer","surfers","bodyboard","longboard","shortboard","waves","scuba","freedive","freediving","snorkel","underwater","spearfishing","fishing","angler","anglers","flyfishing","fly-fishing","trout","hunting","hunter","hunters","archery","bowhunting","bow-hunting","rifle","shotgun","cyclist","biking","bicycle","bicycling","roadbike","road-bike","mountainbike","mountain-bike","mountainbiking","mountain-biking","trailriding","ebike","e-bike","ebikes","electric-bike","peloton","strava","zwift","gravel","gravelbike","gravel-bike","bikepacking","bike-packing","randonneur","fixie","fixedgear","fixed-gear","singlespeed","single-speed","commuter","offroading","off-roading","fourwheeling","4wd","awd","jeeping","wrangler","gladiator","tacoma","runner","4runner","overland","overlander","rooftoptent","rooftop-tent","expedition","utv","sxs","sidebyside","side-by-side","rzr","canam","polaris","dirtbike","dirt-bike","motocross","enduro","dualsport","dual-sport","motorcycle","moto","harley","sportbike","cruiser","rving","motorhome","campervan","camper-van","vanlife","van-life","skoolie","trucker","trucking","diesel","semi","bigrig","big-rig","pilot","pilots","flying","flight","airplane","aircraft","planes","cessna","piper","cirrus","beechcraft","mooney","bonanza","skyhawk","helicopter","heli","rotor","rotorcraft","chopper","robinson","glider","gliding","soaring","sailplane","paraglider","paragliding","hangglider","drones","uav","uas","fpv","quadcopter","multirotor","mavic","phantom","rocketry","rockets","hpr","nar","tripoli","model-rocket","amateur-rocket","spacex","nasa","esa","starlink","starship","falcon","artemis","boat","boats","boater","boaters","yachting","yacht","sail","sailor","powerboat","speedboat","fishing-boat","pontoon","jetski","jet-ski","pwc","waverunner","marina","harbor","harbour","dock","pier","anchorage","mooring","liveaboard","cruising","bluewater","blue-water","inshore","intracoastal","marine-radio","marineradio","ais","chartplotter","navionics","opencpn","prepper","preppers","prepping","survival","survivalist","shtf","teotwawki","bol","bugout","bug-out","bugin","bug-in","edc","everyday-carry","loadout","firstaid","first-aid","trauma","tccc","stopthebleed","aed","waterpurification","water-purification","berkey","sawyer","lifestraw","foodstorage","food-storage","canning","dehydrating","freezedried","freeze-dried","battery","generator","inverter","offgrid","off-grid","griddown","grid-down","communications","gmrs","frs","murs","citizens-band","shortwave","homestead","homesteading","homesteader","farming","farmer","farmers","ranching","garden","gardening","gardener","permaculture","organic","regenerative","sustainable","chickens","poultry","goats","sheep","cattle","pigs","livestock","beekeeping","bees","apiary","greenhouse","hydroponics","aquaponics","vertical-farm","indoor-garden","growroom","grow-room","meteorology","stormchasing","storm-chasing","tornado","hurricane","earthquake","quake","seismic","tsunami","volcano","volcanic","geology","geologist","astronomy","stargazing","telescope","astrophotography","astrophoto","deepsky","deep-sky","citizen-science","citizenscience","research","science","stem","education","learning","gaming","gamer","gamers","videogames","video-games","pcgaming","pc-gaming","console","esports","e-sports","competitive","tournament","lan-party","retrogaming","minecraft","terraria","valheim","rust-game","dayz","tarkov","pubg","fortnite","apex","virtualreality","virtual-reality","augmentedreality","augmented-reality","oculus","tabletop","boardgames","board-games","dungeons-dragons","ttrpg","pathfinder","musician","musicians","bands","livemusic","live-music","concerts","guitar","guitarist","bassist","drums","drummer","keyboard","synth","synthesizer","production","producer","producers","beatmaking","beat-making","ableton","flstudio","audiophile","hifi","hi-fi","vinyl","records","turntable","headphones","speakers","podcast","podcasting","podcaster","streaming","streamer","twitch","youtube","content","photography","photographer","photographers","photog","cameras","dslr","mirrorless","canon","nikon","fuji","fujifilm","panasonic","olympus","leica","hasselblad","portrait","wildlife","macro","nightsky","night-sky","timelapse","videography","videographer","filmmaker","filmmaking","cinematography","editing","premiere","davinci","finalcut","final-cut","aftereffects","after-effects","vfx","artist","artists","artwork","creative","creatives","designer","designers","illustration","illustrator","drawing","sketch","sketching","digital-art","digitalart","graphicdesign","graphic-design","uiux","ui-ux","webdesign","web-design","animation","animator","motion","motiongraphics","motion-graphics","3dart","3d-art","blender","foodie","foodies","cooking","cooks","chef","chefs","culinary","kitchen","barbecue","grilling","smoking","smoker","brisket","ribs","pulled-pork","lownslow","baking","baker","sourdough","pastry","dessert","cakes","cookies","brewing","craft-beer","craftbeer","ipa","lager","stout","espresso","barista","roasting","whiskey","bourbon","cocktails","fitness","workout","lifting","weightlifting","powerlifting","bodybuilding","crossfit","hiit","cardio","runners","ultramarathon","triathlete","swimming","swimmer","openwater","open-water","yoga","pilates","meditation","mindfulness","wellness","nutrition","basketball","football","soccer","baseball","hockey","tennis","volleyball","dogs","puppy","puppies","canine","dogtraining","dog-training","cats","kitten","kittens","feline","meow","pets","animals","birding","birdwatching","bird-watching","aquarium","reeftank","reef-tank","saltwater","freshwater","planted-tank","reptiles","reptile","snakes","lizard","gecko","bearded-dragon","neighborhood","nextdoor","meet-up","volunteer","volunteering","nonprofit","non-profit","charity","mutual-aid","mutualaid","parents","parenting","families","children","youth","teens","seniors","lgbtq","pride","queer","nonbinary","ally","allies","inclusive","diversity","burningman","burning-man","playa","blackrock","coachella","sxsw","defcon","hope","layerone","layer-one","supercon","makerfaire","maker-faire","bamboozle","lightning","ragbrai","burnitdown","burning","regional","decomp","toorcamp","chaos","congress","hackathon","ctf-event","capture","wardriving","foxhunt","fox-hunt","brc","ttitd","center-camp","centercamp","esplanade","deep-playa","effigy","temple","soundcamp","sound-camp","mutant-vehicle","art-car","ranger","rangers","lamplighters","dgs","leave-no-trace","moop","gifting","radical-self","immediacy","participation","decommodification","overlandexpo","overland-expo","overlandtrail","overland-trail","overlandbound","overlandjournal","adventurebike","adventure-bike","dirtevery","rubicontrail","rubicon-trail","moab","deathvalley","death-valley","joshua-tree","joshuatree","bigbear","big-bear","mammoth","tahoe","yosemite","sequoia","kingscyn","kings-canyon","meshcore","mesh-core","meshcore-test","meshcore-dev","meshcore-beta","mctest","mc-test","mcdev","mc-dev","mcmain","mc-main","mcpublic","meshcorebot","meshcore-bot","mcbot","mc-bot","meshchat","mesh-chat","meshnet","mesh-net","meshnetwork","mesh-network","meshlink","mesh-link","meshhub","mesh-hub","meshnode","mesh-node","meshrelay","mesh-relay","meshgateway","mesh-gateway","meshbridge","mesh-bridge","meshrouter","meshtalk","mesh-talk","meshvoice","mesh-voice","meshdata","mesh-data","meshsensor","mesh-sensor","meshtrack","mesh-track","meshgps","mesh-gps","meshmap","mesh-map","meshstatus","mesh-status","meshping","mesh-ping","meshtest","mesh-test","meshtesting","mesh-testing","meshdev","mesh-dev","meshops","mesh-ops","meshadmin","mesh-admin","meshmon","mesh-mon","meshlog","mesh-log","meshdebug","mesh-debug","meshdiag","mesh-diag","meshcore-alpha","meshcore-stable","meshcore-main","meshcore-local","mc-alpha","mc-beta","mc-stable","mc-local","mc-ops","mc-admin","meshcoretest","meshcoredev","meshcorebeta","meshcorealpha","meshcoremain","meshcorelocal","meshcoreops","meshcoreadmin","meshcoremon","meshcorelog","meshcorechat","meshcorenet","meshcorelink","meshcorehub","meshcorenode","meshcorerelay","meshcoregateway","meshcorebridge","meshcorerouter","meshcoresensor","meshcoretrack","meshcoregps","meshcoremap","meshcoreping","mcnetwork","mc-network","mcchat","mc-chat","mclink","mc-link","mchub","mc-hub","mcnode","mc-node","mcrelay","mc-relay","mcgateway","mc-gateway","mcbridge","mc-bridge","mcrouter","mc-router","mcsensor","mc-sensor","mctrack","mc-track","mcgps","mc-gps","mcmap","mc-map","mcstatus","mc-status","mcping","mc-ping","mcmon","mc-mon","mclog","mc-log","mcdebug","mc-debug","mcdiag","mc-diag","meshroom","mesh-room","meshrooms","mesh-rooms","meshserver","mesh-server","meshclient","mesh-client","meshcompanion","mesh-companion","meshrepeater","mesh-repeater","meshbase","mesh-base","meshportal","mesh-portal","meshtastic","mesh-tastic","meshtastictest","meshtastic-test","meshtasticdev","meshtastic-dev","meshtasticlocal","meshtastic-local","mttest","mt-test","mtdev","mt-dev","mtlocal","mt-local","longfast","long-fast","longmod","long-mod","longslow","long-slow","shortfast","short-fast","shortslow","short-slow","medfast","med-fast","medslow","med-slow","verylongslow","very-long-slow","meshtastic-alpha","meshtastic-beta","meshtastic-main","meshtastic-stable","meshtasticbeta","meshtasticalpha","meshtasticmain","meshtasticstable","mtbeta","mt-beta","mtalpha","mt-alpha","mtmain","mt-main","mtstable","mt-stable","mtops","mt-ops","mtadmin","mt-admin","mtchat","mt-chat","mtnet","mt-net","mtlink","mt-link","mthub","mt-hub","mtnode","mt-node","mtrelay","mt-relay","longrange","long-range","shortrange","short-range","medrange","med-range","ultralong","ultra-long","ultrafast","ultra-fast","ultraslow","ultra-slow","mediumfast","medium-fast","mediumslow","medium-slow","mediummod","medium-mod","turbofast","turbo-fast","turboslow","turbo-slow","lora","lo-ra","lorawan","lora-wan","loratest","lora-test","loradev","lora-dev","loranet","lora-net","loramesh","lora-mesh","loralink","lora-link","lorahub","lora-hub","loranode","lora-node","lora915","lora-915","lora868","lora-868","lora433","lora-433","sx1262","sx1276","sx1278","semtech","chirp","chirpstack","lorabeta","lora-beta","loraalpha","lora-alpha","loramain","lora-main","lorastable","lora-stable","loraops","lora-ops","loraadmin","lora-admin","lorachat","lora-chat","lorarelay","lora-relay","loragateway","lora-gateway","lorabridge","lora-bridge","lorarouter","lora-router","loraserver","lora-server","lorasensor","lora-sensor","loratrack","lora-track","loragps","lora-gps","loramap","lora-map","lorastatus","lora-status","loraping","lora-ping","loramon","lora-mon","loralog","lora-log","loradebug","lora-debug","lora923","lora-923","lora865","lora-865","lora470","lora-470","sx1261","sx1280","sx1268","sx126x","sx127x","sx128x","llcc68","lr1110","lr1120","lr1121","stm32wl","ra01","ra02","heltec","heltec-lora","ttgo","ttgo-lora","lilygo","lilygo-lora","rak","rak-lora","rak4631","rak3172","rak811","wisblock","test","testing","test1","test2","test3","test123","testchannel","test-channel","testnet","test-net","testmesh","test-mesh","dev","devel","develop","development","devtest","dev-test","sandbox","playground","scratch","temp","temporary","tmp","debug","debugging","diag","diagnostic","diagnostics","alpha","beta","gamma","canary","nightly","unstable","stable","experiment","experimental","trial","pilot","prototype","poc","test4","test5","test6","test7","test8","test9","test10","test01","test02","test03","test-1","test-2","test-3","testA","testB","testC","test-a","test-b","test-c","testing1","testing2","testing3","testing-1","testing-2","testing-3","devnet","dev-net","devmesh","dev-mesh","devchannel","dev-channel","stagenet","stage-net","staging","stage","stagetest","stage-test","qanet","qa-net","qa","qatest","qa-test","qachannel","qa-channel","labnet","lab-net","lab","labtest","lab-test","testlab","test-lab","benchnet","bench-net","benchmark","bench","perftest","perf-test","loadtest","load-test","stresstest","stress-test","smoketest","smoke-test","unittest","unit-test","integtest","integ-test","e2etest","e2e-test","mocknet","mock-net","mock","faker","dummy","sample","example","demonet","demo-net","demo","showcase","preview","prerelease","pre-release","release","rc","release-candidate","releasecandidate","final","production","emergency","emergencies","emer","emerg","911","999","112","sos","mayday","help","rescue","distress","urgent","priority","alert","alerts","warning","warnings","alarm","alarms","safety","safe","danger","hazard","caution","critical","evacuation","evac","evacuate","shelter","shelterinplace","shelter-in-place","lockdown","allclear","all-clear","fire","fires","wildfire","wildfires","brushfire","forestfire","flood","floods","flooding","flashflood","flash-flood","quake","earthquake","aftershock","tsunami","tremor","tornado","hurricane","cyclone","typhoon","storm","severe","missing","missingperson","missing-person","amber","silveralert","medical","medic","ems","ambulance","paramedic","firstaid","first-aid","police","sheriff","lawenforcement","law-enforcement","cert","cert-team","certteam","voad","redcross","red-cross","emergencynet","emergency-net","emergencychannel","emergency-channel","emeralert","emer-alert","sosnet","sos-net","soschannel","sos-channel","maydaynet","mayday-net","maydaychannel","mayday-channel","helpnet","help-net","helpchannel","help-channel","helpline","help-line","rescuenet","rescue-net","rescuechannel","rescue-channel","rescueteam","rescue-team","disaster","disasters","disasternet","disaster-net","disasterrelief","disaster-relief","crisis","crisisnet","crisis-net","crisischannel","crisis-channel","incident","incidentnet","incident-net","incidentchannel","incident-channel","alertnet","alert-net","alertchannel","alert-channel","alertsystem","alert-system","warningnet","warning-net","warningchannel","warning-channel","safetynet","safety-net","safetychannel","safety-channel","safetycheck","safety-check","hazardnet","hazard-net","hazardchannel","hazard-channel","hazmat","haz-mat","firenet","fire-net","firechannel","fire-channel","firefighter","fire-fighter","firedept","fire-dept","firehouse","fire-house","firestation","fire-station","wildfirenet","wildfire-net","wildfirechannel","wildfire-channel","campfire","camp-fire","structurefire","structure-fire","grassfire","grass-fire","floodnet","flood-net","floodchannel","flood-channel","floodwatch","flood-watch","floodwarning","flood-warning","highwater","high-water","risingwater","rising-water","earthquakenet","earthquake-net","earthquakechannel","earthquake-channel","tornadonet","tornado-net","tornadochannel","tornado-channel","hurricanenet","hurricane-net","hurricanechannel","hurricane-channel","stormnet","storm-net","stormchannel","storm-channel","severeweather","severe-weather","medicalnet","medical-net","medicalchannel","medical-channel","traumanet","trauma-net","traumachannel","trauma-channel","traumacenter","trauma-center","hospital","hospitals","clinic","clinics","urgent-care","urgentcare","poisoncontrol","poison-control","cpr-net","cprnet","lifesaver","life-saver","searchandrescue","search-and-rescue","sar","sarnet","sar-net","sarteam","sar-team","coastguard","coast-guard","uscg","lifeguard","life-guard","beachpatrol","beach-patrol","mountainrescue","mountain-rescue","caverescue","cave-rescue","swiftwater","swift-water","k9unit","k9-unit","searchdog","search-dog","rescuedog","rescue-dog","civildefense","civil-defense","fema","dhs","oem","eoc","eocnet","eoc-net","weather","wx","wxalert","wx-alert","wxwatch","wx-watch","wxwarning","wx-warning","wxreport","wx-report","wxupdate","wx-update","forecast","conditions","climate","temperature","temp","temps","rain","rainfall","precipitation","precip","snow","snowfall","wind","winds","windy","gust","gusts","breeze","humidity","humid","dewpoint","dew-point","barometer","pressure","sunny","cloudy","overcast","fog","foggy","mist","haze","smog","heat","heatwave","heat-wave","cold","coldsnap","cold-snap","freeze","lightning","thunder","thunderstorm","tstorm","t-storm","hail","sleet","ice","icy","blackice","black-ice","frost","noaa","nws","skywarn","spotter","spotters","stormspotter","weathernet","weather-net","weatherchannel","weather-channel","wxnet","wx-net","wxchannel","wx-channel","wxstation","wx-station","forecastnet","forecast-net","forecastchannel","forecast-channel","localwx","local-wx","localweather","local-weather","dailywx","daily-wx","hourlywx","hourly-wx","weeklyforecast","weekly-forecast","rainnet","rain-net","rainchannel","rain-channel","rainalert","rain-alert","rainwatch","rain-watch","rainwarning","rain-warning","heavyrain","heavy-rain","snownet","snow-net","snowchannel","snow-channel","snowalert","snow-alert","snowwatch","snow-watch","snowwarning","snow-warning","heavysnow","heavy-snow","blizzard","blizzardwatch","blizzard-watch","blizzardwarning","blizzard-warning","windnet","wind-net","windchannel","wind-channel","windalert","wind-alert","windwatch","wind-watch","windwarning","wind-warning","highwind","high-wind","tempnet","temp-net","tempchannel","temp-channel","tempalert","temp-alert","heatnet","heat-net","heatchannel","heat-channel","heatalert","heat-alert","heatwatch","heat-watch","heatwarning","heat-warning","extremeheat","extreme-heat","coldnet","cold-net","coldchannel","cold-channel","coldalert","cold-alert","coldwatch","cold-watch","coldwarning","cold-warning","extremecold","extreme-cold","winterstorm","winter-storm","icestorm","ice-storm","freezingrain","freezing-rain","thunderstormnet","thunderstorm-net","thunderstormwatch","thunderstorm-watch","thunderstormwarning","thunderstorm-warning","severethunderstorm","severe-thunderstorm","lightningnet","lightning-net","lightningchannel","lightning-channel","lightningalert","lightning-alert","lightningwatch","lightning-watch","tornadowatch","tornado-watch","tornadowarning","tornado-warning","hurricanewatch","hurricane-watch","hurricanewarning","hurricane-warning","tropicalstorm","tropical-storm","tropicaldepression","tropical-depression","stormwatch","storm-watch","stormwarning","storm-warning","stormalert","storm-alert","skywarnnet","skywarn-net","skywarnchannel","skywarn-channel","spotternetwork","spotter-network","stormchase","storm-chase","stormchaser","storm-chaser","amateurwx","amateur-wx","citizenwx","citizen-wx","pwswx","pws-wx","weatherstation","weather-station","wxstation","wx-station","metar","taf","status","stat","stats","statistics","metrics","health","healthcheck","monitor","monitoring","mon","watch","watcher","watchdog","uptime","downtime","outage","outages","incident","incidents","report","reports","reporting","update","updates","bulletin","announce","announcement","announcements","broadcast","broadcasts","notify","notification","notifications","ping","pong","heartbeat","check","checkin","check-in","checkout","check-out","rollcall","roll-call","statusnet","status-net","statuschannel","status-channel","statusupdate","status-update","statusreport","status-report","statuscheck","status-check","statusboard","status-board","monitornet","monitor-net","monitorchannel","monitor-channel","monitoringnet","monitoring-net","monitoringchannel","monitoring-channel","watchnet","watch-net","watchchannel","watch-channel","watchlist","watch-list","healthnet","health-net","healthchannel","health-channel","healthstatus","health-status","uptimenet","uptime-net","uptimechannel","uptime-channel","uptimemonitor","uptime-monitor","outagenet","outage-net","outagechannel","outage-channel","outagereport","outage-report","incidentnet","incident-net","incidentchannel","incident-channel","incidentreport","incident-report","incidentresponse","incident-response","alertsnet","alerts-net","alertschannel","alerts-channel","updatenet","update-net","updatechannel","update-channel","updatefeed","update-feed","bulletinnet","bulletin-net","bulletinchannel","bulletin-channel","bulletinboard","bulletin-board","noticeboard","notice-board","announcenet","announce-net","announcechannel","announce-channel","broadcastnet","broadcast-net","broadcastchannel","broadcast-channel","notifynet","notify-net","notifychannel","notify-channel","pingnet","ping-net","pingchannel","ping-channel","pingtest","ping-test","heartbeatnet","heartbeat-net","heartbeatchannel","heartbeat-channel","rollcallnet","rollcall-net","rollcallchannel","rollcall-channel","checkinnet","checkin-net","checkinchannel","checkin-channel","headcount","head-count","accountability","welfare","wellbeing","well-being","ops","operations","opsnet","ops-net","opschannel","ops-channel","admin","admins","administrator","root","superuser","sudo","control","command","cmd","hq","headquarters","base","basecamp","dispatch","dispatcher","coord","coordinate","coordination","tactical","tac","tacnet","tac-net","tacchannel","tac-channel","logistics","logi","supply","supplies","resource","resources","comms","comm","communications","radio","radionet","radio-net","opsteam","ops-team","opsgroup","ops-group","opscenter","ops-center","opsroom","ops-room","opsdesk","ops-desk","opslead","ops-lead","adminnet","admin-net","adminchannel","admin-channel","adminteam","admin-team","adminops","admin-ops","admingroup","admin-group","admindesk","admin-desk","controlnet","control-net","controlchannel","control-channel","controlroom","control-room","controlcenter","control-center","commandnet","command-net","commandchannel","command-channel","commandpost","command-post","commandcenter","command-center","hqnet","hq-net","hqchannel","hq-channel","hqops","hq-ops","dispatchnet","dispatch-net","dispatchchannel","dispatch-channel","dispatchcenter","dispatch-center","dispatchdesk","dispatch-desk","coordnet","coord-net","coordchannel","coord-channel","coordteam","coord-team","coordcenter","coord-center","coordinationcenter","coordination-center","tacops","tac-ops","tacteam","tac-team","tacgroup","tac-group","taccom","tac-com","taccomms","tac-comms","tacradio","tac-radio","logisticsnet","logistics-net","logisticschannel","logistics-channel","logisticsteam","logistics-team","logisticsops","logistics-ops","supplynet","supply-net","supplychannel","supply-channel","supplychain","supply-chain","resourcenet","resource-net","resourcechannel","resource-channel","commsnet","comms-net","commschannel","comms-channel","commsteam","comms-team","commsops","comms-ops","commscheck","comms-check","commstest","comms-test","radioops","radio-ops","radioteam","radio-team","radiocheck","radio-check","netcontrol","net-control","netops","net-ops","noc","nocnet","noc-net","info","information","infochannel","info-channel","fyi","news","newsfeed","news-feed","headlines","breaking","latest","traffic","trafficreport","traffic-report","roadconditions","road-conditions","transit","bus","train","subway","metro","commute","commuter","events","calendar","schedule","agenda","upcoming","whats-on","infonet","info-net","infohub","info-hub","infodesk","info-desk","infoboard","info-board","infopoint","info-point","infoline","info-line","newsnet","news-net","newschannel","news-channel","newshub","news-hub","newsdesk","news-desk","newsroom","news-room","newsflash","news-flash","breakingnews","breaking-news","latestnews","latest-news","topnews","top-news","localnews","local-news","regionalnews","regional-news","worldnews","world-news","trafficnet","traffic-net","trafficchannel","traffic-channel","trafficupdate","traffic-update","trafficalert","traffic-alert","roadnet","road-net","roadchannel","road-channel","roadupdate","road-update","transitnet","transit-net","transitchannel","transit-channel","transitupdate","transit-update","transitalert","transit-alert","busnet","bus-net","buschannel","bus-channel","busupdate","bus-update","trainnet","train-net","trainchannel","train-channel","trainupdate","train-update","subwaynet","subway-net","subwaychannel","subway-channel","metronet","metro-net","metrochannel","metro-channel","metroupdate","metro-update","commuternet","commuter-net","commuterchannel","commuter-channel","eventsnet","events-net","eventschannel","events-channel","eventshub","events-hub","eventcalendar","event-calendar","localevents","local-events","calendarnet","calendar-net","calendarchannel","calendar-channel","schedulenet","schedule-net","schedulechannel","schedule-channel","agendanet","agenda-net","agendachannel","agenda-channel","upcomingnet","upcoming-net","upcomingchannel","upcoming-channel","location","locations","gps","position","positions","coordinates","track","tracker","tracking","trace","tracer","tracing","beacon","beacons","waypoint","waypoints","checkpoint","checkpoints","geofence","geolocation","geo","mapping","maps","navigate","navigation","locationnet","location-net","locationchannel","location-channel","locationtrack","location-track","locationshare","location-share","gpsnet","gps-net","gpschannel","gps-channel","gpstrack","gps-track","gpsshare","gps-share","gpslog","gps-log","gpsdata","gps-data","positionnet","position-net","positionchannel","position-channel","positiontrack","position-track","positionshare","position-share","coordnet","coord-net","coordchannel","coord-channel","coordshare","coord-share","tracknet","track-net","trackchannel","track-channel","trackshare","track-share","trackingnet","tracking-net","trackingchannel","tracking-channel","tracernet","tracer-net","tracerchannel","tracer-channel","beaconnet","beacon-net","beaconchannel","beacon-channel","beacontrack","beacon-track","beaconshare","beacon-share","waypointnet","waypoint-net","waypointchannel","waypoint-channel","waypointshare","waypoint-share","waypointlog","waypoint-log","checkpointnet","checkpoint-net","checkpointchannel","checkpoint-channel","geofencenet","geofence-net","geofencechannel","geofence-channel","geofencealert","geofence-alert","geozonenet","geozone-net","geonet","geo-net","geochannel","geo-channel","geotrack","geo-track","mappingnet","mapping-net","mappingchannel","mapping-channel","mapnet","map-net","mapchannel","map-channel","mapshare","map-share","navnet","nav-net","navchannel","nav-channel","navtrack","nav-track","navigationnet","navigation-net","navigationchannel","navigation-channel","fleettrack","fleet-track","fleetnet","fleet-net","assettrack","asset-track","whereis","where-is","findme","find-me","locateme","locate-me","nocap","no-cap","frfr","fr-fr","bussin","sheesh","slay","slaps","goated","goat","goats","based","cringe","mid","lowkey","highkey","vibe","vibes","vibing","vibecheck","vibe-check","goodvibes","good-vibes","sus","sussy","sussy-baka","imposter","amongus","among-us","bet","bets","yeet","yeeted","yoink","skibidi","rizz","ohio","bruh","bruv","fam","bestie","besties","squad","squadgoals","squad-goals","slayyy","periodt","purr","queen","king","icon","iconic","legend","main-character","maincharacter","npc","npcs","side-quest","sidequest","understood-the-assignment","ate","served","mother","mothering","rent-free","rentfree","living-rent-free","touch-grass","touchgrass","copium","hopium","doom","doomer","bloomer","zoomer","zoomers","ratio","ratiod","caught-in-4k","receipts","tea","spillthetea","spill-the-tea","simp","simping","stan","stanning","oomf","moots","mutuals","tiktok","fyp","foryou","for-you","foryoupage","trending","viral","cheugy","basic","pick-me","pickme","girlboss","girl-boss","iykyk","iyky","ifykyk","valid","hits-different","hitsdifferent","unhinged","chaotic","feral","unalive","delulu","delusion","bereal","be-real","dump","photodump","photo-dump","core","coded","aesthetic","cottagecore","darkacademia","dark-academia","goblinmode","goblin-mode","softlaunch","soft-launch","hardlaunch","hard-launch","ngl","tbh","ong","on-god","ongod","deadass","dead-ass","fr","real","cap","capping","no-cap-fr","nocapfr","respectfully","allegedly","understood","assignment","ate-that","atethat","devoured","cleared","snatched","slayed","bodied","ended","finished","done","over","deceased","screaming","crying","sobbing","im-weak","imweak","sending-me","sendingme","its-giving","itsgiving","giving","serve","serving","ate-left-no-crumbs","main","protagonist","background-character","backgroundcharacter","side-character","sidecharacter","villain-era","villainera","redemption-arc","character-development","characterdevelopment","plot-twist","plottwist","lore","lore-drop","loredrop","deep-lore","deeplore","canon","fanon","ick","icks","red-flag","redflag","green-flag","greenflag","beige-flag","situationship","talking-stage","talkingstage","roster","rotation","era","eras","villain-arc","healing-era","flop-era","flopping","ate-and-left","understood-assignment","no-thoughts","nothoughts","brain-rot","brainrot","rotted","chronically-online","chronicallyonline","parasocial","hyperfixation","hyperfixating","special-interest","infodump","info-dump","infodumping","yapping","yap","yapper","glazing","glaze","glazer","meat-riding","meatriding","dickriding","aura","aura-points","aurapoints","negative-aura","positiveaura","sigma","sigma-grindset","sigmagrindset","alpha","beta","omega","mewing","mew","looksmax","looksmaxxing","mogging","mog","mogger","gyat","gyatt","bussin-bussin","respectfully-disrespectfully","real-ones","realones","day-ones","dayones","ride-or-die","rideordie","caught-lacking","caughtlacking","down-bad","downbad","down-tremendous","downhorrendous","down-horrendous","astronomically-down","abysmal","its-joever","joever","its-so-over","we-are-so-back","weareback","lock-in","lockin","locked-in","lockedin","locked-tf-in","cooked","cooking","cookin","chef","michelin","gourmet","fr-ong","frong","no-diddy","nodiddy","pause","unpause","resume","edging","edged","gooning","gooned","fanum-tax","fanumtax","hawk-tuah","hawktuah","kai-cenat","speed","ishowspeed","prime","adulting","adult","grown","grownup","grown-up","oldmillennial","avocadotoast","avocado-toast","brunch","brunching","mimosas","doggo","doggie","pupper","puppers","floof","chonk","chonky","birb","smol","smoll","smolbean","smol-bean","boop","snoot","blep","mlem","feels","allthefeels","all-the-feels","rightinthefeels","right-in-the-feels","mood","bigmood","big-mood","sadboi","sad-boi","sadgirl","sad-girl","aesthetic","vsco","vsco-girl","vscogirl","sksksk","andioop","and-i-oop","netflix","netflixandchill","netflix-and-chill","binge","bingewatch","throwback","tbt","throwbackthursday","throwback-thursday","flashback","nostalgia","nostalgic","90skid","90s-kid","80skid","80s-kid","pokemon","pikachu","nintendo","zelda","mario","sonic","sega","harrypotter","harry-potter","hogwarts","hufflepuff","gryffindor","slytherin","ravenclaw","muggle","potterhead","potter-head","starwars","star-wars","jedi","sith","mandalorian","mando","yoda","marvel","mcu","avengers","thanos","ironman","iron-man","spiderman","lotr","lordoftherings","lord-of-the-rings","hobbit","gandalf","frodo","gameofthrones","game-of-thrones","got","thrones","winteriscoming","nailed-it","nailedit","winning","fail","fails","epic","epicfail","fml","yolo","swag","swagger","legit","literally","literally-cant","cant-even","canteven","dying","dead","imdead","im-dead","deceased","goals","lifegoals","life-goals","relationshipgoals","relationship-goals","bae","babe","babes","hubby","wifey","fiance","soulmate","soul-mate","foodporn","food-porn","foodie","nomnom","nom-nom","yummy","delish","wanderlust","travelbug","travel-bug","jetset","jet-set","jetsetter","selfie","selfies","selfietime","selfie-time","groupie","photobomb","blessed","grateful","thankful","humbled","mindblown","mind-blown","extra","salty","shook","triggered","woke","cancelled","cancel","ghosting","ghosted","ghost","friendzone","friend-zone","friendzoned","shade","throwing-shade","tea","spill","spilltea","spill-tea","savage","clap-back","clapback","drag","dragged","read","receipts","tfw","mfw","mrw","dae","eli5","tldr","tl-dr","ama","iama","reddit","redditor","upvote","downvote","karma","cakeday","cake-day","meme","memes","dank","dankmemes","dank-memes","memelord","meme-lord","oldmillenial","xennial","geriatricmillennial","geriatric-millennial","youngmillennial","young-millennial","eldermillennial","elder-millennial","millennialproblems","millennial-problems","millenniallife","millennial-life","firstworldproblems","first-world-problems","struggle","struggles","thestruggle","broke","brokemillennial","broke-millennial","studentloans","student-loans","sidehustle","side-hustle","hustleculture","hustle-culture","grind","grinding","worklifebalance","work-life-balance","burnout","burn-out","selfcare","self-care","treatyoself","treat-yo-self","treatyourself","indulgence","splurge","athleisure","leggings","yoga","yogapants","yoga-pants","pilates","kale","quinoa","acai","matcha","oatmilk","oat-milk","plantbased","plant-based","glutenfree","gluten-free","organic","nongmo","non-gmo","farmtotable","farm-to-table","craftbeer","craft-beer","craftcocktails","craft-cocktails","speakeasy","rooftopbar","rooftop-bar","happyhour","happy-hour","winenight","wine-night","tacotuesday","taco-tuesday","pizzanight","pizza-night","takeout","take-out","doordash","ubereats","uber-eats","grubhub","postmates","instacart","plantmom","plant-mom","plantdad","plant-dad","plantparent","plant-parent","crazycatlady","crazy-cat-lady","dogmom","dog-mom","dogdad","dog-dad","furbaby","fur-baby","furbabies","rescuedog","rescue-dog","adoptdontshop","engagement","engaged","shesaidyes","she-said-yes","weddingplanning","wedding-planning","bridesquad","bride-squad","groomsmen","bachelorette","bachelor","honeymoon","firsthome","first-home","homeowner","home-owner","housegoals","house-goals","diy","diyer","fixer-upper","fixerupper","hgtv","pinterestfail","pinterest-fail","netflix-queue","netflixqueue","bingeing","binge-watching","streamingwars","truecrimeobsessed","true-crime-obsessed","truecrime","true-crime","murderino","podcastaddict","podcast-addict","serialpodcast","serial-podcast","officelife","office-life","corporatelife","corporate-life","cubicle","openoffice","slack","slackchannel","slack-channel","zoomlife","zoom-life","zoommeetings","wfh","workfromhome","work-from-home","remotework","remote-work","hybridwork","quietquitting","quiet-quitting","thegreatresignation","thegreatreshuffling","sundayscaries","sunday-scaries","mondaymotivation","monday-motivation","humpday","hump-day","tgif","fridayfeeling","friday-feeling","fridayvibes","itstheweekend","weekendvibes","weekend-vibes","weekendmode","weekend-mode","lol","lmao","lmfao","rofl","roflmao","omg","wtf","ftw","smh","tbh","icymi","fomo","jomo","fwiw","imho","imo","brb","gtg","ttyl","nbd","idk","idgaf","stfu","nsfw","tmi","btw","afaik","iirc","ymmv","ianal","whatever","whatev","whatevs","meh","blah","ugh","duh","psych","noway","no-way","asif","as-if","getreal","get-real","talktotheh","talk-to-the-hand","nottt","not","sike","syke","psyche","gnarly","rad","radical","tubular","bodacious","righteous","excellent","bogus","heinous","grody","gag-me","gagme","barf","barfbag","gross","dude","dudes","dudette","bro","bros","broski","homie","homies","homes","peeps","posse","crew","gang","clique","tribe","chill","chillax","chillaxin","chilling","chillin","kickin","kickback","kick-back","hangout","hang-out","hangtime","hang-time","couch","couchpotato","couch-potato","vegging","veggingout","vegging-out","slacker","slackers","slack","slacking","procrastinate","procrastinating","grunge","grungy","alternative","alt","indie","underground","mtv","vh1","headbangers","headbanging","moshing","moshpit","mosh-pit","nirvana","cobain","soundgarden","pearljam","pearl-jam","aliceinchains","beavis","butthead","beavisandbutthead","daria","simpsons","bartman","waynesworld","waynes-world","partyon","party-on","schwing","excellent","billted","bill-ted","bogusjourney","bogus-journey","stationn","ferris","ferrisbueller","ferris-bueller","dayoff","day-off","buellerr","breakfast-club","breakfastclub","sixteen-candles","sixteencandles","pretty-in-pink","prettyinpink","mollyringwald","molly-ringwald","johnhughes","john-hughes","hughes","brat-pack","bratpack","pager","beeper","pagenme","page-me","callme","call-me","hitmeup","snailmail","snail-mail","aol","aim","icq","uh-oh","a-s-l","asl","netscape","geocities","angelfire","tripod","webcrawler","askjeeves","gen-x","genx","genxer","gen-xer","xer","xers","forgottengeneration","latchkeykid","latchkey-kid","latchkey","unsupervised","freerange","free-range","mtv-generation","mtvgeneration","mtvkids","mtv-kids","videokilled","video-killed","reagan-era","reaganera","coldwar","cold-war","coldwarkids","cold-war-kids","afterschoolspecial","after-school-special","justdontdoit","saynotodrugs","dareprogram","dare-program","scared-straight","scaredstraight","whatcha-talkin-bout","diffrentstrokes","factsoflife","facts-of-life","familyties","family-ties","growinpains","growin-pains","cosby","cheers","thirtysomething","thirty-something","madaboutyou","mad-about-you","seinfeld","seinfeldian","kramers","masterofyourdomain","yada-yada-yada","friends","centralpark","central-perk","rachel","ross","chandler","monica","melrose","melroseplace","melrose-place","90210","beverlyhills90210","myso-called-life","mysocalledlife","angela","jordan-catalano","jordancatalano","freaksandgeeks","freaks-and-geeks","lindsay","undeclared","realworld","real-world","truestory","true-story","roadrules","road-rules","unplugged","mtv-unplugged","mtvunplugged","acoustic","coffehouse","grunge-era","grungeera","seattlesound","seattle-sound","subpop","sub-pop","smellsliketeenspirit","smells-like-teen-spirit","nevermind","bleach","ten","superunknown","dirt","facelift","jaroffies","jar-of-flies","greenday","green-day","dookie","basketcase","basket-case","wheniseptember","blink182","blink-182","enema","whats-my-age-again","allthesmallthings","sublime","santeria","wrongway","wrong-way","40oz","forty-oz","rage","ratm","rageagainstthemachine","killinginthename","bulls-on-parade","tool","lateralus","aenima","undertow","opiate","spiralout","spiral-out","nineinchnails","nine-inch-nails","nin","closer","headlikeahole","smashingpumpkins","smashing-pumpkins","siamesedream","mellon-collie","radiohead","okcomputer","ok-computer","creep","karma-police","paranoidandroid","beck","loser","odelay","whereitsat","where-its-at","twoturnstables","pulpfiction","pulp-fiction","royalewithcheese","saywhatagain","ezekiel","clerks","viewaskew","view-askew","jayandsilentbob","snootchie","officespace","office-space","tpsreports","tps-reports","piecesofflair","thematrix","the-matrix","redpill","bluepill","neo","morpheus","followthewhiterabbit","fightclub","fight-club","firstrandbeof","projectmayhem","tylerdurden","xfiles","x-files","mulderandscully","thetruthisoutthere","iwanttobelieve","buffy","buffythevampireslayer","buffy-tvs","scoobygang","sunnydale","groovy","far-out","farout","outtasite","outta-sight","righteous","cool","coolio","coolcat","cool-cat","coolbeans","cool-beans","neato","solid","solidgold","solid-gold","golden","goldies","oldies","classics","keen","swell","peachy","peachykeen","peachy-keen","hunky-dory","hunkydory","hip","hipster","hipcat","hip-cat","hep","hepcat","hep-cat","jazzy","square","squares","squaresville","uptight","uncool","unhip","bread","dough","moolah","bucks","clams","greenbacks","benjamins","pad","crib","digs","joint","spot","place","casa","hacienda","wheels","ride","whip","jalopy","hooptie","beater","clunker","oldtimer","old-timer","oldschool","old-school","vintage","retro","classic","backyard","frontporch","front-porch","patio","deck","garage","workshop","hamshack","ham-shack","radioshack","radio-shack","basement","attic","lodge","elks","moose","eagles","vfw","legion","american-legion","rotary","kiwanis","lions","shriners","masons","masonic","fraternal","church","chapel","parish","congregation","fellowship","ministry","sunday","sabbath","potluck","pot-luck","social","supper","supperclub","bridge","bridgeclub","bridge-club","cards","cardgame","card-game","bingo","bunco","poker","pokernight","poker-night","gamenight","game-night","bowling","bowlingalley","bowling-alley","bowlingleague","bowling-league","golf","golfclub","golf-club","teeoff","tee-off","links","fairway","fishing","fishinghole","fishing-hole","fishingbuddy","fishing-buddy","hunting","huntingcamp","hunting-camp","deercamp","deer-camp","cabin","rv","rvclub","rv-club","camper","campground","koa","goodsam","good-sam","snowbird","snowbirds","sunbird","sunbirds","winter-texan","wintertexan","retired","retirement","goldenage","golden-age","goldenyears","golden-years","aarp","seniors","seniormoments","senior-moments","grandkids","grandchildren","boomer","boomers","babyboomer","baby-boomer","babyboomers","baby-boomers","woodstock","woodstocknation","woodstock-nation","hippie","hippies","hippy","peacelove","peace-love","peacesign","peace-sign","makelovenotowar","flowerpower","flower-power","flowerchild","flower-child","summerofove","counterculture","counter-culture","freebird","free-bird","freespirit","tune-in-turn-on","dropmeout","trippingout","tripping-out","psychedelic","grateful-dead","gratefuldead","deadhead","dead-head","deadheads","beatles","beatlemania","fab-four","fabfour","johnpaugeorgeringo","rollingstones","rolling-stones","stones","jagger","keithrichards","thewho","the-who","mygeneration","my-generation","tommyboy","ledzeppelin","led-zeppelin","zeppelin","stairway","stairwaytoheaven","pinkfloyd","pink-floyd","thewall","the-wall","darkside","darksidemoon","doors","thedoors","jimmorrison","jim-morrison","lightmyfire","riders","hendrix","jimi","jimihendrix","purplehaze","purple-haze","voodoo-child","janis","janisjoplin","janis-joplin","mercedesbenz","piecemyheart","ccr","creedence","creedence-clearwater","fortunateson","badmoonrising","eagles","hotelcalifornia","hotel-california","desperado","takiteasy","fleetwood","fleetwoodmac","fleetwood-mac","rumours","dreams","thchain","carlysimon","carly-simon","youresovain","anticipation","simongarfunkel","simon-garfunkel","soundofsilence","bridgeovertroubledwater","caroleking","carole-king","tapestry","youvegotafriend","naturalwoman","crosbystillsnash","crosby-stills-nash","csny","suite-judy-blue-eyes","vietnam","vietnamera","vietnam-era","vietnamvet","vietnam-vet","napalm","civilrights","civil-rights","mlk","martin-luther-king","ihaveadream","moonlanding","moon-landing","apollo","apollo11","onesmallstep","jfk","kennedy","camelot","asknotwhat","cubanmissilecrisis","coldwars","watergate","nixon","rosemarywoods","18minutes","deepthroat","mash","allinthefamily","all-in-the-family","archie","archiebunker","happydays","happy-days","fonzie","thfonz","aaayyyy","jumptheshark","laverne-shirley","laverneshirley","schlemiel","schlimazel","marytylermore","mary-tyler-moore","rhoda","lou-grant","lourant","bobnehart","bob-newhart","newhart","hiimbob","thisislarrybrother","sanford-son","sanfordandson","bigdummy","elizabethimcoming","jeffersons","thejeffersons","movingonup","moving-on-up","deluxe","goodtimes","good-times","dynomite","dy-no-mite","jj","chico-man","chicoman","chicoandtheman","lookingfordwardo","kolchak","nightstalker","night-stalker","barnaby","barnabyjones","columbo","onmorething","one-more-thing","justonemorething","magnum","magnumpi","magnum-pi","selleck","tomelleck","ferrari308","rockfordfiles","rockford-files","jimrockford","answeringmachine","dallastv","dallas-tv","whoshotjr","who-shot-jr","ewingsouthfork","dynasty","alexis","crystalcarrington","catfight","shoulderpads","sixmilliondollarman","bionicwoman","bionic-woman","wecanrebuildhim","the","be","to","of","and","a","in","that","have","i","it","for","not","on","with","he","as","you","do","at","this","but","his","by","from","they","we","say","her","she","or","an","will","my","one","all","would","there","their","what","so","up","out","if","about","who","get","which","go","me","when","make","can","like","time","no","just","him","know","take","people","into","year","your","good","some","could","them","see","other","than","then","now","look","only","come","its","over","think","also","back","after","use","two","how","our","work","first","well","way","even","new","want","because","any","these","give","day","most","us","is","are","was","were","been","good","bad","great","best","worst","first","last","next","only","own","free","open","close","closed","new","old","young","big","small","little","long","short","high","low","fast","slow","quick","hot","cold","warm","cool","hard","soft","easy","difficult","simple","complex","clear","dark","light","bright","deep","shallow","wide","narrow","thick","thin","heavy","full","empty","clean","dirty","wet","dry","loud","quiet","silent","strong","weak","rich","poor","cheap","expensive","safe","dangerous","healthy","sick","happy","sad","angry","calm","busy","lazy","crazy","smart","stupid","clever","wise","dumb","funny","serious","strange","normal","weird","perfect","broken","whole","complete","partial","ready","active","passive","alive","dead","awake","asleep","aware","blind","bold","brave","calm","careful","certain","chief","common","curious","current","direct","double","early","entire","exact","extra","fair","false","famous","final","fine","firm","flat","former","forward","fresh","front","frozen","general","giant","global","golden","grand","green","gross","guilty","hidden","hollow","honest","huge","human","humble","hungry","ideal","ill","inner","instant","intense","internal","joint","just","keen","key","kind","known","large","late","latter","leading","legal","likely","limited","linear","liquid","live","living","local","logical","lonely","loose","lost","lovely","lower","lucky","mad","magic","main","major","male","female","manual","married","massive","master","maximum","mean","medium","mental","middle","military","minimum","minor","missing","mixed","mobile","modern","monthly","moral","mutual","naked","narrow","nasty","native","natural","nearby","neat","negative","nervous","neutral","next","nice","noble","noisy","normal","northern","novel","obvious","odd","official","ok","okay","olympic","only","open","opening","opposite","optional","orange","ordinary","organic","original","other","outdoor","outer","outside","overall","overseas","owing","own","pale","parallel","partial","particular","past","patient","peaceful","peculiar","permanent","personal","petty","physical","pink","plain","pleasant","plenty","plus","pointed","polite","political","popular","positive","possible","potential","powerful","practical","precious","precise","pregnant","present","presidential","pretty","previous","primary","prime","principal","prior","private","probable","productive","professional","profound","progressive","prominent","proper","prospective","protective","proud","provincial","psychological","public","pure","purple","qualified","quick","quiet","radical","random","rapid","rare","raw","ready","real","realistic","reasonable","recent","red","redundant","regional","regular","relative","relevant","reliable","religious","reluctant","remaining","remarkable","remote","representative","resident","resistant","respective","responsible","resulting","revolutionary","rich","ridiculous","right","rigid","rising","risky","rival","romantic","rough","round","royal","ruling","running","rural","sacred","sad","safe","salty","same","sample","go","come","get","give","take","make","do","say","see","look","find","use","tell","ask","work","seem","feel","try","leave","call","keep","let","begin","start","show","hear","play","run","move","live","believe","hold","bring","happen","write","provide","sit","stand","lose","pay","meet","include","continue","set","learn","change","lead","understand","watch","follow","stop","create","speak","read","allow","add","spend","grow","open","walk","win","offer","remember","love","consider","appear","buy","wait","serve","die","send","expect","build","stay","fall","cut","reach","kill","remain","suggest","raise","pass","sell","require","report","decide","pull","break","push","throw","catch","jump","kick","hit","fly","swim","drive","ride","climb","dance","sing","cook","eat","drink","sleep","wake","wash","dress","fight","help","save","teach","study","test","check","join","connect","link","share","post","send","receive","accept","reject","approve","deny","confirm","cancel","reset","restart","refresh","reload","update","upgrade","install","uninstall","download","upload","sync","backup","restore","recover","repair","fix","solve","resolve","complete","finish","time","year","people","way","day","man","woman","child","world","life","hand","part","place","case","week","company","system","program","question","work","government","number","night","point","home","water","room","mother","area","money","story","fact","month","lot","right","study","book","eye","job","word","business","issue","side","kind","head","house","service","friend","father","power","hour","game","line","end","member","law","car","city","community","name","president","team","minute","idea","kid","body","information","back","parent","face","others","level","office","door","health","person","art","war","history","party","result","change","morning","reason","research","girl","guy","moment","air","teacher","force","education","hello","hi","hey","hola","bonjour","ciao","aloha","howdy","greetings","welcome","goodbye","bye","farewell","later","peace","cheers","thanks","thankyou","thank-you","please","sorry","excuse","pardon","congrats","congratulations","bravo","wow","amazing","awesome","cool","nice","great","excellent","perfect","wonderful","fantastic","incredible","unbelievable","omg","wtf","lol","lmao","rofl","haha","hehe","xoxo","hugs","kisses","python","javascript","typescript","java","csharp","cpp","cplusplus","golang","go-lang","rust","rustlang","rust-lang","ruby","php","perl","swift","kotlin","scala","haskell","lisp","clojure","erlang","elixir","fsharp","ocaml","lua","r-lang","rlang","julia","dart","fortran","cobol","assembly","asm","wasm","webassembly","sql","nosql","graphql","mongodb","postgres","postgresql","mysql","mariadb","sqlite","redis","memcached","cassandra","dynamodb","firebase","supabase","prisma","sequelize","typeorm","react","reactjs","react-native","reactnative","angular","angularjs","vue","vuejs","svelte","sveltekit","nextjs","next-js","nuxt","nuxtjs","gatsby","remix","astro","solid","solidjs","preact","qwik","htmx","alpine","tailwind","tailwindcss","bootstrap","bulma","foundation","materialui","chakra","antd","ant-design","shadcn","radix","headlessui","daisyui","nodejs","node-js","deno","bun","express","fastify","koa","nestjs","django","flask","fastapi","rails","rubyonrails","laravel","symfony","spring","springboot","spring-boot","dotnet","aspnet","blazor","maui","electron","tauri","flutter","ionic","capacitor","cordova","xamarin","unity","unreal","godot","pygame","phaser","threejs","three-js","babylon","webpack","vite","rollup","parcel","esbuild","swc","babel","eslint","prettier","jest","vitest","mocha","jasmine","cypress","playwright","selenium","puppeteer","storybook","chromatic","ladle","histoire","docker","kubernetes","k8s","k3s","minikube","helm","istio","envoy","podman","containerd","crio","rancher","openshift","nomad","consul","terraform","pulumi","crossplane","ansible","puppet","chef","saltstack","vagrant","packer","vault","boundary","waypoint","atlantis","argocd","argo-cd","fluxcd","flux-cd","jenkins","circleci","travisci","travis-ci","github-actions","githubactions","gitlab-ci","gitlabci","bitbucket-pipelines","azure-devops","azuredevops","teamcity","bamboo","drone","tekton","spinnaker","aws","amazon","azure","gcp","google-cloud","googlecloud","digitalocean","linode","vultr","hetzner","ovh","scaleway","upcloud","heroku","vercel","netlify","cloudflare","fastly","akamai","cloudfront","railway","render","fly-io","flyio","deno-deploy","workers","cloudflare-workers","lambda","serverless","faas","paas","iaas","saas","baas","kaas","daas","nginx","apache","caddy","traefik","haproxy","envoy","kong","apisix","grafana","prometheus","loki","tempo","jaeger","zipkin","datadog","newrelic","splunk","elastic","elasticsearch","kibana","logstash","elk","fluentd","fluentbit","vector","telegraf","influxdb","timescaledb","questdb","pagerduty","opsgenie","victorops","statuspage","incident-io","rootly","ai","artificial-intelligence","ml","machine-learning","machinelearning","deep-learning","deeplearning","neural","neuralnet","neural-network","tensorflow","pytorch","keras","jax","flax","scikit","sklearn","scipy","numpy","pandas","matplotlib","seaborn","plotly","bokeh","altair","huggingface","hugging-face","transformers","diffusers","datasets","openai","gpt","gpt4","gpt-4","chatgpt","chat-gpt","claude","anthropic","gemini","bard","palm","llama","llama2","llama-2","mistral","mixtral","falcon","mpt","dolly","alpaca","vicuna","orca","phi","zephyr","yi","qwen","deepseek","codellama","code-llama","starcoder","codegen","copilot","cursor","tabnine","codeium","replit","sourcegraph","cody","continue","langchain","llamaindex","llama-index","autogpt","auto-gpt","babyagi","agentgpt","superagi","crewai","autogen","semantic-kernel","guidance","ollama","lmstudio","lm-studio","localai","local-ai","gpt4all","koboldai","oobabooga","text-generation-webui","vllm","tgi","triton","tensorrt","stable-diffusion","stablediffusion","midjourney","dalle","dall-e","imagen","sdxl","controlnet","lora","dreambooth","textual-inversion","automatic1111","comfyui","invokeai","fooocus","kohya","runpod","replicate","banana","modal","anyscale","ray","mlflow","weights-biases","wandb","comet","neptune","clearml","dvc","lakefs","pachyderm","kubeflow","mlrun","seldon","bentoml","mlserver","torchserve","triton-inference","sagemaker","vertex","azure-ml","databricks","snowflake","dbt","airbyte","fivetran","security","cybersec","infosec","netsec","appsec","devsecops","secops","hacking","hacker","hackers","pentest","pentesting","redteam","red-team","blueteam","blue-team","purpleteam","purple-team","bugbounty","bug-bounty","ctf","capture-the-flag","wargames","hackthebox","tryhackme","picoctf","overthewire","vulnhub","exploit","exploits","exploit-db","cve","nvd","mitre","attck","att-ck","owasp","sans","nist","iso27001","soc2","gdpr","hipaa","pci","pci-dss","compliance","audit","forensics","malware","ransomware","trojan","virus","worm","rootkit","botnet","phishing","spearphishing","whaling","vishing","smishing","social-eng","osint","recon","reconnaissance","footprinting","scanning","enumeration","privilege-escalation","privesc","lateral-movement","persistence","exfil","firewall","ids","ips","waf","siem","soar","edr","xdr","mdr","ndr","vpn","proxy","tor","onion","i2p","freenet","darknet","darkweb","encryption","decryption","cipher","hash","hashing","sha","md5","bcrypt","argon2","scrypt","aes","rsa","ecc","ecdsa","ed25519","curve25519","ssl","tls","https","certificates","pki","x509","acme","letsencrypt","oauth","oauth2","oidc","saml","jwt","tokens","sessions","cookies","mfa","2fa","totp","hotp","fido","fido2","webauthn","passkeys","biometrics","password","passwords","passphrase","keychain","vault","secrets","keys","nmap","masscan","zmap","shodan","censys","greynoise","binaryedge","burp","burpsuite","zap","owasp-zap","nikto","sqlmap","metasploit","cobalt-strike","cobaltstrike","empire","covenant","sliver","mythic","mimikatz","bloodhound","responder","impacket","crackmapexec","evil-winrm","hashcat","john","johntheripper","hydra","medusa","aircrack","aircrack-ng","wireshark","tcpdump","tshark","scapy","ettercap","bettercap","mitmproxy","ghidra","ida","radare2","r2","binary-ninja","hopper","cutter","x64dbg","immunity","ollydbg","gdb","lldb","windbg","frida","objection","cycript","blockchain","crypto","cryptocurrency","defi","de-fi","cefi","ce-fi","bitcoin","btc","ethereum","eth","solana","sol","cardano","ada","polkadot","dot","avalanche","avax","polygon","matic","arbitrum","arb","optimism","op","base","zksync","zk-sync","starknet","scroll","linea","cosmos","atom","osmosis","osmo","celestia","tia","injective","inj","near","nearprotocol","aptos","apt","sui","mina","algorand","algo","tezos","xtz","hedera","hbar","fantom","ftm","harmony","one","elrond","egld","flow","icp","internet-computer","filecoin","fil","arweave","ar","storj","sia","akash","akt","render","rndr","chainlink","link","thegraph","grt","api3","band","uma","tellor","uniswap","uni","sushiswap","sushi","pancakeswap","cake","curve","crv","aave","compound","comp","makerdao","maker","mkr","dai","synthetix","lido","steth","rocketpool","reth","frax","convex","cvx","yearn","yfi","dydx","gmx","perpetual","perp","vertex","hyperliquid","drift","opensea","blur","looksrare","x2y2","sudoswap","nftx","rarible","foundation","nft","nfts","pfp","generative","ordinals","inscriptions","brc20","brc-20","wallet","wallets","metamask","phantom","rainbow","rabby","frame","zerion","ledger","trezor","coldcard","bitbox","keystone","hardware-wallet","seed","seedphrase","seed-phrase","mnemonic","private-key","privatekey","mining","miner","miners","hashrate","hash-rate","pow","pos","dpos","staking","stake","validator","validators","delegation","slashing","gas","gwei","eip","eip1559","erc20","erc721","erc1155","erc4626","dao","daos","governance","proposal","voting","snapshot","tally","multisig","multi-sig","gnosis","safe","timelock","vesting","airdrop","hardware","electronics","circuits","pcb","breadboard","soldering","arduino","esp32","esp8266","stm32","teensy","pico","rp2040","attiny","raspberrypi","raspberry-pi","rpi","rpi4","rpi5","rpi-zero","rpizero","beaglebone","beagle-bone","orangepi","orange-pi","bananapi","banana-pi","jetson","nvidia-jetson","nano","xavier","orin","coral","edge-tpu","fpga","verilog","vhdl","systemverilog","chisel","myhdl","amaranth","xilinx","altera","intel-fpga","lattice","gowin","efinix","anlogic","asic","risc","risc-v","riscv","arm","arm64","aarch64","x86","x64","mips","powerpc","sparc","xtensa","avr","pic","msp430","8051","microcontroller","mcu","soc","cpu","gpu","npu","tpu","dpu","ipu","memory","ram","dram","sram","flash","eeprom","rom","nvram","mram","ssd","nvme","hdd","storage","raid","nas","san","das","iscsi","usb","usb-c","thunderbolt","pcie","sata","nvlink","hdmi","displayport","ethernet","wifi","bluetooth","ble","zigbee","zwave","thread","matter","lora","lorawan","sigfox","nbiot","nb-iot","lte-m","catm1","5g","4g","antenna","antennas","rf","sdr","rtl-sdr","hackrf","limesdr","pluto","oscilloscope","logic-analyzer","multimeter","power-supply","signal-gen","3dprinter","3d-printer","3dprinting","fdm","sla","resin","filament","cnc","laser","lasercutter","laser-cutter","plasma","waterjet","edm","physics","quantum","quantum-physics","quantumphysics","quantummechanics","relativity","einstein","newton","particle","particles","hadron","cern","fermion","boson","higgs","quark","lepton","neutrino","photon","electron","proton","neutron","atom","atoms","atomic","nuclear","fission","fusion","plasma","magnetism","electromagnetism","gravity","gravitation","spacetime","blackhole","black-hole","singularity","wormhole","darkmatter","dark-matter","darkenergy","dark-energy","cosmology","bigbang","big-bang","inflation","astronomy","astrophysics","cosmos","universe","multiverse","galaxy","galaxies","milkyway","milky-way","andromeda","nebula","nebulae","pulsar","quasar","magnetar","supernova","nova","dwarf","whitedwarf","reddwarf","star","stars","stellar","solar","sun","sunspot","corona","flare","planet","planets","planetary","exoplanet","mercury","venus","earth","mars","jupiter","saturn","uranus","neptune","pluto","ceres","eris","moon","moons","lunar","asteroid","asteroids","comet","comets","meteor","telescope","telescopes","hubble","webb","jwst","james-webb","chandra","spitzer","kepler","tess","gaia","vlt","elt","keck","alma","ska","nasa","esa","jaxa","isro","roscosmos","cnsa","spacex","blueorigin","virgin-galactic","rocketlab","relativity-space","firefly","astra","chemistry","chem","chemical","chemicals","molecule","molecules","molecular","organic","inorganic","polymer","polymers","catalyst","reaction","synthesis","element","elements","periodic","periodic-table","hydrogen","helium","lithium","carbon","nitrogen","oxygen","sulfur","phosphorus","potassium","calcium","iron","copper","zinc","silver","gold","platinum","uranium","plutonium","biology","bio","biological","bioscience","lifescience","life-science","cell","cells","cellular","dna","rna","mrna","gene","genes","genetic","genetics","genomics","genome","chromosome","protein","proteins","enzyme","bacteria","bacterial","virus","viral","microbe","microbes","microbiology","fungus","fungi","yeast","algae","plankton","protozoa","amoeba","evolution","darwin","natural-selection","species","taxonomy","phylogeny","ecology","ecosystem","biodiversity","conservation","endangered","extinction","botany","botanical","plant","plants","flora","flower","flowers","tree","trees","forest","forests","rainforest","jungle","grassland","savanna","zoology","animal","animals","fauna","mammal","mammals","reptile","reptiles","amphibian","amphibians","bird","birds","avian","fish","fishes","marine","insect","insects","arthropod","arachnid","spider","spiders","butterfly","earth","earthscience","earth-science","geology","geological","geologist","rock","rocks","mineral","minerals","crystal","crystals","gem","gems","volcano","volcanoes","volcanic","lava","magma","eruption","tectonic","earthquake","earthquakes","seismic","seismology","fault","faults","mountain","mountains","peak","peaks","summit","ridge","range","alps","himalayas","rockies","andes","everest","kilimanjaro","fuji","denali","ocean","oceans","oceanic","atlantic","pacific","indian","arctic","antarctic","sea","seas","mediterranean","caribbean","baltic","adriatic","aegean","river","rivers","stream","streams","creek","creeks","delta","estuary","lake","lakes","pond","ponds","reservoir","wetland","wetlands","swamp","island","islands","peninsula","cape","bay","gulf","strait","channel","continent","continents","africa","asia","europe","northamerica","southamerica","australia","oceania","antarctica","arctic","polar","tropical","equator","climate","weather","meteorology","atmosphere","stratosphere","troposphere","temperature","precipitation","humidity","pressure","wind","winds","storm","storms","hurricane","typhoon","cyclone","tornado","tornadoes","lightning","thunder","thunderstorm","monsoon","blizzard","drought","environment","environmental","eco","ecology","green","sustainable","sustainability","renewable","renewables","solar","solar-power","solarpower","wind-power","windpower","hydro","hydroelectric","geothermal","biomass","nuclear-power","nuclearpower","fusion-power","fusionpower","clean-energy","carbon","carbon-neutral","carbonneutral","netzero","net-zero","emissions","greenhouse","co2","methane","ozone","pollution","pollutants","smog","recycle","recycling","compost","composting","waste","zerowaste","zero-waste","plastic","plastics","microplastic","biodegradable","reusable","disposable","organic","natural","vegan","vegetarian","plantbased","plant-based","climate-change","climatechange","global-warming","globalwarming","ipcc","paris-agreement","cop","cop28","unfccc","epa","wwf","greenpeace","sports","sport","athletics","athletic","athlete","athletes","fitness","workout","workouts","exercise","exercises","training","trainer","gym","football","nfl","soccer","fifa","worldcup","world-cup","premier-league","champions-league","laliga","la-liga","bundesliga","seriea","serie-a","basketball","nba","wnba","ncaa","march-madness","hoops","dunk","slam","baseball","mlb","homerun","home-run","worldseries","world-series","hockey","nhl","ice-hockey","icehockey","puck","slap-shot","goalie","tennis","atp","wta","wimbledon","usopen","us-open","roland-garros","golf","pga","lpga","masters","ryder-cup","birdie","eagle","hole-in-one","boxing","mma","ufc","bellator","wrestling","wwe","aew","judo","karate","taekwondo","jiu-jitsu","jiujitsu","bjj","muay-thai","kickboxing","kung-fu","olympics","olympic","paralympics","paralympic","commonwealthgames","running","runner","runners","marathon","marathons","half-marathon","5k","10k","ultra","ultramarathon","trail-running","trailrunning","cross-country","cycling","cyclist","cycling","tour-de-france","tourdefrance","giro","vuelta","time-trial","peloton","velodrome","bmx","mountainbike","mtb","swimming","swimmer","swimmers","pool","freestyle","backstroke","butterfly","triathlon","triathlete","ironman","sprint-tri","olympic-tri","duathlon","weightlifting","powerlifting","crossfit","bodybuilding","strongman","yoga","pilates","aerobics","zumba","hiit","cardio","stretching","mobility","surfing","surf","surfer","surfers","waves","barrel","pipeline","wsl","skateboarding","skate","skater","skaters","sk8","halfpipe","vert","street","snowboarding","snowboard","snowboarder","skiing","ski","skier","slopes","climbing","climber","climbers","bouldering","trad","sport-climbing","parkour","freerunning","free-running","traceur","movement","calisthenics","music","musician","musicians","musical","song","songs","album","albums","artist","artists","band","bands","singer","singers","vocalist","voice","rock","rock-music","rockmusic","rocknroll","rock-n-roll","classic-rock","pop","pop-music","popmusic","kpop","k-pop","jpop","j-pop","cpop","c-pop","hiphop","hip-hop","rap","rapper","rappers","trap","drill","grime","rnb","r-n-b","soul","funk","disco","motown","reggae","dancehall","ska","jazz","jazz-music","jazzmusic","bebop","swing","bigband","big-band","blues","blues-music","bluesmusic","delta-blues","chicago-blues","electric","country","country-music","countrymusic","bluegrass","americana","folk","electronic","edm","techno","house","trance","dubstep","drum-and-bass","dnb","drumnbass","ambient","chillout","chill-out","lofi","lo-fi","beats","classical","classical-music","classicalmusic","orchestra","symphony","opera","choir","choral","chamber","baroque","romantic","contemporary","metal","heavy-metal","heavymetal","death-metal","black-metal","thrash","punk","punk-rock","punkrock","hardcore","emo","screamo","post-punk","indie","indie-rock","indierock","indie-pop","indiepop","alternative","grunge","shoegaze","dream-pop","dreampop","noise","experimental","world-music","worldmusic","latin","salsa","merengue","bachata","cumbia","afrobeat","afro-beat","afropop","afro-pop","highlife","juju","mbalax","guitar","guitarist","bass","bassist","drums","drummer","percussion","keyboard","keyboardist","piano","pianist","synth","synthesizer","keys","violin","violinist","cello","cellist","viola","bass","doublebass","saxophone","sax","trumpet","trombone","clarinet","flute","oboe","horn","dj","deejay","turntable","turntables","mixing","mixer","scratching","producer","producers","production","beatmaker","beat-maker","beats","recording","studio","studios","mastering","mixing","mixing-board","spotify","apple-music","applemusic","tidal","deezer","soundcloud","bandcamp","youtube-music","youtubemusic","amazon-music","amazonmusic","vinyl","records","record","lp","ep","single","singles","discography","concert","concerts","gig","gigs","tour","touring","festival","festivals","coachella","glastonbury","lollapalooza","bonnaroo","burning-man","sxsw","grammy","grammys","brit-awards","vma","ama","billboard","rolling-stone","movies","movie","film","films","cinema","cinematic","theater","theatre","hollywood","bollywood","nollywood","tollywood","anime","animation","documentary","documentaries","doc","docs","docuseries","docu-series","tv","television","series","show","shows","episode","episodes","season","drama","dramas","comedy","comedies","romcom","rom-com","sitcom","sitcoms","action","adventure","thriller","thrillers","horror","scary","slasher","scifi","sci-fi","science-fiction","sciencefiction","fantasy","dystopia","superhero","superheroes","marvel","mcu","dc","dceu","batman","superman","spiderman","spider-man","avengers","xmen","x-men","fantastic-four","starwars","star-wars","startrek","star-trek","trekkie","trekkies","lotr","lord-of-the-rings","lordoftherings","hobbit","tolkien","middle-earth","harrypotter","harry-potter","hogwarts","wizarding","potterhead","gameofthrones","game-of-thrones","got","westeros","houseofdragon","stranger-things","strangerthings","breaking-bad","breakingbad","bettercallsaul","netflix","hulu","disney-plus","disneyplus","hbo","hbomax","max","amazon-prime","amazonprime","primevideo","prime-video","appletv","paramount-plus","paramountplus","peacock","criterion","mubi","shudder","director","directors","filmmaker","filmmakers","cinematographer","dop","actor","actors","actress","actresses","cast","casting","audition","screenwriter","screenwriting","script","scripts","screenplay","storyboard","oscar","oscars","academy-awards","academyawards","emmy","emmys","golden-globe","goldenglobes","bafta","cannes","sundance","tribeca","toronto","tiff","venice","berlinale","sxsw-film","telluride","gaming","gamer","gamers","games","game","videogames","video-games","pc-gaming","pcgaming","console","consoles","handheld","mobile-gaming","playstation","ps5","ps4","ps3","psn","xbox","xboxone","xbox-series","nintendo","switch","switch-2","wii","wiiu","gamecube","n64","snes","nes","steam","steamdeck","steam-deck","epic","epicgames","epic-games","gog","rpg","jrpg","mmorpg","mmo","fps","tps","rts","moba","battle-royale","sandbox","survival","roguelike","roguelite","metroidvania","souls-like","platformer","puzzle","adventure","simulation","sim","sims","strategy","minecraft","fortnite","valorant","csgo","cs2","counterstrike","counter-strike","league","leagueoflegends","league-of-legends","lol","dota","dota2","overwatch","ow2","apex","apexlegends","apex-legends","warzone","callofduty","gta","grandtheftauto","grand-theft-auto","gta6","gta5","rockstar","eldenring","elden-ring","darksouls","dark-souls","bloodborne","sekiro","zelda","totk","botw","tears-of-the-kingdom","breath-of-the-wild","link","mario","supermario","super-mario","mariokart","mario-kart","smashbros","pokemon","pokemongo","pokemon-go","pikachu","scarlet","violet","finalfantasy","final-fantasy","ff16","ff14","ffxiv","squareenix","destiny","destiny2","bungie","halo","haloinfinite","343industries","diablo","diablo4","worldofwarcraft","world-of-warcraft","wow","blizzard","starcraft","hearthstone","overwatch","battlenet","battle-net","assassinscreed","assassins-creed","farcry","far-cry","watchdogs","ubisoft","cyberpunk","cyberpunk2077","witcher","witcher3","cdprojekt","cdpr","baldursgate","baldurs-gate","bg3","larian","divinity","dos2","esports","e-sports","competitive","tournament","tournaments","lan","twitch","streamer","streamers","streaming","youtube-gaming","kick","speedrun","speedrunner","speedrunning","gdq","agdq","sgdq","food","foods","foodie","foodies","cooking","cook","cooks","chef","chefs","recipe","recipes","kitchen","kitchens","culinary","gastronomy","gourmet","restaurant","restaurants","dining","dine","eat","eating","meal","meals","breakfast","brunch","lunch","dinner","supper","snack","snacks","dessert","appetizer","appetizers","entree","entrees","side","sides","course","pizza","pizzas","burger","burgers","sandwich","sandwiches","wrap","wraps","taco","tacos","burrito","burritos","quesadilla","nachos","enchilada","sushi","sashimi","ramen","udon","soba","tempura","teriyaki","bento","pasta","spaghetti","lasagna","ravioli","gnocchi","risotto","italian","steak","steaks","bbq","barbeque","barbecue","grill","grilling","smoker","chicken","beef","pork","lamb","fish","seafood","shrimp","lobster","crab","vegetarian","vegan","plantbased","plant-based","meatless","tofu","tempeh","salad","salads","soup","soups","stew","stews","chili","curry","curries","bread","breads","baking","baker","bakery","pastry","pastries","cake","cookies","brownies","pie","pies","tart","tarts","donut","donuts","coffee","espresso","latte","cappuccino","mocha","americano","coldbrew","tea","teas","greentea","green-tea","blacktea","black-tea","herbal","chai","beer","beers","craft-beer","craftbeer","ipa","lager","stout","ale","brew","wine","wines","redwine","red-wine","whitewine","white-wine","rose","sparkling","cocktail","cocktails","mixology","bartender","bartending","spirits","whiskey","whisky","bourbon","scotch","vodka","gin","rum","tequila","fashion","style","styling","stylist","stylish","trendy","trend","trends","clothing","clothes","outfit","outfits","ootd","lookbook","wardrobe","dress","dresses","shirt","shirts","pants","jeans","shorts","skirt","jacket","jackets","coat","coats","sweater","hoodie","hoodies","blazer","shoes","sneakers","boots","heels","sandals","loafers","footwear","accessories","accessory","jewelry","jewellery","watch","watches","bag","bags","handbag","purse","wallet","sunglasses","hat","hats","scarf","designer","designers","luxury","luxe","haute-couture","hautecouture","runway","catwalk","model","models","modeling","modelling","supermodel","vogue","elle","harpers-bazaar","gq","esquire","cosmopolitan","instyle","beauty","beautiful","gorgeous","stunning","glam","glamour","glamorous","makeup","make-up","cosmetics","lipstick","mascara","eyeliner","eyeshadow","foundation","concealer","blush","bronzer","highlighter","contour","skincare","skin-care","skincareroutine","cleanser","moisturizer","serum","sunscreen","spf","anti-aging","antiaging","wrinkles","acne","pores","hair","haircare","hair-care","hairstyle","hairstyles","haircut","haircolor","blonde","brunette","redhead","highlights","balayage","ombre","extensions","nails","manicure","pedicure","nailart","nail-art","gelnails","acrylics","fragrance","perfume","cologne","scent","scents","aromatherapy","essentials","travel","traveling","travelling","traveler","traveller","travelers","trip","trips","vacation","vacations","holiday","holidays","getaway","adventure","adventures","explore","exploring","explorer","wanderlust","backpacking","backpacker","backpackers","hostel","hostels","hotel","hotels","airbnb","vrbo","booking","expedia","tripadvisor","kayak","skyscanner","flight","flights","airline","airlines","airport","airports","terminal","cruise","cruises","cruising","sailing","yacht","charter","island-hopping","roadtrip","road-trip","roadtrips","driving","scenic","route","routes","hiking","hike","hikes","trail","trails","trek","trekking","camping","beach","beaches","coastal","seaside","oceanfront","beachfront","shore","mountain","mountains","alpine","summit","peak","valley","canyon","gorge","city","cities","urban","metropolitan","downtown","cityscape","skyline","village","villages","town","towns","countryside","rural","scenic","landmark","landmarks","monument","monuments","heritage","unesco","historic","paris","london","newyork","new-york","tokyo","rome","barcelona","amsterdam","berlin","vienna","prague","budapest","lisbon","madrid","athens","istanbul","dubai","singapore","hongkong","hong-kong","bangkok","seoul","taipei","sydney","melbourne","auckland","capetown","cape-town","cairo","marrakech","nairobi","rio","buenosaires","buenos-aires","mexicocity","mexico-city","lima","bogota","sanfrancisco","san-francisco","losangeles","los-angeles","chicago","miami","lasvegas","las-vegas","seattle","boston","austin","denver","portland","vancouver","toronto","montreal","calgary","ottawa","quebec","edmonton","family","families","familytime","family-time","familyfirst","famfam","parents","parenting","parent","parenthood","parentlife","parent-life","mom","moms","momlife","mom-life","mommy","mother","mothers","motherhood","dad","dads","dadlife","dad-life","daddy","father","fathers","fatherhood","kids","kid","children","child","childhood","kidlife","kid-life","toddler","baby","babies","newborn","infant","pregnancy","pregnant","expecting","grandparents","grandma","grandpa","grandmother","grandfather","nana","papa","siblings","sibling","brother","brothers","sister","sisters","twins","friends","friend","friendship","friendships","bestfriend","best-friend","bff","besties","bestie","squad","squadgoals","squad-goals","crew","gang","dating","date","dates","relationship","relationships","couple","couples","boyfriend","girlfriend","partner","partners","significant-other","so","engaged","engagement","fiance","fiancee","wedding","weddings","bride","groom","married","marriage","spouse","husband","wife","newlyweds","anniversary","anniversaries","love","loving","romance","romantic","single","singles","singlelife","single-life","bachelor","bachelorette","divorce","divorced","separated","coparenting","co-parenting","stepparent","blended","blendedfamily","blended-family","adoption","adopted","foster","lgbtq","lgbt","lgbtqia","queer","pride","pridemonth","pride-month","gay","gays","lesbian","lesbians","bisexual","bi","pansexual","pan","transgender","trans","nonbinary","non-binary","nb","genderfluid","genderqueer","asexual","ace","aromantic","aro","demisexual","demi","intersex","ally","coming-out","comingout","outandproud","out-and-proud","loveislove","love-is-love","feminist","feminism","feminists","womensrights","womens-rights","equality","civilrights","civil-rights","humanrights","human-rights","socialjustice","blm","blacklivesmatter","black-lives-matter","antiracism","anti-racism","indigenous","native","firstnations","first-nations","aboriginal","tribal","disability","disabled","accessibility","a11y","inclusion","inclusive","neurodivergent","adhd","autism","autistic","dyslexia","dyslexic","mental-health","mentalhealth","anxiety","depression","bipolar","ptsd","ocd","therapy","selfcare","self-care","wellness","wellbeing","well-being","mindfulness","meditation","meditate","mindful","zen","calm","peace","peaceful","serenity","recovery","sober","sobriety","clean","aa","na","12steps","12-steps","support","supportgroup","support-group","community","communities","tribe","religion","religious","faith","faithful","belief","believe","believer","spiritual","spirituality","spirit","spirits","soul","souls","divine","christian","christianity","christians","church","churches","jesus","christ","catholic","catholicism","catholics","protestant","evangelical","baptist","methodist","lutheran","presbyterian","orthodox","episcopal","anglican","mormon","lds","latterday","latter-day","jehovah","adventist","pentecostal","jewish","judaism","jews","hebrew","israel","israeli","kosher","sabbath","torah","talmud","synagogue","temple","rabbi","hanukkah","passover","yom-kippur","muslim","islam","islamic","muslims","quran","koran","allah","muhammad","mosque","masjid","imam","halal","ramadan","eid","hajj","mecca","medina","hindu","hinduism","hindus","vedic","yoga","karma","dharma","mantra","temple","temples","krishna","shiva","vishnu","ganesh","diwali","holi","buddhist","buddhism","buddhists","buddha","zen","tibetan","dalai-lama","meditation","enlightenment","nirvana","sangha","dharma","sutra","sikh","sikhism","sikhs","guru","gurus","gurdwara","punjabi","pagan","paganism","wicca","wiccan","witchcraft","witch","witches","atheist","atheism","agnostic","agnosticism","secular","humanist","humanism","prayer","prayers","praying","worship","worshipping","praise","praising","blessing","blessings","blessed","miracle","miracles","grace","salvation","heaven","hell","afterlife","eternal","eternity","resurrection","redemption","work","working","worker","workers","workplace","worklife","work-life","job","jobs","career","careers","profession","professional","professionals","office","offices","corporate","corporation","company","companies","business","startup","startups","entrepreneur","entrepreneurs","entrepreneurship","founder","ceo","cto","cfo","coo","cmo","ciso","vp","director","manager","lead","employee","employees","employer","employers","hr","humanresources","human-resources","hiring","hire","recruit","recruiting","recruitment","talent","headhunter","interview","interviews","interviewing","resume","cv","linkedin","networking","salary","salaries","compensation","benefits","perks","bonus","bonuses","promotion","promoted","raise","negotiation","negotiate","contract","contracts","remote","remotework","remote-work","wfh","workfromhome","work-from-home","hybrid","flexible","flexibility","freelance","freelancer","freelancing","gig","gigeconomy","gig-economy","sideproject","side-project","sidehustle","meeting","meetings","presentation","presentations","conference","conferences","project","projects","deadline","deadlines","milestone","milestones","deliverable","team","teams","teamwork","collaboration","collaborate","agile","scrum","kanban","leadership","leader","leaders","management","manage","managing","productivity","efficiency","efficient","effective","performance","kpi","okr","metrics","burnout","stress","stressed","workload","overtime","quit","quitting","resign","retirement","retired","retiring","pension","401k","ira","savings","invest","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","42","50","60","69","70","80","88","90","99","100","101","111","123","200","222","247","300","333","365","400","404","420","444","500","555","666","700","777","800","888","900","911","999","1000","1111","1234","2000","2020","2021","2022","2023","2024","2025","2026","2027","2028","2029","2030","2050","3000","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ch1","ch2","ch3","ch4","ch5","ch6","ch7","ch8","ch9","ch10","ch11","ch12","ch13","ch14","ch15","ch16","ch17","ch18","ch19","ch20","channel1","channel2","channel3","channel4","channel5","channel6","channel7","channel8","channel9","channel10","channel11","channel12","channel13","room1","room2","room3","room4","room5","room6","room7","room8","room9","room10","group1","group2","group3","group4","group5","group6","group7","group8","group9","group10","team1","team2","team3","team4","team5","team6","team7","team8","team9","team10","zone1","zone2","zone3","zone4","zone5","zone6","zone7","zone8","zone9","zone10","area1","area2","area3","area4","area5","area6","area7","area8","area9","area10","sector1","sector2","sector3","sector4","sector5","sector6","sector7","sector8","net1","net2","net3","net4","net5","net6","net7","net8","net9","net10","link1","link2","link3","link4","link5","link6","link7","link8","link9","link10","node1","node2","node3","node4","node5","node6","node7","node8","node9","node10","hub1","hub2","hub3","hub4","hub5","hub6","hub7","hub8","hub9","hub10","mesh1","mesh2","mesh3","mesh4","mesh5","mesh6","mesh7","mesh8","mesh9","mesh10","radio1","radio2","radio3","radio4","radio5","radio6","radio7","radio8","radio9","relay1","relay2","relay3","relay4","relay5","relay6","relay7","relay8","relay9","base1","base2","base3","base4","base5","base6","base7","base8","base9","base10","unit1","unit2","unit3","unit4","unit5","unit6","unit7","unit8","unit9","unit10","server1","server2","server3","server4","server5","server6","server7","server8","dev1","dev2","dev3","dev4","dev5","prod1","prod2","prod3","stage1","stage2","test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","user1","user2","user3","user4","user5","admin1","admin2","admin3","ops1","ops2","alpha","bravo","charlie","delta","echo","foxtrot","golf","hotel","india","juliet","kilo","lima","mike","november","oscar","papa","quebec","romeo","sierra","tango","uniform","victor","whiskey","xray","x-ray","yankee","zulu","alpha1","bravo1","charlie1","delta1","echo1","foxtrot1","alpha-team","bravo-team","charlie-team","delta-team","echo-team","team-alpha","team-bravo","team-charlie","team-delta","team-echo","red","blue","green","yellow","orange","purple","pink","black","white","gray","grey","brown","gold","silver","bronze","copper","platinum","cyan","magenta","teal","navy","maroon","olive","lime","aqua","coral","crimson","indigo","violet","turquoise","beige","ivory","tan","khaki","red-team","blue-team","green-team","yellow-team","orange-team","purple-team","team-red","team-blue","team-green","team-yellow","team-orange","team-purple","rednet","bluenet","greennet","blacknet","whitenet","darknet","clearnet","monday","tuesday","wednesday","thursday","friday","saturday","sunday","mon","tue","wed","thu","fri","sat","sun","weekday","weekend","january","february","march","april","may","june","july","august","september","october","november","december","jan","feb","mar","apr","jun","jul","aug","sep","oct","nov","dec","spring","summer","fall","autumn","winter","season","seasons","seasonal","morning","afternoon","evening","night","midnight","noon","dawn","dusk","daily","weekly","monthly","yearly","annual","quarterly","hourly","today","tomorrow","yesterday","now","later","soon","always","never","24-7","247","round-the-clock","nonstop","non-stop","always-on","alwayson","north","south","east","west","northeast","northwest","southeast","southwest","northern","southern","eastern","western","central","middle","center","up","down","left","right","top","bottom","front","back","side","upper","lower","inner","outer","inside","outside","above","below","near","far","close","distant","local","remote","nearby","faraway","here","there","everywhere","anywhere","somewhere","nowhere","wherever","mini","micro","nano","tiny","small","little","medium","large","big","huge","giant","massive","mega","giga","tera","peta","exa","ultra","super","hyper","extreme","max","maximum","min","minimum","plus","extra","lite","light","heavy","full","empty","half","partial","complete","total","all-chat","allchat","main-chat","mainchat","public-chat","publicchat","general-chat","generalchat","global-chat","globalchat","world-chat","worldchat","local-chat","localchat","open-chat","openchat","free-chat","freechat","random-chat","randomchat","voice-chat","voicechat","text-chat","textchat","all-net","allnet","main-net","mainnet","test-net","testnet","dev-net","devnet","local-net","localnet","global-net","globalnet","public-net","publicnet","mesh-net","meshnet","radio-net","radionet","ham-net","hamnet","emerg-net","emergnet","all-hands","allhands","town-hall","townhall","standby","stand-by","on-call","oncall","help-desk","helpdesk","support","tech-support","techsupport","customer-support","feedback","suggestions","ideas","feature-requests","featurerequests","bug-reports","watercooler","water-cooler","coffee-break","coffeebreak","break-room","breakroom","off-topic","offtopic","random","misc","miscellaneous","other","everything-else","introductions","intro","intros","welcome","new-members","newmembers","onboarding","announcements","announce","news","updates","changelog","releases","roadmap","rules","guidelines","faq","faqs","help","how-to","howto","tutorial","tutorials","resources","links","useful-links","usefullinks","bookmarks","reference","docs","showcase","show-and-tell","showandtell","gallery","portfolio","projects","builds","jobs","hiring","careers","opportunities","gigs","freelance","classifieds","buy-sell","buysell","marketplace","trade","trading","swap","swaps","deals","events","meetups","meetup","gatherings","conferences","workshops","webinars","study-group","studygroup","book-club","bookclub","movie-night","movienight","game-night","gamenight","trivia","quiz","contests","challenges","competitions","reddit","twitter","x","facebook","fb","instagram","ig","insta","tiktok","youtube","yt","pinterest","snapchat","snap","linkedin","tumblr","threads","mastodon","fediverse","bluesky","bsky","discord","slack","telegram","signal","whatsapp","messenger","wechat","line","kakao","viber","matrix","element","clubhouse","spaces","periscope","vine","myspace","digg","stumbleupon","quora","medium","substack","patreon","onlyfans","fanhouse","gumroad","behance","dribbble","deviantart","artstation","pixiv","flickr","500px","meme","memes","dank","dankmemes","dank-memes","cursed","blessed","blursed","cringe","based","redpill","redpilled","blackpill","copium","hopium","cope","poggers","pog","pogchamp","pepe","wojak","gigachad","chad","virgin","simp","simping","stan","stanning","parasocial","irl","afk","brb","ttyl","fomo","yolo","goat","goated","lit","fire","slay","slaying","periodt","sus","sussy","imposter","amogus","amongus","among-us","crewmate","ratio","ratiod","L","W","big-L","big-W","touch-grass","touchgrass","npc","npcs","normie","normies","sheeple","boomer","zoomer","doomer","coomer","consoomer","wagie","neet","incel","volcel","blackpilled","glowie","janny","jannie","based-and-redpilled","keyed","kino","sovl","tfw","mfw","mrw","imo","imho","afaik","eli5","tldr","tl-dr","reddit-moment","leddit","hivemind","groupthink","echo-chamber","circlejerk","wholesome","wholesome100","chungus","big-chungus","keanu","reeves","stonks","not-stonks","diamond-hands","diamondhands","paper-hands","hodl","to-the-moon","tothemoon","moon","mooning","ape","apes","ape-together","tendies","gme","gamestop","wallstreetbets","wsb","yeet","yeeted","yoink","noob","newb","newbie","scrub","pwned","owned","rekt","wrecked","gg","ggwp","ggez","ez","ezpz","no-cap","nocap","cap","capping","fr","frfr","bussin","valid","bet","no-shot","sheesh","sheeesh","ong","ongggg","mid","L-take","W-take","hot-take","cold-take","spicy","spicy-take","rent-free","rentfree","living-rent-free","unhinged","brainrot","brain-rot","vtuber","vtubers","vtubing","hololive","nijisanji","vshoujo","idol","content","content-creator","contentcreator","creator","creators","influencer","influencers","viral","viralvideo","viral-video","trending","fyp","foryou","for-you","foryoupage","algorithm","algo","engagement","analytics","metrics","subscriber","subscribers","subs","sub","follower","followers","following","like","likes","share","shares","repost","reposts","retweet","rt","quote","comment","comments","reply","replies","dm","dms","direct-message","inbox","notification","notifications","notif","notifs","ping","pings","mention","highlight","highlights","clip","clips","vod","vods","archive","archives","premiere","premieres","watchparty","watch-party","reaction","reactions","react","reacting","review","reviews","tier-list","tierlist","ranking","collab","collabs","collaboration","crossover","feature","featured","guest","host","hosting","cohost","co-host","panel","panels","podcast","podcasts","episode","ep","eps","season","seasons","series","miniseries","mini-series","subreddit","subreddits","sub","subs","thread","threads","post","posts","forum","forums","board","boards","chan","chans","4chan","8chan","8kun","imageboard","textboard","bbs","bulletin-board","usenet","newsgroup","irc","ircnet","efnet","freenode","libera","oftc","rizon","undernet","xmpp","jabber","mumble","teamspeak","ts3","ventrilo","vent","raidcall","wiki","wikipedia","wikia","fandom","tvtropes","knowyourmeme","kym","encyclopediadramatica","ed","urban-dictionary","urbandictionary","ud","google","alphabet","apple","microsoft","msft","amazon","meta","facebook","nvidia","nvda","amd","intel","qualcomm","broadcom","samsung","tsmc","oracle","sap","salesforce","adobe","autodesk","vmware","dell","hp","hpe","ibm","cisco","juniper","arista","palo-alto","fortinet","crowdstrike","palantir","snowflake","databricks","mongodb","elastic","splunk","datadog","zoom","webex","teams","meet","slack","atlassian","jira","confluence","notion","airtable","coda","asana","monday","clickup","trello","basecamp","figma","sketch","invision","zeplin","framer","webflow","squarespace","wix","shopify","bigcommerce","magento","woocommerce","stripe","paypal","square","plaid","brex","ramp","affirm","klarna","afterpay","coinbase","binance","robinhood","fidelity","vanguard","schwab","etrade","interactive-brokers","uber","lyft","doordash","grubhub","instacart","postmates","deliveroo","airbnb","vrbo","booking","expedia","kayak","tripadvisor","yelp","spotify","apple-music","pandora","soundcloud","bandcamp","tidal","deezer","dropbox","box","onedrive","gdrive","google-drive","icloud","mega","nintendo","sony","playstation","xbox","microsoft-gaming","activision","blizzard","activision-blizzard","ea","electronic-arts","ubisoft","epic","valve","steam","rockstar","take-two","2k","bethesda","zenimax","id-software","bioware","dice","respawn","bungie","343","naughtydog","insomniac","santa-monica","guerrilla","sucker-punch","bend","bluepoint","housemarque","fromsoftware","from-software","bandainamco","bandai-namco","capcom","konami","sega","atlus","squareenix","square-enix","enix","square","level5","gamefreak","game-freak","creatures","pokemon-company","mihoyo","hoyoverse","riot","riot-games","tencent","netease","nexon","ncsoft","krafton","pubg","supercell","king","rovio","zynga","playtika","scopely","jam-city","paradox","firaxis","amplitude","creative-assembly","relic","obsidian","larian","cd-projekt","cdpr","techland","4a-games","remedy","io-interactive","disney","pixar","marvel","lucasfilm","warner","warnerbros","warner-bros","universal","paramount","sony-pictures","lionsgate","mgm","dreamworks","illumination","laika","ghibli","studio-ghibli","toei","sunrise","bones","madhouse","mappa","wit","trigger","kyoani","kyoto-animation","ufotable","a1-pictures","cloverworks","shaft","gainax","khara","production-ig","ig","netflix","hulu","hbo","max","disney-plus","prime-video","peacock","paramount-plus","apple-tv","crunchyroll","funimation","hidive","vrv","cbs","nbc","abc","fox","cw","amc","fx","showtime","starz","epix","bbc","itv","channel4","sky","britbox","hayu","acorn","curiositystream","discovery","discovery-plus","history","natgeo","nat-geo","animal-planet","tesla","rivian","lucid","nio","xpeng","byd","polestar","fisker","ford","gm","general-motors","chevy","chevrolet","dodge","ram","jeep","chrysler","toyota","honda","nissan","mazda","subaru","mitsubishi","hyundai","kia","genesis","volkswagen","vw","audi","bmw","mercedes","porsche","lamborghini","ferrari","maserati","alfa-romeo","fiat","volvo","land-rover","range-rover","jaguar","bentley","rolls-royce","aston-martin","mclaren","bugatti","koenigsegg","pagani","rimac","lotus","alpine","medical","medicine","healthcare","health-care","hospital","hospitals","doctor","doctors","dr","physician","physicians","surgeon","surgeons","nurse","nurses","nursing","rn","lpn","cna","np","pa","physician-assistant","pharmacy","pharmacist","pharmacists","pharma","pharmaceutical","rx","dentist","dentists","dental","dentistry","orthodontist","orthodontics","optometrist","ophthalmologist","optometry","vision","eye-care","eyecare","therapist","therapists","therapy","counselor","counseling","psychologist","psychiatrist","psychiatry","psychology","mental-health","mentalhealth","physical-therapy","pt","occupational-therapy","ot","speech-therapy","slp","chiropractor","chiropractic","acupuncture","acupuncturist","naturopath","emt","paramedic","paramedics","ems","emergency","er","icu","nicu","radiology","radiologist","xray","mri","ct","ultrasound","imaging","pathology","pathologist","lab","laboratory","diagnostics","testing","oncology","oncologist","cancer","tumor","chemotherapy","radiation","cardiology","cardiologist","heart","cardiac","cardiovascular","cv","neurology","neurologist","neuro","brain","spine","neurosurgery","pediatrics","pediatrician","peds","children","child-health","childhealth","geriatrics","geriatrician","elderly","senior-care","seniorcare","aging","dermatology","dermatologist","derm","skin","skincare","skin-care","orthopedics","orthopedic","ortho","bone","joint","sports-medicine","gastroenterology","gastro","gi","digestive","gut","intestinal","endocrinology","endocrine","diabetes","thyroid","hormone","hormones","pulmonology","pulmonologist","respiratory","lung","lungs","breathing","nephrology","nephrologist","kidney","kidneys","renal","dialysis","urology","urologist","bladder","prostate","urinary","reproductive","obgyn","ob-gyn","obstetrics","gynecology","obstetrician","gynecologist","fertility","ivf","reproductive-health","reproductivehealth","prenatal","legal","lawyer","lawyers","attorney","attorneys","law","laws","lawfirm","paralegal","paralegals","legal-assistant","legalassistant","clerk","clerks","judge","judges","court","courts","courthouse","trial","trials","jury","litigation","litigator","litigators","lawsuit","lawsuits","case","cases","criminal","criminal-law","defense","defender","prosecution","prosecutor","civil","civil-law","tort","torts","injury","personal-injury","malpractice","corporate-law","corporatelaw","business-law","commercial","contracts","intellectual-property","ip","patent","patents","trademark","copyright","family-law","familylaw","divorce","custody","child-support","alimony","immigration","immigration-law","visa","visas","citizenship","naturalization","real-estate-law","property-law","estate","estates","probate","trusts","tax-law","taxlaw","irs","tax-attorney","taxattorney","audit","audits","employment-law","labor-law","hr-law","discrimination","harassment","constitutional","constitutional-law","civil-rights","human-rights","environmental-law","epa","regulation","regulations","compliance","bankruptcy","restructuring","insolvency","creditor","debtor","debt","education","educator","educators","teach","teaching","teacher","teachers","professor","professors","prof","profs","faculty","academic","academics","student","students","pupil","pupils","learner","learners","learning","school","schools","elementary","primary","middle-school","middleschool","high-school","highschool","secondary","k12","k-12","grade","grades","college","colleges","university","universities","uni","campus","campuses","undergraduate","undergrad","graduate","grad","postgrad","phd","doctorate","masters","bachelors","associates","degree","degrees","diploma","diplomas","curriculum","syllabus","course","courses","class","classes","lecture","seminar","seminars","workshop","workshops","lab","labs","laboratory","tutor","tutors","tutoring","mentor","mentors","mentoring","mentorship","homeschool","homeschooling","unschool","unschooling","montessori","waldorf","stem","steam","science","math","mathematics","calculus","algebra","english","literature","writing","grammar","composition","rhetoric","history","geography","social-studies","socialstudies","civics","economics","art","arts","music","drama","theater","theatre","dance","visual-arts","physical-education","pe","gym","athletics","sports","health","wellness","construction","contractor","contractors","builder","builders","building","carpenter","carpenters","carpentry","woodwork","woodworking","woodworker","electrician","electricians","electrical","electric","wiring","power","plumber","plumbers","plumbing","pipes","piping","drainage","sewage","hvac","heating","cooling","ac","air-conditioning","ventilation","duct","roofer","roofers","roofing","roof","roofs","shingles","gutters","mason","masons","masonry","brick","bricks","stone","concrete","cement","painter","painters","painting","paint","wallpaper","drywall","finishing","welder","welders","welding","fabrication","fabricator","metalwork","machinist","machinists","machining","lathe","mill","milling","turning","mechanic","mechanics","mechanical","automotive","auto","car-repair","landscaper","landscapers","landscaping","lawn","garden","gardening","surveyor","surveyors","surveying","survey","land","property","boundary","architect","architects","architecture","architectural","design","drafting","engineer","engineers","engineering","structural","civil-engineering","inspector","inspectors","inspection","code","codes","permit","permits","firefighter","firefighters","fire","fire-department","firedepartment","fd","police","police-officer","policeofficer","cop","cops","officer","officers","sheriff","sheriffs","deputy","deputies","detective","detectives","state-trooper","trooper","troopers","highway-patrol","patrol","patrolling","swat","tactical","k9","k-9","canine","bomb-squad","bombsquad","hostage","emt","emts","paramedic","paramedics","ambulance","ems","first-responder","dispatcher","dispatchers","dispatch","911","emergency","emergencies","search-rescue","sar","rescue","rescuer","rescuers","coast-guard","lifeguard","hazmat","hazardous","decon","decontamination","chemical","biological","military","armed-forces","armedforces","defense","defence","dod","mod","army","soldier","soldiers","infantry","armor","artillery","cavalry","navy","sailor","sailors","naval","fleet","submarine","surface","carrier","airforce","air-force","pilot","pilots","aviator","aviation","fighter","marines","marine","marinecorps","marine-corps","leatherneck","oorah","coastguard","coast-guard","uscg","maritime","port","harbor","border","spaceforce","space-force","ussf","space","satellite","orbital","launch","national-guard","nationalguard","guard","reserve","reserves","reservist","veteran","veterans","vet","vets","retired","retiree","retirees","officer","officers","enlisted","nco","warrant","general","admiral","special-ops","specialops","specops","sof","delta","seals","rangers","green-berets","greenberets","airborne","paratrooper","paratroopers","outdoor","outdoors","outside","nature","wilderness","wild","backcountry","hiking","hiker","hikers","backpacking","backpacker","thru-hike","thruhike","camping","camper","campers","campsite","tent","tenting","glamping","rv","rving","campervan","vanlife","van-life","overlanding","overland","fishing","fisher","fishers","angler","anglers","angling","fly-fishing","hunting","hunter","hunters","hunt","game","wildlife","deer","elk","duck","birding","birdwatching","bird-watching","birder","birders","ornithology","foraging","forager","foragers","mushroom","mushrooms","fungi","mycology","kayaking","kayak","kayaker","kayakers","canoeing","canoe","paddling","rafting","raft","rafts","whitewater","white-water","rapids","river","scuba","diving","diver","divers","snorkeling","snorkel","freediving","sailing","sailor","sailors","sail","sailboat","yacht","yachting","rock-climbing","rockclimbing","bouldering","climber","climbers","crag","mountaineering","mountaineer","alpinism","alpine","summit","peak-bagging","caving","caver","cavers","spelunking","spelunker","cave","caves","offroad","off-road","atv","utv","sxs","dirtbike","dirt-bike","quad","photography","photographer","photographers","photo","photos","camera","videography","videographer","video","videos","filming","filmmaking","painting","painter","painters","canvas","acrylic","oil","watercolor","drawing","drawer","drawers","sketch","sketching","pencil","charcoal","sculpting","sculptor","sculptors","sculpture","clay","pottery","ceramics","knitting","knitter","knitters","knit","yarn","wool","needles","pattern","crocheting","crochet","crocheter","hook","hooks","amigurumi","blanket","sewing","sewer","sewers","seamstress","tailor","fabric","quilting","embroidery","embroiderer","cross-stitch","crossstitch","needlepoint","woodworking","woodworker","woodworkers","carpentry","furniture","lathe","metalworking","metalworker","blacksmith","blacksmithing","forge","forging","leatherworking","leatherwork","leather","leathercraft","tanning","tooling","jewelry-making","jewelrymaking","jeweler","beading","beads","wirework","origami","paper-craft","papercraft","scrapbooking","scrapbook","cardmaking","calligraphy","calligrapher","lettering","hand-lettering","handlettering","candle-making","candlemaking","soap-making","soapmaking","bath-bombs","collecting","collector","collectors","collection","collections","collectible","stamps","stamp","philately","philatelist","postage","postal","letters","coins","coin","numismatics","numismatist","currency","bullion","precious","cards","card","trading-cards","tradingcards","tcg","ccg","mtg","pokemon-tcg","comics","comic","comic-books","comicbooks","graphic-novels","graphicnovels","manga","manhwa","manhua","webtoon","webtoons","light-novel","lightnovel","figurines","figure","figures","statue","statues","action-figures","toys","funko","funko-pop","funkopop","pop","pops","nendoroid","figma","sh-figuarts","model-kits","modelkits","gunpla","gundam","plamo","scale-models","miniatures","lego","legos","bricks","moc","mocs","afol","tfol","kfol","megabloks","antiques","antique","vintage","retro","thrift","thrifting","estate-sale","vinyl","records","record","lp","lps","turntable","audiophile","hifi","watches","watch","horology","horologist","timepiece","wristwatch","pocket","boardgame","boardgames","board-games","board-game","tabletop","table-top","cardgame","cardgames","card-games","card-game","deckbuilder","deck-builder","rpg","rpgs","tabletop-rpg","ttrpg","pen-and-paper","roleplay","roleplaying","dnd","d-and-d","dungeons-and-dragons","dungeonsanddragons","dungeon","dragon","pathfinder","starfinder","call-of-cthulhu","coc","shadowrun","cyberpunk-red","warhammer","warhammer40k","40k","age-of-sigmar","aos","sigmar","gw","warmachine","hordes","infinity","malifaux","necromunda","kill-team","killteam","miniature","miniatures","minis","mini","wargaming","wargames","wargamer","painting-minis","paintingminis","mini-painting","minipainting","terrain","chess","checkers","go","baduk","weiqi","shogi","mahjong","mah-jong","poker","blackjack","bridge","canasta","rummy","hearts","spades","solitaire","catan","settlers","ticket-to-ride","tickettoride","pandemic","wingspan","gloomhaven","spirit-island","spiritisland","terraforming-mars","scythe","pets","pet","petcare","pet-care","petowner","pet-owner","petparents","dogs","dog","puppy","puppies","pupper","doggo","doggos","canine","k9","cats","cat","kitten","kittens","kitty","kitties","feline","meow","birds","bird","parrot","parrots","parakeet","budgie","cockatiel","finch","fish","aquarium","aquariums","fishtank","fish-tank","freshwater","saltwater","reef","reeftank","reef-tank","coral","corals","marine","aquascape","reptiles","reptile","snake","snakes","lizard","lizards","gecko","bearded","turtle","turtles","tortoise","tortoises","terrapin","amphibian","frog","rabbit","rabbits","bunny","bunnies","hare","lagomorph","binky","binkies","hamster","hamsters","gerbil","gerbils","mouse","mice","rat","rats","guinea-pig","guineapig","guinea","cavy","cavies","chinchilla","ferret","horse","horses","equine","equestrian","pony","ponies","riding","stable","farm","farming","farmlife","farm-life","livestock","chicken","chickens","goat","goats","sheep","lamb","lambs","pig","pigs","cow","cows","cattle","english","spanish","espanol","french","francais","german","deutsch","italian","italiano","portuguese","portugues","russian","russkiy","japanese","nihongo","chinese","mandarin","cantonese","zhongwen","korean","hangul","hangugeo","arabic","hindi","urdu","bengali","turkish","turkce","persian","farsi","dutch","nederlands","polish","swedish","svenska","norwegian","norsk","danish","dansk","finnish","greek","ellinika","hebrew","ivrit","vietnamese","tiengviet","thai","indonesian","bahasa","malay","tagalog","filipino","swahili","kiswahili","czech","cestina","hungarian","magyar","romanian","romana","ukrainian","usa","united-states","unitedstates","america","american","americans","canada","canadian","canadians","mexico","mexican","mexicans","brasil","brazil","brazilian","argentina","argentine","chile","chilean","peru","colombia","colombian","venezuela","venezuelan","ecuador","uruguay","uk","united-kingdom","unitedkingdom","britain","british","england","scotland","scottish","wales","welsh","ireland","irish","northern-ireland","france","french","germany","german","germans","italy","italian","italians","spain","spanish","portugal","portuguese","netherlands","dutch","belgium","switzerland","swiss","austria","austrian","poland","polish","czech","russia","russian","russians","ukraine","ukrainian","ukrainians","belarus","china","chinese","taiwan","taiwanese","hongkong","hong-kong","macau","japan","japanese","korea","korean","koreans","north-korea","south-korea","india","indian","indians","pakistan","pakistani","bangladesh","bangladeshi","australia","australian","australians","aussie","aussies","nz","newzealand","new-zealand","kiwi","kiwis","fiji","fijian","samoa","samoan","tonga","philippines","filipino","filipinos","pinoy","pinay","vietnam","vietnamese","thailand","thai","thais","indonesia","indonesian","malaysia","malaysian","singapore","singaporean","brunei","myanmar","burmese","cambodia","cambodian","laos","laotian","nepal","nepali","srilanka","sri-lanka","srilankan","egypt","egyptian","egyptians","morocco","moroccan","algeria","algerian","tunisia","tunisian","libya","libyan","sudan","sudanese","ethiopia","kenya","kenyan","kenyans","tanzania","tanzanian","uganda","ugandan","nigeria","nigerian","nigerians","ghana","ghanaian","senegal","senegalese","southafrica","south-africa","southafrican","south-african","namibia","botswana","zimbabwe","zambia","mozambique","angola","congo","congolese","israel","israeli","israelis","palestine","palestinian","palestinians","jordan","jordanian","lebanon","lebanese","syria","syrian","iraq","iraqi","iran","iranian","iranians","persian","persians","saudi","saudi-arabia","uae","emirates","emirati","dubai","abudhabi","abu-dhabi","qatar","qatari","kuwait","kuwaiti","bahrain","bahraini","oman","omani","yemen","yemeni","turkey","turkish","turks","greece","greek","greeks","cyprus","cypriot","scandinavia","scandinavian","nordic","norway","norwegian","sweden","swedish","denmark","danish","finland","finnish","finns","iceland","icelandic","baltics","baltic","estonia","estonian","latvia","latvian","lithuania","balkans","balkan","serbia","serbian","croatia","croatian","bosnia","slovenia","slovenian","macedonia","macedonian","albania","albanian","romania","romanian","bulgaria","bulgarian","hungary","hungarian","slovakia","slovak","slovakian","moldova","moldovan","georgia","georgian","armenia","armenian","azerbaijan","azerbaijani","kazakhstan","kazakh","uzbekistan","uzbek","turkmenistan","kyrgyzstan","tajikistan","mongolia","caribbean","jamaica","jamaican","bahamas","bahamian","barbados","trinidad","cuba","cuban","haiti","haitian","dominican","puerto-rico","puertorico","latin","latino","latina","latinx","hispanic","latinoamerica","latam","california","cali","ca","socal","norcal","bayarea","bay-area","la","texas","tx","houston","dallas","austin","sanantonio","san-antonio","florida","fl","miami","orlando","tampa","jacksonville","fortlauderdale","newyork","new-york","ny","nyc","brooklyn","manhattan","queens","bronx","pennsylvania","pa","philly","philadelphia","pittsburgh","harrisburg","illinois","il","chicago","chi","chiraq","chitown","springfield","ohio","oh","cleveland","columbus","cincinnati","toledo","akron","georgia","ga","atlanta","atl","savannah","augusta","macon","northcarolina","north-carolina","nc","charlotte","raleigh","durham","southcarolina","south-carolina","sc","charleston","columbia","greenville","michigan","mi","detroit","annarbor","ann-arbor","grandrapids","lansing","newjersey","new-jersey","nj","jersey","newark","trenton","atlantic-city","virginia","va","richmond","norfolk","vb","virginia-beach","alexandria","washington","wa","seattle","tacoma","spokane","olympia","bellevue","arizona","az","phoenix","phx","tucson","scottsdale","mesa","tempe","massachusetts","ma","boston","cambridge","worcester","springfield","tennessee","tn","nashville","memphis","knoxville","chattanooga","indiana","in","indianapolis","indy","fortwayne","fort-wayne","southbend","missouri","mo","stlouis","st-louis","kansascity","kansas-city","springfield","maryland","md","baltimore","bmore","annapolis","bethesda","rockville","wisconsin","wi","milwaukee","madison","greenbay","green-bay","kenosha","colorado","co","denver","boulder","coloradosprings","colorado-springs","minnesota","mn","minneapolis","stpaul","st-paul","twincities","twin-cities","alabama","al","birmingham","montgomery","mobile","huntsville","tuscaloosa","louisiana","la","neworleans","new-orleans","nola","batonrouge","baton-rouge","kentucky","ky","louisville","lexington","bowling-green","frankfort","oregon","or","portland","pdx","eugene","salem","bend","medford","oklahoma","ok","okc","oklahomacity","oklahoma-city","tulsa","norman","connecticut","ct","hartford","newhaven","new-haven","stamford","bridgeport","utah","ut","saltlakecity","salt-lake-city","slc","provo","ogden","iowa","ia","desmoines","des-moines","cedarrapids","cedar-rapids","davenport","nevada","nv","lasvegas","las-vegas","vegas","reno","henderson","sparks","arkansas","ar","littlerock","little-rock","fayetteville","fortsmith","mississippi","ms","jackson","gulfport","biloxi","hattiesburg","southaven","kansas","ks","wichita","overlandpark","overland-park","kansascity","topeka","newmexico","new-mexico","nm","albuquerque","santafe","santa-fe","lascruces","nebraska","ne","omaha","lincoln","bellevue","grandisland","grand-island","idaho","id","boise","meridian","nampa","idahofalls","idaho-falls","pocatello","westvirginia","west-virginia","wv","charleston","huntington","morgantown","hawaii","hi","honolulu","maui","oahu","kauai","bigisland","big-island","newhampshire","new-hampshire","nh","manchester","nashua","concord","portsmouth","maine","me","portland","lewiston","bangor","auburn","augusta","rhodeisland","rhode-island","ri","providence","warwick","cranston","newport","montana","mt","billings","missoula","greatfalls","great-falls","bozeman","delaware","de","wilmington","dover","newark","middletown","smyrna","southdakota","south-dakota","sd","siouxfalls","sioux-falls","rapidcity","northdakota","north-dakota","nd","fargo","bismarck","grandforks","grand-forks","alaska","ak","anchorage","fairbanks","juneau","sitka","ketchikan","vermont","vt","burlington","essex","rutland","colchester","bennington","wyoming","wy","cheyenne","casper","laramie","gillette","rocksprings","dc","washingtondc","washington-dc","dmv","nova","northern-virginia","puertorico","puerto-rico","pr","sanjuan","san-juan","bayamon","carolina","midwest","midwestern","northeast","northeastern","southeast","southeastern","southwest","southwestern","northwest","northwestern","pacificnorthwest","pnw","newengland","new-england","deepouth","deep-south","sunbelt","sun-belt","rustbelt","rust-belt","biblebelt","bible-belt","cornbelt","corn-belt",...function(){const e="abcdefghijklmnopqrstuvwxyz0123456789",t=[];for(const n of e)t.push(n);for(const n of e)for(const a of e)t.push(n+a);for(const n of e)for(const a of e)for(const s of e)t.push(n+a+s);return t}()];async function vy(e){const t=function(e){let t=e.startsWith("#")?e.slice(1):e;return t=t.toLowerCase().replace(/[^a-z0-9-]/g,""),t=t.replace(/-+/g,"-"),t=t.replace(/^-+|-+$/g,""),t}(e);if(!t)throw new Error(`Invalid channel name: "${e}" filters to empty string`);const n=`#${t}`,a=(new TextEncoder).encode(n),s=(await Qf(a)).slice(0,16),i=(await Qf(s))[0],r=new Uint8Array(32);return r.set(s),{name:`#${t}`,channelHash:i,aesKey:s,hmacKey:r,autoDiscovered:!0}}let wy=null,ky=null;const xy=new Map;let Sy=null;const jy="pymc_discovered_channels";function Cy(e){xy.set(e.channelHash,e),e.autoDiscovered&&function(){try{const e=[];for(const t of xy.values())t.autoDiscovered&&e.push({name:t.name,hash:t.channelHash});localStorage.setItem(jy,JSON.stringify(e))}catch(e){}}()}async function Ty(){wy||(ky||(ky=(async()=>{await async function(){try{const e=localStorage.getItem(jy);if(!e)return;const t=JSON.parse(e);for(const{name:n}of t)try{const e=await vy(n);xy.set(e.channelHash,e)}catch{}t.length}catch(e){}}();const e=new Map;for(const t of by)try{const n=await vy(t),a=e.get(n.channelHash)||[];a.push(n),e.set(n.channelHash,a)}catch{}wy=e})()),await ky)}async function My(e,t,n){const a=await async function(e,t){if(Yf())try{const n=new ArrayBuffer(e.length);new Uint8Array(n).set(e);const a=new ArrayBuffer(t.length);new Uint8Array(a).set(t);const s=await crypto.subtle.importKey("raw",n,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),i=await crypto.subtle.sign("HMAC",s,a);return new Uint8Array(i)}catch{}return async function(e,t){const n=64;let a;e.length>n?(a=new Uint8Array(n),a.set(Zf(e))):(a=new Uint8Array(n),a.set(e));const s=new Uint8Array(n),i=new Uint8Array(n);for(let c=0;c=2024&&n<=2030;if(!a)return{valid:!1,confidence:"low"};const s=e.slice(5);if(0===s.length)return{valid:!1,confidence:"low"};let i=0,r=!1;for(let l=0;l=32&&e<=126||0===e||10===e||13===e||9===e)&&i++,58===e&&(r=!0)}const o=i/s.length;return o>=.85&&r&&a?{valid:!0,confidence:"high"}:o>=.7&&a?{valid:!0,confidence:"medium"}:{valid:!1,confidence:"low"}}async function Ey(e,t,n){await Ty();const a=await async function(){return Sy||(Sy=await async function(e,t=!1){const n=qf(e.secret),a=(await Qf(n))[0],s=new Uint8Array(32);return s.set(n.slice(0,32)),{name:e.name,channelHash:a,aesKey:s.slice(0,16),hmacKey:s,autoDiscovered:t}}(yy)),Sy}();if(a.channelHash===e&&await My(a.hmacKey,t,n))return{channelName:"Public",plaintext:cy(a.aesKey,n),keys:a};const s=xy.get(e);if(s&&await My(s.hmacKey,t,n)){const e=cy(s.aesKey,n);return{channelName:s.name,plaintext:e,keys:s}}const i=(null==wy?void 0:wy.get(e))||[],r=[];for(const l of i){if(await My(l.hmacKey,t,n)){Cy(l);const e=cy(l.aesKey,n);return{channelName:l.name,plaintext:e,keys:l}}r.push(l)}let o=null;for(const l of r)try{const e=cy(l.aesKey,n),t=Py(e);if(t.valid){if("high"===t.confidence)return{channelName:l.name,plaintext:e,keys:l,macCorrupted:!0};"medium"!==t.confidence||o||(o={keys:l,plaintext:e,confidence:"medium"})}}catch{}return o?{channelName:o.keys.name,plaintext:o.plaintext,keys:o.keys,macCorrupted:!0}:null}async function Ay(e,t,n,a){try{const s=await vy(e);if(s.channelHash!==t)return{success:!1,error:`Hash mismatch: "${e}" has hash 0x${s.channelHash.toString(16).toUpperCase().padStart(2,"0")}, packet has 0x${t.toString(16).toUpperCase().padStart(2,"0")}`};if(!(await My(s.hmacKey,n,a)))return{success:!1,error:"MAC verification failed - wrong channel name or corrupted data"};const i=cy(s.aesKey,a);return Cy(s),{success:!0,result:{channelName:s.name,plaintext:i,keys:s}}}catch(s){return{success:!1,error:`Error: ${s instanceof Error?s.message:String(s)}`}}}function Ly(e){if(e.length<101)return null;let t=0;const n=$f(e.slice(t,t+32));t+=32;const a=py(e,t);t+=4;const s=$f(e.slice(t,t+64));t+=64;const i=e[t++],r=function(e){const t=[];switch(15&e){case 1:t.push("is companion");break;case 2:t.push("is repeater");break;case 3:t.push("is room server");break;case 4:t.push("is sensor")}return 16&e&&t.push("has location"),32&e&&t.push("has feature 1"),64&e&&t.push("has feature 2"),128&e&&t.push("has name"),t.join(", ")||"none"}(i);let o="unknown";switch(15&i){case 1:o="chat";break;case 2:o="repeater";break;case 3:o="room_server";break;case 4:o="sensor"}const l={type:"advert",publicKey:n,timestamp:a,signature:s,flags:i,flagsDescription:r,nodeType:o,rawAppData:$f(e.slice(100))};if(16&i&&t+8<=e.length){const n=e.slice(t,t+8),a=new ArrayBuffer(8);new Uint8Array(a).set(n);const s=new DataView(a),i=s.getInt32(0,!0),r=s.getInt32(4,!0);l.latitude=i/1e6,l.longitude=r/1e6,t+=8}if(128&i&&tt&&(l.name=(new TextDecoder).decode(e.slice(t,n)))}return l}function Dy(e,t){const n=function(e){if(e.length<9)return{type:"trace",traceTag:"00000000",traceTagValue:0,authCode:0,flags:0,pathHashes:[],pathString:"",snrValues:[],isComplete:!1,path:[],targetHash:""};const t=py(e,0),n=t.toString(16).toUpperCase().padStart(8,"0"),a=py(e,4),s=e[8],i=e.slice(9),r=Array.from(i).map(e=>Uf(e,!0)),o=r.join("->");return{type:"trace",traceTag:n,traceTagValue:t,authCode:a,flags:s,pathHashes:r,pathString:o,snrValues:[],isComplete:!1,path:r,targetHash:r.length>0?r[0]:""}}(e);if(!n)return null;const a=[],s=t instanceof Uint8Array?Array.from(t):t;for(let r=0;r127&&(e-=256),a.push(e/4)}const i=a.length>=n.pathHashes.length;return{...n,snrValues:a,isComplete:i}}async function zy(e){if(e.length<4)return null;const t=e[0],n=Uf(t,!0),a=e.slice(1,3),s=e.slice(3),i={type:"grp_txt",channelHash:n,text:$f(s),decrypted:!1,ciphertextHex:$f(s),macHex:$f(a)};try{const e=await Ey(t,a,s);if(e&&e.plaintext.length>=5){i.channelName=e.channelName;const t=e.plaintext,n=py(t,0),a=t[4],s=new TextDecoder("utf-8",{fatal:!1}).decode(t.slice(5)).replace(/\uFFFD/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/g,"").replace(/\x00+$/,"").trim();i.decrypted=!0,i.isPublicHashChannel=!0,i.timestamp=n,i.flags=a,e.macCorrupted&&(i.macCorrupted=!0);const r=s.indexOf(": ");r>0?(i.senderName=s.slice(0,r),i.text=s.slice(r+2)):i.text=s}else{const e=await async function(e){return await Ty(),((null==wy?void 0:wy.get(e))||[]).map(e=>e.name)}(t);i.isPublicHashChannel=e.length>0}}catch{}return i}async function Ny(e){if(e.length<4)return null;const t=e[0],n=Uf(t,!0),a=e.slice(1,3),s=e.slice(3),i={type:"grp_data",channelHash:n,dataHex:$f(s),dataLength:s.length,decrypted:!1,macHex:$f(a)};try{const e=await Ey(t,a,s);e&&(i.channelName=e.channelName,i.decrypted=!0,i.decryptedHex=$f(e.plaintext))}catch{}return i}function Fy(e,t,n){return{type:"generic",payloadType:t,payloadTypeName:n,rawHex:$f(e),length:e.length}}function Ry(e){const{payload:t,payloadType:n,payloadTypeName:a}=e;switch(n){case 4:return Ly(t)??Fy(t,n,a);case 3:return function(e){if(e.length<4)return null;const t=py(e,0);return{type:"ack",crc:t.toString(16).toUpperCase().padStart(8,"0"),crcValue:t}}(t)??Fy(t,n,a);case 8:return function(e){if(0===e.length)return{type:"path",path:[],pathString:""};const t=Array.from(e).map(e=>Uf(e,!0)),n=t.join("->");return{type:"path",path:t,pathString:n}}(t)??Fy(t,n,a);case 9:return Dy(t,e.path)??Fy(t,n,a);case 2:return function(e){if(e.length<2)return null;const t=Uf(e[0],!0),n=Uf(e[1],!0),a=e.slice(2);let s="",i=!0;try{const e=new TextDecoder("utf-8",{fatal:!0}).decode(a);/^[\x20-\x7E\u00A0-\uFFFF\n\r\t]*$/.test(e)&&(s=e,i=!1)}catch{}return i&&(s=$f(a)),{type:"txt_msg",destHash:t,srcHash:n,timestamp:0,text:s,encrypted:i}}(t)??Fy(t,n,a);case 5:return function(e){if(e.length<4)return null;const t=Uf(e[0],!0),n=e.slice(1,3),a=e.slice(3);return{type:"grp_txt",channelHash:t,text:$f(a),decrypted:!1,ciphertextHex:$f(a),macHex:$f(n)}}(t)??Fy(t,n,a);case 6:return function(e){if(e.length<4)return null;const t=Uf(e[0],!0),n=e.slice(1,3),a=e.slice(3);return{type:"grp_data",channelHash:t,dataHex:$f(a),dataLength:a.length,decrypted:!1,macHex:$f(n)}}(t)??Fy(t,n,a);case 10:return function(e){return e.length<4?null:{type:"multipart",messageId:$f(e.slice(0,2)),partNumber:e[2],totalParts:e[3],partData:$f(e.slice(4))}}(t)??Fy(t,n,a);default:return Fy(t,n,a)}}function Iy(e){if(!e||e.length<4)return null;const t=3&parseInt(e.slice(0,2),16);let n=2;0!==t&&3!==t||(n=10);const a=parseInt(e.slice(n,n+2),16);n+=2,n+=2*a;const s=e.slice(n);return s.length<8?null:qf(s)}const _y=b((e,t)=>{let n=[],a=!1;return{messages:new Map,stableMessages:new Map,lastSnapshotUpdate:0,processing:new Set,progress:{total:0,processed:0,percent:0,isDecoding:!1},initialDecodeComplete:!1,queueDecryption:(s,i)=>{const{messages:r,processing:o}=t(),l=(null==i?void 0:i.quickMode)??!1;let c=s.filter(e=>(e.type??e.payload_type)===Af.GRP_TXT&&e.raw_packet&&!r.has(e.packet_hash)&&!o.has(e.packet_hash));if(0===c.length)return;l&&c.length>100&&(c=c.sort((e,t)=>(t.timestamp??0)-(e.timestamp??0)).slice(0,100));const u=new Set(n.map(e=>e.packet_hash));for(const e of c)u.has(e.packet_hash)||n.push(e);!async function(){if(a||0===n.length)return;a=!0;const s=t();let i=new Map(s.messages),r=new Set(s.processing);n.sort((e,t)=>t.timestamp-e.timestamp);const o=n.length;let l=0,c=Date.now();for(e({progress:{total:o,processed:0,percent:0,isDecoding:!0}});n.length>0;){const t=n.splice(0,25);for(const e of t){const t=e.packet_hash;if(i.has(t)||r.has(t)){l++;continue}r.add(t);const n=Iy(e.raw_packet||"");let a=null;if(n)try{a=await zy(n)}catch{}i.set(t,{decoded:a,timestamp:e.timestamp,rssi:e.rssi,snr:e.snr}),r.delete(t),l++}if(i.size>5e4){const e=Array.from(i.entries()).sort((e,t)=>e[1].timestamp-t[1].timestamp).slice(0,i.size-5e4);for(const[t]of e)i.delete(t)}const a=Date.now(),s=Math.round(l/o*100);a-c>=1e3?(c=a,e({messages:new Map(i),stableMessages:new Map(i),lastSnapshotUpdate:a,processing:new Set(r),progress:{total:o,processed:l,percent:s,isDecoding:n.length>0}})):e(e=>({messages:new Map(i),processing:new Set(r),progress:{total:o,processed:l,percent:s,isDecoding:n.length>0},stableMessages:e.stableMessages,lastSnapshotUpdate:e.lastSnapshotUpdate})),n.length>0&&await new Promise(e=>setTimeout(e,50))}a=!1,e({messages:new Map(i),stableMessages:new Map(i),lastSnapshotUpdate:Date.now(),processing:new Set,initialDecodeComplete:!0,progress:{total:o,processed:l,percent:100,isDecoding:!1}})}()},getMessage:e=>t().messages.get(e),getSuccessfulMessages:()=>{var e;const{messages:n}=t(),a=[];for(const t of n.values())(null==(e=t.decoded)?void 0:e.decrypted)&&!t.decoded.macCorrupted&&a.push(t);return a.sort((e,t)=>e.timestamp-t.timestamp)},clear:()=>{n=[],e({messages:new Map,stableMessages:new Map,lastSnapshotUpdate:0,processing:new Set,progress:{total:0,processed:0,percent:0,isDecoding:!1},initialDecodeComplete:!1})}}});function By(){return _y(e=>e.progress)}function Vy(){return _y(e=>e.stableMessages)}function Oy(e){return e.startsWith("0x")||e.startsWith("0X")?e.slice(2,4).toUpperCase():e.slice(0,2).toUpperCase()}function qy(e,t){let n=e.forwarded_path??e.original_path;if("string"==typeof n)try{n=JSON.parse(n)}catch{return null}if(!n||!Array.isArray(n)||0===n.length)return null;const a=n.map(e=>String(e).toUpperCase()),s=t?Oy(t):null,i=a[a.length-1],r=null!==s&&i===s,o=r?a.slice(0,-1):[...a];return{effective:o,original:a,hadLocal:r,effectiveLength:o.length}}function $y(e,t){const n=e.toUpperCase();return t.startsWith("0x")||t.startsWith("0X")?t.slice(2).toUpperCase().startsWith(n):t.toUpperCase().startsWith(n)}const Uy=[{label:"20m",minutes:20,buckets:80},{label:"1h",minutes:60,buckets:80},{label:"3h",minutes:180,buckets:80},{label:"12h",minutes:720,buckets:80},{label:"24h",minutes:1440,buckets:80},{label:"3d",minutes:4320,buckets:80},{label:"7d",minutes:10080,buckets:80},{label:"14d",minutes:20160,buckets:80}],Wy=[{label:"1h",hours:1},{label:"3h",hours:3},{label:"12h",hours:12},{label:"24h",hours:24},{label:"3d",hours:72},{label:"7d",hours:168},{label:"14d",hours:336}];function Hy(e,t=12){return Math.max(t,Math.round(e/15))}const Yy={hero:Hy(1200),statsCard:Hy(380)};function Gy(e){switch(e){case 1:return 3600;case 3:case 12:return 5400;case 24:return 8640;case 72:case 168:case 336:return 720;default:{const t=3600*e,n=Math.round(t/10);return Math.min(Math.max(360,n),720)}}}const Ky="'JetBrains Mono', 'SF Mono', Monaco, monospace",Xy={stats:3e3,packets:3e3,logs:2e3,system:3e3},Jy={DEBUG:"text-sys-brown",INFO:"text-sys-cyan",WARNING:"text-sys-amber",ERROR:"text-sys-red",CRITICAL:"text-sys-pink"};function Zy(e){return Jy[e]??"text-text-muted border-border-subtle"}function Qy(e){return e?(e.startsWith("0x")?e.slice(2):e).slice(0,2).toUpperCase():""}function eb(e,t){if(!e)return"expired";const n=t/1e3-e;return n<=10800?"active":n<=86400?"stale":"expired"}function tb(e,t,n=Date.now()){if(!e)return[];const a=Object.keys(e);if(0===a.length)return[];const s=[];for(let i=0;it.count!==e.count?t.count-e.count:t.lastSeen-e.lastSeen),s}const nb={critical:0,high:150,medium:300,low:450};let ab=!1;const sb=[],ib=new Set;function rb(e,t="medium"){if(ab){const n=setTimeout(()=>{e(),ib.delete(n)},nb[t]);return ib.add(n),()=>{clearTimeout(n),ib.delete(n)}}{const n={callback:e,priority:t};return sb.push(n),()=>{const e=sb.indexOf(n);-1!==e&&sb.splice(e,1)}}}const ob="pymc-resource-history",lb="pymc-resource-last-fetch",cb="pymc-hidden-contacts",ub="pymc-quick-neighbors",db="pymc-local-hash",hb="pymc-global-time-range";let mb=null,pb=null;function gb(e){return 4===(e.type??e.payload_type)&&!0!==e.transmitted&&function(e){const t=function(e){if(Array.isArray(e))return e;if("string"==typeof e&&e.startsWith("["))try{const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}return[]}(e.original_path),n=e.route??e.route_type;return 2===(a=n)||3===a?0===t.length:ni(n)?t.length<=1:0===t.length;var a}(e)}function fb(e,t,n,a){if(!e)return null;let s=e;if(e.length<=4){const a=e.replace(/^0x/i,"").toUpperCase();if(a===t)return null;const i=n.get(a);if(!i)return null;s=i}return a.has(s)?Oy(s)===t?null:s:null}function yb(e,t){e.count++,void 0!==t.rssi&&null!==t.rssi&&(e.rssiSum+=t.rssi,e.rssiCount++),void 0!==t.snr&&null!==t.snr&&(e.snrSum+=t.snr,e.snrCount++);const n=t.timestamp??0;n>e.lastSeen&&(e.lastSeen=n)}function bb(e){return{hash:e,count:0,rssiSum:0,rssiCount:0,snrSum:0,snrCount:0,lastSeen:0}}function vb(e,t){const n=function(e,t){const n=t-1e3*e;return n<=6048e5?"active":n<=12096e5?"stale":"expired"}(e.lastSeen,t);return"expired"===n?null:{hash:e.hash,prefix:Oy(e.hash),count:e.count,avgRssi:e.rssiCount>0?e.rssiSum/e.rssiCount:null,avgSnr:e.snrCount>0?e.snrSum/e.snrCount:null,lastSeen:e.lastSeen,status:n}}function wb(){if("undefined"==typeof window)return[];try{const e=localStorage.getItem(ub);if(e)return JSON.parse(e)}catch{}return[]}function kb(e){"undefined"!=typeof window&&(pb&&clearTimeout(pb),pb=setTimeout(()=>{try{localStorage.setItem(ub,JSON.stringify(e))}catch{}pb=null},1e3))}function xb(){if("undefined"!=typeof window)try{const e=localStorage.getItem(db);if(e)return e}catch{}}function Sb(e){if("undefined"!=typeof window)try{localStorage.setItem(db,e)}catch{}}function jb(){if("undefined"==typeof window)return[];try{const e=localStorage.getItem(ob);if(e)return JSON.parse(e)}catch{}return[]}function Cb(){if("undefined"==typeof window)return new Set;try{const e=localStorage.getItem(cb);if(e)return new Set(JSON.parse(e))}catch{}return new Set}function Tb(){if("undefined"==typeof window)return 0;try{const e=localStorage.getItem(lb);if(e)return parseInt(e,10)||0}catch{}return 0}function Mb(){if("undefined"==typeof window)return 4;try{const e=localStorage.getItem(hb);if(e){const t=parseInt(e,10);if(!isNaN(t)&&t>=0&&t<=7)return t>4?4:t}}catch{}return 4}const Pb=b((e,t)=>({stats:null,statsLoading:!1,statsError:null,packets:_g.getPackets(),packetsLoading:!1,packetsError:null,lastPacketTimestamp:_g.getNewestTimestamp(),logs:[],logsLoading:!1,liveMode:!0,flashReceived:0,flashAdvert:0,pendingAdvertLocalHash:null,pendingAdvertTimestamp:null,resourceHistory:jb(),lastResourceFetch:Tb(),hiddenContacts:Cb(),quickNeighbors:wb(),cachedLocalHash:xb(),initialized:!1,packetCacheState:_g.getState(),mutationsInFlight:new Set,globalTimeRangeIndex:Mb(),initializeApp:async()=>{const{initialized:n}=t();if(n)return;e({initialized:!0,statsLoading:!0,packetsLoading:!0}),_g.subscribe(t=>{e({packetCacheState:t})});const{hiddenContacts:a}=t();let s=null;fg().then(t=>{const n=tb(t.neighbors,a),s=t.local_hash;e({stats:t,statsLoading:!1,quickNeighbors:n,cachedLocalHash:s}),kb(n),s&&Sb(s)}).catch(t=>{e({statsError:t instanceof Error?t.message:"Failed to fetch stats",statsLoading:!1})}),_g.initialLoad(()=>{s&&clearTimeout(s),s=setTimeout(()=>{const t=_g.getPackets();if(t.length>0){const n=_g.getNewestTimestamp();e({packets:t,lastPacketTimestamp:n})}},250)}).then(n=>{if(s&&clearTimeout(s),n.length>0){const a=_g.getNewestTimestamp();e({packets:n,packetsLoading:!1,lastPacketTimestamp:a});const s=(e,t)=>{"requestIdleCallback"in window?requestIdleCallback(()=>e(),{timeout:t}):setTimeout(e,100)};s(()=>t().triggerTopologyCompute(),2e3),s(()=>t().triggerSparklineCompute(),1e3),setTimeout(()=>function(){if(!ab){ab=!0;for(const e of sb){const t=nb[e.priority],n=setTimeout(()=>{e.callback(),ib.delete(n)},t);ib.add(n)}sb.length=0}}(),16),setTimeout(()=>{_y.getState().queueDecryption(n,{quickMode:!0})},500)}else e({packetsLoading:!1})}).catch(t=>{e({packetsError:t instanceof Error?t.message:"Failed to load packets",packetsLoading:!1})}),Hg.getState().initialize(),$g.onPacket(n=>{const{lastPacketTimestamp:a,mutationsInFlight:s}=t();if(s.size>0)return;Wg.stage(n);const i=n.timestamp??0;i>a&&e({flashReceived:t().flashReceived+1,lastPacketTimestamp:i})}),$g.onStats(n=>{const{mutationsInFlight:a,hiddenContacts:s}=t();if(a.size>0)return;const i=tb(n.neighbors,s),r=n.local_hash;e({stats:n,statsLoading:!1,statsError:null,quickNeighbors:i,cachedLocalHash:r}),kb(i),r&&Sb(r)}),$g.onPacketStats(n=>{const{stats:a,mutationsInFlight:s}=t();if(!a||s.size>0)return;const i={...a,rx_count:n.rx_count??a.rx_count,tx_count:n.tx_count??a.tx_count,forwarded_count:n.forwarded_count??a.forwarded_count,dropped_count:n.dropped_count??a.dropped_count};e({stats:i})});{const n="";Eg.init({apiBaseUrl:n,authToken:Xp()??void 0,statsIntervalMs:Xy.stats,packetsIntervalMs:Xy.packets}).then(()=>{if(Eg.onStats((n,a)=>{const{mutationsInFlight:s,hiddenContacts:i}=t();if(s.size>0)return;const r=tb(n.neighbors,i),o=n.local_hash;e({stats:n,statsLoading:!1,statsError:null,quickNeighbors:r,cachedLocalHash:o}),kb(r),o&&Sb(o),rf.getState().updateRestHealth(!0)}),Eg.onPackets((n,a,s)=>{if(0===n.length)return;const{lastPacketTimestamp:i}=t(),r=n.map(e=>e.packet_hash).filter(e=>!!e);Wg.confirmBatch(r),_g.mergePacketsDirectly(n);const o=s>i;o&&wg();const l=_g.getPackets();e({packets:l,packetsLoading:!1,packetsError:null,lastPacketTimestamp:s}),o&&t().triggerTopologyCompute()}),Eg.onError((t,n)=>{"stats"===t?(e({statsError:n}),rf.getState().updateRestHealth(!1)):e({packetsError:n})}),"undefined"!=typeof document){let e=Date.now();const n=3e5;document.addEventListener("visibilitychange",async()=>{if(document.hidden)e=Date.now();else{const a=Date.now()-e>n;a&&($g.resetSupported(),$g.isConnected()?await $g.verifyConnection(3e3)||($g.disconnect(),$g.connect()):$g.isSupported()&&$g.connect()),Eg.forceRefresh(),a&&t().fetchStats({force:!0})}})}}).catch(e=>{!function(e){setInterval(()=>{_g.isHeavyLoadInProgress()||e().fetchStats()},Xy.stats),setInterval(()=>{e().liveMode&&!_g.isHeavyLoadInProgress()&&e().fetchPackets()},Xy.packets)}(t)})}},prefetchForRoute:e=>{switch(e){case"/logs":yg().catch(()=>{});break;case"/system":xg().catch(()=>{});break;case"/statistics":(async function(e=24){return dg(`/api/packet_type_graph_data?hours=${e}`)})(3).catch(()=>{}),bg(3).catch(()=>{});break;case"/settings":(async function(){return dg("/api/radio_presets")})().catch(()=>{})}},fetchStats:async n=>{const{stats:a,mutationsInFlight:s,hiddenContacts:i}=t();if(!(s.size>0)||(null==n?void 0:n.force)){a||e({statsLoading:!0}),e({statsError:null});try{const t=await fg(),n=tb(t.neighbors,i),a=t.local_hash;e({stats:t,statsLoading:!1,quickNeighbors:n,cachedLocalHash:a}),kb(n),a&&Sb(a)}catch(r){e({statsError:r instanceof Error?r.message:"Failed to fetch stats",statsLoading:!1})}}},fetchPackets:async n=>{const{packets:a,lastPacketTimestamp:s}=t();0===a.length&&e({packetsLoading:!0}),e({packetsError:null});try{const n=await _g.poll(),i=_g.getNewestTimestamp(),r=i>s&&s>0,o=n.length!==a.length||r;r&&(e({flashReceived:t().flashReceived+1}),wg()),e(o?{packets:n,packetsLoading:!1,lastPacketTimestamp:i||s}:{packetsLoading:!1}),r&&(t().triggerTopologyCompute(),_y.getState().queueDecryption(n))}catch(i){e({packetsError:i instanceof Error?i.message:"Failed to fetch packets",packetsLoading:!1})}},fetchLogs:async()=>{const{logs:n}=t();0===n.length&&e({logsLoading:!0});try{const t=await yg();e({logs:t.logs,logsLoading:!1})}catch{e({logsLoading:!1})}},setLiveMode:t=>{e({liveMode:t}),Eg.isReady()&&Eg.setLiveMode(t)},setMode:async n=>{const a="setMode",{mutationsInFlight:s}=t(),i=new Set(s);i.add(a),e({mutationsInFlight:i});try{if(!(await Tg(n)).success)throw new Error("Backend returned unsuccessful response");await t().fetchStats({force:!0})}catch(r){const{mutationsInFlight:n}=t(),s=new Set(n);throw s.delete(a),e({mutationsInFlight:s}),r}},clearModeMutation:()=>{const{mutationsInFlight:n}=t(),a=new Set(n);a.delete("setMode"),e({mutationsInFlight:a})},setDutyCycle:async n=>{const a="setDutyCycle",{mutationsInFlight:s}=t(),i=new Set(s);i.add(a),e({mutationsInFlight:i});try{if(!(await Mg(n)).success)throw new Error("Backend returned unsuccessful response");await t().fetchStats({force:!0})}finally{const{mutationsInFlight:n}=t(),s=new Set(n);s.delete(a),e({mutationsInFlight:s})}},setDutyCycleConfig:async n=>{var a;const s="setDutyCycleConfig",{mutationsInFlight:i}=t(),r=new Set(i);r.add(s),e({mutationsInFlight:r});try{const e=await async function(e){return dg("/api/update_duty_cycle_config",{method:"POST",body:JSON.stringify(e)})}(n);if(!e.success&&!(null==(a=e.data)?void 0:a.persisted))throw new Error("Backend returned unsuccessful response");await t().fetchStats({force:!0})}catch(o){const{mutationsInFlight:n}=t(),a=new Set(n);throw a.delete(s),e({mutationsInFlight:a}),o}},clearDutyCycleMutation:()=>{const{mutationsInFlight:n}=t(),a=new Set(n);a.delete("setDutyCycleConfig"),e({mutationsInFlight:a})},startMutation:n=>{const{mutationsInFlight:a}=t(),s=new Set(a);s.add(n),e({mutationsInFlight:s})},clearMutation:n=>{const{mutationsInFlight:a}=t(),s=new Set(a);s.delete(n),e({mutationsInFlight:s})},sendAdvert:async()=>{try{const n=await Cg();return n.success?(e({flashAdvert:t().flashAdvert+1}),{success:!0}):{success:!1,error:n.error||"Failed to send advert"}}catch(n){return{success:!1,error:n instanceof Error?n.message:"Unknown error"}}},triggerFlashReceived:()=>{e({flashReceived:t().flashReceived+1})},triggerFlashAdvert:()=>{e({flashAdvert:t().flashAdvert+1})},addResourceDataPoint:(n,a,s)=>{const i=Date.now(),{lastResourceFetch:r,resourceHistory:o}=t();if(i-r<1e3)return;const l=[...o,{timestamp:i,time:new Date(i).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),cpu:n,memory:a}],c=l.length>s?l.slice(-s):l;var u,d;e({resourceHistory:c,lastResourceFetch:i}),u=c,d=i,"undefined"!=typeof window&&(mb&&clearTimeout(mb),mb=setTimeout(()=>{try{localStorage.setItem(ob,JSON.stringify(u)),localStorage.setItem(lb,d.toString())}catch{}mb=null},1e3))},hideContact:n=>{const{hiddenContacts:a}=t(),s=new Set(a);s.add(n),e({hiddenContacts:s}),function(e){if("undefined"!=typeof window)try{localStorage.setItem(cb,JSON.stringify([...e]))}catch{}}(s)},clearPacketCache:()=>{_g.clear(),e({packets:[],lastPacketTimestamp:0}),_g.quickLoad().then(n=>{if(n.length>0){const a=n.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:n,lastPacketTimestamp:a}),t().triggerTopologyCompute()}})},triggerTopologyCompute:()=>{var e,n,a,s;const{packets:i,stats:r,hiddenContacts:o}=t();if(0===i.length||!r)return;const l=r.neighbors??{},c=Object.fromEntries(Object.entries(l).filter(([e])=>!o.has(e))),u=r.local_hash;let d=null==(n=null==(e=r.config)?void 0:e.repeater)?void 0:n.latitude,h=null==(s=null==(a=r.config)?void 0:a.repeater)?void 0:s.longitude;if(!d||!h||0===d&&0===h){const e=af.getState().getEffectiveLocation();e&&(d=e.latitude,h=e.longitude)}const m=[];for(const[t,g]of Object.entries(c))g.zero_hop&&m.push({hash:t,advertCount:g.advert_count??1,avgRssi:g.rssi??null,avgSnr:g.snr??null,lastSeen:g.last_seen??0,latitude:g.latitude,longitude:g.longitude});const p=Jg.getState().getTerrainGridForDisambiguation();Og.compute(i,c,u,d,h,void 0,m,p??void 0)},triggerDeepAnalysis:async()=>{await _g.forceDeepLoad();const n=_g.getPackets();if(n.length>0){const a=n.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:n,lastPacketTimestamp:a}),t().triggerTopologyCompute(),t().triggerSparklineCompute()}},updateQuickNeighbors:()=>{const{packets:n,stats:a,hiddenContacts:s}=t();if(0===n.length||!a)return;const i=a.neighbors??{},r=function(e,t,n){if(!n||0===e.length||0===Object.keys(t).length)return[];const a=Date.now(),s=Oy(n),i=new Set(Object.keys(t)),r=function(e){var t,n;const a=new Map;for(const s of Object.keys(e)){const i=Oy(s),r=a.get(i);if(r){const o=null==(t=e[r])?void 0:t.zero_hop;(null==(n=e[s])?void 0:n.zero_hop)&&!o&&a.set(i,s)}else a.set(i,s)}return a}(t),o=new Map;for(const c of e){if(!gb(c))continue;const e=fb(c.src_hash,s,r,i);if(!e)continue;let t=o.get(e);t||(t=bb(e),o.set(e,t)),yb(t,c)}for(const[c,u]of Object.entries(t))Oy(c)!==s&&u.zero_hop&&!o.has(c)&&o.set(c,{hash:c,count:u.advert_count??0,rssiSum:u.rssi??0,rssiCount:void 0!==u.rssi?1:0,snrSum:u.snr??0,snrCount:void 0!==u.snr?1:0,lastSeen:u.last_seen??0});const l=[];for(const c of o.values()){const e=vb(c,a);e&&l.push(e)}return l.sort((e,t)=>t.count!==e.count?t.count-e.count:t.lastSeen-e.lastSeen),l}(n,Object.fromEntries(Object.entries(i).filter(([e])=>!s.has(e))),a.local_hash),o=t().quickNeighbors;(r.length!==o.length||r.some((e,t)=>{var n,a;return e.hash!==(null==(n=o[t])?void 0:n.hash)||e.count!==(null==(a=o[t])?void 0:a.count)}))&&(e({quickNeighbors:r}),kb(r))},triggerSparklineCompute:()=>{const{packets:e,stats:n,hiddenContacts:a}=t();if(0===e.length||!n)return;const s=n.neighbors??{},i=Object.keys(s).filter(e=>!a.has(e));0!==i.length&&qg.compute(e,i)},requestSevenDayData:async()=>{await _g.loadSevenDays(()=>{const t=_g.getPackets();if(t.length>0){const n=t.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:[...t],lastPacketTimestamp:n})}});const n=_g.getPackets();if(n.length>0){const a=n.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:[...n],lastPacketTimestamp:a}),t().triggerTopologyCompute(),t().triggerSparklineCompute(),_y.getState().queueDecryption(n)}},requestThreeDayData:async()=>{await _g.loadThreeDays(()=>{const t=_g.getPackets();if(t.length>0){const n=t.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:[...t],lastPacketTimestamp:n})}});const n=_g.getPackets();if(n.length>0){const a=n.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:[...n],lastPacketTimestamp:a}),t().triggerTopologyCompute(),t().triggerSparklineCompute(),_y.getState().queueDecryption(n)}},requestFourteenDayData:async()=>{await _g.loadFourteenDays(()=>{const t=_g.getPackets();if(t.length>0){const n=t.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:[...t],lastPacketTimestamp:n})}});const n=_g.getPackets();if(n.length>0){const a=n.reduce((e,t)=>Math.max(e,t.timestamp??0),0);e({packets:[...n],lastPacketTimestamp:a}),t().triggerTopologyCompute(),t().triggerSparklineCompute(),_y.getState().queueDecryption(n)}},setGlobalTimeRange:n=>{e({globalTimeRangeIndex:n}),function(e){if("undefined"!=typeof window)try{localStorage.setItem(hb,e.toString())}catch{}}(n);const a={0:1,1:1,2:3,3:12,4:24,5:72,6:168,7:336}[n]??24;Eg.setTimeWindow(a);const{packetCacheState:s,requestThreeDayData:i,requestSevenDayData:r,requestFourteenDayData:o,triggerTopologyCompute:l,triggerSparklineCompute:c}=t();let u=!1;if(5!==n||s.threeDayLoadComplete||s.isBackgroundLoading||(i(),u=!0),6!==n||s.sevenDayLoadComplete||s.isBackgroundLoading||(r(),u=!0),7!==n||s.fourteenDayLoadComplete||s.isBackgroundLoading||(o(),u=!0),!u&&n>=5&&(l(),c()),!u){const{packets:e}=t();_y.getState().queueDecryption(e)}}})),Eb=Pb,Ab=()=>Pb(e=>e.stats),Lb=()=>Pb(e=>e.statsError),Db=()=>Pb(e=>e.packets),zb=()=>Pb(e=>e.packetsLoading),Nb=()=>Pb(e=>e.logs),Fb=()=>Pb(e=>e.logsLoading),Rb=()=>Pb(e=>e.liveMode),Ib=()=>Pb(e=>e.fetchLogs),_b=()=>Pb(e=>e.setLiveMode),Bb=()=>Pb(e=>e.resourceHistory),Vb=()=>Pb(e=>e.addResourceDataPoint),Ob=()=>Pb(e=>e.hiddenContacts),qb=()=>Pb(e=>e.hideContact),$b=()=>Pb(e=>e.packetCacheState),Ub=()=>Pb(e=>e.quickNeighbors),Wb=()=>Pb(e=>e.cachedLocalHash),Hb=()=>Pb(e=>e.lastPacketTimestamp),Yb=()=>Pb(e=>e.globalTimeRangeIndex),Gb=()=>Pb(e=>e.setGlobalTimeRange),Kb=()=>Pb(e=>null!==e.stats&&e.packetCacheState.backgroundLoadComplete),Xb=()=>Pb(e=>e.packets.length>0);function Jb(){const e=Pb(e=>{var t,n,a;return null==(a=null==(n=null==(t=e.stats)?void 0:t.config)?void 0:n.repeater)?void 0:a.latitude}),t=Pb(e=>{var t,n,a;return null==(a=null==(n=null==(t=e.stats)?void 0:t.config)?void 0:n.repeater)?void 0:a.longitude}),n=Pb(e=>{var t,n,a;return(null==(n=null==(t=e.stats)?void 0:t.config)?void 0:n.node_name)||(null==(a=e.stats)?void 0:a.node_name)||"Local Node"}),a=af(e=>e.latitude),s=af(e=>e.longitude),i=af(e=>e.enabled);return e&&t&&(0!==e||0!==t)?{latitude:e,longitude:t,name:n,isStealth:!1}:i&&null!==a&&null!==s?{latitude:a,longitude:s,name:n,isStealth:!0}:null}const Zb={healthy:{p3:"color(display-p3 0.2 1 0.4)",fallback:"#00FF66"},degraded:{p3:"color(display-p3 1 0.7 0.2)",fallback:"#FFB020"},offline:{p3:"color(display-p3 1 0.3 0.3)",fallback:"#EF4444"},connecting:{p3:"color(display-p3 0.4 0.6 1)",fallback:"#6699FF"},rx:{p3:"color(display-p3 0.2 1 0.4)",fallback:"#00FF66"},tx:{p3:"color(display-p3 1 0.9 0.2)",fallback:"#FFDD00"},idle:{p3:"color(display-p3 0.3 0.3 0.35)",fallback:"#4A4A55"}};function Qb({color:e,pulse:t=!1,className:n}){var s;return a.jsx("span",{className:i("inline-block rounded-full w-1 h-1",t&&"animate-pulse",n),style:{backgroundColor:e.fallback,...(null==(s=CSS.supports)?void 0:s.call(CSS,"color","color(display-p3 1 1 1)"))&&{backgroundColor:e.p3}}})}function ev({showLabel:e=!1,className:t}){const s=Pb(e=>e.flashReceived),r=Pb(e=>e.flashAdvert),o=Hg(e=>"connected"===e.connectionState),l=rf(e=>e.health),c=rf(e=>e.isInitializing),[u,d]=n.useState("idle"),h=n.useRef(0),m=n.useRef(0);n.useEffect(()=>{if(s<=0)return;const e=Date.now();if(e-h.current<50)return;h.current=e,d("rx");const t=setTimeout(()=>d("idle"),100);return()=>clearTimeout(t)},[s]),n.useEffect(()=>{if(r<=0)return;const e=Date.now();if(e-m.current<50)return;m.current=e,d("tx");const t=setTimeout(()=>d("idle"),100);return()=>clearTimeout(t)},[r]);let p=Zb.healthy,g=!1,f="LIVE",y="Real-time (WebSocket)";c?(p=Zb.connecting,g=!0,f="WAIT",y="Connecting..."):"offline"===l?(p=Zb.offline,g=!0,f="DOWN",y="Cannot reach server"):"degraded"===l?(p=Zb.degraded,f="POLL",y="Real-time unavailable, using REST polling"):o?(p=Zb.healthy,f="LIVE",y="Real-time (WebSocket)"):(p=Zb.healthy,f="POLL",y="Database polling");const b="rx"===u?Zb.rx:"tx"===u?Zb.tx:Zb.idle;return a.jsxs("span",{className:i("inline-flex items-center gap-1.5",t),title:y,children:[a.jsxs("span",{className:"inline-flex items-center justify-center gap-1 w-5 h-5 rounded bg-black border border-white/[0.08]",children:[a.jsx(Qb,{color:p,pulse:g}),a.jsx(Qb,{color:b})]}),e&&a.jsx("span",{className:i("font-mono text-[10px] tracking-wider","DOWN"===f?"text-status-danger":"WAIT"===f?"text-accent-primary":"POLL"===f?"text-status-warning":"text-text-muted"),children:f})]})}function tv({borderRadius:e}){return a.jsx(ep.div,{initial:{opacity:0},animate:{opacity:.8,backgroundPosition:["200% 0%","-200% 0%"]},exit:{opacity:0},transition:{opacity:{duration:.2},backgroundPosition:{duration:2,ease:"easeInOut",repeat:1/0}},style:{position:"absolute",inset:0,zIndex:1,pointerEvents:"none",borderRadius:e,padding:2,background:"linear-gradient(\n 90deg,\n transparent 0%,\n transparent 25%,\n var(--accent-primary) 50%,\n transparent 75%,\n transparent 100%\n )",backgroundSize:"200% 100%",mask:"\n linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0)\n ",maskComposite:"exclude",WebkitMaskComposite:"xor"}})}function nv({children:e,isLoading:t=!0,className:n,borderRadius:s=12}){return a.jsxs("div",{className:i("relative overflow-hidden",n),style:{borderRadius:s},children:[a.jsx(Vh,{children:t&&a.jsx(tv,{borderRadius:s})}),a.jsx("div",{className:"relative z-10",children:e})]})}function av({className:e}){return a.jsx("div",{className:i("relative w-10 h-1 rounded-sm overflow-hidden","bg-bg-elevated",e),children:a.jsx(ep.div,{animate:{backgroundPosition:["200% 0%","-200% 0%"]},transition:{duration:1.5,ease:"easeInOut",repeat:1/0},className:"absolute inset-0",style:{background:"linear-gradient(\n 90deg,\n transparent 0%,\n var(--accent-primary) 50%,\n transparent 100%\n )",backgroundSize:"200% 100%"}})})}const sv=b(e=>({sparklines:new Map,isComputing:!1,lastUpdated:0,nodeCount:0,setSparklines:t=>e({sparklines:t,lastUpdated:Date.now(),nodeCount:t.size,isComputing:!1}),setComputing:t=>e({isComputing:t})}));"undefined"!=typeof window&&setTimeout(()=>{qg.subscribe((e,t)=>{const n=sv.getState();t&&!n.isComputing?n.setComputing(!0):!t&&e.size>0?n.setSparklines(e):!t&&n.isComputing&&n.setComputing(!1)})},0);const iv=()=>sv(e=>e.isComputing),rv=[],ov=new Map;function lv(e){return sv(t=>{const n=t.sparklines.get(e);if(!n||0===n.length)return rv;const a=ov.get(e);return a===n?a:(ov.set(e,n),n)})}const cv=b(e=>({topology:{edges:[],validatedEdges:[],weakEdges:[],certainEdges:[],uncertainEdges:[],edgeMap:new Map,maxPacketCount:0,maxCertainCount:0,neighborAffinity:new Map,fullAffinity:new Map,localPrefix:null,centrality:new Map,hubNodes:[],gatewayNodes:[],loops:[],loopEdgeKeys:new Set,txDelayRecommendations:new Map,pathRegistry:Vg(),edgeBetweenness:new Map,backboneEdges:[],nodeMobility:new Map,mobileNodes:[],pathHealth:[],lastHopNeighbors:[],disambiguationStats:{totalPrefixes:0,unambiguousPrefixes:0,collisionPrefixes:0,collisionRate:0,avgConfidence:0,lowConfidencePrefixes:[],highCollisionPrefixes:[],totalResolutions:0},discoveredNodes:[],viterbiStats:{totalPaths:0,pathsWithGhosts:0,avgPathCost:0,avgPathConfidence:0,observationOverrideCount:0,tracePacketsProcessed:0,pathPacketsProcessed:0,distantEdgesDiscovered:0,duplicateGroupsFound:0,duplicatePathsUnique:0,echolocationEdgesInferred:0},nodeMetrics:new Map,communityCount:0,backboneNodes:[]},isComputing:!1,lastComputeTimeMs:0,lastUpdated:0,setTopology:(t,n)=>e({topology:t,lastComputeTimeMs:n,lastUpdated:Date.now(),isComputing:!1}),setComputing:t=>e({isComputing:t})}));"undefined"!=typeof window&&Og.subscribe((e,t)=>{cv.getState().setTopology(e,t)});const uv=()=>cv(e=>e.topology),dv=()=>cv(e=>e.topology.hubNodes),hv=()=>cv(e=>e.topology.centrality),mv=()=>cv(e=>e.topology.fullAffinity),pv=()=>cv(e=>e.isComputing),gv=()=>cv(e=>e.lastUpdated);let fv=null,yv=null,bv=null,vv=null;const wv=()=>cv(e=>(e.topology.hubNodes!==yv&&(yv=e.topology.hubNodes,fv=new Set(e.topology.hubNodes)),fv)),kv=()=>cv(e=>e.topology.pathHealth),xv=()=>cv(e=>e.topology.disambiguationStats),Sv=()=>cv(e=>e.topology.disambiguationStats.highCollisionPrefixes),jv=()=>cv(e=>e.topology.disambiguationStats.totalPrefixes>0),Cv=()=>cv(e=>e.topology.discoveredNodes),Tv=()=>cv(e=>e.topology.viterbiStats),Mv=()=>cv(e=>(e.topology.discoveredNodes!==vv&&(vv=e.topology.discoveredNodes,bv=e.topology.discoveredNodes.filter(e=>e.isLikelyReal)),bv)),Pv=()=>cv(e=>e.topology.nodeMetrics);function Ev(e){if(e<60)return`${Math.floor(e)}s`;const t=Math.floor(e/86400),n=Math.floor(e%86400/3600),a=Math.floor(e%3600/60),s=[];return t>0&&s.push(`${t}d`),n>0&&s.push(`${n}h`),(a>0||0===s.length)&&s.push(`${a}m`),s.join(" ")}function Av(e){const t=Date.now()/1e3-e;return t<60?"just now":t<3600?`${Math.floor(t/60)}m ago`:t<86400?`${Math.floor(t/3600)}h ago`:`${Math.floor(t/86400)}d ago`}function Lv(e){return new Date(1e3*e).toLocaleString()}function Dv(e){const t=new Date(1e3*e);return`${t.toLocaleString("en-US",{month:"short"})} ${t.getDate()}, ${t.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}`}function zv(e){return new Date(1e3*e).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Nv(e){return`${(e/1e6).toFixed(3)} MHz`}function Fv(e){return`${(e/1e3).toFixed(1)} kHz`}function Rv(e){const t=e>1e12?e:1e3*e,n=Date.now(),a=Math.abs(n-t),s=Math.floor(a/1e3),i=Math.floor(s/60),r=Math.floor(i/60),o=Math.floor(r/24);return o>0?`${o} day${1!==o?"s":""}`:r>0?`${r} hour${1!==r?"s":""}`:i>0?`${i} minute${1!==i?"s":""}`:`${s} second${1!==s?"s":""}`}function Iv(e){e<0&&(e=0);const t=Math.floor(e/1e3),n=Math.floor(t/60),a=Math.floor(n/60);if(a>0){const e=n%60;return e>0?`${a}h ${e}m`:`${a}h`}if(n>0){const e=t%60;return e>0?`${n}m ${e}s`:`${n}m`}if(t>0){const n=e%1e3;return n>0?`${t}.${Math.floor(n/100)}s`:`${t}s`}return`${e}ms`}function _v(e,t){if(0===e.length)return 0;const n=t/100*(e.length-1),a=Math.floor(n),s=Math.ceil(n);return a===s?e[a]:e[a]+(e[s]-e[a])*(n-a)}const Bv=n.memo(function({timestamps:e,values:t,onStatsChange:s,compact:i=!1,height:r}){var o,l;const{theme:c}=Js(),[u,d]=n.useState(!0),h=n.useMemo(()=>{if(0===t.length)return null;const e=Math.min(...t),n=Math.max(...t),a=t.reduce((e,t)=>e+t,0)/t.length,s=[...t].sort((e,t)=>e-t);return{min:e,max:n,avg:a,p5:_v(s,5),p95:_v(s,95)}},[t]);n.useEffect(()=>{null==s||s(h)},[h]);const m=n.useCallback(()=>{d(e=>!e)},[]),{heatmapData:p,xLabels:g,yLabels:f}=n.useMemo(()=>{if(0===e.length||0===t.length||!h)return{heatmapData:null,xLabels:[],yLabels:[]};let n,a;if(u){const e=t.filter(e=>e<=-20);if(0===e.length)return{heatmapData:null,xLabels:[],yLabels:[]};const s=[...e].sort((e,t)=>e-t),i=_v(s,5),r=_v(s,95),o=.1*(r-i||1);n=i-o,a=r+o}else{const e=.1*(h.max-h.min||1);n=h.min-e,a=h.max+e}const s=a-n,i=e[0],r=e[e.length-1]-i||1,o=[];for(let h=0;h-20)continue;const c=(e[h]-i)/r,d=1-(Math.max(n,Math.min(a,l))-n)/s;o.push(c,d)}const l=new Float32Array(o),c=[];for(let e=0;e<=5;e++){const t=i+r*e/5;c.push({pos:e/5*100,label:new Date(1e3*t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})})}const d=[];for(let e=0;e<=4;e++){const t=n+s*e/4;d.push({pos:100*(1-e/4),label:`${Math.round(t)}`})}return{heatmapData:{points:l,count:l.length/2},xLabels:c,yLabels:d}},[e,t,h,u]),y=n.useRef(null),b=n.useRef(null),[v,w]=n.useState({width:0,height:0});return n.useEffect(()=>{const e=b.current;if(!e)return;const t=new ResizeObserver(e=>{for(const t of e){const{width:e,height:n}=t.contentRect;e>0&&n>0&&w({width:e,height:n})}});t.observe(e);const n=e.getBoundingClientRect();return n.width>0&&n.height>0&&w({width:n.width,height:n.height}),()=>t.disconnect()},[]),n.useEffect(()=>{const e=y.current;if(!e||!p||0===v.width)return;const t=e.getContext("2d");if(!t)return;const{width:n,height:a}=v,s=window.devicePixelRatio||1;e.width=n*s,e.height=a*s,e.style.width=`${n}px`,e.style.height=`${a}px`,t.scale(s,s),t.clearRect(0,0,n,a);const r=getComputedStyle(document.documentElement).getPropertyValue("--accent-primary").trim(),{r:o,g:l,b:c}=(e=>{const t=e.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)\)/);if(t)return{r:Math.round(255*parseFloat(t[1])),g:Math.round(255*parseFloat(t[2])),b:Math.round(255*parseFloat(t[3]))};const n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return n?{r:parseInt(n[1],16),g:parseInt(n[2],16),b:parseInt(n[3],16)}:{r:250,g:189,b:47}})(r),{points:u,count:d}=p,h=i?Math.max(1.5,Math.min(4,n/d*2)):Math.max(3,Math.min(8,n/d*4));t.globalCompositeOperation="source-over";for(let i=0;ia.jsx("span",{className:"type-data-xs text-text-secondary tabular-nums text-right pr-1.5",style:{position:"absolute",top:`${e.pos}%`,transform:"translateY(-50%)",right:0},children:e.label},t))}),a.jsxs("div",{ref:b,className:"absolute overflow-hidden",style:{left:32,right:0,top:0,bottom:20},children:[a.jsx("svg",{className:"absolute inset-0 w-full h-full",preserveAspectRatio:"none","aria-hidden":"true",children:[0,25,50,75,100].map(e=>a.jsx("line",{x1:"0",y1:`${e}%`,x2:"100%",y2:`${e}%`,stroke:"var(--chart-grid-line, rgba(255,255,255,0.06))",strokeDasharray:"3 3"},e))}),a.jsx("canvas",{ref:y,className:"absolute inset-0 w-full h-full","aria-hidden":"true"}),a.jsx("button",{type:"button",onClick:m,className:"absolute bottom-1 right-1 p-1.5 rounded bg-tooltip-bg/80 hover:bg-tooltip-bg active:bg-tooltip-bg transition-colors touch-manipulation",title:u?"Show full range (min/max)":"Show trimmed range (P5-P95)","aria-label":u?"Expand to show full data range":"Shrink to show trimmed percentile range","aria-pressed":!u,children:u?a.jsx(Pi,{className:"w-3.5 h-3.5 text-text-muted","aria-hidden":"true"}):a.jsx(qi,{className:"w-3.5 h-3.5 text-text-muted","aria-hidden":"true"})})]}),a.jsx("div",{className:"absolute left-0 right-0 bottom-0",style:{left:32,height:20},"aria-hidden":"true",children:g.map((e,t)=>a.jsx("span",{className:"type-data-xs text-text-secondary tabular-nums absolute top-1",style:{left:`${e.pos}%`,transform:"translateX(-50%)"},children:e.label},t))})]}):i?a.jsx("div",{className:"w-full rounded bg-bg-subtle/50",style:{height:r??28},"aria-hidden":"true"}):a.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No noise floor data available"})}),Vv=[{name:"Dashboard",to:"/",icon:Di},{name:"Contacts",to:"/contacts",icon:Fi},{name:"Packets",to:"/packets",icon:zi},{name:"Statistics",to:"/statistics",icon:Ci},{name:"MeshGraph",to:"/meshgraph",icon:Wi},{name:"System",to:"/system",icon:Ai},{name:"Logs",to:"/logs",icon:Ei},{name:"Terminal",to:"/terminal",icon:Ui},{name:"Configuration",to:"/configuration",icon:Oi}];function Ov(){var e,t,s,r,o,l;const{pathname:c}=v(),{stats:u,setMode:d,setDutyCycle:h,sendAdvert:m}=Eb(),p=function(){const e=Xp();if(!e)return null;const t=eg(e);return t&&t.sub?t.sub:null}(),g=Pb(e=>e.prefetchForRoute),f=$b(),y=Pb(e=>e.packetCacheState.dataTier),b=Yb(),w=Math.max(1,Math.ceil(Uy[b].minutes/60)),k=iv(),x=pv(),S=Mv();let j=null;try{j=function(){const e=n.useContext(jp);if(!e)throw new Error("useSidebar must be used within a SidebarLayout");return e}()}catch{}const[C,T]=n.useState(!1),[M,P]=n.useState("idle"),[E,A]=n.useState(null),[L,D]=n.useState([]),z=n.useRef(null),N=n.useCallback(e=>{e!==c&&(z.current&&clearTimeout(z.current),z.current=setTimeout(()=>{g(e)},100))},[c,g]),F=n.useCallback(()=>{z.current&&(clearTimeout(z.current),z.current=null)},[]);n.useEffect(()=>{const e=async()=>{var e;try{const t=await bg(w);t.success&&(null==(e=t.data)?void 0:e.history)&&D(t.data.history)}catch{}};e();const t=setInterval(e,6e4);return()=>clearInterval(t)},[w]);const R=null==u?void 0:u.noise_floor_dbm,I=(null==(t=null==(e=null==u?void 0:u.config)?void 0:e.repeater)?void 0:t.mode)??"forward",_=(null==(r=null==(s=null==u?void 0:u.config)?void 0:s.duty_cycle)?void 0:r.enforcement_enabled)??!1,B=(null==(l=null==(o=null==u?void 0:u.config)?void 0:o.duty_cycle)?void 0:l.max_airtime_percent)??10,V=f.isLoading||f.isBackgroundLoading||f.isTopologyLoading,O=V||k||x,q=f.loadProgress,$=()=>{null==j||j.close()};return a.jsxs(fp,{children:[a.jsxs(yp,{className:"px-5 py-6",children:[a.jsx("h1",{className:"sr-only",children:"pyMC Console"}),a.jsx(Bp,{responsive:!0,className:"block"}),a.jsxs("p",{className:"type-data-xs text-text-muted mt-1.5",children:["v",Ip]})]}),a.jsxs(bp,{className:"py-4",children:[a.jsx(wp,{children:Vv.map(e=>{const t=c===e.to;return a.jsxs(kp,{href:e.to,current:t,onClick:$,onMouseEnter:()=>N(e.to),onMouseLeave:F,children:[a.jsx(e.icon,{}),a.jsx(xp,{children:e.name}),"/contacts"===e.to&&S.length>0&&a.jsxs(Sp,{variant:"accent",children:[a.jsx(Li,{className:"w-3 h-3"}),a.jsx("span",{children:S.length})]}),"/meshgraph"===e.to&&a.jsx(Sp,{variant:"default",children:"Beta"})]},e.name)})}),O&&a.jsx("div",{className:"px-0 py-3",children:a.jsx(nv,{isLoading:V,borderRadius:12,children:a.jsxs("div",{className:"bg-glass-surface/50 rounded-xl p-2",children:[a.jsxs("div",{className:"flex items-center gap-2 px-1 py-0.5",children:[a.jsxs("div",{className:"relative flex h-2 w-2",children:[a.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-accent-primary opacity-75"}),a.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-accent-primary"})]}),a.jsx("span",{className:"type-data-xs text-text-muted flex-1 truncate",children:f.isLoading&&q?"Loading 24h history...":f.isBackgroundLoading&&q?f.statusMessage||`Loading ${y} history...`:f.isTopologyLoading?"Loading topology data...":k?"Computing sparklines":x?"Building topology":"Analyzing database"}),null!==(null==q?void 0:q.percent)&&void 0!==(null==q?void 0:q.percent)&&V&&a.jsxs("span",{className:"type-data-xs text-text-muted tabular-nums",children:[q.percent,"%"]})]}),a.jsx("div",{className:"mt-1.5 h-1 bg-subtle-fill rounded-full overflow-hidden",children:null!==(null==q?void 0:q.percent)&&void 0!==(null==q?void 0:q.percent)&&V?a.jsx("div",{className:"h-full bg-accent-primary/60 rounded-full transition-all duration-300 ease-out",style:{width:`${q.percent}%`}}):a.jsx("div",{className:"h-full bg-accent-primary/40 rounded-full w-full"})}),!V&&a.jsxs("div",{className:"mt-1.5 flex items-center gap-1.5 px-1",children:[a.jsx("span",{className:"type-micro text-text-muted",children:"Data:"}),a.jsx("span",{className:"type-data-xs text-accent-primary",children:(e=>{switch(e){case"24h":return"24 hours";case"3d":return"3 days";case"7d":return"7 days";case"14d":return"14 days";default:return e}})(y)})]})]})})}),a.jsx("div",{className:"flex-1"}),a.jsx(Rp,{label:"Controls",icon:a.jsx($i,{className:"w-5 h-5 text-accent-primary"}),defaultOpen:!1,direction:"up",dataId:"controls",children:a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx(bi,{color:"success"===M?"success":"error"===M?"danger":"primary",onClick:async()=>{T(!0),P("idle"),A(null);const e=await m();T(!1),e.success?(P("success"),setTimeout(()=>P("idle"),1500)):(P("error"),A(e.error||"Failed to send"),setTimeout(()=>{P("idle"),A(null)},3e3))},disabled:C,className:"w-full justify-center",children:C?a.jsxs(a.Fragment,{children:[a.jsxs("svg",{"data-slot":"icon",className:"animate-spin",viewBox:"0 0 24 24",fill:"none",children:[a.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3"}),a.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]}),"Sending..."]}):"success"===M?a.jsxs(a.Fragment,{children:[a.jsx("svg",{"data-slot":"icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:a.jsx("polyline",{points:"20 6 9 17 4 12"})}),"Sent!"]}):"error"===M?a.jsxs(a.Fragment,{children:[a.jsxs("svg",{"data-slot":"icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[a.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),a.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]}),"Failed"]}):a.jsxs(a.Fragment,{children:[a.jsx(Vi,{"data-slot":"icon"}),"Send Advert"]})}),E&&a.jsx("p",{className:"text-accent-danger text-xs text-center",children:E}),a.jsxs("div",{className:"flex items-center justify-between gap-2",children:[a.jsx("span",{className:"text-xs text-text-muted",children:"Repeat"}),a.jsx("span",{className:i("text-xs font-medium","forward"===I?"text-accent-success":"text-accent-secondary"),children:"forward"===I?"ON":"OFF"})]}),a.jsx(bi,{color:"forward"===I?"success":"warning",onClick:()=>{d("forward"===I?"monitor":"forward")},className:"w-full justify-center",children:"forward"===I?a.jsxs(a.Fragment,{children:[a.jsx(_i,{"data-slot":"icon"}),"Repeating"]}):a.jsxs(a.Fragment,{children:[a.jsx(Ii,{"data-slot":"icon"}),"Monitor Only"]})}),a.jsxs("div",{className:"flex items-center justify-between gap-2 mt-1",children:[a.jsx("span",{className:"text-xs text-text-muted",children:"Duty Cycle"}),a.jsx("span",{className:i("text-xs font-medium tabular-nums",_?"text-accent-secondary":"text-text-muted"),children:_?`${B}%`:"OFF"})]}),a.jsxs(bi,{color:_?"warning":"muted",onClick:()=>{h(!_)},className:"w-full justify-center",children:[a.jsx(Ai,{"data-slot":"icon"}),_?`Limited to ${B}%`:"Disabled"]})]})})]}),a.jsx(vp,{children:a.jsxs("div",{className:"p-3 flex flex-col gap-1",children:[void 0!==(null==u?void 0:u.uptime_seconds)&&a.jsxs("div",{className:"flex items-center gap-3 px-3 py-2",children:[a.jsx(Mi,{className:"w-5 h-5 text-text-muted flex-shrink-0"}),a.jsxs("span",{className:"type-data-xs text-text-secondary tabular-nums",children:[Ev(u.uptime_seconds)," uptime"]})]}),a.jsxs("div",{className:"flex items-center gap-3 px-3 py-2",children:[a.jsx(Bi,{className:"w-5 h-5 text-accent-primary flex-shrink-0"}),a.jsx("span",{className:"type-data-xs text-text-muted",children:"Noise Floor"}),a.jsx("span",{className:"ml-auto type-data text-text-primary tabular-nums",children:null!=R?`${R.toFixed(0)} dBm`:"—"})]}),L.length>0&&a.jsx("div",{className:"px-3 py-1",children:a.jsx(Bv,{timestamps:L.map(e=>e.timestamp),values:L.map(e=>e.noise_floor_dbm),compact:!0,height:28})}),a.jsxs("div",{className:"flex items-center gap-3 px-3 py-2",children:[a.jsx(ev,{showLabel:!0}),(null==u?void 0:u.version)&&a.jsxs("span",{className:"type-data-xs text-text-muted truncate",title:`v${u.version}`,children:["v",u.version]})]}),a.jsxs("button",{onClick:()=>{Zp(),window.location.href="/login"},className:"flex items-center gap-3 px-3 py-2 rounded-xl text-text-muted hover:text-accent-danger hover:bg-accent-danger/10 transition-all duration-150",children:[a.jsx(Ni,{className:"w-5 h-5 flex-shrink-0"}),a.jsx("span",{className:"type-body-sm",children:"Sign Out"}),p&&a.jsxs("span",{className:"ml-auto type-data-xs",children:["(",p,")"]})]})]})})]})}function qv(){const e=$b(),t=e.isLoading||e.isBackgroundLoading||e.isTopologyLoading;return a.jsxs(Pp,{children:[a.jsxs(Ep,{children:[a.jsx("h1",{className:"sr-only",children:"pyMC Console"}),a.jsx(Bp,{height:26,className:"block"}),t&&a.jsx(av,{className:"ml-2"})]}),a.jsx(Ap,{}),a.jsxs(Ep,{children:[a.jsxs("p",{className:"type-data-xs text-text-muted",children:["v",Ip]}),a.jsx(ev,{})]})]})}const $v=n.memo(function(){const{theme:e}=Js(),{backgroundImage:t,brightness:n,colorScheme:s}=e,i=fe(s),r=(null==i?void 0:i.meta.backgroundImage)||null==i?void 0:i.meta.backgroundColor,o=(100-n)/100;return a.jsxs(a.Fragment,{children:[t?a.jsx("div",{className:"fixed inset-0 -z-20",style:{contain:"paint"},"aria-hidden":"true",children:a.jsx("div",{className:"absolute inset-0 bg-cover bg-center bg-no-repeat transition-opacity duration-300 ease-out",style:{backgroundImage:`url(${t})`}})}):r?a.jsx("div",{className:"fixed inset-0 -z-20 transition-colors duration-300 ease-out",style:{backgroundColor:r,contain:"paint"},"aria-hidden":"true"}):null,a.jsx("div",{className:"fixed inset-0 -z-10 bg-black pointer-events-none transition-opacity duration-200 ease-out",style:{opacity:o,contain:"paint"},"aria-hidden":"true"})]})}),Uv=20,Wv=12,Hv=n.createContext(null);function Yv({children:e}){const[t,s]=n.useState({content:null,mouseX:0,mouseY:0,visible:!1}),i=n.useRef(null),[r,o]=n.useState({x:0,y:0}),l=n.useCallback((e,t,n)=>{s({content:e,mouseX:t,mouseY:n,visible:!0})},[]),c=n.useCallback(()=>{s(e=>({...e,visible:!1}))},[]),u=n.useCallback((e,t)=>{s(n=>n.visible?{...n,mouseX:e,mouseY:t}:n)},[]);n.useEffect(()=>{if(!t.visible||!i.current)return;const e=i.current.getBoundingClientRect(),{mouseX:n,mouseY:a}=t,s=window.innerWidth,r=window.innerHeight;let l,c;l=n+Uv+e.width+Wv>s?n-Uv-e.width:n+Uv,l=Math.max(Wv,Math.min(l,s-e.width-Wv)),c=a-Uv-e.height{c.current&&(clearTimeout(c.current),c.current=null)},h=n.useCallback(t=>{d(),c.current=setTimeout(()=>{u.current=!0,i(e,t.clientX,t.clientY)},s)},[i,e,s]),m=n.useCallback(e=>{u.current&&o(e.clientX,e.clientY)},[o]),p=n.useCallback(()=>{d(),u.current=!1,r()},[r]),g=n.useCallback(()=>{if(d(),!l.current)return;const t=l.current.getBoundingClientRect();c.current=setTimeout(()=>{u.current=!0,i(e,t.left+t.width/2,t.top)},s)},[i,e,s]),f=n.useCallback(()=>{d(),u.current=!1,r()},[r]);return n.useEffect(()=>()=>{d(),u.current&&(u.current=!1,r())},[r]),n.useEffect(()=>{const e=()=>{u.current&&(d(),u.current=!1,r())};return document.addEventListener("click",e,!0),()=>document.removeEventListener("click",e,!0)},[r]),a.jsx("span",{ref:l,onMouseEnter:h,onMouseMove:m,onMouseLeave:p,onFocus:g,onBlur:f,className:"contents",children:t})}function Kv({label:e}){return a.jsx("div",{className:"min-h-[50vh]","aria-label":`Loading ${e}`,"aria-busy":"true"})}function Xv(){return a.jsx(Kv,{label:"dashboard"})}function Jv(){return a.jsx(Kv,{label:"list"})}function Zv(){return a.jsx(Kv,{label:"map"})}function Qv(){return a.jsx(Kv,{label:"charts"})}function ew(){return a.jsx(Kv,{label:"settings"})}function tw(){return a.jsx(Kv,{label:"system"})}function nw({children:e}){return a.jsx(a.Fragment,{children:e})}const aw=n.lazy(()=>f(()=>import("./Login-X6H6_R2y.js"),__vite__mapDeps([0,1,2,3]))),sw=n.lazy(()=>f(()=>import("./Dashboard-BSUVzNBC.js"),__vite__mapDeps([4,1,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,3,25,26,27]))),iw=n.lazy(()=>f(()=>import("./Packets-9uyPWOef.js"),__vite__mapDeps([28,1,13,10,11,12,14,15,16,17,18,19,20,21,22,23,6,9,29,5,26,3]))),rw=n.lazy(()=>f(()=>import("./Contacts-hCqb2-UP.js").then(e=>e.C),__vite__mapDeps([30,1,31,5,32,18,24,21,33,17,13,29,34,16,22,11,35,36,3,37,15,38]))),ow=n.lazy(()=>f(()=>import("./Statistics-B9XmGE0m.js"),__vite__mapDeps([39,1,40,6,20,41,8,9,5,13,35,36,3,18,16,26,42,32,27,37,38]))),lw=n.lazy(()=>f(()=>import("./MeshGraph-CbZRxc5R.js"),__vite__mapDeps([43,1,44,2,13,32,23,15,33,17,37,14,3]))),cw=n.lazy(()=>f(()=>import("./MeshGraphLabelTest-9WwHSZHg.js"),__vite__mapDeps([45,1,15,3]))),uw=n.lazy(()=>f(()=>import("./System-CNFICQV5.js"),__vite__mapDeps([46,1,6,5,47,27,26,21,12,37,18,3]))),dw=n.lazy(()=>f(()=>import("./Logs-C-eWV8pL.js"),__vite__mapDeps([48,1,40,5,26,3]))),hw=n.lazy(()=>f(()=>import("./Terminal-4b8EQwTz.js"),__vite__mapDeps([49,1,31,3,19,5]))),mw=n.lazy(()=>f(()=>import("./Configuration-Df5yvVwq.js"),__vite__mapDeps([50,1,34,18,51,25,5,13,26,15,42,27,22,47,14,3])));function pw({children:e}){const t=v();return Qp()?a.jsx(a.Fragment,{children:e}):a.jsx(x,{to:"/login",state:{from:t},replace:!0})}class gw extends n.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}render(){var e;return this.state.hasError?a.jsxs("div",{className:"surface-base rounded-2xl p-8 text-center",children:[a.jsx("p",{className:"type-subheading text-accent-red mb-2",children:"Page failed to render"}),a.jsx("p",{className:"type-body text-white/50 mb-4",children:(null==(e=this.state.error)?void 0:e.message)||"Unknown error"}),a.jsx("button",{onClick:()=>this.setState({hasError:!1}),className:"px-4 py-2 bg-accent-primary/20 text-accent-primary rounded-lg hover:bg-accent-primary/30 transition-colors",children:"Try Again"})]}):this.props.children}}function fw(){const e=Pb(e=>e.initializeApp),t=Qp();return n.useEffect(()=>{if(!t)return;e(),rf.getState().initialize();const n=setInterval(()=>{og()},3e4);return og(),function(){if(lg)return;if("undefined"==typeof document)return;const e=async()=>{if("visible"!==document.visibilityState)return;if(!Xp())return;if(tg())return Zp(),void("undefined"==typeof window||window.location.pathname.includes("/login")||(window.location.href="/login"));const e=ng();e>0&&e<300&&await ig()};document.addEventListener("visibilitychange",e),lg=!0,"visible"===document.visibilityState&&e()}(),()=>clearInterval(n)},[e,t]),a.jsxs(Yv,{children:[a.jsx($v,{}),a.jsxs(w,{children:[a.jsx(k,{path:"/login",element:a.jsx(n.Suspense,{fallback:a.jsx("div",{className:"min-h-screen bg-bg-body"}),children:a.jsx(aw,{})})}),a.jsx(k,{path:"/meshgraph-label-test",element:a.jsx(n.Suspense,{fallback:a.jsx("div",{className:"min-h-screen bg-black"}),children:a.jsx(cw,{})})}),a.jsx(k,{path:"/*",element:a.jsx(pw,{children:a.jsx(Mp,{sidebar:a.jsx(Ov,{}),navbar:a.jsx(qv,{}),children:a.jsx("div",{className:"px-4 sm:px-6 lg:px-8 pt-5 pb-4 sm:pb-6 lg:pb-8 max-w-7xl mx-auto",children:a.jsx(gw,{children:a.jsxs(w,{children:[a.jsx(k,{path:"/",element:a.jsx(n.Suspense,{fallback:a.jsx(Xv,{}),children:a.jsx(nw,{children:a.jsx(sw,{})})})}),a.jsx(k,{path:"/packets",element:a.jsx(n.Suspense,{fallback:a.jsx(Jv,{}),children:a.jsx(nw,{children:a.jsx(iw,{})})})}),a.jsx(k,{path:"/contacts",element:a.jsx(n.Suspense,{fallback:a.jsx(Zv,{}),children:a.jsx(nw,{children:a.jsx(rw,{})})})}),a.jsx(k,{path:"/statistics",element:a.jsx(n.Suspense,{fallback:a.jsx(Qv,{}),children:a.jsx(nw,{children:a.jsx(ow,{})})})}),a.jsx(k,{path:"/meshgraph",element:a.jsx(n.Suspense,{fallback:a.jsx(Qv,{}),children:a.jsx(nw,{children:a.jsx(lw,{})})})}),a.jsx(k,{path:"/system",element:a.jsx(n.Suspense,{fallback:a.jsx(tw,{}),children:a.jsx(nw,{children:a.jsx(uw,{})})})}),a.jsx(k,{path:"/logs",element:a.jsx(n.Suspense,{fallback:a.jsx(Jv,{}),children:a.jsx(nw,{children:a.jsx(dw,{})})})}),a.jsx(k,{path:"/terminal",element:a.jsx(n.Suspense,{fallback:a.jsx(Jv,{}),children:a.jsx(nw,{children:a.jsx(hw,{})})})}),a.jsx(k,{path:"/configuration",element:a.jsx(n.Suspense,{fallback:a.jsx(ew,{}),children:a.jsx(nw,{children:a.jsx(mw,{})})})})]})})})})})})]})]})}const yw=console.warn;console.warn=(...e)=>{const t=e[0];if("string"==typeof t){if(t.includes("width")&&t.includes("height")&&t.includes("chart should be greater than 0"))return;if(t.includes("Unable to load glyph range"))return}yw.apply(console,e)},g.createRoot(document.getElementById("root")).render(a.jsx(n.StrictMode,{children:a.jsx(Xs,{children:a.jsx(S,{children:a.jsx(fw,{})})})}));export{Cc as $,Vh as A,hi as B,_y as C,Uy as D,Vy as E,By as F,Af as G,Av as H,Gb as I,ul as J,dp as K,ev as L,Ah as M,pp as N,Ti as O,Bp as P,Lb as Q,Bi as R,Yy as S,Gv as T,Xb as U,$b as V,kg as W,Ci as X,ei as Y,bi as Z,Hi as _,el as a,xg as a$,fc as a0,Ry as a1,Vf as a2,Of as a3,qf as a4,Dy as a5,oi as a6,zv as a7,ai as a8,si as a9,Eb as aA,qb as aB,dv as aC,hv as aD,Kb as aE,Jb as aF,M as aG,T as aH,fe as aI,mg as aJ,pg as aK,Ys as aL,Ky as aM,xv as aN,jv as aO,Mv as aP,Wi as aQ,Wy as aR,Gy as aS,Bv as aT,rb as aU,uv as aV,Pv as aW,Ii as aX,_i as aY,Bb as aZ,Vb as a_,$y as aa,ip as ab,zy as ac,Ny as ad,$h as ae,Lf as af,Lv as ag,Mi as ah,Ay as ai,Vi as aj,wv as ak,mv as al,Cv as am,Ly as an,mi as ao,Iv as ap,Dv as aq,ti as ar,Lp as as,kv as at,Tv as au,Li as av,Rv as aw,lv as ax,iv as ay,Sv as az,yc as b,Co as b$,Sg as b0,Xy as b1,Ev as b2,Nb as b3,Fb as b4,Ib as b5,_b as b6,Ei as b7,Zy as b8,Ip as b9,dy as bA,hy as bB,zf as bC,Rf as bD,Nf as bE,dg as bF,Js as bG,Me as bH,ze as bI,af as bJ,Oi as bK,$i as bL,Nv as bM,Fv as bN,mp as bO,gp as bP,_g as bQ,qy as bR,ni as bS,Wb as bT,Jg as bU,Pr as bV,wu as bW,ru as bX,Jh as bY,hc as bZ,Oc as b_,$f as ba,fg as bb,Cg as bc,Tg as bd,Mg as be,jg as bf,Pg as bg,Ui as bh,of as bi,ff as bj,lf as bk,cf as bl,uf as bm,df as bn,Bf as bo,If as bp,_f as bq,fy as br,Uf as bs,Wf as bt,Df as bu,my as bv,Ff as bw,Hf as bx,gy as by,uy as bz,ji as c,Qi as c0,nl as c1,Oo as c2,tl as c3,ql as c4,dr as c5,cr as c6,au as c7,su as c8,sd as c9,Xu as ca,uu as cb,Ud as cc,Sc as cd,Zo as ce,Yu as cf,Ih as cg,Tr as ch,Gd as ci,pv as cj,gv as ck,nv as cl,Fr as d,uc as e,Nr as f,Yp as g,Gi as h,Qp as i,Qs as j,Us as k,sg as l,ep as m,Db as n,zb as o,Rb as p,Ab as q,Ub as r,Gp as s,Ob as t,Xi as u,Yb as v,Wg as w,bg as x,Hb as y,Oy as z}; diff --git a/frontend/dist/assets/index-D22MpaCY.js b/frontend/dist/assets/index-D22MpaCY.js new file mode 100644 index 00000000..fff70414 --- /dev/null +++ b/frontend/dist/assets/index-D22MpaCY.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Login-DJBcf-C6.js","assets/vendor-react-Cwum97tW.js","assets/config-C7QO3CEB.js","assets/vendor-core-CDrKesoV.js","assets/Dashboard-Hxpnr4og.js","assets/PageLayout-B53JpmK1.js","assets/useThemeColors-S-uaxvPT.js","assets/link-scoring-BnkyjnFT.js","assets/TimeRangeSelector-C89_yLwH.js","assets/index-bDa2a9Y2.js","assets/PacketList-DSZP-sF4.js","assets/payload-decoders-B_w2m9Or.js","assets/SignalIndicator-CBL6VSNS.js","assets/arrow-up-DysUUcGL.js","assets/DataBox-Bl0vntck.js","assets/chevron-right-CZNwXWtt.js","assets/loader-circle-2q9lT2qG.js","assets/map-pin-kiJDSdn0.js","assets/zap-Cpbok2bP.js","assets/triangle-alert-TfoZuZfW.js","assets/route-ExVvvUtv.js","assets/activity-Cb8TQBuo.js","assets/circle-check-CKXuJpMJ.js","assets/house-D2cJ2w9-.js","assets/trending-up-D5ntwkR1.js","assets/NodeInformationCard-CJnzzUo0.js","assets/Card-CCBguhJs.js","assets/Grid-BVGRgue6.js","assets/Packets-5FmM_VMr.js","assets/users-dFI4fg5G.js","assets/Contacts-DHVYuXFa.js","assets/ping-o6tDyVoV.js","assets/git-branch-Cev-c9BQ.js","assets/target-BlWNMuhi.js","assets/ConfirmModal-flvCJ5X5.js","assets/CollisionExplorerModal-BmT8XQYy.js","assets/BasemapLayer-C9wiTbJT.js","assets/network-Dz5VqBhN.js","assets/maplibre-gl-B1CfjdFi.css","assets/Statistics-CGJSoMIn.js","assets/usePolling-XMUhKpB6.js","assets/compass-Bsfx4e84.js","assets/info-BojcGhYE.js","assets/MeshGraph-jA9fGpu6.js","assets/DeepAnalysisModal-DSV1q_wY.js","assets/MeshGraphLabelTest-Cv3ODNn6.js","assets/System-bU7CQZPd.js","assets/refresh-cw-BtHqSStQ.js","assets/Logs-C6iBCeIs.js","assets/Terminal-CFdtTKrf.js","assets/Configuration-Bh26u4ks.js","assets/font-loader-jlbdh9Fw.js"])))=>i.map(i=>d[i]); +var a,e,n=Object.defineProperty,o=(a,e,o)=>((a,e,o)=>e in a?n(a,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):a[e]=o)(a,"symbol"!=typeof e?e+"":e,o);import{r as t,j as r,b as s,c as i,L as l,h as c,z as d,Q as u,y as h,x as m,X as p,d as g,e as b,f}from"./vendor-react-Cwum97tW.js";import{_ as y}from"./deckgl-DTsmDcfs.js";import{L as v,c as w,u as k,R as x,a as j,N as z,B as C}from"./vendor-core-CDrKesoV.js";!function(){const a=document.createElement("link").relList;if(!(a&&a.supports&&a.supports("modulepreload"))){for(const a of document.querySelectorAll('link[rel="modulepreload"]'))e(a);new MutationObserver(a=>{for(const n of a)if("childList"===n.type)for(const a of n.addedNodes)"LINK"===a.tagName&&"modulepreload"===a.rel&&e(a)}).observe(document,{childList:!0,subtree:!0})}function e(a){if(a.ep)return;a.ep=!0;const e=function(a){const e={};return a.integrity&&(e.integrity=a.integrity),a.referrerPolicy&&(e.referrerPolicy=a.referrerPolicy),"use-credentials"===a.crossOrigin?e.credentials="include":"anonymous"===a.crossOrigin?e.credentials="omit":e.credentials="same-origin",e}(a);fetch(a.href,e)}}();const A={surfaces:{glass:{tint:"#252525",light:"#ffffff",dark:"#000000",reflexLight:.15,reflexDark:.8,blur:6,blurElevated:8,brightness:1,opacity:8,opacityElevated:12},card:{radius:"1.125rem",padding:"1.25rem",paddingCompact:"0.75rem"},sidebar:{tint:"rgba(113, 156, 223, 0.06)",width:"16rem",drawerWidth:"85vw"},modal:{radius:"1.125rem",backdropBlur:"8px",backdropColor:"rgba(0, 0, 0, 0.6)"}},colors:{bg:{body:"#171717",surface:"#252525",elevated:"#333233",subtle:"#3F3F3F"},border:{subtle:"#4B4B4B",strong:"#616161"},text:{primary:"#E1E1E1",secondary:"#BFBFBF",muted:"#727272",inverse:"#171717"},accent:{primary:"#719CDF",secondary:"#DFBC72",tertiary:"#6FBCBD",success:"#719872",danger:"#E12672"},signal:{excellent:"#00FF00",good:"#8CE619",fair:"#FFD900",poor:"#FF8C26",critical:"#FF3333",unknown:"#616161"},status:{success:"#719872",warning:"#DFBC72",danger:"#E12672",info:"#6FBCBD",muted:"#616161"},chart:{c1:"#719CDF",c2:"#0074BE",c3:"#6FBCBD",c4:"#DFBC72",c5:"#719872",c6:"#E12672",c7:"#E17899",c8:"#999ABD",grid:"rgba(255, 255, 255, 0.06)",axis:"rgba(255, 255, 255, 0.4)",cursor:"rgba(255, 255, 255, 0.2)"},metric:{received:"#719872",forwarded:"#0074BE",transmitted:"#DFBC72",dropped:"#E12672"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#8E4EC6",local:"#FFB224",neighbor:"#46A758",mobile:"#F76B15",room:"#D6409F",edge:"#4B4B4B",edgeHover:"#6FBCBD"}},typography:{font:{title:"'Inter', system-ui, sans-serif",display:"'Inter', system-ui, sans-serif",mono:"'JetBrains Mono', 'SF Mono', Monaco, monospace"},size:{xs:"0.64rem",sm:"0.8rem",base:"1rem",md:"1.125rem",lg:"1.25rem",xl:"1.563rem",xxl:"1.953rem",hero:"3.052rem"},weight:{normal:400,medium:500,semibold:600,bold:700},leading:{tight:1.1,snug:1.25,normal:1.5},tracking:{tight:"-0.02em",normal:"0",wide:"0.05em"}},spacing:{space:{gap:"1.5rem",gapMobile:"0.75rem",page:"1.5rem",pageMobile:"1rem",section:"2rem"},radius:{sm:"0.5rem",md:"0.875rem",lg:"1.125rem",xl:"1.5rem",pill:"9999px"}},motion:{fast:"0.1s",normal:"0.15s",slow:"0.4s",easing:"ease-out"}};function D(a){const e=a.replace("#","");if(6!==e.length&&3!==e.length)return a;let n,o,t;return 3===e.length?(n=parseInt(e[0]+e[0],16)/255,o=parseInt(e[1]+e[1],16)/255,t=parseInt(e[2]+e[2],16)/255):(n=parseInt(e.slice(0,2),16)/255,o=parseInt(e.slice(2,4),16)/255,t=parseInt(e.slice(4,6),16)/255),`color(display-p3 ${n.toFixed(3)} ${o.toFixed(3)} ${t.toFixed(3)})`}function E(){return"undefined"!=typeof window&&CSS.supports("color","color(display-p3 1 1 1)")}function B(a,e){const n={...a};for(const o of Object.keys(e)){const t=e[o],r=a[o];void 0!==t&&("object"!=typeof t||null===t||Array.isArray(t)||"object"!=typeof r||null===r||Array.isArray(r)?n[o]=t:n[o]=B(r,t))}return n}function F(a){return{meta:a.meta,display:a.display,surfaces:a.surfaces?B(A.surfaces,a.surfaces):A.surfaces,colors:a.colors?B(A.colors,a.colors):A.colors,typography:a.typography?B(A.typography,a.typography):A.typography,spacing:a.spacing?B(A.spacing,a.spacing):A.spacing,motion:a.motion?B(A.motion,a.motion):A.motion}}function q(a){const e=a.replace("#","");return 6===e.length?`${parseInt(e.slice(0,2),16)}, ${parseInt(e.slice(2,4),16)}, ${parseInt(e.slice(4,6),16)}`:"255, 255, 255"}function S(a){return{id:a.meta.id,colorScheme:{name:a.meta.name,dataTheme:a.meta.dataTheme,previewColor:a.meta.previewColor},background:{src:a.meta.backgroundImage,suggestedBrightness:a.meta.backgroundBrightness},display:{font:a.display.font,color:a.display.color,size:a.display.size,paletteColors:a.display.palette}}}const M="#fafafa",T="#a1a1aa",P="#71717a",L="#3f3f46",R="#27272a",N="#18181b",I="#09090b",_="#ef4444",V="#f97316",O="#f59e0b",$="#eab308",W="#22c55e",U="#10b981",H="#06b6d4",Y="#3b82f6",G="#8b5cf6",K=F({meta:{id:"",name:"",dataTheme:"",previewColor:Y,backgroundImage:"",backgroundBrightness:100,isDark:!0},display:{font:"Inter, sans-serif",color:T,size:1,palette:[[Y,W,$,V,_],[I,N,R,L,M]]},typography:{font:{title:"Inter, sans-serif",display:"Inter, sans-serif",mono:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace'},weight:{normal:400,medium:500,semibold:600,bold:700,badge:700},tracking:{tight:"-0.02em",normal:"0",wide:"0.025em"},badge:{textTransform:"capitalize"}},surfaces:{glass:{tint:N,light:L,dark:I,reflexLight:0,reflexDark:0,blur:0,blurElevated:0,brightness:1,opacity:100,opacityElevated:100,catalystMode:!0},sidebar:{tint:`${R}80`},card:{radius:"0.5rem"},modal:{radius:"0.75rem"}},colors:{bg:{body:I,surface:N,elevated:R,subtle:R},border:{subtle:R,strong:"#52525b"},text:{primary:"#fff",secondary:T,muted:P,inverse:I},accent:{primary:Y,secondary:$,tertiary:H,success:W,danger:_},signal:{excellent:W,good:"#84cc16",fair:$,poor:V,critical:_,unknown:P},status:{success:W,warning:O,danger:_,info:Y,muted:P},chart:{c1:Y,c2:U,c3:O,c4:V,c5:"#f43f5e",c6:G,c7:H,c8:P,grid:`${M}0d`,axis:`${M}33`,cursor:`${Y}33`},metric:{received:Y,forwarded:U,transmitted:V,dropped:_},map:{nodeFill:Y,nodeStroke:`${M}e6`,hub:G,local:O,neighbor:U,mobile:V,room:"#ec4899",edge:L,edgeHover:Y}}}),X=K;S(K);const J=F({meta:{id:"",name:"",dataTheme:"",previewColor:"#B39DF3",backgroundImage:"/assets/sand.jpg",backgroundBrightness:80,isDark:!0},display:{font:"'Rubik Mono One', monospace",color:"#4A4A52",size:.8,palette:[["#B49DFF","#F9D26F","#71F8E5","#39D98A","#FF5C7A"],["#4CFFB5","#FF8A5C","#A78BFA","#60A5FA","#F472B6"]]},typography:{font:{title:"'Rubik Mono One', monospace"}},surfaces:{glass:{tint:"#252525",blur:6,blurElevated:8},sidebar:{tint:"rgba(113, 156, 223, 0.06)"}}}),Z=J;S(J);const Q=F({meta:{id:"",name:"",dataTheme:"",previewColor:"#fabd2f",backgroundImage:"/assets/magma.webp",backgroundBrightness:50,isDark:!0},display:{font:"'Jacquard 12', serif",color:"#fe8019",size:1.75,palette:[["#fabd2f","#fb4934","#8ec07c","#b8bb26","#d3869b"],["#fe8019","#83a598","#d65d0e","#928374","#ebdbb2"]]},typography:{font:{title:"'Jacquard 12', serif"},size:{xxl:"2.344rem"}},surfaces:{glass:{tint:"#282828"},sidebar:{tint:"rgba(250, 189, 47, 0.06)"}},colors:{accent:{primary:"#fabd2f",secondary:"#fb4934",tertiary:"#8ec07c",success:"#b8bb26",danger:"#fb4934"},signal:{excellent:"#b8bb26",good:"#8ec07c",fair:"#fabd2f",poor:"#fe8019",critical:"#fb4934",unknown:"#928374"},status:{success:"#b8bb26",warning:"#fabd2f",danger:"#fb4934",info:"#83a598",muted:"#928374"},chart:{c1:"#fabd2f",c2:"#fe8019",c3:"#fb4934",c4:"#d3869b",c5:"#b8bb26",c6:"#8ec07c",c7:"#83a598",c8:"#d65d0e",grid:"rgba(251, 241, 199, 0.06)",axis:"rgba(251, 241, 199, 0.4)",cursor:"rgba(251, 241, 199, 0.2)"},metric:{received:"#b8bb26",forwarded:"#83a598",transmitted:"#fabd2f",dropped:"#fb4934"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#b16286",local:"#fabd2f",neighbor:"#fabd2f",mobile:"#fe8019",room:"#d3869b",edge:"#665c54",edgeHover:"#8ec07c"}}}),aa=Q;S(Q);const ea=F({meta:{id:"",name:"",dataTheme:"",previewColor:"#83a598",backgroundImage:"/assets/water.webp",backgroundBrightness:40,isDark:!0},display:{font:"'Cantora One', sans-serif",color:"#83a598",size:1.25,palette:[["#83a598","#a89984","#8ec07c","#d79921","#b16286"],["#fe8019","#cc241d","#7c6f64","#bdae93","#ebdbb2"]]},typography:{font:{title:"'Cantora One', sans-serif"},size:{xxl:"2.148rem"},weight:{semibold:500}},surfaces:{glass:{tint:"#1e1e1e"},sidebar:{tint:"rgba(131, 165, 152, 0.06)"}},colors:{accent:{primary:"#83a598",secondary:"#a89984",tertiary:"#8ec07c",success:"#8ec07c",danger:"#cc241d"},signal:{excellent:"#8ec07c",good:"#b8bb26",fair:"#d79921",poor:"#fe8019",critical:"#cc241d",unknown:"#7c6f64"},status:{success:"#8ec07c",warning:"#d79921",danger:"#cc241d",info:"#83a598",muted:"#7c6f64"},chart:{c1:"#83a598",c2:"#8ec07c",c3:"#d79921",c4:"#b16286",c5:"#fe8019",c6:"#cc241d",c7:"#a89984",c8:"#7c6f64",grid:"rgba(213, 196, 161, 0.06)",axis:"rgba(213, 196, 161, 0.4)",cursor:"rgba(213, 196, 161, 0.2)"},metric:{received:"#8ec07c",forwarded:"#83a598",transmitted:"#d79921",dropped:"#cc241d"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#b16286",local:"#d79921",neighbor:"#d79921",mobile:"#fe8019",room:"#b16286",edge:"#504945",edgeHover:"#83a598"}}}),na=ea;S(ea);const oa=F({meta:{id:"",name:"",dataTheme:"",previewColor:"#33859d",backgroundImage:"/assets/stars.jpg",backgroundBrightness:100,isDark:!0},display:{font:"'IBM Plex Mono', monospace",color:"#c23127",size:1.25,palette:[["#33859d","#edb54b","#26a98b","#c23127","#888ca6"],["#195465","#d26939","#99d1ce","#4e5165","#0c1014"]]},typography:{font:{title:"'IBM Plex Mono', monospace"}},surfaces:{glass:{tint:"#0a0e14",blur:1,blurElevated:2},sidebar:{tint:"rgba(51, 133, 157, 0.06)"}},colors:{accent:{primary:"#33859d",secondary:"#edb54b",tertiary:"#26a98b",success:"#26a98b",danger:"#c33027"},signal:{excellent:"#26a98b",good:"#7ec07c",fair:"#edb54b",poor:"#d26939",critical:"#c33027",unknown:"#195465"},status:{success:"#26a98b",warning:"#edb54b",danger:"#c33027",info:"#599caa",muted:"#195465"},chart:{c1:"#33859d",c2:"#edb54b",c3:"#26a98b",c4:"#599caa",c5:"#d26939",c6:"#c33027",c7:"#888ba5",c8:"#195465",grid:"rgba(153, 209, 206, 0.06)",axis:"rgba(153, 209, 206, 0.4)",cursor:"rgba(153, 209, 206, 0.2)"},metric:{received:"#26a98b",forwarded:"#33859d",transmitted:"#edb54b",dropped:"#c33027"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#888ba5",local:"#edb54b",neighbor:"#edb54b",mobile:"#d26939",room:"#888ba5",edge:"#245361",edgeHover:"#26a98b"}}}),ta=oa;S(oa);const ra="#2D2D2D",sa="#4A4A4A",ia="#7A7A7A",la=F({meta:{id:"",name:"",dataTheme:"",previewColor:"#9ed072",backgroundImage:"",backgroundColor:"#F5F5F5",backgroundBrightness:100,isDark:!1},display:{font:"'JetBrains Mono', monospace",color:"#2D2D2D",size:1,palette:[["#9ed072","#fc5d7c","#76cce0","#e7c664","#b39df3"],["#f39660","#7f8490","#e2e2e3","#55575e","#2c2e34"]]},typography:{font:{title:"'JetBrains Mono', 'SF Mono', Monaco, monospace",display:"'Instrument Sans', system-ui, sans-serif",mono:"'JetBrains Mono', 'SF Mono', Monaco, monospace",cardTitle:"'JetBrains Mono', 'SF Mono', Monaco, monospace"},size:{xxl:"1.875rem",cardTitle:"1rem"},weight:{normal:400,medium:500,semibold:600,bold:600,cardTitle:600}},surfaces:{glass:{tint:"#FFFFFF",light:"rgba(255, 255, 255, 1)",dark:"rgba(0, 0, 0, 0.1)",reflexLight:0,reflexDark:0,blur:0,blurElevated:0,brightness:1,opacity:0,opacityElevated:0,ribbonMode:!0,ribbonBorderWidth:2,ribbonBorderColor:ia},sidebar:{tint:"rgba(0, 0, 0, 0.02)"}},colors:{bg:{body:"#F5F5F5",surface:"#FFFFFF",elevated:"#FFFFFF",subtle:"#EBEBEB"},border:{subtle:"#E0E0E0",strong:"#BFBFBF"},text:{primary:ra,secondary:sa,muted:ia,inverse:"#FFFFFF"},accent:{primary:"#9ed072",secondary:"#e7c664",tertiary:"#76cce0",success:"#9ed072",danger:"#fc5d7c"},signal:{excellent:"#9ed072",good:"#c5d93d",fair:"#e7c664",poor:"#f39660",critical:"#fc5d7c",unknown:"#7f8490"},status:{success:"#9ed072",warning:"#e7c664",danger:"#fc5d7c",info:"#76cce0",muted:"#7f8490"},chart:{c1:"#2E8B57",c2:"#E14D6B",c3:"#D4A832",c4:"#4A9EA0",c5:"#8B6BAE",c6:"#D97A4A",c7:ia,c8:sa,grid:"rgba(45, 45, 45, 0.08)",axis:"rgba(45, 45, 45, 0.5)",cursor:"rgba(45, 45, 45, 0.15)"},metric:{received:"#9ed072",forwarded:"#76cce0",transmitted:"#e7c664",dropped:"#fc5d7c"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#b39df3",local:"#e7c664",neighbor:"#e7c664",mobile:"#f39660",room:"#fc5d7c",edge:ia,edgeHover:"#76cce0"},icon:{pageTitle:ra,cardTitle:ra,widget:sa,action:sa,nav:ia,navActive:ra},sidebar:{bg:"rgba(0, 0, 0, 0.02)",navHoverBg:"rgba(0, 0, 0, 0.04)",navActiveBg:"rgba(0, 0, 0, 0.06)",navActiveText:ra}}}),ca=la;S(la);const da=F({meta:{id:"",name:"",dataTheme:"",previewColor:"#7E9CD8",backgroundImage:"/assets/folds.webp",backgroundBrightness:50,isDark:!0},display:{font:"'Inter', sans-serif",color:"#7E9CD8",size:1.25,palette:[["#7E9CD8","#E46876","#7AA89F","#DCA561","#957FB8"],["#7FB4CA","#D27E99","#98BB6C","#727169","#1F1F28"]]},typography:{font:{title:"'Inter', sans-serif"}},surfaces:{glass:{tint:"#1F1F28"},sidebar:{tint:"rgba(126, 156, 216, 0.06)"}},colors:{accent:{primary:"#7E9CD8",secondary:"#E6C384",tertiary:"#7FB4CA",success:"#98BB6C",danger:"#E46876"},signal:{excellent:"#98BB6C",good:"#B8CC5C",fair:"#E6C384",poor:"#FFA066",critical:"#E46876",unknown:"#54546D"},status:{success:"#98BB6C",warning:"#E6C384",danger:"#E46876",info:"#7FB4CA",muted:"#727169"},chart:{c1:"#7E9CD8",c2:"#E6C384",c3:"#98BB6C",c4:"#957FB8",c5:"#7FB4CA",c6:"#E46876",c7:"#FFA066",c8:"#D27E99",grid:"rgba(220, 215, 186, 0.06)",axis:"rgba(220, 215, 186, 0.4)",cursor:"rgba(220, 215, 186, 0.2)"},metric:{received:"#98BB6C",forwarded:"#7E9CD8",transmitted:"#E6C384",dropped:"#E46876"},map:{nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hub:"#957FB8",local:"#E6C384",neighbor:"#E6C384",mobile:"#FFA066",room:"#D27E99",edge:"#54546D",edgeHover:"#7AA89F"}}}),ua=da;S(da);const ha={"KDE Breeze":X,Magma:aa,Folds:ua,Ribbon:ca,BLKSAND:Z,Waves:na,Stars:ta};function ma(a,e){const n=a.toLowerCase();return{...e,meta:{...e.meta,id:n,name:a,dataTheme:n}}}const pa=Object.fromEntries(Object.entries(ha).map(([a,e])=>[a,ma(a,e)])),ga=Object.fromEntries(Object.entries(pa).map(([a,e])=>[a,S(e)])),ba=Object.values(pa);function fa(a){return ba.find(e=>e.meta.id===a)}new Map(Object.entries(pa));const ya=Object.values(ga);new Map(Object.entries(ga));const va=Object.entries(ga).map(([a,e])=>function(a,e){return{id:a.id,name:a.colorScheme.name,displayName:e,colorScheme:a.id,backgroundImage:a.background.src,paletteColors:a.display.paletteColors,displayFont:a.display.font,displayColor:a.display.color,displaySize:a.display.size}}(e,a)),wa=ya.map(function(a){return{id:a.id,name:a.colorScheme.name,dataTheme:a.colorScheme.dataTheme,previewColor:a.colorScheme.previewColor}}),ka=ya.map(function(a){return{id:a.id,src:a.background.src,suggestedScheme:a.id,suggestedBrightness:a.background.suggestedBrightness}}),xa=pa["KDE Breeze"];ga["KDE Breeze"];const ja=xa.meta.id,za=xa.meta.backgroundImage,Ca=xa.meta.backgroundBrightness,Aa=wa,Da=ka,Ea=va,Ba={colorScheme:ja,backgroundImage:za,brightness:Ca},Fa="pymc-color-scheme",qa="pymc-background-image",Sa="pymc-bg-brightness",Ma="pymc-background";function Ta(a){(new Image).src=a}const Pa={50:.97,100:.92,200:.84,300:.73,400:.62,500:.5,600:.4,700:.32,800:.24,900:.16},La=[50,100,200,300,400,500,600,700,800,900],Ra=["red","orange","yellow","green","aqua","blue","purple"];function Na(a,e,n){const o=a=>Math.round(Math.max(0,Math.min(255,a))).toString(16).padStart(2,"0");return`#${o(a)}${o(e)}${o(n)}`}function Ia(a){const e=a/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function _a(a){const e=a<=.0031308?12.92*a:1.055*Math.pow(a,1/2.4)-.055;return Math.round(255*e)}function Va(a,e,n){const o=n*(Math.PI/180),t=e*Math.cos(o),r=e*Math.sin(o),s=a+.3963377774*t+.2158037573*r,i=a-.1055613458*t-.0638541728*r,l=a-.0894841775*t-1.291485548*r,c=s*s*s,d=i*i*i,u=l*l*l,h=-1.2684380046*c+2.6097574011*d-.3413193965*u,m=-.0041960863*c-.7034186147*d+1.707614701*u;return[_a(4.0767416621*c-3.3077115913*d+.2309699292*u),_a(h),_a(m)]}function Oa(a){const[e,n,o]=function(a){const e=a.replace("#","");return[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16)]}(a),[,t,r]=function(a,e,n){const o=Ia(a),t=Ia(e),r=Ia(n),s=.4122214708*o+.5363325363*t+.0514459929*r,i=.2119034982*o+.6806995451*t+.1073969566*r,l=.0883024619*o+.2817188376*t+.6299787005*r,c=Math.cbrt(s),d=Math.cbrt(i),u=Math.cbrt(l),h=.2104542553*c+.793617785*d-.0040720468*u,m=1.9779984951*c-2.428592205*d+.4505937099*u,p=.0259040371*c+.7827717662*d-.808675766*u,g=Math.sqrt(m*m+p*p);let b=Math.atan2(p,m)*(180/Math.PI);return b<0&&(b+=360),[h,g,b]}(e,n,o),s={};for(const i of La){const a=Pa[i],e=t*(1-.3*Math.abs(a-.5)),[n,o,l]=Va(a,e,r);s[i]=Na(n,o,l)}return s}function $a(a){return"undefined"==typeof window?"":getComputedStyle(document.documentElement).getPropertyValue(a).trim()}function Wa(a,e){"undefined"!=typeof document&&document.documentElement.style.setProperty(a,e)}const Ua="u-off",Ha="u-label",Ya="width",Ga="height",Ka="top",Xa="bottom",Ja="left",Za="right",Qa="#000",ae=Qa+"0",ee="mousemove",ne="mousedown",oe="mouseup",te="mouseenter",re="mouseleave",se="dblclick",ie="change",le="dppxchange",ce="--",de="undefined"!=typeof window,ue=de?document:null,he=de?window:null,me=de?navigator:null;let pe,ge;function be(a,e){if(null!=e){let n=a.classList;!n.contains(e)&&n.add(e)}}function fe(a,e){let n=a.classList;n.contains(e)&&n.remove(e)}function ye(a,e,n){a.style[e]=n+"px"}function ve(a,e,n,o){let t=ue.createElement(a);return null!=e&&be(t,e),null!=n&&n.insertBefore(t,o),t}function we(a,e){return ve("div",a,e)}const ke=new WeakMap;function xe(a,e,n,o,t){let r="translate("+e+"px,"+n+"px)";r!=ke.get(a)&&(a.style.transform=r,ke.set(a,r),e<0||n<0||e>o||n>t?be(a,Ua):fe(a,Ua))}const je=new WeakMap;function ze(a,e,n){let o=e+n;o!=je.get(a)&&(je.set(a,o),a.style.background=e,a.style.borderColor=n)}const Ce=new WeakMap;function Ae(a,e,n,o){let t=e+""+n;t!=Ce.get(a)&&(Ce.set(a,t),a.style.height=n+"px",a.style.width=e+"px",a.style.marginLeft=o?-e/2+"px":0,a.style.marginTop=o?-n/2+"px":0)}const De={passive:!0},Ee={...De,capture:!0};function Be(a,e,n,o){e.addEventListener(a,n,o?Ee:De)}function Fe(a,e,n,o){e.removeEventListener(a,n,De)}function qe(a,e,n,o){let t;n=n||0;let r=(o=o||e.length-1)<=2147483647;for(;o-n>1;)t=r?n+o>>1:Xe((n+o)/2),e[t]{let t=-1,r=-1;for(let s=n;s<=o;s++)if(a(e[s])){t=s;break}for(let s=o;s>=n;s--)if(a(e[s])){r=s;break}return[t,r]}}de&&function a(){let e=devicePixelRatio;pe!=e&&(pe=e,ge&&Fe(ie,ge,a),ge=matchMedia(`(min-resolution: ${pe-.001}dppx) and (max-resolution: ${pe+.001}dppx)`),Be(ie,ge,a),he.dispatchEvent(new CustomEvent(le)))}();const Me=a=>null!=a,Te=a=>null!=a&&a>0,Pe=Se(Me),Le=Se(Te);function Re(a,e,n,o){let t=nn(a),r=nn(e);a==e&&(-1==t?(a*=n,e/=n):(a/=n,e*=n));let s=10==n?on:tn,i=1==r?Ze:Xe,l=(1==t?Xe:Ze)(s(Ke(a))),c=i(s(Ke(e))),d=en(n,l),u=en(n,c);return 10==n&&(l<0&&(d=xn(d,-l)),c<0&&(u=xn(u,-c))),o||2==n?(a=d*t,e=u*r):(a=kn(a,d),e=wn(e,u)),[a,e]}function Ne(a,e,n,o){let t=Re(a,e,n,o);return 0==a&&(t[0]=0),0==e&&(t[1]=0),t}const Ie={mode:3,pad:.1},_e={pad:0,soft:null,mode:0},Ve={min:_e,max:_e};function Oe(a,e,n,o){return Sn(n)?We(a,e,n):(_e.pad=n,_e.soft=o?0:null,_e.mode=o?3:0,We(a,e,Ve))}function $e(a,e){return null==a?e:a}function We(a,e,n){let o=n.min,t=n.max,r=$e(o.pad,0),s=$e(t.pad,0),i=$e(o.hard,-sn),l=$e(t.hard,sn),c=$e(o.soft,sn),d=$e(t.soft,-sn),u=$e(o.mode,0),h=$e(t.mode,0),m=e-a,p=on(m),g=an(Ke(a),Ke(e)),b=on(g),f=Ke(b-p);(m<1e-24||f>10)&&(m=0,0!=a&&0!=e||(m=1e-24,2==u&&c!=sn&&(r=0),2==h&&d!=-sn&&(s=0)));let y=m||g||1e3,v=on(y),w=en(10,Xe(v)),k=xn(kn(a-y*(0==m?0==a?.1:1:r),w/10),24),x=a>=c&&(1==u||3==u&&k<=c||2==u&&k>=c)?c:sn,j=an(i,k=x?x:Qe(x,k)),z=xn(wn(e+y*(0==m?0==e?.1:1:s),w/10),24),C=e<=d&&(1==h||3==h&&z>=d||2==h&&z<=d)?d:-sn,A=Qe(l,z>C&&e<=C?C:an(C,z));return j==A&&0==j&&(A=100),[j,A]}const Ue=new Intl.NumberFormat(de?me.language:"en-US"),He=a=>Ue.format(a),Ye=Math,Ge=Ye.PI,Ke=Ye.abs,Xe=Ye.floor,Je=Ye.round,Ze=Ye.ceil,Qe=Ye.min,an=Ye.max,en=Ye.pow,nn=Ye.sign,on=Ye.log10,tn=Ye.log2,rn=(a,e=1)=>Ye.asinh(a/e),sn=1/0;function ln(a){return 1+(0|on((a^a>>31)-(a>>31)))}function cn(a,e,n){return Qe(an(a,e),n)}function dn(a){return"function"==typeof a}function un(a){return dn(a)?a:()=>a}const hn=a=>a,mn=(a,e)=>e,pn=a=>null,gn=a=>!0,bn=(a,e)=>a==e,fn=/\.\d*?(?=9{6,}|0{6,})/gm,yn=a=>{if(Fn(a)||jn.has(a))return a;const e=`${a}`,n=e.match(fn);if(null==n)return a;let o=n[0].length-1;if(-1!=e.indexOf("e-")){let[a,n]=e.split("e");return+`${yn(a)}e${n}`}return xn(a,o)};function vn(a,e){return yn(xn(yn(a/e))*e)}function wn(a,e){return yn(Ze(yn(a/e))*e)}function kn(a,e){return yn(Xe(yn(a/e))*e)}function xn(a,e=0){if(Fn(a))return a;let n=10**e,o=a*n*(1+Number.EPSILON);return Je(o)/n}const jn=new Map;function zn(a){return((""+a).split(".")[1]||"").length}function Cn(a,e,n,o){let t=[],r=o.map(zn);for(let s=e;s=0?0:e)+(s>=r[i]?0:r[i]),d=10==a?l:xn(l,c);t.push(d),jn.set(d,c)}}return t}const An={},Dn=[],En=[null,null],Bn=Array.isArray,Fn=Number.isInteger;function qn(a){return"string"==typeof a}function Sn(a){let e=!1;if(null!=a){let n=a.constructor;e=null==n||n==Object}return e}function Mn(a){return null!=a&&"object"==typeof a}const Tn=Object.getPrototypeOf(Uint8Array),Pn="__proto__";function Ln(a,e=Sn){let n;if(Bn(a)){let o=a.find(a=>null!=a);if(Bn(o)||e(o)){n=Array(a.length);for(let o=0;or){for(o=s-1;o>=0&&null==a[o];)a[o--]=null;for(o=s+1;oPromise.resolve().then(a):queueMicrotask,_n=["January","February","March","April","May","June","July","August","September","October","November","December"],Vn=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function On(a){return a.slice(0,3)}const $n=Vn.map(On),Wn=_n.map(On),Un={MMMM:_n,MMM:Wn,WWWW:Vn,WWW:$n};function Hn(a){return(a<10?"0":"")+a}const Yn={YYYY:a=>a.getFullYear(),YY:a=>(a.getFullYear()+"").slice(2),MMMM:(a,e)=>e.MMMM[a.getMonth()],MMM:(a,e)=>e.MMM[a.getMonth()],MM:a=>Hn(a.getMonth()+1),M:a=>a.getMonth()+1,DD:a=>Hn(a.getDate()),D:a=>a.getDate(),WWWW:(a,e)=>e.WWWW[a.getDay()],WWW:(a,e)=>e.WWW[a.getDay()],HH:a=>Hn(a.getHours()),H:a=>a.getHours(),h:a=>{let e=a.getHours();return 0==e?12:e>12?e-12:e},AA:a=>a.getHours()>=12?"PM":"AM",aa:a=>a.getHours()>=12?"pm":"am",a:a=>a.getHours()>=12?"p":"a",mm:a=>Hn(a.getMinutes()),m:a=>a.getMinutes(),ss:a=>Hn(a.getSeconds()),s:a=>a.getSeconds(),fff:a=>{return((e=a.getMilliseconds())<10?"00":e<100?"0":"")+e;var e}};function Gn(a,e){e=e||Un;let n,o=[],t=/\{([a-z]+)\}|[^{]+/gi;for(;n=t.exec(a);)o.push("{"==n[0][0]?Yn[n[1]]:n[0]);return a=>{let n="";for(let t=0;ta%1==0,Jn=[1,2,2.5,5],Zn=Cn(10,-32,0,Jn),Qn=Cn(10,0,32,Jn),ao=Qn.filter(Xn),eo=Zn.concat(Qn),no="{YYYY}",oo="\n"+no,to="{M}/{D}",ro="\n"+to,so=ro+"/{YY}",io="{aa}",lo="{h}:{mm}"+io,co="\n"+lo,uo=":{ss}",ho=null;function mo(a){let e=1e3*a,n=60*e,o=60*n,t=24*o,r=30*t,s=365*t;return[(1==a?Cn(10,0,3,Jn).filter(Xn):Cn(10,-3,0,Jn)).concat([e,5*e,10*e,15*e,30*e,n,5*n,10*n,15*n,30*n,o,2*o,3*o,4*o,6*o,8*o,12*o,t,2*t,3*t,4*t,5*t,6*t,7*t,8*t,9*t,10*t,15*t,r,2*r,3*r,4*r,6*r,s,2*s,5*s,10*s,25*s,50*s,100*s]),[[s,no,ho,ho,ho,ho,ho,ho,1],[28*t,"{MMM}",oo,ho,ho,ho,ho,ho,1],[t,to,oo,ho,ho,ho,ho,ho,1],[o,"{h}"+io,so,ho,ro,ho,ho,ho,1],[n,lo,so,ho,ro,ho,ho,ho,1],[e,uo,so+" "+lo,ho,ro+" "+lo,ho,co,ho,1],[a,uo+".{fff}",so+" "+lo,ho,ro+" "+lo,ho,co,ho,1]],function(e){return(i,l,c,d,u,h)=>{let m=[],p=u>=s,g=u>=r&&u=t?t:u,s=v+(Xe(c)-Xe(f))+wn(f-v,r);m.push(s);let p=e(s),g=p.getHours()+p.getMinutes()/n+p.getSeconds()/o,b=u/o,y=h/i.axes[l]._space;for(;s=xn(s+u,1==a?0:3),!(s>d);)if(b>1){let a=Xe(xn(g+b,6))%24,n=e(s).getHours()-a;n>1&&(n=-1),s-=n*o,g=(g+b)%24,xn((s-m[m.length-1])/u,3)*y>=.7&&m.push(s)}else m.push(s)}return m}}]}const[po,go,bo]=mo(1),[fo,yo,vo]=mo(.001);function wo(a,e){return a.map(a=>a.map((n,o)=>0==o||8==o||null==n?n:e(1==o||0==a[8]?n:a[1]+n)))}function ko(a,e){return(n,o,t,r,s)=>{let i,l,c,d,u,h,m=e.find(a=>s>=a[0])||e[e.length-1];return o.map(e=>{let n=a(e),o=n.getFullYear(),t=n.getMonth(),r=n.getDate(),s=n.getHours(),p=n.getMinutes(),g=n.getSeconds(),b=o!=i&&m[2]||t!=l&&m[3]||r!=c&&m[4]||s!=d&&m[5]||p!=u&&m[6]||g!=h&&m[7]||m[1];return i=o,l=t,c=r,d=s,u=p,h=g,b(n)})}}function xo(a,e,n){return new Date(a,e,n)}function jo(a,e){return e(a)}function zo(a,e){return(n,o,t,r)=>null==r?ce:e(a(o))}Cn(2,-53,53,[1]);const Co={show:!0,live:!0,isolate:!1,mount:()=>{},markers:{show:!0,width:2,stroke:function(a,e){let n=a.series[e];return n.width?n.stroke(a,e):n.points.width?n.points.stroke(a,e):null},fill:function(a,e){return a.series[e].fill(a,e)},dash:"solid"},idx:null,idxs:null,values:[]},Ao=[0,0];function Do(a,e,n,o=!0){return a=>{0==a.button&&(!o||a.target==e)&&n(a)}}function Eo(a,e,n,o=!0){return a=>{(!o||a.target==e)&&n(a)}}const Bo={show:!0,x:!0,y:!0,lock:!1,move:function(a,e,n){return Ao[0]=e,Ao[1]=n,Ao},points:{one:!1,show:function(a,e){let n=a.cursor.points,o=we(),t=n.size(a,e);ye(o,Ya,t),ye(o,Ga,t);let r=t/-2;ye(o,"marginLeft",r),ye(o,"marginTop",r);let s=n.width(a,e,t);return s&&ye(o,"borderWidth",s),o},size:function(a,e){return a.series[e].points.size},width:0,stroke:function(a,e){let n=a.series[e].points;return n._stroke||n._fill},fill:function(a,e){let n=a.series[e].points;return n._fill||n._stroke}},bind:{mousedown:Do,mouseup:Do,click:Do,dblclick:Do,mousemove:Eo,mouseleave:Eo,mouseenter:Eo},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,click:(a,e)=>{e.stopPropagation(),e.stopImmediatePropagation()},_x:!1,_y:!1},focus:{dist:(a,e,n,o,t)=>o-t,prox:-1,bias:0},hover:{skip:[void 0],prox:null,bias:0},left:-10,top:-10,idx:null,dataIdx:null,idxs:null,event:null},Fo={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},qo=Rn({},Fo,{filter:mn}),So=Rn({},qo,{size:10}),Mo=Rn({},Fo,{show:!1}),To='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',Po="bold "+To,Lo={show:!0,scale:"x",stroke:Qa,space:50,gap:5,alignTo:1,size:50,labelGap:0,labelSize:30,labelFont:Po,side:2,grid:qo,ticks:So,border:Mo,font:To,lineGap:1.5,rotate:0},Ro={show:!0,scale:"x",auto:!1,sorted:1,min:sn,max:-sn,idxs:[]};function No(a,e,n,o,t){return e.map(a=>null==a?"":He(a))}function Io(a,e,n,o,t,r,s){let i=[],l=jn.get(t)||0;for(let c=n=s?n:xn(wn(n,t),l);c<=o;c=xn(c+t,l))i.push(Object.is(c,-0)?0:c);return i}function _o(a,e,n,o,t,r,s){const i=[],l=a.scales[a.axes[e].scale].log,c=Xe((10==l?on:tn)(n));t=en(l,c),10==l&&(t=eo[qe(t,eo)]);let d=n,u=t*l;10==l&&(u=eo[qe(u,eo)]);do{i.push(d),d+=t,10!=l||jn.has(d)||(d=xn(d,jn.get(t))),d>=u&&(u=(t=d)*l,10==l&&(u=eo[qe(u,eo)]))}while(d<=o);return i}function Vo(a,e,n,o,t,r,s){let i=a.scales[a.axes[e].scale].asinh,l=o>i?_o(a,e,an(i,n),o,t):[i],c=o>=0&&n<=0?[0]:[];return(n<-i?_o(a,e,an(i,-o),-n,t):[i]).reverse().map(a=>-a).concat(c,l)}const Oo=/./,$o=/[12357]/,Wo=/[125]/,Uo=/1/,Ho=(a,e,n,o)=>a.map((a,t)=>4==e&&0==a||t%o==0&&n.test(a.toExponential()[a<0?1:0])?a:null);function Yo(a,e,n,o,t){let r=a.axes[n],s=r.scale,i=a.scales[s],l=a.valToPos,c=r._space,d=l(10,s),u=l(9,s)-d>=c?Oo:l(7,s)-d>=c?$o:l(5,s)-d>=c?Wo:Uo;if(u==Uo){let a=Ke(l(1,s)-d);if(at,Qo={show:!0,auto:!0,sorted:0,gaps:Zo,alpha:1,facets:[Rn({},Jo,{scale:"x"}),Rn({},Jo,{scale:"y"})]},at={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:Zo,alpha:1,points:{show:function(a,e){let{scale:n,idxs:o}=a.series[0],t=a._data[0],r=a.valToPos(t[o[0]],n,!0),s=a.valToPos(t[o[1]],n,!0),i=Ke(s-r)/(a.series[e].points.space*pe);return o[1]-o[0]<=i},filter:null},values:null,min:sn,max:-sn,idxs:[],path:null,clip:null};function et(a,e,n,o,t){return n/10}const nt={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},ot=Rn({},nt,{time:!1,ori:1}),tt={};function rt(a,e){let n=tt[a];return n||(n={key:a,plots:[],sub(a){n.plots.push(a)},unsub(a){n.plots=n.plots.filter(e=>e!=a)},pub(a,e,o,t,r,s,i){for(let l=0;l{let g=a.pxRound;const b=i.dir*(0==i.ori?1:-1),f=0==i.ori?bt:ft;let y,v;1==b?(y=n,v=o):(y=o,v=n);let w=g(c(e[y],i,m,u)),k=g(d(s[y],l,p,h)),x=g(c(e[v],i,m,u)),j=g(d(1==r?l.max:l.min,l,p,h)),z=new Path2D(t);return f(z,x,j),f(z,w,j),f(z,w,k),z})}function dt(a,e,n,o,t,r){let s=null;if(a.length>0){s=new Path2D;const i=0==e?yt:vt;let l=n;for(let e=0;en[0]){let a=n[0]-l;a>0&&i(s,l,o,a,o+r),l=n[1]}}let c=n+t-l,d=10;c>0&&i(s,l,o-d/2,c,o+r+d)}return s}function ut(a,e,n,o,t,r,s){let i=[],l=a.length;for(let c=1==t?n:o;c>=n&&c<=o;c+=t)if(null===e[c]){let d=c,u=c;if(1==t)for(;++c<=o&&null===e[c];)u=c;else for(;--c>=n&&null===e[c];)u=c;let h=r(a[d]),m=u==d?h:r(a[u]),p=d-t;h=s<=0&&p>=0&&p=0&&g>=0&&g=h&&i.push([h,m])}return i}function ht(a){return 0==a?hn:1==a?Je:e=>vn(e,a)}function mt(a){let e=0==a?pt:gt,n=0==a?(a,e,n,o,t,r)=>{a.arcTo(e,n,o,t,r)}:(a,e,n,o,t,r)=>{a.arcTo(n,e,t,o,r)},o=0==a?(a,e,n,o,t)=>{a.rect(e,n,o,t)}:(a,e,n,o,t)=>{a.rect(n,e,t,o)};return(a,t,r,s,i,l=0,c=0)=>{0==l&&0==c?o(a,t,r,s,i):(l=Qe(l,s/2,i/2),c=Qe(c,s/2,i/2),e(a,t+l,r),n(a,t+s,r,t+s,r+i,l),n(a,t+s,r+i,t,r+i,c),n(a,t,r+i,t,r,c),n(a,t,r,t+s,r,l),a.closePath())}}const pt=(a,e,n)=>{a.moveTo(e,n)},gt=(a,e,n)=>{a.moveTo(n,e)},bt=(a,e,n)=>{a.lineTo(e,n)},ft=(a,e,n)=>{a.lineTo(n,e)},yt=mt(0),vt=mt(1),wt=(a,e,n,o,t,r)=>{a.arc(e,n,o,t,r)},kt=(a,e,n,o,t,r)=>{a.arc(n,e,o,t,r)},xt=(a,e,n,o,t,r,s)=>{a.bezierCurveTo(e,n,o,t,r,s)},jt=(a,e,n,o,t,r,s)=>{a.bezierCurveTo(n,e,t,o,s,r)};function zt(a){return(a,e,n,o,t)=>st(a,e,(e,r,s,i,l,c,d,u,h,m,p)=>{let g,b,{pxRound:f,points:y}=e;0==i.ori?(g=pt,b=wt):(g=gt,b=kt);const v=xn(y.width*pe,3);let w=(y.size-y.width)/2*pe,k=xn(2*w,3),x=new Path2D,j=new Path2D,{left:z,top:C,width:A,height:D}=a.bbox;yt(j,z-k,C-k,A+2*k,D+2*k);const E=a=>{if(null!=s[a]){let e=f(c(r[a],i,m,u)),n=f(d(s[a],l,p,h));g(x,e+w,n),b(x,e,n,w,0,2*Ge)}};if(t)t.forEach(E);else for(let a=n;a<=o;a++)E(a);return{stroke:v>0?x:null,fill:x,clip:j,flags:3}})}function Ct(a){return(e,n,o,t,r,s)=>{o!=t&&(r!=o&&s!=o&&a(e,n,o),r!=t&&s!=t&&a(e,n,t),a(e,n,s))}}const At=Ct(bt),Dt=Ct(ft);function Et(a){const e=$e(null==a?void 0:a.alignGaps,0);return(a,n,o,t)=>st(a,n,(r,s,i,l,c,d,u,h,m,p,g)=>{[o,t]=Pe(i,o,t);let b,f,y=r.pxRound,v=a=>y(d(a,l,p,h)),w=a=>y(u(a,c,g,m));0==l.ori?(b=bt,f=At):(b=ft,f=Dt);const k=l.dir*(0==l.ori?1:-1),x={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},j=x.stroke;let z=!1;if(t-o>=4*p){let e,n,r,c=e=>a.posToVal(e,l.key,!0),d=null,u=null,h=v(s[1==k?o:t]),m=v(s[o]),p=v(s[t]),g=c(1==k?m+1:p-1);for(let a=1==k?o:t;a>=o&&a<=t;a+=k){let o=s[a],t=(1==k?og)?h:v(o),r=i[a];t==h?null!=r?(n=r,null==d?(b(j,t,w(n)),e=d=u=n):nu&&(u=n)):null===r&&(z=!0):(null!=d&&f(j,h,w(d),w(u),w(e),w(n)),null!=r?(n=r,b(j,t,w(n)),d=u=e=n):(d=u=null,null===r&&(z=!0)),h=t,g=c(h+k))}null!=d&&d!=u&&r!=h&&f(j,h,w(d),w(u),w(e),w(n))}else for(let a=1==k?o:t;a>=o&&a<=t;a+=k){let e=i[a];null===e?z=!0:null!=e&&b(j,v(s[a]),w(e))}let[C,A]=it(a,n);if(null!=r.fill||0!=C){let e=x.fill=new Path2D(j),i=w(r.fillTo(a,n,r.min,r.max,C)),l=v(s[o]),c=v(s[t]);-1==k&&([c,l]=[l,c]),b(e,c,i),b(e,l,i)}if(!r.spanGaps){let c=[];z&&c.push(...ut(s,i,o,t,k,v,e)),x.gaps=c=r.gaps(a,n,o,t,c),x.clip=dt(c,l.ori,h,m,p,g)}return 0!=A&&(x.band=2==A?[ct(a,n,o,t,j,-1),ct(a,n,o,t,j,1)]:ct(a,n,o,t,j,A)),x})}function Bt(a,e,n,o,t,r,s=sn){if(a.length>1){let i=null;for(let l=0,c=1/0;l0!=o[a]>0?n[a]=0:(n[a]=3*(l[a-1]+l[a])/((2*l[a]+l[a-1])/o[a-1]+(l[a]+2*l[a-1])/o[a]),isFinite(n[a])||(n[a]=0));n[s-1]=o[s-2];for(let c=0;c{Ht.pxRatio=pe}));const Mt=Et(),Tt=zt();function Pt(a,e,n,o){return(o?[a[0],a[1]].concat(a.slice(2)):[a[0]].concat(a.slice(1))).map((a,o)=>Lt(a,o,e,n))}function Lt(a,e,n,o){return Rn({},0==e?n:o,a)}function Rt(a,e,n){return null==e?En:[e,n]}const Nt=Rt;function It(a,e,n){return null==e?En:Oe(e,n,.1,!0)}function _t(a,e,n,o){return null==e?En:Re(e,n,a.scales[o].log,!1)}const Vt=_t;function Ot(a,e,n,o){return null==e?En:Ne(e,n,a.scales[o].log,!1)}const $t=Ot;function Wt(a){let e,n;return[a=a.replace(/(\d+)px/,(a,o)=>(e=Je((n=+o)*pe))+"px"),e,n]}function Ut(a){a.show&&[a.font,a.labelFont].forEach(a=>{let e=xn(a[2]*pe,1);a[0]=a[0].replace(/[0-9.]+px/,e+"px"),a[1]=e})}function Ht(a,e,n){const o={mode:$e(a.mode,1)},t=o.mode;function r(a,e,n,o){let t=e.valToPct(a);return o+n*(-1==e.dir?1-t:t)}function s(a,e,n,o){let t=e.valToPct(a);return o+n*(-1==e.dir?t:1-t)}function i(a,e,n,o){return 0==e.ori?r(a,e,n,o):s(a,e,n,o)}o.valToPosH=r,o.valToPosV=s;let l=!1;o.status=0;const c=o.root=we("uplot");null!=a.id&&(c.id=a.id),be(c,a.class),a.title&&(we("u-title",c).textContent=a.title);const d=ve("canvas"),u=o.ctx=d.getContext("2d"),h=we("u-wrap",c);Be("click",h,a=>{a.target===p&&(Jn!=Hn||Zn!=Yn)&&co.click(o,a)},!0);const m=o.under=we("u-under",h);h.appendChild(d);const p=o.over=we("u-over",h),g=+$e((a=Ln(a)).pxAlign,1),b=ht(g);(a.plugins||[]).forEach(e=>{e.opts&&(a=e.opts(o,a)||a)});const f=a.ms||.001,y=o.series=1==t?Pt(a.series||[],Ro,at,!1):(v=a.series||[null],w=Qo,v.map((a,e)=>0==e?{}:Rn({},w,a)));var v,w;const k=o.axes=Pt(a.axes||[],Lo,Xo,!0),x=o.scales={},j=o.bands=a.bands||[];j.forEach(a=>{a.fill=un(a.fill||null),a.dir=$e(a.dir,-1)});const z=2==t?y[1].facets[0].scale:y[0].scale,C={axes:function(){for(let a=0;a_e[a]):f,v=2==m.distr?_e[f[1]]-_e[f[0]]:d,w=e.ticks,j=e.border,z=w.show?w.size:0,C=Je(z*pe),A=Je((2==e.alignTo?e._size-z-e.gap:e.gap)*pe),D=e._rotate*-Ge/180,E=b(e._pos*pe),B=E+(C+A)*c;t=0==s?B:0,n=1==s?B:0,Xe(e.font[0],l,1==e.align?Ja:2==e.align?Za:D>0?Ja:D<0?Za:0==s?"center":3==r?Za:Ja,D||1==s?"middle":2==r?Ka:Xa);let F=e.font[1]*e.lineGap,q=f.map(a=>b(i(a,m,p,g))),S=e._values;for(let a=0;a0){let a=y.some(a=>a._focus)&&Se!=Fa.alpha;a&&(u.globalAlpha=Se=Fa.alpha),y.forEach((a,n)=>{if(n>0&&a.show&&(hn(n,!1),hn(n,!0),null==a._paths)){let r=Se;Se!=a.alpha&&(u.globalAlpha=Se=a.alpha);let s=2==t?[0,e[n][0].length-1]:function(a){let e=cn($a-1,0,Oa-1),n=cn(Wa+1,0,Oa-1);for(;null==a[e]&&e>0;)e--;for(;null==a[n]&&n{if(e>0&&a.show){let n=Se;Se!=a.alpha&&(u.globalAlpha=Se=a.alpha),null!=a._paths&&fn(e,!1);{let n=null!=a._paths?a._paths.gaps:null,t=a.points.show(o,e,$a,Wa,n),r=a.points.filter(o,e,t,n);(t||r)&&(a.points._paths=a.points.paths(o,e,$a,Wa,r),fn(e,!0))}Se!=n&&(u.globalAlpha=Se=n),xt("drawSeries",e)}}),a&&(u.globalAlpha=Se=1)}}},A=(a.drawOrder||["axes","series"]).map(a=>C[a]);function D(a){const e=3==a.distr?e=>on(e>0?e:a.clamp(o,e,a.min,a.max,a.key)):4==a.distr?e=>rn(e,a.asinh):100==a.distr?e=>a.fwd(e):a=>a;return n=>{let o=e(n),{_min:t,_max:r}=a;return(o-t)/(r-t)}}function E(e){let n=x[e];if(null==n){let o=(a.scales||An)[e]||An;if(null!=o.from){E(o.from);let a=Rn({},x[o.from],o,{key:e});a.valToPct=D(a),x[e]=a}else{n=x[e]=Rn({},e==z?nt:ot,o),n.key=e;let a=n.time,r=n.range,s=Bn(r);if((e!=z||2==t&&!a)&&(!s||null!=r[0]&&null!=r[1]||(r={min:null==r[0]?Ie:{mode:1,hard:r[0],soft:r[0]},max:null==r[1]?Ie:{mode:1,hard:r[1],soft:r[1]}},s=!1),!s&&Sn(r))){let a=r;r=(e,n,o)=>null==n?En:Oe(n,o,a)}n.range=un(r||(a?Nt:e==z?3==n.distr?Vt:4==n.distr?$t:Rt:3==n.distr?_t:4==n.distr?Ot:It)),n.auto=un(!s&&n.auto),n.clamp=un(n.clamp||et),n._min=n._max=null,n.valToPct=D(n)}}}E("x"),E("y"),1==t&&y.forEach(a=>{E(a.scale)}),k.forEach(a=>{E(a.scale)});for(let Ua in a.scales)E(Ua);const B=x[z],F=B.distr;let q,S;0==B.ori?(be(c,"u-hz"),q=r,S=s):(be(c,"u-vt"),q=s,S=r);const M={};for(let Ua in x){let a=x[Ua];null==a.min&&null==a.max||(M[Ua]={min:a.min,max:a.max},a.min=a.max=null)}const T=a.tzDate||(a=>new Date(Je(a/f))),P=a.fmtDate||Gn,L=1==f?bo(T):vo(T),R=ko(T,wo(1==f?go:yo,P)),N=zo(T,jo("{YYYY}-{MM}-{DD} {h}:{mm}{aa}",P)),I=[],_=o.legend=Rn({},Co,a.legend),V=o.cursor=Rn({},Bo,{drag:{y:2==t}},a.cursor),O=_.show,$=V.show,W=_.markers;let U,H,Y;_.idxs=I,W.width=un(W.width),W.dash=un(W.dash),W.stroke=un(W.stroke),W.fill=un(W.fill);let G,K=[],X=[],J=!1,Z={};if(_.live){const a=y[1]?y[1].values:null;J=null!=a,G=J?a(o,1,0):{_:0};for(let e in G)Z[e]=ce}if(O)if(U=ve("table","u-legend",c),Y=ve("tbody",null,U),_.mount(o,U),J){H=ve("thead",null,U,Y);let a=ve("tr",null,H);for(var Q in ve("th",null,a),G)ve("th",Ha,a).textContent=Q}else be(U,"u-inline"),_.live&&be(U,"u-live");const aa={show:!0},ea={show:!1},na=new Map;function oa(a,e,n,t=!0){const r=na.get(e)||{},s=V.bind[a](o,e,n,t);s&&(Be(a,e,r[a]=s),na.set(e,r))}function ta(a,e,n){const o=na.get(e)||{};for(let t in o)null!=a&&t!=a||(Fe(t,e,o[t]),delete o[t]);null==a&&na.delete(e)}let ra=0,sa=0,ia=0,la=0,ca=0,da=0,ua=ca,ha=da,ma=ia,pa=la,ga=0,ba=0,fa=0,ya=0;o.bbox={};let va=!1,wa=!1,ka=!1,xa=!1,ja=!1,za=!1;function Ca(a,e,n){(n||a!=o.width||e!=o.height)&&Aa(a,e),Nn(!1),ka=!0,wa=!0,ro()}function Aa(a,e){o.width=ra=ia=a,o.height=sa=la=e,ca=da=0,function(){let a=!1,e=!1,n=!1,o=!1;k.forEach((t,r)=>{if(t.show&&t._show){let{side:r,_size:s}=t,i=r%2,l=s+(null!=t.label?t.labelSize:0);l>0&&(i?(ia-=l,3==r?(ca+=l,o=!0):n=!0):(la-=l,0==r?(da+=l,a=!0):e=!0))}}),Na[0]=a,Na[1]=n,Na[2]=e,Na[3]=o,ia-=Va[1]+Va[3],ca+=Va[3],la-=Va[2]+Va[0],da+=Va[0]}(),function(){let a=ca+ia,e=da+la,n=ca,o=da;function t(t,r){switch(t){case 1:return a+=r,a-r;case 2:return e+=r,e-r;case 3:return n-=r,n+r;case 0:return o-=r,o+r}}k.forEach((a,e)=>{if(a.show&&a._show){let e=a.side;a._pos=t(e,a._size),null!=a.label&&(a._lpos=t(e,a.labelSize))}})}();let n=o.bbox;ga=n.left=vn(ca*pe,.5),ba=n.top=vn(da*pe,.5),fa=n.width=vn(ia*pe,.5),ya=n.height=vn(la*pe,.5)}const Da=3;if(o.setSize=function({width:a,height:e}){Ca(a,e)},null==V.dataIdx){let a=V.hover,n=a.skip=new Set(a.skip??[]);n.add(void 0);let o=a.prox=un(a.prox),t=a.bias??(a.bias=0);V.dataIdx=(a,r,s,i)=>{if(0==r)return s;let l=s,c=o(a,r,s,i)??sn,d=c>=0&&c0;)n.has(p[a])||(e=a);if(0==t||1==t)for(a=s;null==o&&a++c&&(l=null);return l}}const Ea=a=>{V.event=a};V.idxs=I,V._lock=!1;let Ba=V.points;Ba.show=un(Ba.show),Ba.size=un(Ba.size),Ba.stroke=un(Ba.stroke),Ba.width=un(Ba.width),Ba.fill=un(Ba.fill);const Fa=o.focus=Rn({},a.focus||{alpha:.3},V.focus),qa=Fa.prox>=0,Sa=qa&&Ba.one;let Ma=[],Ta=[],Pa=[];function La(a,e){let n=Ba.show(o,e);if(n instanceof HTMLElement)return be(n,"u-cursor-pt"),be(n,a.class),xe(n,-10,-10,ia,la),p.insertBefore(n,Ma[e]),n}function Ra(a,e){if(1==t||e>0){let e=1==t&&x[a.scale].time,n=a.value;a.value=e?qn(n)?zo(T,jo(n,P)):n||N:n||Ko,a.label=a.label||(e?"Time":"Value")}if(Sa||e>0){a.width=null==a.width?1:a.width,a.paths=a.paths||Mt||pn,a.fillTo=un(a.fillTo||lt),a.pxAlign=+$e(a.pxAlign,g),a.pxRound=ht(a.pxAlign),a.stroke=un(a.stroke||null),a.fill=un(a.fill||null),a._stroke=a._fill=a._paths=a._focus=null;let e=xn(1*(3+2*(an(1,a.width)||1)),3),n=a.points=Rn({},{size:e,width:an(1,.2*e),stroke:a.stroke,space:2*e,paths:Tt,_stroke:null,_fill:null},a.points);n.show=un(n.show),n.filter=un(n.filter),n.fill=un(n.fill),n.stroke=un(n.stroke),n.paths=un(n.paths),n.pxAlign=a.pxAlign}if(O){let n=function(a,e){if(0==e&&(J||!_.live||2==t))return En;let n=[],r=ve("tr","u-series",Y,Y.childNodes[e]);be(r,a.class),a.show||be(r,Ua);let s=ve("th",null,r);if(W.show){let a=we("u-marker",s);if(e>0){let n=W.width(o,e);n&&(a.style.border=n+"px "+W.dash(o,e)+" "+W.stroke(o,e)),a.style.background=W.fill(o,e)}}let i=we(Ha,s);for(var l in a.label instanceof HTMLElement?i.appendChild(a.label):i.textContent=a.label,e>0&&(W.show||(i.style.color=a.width>0?W.stroke(o,e):W.fill(o,e)),oa("click",s,e=>{if(V._lock)return;Ea(e);let n=y.indexOf(a);if((e.ctrlKey||e.metaKey)!=_.isolate){let a=y.some((a,e)=>e>0&&e!=n&&a.show);y.forEach((e,o)=>{o>0&&Eo(o,a?o==n?aa:ea:aa,!0,zt.setSeries)})}else Eo(n,{show:!a.show},!0,zt.setSeries)},!1),qa&&oa(te,s,e=>{V._lock||(Ea(e),Eo(y.indexOf(a),Mo,!0,zt.setSeries))},!1)),G){let a=ve("td","u-value",r);a.textContent="--",n.push(a)}return[r,n]}(a,e);K.splice(e,0,n[0]),X.splice(e,0,n[1]),_.values.push(null)}if($){I.splice(e,0,null);let n=null;Sa?0==e&&(n=La(a,e)):e>0&&(n=La(a,e)),Ma.splice(e,0,n),Ta.splice(e,0,0),Pa.splice(e,0,0)}xt("addSeries",e)}o.addSeries=function(a,e){e=null==e?y.length:e,a=1==t?Lt(a,e,Ro,at):Lt(a,e,{},Qo),y.splice(e,0,a),Ra(y[e],e)},o.delSeries=function(a){if(y.splice(a,1),O){_.values.splice(a,1),X.splice(a,1);let e=K.splice(a,1)[0];ta(null,e.firstChild),e.remove()}$&&(I.splice(a,1),Ma.splice(a,1)[0].remove(),Ta.splice(a,1),Pa.splice(a,1)),xt("delSeries",a)};const Na=[!1,!1,!1,!1];function Ia(a,e,n,o){let[t,r,s,i]=n,l=e%2,c=0;return 0==l&&(i||r)&&(c=0==e&&!t||2==e&&!s?Je(Lo.size/3):0),1==l&&(t||s)&&(c=1==e&&!r||3==e&&!i?Je(Xo.size/2):0),c}const _a=o.padding=(a.padding||[Ia,Ia,Ia,Ia]).map(a=>un($e(a,Ia))),Va=o._padding=_a.map((a,e)=>a(o,e,Na,0));let Oa,$a=null,Wa=null;const Qa=1==t?y[0].idxs:null;let ie,de,me,ge,ke,je,Ce,De,Ee,Se,_e=null,Ve=!1;function We(a,n){if(e=null==a?[]:a,o.data=o._data=e,2==t){Oa=0;for(let a=1;a=0,za=!0,ro()}}function Ue(){let a,n;Ve=!0,1==t&&(Oa>0?($a=Qa[0]=0,Wa=Qa[1]=Oa-1,a=e[0][$a],n=e[0][Wa],2==F?(a=$a,n=Wa):a==n&&(3==F?[a,n]=Re(a,a,B.log,!1):4==F?[a,n]=Ne(a,a,B.log,!1):B.time?n=a+Je(86400/f):[a,n]=Oe(a,n,.1,!0))):($a=Qa[0]=a=null,Wa=Qa[1]=n=null)),Do(z,a,n)}function He(a,e,n,o,t,r){a??(a=ae),n??(n=Dn),o??(o="butt"),t??(t=ae),r??(r="round"),a!=ie&&(u.strokeStyle=ie=a),t!=de&&(u.fillStyle=de=t),e!=me&&(u.lineWidth=me=e),r!=ke&&(u.lineJoin=ke=r),o!=je&&(u.lineCap=je=o),n!=ge&&u.setLineDash(ge=n)}function Xe(a,e,n,o){e!=de&&(u.fillStyle=de=e),a!=Ce&&(u.font=Ce=a),n!=De&&(u.textAlign=De=n),o!=Ee&&(u.textBaseline=Ee=o)}function nn(a,e,n,t,r=0){if(t.length>0&&a.auto(o,Ve)&&(null==e||null==e.min)){let e=$e($a,0),o=$e(Wa,t.length-1),s=null==n.min?function(a,e,n,o=0,t=!1){let r=t?Le:Pe,s=t?Te:Me;[e,n]=r(a,e,n);let i=a[e],l=a[e];if(e>-1)if(1==o)i=a[e],l=a[n];else if(-1==o)i=a[n],l=a[e];else for(let c=e;c<=n;c++){let e=a[c];s(e)&&(el&&(l=e))}return[i??sn,l??-sn]}(t,e,o,r,3==a.distr):[n.min,n.max];a.min=Qe(a.min,n.min=s[0]),a.max=an(a.max,n.max=s[1])}}o.setData=We;const tn={min:null,max:null};function hn(a,e){let n=e?y[a].points:y[a];n._stroke=n.stroke(o,a),n._fill=n.fill(o,a)}function fn(a,n){let t=n?y[a].points:y[a],{stroke:r,fill:s,clip:i,flags:l,_stroke:c=t._stroke,_fill:d=t._fill,_width:h=t.width}=t._paths;h=xn(h*pe,3);let m=null,p=h%2/2;n&&null==d&&(d=h>0?"#fff":c);let g=1==t.pxAlign&&p>0;if(g&&u.translate(p,p),!n){let a=ga-h/2,e=ba-h/2,n=fa+h,o=ya+h;m=new Path2D,m.rect(a,e,n,o)}n?wn(c,h,t.dash,t.cap,d,r,s,l,i):function(a,n,t,r,s,i,l,c,d,u,h){let m=!1;0!=d&&j.forEach((p,g)=>{if(p.series[0]==a){let a,b=y[p.series[1]],f=e[p.series[1]],v=(b._paths||An).band;Bn(v)&&(v=1==p.dir?v[0]:v[1]);let w=null;b.show&&v&&function(a,e,n){for(e=$e(e,0),n=$e(n,a.length-1);e<=n;){if(null!=a[e])return!0;e++}return!1}(f,$a,Wa)?(w=p.fill(o,g)||i,a=b._paths.clip):v=null,wn(n,t,r,s,w,l,c,d,u,h,a,v),m=!0}}),m||wn(n,t,r,s,i,l,c,d,u,h)}(a,c,h,t.dash,t.cap,d,r,s,l,m,i),g&&u.translate(-p,-p)}const yn=3;function wn(a,e,n,o,t,r,s,i,l,c,d,h){He(a,e,n,o,t),(l||c||h)&&(u.save(),l&&u.clip(l),c&&u.clip(c)),h?(i&yn)==yn?(u.clip(h),d&&u.clip(d),Cn(t,s),kn(a,r,e)):2&i?(Cn(t,s),u.clip(h),kn(a,r,e)):1&i&&(u.save(),u.clip(h),d&&u.clip(d),Cn(t,s),u.restore(),kn(a,r,e)):(Cn(t,s),kn(a,r,e)),(l||c||h)&&u.restore()}function kn(a,e,n){n>0&&(e instanceof Map?e.forEach((a,e)=>{u.strokeStyle=ie=e,u.stroke(a)}):null!=e&&a&&u.stroke(e))}function Cn(a,e){e instanceof Map?e.forEach((a,e)=>{u.fillStyle=de=e,u.fill(a)}):null!=e&&a&&u.fill(e)}function Fn(a,e,n,o,t,r,s,i,l,c){let d=s%2/2;1==g&&u.translate(d,d),He(i,s,l,c,i),u.beginPath();let h,m,p,b,f=t+(0==o||3==o?-r:r);0==n?(m=t,b=f):(h=t,p=f);for(let g=0;g{if(!n.show)return;let r=x[n.scale];if(null==r.min)return void(n._show&&(e=!1,n._show=!1,Nn(!1)));n._show||(e=!1,n._show=!0,Nn(!1));let s=n.side,i=s%2,{min:l,max:c}=r,[d,u]=function(a,e,n,t){let r,s=k[a];if(t<=0)r=[0,0];else{let i=s._space=s.space(o,a,e,n,t);r=function(a,e,n,o,t){let r=an(ln(a),ln(e)),s=e-a,i=qe(t/o*s,n);do{let a=n[i],e=o*a/s;if(e>=t&&r+(a<5?jn.get(a):0)<=17)return[a,e]}while(++i_e[a]):m,g=2==r.distr?_e[m[1]]-_e[m[0]]:d,b=n._values=n.values(o,n.filter(o,p,t,u,g),t,u,g);n._rotate=2==s?n.rotate(o,b,t,u):0;let f=n._size;n._size=Ze(n.size(o,b,t,a)),null!=f&&n._size!=f&&(e=!1)}),e}function Pn(a){let e=!0;return _a.forEach((n,t)=>{let r=n(o,t,Na,a);r!=Va[t]&&(e=!1),Va[t]=r}),e}function Nn(a){y.forEach((e,n)=>{n>0&&(e._paths=null,a&&(1==t?(e.min=null,e.max=null):e.facets.forEach(a=>{a.min=null,a.max=null})))})}let _n,Vn,On,$n,Wn,Un,Hn,Yn,Kn,Xn,Jn,Zn,Qn=!1,no=!1,oo=[];function to(){no=!1;for(let a=0;a0){y.forEach((n,r)=>{if(1==t){let t=n.scale,s=M[t];if(null==s)return;let i=a[t];if(0==r){let a=i.range(o,i.min,i.max,t);i.min=a[0],i.max=a[1],$a=qe(i.min,e[0]),Wa=qe(i.max,e[0]),Wa-$a>1&&(e[0][$a]i.max&&Wa--),n.min=_e[$a],n.max=_e[Wa]}else n.show&&n.auto&&nn(i,s,n,e[r],n.sorted);n.idxs[0]=$a,n.idxs[1]=Wa}else if(r>0&&n.show&&n.auto){let[o,t]=n.facets,s=o.scale,i=t.scale,[l,c]=e[r],d=a[s],u=a[i];null!=d&&nn(d,M[s],o,l,o.sorted),null!=u&&nn(u,M[i],t,c,t.sorted),n.min=t.min,n.max=t.max}});for(let e in a){let n=a[e],t=M[e];if(null==n.from&&(null==t||null==t.min)){let a=n.range(o,n.min==sn?null:n.min,n.max==-sn?null:n.max,e);n.min=a[0],n.max=a[1]}}}for(let e in a){let n=a[e];if(null!=n.from){let t=a[n.from];if(null==t.min)n.min=n.max=null;else{let a=n.range(o,t.min,t.max,e);n.min=a[0],n.max=a[1]}}}let n={},r=!1;for(let e in a){let o=a[e],t=x[e];if(t.min!=o.min||t.max!=o.max){t.min=o.min,t.max=o.max;let a=t.distr;t._min=3==a?on(t.min):4==a?rn(t.min,t.asinh):100==a?t.fwd(t.min):t.min,t._max=3==a?on(t.max):4==a?rn(t.max,t.asinh):100==a?t.fwd(t.max):t.max,n[e]=r=!0}}if(r){y.forEach((a,e)=>{2==t?e>0&&n.y&&(a._paths=null):n[a.scale]&&(a._paths=null)});for(let a in n)ka=!0,xt("setScale",a);$&&V.left>=0&&(xa=za=!0)}for(let e in M)M[e]=null}(),va=!1),ka&&(function(){let a=!1,e=0;for(;!a;){e++;let n=Tn(e),t=Pn(e);a=e==Da||n&&t,a||(Aa(o.width,o.height),wa=!0)}}(),ka=!1),wa){if(ye(m,Ja,ca),ye(m,Ka,da),ye(m,Ya,ia),ye(m,Ga,la),ye(p,Ja,ca),ye(p,Ka,da),ye(p,Ya,ia),ye(p,Ga,la),ye(h,Ya,ra),ye(h,Ga,sa),d.width=Je(ra*pe),d.height=Je(sa*pe),k.forEach(({_el:a,_show:e,_size:n,_pos:o,side:t})=>{if(null!=a)if(e){let e=t%2==1;ye(a,e?"left":"top",o-(3===t||0===t?n:0)),ye(a,e?"width":"height",n),ye(a,e?"top":"left",e?da:ca),ye(a,e?"height":"width",e?la:ia),fe(a,Ua)}else be(a,Ua)}),ie=de=me=ke=je=Ce=De=Ee=ge=null,Se=1,tt(!0),ca!=ua||da!=ha||ia!=ma||la!=pa){Nn(!1);let a=ia/ma,e=la/pa;if($&&!xa&&V.left>=0){V.left*=a,V.top*=e,On&&xe(On,Je(V.left),0,ia,la),$n&&xe($n,0,Je(V.top),ia,la);for(let n=0;n=0&&mo.width>0){mo.left*=a,mo.width*=a,mo.top*=e,mo.height*=e;for(let a in ct)ye(xo,a,mo[a])}ua=ca,ha=da,ma=ia,pa=la}xt("setSize"),wa=!1}ra>0&&sa>0&&(u.clearRect(0,0,d.width,d.height),xt("drawClear"),A.forEach(a=>a()),xt("draw")),mo.show&&ja&&(Ao(mo),ja=!1),$&&xa&&(Jo(null,!0,!1),xa=!1),_.show&&_.live&&za&&(Uo(),za=!1),l||(l=!0,o.status=1,xt("ready")),Ve=!1,Qn=!1}function io(a,n){let t=x[a];if(null==t.from){if(0==Oa){let e=t.range(o,n.min,n.max,a);n.min=e[0],n.max=e[1]}if(n.min>n.max){let a=n.min;n.min=n.max,n.max=a}if(Oa>1&&null!=n.min&&null!=n.max&&n.max-n.min<1e-16)return;a==z&&2==t.distr&&Oa>0&&(n.min=qe(n.min,e[0]),n.max=qe(n.max,e[0]),n.min==n.max&&n.max++),M[a]=n,va=!0,ro()}}o.batch=function(a,e=!1){Qn=!0,no=e,a(o),so(),e&&oo.length>0&&queueMicrotask(to)},o.redraw=(a,e)=>{ka=e||!1,!1!==a?Do(z,B.min,B.max):ro()},o.setScale=io;let lo=!1;const co=V.drag;let uo=co.x,ho=co.y;$&&(V.x&&(_n=we("u-cursor-x",p)),V.y&&(Vn=we("u-cursor-y",p)),0==B.ori?(On=_n,$n=Vn):(On=Vn,$n=_n),Jn=V.left,Zn=V.top);const mo=o.select=Rn({show:!0,over:!0,left:0,width:0,top:0,height:0},a.select),xo=mo.show?we("u-select",mo.over?p:m):null;function Ao(a,e){if(mo.show){for(let e in a)mo[e]=a[e],e in ct&&ye(xo,e,a[e]);!1!==e&&xt("setSelect")}}function Do(a,e,n){io(a,{min:e,max:n})}function Eo(a,e,n,r){null!=e.focus&&function(a){if(a!=So){let e=null==a,n=1!=Fa.alpha;y.forEach((o,r)=>{if(1==t||r>0){let t=e||0==r||r==a;o._focus=e?null:t,n&&function(a,e){y[a].alpha=e,$&&null!=Ma[a]&&(Ma[a].style.opacity=e),O&&K[a]&&(K[a].style.opacity=e)}(r,t?1:Fa.alpha)}}),So=a,n&&ro()}}(a),null!=e.show&&y.forEach((n,o)=>{o>0&&(a==o||null==a)&&(n.show=e.show,function(a){if(y[a].show)O&&fe(K[a],Ua);else if(O&&be(K[a],Ua),$){let e=Sa?Ma[0]:Ma[a];null!=e&&xe(e,-10,-10,ia,la)}}(o),2==t?(Do(n.facets[0].scale,null,null),Do(n.facets[1].scale,null,null)):Do(n.scale,null,null),ro())}),!1!==n&&xt("setSeries",a,e),r&&Dt("setSeries",o,a,e)}let Fo,qo,So;o.setSelect=Ao,o.setSeries=Eo,o.addBand=function(a,e){a.fill=un(a.fill||null),a.dir=$e(a.dir,-1),e=null==e?j.length:e,j.splice(e,0,a)},o.setBand=function(a,e){Rn(j[a],e)},o.delBand=function(a){null==a?j.length=0:j.splice(a,1)};const Mo={focus:!0};function To(a,e,n){let o=x[e];n&&(a=a/pe-(1==o.ori?da:ca));let t=ia;1==o.ori&&(t=la,a=t-a),-1==o.dir&&(a=t-a);let r=o._min,s=r+(o._max-r)*(a/t),i=o.distr;return 3==i?en(10,s):4==i?((a,e=1)=>Ye.sinh(a)*e)(s,o.asinh):100==i?o.bwd(s):s}function Po(a,e){ye(xo,Ja,mo.left=a),ye(xo,Ya,mo.width=e)}function Oo(a,e){ye(xo,Ka,mo.top=a),ye(xo,Ga,mo.height=e)}O&&qa&&oa(re,U,a=>{V._lock||(Ea(a),null!=So&&Eo(null,Mo,!0,zt.setSeries))}),o.valToIdx=a=>qe(a,e[0]),o.posToIdx=function(a,n){return qe(To(a,z,n),e[0],$a,Wa)},o.posToVal=To,o.valToPos=(a,e,n)=>0==x[e].ori?r(a,x[e],n?fa:ia,n?ga:0):s(a,x[e],n?ya:la,n?ba:0),o.setCursor=(a,e,n)=>{Jn=a.left,Zn=a.top,Jo(null,e,n)};let $o=0==B.ori?Po:Oo,Wo=1==B.ori?Po:Oo;function Uo(a,e){if(null!=a&&(a.idxs?a.idxs.forEach((a,e)=>{I[e]=a}):void 0!==a.idx&&I.fill(a.idx),_.idx=I[0]),O&&_.live){for(let a=0;a0||1==t&&!J)&&Ho(a,I[a]);!function(){if(O&&_.live)for(let a=2==t?1:0;aWa;Fo=sn,qo=null;let l=0==B.ori?ia:la,c=1==B.ori?ia:la;if(Jn<0||0==Oa||i){s=V.idx=null;for(let a=0;a0&&a.show){let n=null==w?-10:w==s?r:q(1==t?e[0][w]:e[b][0][w],B,l,0),f=null==k?-10:S(k,1==t?x[a.scale]:x[a.facets[1].scale],c,0);if(qa&&null!=k){let e=1==B.ori?Jn:Zn,n=Ke(Fa.dist(o,b,w,f,e));if(n=0?1:-1;r==(k>=0?1:-1)&&(1==r?1==o?k>=t:k<=t:1==o?k<=t:k>=t)&&(Fo=n,qo=b)}else Fo=n,qo=b}}if(za||Sa){let a,e;0==B.ori?(a=n,e=f):(a=f,e=n);let t,r,s,l,c,y,v=!0,w=Ba.bbox;if(null!=w){v=!1;let a=w(o,b);s=a.left,l=a.top,t=a.width,r=a.height}else s=a,l=e,t=r=Ba.size(o,b);if(y=Ba.fill(o,b),c=Ba.stroke(o,b),Sa)b==qo&&Fo<=Fa.prox&&(i=s,d=l,u=t,h=r,m=v,p=y,g=c);else{let a=Ma[b];null!=a&&(Ta[b]=s,Pa[b]=l,Ae(a,t,r,v),ze(a,y,c),xe(a,Ze(s),Ze(l),ia,la))}}}}if(Sa){let a=Fa.prox;if(za||(null==So?Fo<=a:Fo>a||qo!=So)){let a=Ma[0];null!=a&&(Ta[0]=i,Pa[0]=d,Ae(a,u,h,m),ze(a,p,g),xe(a,Ze(i),Ze(d),ia,la))}}}if(mo.show&&lo)if(null!=a){let[e,n]=zt.scales,[o,t]=zt.match,[r,s]=a.cursor.sync.scales,i=a.cursor.drag;if(uo=i._x,ho=i._y,uo||ho){let i,d,u,h,m,{left:p,top:g,width:b,height:f}=a.select,y=a.scales[r].ori,v=a.posToVal,w=null!=e&&o(e,r),k=null!=n&&t(n,s);w&&uo?(0==y?(i=p,d=b):(i=g,d=f),u=x[e],h=q(v(i,r),u,l,0),m=q(v(i+d,r),u,l,0),$o(Qe(h,m),Ke(m-h))):$o(0,l),k&&ho?(1==y?(i=p,d=b):(i=g,d=f),u=x[n],h=S(v(i,s),u,c,0),m=S(v(i+d,s),u,c,0),Wo(Qe(h,m),Ke(m-h))):Wo(0,c)}else dt()}else{let a=Ke(Kn-Wn),e=Ke(Xn-Un);if(1==B.ori){let n=a;a=e,e=n}uo=co.x&&a>=co.dist,ho=co.y&&e>=co.dist;let n,o,t=co.uni;null!=t?uo&&ho&&(uo=a>=t,ho=e>=t,uo||ho||(e>a?ho=!0:uo=!0)):co.x&&co.y&&(uo||ho)&&(uo=ho=!0),uo&&(0==B.ori?(n=Hn,o=Jn):(n=Yn,o=Zn),$o(Qe(n,o),Ke(o-n)),ho||Wo(0,c)),ho&&(1==B.ori?(n=Hn,o=Jn):(n=Yn,o=Zn),Wo(Qe(n,o),Ke(o-n)),uo||$o(0,l)),uo||ho||($o(0,0),Wo(0,0))}if(co._x=uo,co._y=ho,null==a){if(r){if(null!=Ct){let[a,e]=zt.scales;zt.values[0]=null!=a?To(0==B.ori?Jn:Zn,a):null,zt.values[1]=null!=e?To(1==B.ori?Jn:Zn,e):null}Dt(ee,o,Jn,Zn,ia,la,s)}if(qa){let a=r&&zt.setSeries,e=Fa.prox;null==So?Fo<=e&&Eo(qo,Mo,!0,a):Fo>e?Eo(null,Mo,!0,a):qo!=So&&Eo(qo,Mo,!0,a)}}za&&(_.idx=s,Uo()),!1!==n&&xt("setCursor")}o.setLegend=Uo;let Zo=null;function tt(a=!1){a?Zo=null:(Zo=p.getBoundingClientRect(),xt("syncRect",Zo))}function st(a,e,n,o,t,r,s){V._lock||lo&&null!=a&&0==a.movementX&&0==a.movementY||(it(a,e,n,o,t,r,0,!1,null!=a),null!=a?Jo(null,!0,!0):Jo(e,!0,!1))}function it(a,e,n,t,r,s,l,c,d){if(null==Zo&&tt(!1),Ea(a),null!=a)n=a.clientX-Zo.left,t=a.clientY-Zo.top;else{if(n<0||t<0)return Jn=-10,void(Zn=-10);let[a,o]=zt.scales,l=e.cursor.sync,[c,d]=l.values,[u,h]=l.scales,[m,p]=zt.match,g=e.axes[0].side%2==1,b=0==B.ori?ia:la,f=1==B.ori?ia:la,y=g?s:r,v=g?r:s,w=g?t:n,k=g?n:t;if(n=null!=u?m(a,u)?i(c,x[a],b,0):-10:b*(w/y),t=null!=h?p(o,h)?i(d,x[o],f,0):-10:f*(k/v),1==B.ori){let a=n;n=t,t=a}}!d||null!=e&&e.cursor.event.type!=ee||((n<=1||n>=ia-1)&&(n=vn(n,ia)),(t<=1||t>=la-1)&&(t=vn(t,la))),c?(Wn=n,Un=t,[Hn,Yn]=V.move(o,n,t)):(Jn=n,Zn=t)}Object.defineProperty(o,"rect",{get:()=>(null==Zo&&tt(!1),Zo)});const ct={width:0,height:0,left:0,top:0};function dt(){Ao(ct,!1)}let ut,mt,pt,gt;function bt(a,e,n,t,r,s,i){lo=!0,uo=ho=co._x=co._y=!1,it(a,e,n,t,r,s,0,!0,!1),null!=a&&(oa(oe,ue,ft,!1),Dt(ne,o,Hn,Yn,ia,la,null));let{left:l,top:c,width:d,height:u}=mo;ut=l,mt=c,pt=d,gt=u}function ft(a,e,n,t,r,s,i){lo=co._x=co._y=!1,it(a,e,n,t,r,s,0,!1,!0);let{left:l,top:c,width:d,height:u}=mo,h=d>0||u>0,m=ut!=l||mt!=c||pt!=d||gt!=u;if(h&&m&&Ao(mo),co.setScale&&h&&m){let a=l,e=d,n=c,o=u;if(1==B.ori&&(a=c,e=u,n=l,o=d),uo&&Do(z,To(a,z),To(a+e,z)),ho)for(let t in x){let a=x[t];t!=z&&null==a.from&&a.min!=sn&&Do(t,To(n+o,t),To(n,t))}dt()}else V.lock&&(V._lock=!V._lock,Jo(e,!0,null!=a));null!=a&&(ta(oe,ue),Dt(oe,o,Jn,Zn,ia,la,null))}function yt(a,e,n,t,r,s,i){V._lock||(Ea(a),Ue(),dt(),null!=a&&Dt(se,o,Jn,Zn,ia,la,null))}function vt(){k.forEach(Ut),Ca(o.width,o.height,!0)}Be(le,he,vt);const wt={};wt.mousedown=bt,wt.mousemove=st,wt.mouseup=ft,wt.dblclick=yt,wt.setSeries=(a,e,n,t)=>{-1!=(n=(0,zt.match[2])(o,e,n))&&Eo(n,t,!0,!1)},$&&(oa(ne,p,bt),oa(ee,p,st),oa(te,p,a=>{Ea(a),tt(!1)}),oa(re,p,function(a,e,n,o,t,r,s){if(V._lock)return;Ea(a);let i=lo;if(lo){let a,e,n=!0,o=!0,t=10;0==B.ori?(a=uo,e=ho):(a=ho,e=uo),a&&e&&(n=Jn<=t||Jn>=ia-t,o=Zn<=t||Zn>=la-t),a&&n&&(Jn=Jn{a.call(null,o,e,n)})}(a.plugins||[]).forEach(a=>{for(let e in a.hooks)kt[e]=(kt[e]||[]).concat(a.hooks[e])});const jt=(a,e,n)=>n,zt=Rn({key:null,setSeries:!1,filters:{pub:gn,sub:gn},scales:[z,y[1]?y[1].scale:null],match:[bn,bn,jt],values:[null,null]},V.sync);2==zt.match.length&&zt.match.push(jt),V.sync=zt;const Ct=zt.key,At=rt(Ct);function Dt(a,e,n,o,t,r,s){zt.filters.pub(a,e,n,o,t,r,s)&&At.pub(a,e,n,o,t,r,s)}function Et(){xt("init",a,e),We(e||a.data,!1),M[z]?io(z,M[z]):Ue(),ja=mo.show&&(mo.width>0||mo.height>0),xa=za=!0,Ca(a.width,a.height)}return At.sub(o),o.pub=function(a,e,n,o,t,r,s){zt.filters.sub(a,e,n,o,t,r,s)&&wt[a](null,e,n,o,t,r,s)},o.destroy=function(){At.unsub(o),qt.delete(o),na.clear(),Fe(le,he,vt),c.remove(),null==U||U.remove(),xt("destroy")},y.forEach(Ra),k.forEach(function(a,e){if(a._show=a.show,a.show){let n=a.side%2,t=x[a.scale];null==t&&(a.scale=n?y[1].scale:z,t=x[a.scale]);let r=t.time;a.size=un(a.size),a.space=un(a.space),a.rotate=un(a.rotate),Bn(a.incrs)&&a.incrs.forEach(a=>{!jn.has(a)&&jn.set(a,zn(a))}),a.incrs=un(a.incrs||(2==t.distr?ao:r?1==f?po:fo:eo)),a.splits=un(a.splits||(r&&1==t.distr?L:3==t.distr?_o:4==t.distr?Vo:Io)),a.stroke=un(a.stroke),a.grid.stroke=un(a.grid.stroke),a.ticks.stroke=un(a.ticks.stroke),a.border.stroke=un(a.border.stroke);let s=a.values;a.values=Bn(s)&&!Bn(s[0])?un(s):r?Bn(s)?ko(T,wo(s,P)):qn(s)?function(a,e){let n=Gn(e);return(e,o,t,r,s)=>o.map(e=>n(a(e)))}(T,s):s||R:s||No,a.filter=un(a.filter||(t.distr>=3&&10==t.log?Yo:3==t.distr&&2==t.log?Go:mn)),a.font=Wt(a.font),a.labelFont=Wt(a.labelFont),a._size=a.size(o,null,e,0),a._space=a._rotate=a._incrs=a._found=a._splits=a._values=null,a._size>0&&(Na[e]=!0,a._el=we("u-axis",h))}}),n?n instanceof HTMLElement?(n.appendChild(c),Et()):n(o,Et):Et(),o}Ht.assign=Rn,Ht.fmtNum=He,Ht.rangeNum=Oe,Ht.rangeLog=Re,Ht.rangeAsinh=Ne,Ht.orient=st,Ht.pxRatio=pe,Ht.join=function(a,e){if(function(a){let e=a[0][0],n=e.length;for(let o=1;o=o&&null==a[t];)t--;if(t<=o)return!0;const r=an(1,Xe((t-o+1)/e));for(let s=a[o],i=o+r;i<=t;i+=r){const e=a[i];if(null!=e){if(e<=s)return!1;s=e}}return!0}(e[0])||(e=function(a){let e=a[0],n=e.length,o=Array(n);for(let r=0;re[a]-e[n]);let t=[];for(let r=0;ra-e)],t=o[0].length,r=new Map;for(let s=0;sst(a,r,(l,c,d,u,h,m,p,g,b,f,y)=>{[s,i]=Pe(d,s,i);let v=l.pxRound,{left:w,width:k}=a.bbox,x=a=>v(m(a,u,f,g)),j=a=>v(p(a,h,y,b)),z=0==u.ori?bt:ft;const C={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},A=C.stroke,D=u.dir*(0==u.ori?1:-1);let E=j(d[1==D?s:i]),B=x(c[1==D?s:i]),F=B,q=B;t&&-1==e&&(q=w,z(A,q,E)),z(A,B,E);for(let a=1==D?s:i;a>=s&&a<=i;a+=D){let n=d[a];if(null==n)continue;let o=x(c[a]),t=j(n);1==e?z(A,o,E):z(A,F,t),z(A,o,t),E=t,F=o}let S=F;t&&1==e&&(S=w+k,z(A,S,E));let[M,T]=it(a,r);if(null!=l.fill||0!=M){let e=C.fill=new Path2D(A),n=j(l.fillTo(a,r,l.min,l.max,M));z(e,S,n),z(e,q,n)}if(!l.spanGaps){let t=[];t.push(...ut(c,d,s,i,D,x,o));let h=l.width*pe/2,m=n||1==e?h:-h,p=n||-1==e?-h:h;t.forEach(a=>{a[0]+=m,a[1]+=p}),C.gaps=t=l.gaps(a,r,s,i,t),C.clip=dt(t,u.ori,g,b,f,y)}return 0!=T&&(C.band=2==T?[ct(a,r,s,i,A,-1),ct(a,r,s,i,A,1)]:ct(a,r,s,i,A,T)),C})},a.bars=function(a){const e=$e((a=a||An).size,[.6,sn,1]),n=a.align||0,o=a.gap||0;let t=a.radius;t=null==t?[0,0]:"number"==typeof t?[t,0]:t;const r=un(t),s=1-e[0],i=$e(e[1],sn),l=$e(e[2],1),c=$e(a.disp,An),d=$e(a.each,a=>{}),{fill:u,stroke:h}=c;return(a,e,t,m)=>st(a,e,(p,g,b,f,y,v,w,k,x,j,z)=>{let C,A,D=p.pxRound,E=n,B=o*pe,F=i*pe,q=l*pe;0==f.ori?[C,A]=r(a,e):[A,C]=r(a,e);const S=f.dir*(0==f.ori?1:-1);let M,T,P,L=0==f.ori?yt:vt,R=0==f.ori?d:(a,e,n,o,t,r,s)=>{d(a,e,n,t,o,s,r)},N=$e(a.bands,Dn).find(a=>a.series[0]==e),I=null!=N?N.dir:0,_=p.fillTo(a,e,p.min,p.max,I),V=D(w(_,y,z,x)),O=j,$=D(p.width*pe),W=!1,U=null,H=null,Y=null,G=null;null==u||0!=$&&null==h||(W=!0,U=u.values(a,e,t,m),H=new Map,new Set(U).forEach(a=>{null!=a&&H.set(a,new Path2D)}),$>0&&(Y=h.values(a,e,t,m),G=new Map,new Set(Y).forEach(a=>{null!=a&&G.set(a,new Path2D)})));let{x0:K,size:X}=c;if(null!=K&&null!=X){E=1,g=K.values(a,e,t,m),2==K.unit&&(g=g.map(e=>a.posToVal(k+e*j,f.key,!0)));let n=X.values(a,e,t,m);T=2==X.unit?n[0]*j:v(n[0],f,j,k)-v(0,f,j,k),O=Bt(g,b,v,f,j,k,O),P=O-T+B}else O=Bt(g,b,v,f,j,k,O),P=O*s+B,T=O-P;P<1&&(P=0),$>=T/2&&($=0),P<5&&(D=hn);let J=P>0;T=D(cn(O-P-(J?$:0),q,F)),M=(0==E?T/2:E==S?0:T)-E*S*((0==E?B/2:0)+(J?$/2:0));const Z={stroke:null,fill:null,clip:null,band:null,gaps:null,flags:0},Q=W?null:new Path2D;let aa=null;if(null!=N)aa=a.data[N.series[1]];else{let{y0:n,y1:o}=c;null!=n&&null!=o&&(b=o.values(a,e,t,m),aa=n.values(a,e,t,m))}let ea=C*T,na=A*T;for(let n=1==S?t:m;n>=t&&n<=m;n+=S){let o=b[n];if(null==o)continue;if(null!=aa){let a=aa[n]??0;if(o-a==0)continue;V=w(a,y,z,x)}let t=v(2!=f.distr||null!=c?g[n]:n,f,j,k),r=w($e(o,_),y,z,x),s=D(t-M),i=D(an(r,V)),l=D(Qe(r,V)),d=i-l;if(null!=o){let t=o<0?na:ea,r=o<0?ea:na;W?($>0&&null!=Y[n]&&L(G.get(Y[n]),s,l+Xe($/2),T,an(0,d-$),t,r),null!=U[n]&&L(H.get(U[n]),s,l+Xe($/2),T,an(0,d-$),t,r)):L(Q,s,l+Xe($/2),T,an(0,d-$),t,r),R(a,e,n,s-$/2,l,T+$,d)}}return $>0?Z.stroke=W?G:Q:W||(Z._fill=0==p.width?p._fill:p._stroke??p._fill,Z.width=0),Z.fill=W?H:Q,Z})},a.spline=function(a){return function(a,e){const n=$e(null==e?void 0:e.alignGaps,0);return(e,o,t,r)=>st(e,o,(s,i,l,c,d,u,h,m,p,g,b)=>{[t,r]=Pe(l,t,r);let f,y,v,w=s.pxRound,k=a=>w(u(a,c,g,m)),x=a=>w(h(a,d,b,p));0==c.ori?(f=pt,v=bt,y=xt):(f=gt,v=ft,y=jt);const j=c.dir*(0==c.ori?1:-1);let z=k(i[1==j?t:r]),C=z,A=[],D=[];for(let a=1==j?t:r;a>=t&&a<=r;a+=j)if(null!=l[a]){let e=k(i[a]);A.push(C=e),D.push(x(l[a]))}const E={stroke:a(A,D,f,v,y,w),fill:null,clip:null,band:null,gaps:null,flags:1},B=E.stroke;let[F,q]=it(e,o);if(null!=s.fill||0!=F){let a=E.fill=new Path2D(B),n=x(s.fillTo(e,o,s.min,s.max,F));v(a,C,n),v(a,z,n)}if(!s.spanGaps){let a=[];a.push(...ut(i,l,t,r,j,k,n)),E.gaps=a=s.gaps(e,o,t,r,a),E.clip=dt(a,c.ori,m,p,g,b)}return 0!=q&&(E.band=2==q?[ct(e,o,t,r,B,-1),ct(e,o,t,r,B,1)]:ct(e,o,t,r,B,q)),E})}(Ft,a)}}const Yt=new Map;function Gt(a){var e;if(!a.startsWith("var("))return a;const n=Yt.get(a);if(n)return n;const o=a.match(/var\(([^,)]+)(?:,\s*([^)]+))?\)/);if(!o)return a;const t=o[1].trim(),r=(null==(e=o[2])?void 0:e.trim())||"#888888",s=getComputedStyle(document.documentElement).getPropertyValue(t).trim()||r;return Yt.set(a,s),s}let Kt=null,Xt=0;const Jt=t.memo(function({timestamps:a,series:e,onHover:n,highlightedKey:o=null,cursorColor:s="rgba(255,255,255,0.5)"}){const i=t.useRef(null),l=t.useRef(null),c=t.useRef(e),d=t.useRef(o),u=t.useRef(n),h=t.useRef(a.length);t.useLayoutEffect(()=>{c.current=e,d.current=o,u.current=n});const m=t.useMemo(()=>{const e=new Array(a.length).fill(1);return[a,e]},[a]),p=t.useMemo(()=>({hooks:{draw:a=>{!function(a,e,n){if(0===e.length)return;const o=a.ctx,t=a.bbox,r=t.left,s=t.top,i=t.width,l=t.height;if(i<=0||l<=0)return;const c=a.data[0],d=c.length;if(0===d)return;const u=c[0],h=c[d-1]-u||1,m=a=>{const e=c[a];return r+(e-u)/h*i},p=a=>s+l*(1-a);for(let g=0;g=0;e--){const a=m(e),n=p(r[e]);if(e===d-1)o.lineTo(a,n);else{const t=m(e+1);o.lineTo(t,n),o.lineTo(a,n)}}o.closePath(),o.fill(),o.restore()}}(a,c.current,d.current),function(a){const e=a.ctx,{left:n,top:o,width:t,height:r}=a.bbox,s=window.devicePixelRatio||1,i=function(){const a=performance.now();if(Kt&&a-Xt<1e3)return Kt;const e=getComputedStyle(document.documentElement);return Kt={fontFamily:e.getPropertyValue("--font-data").trim()||'"JetBrains Mono", ui-monospace, monospace',textPrimary:e.getPropertyValue("--text-primary").trim()||"#FFFFFF"},Xt=a,Kt}();e.save(),e.strokeStyle=i.textPrimary,e.globalAlpha=.15,e.lineWidth=1*s,e.setLineDash([4*s,4*s]);for(const c of[.2,.4,.6,.8]){const a=Math.round(o+r*(1-c))+.5;e.beginPath(),e.moveTo(Math.round(n),a),e.lineTo(Math.round(n+t),a),e.stroke()}e.restore(),e.save(),e.font=`bold ${10*s}px ${i.fontFamily}`,e.fillStyle=i.textPrimary,e.textBaseline="middle",e.textAlign="left";const l=8*s;for(const c of[0,20,40,60,80,100]){const a=o+r*(1-c/100),n=Math.max(o+l,Math.min(o+r-l,a));e.fillText(`${c}%`,0,n)}e.restore()}(a)}}}),[]),g=t.useMemo(()=>({width:400,height:200,padding:[8,0,0,32],cursor:{show:!0,x:!0,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],hooks:{setCursor:[a=>{var e,n;const o=a.cursor.idx;if(null!=o&&o>=0){const n=a.data[0][o];null==(e=u.current)||e.call(u,o,n)}else null==(n=u.current)||n.call(u,null,null)}]},plugins:[p]}),[p]);t.useEffect(()=>{const e=i.current;if(!e||0===a.length)return;const n=h.current,o=a.length,t=Math.abs(o-n);if(!(!l.current||t>100||n>0&&t/n>.1)&&l.current)return l.current.setData(m),void(h.current=o);l.current&&l.current.destroy();const r=e.getBoundingClientRect(),s=Math.floor(r.width)||400,c=Math.floor(r.height)||200,d=new Ht({...g,width:s,height:c},m,e);return l.current=d,h.current=o,()=>{d.destroy(),l.current=null}},[g,m,a.length]),t.useEffect(()=>{const a=i.current;if(!a)return;const e=new ResizeObserver(a=>{const e=a[0];if(!e||!l.current)return;const{width:n,height:o}=e.contentRect;n>0&&o>0&&l.current.setSize({width:Math.floor(n),height:Math.floor(o)})});return e.observe(a),()=>{e.disconnect()}},[]),t.useEffect(()=>{l.current&&l.current.redraw()},[o,e]);const b=t.useCallback(()=>{null==n||n(null,null)},[n]);return 0===a.length?r.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):r.jsx("div",{ref:i,className:"w-full h-full rounded-2xl overflow-hidden",onMouseLeave:b})}),Zt=t.createContext(null);function Qt(a){const e=fa(a);e&&function(a){if("undefined"==typeof document)return;const e=function(a){var e;const n={},o=a.surfaces.glass;n["--glass-tint"]=o.tint,n["--glass-light"]=o.light,n["--glass-dark"]=o.dark,n["--glass-reflex-light"]=String(o.reflexLight),n["--glass-reflex-dark"]=String(o.reflexDark),n["--glass-blur"]=`${o.blur}px`,n["--glass-blur-elevated"]=`${o.blurElevated}px`,n["--glass-brightness"]=String(o.brightness),n["--glass-bg-opacity"]=`${o.opacity}%`,n["--glass-bg-opacity-elevated"]=`${o.opacityElevated}%`,n["--glass-stroke-only"]=o.strokeOnly?"1":"0",n["--glass-stroke-width"]=o.strokeWidth?`${o.strokeWidth}px`:"0px",n["--glass-stroke-color"]=o.strokeColor||"transparent",n["--glass-ribbon-mode"]=o.ribbonMode?"1":"0",n["--glass-ribbon-border-width"]=o.ribbonBorderWidth?`${o.ribbonBorderWidth}px`:"0px",n["--glass-ribbon-border-color"]=o.ribbonBorderColor||"transparent",n["--sidebar-tint"]=a.surfaces.sidebar.tint,n["--tooltip-bg"]=a.colors.bg.surface,n["--hover-tint"]=`rgba(${q(a.colors.accent.primary)}, 0.08)`,n["--shadow-tint"]=`rgba(${q(a.colors.accent.primary)}, 0.35)`,n["--bg-body"]=a.colors.bg.body,n["--bg-surface"]=a.colors.bg.surface,n["--bg-elevated"]=a.colors.bg.elevated,n["--bg-subtle"]=a.colors.bg.subtle,n["--border-subtle"]=a.colors.border.subtle,n["--border-strong"]=a.colors.border.strong,n["--text-primary"]=a.colors.text.primary,n["--text-secondary"]=a.colors.text.secondary,n["--text-muted"]=a.colors.text.muted,n["--text-invert"]=a.colors.text.inverse,n["--accent-primary"]=a.colors.accent.primary,n["--accent-secondary"]=a.colors.accent.secondary,n["--accent-tertiary"]=a.colors.accent.tertiary,n["--accent-success"]=a.colors.accent.success,n["--accent-danger"]=a.colors.accent.danger,n["--signal-excellent"]=a.colors.signal.excellent,n["--signal-good"]=a.colors.signal.good,n["--signal-fair"]=a.colors.signal.fair,n["--signal-poor"]=a.colors.signal.poor,n["--signal-critical"]=a.colors.signal.critical,n["--signal-unknown"]=a.colors.signal.unknown,n["--sparkline-excellent"]=a.colors.signal.excellent,n["--sparkline-good"]=a.colors.signal.good,n["--sparkline-fair"]=a.colors.signal.fair,n["--sparkline-poor"]=a.colors.signal.poor,n["--sparkline-critical"]=a.colors.signal.critical,n["--status-success"]=a.colors.status.success,n["--status-warning"]=a.colors.status.warning,n["--status-danger"]=a.colors.status.danger,n["--status-info"]=a.colors.status.info,n["--status-muted"]=a.colors.status.muted;const t=a.colors.chart;n["--pkt-advert"]=a.colors.accent.secondary,n["--pkt-flood"]=a.colors.accent.tertiary,n["--pkt-txt-msg"]=a.colors.accent.success,n["--pkt-ack"]=t.c8,n["--pkt-trace"]=t.c3,n["--pkt-req"]=t.c2,n["--pkt-response"]=t.c5,n["--pkt-grp-txt"]=a.colors.map.room,n["--pkt-grp-data"]=a.colors.accent.danger,n["--pkt-path"]=t.c3,n["--pkt-anon"]=a.colors.accent.secondary,n["--pkt-unknown"]=a.colors.status.muted,n["--route-flood"]=a.colors.accent.primary,n["--route-direct"]=a.colors.accent.secondary,n["--route-transport"]=t.c8,n["--chart-1"]=t.c1,n["--chart-2"]=t.c2,n["--chart-3"]=t.c3,n["--chart-4"]=t.c4,n["--chart-5"]=t.c5,n["--chart-6"]=t.c6,n["--chart-7"]=t.c7,n["--chart-8"]=t.c8,n["--chart-grid"]=t.grid,n["--chart-axis-tick"]=t.axis,n["--chart-cursor"]=t.cursor,n["--metric-received"]=a.colors.metric.received,n["--metric-forwarded"]=a.colors.metric.forwarded,n["--metric-transmitted"]=a.colors.metric.transmitted,n["--metric-dropped"]=a.colors.metric.dropped,n["--metric-neutral"]=a.colors.text.secondary,n["--log-debug"]=a.colors.status.muted,n["--log-info"]=a.colors.status.info,n["--log-warning"]=a.colors.status.warning,n["--log-error"]=a.colors.accent.danger,n["--log-critical"]=a.colors.accent.danger;const r=a.colors.map;n["--map-node-fill"]="#3B82F6",n["--map-node-stroke"]="rgba(255,255,255,0.9)",n["--map-hub-color"]="#8E4EC6",n["--map-hub-stroke"]="rgba(255,255,255,0.9)",n["--map-gateway-color"]="#5B5BD6",n["--map-gateway-stroke"]="rgba(255,255,255,0.85)",n["--map-local-color"]="#FFB224",n["--map-neighbor-color"]="#FFB224",n["--map-neighbor-stroke"]="rgba(0,0,0,0.4)",n["--map-mobile-color"]="#F76B15",n["--map-room-color"]="#D6409F",n["--map-ghost-color"]="#00A2C7",n["--map-edge-rest"]=r.edge,n["--map-edge-rest-bright"]=a.colors.border.strong,n["--map-edge-rest-dim"]=a.colors.bg.subtle,n["--map-edge-hover-direct"]=r.edgeHover,n["--map-edge-hover-loop"]="#8E4EC6",n["--map-edge-hover-standard"]=a.colors.text.muted,n["--map-edge-hover-neighbor"]="#FFB224",n["--link-strong"]=a.colors.accent.success,n["--link-medium"]=a.colors.accent.secondary,n["--link-weak"]=a.colors.accent.danger,n["--hop-0"]=a.colors.accent.tertiary,n["--hop-1"]=a.colors.accent.success,n["--hop-2"]=t.c3,n["--hop-3"]=a.colors.accent.secondary,n["--hop-distant"]=a.colors.text.muted,n["--hop-hub"]=r.local;const s=a.colors.icon;n["--icon-page-title"]=(null==s?void 0:s.pageTitle)??a.colors.accent.primary,n["--icon-card-title"]=(null==s?void 0:s.cardTitle)??a.colors.accent.primary,n["--icon-widget"]=(null==s?void 0:s.widget)??a.colors.text.secondary,n["--icon-action"]=(null==s?void 0:s.action)??a.colors.text.secondary,n["--icon-nav"]=(null==s?void 0:s.nav)??a.colors.text.muted,n["--icon-nav-active"]=(null==s?void 0:s.navActive)??a.colors.accent.primary,n["--toggle-on"]=a.colors.accent.success,n["--toggle-off"]=a.colors.bg.elevated;const i=a.colors.sidebar;n["--sidebar-bg"]=(null==i?void 0:i.bg)??"transparent",n["--sidebar-nav-hover-bg"]=(null==i?void 0:i.navHoverBg)??"rgba(255, 255, 255, 0.05)",n["--sidebar-nav-active-bg"]=(null==i?void 0:i.navActiveBg)??`color-mix(in srgb, ${a.colors.accent.primary} 15%, transparent)`,n["--sidebar-nav-active-text"]=(null==i?void 0:i.navActiveText)??a.colors.accent.primary;const l=a.meta.isDark;n["--data-box-bg"]=l?"rgba(255, 255, 255, 0.03)":"rgba(0, 0, 0, 0.03)",n["--data-box-border"]=l?"rgba(255, 255, 255, 0.06)":"rgba(0, 0, 0, 0.08)",n["--subtle-fill"]=l?"rgba(255, 255, 255, 0.03)":"rgba(0, 0, 0, 0.03)",n["--subtle-fill-hover"]=l?"rgba(255, 255, 255, 0.06)":"rgba(0, 0, 0, 0.05)",n["--subtle-fill-strong"]=l?"rgba(255, 255, 255, 0.08)":"rgba(0, 0, 0, 0.06)",n["--color-pill-bg"]=l?"rgba(0, 0, 0, 0.3)":"rgba(255, 255, 255, 0.3)",n["--terminal-bg"]=l?"rgba(0, 0, 0, 0.4)":"rgba(0, 0, 0, 0.03)",n["--terminal-bg-input"]=l?"rgba(0, 0, 0, 0.5)":"rgba(0, 0, 0, 0.05)",n["--terminal-bg-status"]=l?"rgba(0, 0, 0, 0.3)":"rgba(0, 0, 0, 0.02)",n["--terminal-border"]=l?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.08)",n["--terminal-autocomplete-bg"]=l?"rgba(0, 0, 0, 0.8)":"rgba(255, 255, 255, 0.95)",n["--terminal-autocomplete-border"]=l?"rgba(255, 255, 255, 0.2)":"rgba(0, 0, 0, 0.15)",n["--terminal-autocomplete-hover"]=l?"rgba(255, 255, 255, 0.1)":"rgba(0, 0, 0, 0.05)",n["--livedot-idle"]=l?"#666677":"#999999",n["--ctrl-panel-top"]=l?"rgba(30, 30, 30, 0.95)":"rgba(240, 240, 240, 0.95)",n["--ctrl-panel-mid"]=l?"rgba(25, 25, 25, 0.95)":"rgba(235, 235, 235, 0.95)",n["--ctrl-panel-bottom"]=l?"rgba(20, 20, 20, 0.95)":"rgba(230, 230, 230, 0.95)",n["--ctrl-panel-border"]=l?"rgba(60, 60, 60, 1)":"rgba(200, 200, 200, 1)",n["--chart-grid-line"]=l?"rgba(255, 255, 255, 0.06)":"rgba(0, 0, 0, 0.08)",n["--map-control-active-amber"]=l?"rgba(251, 191, 36, 0.15)":"rgba(217, 119, 6, 0.12)",n["--map-control-active-sky"]=l?"rgba(56, 189, 248, 0.15)":"rgba(14, 165, 233, 0.12)",n["--map-control-active-teal"]=l?"rgba(45, 212, 191, 0.15)":"rgba(20, 184, 166, 0.12)",n["--sidebar-action-active-green"]=l?"rgba(10, 26, 10, 1)":"rgba(220, 252, 231, 1)",n["--sidebar-action-active-teal"]=l?"rgba(10, 36, 32, 1)":"rgba(204, 251, 241, 1)",n["--sidebar-action-active-amber"]=l?"rgba(26, 20, 8, 1)":"rgba(254, 243, 199, 1)",n["--thumbnail-brightness"]=l?"1.5":"1.8",n["--font-title"]=a.typography.font.title,n["--font-display"]=a.typography.font.display,n["--font-data"]=a.typography.font.mono,n["--font-card-title"]=a.typography.font.cardTitle??a.typography.font.display,n["--font-badge"]=a.typography.font.badge??a.typography.font.display,n["--font-normal"]=String(a.typography.weight.normal),n["--font-medium"]=String(a.typography.weight.medium),n["--font-semibold"]=String(a.typography.weight.semibold),n["--font-bold"]=String(a.typography.weight.bold),n["--font-card-title-weight"]=String(a.typography.weight.cardTitle??a.typography.weight.semibold),n["--font-badge-weight"]=String(a.typography.weight.badge??a.typography.weight.medium),n["--badge-text-transform"]=(null==(e=a.typography.badge)?void 0:e.textTransform)??"none";const c=a.typography.size;c.xxl&&(n["--text-2xl"]=c.xxl),c.xl&&(n["--text-xl"]=c.xl),c.lg&&(n["--text-lg"]=c.lg),c.md&&(n["--text-md"]=c.md),c.base&&(n["--text-base"]=c.base),c.sm&&(n["--text-sm"]=c.sm),c.xs&&(n["--text-xs"]=c.xs),c.hero&&(n["--text-5xl"]=c.hero),c.cardTitle&&(n["--text-card-title"]=c.cardTitle);const d=a.typography.tracking;return d&&(n["--tracking-tight"]=d.tight,n["--tracking-normal"]=d.normal,n["--tracking-wide"]=d.wide),n["--theme-transition"]=`${a.motion.slow} ${a.motion.easing}`,function(a){if(!E())return a;const e={},n=/^#[0-9A-Fa-f]{3,6}$/;for(const[o,t]of Object.entries(a))e[o]=n.test(t)?D(t):t;return e}(n)}(a),n=document.documentElement;for(const[o,t]of Object.entries(e))n.style.setProperty(o,t);a.surfaces.glass.strokeOnly?n.classList.add("stroke-only"):n.classList.remove("stroke-only"),a.surfaces.glass.ribbonMode?n.classList.add("ribbon-mode"):n.classList.remove("ribbon-mode"),a.surfaces.glass.catalystMode?n.classList.add("catalyst-mode"):n.classList.remove("catalyst-mode")}(e),document.documentElement.dataset.colorScheme=a}function ar({children:a}){const[e,n]=t.useState(()=>function(){if("undefined"==typeof window)return Ba;try{let n=localStorage.getItem(Fa),o=localStorage.getItem(qa);const t=localStorage.getItem(Sa);if(!n&&!o){const a=localStorage.getItem(Ma);if(a){const e=Ea.find(e=>e.id===a);e&&(n=e.colorScheme,o=e.backgroundImage,localStorage.setItem(Fa,n),localStorage.setItem(qa,o),localStorage.removeItem(Ma))}}const r=n&&"string"==typeof(e=n)&&Aa.some(a=>a.id===e)?n:Ba.colorScheme;let s=Ba.backgroundImage;""===o?s="":o&&"string"==typeof(a=o)&&Da.some(e=>e.src===a)&&(s=o);let i=Ba.brightness;if(t){const a=parseInt(t,10);!isNaN(a)&&a>=0&&a<=100&&(i=a)}return{colorScheme:r,backgroundImage:s,brightness:i}}catch{return Ba}var a,e}()),o=t.useRef(!1),s=t.useRef(null),[i,l]=t.useState(null);t.useEffect(()=>{s.current&&(clearTimeout(s.current),s.current=null),o.current&&(l("#808080"),s.current=setTimeout(()=>{l(null),s.current=null},1800)),o.current=!0,Qt(e.colorScheme),Yt.clear(),requestAnimationFrame(()=>{!function(){if("undefined"==typeof window)return;for(const e of Ra){const a=$a(`--palette-${e}-bright`),n=$a(`--palette-${e}`),o=a||n;if(!o)continue;const t=Oa(o);for(const r of La)Wa(`--palette-${e}-${r}`,t[r])}const a=$a("--palette-bg-4");if(a){const e=Oa(a);for(const a of La)Wa(`--palette-neutral-${a}`,e[a])}}()})},[e.colorScheme]),t.useEffect(()=>{!function(a){if("undefined"!=typeof window)try{localStorage.setItem(Fa,a.colorScheme),localStorage.setItem(qa,a.backgroundImage),localStorage.setItem(Sa,String(a.brightness))}catch{}}(e)},[e]),t.useEffect(()=>{Da.forEach(a=>{(new Image).src=a.src})},[]);const c=t.useCallback(a=>{n(e=>({...e,colorScheme:a}))},[]),d=t.useCallback(a=>{const e=Da.find(e=>e.src===a);n(n=>({...n,backgroundImage:a,brightness:(null==e?void 0:e.suggestedBrightness)??n.brightness}))},[]),u=t.useCallback(a=>{const e=Math.max(0,Math.min(100,Math.round(a)));n(a=>({...a,brightness:e}))},[]),h=t.useCallback(a=>{const e=Ea.find(e=>e.id===a);if(e){const a=!e.backgroundImage,o=a?null:Da.find(a=>a.src===e.backgroundImage);n(n=>({...n,colorScheme:e.colorScheme,backgroundImage:e.backgroundImage,brightness:a?100:(null==o?void 0:o.suggestedBrightness)??n.brightness}))}},[]),m=t.useMemo(()=>({theme:e,setColorScheme:c,setBackgroundImage:d,setBrightness:u,setThemePreset:h}),[e,c,d,u,h]);return r.jsxs(Zt.Provider,{value:m,children:[a,i&&r.jsx("div",{className:"fixed inset-0 pointer-events-none z-[9999]",style:{backgroundColor:i,animation:"theme-crossfade 1.8s ease-out forwards"}},e.colorScheme),r.jsx("style",{children:"\n @keyframes theme-crossfade {\n from { opacity: 0.35; }\n to { opacity: 0; }\n }\n "})]})}function er(){const a=t.useContext(Zt);if(!a)throw new Error("useTheme must be used within a ThemeProvider. Wrap your app with in App.tsx.");return a}const nr=t.forwardRef(function(a,e){const{href:n,...o}=a;return n.startsWith("http://")||n.startsWith("https://")||n.startsWith("//")?r.jsx(s,{children:r.jsx("a",{...o,href:n,ref:e})}):r.jsx(s,{children:r.jsx(v,{...o,to:n,ref:e})})}),or={0:"REQ",1:"RESPONSE",2:"TXT_MSG",3:"ACK",4:"ADVERT",5:"GRP_TXT",6:"GRP_DATA",7:"ANON_REQ",8:"PATH",9:"TRACE",10:"MULTIPART",15:"RAW_CUSTOM"},tr={0:"T_FLOOD",1:"FLOOD",2:"DIRECT",3:"T_DIRECT"},rr={REQ:0,RESPONSE:1,TXT_MSG:2,ACK:3,ADVERT:4,GRP_TXT:5,GRP_DATA:6,ANON_REQ:7,PATH:8,TRACE:9,MULTIPART:10,RAW_CUSTOM:15};function sr(a){return 1===a||0===a}const ir={acton:{discrete:["#260D40","#2B1345","#2F194B","#342152","#382657","#3C2C5C","#403261","#443766","#483E6C","#4C4371","#504876","#544D7B","#57527F","#5D5884","#625C88","#685F8A","#6E618C","#74628D","#7B638D","#81638E","#88648E","#8E648E","#95658F","#9D658F","#A4668F","#AB6690","#B26790","#BB6992","#C26B94","#C86F97","#CD749B","#D07AA0","#D382A7","#D688AC","#D88FB2","#D995B8","#DB9CBD","#DEA4C4","#DFABC9","#E1B1CE","#E3B7D3","#E5BED8","#E6C5DE","#E8CBE2","#E9D0E6","#EBD6EA","#ECDBEE","#EDE1F3","#EFE6F6","#F0EAFA"],categorical:["#260D40","#F0EAFA","#A76690","#DDA1C2","#585380","#7D638E","#E8CAE1","#CF789E","#403261","#4C4371","#ECDBEE","#69608B","#E3B6D2","#D78CB0","#91648F","#BE6A92","#342152","#EAD3E8","#524B79","#73628D","#463A69","#605B86","#E5C0DA","#D382A7","#C86F97","#86648E","#EEE3F4","#DA97B9","#9B658F","#B26790","#2D1749","#E0ACCA","#3A2959","#8B648E","#311C4D","#EBD7EB","#EDDFF1","#AC6790","#A1668F","#6E618C","#E6C5DE","#78628D","#433665","#DEA7C6","#81638E","#554F7C","#B86891","#3D2D5D","#4F4775","#EFE7F7","#E9CEE4","#D27DA3","#2A1244","#655D89","#C36C94","#E1B1CE","#493F6D","#5C5783","#CC739A","#DB9CBD","#D892B4","#D587AB","#96658F","#E4BBD6","#362455","#4E4573","#7F638E","#D37FA5","#E1AECC","#382657","#EBD9ED","#DFA9C8","#A4668F","#8E648E","#99658F","#675F8A","#B56891","#BB6992","#E5BED8","#E2B4D0","#D07AA0","#71618C","#E6C2DC","#AA6690","#625C88","#EDE1F3","#E8CCE3","#AF6790","#CA7199","#C16B93","#453867","#57517E","#84638E","#4B416F","#E7C7DF","#423463","#514977","#3E2F5F","#544D7B","#93658F"]},bam:{discrete:["#65024B","#701057","#7B1B61","#88276E","#923078","#9B3881","#A4418A","#AC4993","#B5549C","#BC5CA3","#C266AB","#C970B2","#CF7AB9","#D587C1","#DA93C8","#DF9ECE","#E3AAD4","#E7B5DA","#EBC2E0","#EECCE5","#F1D5E9","#F3DDED","#F5E4F0","#F6EBF1","#F6EFF1","#F5F2F0","#F3F3ED","#EFF3E6","#EBF1DF","#E5EFD5","#DDEBCA","#D4E6BD","#C8DEAB","#BCD79B","#B0CE8C","#A3C67D","#97BC6F","#88B161","#7CA856","#72A04D","#679845","#5E903D","#538735","#4B7F2E","#427827","#397021","#306819","#245D10","#195507","#0D4C00"],categorical:["#65024B","#701057","#7B1B61","#88276E","#923078","#9B3881","#A4418A","#AC4993","#B5549C","#BC5CA3","#C266AB","#C970B2","#CF7AB9","#D587C1","#DA93C8","#DF9ECE","#E3AAD4","#E7B5DA","#EBC2E0","#EECCE5","#F1D5E9","#F3DDED","#F5E4F0","#F6EBF1","#F6EFF1","#F5F2F0","#F3F3ED","#EFF3E6","#EBF1DF","#E5EFD5","#DDEBCA","#D4E6BD","#C8DEAB","#BCD79B","#B0CE8C","#A3C67D","#97BC6F","#88B161","#7CA856","#72A04D","#679845","#5E903D","#538735","#4B7F2E","#427827","#397021","#306819","#245D10","#195507","#0D4C00"]},bamako:{discrete:["#003B47","#023C46","#053E45","#083F43","#0A4141","#0D4340","#0F443E","#12463C","#16483A","#194A38","#1C4D36","#204F34","#235132","#28542F","#2C572C","#305A2A","#355C27","#395F24","#3F6321","#44661E","#49691A","#4E6D17","#537014","#5A7410","#5F780D","#657C09","#6A7F05","#718302","#788501","#7F8700","#858800","#8C8A00","#948C01","#9B8E04","#A1920B","#A89713","#AE9C1B","#B7A225","#BEA82E","#C5AD37","#CBB341","#D2B84D","#D9BF5B","#DEC567","#E4CA73","#E9D07E","#EFD58A","#F5DB97","#FAE0A3","#FFE5AD"],categorical:["#003B47","#FFE5AD","#61790B","#B4A022","#245231","#406420","#898900","#DDC464","#0F443E","#EFD58A","#CAB23F","#194A38","#748401","#506E16","#9E9108","#315A29","#083F43","#A99815","#948C01","#6A7F05","#BFA930","#7F8700","#14473B","#1E4E35","#F7DD9C","#2A562D","#043D45","#597411","#E6CC77","#385F25","#48691B","#D4BB51","#0B4241","#8F8A00","#44661E","#1B4C37","#547113","#6F8203","#12463D","#998E03","#27542F","#4C6B18","#A4940E","#2E582B","#355C27","#B9A529","#215033","#EAD181","#FBE1A5","#C5AD37","#3C6122","#848800","#063E44","#E2C86E","#D9BF5B","#CFB648","#16493A","#798600","#023C46","#667C08","#5D770E","#0D433F","#AE9C1B","#F3D993","#094042","#A69611","#8C8A00","#053E45","#0C4240","#365E26","#6D8004","#9C8F05","#4A6A1A","#D6BD56","#B19E1F","#F9DFA0","#647B0A","#2F592A","#10453D","#818800","#C7AF3B","#46681C","#0E443F","#265330","#174A39","#335B28","#5B750F","#778501","#5F780D","#E8CF7C","#718302","#F1D78E","#978D02","#F5DB97","#204F34","#AC9A18","#29552E","#A1920B","#B7A225","#033C46"]},bamo:{discrete:["#4F3043","#56304B","#603354","#6D3961","#793F6B","#834675","#8D4E7E","#965587","#A05E91","#A86698","#B06EA0","#B877A7","#BF81AF","#C78DB8","#CD98BE","#D2A3C4","#D6ADC8","#D9B5CB","#DABECC","#DAC3CC","#D9C7CA","#D8CAC8","#D6CBC6","#D4CDC2","#D1CDBE","#CCCDB9","#C6CBB1","#BCC5A4","#B2BE97","#A7B58A","#9CAB7E","#92A174","#889669","#808D62","#79855C","#737D56","#6D7552","#666C4C","#616548","#5C5D45","#575642","#54503F","#50493D","#4D453C","#4B403B","#4A3C3A","#49393A","#49343B","#4A313E","#4E3042"],categorical:["#4F3043","#56304B","#603354","#6D3961","#793F6B","#834675","#8D4E7E","#965587","#A05E91","#A86698","#B06EA0","#B877A7","#BF81AF","#C78DB8","#CD98BE","#D2A3C4","#D6ADC8","#D9B5CB","#DABECC","#DAC3CC","#D9C7CA","#D8CAC8","#D6CBC6","#D4CDC2","#D1CDBE","#CCCDB9","#C6CBB1","#BCC5A4","#B2BE97","#A7B58A","#9CAB7E","#92A174","#889669","#808D62","#79855C","#737D56","#6D7552","#666C4C","#616548","#5C5D45","#575642","#54503F","#50493D","#4D453C","#4B403B","#4A3C3A","#49393A","#49343B","#4A313E","#4E3042"]},batlow:{discrete:["#011959","#06215B","#0A285C","#0D315D","#0E375E","#103D5F","#114260","#124761","#144D62","#165162","#195662","#1C5A62","#205E61","#26635F","#2C665D","#33695A","#3A6C57","#416F53","#4A724E","#52744A","#5A7745","#627941","#6A7B3D","#747E38","#7D8134","#868330","#8F862D","#9B892B","#A58B2C","#AF8D2E","#B98F32","#C29037","#CD923F","#D69446","#DE964F","#E69858","#ED9A62","#F39E70","#F8A17B","#FAA587","#FCA993","#FDAC9E","#FDB1AB","#FDB4B6","#FDB8C0","#FDBCCB","#FCBFD6","#FCC4E3","#FBC8EF","#FACCFA"],categorical:["#011959","#FACCFA","#828231","#226061","#F29D6D","#4D734D","#114360","#C09036","#FDB4B4","#DD954D","#356A59","#FCBFD6","#175262","#677B3E","#A18A2B","#0D315D","#FCA890","#FBC6E8","#2B655E","#B18D2F","#5A7745","#FDAEA2","#CF9340","#0F3B5F","#E9995C","#FDBAC4","#416F53","#91862D","#1B5962","#08255B","#747E38","#134B61","#F9A380","#8A842F","#0E365E","#124761","#154F62","#E39754","#7B8034","#1E5D62","#99882C","#195662","#0B2B5C","#FDB7BC","#C8913B","#FCC3DF","#EE9B64","#A98C2C","#FDB1AB","#FDBCCD","#FBC9F1","#051F5A","#F6A077","#607942","#FDAB9A","#477150","#3B6D56","#B98F32","#26635F","#537549","#D69446","#6D7C3B","#30685C","#103F60","#FBA689","#BD8F34","#CB923E","#EB9A60","#FDB8C0","#FBC7EC","#F09C69","#8E852E","#FDBBC9","#7F8133","#031C5A","#114160","#FDAC9E","#5D7844","#FCA995","#185462","#787F36","#A58B2C","#0A285C","#9D892B","#33695A","#0D335E","#637A40","#165062","#124561","#205E61","#144D62","#1D5B62","#0C2E5D","#D9954A","#3E6E55","#AD8C2D","#F49F72","#868330","#B58E30","#577647"]},batlowk:{discrete:["#04050A","#0A0D15","#0F141E","#121B29","#152233","#18293D","#1C3146","#21384F","#274156","#2C485B","#314E5E","#36535F","#3B575F","#405C5E","#445F5D","#49625B","#4D6558","#526756","#586B52","#5E6E4F","#63724B","#6A7548","#717845","#797D41","#81813E","#8A853B","#938839","#9F8D38","#A99139","#B3943B","#BE973E","#C89A43","#D39D4C","#DB9F54","#E2A15D","#E8A366","#EEA570","#F3A77C","#F6A986","#F8AC91","#FAAE9A","#FCB1A4","#FDB4B0","#FDB7B9","#FDBAC3","#FDBDCD","#FDC1D8","#FCC5E4","#FBC8EF","#FACCFA"],categorical:["#04050A","#FDC0D6","#787C41","#38555F","#E5A160","#536855","#AF933A","#FAAE9A","#1A2E43","#FDB6B7","#294458","#455F5C","#63724B","#CD9B47","#91883A","#F3A77E","#111A27","#F7AB8D","#FDBBC5","#FCB2AA","#D99E52","#A18E38","#4C6459","#21384F","#3F5B5E","#152335","#0C1019","#EEA570","#5B6D50","#6C7647","#314E5E","#85823D","#BE973E","#7E7F3F","#FBB0A2","#49625B","#576A53","#0F151F","#2D495B","#DFA059","#727944","#FDBDCD","#253E54","#EAA368","#C69942","#3C585F","#998B38","#677449","#F1A678","#F9AC92","#141F2F","#1D3248","#506657","#090C13","#A99139","#5F6F4E","#35525F","#435D5D","#FDB8BD","#F5A984","#B5953B","#FDB5B2","#17273B","#D39D4C","#8C853B","#9D8C38","#415C5E","#1F354B","#33505E","#FCB1A6","#101723","#3E595F","#121C2B","#757B43","#06080F","#FCB3AE","#3A565F","#274156","#61704D","#88843C","#2B475A","#FDBED1","#6A7548","#596C51","#192B3F","#6F7845","#233B51","#C99A45","#F0A574","#DC9F55","#2F4B5D","#47615C","#F6AA88","#FDB9C1","#C29840","#4A635A","#FAAD96","#81813E","#7B7E40","#E7A264"]},batloww:{discrete:["#011959","#06215B","#0A285C","#0D315D","#0E375E","#103D5F","#114260","#124761","#144C62","#165062","#185562","#1B5962","#1F5D62","#246261","#2A665F","#30695D","#366C5A","#3D7056","#467352","#4E764E","#56794A","#5E7C46","#667F42","#70823D","#798539","#828936","#8C8C33","#989032","#A29433","#AD9738","#B79B3F","#C19E48","#CBA154","#D3A45E","#D9A669","#DFA872","#E4AA7C","#E9AC88","#EEAF91","#F2B39C","#F6B9A8","#F9C0B5","#FCCAC4","#FED3CF","#FFDBDA","#FFE3E2","#FFEAEA","#FFF2F2","#FFF8F8","#FFFEFE"],categorical:["#FFFEFE","#011959","#7E8737","#205F61","#E7AB84","#497451","#114360","#FED1CD","#BF9D46","#637E44","#9E9233","#FFEAEA","#0D315D","#326B5C","#F5B7A6","#165162","#D7A564","#0F3B5F","#1A5862","#3D7056","#FFF5F5","#FFDFDD","#FAC3BA","#134A61","#08255B","#70823D","#EEB094","#56794A","#E0A874","#8E8D33","#28655F","#AF9839","#CBA154","#EBAD8B","#1D5C62","#051F5A","#124761","#FFE5E4","#B79B3F","#A79535","#386D59","#5C7B47","#185562","#DBA76D","#F8BDAF","#FFF0F0","#246261","#F2B39C","#868A35","#4F774D","#E4AA7C","#2D685E","#77853A","#FED8D6","#103F60","#FFFAF9","#968F32","#D1A35C","#144E62","#FCCAC4","#437254","#698040","#0E365E","#0B2B5C","#C59F4C","#30695D","#1C5A62","#A29433","#407155","#FFDBDA","#0C2E5D","#F7BAAA","#E5AB80","#175362","#828936","#1F5D62","#BB9C42","#E9AC88","#FFF7F7","#3A6E58","#9A9132","#8A8B34","#4C754F","#FFEDED","#D9A669","#144C62","#266460","#FDCDC9","#FCC6BF","#FFE2E1","#FFFCFC","#7B8639","#2B675E","#155062","#5F7C45","#F9C0B5","#356C5A","#F3B5A1","#EDAF8F","#FED5D2"]},berlin:{discrete:["#9EB0FF","#93AFFA","#87ADF4","#79ABED","#6CA9E6","#60A5DF","#54A0D5","#489ACA","#3E90BC","#3787AF","#327EA3","#2D7597","#296B8B","#25607C","#225771","#1E4E65","#1B465A","#183D4F","#153342","#122C38","#11242E","#101D25","#11181C","#121214","#160E0D","#1B0B07","#210B03","#270D01","#2D0E00","#340F00","#3B1100","#421301","#4B1602","#541905","#5D1E09","#68240F","#732B16","#803620","#8A3F2A","#944834","#9E513F","#A85A4A","#B46658","#BE6F63","#C8796F","#D2837A","#DD8D86","#EA9995","#F4A3A1","#FFADAD"],categorical:["#9EB0FF","#93AFFA","#87ADF4","#79ABED","#6CA9E6","#60A5DF","#54A0D5","#489ACA","#3E90BC","#3787AF","#327EA3","#2D7597","#296B8B","#25607C","#225771","#1E4E65","#1B465A","#183D4F","#153342","#122C38","#11242E","#101D25","#11181C","#121214","#160E0D","#1B0B07","#210B03","#270D01","#2D0E00","#340F00","#3B1100","#421301","#4B1602","#541905","#5D1E09","#68240F","#732B16","#803620","#8A3F2A","#944834","#9E513F","#A85A4A","#B46658","#BE6F63","#C8796F","#D2837A","#DD8D86","#EA9995","#F4A3A1","#FFADAD"]},bilbao:{discrete:["#4C0001","#54070B","#5B0E13","#64161A","#6B1D20","#712227","#77282D","#7D2E34","#84343B","#8A3A41","#8F4047","#94464B","#984C4F","#9B5253","#9D5754","#9E5C56","#A06057","#A16458","#A26959","#A36D5A","#A4715B","#A5745B","#A6785C","#A77C5D","#A8805E","#A9845F","#AA875F","#AC8C60","#AD9061","#AE9463","#AF9864","#B19D68","#B3A36E","#B6A975","#B8AD7E","#BBB287","#BDB590","#C0B99A","#C2BCA3","#C4BFAA","#C6C2B2","#C8C5B9","#CBCAC1","#CFCEC9","#D5D4D1","#DBDBDA","#E3E3E2","#EDEDED","#F6F6F6","#FFFFFF"],categorical:["#4C0001","#F8F8F8","#A9815E","#984D50","#BEB794","#AF9965","#CCCAC3","#78292F","#A26A59","#9F5D56","#64161A","#B6AA77","#C4C0AC","#A6765C","#8A3A41","#AC8C60","#DDDDDB","#A16358","#C7C5B7","#B3A16B","#A4705A","#6E2024","#EAEAE9","#92434A","#BAB185","#9C5554","#AD9262","#580B10","#813137","#C1BCA1","#AA865F","#D2D2CE","#A77C5D","#D7D7D4","#BCB48D","#B4A571","#C0B99A","#9E5955","#AB8960","#A6795C","#A36D5A","#8E3F46","#85353C","#A16758","#732529","#CAC7BD","#F1F1F0","#520509","#AC8F61","#5E1115","#C6C2B2","#E3E3E2","#691B1F","#B8AD7E","#95484D","#AE9663","#B19D68","#A5735B","#A06057","#9A5152","#A87E5D","#7D2E34","#A9835E","#C3BEA6","#CFCEC9","#A46E5A","#F4F4F4","#DADAD8","#B29F69","#EDEDED","#BBB289","#9D5754","#AF9764","#904148","#994F51","#B3A36E","#A87F5E","#A26859","#AC8D61","#BDB590","#AA875F","#A77A5D","#AB8A60","#A4715B","#611418","#BFB897","#E6E6E6","#9B5353","#D5D4D1","#974A4F","#C8C6BA","#A16558","#9F5E56","#76272C","#67191D","#8C3C43","#B9AF82","#C3BFA9","#B5A874","#4F0205"]},broc:{discrete:["#2C1A4C","#2B2154","#2B295B","#2A3164","#29396C","#284174","#29497C","#2A5183","#305C8C","#376593","#416D9A","#4B76A0","#567FA6","#6489AD","#6F92B3","#7B9BBA","#86A3C0","#92ACC6","#A0B7CD","#ACC0D3","#B8C9DA","#C4D2E0","#D0DBE6","#DEE5EC","#E7ECED","#EDEFE9","#EDEEE1","#E9E9D4","#E4E4C8","#DEDEBD","#D8D8B1","#D2D2A5","#C9C996","#C1C18A","#B8B87E","#AEAE73","#A3A369","#97975E","#8D8D56","#83834D","#797945","#70703D","#646434","#5B5B2C","#525224","#49491D","#404016","#36360F","#2E2E08","#262600"],categorical:["#2C1A4C","#2B2154","#2B295B","#2A3164","#29396C","#284174","#29497C","#2A5183","#305C8C","#376593","#416D9A","#4B76A0","#567FA6","#6489AD","#6F92B3","#7B9BBA","#86A3C0","#92ACC6","#A0B7CD","#ACC0D3","#B8C9DA","#C4D2E0","#D0DBE6","#DEE5EC","#E7ECED","#EDEFE9","#EDEEE1","#E9E9D4","#E4E4C8","#DEDEBD","#D8D8B1","#D2D2A5","#C9C996","#C1C18A","#B8B87E","#AEAE73","#A3A369","#97975E","#8D8D56","#83834D","#797945","#70703D","#646434","#5B5B2C","#525224","#49491D","#404016","#36360F","#2E2E08","#262600"]},broco:{discrete:["#372F38","#36303D","#363144","#36354E","#363957","#373F60","#39456A","#3C4D75","#415780","#47608A","#4D6992","#55729A","#5D7BA2","#6886AA","#728FB1","#7C97B7","#86A0BD","#91A8C2","#9DB2C8","#A7BACC","#B1C1CE","#BAC8D0","#C2CDD0","#CAD1CD","#CED3C8","#CFD3C2","#CFD1B9","#CBCCAD","#C6C6A2","#BFBF96","#B8B78B","#AFAF7F","#A4A472","#9B9A68","#91915E","#888755","#7E7E4C","#737243","#6B693D","#626137","#5B5932","#54512E","#4C482B","#474229","#423D29","#3F3829","#3C352B","#39322E","#383032","#372F37"],categorical:["#372F38","#36303D","#363144","#36354E","#363957","#373F60","#39456A","#3C4D75","#415780","#47608A","#4D6992","#55729A","#5D7BA2","#6886AA","#728FB1","#7C97B7","#86A0BD","#91A8C2","#9DB2C8","#A7BACC","#B1C1CE","#BAC8D0","#C2CDD0","#CAD1CD","#CED3C8","#CFD3C2","#CFD1B9","#CBCCAD","#C6C6A2","#BFBF96","#B8B78B","#AFAF7F","#A4A472","#9B9A68","#91915E","#888755","#7E7E4C","#737243","#6B693D","#626137","#5B5932","#54512E","#4C482B","#474229","#423D29","#3F3829","#3C352B","#39322E","#383032","#372F37"]},buda:{discrete:["#B301B3","#B30BAE","#B314AA","#B31CA6","#B323A2","#B3289F","#B32E9D","#B4339A","#B53998","#B63E96","#B84394","#B94892","#BB4C91","#BD528F","#BE568D","#C05B8C","#C15F8A","#C36389","#C46987","#C66D86","#C77184","#C97583","#CA7982","#CB7E80","#CD837F","#CE877E","#CF8B7D","#D0917B","#D1957A","#D29979","#D49E78","#D5A277","#D6A776","#D7AC75","#D8B073","#D9B572","#DAB971","#DCBF70","#DDC36F","#DEC86E","#DFCC6C","#E0D16B","#E2D76A","#E4DC69","#E6E168","#E9E667","#EDEC67","#F3F366","#F9F966","#FFFF66"],categorical:["#B301B3","#FFFF66","#CD857E","#BC4E90","#DBBD70","#C56A87","#B32F9C","#E3DB69","#D4A177","#EDEC67","#D1937B","#B73F95","#C05C8B","#DFCB6D","#C97882","#B31CA6","#D8AE74","#E7E368","#DAB572","#B311AC","#D39A79","#C36389","#C77184","#B53798","#E1D36B","#BE558E","#B94793","#CB7E80","#CF8C7C","#DDC46E","#B326A0","#F6F566","#D6A875","#DAB971","#C66E86","#E2D76A","#B32B9E","#B317A9","#B4339A","#BA4B91","#C46788","#C2608A","#B309AF","#D49E78","#B63B97","#BD528F","#DCC06F","#EAE767","#FAFA66","#D2977A","#F1F066","#D0907C","#CE897D","#C87483","#CC827F","#D5A576","#B321A3","#E5DF68","#B84394","#D9B273","#E0CF6C","#CA7B81","#DEC86E","#BF598C","#D7AB75","#E6E168","#D1957A","#CC8080","#D39C78","#E0CD6C","#CD847F","#B63D96","#C87384","#C66C86","#F8F866","#D49F78","#D9B473","#DAB772","#BF578D","#CB7D81","#CF8A7D","#B32D9D","#D08E7C","#DBBB71","#C2628A","#E2D56A","#DCBF70","#BC508F","#C46987","#C05B8C","#DFCA6D","#DDC26F","#C15E8B","#D7AD74","#F3F366","#DEC66E","#D5A377","#B31AA7","#BA4992","#CE877E"]},bukavu:{discrete:["#1A3333","#1B373D","#1C3C47","#1E4255","#1F4762","#214E71","#235582","#255E92","#2969A1","#2C73AD","#2F7CB8","#3485C2","#3B8EC7","#4799C8","#50A1C9","#59AAC9","#62B2CA","#6BBACB","#76C3CB","#81CCCD","#92D5D1","#A4DED5","#B6E7DA","#CCF2DF","#DDFBE3","#034224","#08491F","#115119","#1C5914","#2B6212","#3D6915","#4E6E1B","#617224","#6F742B","#7B7631","#867836","#917B3C","#9E7E45","#AA844F","#B48D5D","#BC976C","#C3A27C","#CAB08F","#CFBBA0","#D5C6B0","#DACFC1","#DFD7D0","#E4DFE0","#E9E6ED","#EDEDFC"],categorical:["#1A3333","#1B373D","#1C3C47","#1E4255","#1F4762","#214E71","#235582","#255E92","#2969A1","#2C73AD","#2F7CB8","#3485C2","#3B8EC7","#4799C8","#50A1C9","#59AAC9","#62B2CA","#6BBACB","#76C3CB","#81CCCD","#92D5D1","#A4DED5","#B6E7DA","#CCF2DF","#DDFBE3","#034224","#08491F","#115119","#1C5914","#2B6212","#3D6915","#4E6E1B","#617224","#6F742B","#7B7631","#867836","#917B3C","#9E7E45","#AA844F","#B48D5D","#BC976C","#C3A27C","#CAB08F","#CFBBA0","#D5C6B0","#DACFC1","#DFD7D0","#E4DFE0","#E9E6ED","#EDEDFC"]},cork:{discrete:["#2C194C","#2B2254","#2B295C","#2A3265","#293A6D","#284275","#284A7C","#2A5284","#2F5C8D","#366493","#3F6C99","#49749F","#527CA4","#5E85AA","#688DB0","#7395B6","#7E9DBB","#8AA6C2","#99B1C9","#A5BBD0","#B2C5D7","#C0CFDE","#CDD9E5","#DCE5EB","#E5ECED","#E6EEEA","#E0EAE1","#D4E2D4","#C8DBC8","#BCD3BC","#B0CAB0","#A4C2A3","#95B895","#89B088","#7DA87D","#71A071","#669966","#599059","#4F894E","#458244","#3B7B3A","#317430","#266A25","#1F611D","#1A5816","#174E12","#14450E","#123A0A","#103107","#0F2903"],categorical:["#2C194C","#2B2254","#2B295C","#2A3265","#293A6D","#284275","#284A7C","#2A5284","#2F5C8D","#366493","#3F6C99","#49749F","#527CA4","#5E85AA","#688DB0","#7395B6","#7E9DBB","#8AA6C2","#99B1C9","#A5BBD0","#B2C5D7","#C0CFDE","#CDD9E5","#DCE5EB","#E5ECED","#E6EEEA","#E0EAE1","#D4E2D4","#C8DBC8","#BCD3BC","#B0CAB0","#A4C2A3","#95B895","#89B088","#7DA87D","#71A071","#669966","#599059","#4F894E","#458244","#3B7B3A","#317430","#266A25","#1F611D","#1A5816","#174E12","#14450E","#123A0A","#103107","#0F2903"]},corko:{discrete:["#3F3E3A","#3E3D3F","#3E3D44","#3E3D4B","#3E3F52","#3E425A","#3F4762","#414C6C","#445578","#485D82","#4E658B","#546E94","#5C779C","#6581A5","#6E8AAC","#7792B2","#809BB8","#89A3BD","#94ACC2","#9CB3C5","#A3BAC7","#A9C0C8","#AEC5C7","#B0C9C4","#B0CABF","#ADCAB9","#A9C9B2","#A2C5A8","#9BC19F","#93BC95","#8BB68B","#82B081","#78A775","#709F6A","#689760","#608E56","#5A864C","#537B42","#4F733B","#4B6B35","#486431","#465D2E","#44562C","#43512C","#424D2D","#42492E","#414630","#404333","#404036","#3F3E3A"],categorical:["#3F3E3A","#3E3D3F","#3E3D44","#3E3D4B","#3E3F52","#3E425A","#3F4762","#414C6C","#445578","#485D82","#4E658B","#546E94","#5C779C","#6581A5","#6E8AAC","#7792B2","#809BB8","#89A3BD","#94ACC2","#9CB3C5","#A3BAC7","#A9C0C8","#AEC5C7","#B0C9C4","#B0CABF","#ADCAB9","#A9C9B2","#A2C5A8","#9BC19F","#93BC95","#8BB68B","#82B081","#78A775","#709F6A","#689760","#608E56","#5A864C","#537B42","#4F733B","#4B6B35","#486431","#465D2E","#44562C","#43512C","#424D2D","#42492E","#414630","#404333","#404036","#3F3E3A"]},davos:{discrete:["#00054A","#010E51","#041459","#081C61","#0C2368","#102A6F","#133075","#17377C","#1C3F83","#204588","#244C8D","#295291","#2D5895","#335F98","#38649A","#3C699C","#416E9D","#46729D","#4C779D","#517B9C","#567F9B","#5A829A","#5F8598","#658996","#698C94","#6E8F92","#739290","#78968D","#7D998C","#829D8A","#88A089","#8DA488","#95AA87","#9BAF88","#A3B489","#ABBB8C","#B4C190","#BFCA96","#C9D29E","#D2D9A6","#DBE0AF","#E3E7B8","#EBEDC4","#F0F1CD","#F4F4D6","#F7F7DE","#FAF9E6","#FCFCF0","#FDFDF7","#FEFEFE"],categorical:["#00054A","#FDFDF4","#688B94","#2D5895","#B2C08F","#E8EBC0","#87A089","#133075","#4B769D","#5A829A","#204588","#76958E","#D0D8A4","#99AD88","#F6F6DB","#3C699C","#081C61","#031256","#1A3B7F","#537C9C","#A4B68A","#C1CC98","#7E9A8B","#FAFAE8","#356199","#0E266B","#DEE3B3","#274F90","#6F9091","#618697","#8FA588","#F0F1CD","#43709D","#1D4084","#47739D","#F3F4D4","#658996","#567F9B","#17367A","#FCFBEE","#4F799D","#C9D29E","#93A987","#39659B","#D8DEAB","#ABBB8C","#739290","#B9C693","#F8F8E1","#234A8C","#112B70","#7A978D","#9EB188","#315C97","#829D8A","#05175B","#010C50","#3F6C9D","#0B2065","#5D8499","#2A5392","#8BA388","#6B8D93","#EDEFC7","#E3E7B8","#22488A","#638897","#122E73","#00094D","#AEBD8D","#4D789D","#CDD5A1","#5F8598","#58819A","#071A5E","#0C2368","#18387D","#91A787","#37639A","#EBEDC4","#F2F2D0","#FBFBEB","#74938F","#2F5A96","#335F98","#809B8B","#BDC995","#49759D","#719191","#9BAF88","#F7F7DE","#1B3E82","#A8B88B","#849E89","#557E9B","#E6E9BC","#45719D","#1E4386","#96AB87","#89A188"]},devon:{discrete:["#2C1A4C","#2B1E51","#2B2356","#2A295B","#2A2D60","#293265","#29376A","#283B6E","#274174","#27467A","#274C7F","#275186","#28568C","#2A5C95","#2D609C","#3064A3","#3468AA","#396BB1","#3F70B9","#4774C0","#4F79C6","#597DCC","#6382D1","#6F88D7","#798CDB","#8290DF","#8C95E2","#969AE6","#9E9EE9","#A6A3EB","#ACA7ED","#B1ACEF","#B7B1F0","#BBB5F1","#BFB9F2","#C3BEF3","#C7C2F4","#CCC7F4","#D0CCF5","#D4D0F6","#D8D4F7","#DCD9F8","#E1DEF9","#E5E3FA","#E9E7FB","#EDECFB","#F2F0FC","#F7F6FD","#FBFAFE","#FFFFFF"],categorical:["#2C1A4C","#F8F8FE","#758AD9","#C6C0F3","#28568C","#29376A","#AAA5ED","#DEDCF8","#3D6EB7","#EBE9FB","#9197E4","#3063A2","#274579","#577CCB","#D2CEF6","#2A285A","#BAB3F1","#B2ADEF","#F2F0FC","#274E82","#2A2F62","#CCC7F4","#9E9EE9","#4875C1","#C0BAF2","#2B5D98","#3669AD","#2B2154","#E4E2FA","#8290DF","#D8D4F7","#6784D3","#283E71","#C9C4F4","#BDB7F1","#DBD8F8","#283A6D","#4F79C6","#A4A2EB","#EEEDFC","#CFCBF5","#E8E5FA","#5F80CF","#4272BC","#B6B0F0","#2B1D50","#AEA9EE","#275287","#2A2B5E","#989BE7","#293366","#27497D","#8A94E1","#295A92","#3266A7","#F5F4FD","#7B8DDC","#274174","#2D609C","#2B2558","#6F88D7","#E1DEF9","#3A6CB2","#D5D1F6","#C3BEF3","#2E629F","#3165A4","#8D95E3","#3468AA","#DAD6F7","#D1CDF5","#9B9CE8","#275084","#B8B2F0","#27477B","#6382D1","#4573BF","#A2A0EA","#F7F6FD","#C7C2F4","#F3F2FD","#274376","#8692E0","#2B1F52","#CAC6F4","#ACA7ED","#E3E0F9","#F0EEFC","#E6E4FA","#386AB0","#2C1C4E","#6B86D5","#28396B","#283C6F","#2A5C95","#2A2D60","#BEB9F2","#C2BCF2","#7E8FDD","#3F70B9"]},fes:{discrete:["#0D0D0D","#181818","#212121","#2B2B2B","#343434","#3C3C3C","#454545","#4D4D4D","#565656","#5E5E5E","#656565","#6D6D6D","#747474","#7C7C7C","#848484","#8B8B8B","#939393","#9C9C9C","#A7A7A7","#B1B1B1","#BBBBBB","#C5C5C5","#D1D1D1","#DFDFDF","#ECECEC","#094225","#184822","#2B4F20","#3A5420","#485822","#555B24","#615E26","#6F6229","#7A652B","#86682E","#926B30","#9F7035","#AD7940","#B6834D","#BD8E5C","#C2996C","#C6A47C","#CCB18F","#D1BCA0","#D5C6B0","#DACFC1","#DFD7CF","#E4DFE0","#E8E6ED","#EDEDFC"],categorical:["#0D0D0D","#181818","#212121","#2B2B2B","#343434","#3C3C3C","#454545","#4D4D4D","#565656","#5E5E5E","#656565","#6D6D6D","#747474","#7C7C7C","#848484","#8B8B8B","#939393","#9C9C9C","#A7A7A7","#B1B1B1","#BBBBBB","#C5C5C5","#D1D1D1","#DFDFDF","#ECECEC","#094225","#184822","#2B4F20","#3A5420","#485822","#555B24","#615E26","#6F6229","#7A652B","#86682E","#926B30","#9F7035","#AD7940","#B6834D","#BD8E5C","#C2996C","#C6A47C","#CCB18F","#D1BCA0","#D5C6B0","#DACFC1","#DFD7CF","#E4DFE0","#E8E6ED","#EDEDFC"]},glasgow:{discrete:["#361338","#3B1434","#401530","#45172C","#491828","#4D1924","#511B21","#561C1D","#5B1E18","#602014","#662210","#6B260B","#6F2B07","#723203","#743802","#743E01","#754300","#744900","#744F01","#745402","#735905","#725F0B","#716413","#70691E","#6E6E27","#6C7231","#6B763A","#697B46","#677F4F","#658359","#648763","#628B6C","#618F78","#609381","#60978A","#619B94","#659F9D","#6CA5A8","#74A9B0","#7DADB8","#86B1BF","#8EB4C6","#99B9CE","#A1BCD5","#AABFDB","#B2C3E1","#BBC6E7","#C6CBF0","#D0CFF7","#DBD3FF"],categorical:["#361338","#DBD3FF","#6D702B","#69A3A5","#702D06","#A0BBD3","#638968","#521B20","#745101","#84B0BE","#754001","#5F9587","#BBC6E7","#612013","#45172C","#687D4A","#726210","#618F78","#4B1926","#3E1532","#629C96","#658359","#CACCF3","#76AAB2","#6B763A","#744900","#6A250C","#ADC1DD","#735905","#92B6C9","#591D1A","#743702","#70681C","#4F1A23","#754400","#6D2909","#60998E","#41162F","#744D00","#745503","#B4C3E2","#697A42","#7DADB8","#628C70","#8BB3C3","#561C1D","#D2D0F9","#99B9CE","#3A1435","#6F6C23","#743B01","#60927F","#662210","#648661","#659F9D","#678051","#725E0A","#481829","#6FA6AB","#6C7332","#5D1E17","#A6BED8","#C2C9ED","#723203","#716617","#68240E","#6F6A20","#C6CBF0","#79ABB5","#72600D","#754200","#43162D","#67A1A1","#6B7536","#5F1F15","#735B07","#571C1B","#72A8AF","#744F01","#BEC8EA","#381337","#8EB4C6","#628B6C","#677E4D","#60917B","#639E9A","#4A1827","#A3BDD6","#3C1433","#743901","#632112","#B7C5E5","#4D1924","#65845D","#618E74","#609483","#9CBAD1","#46172A","#87B1C1","#6D712F"]},grayc:{discrete:["#000000","#090909","#111111","#171717","#1C1C1C","#212121","#252525","#2A2A2A","#303030","#343434","#393939","#3D3D3D","#424242","#474747","#4B4B4B","#505050","#545454","#585858","#5D5D5D","#616161","#656565","#696969","#6D6D6D","#717171","#757575","#797979","#7D7D7D","#818181","#858585","#898989","#8E8E8E","#929292","#979797","#9C9C9C","#A1A1A1","#A6A6A6","#ABABAB","#B1B1B1","#B6B6B6","#BCBCBC","#C1C1C1","#C7C7C7","#CECECE","#D5D5D5","#DBDBDB","#E2E2E2","#E8E8E8","#F1F1F1","#F8F8F8","#FFFFFF"],categorical:["#070707","#F9F9F9","#777777","#454545","#AEAEAE","#909090","#292929","#5F5F5F","#D1D1D1","#9E9E9E","#525252","#E4E4E4","#6C6C6C","#BFBFBF","#1A1A1A","#373737","#848484","#595959","#222222","#B6B6B6","#A6A6A6","#3E3E3E","#7D7D7D","#666666","#969696","#8A8A8A","#4B4B4B","#DADADA","#C8C8C8","#313131","#717171","#131313","#EFEFEF","#C4C4C4","#A2A2A2","#424242","#878787","#252525","#2D2D2D","#4F4F4F","#3B3B3B","#808080","#1E1E1E","#BBBBBB","#AAAAAA","#EAEAEA","#696969","#7A7A7A","#DFDFDF","#636363","#565656","#B2B2B2","#0E0E0E","#9A9A9A","#5C5C5C","#747474","#F3F3F3","#333333","#6E6E6E","#D5D5D5","#8D8D8D","#939393","#494949","#CCCCCC","#171717","#BDBDBD","#575757","#C1C1C1","#404040","#828282","#E2E2E2","#151515","#1C1C1C","#0B0B0B","#9C9C9C","#858585","#2F2F2F","#B4B4B4","#888888","#242424","#272727","#3C3C3C","#B0B0B0","#353535","#545454","#5B5B5B","#393939","#D7D7D7","#A4A4A4","#A8A8A8","#959595","#767676","#646464","#989898","#444444","#474747","#111111","#F6F6F6","#ECECEC","#4D4D4D"]},hawaii:{discrete:["#8C0273","#8E0D6E","#8F1569","#901D63","#91235F","#91285A","#922D56","#933252","#94384D","#943D4A","#954246","#964742","#964C3F","#97523B","#985638","#985C34","#996131","#9A662E","#9B6C2A","#9B7226","#9C7823","#9C7E20","#9D841E","#9D8C1C","#9C921C","#9B991D","#9AA021","#97A828","#94AE30","#91B439","#8CB942","#88BE4C","#82C359","#7EC663","#79CA6E","#74CE79","#70D183","#6AD591","#66D89C","#62DCA7","#60DFB2","#5FE2BD","#61E6CA","#67E9D5","#6FEBDE","#7AEEE7","#87EFEE","#98F1F5","#A6F1F9","#B3F2FD"],categorical:["#8C0273","#B3F2FD","#9C951C","#6CD48C","#964D3E","#8ABC48","#9B6D29","#66E8D3","#922E55","#9C801F","#87EFEE","#995D34","#7BC969","#901D63","#60DEB0","#96AA2B","#943D4A","#975439","#82C359","#5FE4C2","#9AA021","#73CE7B","#65D99E","#954544","#9D8A1C","#8E126B","#91B439","#9DF1F7","#73ECE2","#91265C","#9C7724","#9A652E","#93364F","#922A59","#996131","#9D851D","#9D901C","#9A692C","#68D695","#902160","#9B9A1E","#985836","#9B7226","#933252","#77CC72","#9C7B21","#954147","#8D0A6F","#93AF32","#62DCA7","#92F0F3","#8F1867","#7DEEE8","#97513C","#6CEBDB","#61E6CA","#A8F2FA","#964941","#7FC661","#86BF50","#98A526","#70D183","#5FE1B9","#8DB840","#94394D","#9C7923","#8F1569","#985A35","#60E0B4","#9A6B2A","#91245E","#97A828","#9B7425","#6AD591","#95AD2E","#5FE2BD","#60E5C6","#953F48","#933054","#63E7CF","#84C154","#8D0671","#82EFEB","#9B9D1F","#99A323","#88BE4C","#6ED288","#6FEBDE","#9A672D","#91285A","#75CD76","#995F32","#68E9D7","#9B7028","#61DDAB","#943B4B","#933450","#8DF0F0","#8F1A65","#81C45D"]},imola:{discrete:["#1A33B3","#1C37B1","#1E3AAF","#203EAD","#2242AB","#2345AA","#2548A8","#274CA6","#2950A4","#2A53A3","#2C56A1","#2E599F","#2F5D9E","#32609B","#346499","#366797","#386A95","#3B6C92","#3E708F","#41738C","#44768A","#467987","#4A7C85","#4E8082","#518480","#56887E","#5A8C7D","#5F927B","#64967A","#689B79","#6DA078","#72A576","#78AB75","#7DB074","#82B572","#87BA71","#8CBF70","#93C66E","#98CB6D","#9ED06C","#A4D66A","#ACDB69","#B5E268","#BFE767","#C8EB67","#D3F066","#DDF466","#EAF866","#F5FB66","#FFFF66"],categorical:["#1A33B3","#FFFF66","#54867F","#305E9D","#91C36F","#3F718E","#2549A8","#BDE667","#70A377","#2B53A2","#376896","#80B373","#A3D56B","#DDF466","#203EAD","#487B86","#62947A","#2D59A0","#88BB71","#5B8D7D","#CDED66","#4E8082","#EEF966","#33639A","#284EA5","#44768A","#2344AA","#AFDE69","#3B6C92","#78AB75","#1D39B0","#99CC6D","#699C79","#3D6F90","#2C56A1","#2F5B9E","#5E917B","#4B7D84","#9ED06C","#1F3CAE","#C4EA67","#84B772","#274CA6","#D5F066","#2951A4","#74A776","#578A7E","#2446A9","#1C36B1","#A9D96A","#95C86E","#467888","#2141AC","#7CAF74","#356598","#B5E268","#66987A","#396A94","#F7FC66","#8CBF70","#E6F666","#32609B","#518380","#41738C","#6DA078","#6B9E78","#B9E468","#7AAD74","#528580","#32629B","#86B971","#3C6E91","#5C8F7C","#C8EB67","#ACDB69","#D1EF66","#E2F566","#97CA6D","#1B35B2","#1C37B0","#2345AA","#2F5D9E","#1F3DAE","#457789","#3A6B93","#598B7D","#D9F266","#346499","#386995","#A6D76A","#366797","#274DA6","#56887E","#A1D36B","#42748B","#7EB173","#72A576","#477987","#4C7F83","#F2FB66"]},lajolla:{discrete:["#191900","#1E1B02","#221C05","#271E08","#2C200B","#31220E","#362411","#3C2614","#442817","#4B2B1B","#532D1F","#5B3023","#633328","#6E362D","#783932","#813C37","#8B3F3B","#96423F","#A24543","#AD4746","#B74A48","#C04D49","#C9514B","#D1564C","#D75C4D","#DB634E","#DD694F","#E0714F","#E17750","#E37D50","#E48351","#E58951","#E79052","#E89652","#E99C52","#EAA253","#EBA853","#EDAF54","#EEB555","#F0BC57","#F1C25A","#F3CA5F","#F5D369","#F7DA74","#F9E282","#FBE890","#FCEF9F","#FDF5B0","#FEFABE","#FFFECB"],categorical:["#191900","#FFFECB","#D85F4D","#ECAC54","#653329","#F7D971","#A44544","#E58751","#362411","#E1744F","#C44E4A","#E99A52","#4B2B1B","#833D38","#F1C159","#FCEF9F","#271E08","#FEF7B6","#402716","#D0554C","#FAE587","#E79052","#EFB655","#B54947","#201C04","#E37D50","#743830","#DD694F","#EBA353","#94413E","#572F21","#F4CD61","#2E210C","#FDF3AB","#32220F","#241D06","#F5D369","#7B3B34","#1D1B02","#F0BC57","#5E3125","#F8DF7C","#512D1E","#CA514B","#E48251","#E68C51","#EA9E53","#E89552","#BC4C49","#6C362C","#EDB154","#9C4341","#E27950","#FBEA93","#3B2513","#FEFBC0","#452918","#EBA853","#F2C75C","#8B3F3B","#DB644E","#AD4746","#DF6E4F","#D55A4D","#2B200A","#783932","#E79352","#D75C4D","#FEF9BB","#EDAF54","#E0714F","#7F3C36","#613227","#F7DC77","#C7504B","#F1C45A","#30210D","#F4D065","#1E1B03","#FAE78D","#F9E282","#DA614E","#392412","#4E2C1D","#E99C52","#EFB956","#221C05","#EBA553","#FDF5B0","#984240","#E38050","#8F403D","#542E20","#ECAA54","#E68E51","#70372E","#DE6C4F","#B94A48","#291F09","#1B1A01"]},lapaz:{discrete:["#1A0C64","#1C1368","#1E196D","#202071","#212675","#222B79","#23317D","#253681","#263C85","#274189","#29478C","#2A4C8F","#2C5192","#2E5795","#305C98","#32609A","#35659C","#386A9E","#3C70A0","#3F74A1","#4379A2","#487DA3","#4D81A3","#5386A4","#588AA3","#5E8EA3","#6591A2","#6C95A1","#7398A0","#7A9A9E","#809D9D","#879F9B","#90A199","#97A397","#9EA596","#A5A795","#ADAA95","#B7AD96","#BFB199","#C8B69C","#D2BBA2","#DAC1A8","#E4C9B2","#EBCFBB","#F1D5C4","#F5DBCD","#F9E1D6","#FBE8E1","#FDEDEA","#FEF2F3"],categorical:["#1A0C64","#FEF2F3","#5B8BA3","#B3AC96","#2C5292","#3C70A0","#EACEB9","#859E9C","#24327E","#6F96A1","#33619A","#202071","#D0BAA0","#9BA496","#F9E1D6","#4A7FA3","#284289","#90A199","#FCEAE5","#1D176B","#37699D","#F3D8C8","#A7A895","#5285A4","#7A9A9E","#2F5A97","#4278A2","#263A84","#6591A2","#C1B299","#DEC3AB","#222978","#2A4B8E","#5688A4","#D7BEA6","#FDEEEC","#608EA3","#EFD3C0","#A1A696","#6A94A1","#FBE6DD","#ADAA95","#F6DDCF","#4E82A3","#2E5695","#3A6D9F","#C8B69C","#1C1268","#232D7B","#3F74A1","#467BA3","#1E1C6E","#7F9C9D","#BAAF97","#253681","#315E99","#29478C","#E4C9B2","#74989F","#273E87","#212575","#95A398","#8AA09A","#35659C","#2B4F91","#23307C","#E7CBB5","#F1D5C4","#2B4D90","#202373","#588AA3","#D3BCA3","#5487A4","#447AA2","#6792A2","#24347F","#253882","#ECD0BD","#879F9B","#305C98","#E1C6AF","#1E196D","#5D8DA3","#AAA995","#386B9E","#487DA3","#77999F","#F7DFD3","#BEB098","#1F1E70","#325F99","#4176A2","#F4DACB","#4C80A3","#2D5494","#8DA099","#6C95A1","#FAE3DA","#FDECE8","#B7AD96"]},lipari:{discrete:["#031326","#05192F","#062038","#092844","#0C2E4D","#103557","#163C5F","#1E4368","#294B70","#345075","#3E5578","#47587A","#4F5B7B","#575C7A","#5D5D79","#635E78","#695E76","#6E5F75","#765F73","#7C6071","#826070","#89606E","#90616C","#98616A","#A06268","#A86266","#B06364","#BA6462","#C36660","#CB685F","#D46B5E","#DB705F","#E27760","#E77E63","#E98567","#EA8D6B","#EA946F","#E89C75","#E7A279","#E6A87E","#E5AF84","#E5B58A","#E6BD92","#E7C49A","#EACCA3","#EDD3AD","#F0DBB7","#F5E5C4","#F9EDCF","#FDF5DA"],categorical:["#031326","#FDF5DA","#A56267","#525B7A","#E99B74","#785F72","#DA6F5E","#183E61","#E7C398","#8D616D","#365176","#092844","#655E77","#E98466","#BF6561","#F0DBB7","#E5AD82","#B26364","#EBCFA7","#5C5D79","#061D35","#25486D","#0E3353","#EA906D","#98616A","#E37861","#E5B88C","#826070","#CD685F","#6E5F75","#45587A","#F6E8C9","#E7A37A","#615E78","#E77E63","#D46B5E","#9F6268","#E99570","#93616B","#87606E","#7D6071","#F3E1C0","#575C7A","#0B2D4B","#2D4D72","#E6A87E","#E9C99F","#FAEED1","#1E4368","#EA8A69","#B86462","#6A5E76","#AB6365","#735F74","#DF735F","#E5B287","#13385A","#05182D","#E6BD92","#3E5578","#EDD5AF","#07223C","#C6665F","#4C5A7A","#E8A077","#B56363","#FBF1D6","#A26267","#E6C095","#0A2A48","#F8EBCD","#EACCA3","#AE6364","#7A5F72","#635E78","#E98768","#041629","#715F74","#ECD2AB","#A86266","#8A606E","#96616B","#545C7A","#EFD8B3","#F5E5C4","#9B6169","#F2DEBB","#765F73","#6C5F75","#294B70","#22466B","#E89D76","#E88165","#BC6461","#E6A67C","#85606F","#C36660","#1B4064","#D06A5E","#103557"]},lisbon:{discrete:["#E6E5FF","#D8DCF7","#CBD2EF","#BBC6E5","#ADBCDE","#A0B3D6","#93A9CE","#86A0C6","#7794BD","#6A8BB5","#5E81AC","#5177A4","#456E9B","#38628F","#2F5984","#274F78","#20476D","#1B3F61","#173653","#142E48","#12283E","#112233","#111D2A","#121921","#15181B","#181A18","#1E1D17","#252419","#2D2B1C","#353220","#3E3A25","#46422A","#514C31","#5A5536","#645E3C","#6D6741","#777047","#837B4F","#8D8556","#988F5E","#A29A67","#ADA470","#B9B17D","#C3BC89","#CDC795","#D7D2A2","#E0DCAF","#ECE9BE","#F5F4CB","#FFFFD9"],categorical:["#E6E5FF","#D8DCF7","#CBD2EF","#BBC6E5","#ADBCDE","#A0B3D6","#93A9CE","#86A0C6","#7794BD","#6A8BB5","#5E81AC","#5177A4","#456E9B","#38628F","#2F5984","#274F78","#20476D","#1B3F61","#173653","#142E48","#12283E","#112233","#111D2A","#121921","#15181B","#181A18","#1E1D17","#252419","#2D2B1C","#353220","#3E3A25","#46422A","#514C31","#5A5536","#645E3C","#6D6741","#777047","#837B4F","#8D8556","#988F5E","#A29A67","#ADA470","#B9B17D","#C3BC89","#CDC795","#D7D2A2","#E0DCAF","#ECE9BE","#F5F4CB","#FFFFD9"]},managua:{discrete:["#FFCF67","#F9C564","#F3BB60","#EBB05D","#E5A659","#DF9D56","#D99554","#D38C51","#CC824D","#C67B4B","#C07348","#B96C46","#B36444","#AB5C41","#A4553F","#9D4F3D","#95483C","#8E423A","#843B39","#7C3639","#743139","#6D2D3A","#662A3D","#5F2941","#5A2846","#552A4C","#522C53","#4F315D","#4D3566","#4C3B6F","#4C4179","#4C4883","#4D518E","#4F5897","#51609F","#5367A7","#556FAE","#5878B6","#5B80BC","#5E88C2","#6190C8","#6498CE","#68A3D5","#6BACDB","#6FB5E1","#72BEE6","#76C7EC","#7AD3F3","#7DDDF9","#81E7FF"],categorical:["#FFCF67","#F9C564","#F3BB60","#EBB05D","#E5A659","#DF9D56","#D99554","#D38C51","#CC824D","#C67B4B","#C07348","#B96C46","#B36444","#AB5C41","#A4553F","#9D4F3D","#95483C","#8E423A","#843B39","#7C3639","#743139","#6D2D3A","#662A3D","#5F2941","#5A2846","#552A4C","#522C53","#4F315D","#4D3566","#4C3B6F","#4C4179","#4C4883","#4D518E","#4F5897","#51609F","#5367A7","#556FAE","#5878B6","#5B80BC","#5E88C2","#6190C8","#6498CE","#68A3D5","#6BACDB","#6FB5E1","#72BEE6","#76C7EC","#7AD3F3","#7DDDF9","#81E7FF"]},navia:{discrete:["#031327","#041930","#051E3A","#052546","#062B50","#06315A","#073764","#083E6D","#0B4578","#0E4C80","#115286","#15588B","#195E8E","#1E6491","#216991","#246D91","#27718F","#2A748E","#2D788C","#307A8A","#337D89","#368087","#398385","#3C8683","#3F8981","#428C7F","#468F7D","#4A937A","#4E9678","#529A76","#579E73","#5BA271","#62A86E","#67AD6B","#6EB269","#76B768","#7FBD68","#8CC56A","#98CB6F","#A4D176","#B1D67F","#BCDB89","#C9E096","#D3E3A1","#DCE7AC","#E3EAB6","#EAEDBF","#F1F0CA","#F7F2D2","#FCF4D9"],categorical:["#031327","#FCF4D9","#408A80","#87C269","#1B608F","#59A072","#073966","#D1E39F","#2F798B","#EAEDBF","#052546","#266F90","#6BB06A","#0E4D81","#AED57D","#4C947A","#378186","#DFE8B0","#337D89","#2A748E","#14578A","#051C36","#9ACC70","#0A4374","#468F7D","#529A76","#F4F1CD","#062F56","#C1DC8D","#206891","#78B968","#62A86E","#3C8583","#569D74","#236C91","#F8F3D3","#D8E5A8","#0C487B","#04182E","#71B469","#B8D985","#07345E","#05213E","#4F9778","#5DA470","#3E8882","#062A4E","#7FBD68","#EFEFC6","#C9E096","#115286","#2C768D","#1E6491","#49917B","#66AC6C","#28718F","#A4D176","#90C76C","#438C7F","#175C8D","#083E6D","#E5EAB8","#317B8A","#357F87","#398385","#B3D781","#0D4A7E","#1C6290","#052342","#579F73","#9FCE73","#448D7E","#051A32","#FAF3D6","#428B7F","#29738F","#104F84","#5FA66F","#509877","#8CC56A","#094071","#2D788C","#083B6A","#D5E4A3","#2B758D","#226A91","#04162B","#BCDB89","#47907C","#4D9579","#E2E9B4","#7BBB68","#6EB269","#135488","#4A937A","#F1F0CA","#5BA271","#C5DE92","#F6F2D0","#CDE19B"]},naviaw:{discrete:["#041427","#051A31","#05203B","#062747","#072D52","#08345C","#0A3A66","#0C416F","#0F4979","#135080","#175686","#1B5D8A","#1F628D","#23698F","#276D8F","#2A728F","#2D758E","#30798D","#347D8B","#378089","#3A8388","#3D8686","#408984","#448C82","#489080","#4B937E","#50977C","#559C79","#5AA077","#5FA575","#65AA73","#6CAF71","#76B671","#7FBD71","#89C474","#95CB78","#A2D27F","#B1D98A","#BEDF95","#C9E5A1","#D3E9AD","#DBEDB9","#E4F1C6","#E9F4D0","#EEF6D9","#F2F8E1","#F6FAE9","#F9FCF1","#FCFDF7","#FEFEFD"],categorical:["#041427","#FBFDF6","#478F80","#9FD07D","#1F628D","#64A973","#E3F0C4","#0A3A66","#337C8B","#C7E49E","#7DBC71","#549B7A","#2A718F","#135080","#F2F8E1","#3C8586","#062747","#D7EBB2","#418A83","#B4DB8C","#2E778D","#6FB271","#EBF5D4","#0E4574","#051D37","#4D957D","#256B8F","#195A88","#388189","#F7FAEC","#5CA276","#8CC574","#073056","#31798C","#367E8A","#69AD72","#E7F3CC","#104A7A","#95CB78","#EFF6DB","#0B406D","#2C748E","#4A927F","#DDEEBB","#50987C","#165584","#589E78","#76B671","#3F8785","#05192F","#BEDF95","#448C82","#22678E","#06223F","#A9D684","#08355E","#CFE8A8","#F9FCF1","#286E8F","#85C172","#072C50","#F5F9E7","#1C5F8B","#3A8387","#60A675","#F3F9E4","#0C4271","#266D8F","#81BE72","#0A3D6A","#4B937E","#9ACD7B","#EDF5D7","#90C876","#A4D381","#378089","#1B5D8A","#489080","#145282","#DAECB6","#67AB73","#CBE6A3","#B9DD90","#3D8686","#23698F","#6CAF71","#FAFCF3","#79B971","#D3E9AD","#5AA077","#458E81","#72B471","#327B8C","#E5F1C8","#051B33","#F8FBEE","#062443","#398288","#2B728F","#06294C"]},nuuk:{discrete:["#05598C","#0E5B8B","#155C89","#1C5E87","#226085","#276184","#2C6383","#326682","#386982","#3E6C82","#446F82","#4A7283","#517584","#587A86","#5F7D88","#66818A","#6C858C","#73898E","#7B8E91","#819192","#879594","#8D9996","#939C97","#99A097","#9EA498","#A2A798","#A6AA97","#ABAD96","#AEAF95","#B1B194","#B3B492","#B6B690","#B8B88E","#BABA8C","#BDBC8A","#BFBE88","#C1C187","#C4C385","#C7C684","#CAC983","#CDCD83","#D2D184","#D7D787","#DDDD8B","#E3E290","#E8E895","#EEEE9C","#F4F4A4","#F9F9AB","#FEFEB2"],categorical:["#05598C","#FEFEB2","#A1A698","#537785","#C3C385","#B5B591","#7D8F91","#2D6483","#DDDD8B","#919B96","#BCBC8B","#3F6C82","#CDCD83","#1C5E87","#ADAE95","#68838B","#EEEE9C","#A7AA97","#879594","#C8C783","#F6F6A7","#135C89","#B9B98E","#497183","#73898E","#366882","#C0BF88","#D4D486","#99A097","#B1B293","#5E7D88","#256185","#E6E693","#829293","#788C90","#9DA398","#AAAC96","#E1E18F","#3B6A82","#638089","#B3B492","#A4A897","#446F82","#BABA8C","#D8D888","#185D88","#8C9895","#215F86","#BEBD89","#B7B78F","#CACA83","#4E7484","#C1C186","#959E97","#F2F2A1","#AFB094","#326682","#587A86","#296284","#FAFAAD","#6E868C","#C5C584","#D1D084","#0D5B8B","#E9E997","#DFDF8D","#66818A","#B0B194","#5B7B87","#2B6383","#859493","#CCCB83","#F8F8AA","#D2D285","#1F5F86","#70878D","#4B7383","#768B8F","#FCFCAF","#A9AB97","#BFBE88","#C9C983","#346782","#DBDA89","#236085","#BDBD8A","#BAB98D","#B8B88E","#2F6583","#939C97","#9FA498","#A2A798","#CFCF84","#B4B591","#C4C485","#979F97","#F0F09E","#155C89","#9BA298","#517584"]},oleron:{discrete:["#1A2659","#212E61","#293568","#323F72","#3A477A","#424F82","#4A578A","#535F92","#5D699C","#6572A5","#6E7BAE","#7784B7","#808DC0","#8B97CA","#94A1D3","#9DAADC","#A6B3E5","#AFBCEC","#B9C6F2","#C0CDF5","#C7D4F7","#CEDAF9","#D4E1FB","#DCE9FD","#E3F0FE","#1F4E00","#2C5100","#3A5600","#445900","#4F5C02","#5A6005","#65660C","#736D18","#7E7423","#8A7B2E","#94823A","#9F8945","#AC9253","#B79A5E","#C3A36A","#CEAC75","#D9B581","#E5C090","#EDC99D","#F2D2A9","#F6DAB5","#F8E2C0","#FAECCE","#FBF4DA","#FDFDE6"],categorical:["#1A2659","#212E61","#293568","#323F72","#3A477A","#424F82","#4A578A","#535F92","#5D699C","#6572A5","#6E7BAE","#7784B7","#808DC0","#8B97CA","#94A1D3","#9DAADC","#A6B3E5","#AFBCEC","#B9C6F2","#C0CDF5","#C7D4F7","#CEDAF9","#D4E1FB","#DCE9FD","#E3F0FE","#1F4E00","#2C5100","#3A5600","#445900","#4F5C02","#5A6005","#65660C","#736D18","#7E7423","#8A7B2E","#94823A","#9F8945","#AC9253","#B79A5E","#C3A36A","#CEAC75","#D9B581","#E5C090","#EDC99D","#F2D2A9","#F6DAB5","#F8E2C0","#FAECCE","#FBF4DA","#FDFDE6"]},oslo:{discrete:["#010101","#04070B","#060C13","#0A121B","#0C1620","#0D1927","#0E1D2D","#0F2133","#10263C","#112A43","#122E4A","#133251","#153758","#173C61","#194169","#1B4670","#1E4A78","#214F80","#255589","#295A91","#2E5F99","#3364A1","#3A6AA9","#4371B2","#4B77B9","#537DBE","#5B83C3","#6489C6","#6B8EC8","#7292C9","#7896C9","#7E9ACA","#859ECA","#8BA2C9","#91A6C9","#97A9C9","#9DADC9","#A4B2CA","#AAB6CA","#B1BBCB","#B8BFCD","#BFC5CF","#C7CCD3","#CFD2D8","#D7D9DD","#DEE0E2","#E6E7E9","#EFF0F1","#F7F7F8","#FFFFFF"],categorical:["#030609","#F9F9F9","#507BBC","#163B5E","#A0AFC9","#7B98CA","#27588E","#0E2032","#CACED5","#122D48","#3767A6","#1D4875","#8DA3C9","#E2E3E5","#678BC7","#B4BDCC","#0C151F","#BFC5CF","#97A9C9","#4371B2","#10263D","#080E16","#7292C9","#215081","#2E5F99","#AAB6CA","#ECEDEE","#0D1A28","#143454","#D5D8DC","#5B83C3","#19426A","#859ECA","#13314E","#0E1D2D","#3D6CAC","#6C8FC8","#7795C9","#F3F3F4","#4976B8","#245488","#DBDDE0","#112A43","#92A6C9","#C5C9D2","#809BCA","#0F2337","#3263A0","#050A10","#B9C1CD","#1F4C7B","#183E64","#A5B3CA","#0A121B","#9CACC9","#6187C5","#0D1824","#8AA1CA","#2A5B93","#547EBF","#D1D3D9","#E6E7E9","#1B456F","#B0BACB","#153758","#7494C9","#D8DADE","#6A8DC8","#90A5C9","#99ABC9","#235285","#133251","#060C13","#406EAF","#7E9ACA","#173C61","#4C78BA","#122F4B","#1C4772","#87A0CA","#CED1D7","#C2C7D1","#0F253A","#2C5D96","#C7CCD3","#112B45","#EFF0F1","#6F90C9","#0E1E2F","#ADB8CB","#7997CA","#4673B5","#15395B","#091018","#194067","#30619C","#94A8C9","#F6F6F6","#0F2135","#A3B1CA"]},roma:{discrete:["#7E1700","#832504","#883008","#8F3C0C","#934610","#984E14","#9C5717","#A05F1B","#A5681F","#A97023","#AD7826","#B0802B","#B58930","#BA9437","#BE9D3E","#C2A647","#C7B051","#CBBA5D","#CFC66D","#D1CF7B","#D2D78A","#D2DE98","#D0E4A6","#CBE8B4","#C4EABE","#BDEAC6","#B3E9CD","#A6E6D2","#9BE2D5","#8EDDD7","#81D7D7","#74CFD6","#64C6D5","#59BDD2","#4FB5D0","#46ACCC","#3EA4C9","#379AC5","#3292C2","#2E8ABF","#2B82BB","#287AB8","#2471B4","#2269B0","#1F60AD","#1C58A9","#194FA5","#1344A0","#0C3B9C","#033198"],categorical:["#7E1700","#832504","#883008","#8F3C0C","#934610","#984E14","#9C5717","#A05F1B","#A5681F","#A97023","#AD7826","#B0802B","#B58930","#BA9437","#BE9D3E","#C2A647","#C7B051","#CBBA5D","#CFC66D","#D1CF7B","#D2D78A","#D2DE98","#D0E4A6","#CBE8B4","#C4EABE","#BDEAC6","#B3E9CD","#A6E6D2","#9BE2D5","#8EDDD7","#81D7D7","#74CFD6","#64C6D5","#59BDD2","#4FB5D0","#46ACCC","#3EA4C9","#379AC5","#3292C2","#2E8ABF","#2B82BB","#287AB8","#2471B4","#2269B0","#1F60AD","#1C58A9","#194FA5","#1344A0","#0C3B9C","#033198"]},romao:{discrete:["#733957","#773850","#7A3849","#7E3942","#823C3D","#863F38","#8A4334","#8E4831","#94502E","#98572C","#9D5F2B","#A3672C","#A8712E","#AF7D32","#B58837","#BB933F","#C19F47","#C6AA52","#CDB761","#D1C26E","#D4CB7B","#D6D388","#D5D995","#D3DEA3","#CEE0AD","#C8E1B6","#C1E1BE","#B6DEC5","#ABDBC9","#A0D6CC","#94D0CE","#88C9CF","#7BC0CE","#70B8CD","#67AFCA","#5FA6C7","#589CC4","#5291BE","#4F88B9","#4E7EB3","#4F75AC","#516BA4","#55609A","#595891","#5D5087","#62497D","#664474","#6B3F69","#6F3B60","#723959"],categorical:["#733957","#773850","#7A3849","#7E3942","#823C3D","#863F38","#8A4334","#8E4831","#94502E","#98572C","#9D5F2B","#A3672C","#A8712E","#AF7D32","#B58837","#BB933F","#C19F47","#C6AA52","#CDB761","#D1C26E","#D4CB7B","#D6D388","#D5D995","#D3DEA3","#CEE0AD","#C8E1B6","#C1E1BE","#B6DEC5","#ABDBC9","#A0D6CC","#94D0CE","#88C9CF","#7BC0CE","#70B8CD","#67AFCA","#5FA6C7","#589CC4","#5291BE","#4F88B9","#4E7EB3","#4F75AC","#516BA4","#55609A","#595891","#5D5087","#62497D","#664474","#6B3F69","#6F3B60","#723959"]},tofino:{discrete:["#DED9FF","#D0CFF9","#C3C6F3","#B3BBEC","#A6B1E6","#98A8E1","#8B9FDB","#7E95D4","#6E89CB","#617FC3","#5575B8","#4A6BAC","#4262A0","#395790","#334F83","#2E4776","#293F6A","#24385D","#1F304F","#1B2943","#172338","#141D2E","#111824","#0F151B","#0D1516","#0D1712","#0F1B12","#112113","#142716","#162F19","#1A361C","#1D3E20","#224825","#26512A","#2A5A2E","#2E6233","#336C38","#39773E","#3F8144","#488B4A","#529551","#5FA059","#70AB63","#7FB46B","#8EBD73","#9DC57B","#ACCD83","#BDD68C","#CCDE94","#DBE69B"],categorical:["#DED9FF","#D0CFF9","#C3C6F3","#B3BBEC","#A6B1E6","#98A8E1","#8B9FDB","#7E95D4","#6E89CB","#617FC3","#5575B8","#4A6BAC","#4262A0","#395790","#334F83","#2E4776","#293F6A","#24385D","#1F304F","#1B2943","#172338","#141D2E","#111824","#0F151B","#0D1516","#0D1712","#0F1B12","#112113","#142716","#162F19","#1A361C","#1D3E20","#224825","#26512A","#2A5A2E","#2E6233","#336C38","#39773E","#3F8144","#488B4A","#529551","#5FA059","#70AB63","#7FB46B","#8EBD73","#9DC57B","#ACCD83","#BDD68C","#CCDE94","#DBE69B"]},tokyo:{discrete:["#1C0E34","#241036","#2D1339","#37163D","#3F1A40","#481E43","#4F2345","#562948","#5D304A","#62354C","#663B4D","#69404E","#6B454F","#6D4B50","#6E4F50","#6F5251","#6F5651","#705951","#715C52","#715F52","#716252","#726452","#726753","#736B53","#736E53","#747153","#757554","#757A54","#767E55","#778355","#788856","#798E57","#7B9558","#7C9B5A","#7EA25C","#81A95E","#84B062","#88B968","#8DC16E","#93CA76","#9BD27F","#A4DA8A","#AFE398","#BAEAA4","#C5EFB0","#CFF4BB","#D8F7C5","#E2F9CF","#E9FBD7","#EFFCDD"],categorical:["#1C0E34","#EFFCDD","#747053","#6C4750","#87B666","#B8E8A1","#512446","#715D52","#798B56","#7D9F5B","#37163D","#726653","#99D07D","#63374C","#6F5451","#D8F7C5","#767C54","#705951","#5B2D49","#7B9558","#441D41","#291238","#E5FAD2","#C9F1B4","#716252","#81AA5F","#683F4E","#736B53","#6E4E50","#757654","#8EC370","#A7DD8E","#778455","#747354","#84B062","#231036","#93CA76","#DFF9CC","#30143A","#A0D785","#7FA45D","#EAFBD8","#6A434F","#C1EDAB","#736D53","#562948","#6D4B50","#7A9057","#7C9A59","#4B2044","#715F52","#663B4D","#D1F4BD","#705651","#8ABD6A","#6E5151","#AFE398","#5F324B","#757954","#3E193F","#726853","#726452","#778055","#705B52","#788756","#61344C","#746E53","#ABE093","#532747","#85B364","#7EA25C","#261137","#736C53","#E8FBD5","#4E2245","#88B968","#798E57","#767E55","#726753","#757754","#715E52","#3A183E","#6E4F51","#778255","#7B9759","#DCF8C9","#EDFCDA","#411B40","#7D9C5A","#767B54","#726352","#6F5551","#726552","#82AD60","#D5F6C1","#34153C","#9CD481","#747454","#C5EFB0","#481E43"]},turku:{discrete:["#000000","#090908","#111110","#181816","#1D1D1A","#22221F","#272723","#2C2C27","#33322B","#38382F","#3D3D32","#424235","#474738","#4E4D3C","#53523E","#585841","#5D5D43","#626246","#686848","#6E6D4B","#73724D","#797750","#7F7D52","#878356","#8E8859","#968E5C","#9D9360","#A79864","#AF9C68","#B69F6C","#BEA270","#C4A474","#CCA579","#D1A67D","#D7A781","#DBA886","#E0A98B","#E6AB92","#EAAD98","#EFB09F","#F2B4A7","#F6B9AE","#F9BFB7","#FBC4BF","#FDC9C6","#FECFCC","#FED4D3","#FFDBDA","#FFE0E0","#FFE6E6"],categorical:["#070707","#FFE6E6","#948D5B","#E5AA90","#4D4C3B","#2C2C27","#C3A374","#6D6C4A","#FBC4BF","#D6A780","#F2B4A7","#1C1C19","#3D3D32","#AC9A67","#7E7C52","#FED6D4","#5D5D43","#35342D","#DDA888","#141312","#55543F","#242420","#FDCDCA","#F7BCB3","#898456","#B8A06D","#ECAE9B","#CDA57A","#FFDEDD","#646447","#454537","#9F9461","#76744E","#71704C","#30302A","#414135","#181816","#FCC8C4","#EFB1A1","#838054","#F5B8AD","#E1A98C","#C8A477","#686848","#595941","#20201D","#8E8859","#D1A67D","#B29D6A","#E9AC95","#BEA270","#FED1CF","#0E0E0D","#A59764","#DAA784","#282823","#F9C0B9","#51503D","#393930","#FFDAD9","#49493A","#606045","#FFE2E1","#9A915E","#797750","#F4B6AA","#F6BAB0","#CBA578","#FFD8D6","#FECFCC","#262622","#C0A272","#868255","#1A1A18","#FAC2BC","#8B8658","#E3AA8E","#161614","#4F4E3C","#C6A475","#2E2E28","#BBA16F","#6B6A49","#E7AB93","#CFA67C","#626246","#53523E","#5B5B42","#FED3D1","#7C7A51","#817E53","#73724D","#FFDCDB","#37372E","#F8BEB6","#0B0B0A","#575740","#DFA98A","#474738","#B59F6C"]},vanimo:{discrete:["#FFCDFD","#F7BEF2","#F0B0E8","#E6A0DC","#DE93D2","#D786C8","#CF7ABF","#C76FB5","#BD63AA","#B45AA1","#AB5198","#A1498E","#964184","#883977","#7C326B","#6E2C60","#612654","#542148","#451C3B","#391931","#2F1728","#281521","#22141C","#1D1417","#1A1414","#191612","#191811","#1B1D11","#1D2212","#212913","#253014","#2B3916","#324419","#384D1B","#3F561E","#456021","#4C6924","#547427","#5A7C2A","#60852E","#678E32","#6E9737","#77A33F","#7FAE47","#88BA51","#92C65D","#9CD26B","#A9E27F","#B3EF92","#BEFDA5"],categorical:["#FFCDFD","#F7BEF2","#F0B0E8","#E6A0DC","#DE93D2","#D786C8","#CF7ABF","#C76FB5","#BD63AA","#B45AA1","#AB5198","#A1498E","#964184","#883977","#7C326B","#6E2C60","#612654","#542148","#451C3B","#391931","#2F1728","#281521","#22141C","#1D1417","#1A1414","#191612","#191811","#1B1D11","#1D2212","#212913","#253014","#2B3916","#324419","#384D1B","#3F561E","#456021","#4C6924","#547427","#5A7C2A","#60852E","#678E32","#6E9737","#77A33F","#7FAE47","#88BA51","#92C65D","#9CD26B","#A9E27F","#B3EF92","#BEFDA5"]},vik:{discrete:["#001261","#011A66","#02226B","#022B71","#023376","#023A7B","#034280","#034A85","#06548B","#0B5D91","#136697","#1E6F9D","#2B79A4","#3C85AC","#4B90B3","#5A9ABA","#6AA4C1","#7AAEC8","#8DBAD0","#9DC4D6","#ADCDDD","#BDD6E3","#CCDFE8","#DEE6E9","#E8E7E5","#EEE3DC","#EEDBD0","#EBD0C0","#E7C6B2","#E3BCA5","#DFB298","#DBA88B","#D69D7C","#D29470","#CE8B64","#CA8258","#C6794C","#C26E3F","#BE6533","#B85C28","#B2511D","#A94512","#9C3709","#912D06","#872406","#7E1D06","#741506","#6A0D07","#620607","#590008"],categorical:["#001261","#011A66","#02226B","#022B71","#023376","#023A7B","#034280","#034A85","#06548B","#0B5D91","#136697","#1E6F9D","#2B79A4","#3C85AC","#4B90B3","#5A9ABA","#6AA4C1","#7AAEC8","#8DBAD0","#9DC4D6","#ADCDDD","#BDD6E3","#CCDFE8","#DEE6E9","#E8E7E5","#EEE3DC","#EEDBD0","#EBD0C0","#E7C6B2","#E3BCA5","#DFB298","#DBA88B","#D69D7C","#D29470","#CE8B64","#CA8258","#C6794C","#C26E3F","#BE6533","#B85C28","#B2511D","#A94512","#9C3709","#912D06","#872406","#7E1D06","#741506","#6A0D07","#620607","#590008"]},viko:{discrete:["#4F1A3D","#4B1D43","#48214A","#432653","#3F2C5B","#3C3263","#38396C","#354174","#334B7F","#345487","#365E8F","#3B6797","#42719E","#4D7DA6","#5787AD","#6391B4","#709ABA","#7DA4BF","#8EAEC4","#9BB5C7","#A9BBC8","#B5C0C8","#C0C2C5","#CBC2BF","#D2C0B8","#D6BDAF","#D9B7A6","#D9AF99","#D8A88D","#D6A082","#D39776","#CF8D6B","#C8825D","#C27752","#BB6D47","#B3623D","#AA5633","#9F492A","#953E25","#8C3521","#822C1F","#7A251E","#721F1F","#6B1A21","#661824","#611627","#5C152B","#571631","#531736","#50193C"],categorical:["#4F1A3D","#4B1D43","#48214A","#432653","#3F2C5B","#3C3263","#38396C","#354174","#334B7F","#345487","#365E8F","#3B6797","#42719E","#4D7DA6","#5787AD","#6391B4","#709ABA","#7DA4BF","#8EAEC4","#9BB5C7","#A9BBC8","#B5C0C8","#C0C2C5","#CBC2BF","#D2C0B8","#D6BDAF","#D9B7A6","#D9AF99","#D8A88D","#D6A082","#D39776","#CF8D6B","#C8825D","#C27752","#BB6D47","#B3623D","#AA5633","#9F492A","#953E25","#8C3521","#822C1F","#7A251E","#721F1F","#6B1A21","#661824","#611627","#5C152B","#571631","#531736","#50193C"]}};function lr(a){const e=a.replace("#","");return{r:parseInt(e.slice(0,2),16),g:parseInt(e.slice(2,4),16),b:parseInt(e.slice(4,6),16)}}const cr={waves:"batlow",blksand:"tokyo",breeze:"imola",magma:"batlow",ribbon:"hawaii",stars:"batlow",folds:"imola"},dr={[rr.ADVERT]:1,[rr.TXT_MSG]:4,[rr.GRP_TXT]:2,[rr.RESPONSE]:8,[rr.REQ]:13,[rr.ANON_REQ]:7,[rr.ACK]:11,[rr.PATH]:24,[rr.TRACE]:16,[rr.GRP_DATA]:34,[rr.MULTIPART]:52,[rr.RAW_CUSTOM]:14};function ur(){let a="waves",e=!0;if("undefined"!=typeof window){a=localStorage.getItem("pymc-color-scheme")||"waves";const n=fa(a);e=(null==n?void 0:n.meta.isDark)??!0}const n=cr[a]??"batlow",o=ir[n],t=o.discrete.length,r=Math.floor(t/2);return{colormap:o,colormapName:n,isDark:e,baseIndex:e?r:0,halfSize:r}}let hr=null;function mr(a){const{colormap:e,isDark:n}=ur();if("number"!=typeof a)return n?"#A5A5A5":"#666666";const o=dr[a];if(void 0===o)return n?"#A5A5A5":"#666666";const t=e.categorical;return t[Math.min(o,t.length-1)]}function pr(a){const e=mr(a);return null===hr&&(hr=E()),hr?function(a){return E()?D(a):a}(e):e}function gr(a){return lr(mr(a))}function br(a){return null==a?"UNKNOWN":or[a]||`TYPE_${a}`}function fr(a){return null==a?"UNKNOWN":tr[a]||`ROUTE_${a}`}function yr(a,e){return(Math.max(a,e)+.05)/(Math.min(a,e)+.05)}function vr(a){const e=function(a){const e=a.replace("#",""),n=parseInt(e.slice(0,2),16)/255,o=parseInt(e.slice(2,4),16)/255,t=parseInt(e.slice(4,6),16)/255,r=a=>a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4);return.2126*r(n)+.7152*r(o)+.0722*r(t)}(a);return yr(e,1)>yr(e,0)?"light":"dark"}function wr(a){return 1===a||!0===a}const kr=i("inline-flex items-center gap-1","radius-badge px-1.5 py-0.5","text-xs"),xr={fontFamily:"var(--font-badge)",fontWeight:"var(--font-badge-weight)",textTransform:"var(--badge-text-transform, none)"},jr={red:"var(--sys-red)",orange:"var(--sys-orange)",amber:"var(--sys-amber)",yellow:"var(--sys-yellow)",lime:"var(--sys-green)",green:"var(--sys-green)",emerald:"var(--sys-green)",teal:"var(--sys-teal)",cyan:"var(--sys-cyan)",sky:"var(--sys-cyan)",blue:"var(--sys-blue)",indigo:"var(--sys-indigo)",violet:"var(--sys-indigo)",purple:"var(--sys-purple)",fuchsia:"var(--sys-pink)",pink:"var(--sys-pink)",rose:"var(--sys-red)",brown:"var(--sys-brown)",zinc:"var(--text-muted)"};function zr(a){if(!a.startsWith("var("))return a;if("undefined"!=typeof window){const e=a.match(/var\((--[^,)]+)/);if(e){const a=getComputedStyle(document.documentElement).getPropertyValue(e[1]).trim();if(a&&a.startsWith("#"))return a}}return"#666666"}function Cr({color:a="zinc",customColor:e,filled:n=!1,compact:o=!1,className:s,title:l,children:c}){const d=t.useMemo(()=>{const o=e??jr[a];if(n){if(e){const a=vr(zr(e));return{backgroundColor:e,color:"light"===a?"rgba(255,255,255,0.95)":"rgba(0,0,0,0.85)"}}return{backgroundColor:o,color:["amber","yellow","lime"].includes(a)?"rgba(0,0,0,0.85)":"rgba(255,255,255,0.95)"}}return{backgroundColor:`color-mix(in srgb, ${o} 15%, transparent)`,color:o}},[a,e,n]);return r.jsx("span",{className:i(kr,o&&"!px-1 !py-0 !text-[10px]",s),style:{...xr,...d},title:l,children:c})}const Ar=t.forwardRef(function({color:a="zinc",customColor:e,filled:n=!1,compact:o=!1,className:s,children:c,...d},u){const h=t.useMemo(()=>{const o=e??jr[a];if(n){if(e){const a=vr(zr(e));return{backgroundColor:e,color:"light"===a?"rgba(255,255,255,0.95)":"rgba(0,0,0,0.85)"}}return{backgroundColor:o,color:["amber","yellow","lime"].includes(a)?"rgba(0,0,0,0.85)":"rgba(255,255,255,0.95)"}}return{backgroundColor:`color-mix(in srgb, ${o} 15%, transparent)`,color:o}},[a,e,n]),m=i(kr,o&&"!px-1 !py-0 !text-[10px]","interactive hover-opacity",s);return"href"in d&&void 0!==d.href?r.jsx(nr,{...d,ref:u,className:m,style:{...xr,...h},children:c}):r.jsx(l,{...d,ref:u,className:m,style:{...xr,...h},children:c})}),Dr=i("relative inline-flex items-center justify-center gap-2","text-sm font-medium whitespace-nowrap","radius-inner px-3 py-1.5","ring-focus","disabled:opacity-40 disabled:pointer-events-none disabled:cursor-not-allowed","transition-base","[&>[data-slot=icon]]:w-4 [&>[data-slot=icon]]:h-4 [&>[data-slot=icon]]:shrink-0"),Er={primary:i("bg-accent-primary text-white","hover:bg-accent-primary/90","active:bg-accent-primary/80","border border-accent-primary/20"),success:i("bg-accent-success text-white","hover:bg-accent-success/90","active:bg-accent-success/80","border border-accent-success/20"),danger:i("bg-accent-danger text-white","hover:bg-accent-danger/90","active:bg-accent-danger/80","border border-accent-danger/20"),warning:i("bg-accent-secondary text-bg-body","hover:bg-accent-secondary/90","active:bg-accent-secondary/80","border border-accent-secondary/20"),muted:i("bg-bg-elevated text-text-primary","hover:bg-bg-subtle","active:bg-bg-elevated","border border-border-subtle")},Br={primary:i("bg-transparent text-accent-primary","border border-accent-primary/30","hover:bg-accent-primary/10 hover:border-accent-primary/50","active:bg-accent-primary/20"),success:i("bg-transparent text-accent-success","border border-accent-success/30","hover:bg-accent-success/10 hover:border-accent-success/50","active:bg-accent-success/20"),danger:i("bg-transparent text-accent-danger","border border-accent-danger/30","hover:bg-accent-danger/10 hover:border-accent-danger/50","active:bg-accent-danger/20"),warning:i("bg-transparent text-accent-secondary","border border-accent-secondary/30","hover:bg-accent-secondary/10 hover:border-accent-secondary/50","active:bg-accent-secondary/20"),muted:i("bg-transparent text-text-muted","border border-border-subtle","hover:bg-bg-subtle hover:text-text-primary hover:border-border-strong","active:bg-bg-elevated")},Fr={primary:i("bg-transparent text-accent-primary border-transparent","hover:bg-accent-primary/10","active:bg-accent-primary/20"),success:i("bg-transparent text-accent-success border-transparent","hover:bg-accent-success/10","active:bg-accent-success/20"),danger:i("bg-transparent text-accent-danger border-transparent","hover:bg-accent-danger/10","active:bg-accent-danger/20"),warning:i("bg-transparent text-accent-secondary border-transparent","hover:bg-accent-secondary/10","active:bg-accent-secondary/20"),muted:i("bg-transparent text-text-muted border-transparent","hover:bg-bg-subtle hover:text-text-primary","active:bg-bg-elevated")},qr=t.forwardRef(function({color:a="muted",outline:e=!1,plain:n=!1,className:o,children:t,...s},c){const d=i(Dr,n?Fr[a]:e?Br[a]:Er[a],o);return"href"in s&&void 0!==s.href?r.jsx(nr,{...s,ref:c,className:d,children:t}):r.jsx(l,{...s,ref:c,className:d,children:t})}),Sr=a=>{const e=(a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(a,e,n)=>n?n.toUpperCase():e.toLowerCase()))(a);return e.charAt(0).toUpperCase()+e.slice(1)},Mr=(...a)=>a.filter((a,e,n)=>Boolean(a)&&""!==a.trim()&&n.indexOf(a)===e).join(" ").trim(),Tr=a=>{for(const e in a)if(e.startsWith("aria-")||"role"===e||"title"===e)return!0};var Pr={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Lr=t.forwardRef(({color:a="currentColor",size:e=24,strokeWidth:n=2,absoluteStrokeWidth:o,className:r="",children:s,iconNode:i,...l},c)=>t.createElement("svg",{ref:c,...Pr,width:e,height:e,stroke:a,strokeWidth:o?24*Number(n)/Number(e):n,className:Mr("lucide",r),...!s&&!Tr(l)&&{"aria-hidden":"true"},...l},[...i.map(([a,e])=>t.createElement(a,e)),...Array.isArray(s)?s:[s]])),Rr=(a,e)=>{const n=t.forwardRef(({className:n,...o},r)=>{return t.createElement(Lr,{ref:r,iconNode:e,className:Mr(`lucide-${s=Sr(a),s.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${a}`,n),...o});var s});return n.displayName=Sr(a),n},Nr=Rr("chart-column",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]]),Ir=Rr("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]),_r=Rr("clock",[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]),Vr=Rr("expand",[["path",{d:"m15 15 6 6",key:"1s409w"}],["path",{d:"m15 9 6-6",key:"ko1vev"}],["path",{d:"M21 16v5h-5",key:"1ck2sf"}],["path",{d:"M21 8V3h-5",key:"1qoq8a"}],["path",{d:"M3 16v5h5",key:"1t08am"}],["path",{d:"m3 21 6-6",key:"wwnumi"}],["path",{d:"M3 8V3h5",key:"1ln10m"}],["path",{d:"M9 9 3 3",key:"v551iv"}]]),Or=Rr("file-text",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]),$r=Rr("gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]),Wr=Rr("ghost",[["path",{d:"M9 10h.01",key:"qbtxuw"}],["path",{d:"M15 10h.01",key:"1qmjsl"}],["path",{d:"M12 2a8 8 0 0 0-8 8v12l3-3 2.5 2.5L12 19l2.5 2.5L17 19l3 3V10a8 8 0 0 0-8-8z",key:"uwwb07"}]]),Ur=Rr("layout-dashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]),Hr=Rr("layout-list",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}],["path",{d:"M14 4h7",key:"3xa0d5"}],["path",{d:"M14 9h7",key:"1icrd9"}],["path",{d:"M14 15h7",key:"1mj8o2"}],["path",{d:"M14 20h7",key:"11slyb"}]]),Yr=Rr("log-out",[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]]),Gr=Rr("map-pin-plus",[["path",{d:"M19.914 11.105A7.298 7.298 0 0 0 20 10a8 8 0 0 0-16 0c0 4.993 5.539 10.193 7.399 11.799a1 1 0 0 0 1.202 0 32 32 0 0 0 .824-.738",key:"fcdtly"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}],["path",{d:"M16 18h6",key:"987eiv"}],["path",{d:"M19 15v6",key:"10aioa"}]]),Kr=Rr("menu",[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]]),Xr=Rr("pause",[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]]),Jr=Rr("play",[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]),Zr=Rr("radio",[["path",{d:"M16.247 7.761a6 6 0 0 1 0 8.478",key:"1fwjs5"}],["path",{d:"M19.075 4.933a10 10 0 0 1 0 14.134",key:"ehdyv1"}],["path",{d:"M4.925 19.067a10 10 0 0 1 0-14.134",key:"1q22gi"}],["path",{d:"M7.753 16.239a6 6 0 0 1 0-8.478",key:"r2q7qm"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]]),Qr=Rr("send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]),as=Rr("settings",[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),es=Rr("shrink",[["path",{d:"m15 15 6 6m-6-6v4.8m0-4.8h4.8",key:"17vawe"}],["path",{d:"M9 19.8V15m0 0H4.2M9 15l-6 6",key:"chjx8e"}],["path",{d:"M15 4.2V9m0 0h4.8M15 9l6-6",key:"lav6yq"}],["path",{d:"M9 4.2V9m0 0H4.2M9 9 3 3",key:"1pxi2q"}]]),ns=Rr("sliders-vertical",[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]]),os=Rr("square-terminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]),ts=Rr("waypoints",[["circle",{cx:"12",cy:"4.5",r:"2.5",key:"r5ysbb"}],["path",{d:"m10.2 6.3-3.9 3.9",key:"1nzqf6"}],["circle",{cx:"4.5",cy:"12",r:"2.5",key:"jydg6v"}],["path",{d:"M7 12h10",key:"b7w52i"}],["circle",{cx:"19.5",cy:"12",r:"2.5",key:"1piiel"}],["path",{d:"m13.8 17.7 3.9-3.9",key:"1wyg1y"}],["circle",{cx:"12",cy:"19.5",r:"2.5",key:"13o1pw"}]]),rs=Rr("x",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),ss=t.createContext({});function is(a){const e=t.useRef(null);return null===e.current&&(e.current=a()),e.current}const ls="undefined"!=typeof window,cs=ls?t.useLayoutEffect:t.useEffect,ds=t.createContext(null);function us(a,e){-1===a.indexOf(e)&&a.push(e)}function hs(a,e){const n=a.indexOf(e);n>-1&&a.splice(n,1)}const ms=(a,e,n)=>n>e?e:n/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(a);function bs(a){return"object"==typeof a&&null!==a}const fs=a=>/^0[^.\s]+$/u.test(a);function ys(a){let e;return()=>(void 0===e&&(e=a()),e)}const vs=a=>a,ws=(a,e)=>n=>e(a(n)),ks=(...a)=>a.reduce(ws),xs=(a,e,n)=>{const o=e-a;return 0===o?1:(n-a)/o};class js{constructor(){this.subscriptions=[]}add(a){return us(this.subscriptions,a),()=>hs(this.subscriptions,a)}notify(a,e,n){const o=this.subscriptions.length;if(o)if(1===o)this.subscriptions[0](a,e,n);else for(let t=0;t1e3*a,Cs=a=>a/1e3;function As(a,e){return e?a*(1e3/e):0}const Ds=(a,e,n)=>(((1-3*n+3*e)*a+(3*n-6*e))*a+3*e)*a;function Es(a,e,n,o){if(a===e&&n===o)return vs;return t=>0===t||1===t?t:Ds(function(a,e,n,o,t){let r,s,i=0;do{s=e+(n-e)/2,r=Ds(s,o,t)-a,r>0?n=s:e=s}while(Math.abs(r)>1e-7&&++i<12);return s}(t,0,1,a,n),e,o)}const Bs=a=>e=>e<=.5?a(2*e)/2:(2-a(2*(1-e)))/2,Fs=a=>e=>1-a(1-e),qs=Es(.33,1.53,.69,.99),Ss=Fs(qs),Ms=Bs(Ss),Ts=a=>(a*=2)<1?.5*Ss(a):.5*(2-Math.pow(2,-10*(a-1))),Ps=a=>1-Math.sin(Math.acos(a)),Ls=Fs(Ps),Rs=Bs(Ps),Ns=Es(.42,0,1,1),Is=Es(0,0,.58,1),_s=Es(.42,0,.58,1),Vs=a=>Array.isArray(a)&&"number"!=typeof a[0],Os=a=>Array.isArray(a)&&"number"==typeof a[0],$s={linear:vs,easeIn:Ns,easeInOut:_s,easeOut:Is,circIn:Ps,circInOut:Rs,circOut:Ls,backIn:Ss,backInOut:Ms,backOut:qs,anticipate:Ts},Ws=a=>{if(Os(a)){a.length;const[e,n,o,t]=a;return Es(e,n,o,t)}return"string"==typeof a?$s[a]:a},Us=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function Hs(a,e){let n=!1,o=!0;const t={delta:0,timestamp:0,isProcessing:!1},r=()=>n=!0,s=Us.reduce((a,e)=>(a[e]=function(a){let e=new Set,n=new Set,o=!1,t=!1;const r=new WeakSet;let s={delta:0,timestamp:0,isProcessing:!1};function i(e){r.has(e)&&(l.schedule(e),a()),e(s)}const l={schedule:(a,t=!1,s=!1)=>{const i=s&&o?e:n;return t&&r.add(a),i.has(a)||i.add(a),a},cancel:a=>{n.delete(a),r.delete(a)},process:a=>{s=a,o?t=!0:(o=!0,[e,n]=[n,e],e.forEach(i),e.clear(),o=!1,t&&(t=!1,l.process(a)))}};return l}(r),a),{}),{setup:i,read:l,resolveKeyframes:c,preUpdate:d,update:u,preRender:h,render:m,postRender:p}=s,g=()=>{const r=ps.useManualTiming?t.timestamp:performance.now();n=!1,ps.useManualTiming||(t.delta=o?1e3/60:Math.max(Math.min(r-t.timestamp,40),1)),t.timestamp=r,t.isProcessing=!0,i.process(t),l.process(t),c.process(t),d.process(t),u.process(t),h.process(t),m.process(t),p.process(t),t.isProcessing=!1,n&&e&&(o=!1,a(g))};return{schedule:Us.reduce((e,r)=>{const i=s[r];return e[r]=(e,r=!1,s=!1)=>(n||(n=!0,o=!0,t.isProcessing||a(g)),i.schedule(e,r,s)),e},{}),cancel:a=>{for(let e=0;e(void 0===Js&&Qs.set(Ks.isProcessing||ps.useManualTiming?Ks.timestamp:performance.now()),Js),set:a=>{Js=a,queueMicrotask(Zs)}},ai=a=>e=>"string"==typeof e&&e.startsWith(a),ei=ai("--"),ni=ai("var(--"),oi=a=>!!ni(a)&&ti.test(a.split("/*")[0].trim()),ti=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function ri(a){return"string"==typeof a&&a.split("/*")[0].includes("var(--")}const si={test:a=>"number"==typeof a,parse:parseFloat,transform:a=>a},ii={...si,transform:a=>ms(0,1,a)},li={...si,default:1},ci=a=>Math.round(1e5*a)/1e5,di=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu,ui=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,hi=(a,e)=>n=>Boolean("string"==typeof n&&ui.test(n)&&n.startsWith(a)||e&&!function(a){return null==a}(n)&&Object.prototype.hasOwnProperty.call(n,e)),mi=(a,e,n)=>o=>{if("string"!=typeof o)return o;const[t,r,s,i]=o.match(di);return{[a]:parseFloat(t),[e]:parseFloat(r),[n]:parseFloat(s),alpha:void 0!==i?parseFloat(i):1}},pi={...si,transform:a=>Math.round((a=>ms(0,255,a))(a))},gi={test:hi("rgb","red"),parse:mi("red","green","blue"),transform:({red:a,green:e,blue:n,alpha:o=1})=>"rgba("+pi.transform(a)+", "+pi.transform(e)+", "+pi.transform(n)+", "+ci(ii.transform(o))+")"},bi={test:hi("#"),parse:function(a){let e="",n="",o="",t="";return a.length>5?(e=a.substring(1,3),n=a.substring(3,5),o=a.substring(5,7),t=a.substring(7,9)):(e=a.substring(1,2),n=a.substring(2,3),o=a.substring(3,4),t=a.substring(4,5),e+=e,n+=n,o+=o,t+=t),{red:parseInt(e,16),green:parseInt(n,16),blue:parseInt(o,16),alpha:t?parseInt(t,16)/255:1}},transform:gi.transform},fi=a=>({test:e=>"string"==typeof e&&e.endsWith(a)&&1===e.split(" ").length,parse:parseFloat,transform:e=>`${e}${a}`}),yi=fi("deg"),vi=fi("%"),wi=fi("px"),ki=fi("vh"),xi=fi("vw"),ji=(()=>({...vi,parse:a=>vi.parse(a)/100,transform:a=>vi.transform(100*a)}))(),zi={test:hi("hsl","hue"),parse:mi("hue","saturation","lightness"),transform:({hue:a,saturation:e,lightness:n,alpha:o=1})=>"hsla("+Math.round(a)+", "+vi.transform(ci(e))+", "+vi.transform(ci(n))+", "+ci(ii.transform(o))+")"},Ci={test:a=>gi.test(a)||bi.test(a)||zi.test(a),parse:a=>gi.test(a)?gi.parse(a):zi.test(a)?zi.parse(a):bi.parse(a),transform:a=>"string"==typeof a?a:a.hasOwnProperty("red")?gi.transform(a):zi.transform(a),getAnimatableNone:a=>{const e=Ci.parse(a);return e.alpha=0,Ci.transform(e)}},Ai=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu,Di="number",Ei="color",Bi=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function Fi(a){const e=a.toString(),n=[],o={color:[],number:[],var:[]},t=[];let r=0;const s=e.replace(Bi,a=>(Ci.test(a)?(o.color.push(r),t.push(Ei),n.push(Ci.parse(a))):a.startsWith("var(")?(o.var.push(r),t.push("var"),n.push(a)):(o.number.push(r),t.push(Di),n.push(parseFloat(a))),++r,"${}")).split("${}");return{values:n,split:s,indexes:o,types:t}}function qi(a){return Fi(a).values}function Si(a){const{split:e,types:n}=Fi(a),o=e.length;return a=>{let t="";for(let r=0;r"number"==typeof a?0:Ci.test(a)?Ci.getAnimatableNone(a):a,Ti={test:function(a){var e,n;return isNaN(a)&&"string"==typeof a&&((null==(e=a.match(di))?void 0:e.length)||0)+((null==(n=a.match(Ai))?void 0:n.length)||0)>0},parse:qi,createTransformer:Si,getAnimatableNone:function(a){const e=qi(a);return Si(a)(e.map(Mi))}};function Pi(a,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?a+6*(e-a)*n:n<.5?e:n<2/3?a+(e-a)*(2/3-n)*6:a}function Li(a,e){return n=>n>0?e:a}const Ri=(a,e,n)=>a+(e-a)*n,Ni=(a,e,n)=>{const o=a*a,t=n*(e*e-o)+o;return t<0?0:Math.sqrt(t)},Ii=[bi,gi,zi];function _i(a){const e=(n=a,Ii.find(a=>a.test(n)));var n;if(!Boolean(e))return!1;let o=e.parse(a);return e===zi&&(o=function({hue:a,saturation:e,lightness:n,alpha:o}){a/=360,n/=100;let t=0,r=0,s=0;if(e/=100){const o=n<.5?n*(1+e):n+e-n*e,i=2*n-o;t=Pi(i,o,a+1/3),r=Pi(i,o,a),s=Pi(i,o,a-1/3)}else t=r=s=n;return{red:Math.round(255*t),green:Math.round(255*r),blue:Math.round(255*s),alpha:o}}(o)),o}const Vi=(a,e)=>{const n=_i(a),o=_i(e);if(!n||!o)return Li(a,e);const t={...n};return a=>(t.red=Ni(n.red,o.red,a),t.green=Ni(n.green,o.green,a),t.blue=Ni(n.blue,o.blue,a),t.alpha=Ri(n.alpha,o.alpha,a),gi.transform(t))},Oi=new Set(["none","hidden"]);function $i(a,e){return n=>Ri(a,e,n)}function Wi(a){return"number"==typeof a?$i:"string"==typeof a?oi(a)?Li:Ci.test(a)?Vi:Yi:Array.isArray(a)?Ui:"object"==typeof a?Ci.test(a)?Vi:Hi:Li}function Ui(a,e){const n=[...a],o=n.length,t=a.map((a,n)=>Wi(a)(a,e[n]));return a=>{for(let e=0;e{for(const e in o)n[e]=o[e](a);return n}}const Yi=(a,e)=>{const n=Ti.createTransformer(e),o=Fi(a),t=Fi(e);return o.indexes.var.length===t.indexes.var.length&&o.indexes.color.length===t.indexes.color.length&&o.indexes.number.length>=t.indexes.number.length?Oi.has(a)&&!t.values.length||Oi.has(e)&&!o.values.length?function(a,e){return Oi.has(a)?n=>n<=0?a:e:n=>n>=1?e:a}(a,e):ks(Ui(function(a,e){const n=[],o={color:0,var:0,number:0};for(let t=0;t{const e=({timestamp:e})=>a(e);return{start:(a=!0)=>Ys.update(e,a),stop:()=>Gs(e),now:()=>Ks.isProcessing?Ks.timestamp:Qs.now()}},Xi=(a,e,n=10)=>{let o="";const t=Math.max(Math.round(e/n),2);for(let r=0;r=Ji?1/0:e}function Qi(a,e=100,n){const o=n({...a,keyframes:[0,e]}),t=Math.min(Zi(o),Ji);return{type:"keyframes",ease:a=>o.next(t*a).value/e,duration:Cs(t)}}function al(a,e,n){const o=Math.max(e-5,0);return As(n-a(o),e-o)}const el=.01,nl=2,ol=.005,tl=.5;const rl=12;function sl(a,e){return a*Math.sqrt(1-e*e)}const il=["duration","bounce"],ll=["stiffness","damping","mass"];function cl(a,e){return e.some(e=>void 0!==a[e])}function dl(a=.3,e=.3){const n="object"!=typeof a?{visualDuration:a,keyframes:[0,1],bounce:e}:a;let{restSpeed:o,restDelta:t}=n;const r=n.keyframes[0],s=n.keyframes[n.keyframes.length-1],i={done:!1,value:r},{stiffness:l,damping:c,mass:d,duration:u,velocity:h,isResolvedFromDuration:m}=function(a){let e={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...a};if(!cl(a,ll)&&cl(a,il))if(a.visualDuration){const n=a.visualDuration,o=2*Math.PI/(1.2*n),t=o*o,r=2*ms(.05,1,1-(a.bounce||0))*Math.sqrt(t);e={...e,mass:1,stiffness:t,damping:r}}else{const n=function({duration:a=800,bounce:e=.3,velocity:n=0,mass:o=1}){let t,r,s=1-e;s=ms(.05,1,s),a=ms(.01,10,Cs(a)),s<1?(t=e=>{const o=e*s,t=o*a;return.001-(o-n)/sl(e,s)*Math.exp(-t)},r=e=>{const o=e*s*a,r=o*n+n,i=Math.pow(s,2)*Math.pow(e,2)*a,l=Math.exp(-o),c=sl(Math.pow(e,2),s);return(.001-t(e)>0?-1:1)*((r-i)*l)/c}):(t=e=>Math.exp(-e*a)*((e-n)*a+1)-.001,r=e=>Math.exp(-e*a)*(a*a*(n-e)));const i=function(a,e,n){let o=n;for(let t=1;t{const n=Math.exp(-g*f*e);return s-n*((p+g*f*b)/a*Math.sin(a*e)+b*Math.cos(a*e))}}else if(1===g)v=a=>s-Math.exp(-f*a)*(b+(p+f*b)*a);else{const a=f*Math.sqrt(g*g-1);v=e=>{const n=Math.exp(-g*f*e),o=Math.min(a*e,300);return s-n*((p+g*f*b)*Math.sinh(o)+a*b*Math.cosh(o))/a}}const w={calculatedDuration:m&&u||null,next:a=>{const e=v(a);if(m)i.done=a>=u;else{let n=0===a?p:0;g<1&&(n=0===a?zs(p):al(v,a,e));const r=Math.abs(n)<=o,l=Math.abs(s-e)<=t;i.done=r&&l}return i.value=i.done?s:e,i},toString:()=>{const a=Math.min(Zi(w),Ji),e=Xi(e=>w.next(a*e).value,a,30);return a+"ms "+e},toTransition:()=>{}};return w}function ul({keyframes:a,velocity:e=0,power:n=.8,timeConstant:o=325,bounceDamping:t=10,bounceStiffness:r=500,modifyTarget:s,min:i,max:l,restDelta:c=.5,restSpeed:d}){const u=a[0],h={done:!1,value:u},m=a=>void 0===i?l:void 0===l||Math.abs(i-a)-p*Math.exp(-a/o),y=a=>b+f(a),v=a=>{const e=f(a),n=y(a);h.done=Math.abs(e)<=c,h.value=h.done?b:n};let w,k;const x=a=>{var e;e=h.value,(void 0!==i&&el)&&(w=a,k=dl({keyframes:[h.value,m(h.value)],velocity:al(y,a,h.value),damping:t,stiffness:r,restDelta:c,restSpeed:d}))};return x(0),{calculatedDuration:null,next:a=>{let e=!1;return k||void 0!==w||(e=!0,v(a),x(a)),void 0!==w&&a>=w?k.next(a-w):(!e&&v(a),h)}}}function hl(a,e){const n=a[a.length-1];for(let o=1;o<=e;o++){const t=xs(0,e,o);a.push(Ri(n,1,t))}}function ml(a){const e=[0];return hl(e,a.length-1),e}function pl({duration:a=300,keyframes:e,times:n,ease:o="easeInOut"}){const t=Vs(o)?o.map(Ws):Ws(o),r={done:!1,value:e[0]},s=function(a,e){return a.map(a=>a*e)}(n&&n.length===e.length?n:ml(e),a),i=function(a,e,{clamp:n=!0,ease:o,mixer:t}={}){const r=a.length;if(e.length,1===r)return()=>e[0];if(2===r&&e[0]===e[1])return()=>e[1];const s=a[0]===a[1];a[0]>a[r-1]&&(a=[...a].reverse(),e=[...e].reverse());const i=function(a,e,n){const o=[],t=n||ps.mix||Gi,r=a.length-1;for(let s=0;s{if(s&&n1)for(;oc(ms(a[0],a[r-1],e)):c}(s,e,{ease:Array.isArray(t)?t:(l=e,c=t,l.map(()=>c||_s).splice(0,l.length-1))});var l,c;return{calculatedDuration:a,next:e=>(r.value=i(e),r.done=e>=a,r)}}dl.applyToOptions=a=>{const e=Qi(a,100,dl);return a.ease=e.ease,a.duration=zs(e.duration),a.type="keyframes",a};const gl=a=>null!==a;function bl(a,{repeat:e,repeatType:n="loop"},o,t=1){const r=a.filter(gl),s=t<0||e&&"loop"!==n&&e%2==1?0:r.length-1;return s&&void 0!==o?o:r[s]}const fl={decay:ul,inertia:ul,tween:pl,keyframes:pl,spring:dl};function yl(a){"string"==typeof a.type&&(a.type=fl[a.type])}class vl{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(a=>{this.resolve=a})}notifyFinished(){this.resolve()}then(a,e){return this.finished.then(a,e)}}const wl=a=>a/100;class kl extends vl{constructor(a){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{var a,e;const{motionValue:n}=this.options;n&&n.updatedAt!==Qs.now()&&this.tick(Qs.now()),this.isStopped=!0,"idle"!==this.state&&(this.teardown(),null==(e=(a=this.options).onStop)||e.call(a))},this.options=a,this.initAnimation(),this.play(),!1===a.autoplay&&this.pause()}initAnimation(){const{options:a}=this;yl(a);const{type:e=pl,repeat:n=0,repeatDelay:o=0,repeatType:t,velocity:r=0}=a;let{keyframes:s}=a;const i=e||pl;i!==pl&&"number"!=typeof s[0]&&(this.mixKeyframes=ks(wl,Gi(s[0],s[1])),s=[0,100]);const l=i({...a,keyframes:s});"mirror"===t&&(this.mirroredGenerator=i({...a,keyframes:[...s].reverse(),velocity:-r})),null===l.calculatedDuration&&(l.calculatedDuration=Zi(l));const{calculatedDuration:c}=l;this.calculatedDuration=c,this.resolvedDuration=c+o,this.totalDuration=this.resolvedDuration*(n+1)-o,this.generator=l}updateTime(a){const e=Math.round(a-this.startTime)*this.playbackSpeed;null!==this.holdTime?this.currentTime=this.holdTime:this.currentTime=e}tick(a,e=!1){const{generator:n,totalDuration:o,mixKeyframes:t,mirroredGenerator:r,resolvedDuration:s,calculatedDuration:i}=this;if(null===this.startTime)return n.next(0);const{delay:l=0,keyframes:c,repeat:d,repeatType:u,repeatDelay:h,type:m,onUpdate:p,finalKeyframe:g}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,a):this.speed<0&&(this.startTime=Math.min(a-o/this.speed,this.startTime)),e?this.currentTime=a:this.updateTime(a);const b=this.currentTime-l*(this.playbackSpeed>=0?1:-1),f=this.playbackSpeed>=0?b<0:b>o;this.currentTime=Math.max(b,0),"finished"===this.state&&null===this.holdTime&&(this.currentTime=o);let y=this.currentTime,v=n;if(d){const a=Math.min(this.currentTime,o)/s;let e=Math.floor(a),n=a%1;!n&&a>=1&&(n=1),1===n&&e--,e=Math.min(e,d+1),Boolean(e%2)&&("reverse"===u?(n=1-n,h&&(n-=h/s)):"mirror"===u&&(v=r)),y=ms(0,1,n)*s}const w=f?{done:!1,value:c[0]}:v.next(y);t&&(w.value=t(w.value));let{done:k}=w;f||null===i||(k=this.playbackSpeed>=0?this.currentTime>=o:this.currentTime<=0);const x=null===this.holdTime&&("finished"===this.state||"running"===this.state&&k);return x&&m!==ul&&(w.value=bl(c,this.options,g,this.speed)),p&&p(w.value),x&&this.finish(),w}then(a,e){return this.finished.then(a,e)}get duration(){return Cs(this.calculatedDuration)}get iterationDuration(){const{delay:a=0}=this.options||{};return this.duration+Cs(a)}get time(){return Cs(this.currentTime)}set time(a){var e;a=zs(a),this.currentTime=a,null===this.startTime||null!==this.holdTime||0===this.playbackSpeed?this.holdTime=a:this.driver&&(this.startTime=this.driver.now()-a/this.playbackSpeed),null==(e=this.driver)||e.start(!1)}get speed(){return this.playbackSpeed}set speed(a){this.updateTime(Qs.now());const e=this.playbackSpeed!==a;this.playbackSpeed=a,e&&(this.time=Cs(this.currentTime))}play(){var a,e;if(this.isStopped)return;const{driver:n=Ki,startTime:o}=this.options;this.driver||(this.driver=n(a=>this.tick(a))),null==(e=(a=this.options).onPlay)||e.call(a);const t=this.driver.now();"finished"===this.state?(this.updateFinished(),this.startTime=t):null!==this.holdTime?this.startTime=t-this.holdTime:this.startTime||(this.startTime=o??t),"finished"===this.state&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(Qs.now()),this.holdTime=this.currentTime}complete(){"running"!==this.state&&this.play(),this.state="finished",this.holdTime=null}finish(){var a,e;this.notifyFinished(),this.teardown(),this.state="finished",null==(e=(a=this.options).onComplete)||e.call(a)}cancel(){var a,e;this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),null==(e=(a=this.options).onCancel)||e.call(a)}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(a){return this.startTime=0,this.tick(a,!0)}attachTimeline(a){var e;return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),null==(e=this.driver)||e.stop(),a.observe(this)}}const xl=a=>180*a/Math.PI,jl=a=>{const e=xl(Math.atan2(a[1],a[0]));return Cl(e)},zl={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:a=>(Math.abs(a[0])+Math.abs(a[3]))/2,rotate:jl,rotateZ:jl,skewX:a=>xl(Math.atan(a[1])),skewY:a=>xl(Math.atan(a[2])),skew:a=>(Math.abs(a[1])+Math.abs(a[2]))/2},Cl=a=>((a%=360)<0&&(a+=360),a),Al=a=>Math.sqrt(a[0]*a[0]+a[1]*a[1]),Dl=a=>Math.sqrt(a[4]*a[4]+a[5]*a[5]),El={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:Al,scaleY:Dl,scale:a=>(Al(a)+Dl(a))/2,rotateX:a=>Cl(xl(Math.atan2(a[6],a[5]))),rotateY:a=>Cl(xl(Math.atan2(-a[2],a[0]))),rotateZ:jl,rotate:jl,skewX:a=>xl(Math.atan(a[4])),skewY:a=>xl(Math.atan(a[1])),skew:a=>(Math.abs(a[1])+Math.abs(a[4]))/2};function Bl(a){return a.includes("scale")?1:0}function Fl(a,e){if(!a||"none"===a)return Bl(e);const n=a.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let o,t;if(n)o=El,t=n;else{const e=a.match(/^matrix\(([-\d.e\s,]+)\)$/u);o=zl,t=e}if(!t)return Bl(e);const r=o[e],s=t[1].split(",").map(ql);return"function"==typeof r?r(s):s[r]}function ql(a){return parseFloat(a.trim())}const Sl=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Ml=(()=>new Set(Sl))(),Tl=a=>a===si||a===wi,Pl=new Set(["x","y","z"]),Ll=Sl.filter(a=>!Pl.has(a)),Rl={width:({x:a},{paddingLeft:e="0",paddingRight:n="0"})=>a.max-a.min-parseFloat(e)-parseFloat(n),height:({y:a},{paddingTop:e="0",paddingBottom:n="0"})=>a.max-a.min-parseFloat(e)-parseFloat(n),top:(a,{top:e})=>parseFloat(e),left:(a,{left:e})=>parseFloat(e),bottom:({y:a},{top:e})=>parseFloat(e)+(a.max-a.min),right:({x:a},{left:e})=>parseFloat(e)+(a.max-a.min),x:(a,{transform:e})=>Fl(e,"x"),y:(a,{transform:e})=>Fl(e,"y")};Rl.translateX=Rl.x,Rl.translateY=Rl.y;const Nl=new Set;let Il=!1,_l=!1,Vl=!1;function Ol(){if(_l){const a=Array.from(Nl).filter(a=>a.needsMeasurement),e=new Set(a.map(a=>a.element)),n=new Map;e.forEach(a=>{const e=function(a){const e=[];return Ll.forEach(n=>{const o=a.getValue(n);void 0!==o&&(e.push([n,o.get()]),o.set(n.startsWith("scale")?1:0))}),e}(a);e.length&&(n.set(a,e),a.render())}),a.forEach(a=>a.measureInitialState()),e.forEach(a=>{a.render();const e=n.get(a);e&&e.forEach(([e,n])=>{var o;null==(o=a.getValue(e))||o.set(n)})}),a.forEach(a=>a.measureEndState()),a.forEach(a=>{void 0!==a.suspendedScrollY&&window.scrollTo(0,a.suspendedScrollY)})}_l=!1,Il=!1,Nl.forEach(a=>a.complete(Vl)),Nl.clear()}function $l(){Nl.forEach(a=>{a.readKeyframes(),a.needsMeasurement&&(_l=!0)})}class Wl{constructor(a,e,n,o,t,r=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...a],this.onComplete=e,this.name=n,this.motionValue=o,this.element=t,this.isAsync=r}scheduleResolve(){this.state="scheduled",this.isAsync?(Nl.add(this),Il||(Il=!0,Ys.read($l),Ys.resolveKeyframes(Ol))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:a,name:e,element:n,motionValue:o}=this;if(null===a[0]){const t=null==o?void 0:o.get(),r=a[a.length-1];if(void 0!==t)a[0]=t;else if(n&&e){const o=n.readValue(e,r);null!=o&&(a[0]=o)}void 0===a[0]&&(a[0]=r),o&&void 0===t&&o.set(a[0])}!function(a){for(let e=1;evoid 0!==window.ScrollTimeline),Hl={};function Yl(a,e){const n=ys(a);return()=>Hl[e]??n()}const Gl=Yl(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch(a){return!1}return!0},"linearEasing"),Kl=([a,e,n,o])=>`cubic-bezier(${a}, ${e}, ${n}, ${o})`,Xl={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:Kl([0,.65,.55,1]),circOut:Kl([.55,0,1,.45]),backIn:Kl([.31,.01,.66,-.59]),backOut:Kl([.33,1.53,.69,.99])};function Jl(a,e){return a?"function"==typeof a?Gl()?Xi(a,e):"ease-out":Os(a)?Kl(a):Array.isArray(a)?a.map(a=>Jl(a,e)||Xl.easeOut):Xl[a]:void 0}function Zl(a,e,n,{delay:o=0,duration:t=300,repeat:r=0,repeatType:s="loop",ease:i="easeOut",times:l}={},c=void 0){const d={[e]:n};l&&(d.offset=l);const u=Jl(i,t);Array.isArray(u)&&(d.easing=u);const h={delay:o,duration:t,easing:Array.isArray(u)?"linear":u,fill:"both",iterations:r+1,direction:"reverse"===s?"alternate":"normal"};return c&&(h.pseudoElement=c),a.animate(d,h)}function Ql(a){return"function"==typeof a&&"applyToOptions"in a}class ac extends vl{constructor(a){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!a)return;const{element:e,name:n,keyframes:o,pseudoElement:t,allowFlatten:r=!1,finalKeyframe:s,onComplete:i}=a;this.isPseudoElement=Boolean(t),this.allowFlatten=r,this.options=a,a.type;const l=function({type:a,...e}){return Ql(a)&&Gl()?a.applyToOptions(e):(e.duration??(e.duration=300),e.ease??(e.ease="easeOut"),e)}(a);this.animation=Zl(e,n,o,l,t),!1===l.autoplay&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!t){const a=bl(o,this.options,s,this.speed);this.updateMotionValue?this.updateMotionValue(a):function(a,e,n){(a=>a.startsWith("--"))(e)?a.style.setProperty(e,n):a.style[e]=n}(e,n,a),this.animation.cancel()}null==i||i(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),"finished"===this.state&&this.updateFinished())}pause(){this.animation.pause()}complete(){var a,e;null==(e=(a=this.animation).finish)||e.call(a)}cancel(){try{this.animation.cancel()}catch(a){}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:a}=this;"idle"!==a&&"finished"!==a&&(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){var a,e;this.isPseudoElement||null==(e=(a=this.animation).commitStyles)||e.call(a)}get duration(){var a,e;const n=(null==(e=null==(a=this.animation.effect)?void 0:a.getComputedTiming)?void 0:e.call(a).duration)||0;return Cs(Number(n))}get iterationDuration(){const{delay:a=0}=this.options||{};return this.duration+Cs(a)}get time(){return Cs(Number(this.animation.currentTime)||0)}set time(a){this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=zs(a)}get speed(){return this.animation.playbackRate}set speed(a){a<0&&(this.finishedTime=null),this.animation.playbackRate=a}get state(){return null!==this.finishedTime?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(a){this.manualStartTime=this.animation.startTime=a}attachTimeline({timeline:a,observe:e}){var n;return this.allowFlatten&&(null==(n=this.animation.effect)||n.updateTiming({easing:"linear"})),this.animation.onfinish=null,a&&Ul()?(this.animation.timeline=a,vs):e(this)}}const ec={anticipate:Ts,backInOut:Ms,circInOut:Rs};class nc extends ac{constructor(a){var e;"string"==typeof(e=a).ease&&e.ease in ec&&(e.ease=ec[e.ease]),yl(a),super(a),void 0!==a.startTime&&(this.startTime=a.startTime),this.options=a}updateMotionValue(a){const{motionValue:e,onUpdate:n,onComplete:o,element:t,...r}=this.options;if(!e)return;if(void 0!==a)return void e.set(a);const s=new kl({...r,autoplay:!1}),i=Math.max(10,Qs.now()-this.startTime),l=ms(0,10,i-10);e.setWithVelocity(s.sample(Math.max(0,i-l)).value,s.sample(i).value,l),s.stop()}}const oc=(a,e)=>!("zIndex"===e||"number"!=typeof a&&!Array.isArray(a)&&("string"!=typeof a||!Ti.test(a)&&"0"!==a||a.startsWith("url(")));function tc(a){a.duration=0,a.type="keyframes"}const rc=new Set(["opacity","clipPath","filter","transform"]),sc=ys(()=>Object.hasOwnProperty.call(Element.prototype,"animate"));class ic extends vl{constructor({autoplay:a=!0,delay:e=0,type:n="keyframes",repeat:o=0,repeatDelay:t=0,repeatType:r="loop",keyframes:s,name:i,motionValue:l,element:c,...d}){var u;super(),this.stop=()=>{var a,e;this._animation&&(this._animation.stop(),null==(a=this.stopTimeline)||a.call(this)),null==(e=this.keyframeResolver)||e.cancel()},this.createdAt=Qs.now();const h={autoplay:a,delay:e,type:n,repeat:o,repeatDelay:t,repeatType:r,name:i,motionValue:l,element:c,...d},m=(null==c?void 0:c.KeyframeResolver)||Wl;this.keyframeResolver=new m(s,(a,e,n)=>this.onKeyframesResolved(a,e,h,!n),i,l,c),null==(u=this.keyframeResolver)||u.scheduleResolve()}onKeyframesResolved(a,e,n,o){var t,r;this.keyframeResolver=void 0;const{name:s,type:i,velocity:l,delay:c,isHandoff:d,onUpdate:u}=n;this.resolvedAt=Qs.now(),function(a,e,n,o){const t=a[0];if(null===t)return!1;if("display"===e||"visibility"===e)return!0;const r=a[a.length-1],s=oc(t,e),i=oc(r,e);return!(!s||!i)&&(function(a){const e=a[0];if(1===a.length)return!0;for(let n=0;n40?this.resolvedAt:this.createdAt:void 0,finalKeyframe:e,...n,keyframes:a},m=!d&&function(a){var e;const{motionValue:n,name:o,repeatDelay:t,repeatType:r,damping:s,type:i}=a;if(!((null==(e=null==n?void 0:n.owner)?void 0:e.current)instanceof HTMLElement))return!1;const{onUpdate:l,transformTemplate:c}=n.owner.getProps();return sc()&&o&&rc.has(o)&&("transform"!==o||!c)&&!l&&!t&&"mirror"!==r&&0!==s&&"inertia"!==i}(h),p=null==(r=null==(t=h.motionValue)?void 0:t.owner)?void 0:r.current,g=m?new nc({...h,element:p}):new kl(h);g.finished.then(()=>{this.notifyFinished()}).catch(vs),this.pendingTimeline&&(this.stopTimeline=g.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=g}get finished(){return this._animation?this.animation.finished:this._finished}then(a,e){return this.finished.finally(a).then(()=>{})}get animation(){var a;return this._animation||(null==(a=this.keyframeResolver)||a.resume(),Vl=!0,$l(),Ol(),Vl=!1),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(a){this.animation.time=a}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(a){this.animation.speed=a}get startTime(){return this.animation.startTime}attachTimeline(a){return this._animation?this.stopTimeline=this.animation.attachTimeline(a):this.pendingTimeline=a,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){var a;this._animation&&this.animation.cancel(),null==(a=this.keyframeResolver)||a.cancel()}}function lc(a,e,n,o=0,t=1){const r=Array.from(a).sort((a,e)=>a.sortNodePosition(e)).indexOf(e),s=a.size,i=(s-1)*o;return"function"==typeof n?n(r,s):1===t?r*o:i-r*o}const cc=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function dc(a,e,n=1){const[o,t]=function(a){const e=cc.exec(a);if(!e)return[,];const[,n,o,t]=e;return[`--${n??o}`,t]}(a);if(!o)return;const r=window.getComputedStyle(e).getPropertyValue(o);if(r){const a=r.trim();return gs(a)?parseFloat(a):a}return oi(t)?dc(t,e,n+1):t}const uc={type:"spring",stiffness:500,damping:25,restSpeed:10},hc={type:"keyframes",duration:.8},mc={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},pc=a=>null!==a;function gc(a,e){return(null==a?void 0:a[e])??(null==a?void 0:a.default)??a}const bc=(a,e,n,o={},t,r)=>s=>{const i=gc(o,a)||{},l=i.delay||o.delay||0;let{elapsed:c=0}=o;c-=zs(l);const d={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:e.getVelocity(),...i,delay:-c,onUpdate:a=>{e.set(a),i.onUpdate&&i.onUpdate(a)},onComplete:()=>{s(),i.onComplete&&i.onComplete()},name:a,motionValue:e,element:r?void 0:t};(function({when:a,delay:e,delayChildren:n,staggerChildren:o,staggerDirection:t,repeat:r,repeatType:s,repeatDelay:i,from:l,elapsed:c,...d}){return!!Object.keys(d).length})(i)||Object.assign(d,((a,{keyframes:e})=>e.length>2?hc:Ml.has(a)?a.startsWith("scale")?{type:"spring",stiffness:550,damping:0===e[1]?2*Math.sqrt(550):30,restSpeed:10}:uc:mc)(a,d)),d.duration&&(d.duration=zs(d.duration)),d.repeatDelay&&(d.repeatDelay=zs(d.repeatDelay)),void 0!==d.from&&(d.keyframes[0]=d.from);let u=!1;if((!1===d.type||0===d.duration&&!d.repeatDelay)&&(tc(d),0===d.delay&&(u=!0)),(ps.instantAnimations||ps.skipAnimations)&&(u=!0,tc(d),d.delay=0),d.allowFlatten=!i.type&&!i.ease,u&&!r&&void 0!==e.get()){const a=function(a,{repeat:e,repeatType:n="loop"}){const o=a.filter(pc);return o[e&&"loop"!==n&&e%2==1?0:o.length-1]}(d.keyframes,i);if(void 0!==a)return void Ys.update(()=>{d.onUpdate(a),d.onComplete()})}return i.isSync?new kl(d):new ic(d)};function fc(a){const e=[{},{}];return null==a||a.values.forEach((a,n)=>{e[0][n]=a.get(),e[1][n]=a.getVelocity()}),e}function yc(a,e,n,o){if("function"==typeof e){const[t,r]=fc(o);e=e(void 0!==n?n:a.custom,t,r)}if("string"==typeof e&&(e=a.variants&&a.variants[e]),"function"==typeof e){const[t,r]=fc(o);e=e(void 0!==n?n:a.custom,t,r)}return e}function vc(a,e,n){const o=a.getProps();return yc(o,e,void 0!==n?n:o.custom,a)}const wc=new Set(["width","height","top","left","right","bottom",...Sl]);class kc{constructor(a,e={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=a=>{var e;const n=Qs.now();if(this.updatedAt!==n&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(a),this.current!==this.prev&&(null==(e=this.events.change)||e.notify(this.current),this.dependents))for(const o of this.dependents)o.dirty()},this.hasAnimated=!1,this.setCurrent(a),this.owner=e.owner}setCurrent(a){var e;this.current=a,this.updatedAt=Qs.now(),null===this.canTrackVelocity&&void 0!==a&&(this.canTrackVelocity=(e=this.current,!isNaN(parseFloat(e))))}setPrevFrameValue(a=this.current){this.prevFrameValue=a,this.prevUpdatedAt=this.updatedAt}onChange(a){return this.on("change",a)}on(a,e){this.events[a]||(this.events[a]=new js);const n=this.events[a].add(e);return"change"===a?()=>{n(),Ys.read(()=>{this.events.change.getSize()||this.stop()})}:n}clearListeners(){for(const a in this.events)this.events[a].clear()}attach(a,e){this.passiveEffect=a,this.stopPassiveEffect=e}set(a){this.passiveEffect?this.passiveEffect(a,this.updateAndNotify):this.updateAndNotify(a)}setWithVelocity(a,e,n){this.set(e),this.prev=void 0,this.prevFrameValue=a,this.prevUpdatedAt=this.updatedAt-n}jump(a,e=!0){this.updateAndNotify(a),this.prev=a,this.prevUpdatedAt=this.prevFrameValue=void 0,e&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){var a;null==(a=this.events.change)||a.notify(this.current)}addDependent(a){this.dependents||(this.dependents=new Set),this.dependents.add(a)}removeDependent(a){this.dependents&&this.dependents.delete(a)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const a=Qs.now();if(!this.canTrackVelocity||void 0===this.prevFrameValue||a-this.updatedAt>30)return 0;const e=Math.min(this.updatedAt-this.prevUpdatedAt,30);return As(parseFloat(this.current)-parseFloat(this.prevFrameValue),e)}start(a){return this.stop(),new Promise(e=>{this.hasAnimated=!0,this.animation=a(e),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){var a,e;null==(a=this.dependents)||a.clear(),null==(e=this.events.destroy)||e.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function xc(a,e){return new kc(a,e)}const jc=a=>Array.isArray(a);function zc(a,e,n){a.hasValue(e)?a.getValue(e).set(n):a.addValue(e,xc(n))}function Cc(a){return jc(a)?a[a.length-1]||0:a}function Ac(a,e){const n=vc(a,e);let{transitionEnd:o={},transition:t={},...r}=n||{};r={...r,...o};for(const s in r)zc(a,s,Cc(r[s]))}const Dc=a=>Boolean(a&&a.getVelocity);function Ec(a,e){const n=a.getValue("willChange");if(o=n,Boolean(Dc(o)&&o.add))return n.add(e);if(!n&&ps.WillChange){const n=new ps.WillChange("auto");a.addValue("willChange",n),n.add(e)}var o}function Bc(a){return a.replace(/([A-Z])/g,a=>`-${a.toLowerCase()}`)}const Fc="data-"+Bc("framerAppearId");function qc(a){return a.props[Fc]}function Sc({protectedKeys:a,needsAnimating:e},n){const o=a.hasOwnProperty(n)&&!0!==e[n];return e[n]=!1,o}function Mc(a,e,{delay:n=0,transitionOverride:o,type:t}={}){let{transition:r=a.getDefaultTransition(),transitionEnd:s,...i}=e;o&&(r=o);const l=[],c=t&&a.animationState&&a.animationState.getState()[t];for(const d in i){const e=a.getValue(d,a.latestValues[d]??null),o=i[d];if(void 0===o||c&&Sc(c,d))continue;const t={delay:n,...gc(r||{},d)},s=e.get();if(void 0!==s&&!e.isAnimating&&!Array.isArray(o)&&o===s&&!t.velocity)continue;let u=!1;if(window.MotionHandoffAnimation){const e=qc(a);if(e){const a=window.MotionHandoffAnimation(e,d,Ys);null!==a&&(t.startTime=a,u=!0)}}Ec(a,d),e.start(bc(d,e,o,a.shouldReduceMotion&&wc.has(d)?{type:!1}:t,a,u));const h=e.animation;h&&l.push(h)}return s&&Promise.all(l).then(()=>{Ys.update(()=>{s&&Ac(a,s)})}),l}function Tc(a,e,n={}){var o;const t=vc(a,e,"exit"===n.type?null==(o=a.presenceContext)?void 0:o.custom:void 0);let{transition:r=a.getDefaultTransition()||{}}=t||{};n.transitionOverride&&(r=n.transitionOverride);const s=t?()=>Promise.all(Mc(a,t,n)):()=>Promise.resolve(),i=a.variantChildren&&a.variantChildren.size?(o=0)=>{const{delayChildren:t=0,staggerChildren:s,staggerDirection:i}=r;return function(a,e,n=0,o=0,t=0,r=1,s){const i=[];for(const l of a.variantChildren)l.notify("AnimationStart",e),i.push(Tc(l,e,{...s,delay:n+("function"==typeof o?0:o)+lc(a.variantChildren,l,o,t,r)}).then(()=>l.notify("AnimationComplete",e)));return Promise.all(i)}(a,e,o,t,s,i,n)}:()=>Promise.resolve(),{when:l}=r;if(l){const[a,e]="beforeChildren"===l?[s,i]:[i,s];return a().then(()=>e())}return Promise.all([s(),i(n.delay)])}function Pc(a,e,n={}){let o;if(a.notify("AnimationStart",e),Array.isArray(e)){const t=e.map(e=>Tc(a,e,n));o=Promise.all(t)}else if("string"==typeof e)o=Tc(a,e,n);else{const t="function"==typeof e?vc(a,e,n.custom):e;o=Promise.all(Mc(a,t,n))}return o.then(()=>{a.notify("AnimationComplete",e)})}const Lc=a=>e=>e.test(a),Rc=[si,wi,vi,yi,xi,ki,{test:a=>"auto"===a,parse:a=>a}],Nc=a=>Rc.find(Lc(a));function Ic(a){return"number"==typeof a?0===a:null===a||"none"===a||"0"===a||fs(a)}const _c=new Set(["brightness","contrast","saturate","opacity"]);function Vc(a){const[e,n]=a.slice(0,-1).split("(");if("drop-shadow"===e)return a;const[o]=n.match(di)||[];if(!o)return a;const t=n.replace(o,"");let r=_c.has(e)?1:0;return o!==n&&(r*=100),e+"("+r+t+")"}const Oc=/\b([a-z-]*)\(.*?\)/gu,$c={...Ti,getAnimatableNone:a=>{const e=a.match(Oc);return e?e.map(Vc).join(" "):a}},Wc={...si,transform:Math.round},Uc={borderWidth:wi,borderTopWidth:wi,borderRightWidth:wi,borderBottomWidth:wi,borderLeftWidth:wi,borderRadius:wi,borderTopLeftRadius:wi,borderTopRightRadius:wi,borderBottomRightRadius:wi,borderBottomLeftRadius:wi,width:wi,maxWidth:wi,height:wi,maxHeight:wi,top:wi,right:wi,bottom:wi,left:wi,inset:wi,insetBlock:wi,insetBlockStart:wi,insetBlockEnd:wi,insetInline:wi,insetInlineStart:wi,insetInlineEnd:wi,padding:wi,paddingTop:wi,paddingRight:wi,paddingBottom:wi,paddingLeft:wi,paddingBlock:wi,paddingBlockStart:wi,paddingBlockEnd:wi,paddingInline:wi,paddingInlineStart:wi,paddingInlineEnd:wi,margin:wi,marginTop:wi,marginRight:wi,marginBottom:wi,marginLeft:wi,marginBlock:wi,marginBlockStart:wi,marginBlockEnd:wi,marginInline:wi,marginInlineStart:wi,marginInlineEnd:wi,fontSize:wi,backgroundPositionX:wi,backgroundPositionY:wi,rotate:yi,rotateX:yi,rotateY:yi,rotateZ:yi,scale:li,scaleX:li,scaleY:li,scaleZ:li,skew:yi,skewX:yi,skewY:yi,distance:wi,translateX:wi,translateY:wi,translateZ:wi,x:wi,y:wi,z:wi,perspective:wi,transformPerspective:wi,opacity:ii,originX:ji,originY:ji,originZ:wi,zIndex:Wc,fillOpacity:ii,strokeOpacity:ii,numOctaves:Wc},Hc={...Uc,color:Ci,backgroundColor:Ci,outlineColor:Ci,fill:Ci,stroke:Ci,borderColor:Ci,borderTopColor:Ci,borderRightColor:Ci,borderBottomColor:Ci,borderLeftColor:Ci,filter:$c,WebkitFilter:$c},Yc=a=>Hc[a];function Gc(a,e){let n=Yc(a);return n!==$c&&(n=Ti),n.getAnimatableNone?n.getAnimatableNone(e):void 0}const Kc=new Set(["auto","none","0"]);class Xc extends Wl{constructor(a,e,n,o,t){super(a,e,n,o,t,!0)}readKeyframes(){const{unresolvedKeyframes:a,element:e,name:n}=this;if(!e||!e.current)return;super.readKeyframes();for(let i=0;i{e.getValue(a).set(n)}),this.resolveNoneKeyframes()}}function Jc(a,e,n){if(null==a)return[];if(a instanceof EventTarget)return[a];if("string"==typeof a){let e=document;const o=(null==n?void 0:n[a])??e.querySelectorAll(a);return o?Array.from(o):[]}return Array.from(a).filter(a=>null!=a)}const Zc=(a,e)=>e&&"number"==typeof a?e.transform(a):a;function Qc(a){return bs(a)&&"offsetHeight"in a}const{schedule:ad}=Hs(queueMicrotask,!1),ed={x:!1,y:!1};function nd(){return ed.x||ed.y}function od(a,e){const n=Jc(a),o=new AbortController;return[n,{passive:!0,...e,signal:o.signal},()=>o.abort()]}function td(a){return!("touch"===a.pointerType||nd())}const rd=(a,e)=>!!e&&(a===e||rd(a,e.parentElement)),sd=a=>"mouse"===a.pointerType?"number"!=typeof a.button||a.button<=0:!1!==a.isPrimary,id=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function ld(a){return id.has(a.tagName)||!0===a.isContentEditable}const cd=new WeakSet;function dd(a){return e=>{"Enter"===e.key&&a(e)}}function ud(a,e){a.dispatchEvent(new PointerEvent("pointer"+e,{isPrimary:!0,bubbles:!0}))}function hd(a){return sd(a)&&!nd()}function md(a){return bs(a)&&"ownerSVGElement"in a}function pd(a){return md(a)&&"svg"===a.tagName}const gd=[...Rc,Ci,Ti],bd=()=>({x:{min:0,max:0},y:{min:0,max:0}}),fd={current:null},yd={current:!1},vd="undefined"!=typeof window,wd=new WeakMap;function kd(a){return null!==a&&"object"==typeof a&&"function"==typeof a.start}function xd(a){return"string"==typeof a||Array.isArray(a)}const jd=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],zd=["initial",...jd];function Cd(a){return kd(a.animate)||zd.some(e=>xd(a[e]))}function Ad(a){return Boolean(Cd(a)||a.variants)}const Dd=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let Ed={};function Bd(a){Ed=a}class Fd{scrapeMotionValuesFromProps(a,e,n){return{}}constructor({parent:a,props:e,presenceContext:n,reducedMotionConfig:o,blockInitialAnimation:t,visualState:r},s={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=Wl,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const a=Qs.now();this.renderScheduledAtthis.bindToMotionValue(e,a)),"never"===this.reducedMotionConfig?this.shouldReduceMotion=!1:"always"===this.reducedMotionConfig?this.shouldReduceMotion=!0:(yd.current||function(){if(yd.current=!0,vd)if(window.matchMedia){const a=window.matchMedia("(prefers-reduced-motion)"),e=()=>fd.current=a.matches;a.addEventListener("change",e),e()}else fd.current=!1}(),this.shouldReduceMotion=fd.current),null==(e=this.parent)||e.addChild(this),this.update(this.props,this.presenceContext)}unmount(){var a;this.projection&&this.projection.unmount(),Gs(this.notifyUpdate),Gs(this.render),this.valueSubscriptions.forEach(a=>a()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),null==(a=this.parent)||a.removeChild(this);for(const e in this.events)this.events[e].clear();for(const e in this.features){const a=this.features[e];a&&(a.unmount(),a.isMounted=!1)}this.current=null}addChild(a){this.children.add(a),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(a)}removeChild(a){this.children.delete(a),this.enteringChildren&&this.enteringChildren.delete(a)}bindToMotionValue(a,e){this.valueSubscriptions.has(a)&&this.valueSubscriptions.get(a)();const n=Ml.has(a);n&&this.onBindTransform&&this.onBindTransform();const o=e.on("change",e=>{this.latestValues[a]=e,this.props.onUpdate&&Ys.preRender(this.notifyUpdate),n&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let t;"undefined"!=typeof window&&window.MotionCheckAppearSync&&(t=window.MotionCheckAppearSync(this,a,e)),this.valueSubscriptions.set(a,()=>{o(),t&&t(),e.owner&&e.stop()})}sortNodePosition(a){return this.current&&this.sortInstanceNodePosition&&this.type===a.type?this.sortInstanceNodePosition(this.current,a.current):0}updateFeatures(){let a="animation";for(a in Ed){const e=Ed[a];if(!e)continue;const{isEnabled:n,Feature:o}=e;if(!this.features[a]&&o&&n(this.props)&&(this.features[a]=new o(this)),this.features[a]){const e=this.features[a];e.isMounted?e.update():(e.mount(),e.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):{x:{min:0,max:0},y:{min:0,max:0}}}getStaticValue(a){return this.latestValues[a]}setStaticValue(a,e){this.latestValues[a]=e}update(a,e){(a.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=a,this.prevPresenceContext=this.presenceContext,this.presenceContext=e;for(let n=0;ne.variantChildren.delete(a)}addValue(a,e){const n=this.values.get(a);e!==n&&(n&&this.removeValue(a),this.bindToMotionValue(a,e),this.values.set(a,e),this.latestValues[a]=e.get())}removeValue(a){this.values.delete(a);const e=this.valueSubscriptions.get(a);e&&(e(),this.valueSubscriptions.delete(a)),delete this.latestValues[a],this.removeValueFromRenderState(a,this.renderState)}hasValue(a){return this.values.has(a)}getValue(a,e){if(this.props.values&&this.props.values[a])return this.props.values[a];let n=this.values.get(a);return void 0===n&&void 0!==e&&(n=xc(null===e?void 0:e,{owner:this}),this.addValue(a,n)),n}readValue(a,e){let n=void 0===this.latestValues[a]&&this.current?this.getBaseTargetFromProps(this.props,a)??this.readValueFromInstance(this.current,a,this.options):this.latestValues[a];var o;return null!=n&&("string"==typeof n&&(gs(n)||fs(n))?n=parseFloat(n):(o=n,!gd.find(Lc(o))&&Ti.test(e)&&(n=Gc(a,e))),this.setBaseTarget(a,Dc(n)?n.get():n)),Dc(n)?n.get():n}setBaseTarget(a,e){this.baseTarget[a]=e}getBaseTarget(a){var e;const{initial:n}=this.props;let o;if("string"==typeof n||"object"==typeof n){const t=yc(this.props,n,null==(e=this.presenceContext)?void 0:e.custom);t&&(o=t[a])}if(n&&void 0!==o)return o;const t=this.getBaseTargetFromProps(this.props,a);return void 0===t||Dc(t)?void 0!==this.initialValues[a]&&void 0===o?void 0:this.baseTarget[a]:t}on(a,e){return this.events[a]||(this.events[a]=new js),this.events[a].add(e)}notify(a,...e){this.events[a]&&this.events[a].notify(...e)}scheduleRenderMicrotask(){ad.render(this.render)}}class qd extends Fd{constructor(){super(...arguments),this.KeyframeResolver=Xc}sortInstanceNodePosition(a,e){return 2&a.compareDocumentPosition(e)?1:-1}getBaseTargetFromProps(a,e){const n=a.style;return n?n[e]:void 0}removeValueFromRenderState(a,{vars:e,style:n}){delete e[a],delete n[a]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:a}=this.props;Dc(a)&&(this.childSubscription=a.on("change",a=>{this.current&&(this.current.textContent=`${a}`)}))}}class Sd{constructor(a){this.isMounted=!1,this.node=a}update(){}}function Md({top:a,left:e,right:n,bottom:o}){return{x:{min:e,max:n},y:{min:a,max:o}}}function Td(a){return void 0===a||1===a}function Pd({scale:a,scaleX:e,scaleY:n}){return!Td(a)||!Td(e)||!Td(n)}function Ld(a){return Pd(a)||Rd(a)||a.z||a.rotate||a.rotateX||a.rotateY||a.skewX||a.skewY}function Rd(a){return Nd(a.x)||Nd(a.y)}function Nd(a){return a&&"0%"!==a}function Id(a,e,n){return n+e*(a-n)}function _d(a,e,n,o,t){return void 0!==t&&(a=Id(a,t,o)),Id(a,n,o)+e}function Vd(a,e=0,n=1,o,t){a.min=_d(a.min,e,n,o,t),a.max=_d(a.max,e,n,o,t)}function Od(a,{x:e,y:n}){Vd(a.x,e.translate,e.scale,e.originPoint),Vd(a.y,n.translate,n.scale,n.originPoint)}const $d=.999999999999,Wd=1.0000000000001;function Ud(a,e){a.min=a.min+e,a.max=a.max+e}function Hd(a,e,n,o,t=.5){Vd(a,e,n,Ri(a.min,a.max,t),o)}function Yd(a,e){Hd(a.x,e.x,e.scaleX,e.scale,e.originX),Hd(a.y,e.y,e.scaleY,e.scale,e.originY)}function Gd(a,e){return Md(function(a,e){if(!e)return a;const n=e({x:a.left,y:a.top}),o=e({x:a.right,y:a.bottom});return{top:n.y,left:n.x,bottom:o.y,right:o.x}}(a.getBoundingClientRect(),e))}const Kd={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},Xd=Sl.length;function Jd(a,e,n){const{style:o,vars:t,transformOrigin:r}=a;let s=!1,i=!1;for(const l in e){const a=e[l];if(Ml.has(l))s=!0;else if(ei(l))t[l]=a;else{const e=Zc(a,Uc[l]);l.startsWith("origin")?(i=!0,r[l]=e):o[l]=e}}if(e.transform||(s||n?o.transform=function(a,e,n){let o="",t=!0;for(let r=0;r{if(!e.target)return a;if("string"==typeof a){if(!wi.test(a))return a;a=parseFloat(a)}return`${Qd(a,e.target.x)}% ${Qd(a,e.target.y)}%`}},eu={correct:(a,{treeScale:e,projectionDelta:n})=>{const o=a,t=Ti.parse(a);if(t.length>5)return o;const r=Ti.createTransformer(a),s="number"!=typeof t[0]?1:0,i=n.x.scale*e.x,l=n.y.scale*e.y;t[0+s]/=i,t[1+s]/=l;const c=Ri(i,l,.5);return"number"==typeof t[2+s]&&(t[2+s]/=c),"number"==typeof t[3+s]&&(t[3+s]/=c),r(t)}},nu={borderRadius:{...au,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:au,borderTopRightRadius:au,borderBottomLeftRadius:au,borderBottomRightRadius:au,boxShadow:eu};function ou(a){for(const e in a)nu[e]=a[e],ei(e)&&(nu[e].isCSSVariable=!0)}function tu(a,{layout:e,layoutId:n}){return Ml.has(a)||a.startsWith("origin")||(e||void 0!==n)&&(!!nu[a]||"opacity"===a)}function ru(a,e,n){var o;const t=a.style,r=null==e?void 0:e.style,s={};if(!t)return s;for(const i in t)(Dc(t[i])||r&&Dc(r[i])||tu(i,a)||void 0!==(null==(o=null==n?void 0:n.getValue(i))?void 0:o.liveStyle))&&(s[i]=t[i]);return s}class su extends qd{constructor(){super(...arguments),this.type="html",this.renderInstance=Zd}readValueFromInstance(a,e){var n,o;if(Ml.has(e))return(null==(n=this.projection)?void 0:n.isProjecting)?Bl(e):((a,e)=>{const{transform:n="none"}=getComputedStyle(a);return Fl(n,e)})(a,e);{const n=(o=a,window.getComputedStyle(o)),t=(ei(e)?n.getPropertyValue(e):n[e])||0;return"string"==typeof t?t.trim():t}}measureInstanceViewportBox(a,{transformPagePoint:e}){return Gd(a,e)}build(a,e,n){Jd(a,e,n.transformTemplate)}scrapeMotionValuesFromProps(a,e,n){return ru(a,e,n)}}const iu={offset:"stroke-dashoffset",array:"stroke-dasharray"},lu={offset:"strokeDashoffset",array:"strokeDasharray"},cu=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function du(a,{attrX:e,attrY:n,attrScale:o,pathLength:t,pathSpacing:r=1,pathOffset:s=0,...i},l,c,d){if(Jd(a,i,c),l)return void(a.style.viewBox&&(a.attrs.viewBox=a.style.viewBox));a.attrs=a.style,a.style={};const{attrs:u,style:h}=a;u.transform&&(h.transform=u.transform,delete u.transform),(h.transform||u.transformOrigin)&&(h.transformOrigin=u.transformOrigin??"50% 50%",delete u.transformOrigin),h.transform&&(h.transformBox=(null==d?void 0:d.transformBox)??"fill-box",delete u.transformBox);for(const m of cu)void 0!==u[m]&&(h[m]=u[m],delete u[m]);void 0!==e&&(u.x=e),void 0!==n&&(u.y=n),void 0!==o&&(u.scale=o),void 0!==t&&function(a,e,n=1,o=0,t=!0){a.pathLength=1;const r=t?iu:lu;a[r.offset]=""+-o,a[r.array]=`${e} ${n}`}(u,t,r,s,!1)}const uu=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),hu=a=>"string"==typeof a&&"svg"===a.toLowerCase();function mu(a,e,n){const o=ru(a,e,n);for(const t in a)(Dc(a[t])||Dc(e[t]))&&(o[-1!==Sl.indexOf(t)?"attr"+t.charAt(0).toUpperCase()+t.substring(1):t]=a[t]);return o}class pu extends qd{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=bd}getBaseTargetFromProps(a,e){return a[e]}readValueFromInstance(a,e){if(Ml.has(e)){const a=Yc(e);return a&&a.default||0}return e=uu.has(e)?e:Bc(e),a.getAttribute(e)}scrapeMotionValuesFromProps(a,e,n){return mu(a,e,n)}build(a,e,n){du(a,e,this.isSVGTag,n.transformTemplate,n.style)}renderInstance(a,e,n,o){!function(a,e,n,o){Zd(a,e,void 0,o);for(const t in e.attrs)a.setAttribute(uu.has(t)?t:Bc(t),e.attrs[t])}(a,e,0,o)}mount(a){this.isSVGTag=hu(a.tagName),super.mount(a)}}const gu=zd.length;function bu(a){if(!a)return;if(!a.isControllingVariants){const e=a.parent&&bu(a.parent)||{};return void 0!==a.props.initial&&(e.initial=a.props.initial),e}const e={};for(let n=0;nPromise.all(e.map(({animation:e,options:n})=>Pc(a,e,n)))}(a),n=ju(),o=!0;const t=e=>(n,o)=>{var t;const r=vc(a,o,"exit"===e?null==(t=a.presenceContext)?void 0:t.custom:void 0);if(r){const{transition:a,transitionEnd:e,...o}=r;n={...n,...o,...e}}return n};function r(r){const{props:s}=a,i=bu(a.parent)||{},l=[],c=new Set;let d={},u=1/0;for(let e=0;eu&&g,w=!1;const k=Array.isArray(p)?p:[p];let x=k.reduce(t(h),{});!1===b&&(x={});const{prevResolvedValues:j={}}=m,z={...j,...x},C=e=>{v=!0,c.has(e)&&(w=!0,c.delete(e)),m.needsAnimating[e]=!0;const n=a.getValue(e);n&&(n.liveStyle=!1)};for(const a in z){const e=x[a],n=j[a];if(d.hasOwnProperty(a))continue;let o=!1;o=jc(e)&&jc(n)?!fu(e,n):e!==n,o?null!=e?C(a):c.add(a):void 0!==e&&c.has(a)?C(a):m.protectedKeys[a]=!0}m.prevProp=p,m.prevResolvedValues=x,m.isActive&&(d={...d,...x}),o&&a.blockInitialAnimation&&(v=!1);const A=f&&y;v&&(!A||w)&&l.push(...k.map(e=>{const n={type:h};if("string"==typeof e&&o&&!A&&a.manuallyAnimateOnMount&&a.parent){const{parent:o}=a,t=vc(o,e);if(o.enteringChildren&&t){const{delayChildren:e}=t.transition||{};n.delay=lc(o.enteringChildren,a,e)}}return{animation:e,options:n}}))}if(c.size){const e={};if("boolean"!=typeof s.initial){const n=vc(a,Array.isArray(s.initial)?s.initial[0]:s.initial);n&&n.transition&&(e.transition=n.transition)}c.forEach(n=>{const o=a.getBaseTarget(n),t=a.getValue(n);t&&(t.liveStyle=!0),e[n]=o??null}),l.push({animation:e})}let h=Boolean(l.length);return!o||!1!==s.initial&&s.initial!==s.animate||a.manuallyAnimateOnMount||(h=!1),o=!1,h?e(l):Promise.resolve()}return{animateChanges:r,setActive:function(e,o){var t;if(n[e].isActive===o)return Promise.resolve();null==(t=a.variantChildren)||t.forEach(a=>{var n;return null==(n=a.animationState)?void 0:n.setActive(e,o)}),n[e].isActive=o;const s=r(e);for(const a in n)n[a].protectedKeys={};return s},setAnimateFunction:function(n){e=n(a)},getState:()=>n,reset:()=>{n=ju()}}}function ku(a,e){return"string"==typeof e?e!==a:!!Array.isArray(e)&&!fu(e,a)}function xu(a=!1){return{isActive:a,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function ju(){return{animate:xu(!0),whileInView:xu(),whileHover:xu(),whileTap:xu(),whileDrag:xu(),whileFocus:xu(),exit:xu()}}function zu(a,e){a.min=e.min,a.max=e.max}function Cu(a,e){zu(a.x,e.x),zu(a.y,e.y)}function Au(a,e){a.translate=e.translate,a.scale=e.scale,a.originPoint=e.originPoint,a.origin=e.origin}function Du(a){return a.max-a.min}function Eu(a,e,n,o=.5){a.origin=o,a.originPoint=Ri(e.min,e.max,a.origin),a.scale=Du(n)/Du(e),a.translate=Ri(n.min,n.max,a.origin)-a.originPoint,(a.scale>=.9999&&a.scale<=1.0001||isNaN(a.scale))&&(a.scale=1),(a.translate>=-.01&&a.translate<=.01||isNaN(a.translate))&&(a.translate=0)}function Bu(a,e,n,o){Eu(a.x,e.x,n.x,o?o.originX:void 0),Eu(a.y,e.y,n.y,o?o.originY:void 0)}function Fu(a,e,n){a.min=n.min+e.min,a.max=a.min+Du(e)}function qu(a,e,n){a.min=e.min-n.min,a.max=a.min+Du(e)}function Su(a,e,n){qu(a.x,e.x,n.x),qu(a.y,e.y,n.y)}function Mu(a,e,n,o,t){return a=Id(a-=e,1/n,o),void 0!==t&&(a=Id(a,1/t,o)),a}function Tu(a,e,[n,o,t],r,s){!function(a,e=0,n=1,o=.5,t,r=a,s=a){if(vi.test(e)&&(e=parseFloat(e),e=Ri(s.min,s.max,e/100)-s.min),"number"!=typeof e)return;let i=Ri(r.min,r.max,o);a===r&&(i-=e),a.min=Mu(a.min,e,n,i,t),a.max=Mu(a.max,e,n,i,t)}(a,e[n],e[o],e[t],e.scale,r,s)}const Pu=["x","scaleX","originX"],Lu=["y","scaleY","originY"];function Ru(a,e,n,o){Tu(a.x,e,Pu,n?n.x:void 0,o?o.x:void 0),Tu(a.y,e,Lu,n?n.y:void 0,o?o.y:void 0)}function Nu(a){return 0===a.translate&&1===a.scale}function Iu(a){return Nu(a.x)&&Nu(a.y)}function _u(a,e){return a.min===e.min&&a.max===e.max}function Vu(a,e){return Math.round(a.min)===Math.round(e.min)&&Math.round(a.max)===Math.round(e.max)}function Ou(a,e){return Vu(a.x,e.x)&&Vu(a.y,e.y)}function $u(a){return Du(a.x)/Du(a.y)}function Wu(a,e){return a.translate===e.translate&&a.scale===e.scale&&a.originPoint===e.originPoint}function Uu(a){return[a("x"),a("y")]}const Hu=["TopLeft","TopRight","BottomLeft","BottomRight"],Yu=Hu.length,Gu=a=>"string"==typeof a?parseFloat(a):a,Ku=a=>"number"==typeof a||wi.test(a);function Xu(a,e){return void 0!==a[e]?a[e]:a.borderRadius}const Ju=Qu(0,.5,Ls),Zu=Qu(.5,.95,vs);function Qu(a,e,n){return o=>oe?1:n(xs(a,e,o))}function ah(a,e,n){const o=Dc(a)?a:xc(a);return o.start(bc("",o,e,n)),o.animation}function eh(a,e,n,o={passive:!0}){return a.addEventListener(e,n,o),()=>a.removeEventListener(e,n)}const nh=(a,e)=>a.depth-e.depth;class oh{constructor(){this.children=[],this.isDirty=!1}add(a){us(this.children,a),this.isDirty=!0}remove(a){hs(this.children,a),this.isDirty=!0}forEach(a){this.isDirty&&this.children.sort(nh),this.isDirty=!1,this.children.forEach(a)}}function th(a,e){const n=Qs.now(),o=({timestamp:t})=>{const r=t-n;r>=e&&(Gs(o),a(r-e))};return Ys.setup(o,!0),()=>Gs(o)}function rh(a){return Dc(a)?a.get():a}class sh{constructor(){this.members=[]}add(a){us(this.members,a),a.scheduleRender()}remove(a){if(hs(this.members,a),a===this.prevLead&&(this.prevLead=void 0),a===this.lead){const a=this.members[this.members.length-1];a&&this.promote(a)}}relegate(a){const e=this.members.findIndex(e=>a===e);if(0===e)return!1;let n;for(let o=e;o>=0;o--){const a=this.members[o];if(!1!==a.isPresent){n=a;break}}return!!n&&(this.promote(n),!0)}promote(a,e){const n=this.lead;if(a!==n&&(this.prevLead=n,this.lead=a,a.show(),n)){n.instance&&n.scheduleRender(),a.scheduleRender();const o=n.options.layoutDependency,t=a.options.layoutDependency;void 0!==o&&void 0!==t&&o===t||(a.resumeFrom=n,e&&(a.resumeFrom.preserveOpacity=!0),n.snapshot&&(a.snapshot=n.snapshot,a.snapshot.latestValues=n.animationValues||n.latestValues),a.root&&a.root.isUpdating&&(a.isLayoutDirty=!0));const{crossfade:r}=a.options;!1===r&&n.hide()}}exitAnimationComplete(){this.members.forEach(a=>{const{options:e,resumingFrom:n}=a;e.onExitComplete&&e.onExitComplete(),n&&n.options.onExitComplete&&n.options.onExitComplete()})}scheduleRender(){this.members.forEach(a=>{a.instance&&a.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}const ih={hasAnimatedSinceResize:!0,hasEverUpdated:!1},lh=["","X","Y","Z"];let ch=0;function dh(a,e,n,o){const{latestValues:t}=e;t[a]&&(n[a]=t[a],e.setStaticValue(a,0),o&&(o[a]=0))}function uh(a){if(a.hasCheckedOptimisedAppear=!0,a.root===a)return;const{visualElement:e}=a.options;if(!e)return;const n=qc(e);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:e,layoutId:o}=a.options;window.MotionCancelOptimisedAnimation(n,"transform",Ys,!(e||o))}const{parent:o}=a;o&&!o.hasCheckedOptimisedAppear&&uh(o)}function hh({attachResizeListener:a,defaultParent:e,measureScroll:n,checkIsScrollRoot:o,resetTransform:t}){return class{constructor(a={},n=(null==e?void 0:e())){this.id=ch++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(gh),this.nodes.forEach(xh),this.nodes.forEach(jh),this.nodes.forEach(bh)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=a,this.root=n?n.root||n:this,this.path=n?[...n.path,n]:[],this.parent=n,this.depth=n?n.depth+1:0;for(let e=0;ethis.root.updateBlockedByResize=!1;Ys.read(()=>{o=window.innerWidth}),a(e,()=>{const a=window.innerWidth;a!==o&&(o=a,this.root.updateBlockedByResize=!0,n&&n(),n=th(t,250),ih.hasAnimatedSinceResize&&(ih.hasAnimatedSinceResize=!1,this.nodes.forEach(kh)))})}n&&this.root.registerSharedNode(n,this),!1!==this.options.animate&&t&&(n||o)&&this.addEventListener("didUpdate",({delta:a,hasLayoutChanged:e,hasRelativeLayoutChanged:n,layout:o})=>{if(this.isTreeAnimationBlocked())return this.target=void 0,void(this.relativeTarget=void 0);const r=this.options.transition||t.getDefaultTransition()||Bh,{onLayoutAnimationStart:s,onLayoutAnimationComplete:i}=t.getProps(),l=!this.targetLayout||!Ou(this.targetLayout,o),c=!e&&n;if(this.options.layoutRoot||this.resumeFrom||c||e&&(l||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const e={...gc(r,"layout"),onPlay:s,onComplete:i};(t.shouldReduceMotion||this.options.layoutRoot)&&(e.delay=0,e.type=!1),this.startAnimation(e),this.setAnimationOrigin(a,c)}else e||kh(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=o})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const a=this.getStack();a&&a.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),Gs(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(zh),this.animationId++)}getTransformTemplate(){const{visualElement:a}=this.options;return a&&a.getProps().transformTemplate}willUpdate(a=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked())return void(this.options.onExitComplete&&this.options.onExitComplete());if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&uh(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let t=0;t{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){!this.snapshot&&this.instance&&(this.snapshot=this.measure(),!this.snapshot||Du(this.snapshot.measuredBox.x)||Du(this.snapshot.measuredBox.y)||(this.snapshot=void 0))}updateLayout(){if(!this.instance)return;if(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead()||this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let n=0;n$d&&(e.x=1),e.y$d&&(e.y=1)}(this.layoutCorrected,this.treeScale,this.path,n),!e.layout||e.target||1===this.treeScale.x&&1===this.treeScale.y||(e.target=e.layout.layoutBox,e.targetWithTransforms={x:{min:0,max:0},y:{min:0,max:0}});const{target:l}=e;l?(this.projectionDelta&&this.prevProjectionDelta?(Au(this.prevProjectionDelta.x,this.projectionDelta.x),Au(this.prevProjectionDelta.y,this.projectionDelta.y)):this.createProjectionDeltas(),Bu(this.projectionDelta,this.layoutCorrected,l,this.latestValues),this.treeScale.x===s&&this.treeScale.y===i&&Wu(this.projectionDelta.x,this.prevProjectionDelta.x)&&Wu(this.projectionDelta.y,this.prevProjectionDelta.y)||(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",l))):this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender())}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(a=!0){var e;if(null==(e=this.options.visualElement)||e.scheduleRender(),a){const a=this.getStack();a&&a.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}},this.projectionDelta={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}},this.projectionDeltaWithTransform={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}}}setAnimationOrigin(a,e=!1){const n=this.snapshot,o=n?n.latestValues:{},t={...this.latestValues},r={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};this.relativeParent&&this.relativeParent.options.layoutRoot||(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!e;const s={x:{min:0,max:0},y:{min:0,max:0}},i=(n?n.source:void 0)!==(this.layout?this.layout.source:void 0),l=this.getStack(),c=!l||l.members.length<=1,d=Boolean(i&&!c&&!0===this.options.crossfade&&!this.path.some(Eh));let u;this.animationProgress=0,this.mixTargetDelta=e=>{const n=e/1e3;var l,h,m,p,g,b;Ah(r.x,a.x,n),Ah(r.y,a.y,n),this.setTargetDelta(r),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(Su(s,this.layout.layoutBox,this.relativeParent.layout.layoutBox),m=this.relativeTarget,p=this.relativeTargetOrigin,g=s,b=n,Dh(m.x,p.x,g.x,b),Dh(m.y,p.y,g.y,b),u&&(l=this.relativeTarget,h=u,_u(l.x,h.x)&&_u(l.y,h.y))&&(this.isProjectionDirty=!1),u||(u={x:{min:0,max:0},y:{min:0,max:0}}),Cu(u,this.relativeTarget)),i&&(this.animationValues=t,function(a,e,n,o,t,r){t?(a.opacity=Ri(0,n.opacity??1,Ju(o)),a.opacityExit=Ri(e.opacity??1,0,Zu(o))):r&&(a.opacity=Ri(e.opacity??1,n.opacity??1,o));for(let s=0;s{ih.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=xc(0)),this.currentAnimation=ah(this.motionValue,[0,1e3],{...a,velocity:0,isSync:!0,onUpdate:e=>{this.mixTargetDelta(e),a.onUpdate&&a.onUpdate(e)},onStop:()=>{},onComplete:()=>{a.onComplete&&a.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const a=this.getStack();a&&a.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(1e3),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const a=this.getLead();let{targetWithTransforms:e,target:n,layout:o,latestValues:t}=a;if(e&&n&&o){if(this!==a&&this.layout&&o&&Mh(this.options.animationType,this.layout.layoutBox,o.layoutBox)){n=this.target||{x:{min:0,max:0},y:{min:0,max:0}};const e=Du(this.layout.layoutBox.x);n.x.min=a.target.x.min,n.x.max=n.x.min+e;const o=Du(this.layout.layoutBox.y);n.y.min=a.target.y.min,n.y.max=n.y.min+o}Cu(e,n),Yd(e,t),Bu(this.projectionDeltaWithTransform,this.layoutCorrected,e,t)}}registerSharedNode(a,e){this.sharedNodes.has(a)||this.sharedNodes.set(a,new sh),this.sharedNodes.get(a).add(e);const n=e.options.initialPromotionConfig;e.promote({transition:n?n.transition:void 0,preserveFollowOpacity:n&&n.shouldPreserveFollowOpacity?n.shouldPreserveFollowOpacity(e):void 0})}isLead(){const a=this.getStack();return!a||a.lead===this}getLead(){var a;const{layoutId:e}=this.options;return e&&(null==(a=this.getStack())?void 0:a.lead)||this}getPrevLead(){var a;const{layoutId:e}=this.options;return e?null==(a=this.getStack())?void 0:a.prevLead:void 0}getStack(){const{layoutId:a}=this.options;if(a)return this.root.sharedNodes.get(a)}promote({needsReset:a,transition:e,preserveFollowOpacity:n}={}){const o=this.getStack();o&&o.promote(this,n),a&&(this.projectionDelta=void 0,this.needsReset=!0),e&&this.setOptions({transition:e})}relegate(){const a=this.getStack();return!!a&&a.relegate(this)}resetSkewAndRotation(){const{visualElement:a}=this.options;if(!a)return;let e=!1;const{latestValues:n}=a;if((n.z||n.rotate||n.rotateX||n.rotateY||n.rotateZ||n.skewX||n.skewY)&&(e=!0),!e)return;const o={};n.z&&dh("z",a,o,this.animationValues);for(let t=0;t{var e;return null==(e=a.currentAnimation)?void 0:e.stop()}),this.root.nodes.forEach(yh),this.root.sharedNodes.clear()}}}function mh(a){a.updateLayout()}function ph(a){var e;const n=(null==(e=a.resumeFrom)?void 0:e.snapshot)||a.snapshot;if(a.isLead()&&a.layout&&n&&a.hasListeners("didUpdate")){const{layoutBox:e,measuredBox:o}=a.layout,{animationType:t}=a.options,r=n.source!==a.layout.source;"size"===t?Uu(a=>{const o=r?n.measuredBox[a]:n.layoutBox[a],t=Du(o);o.min=e[a].min,o.max=o.min+t}):Mh(t,n.layoutBox,e)&&Uu(o=>{const t=r?n.measuredBox[o]:n.layoutBox[o],s=Du(e[o]);t.max=t.min+s,a.relativeTarget&&!a.currentAnimation&&(a.isProjectionDirty=!0,a.relativeTarget[o].max=a.relativeTarget[o].min+s)});const s={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};Bu(s,e,n.layoutBox);const i={x:{translate:0,scale:1,origin:0,originPoint:0},y:{translate:0,scale:1,origin:0,originPoint:0}};r?Bu(i,a.applyTransform(o,!0),n.measuredBox):Bu(i,e,n.layoutBox);const l=!Iu(s);let c=!1;if(!a.resumeFrom){const o=a.getClosestProjectingParent();if(o&&!o.resumeFrom){const{snapshot:t,layout:r}=o;if(t&&r){const s={x:{min:0,max:0},y:{min:0,max:0}};Su(s,n.layoutBox,t.layoutBox);const i={x:{min:0,max:0},y:{min:0,max:0}};Su(i,e,r.layoutBox),Ou(s,i)||(c=!0),o.options.layoutRoot&&(a.relativeTarget=i,a.relativeTargetOrigin=s,a.relativeParent=o)}}}a.notifyListeners("didUpdate",{layout:e,snapshot:n,delta:i,layoutDelta:s,hasLayoutChanged:l,hasRelativeLayoutChanged:c})}else if(a.isLead()){const{onExitComplete:e}=a.options;e&&e()}a.options.transition=void 0}function gh(a){a.parent&&(a.isProjecting()||(a.isProjectionDirty=a.parent.isProjectionDirty),a.isSharedProjectionDirty||(a.isSharedProjectionDirty=Boolean(a.isProjectionDirty||a.parent.isProjectionDirty||a.parent.isSharedProjectionDirty)),a.isTransformDirty||(a.isTransformDirty=a.parent.isTransformDirty))}function bh(a){a.isProjectionDirty=a.isSharedProjectionDirty=a.isTransformDirty=!1}function fh(a){a.clearSnapshot()}function yh(a){a.clearMeasurements()}function vh(a){a.isLayoutDirty=!1}function wh(a){const{visualElement:e}=a.options;e&&e.getProps().onBeforeLayoutMeasure&&e.notify("BeforeLayoutMeasure"),a.resetTransform()}function kh(a){a.finishAnimation(),a.targetDelta=a.relativeTarget=a.target=void 0,a.isProjectionDirty=!0}function xh(a){a.resolveTargetDelta()}function jh(a){a.calcProjection()}function zh(a){a.resetSkewAndRotation()}function Ch(a){a.removeLeadSnapshot()}function Ah(a,e,n){a.translate=Ri(e.translate,0,n),a.scale=Ri(e.scale,1,n),a.origin=e.origin,a.originPoint=e.originPoint}function Dh(a,e,n,o){a.min=Ri(e.min,n.min,o),a.max=Ri(e.max,n.max,o)}function Eh(a){return a.animationValues&&void 0!==a.animationValues.opacityExit}const Bh={duration:.45,ease:[.4,0,.1,1]},Fh=a=>"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(a),qh=Fh("applewebkit/")&&!Fh("chrome/")?Math.round:vs;function Sh(a){a.min=qh(a.min),a.max=qh(a.max)}function Mh(a,e,n){return"position"===a||"preserve-aspect"===a&&(o=$u(e),t=$u(n),!(Math.abs(o-t)<=.2));var o,t}function Th(a){var e;return a!==a.root&&(null==(e=a.scroll)?void 0:e.wasRoot)}const Ph=hh({attachResizeListener:(a,e)=>eh(a,"resize",e),measureScroll:()=>{var a,e;return{x:document.documentElement.scrollLeft||(null==(a=document.body)?void 0:a.scrollLeft)||0,y:document.documentElement.scrollTop||(null==(e=document.body)?void 0:e.scrollTop)||0}},checkIsScrollRoot:()=>!0}),Lh=a=>!a.isLayoutDirty&&a.willUpdate(!1);function Rh(){const a=new Set,e=new WeakMap,n=()=>a.forEach(Lh);return{add:o=>{a.add(o),e.set(o,o.addEventListener("willUpdate",n))},remove:o=>{a.delete(o);const t=e.get(o);t&&(t(),e.delete(o)),n()},dirty:n}}const Nh={current:void 0},Ih=hh({measureScroll:a=>({x:a.scrollLeft,y:a.scrollTop}),defaultParent:()=>{if(!Nh.current){const a=new Ph({});a.mount(window),a.setOptions({layoutScroll:!0}),Nh.current=a}return Nh.current},resetTransform:(a,e)=>{a.style.transform=void 0!==e?e:"none"},checkIsScrollRoot:a=>Boolean("fixed"===window.getComputedStyle(a).position)}),_h=t.createContext({transformPagePoint:a=>a,isStatic:!1,reducedMotion:"never"});function Vh(a,e){if("function"==typeof a)return a(e);null!=a&&(a.current=e)}class Oh extends t.Component{getSnapshotBeforeUpdate(a){const e=this.props.childRef.current;if(e&&a.isPresent&&!this.props.isPresent){const a=e.offsetParent,n=Qc(a)&&a.offsetWidth||0,o=Qc(a)&&a.offsetHeight||0,t=this.props.sizeRef.current;t.height=e.offsetHeight||0,t.width=e.offsetWidth||0,t.top=e.offsetTop,t.left=e.offsetLeft,t.right=n-t.width-t.left,t.bottom=o-t.height-t.top}return null}componentDidUpdate(){}render(){return this.props.children}}function $h({children:a,isPresent:e,anchorX:n,anchorY:o,root:s}){var i;const l=t.useId(),c=t.useRef(null),d=t.useRef({width:0,height:0,top:0,left:0,right:0,bottom:0}),{nonce:u}=t.useContext(_h),h=(null==(i=a.props)?void 0:i.ref)??(null==a?void 0:a.ref),m=function(...a){return t.useCallback(function(...a){return e=>{let n=!1;const o=a.map(a=>{const o=Vh(a,e);return n||"function"!=typeof o||(n=!0),o});if(n)return()=>{for(let e=0;e{const{width:a,height:t,top:r,left:i,right:h,bottom:m}=d.current;if(e||!c.current||!a||!t)return;const p="left"===n?`left: ${i}`:`right: ${h}`,g="bottom"===o?`bottom: ${m}`:`top: ${r}`;c.current.dataset.motionPopId=l;const b=document.createElement("style");u&&(b.nonce=u);const f=s??document.head;return f.appendChild(b),b.sheet&&b.sheet.insertRule(`\n [data-motion-pop-id="${l}"] {\n position: absolute !important;\n width: ${a}px !important;\n height: ${t}px !important;\n ${p}px !important;\n ${g}px !important;\n }\n `),()=>{f.contains(b)&&f.removeChild(b)}},[e]),r.jsx(Oh,{isPresent:e,childRef:c,sizeRef:d,children:t.cloneElement(a,{ref:m})})}const Wh=({children:a,initial:e,isPresent:n,onExitComplete:o,custom:s,presenceAffectsLayout:i,mode:l,anchorX:c,anchorY:d,root:u})=>{const h=is(Uh),m=t.useId();let p=!0,g=t.useMemo(()=>(p=!1,{id:m,initial:e,isPresent:n,custom:s,onExitComplete:a=>{h.set(a,!0);for(const e of h.values())if(!e)return;o&&o()},register:a=>(h.set(a,!1),()=>h.delete(a))}),[n,h,o]);return i&&p&&(g={...g}),t.useMemo(()=>{h.forEach((a,e)=>h.set(e,!1))},[n]),t.useEffect(()=>{!n&&!h.size&&o&&o()},[n]),"popLayout"===l&&(a=r.jsx($h,{isPresent:n,anchorX:c,anchorY:d,root:u,children:a})),r.jsx(ds.Provider,{value:g,children:a})};function Uh(){return new Map}function Hh(a=!0){const e=t.useContext(ds);if(null===e)return[!0,null];const{isPresent:n,onExitComplete:o,register:r}=e,s=t.useId();t.useEffect(()=>{if(a)return r(s)},[a]);const i=t.useCallback(()=>a&&o&&o(s),[s,o,a]);return!n&&o?[!1,i]:[!0]}function Yh(){return null===(a=t.useContext(ds))||a.isPresent;var a}const Gh=a=>a.key||"";function Kh(a){const e=[];return t.Children.forEach(a,a=>{t.isValidElement(a)&&e.push(a)}),e}const Xh=({children:a,custom:e,initial:n=!0,onExitComplete:o,presenceAffectsLayout:s=!0,mode:i="sync",propagate:l=!1,anchorX:c="left",anchorY:d="top",root:u})=>{const[h,m]=Hh(l),p=t.useMemo(()=>Kh(a),[a]),g=l&&!h?[]:p.map(Gh),b=t.useRef(!0),f=t.useRef(p),y=is(()=>new Map),v=t.useRef(new Set),[w,k]=t.useState(p),[x,j]=t.useState(p);cs(()=>{b.current=!1,f.current=p;for(let a=0;a{const t=Gh(a),w=!(l&&!h)&&(p===x||g.includes(t));return r.jsx(Wh,{isPresent:w,initial:!(b.current&&!n)&&void 0,custom:e,presenceAffectsLayout:s,mode:i,root:u,onExitComplete:w?void 0:()=>{if(v.current.has(t))return;if(v.current.add(t),!y.has(t))return;y.set(t,!0);let a=!0;y.forEach(e=>{e||(a=!1)}),a&&(null==C||C(),j(f.current),l&&(null==m||m()),o&&o())},anchorX:c,anchorY:d,children:a},t)})})},Jh=t.createContext(null);const Zh=a=>!0===a,Qh=({children:a,id:e,inherit:n=!0})=>{const o=t.useContext(ss),s=t.useContext(Jh),[i,l]=function(){const a=function(){const a=t.useRef(!1);return cs(()=>(a.current=!0,()=>{a.current=!1}),[]),a}(),[e,n]=t.useState(0),o=t.useCallback(()=>{a.current&&n(e+1)},[e]);return[t.useCallback(()=>Ys.postRender(o),[o]),e]}(),c=t.useRef(null),d=o.id||s;null===c.current&&((a=>Zh(!0===a)||"id"===a)(n)&&d&&(e=e?d+"-"+e:d),c.current={id:e,group:Zh(n)&&o.group||Rh()});const u=t.useMemo(()=>({...c.current,forceRender:i}),[l]);return r.jsx(ss.Provider,{value:u,children:a})},am=t.createContext({strict:!1}),em={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let nm=!1;function om(){return function(){if(nm)return;const a={};for(const e in em)a[e]={isEnabled:a=>em[e].some(e=>!!a[e])};Bd(a),nm=!0}(),Ed}const tm=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function rm(a){return a.startsWith("while")||a.startsWith("drag")&&"draggable"!==a||a.startsWith("layout")||a.startsWith("onTap")||a.startsWith("onPan")||a.startsWith("onLayout")||tm.has(a)}let sm=a=>!rm(a);function im(a){"function"==typeof a&&(sm=e=>e.startsWith("on")?!rm(e):a(e))}try{im(require("@emotion/is-prop-valid").default)}catch{}const lm=t.createContext({});function cm(a){return Array.isArray(a)?a.join(" "):a}function dm(a,e,n){for(const o in e)Dc(e[o])||tu(o,n)||(a[o]=e[o])}function um(a,e){const n={},o=function(a,e){const n={};return dm(n,a.style||{},a),Object.assign(n,function({transformTemplate:a},e){return t.useMemo(()=>{const n={style:{},transform:{},transformOrigin:{},vars:{}};return Jd(n,e,a),Object.assign({},n.vars,n.style)},[e])}(a,e)),n}(a,e);return a.drag&&!1!==a.dragListener&&(n.draggable=!1,o.userSelect=o.WebkitUserSelect=o.WebkitTouchCallout="none",o.touchAction=!0===a.drag?"none":"pan-"+("x"===a.drag?"y":"x")),void 0===a.tabIndex&&(a.onTap||a.onTapStart||a.whileTap)&&(n.tabIndex=0),n.style=o,n}function hm(a,e,n,o){const r=t.useMemo(()=>{const n={style:{},transform:{},transformOrigin:{},vars:{},attrs:{}};return du(n,e,hu(o),a.transformTemplate,a.style),{...n.attrs,style:{...n.style}}},[e]);if(a.style){const e={};dm(e,a.style,a),r.style={...e,...r.style}}return r}const mm=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function pm(a){return"string"==typeof a&&!a.includes("-")&&!!(mm.indexOf(a)>-1||/[A-Z]/u.test(a))}function gm(a,e,n,{latestValues:o},r,s=!1,i){const l=(i??pm(a)?hm:um)(e,o,r,a),c=function(a,e,n){const o={};for(const t in a)"values"===t&&"object"==typeof a.values||(sm(t)||!0===n&&rm(t)||!e&&!rm(t)||a.draggable&&t.startsWith("onDrag"))&&(o[t]=a[t]);return o}(e,"string"==typeof a,s),d=a!==t.Fragment?{...c,...l,ref:n}:{},{children:u}=e,h=t.useMemo(()=>Dc(u)?u.get():u,[u]);return t.createElement(a,{...d,children:h})}function bm(a,e,n,o){const t={},r=o(a,{});for(const h in r)t[h]=rh(r[h]);let{initial:s,animate:i}=a;const l=Cd(a),c=Ad(a);e&&c&&!l&&!1!==a.inherit&&(void 0===s&&(s=e.initial),void 0===i&&(i=e.animate));let d=!!n&&!1===n.initial;d=d||!1===s;const u=d?i:s;if(u&&"boolean"!=typeof u&&!kd(u)){const e=Array.isArray(u)?u:[u];for(let n=0;n(e,n)=>{const o=t.useContext(lm),r=t.useContext(ds),s=()=>function({scrapeMotionValuesFromProps:a,createRenderState:e},n,o,t){return{latestValues:bm(n,o,t,a),renderState:e()}}(a,e,o,r);return n?s():is(s)},ym=fm({scrapeMotionValuesFromProps:ru,createRenderState:()=>({style:{},transform:{},transformOrigin:{},vars:{}})}),vm=fm({scrapeMotionValuesFromProps:mu,createRenderState:()=>({style:{},transform:{},transformOrigin:{},vars:{},attrs:{}})}),wm=Symbol.for("motionComponentSymbol");function km(a,e,n){const o=t.useRef(n);t.useInsertionEffect(()=>{o.current=n});const r=t.useRef(null);return t.useCallback(n=>{var t;n&&(null==(t=a.onMount)||t.call(a,n)),e&&(n?e.mount(n):e.unmount());const s=o.current;if("function"==typeof s)if(n){const a=s(n);"function"==typeof a&&(r.current=a)}else r.current?(r.current(),r.current=null):s(n);else s&&(s.current=n)},[e])}const xm=t.createContext({});function jm(a){return a&&"object"==typeof a&&Object.prototype.hasOwnProperty.call(a,"current")}function zm(a,e,n,o,r,s){var i,l;const{visualElement:c}=t.useContext(lm),d=t.useContext(am),u=t.useContext(ds),h=t.useContext(_h).reducedMotion,m=t.useRef(null),p=t.useRef(!1);o=o||d.renderer,!m.current&&o&&(m.current=o(a,{visualState:e,parent:c,props:n,presenceContext:u,blockInitialAnimation:!!u&&!1===u.initial,reducedMotionConfig:h,isSVG:s}),p.current&&m.current&&(m.current.manuallyAnimateOnMount=!0));const g=m.current,b=t.useContext(xm);!g||g.projection||!r||"html"!==g.type&&"svg"!==g.type||function(a,e,n,o){const{layoutId:t,layout:r,drag:s,dragConstraints:i,layoutScroll:l,layoutRoot:c,layoutCrossfade:d}=e;a.projection=new n(a.latestValues,e["data-framer-portal-id"]?void 0:Cm(a.parent)),a.projection.setOptions({layoutId:t,layout:r,alwaysMeasureLayout:Boolean(s)||i&&jm(i),visualElement:a,animationType:"string"==typeof r?r:"both",initialPromotionConfig:o,crossfade:d,layoutScroll:l,layoutRoot:c})}(m.current,n,r,b);const f=t.useRef(!1);t.useInsertionEffect(()=>{g&&f.current&&g.update(n,u)});const y=n[Fc],v=t.useRef(Boolean(y)&&!(null==(i=window.MotionHandoffIsComplete)?void 0:i.call(window,y))&&(null==(l=window.MotionHasOptimisedAnimation)?void 0:l.call(window,y)));return cs(()=>{p.current=!0,g&&(f.current=!0,window.MotionIsMounted=!0,g.updateFeatures(),g.scheduleRenderMicrotask(),v.current&&g.animationState&&g.animationState.animateChanges())}),t.useEffect(()=>{g&&(!v.current&&g.animationState&&g.animationState.animateChanges(),v.current&&(queueMicrotask(()=>{var a;null==(a=window.MotionHandoffMarkAsComplete)||a.call(window,y)}),v.current=!1),g.enteringChildren=void 0)}),g}function Cm(a){if(a)return!1!==a.options.allowProjection?a.projection:Cm(a.parent)}function Am(a,{forwardMotionProps:e=!1,type:n}={},o,s){o&&function(a){const e=om();for(const n in a)e[n]={...e[n],...a[n]};Bd(e)}(o);const i=n?"svg"===n:pm(a),l=i?vm:ym;function c(n,o){let c;const d={...t.useContext(_h),...n,layoutId:Dm(n)},{isStatic:u}=d,h=function(a){const{initial:e,animate:n}=function(a,e){if(Cd(a)){const{initial:e,animate:n}=a;return{initial:!1===e||xd(e)?e:void 0,animate:xd(n)?n:void 0}}return!1!==a.inherit?e:{}}(a,t.useContext(lm));return t.useMemo(()=>({initial:e,animate:n}),[cm(e),cm(n)])}(n),m=l(n,u);if(!u&&ls){t.useContext(am).strict;const e=function(a){const e=om(),{drag:n,layout:o}=e;if(!n&&!o)return{};const t={...n,...o};return{MeasureLayout:(null==n?void 0:n.isEnabled(a))||(null==o?void 0:o.isEnabled(a))?t.MeasureLayout:void 0,ProjectionNode:t.ProjectionNode}}(d);c=e.MeasureLayout,h.visualElement=zm(a,m,d,s,e.ProjectionNode,i)}return r.jsxs(lm.Provider,{value:h,children:[c&&h.visualElement?r.jsx(c,{visualElement:h.visualElement,...d}):null,gm(a,n,km(m,h.visualElement,o),m,u,e,i)]})}c.displayName=`motion.${"string"==typeof a?a:`create(${a.displayName??a.name??""})`}`;const d=t.forwardRef(c);return d[wm]=a,d}function Dm({layoutId:a}){const e=t.useContext(ss).id;return e&&void 0!==a?e+"-"+a:a}function Em(a,e){if("undefined"==typeof Proxy)return Am;const n=new Map,o=(n,o)=>Am(n,o,a,e);return new Proxy((a,e)=>o(a,e),{get:(t,r)=>"create"===r?o:(n.has(r)||n.set(r,Am(r,void 0,a,e)),n.get(r))})}const Bm=(a,e)=>e.isSVG??pm(a)?new pu(e):new su(e,{allowProjection:a!==t.Fragment});let Fm=0;const qm={animation:{Feature:class extends Sd{constructor(a){super(a),a.animationState||(a.animationState=wu(a))}updateAnimationControlsSubscription(){const{animate:a}=this.node.getProps();kd(a)&&(this.unmountControls=a.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:a}=this.node.getProps(),{animate:e}=this.node.prevProps||{};a!==e&&this.updateAnimationControlsSubscription()}unmount(){var a;this.node.animationState.reset(),null==(a=this.unmountControls)||a.call(this)}}},exit:{Feature:class extends Sd{constructor(){super(...arguments),this.id=Fm++}update(){if(!this.node.presenceContext)return;const{isPresent:a,onExitComplete:e}=this.node.presenceContext,{isPresent:n}=this.node.prevPresenceContext||{};if(!this.node.animationState||a===n)return;const o=this.node.animationState.setActive("exit",!a);e&&!a&&o.then(()=>{e(this.id)})}mount(){const{register:a,onExitComplete:e}=this.node.presenceContext||{};e&&e(this.id),a&&(this.unmount=a(this.id))}unmount(){}}}};function Sm(a){return{point:{x:a.pageX,y:a.pageY}}}function Mm(a,e,n,o){return eh(a,e,(a=>e=>sd(e)&&a(e,Sm(e)))(n),o)}const Tm=({current:a})=>a?a.ownerDocument.defaultView:null,Pm=(a,e)=>Math.abs(a-e),Lm=new Set(["auto","scroll"]);class Rm{constructor(a,e,{transformPagePoint:n,contextWindow:o=window,dragSnapToOrigin:t=!1,distanceThreshold:r=3,element:s}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=a=>{this.handleScroll(a.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!this.lastMoveEvent||!this.lastMoveEventInfo)return;const a=_m(this.lastMoveEventInfo,this.history),e=null!==this.startEvent,n=function(a,e){const n=Pm(a.x,e.x),o=Pm(a.y,e.y);return Math.sqrt(n**2+o**2)}(a.offset,{x:0,y:0})>=this.distanceThreshold;if(!e&&!n)return;const{point:o}=a,{timestamp:t}=Ks;this.history.push({...o,timestamp:t});const{onStart:r,onMove:s}=this.handlers;e||(r&&r(this.lastMoveEvent,a),this.startEvent=this.lastMoveEvent),s&&s(this.lastMoveEvent,a)},this.handlePointerMove=(a,e)=>{this.lastMoveEvent=a,this.lastMoveEventInfo=Nm(e,this.transformPagePoint),Ys.update(this.updatePoint,!0)},this.handlePointerUp=(a,e)=>{this.end();const{onEnd:n,onSessionEnd:o,resumeAnimation:t}=this.handlers;if(!this.dragSnapToOrigin&&this.startEvent||t&&t(),!this.lastMoveEvent||!this.lastMoveEventInfo)return;const r=_m("pointercancel"===a.type?this.lastMoveEventInfo:Nm(e,this.transformPagePoint),this.history);this.startEvent&&n&&n(a,r),o&&o(a,r)},!sd(a))return;this.dragSnapToOrigin=t,this.handlers=e,this.transformPagePoint=n,this.distanceThreshold=r,this.contextWindow=o||window;const i=Nm(Sm(a),this.transformPagePoint),{point:l}=i,{timestamp:c}=Ks;this.history=[{...l,timestamp:c}];const{onSessionStart:d}=e;d&&d(a,_m(i,this.history)),this.removeListeners=ks(Mm(this.contextWindow,"pointermove",this.handlePointerMove),Mm(this.contextWindow,"pointerup",this.handlePointerUp),Mm(this.contextWindow,"pointercancel",this.handlePointerUp)),s&&this.startScrollTracking(s)}startScrollTracking(a){let e=a.parentElement;for(;e;){const a=getComputedStyle(e);(Lm.has(a.overflowX)||Lm.has(a.overflowY))&&this.scrollPositions.set(e,{x:e.scrollLeft,y:e.scrollTop}),e=e.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0,passive:!0}),window.addEventListener("scroll",this.onWindowScroll,{passive:!0}),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(a){const e=this.scrollPositions.get(a);if(!e)return;const n=a===window,o=n?{x:window.scrollX,y:window.scrollY}:{x:a.scrollLeft,y:a.scrollTop},t=o.x-e.x,r=o.y-e.y;0===t&&0===r||(n?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=t,this.lastMoveEventInfo.point.y+=r):this.history.length>0&&(this.history[0].x-=t,this.history[0].y-=r),this.scrollPositions.set(a,o),Ys.update(this.updatePoint,!0))}updateHandlers(a){this.handlers=a}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),Gs(this.updatePoint)}}function Nm(a,e){return e?{point:e(a.point)}:a}function Im(a,e){return{x:a.x-e.x,y:a.y-e.y}}function _m({point:a},e){return{point:a,delta:Im(a,Om(e)),offset:Im(a,Vm(e)),velocity:$m(e,.1)}}function Vm(a){return a[0]}function Om(a){return a[a.length-1]}function $m(a,e){if(a.length<2)return{x:0,y:0};let n=a.length-1,o=null;const t=Om(a);for(;n>=0&&(o=a[n],!(t.timestamp-o.timestamp>zs(e)));)n--;if(!o)return{x:0,y:0};const r=Cs(t.timestamp-o.timestamp);if(0===r)return{x:0,y:0};const s={x:(t.x-o.x)/r,y:(t.y-o.y)/r};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function Wm(a,e,n){return{min:void 0!==e?a.min+e:void 0,max:void 0!==n?a.max+n-(a.max-a.min):void 0}}function Um(a,e){let n=e.min-a.min,o=e.max-a.max;return e.max-e.min{e?(this.stopAnimation(),this.snapToCursor(Sm(a).point)):this.pauseAnimation()},onStart:(a,e)=>{this.stopAnimation();const{drag:n,dragPropagation:o,onDragStart:t}=this.getProps();if(n&&!o&&(this.openDragLock&&this.openDragLock(),this.openDragLock="x"===(r=n)||"y"===r?ed[r]?null:(ed[r]=!0,()=>{ed[r]=!1}):ed.x||ed.y?null:(ed.x=ed.y=!0,()=>{ed.x=ed.y=!1}),!this.openDragLock))return;var r;this.latestPointerEvent=a,this.latestPanInfo=e,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Uu(a=>{let e=this.getAxisMotionValue(a).get()||0;if(vi.test(e)){const{projection:n}=this.visualElement;if(n&&n.layout){const o=n.layout.layoutBox[a];o&&(e=Du(o)*(parseFloat(e)/100))}}this.originPoint[a]=e}),t&&Ys.postRender(()=>t(a,e)),Ec(this.visualElement,"transform");const{animationState:s}=this.visualElement;s&&s.setActive("whileDrag",!0)},onMove:(a,e)=>{this.latestPointerEvent=a,this.latestPanInfo=e;const{dragPropagation:n,dragDirectionLock:o,onDirectionLock:t,onDrag:r}=this.getProps();if(!n&&!this.openDragLock)return;const{offset:s}=e;if(o&&null===this.currentDirection)return this.currentDirection=function(a,e=10){let n=null;return Math.abs(a.y)>e?n="y":Math.abs(a.x)>e&&(n="x"),n}(s),void(null!==this.currentDirection&&t&&t(this.currentDirection));this.updateAxis("x",e.point,s),this.updateAxis("y",e.point,s),this.visualElement.render(),r&&r(a,e)},onSessionEnd:(a,e)=>{this.latestPointerEvent=a,this.latestPanInfo=e,this.stop(a,e),this.latestPointerEvent=null,this.latestPanInfo=null},resumeAnimation:()=>Uu(a=>{var e;return"paused"===this.getAnimationState(a)&&(null==(e=this.getAxisMotionValue(a).animation)?void 0:e.play())})},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:t,distanceThreshold:n,contextWindow:Tm(this.visualElement),element:this.visualElement.current})}stop(a,e){const n=a||this.latestPointerEvent,o=e||this.latestPanInfo,t=this.isDragging;if(this.cancel(),!t||!o||!n)return;const{velocity:r}=o;this.startAnimation(r);const{onDragEnd:s}=this.getProps();s&&Ys.postRender(()=>s(n,o))}cancel(){this.isDragging=!1;const{projection:a,animationState:e}=this.visualElement;a&&(a.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:n}=this.getProps();!n&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),e&&e.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(a,e,n){const{drag:o}=this.getProps();if(!n||!Jm(a,o,this.currentDirection))return;const t=this.getAxisMotionValue(a);let r=this.originPoint[a]+n[a];this.constraints&&this.constraints[a]&&(r=function(a,{min:e,max:n},o){return void 0!==e&&an&&(a=o?Ri(n,a,o.max):Math.min(a,n)),a}(r,this.constraints[a],this.elastic[a])),t.set(r)}resolveConstraints(){var a;const{dragConstraints:e,dragElastic:n}=this.getProps(),o=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):null==(a=this.visualElement.projection)?void 0:a.layout,t=this.constraints;e&&jm(e)?this.constraints||(this.constraints=this.resolveRefConstraints()):this.constraints=!(!e||!o)&&function(a,{top:e,left:n,bottom:o,right:t}){return{x:Wm(a.x,n,t),y:Wm(a.y,e,o)}}(o.layoutBox,e),this.elastic=function(a=Hm){return!1===a?a=0:!0===a&&(a=Hm),{x:Ym(a,"left","right"),y:Ym(a,"top","bottom")}}(n),t!==this.constraints&&o&&this.constraints&&!this.hasMutatedConstraints&&Uu(a=>{!1!==this.constraints&&this.getAxisMotionValue(a)&&(this.constraints[a]=function(a,e){const n={};return void 0!==e.min&&(n.min=e.min-a.min),void 0!==e.max&&(n.max=e.max-a.min),n}(o.layoutBox[a],this.constraints[a]))})}resolveRefConstraints(){const{dragConstraints:a,onMeasureDragConstraints:e}=this.getProps();if(!a||!jm(a))return!1;const n=a.current,{projection:o}=this.visualElement;if(!o||!o.layout)return!1;const t=function(a,e,n){const o=Gd(a,n),{scroll:t}=e;return t&&(Ud(o.x,t.offset.x),Ud(o.y,t.offset.y)),o}(n,o.root,this.visualElement.getTransformPagePoint());let r=function(a,e){return{x:Um(a.x,e.x),y:Um(a.y,e.y)}}(o.layout.layoutBox,t);if(e){const a=e(function({x:a,y:e}){return{top:e.min,right:a.max,bottom:e.max,left:a.min}}(r));this.hasMutatedConstraints=!!a,a&&(r=Md(a))}return r}startAnimation(a){const{drag:e,dragMomentum:n,dragElastic:o,dragTransition:t,dragSnapToOrigin:r,onDragTransitionEnd:s}=this.getProps(),i=this.constraints||{},l=Uu(s=>{if(!Jm(s,e,this.currentDirection))return;let l=i&&i[s]||{};r&&(l={min:0,max:0});const c=o?200:1e6,d=o?40:1e7,u={type:"inertia",velocity:n?a[s]:0,bounceStiffness:c,bounceDamping:d,timeConstant:750,restDelta:1,restSpeed:10,...t,...l};return this.startAxisValueAnimation(s,u)});return Promise.all(l).then(s)}startAxisValueAnimation(a,e){const n=this.getAxisMotionValue(a);return Ec(this.visualElement,a),n.start(bc(a,n,0,e,this.visualElement,!1))}stopAnimation(){Uu(a=>this.getAxisMotionValue(a).stop())}pauseAnimation(){Uu(a=>{var e;return null==(e=this.getAxisMotionValue(a).animation)?void 0:e.pause()})}getAnimationState(a){var e;return null==(e=this.getAxisMotionValue(a).animation)?void 0:e.state}getAxisMotionValue(a){const e=`_drag${a.toUpperCase()}`,n=this.visualElement.getProps();return n[e]||this.visualElement.getValue(a,(n.initial?n.initial[a]:void 0)||0)}snapToCursor(a){Uu(e=>{const{drag:n}=this.getProps();if(!Jm(e,n,this.currentDirection))return;const{projection:o}=this.visualElement,t=this.getAxisMotionValue(e);if(o&&o.layout){const{min:n,max:r}=o.layout.layoutBox[e],s=t.get()||0;t.set(a[e]-Ri(n,r,.5)+s)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:a,dragConstraints:e}=this.getProps(),{projection:n}=this.visualElement;if(!jm(e)||!n||!this.constraints)return;this.stopAnimation();const o={x:0,y:0};Uu(a=>{const e=this.getAxisMotionValue(a);if(e&&!1!==this.constraints){const n=e.get();o[a]=function(a,e){let n=.5;const o=Du(a),t=Du(e);return t>o?n=xs(e.min,e.max-o,a.min):o>t&&(n=xs(a.min,a.max-t,e.min)),ms(0,1,n)}({min:n,max:n},this.constraints[a])}});const{transformTemplate:t}=this.visualElement.getProps();this.visualElement.current.style.transform=t?t({},""):"none",n.root&&n.root.updateScroll(),n.updateLayout(),this.resolveConstraints(),Uu(e=>{if(!Jm(e,a,null))return;const n=this.getAxisMotionValue(e),{min:t,max:r}=this.constraints[e];n.set(Ri(t,r,o[e]))})}addListeners(){if(!this.visualElement.current)return;Km.set(this.visualElement,this);const a=this.visualElement.current,e=Mm(a,"pointerdown",e=>{const{drag:n,dragListener:o=!0}=this.getProps(),t=e.target,r=t!==a&&ld(t);n&&o&&!r&&this.start(e)}),n=()=>{const{dragConstraints:a}=this.getProps();jm(a)&&a.current&&(this.constraints=this.resolveRefConstraints())},{projection:o}=this.visualElement,t=o.addEventListener("measure",n);o&&!o.layout&&(o.root&&o.root.updateScroll(),o.updateLayout()),Ys.read(n);const r=eh(window,"resize",()=>this.scalePositionWithinConstraints()),s=o.addEventListener("didUpdate",({delta:a,hasLayoutChanged:e})=>{this.isDragging&&e&&(Uu(e=>{const n=this.getAxisMotionValue(e);n&&(this.originPoint[e]+=a[e].translate,n.set(n.get()+a[e].translate))}),this.visualElement.render())});return()=>{r(),e(),t(),s&&s()}}getProps(){const a=this.visualElement.getProps(),{drag:e=!1,dragDirectionLock:n=!1,dragPropagation:o=!1,dragConstraints:t=!1,dragElastic:r=Hm,dragMomentum:s=!0}=a;return{...a,drag:e,dragDirectionLock:n,dragPropagation:o,dragConstraints:t,dragElastic:r,dragMomentum:s}}}function Jm(a,e,n){return!(!0!==e&&e!==a||null!==n&&n!==a)}const Zm=a=>(e,n)=>{a&&Ys.postRender(()=>a(e,n))};let Qm=!1;class ap extends t.Component{componentDidMount(){const{visualElement:a,layoutGroup:e,switchLayoutGroup:n,layoutId:o}=this.props,{projection:t}=a;t&&(e.group&&e.group.add(t),n&&n.register&&o&&n.register(t),Qm&&t.root.didUpdate(),t.addEventListener("animationComplete",()=>{this.safeToRemove()}),t.setOptions({...t.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),ih.hasEverUpdated=!0}getSnapshotBeforeUpdate(a){const{layoutDependency:e,visualElement:n,drag:o,isPresent:t}=this.props,{projection:r}=n;return r?(r.isPresent=t,a.layoutDependency!==e&&r.setOptions({...r.options,layoutDependency:e}),Qm=!0,o||a.layoutDependency!==e||void 0===e||a.isPresent!==t?r.willUpdate():this.safeToRemove(),a.isPresent!==t&&(t?r.promote():r.relegate()||Ys.postRender(()=>{const a=r.getStack();a&&a.members.length||this.safeToRemove()})),null):null}componentDidUpdate(){const{projection:a}=this.props.visualElement;a&&(a.root.didUpdate(),ad.postRender(()=>{!a.currentAnimation&&a.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:a,layoutGroup:e,switchLayoutGroup:n}=this.props,{projection:o}=a;Qm=!0,o&&(o.scheduleCheckAfterUnmount(),e&&e.group&&e.group.remove(o),n&&n.deregister&&n.deregister(o))}safeToRemove(){const{safeToRemove:a}=this.props;a&&a()}render(){return null}}function ep(a){const[e,n]=Hh(),o=t.useContext(ss);return r.jsx(ap,{...a,layoutGroup:o,switchLayoutGroup:t.useContext(xm),isPresent:e,safeToRemove:n})}const np={pan:{Feature:class extends Sd{constructor(){super(...arguments),this.removePointerDownListener=vs}onPointerDown(a){this.session=new Rm(a,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:Tm(this.node)})}createPanHandlers(){const{onPanSessionStart:a,onPanStart:e,onPan:n,onPanEnd:o}=this.node.getProps();return{onSessionStart:Zm(a),onStart:Zm(e),onMove:n,onEnd:(a,e)=>{delete this.session,o&&Ys.postRender(()=>o(a,e))}}}mount(){this.removePointerDownListener=Mm(this.node.current,"pointerdown",a=>this.onPointerDown(a))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}},drag:{Feature:class extends Sd{constructor(a){super(a),this.removeGroupControls=vs,this.removeListeners=vs,this.controls=new Xm(a)}mount(){const{dragControls:a}=this.node.getProps();a&&(this.removeGroupControls=a.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||vs}update(){const{dragControls:a}=this.node.getProps(),{dragControls:e}=this.node.prevProps||{};a!==e&&(this.removeGroupControls(),a&&(this.removeGroupControls=a.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}},ProjectionNode:Ih,MeasureLayout:ep}};function op(a,e,n){const{props:o}=a;a.animationState&&o.whileHover&&a.animationState.setActive("whileHover","Start"===n);const t=o["onHover"+n];t&&Ys.postRender(()=>t(e,Sm(e)))}function tp(a,e,n){const{props:o}=a;if(a.current instanceof HTMLButtonElement&&a.current.disabled)return;a.animationState&&o.whileTap&&a.animationState.setActive("whileTap","Start"===n);const t=o["onTap"+("End"===n?"":n)];t&&Ys.postRender(()=>t(e,Sm(e)))}const rp=new WeakMap,sp=new WeakMap,ip=a=>{const e=rp.get(a.target);e&&e(a)},lp=a=>{a.forEach(ip)};const cp={some:0,all:1},dp=Em({...qm,inView:{Feature:class extends Sd{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:a={}}=this.node.getProps(),{root:e,margin:n,amount:o="some",once:t}=a,r={root:e?e.current:void 0,rootMargin:n,threshold:"number"==typeof o?o:cp[o]};return function(a,e,n){const o=function({root:a,...e}){const n=a||document;sp.has(n)||sp.set(n,{});const o=sp.get(n),t=JSON.stringify(e);return o[t]||(o[t]=new IntersectionObserver(lp,{root:a,...e})),o[t]}(e);return rp.set(a,n),o.observe(a),()=>{rp.delete(a),o.unobserve(a)}}(this.node.current,r,a=>{const{isIntersecting:e}=a;if(this.isInView===e)return;if(this.isInView=e,t&&!e&&this.hasEnteredView)return;e&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",e);const{onViewportEnter:n,onViewportLeave:o}=this.node.getProps(),r=e?n:o;r&&r(a)})}mount(){this.startObserver()}update(){if("undefined"==typeof IntersectionObserver)return;const{props:a,prevProps:e}=this.node;["amount","margin","root"].some(function({viewport:a={}},{viewport:e={}}={}){return n=>a[n]!==e[n]}(a,e))&&this.startObserver()}unmount(){}}},tap:{Feature:class extends Sd{mount(){const{current:a}=this.node;a&&(this.unmount=function(a,e,n={}){const[o,t,r]=od(a,n),s=a=>{const o=a.currentTarget;if(!hd(a))return;cd.add(o);const r=e(o,a),s=(a,e)=>{window.removeEventListener("pointerup",i),window.removeEventListener("pointercancel",l),cd.has(o)&&cd.delete(o),hd(a)&&"function"==typeof r&&r(a,{success:e})},i=a=>{s(a,o===window||o===document||n.useGlobalTarget||rd(o,a.target))},l=a=>{s(a,!1)};window.addEventListener("pointerup",i,t),window.addEventListener("pointercancel",l,t)};return o.forEach(a=>{(n.useGlobalTarget?window:a).addEventListener("pointerdown",s,t),Qc(a)&&(a.addEventListener("focus",a=>((a,e)=>{const n=a.currentTarget;if(!n)return;const o=dd(()=>{if(cd.has(n))return;ud(n,"down");const a=dd(()=>{ud(n,"up")});n.addEventListener("keyup",a,e),n.addEventListener("blur",()=>ud(n,"cancel"),e)});n.addEventListener("keydown",o,e),n.addEventListener("blur",()=>n.removeEventListener("keydown",o),e)})(a,t)),ld(a)||a.hasAttribute("tabindex")||(a.tabIndex=0))}),r}(a,(a,e)=>(tp(this.node,e,"Start"),(a,{success:e})=>tp(this.node,a,e?"End":"Cancel")),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}},focus:{Feature:class extends Sd{constructor(){super(...arguments),this.isActive=!1}onFocus(){let a=!1;try{a=this.node.current.matches(":focus-visible")}catch(e){a=!0}a&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){this.isActive&&this.node.animationState&&(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=ks(eh(this.node.current,"focus",()=>this.onFocus()),eh(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}},hover:{Feature:class extends Sd{mount(){const{current:a}=this.node;a&&(this.unmount=function(a,e,n={}){const[o,t,r]=od(a,n),s=a=>{if(!td(a))return;const{target:n}=a,o=e(n,a);if("function"!=typeof o||!n)return;const r=a=>{td(a)&&(o(a),n.removeEventListener("pointerleave",r))};n.addEventListener("pointerleave",r,t)};return o.forEach(a=>{a.addEventListener("pointerenter",s,t)}),r}(a,(a,e)=>(op(this.node,e,"Start"),a=>op(this.node,a,"End"))))}unmount(){}}},...np,layout:{ProjectionNode:Ih,MeasureLayout:ep}},Bm),up={duration:.15,ease:[.4,0,.2,1]},hp={type:"tween",duration:.25,ease:[.4,0,.2,1]},mp={type:"tween",duration:.3,ease:[.4,0,.2,1]},pp=t.createContext(!1);function gp(){return t.useContext(pp)}const bp=t.createContext(void 0);function fp(){return t.useContext(bp)}const yp="#1A1A1A",vp="#737373",wp={xs:"sm:max-w-xs",sm:"sm:max-w-sm",md:"sm:max-w-md",lg:"sm:max-w-lg",xl:"sm:max-w-xl","2xl":"sm:max-w-2xl","3xl":"sm:max-w-3xl","4xl":"sm:max-w-4xl","5xl":"sm:max-w-5xl",full:"sm:max-w-[calc(100vw-2rem)]"};function kp({open:a,onClose:e,size:n="md",className:o,children:s,bottomSheet:l=!0,motionPlus:u=!1,basemapMode:h,solid:m=!1}){const p="light"===h,[g,b]=t.useState(!1),f=t.useRef(null);t.useEffect(()=>(f.current&&(clearTimeout(f.current),f.current=null),a?f.current=setTimeout(()=>{b(!0)},350):queueMicrotask(()=>b(!1)),()=>{f.current&&(clearTimeout(f.current),f.current=null)}),[a]);const y=t.useCallback((a,n)=>{(n.offset.y>100||n.velocity.y>500)&&e()},[e]),v=u?mp:hp,w=u?.98:.99,k=l?8:4;return r.jsx(Xh,{mode:"wait",children:a&&r.jsxs(c,{static:!0,open:a,onClose:e,className:"relative z-[10010]",children:[r.jsx(dp.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:up,className:"fixed inset-0 bg-black/50 backdrop-blur-sm","aria-hidden":"true"}),r.jsx("div",{className:"fixed inset-0 overflow-y-auto",children:r.jsx("div",{className:i("flex min-h-full justify-center",l?"items-end sm:items-center sm:p-4":"items-center p-4"),children:r.jsx(dp.div,{drag:!!l&&"y",dragConstraints:{top:0,bottom:0},dragElastic:{top:0,bottom:.4},onDragEnd:y,initial:{opacity:0,scale:w,y:k},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.99,y:l?40:4},transition:v,style:{willChange:"transform, opacity"},className:i(l&&"w-full sm:w-auto"),children:r.jsx(d,{className:i("relative w-full shadow-2xl flex flex-col",!h&&!m&&"bg-bg-surface/80 backdrop-blur-xl",!h&&m&&"bg-bg-1",!h&&"ring-1 ring-inset ring-white/10",wp[n],l?"radius-card overflow-hidden pb-safe":"radius-card overflow-hidden",o),style:h?{backgroundColor:p?"#F8F8F8":"var(--bg-surface)",boxShadow:"inset 0 0 0 1px "+(p?"rgba(0, 0, 0, 0.08)":"rgba(255, 255, 255, 0.1)")}:void 0,children:r.jsx(bp.Provider,{value:h,children:r.jsx(pp.Provider,{value:g,children:s})})})})})})]})})}function xp({className:a,...e}){const n=fp(),o="light"===n;return r.jsx(u,{...e,className:i("text-base font-semibold sm:text-lg",!n&&"text-text-primary",a),style:n?{color:o?yp:"var(--text-primary)"}:void 0})}function jp({icon:a,title:e,onClose:n,className:o}){const t=fp(),s="light"===t;return r.jsxs("div",{className:i("flex items-center justify-between p-4 border-b",!t&&"border-border-subtle",o),style:t?{borderColor:s?"rgba(0, 0, 0, 0.12)":"var(--border-subtle)"}:void 0,children:[r.jsxs("div",{className:"flex items-center gap-3",children:[a&&r.jsx("div",{className:i("p-2 radius-inner",!t&&"bg-bg-subtle text-icon-card-title"),style:t?{backgroundColor:s?"#EEEEEE":"var(--bg-subtle)",color:s?"#4A4A4A":"var(--icon-card-title)"}:void 0,children:a}),r.jsx(xp,{children:e})]}),n&&r.jsx("button",{onClick:n,className:i("p-2 radius-inner transition-colors",!t&&"text-text-muted hover:text-text-primary hover:bg-bg-subtle"),style:t?{color:s?vp:"var(--text-muted)"}:void 0,onMouseEnter:a=>{t&&(a.currentTarget.style.color=s?yp:"var(--text-primary)",a.currentTarget.style.backgroundColor=s?"rgba(0, 0, 0, 0.06)":"var(--bg-subtle)")},onMouseLeave:a=>{t&&(a.currentTarget.style.color=s?vp:"var(--text-muted)",a.currentTarget.style.backgroundColor="transparent")},"aria-label":"Close",children:r.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:r.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]})}function zp({className:a,...e}){return r.jsx("div",{...e,className:i("p-4",a)})}function Cp({className:a,...e}){return r.jsx("div",{...e,className:i("flex flex-col-reverse gap-3 p-4 pt-0","sm:flex-row sm:justify-end","*:w-full sm:*:w-auto",a)})}function Ap({className:a,...e}){return r.jsx("nav",{...e,className:i(a,"flex h-full min-h-0 flex-col")})}function Dp({className:a,...e}){return r.jsx("div",{...e,className:i(a,"flex flex-col border-b border-border-subtle p-4","[&>[data-slot=section]+[data-slot=section]]:mt-2.5")})}function Ep({className:a,...e}){return r.jsx("div",{...e,className:i(a,"flex flex-1 flex-col p-3","overflow-y-auto sidebar-scroll","[&>[data-slot=section]+[data-slot=section]]:mt-6")})}function Bp({className:a,...e}){return r.jsx("div",{...e,className:i(a,"mt-auto flex flex-col border-t border-border-subtle","[&>[data-slot=section]+[data-slot=section]]:mt-2.5")})}function Fp({className:a,...e}){const n=t.useId();return r.jsx(Qh,{id:n,children:r.jsx("div",{...e,"data-slot":"section",className:i(a,"flex flex-col gap-0.5")})})}const qp=t.forwardRef(function(a,e){const{current:n,className:o,children:t,...s}=a,c=i("flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left","min-h-[44px]","text-sm font-medium","[&>svg]:w-5 [&>svg]:h-5 [&>svg]:flex-shrink-0",n?"bg-accent-primary/15 text-accent-primary [&>svg]:text-accent-primary":"text-text-muted hover:text-text-primary hover:bg-subtle-fill [&>svg]:text-text-muted hover:[&>svg]:text-text-primary","transition-all duration-150");return r.jsxs("span",{className:i(o,"relative"),children:[n&&r.jsx(dp.span,{layoutId:"sidebar-current-indicator",className:"absolute inset-y-2 -left-3 w-0.5 rounded-full bg-accent-primary"}),"string"==typeof s.href?r.jsx(v,{to:s.href,onClick:s.onClick,onMouseEnter:s.onMouseEnter,onMouseLeave:s.onMouseLeave,className:c,"data-current":n?"true":void 0,ref:e,children:t}):r.jsx(l,{...s,className:i("cursor-default",c),"data-current":n?"true":void 0,ref:e,children:t})]})});function Sp({className:a,...e}){return r.jsx("span",{...e,className:i(a,"truncate")})}function Mp({className:a,variant:e="default",...n}){return r.jsx("span",{...n,className:i("ml-auto flex items-center gap-1 px-1.5 py-0.5 rounded-full","text-xs font-medium",{default:"bg-bg-subtle text-text-muted",accent:"bg-accent-primary/20 text-accent-primary",success:"bg-accent-success/20 text-accent-success",warning:"bg-accent-secondary/20 text-accent-secondary",danger:"bg-accent-danger/20 text-accent-danger"}[e],a)})}const Tp=t.createContext(null),Pp={type:"spring",visualDuration:.35,bounce:.15};function Lp({open:a,onClose:e,children:n}){return r.jsx(Xh,{children:a&&r.jsxs(c,{static:!0,open:a,onClose:e,className:"lg:hidden relative z-[10002]",children:[r.jsx(dp.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.25,ease:"easeOut"},className:"fixed inset-0 bg-black/60 backdrop-blur-sm","aria-hidden":"true"}),r.jsx(dp.div,{initial:{x:"-100%"},animate:{x:0},exit:{x:"-100%"},transition:Pp,className:"fixed inset-y-0 left-0 w-72 max-w-[85vw] z-[10003]",children:r.jsx(d,{className:"h-full",children:r.jsxs("div",{className:"flex h-full flex-col sidebar-panel",children:[r.jsx("div",{className:"absolute top-4 right-4 z-10",children:r.jsx(h,{className:"p-2 rounded-lg text-text-muted hover:text-text-primary hover:bg-subtle-fill transition-colors","aria-label":"Close navigation",children:r.jsx(rs,{className:"w-5 h-5"})})}),n]})})})]})})}function Rp({sidebar:a,navbar:e,children:n,className:o}){const[s,l]=t.useState(!1),c=()=>l(!0),d=()=>l(!1),u={isOpen:s,open:c,close:d,toggle:()=>l(a=>!a)};return r.jsx(Tp.Provider,{value:u,children:r.jsxs("div",{className:"flex h-screen overflow-hidden bg-bg-body",children:[r.jsx("aside",{className:"hidden lg:flex flex-col w-64 flex-shrink-0 h-full relative sidebar-panel",children:a}),r.jsx(Lp,{open:s,onClose:d,children:a}),r.jsxs("div",{className:"flex-1 flex flex-col min-w-0",children:[r.jsx("header",{className:"lg:hidden sticky top-0 z-[10001] h-14 mobile-header",children:r.jsxs("div",{className:"flex items-center h-full px-4",children:[r.jsx("button",{onClick:c,className:"w-10 h-10 flex items-center justify-center rounded-lg hover:bg-subtle-fill active:bg-subtle-fill transition-colors mr-2","aria-label":"Open navigation",children:r.jsx(Kr,{className:"w-5 h-5 text-text-primary"})}),r.jsx("div",{className:"flex-1 min-w-0",children:e})]})}),r.jsx("main",{className:i("flex-1 overflow-y-auto main-content",o),children:n})]})]})})}function Np({className:a,...e}){return r.jsx("nav",{...e,className:i(a,"flex flex-1 items-center gap-3")})}function Ip({className:a,...e}){return r.jsx("div",{...e,className:i(a,"flex items-center gap-3")})}function _p({className:a,...e}){return r.jsx("div",{"aria-hidden":"true",...e,className:i(a,"flex-1")})}const Vp="bg-bg-surface/80 backdrop-blur-lg ring-1 ring-inset ring-white/10",Op={sm:"radius-inner",md:"radius-inset",lg:"radius-card",xl:"radius-hero",full:"radius-pill",none:"radius-none"};function $p({defaultOpen:a=!1,className:e,children:n}){return r.jsx(p,{defaultOpen:a,children:r.jsx("div",{className:i("flex flex-col",e),children:n})})}t.forwardRef(function({children:a,elevated:e,compact:n,noPadding:o,radius:t="lg",glass:s=!0,stroke:l=!0,shadow:c,reflex:d=!1,glow:u=!1,onClick:h,className:m,style:p,...g},b){const f=c??e??!1,y=d?{...p,"--surface-reflex":"1"}:p;return r.jsx("div",{ref:b,className:i(Op[t],s&&(e?"bg-bg-surface/85 backdrop-blur-xl":"bg-bg-surface/80 backdrop-blur-lg"),!s&&"bg-bg-surface",l&&!u&&"ring-1 ring-inset ring-white/10",u&&"ring-1 ring-inset ring-accent-primary/40",f&&(e?"shadow-xl":"shadow-lg"),d&&"surface-reflex","h-full flex flex-col relative",!o&&(n?"p-3 sm:p-4":"p-4 sm:p-5"),h&&"cursor-pointer",m),style:y,onClick:h,...g,children:a})}),t.forwardRef(function({children:a,className:e,...n},o){return r.jsx("div",{ref:o,className:i("flex items-center justify-between gap-4","pb-4 mb-4","border-b border-border-subtle",e),...n,children:a})}),t.forwardRef(function({children:a,icon:e,className:n,...o},t){return r.jsxs("h3",{ref:t,className:i("flex items-center gap-2","text-base font-semibold text-text-primary",n),...o,children:[e&&r.jsx("span",{className:"text-icon-card-title w-5 h-5 flex-shrink-0",children:e}),a]})}),t.forwardRef(function({children:a,className:e,...n},o){return r.jsx("p",{ref:o,className:i("text-sm text-text-muted",e),...n,children:a})}),t.forwardRef(function({children:a,className:e,...n},o){return r.jsx("div",{ref:o,className:i("flex-1 min-h-0",e),...n,children:a})}),t.forwardRef(function({children:a,className:e,...n},o){return r.jsx("div",{ref:o,className:i("flex items-center justify-end gap-3","pt-4 mt-4","border-t border-border-subtle",e),...n,children:a})}),t.forwardRef(function({children:a,border:e,className:n,...o},t){return r.jsx("div",{ref:t,className:i(e&&"pt-4 mt-4 border-t border-border-subtle",n),...o,children:a})});const Wp=t.forwardRef(function({className:a,icon:e,children:n,...o},t){return r.jsx(m,{ref:t,className:i("flex w-full items-center justify-between gap-3","px-3 py-2 radius-inner","text-sm font-medium text-text-muted","row-hover hover:text-text-primary","ring-focus",a),...o,children:({open:a})=>r.jsxs(r.Fragment,{children:[n,r.jsx("span",{className:i("transition-transform duration-200",a?"rotate-180":"rotate-0"),children:e||r.jsx(Ir,{className:"w-4 h-4"})})]})})});function Up({direction:a="down",className:e,children:n}){const o={hidden:{height:0,opacity:0,y:"up"===a?8:-8},visible:{height:"auto",opacity:1,y:0}};return r.jsx(g,{static:!0,children:({open:t})=>r.jsx(Xh,{initial:!1,children:t&&r.jsx(dp.div,{initial:"hidden",animate:"visible",exit:"hidden",variants:o,transition:{height:{duration:.2,ease:[.4,0,.2,1]},opacity:{duration:.15},y:{duration:.15}},className:i("overflow-hidden",e),children:r.jsx("div",{className:i("up"===a?"pb-2":"pt-2"),children:n})})})})}function Hp({label:a,icon:e,defaultOpen:n=!0,direction:o="down",className:t,dataId:s,children:l}){const c=s?{[`data-${s}-disclosure`]:!0}:{},d=r.jsxs("span",{className:"flex items-center gap-3",children:[e,r.jsx("span",{className:"text-sm font-medium",children:a})]});return"up"===o?r.jsx(p,{defaultOpen:n,children:({open:n})=>r.jsxs("div",{className:i("relative",t),children:[r.jsx(g,{static:!0,className:"relative z-50",children:r.jsx(Xh,{initial:!1,mode:"wait",children:n&&r.jsxs(dp.div,{initial:{y:12,scale:.96,opacity:0},animate:{y:0,scale:1,opacity:1},exit:{y:6,scale:.98,opacity:0},transition:{type:"spring",stiffness:400,damping:30,mass:.5,opacity:{duration:.15,ease:"easeOut"}},className:"absolute bottom-full left-0 right-0 z-50 mb-1 mx-1 origin-bottom radius-inset shadow-lg border-card bg-bg-surface/80 backdrop-blur-xl",children:[r.jsxs("div",{className:"flex items-center justify-between px-3 py-2",children:[r.jsxs("span",{className:"flex items-center gap-3",children:[e,r.jsx("span",{className:"text-sm font-medium text-text-primary",children:a})]}),r.jsx(m,{className:"p-1 rounded hover:bg-white/10 transition-colors",children:r.jsx(dp.span,{initial:{rotate:0},animate:{rotate:180},exit:{rotate:0},transition:{type:"spring",stiffness:400,damping:25},children:r.jsx(Ir,{className:"w-4 h-4"})})})]}),r.jsx("div",{className:"px-3 pb-3",children:l})]})})}),r.jsx(dp.div,{animate:{opacity:n?.4:1,scale:n?.98:1},transition:{type:"spring",stiffness:500,damping:35},children:r.jsxs(m,{...c,className:i("flex w-full items-center justify-between gap-3","px-3 py-2 radius-inner","text-sm font-medium text-text-muted","row-hover hover:text-text-primary","ring-focus"),children:[d,r.jsx(dp.span,{animate:{rotate:n?180:0},transition:{type:"spring",stiffness:400,damping:25},children:r.jsx(Ir,{className:"w-4 h-4"})})]})})]})}):r.jsxs($p,{defaultOpen:n,className:t,children:[r.jsx(Wp,{...c,children:d}),r.jsx(Up,{direction:"down",children:r.jsx("div",{className:"bg-subtle-fill radius-inset mx-1 mt-1",children:l})})]})}const Yp="0.9.213",Gp="'JetBrains Mono', monospace",Kp=t.memo(function({height:a=16,responsive:e=!1,className:n=""}){const o="var(--accent-primary)",t="var(--text-primary)";if(e){const a=145,e=24;return r.jsxs("svg",{className:n,viewBox:`0 0 ${a} ${e}`,preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":"pyMC:Console",style:{display:"block",width:"80%",height:"auto"},children:[r.jsx("style",{children:`\n .logo-text {\n font-family: ${Gp};\n }\n .logo-accent {\n fill: var(--accent-primary, #719CDF);\n }\n .logo-main {\n fill: var(--text-primary, #FFFFFF);\n }\n `}),r.jsxs("text",{x:"0",y:"18",className:"logo-text",fontSize:"20",fontWeight:"400",letterSpacing:"-0.02em",children:[r.jsx("tspan",{className:"logo-accent",children:"py"}),r.jsx("tspan",{className:"logo-main",children:"MC"}),r.jsx("tspan",{className:"logo-accent",children:":"}),r.jsx("tspan",{className:"logo-main",children:"Console"})]})]})}const s="string"==typeof a?parseFloat(a):a,i={fontFamily:Gp,fontSize:.8*s+"px",fontWeight:400,lineHeight:1,letterSpacing:"-0.02em",whiteSpace:"nowrap"};return r.jsxs("span",{className:n,style:i,role:"img","aria-label":"pyMC:Console",children:[r.jsx("span",{style:{color:o},children:"py"}),r.jsx("span",{style:{color:t},children:"MC"}),r.jsx("span",{style:{color:o},children:":"}),r.jsx("span",{style:{color:t},children:"Console"})]})}),Xp="pymc_jwt_token",Jp="pymc_client_id",Zp="pymc_remember_me",Qp=new Set;function ag(a){return Qp.add(a),()=>Qp.delete(a)}function eg(a){for(const n of Qp)try{n(a)}catch(e){}}function ng(){let a=localStorage.getItem(Jp);return a||(a=`${Date.now()}-${Math.random().toString(36).substring(2,15)}`,localStorage.setItem(Jp,a)),a}function og(){return"true"===localStorage.getItem(Zp)}function tg(a){a?localStorage.setItem(Zp,"true"):localStorage.removeItem(Zp)}function rg(){return og()?localStorage:sessionStorage}function sg(){return rg().getItem(Xp)||localStorage.getItem(Xp)||sessionStorage.getItem(Xp)}function ig(a){rg().setItem(Xp,a),og()?sessionStorage.removeItem(Xp):localStorage.removeItem(Xp),eg(a)}function lg(){localStorage.removeItem(Xp),sessionStorage.removeItem(Xp),eg(null)}function cg(){return!(!sg()||ug()&&(lg(),1))}function dg(a){try{const e=a.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"),n=decodeURIComponent(atob(e).split("").map(a=>"%"+("00"+a.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(n)}catch{return null}}function ug(){const a=sg();if(!a)return!0;const e=dg(a);return!e||!e.exp||Date.now()>=1e3*e.exp-6e4}function hg(){const a=sg();if(!a)return 0;const e=dg(a);return e&&e.exp?Math.max(0,Math.floor((1e3*e.exp-Date.now())/1e3)):0}function mg(){const a=sg();if(!a)return!1;const e=dg(a);if(!e||!e.exp)return!1;const n=1e3*e.exp-Date.now();return n>0&&n<3e5}async function pg(a,e,n=!1){tg(n);try{const n=await fetch("/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:a,password:e,client_id:ng()})}),o=n.headers.get("content-type");if(!o||!o.includes("application/json"))return{success:!1,error:`Server error: ${n.status}`};const t=await n.json();return t.success&&t.token?(ig(t.token),{success:!0}):{success:!1,error:t.error||"Login failed"}}catch(o){return{success:!1,error:"Connection error. Please try again."}}}async function gg(){const a=sg();if(!a)return!1;const e=dg(a);(null==e?void 0:e.exp)&&Math.floor((1e3*e.exp-Date.now())/1e3);try{const e=await fetch("/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`},body:JSON.stringify({client_id:ng()})});if(!e.ok){let a="";try{const n=await e.json();a=n.error||JSON.stringify(n)}catch{a=e.statusText}return!1}const n=await e.json();if(n.success&&n.token){ig(n.token);const a=dg(n.token);return(null==a?void 0:a.exp)&&Math.floor((1e3*a.exp-Date.now())/1e3),!0}return!1}catch(n){return!1}}let bg=null;async function fg(){const a=sg();if(!a)return!1;const e=dg(a);return(null==e?void 0:e.exp)&&Math.floor((1e3*e.exp-Date.now())/1e3),!mg()||bg||(bg=gg().finally(()=>{bg=null}),bg)}let yg=!1;const vg=new Map;let wg=!1;async function kg(a,e,n=!1){const o=function(a,e){return(null==e?void 0:e.method)&&"GET"!==e.method?"":a}(a,e);if(o){const a=vg.get(o);if(a)return a}const t=`${a}`;!n&&mg()&&await gg();const r=sg();if(!r&&!a.includes("/auth/"))throw window.location.href="/login",new Error("Not authenticated");const s={"Accept-Encoding":"gzip, deflate",Accept:"application/json",...r?{Authorization:`Bearer ${r}`}:{}};if(null==e?void 0:e.headers){const a=e.headers;a instanceof Headers?a.forEach((a,e)=>{s[e]=a}):Array.isArray(a)?a.forEach(([a,e])=>{s[a]=e}):Object.assign(s,a)}(null==e?void 0:e.body)&&(s["Content-Type"]="application/json");const i=(async()=>{const o=await fetch(t,{...e,headers:s});if(401===o.status){if(!n&&!wg&&await gg())return kg(a,e,!0);throw wg||(wg=!0,lg(),window.location.replace("/login")),new Error("Session expired. Please log in again.")}if(!o.ok)throw new Error(`API error: ${o.status} ${o.statusText} (${a})`);return o.json()})();return o&&(vg.set(o,i),i.finally(()=>{vg.delete(o)})),i}const xg={spreadingFactor:7,bandwidthHz:125e3,codingRate:5,preambleLength:8,crcEnabled:!0,explicitHeader:!0};function jg(a){if(a.raw_packet){const e=a.raw_packet;if(/^[0-9a-fA-F]+$/.test(e)&&e.length%2==0)return e.length/2;if(/^[A-Za-z0-9+/=]+$/.test(e)){const a=(e.match(/=+$/)||[""])[0].length;return Math.floor(3*e.length/4)-a}return e.length}if(a.length&&a.length>0)return a.length;if(a.payload_length&&a.payload_length>0)return a.payload_length;if(a.payload){const e=a.payload;return/^[0-9a-fA-F]+$/.test(e)&&e.length%2==0?e.length/2:e.length}return 32}function zg(a,e={}){return void 0!==a.airtime_ms&&a.airtime_ms>0?a.airtime_ms:function(a,e={}){const n=e.spreadingFactor??xg.spreadingFactor,o=e.bandwidthHz??xg.bandwidthHz,t=e.codingRate??xg.codingRate,r=e.preambleLength??xg.preambleLength??8,s=e.crcEnabled??xg.crcEnabled?1:0,i=e.explicitHeader??xg.explicitHeader?0:1,l=n>=11&&o<=125e3?1:0,c=o/1e3,d=Math.pow(2,n)/c,u=(r+4.25)*d,h=Math.max(8*a-4*n+28+16*s-20*i,0),m=4*(n-2*l);return u+(8+Math.ceil(h/m)*t)*d}(jg(a),e)}function Cg(a){return a&&"chat node"===a.toLowerCase()?"Companion":a}async function Ag(){return function(a){if(a.neighbors)for(const e of Object.values(a.neighbors))e.contact_type=Cg(e.contact_type);return a}(await kg("/api/stats"))}async function Dg(){return kg("/api/logs")}async function Eg(a=24){return kg(`/api/noise_floor_history?hours=${a}`)}const Bg=new Map;function Fg(a=!1){if(a)Bg.clear();else for(const[e]of Bg)parseInt(e.split("-")[0],10)<=60&&Bg.delete(e)}function qg(a,e,n,o){const t=60*a/e,r=Math.floor(Date.now()/1e3),s=Math.floor(r/t)*t,i=s-60*a,l=n.filter(a=>a.timestamp>=i&&a.timestamp<=s),c=o?function(a){var e;const n=null==(e=null==a?void 0:a.config)?void 0:e.radio;return{spreadingFactor:(null==n?void 0:n.spreading_factor)??xg.spreadingFactor,bandwidthHz:(null==n?void 0:n.bandwidth)??xg.bandwidthHz,codingRate:(null==n?void 0:n.coding_rate)??xg.codingRate,preambleLength:(null==n?void 0:n.preamble_length)??xg.preambleLength,crcEnabled:!0,explicitHeader:!0}}(o):xg,d=function(a,e,n,o,t){const r=new Array(e),s=new Array(e),i=new Array(e),l=new Array(e),c=new Array(e),d=new Array(e),u=new Array(e);for(let m=0;m=e)continue;const g=zg(h,t),b=h.packet_origin;if("tx_local"===b?(i[p].count++,i[p].airtime_ms+=g):"tx_forward"===b||h.transmitted?(l[p].count++,l[p].airtime_ms+=g):h.drop_reason&&(c[p].count++,c[p].airtime_ms+=g),"tx_local"!==b){r[p].count++,r[p].airtime_ms+=g,d[p].snr+=h.snr||0,d[p].rssi+=h.rssi||0,d[p].count++;const a=h.packet_hash;a&&!u[p].has(a)&&(u[p].add(a),s[p].count++,s[p].airtime_ms+=g)}}for(let m=0;m0&&(r[m].avg_snr=d[m].snr/d[m].count,r[m].avg_rssi=d[m].rssi/d[m].count);return{received:r,unique_received:s,transmitted:i,forwarded:l,dropped:c}}(l,e,i,t,c);return{time_range_minutes:a,bucket_count:e,bucket_duration_seconds:t,start_time:i,end_time:s,...d}}async function Sg(){return kg("/api/hardware_stats")}async function Mg(){return kg("/api/hardware_processes")}async function Tg(a){return kg("/api/update_radio_config",{method:"POST",body:JSON.stringify(a)})}async function Pg(){return kg("/api/send_advert",{method:"POST",body:"{}"})}async function Lg(a){return kg("/api/set_mode",{method:"POST",body:JSON.stringify({mode:a})})}async function Rg(a){return kg("/api/set_duty_cycle",{method:"POST",body:JSON.stringify({enabled:a})})}async function Ng(a){try{return await kg("/api/log_level",{method:"POST",body:JSON.stringify({level:a})})}catch(e){return{success:!1,error:e instanceof Error?e.message:"Unknown error"}}}const Ig=new class{constructor(){o(this,"worker",null),o(this,"isInitialized",!1),o(this,"statsListeners",new Set),o(this,"packetsListeners",new Set),o(this,"errorListeners",new Set),o(this,"readyResolve",null),o(this,"readyPromise",null),o(this,"unsubscribeTokenChange",null)}async init(a){if(!this.isInitialized&&"undefined"!=typeof window){this.readyPromise=new Promise(a=>{this.readyResolve=a});try{this.worker=new Worker(new URL("/assets/polling.worker-B_pFWyb2.js",import.meta.url),{type:"module"}),this.worker.onmessage=this.handleMessage.bind(this),this.worker.onerror=a=>{};const e={type:"init",config:{apiBaseUrl:a.apiBaseUrl,authToken:a.authToken,statsIntervalMs:a.statsIntervalMs??3e3,packetsIntervalMs:a.packetsIntervalMs??3e3}};this.worker.postMessage(e),this.isInitialized=!0,this.unsubscribeTokenChange=ag(a=>{this.setAuthToken(a)}),await this.readyPromise}catch(e){throw e}}}handleMessage(a){var e;const n=a.data;switch(n.type){case"ready":null==(e=this.readyResolve)||e.call(this);break;case"stats":for(const a of this.statsListeners)try{a(n.data,n.timestamp)}catch(o){}break;case"packets":for(const a of this.packetsListeners)try{a(n.newPackets,n.totalCount,n.newestTimestamp)}catch(o){}break;case"packetsReset":for(const a of this.packetsListeners)try{a([],0,n.newestTimestamp)}catch(o){}break;case"error":for(const a of this.errorListeners)try{a(n.source,n.error)}catch(o){}}}onStats(a){return this.statsListeners.add(a),()=>this.statsListeners.delete(a)}onPackets(a){return this.packetsListeners.add(a),()=>this.packetsListeners.delete(a)}onError(a){return this.errorListeners.add(a),()=>this.errorListeners.delete(a)}setAuthToken(a){if(!this.worker)return;const e={type:"setAuth",token:a};this.worker.postMessage(e)}setLiveMode(a){if(!this.worker)return;const e={type:"setLiveMode",enabled:a};this.worker.postMessage(e)}forceRefresh(){this.worker&&this.worker.postMessage({type:"forceRefresh"})}pausePolling(){this.worker&&this.worker.postMessage({type:"pause"})}resumePolling(){this.worker&&this.worker.postMessage({type:"resume"})}clearCache(){this.worker&&this.worker.postMessage({type:"clearCache"})}setTimeWindow(a){if(!this.worker)return;const e={type:"setTimeWindow",hours:a};this.worker.postMessage(e)}terminate(){if(this.unsubscribeTokenChange&&(this.unsubscribeTokenChange(),this.unsubscribeTokenChange=null),this.worker){const a={type:"stop"};this.worker.postMessage(a),this.worker.terminate(),this.worker=null}this.isInitialized=!1,this.statsListeners.clear(),this.packetsListeners.clear(),this.errorListeners.clear()}isReady(){return this.isInitialized}},_g="pymc-packet-cache",Vg="pymc-packet-cache-meta",Og=36e5,$g=5e3,Wg=2592e5,Ug=6048e5,Hg=12096e5,Yg=5e5,Gg=new class{constructor(){o(this,"packets",new Map),o(this,"sortedPackets",[]),o(this,"sortedDirty",!0),o(this,"meta",{oldestTimestamp:0,newestTimestamp:0,lastUpdated:0,packetCount:0,backgroundLoadComplete:!1,topologyLoadComplete:!1,dataTier:"24h",threeDayLoadComplete:!1,sevenDayLoadComplete:!1,fourteenDayLoadComplete:!1}),o(this,"isLoading",!1),o(this,"isBackgroundLoading",!1),o(this,"isTopologyLoading",!1),o(this,"listeners",new Set),o(this,"loadProgress",null),o(this,"statusMessage",""),this.loadFromStorage()}subscribe(a){return this.listeners.add(a),a(this.getState()),()=>this.listeners.delete(a)}getState(){return{isLoading:this.isLoading,isBackgroundLoading:this.isBackgroundLoading,isTopologyLoading:this.isTopologyLoading,backgroundLoadComplete:this.meta.backgroundLoadComplete,topologyLoadComplete:this.meta.topologyLoadComplete,packetCount:this.packets.size,statusMessage:this.statusMessage,loadProgress:this.loadProgress,dataTier:this.meta.dataTier,threeDayLoadComplete:this.meta.threeDayLoadComplete,sevenDayLoadComplete:this.meta.sevenDayLoadComplete,fourteenDayLoadComplete:this.meta.fourteenDayLoadComplete}}getDataTier(){return this.meta.dataTier}getPackets(){return this.sortedDirty&&(this.sortedPackets=Array.from(this.packets.values()).sort((a,e)=>(a.timestamp??0)-(e.timestamp??0)),this.sortedDirty=!1),this.sortedPackets}getNewestTimestamp(){return this.meta.newestTimestamp}getOldestTimestamp(){return this.meta.oldestTimestamp}isStale(){return 0===this.packets.size||Date.now()-this.meta.lastUpdated>Og}isHeavyLoadInProgress(){return this.isBackgroundLoading||this.isTopologyLoading}async initialLoad(a){if(this.isStale()&&this.packets.size>0&&this.clear(),this.meta.backgroundLoadComplete&&this.packets.size>0)return this.getPackets();this.isLoading=!0;const e=Date.now(),n=Math.floor((e-864e5)/1e3);this.packets.size>0&&(this.packets.clear(),this.sortedPackets=[],this.sortedDirty=!0,this.meta.oldestTimestamp=0,this.meta.newestTimestamp=0),this.statusMessage="Loading...",this.loadProgress={loaded:0,target:3e4,percent:0},this.notifyListeners();try{const e=await this.fetchFilteredPackets(void 0,5e4,!1,n);e.success&&e.data&&e.data.length>0&&(this.mergePackets(e.data),this.loadProgress={loaded:this.packets.size,target:this.packets.size,percent:100},this.notifyListeners(),a&&a()),this.enforceMemoryCap(),this.meta.backgroundLoadComplete=!0,this.meta.dataTier="24h",this.notifyListeners(),this.saveToStorage()}catch(o){this.statusMessage="Load failed"}finally{this.isLoading=!1,this.statusMessage="",this.loadProgress=null,this.notifyListeners()}return this.getPackets()}async quickLoad(){return this.initialLoad()}async backgroundLoad(){await this.initialLoad()}async loadThreeDays(a){this.meta.threeDayLoadComplete||this.isBackgroundLoading||await this.loadExtendedData("3d",Wg,a)}async loadSevenDays(a){this.meta.sevenDayLoadComplete||this.isBackgroundLoading||(await this.loadExtendedData("7d",Ug,a),this.meta.threeDayLoadComplete=!0)}async loadFourteenDays(a){this.meta.fourteenDayLoadComplete||this.isBackgroundLoading||(await this.loadExtendedData("14d",Hg,a),this.meta.threeDayLoadComplete=!0,this.meta.sevenDayLoadComplete=!0)}async loadExtendedData(a,e,n){this.isBackgroundLoading=!0,Ig.pausePolling();const o=Date.now(),t=Math.floor((o-e)/1e3),r=this.meta.oldestTimestamp||Math.floor(o/1e3);if(r<=t)return this.isBackgroundLoading=!1,void Ig.resumePolling();const s=3e4*("3d"===a?2:"7d"===a?6:13),i=this.packets.size,l=i+s;this.loadProgress={loaded:i,target:l,percent:0},this.statusMessage=`Loading ${a} history...`,this.notifyListeners();try{let e=r,o=0,s=0;for(;e>t&&s<3;){const a=await this.fetchChunkWithRetry(e,$g,t);if(null!==a){if(s=0,!(a.success&&a.data&&a.data.length>0))break;{const t=this.packets.size;this.mergePackets(a.data);const r=this.packets.size-t;o+=r,this.loadProgress={loaded:this.packets.size,target:Math.max(l,this.packets.size),percent:Math.min(99,Math.round(this.packets.size/l*100))},this.notifyListeners(),n&&r>0&&n();const s=Math.min(...a.data.map(a=>a.timestamp??1/0));if(!(s!==1/0&&s=Wg,this.meta.threeDayLoadComplete&&(this.meta.dataTier="3d")):"7d"===a?(this.meta.sevenDayLoadComplete=i>=Ug,this.meta.sevenDayLoadComplete&&(this.meta.dataTier="7d")):(this.meta.fourteenDayLoadComplete=i>=Hg,this.meta.fourteenDayLoadComplete&&(this.meta.dataTier="14d")),this.loadProgress={loaded:this.packets.size,target:this.packets.size,percent:100},this.notifyListeners(),this.saveToStorage()}catch(c){this.statusMessage=`${a} load failed`}finally{this.isBackgroundLoading=!1,this.statusMessage="",this.loadProgress=null,this.notifyListeners(),Ig.resumePolling()}}isDataTierAvailable(a){switch(a){case"24h":return this.meta.backgroundLoadComplete;case"3d":return this.meta.threeDayLoadComplete;case"7d":return this.meta.sevenDayLoadComplete;case"14d":return this.meta.fourteenDayLoadComplete;default:return!1}}async topologyLoad(){if(!this.meta.topologyLoadComplete&&!this.isTopologyLoading)return this.doTopologyLoad()}async forceTopologyLoad(){if(!this.isTopologyLoading)return this.meta.topologyLoadComplete=!1,this.doTopologyLoad()}async forceDeepLoad(){return this.forceTopologyLoad()}async doTopologyLoad(){this.isTopologyLoading=!0,Ig.pausePolling();const a=Date.now(),e=Math.floor((a-Hg)/1e3),n=this.meta.oldestTimestamp||Math.floor(a/1e3);if(n<=e)return this.meta.topologyLoadComplete=!0,this.isTopologyLoading=!1,void Ig.resumePolling();const o=this.packets.size,t=o+42e4;this.statusMessage="Loading topology data...",this.loadProgress={loaded:o,target:t,percent:0},this.notifyListeners();try{let a=n,o=0,r=0;for(;a>e&&r<3;){const n=await this.fetchChunkWithRetry(a,$g,e);if(null!==n){if(r=0,!(n.success&&n.data&&n.data.length>0))break;{const e=this.packets.size;this.mergePackets(n.data),o+=this.packets.size-e,this.loadProgress={loaded:this.packets.size,target:Math.max(t,this.packets.size),percent:Math.min(99,Math.round(this.packets.size/t*100))},this.notifyListeners();const r=Math.min(...n.data.map(a=>a.timestamp??1/0));if(!(r!==1/0&&re&&(this.saveToStorage(),this.notifyListeners())}}catch(a){}return this.getPackets()}clear(){this.packets.clear(),this.sortedPackets=[],this.sortedDirty=!0,this.meta={oldestTimestamp:0,newestTimestamp:0,lastUpdated:0,packetCount:0,backgroundLoadComplete:!1,topologyLoadComplete:!1,dataTier:"24h",threeDayLoadComplete:!1,sevenDayLoadComplete:!1,fourteenDayLoadComplete:!1},this.clearStorage(),this.notifyListeners()}mergePacketsDirectly(a){const e=this.packets.size;this.mergePackets(a);const n=this.packets.size-e;return n>0&&(this.enforceMemoryCap(),this.saveToStorage(),this.notifyListeners()),n}mergePackets(a){let e=!1;for(const n of a){const a=n.packet_hash;if(!a)continue;const o=n.timestamp??0,t=`${a}:${o}`;this.packets.has(t)||(this.packets.set(t,n),e=!0),(0===this.meta.oldestTimestamp||othis.meta.newestTimestamp&&(this.meta.newestTimestamp=o)}e&&(this.sortedDirty=!0),this.meta.lastUpdated=Date.now(),this.meta.packetCount=this.packets.size}notifyListeners(){const a=this.getState();for(const e of this.listeners)e(a)}delay(a){return new Promise(e=>setTimeout(e,a))}async fetchChunkWithRetry(a,e,n){for(let t=0;t<3;t++)try{return await this.fetchFilteredPackets(a,e,!1,n)}catch(o){const a=2===t,e=1e3*Math.pow(2,t);o instanceof Error&&o.name,a||(this.statusMessage=`Retry in ${Math.round(e/1e3)}s...`,this.notifyListeners(),await this.delay(e))}return null}enforceMemoryCap(){if(this.packets.size<=Yg)return;const a=this.getPackets(),e=a.length-Yg;for(let n=0;ne&&(this.meta.oldestTimestamp=a[e].timestamp??0)}loadFromStorage(){if("undefined"!=typeof window)try{const a=localStorage.getItem(Vg);a&&(this.meta=JSON.parse(a));const e=localStorage.getItem(_g);if(e){const a=JSON.parse(e);for(const e of a)e.packet_hash&&this.packets.set(e.packet_hash,e)}if(this.meta.lastUpdated>0&&Date.now()-this.meta.lastUpdated>Og)return void this.clear();this.meta.backgroundLoadComplete=!1,this.meta.threeDayLoadComplete=!1,this.meta.sevenDayLoadComplete=!1,this.meta.fourteenDayLoadComplete=!1,this.meta.dataTier="24h";const n=37500;this.meta.topologyLoadComplete&&this.packets.size3e3?a.slice(-3e3):a;localStorage.setItem(_g,JSON.stringify(e))}catch(a){if(a instanceof DOMException&&"QuotaExceededError"===a.name)try{localStorage.removeItem(_g),localStorage.setItem(Vg,JSON.stringify(this.meta))}catch{}}}clearStorage(){if("undefined"!=typeof window)try{localStorage.removeItem(_g),localStorage.removeItem(Vg)}catch(a){}}async fetchRecentPackets(a=1e3,e=!1){const n=`/api/recent_packets?limit=${a}`,o=sg(),t={"Accept-Encoding":"gzip, deflate",Accept:"application/json"};o&&(t.Authorization=`Bearer ${o}`);const r=await fetch(n,{headers:t});if(401===r.status&&!e&&await gg())return this.fetchRecentPackets(a,!0);if(!r.ok)throw new Error(`API error: ${r.status}`);return r.json()}async fetchFilteredPackets(a,e=5e3,n=!1,o){const t=new URLSearchParams;t.set("limit",String(e)),void 0!==a&&t.set("end_timestamp",String(a-.001)),void 0!==o&&t.set("start_timestamp",String(o));const r=`/api/filtered_packets?${t}`,s=sg(),i={"Accept-Encoding":"gzip, deflate",Accept:"application/json"};s&&(i.Authorization=`Bearer ${s}`);const l=new AbortController,c=setTimeout(()=>l.abort(),3e4);try{const o=await fetch(r,{headers:i,signal:l.signal});if(401===o.status&&!n&&await gg())return this.fetchFilteredPackets(a,e,!0);if(!o.ok)throw new Error(`API error: ${o.status}`);return o.json()}finally{clearTimeout(c)}}};function Kg(a){return{paths:a.paths,byEndpoints:new Map(a.byEndpointsEntries),canonicalPaths:new Map(a.canonicalPathsEntries),totalObservations:a.totalObservations,uniquePathCount:a.uniquePathCount}}function Xg(){return{paths:[],byEndpoints:new Map,canonicalPaths:new Map,totalObservations:0,uniquePathCount:0}}const Jg=new class{constructor(){o(this,"worker",null),o(this,"listeners",new Set),o(this,"currentTopology",{edges:[],validatedEdges:[],weakEdges:[],certainEdges:[],uncertainEdges:[],edgeMap:new Map,maxPacketCount:0,maxCertainCount:0,neighborAffinity:new Map,fullAffinity:new Map,localPrefix:null,centrality:new Map,hubNodes:[],gatewayNodes:[],loops:[],loopEdgeKeys:new Set,txDelayRecommendations:new Map,pathRegistry:Xg(),edgeBetweenness:new Map,backboneEdges:[],nodeMobility:new Map,mobileNodes:[],pathHealth:[],lastHopNeighbors:[],disambiguationStats:{totalPrefixes:0,unambiguousPrefixes:0,collisionPrefixes:0,collisionRate:0,avgConfidence:0,lowConfidencePrefixes:[],highCollisionPrefixes:[],totalResolutions:0},discoveredNodes:[],viterbiStats:{totalPaths:0,pathsWithGhosts:0,avgPathCost:0,avgPathConfidence:0,observationOverrideCount:0,tracePacketsProcessed:0,pathPacketsProcessed:0,distantEdgesDiscovered:0,duplicateGroupsFound:0,duplicatePathsUnique:0,echolocationEdgesInferred:0},nodeMetrics:new Map,communityCount:0,backboneNodes:[]}),o(this,"isComputing",!1),o(this,"pendingRequest",null),o(this,"debounceTimer",null),o(this,"debounceMs",100),this.initWorker()}initWorker(){if("undefined"!=typeof window)try{this.worker=new Worker(new URL("/assets/topology.worker-B6JO1dmH.js",import.meta.url),{type:"module"}),this.worker.onmessage=a=>{this.handleWorkerMessage(a.data)},this.worker.onerror=a=>{}}catch(a){}}handleWorkerMessage(a){if(this.isComputing=!1,"error"!==a.type){var e;this.currentTopology={edges:(e=a.payload).edges??[],validatedEdges:e.validatedEdges??[],weakEdges:e.weakEdges??[],certainEdges:e.certainEdges??[],uncertainEdges:e.uncertainEdges??[],maxPacketCount:e.maxPacketCount??0,maxCertainCount:e.maxCertainCount??0,localPrefix:e.localPrefix??null,hubNodes:e.hubNodes??[],gatewayNodes:e.gatewayNodes??[],edgeMap:new Map(e.edgeMapEntries??[]),neighborAffinity:new Map(e.neighborAffinityEntries??[]),fullAffinity:new Map(e.fullAffinityEntries??[]),centrality:new Map(e.centralityEntries??[]),loops:e.loops??[],loopEdgeKeys:new Set(e.loopEdgeKeyEntries??[]),txDelayRecommendations:new Map(e.txDelayRecommendationEntries??[]),pathRegistry:e.pathRegistry?Kg(e.pathRegistry):Xg(),edgeBetweenness:new Map(e.edgeBetweennessEntries??[]),backboneEdges:e.backboneEdges??[],nodeMobility:new Map(e.nodeMobilityEntries??[]),mobileNodes:e.mobileNodes??[],pathHealth:e.pathHealth??[],lastHopNeighbors:e.lastHopNeighbors??[],disambiguationStats:e.disambiguationStats??{totalPrefixes:0,unambiguousPrefixes:0,collisionPrefixes:0,collisionRate:0,avgConfidence:0,lowConfidencePrefixes:[],highCollisionPrefixes:[],totalResolutions:0},discoveredNodes:e.discoveredNodes??[],viterbiStats:e.viterbiStats??{totalPaths:0,pathsWithGhosts:0,avgPathCost:0,avgPathConfidence:0,observationOverrideCount:0,tracePacketsProcessed:0,pathPacketsProcessed:0,distantEdgesDiscovered:0,duplicateGroupsFound:0,duplicatePathsUnique:0,echolocationEdgesInferred:0},nodeMetrics:new Map(e.nodeMetricsEntries??[]),communityCount:e.communityCount??0,backboneNodes:e.backboneNodes??[]};for(const e of this.listeners)try{e(this.currentTopology,a.computeTimeMs)}catch(n){}if(this.pendingRequest){const a=this.pendingRequest;this.pendingRequest=null,this.computeInternal(a)}}}computeInternal(a){if(!this.worker)return;this.isComputing=!0;const e={type:"compute",payload:a};this.worker.postMessage(e)}compute(a,e,n,o,t,r,s,i){const l={packets:a,neighbors:e,localHash:n,localLat:o,localLon:t,airtimeMs:r,zeroHopNeighbors:s,terrainGrid:i,enableTerrainAware:void 0!==i};this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.isComputing?this.pendingRequest=l:this.computeInternal(l)},this.debounceMs)}subscribe(a){return this.listeners.add(a),this.currentTopology.edges.length>0&&a(this.currentTopology,0),()=>{this.listeners.delete(a)}}getTopology(){return this.currentTopology}isWorking(){return this.isComputing}terminate(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.worker&&(this.worker.terminate(),this.worker=null),this.listeners.clear()}},Zg=new class{constructor(){o(this,"worker",null),o(this,"listeners",new Set),o(this,"sparklines",new Map),o(this,"isComputing",!1),o(this,"lastComputeTimeMs",0),o(this,"pendingRequest",null),o(this,"debounceTimer",null),o(this,"debounceMs",150),this.initWorker()}initWorker(){if("undefined"!=typeof window)try{this.worker=new Worker(new URL("/assets/sparkline.worker-CmKhBAy5.js",import.meta.url),{type:"module"}),this.worker.onmessage=a=>{this.handleWorkerMessage(a.data)},this.worker.onerror=a=>{this.isComputing=!1,this.notifyListeners()}}catch(a){}}handleWorkerMessage(a){if(this.isComputing=!1,"error"!==a.type){if(this.sparklines=new Map(a.payload.sparklineEntries),this.lastComputeTimeMs=a.computeTimeMs,this.notifyListeners(),this.pendingRequest){const a=this.pendingRequest;this.pendingRequest=null,this.computeInternal(a.packets,a.nodeHashes)}}else this.notifyListeners()}computeInternal(a,e){if(!this.worker)return;if(0===e.length)return this.isComputing=!1,void this.notifyListeners();this.isComputing=!0,this.notifyListeners();const n={type:"compute",payload:{packets:a,nodeHashes:e}};this.worker.postMessage(n)}notifyListeners(){for(const e of this.listeners)try{e(this.sparklines,this.isComputing)}catch(a){}}compute(a,e){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.isComputing?this.pendingRequest={packets:a,nodeHashes:e}:this.computeInternal(a,e)},this.debounceMs)}getSparkline(a){return this.sparklines.get(a)??[]}getAllSparklines(){return this.sparklines}hasSparkline(a){return this.sparklines.has(a)}isWorking(){return this.isComputing}getLastComputeTime(){return this.lastComputeTimeMs}subscribe(a){return this.listeners.add(a),a(this.sparklines,this.isComputing),()=>{this.listeners.delete(a)}}clear(){this.sparklines.clear(),this.notifyListeners()}terminate(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.worker&&(this.worker.terminate(),this.worker=null),this.listeners.clear()}},Qg=new class{constructor(){o(this,"ws",null),o(this,"connectionState","disconnected"),o(this,"reconnectAttempts",0),o(this,"pingIntervalId",null),o(this,"lastPongTime",Date.now()),o(this,"reconnectTimeoutId",null),o(this,"packetListeners",new Set),o(this,"statsListeners",new Set),o(this,"systemStatsListeners",new Set),o(this,"packetStatsListeners",new Set),o(this,"connectionListeners",new Set),o(this,"unsubscribeTokenChange",null),o(this,"wsSupported",!0)}buildWsUrl(){const a=sg(),e=ng(),n=new URLSearchParams;a&&n.set("token",a),e&&n.set("client_id",e);const o=n.toString()?`?${n.toString()}`:"";return`${"https:"===window.location.protocol?"wss:":"ws:"}//${window.location.host}/ws/packets${o}`}connect(){var a,e;if((null==(a=this.ws)?void 0:a.readyState)!==WebSocket.OPEN&&(null==(e=this.ws)?void 0:e.readyState)!==WebSocket.CONNECTING&&this.wsSupported){this.setConnectionState("connecting");try{const a=this.buildWsUrl();this.ws=new WebSocket(a),this.ws.onopen=this.handleOpen.bind(this),this.ws.onmessage=this.handleMessage.bind(this),this.ws.onerror=this.handleError.bind(this),this.ws.onclose=this.handleClose.bind(this),this.unsubscribeTokenChange||(this.unsubscribeTokenChange=ag(a=>{a&&"connected"===this.connectionState&&(this.disconnect(),this.connect())}))}catch(n){this.wsSupported=!1,this.setConnectionState("disconnected")}}}disconnect(){this.clearPingInterval(),this.clearReconnectTimeout(),this.ws&&(this.ws.onopen=null,this.ws.onmessage=null,this.ws.onerror=null,this.ws.onclose=null,this.ws.readyState!==WebSocket.OPEN&&this.ws.readyState!==WebSocket.CONNECTING||this.ws.close(1e3,"Client disconnect"),this.ws=null),this.setConnectionState("disconnected"),this.reconnectAttempts=0}isConnected(){var a;return(null==(a=this.ws)?void 0:a.readyState)===WebSocket.OPEN}getConnectionState(){return this.connectionState}isSupported(){return this.wsSupported}resetSupported(){this.wsSupported||(this.wsSupported=!0,this.reconnectAttempts=0)}send(a){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return!1;try{return this.ws.send(JSON.stringify(a)),!0}catch(e){return!1}}onPacket(a){return this.packetListeners.add(a),()=>this.packetListeners.delete(a)}onStats(a){return this.statsListeners.add(a),()=>this.statsListeners.delete(a)}onSystemStats(a){return this.systemStatsListeners.add(a),()=>this.systemStatsListeners.delete(a)}onPacketStats(a){return this.packetStatsListeners.add(a),()=>this.packetStatsListeners.delete(a)}onConnectionChange(a){return this.connectionListeners.add(a),a(this.connectionState,this.reconnectAttempts),()=>this.connectionListeners.delete(a)}handleOpen(){this.setConnectionState("connected"),this.reconnectAttempts=0,this.lastPongTime=Date.now();const a=sg();a&&this.ws&&this.ws.send(JSON.stringify({type:"auth",token:a})),this.startPingInterval()}handleMessage(a){try{const e=JSON.parse(a.data);switch(e.type){case"packet":this.notifyPacketListeners(e.data);break;case"stats":{const a=e.data;a&&"noise_floor_dbm"in a&&this.notifyStatsListeners(a),(null==a?void 0:a.packet_stats)&&this.notifyPacketStatsListeners(a.packet_stats),(null==a?void 0:a.system_stats)&&this.notifySystemStatsListeners(a.system_stats);break}case"packet_stats":{const a=e.data;this.notifyPacketStatsListeners(a);break}case"system_stats":this.notifySystemStatsListeners(e.data);break;case"ping":this.lastPongTime=Date.now(),this.send({type:"pong"});break;case"pong":this.lastPongTime=Date.now()}}catch(e){}}handleError(a){}handleClose(a){this.clearPingInterval(),1e3!==a.code?(1006===a.code&&this.reconnectAttempts,this.scheduleReconnect()):this.setConnectionState("disconnected")}setConnectionState(a){if(this.connectionState!==a){this.connectionState=a;for(const n of this.connectionListeners)try{n(a,this.reconnectAttempts)}catch(e){}}}notifyPacketListeners(a){for(const n of this.packetListeners)try{n(a)}catch(e){}}notifyStatsListeners(a){for(const n of this.statsListeners)try{n(a)}catch(e){}}notifySystemStatsListeners(a){for(const n of this.systemStatsListeners)try{n(a)}catch(e){}}notifyPacketStatsListeners(a){for(const n of this.packetStatsListeners)try{n(a)}catch(e){}}startPingInterval(){this.clearPingInterval(),this.pingIntervalId=setInterval(()=>{var a;(null==(a=this.ws)?void 0:a.readyState)===WebSocket.OPEN&&(this.send({type:"ping"}),Date.now()-this.lastPongTime>6e4&&(this.disconnect(),this.connect()))},3e4)}async verifyConnection(a=5e3){return!(!this.ws||this.ws.readyState!==WebSocket.OPEN)&&new Promise(e=>{const n=Date.now(),o=this.lastPongTime;this.send({type:"ping"});const t=setInterval(()=>{this.lastPongTime>o?(clearInterval(t),e(!0)):Date.now()-n>a&&(clearInterval(t),e(!1))},100)})}clearPingInterval(){this.pingIntervalId&&(clearInterval(this.pingIntervalId),this.pingIntervalId=null)}scheduleReconnect(){if(this.reconnectAttempts>=20)return this.wsSupported=!1,void this.setConnectionState("disconnected");this.setConnectionState("reconnecting");const a=Math.min(1e3*Math.pow(2,Math.min(this.reconnectAttempts,5)),3e4);this.reconnectAttempts++,this.reconnectTimeoutId=setTimeout(()=>{this.reconnectTimeoutId=null,this.connect()},a)}clearReconnectTimeout(){this.reconnectTimeoutId&&(clearTimeout(this.reconnectTimeoutId),this.reconnectTimeoutId=null)}terminate(){this.disconnect(),this.unsubscribeTokenChange&&(this.unsubscribeTokenChange(),this.unsubscribeTokenChange=null),this.packetListeners.clear(),this.statsListeners.clear(),this.systemStatsListeners.clear(),this.packetStatsListeners.clear(),this.connectionListeners.clear()}},ab=3e4,eb=new class{constructor(){o(this,"staged",new Map),o(this,"recentlyConfirmed",new Map),o(this,"listeners",new Set),o(this,"pruneIntervalId",null),this.startPruneInterval()}stage(a){const e=a.packet_hash;if(!e)return;if(this.staged.has(e))return;const n=this.recentlyConfirmed.get(e);n&&Date.now()-n=100&&this.removeOldest(),this.staged.set(e,{packet:a,stagedAt:Date.now()}),this.notifyListeners())}confirm(a){this.staged.delete(a)&&this.notifyListeners()}confirmBatch(a){let e=!1;const n=Date.now();for(const o of a)this.recentlyConfirmed.set(o,n),this.staged.delete(o)&&(e=!0);if(this.recentlyConfirmed.size>200){const a=n-ab;for(const[e,n]of this.recentlyConfirmed)n(e.packet.timestamp??0)-(a.packet.timestamp??0))}isPending(a){return!!a&&this.staged.has(a)}getPendingCount(){return this.staged.size}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}clear(){this.staged.size>0&&(this.staged.clear(),this.notifyListeners())}terminate(){this.stopPruneInterval(),this.staged.clear(),this.listeners.clear()}notifyListeners(){const a=this.getPendingPackets();for(const n of this.listeners)try{n(a)}catch(e){}}pruneExpired(){const a=Date.now();let e=!1;for(const[n,o]of this.staged)a-o.stagedAt>ab&&(this.staged.delete(n),e=!0);e&&this.notifyListeners()}removeOldest(){let a=null,e=1/0;for(const[n,o]of this.staged)o.stagedAtthis.pruneExpired(),1e4))}stopPruneInterval(){this.pruneIntervalId&&(clearInterval(this.pruneIntervalId),this.pruneIntervalId=null)}},nb=w(a=>({connectionState:"disconnected",isSupported:!0,reconnectAttempt:0,lastConnected:null,initialize:()=>{Qg.onConnectionChange((e,n)=>{a(a=>({connectionState:e,reconnectAttempt:n??0,isSupported:Qg.isSupported(),lastConnected:"connected"===e?Date.now():a.lastConnected}))}),Qg.connect()}})),ob=.05,tb=1e3,rb="terrarium";function sb(a,e,n){try{return a.queryTerrainElevation({lng:e,lat:n})??0}catch{return 0}}const ib=w((a,e)=>({terrainGrid:null,isLoading:!1,error:null,lastLoadedAt:null,cachedBounds:null,terrainDisambiguationEnabled:!0,loadTerrain:async(n,o)=>{const t=e();if(!(t.isLoading||(r=t.cachedBounds,s=n,r&&r.minLat<=s.minLat&&r.maxLat>=s.maxLat&&r.minLng<=s.minLng&&r.maxLng>=s.maxLng))){var r,s;a({isLoading:!0,error:null});try{o.getTerrain()||(o.getSource(rb)||(o.addSource(rb,{type:"raster-dem",tiles:["https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png"],encoding:"terrarium",tileSize:256}),await new Promise((a,e)=>{const n=setTimeout(()=>e(new Error("Terrain source load timeout")),1e4),t=e=>{e.sourceId===rb&&e.isSourceLoaded&&(clearTimeout(n),o.off("sourcedata",t),a())};o.on("sourcedata",t)})),o.setTerrain({source:rb}),await new Promise(a=>setTimeout(a,500)));const e=await async function(a,e){const{minLat:n,maxLat:o,minLng:t,maxLng:r}=e;let s=Math.ceil((r-t)/.001),i=Math.ceil((o-n)/.001);s>tb&&(s=tb),i>tb&&(i=tb);const l=(r-t)/s,c=(o-n)/i,d=Math.max(l,c),u=new Float32Array(s*i);let h=0;for(let m=0;msetTimeout(a,0))}}return{origin:[n,t],cellSize:d,width:s,height:i,elevations:u}}(o,n);a({terrainGrid:e,isLoading:!1,lastLoadedAt:Date.now(),cachedBounds:n})}catch(i){const e=i instanceof Error?i.message:"Unknown error loading terrain";a({isLoading:!1,error:e})}}},preloadFromNodes:async(a,n)=>{const o=function(a){const e=a.filter(a=>void 0!==a.latitude&&void 0!==a.longitude&&(0!==a.latitude||0!==a.longitude));if(0===e.length)return null;let n=1/0,o=-1/0,t=1/0,r=-1/0;for(const s of e)n=Math.min(n,s.latitude),o=Math.max(o,s.latitude),t=Math.min(t,s.longitude),r=Math.max(r,s.longitude);return{minLat:n-ob,maxLat:o+ob,minLng:t-ob,maxLng:r+ob}}(a);o&&await e().loadTerrain(o,n)},clearTerrain:()=>{a({terrainGrid:null,cachedBounds:null,lastLoadedAt:null,error:null})},setTerrainDisambiguationEnabled:e=>{a({terrainDisambiguationEnabled:e})},getTerrainGridForDisambiguation:()=>{const a=e();return a.terrainDisambiguationEnabled?a.terrainGrid:null}})),lb="pymc-stealth-location";function cb(a){if("undefined"!=typeof window)try{localStorage.setItem(lb,JSON.stringify(a))}catch{}}function db(a){return!isNaN(a)&&a>=-90&&a<=90}function ub(a){return!isNaN(a)&&a>=-180&&a<=180}const hb=function(){if("undefined"==typeof window)return{};try{const a=localStorage.getItem(lb);if(!a)return{};const e=JSON.parse(a);if("number"==typeof e.latitude&&"number"==typeof e.longitude&&"boolean"==typeof e.enabled&&db(e.latitude)&&ub(e.longitude))return e}catch{}return{}}(),mb=w((a,e)=>({latitude:hb.latitude??null,longitude:hb.longitude??null,enabled:hb.enabled??!1,setLocation:(n,o)=>{db(n)&&ub(o)&&(a({latitude:n,longitude:o}),cb({latitude:n,longitude:o,enabled:e().enabled}))},enable:()=>{const{latitude:n,longitude:o}=e();null!==n&&null!==o&&(a({enabled:!0}),cb({latitude:n,longitude:o,enabled:!0}))},disable:()=>{a({enabled:!1});const{latitude:n,longitude:o}=e();null!==n&&null!==o&&cb({latitude:n,longitude:o,enabled:!1})},clear:()=>{a({latitude:null,longitude:null,enabled:!1}),function(){if("undefined"!=typeof window)try{localStorage.removeItem(lb)}catch{}}()},getEffectiveLocation:()=>{const{latitude:a,longitude:n,enabled:o}=e();return o&&null!==a&&null!==n?{latitude:a,longitude:n}:null},isActive:()=>{const{latitude:a,longitude:n,enabled:o}=e();return o&&null!==a&&null!==n}}));function pb(a,e,n,o){return!e&&o>=3?"offline":n?"connected"!==a&&e||o>0&&o<3?"degraded":"connected":"offline"}const gb=w((a,e)=>({wsState:"disconnected",wsReconnectAttempt:0,restHealthy:!0,lastSuccessfulFetch:null,consecutiveFailures:0,authValid:!0,authExpiresIn:null,health:"connected",bannerDismissed:!1,isInitializing:!0,initialize:()=>{Qg.onConnectionChange((n,o)=>{const{restHealthy:t,authValid:r,consecutiveFailures:s,health:i,isInitializing:l}=e(),c=l&&"connected"===n,d=pb(n,t,r,s);a({wsState:n,wsReconnectAttempt:o??0,health:d,isInitializing:!c&&l,bannerDismissed:(d===i||"connected"!==d)&&e().bannerDismissed})}),e().updateAuthState(),setTimeout(()=>{e().isInitializing&&a({isInitializing:!1})},1e4),setInterval(()=>{e().updateAuthState()},3e4)},updateRestHealth:n=>{const{wsState:o,authValid:t,consecutiveFailures:r,health:s}=e(),i=n?0:r+1,l=n||i<3,c=n?Date.now():e().lastSuccessfulFetch,d=pb(o,l,t,i);a({restHealthy:l,lastSuccessfulFetch:c,consecutiveFailures:i,health:d,bannerDismissed:"connected"!==d&&d===s&&e().bannerDismissed})},updateAuthState:()=>{const n=cg()&&!ug(),o=hg(),{wsState:t,restHealthy:r,consecutiveFailures:s,health:i}=e(),l=pb(t,r,n,s);a({authValid:n,authExpiresIn:o>0?o:null,health:l,bannerDismissed:l===i&&e().bannerDismissed})},dismissBanner:()=>{a({bannerDismissed:!0})}})),bb=new class{constructor(){o(this,"worker",null),o(this,"isReady",!1),o(this,"pendingRequests",[]),o(this,"currentRequest",null),this.initWorker()}initWorker(){if("undefined"!=typeof window)try{this.worker=new Worker(new URL("/assets/decryption.worker-C84ax0zu.js",import.meta.url),{type:"module"}),this.worker.onmessage=this.handleMessage.bind(this),this.worker.onerror=a=>{}}catch(a){}}handleMessage(a){var e,n;const o=a.data;switch(o.type){case"ready":this.isReady=!0,this.processNextRequest();break;case"progress":(null==(e=this.currentRequest)?void 0:e.onProgress)&&this.currentRequest.onProgress(o.processed,o.total);break;case"result":(null==(n=this.currentRequest)?void 0:n.onResult)&&this.currentRequest.onResult(o.result);break;case"batchComplete":this.currentRequest&&(this.currentRequest.onBatchComplete(o.successCount,o.totalCount,o.computeTimeMs),this.currentRequest=null),this.processNextRequest();break;case"error":this.currentRequest&&(this.currentRequest.onBatchComplete(0,0,0),this.currentRequest=null),this.processNextRequest()}}processNextRequest(){if(!this.isReady||!this.worker||this.currentRequest)return;const a=this.pendingRequests.shift();if(!a)return;this.currentRequest={onProgress:a.onProgress,onResult:a.onResult,onBatchComplete:a.onBatchComplete};const e={type:"decrypt",packets:a.packets};this.worker.postMessage(e)}decrypt(a,e){return new Promise(n=>{const o=a.map(a=>({packet_hash:a.packet_hash,raw_packet:a.raw_packet||"",timestamp:a.timestamp??0,rssi:a.rssi,snr:a.snr,type:a.type,payload_type:a.payload_type}));this.pendingRequests.push({packets:o,onProgress:null==e?void 0:e.onProgress,onResult:null==e?void 0:e.onResult,onBatchComplete:(a,e,o)=>{n({successCount:a,totalCount:e,computeTimeMs:o})}}),this.processNextRequest()})}isServiceReady(){return this.isReady}isProcessing(){return null!==this.currentRequest}getPendingCount(){return this.pendingRequests.length}terminate(){if(this.worker){const a={type:"stop"};this.worker.postMessage(a),this.worker.terminate(),this.worker=null}this.isReady=!1,this.pendingRequests=[],this.currentRequest=null}},fb=3,yb=2,vb=15,wb=6,kb=3,xb=0,jb=1,zb=2,Cb=3,Ab={[xb]:"T_FLOOD",[jb]:"FLOOD",[zb]:"DIRECT",[Cb]:"T_DIRECT"},Db=0,Eb=1,Bb=2,Fb=3,qb=4,Sb=5,Mb=6,Tb=7,Pb=8,Lb=9,Rb=10,Nb=11,Ib=15,_b={REQ:0,RESPONSE:1,ADVERT:4,GRP_TXT:5,GRP_DATA:6,ANON_REQ:7,TRACE:9},Vb={[Db]:"REQ",[Eb]:"RESPONSE",[Bb]:"TXT_MSG",[Fb]:"ACK",[qb]:"ADVERT",[Sb]:"GRP_TXT",[Mb]:"GRP_DATA",[Tb]:"ANON_REQ",[Pb]:"PATH",[Lb]:"TRACE",[Rb]:"MULTIPART",[Nb]:"CONTROL",[Ib]:"RAW_CUSTOM"},Ob=1,$b=32,Wb=64,Ub=64,Hb=4,Yb=1,Gb=2,Kb=3,Xb=4,Jb=16,Zb=128,Qb=15;function af(a){return 1===a||0===a}function ef(a){return 2===a||3===a}function nf(a){return 0===a||3===a}function of(a){const e=[];switch(15&a){case 1:e.push("is companion");break;case 2:e.push("is repeater");break;case 3:e.push("is room server");break;case 4:e.push("is sensor")}return 16&a&&e.push("has location"),32&a&&e.push("has feature 1"),64&a&&e.push("has feature 2"),128&a&&e.push("has name"),e.join(", ")||"none"}function tf(a){return Ab[a]??`UNKNOWN(${a})`}function rf(a){return Vb[a]??`UNKNOWN(${a})`}function sf(a){const e=a.replace(/^0x/i,"").replace(/\s/g,"");if(e.length%2!=0)throw new Error("Invalid hex string: odd number of characters");const n=new Uint8Array(e.length/2);for(let o=0;oa.toString(16).padStart(2,"0")).join("");return e&&(o=o.toUpperCase()),n&&(o="0x"+o),o}function cf(a,e=!0){const n=(255&a).toString(16).padStart(2,"0");return e?n.toUpperCase():n}function df(a,e,n,o){if(a+e>n)throw new Error(o)}function uf(a){if(a>256)throw new Error(`payload too large: ${a} > 256`)}function hf(){return"undefined"!=typeof crypto&&void 0!==crypto.subtle&&"function"==typeof crypto.subtle.digest}const mf=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]),pf=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);function gf(a,e){return(a>>>e|a<<32-e)>>>0}function bf(a,e){let n=a[0],o=a[1],t=a[2],r=a[3],s=a[4],i=a[5],l=a[6],c=a[7];for(let d=0;d<64;d++){if(d>=16){const a=gf(e[d-15&15],7)^gf(e[d-15&15],18)^e[d-15&15]>>>3,n=gf(e[d-2&15],17)^gf(e[d-2&15],19)^e[d-2&15]>>>10;e[15&d]=e[15&d]+a+e[d-7&15]+n>>>0}const a=c+(gf(s,6)^gf(s,11)^gf(s,25))+(s&i^~s&l)+mf[d]+e[15&d]>>>0,u=n&o^n&t^o&t;c=l,l=i,i=s,s=r+a>>>0,r=t,t=o,o=n,n=a+((gf(n,2)^gf(n,13)^gf(n,22))+u>>>0)>>>0}a[0]=a[0]+n>>>0,a[1]=a[1]+o>>>0,a[2]=a[2]+t>>>0,a[3]=a[3]+r>>>0,a[4]=a[4]+s>>>0,a[5]=a[5]+i>>>0,a[6]=a[6]+l>>>0,a[7]=a[7]+c>>>0}function ff(a){const e=new Uint32Array(pf),n=new Uint32Array(16),o=8*a.length,t=a.length+9+63&-64,r=new Uint8Array(t);r.set(a),r[a.length]=128;const s=new DataView(r.buffer);s.setUint32(t-4,o,!1);for(let c=0;c>=1}return n}function jf(a){let e=a[13];a[13]=a[9],a[9]=a[5],a[5]=a[1],a[1]=e,e=a[2],a[2]=a[10],a[10]=e,e=a[6],a[6]=a[14],a[14]=e,e=a[3],a[3]=a[7],a[7]=a[11],a[11]=a[15],a[15]=e}function zf(a){for(let e=0;e<16;e++)a[e]=wf[a[e]]}function Cf(a,e){for(let n=0;n<16;n++)a[n]^=e[n]}function Af(a){for(let e=0;e<4;e++){const n=4*e,o=a[n],t=a[n+1],r=a[n+2],s=a[n+3];a[n]=xf(14,o)^xf(11,t)^xf(13,r)^xf(9,s),a[n+1]=xf(9,o)^xf(14,t)^xf(11,r)^xf(13,s),a[n+2]=xf(13,o)^xf(9,t)^xf(14,r)^xf(11,s),a[n+3]=xf(11,o)^xf(13,t)^xf(9,r)^xf(14,s)}}function Df(a,e){const n=new Uint8Array(a);Cf(n,e[10]);for(let o=9;o>=1;o--)jf(n),zf(n),Cf(n,e[o]),Af(n);return jf(n),zf(n),Cf(n,e[0]),n}function Ef(a,e){const n=function(a){const e=[],n=new Uint8Array(176);n.set(a.slice(0,16));for(let o=16;o<176;o+=4){let a=n[o-4],e=n[o-3],t=n[o-2],r=n[o-1];if(o%16==0){const n=a;a=vf[e]^kf[o/16-1],e=vf[t],t=vf[r],r=vf[n]}n[o]=n[o-16]^a,n[o+1]=n[o-15]^e,n[o+2]=n[o-14]^t,n[o+3]=n[o-13]^r}for(let o=0;o<11;o++)e.push(n.slice(16*o,16*(o+1)));return e}(a),o=new Uint8Array(e.length);for(let t=0;t>>0}function Sf(a,e){return a[e]|a[e+1]<<8}function Mf(a,e){return(a[e]|a[e+1]<<8|a[e+2]<<16|a[e+3]<<24)>>>0}function Tf(a,e,n){e[n]=255&a,e[n+1]=a>>8&255}function Pf(a){return(a instanceof Uint8Array?Array.from(a):a).map(a=>cf(a,!0)).join("->")}const Lf=["10-de-abril","100-mile-house","100milehouse","10deabril","18-de-marzo","18demarzo","1da","1dm","1mh","1ra-seccion-de-izapa","1rasecciondeizapa","1sdi","2da-seccion-de-medio-monte","2dasecciondemediomonte","31-de-octubre","31deoctubre","3do","a1s","aa","aac","aacg","aala","ab","abac","abala","abasolo","abasolo-del-valle","abasolodelvalle","abbeville","abbeydale","abbotsford","abbottstown","abdenago-c-garcia","abdenagocgarcia","abelardo-l-rodriguez","abelardolrodriguez","aberdeen","aberdeen-proving-ground","aberdeenprovingground","abernathy","abilene","abingdon","abington","abita-springs","abitasprings","abram","abrevadero","abs","absarokee","absecon","abts","ac","ac2s","ac3s","acachapanycolmena3raseccion","acachuen","acacoyagua","academy-garden","academygarden","acadia","acahuasco","acahuizotla","acajete","acala","acalanes-ridge","acalanesridge","acalco","acalpican-de-morelos","acalpicandemorelos","acambaro","acambay","acamilpa","acamixtla","acanceh","acapetahua","acapetlahuaya","acaponeta","acapulco-de-juarez","acapulcodejuarez","acatempa","acatempan","acatepec","acatic","acatla","acatlan","acatlan-de-juarez","acatlan-de-osorio","acatlan-de-perez-figueroa","acatlandejuarez","acatlandeosorio","acatlandeperezfigueroa","acatzingo","acatzingoacatzingodelapiedra","acaxochitlan","acaxtlahuacandealbinozertuche","acayuca","acayucan","acazonica","accokeek","accomac","acg","ach","achichipico","achotal-de-moreno","achotaldemoreno","ackerman","ackley","aclc","acm","acme","acoapa","acolman-de-netzahualcoyotl","acolmandenetzahualcoyotl","aconchi","acontitla","acopinalco-del-penon","acopinalcodelpenon","acoxcatlan","acoyotla","acres-green","acresgreen","act","acteopan","actipan","actipan-de-morelos","actipandemorelos","acton","acton-vale","actonvale","actopan","acuaco","acuamanala","acuexcomac","acuitlapan","acuitlapilco","acuitzio-del-canje","acuitziodelcanje","acula","aculco-de-espinoza","aculcodeespinoza","acultzingo","acushnet","acushnet-center","acushnetcenter","acworth","acxotla-del-monte","acxotla-del-rio","acxotladelmonte","acxotladelrio","ad","ada","adairsville","adams","adams-center","adams-morgan","adamscenter","adamsmorgan","adamstown","adamsville","adaz","adb","adc","addis","addison","ade","adel","adelanto","adelphi","adf","adg","adh","adi","adj","adjuntas-del-rio","adjuntasdelrio","adlf","adli","adll","adlm","adlr","adlu","adm","admu","adn","ado","adolfo-lopez-mateos","adolfo-moreno","adolfo-ruiz-cortines","adolfolopezmateos","adolfolopezmateoseltamarindo","adolfomoreno","adolforuizcortines","adp","adpf","adq","adr","adrian","ads","adst","adstock","adt","aduana-del-sasabe","aduanadelsasabe","adv","advance","adwolf","adz","ae","aea","aeb","aeg","af","afa","affton","afton","ag","agassiz","agawam","agb","agcv","aggf","agiabampo-uno","agiabampouno","agincourt-north","agincourt-south-malvern-west","agincourtnorth","agincourtsouthmalvernwest","agostitlan","agoura","agoura-hills","agourahills","agricola-lazaro-cardenas","agricolalazarocardenas","agronomos-mexicanos","agronomosmexicanos","agu","agua-azul","agua-blanca","agua-blanca-serrania","agua-buena","agua-caliente","agua-del-espino","agua-dulce","agua-escondida","agua-fria","agua-gorda","agua-nueva","agua-prieta","agua-senora","agua-verde","agua-zarca","aguaazul","aguablanca","aguablancaserrania","aguabuena","aguacaliente","aguacalientegrandedegastelum","aguacatenango","aguadelespino","aguadulce","aguaescondida","aguafria","aguagorda","agualeguas","aguanga","aguanueva","aguaprieta","aguas-blancas","aguas-buenas","aguas-calientes","aguasblancas","aguasbuenas","aguascalientes","aguasenora","aguaverde","aguazarca","aguilera","aguililla","agustin-de-iturbide","agustindeiturbide","agv","ah","aha","ahlv","ahome","ahoskie","ahtanum","ahuacachahue-ndogyo-itun-tichi","ahuacachahuendogyoituntichi","ahuacatan","ahuacatitlan","ahuacatlan","ahuacatlan-de-guadalupe","ahuacatlandeguadalupe","ahuacuotzingo","ahuajutla","ahualulco-de-mercado","ahualulco-del-sonido-trece","ahualulcodelsonidotrece","ahualulcodemercado","ahuatempan","ahuateno","ahuatepec","ahuatepec-de-camino","ahuatepec-pueblo","ahuatepecdecamino","ahuatepecpueblo","ahuatitla","ahuatlan","ahuaxintitla","ahuazotepec","ahuehuepan","ahuehuetitla","ahuehuetitlan","ahuehuetzingo","ahuehueyo-primero-centro","ahuehueyoprimerocentro","ahuexotitlan","ahueyahualco","ahuihuiyuco","ahuimanu","ahuiran","ahuisculco","ahuntsic-cartierville","ahuntsiccartierville","ahwahnee","ahwatukee-foothills","ahwatukeefoothills","ai","aiea","aiea-heights","aieaheights","aiken","aina-haina","aina-haina-hawaii-loa-ridge","ainahaina","ainahainahawaiiloaridge","ainaloa","ainsworth","air-force-academy","airdrie","airforceacademy","airmont","airville","airway-heights","airwayheights","aitkin","aj","ajacuba","ajalpan","ajax","ajb","ajijic","ajilho","ajo","ajuchitlan","ajuchitlan-del-progreso","ajuchitlancito","ajuchitlandelprogreso","ajuno","ak","akil","akron","akumal","akutan","al","ala-moana","ala-moana-kakaako","alabama","alabaster","alachua","alafaya","alameda","alamo","alamo-heights","alamoana","alamoanakakaako","alamogordo","alamoheights","alamos","alamos-tepetitlan","alamosa","alamosa-east","alamosaeast","alamostepetitlan","alaquines","alaska","albanel","albany","albany-park","albanypark","albarradas","albemarle","albers","albert-lea","albert-parkradisson-heights","alberta","albertlea","alberto-carrera-torres","albertocarreratorres","alberton","albertparkradissonheights","albertson","albertville","albia","albion","alborada","alborada-jaltenco","alboradajaltenco","albuquerque","alburtis","alc","alcaraces","alchichica","alcholoa","alcoa","alcocer","alcozacan","alcozauca-de-guerrero","alcozaucadeguerrero","aldama","aldan","alden","aldergrove","aldergrove-east","aldergroveeast","alderson","alderton","alderwood","alderwood-manor","alderwoodmanor","aldine","aledo","alejo-gonzalez-bilbao","alejogonzalezbilbao","alewa-heights","alewaheights","alexander","alexander-city","alexandercity","alexandria","alexandria-bay","alexandriabay","alfajayucan","alfaro","alfonso-g-calderon-velarde","alfonso-moguel","alfonsogarzongranjasfamiliares","alfonsogcalderonpobladosiete","alfonsogcalderonvelarde","alfonsomoguel","alfred","alfredo-v-bonfil","alfredo-v-bonfil-chacampalco","alfredo-v-bonfil-siete-ejidos","alfredovbonfil","alfredovbonfilchacampalco","alfredovbonfilsieteejidos","algoma","algona","algonac","algonquin","algood","alh","alhambra","alhuaca","alhuey","aliamanu-makai","aliamanu-mauka","aliamanumakai","aliamanumauka","aliamanusaltlakesfostervillage","alianza-real","alianzareal","alice","aliceville","alief","aliquippa","aliso-viejo","alisoviejo","alista","aljojuca","allapattah","allegan","allegany","allegheny-west","alleghenyville","alleghenywest","allen","allen-lane","allen-park","allendale","allende","allenlane","allenpark","allenstown","allentown","alliance","allison","allison-park","allisonpark","alliston","allouez","alloway","allston","allstonbrighton","allyn","alm","alma","almagres","almecatla","almedia","almolonga","almoloya","almoloya-de-alquisiras","almoloya-del-rio","almoloyadealquisiras","almoloyadelrio","almont","almonte","aloha","alondra-park","alondrapark","alorton","alotepec","alpatlahuac","alpaugh","alpena","alpha","alpharetta","alpine","alpoyeca","alpuyeca","alpuyecancingo-de-las-montanas","alpuyecancingodelasmontanas","alr","als","alsip","alstead","alt","alta","alta-sierra","altadena","altadore","altamira","altamira-de-zinaparo","altamiradezinaparo","altamirano","altamont","altamonte-springs","altamontesprings","altar","altasierra","altata","altavista","altepexi","alto","alto-lucero","altolucero","alton","alton-north-historical","altona","altonnorthhistorical","altoona","altotonga","alturas","altus","altus-bosques","altusbosques","altzayanca","alum-creek","alum-rock","alumcreek","alumrock","alva","alvarado","alvaro-obregon","alvaro-obregon-santa-cruz","alvaroobregon","alvaroobregonsantacruz","alvin","alvord","am","ama","amacueca","amacuitlapilco","amacuzac","amado-gomez","amado-nervo","amadogomez","amadonervo","amador","amagansett","amanalco-de-becerra","amanalcodebecerra","amapa","amarillo","amatan","amatenango-de-la-frontera","amatenango-del-valle","amatenangodelafrontera","amatenangodelvalle","amatepec","amatillo","amatitan","amatitlan","amatitlan-de-azueta","amatitlandeazueta","amatlan","amatlan-de-canas","amatlan-de-los-reyes","amatlan-de-quetzalcoatl","amatlandecanas","amatlandelosreyes","amatlandequetzalcoatl","amaxac-de-guerrero","amaxacdeguerrero","amayuca","amazcala","amberley","ambler","amboy","ambridge","amealco","ameca","amecameca","ameche","amelia","amelia-court-house","ameliacourthouse","ameluca","america-libre","americalibre","american-canyon","american-falls","american-fork","american-samoa","americancanyon","americanfalls","americanfork","americansamoa","americus","amery","ames","ames-lake","amesbury","ameslake","amesti","amherst","amherst-center","amherstburg","amherstcenter","amidon","amigo-beach","amigobeach","amilcingo","amite","amity","amity-gardens","amitygardens","amityville","amixtlan","amk","aml","ammon","amory","amos","amozoc-de-mota","amozocdemota","ampliacion-la-hincada","ampliacion-san-mateo","ampliacion-tezoyuca","ampliacionlahincada","ampliacionsanmateo","ampliaciontezoyuca","amqui","amsterdam","amuco-de-la-reforma","amucodelareforma","an","anacleto-canabal-2da-seccion","anacleto-canabal-3ra-seccion","anacletocanabal2daseccion","anacletocanabal3raseccion","anaconda","anacortes","anadarko","anaheim","anahola","anahuac","anamosa","ancaster","anchor-point","anchorage","anchorpoint","ancient-oaks","ancientoaks","andalusia","anderson","anderson-mill","andersonmill","andorra","andover","andres-quintana-roo","andresquintanaroo","andrews","andrews-afb","andrewsafb","anenecuilco","angahuan","angamacutiro-de-la-union","angamacutirodelaunion","ange-gardien","angegardien","angel-albino-corzo-guadalupe","angel-fire","angel-r-cabada","angelalbinocorzoguadalupe","angelfire","angelrcabada","angels-camp","angelscamp","angier","angleton","angola","angola-on-the-lake","angolaonthelake","angora","angostura","angus","angwin","anh","animas-trujano","animastrujano","anit","ankeny","anmore","ann-arbor","anna","anna-maria","annamaria","annandale","annapolis","annarbor","annetta","annex","anniston","annville","anoka","ansihuacuaro","anson","ansonia","ansted","antelope","antelope-valley-crestview","antelopevalleycrestview","anthem","anthony","antigo","antigonish","antiguo-morelos","antiguomorelos","antioch","antlers","anton","anton-lizardo","antonio-amaro","antonio-escobedo","antonio-j-bermudez","antonio-rosales","antonioamaro","antonioescobedo","antoniojbermudez","antoniorosales","antonlizardo","antrim","antunez","antunez-morelos","antunezmorelos","antwerp","anza","ao","aosc","aotl","aots","ap","apache","apache-junction","apachejunction","apalachicola","apalachin","apalani","apan","apango","apango-de-zaragoza","apangodezaragoza","apanteopan","apantla","apapantilla","apapataro","apas","apaseo-el-alto","apaseo-el-grande","apaseoelalto","apaseoelgrande","apatauyan","apatzingan","apaxco-de-ocampo","apaxcodeocampo","apaxtla-de-castrejon","apaxtladecastrejon","apazapan","apbf","apc","apeo","apetatitlan-antonio-carbajal","apetatitlanantoniocarbajal","apex","apg","aph","apipilulco","apison","apizaco","aplington","apo","apoala","apoderado","apollo","apollo-beach","apollobeach","apopka","aporo","apozol","appalachia","apple-creek","apple-mountain-lake","apple-valley","applecreek","applemountainlake","appleton","appleton-city","appletoncity","applevalley","applewood","applewood-park","applewoodpark","appling","appomattox","aptos","aptos-hills-larkin-valley","aptoshillslarkinvalley","apulco","aputzio-de-juarez","aputziodejuarez","aqr","aquebogue","aquia-harbour","aquiaharbour","aquila","aquiles-cordova-moran","aquiles-serdan","aquiles-serdan-1ra-seccion","aquiles-serdan-san-fernando","aquilescordovamoran","aquilesserdan","aquilesserdan1raseccion","aquilesserdansanfernando","aquismon","aquixtla","ar","arab","arabi","aragon","aramberri","arandas","aransas-pass","aransaspass","arantepacua","aranza","arapaho","arapahoe","araro","aratichanguio","arbolada-los-sauces","arboladalossauces","arboledas","arbolillo","arbour-lake","arbourlake","arbuckle","arbutus","arbutus-ridge","arbutusridge","arc","arcade","arcadia","arcanum","arcata","arcelia","arcelia-de-rodriguez","arceliaderodriguez","archbald","archbold","archdale","archer","archer-city","archer-lodge","archercity","archerlodge","archie","arcila","arcinas","arco","arcola","arden-arcade","arden-hills","arden-on-the-severn","ardenarcade","ardenhills","ardenonthesevern","ardmore","ardsley","arellano","arena-1ra-seccion","arena-6ta-seccion-la-bolsa","arena-de-hidalgo","arena1raseccion","arena6taseccionlabolsa","arenadehidalgo","arenal","arenal-santa-ana","arenaldealvarezarenaldepaco","arenalsantaana","arenas-valley","arenasvalley","argentine","argo","argos","argyle","arial","arimatea","ario-de-rayon","ario-de-rosales","arioderayon","arioderosales","aristocrat-ranchettes","aristocratranchettes","arivaca-junction","arivacajunction","arivechi","arizona","arizona-city","arizonacity","arizpe","arkadelphia","arkansas","arkansas-city","arkansascity","arkoma","arlington","arlington-heights","arlingtonheights","arma","armada","armadillo-de-los-infante","armadillodelosinfante","armona","armonk","armour","armstrong","arnaudville","arnett","arnold","arnold-line","arnoldline","arnolds-park","arnoldspark","arnprior","aromas","arriaga","arrochar","arroyo-choapam","arroyo-de-banco","arroyo-de-enmedio","arroyo-del-maiz-uno","arroyo-del-potrero","arroyo-grande","arroyo-granizo","arroyo-hondo","arroyo-hondo-abejonal","arroyo-limon","arroyo-palenque","arroyo-san-isidro","arroyo-seco","arroyo-vista-hermosa","arroyo-zapotillo","arroyochicalnuevoarroyochicali","arroyochoapam","arroyodebanco","arroyodeenmedio","arroyodelmaizuno","arroyodelpotrero","arroyogrande","arroyogranizo","arroyohondo","arroyohondoabejonal","arroyolimon","arroyopalenque","arroyos","arroyosanisidro","arroyoseco","arroyovistahermosa","arroyozapotillo","arteaga","artemio-trevino","artemiotrevino","artesia","arthur","articuloprimeroconstitucional","artondale","arturo-martinez-adame","arturomartinezadame","arundel","arvada","arvenza-uno","arvenzauno","arverne","arviat","arvin","as","as1s","asa","asbury","asbury-lake","asbury-park","asburylake","asburypark","ascencion","ascension","ash-flat","ash-grove","ashaway","ashburn","ashburnham","ashby","ashcroft","ashdown","asheboro","asherton","asheville","ashfield","ashflat","ashford","ashgrove","ashland","ashland-city","ashlandcity","ashley","ashmont","ashtabula","ashton","ashton-sandy-spring","ashtonsandyspring","ashville","ashwaubenon","asi","asientos","asm","asmw","asotin","aspen","aspen-hill","aspen-woods","aspenhill","aspenwoods","aspermont","aspinwall","ass","assf","assiniboia","assonet","assumption","astacinga","astapa","astatula","astor","astoria","asuncion-ixtaltepec","asuncion-nochixtlan","asuncion-ocotlan","asuncion-tlacolulita","asuncionixtaltepec","asuncionnochixtlan","asuncionocotlan","asunciontlacolulita","at","atacco","atacheo-de-regalado","atacheoderegalado","atalpan","atapan","atapaneo","atarasquillo","atarjea","atascadero","atascocita","atasta","atchison","atco","atecax","atemajac-de-brizuela","atemajacdebrizuela","atempan","atenango-del-rio","atenangodelrio","atencingo","atengo","atenguillo","atenxoxola","atequiza","atexcatzingo","atglen","athabasca","athena","athens","atherton","athol","aticama","atikokan","atil","atitalaquia","atizapan","atkins","atkinson","atla","atlacahualoya","atlacholoaya","atlacomulco-de-fabela","atlacomulcodefabela","atlahuilco","atlamajac","atlamajalcingo-del-rio","atlamajalcingodelrio","atlangatepec","atlanta","atlantic","atlantic-beach","atlantic-city","atlantic-highlands","atlantic-mine","atlanticbeach","atlanticcity","atlantichighlands","atlanticmine","atlantis","atlapexco","atlatlahucan","atlatongo","atlautla","atlequizayan","atliaca","atlixco","atlixtac","atlzayanca","atmore","atoka","atolinga","atoluca","atonalisco","atongo","atotonilco","atotonilco-de-tula","atotonilco-el-alto","atotonilco-el-bajo","atotonilco-el-grande","atotonilcodetula","atotonilcoelalto","atotonilcoelbajo","atotonilcoelgrande","atotonilquillo","atoyac","atoyac-de-alvarez","atoyacdealvarez","atoyatempan","attalla","attawapiskat","attica","attleboro","atwater","atwater-village","atwatervillage","atwood","atzacan","atzacoaloya","atzala","atzalan","atzingo","atzingo-la-cumbre","atzingolacumbre","atzitzintla","au","au-sable","auberry","aubrey","auburn","auburn-bay","auburn-gresham","auburn-hills","auburn-lake-trails","auburnbay","auburndale","auburngresham","auburnhills","auburnlaketrails","audubon","audubon-park","audubonpark","august","augusta","augusto-gomez-villanueva","augustogomezvillanueva","ault","ault-field","aultfield","aumsville","aurelio-manrique","aureliomanrique","aurora","aurora-ermita","aurora-esquipulas","auroraermita","auroraesquipulas","ausable","austell","austin","austintown","autan","autlan-de-navarro","autlandenavarro","av","ava","avalon","avb","avbc","avc","avenal","avenel","aventura","avenue-b-and-c","avenuebandc","averill-park","averillpark","avery-creek","averycreek","avh","avila-beach","avilabeach","avilla","avis","aviston","avoca","avocado-heights","avocadoheights","avon","avon-by-the-sea","avon-center","avon-lake","avon-park","avonbythesea","avoncenter","avondale","avondale-estates","avondaleestates","avonia","avonlake","avonpark","avra-valley","avravalley","aw","awendaw","axapusco","axaxacualco","axixintla","axochiapan","axochio","axotlan","axtla-de-terrazas","axtladeterrazas","axutla","axuxco","ayahualulco","ayapa","ayapango","ayden","ayer","aylmer","ayometitla","ayoquezco-de-aldama","ayoquezcodealdama","ayotitlan","ayotla","ayotlan","ayotoxco-de-guerrero","ayotoxcodeguerrero","ayotuxtla","ayotzinapa","ayotzintepec","ayr","ayutla","ayutla-de-los-libres","ayutladeloslibres","az","azalea-park","azaleapark","azcapotzalco","azilda","azle","azoyu","aztalan","aztec","azteca","aztlan","azumbilla","azusa","ba","babbitt","baborigame","babson-park","babsonpark","baburia","babylon","baca","bacabachi","bacabchen","bacadehuachi","bacalar","bacame-nuevo","bacamenuevo","bacanora","bacerac","bachajon","bachigualatito","bachiniva","bachoco","bachomobampo-numero-dos","bachomobamponumerodos","back-bay","back-mountain","back-of-the-hill","backbay","backmountain","backofthehill","bacliff","bacoachi","bacobampo","bacorehuis","bacubirito","bacum","bad-axe","badaxe","baden","badger","badin","badiraguato","baea","bafb","bagdad","bagley","bagojo-colectivo","bagojocolectivo","bahia-asuncion","bahia-de-kino","bahia-de-lobos","bahia-tortugas","bahiaasuncion","bahiadekino","bahiadelobos","bahiatortugas","bahuichivo","baidland","baie-comeau","baie-durfe","baie-saint-paul","baie-ste-anne","baiecomeau","baiedurfe","baiesaintpaul","baiesteanne","bailey","baileys-crossroads","baileyscrossroads","bainbridge","bainbridge-island","bainbridgeisland","baird","baiting-hollow","baitinghollow","baj","baja-california","baja-california-sur","bajacalifornia","bajacaliforniasur","bajio-de-bonillas","bajio-de-san-jose","bajio-de-san-nicolas","bajiodebonillas","bajiodesanjose","bajiodesannicolas","bajos-de-chila","bajos-del-ejido","bajosdechila","bajosdelejido","bajucu","baker","baker-city","baker-island","bakercity","bakerisland","bakersfield","bakerstown","bakersville","bal-harbour","bala-cynwyd","balacynwyd","balancan","balch-springs","balchsprings","balcones-heights","balconesheights","bald-knob","baldknob","baldwin","baldwin-city","baldwin-harbor","baldwin-park","baldwincity","baldwinharbor","baldwinpark","baldwinsville","baldwinville","baldwyn","balfour","balharbour","ball","ball-ground","ballantrae","ballard","ballenger-creek","ballengercreek","balleza","ballground","ballinger","ballplay","balls-creek","ballscreek","ballston-lake","ballston-spa","ballstonlake","ballstonspa","ballville","ballwin","bally","balm","balmville","balsam-lake","balsamlake","baltic","baltimore","baltimore-highlands","baltimorehighlands","bamberg","bamoa","ban","banamichi","banbury-don-mills","banburydonmills","banco-nacional","banconacional","bancroft","bandera","banderas","banderas-del-aguila","banderasdelaguila","banderasguatacalca2daseccion","banderilla","bandon","banff","banff-trail","banfftrail","bangandho","bangor","bangor-trident-base","bangortridentbase","bangs","banks","banks-springs","bankssprings","bankview","banner-elk","banner-hill","bannerelk","bannerhill","banning","bannockburn","banus-vallarta-verde-vallarta","banusvallartaverdevallarta","bar-harbor","bar-nunn","bara-de-chachalacas","baraboo","baradechachalacas","baraga","barataria","barberton","barbourmeade","barboursville","barbourville","bardonia","bardstown","bardwell","bargersville","barharbor","bariometo","barker-heights","barkerheights","barling","barnegat","barnes-lake-millers-lake","barnesboro","barneslakemillerslake","barnesville","barneveld","barnhart","barnsdall","barnstable","barnstead","barnum-island","barnumisland","barnunn","barnwell","barra-de-cazones","barra-de-navidad","barra-de-tecoanapa","barrackville","barradecazones","barradenavidad","barradetecoanapa","barrancas","barrancas-y-amate-3ra-seccion","barrancasyamate3raseccion","barraute","barre","barretal","barretos","barrett","barrhead","barrie","barriere","barrington","barrington-hills","barringtonhills","barrio-aztlan","barrio-bordo-nuevo","barrio-chiquichuca","barrio-cuarto-la-loma","barrio-de-boyecha","barrio-de-canales","barrio-de-centro-del-cerrillo","barrio-de-ensido","barrio-de-espana","barrio-de-guadalupe","barrio-de-la-barranca","barrio-de-mexico","barrio-de-nuevo-leon","barrio-de-puentecillas","barrio-de-san-isidro","barrio-de-san-juan","barrio-de-san-miguel","barrio-de-san-ramon","barrio-del-cajon","barrio-el-boncho","barrio-el-vivero","barrio-la-joya","barrio-la-teneria","barrio-los-tules","barrio-nuevo","barrio-nuevo-de-los-muertos","barrio-san-diego","barrio-san-joaquin-el-junco","barrio-san-miguel-dorami","barrio-santa-cruz","barrio-tlatenco","barrioaztlan","barriobordonuevo","barriochiquichuca","barriocuartolaloma","barriodeboyecha","barriodecanales","barriodecentrodelcerrillo","barriodeensido","barriodeespana","barriodeguadalupe","barriodejesusfraccionprimera","barriodelabarranca","barriodelcajon","barriodemexico","barriodenuevoleon","barriodepuentecillas","barriodesanisidro","barriodesanjuan","barriodesanmiguel","barriodesanpedrolacabecera","barriodesanramon","barrioelboncho","barrioelvivero","barriolajoya","barriolateneria","barriolostules","barrionuevo","barrionuevodelosmuertos","barriosandiego","barriosanjoaquineljunco","barriosanmigueldorami","barriosantacruz","barriotlatenco","barron","barry","barryville","barstow","barstow-heights","barstowheights","bartlesville","bartlett","barton","barton-creek","bartoncreek","bartonsville","bartonville","bartow","bartram-village","bartramvillage","barview","bas","basalt","basaseachic","basconcobe","basehor","basi","basile","basin","basin-city","basincity","basking-ridge","baskingridge","bass-lake","bassano","bassett","basslake","bastrop","basuchil","basye","batavia","batchelor","batesburg","batesburg-leesville","batesburgleesville","batesville","bath","bath-beach","bathbeach","bathurst","bathurst-manor","bathurstmanor","baton-rouge","batonrouge","batopilasdemanuelgomezmorin","battery-park-city","batteryparkcity","battle-creek","battle-ground","battle-mountain","battlecreek","battlefield","battleground","battlement-mesa","battlementmesa","battlemountain","baudette","bautista-chico","bautistachico","baviacora","bavispe","bawcomville","baxley","baxter","baxter-estates","baxter-springs","baxterestates","baxtersprings","bay","bay-city","bay-harbor","bay-harbor-islands","bay-hill","bay-minette","bay-park","bay-pines","bay-point","bay-roberts","bay-saint-louis","bay-shore","bay-springs","bay-st-george-south","bay-street-corridor","bay-village","bay-wood","bayard","bayboro","baychester","baycity","bayfield","bayharbor","bayharborislands","bayhill","bayminette","bayonet-point","bayonetpoint","bayonne","bayou-boeuf","bayou-cane","bayou-gauche","bayou-la-batre","bayou-vista","bayouboeuf","bayoucane","bayougauche","bayoulabatre","bayouvista","baypark","baypines","baypoint","bayport","bayroberts","baysaintlouis","bayshore","bayshore-gardens","bayshoregardens","bayside","baysprings","baystgeorgesouth","baystreetcorridor","baytown","bayview","bayview-village","bayview-woods-steeles","bayviewvillage","bayviewwoodssteeles","bayvillage","bayville","baywood","bb","bbc","bbds","bbl","bbn","bc","bcc","bck","bcll","bcn","bcs","bd","bda","bdb","bdbj","bdc","bde","bdf","bdg","bdj","bdk","bdl","bdla","bdlb","bdlm","bdlp","bdm","bdn","bdnl","bdo","bdp","bdr","bds","bdsi","bdsj","bdsm","bdsn","bdsp","bdsr","bdt","bdz","be","beach","beach-city","beach-haven","beach-haven-west","beach-park","beachcity","beachhaven","beachhavenwest","beachpark","beachwood","beacon","beacon-hill","beacon-square","beaconhill","beaconsfield","beaconsquare","beale-air-force-base","bealeairforcebase","bealeton","bean-station","beanstation","bear","bear-creek","bear-rocks","bear-valley-springs","bearcreek","beardstown","bearrocks","bearvalleysprings","beatrice","beatty","beattystown","beattyville","beauceville","beaufort","beauharnois","beaumont","beaupre","beausejour","beaver","beaver-city","beaver-dam","beaver-dam-lake","beaver-falls","beavercity","beavercreek","beaverdale","beaverdam","beaverdam-lake-salisbury-mills","beaverdamlake","beaverdamlakesalisburymills","beaverfalls","beaverlodge","beaverton","beb","becal","becanchen","becancour","beckemeyer","becker","becket","beckett","beckett-ridge","beckettridge","beckley","beddington-heights","beddingtonheights","bedford","bedford-heights","bedford-hills","bedford-park-nortown","bedfordheights","bedfordhills","bedfordparknortown","bedminster","bee-cave","bee-ridge","beebe","beecave","beech-grove","beech-mountain-lakes","beechborough-greenbrook","beechboroughgreenbrook","beecher","beechgrove","beechmountainlakes","beechwood","beechwood-trails","beechwood-village","beechwoodtrails","beechwoodvillage","beeridge","beeville","beggs","behchoko","bejucal-de-ocampo","bejucaldeocampo","bejucos","bel-air","bel-air-north","bel-air-south","bel-nor","bel-ridge","belair","belairnorth","belairsouth","belchertown","belcourt","belding","belem","belen","belen-atzitzimititlan","belen-del-refugio","belenatzitzimititlan","belendelrefugio","belfair","belfast","belfield","belford","belgium","belgrade","belhaven","belington","belisario-dominguez","belisariodominguez","bell","bell-acres","bell-gardens","bell-road-historical","bella-esperanza","bella-vista","bella-vista-del-rio","bellacres","bellaesperanza","bellair-meadowbrook-terrace","bellaire","bellairmeadowbrookterrace","bellas-fuentes","bellasfuentes","bellavista","bellavistadelrio","bellbrook","belle","belle-chasse","belle-fourche","belle-glade","belle-glade-camp","belle-harbor","belle-haven","belle-isle","belle-meade","belle-plaine","belle-rose","belle-vernon","belleair","belleair-beach","belleair-bluffs","belleairbeach","belleairbluffs","bellechasse","bellefontaine","bellefontaine-neighbors","bellefontaineneighbors","bellefonte","bellefourche","belleglade","bellegladecamp","belleharbor","bellehaven","belleisle","bellemeade","belleplaine","bellerose","bellerose-terrace","belleroseterrace","bellevernon","belleview","belleville","bellevue","bellflower","bellgardens","bellingham","bellmawr","bellmead","bellmore","bellows-falls","bellowsfalls","bellport","bellroadhistorical","bells","bells-corners","bellscorners","bellview","bellville","bellwood","belmar","belmond","belmont","belmont-cragin","belmont-estates","belmontcragin","belmontestates","belnor","beloeil","beloit","belpre","belridge","beltline","belton","beltsville","belvedere","belvedere-park","belvederepark","belvidere","belville","belzoni","bement","bemidji","bemis","ben-avon","ben-lomond","benavides","benavon","benbrook","bend","bendale","benemerito-de-las-americas","benemerito-juarez","benemeritodelasamericas","benemeritojuarez","benicia","benito-garcia-el-zorrillo","benito-gonzalez","benito-juarez","benito-juarez-ii-san-martin","benito-juarez-la-playita","benito-juarez-uno","benito-juarez-vinateria","benitogarciaelzorrillo","benitogonzalez","benitojuarez","benitojuareziisanmartin","benitojuarezlaplayita","benitojuarezuno","benitojuarezvinateria","benjamin","benjamin-hill","benjaminhill","benkelman","benld","benlomond","bennett","bennettsville","bennington","bennsville","bensalem","bensenville","bensley","benson","bensonhurst","bent-creek","bentcreek","bentleyville","benton","benton-city","benton-harbor","benton-heights","bentoncity","bentonharbor","bentonheights","bentonville","benwood","berea","beresford","bergen","bergen-beach","bergenbeach","bergenfield","berino","beristain","berkeley","berkeley-heights","berkeley-lake","berkeley-springs","berkeleyheights","berkeleylake","berkeleysprings","berkley","berkshire-heights","berkshireheights","berlin","bermejillo","bermuda-dunes","bermuda-run","bermudadunes","bermudarun","bernal","bernalillo","bernardston","bernardsville","berne","bernhards-bay","bernhardsbay","bernice","bernie","berrien-springs","berriensprings","berriozabal","berry","berry-creek","berrycreek","berryville","berthierville","berthoud","bertram","bertsch-oceanview","bertschoceanview","berwick","berwyn","berwyn-heights","berwynheights","bessemer","bessemer-city","bessemercity","betania","bethalto","bethania","bethany","bethany-beach","bethanybeach","bethel","bethel-acres","bethel-heights","bethel-island","bethel-park","bethelacres","bethelheights","bethelisland","bethelpark","bethesda","bethlehem","bethlehem-village","bethlehemvillage","bethpage","bettendorf","betulia","beulah","beulaville","bev","bevent","beverly","beverly-cove","beverly-hills","beverlycove","beverlyhills","bevil-oaks","beviloaks","bexar","bexley","bf","bfa","bfh","bg","bg2s","bgc","bgez","bh","bhb","bhi","bhs","bhv","bhw","bi","bicknell","biddeford","bienvenido","big-bass-lake","big-bear-city","big-bear-lake","big-beaver","big-bend","big-coppitt-key","big-flats","big-flats-airport","big-lake","big-park","big-pine","big-pine-key","big-rapids","big-river","big-rock","big-sandy","big-sky","big-spring","big-stone-gap","big-timber","bigbasslake","bigbearcity","bigbearlake","bigbeaver","bigbend","bigcoppittkey","bigflats","bigflatsairport","bigfork","biggar","biggs","biglake","biglerville","bigpark","bigpine","bigpinekey","bigrapids","bigriver","bigrock","bigsandy","bigsky","bigspring","bigstonegap","bigtimber","billerica","billings","billington-heights","billingtonheights","biloxi","biltmore-forest","biltmoreforest","binbrook","bingham-farms","binghamfarms","binghamton","biola","birch-bay","birch-run","birchbay","birchcliffe-cliffside","birchcliffecliffside","birchrun","birchwood","birchwood-lakes","birchwoodlakes","birdsboro","birmingham","bisbee","biscayne-park","biscaynepark","biscoe","bishop","bishopville","bismarck","bison","bithlo","bixby","bj","bjlp","bju","bjv","bk","bl","black-canyon-city","black-creek","black-diamond","black-earth","black-forest","black-jack","black-lick","black-mountain","black-point-green-point","black-river","black-river-falls","black-rock","blackcanyoncity","blackcreek","blackdiamond","blackearth","blackfalds","blackfoot","blackforest","blackhawk","blackjack","blacklick","blacklick-estates","blacklickestates","blackmountain","blackpointgreenpoint","blackriver","blackriverfalls","blackrock","blacksburg","blackshear","blackstone","blackville","blackwater","blackwell","blackwood","bladenboro","bladensburg","blades","blaine","blainville","blair","blairsville","blake-jones","blakejones","blakely","blanca-espuma","blancaespuma","blanchard","blanchester","blanco","bland","blanding","blandon","blasdell","blasillo1raseccionnicolasbravo","blauvelt","blawnox","blb","bledos","blennerhassett","bliss-corner","blisscorner","blissfield","blj","blml","bloomer","bloomfield","bloomfield-hills","bloomfieldhills","blooming-prairie","bloomingdale","bloomingprairie","bloomington","bloomsburg","blossburg","blossom","blossvale","blountstown","blountsville","blountville","blowing-rock","blowingrock","blsm","blt","blue-ash","blue-ball","blue-bell","blue-earth","blue-grass","blue-hills","blue-island","blue-lake","blue-mound","blue-point","blue-ridge","blue-springs","blueash","blueball","bluebell","blueearth","bluefield","bluegrass","bluehills","blueisland","bluelake","bluemound","bluepoint","blueridge","bluesprings","bluewater","bluewell","bluff-city","bluffcity","bluffdale","bluffton","blythe","blytheville","blythewood","bm","bmea","bml","bms","bmt","bn","bnd","bo","boalsburg","boardman","boaz","bobashi-de-guadalupe","bobashideguadalupe","boca-del-mar","boca-del-monte","boca-del-rio","boca-pointe","boca-raton","bocadelmar","bocadelmonte","bocadelrio","bocaneo-san-pedro","bocaneosanpedro","bocapointe","bocaraton","bocas","bochil","bochojbo-alto","bochojboalto","bocoyna","bodega-bay","bodegabay","bodfish","boerne","bogalusa","bogart","bogata","bogota","bohemia","bohners-lake","bohnerslake","boiling-spring-lakes","boiling-springs","boilingspringlakes","boilingsprings","bois-des-filion","boisbriand","boisdesfilion","boise","boise-city","boisecity","boissevain","bokeelia","bokoba","boles-acres","bolesacres","boley","bolinas","bolindale","boling","bolingbrook","bolivar","bolivar-peninsula","bolivarpeninsula","bolivia","bolon","bolonchen-de-rejon","bolonchenderejon","bolton","bomanxotha","bomintzha","bon-accord","bon-air","bon-aqua-junction","bonaccord","bonadelleranchosmaderaranchos","bonair","bonanza","bonaquajunction","bonaventure","bonavista","bondojito","bondsville","bonduel","bondurant","bonham","bonifacio-garcia","bonifacio-moreno-el-aguaje","bonifaciogarcia","bonifaciomorenoelaguaje","bonifay","bonita","bonita-springs","bonitasprings","bonne-terre","bonneau-beach","bonneaubeach","bonneauville","bonner-springs","bonner-west-riverside","bonners-ferry","bonnersferry","bonnersprings","bonnerwestriverside","bonneterre","bonney-lake","bonneylake","bonny-doon","bonnydoon","bonnyville","bono","bonsall","booker","boone","booneville","boonsboro","boonton","boonville","boothbay","boothbay-harbor","boothbayharbor","boothwyn","boquiapa","boquilla-de-las-perlas","boquilladelasperlas","boquillas","bordentown","bordo-blanco","bordoblanco","borger","boron","boronda","borough","borough-park","boroughpark","borrego-springs","borregosprings","boscawen","boscobel","boshindo","bosque-de-saloya","bosque-farms","bosquedesaloya","bosquefarms","bosques-de-la-magdalena","bosques-de-san-pedro","bosquesdelamagdalena","bosquesdesanpedro","bossier-city","bossiercity","boston","boston-heights","boston-seaport","bostonheights","bostonia","bostonseaport","boswell","boswells-corner","boswellscorner","both","bothell","bothell-east","bothell-west","bothelleast","bothellwest","botkins","bottineau","botwood","boucherville","bouctouche","boulder","boulder-city","boulder-creek","boulder-hill","bouldercity","bouldercreek","boulderhill","boulevard-gardens","boulevard-park","boulevardgardens","boulevardpark","bound-brook","boundbrook","bountiful","bourbon","bourbonnais","bourg","bourget","bourne","boutte","bovina","bow-bog","bow-island","bowbells","bowbog","bowdon","bowen-island","bowenisland","bowie","bowisland","bowleys-quarters","bowleysquarters","bowling-green","bowlinggreen","bowman","bowmansville","bowness","box-elder","boxasni","boxborough","boxelder","boxford","boyceville","boyd","boydton","boye","boyertown","boyes-hot-springs","boyeshotsprings","boyette","boyle-heights","boyleheights","boylston","boyne-city","boynecity","boynton-beach","boyntonbeach","bozeman","bp","bpc","bpgp","bpk","bpn","bq","br","bracebridge","bracey","brackenridge","brackettville","bradbury","braddock","braddock-heights","braddock-hills","braddockheights","braddockhills","bradenton","bradenton-beach","bradentonbeach","bradford","bradford-woods","bradfordwoods","bradley","bradley-beach","bradley-gardens","bradleybeach","bradleygardens","bradner","brady","braeside","braham","braidwood","brainerd","braintree","brambleton","brampton","branch","branchport","brandenburg","brandermill","brandon","brandywine","branford","branford-center","branfordcenter","branson","brant","brantford","braselton","brass-castle","brasscastle","bratenahl","brattleboro","bravo","brawley","bray","brazil","brazoria","brazos","brea","breakeyville","breaux-bridge","breauxbridge","breckenridge","breckenridge-hills","breckenridgehills","breckinridge-center","breckinridgecenter","brecksville","breese","breezy-point","breezypoint","breinigsville","bremen","bremerton","brenham","brent","brentwood","brentwood-estates","brentwoodestates","brer","bressler","bret-harte","bretharte","brevard","brewer","brewerton","brewerytown","brewster","brewster-hill","brewsterhill","brewton","brf","brh","briar","briar-hill-belgravia","briarcliff","briarcliff-manor","briarcliffmanor","briarhillbelgravia","briarwood","brice-prairie","briceprairie","brices-creek","bricescreek","brickerville","bridesburg","bridge-city","bridgecity","bridgehampton","bridgeport","bridgeton","bridgetown","bridgeview","bridgeville","bridgewater","bridgman","bridgton","bridlepathsunnybrookyorkmills","bridlewood","bridport","brielle","brier","brigantine","brigham-city","brighamcity","bright","brighton","brighton-beach","brighton-park","brightonbeach","brightonpark","brightwaters","brightwood","brilliant","brillion","brimfield","brinckerhoff","brinkley","brisas-barra-de-suchiate","brisas-de-zicatela","brisas-del-carrizal","brisasbarradesuchiate","brisasdelcarrizal","brisasdezicatela","brisbane","brisenas-de-matamoros","brisenasdematamoros","bristol","bristow","british-columbia","britishcolumbia","britt","brittany-farms-highlands","brittanyfarmshighlands","britton","brme","brmr","broad-channel","broad-creek","broad-ripple","broadalbin","broadchannel","broadcreek","broadlands","broadmoor","broadripple","broadus","broadview","broadview-heights","broadview-north","broadview-park","broadviewheights","broadviewnorth","broadviewpark","broadway","brock-hall","brockhall","brockport","brockton","brockville","brockway","brocton","brodhead","brodheadsville","brogden","broken-arrow","broken-bow","brokenarrow","brokenbow","bromont","bronson","bronx","bronxville","brook-farm","brook-highland","brook-park","brookdale","brookfarm","brookfield","brookfield-center","brookfieldcenter","brookhaven","brookhaven-amesbury","brookhavenamesbury","brookhighland","brookings","brookland","brooklawn","brooklet","brookline","brooklyn","brooklyn-center","brooklyn-heights","brooklyn-park","brooklyncenter","brooklynheights","brooklynpark","brookmont","brookneal","brookpark","brookridge","brooks","brookshire","brookside","brookside-village","brooksidevillage","brookston","brooksville","brooktrails","brookville","brookwood","broomall","broomfield","brossard","brothertown","broussard","broward","broward-estates","browardestates","brown-city","brown-deer","browncity","browndeer","brownfield","browning","brownlee-park","brownleepark","browns-lake","browns-mills","browns-point","brownsboro","brownsburg","brownsburg-chatham","brownsburgchatham","brownsfield","brownslake","brownsmills","brownspoint","brownstown","brownsville","browntown","brownville","brownwood","broxton","bruce","bruceton","bruceville-eddy","brucevilleeddy","brundidge","brunswick","brush","brush-fork","brush-prairie","brushfork","brushprairie","brushy-creek","brushycreek","brusly","brussels","bryan","bryans-road","bryansroad","bryant","bryn-athyn","bryn-mawr","bryn-mawr-skyway","brynathyn","brynmawr","brynmawrskyway","bryson-city","brysoncity","bs","bsa","bsc","bsd","bsg","bsgs","bsl","bsm","bsmd","bsp","bt","btb","buaysiacobe","buayums","bucerias","buchanan","buchanan-dam","buchanandam","buckeye","buckeye-lake","buckeyelake","buckeystown","buckfield","buckhall","buckhannon","buckhead-ridge","buckheadridge","buckhorn","buckingham","buckland","buckley","buckner","bucksport","buctzotz","bucyrus","buda","budd-lake","buddlake","bude","buechel","buellton","buen-retiro-el-retiro","buena","buena-park","buena-vista","buena-vista-1ra-seccion","buena-vista-apasco","buena-vista-de-la-salud","buena-vista-puxcatan","buenapark","buenaventura","buenaventura-lakes","buenaventuralakes","buenavista","buenavista-de-allende","buenavista-de-benito-juarez","buenavista-de-cortes","buenavista-de-cuellar","buenavista-de-juarez","buenavista-de-trujillo","buenavista-matasanos","buenavista-tetela","buenavista-tomatlan","buenavista1raseccion","buenavistaapasco","buenavistadeallende","buenavistadebenitojuarez","buenavistadecortes","buenavistadecuellar","buenavistadejuarez","buenavistadelasalud","buenavistadetrujillo","buenavistamatasanos","buenavistapuxcatan","buenavistatetela","buenavistatomatlan","buenos-aires","buenos-aires-san-isidro","buenosaires","buenosairessanisidro","buenretiroelretiro","buffalo","buffalo-grove","buffalo-historical","buffalogrove","buffalohistorical","buford","buhl","buhler","buies-creek","buiescreek","bull-run","bull-run-mountain-estates","bull-shoals","bull-valley","bullard","bullhead-city","bullheadcity","bullrun","bullrunmountainestates","bullshoals","bullvalley","bulverde","buna","bunche-park","bunchepark","bunk-foss","bunker-hill","bunker-hill-village","bunkerhill","bunkerhillvillage","bunkerville","bunkfoss","bunkie","bunnell","burbank","burford","burgaw","burgeo","burgettstown","burgos","burien","burkburnett","burke","burkesville","burleson","burley","burlingame","burlington","burnaby","burnet","burnettown","burney","burnham","burns","burns-flat","burns-harbor","burns-lake","burnsflat","burnsharbor","burnslake","burnsville","burnt-store-marina","burntstoremarina","burr-ridge","burrridge","burt","burton","burtonsville","burwell","bushland","bushnell","bushwick","bushyhead","bustamante","bustleton","butchers-hill","butchershill","butler","butler-beach","butlerbeach","butner","butte","buttonwillow","buxton","buzzards-bay","buzzardsbay","bv","bv1s","bva","bvdr","bvp","bvs","bvvv","bw","bwr","bws","byers","byesville","byhalia","bylas","byng","bynum","byram","byrdstown","byrnes-mill","byrnesmill","byron","byron-center","byroncenter","bystrom","c0","c1dm","c1ea","c1s","c1sj","c1sm","c2df","c2ds","c2s","c3dm","c41licenciadocarlosamadrazo","c5df","ca","caa","caao","cabano","cabazon","cabbagetown-south-stjames-town","cabbagetownsouthstjamestown","cabecera-de-indigenas","cabeceradeindigenas","cabeza-de-toro","cabezadetoro","cabezas","cabin-john","cabinjohn","cabo-san-lucas","cabool","cabosanlucas","cabot","cac","cacahoatan","cacahuatal","cacalchen","cacalomacan","cacalotan","cacalotenango","cacaloxuchitl","cacalutla","cacao","cacate","cache","cache-creek","cachecreek","cacm","cacouna","cactus","cactus-flat","cactusflat","caddo","caddo-mills","caddomills","cade","cadereyta","cadereyta-jimenez","cadereytajimenez","cadillac","cadiz","cadott","cafb","cag","cahaba-heights","cahabaheights","cahokia","cahuatache","caimanero","cairo","caja-de-agua","cajadeagua","cajahs-mountain","cajahsmountain","cajelitos","cajititlan","cajonos","cala-norte","cala-sur","calabasas","calabash","calais","calamanda","calanorte","calasur","calaveras","calcahualco","calcehtok","calcium","calcutta","calderitas","caldwell","caledon","caledonia","caledonia-fairbank","caledoniafairbank","calera","calera-chica","calerachica","caleras","caleras-de-ameche","calerasdeameche","caleria","calexico","calgary","calhoun","calhoun-city","calhoun-falls","calhouncity","calhounfalls","calichar-palma-sola","calicharpalmasola","calico-rock","calicorock","calido","caliente","califon","california","california-city","californiacity","calihuala","calimaya","calimesa","calipan","calipatria","calistoga","calixtlahuaca","calkini","callahan","callaway","calle-real","callender","callereal","calm","calmar","calmeca","caln","calnali","calotmul","calpaneria-atezquilla","calpaneriaatezquilla","calpulalpan","calt","caltimacan","caltzontzin","calumet","calumet-city","calumet-park","calumetcity","calumetpark","calvario-buenavista","calvario-del-carmen","calvariobuenavista","calvariodelcarmen","calvert","calvert-city","calvertcity","calverton","calverton-park","calvertonpark","calvillo","calzada-del-tepozan","calzada-larga","calzadadeltepozan","calzadalarga","calzadas","cam","camalotita","camalu","camanche","camano","camargo","camarillo","camaron-de-tejeda","camarondetejeda","camas","cambria","cambria-heights","cambriaheights","cambrian-heights","cambrian-park","cambrianheights","cambrianpark","cambridge","cambridge-bay","cambridge-city","cambridge-springs","cambridgebay","cambridgecity","cambridgeport","cambridgesprings","camden","camdenton","camelia-barrio-la-camelia","camelia-roja","cameliabarriolacamelia","cameliaroja","camembaro","cameron","cameron-park","cameron-park-colonia","cameronpark","cameronparkcolonia","camichin-de-jauja","camichindejauja","camilla","camillus","camino","camlachie","camocuautla","camotepec","camotinchan","camotlan-de-miraflores","camotlandemiraflores","camp","camp-hill","camp-hm-smith","camp-lake","camp-meeker","camp-pendleton-north","camp-pendleton-south","camp-point","camp-springs","camp-swift","camp-verde","campanario","campbell","campbell-river","campbellriver","campbellsport","campbellsville","campbellton","campbelltown","campeche","campestre-flamboyanes","campestre-tarimbaro","campestre-villas-del-alamo","campestreflamboyanes","campestretarimbaro","campestrevillasdelalamo","camphill","camphmsmith","campion","camplake","campmeeker","campo","campo-acosta","campo-balbuena","campo-carretero","campo-chico","campo-de-aguila","campo-grande","campo-la-arrocera","campo-pesquero-el-colorado","campo-real","campoacosta","campobalbuena","campocarretero","campochico","campodeaguila","campogrande","campolaarrocera","campopesqueroelcolorado","camporeal","camppendletonnorth","camppendletonsouth","camppoint","campsprings","campswift","campti","campton","campverde","camrose","cana","canaan","canada","canada-de-bustos","canada-de-caracheo","canada-de-cisneros","canada-de-guadarrama","canada-de-madero","canada-de-negros","canada-de-ramirez","canada-del-tabaco","canadadebustos","canadadecaracheo","canadadecisneros","canadadeguadarrama","canadadeltabaco","canadademadero","canadadenegros","canadaderamirez","canadas-de-obregon","canadasdeobregon","canadensis","canadian","canadian-lakes","canadianlakes","canajoharie","canal-fulton","canal-winchester","canalejas","canalfulton","canalwinchester","canandaigua","cananea","canarsie","canas","canastota","canatlan","canby","cancuc","cancun","candela","candelaria","candelaria-loxicha","candelaria-portezuelo","candelarialoxicha","candelariaportezuelo","candia","candiac","candler-mcafee","candlermcafee","cando","cane-savannah","canelas","canesavannah","caney","canfield","canisteo","canitas-de-felipe-pescador","canitasdefelipepescador","canmore","cannelton","cannon-air-force-base","cannon-beach","cannon-falls","cannonairforcebase","cannonbeach","cannonfalls","canoga-park","canogapark","canon-city","canoncity","canonsburg","canora","cansahcab","cantabria","cantamayec","cantera-de-villagran","canteradevillagran","canterbury","canterwood","cantinela","cantioc","cantley","canton","canton-las-delicias","canton-rancho-nuevo","canton-valley","canton-villaflor","cantonlasdelicias","cantonment","cantonranchonuevo","cantonvalley","cantonvillaflor","cantuna","canutillo","canyon","canyon-city","canyon-country","canyon-day","canyon-lake","canyon-meadows","canyon-rim","canyoncity","canyoncountry","canyonday","canyonlake","canyonmeadows","canyonrim","canyonville","cao","caobanal-1ra-seccion-mezcalapa","caobanal1raseccionmezcalapa","caobas","cap-chat","cap-sante","capac","capacho","capacuaro","caparroso","capchat","cape-canaveral","cape-carteret","cape-charles","cape-coral","cape-dorset","cape-girardeau","cape-may","cape-may-court-house","cape-neddick","cape-saint-claire","capecanaveral","capecarteret","capecharles","capecoral","capedorset","capegirardeau","capemay","capemaycourthouse","capeneddick","capesaintclaire","capilla-de-guadalupe","capilla-de-milpillas","capilladeguadalupe","capillademilpillas","capitan","capitol-heights","capitol-hill","capitola","capitolheights","capitolhill","capoluca","capreol","capron","capsante","captain-cook","captaincook","captains-cove","captainscove","capula","capulhuac-de-mirafuentes","capulhuacdemirafuentes","capulin","capulin-de-bustos","capulindebustos","caracuaro","carapan","caraway","carberry","carbo","carbon-cliff","carbon-hill","carboncliff","carbondale","carbonear","carbonera","carboneras","carbonhill","carbonville","cardenas","cardington","cardonal","cardston","carefree","carencro","carey","caribou","carichi","carignan","caristay","carl-junction","carle-place","carleplace","carleton","carleton-place","carleton-sur-mer","carletonplace","carletonsurmer","carlin","carlinville","carlisle","carlisle-rockledge","carlislerockledge","carljunction","carlos-a-carrillo","carlos-a-madrazo","carlosacarrillo","carlosamadrazo","carlsbad","carlstadt","carlton","carlyle","carlyss","carman","carmel","carmel-by-the-sea","carmel-hamlet","carmel-valley-village","carmelbythesea","carmelhamlet","carmelvalleyvillage","carmen","carmen-serdan","carmen-yalchuch","carmen-zacatal","carmenserdan","carmenyalchuch","carmenzacatal","carmi","carmichael","carnation","carnegie","carnesville","carney","carneys-point","carneyspoint","carnot-moon","carnotmoon","carnuel","caro","carol-city","carol-stream","carolcity","carolina-beach","carolina-shores","carolinabeach","carolinashores","carolstream","carona","carpenter","carpentersville","carpinteria","carpinteros","carrabelle","carranco","carrboro","carriage-club","carriageclub","carricitos","carrier-mills","carriere","carriermills","carrillo","carrillo-puerto","carrillopuerto","carrington","carrizal","carrizal-grande","carrizalgrande","carrizalillo","carrizo-springs","carrizosprings","carrizozo","carroll","carroll-park","carroll-valley","carrollpark","carrollton","carrollvalley","carrollwood","carrollwood-village","carrollwoodvillage","carson","carson-city","carsoncity","carstairs","cartagena-fraccionamiento","cartagenafraccionamiento","carter-lake","carteret","carterlake","cartersville","carterville","carthage","caruthers","caruthersville","carver","carver-ranches","carverranches","carville","cary","caryville","cas","casa","casa-blanca","casa-conejo","casa-de-cerros","casa-de-oro-mount-helix","casa-grande","casa-loma","casa-nueva","casablanca","casaconejo","casadecerros","casadeoromounthelix","casagrande","casahuatlan","casaloma","casanueva","casas","casas-adobes","casas-grandes","casas-viejas","casasadobes","casasgrandes","casasviejas","cascade","cascade-chipita-park","cascade-locks","cascade-valley","cascadechipitapark","cascadelocks","cascadevalley","caserio-de-cortes","caseriodecortes","casey","caseyville","casg","cash","cashmere","cashton","casitas","casper","cass-city","casscity","casselberry","casselman","casselton","cassopolis","cassville","castaic","castamay","castanea","castanos","castillo-de-teayo","castillodeteayo","castine","castle-dale","castle-hayne","castle-hills","castle-pines","castle-pines-north","castle-point","castle-rock","castle-shannon","castledale","castlegar","castlehayne","castlehills","castlepines","castlepinesnorth","castlepoint","castleridge","castlerock","castleshannon","castleton","castleton-on-hudson","castletononhudson","castlewood","castro-urdiales","castro-valley","castrourdiales","castrovalley","castroville","catahoula","catalina","catalina-foothills","catalinafoothills","catarino-rodriguez","catarinorodriguez","catasauqua","catawba","catawissa","catazaja","catemaco","cathcart","cathedral-city","cathedralcity","cathlamet","catishtic","catlettsburg","catlin","cato","catonsville","catoosa","catskill","caucel","caurio-de-guadalupe","cauriodeguadalupe","cavalier","cave-city","cave-creek","cave-junction","cave-spring","cave-springs","cavecity","cavecreek","cavejunction","cavespring","cavesprings","cavetown","caxapa","caxhuacan","caxitepec","caxuxi","cayaco","cayce","cayucos","cayuga","cayuga-heights","cayugaheights","cazenovia","cazones-de-herrera","cazonesdeherrera","cb","cbd","cbj","cblc","cbs","cbts","cc","cc3","ccc","ccdc","ccdo","cce","cch","ccp","ccv","cd","cda","cdb","cdba","cdbh","cdbj","cdc","cdd","cdf","cdfp","cdg","cdgb","cdh","cdi","cdj","cdke","cdl","cdlc","cdle","cdlj","cdll","cdlm","cdlp","cdls","cdm","cdmx","cdn","cdo","cdp","cdr","cdrs","cds","cdsf","cdsp","cdt","cdv","cdvp","cdz","ce","cebadilla-1ra-seccion","cebadilla1raseccion","ceballos","cec","cecil-bishop","cecilbishop","cecilia","cecilio-teran","cecilioteran","cedar","cedar-bluff","cedar-city","cedar-falls","cedar-glen-lakes","cedar-glen-west","cedar-grove","cedar-hill","cedar-hills","cedar-knolls","cedar-lake","cedar-mill","cedar-park","cedar-point","cedar-rapids","cedar-ridge","cedar-springs","cedarbluff","cedarbrae","cedarbrook","cedarburg","cedarcity","cedaredge","cedarfalls","cedarglenlakes","cedarglenwest","cedargrove","cedarhill","cedarhills","cedarhurst","cedarknolls","cedarlake","cedarmill","cedarpark","cedarpoint","cedarrapids","cedarridge","cedarsprings","cedartown","cedarville","cedral","cedro-de-la-manzana","cedrodelamanzana","cedros","cef","cefereso-numero-3","ceferesonumero3","ceg","ceiba-1ra-seccion-jahuactal","ceiba1raseccionjahuactal","ceja-de-bravo","cejadebravo","celaya","celayita","celebration","celestun","celina","celoron","cem","cementeras-del-pital","cementerasdelpital","cementon","cenobio-aguilar-la-trinidad","cenobio-moreno","cenobioaguilarlatrinidad","cenobiomoreno","cenotillo","centennial","centennial-park","centennial-scarborough","centennialpark","centennialscarborough","center","center-city","center-harbor","center-hill","center-line","center-moriches","center-point","centerburg","centercity","centereach","centerfield","centerharbor","centerhill","centerline","centermoriches","centerpoint","centerport","centerton","centerville","central","central-business-district","central-city","central-falls","central-garage","central-gardens","central-heights-midland-city","central-high","central-islip","central-park","central-point","central-square","central-valley","central-valley-historical","central-waterford","centralbusinessdistrict","centralcity","centralfalls","centralgarage","centralgardens","centralheightsmidlandcity","centralhigh","centralia","centralislip","centralpark","centralpoint","centralsquare","centralvalley","centralvalleyhistorical","centralwaterford","centre","centre-hall","centrehall","centreville","centro-de-arriba","centro-de-readaptacion-social","centro-familiar-la-soledad","centrodearriba","centrodereadaptacionsocial","centrofamiliarlasoledad","century","century-city","centurycity","cep","cepeda","cer","cerano","ceredo","ceres","cereso-14-el-amate","cereso-del-hongo","cereso-nuevo","cereso14elamate","ceresodelhongo","ceresonuevo","cerocahui","cerrillos-campo-35","cerrilloscampo35","cerrito-de-gasca","cerrito-de-jaral","cerrito-de-la-cruz","cerrito-de-zavala","cerritodegasca","cerritodejaral","cerritodelacruz","cerritodezavala","cerritos","cerritos-de-cardenas","cerritos-del-pilar","cerritosdecardenas","cerritosdelpilar","cerro-agudo","cerro-armadillo-grande","cerro-azul","cerro-colorado","cerro-colorado-de-ocampo","cerro-de-la-cruz","cerro-de-ortega","cerro-de-piedra","cerro-de-san-francisco","cerro-de-san-pedro","cerro-del-aire","cerro-del-murcielago","cerro-gordo","cerro-grande","cerro-guzman","cerro-la-calera","cerro-las-iguanas","cerro-quemado","cerro-santa-fe","cerroagudo","cerroarmadillogrande","cerroazul","cerrocolorado","cerrocoloradodeocampo","cerrodelacruz","cerrodelaire","cerrodelmurcielago","cerrodeortega","cerrodepiedra","cerrodesanfrancisco","cerrodesanpedro","cerrogordo","cerrogrande","cerroguzman","cerrolacalera","cerrolasiguanas","cerroquemado","cerrosantafe","ces","cesar-chavez","cesarchavez","cet","cetronia","ceuta","cez","cf","cfa","cfep","cfgs","cfjm","cflp","cfls","cg","cgbp","cgc","cgdo","cge","cgl","cgm","cgt","cgv","cgw","ch","chable","chablekal","chacala","chacalapa","chacaljocom","chacaltianguis","chachahuantla","chackbay","chacoma","chacsinkin","chadbourn","chadron","chadwicks","chaffee","chagrin-falls","chagrinfalls","chahuite","chahuites","chalahuiyapa","chalam","chalcatzingo","chalchihuapan","chalchihuitan","chalchihuites","chalchocoyo","chalco","chalfont","chalkville","challenge-brownsville","challengebrownsville","challis","chalma","chalmette","chalmita","chama","chamacuaro","chamberlain","chamberlayne","chambersburg","chamblee","chambly","chambord","chametla","champaign","champion-heights","championheights","champlain","champlin","champoton","chamula","chamulapita","chan-cenote","chanal","chancenote","chandler","changata","chanhassen","channahon","channel-islands-beach","channel-lake","channel-port-aux-basques","channelislandsbeach","channellake","channelportauxbasques","channelview","channing","chantilly","chanute","chapa","chapa-de-mota","chapab","chapademota","chapais","chapala","chapalilla","chapallal-grande","chapallalgrande","chapantongo","chaparaco","chaparral","chaparrosa","chapel-hill","chapelhill","chapin","chapman","chapmanville","chapopote-chico","chapopote-nunez","chapopotechico","chapopotenunez","chappaqua","chappell","chapulco","chapulhuacan","chapulhuacanito","chapultenango","chapultepec","charapan","charapendo","charay","charcas","charco-blanco","charco-de-pantoja","charcoblanco","charcodepantoja","chardon","charenton","chariton","charlack","charlemagne","charlemont","charleroi","charles-city","charles-town","charles-village","charlescity","charleston","charlestown","charlesvillage","charleswood","charlevoix","charlotte","charlotte-court-house","charlotte-hall","charlotte-harbor","charlotte-park","charlottecourthouse","charlottehall","charlotteharbor","charlottepark","charlottesville","charlottetown","charlton","charo","charter-oak","charteroak","chase","chase-city","chasecity","chaska","chateau-richer","chateauguay","chateauricher","chatfield","chatham","chatipan","chatmoss","chatom","chatsworth","chattahoochee","chattahoochee-hills","chattahoocheehills","chattanooga","chattanooga-valley","chattanoogavalley","chaucingo","chauncey","chautla","chauvin","chavarria","chavarrillo","chavaxtla","chavinda","cheat-lake","cheatlake","chebanse","cheboygan","checotah","cheektowaga","chehalis","chelan","chelem","chelmsford","chelsea","cheltenham","chemainus","chemax","chenalho","chenango-bridge","chenangobridge","cheney","chenoa","chenoweth","chepachet","cheran","cheran-atzicuirin-cheranastico","cheranatzicuirincheranastico","cheraw","cherokee","cherokee-village","cherokeevillage","cherry-creek","cherry-grove","cherry-hill","cherry-hill-mall","cherry-hills-village","cherry-valley","cherrycreek","cherryfield","cherrygrove","cherryhill","cherryhillmall","cherryhillsvillage","cherryland","cherryvale","cherryvalley","cherryville","chertsey","ches","chesaning","chesapeake","chesapeake-beach","chesapeake-ranch-estates","chesapeakebeach","chesapeakeranchestates","cheshire","cheshire-village","cheshirevillage","chesilhurst","chester","chester-center","chester-heights","chester-springs","chesterbrook","chestercenter","chesterfield","chesterfield-court-house","chesterfieldcourthouse","chesterheights","chesterland","chestermere","chestersprings","chesterton","chestertown","chesterville","chestnut-hill","chestnut-ridge","chestnuthill","chestnutridge","cheswick","cheswold","chet","chetek","chetopa","chetumal","chetwynd","chevak","cheval","cheverly","cheviot","chevy-chase","chevy-chase-heights","chevy-chase-village","chevychase","chevychaseheights","chevychasevillage","chewelah","cheyenne","cheyenne-wells","cheyennewells","chh","chiapa-de-corzo","chiapadecorzo","chiapas","chiapilla","chiaucingo","chiautla","chiautla-de-tapia","chiautladetapia","chibougamau","chicago","chicago-heights","chicago-lawn","chicago-loop","chicago-ridge","chicagoheights","chicagolawn","chicagoloop","chicagoridge","chicahua","chicahuaxtla","chicapa-de-castro","chicapadecastro","chicavasco","chicbul","chichatla","chichen-itza","chichenitza","chichester","chichicapa","chichicastle-1ra-seccion","chichicastle1raseccion","chichicaxtle","chichicuautla","chichihualco","chichimequillas","chichimila","chichiquila","chickamauga","chickasaw","chickasha","chico","chicoasen","chicola","chicoloapan","chicomuselo","chiconamel","chiconcuac","chiconcuautla","chiconquiaco","chicontepec","chicontla","chicopee","chicora","chicualoque","chicuasen","chicumtantic","chicxulub-pueblo","chicxulub-puerto","chicxulubpueblo","chicxulubpuerto","chiefland","chiepetepec","chietla","chigmecatitlan","chignahuapan","chihuahua","chihuahuita","chikindzonot","chila","chila-de-juarez","chila-de-la-sal","chilacachapa","chiladejuarez","chiladelasal","chilapa","chilapa-de-alvarez","chilapadealvarez","chilchota","chilcuautla","childersburg","childress","chilhowie","chililico","chillicothe","chilliwack","chillum","chilolja","chilon","chilpancingo","chiltepec-de-hidalgo","chiltepecdehidalgo","chilton","chiltoyac","chimalapa","chimalpa-viejo","chimalpa-y-tlalayote","chimalpaviejo","chimalpaytlalayote","chimaltitan","chimayo","chimhucum","china","china-grove","china-lake-acres","chinagrove","chinalakeacres","chinameca","chinampa-de-gorostiza","chinampadegorostiza","chinampas","chinantla","chinatown","chinautla","chinchilla","chincoteague","chinipas","chinle","chino","chino-hills","chino-valley","chinobampo","chinohills","chinook","chinook-park","chinookpark","chinovalley","chipahuatlan","chipilodefranciscojaviermina","chipley","chippewa-falls","chippewafalls","chiquihuitlan-de-benito-juarez","chiquihuitlandebenitojuarez","chiquila","chiquilistlan","chiquimitio","chiquinival","chiquinshulum","chirimoya-estacion-chirimoya","chirimoyaestacionchirimoya","chisago-city","chisagocity","chisholm","chiteje-de-garabato","chitejedegarabato","chittenango","chittenden","chixtontic","chm","chmc","chocaman","choccolocco","chochola","choctaw","choctaw-lake","choctawlake","choix","cholul","cholul-canton","cholula","cholulcanton","chonegal","chontalcoatlan","chontalpa","chontla","chosto-de-los-jarros","chostodelosjarros","choteau","chouteau","chowchilla","chp","chrisman","christiana","christiansburg","christmas","christopher","chs","chualar","chubbuck","chuburna","chucandiro","chucarit","chuckey","chula-vista","chulavista","chulum-cardenas","chulum-juarez","chulumcardenas","chulumjuarez","chuluota","chumatlan","chumayel","chunchintok","chunchucmil","chunhuhub","chuniapan-de-arriba","chuniapandearriba","chupaderos","chupio","church-hill","church-point","church-rock","church-yonge-corridor","churchhill","churchill","churchpoint","churchrock","churchville","churchyongecorridor","churintzio","churipitzeo","churubusco","churumuco-de-morelos","churumucodemorelos","chute-aux-outardes","chuteauxoutardes","chv","ci","cia","cib","cibecue","cibolo","cicacalco","cicero","cid","cienega-de-flores","cienega-de-zimatlan","cienega-grande","cienega-springs","cienegadeflores","cienegadezimatlan","cienegagrande","cienegas-terrace","cienegasprings","cienegasterrace","cieneguilla","cieneguillas","cieneguitas","cif","cihuatlan","cimarron","cimarron-hills","cimarronhills","cincinnati","cincinnatus","cinco-de-febrero","cinco-de-mayo","cinco-ranch","cincodefebrero","cincodemayo","cincoranch","cinnaminson","cintalapa","cintalapa-de-figueroa","cintalapadefigueroa","cipreses","circle","circle-d-kc-estates","circle-pines","circledkcestates","circlepines","circleville","cisco","citala","citilcum","citlaltepec","citra","citronelle","citrus","citrus-city","citrus-heights","citrus-hills","citrus-park","citrus-ridge","citrus-springs","citruscity","citrusheights","citrushills","citruspark","citrusridge","citrussprings","city-island","city-of-milford-balance","city-of-sammamish","city-view","cityisland","cityofmilfordbalance","cityofsammamish","cityview","ciudad-acuna","ciudad-altamirano","ciudad-apodaca","ciudad-ayala","ciudad-benito-juarez","ciudad-camargo","ciudad-cerralvo","ciudad-chemuyil","ciudad-constitucion","ciudad-cuauhtemoc","ciudad-de-allende","ciudad-de-armeria","ciudad-de-atlixco","ciudad-de-chiautla-de-tapia","ciudad-de-cuetzalan","ciudad-de-huajuapan-de-leon","ciudad-de-huitzuco","ciudad-de-mexico","ciudad-de-nanacamilpa","ciudad-de-tlatlauquitepec","ciudad-de-villa-de-alvarez","ciudad-de-villaldama","ciudad-del-carmen","ciudad-del-maiz","ciudad-delicias","ciudad-fernandez","ciudad-general-escobedo","ciudad-general-teran","ciudad-guadalupe-victoria","ciudad-gustavo-diaz-ordaz","ciudad-guzman","ciudad-guzman-cereso","ciudad-hidalgo","ciudad-insurgentes","ciudad-juarez","ciudad-lazaro-cardenas","ciudad-lerdo","ciudad-lopez-mateos","ciudad-madero","ciudad-mante","ciudad-manuel-doblado","ciudad-melchor-muzquiz","ciudad-mendoza","ciudad-miguel-aleman","ciudad-morelos","ciudad-nezahualcoyotl","ciudad-obregon","ciudad-pemex","ciudad-rio-bravo","ciudad-sabinas-hidalgo","ciudad-sahagun","ciudad-satelite","ciudad-satelite-del-norte","ciudad-serdan","ciudad-tula","ciudad-valles","ciudad-victoria","ciudadacuna","ciudadaltamirano","ciudadapodaca","ciudadayala","ciudadbenitojuarez","ciudadcamargo","ciudadcerralvo","ciudadchemuyil","ciudadconstitucion","ciudadcuauhtemoc","ciudaddeallende","ciudaddearmeria","ciudaddeatlixco","ciudaddechiautladetapia","ciudaddecuetzalan","ciudaddehuajuapandeleon","ciudaddehuitzuco","ciudaddelcarmen","ciudaddelicias","ciudaddelmaiz","ciudaddemexico","ciudaddenanacamilpa","ciudaddetlatlauquitepec","ciudaddevilladealvarez","ciudaddevillaldama","ciudadfernandez","ciudadgeneralescobedo","ciudadgeneralteran","ciudadguadalupevictoria","ciudadgustavodiazordaz","ciudadguzman","ciudadguzmancereso","ciudadhidalgo","ciudadinsurgentes","ciudadjuarez","ciudadlazarocardenas","ciudadlerdo","ciudadlopezmateos","ciudadmadero","ciudadmante","ciudadmanueldoblado","ciudadmelchormuzquiz","ciudadmendoza","ciudadmiguelaleman","ciudadmorelos","ciudadnezahualcoyotl","ciudadobregon","ciudadpemex","ciudadriobravo","ciudadsabinashidalgo","ciudadsahagun","ciudadsatelite","ciudadsatelitedelnorte","ciudadserdan","ciudadtula","ciudadvalles","ciudadvictoria","cj","cjmm","ck","cl","cl1","cla","clackamas","claiborne","clairlea-birchmount","clairleabirchmount","clairton","clancy","clanton","clanton-park","clantonpark","clara-city","claracity","clarcona","clare","claremont","claremore","clarence","clarence-center","clarence-rockland","clarencecenter","clarencerockland","clarendon","clarendon-hills","clarendonhills","clarenville-shoal-harbour","clarenvilleshoalharbour","claresholm","clarinda","clarion","clark","clark-fulton","clark-mills","clarkdale","clarkesville","clarkfulton","clarkmills","clarks","clarks-green","clarks-summit","clarksburg","clarksdale","clarksgreen","clarkson","clarkson-valley","clarksonvalley","clarkssummit","clarkston","clarkston-heights-vineland","clarkstonheightsvineland","clarksville","clarkton","claryville","clatskanie","claude","clawson","claxton","clay","clay-center","clay-city","claycenter","claycity","claycomo","claymont","claypool","claypool-hill","claypoolhill","claysburg","clayton","clc","cld","cle","cle-elum","clear-lake","clear-lake-riviera","clear-lake-shores","clearbrook-park","clearbrookpark","clearfield","clearlake","clearlake-oaks","clearlakeoaks","clearlakeriviera","clearlakeshores","clearview","clearwater","cleary","cleburne","cleelum","clementon","clemmons","clemson","clendenin","cleona","cleora","clermont","cleveland","cleveland-heights","clevelandheights","clever","cleves","clewiston","clf","cli","cliffcrest","cliffside-park","cliffsidepark","cliffwood-beach","cliffwoodbeach","clifton","clifton-forge","clifton-heights","clifton-park","clifton-springs","cliftonforge","cliftonheights","cliftonpark","cliftonsprings","clint","clinton","clinton-corners","clinton-township","clintoncorners","clintondale","clintontownship","clintonville","clintwood","clio","cliserio-alanis-san-gaspar","cliserioalanissangaspar","clive","cll","clm","cloete","cloquet","closter","clover","clover-hill","cloverdale","cloverhill","cloverleaf","cloverly","cloverport","clovis","clp","clpf","clr","cls","clute","clv","clyde","clyde-hill","clyde-river","clydehill","clyderiver","clymer","cm","cma","cmch","cmcm","cmd","cmen","cmg","cmh","cmm","cmsm","cn","cn3","cne","cnm","cnr","co","coa","coacalco","coachella","coachimalco","coachiti","coacoatzintla","coacotla","coacoyula-de-alvarez","coacoyuladealvarez","coacoyulichan","coacoyulillo","coacuilco","coahuayana-de-hidalgo","coahuayana-viejo","coahuayanadehidalgo","coahuayanaviejo","coahuayutla-de-guerrero","coahuayutladeguerrero","coahuila","coahuila-de-zaragoza","coahuiladezaragoza","coahuitlan","coahuixco","coahuixtla","coajomulco","coal-city","coal-creek","coal-fork","coal-grove","coal-hill","coal-run-village","coal-valley","coalcity","coalcoman-de-vazquez-pallares","coalcomandevazquezpallares","coalcreek","coaldale","coalfield","coalfork","coalgate","coalgrove","coalhill","coalhurst","coaling","coalinga","coalrunvillage","coalvalley","coalville","coamilpa-de-juarez","coamilpadejuarez","coapilla","coarsegold","coatecas-altas","coatecasaltas","coatepec","coatepec-costales","coatepec-harinas","coatepeccostales","coatepecharinas","coatesville","coatetelco","coaticook","coatlan-del-rio","coatlandelrio","coats","coatzacoalcos","coatzingo","coatzintla","coba","cobb","cobb-island","cobbisland","cobbs-creek","cobbscreek","cobden","cobleskill","cobourg","coburg","cochise","cochituate","cochoapa","cochoapa-el-grande","cochoapaelgrande","cochran","cochrane","cochranton","cockeysville","cockrell-hill","cockrellhill","cocoa","cocoa-beach","cocoa-west","cocoabeach","cocoawest","cocohital","coconino","coconut-creek","coconut-grove","coconutcreek","coconutgrove","cocorit","cocotitlan","cocoyoc","cocoyol","cocoyotla","cocucho","cocula","cody","coeburn","coeneo-de-la-libertad","coeneodelalibertad","coetzala","coeur-dalene","coeurdalene","coffeyville","cofradia","cofradia-de-juarez","cofradia-de-morelos","cofradia-de-suchitlan","cofradiadejuarez","cofradiademorelos","cofradiadesuchitlan","coh","cohasset","cohoe","cohoes","cohuecan","coixtlahuaca","cojumatlan-de-regules","cojumatlanderegules","cokato","col","col-bosques-de-las-lomas","colatlan","colbert","colbosquesdelaslomas","colby","colchester","cold-lake","cold-spring","cold-spring-harbor","cold-springs","coldlake","coldspring","coldspringharbor","coldsprings","coldstream","coldwater","cole-camp","cole-harbour","colebrook","colecamp","coleharbour","coleman","coleraine","colesville","colfax","colima","colinas-de-plata","colinas-del-aeropuerto","colinas-del-roble","colinas-del-sol","colinasdelaeropuerto","colinasdelroble","colinasdelsol","colinasdeplata","colipa","collantes","college","college-park","college-place","college-point","college-station","collegedale","collegepark","collegeplace","collegepoint","collegestation","collegeville","colleyville","collier","collierville","collin","collingdale","collings-lakes","collingslakes","collingswood","collingwood","collins","collinsburg","collinsville","collinwood","colma","colmar-manor","colmarmanor","cologne","coloma","colombia-de-guadalupe","colombiadeguadalupe","colon","colona","colonia","colonia-18-de-marzo","colonia-2-de-septiembre","colonia-24-de-febrero","colonia-28-de-mayo-santa-rosa","colonia-3-de-mayo","colonia-3-de-mayo-la-cruz","colonia-adolfo-lopez-mateos","colonia-aeropuerto","colonia-agricola-analco","colonia-alborada","colonia-alvaro-obregon","colonia-aquiles-cordoba-moran","colonia-arboledas-san-andres","colonia-aviacion-autopan","colonia-azteca","colonia-bellavista","colonia-benito-juarez","colonia-campesina","colonia-chalchihuecan","colonia-constitucion","colonia-cuauhtemoc","colonia-de-guadalupe","colonia-del-sol","colonia-del-valle","colonia-doctor-gustavo-baz","colonia-el-florido","colonia-el-mirador","colonia-el-pedregal","colonia-el-pirame","colonia-el-refugio","colonia-el-renacimiento","colonia-el-salado","colonia-emiliano-zapata","colonia-felipe-angeles","colonia-francisco-javier-mina","colonia-gomez-morin","colonia-guadalupana","colonia-guadalupe","colonia-guadalupe-victoria","colonia-gustavo-baz-prada","colonia-hidalgo-el-tecolote","colonia-ignacio-allende","colonia-independencia","colonia-isidro-fabela","colonia-jordan","colonia-jose-maria-morelos","colonia-juarez","colonia-la-asuncion","colonia-la-calzada-la-olla","colonia-la-central","colonia-la-libertad","colonia-las-arboledas","colonia-las-flores","colonia-latinoamericana","colonia-lazaro-cardenas","colonia-lealtad","colonia-libertad","colonia-lindavista","colonia-los-aguiluchos","colonia-los-angeles","colonia-los-cedros","colonia-los-cerritos","colonia-los-remedios","colonia-luces-en-el-mar","colonia-manuel-gonzalez","colonia-michoacana","colonia-miguel-hidalgo","colonia-militar","colonia-morelos","colonia-morelos-el-nueve","colonia-nativitas","colonia-nueva-era","colonia-nueva-revolucion","colonia-nuevo-mexico","colonia-obrera","colonia-padre-hidalgo","colonia-palma","colonia-palo-prieto-chipitongo","colonia-paraiso-escondido","colonia-patria-nueva","colonia-pedro-maria-anaya","colonia-plenitud","colonia-progreso","colonia-rafael-corrales-ayala","colonia-reforma-tlalmimilolpan","colonia-renacimiento","colonia-revolucion","colonia-ricardo-flores-magon","colonia-rincon-viejo","colonia-rincon-villa-del-valle","colonia-rio-lerma-tic-ti","colonia-san-francisco","colonia-san-francisco-de-asis","colonia-san-isidro","colonia-san-juan","colonia-san-luis","colonia-san-luis-rey","colonia-san-ramon","colonia-santa-barbara","colonia-sesenta-y-dos","colonia-tenhe","colonia-terrazas","colonia-tulteca-teopan","colonia-ursulo-galvan","colonia-veinte-de-noviembre","colonia-veintitres-de-mayo","colonia-venustiano-carranza","colonia-wenceslao-labra","colonia-yucatan","colonia18demarzo","colonia24defebrero","colonia28demayosantarosa","colonia2deseptiembre","colonia3demayo","colonia3demayolacruz","coloniaadolfolopezmateos","coloniaaeropuerto","coloniaagricolaalvaroobregon","coloniaagricolaanalco","coloniaagricolamexicopalmitas","coloniaalborada","coloniaalvaroobregon","coloniaaquilescordobamoran","coloniaarboledassanandres","coloniaaviacionautopan","coloniaazteca","coloniabellavista","coloniabenitojuarez","coloniacampesina","coloniachalchihuecan","coloniaconstitucion","coloniacuauhtemoc","coloniadeguadalupe","coloniadelsol","coloniadelvalle","coloniadoctorgustavobaz","coloniaelflorido","coloniaelmirador","coloniaelmiradorllanodelejido","coloniaelpedregal","coloniaelpirame","coloniaelrefugio","coloniaelrenacimiento","coloniaelsalado","coloniaemilianozapata","coloniafelipeangeles","coloniafraccionamientoelpuente","coloniafranciscogarciasalinas","coloniafranciscojaviermina","coloniagomezmorin","coloniaguadalupana","coloniaguadalupe","coloniaguadalupevictoria","coloniagustavobazprada","coloniahidalgoeltecolote","coloniaignacioallende","coloniaindependencia","coloniaisidrofabela","coloniajordan","coloniajosemariamorelos","coloniajuarez","colonial-beach","colonial-heights","colonial-park","colonial-pine-hills","colonialaasuncion","colonialacalzadalaolla","colonialacentral","colonialalibertad","colonialasarboledas","colonialasflores","colonialatinoamericana","colonialazarocardenas","colonialazarocardenasloshornos","colonialbeach","colonialealtad","colonialheights","colonialibertad","colonialindavista","colonialomasdesanramontriquis","colonialosaguiluchos","colonialosangeles","colonialoscedros","colonialoscerritos","colonialosremedios","colonialpark","colonialpinehills","colonialucesenelmar","coloniamanuelgonzalez","coloniamichoacana","coloniamiguelhidalgo","coloniamilitar","coloniamorelos","coloniamoreloselnueve","colonianativitas","colonianuevaera","colonianuevarevolucion","colonianuevomexico","coloniaobrera","coloniapadrehidalgo","coloniapalma","coloniapaloprietochipitongo","coloniaparaisoescondido","coloniapatrianueva","coloniapedromariaanaya","coloniaplenitud","coloniaprogreso","coloniarafaelcorralesayala","coloniareformatlalmimilolpan","coloniarenacimiento","coloniarevolucion","coloniaricardofloresmagon","coloniarinconviejo","coloniarinconvilladelvalle","coloniariolermaticti","colonias-pedernales","coloniasanfrancisco","coloniasanfranciscodeasis","coloniasanisidro","coloniasanjuan","coloniasanluis","coloniasanluisrey","coloniasanramon","coloniasantabarbara","coloniasantacecilialasauceda","coloniasesentaydos","coloniaspedernales","coloniatenhe","coloniaterrazas","coloniatultecateopan","coloniaursulogalvan","coloniaveintedenoviembre","coloniaveintitresdemayo","coloniavenustianocarranza","coloniavistabellalomasdelpeaje","coloniawenceslaolabra","coloniayucatan","colonie","colony-park","colonypark","colorado","colorado-city","colorado-springs","coloradocity","coloradosprings","colorines","colotepec","colotlan","colotlipa","colquitt","colrain","colstrip","colton","colts-neck","coltsneck","colucan","columbia","columbia-city","columbia-falls","columbia-heights","columbiacity","columbiafalls","columbiaheights","columbiana","columbine","columbine-valley","columbinevalley","columbus","columbus-air-force-base","columbus-grove","columbus-junction","columbusairforcebase","columbusgrove","columbusjunction","colusa","colville","colwich","colwood","colwyn","comachuen","comala","comalapa","comalcalco","comales","comaltepec","comanche","comanja","comanjilla","comapa","comb","combee-settlement","combeesettlement","combes","combine","combined-locks","combinedlocks","comejen","comer","comfort","comitan","commack","commerce","commerce-city","commercecity","commercial-point","commercialpoint","communications-hill","communicationshill","como","comoapan","comonfort","comox","compostela","compton","compuertas","comstock-northwest","comstock-park","comstocknorthwest","comstockpark","conashaugh-lakes","conashaughlakes","conca","concentracion-5-de-febrero","concentracion5defebrero","concepcion","concepcion-caro","concepcion-chimalpa","concepcion-cuautla","concepcion-de-buenos-aires","concepcion-del-monte","concepcion-del-oro","concepcion-hidalgo","concepcion-jolalpan","concepcion-la-venta","concepcioncapulaclaexhacienda","concepcioncaro","concepcionchimalpa","concepcioncuautla","concepciondebuenosaires","concepciondelmonte","concepciondeloro","concepcionhidalgo","concepcionjolalpan","concepcionlaventa","conception-bay-south","conceptionbaysouth","concord","concordia","conda","condembaro","condon","conehatta","conejeras","conejos","conemaugh","conestoga","coneto-de-comonfort","conetodecomonfort","coney-island","coneyisland","congers","congregacion-calles","congregacion-el-tajin","congregacion-hidalgo","congregacion-ortiz","congregacion-reforma","congregacioncalles","congregacioneltajin","congregacionhidalgo","congregacionortiz","congregacionreforma","congress","conjunto-urbano-la-loma-i","conjuntohabitacionaleltrebol","conjuntourbanolalomai","conkal","conley","conneaut","conneaut-lakeshore","conneautlakeshore","connecticut","connell","connellsville","connelly-springs","connellysprings","connersville","connerton","conning-towers-nautilus-park","conningtowersnautiluspark","conover","conrad","conroe","conshohocken","constance-bay","constancebay","constancia","constancia-del-rosario","constanciadelrosario","constancio-farfan-la-pascuala","constanciofarfanlapascuala","constantia","constantine","constitucion","constitucion-mexicana","constitucionmexicana","contepec","continental","contla","contoocook","contra-costa","contra-costa-centre","contracosta","contracostacentre","contrecoeur","convent","converse","convoy","conway","conway-springs","conwaysprings","conyers","conyngham","cookeville","cookshire","cookshire-eaton","cookshireeaton","cookstown","cool","cool-valley","coolidge","coolidge-corner","coolidgecorner","coolvalley","coombs","coon-rapids","coonrapids","cooper","cooper-city","coopercity","coopersburg","cooperstown","coopersville","coopertown","coos","coos-bay","coosada","coosbay","copainala","copala","copalillo","copanatoyac","copandaro-copandaro-del-cuatro","copandaro-de-galeana","copandarocopandarodelcuatro","copandarodegaleana","copeland","copiague","copila","coplay","copley","copoya","coppell","copper-canyon","copperas-cove","copperascove","coppercanyon","copperopolis","coquille","coquimatlan","coquitlam","coral-gables","coral-hills","coral-springs","coral-terrace","coralgables","coralhills","coralsprings","coralterrace","coralville","coram","coraopolis","corbin","corcoran","corcovado","cordaville","cordele","cordell","cordes-lakes","cordeslakes","cordoba","cordoba-santa-leticia","cordobasantaleticia","cordova","cordry-sweetwater-lakes","cordrysweetwaterlakes","corerepe","corinna","corinth","cornelia","cornelius","cornell","corner-brook","cornerbrook","cornersville","corning","cornish","cornville","cornwall","cornwells-heights","cornwellsheights","corona","corona-de-tucson","coronadetucson","coronado","coronango","coronel-tito-hernandez","coroneltitohernandez","coroneo","corozal","corpus-christi","corpuschristi","corral-de-barrancos","corral-de-piedra","corral-de-piedras-de-arriba","corral-del-risco-punta-de-mita","corral-falso","corral-nuevo","corraldebarrancos","corraldelriscopuntademita","corraldepiedra","corraldepiedrasdearriba","corralejo-de-arriba","corralejodearriba","corralero","corrales","corralfalso","corralillos","corralitos","corralnuevo","corriente-1ra-seccion","corriente1raseccion","corrigan","corry","corsicana","corso-italia-davenport","corsoitaliadavenport","cortazar","corte-madera","cortemadera","cortez","cortland","cortland-west","cortlandt-manor","cortlandtmanor","cortlandwest","corunna","corupo","corvallis","corydon","cos","cos-cob","cosala","cosamaloapan","cosautlan","coscob","coscomate-del-progreso","coscomatedelprogreso","coscomatepec-de-bravo","coscomatepecdebravo","coshocton","cosio","cosmopolis","cosolapa","cosoleacaque","cosoltepec","costa-azul","costa-mesa","costaazul","costamesa","cotati","cotaxtla","cote-saint-luc","coteau-du-lac","coteaudulac","cotesaintluc","cotija-de-la-paz","cotijadelapaz","coto-de-caza","cotodecaza","cotorina","cottage-city","cottage-grove","cottage-lake","cottagecity","cottagegrove","cottagelake","cottleville","cottonport","cottonwood","cottonwood-falls","cottonwood-heights","cottonwood-shores","cottonwoodfalls","cottonwoodheights","cottonwoodshores","cotuit","cotulla","coudersport","coulee-dam","couleedam","council","council-bluffs","council-grove","councilbluffs","councilgrove","country-club","country-club-estates","country-club-hills","country-club-village","country-homes","country-knolls","country-lake-estates","country-squire-lakes","country-walk","countryclub","countryclubestates","countryclubhills","countryclubvillage","countryhomes","countryknolls","countrylakeestates","countryside","countrysquirelakes","countrywalk","county","coupeville","courtenay","courtland","coushatta","cove-creek","covecreek","covedale","covelo","coventry","coventry-lake","coventrylake","covina","covington","cow-bay","cowan","cowansville","cowarts","cowbay","coweta","cowichan-bay","cowichanbay","cowlitz","cowpens","coxcatlan","coxolico","coxquihui","coxsackie","coyahualco","coyame-del-sotol","coyamedelsotol","coyoacan","coyolito","coyomeapan","coyote","coyotepec","coyotillos","coyotitan","coyuca-de-benitez","coyuca-de-catalan","coyucadebenitez","coyucadecatalan","coyula","coyuquilla-norte","coyuquillanorte","coyutla","cozad","cozotlan-norte","cozotlannorte","cozumel","cp","cpab","cpc","cpe","cpec","cph","cpma","cpn","cppc","cps","cq","cr","crab-orchard","craborchard","crabtree","crafton","craig","craig-beach","craigbeach","craigsville","crainville","cramerton","cranberry-township","cranberrytownship","cranbrook","cranbury","crandall","crandon","crandon-lakes","crandonlakes","crane","cranford","cranston","crawfordsville","crawfordville","crb","crca","cre","creede","creedmoor","creel","creighton","creola","cresaptown","crescencio-morales-san-mateo","crescenciomoralessanmateo","crescent","crescent-city","crescent-springs","crescentcity","crescentsprings","cresco","cresskill","cresson","cressona","crest","crest-hill","crested-butte","crestedbutte","cresthill","crestline","creston","crestview","crestview-hills","crestviewhills","crestwood","crestwood-village","crestwoodvillage","creswell","crete","creve-coeur","crevecoeur","crewe","crfm","cricket","cridersville","crimora","cripple-creek","cripplecreek","crisfield","crisostomos","cristeros-fraccionamiento","cristerosfraccionamiento","cristo-rey","cristobal-colon","cristobal-obregon","cristobalcolon","cristobalobregon","cristorey","crittenden","crn","crocker","crockett","crofton","crompond","cromwell","crooked-lake-park","crookedlakepark","crooks","crookston","crooksville","croom","cropseyville","crosby","crosbyton","cross-city","cross-lake","cross-lake-19a","cross-lanes","cross-mountain","cross-plains","crosscity","crossett","crossfield","crosslake","crosslake19a","crosslanes","crossmountain","crossplains","crossville","croswell","crothersville","croton-on-hudson","crotononhudson","crow-agency","crowagency","crowell","crowley","crown-heights","crown-point","crownheights","crownpoint","crownsville","croydon","crozet","crt","crucecita","crucero-las-pilas","crucerolaspilas","crugers","cruillas","crump","cruz-blanca","cruz-de-huanacaxtle","cruz-del-milagro","cruz-grande","cruz-quemada","cruz-verde","cruzblanca","cruzdehuanacaxtle","cruzdelmilagro","cruzgrande","cruzquemada","cruzton","cruzverde","crv","crystal","crystal-city","crystal-falls","crystal-lake","crystal-lakes","crystal-lawns","crystal-river","crystal-springs","crystalcity","crystalfalls","crystallake","crystallakes","crystallawns","crystalriver","crystalsprings","cs","csac","csb","csc","csdn","csf","csh","csi","csj","csl","cslr","csm","csr","csst","csyd","ct","ct-0001","ct-0002","ct-0003","ct-0004","ct-0005","ct-0006","ct-0007","ct-0008","ct-0009","ct-0010","ct-0011","ct-0012","ct-0013","ct-0014","ct-0015","ct-0016","ct-0017","ct-0018","ct-0019","ct-0021","ct-0022","ct-0023","ct-0024","ct-0025","ct-0026","ct-0027","ct-0028","ct-0029","ct-0030","ct0001","ct0002","ct0003","ct0004","ct0005","ct0006","ct0007","ct0008","ct0009","ct0010","ct0011","ct0012","ct0013","ct0014","ct0015","ct0016","ct0017","ct0018","ct0019","ct0021","ct0022","ct0023","ct0024","ct0025","ct0026","ct0027","ct0028","ct0029","ct0030","cth","ctnp","ctt","cu","cuacnopalan","cuacuila","cuadrilla-de-dolores","cuadrilla-vieja","cuadrilladedolores","cuadrillavieja","cuajinicuilapa","cualac","cualata","cuamiles","cuamio","cuanacaxtitlan","cuanajo","cuanala","cuapaxtitla","cuapiaxtla","cuapiaxtla-de-madero","cuapiaxtlademadero","cuapinolito-azulillo","cuapinolitoazulillo","cuaracurio","cuarta-brigada","cuartabrigada","cuartel-la-mesa-el-asoleadero","cuartellamesaelasoleadero","cuatolol","cuatro-caminos","cuatro-cienegas-de-carranza","cuatrocaminos","cuatrocienegasdecarranza","cuatzoquitengo","cuauchichinola","cuauhtamazaco","cuauhtamingo","cuauhtemoc","cuauhtemoc-campo-cinco","cuauhtemoccampocinco","cuauhtenango","cuautempan","cuautepec","cuautepec-de-hinojosa","cuautepecdehinojosa","cuautinchan","cuautitlan","cuautitlan-izcalli","cuautitlanizcalli","cuautla","cuautlacingo","cuautlancingo","cuautlapan","cuautotola","cuautotolapan-san-jose","cuautotolapansanjose","cuaxomulco","cuaxoxpan","cuaxuxpa","cuazahuatl","cuba","cuba-city","cubacity","cubiri-de-portelas","cubirideportelas","cuch-holoch","cucharas","cuchholoch","cuchicuato","cuchulumtic","cucuchucho","cucurpe","cucuyulapa-primera-seccion","cucuyulapaprimeraseccion","cudahy","cudjoe-key","cudjoekey","cuecuecuatitla","cuencame-de-ceniceros","cuencamedeceniceros","cuendo","cuentepec","cueramaro","cuernavaca","cuero","cuesta-amarilla","cuesta-blanca","cuesta-de-laja","cuesta-de-penones","cuestaamarilla","cuestablanca","cuestadelaja","cuestadepenones","cuetzala-del-progreso","cuetzaladelprogreso","cuetzalan","cuexcomatitlan","cuexpala","cug","cuicatlan","cuichapa","cuilapan-de-guerrero","cuilapandeguerrero","cuisillos","cuitlahuac","cuitzeo-del-porvenir","cuitzeo-la-estancia","cuitzeodelporvenir","cuitzeolaestancia","cuiyachapa","culiacan","culiacancito","culico-2da-seccion","culico2daseccion","cullen","cullman","culloden","cullowhee","culp-creek","culpcreek","culpeper","culver","culver-city","culvercity","cumberland","cumberland-center","cumberland-head","cumberland-hill","cumberlandcenter","cumberlandhead","cumberlandhill","cumbre-de-barranca-honda","cumbredebarrancahonda","cumbres-iii","cumbresiii","cumming","cumpas","cumpich","cumuapa-1ra-seccion","cumuapa1raseccion","cumuato","cuncunul","cunduacan","cuonetzingo","cuparataro","cupareo","cupertino","cupilco","cupuan-del-rio","cupuandelrio","cuquio","curimeo","currituck","curtice","curtisville","curungueo","curwensville","cushing","cusihuiriachi","cusseta","custer","cut-and-shoot","cut-bank","cut-off","cutandshoot","cutbank","cutchogue","cuthbert","cutler","cutler-bay","cutler-ridge","cutlerbay","cutlerridge","cutlerville","cuto-de-la-esperanza","cuto-del-porvenir","cutodelaesperanza","cutodelporvenir","cutoff","cutten","cutzamala-de-pinzon","cutzamaladepinzon","cuxpala","cuyahoga-falls","cuyahogafalls","cuyoaco","cuyutlan","cuyuxtlahuaca","cuzama","cv","cvc","cvda","cvdm","cvdn","cvh","cvv","cw","cwl","cy","cyc","cynthiana","cypress","cypress-gardens","cypress-hills","cypress-lake","cypress-quarters","cypress-village","cypressgardens","cypresshills","cypresslake","cypressquarters","cypressvillage","cyril","cyt","cz","da","dacono","dacula","dade-city","dade-city-north","dadecity","dadecitynorth","dadeville","dahlgren","dahlonega","daingerfield","dajiedi","dakota","dakota-city","dakota-dunes","dakotacity","dakotadunes","dale","dale-city","dalecity","daleville","dalhart","dallas","dallas-center","dallascenter","dallastown","dallesport","dalmeny","dalton","dalton-gardens","daltongardens","dalworthington-gardens","dalworthingtongardens","daly-city","dalycity","dalzell","damariscotta","damasco","damascus","damian-carmona","damiancarmona","dana","dana-point","danapoint","danbury","danby","dandridge","dane","danforth","danforth-east-york","danfortheastyork","dania-beach","daniabeach","daniel","daniels","danielson","danielsville","dannemora","dansville","dantzibojay","danvers","danville","daom","daphne","darby","dardanelle","dardenne-prairie","dardenneprairie","darien","darlington","darmstadt","darnestown","darrington","dartmouth","dassel","dauphin","dauphin-island","dauphinisland","dautillos","daveluyville","davenport","david-city","davidcity","davidson","davidsonville","davidsville","davie","davis","davis-junction","davisboro","davisjunction","davison","dawson","dawson-city","dawson-creek","dawson-springs","dawsoncity","dawsoncreek","dawsonsprings","dawsonville","daxtha","day-heights","day-valley","dayheights","dayton","daytona-beach","daytona-beach-shores","daytonabeach","daytonabeachshores","dayvalley","db","dbd","dbh","dbn","dbp","dbs","dc","dcde","dcdm","dcn","dd","dda","ddb","ddc","dde","ddm","ddn","ddo","dds","ddv","de","de-graff","de-kalb","de-land-southwest","de-leon","de-leon-springs","de-lisle","de-parral","de-pere","de-queen","de-smet","de-soto","de-witt","deadwood","deale","deansboro","dearborn","dearborn-heights","dearbornheights","deatsville","debary","decatur","decaturville","decherd","decorah","decordova","dedham","deenwood","deep-river","deep-river-center","deephaven","deepriver","deeprivercenter","deer-isle","deer-lake","deer-lodge","deer-park","deer-valley","deerfield","deerfield-beach","deerfieldbeach","deering","deerisle","deerlake","deerlodge","deerpark","deervalley","defiance","deforest","defuniak-springs","defuniaksprings","degollado","degraff","dehesa","dekalb","del-aire","del-city","del-mar","del-monte-forest","del-norte","del-rey","del-rey-oaks","del-rio","delafield","delaire","delanco","deland","delandsouthwest","delano","delavan","delavan-lake","delavanlake","delaware","delaware-city","delawarecity","delcambre","delcity","delegacioncuajimalpademorelos","deleon","deleonsprings","delevan","delfino-victoria-santa-fe","delfinovictoriasantafe","delgado-de-abajo","delgado-de-arriba","delgadodeabajo","delgadodearriba","delhi","delhi-hills","delhihills","delisle","dell-rapids","dellrapids","dellwood","delmar","delmont","delmonteforest","delnorte","deloraine","delphi","delphos","delray-beach","delraybeach","delrey","delreyoaks","delrio","delson","delta","deltana","deltaville","deltona","demarest","deming","demopolis","demorest","demotte","denair","dengantzha","denham-springs","denhamsprings","denison","denjhi","denman-island","denman-island-trust-area","denmanisland","denmanislandtrustarea","denmark","dennis","dennis-port","dennison","dennisport","dent","denton","dentsville","denver","denver-city","denvercity","denville","deparral","depere","depew","depoe-bay","depoebay","deposit","depue","dequeen","dequincy","derby","deridder","derma","dermott","derramaderos","derramaderosegundoinfiernillo","derry","derry-village","derryvillage","derwood","des-allemands","des-arc","des-moines","des-peres","des-plaines","desallemands","desarc","descanso","deschutes","deschutes-river-woods","deschutesriverwoods","deseronto","desert-aire","desert-edge","desert-hills","desert-hot-springs","desert-shores","desert-view-highlands","desertaire","desertedge","deserthills","deserthotsprings","desertshores","desertviewhighlands","deshler","desloge","desmet","desmoines","desoto","desoto-lakes","desotolakes","despard","desperes","desplaines","destin","destrehan","detina-san-antonio-detina","detinasanantoniodetina","detroit","detroit-beach","detroit-lakes","detroit-shoreway","detroitbeach","detroitlakes","detroitshoreway","deux-montagnes","deuxmontagnes","devens","deville","devils-lake","devilslake","devine","devola","devon","dewart","dewey","dewey-humboldt","deweyhumboldt","deweyville","dewitt","dexter","dextho-de-victoria","dexthodevictoria","dey","df","dg","dh","dhs","di","diablo","diamante-de-echeverria","diamantedeecheverria","diamond","diamond-bar","diamond-head","diamond-ridge","diamond-springs","diamondbar","diamondhead","diamondridge","diamondsprings","diaz","diberville","diboll","dickens","dickeyville","dickinson","dickson","dickson-city","dicksoncity","didsbury","dieciocho-de-marzo","dieciochodemarzo","dieciseis-de-septiembre","dieciseisdeseptiembre","dieppe","dierks","diez-de-octubre","diezdeoctubre","digby","dighton","dike","dilkon","dilley","dillingham","dillon","dillonvale","dillsboro","dillsburg","dilworth","dimmitt","dimondale","dinuba","dinwiddie","dios-padre","diospadre","discovery-bay","discovery-harbor","discoverybay","discoveryharbor","dishman","disraeli","district-heights","district-of-columbia","districtheights","districtofcolumbia","dita","divernon","divisaderos","division-del-norte","divisiondelnorte","dix-hills","dixfield","dixhills","dixiana","dixmont","dixmoor","dixon","dixon-lane-meadow-creek","dixonlanemeadowcreek","dj","dk","dl","dlmc","dls","dm","dmdo","dmf","dn","do","dobbs-ferry","dobbsferry","dobson","doc","dock-junction","dockjunction","doctor-alberto-oviedo-mota","doctor-arroyo","doctor-belisario-dominguez","doctor-coss","doctor-domingo-chanona","doctor-gonzalez","doctor-montes-de-oca","doctor-mora","doctor-phillips","doctor-samuel-leon-brindis","doctoralbertooviedomota","doctorarroyo","doctorbelisariodominguez","doctorcoss","doctordomingochanona","doctorgonzalez","doctormiguelsilvasanguillermo","doctormontesdeoca","doctormora","doctorphillips","doctorsamuelleonbrindis","dodge-center","dodge-city","dodgecenter","dodgecity","dodgeville","dodson-branch","dodsonbranch","doe-valley","doevalley","doffing","dogtown","dolan-springs","dolansprings","dolbeau-mistassini","dolbeaumistassini","dolgeville","dollar-bay","dollar-corner","dollar-point","dollarbay","dollarcorner","dollard-des-ormeaux","dollarddesormeaux","dollarpoint","dolores","dolores-cuadrilla-de-enmedio","dolores-hidalgo","dolores-jaltenango","dolorescuadrilladeenmedio","doloreshidalgo","doloresjaltenango","dolton","domingo-arenas","domingoarenas","don-antonio","don-diego","don-francisco","don-samuel","don-valley-village","dona-ana","donaana","donaciano-ojeda","donacianoojeda","donaji","donald","donaldsonville","donalsonville","donantonio","dondiego","donfrancisco","dongan-hills","donganhills","dongu","doniphan","donna","donnacona","donora","donovan-estates","donovanestates","donsamuel","donvalleyvillage","doolittle","dooms","dora","doral","doraville","dorchester","dormont","dorneyville","dorset-park","dorsetpark","dorval","dos-arroyos","dos-bocas","dos-ceibas","dos-de-abril","dos-montes","dos-palos","dos-rios","dosarroyos","dosbocas","dosceibas","dosdeabril","dosmontes","dospalos","dosrios","dotegiare","dothan","double-oak","double-springs","doubleoak","doublesprings","douglas","douglass","douglass-hills","douglasshills","douglaston","douglasville","dousman","dove-creek","dove-valley","dovecreek","dover","dover-base-housing","dover-beaches-north","dover-beaches-south","dover-foxcroft","dover-plains","doverbasehousing","doverbeachesnorth","doverbeachessouth","doverfoxcroft","doverplains","dovevalley","dowagiac","dowling","downers-grove","downersgrove","downey","downieville","downingtown","downsview-roding-cfb","downsviewrodingcfb","downtown-brooklyn","downtown-honolulu","downtownbrooklyn","downtownhonolulu","dowsett-highlands","dowsetthighlands","doxey","doxhicho","doxteje-barrio-primero","doxteje-centro","doxtejebarrioprimero","doxtejecentro","doylestown","dp","dq","dr","dracut","drain","dranesville","draper","dravosburg","drayton-valley","draytonvalley","drc","dresden","dresher","drew","drexel","drexel-heights","drexel-hill","drexelheights","drexelhill","driggs","dripping-springs","drippingsprings","dro","druid-hills","druidhills","drum-point","drummondville","drumpoint","drumright","drw","dry-ridge","dry-run","dryden","dryridge","dryrun","ds","dsad","dsi","dslb","dtc","du-quoin","duarte","dublin","dubois","duboistown","dubuque","duchesne","duck-hill","duck-lake","duckhill","ducklake","dudley","due-west","duenweg","duewest","dufferin-grove","dufferingrove","dulac","dulce","dulce-grande","dulcegrande","dulles-town-center","dullestowncenter","duluth","dumas","dumbarton","dumfries","dumont","dunbar","duncan","duncannon","duncansville","duncanville","dundalk","dundas","dundee","dunean","dunedin","dunellen","dunes-city","dunescity","dunham","dunkirk","dunkirk-town-center","dunkirktowncenter","dunlap","dunmore","dunn","dunn-loring","dunnellon","dunnigan","dunnloring","dunnstown","dunnville","dunsmuir","dunstable","dunwoody","dupo","dupont","dupree","duquesne","duquoin","dur","durand","durango","durant","durham","duryea","duson","dutch-harbor","dutchess","dutchharbor","duval","duvall","duxbury","dv","dvh","dvsf","dvv","dw","dwej","dwight","dyer","dyersburg","dyersville","dyker-heights","dykerheights","dysart","dzan","dzemul","dzibalchen","dzibikak","dzidzantun","dzilam-de-bravo","dzilam-gonzalez","dzilamdebravo","dzilamgonzalez","dzitas","dzitbalche","dzitnup","dzitya","dziuche","dzoncauich","dzonot-carretero","dzonotcarretero","dzula","dzununcan","e3","ea","eab","eads","eafb","eag","eagan","eagar","eagle","eagle-butte","eagle-grove","eagle-lake","eagle-mountain","eagle-pass","eagle-point","eagle-river","eaglebutte","eaglegrove","eaglelake","eaglemountain","eaglepass","eaglepoint","eagleriver","eagleton-village","eagletonvillage","eagleview","eagleville","ealm","earle","earlham","earlimart","earlington","earlston","earlville","early","earth","easf","easley","east-alton","east-amherst","east-angus","east-atlantic-beach","east-aurora","east-bangor","east-berlin","east-bernard","east-berwick","east-bethel","east-boston","east-brainerd","east-brewton","east-bridgewater","east-bronson","east-brookfield","east-brooklyn","east-broughton","east-brunswick","east-cambridge","east-canton","east-carbon-city","east-chattanooga","east-chicago","east-cleveland","east-concord","east-conemaugh","east-dennis","east-douglas","east-dublin","east-dubuque","east-dundee","east-earl","east-elmhurst","east-end","east-end-danforth","east-falls","east-falmouth","east-farmingdale","east-flat-rock","east-flatbush","east-florence","east-foothills","east-franklin","east-freehold","east-gaffney","east-garden-city","east-garfield-park","east-glenville","east-grand-forks","east-grand-rapids","east-greenbush","east-greenville","east-greenwich","east-griffin","east-gull-lake","east-gwillimbury","east-haddam","east-hampton","east-hampton-north","east-hanover","east-harlem","east-hartford","east-harwich","east-haven","east-hazel-crest","east-helena","east-hemet","east-highland-park","east-hill-meridian","east-hills","east-honolulu","east-independence","east-islip","east-ithaca","east-jordan","east-kingston","east-la-mirada","east-lake","east-lake-orient-park","east-lansdowne","east-lansing","east-lexington","east-liverpool","east-longmeadow","east-los-angeles","east-machias","east-manoa","east-massapequa","east-mckeesport","east-meadow","east-merrimack","east-millcreek","east-millinocket","east-milton","east-missoula","east-moline","east-moriches","east-mount-airy","east-naples","east-new-york","east-newark","east-newnan","east-norriton","east-northport","east-norwalk","east-norwich","east-oak-lane","east-oakdale","east-orange","east-palatka","east-palestine","east-palo-alto","east-pasadena","east-patchogue","east-pensacola-heights","east-peoria","east-pepperell","east-perrine","east-petersburg","east-pittsburgh","east-point","east-port-orchard","east-porterville","east-prairie","east-providence","east-quincy","east-quogue","east-rancho-dominguez","east-renton-highlands","east-richmond-heights","east-ridge","east-riverdale","east-rochester","east-rockaway","east-rockingham","east-rutherford","east-sahuarita","east-saint-louis","east-san-gabriel","east-sandwich","east-setauket","east-shoreham","east-somerville","east-sonora","east-spencer","east-stroudsburg","east-sumter","east-syracuse","east-tawas","east-tremont","east-troy","east-uniontown","east-valley","east-village","east-washington","east-wellington","east-wenatchee","east-wenatchee-bench","east-williston","east-windsor","east-york","eastalton","eastamherst","eastangus","eastatlanticbeach","eastaurora","eastbangor","eastberlin","eastbernard","eastberwick","eastbethel","eastboston","eastbrainerd","eastbrewton","eastbridgewater","eastbronson","eastbrookfield","eastbrooklyn","eastbroughton","eastbrunswick","eastcambridge","eastcanton","eastcarboncity","eastchattanooga","eastchester","eastchicago","eastcleveland","eastconcord","eastconemaugh","eastdennis","eastdouglas","eastdublin","eastdubuque","eastdundee","eastearl","eastelmhurst","eastend","eastenddanforth","eastfalls","eastfalmouth","eastfarmingdale","eastflatbush","eastflatrock","eastflorence","eastfoothills","eastfranklin","eastfreehold","eastgaffney","eastgardencity","eastgarfieldpark","eastgate","eastglenville","eastgrandforks","eastgrandrapids","eastgreenbush","eastgreenville","eastgreenwich","eastgriffin","eastgulllake","eastgwillimbury","easthaddam","eastham","easthampton","easthamptonnorth","easthanover","eastharlem","easthartford","eastharwich","easthaven","easthazelcrest","easthelena","easthemet","easthighlandpark","easthillmeridian","easthills","easthonolulu","eastindependence","eastislip","eastithaca","eastjordan","eastkingston","eastlake","eastlakeorientpark","eastlamirada","eastland","eastlansdowne","eastlansing","eastlawn-gardens","eastlawngardens","eastlexington","eastliverpool","eastlongmeadow","eastlosangeles","eastmachias","eastman","eastmanoa","eastmassapequa","eastmckeesport","eastmeadow","eastmerrimack","eastmillcreek","eastmillinocket","eastmilton","eastmissoula","eastmoline","eastmont","eastmoriches","eastmountairy","eastnaples","eastnewark","eastnewnan","eastnewyork","eastnorriton","eastnorthport","eastnorwalk","eastnorwich","eastoakdale","eastoaklane","easton","eastorange","eastover","eastpalatka","eastpalestine","eastpaloalto","eastpasadena","eastpatchogue","eastpensacolaheights","eastpeoria","eastpepperell","eastperrine","eastpetersburg","eastpittsburgh","eastpoint","eastpointe","eastport","eastporterville","eastportorchard","eastprairie","eastprovidence","eastquincy","eastquogue","eastranchodominguez","eastrentonhighlands","eastrichmondheights","eastridge","eastriverdale","eastrochester","eastrockaway","eastrockingham","eastrutherford","eastsahuarita","eastsaintlouis","eastsandwich","eastsangabriel","eastsetauket","eastshoreham","eastsomerville","eastsonora","eastspencer","eaststroudsburg","eastsumter","eastsyracuse","easttawas","easttremont","easttroy","eastuniontown","eastvale","eastvalley","eastvillage","eastville","eastwashington","eastwellington","eastwenatchee","eastwenatcheebench","eastwick","eastwilliston","eastwindsor","eastwood","eastyork","eaton","eaton-estates","eaton-rapids","eatonestates","eatonrapids","eatons-neck","eatonsneck","eatonton","eatontown","eatonville","eau-claire","eauclaire","eb","ebano","ebensburg","ebj","ebll","ec","eca","ecatepec-de-morelos","ecatepecdemorelos","ecatzingo-de-hidalgo","ecatzingodehidalgo","ecc","ecdm","ecel","ecep","ecg","echelon","echo-park","echopark","eclectic","eclq","ecm","eco","economy","ecorse","ecr","ecsc","ecu","ecuandureo","ecvh","ecwd","ecx","ecyo","ed","eda","edb","edc","edcouch","edd","eddington","eddystone","eddyville","eden","eden-isle","eden-prairie","eden-roc","eden-valley","edenbridge-humber-valley","edenbridgehumbervalley","edenisle","edenprairie","edenroc","edenton","edenvalley","edfm","edg","edgar","edgard","edgartown","edgecliff-village","edgecliffvillage","edgecomb","edgefield","edgemere","edgemont-park","edgemontpark","edgemoor","edgerton","edgewater","edgewater-park","edgewaterpark","edgewood","edgeworth","edh","edi","edina","edinboro","edinburg","edinburgh","edison","edisto","edl","edlf","edlr","edm","edmond","edmonds","edmonston","edmonton","edmore","edmundston","edna","edneyville","edo","edr","eds","edsf","edson","edt","edtn","edu","edwards","edwards-air-force-base","edwardsairforcebase","edwardsburg","edwardsville","ee","eec","eed","eedc","eer","ees","eev","ef","effingham","effort","efr","efrain-a-gutierrez","efrainagutierrez","eg","egc","egf","egg-harbor-city","eggertsville","eggharborcity","egipto","egl","eglin-air-force-base","eglin-village","eglinairforcebase","eglinton-east","eglintoneast","eglinvillage","eglv","egp","egr","egv","egypt","egypt-lake-leto","egyptlakeleto","eh","ehc","ehdc","ehdg","ehdx","eheg","eheh","ehlc","ehm","ehn","ehp","ehrenberg","ehsi","ehv","ei","eidson-road","eidsonroad","eielson-air-force-base","eielsonairforcebase","ej","ejidal","ejido-benito-juarez","ejido-cinco-de-mayo","ejido-cohuibampo","ejido-de-dolores","ejido-de-guadalupe","ejido-de-la-finca","ejido-de-mozoquilpan","ejido-de-san-mateo-coapexco","ejido-del-tejocote","ejido-del-tunal-nenaxi","ejido-el-castillo","ejido-el-rosario","ejido-el-saucillo","ejido-el-vergel","ejido-general-leandro-valle","ejido-hidalgo","ejido-javier-rojo-gomez","ejido-jesus-maria","ejido-jiquilpan","ejido-la-guayana-rancho-seco","ejido-la-joya","ejido-la-pina-maromilla","ejido-la-quemada","ejido-la-soledad","ejido-lazaro-cardenas","ejido-loma-de-malacota","ejido-los-huastecos","ejido-mayocoba","ejido-michoacan-de-ocampo","ejido-miraflores","ejido-netzahualcoyotl","ejido-nuevo","ejido-nuevo-leon","ejido-ohuira","ejido-ojo-de-agua","ejido-patzcuaro","ejido-plan-de-ayala","ejido-quintana-roo","ejido-saltillo","ejido-san-cristobal","ejido-san-diego","ejido-san-jose-xilatzen","ejido-san-lorenzo-cuauhtenco","ejido-sinaloa","ejido-sonora","ejido-tabasco","ejido-toluca","ejido-tosalibampo","ejido-venustiano-carranza","ejido-vicente-guerrero","ejido-viejo","ejido-yucatan","ejido-zaragoza","ejidobenitojuarez","ejidocajonojodeaguanumerodos","ejidocincodemayo","ejidocohuibampo","ejidodecoscomatedelprogreso","ejidodedolores","ejidodeguadalupe","ejidodelafinca","ejidodeltejocote","ejidodeltunalnenaxi","ejidodemozoquilpan","ejidodesanmateocoapexco","ejidoelcastillo","ejidoelrosario","ejidoelsaucillo","ejidoelvergel","ejidogeneralleandrovalle","ejidohidalgo","ejidojavierrojogomez","ejidojesusmaria","ejidojiquilpan","ejidolaguayanaranchoseco","ejidolajoya","ejidolapinamaromilla","ejidolapitahayasantodomingo","ejidolaquemada","ejidolasoledad","ejidolazarocardenas","ejidolomademalacota","ejidoloshuastecos","ejidomayocoba","ejidomichoacandeocampo","ejidomiraflores","ejidonetzahualcoyotl","ejidonuevo","ejidonuevoleon","ejidoohuira","ejidoojodeagua","ejidopalmaejidosanfrancisco","ejidopatzcuaro","ejidoplandeayala","ejidoquintanaroo","ejidosaltillo","ejidosancristobal","ejidosandiego","ejidosanjosexilatzen","ejidosanlorenzocuauhtenco","ejidosinaloa","ejidosonora","ejidotabasco","ejidotoluca","ejidotosalibampo","ejidovenustianocarranza","ejidovicenteguerrero","ejidoviejo","ejidoyucatan","ejidozaragoza","ejm","ejrg","ejutla","ejutla-de-crespo","ejutladecrespo","ek","ekalaka","ekmul","ekpedz","el","el-abra","el-acebuche","el-aguacatal","el-aguacate","el-aguajito","el-aguila","el-aguila-la-mesa","el-ahuacate","el-alvareno","el-ambar","el-anono","el-arador","el-arco","el-arenal","el-bajio","el-bajio-la-laguna","el-barrido","el-barril","el-barrio-de-la-soledad","el-bejuco","el-bellote-miguel-de-la-madrid","el-bingu","el-blanco","el-bosque","el-botadero","el-boxtha","el-burrion","el-cabezon","el-cabi","el-cahulote-de-santa-ana","el-cajon","el-calvario","el-camalote","el-camaron","el-cambio","el-camino-real","el-campanario-y-oradel","el-campo","el-canario","el-capomal","el-capulin","el-capulin-la-nueva-pochota","el-capulo-la-quebradora","el-caracol","el-carmen","el-carmen-aztama","el-carmen-el-limon","el-carmen-ocotepec","el-carmen-xalpatlahuaya","el-carreton","el-carrizal","el-carrizalito","el-carrizo","el-castillo","el-cazadero","el-cedro","el-cenidor","el-cenizo","el-censo","el-centenario","el-centro","el-cereso","el-cerrillo-vista-hermosa","el-cerrito","el-cerrito-corona","el-cerro","el-cerro-mission","el-cesped","el-chacal","el-chante","el-chauz","el-chayote","el-chico","el-chinaco-el-pujido","el-chocolate","el-chote","el-cid","el-ciervo","el-ciruelo","el-coacoyul","el-cocuite","el-coecillo","el-colegio","el-colomo","el-colorado","el-coloso","el-conchero","el-conejo","el-congo","el-consuelo","el-consuelo-ulapa","el-contadero-de-matamoros","el-control","el-copal","el-copalar","el-copalillo","el-copetillo","el-coporo","el-corcovado","el-corte","el-cortes","el-cortijo","el-coto","el-coyote","el-coyul","el-crucero-de-santa-maria","el-cuenqueno","el-cuervero-cuerveros","el-cuije","el-cuitzillo-grande","el-curtidor","el-cuyo","el-diamante-la-retranca","el-diez","el-divisador","el-dorado","el-dorado-hills","el-dorado-springs","el-durazno","el-eden","el-embarcadero","el-encanto","el-encanto-del-cerril","el-esclavo","el-escobillo","el-escondido","el-escoplo","el-escribano","el-espejo","el-espinal","el-espinalillo","el-estudiante","el-fortin","el-fresno","el-fuerte","el-fuerte-de-la-union","el-galaneno","el-gallinero","el-gallo","el-granada","el-grullo","el-guaco","el-guayabito","el-guayabo","el-habal","el-habillal","el-hatito","el-hielo","el-higo","el-higueral","el-huajote","el-huarache-el-guarache","el-huaxtho","el-huerfano","el-huexco","el-huidero","el-huitusi","el-huixmi","el-huizache","el-humo","el-jabali","el-jacal","el-jaguey","el-jaral","el-jaralito","el-jardin","el-jazmin","el-jebel","el-jiadi","el-jicaral","el-jicote","el-jobo","el-juile","el-lago","el-lampotal","el-largo","el-laurel","el-lencero","el-lequeitio","el-letrero","el-limar","el-limon","el-limon-de-los-ramos","el-limonar","el-lindero","el-llanito","el-llano","el-llano-del-compromiso","el-llano-santa-maria","el-lobo","el-loreto-occidental","el-lucero","el-maguey","el-magueyal","el-maluco","el-mango","el-mentidero","el-meson","el-metlapil","el-mezquitillo","el-milagro","el-mirador","el-mirage","el-mogote","el-molino","el-mollejon","el-monte","el-moral","el-moreno-san-miguel-moreno","el-morro","el-muey","el-nabo","el-nacimiento","el-naranjillo","el-naranjito","el-naranjo","el-nayar","el-nigromante","el-nilo","el-nino","el-nio","el-nith","el-nopal","el-obraje","el-ocotal","el-ocotito","el-ojuelo","el-olvera","el-organal","el-oro","el-oro-de-hidalgo","el-pacayal","el-palacio","el-palmar","el-palmar-grande","el-palmar-san-gabriel","el-palmarcito","el-palmito","el-panorama","el-papayo","el-paracho","el-paraiso","el-paraiso-la-charca","el-paredon","el-paredoncito","el-parral","el-paso","el-pedregal","el-penasco","el-pericon","el-peru","el-pescadero","el-picacho","el-pilar","el-pino","el-pinto","el-pintor","el-pitahayo","el-pital","el-plan","el-platanal","el-plateado-de-joaquin-amaro","el-pochotal","el-polvorin","el-portal","el-porvenir","el-porvenir-agrarista","el-porvenir-de-velasco-suarez","el-porvenir-i","el-potrero","el-potrero-de-san-diego","el-potrero-de-sataya","el-pozo","el-pozole","el-progreso","el-progreso-hidalgo","el-pueblito","el-pueblito-garbanzal","el-puerto","el-puerto-magu","el-puesto","el-quelite","el-quince","el-ramal-porvenir","el-ranchito","el-rancho","el-rayo","el-realito","el-recodo","el-recodo-de-san-jose-axalco","el-recreo","el-refugio","el-refugio-de-los-sauces","el-refugio-de-penuelas","el-remolino","el-reno","el-retiro","el-rincon","el-rincon-citlaltepetl","el-rincon-de-la-candelaria","el-rincon-de-los-perales","el-rio","el-roble","el-rodeo","el-romereno-infonavit","el-rosal","el-rosario","el-rosario-de-arriba","el-rucio","el-sabino","el-sacrificio","el-sahuaral","el-saladito","el-salero","el-salitre","el-salto","el-salto-de-espejo","el-salto-de-eyipantla","el-salvador","el-saneal","el-saucillo","el-saucillo-fraccionamiento","el-saucito-el-horno","el-sauz","el-sauz-de-abajo","el-sauz-el-sauz-de-villasenor","el-sauzal-de-rodriguez","el-segundo","el-sibal","el-silencio","el-sitio","el-siviral-jigica","el-sobrante","el-suchil","el-susto","el-tamarindo","el-tecolote","el-tecuan","el-tejar","el-tejocote","el-tejocote-el-domingo","el-tepetatal","el-tepetate","el-tepeyac","el-tephe","el-tequesquite","el-terrero","el-ticui","el-tigre","el-tintal","el-tizate","el-tortuguero","el-trapiche","el-triunfo","el-triunfo-1ra-seccion-cardona","el-tuito","el-tular","el-tule","el-tulin","el-tumbo","el-tunal","el-tzay","el-vado-de-san-pedro","el-valle-de-arroyo-seco","el-varal","el-vegil","el-veladero","el-venado","el-verano","el-verde","el-vergel","el-vicarlo","el-volador","el-walamo","el-zapotal","el-zapote","el-zapote-bravo","el-zapotillo","ela","elabra","elacebuche","elaguacatal","elaguacate","elaguajito","elaguila","elaguilalamesa","elahuacate","elalvareno","elambar","elambarelambardeecheverria","elanono","elarador","elarco","elarenal","elba","elbajio","elbajiolalaguna","elbarrido","elbarril","elbarriodelasoledad","elbejuco","elbellotemigueldelamadrid","elberta","elberton","elbingu","elblanco","elbosque","elbotadero","elbow-lake","elbowlake","elboxtha","elbridge","elburn","elburrion","elc","elcabezon","elcabi","elcahulotedesantaana","elcajon","elcalvario","elcamalote","elcamaron","elcambio","elcaminoreal","elcampanarioyoradel","elcampo","elcanario","elcapomal","elcapulin","elcapulinlanuevapochota","elcapulolaquebradora","elcaracol","elcarmen","elcarmenaztama","elcarmeneldesiertodelcarmen","elcarmenellimon","elcarmenocotepec","elcarmenxalpatlahuaya","elcarreton","elcarrizal","elcarrizalito","elcarrizo","elcastillo","elcazadero","elcedro","elcenidor","elcenizo","elcenso","elcentenario","elcentro","elcereso","elcerrillovistahermosa","elcerrito","elcerritocorona","elcerro","elcerromission","elcesped","elchacal","elchante","elchauz","elchayote","elchico","elchinacoelpujido","elchocolate","elchote","elcid","elciervo","elciruelo","elcoacoyul","elcocuite","elcoecillo","elcolegio","elcolomo","elcolorado","elcoloso","elconchero","elconejo","elcongo","elconsuelo","elconsueloulapa","elcontaderodematamoros","elcontrol","elcopal","elcopalar","elcopalillo","elcopetillo","elcoporo","elcorcovado","elcorte","elcortes","elcortijo","elcoto","elcoyote","elcoyul","elcrucerodesantamaria","elcuenqueno","elcuerverocuerveros","elcuije","elcuitzillogrande","elcurtidor","elcuyo","eldc","eldersburg","eldiamantelaretranca","eldiez","eldivisador","eldm","eldon","eldora","eldorado","eldorado-at-santa-fe","eldoradoatsantafe","eldoradohills","eldoradosprings","eldridge","eldurazno","eleanor","electra","electric-city","electriccity","eleden","eleele","elembarcadero","elencanto","elencantodelcerril","elephant-butte","elephantbutte","elesclavo","elescobillo","elescondido","elescoplo","elescribano","elespejo","elespinal","elespinalillo","elestudiante","elfers","elfortin","elfresno","elfuerte","elfuertedelaunion","elgalaneno","elgallinero","elgallo","elgin","elgranada","elgrullo","elguaco","elguayabito","elguayabo","elh","elhabal","elhabillal","elhatito","elhielo","elhigo","elhigueral","elhuajote","elhuaracheelguarache","elhuaxtho","elhuerfano","elhuexco","elhuidero","elhuitusi","elhuixmi","elhuizache","elhumo","elida","elim","eliot","elizabeth","elizabeth-city","elizabethcity","elizabethton","elizabethtown","elizabethville","elj","eljabali","eljacal","eljaguey","eljaral","eljaralito","eljardin","eljazmin","eljebel","eljiadi","eljicaral","eljicote","eljobo","eljuile","elk-city","elk-creek","elk-grove","elk-grove-village","elk-plain","elk-point","elk-rapids","elk-ridge","elk-river","elk-run-heights","elkader","elkcity","elkcreek","elkford","elkfork","elkgrove","elkgrovevillage","elkhart","elkhorn","elkin","elkins","elkins-park","elkinspark","elkland","elko","elko-new-market","elkonewmarket","elkplain","elkpoint","elkrapids","elkridge","elkriver","elkrunheights","elkton","elkview","ell","ellago","ellampotal","ellargo","ellaurel","ellaville","ellencero","ellendale","ellensburg","ellenton","ellenville","ellequeitio","ellerbe","elletrero","ellettsville","ellicott","ellicott-city","ellicottcity","ellijay","ellimar","ellimon","ellimonar","ellimondelosramos","ellindero","ellington","ellinwood","elliot-lake","elliotlake","ellis","ellisburg","ellison","ellisville","elllanito","elllano","elllanodelcompromiso","elllanosantamaria","ellobo","elloretooccidental","ellport","ellsworth","ellucero","ellwood-city","ellwoodcity","elm","elm-city","elm-creek","elm-grove","elm-springs","elma","elma-center","elmacenter","elmaguey","elmagueyal","elmaluco","elmango","elmcity","elmcreek","elmendorf","elmendorf-air-force-base","elmendorfairforcebase","elmentidero","elmer","elmeson","elmetlapil","elmezquitillo","elmgrove","elmhurst","elmilagro","elmira","elmira-heights","elmirador","elmirage","elmiraheights","elmogote","elmolino","elmollejon","elmont","elmonte","elmoral","elmore","elmorenosanmiguelmoreno","elmorro","elms-old-rexdale","elmsford","elmsoldrexdale","elmsprings","elmuey","elmvale","elmwood","elmwood-park","elmwood-place","elmwoodpark","elmwoodplace","elnabo","elnacimiento","elnaranjillo","elnaranjito","elnaranjo","elnayar","elnigromante","elnilo","elnino","elnio","elnith","elnopal","elo","elobraje","elocotal","elocotito","elojuelo","elolvera","elon","elop","elorganal","eloro","elorodehidalgo","elotepec","eloxochitlan","eloxochitlan-de-flores-magon","eloxochitlandefloresmagon","eloy","elp","elpacayal","elpalacio","elpalmar","elpalmarcito","elpalmargrande","elpalmarsangabriel","elpalmito","elpanorama","elpapayo","elparacho","elparaiso","elparaisolacharca","elparedon","elparedoncito","elparral","elpaso","elpedregal","elpedregaldeguadalupehidalgo","elpenasco","elpericon","elperu","elpescadero","elpicacho","elpilar","elpino","elpinto","elpintor","elpitahayo","elpital","elplan","elplatanal","elplateadodejoaquinamaro","elpm","elpochotal","elpolvorin","elportal","elporvenir","elporveniragrarista","elporvenirdevelascosuarez","elporvenirelporvenirdearriba","elporveniri","elpotrero","elpotrerodesandiego","elpotrerodesataya","elpozo","elpozole","elprogreso","elprogresohidalgo","elpueblito","elpueblitogarbanzal","elpuerto","elpuertomagu","elpuesto","elq","elquelite","elquince","elramalporvenir","elranchito","elrancho","elrayo","elrealito","elrecodo","elrecododesanjoseaxalco","elrecreo","elrefugio","elrefugiodelossauces","elrefugiodepenuelas","elremolino","elreno","elretiro","elrincon","elrinconcitlaltepetl","elrincondelacandelaria","elrincondelosperales","elrinconsantacruzdelrincon","elrio","elroble","elrodeo","elromerenoinfonavit","elrosal","elrosario","elrosariodearriba","elroy","elrucio","els","elsa","elsabino","elsacrificio","elsahuaral","elsaladito","elsalero","elsalitre","elsalto","elsaltodeespejo","elsaltodeeyipantla","elsalvador","elsaneal","elsaucillo","elsaucillofraccionamiento","elsaucitoelhorno","elsauz","elsauzalderodriguez","elsauzdeabajo","elsauzelsauzdevillasenor","elsberry","elsegundo","elsibal","elsilencio","elsitio","elsiviraljigica","elsm","elsmere","elsobrante","elsuchil","elsusto","elsv","eltamarindo","eltecolote","eltecuan","eltejar","eltejocote","eltejocoteeldomingo","eltepetatal","eltepetate","eltepeyac","eltephe","eltequesquite","elterrero","elticui","eltigre","eltingville","eltintal","eltizate","elton","eltortuguero","eltrapiche","eltriunfo","eltriunfo1raseccioncardona","eltriunfodelastresmaravillas","eltuito","eltular","eltule","eltulin","eltumbo","eltunal","eltzay","elvadodesanpedro","elvalledearroyoseco","elvaral","elvaralsansebastiannumerouno","elvegil","elveladero","elvenado","elverano","elverde","elvergel","elverson","elverta","elvicarlo","elvins","elvolador","elwalamo","elwood","ely","elyria","elysburg","elzapotal","elzapote","elzapotebravo","elzapotillo","em","ema","emancipacion-quetzalapa","emancipacionquetzalapa","emdo","emerald-isle","emerald-lake-hills","emerald-lakes","emerald-mountain","emeraldisle","emeraldlakehills","emeraldlakes","emeraldmountain","emerson","emerson-hill","emersonhill","emeryville","emigsville","emiliano-zapata","emiliano-zapata-casahuates","emiliano-zapata-el-ranchito","emiliano-zapata-san-jose-bata","emiliano-zapata-santo-domingo","emilianozapata","emilianozapatacasahuates","emilianozapataelranchito","emilianozapatasanjosebata","emilianozapatasantodomingo","emilio-carranza","emilio-carranza-santa-cruz","emilio-portes-gil","emiliocarranza","emiliocarranzasantacruz","emilioportesgil","eminence","emmaus","emmetsburg","emmett","emmitsburg","emory","empalme","empalme-escobedo","empalmeescobedo","empaque-tarriba","empaquetarriba","empire","emporia","emporium","emsworth","en","encantada-ranchito-el-calaboz","encantadaranchitoelcalaboz","encanto","encarnacion-de-diaz","encarnaciondediaz","enchanted-hills","enchanted-lake","enchantedhills","enchantedlake","encinal-colorado","encinalcolorado","encinitas","encino","enderby","endicott","endwell","energy","enetai","enfield","england","englehart","englemount-lawrence","englemountlawrence","englewood","englewood-cliffs","englewoodcliffs","english","english-corner","englishcorner","englishtown","enhaut","enid","enigma","enl","enlow","enm","ennis","enoch","enochville","enola","enon","enosburg-falls","enosburgfalls","enramadas","enrique-estrada","enriqueestrada","ensenada","ensley","entabladero","enterprise","enthavi","entiat","entronquedematehualaelhuizache","entronquelaredosalinasvictoria","enumclaw","eny","eo","eoda","eodh","eol","eor","ep","epa","epazoyucan","epda","epds","epg","eph","ephraim","ephrata","epi","epigmenio-gonzalez","epigmeniogonzalez","epitacio-huerta","epitaciohuerta","epkl","eplc","epm","epo","epping","epsg","epsom","epworth","eq","eqr","er","erath","erc","erd","erda","erdp","erec","erh","eri","erick","erie","erin","eringate-centennial-west-deane","eringatecentennialwestdeane","erlands-point-kitsap-lake","erlandspointkitsaplake","erlanger","erma","ermita-de-guadalupe","ermitadeguadalupe","erongaricuaro","erp","ersd","erving","erwin","erwinville","es","esc","escaleras","escalerilla-lagunas","escalerillalagunas","escalerillas","escalon","escambia","escamillas","escanaba","escarcega","escatawpa","escobares","escobedo","escolasticas","escolin-de-olarte","escolindeolarte","escondido","escuadron-doscientos-uno","escuadrondoscientosuno","escuinapa","escuintla","esd","esda","esde","esdr","ese","eseh","esf","esfuerzos-unidos","esfuerzosunidos","esg","esj","esjx","eskasoni-3","eskasoni3","esko","esl","eslc","esm","esmeralda","espanita","espanola","esparto","esperance","esperanza","espinal","espita","espy","esqueda","esquimalt","essex","essex-fells","essex-junction","essex-village","essexfells","essexjunction","essexvillage","essexville","estacada","estacion-bamoa","estacion-camacho","estacion-capomas","estacion-chimaneco","estacion-coahuila","estacion-conchos","estacion-consuelo","estacion-corral","estacion-corralejo","estacion-de-apulco","estacion-de-san-francisco","estacion-dobladero","estacion-huehuetan","estacion-joaquin","estacion-juanita","estacion-la-piedad","estacion-llano","estacion-mogone","estacion-obispo","estacion-penjamo","estacion-pescaderos","estacion-querendaro","estacion-rosales","estacion-san-jose","estacion-san-manuel","estacion-santa-engracia","estacion-tamuin","estacion-tuzantan","estacion-zamora","estacionbamoa","estacioncamacho","estacioncapomas","estacionchimaneco","estacioncoahuila","estacionconchos","estacionconsuelo","estacioncorral","estacioncorralejo","estaciondeapulco","estaciondesanfrancisco","estaciondobladero","estacionhuehuetan","estacionjoaquin","estacionjuanita","estacionlapiedad","estacionllano","estacionmogone","estacionobispo","estacionpenjamo","estacionpescaderos","estacionquerendaro","estacionrosales","estacionsanjose","estacionsanmanuel","estacionsantaengracia","estaciontamuin","estaciontuzantan","estacionzamora","estado-de-mexico","estadodemexico","estancia","estancia-de-animas","estancia-de-guadalupe","estancia-del-llano","estanciadeanimas","estanciadeguadalupe","estanciadelllano","estanzuela","estanzuela-de-romero","estanzueladeromero","estapilla","estell-manor","estelle","estellmanor","ester","esterhazy","estero","estero-de-milpas","estero-del-idolo","esterodelidolo","esterodemilpas","esteros","estes-park","estespark","estevan","esther","estherville","estill","estill-springs","estillsprings","estipa","estrada","estrella-de-belen","estrelladebelen","et","etchojoa","etchoropo","eted","ethete","etna","etobicoke","etobicoke-west-mall","etobicokewestmall","etowah","ettrick","etucuaro","etzatlan","eu","euan","eucalyptus-hills","eucalyptushills","euclid","eudora","eufaula","eugene","euharlee","euless","eunice","eupora","eureka","eureka-de-media-luna-eureka","eureka-mill","eureka-springs","eureka-y-belen","eurekademedialunaeureka","eurekamill","eurekasprings","eurekaybelen","eustis","eutaw","ev","evadale","evans","evans-city","evansburg","evanscity","evansdale","evanston","evansville","evart","evc","eveleth","evendale","everett","evergreen","evergreen-park","evergreenpark","everman","everson","evg","ew","ewa-beach","ewa-gentry","ewa-villages","ewabeach","ewagentry","ewavillages","ewb","ewing","ewm","ex-hacienda-de-guadalupe","ex-hacienda-de-xalpa","ex-hacienda-del-copal","ex-hacienda-el-hospital","ex-hacienda-la-concepcion","ex-hacienda-santa-ines","ex-rancho-san-dimas","ex-vinedos-guadalupe","excelsior","excelsior-springs","excelsiorsprings","excola","exeter","exhaciendadeguadalupe","exhaciendadelcopal","exhaciendadexalpa","exhaciendaelhospital","exhaciendalaconcepcion","exhaciendasantaines","exmore","experiment","exranchosandimas","exton","exvinedosguadalupe","ey","eyb","eyota","ez","ezb","ezc","ezequiel-montes","ezequielmontes","ezer","ezsd","fa","fabens","fabrica-concepcion","fabrica-de-melchor","fabricaconcepcion","fabricademelchor","factoryville","fafb","fair-grove","fair-haven","fair-lawn","fair-oaks","fair-oaks-ranch","fair-plain","fairbank","fairbanks","fairbanks-ranch","fairbanksranch","fairborn","fairburn","fairbury","fairchance","fairchild-air-force-base","fairchildairforcebase","fairchilds","fairdale","fairfax","fairfax-station","fairfaxstation","fairfield","fairfield-bay","fairfield-beach","fairfield-glade","fairfield-harbour","fairfield-heights","fairfieldbay","fairfieldbeach","fairfieldglade","fairfieldharbour","fairfieldheights","fairforest","fairgrove","fairhaven","fairhope","fairland","fairlawn","fairlea","fairless-hills","fairlesshills","fairmead","fairmont","fairmont-city","fairmontcity","fairmount","fairmount-heights","fairmountheights","fairoaks","fairoaksranch","fairplain","fairplains","fairplay","fairport","fairport-harbor","fairportharbor","fairton","fairview","fairview-ferndale","fairview-heights","fairview-park","fairview-shores","fairviewferndale","fairviewheights","fairviewpark","fairviewshores","fairway","fairwinds","fairwood","faja-de-oro","fajadeoro","falcon-heights","falcon-lake-estates","falconer","falconheights","falconlakeestates","falfurrias","falher","falkville","fall-branch","fall-city","fall-creek","fall-river","fallbranch","fallbrook","fallcity","fallcreek","falling-water","fallingbrook","fallingwater","fallon","fallriver","falls-church","falls-city","falls-creek","fallsburg","fallschurch","fallscity","fallscreek","fallston","falmouth","falmouth-foreside","falmouthforeside","faneuil","fannett","fanwood","far-rockaway","fargo","faribault","farley","farm-loop","farmer-city","farmercity","farmers-branch","farmers-loop","farmersbranch","farmersburg","farmersloop","farmersville","farmerville","farmingdale","farmington","farmington-hills","farmingtonhills","farmingville","farmland","farmloop","farmville","farnham","farr-west","farragut","farrell","farrington","farrockaway","farrwest","farwell","fasr","fate","faulkton","faxon","fayette","fayetteville","fb","fba","fc","fcd","fcds","fch","fcn","fco","fcos","fcp","fcs","fcu","fcy","fd","fdc","fdl","fdlf","fdm","fdmt","fdo","fdp","fdv","fe","fearrington-village","fearringtonvillage","feasterville","feather-sound","feathersound","federal-heights","federal-way","federalheights","federalsburg","federalway","fehc","felida","felipe-angeles","felipe-carrillo-puerto","felipe-neri-cuatepec","felipeangeles","felipecarrillopuerto","felipenericuatepec","fellsburg","fellsmere","felton","fennimore","fennville","fenton","fenwaykenmore","ferdinand","fergus","fergus-falls","fergusfalls","ferguson","ferme-neuve","fermeneuve","fermin-rabadan-cervantes","ferminrabadancervantes","fermont","fern-acres","fern-creek","fern-forest","fern-park","fern-prairie","fernacres","fernandina-beach","fernandinabeach","ferncreek","ferndale","fernforest","fernie","fernley","fernpark","fernprairie","fernway","ferriday","ferris","ferrisburgh","ferron","ferrum","ferry-pass","ferrypass","ferrysburg","fessenden","festus","fettershotspringsaguacaliente","ff","ffc","fg","fglp","fgt","fh","fhdb","fhn","fhs","fi","fife","fife-heights","fifeheights","fifth-street","fifthstreet","filer","fillmore","filomeno-mata","filomenomata","fim","financial-district","financialdistrict","fincastle","finderne","findlay","finley","finneytown","fir","fircrest","firebaugh","firestone","firing-range","firingrange","first-mesa","firstmesa","firthcliffe","fish-hawk","fish-lake","fisher","fishers","fishersville","fishhawk","fishhook","fishkill","fishlake","fishtown","fiskdale","fitchburg","fitzgerald","fitzwilliam","five-corners","five-forks","five-points","fivecorners","fiveforks","fivepoints","fivepointville","fjm","fk","fl","fla","flagami","flagler-beach","flagler-estates","flaglerbeach","flaglerestates","flagstaff","flanagan","flanders","flandreau","flat-river","flat-rock","flatbush","flatlands","flatonia","flatriver","flatrock","flatwoods","flda","fle","fleetwood","fleming-island","flemingdon-park","flemingdonpark","flemingisland","flemingsburg","flemington","fletcher","flf","flh","flin-flon","flinflon","flint","flint-city","flintcity","flippin","fll","flm","fln","flomaton","flor-azul","flor-batavia","flor-de-cacao","flora","flora-vista","floral-city","floral-park","florala","floralcity","floralpark","floravista","florazul","florbatavia","flordecacao","florence","florence-graham","florencegraham","florenceville-bristol","florencevillebristol","florencia","floresville","florham-park","florhampark","florida","florida-city","florida-ridge","floridacity","floridaridge","florin","floris","florissant","flossmoor","flourtown","flower-hill","flower-mound","flowerhill","flowermound","flowery-branch","flowerybranch","flowing-wells","flowingwells","flowood","floyd","floydada","flp","flt","flushing","flv","flw","flying-hills","flyinghills","fm","fmb","fmdv","fmi","fmo","fms","fn","fnc","fo","foam-lake","foamlake","fobes-hill","fobeshill","fod","fogo-island","fogoisland","foh","folcroft","foley","folkston","follansbee","folly-beach","follybeach","folsom","fond-du-lac","fonda","fonddulac","fontana","fontezuelas","foothill-farms","foothill-ranch","foothillfarms","foothillranch","for","ford-city","ford-heights","ford-island","fordcity","fordham","fordheights","fordisland","fords","fords-prairie","fordsprairie","fordyce","forest","forest-acres","forest-city","forest-glen","forest-grove","forest-heights","forest-hill","forest-hill-north","forest-hill-south","forest-hills","forest-lake","forest-meadows","forest-oaks","forest-park","forest-ranch","forestacres","forestbrook","forestcity","forestdale","forestglen","forestgrove","forestheights","foresthill","foresthillnorth","foresthills","foresthillsouth","forestlake","forestmeadows","forestoaks","forestpark","forestranch","forestville","forjadores-de-pachuca","forjadoresdepachuca","forked-river","forkedriver","forks","forman","forney","forrest","forrest-city","forrestcity","forreston","forsyth","fort-ashby","fort-atkinson","fort-belknap-agency","fort-belvoir","fort-bend","fort-benton","fort-bliss","fort-bragg","fort-branch","fort-campbell-north","fort-carson","fort-cavazos","fort-clark-springs","fort-collins","fort-coulonge","fort-covington-hamlet","fort-davis","fort-defiance","fort-deposit","fort-dick","fort-dix","fort-dodge","fort-drum","fort-edward","fort-erie","fort-fairfield","fort-frances","fort-gaines","fort-george-g-mead-junction","fort-gibson","fort-hall","fort-hamilton","fort-hancock","fort-hunt","fort-irwin","fort-kent","fort-knox","fort-lauderdale","fort-lee","fort-leonard-wood","fort-loramie","fort-lupton","fort-macleod","fort-madison","fort-mckinley","fort-mcmurray","fort-meade","fort-mill","fort-mitchell","fort-montgomery","fort-morgan","fort-myers","fort-myers-beach","fort-myers-shores","fort-nelson","fort-novosel","fort-oglethorpe","fort-payne","fort-pierce","fort-pierce-north","fort-pierce-south","fort-pierre","fort-plain","fort-polk-north","fort-polk-south","fort-recovery","fort-riley-north","fort-salonga","fort-saskatchewan","fort-scott","fort-shafter","fort-shawnee","fort-smith","fort-st-john","fort-stewart","fort-stockton","fort-sumner","fort-thomas","fort-thompson","fort-totten","fort-valley","fort-wadsworth","fort-walton-beach","fort-washakie","fort-washington","fort-wayne","fort-worth","fort-wright","fort-yates","fortashby","fortatkinson","fortbelknapagency","fortbelvoir","fortbend","fortbenton","fortbliss","fortbragg","fortbranch","fortcampbellnorth","fortcarson","fortcavazos","fortclarksprings","fortcollins","fortcoulonge","fortcovingtonhamlet","fortdavis","fortdefiance","fortdeposit","fortdick","fortdix","fortdodge","fortdrum","fortedward","forterie","fortfairfield","fortfrances","fortgaines","fortgeorgegmeadjunction","fortgibson","forthall","forthamilton","forthancock","forthunt","fortin-de-las-flores","fortindelasflores","fortirwin","fortkent","fortknox","fortlauderdale","fortlee","fortleonardwood","fortloramie","fortlupton","fortmacleod","fortmadison","fortmckinley","fortmcmurray","fortmeade","fortmill","fortmitchell","fortmontgomery","fortmorgan","fortmyers","fortmyersbeach","fortmyersshores","fortnelson","fortnovosel","fortoglethorpe","fortpayne","fortpierce","fortpiercenorth","fortpiercesouth","fortpierre","fortplain","fortpolknorth","fortpolksouth","fortrecovery","fortrileynorth","fortsalonga","fortsaskatchewan","fortscott","fortshafter","fortshawnee","fortsmith","fortstewart","fortstjohn","fortstockton","fortsumner","fortthomas","fortthompson","forttotten","fortuna","fortuna-foothills","fortunafoothills","fortvalley","fortville","fortwadsworth","fortwaltonbeach","fortwashakie","fortwashington","fortwayne","fortworth","fortwright","forty-fort","fortyates","fortyfort","foscoe","fossambault-sur-le-lac","fossambaultsurlelac","fossil","fosston","foster","foster-brook","foster-city","fosterbrook","fostercity","fostoria","fountain","fountain-green","fountain-hill","fountain-hills","fountain-inn","fountain-valley","fountainebleau","fountaingreen","fountainhead-orchard-hills","fountainheadorchardhills","fountainhill","fountainhills","fountaininn","fountainvalley","four-corners","four-oaks","four-seasons","fourcorners","fouroaks","fourseasons","fowler","fowlerville","fox-chapel","fox-chase","fox-creek","fox-farm-college","fox-island","fox-lake","fox-lake-hills","fox-point","fox-river-grove","fox-run","foxborough","foxchapel","foxchase","foxcreek","foxfarmcollege","foxisland","foxlake","foxlakehills","foxpoint","foxrivergrove","foxrun","fp","fpds","fpn","fpr","fps","fr","fraccion-milpillas","fraccion-san-roque-el-prieto","fraccionamiento-ciudad-olmeca","fraccionamiento-ciudad-yagul","fraccionamiento-costa-dorada","fraccionamiento-del-valle","fraccionamiento-la-florida","fraccionamiento-la-mezquitera","fraccionamiento-la-noria","fraccionamiento-la-trinidad","fraccionamiento-la-virgen","fraccionamiento-las-fuentes","fraccionamiento-las-liebres","fraccionamiento-los-alamos","fraccionamiento-los-angeles","fraccionamiento-los-prados","fraccionamiento-metropolis-ii","fraccionamiento-monte-olivo","fraccionamiento-paraiso-real","fraccionamiento-real-del-valle","fraccionamiento-real-palmas","fraccionamiento-san-miguel","fraccionamiento-santa-cruz","fraccionamiento-universo","fraccionamiento-valle-dorado","fraccionamiento-villa-jardin","fraccionamientociudadolmeca","fraccionamientociudadyagul","fraccionamientocolinasdelsol","fraccionamientocostadorada","fraccionamientodelvalle","fraccionamientolaflorida","fraccionamientolamezquitera","fraccionamientolanoria","fraccionamientolasfuentes","fraccionamientolasliebres","fraccionamientolatrinidad","fraccionamientolavirgen","fraccionamientolomasdeahuatlan","fraccionamientolosalamos","fraccionamientolosangeles","fraccionamientolosprados","fraccionamientometropolisii","fraccionamientomisiondelvalle","fraccionamientomonteolivo","fraccionamientoparaisoreal","fraccionamientoprivadasdelsol","fraccionamientorealdelvalle","fraccionamientorealdesanpablo","fraccionamientorealpalmas","fraccionamientosanmiguel","fraccionamientosantacruz","fraccionamientouniverso","fraccionamientovalledorado","fraccionamientovillajardin","fraccionamientovillasdelallave","fraccionmilpillas","fraccionsanroqueelprieto","frackville","framingham","framingham-center","framinghamcenter","francestown","francis","francisco-i-madero","francisco-ibarra-ramos","francisco-ignacio-madero","francisco-javier-mina","francisco-rueda","francisco-sarabia","francisco-serrato-san-bartolo","francisco-villa","francisco-zarco","franciscoibarraramos","franciscoignaciomadero","franciscoimadero","franciscojaviermina","franciscorueda","franciscosarabia","franciscosarabiacerritopelon","franciscoserratosanbartolo","franciscovilla","franciscozarco","francisville","franco","franco-tavera","franconia","francotavera","frankenmuth","frankford","frankfort","frankfort-square","frankfortsquare","franklin","franklin-center","franklin-furnace","franklin-lakes","franklin-park","franklin-springs","franklin-square","franklincenter","franklinfurnace","franklinlakes","franklinpark","franklinsprings","franklinsquare","franklinton","franklinville","frankston","franksville","frankton","fraser","frazee","frazeysburg","frazier-park","frazierpark","frc","frdv","fredepo","frederic","frederick","fredericksburg","frederickson","fredericktown","fredericton","fredonia","freeburg","freedom","freehold","freeland","freeman","freemansburg","freeport","freer","freetown","fremont","french-camp","french-creek","french-island","french-lick","french-settlement","frenchburg","frenchcamp","frenchcreek","frenchisland","frenchlick","frenchsettlement","frenchtown","frenchville","fresh-meadows","freshmeadows","fresnillo","fresno","fresno-nichi","fresnonichi","frewsburg","frg","friars-point","friarspoint","frias","friday-harbor","fridayharbor","fridley","friedens","friend","friendly","friendship","friendship-village","friendshipvillage","friendswood","friona","frisco","frisco-city","friscocity","fritch","fritz-creek","fritzcreek","frn","front-royal","frontenac","frontera","frontera-corozal","frontera-hidalgo","fronteracorozal","fronterahidalgo","fronteras","frontroyal","frostburg","frostproof","frp","fruit-cove","fruit-heights","fruit-hill","fruita","fruitcove","fruitdale","fruitheights","fruithill","fruitland","fruitland-park","fruitlandpark","fruitport","fruitridge-pocket","fruitridgepocket","fruitvale","fruitville","fryeburg","fs","fsc","fscp","fsj","fsll","fsm","fssb","ft","fu","fuentes-del-valle","fuentesdelvalle","fuentezuelas","fulda","fuller-heights","fullerheights","fullerton","fulshear","fulton","fultondale","fundy-bay","fundybay","funny-river","funnyriver","fuquay-varina","fuquayvarina","fussels-corner","fusselscorner","fv","fvd","fvdg","fvj","fw","fwb","fy","fyffe","fz","ga","gabino-barreda","gabinobarreda","gabriel-esquinca","gabriel-hernandez-mancinas","gabriel-leyva-velazquez","gabrielesquinca","gabrielhernandezmancinas","gabrielleyvasolanozapotillodos","gabrielleyvavelazquez","gachupines","gadsden","gaf","gafb","gaffney","gage-park","gagepark","gages-lake","gageslake","gahanna","gail","gainesboro","gainesville","gaithersburg","galax","galaxia-bonito-jalisco","galaxia-la-calera","galaxia-la-noria","galaxiabonitojalisco","galaxialacalera","galaxialanoria","galaxias-toluca","galaxiastoluca","galeana","galecio-narcia","galecionarcia","galena","galena-park","galenapark","galerade-panales","galeradepanales","galeras","gales-ferry","galesburg","galesferry","galesville","galeton","galeville","galindo","galion","gallatin","galliano","gallipolis","gallitzin","gallup","galt","galva","galveston","gam","gambara","gambier","gambino","gambo","gambrills","gameti","gamewell","ganado","gananoque","gander","gandho","gandy","gang-mills","ganges","gangmills","gantt","ganzda","gap","garcia","garden-acres","garden-city","garden-city-park","garden-city-south","garden-court","garden-grove","garden-home-whitford","garden-ridge","garden-view","gardena","gardenacres","gardencity","gardencitypark","gardencitysouth","gardencourt","gardendale","gardengrove","gardenhomewhitford","gardenridge","gardenview","gardere","gardiner","gardner","gardnertown","gardnerville","gardnerville-ranchos","gardnervilleranchos","garfield","garfield-heights","garfieldheights","gargantillo","garland","garner","garnet","garnett","garretson","garrett","garrett-park","garrettpark","garrettsville","garrison","garwood","gary","garyville","gas-city","gasca","gascity","gasj","gaspe","gasport","gasr","gassville","gaston","gastonia","gastonville","gate-city","gatecity","gates-mills","gates-north-gates","gatesmills","gatesnorthgates","gatesville","gateway","gatineau","gatlinburg","gautier","gavia-de-rionda","gaviaderionda","gaviotas-sur-el-cedral","gaviotassurelcedral","gaylord","gb","gbc","gbj","gc","gcc","gcp","gcs","gcv","gd","gda","gdb","gdl","gdm","gdo","gdpb","gdr","gdsc","gdt","ge","gearhart","geary","gee","geistown","genaro-codina","genaro-estrada","genarocodina","genaroestrada","general-alatriste-san-joaquin","general-andres-figueroa","general-angel-flores-la-palma","general-bravo","general-calixto-contreras","general-cepeda","general-enrique-estrada","general-francisco-villa","general-ignacio-zaragoza","general-juan-jose-rios","general-lazaro-cardenas","general-miguel-aleman","general-panfilo-natera","general-pascual-fentes","general-pedro-maria-anaya","general-simon-bolivar","general-trevino","general-zaragoza","general-zuazua","generalalatristesanjoaquin","generalandresfigueroa","generalangelfloreslapalma","generalbravo","generalcalixtocontreras","generalcepeda","generalenriqueestrada","generalfelipeangeleslosangeles","generalfranciscovilla","generalignaciozaragoza","generaljuanjoserios","generallaurogcalocaelrascon","generallazarocardenas","generalmiguelaleman","generalpanfilonatera","generalpascualfentes","generalpedromariaanaya","generalsimonbolivar","generaltrevino","generalzaragoza","generalzuazua","genesee","geneseo","geneva","geneva-on-the-lake","genevaonthelake","genoa","genoa-city","genoacity","genola","gentry","george","george-west","georgetown","georgewest","georgia","georgiana","geovillaslaurelesdelcampanario","gerald","gerber","gering","germantown","germantown-hills","germantownhills","geronimo","gervais","gettysburg","gf","gfn","gfv","gfw","gg","ggc","gge","gh","ghcc","ghm","gholson","ghw","gi","gibbon","gibbons","gibbsboro","gibbstown","gibraltar","gibson","gibson-city","gibsonburg","gibsoncity","gibsonia","gibsons","gibsonton","gibsonville","giddings","gideon","gifford","gig-harbor","gigharbor","gila","gila-bend","gilabend","gilbert","gilbert-creek","gilbertcreek","gilberto-camacho","gilbertocamacho","gilberts","gilbertsville","gilcrest","gildardo-magana-los-angeles","gildardomaganalosangeles","gilford","gilita","gill","gillespie","gillett","gillette","gilman","gilmanton","gilmer","gilroy","gimli","girard","girard-estate","girardestate","girardville","girdwood","giz","gj","gjh","gjjr","gjoa-haven","gjoahaven","gk","gkl","gl","glace-bay","glacebay","glade-spring","gladespring","gladeview","gladewater","gladstone","gladwin","glandorf","glasco","glasford","glasgow","glasgow-village","glasgowvillage","glassboro","glassmanor","glassport","glastonbury","glastonbury-center","glastonburycenter","glc","gldc","gleason","gleed","glen-allen","glen-alpine","glen-avon","glen-burnie","glen-carbon","glen-cove","glen-ellyn","glen-gardner","glen-head","glen-lyon","glen-oaks","glen-raven","glen-ridge","glen-rock","glen-rose","glen-willow","glenallen","glenalpine","glenarden","glenavon","glenburnie","glencarbon","glencoe","glencove","glendale","glendale-heights","glendaleheights","glendive","glendora","gleneagle","glenellyn","glenfield-jane-heights","glenfieldjaneheights","glengardner","glenhead","glenlyon","glenmont","glenmoor","glenmora","glenmore","glenn","glenn-dale","glenn-heights","glenndale","glennheights","glenns-ferry","glennsferry","glennville","glenoaks","glenolden","glenpool","glenraven","glenridge","glenrock","glenrose","glens-falls","glens-falls-north","glensfalls","glensfallsnorth","glenshaw","glenside","glenvar-heights","glenvarheights","glenview","glenville","glenwillow","glenwood","glenwood-city","glenwood-landing","glenwood-springs","glenwoodcity","glenwoodlanding","glenwoodsprings","glidden","glide","gln","globe","gloucester","gloucester-city","gloucester-courthouse","gloucester-point","gloucestercity","gloucestercourthouse","gloucesterpoint","glouster","gloversville","gloverville","glv","glyndon","gm","gma","gmla","gn","gnadenhutten","gnd","gne","gng","gnp","go","gobernador-cruz","gobernadorcruz","gobernadores","goddard","godefroy","goderich","godfrey","godley","goffstown","golconda","gold-bar","gold-beach","gold-camp","gold-canyon","gold-hill","gold-key-lake","gold-river","goldbar","goldbeach","goldcamp","goldcanyon","golden","golden-beach","golden-gate","golden-glades","golden-grove","golden-hills","golden-meadow","golden-shores","golden-triangle","golden-valley","goldenbeach","goldendale","goldengate","goldenglades","goldengrove","goldenhills","goldenmeadow","goldenrod","goldens-bridge","goldensbridge","goldenshores","goldentriangle","goldenvalley","goldfield","goldhill","goldkeylake","goldriver","goldsboro","goldsby","goldthwaite","goleta","golf-manor","golfmanor","golfo-de-santa-clara","golfodesantaclara","goliad","gomez-farias","gomez-palacio","gomez-poniente","gomezfarias","gomezpalacio","gomezponiente","gonzales","gonzales-ortega","gonzalesortega","gonzalez","gonzalez-ortega","gonzalezortega","goochland","good-hope","goodhope","goodhue","gooding","goodings-grove","goodingsgrove","goodland","goodlettsville","goodman","goodrich","goodview","goodwater","goodwell","goodyear","goose-creek","goosecreek","gordo","gordon","gordon-heights","gordonheights","gordonsville","goreville","gorham","gorman","goros-numero-dos","gorosnumerodos","goshen","gosnell","gotha","gothenburg","gotl","goulding","goulds","gouldsboro","gouverneur","gove","gowanda","gower","gp","gpe","gpf","gpma","gpn","gpp","gps","gpw","gq","gr","grabill","graceville","graciano-sanchez","gracianosanchez","grafton","graham","grain-valley","grainvalley","grajales","grambling","gramercy","gramercy-park","gramercypark","gran-morelos","granada","granadas","granadillas-la-colonia","granadillaslacolonia","granados","granbury","granby","grand-bank","grand-bay","grand-bayou-mobile-home-park","grand-blanc","grand-boulevard","grand-canyon","grand-canyon-village","grand-centre","grand-coulee","grand-falls-windsor","grand-forks","grand-forks-air-force-base","grand-haven","grand-island","grand-isle","grand-junction","grand-ledge","grand-marais","grand-meadow","grand-mound","grand-point","grand-prairie","grand-rapids","grand-ronde","grand-saline","grand-terrace","grandbank","grandbay","grandbayoumobilehomepark","grandblanc","grandboulevard","grandcanyon","grandcanyonvillage","grandcentre","grandcoulee","grande-cache","grande-digue","grande-prairie","grandecache","grandedigue","grandeprairie","grandfallswindsor","grandforks","grandforksairforcebase","grandhaven","grandisland","grandisle","grandjunction","grandledge","grandmarais","grandmeadow","grandmound","grandpoint","grandprairie","grandrapids","grandronde","grandsaline","grandterrace","grandview","grandview-heights","grandview-plaza","grandviewheights","grandviewplaza","grandville","grandwood-park","grandwoodpark","grandyle-village","grandylevillage","granger","grangeville","granite","granite-bay","granite-city","granite-falls","granite-hills","granite-quarry","granite-shoals","granitebay","granitecity","granitefalls","granitehills","granitequarry","graniteshoals","graniteville","granjas-ampliacion-santa-rosa","granjasampliacionsantarosa","granjenal","granmorelos","grant","grant-city","grant-park","grant-valkaria","grantcity","grantham","grantley","grantpark","grants","grants-pass","grantsburg","grantspass","grantsville","grantvalkaria","grantville","granville","granville-south","granvillesouth","grape-creek","grapecreek","grapeland","grapevine","grasonville","grass-lake","grass-valley","grasslake","grassvalley","graton","gravel-ridge","gravelbourg","gravelridge","gravenhurst","gravesend","gravette","gray","gray-summit","grayling","graymoor-devondale","graymoordevondale","grays-ferry","graysferry","grayshabor","grayslake","grayson","grayson-valley","graysonvalley","graysummit","graysville","grayville","great-barrington","great-bend","great-falls","great-kills","great-neck","great-neck-estates","great-neck-gardens","great-neck-plaza","great-river","greatbarrington","greatbend","greater-grand-crossing","greater-lakeburn","greater-napanee","greater-northdale","greater-sudbury","greater-upper-marlboro","greatergrandcrossing","greaterlakeburn","greaternapanee","greaternorthdale","greatersudbury","greateruppermarlboro","greatfalls","greatkills","greatneck","greatneckestates","greatneckgardens","greatneckplaza","greatriver","greatwood","greece","greeley","green","green-acres","green-bay","green-cove-springs","green-forest","green-harbor-cedar-crest","green-haven","green-hill","green-island","green-knoll","green-lake","green-level","green-meadows","green-oaks","green-park","green-river","green-rock","green-springs","green-tree","green-valley","green-valley-farms","greenacres","greenacres-city","greenacrescity","greenback","greenbay","greenbelt","greenbriar","greenbrier","greenburgh","greenbush","greencastle","greencovesprings","greendale","greene","greene-village","greenevillage","greeneville","greenfield","greenfields","greenforest","greenharborcedarcrest","greenhaven","greenhill","greenhills","greenisland","greenknoll","greenlake","greenland","greenlawn","greenlee","greenlevel","greenmeadows","greenoaks","greenock","greenpark","greenpoint","greenport","greenport-west","greenportwest","greenriver","greenrock","greensboro","greensburg","greensprings","greenstone","greentown","greentree","greenup","greenvale","greenvalley","greenvalleyfarms","greenville","greenwich","greenwood","greenwood-coxwell","greenwood-lake","greenwood-village","greenwoodcoxwell","greenwoodlake","greenwoodvillage","greer","gregorio-mendez","gregoriomendez","gregory","greilickville","grenada","gresham","gresham-park","greshampark","gretna","greybull","gridley","griffin","griffith","grifton","griggsville","grill","grimes","grimsby","grimshaw","grimsley","grinnell","grissom-air-force-base","grissomairforcebase","gro","groesbeck","grosse-ile","grosse-pointe","grosse-pointe-farms","grosse-pointe-park","grosse-pointe-shores","grosse-pointe-woods","grosseile","grossepointe","grossepointefarms","grossepointepark","grossepointeshores","grossepointewoods","groton","grottoes","grove","grove-city","grove-hall","grove-hill","grovecity","grovehall","grovehill","groveland","groveport","grover-beach","groverbeach","groves","groveton","grovetown","groveville","gruetli-laager","gruetlilaager","grundy","grundy-center","grundycenter","grunthal","gruver","grymes-hill","grymeshill","gs","gsa","gsb","gsec","gt","gu","gua","guacamayas","guachinango","guachochi","guadalajara","guadalcazar","guadalupe","guadalupe-buenavista","guadalupe-cachi","guadalupe-calderon","guadalupe-cote","guadalupe-de-atlas","guadalupe-de-lerma","guadalupe-de-paso-blanco","guadalupe-de-rivera","guadalupe-de-tambula","guadalupe-del-monte","guadalupe-enriquez","guadalupe-etla","guadalupe-grijalva","guadalupe-hidalgo","guadalupe-libertad","guadalupe-minerva","guadalupe-morelos","guadalupe-santa-ana","guadalupe-sarabia","guadalupe-septien","guadalupe-texcalac","guadalupe-tlachco","guadalupe-totoltepec","guadalupe-victoria","guadalupe-y-calvo","guadalupe-zaragoza","guadalupebuenavista","guadalupecachi","guadalupecalderon","guadalupecote","guadalupedeatlas","guadalupedelerma","guadalupedelmonte","guadalupedepasoblanco","guadalupederivera","guadalupedetambula","guadalupeenriquez","guadalupeetla","guadalupegrijalva","guadalupehidalgo","guadalupelibertad","guadalupeminerva","guadalupemorelos","guadalupesantaana","guadalupesarabia","guadalupeseptien","guadalupetexcalac","guadalupetlachco","guadalupetotoltepec","guadalupevictoria","guadalupeycalvo","guadalupezaragoza","guam","guamuchil","guanacevi","guanajuatillo","guanajuato","guandaro","guaquitepec","guasave","guasavito","guasimas-de-belem","guasimasdebelem","guatacalca","guatimape","guayalejo","guayameo","guaymas","guaymitas","guaytalpa","guelph","guemez","guerneville","guernsey","guerrero","guerrero-negro","guerreronegro","gueydan","guildhall","guildwood","guilford","guilford-center","guilford-siding","guilfordcenter","guilfordsiding","guillermo-prieto","guillermo-zuniga","guillermoprieto","guillermozuniga","guin","guixe","gulf-breeze","gulf-gate-estates","gulf-hills","gulf-park-estates","gulf-shores","gulfbreeze","gulfgateestates","gulfhills","gulfparkestates","gulfport","gulfshores","gulivoire-park","gulivoirepark","gum","gumlog","gun-barrel-city","gunbarrel","gunbarrelcity","gunnison","gunter","guntersville","guntown","gunyo-poniente-san-jose-gunyo","gunyoponientesanjosegunyo","gurdon","gurnee","gustavo-adolfo-madero","gustavo-diaz-ordaz","gustavoadolfomadero","gustavodiazordaz","gustine","guthrie","guthrie-center","guthriecenter","gutierrez-zamora","gutierrezzamora","guttenberg","guymon","guyton","gv","gvf","gw","gwinn","gwynn-oak","gwynnoak","gyc","gypsum","gz","h1s","ha","hacienda-arriba","hacienda-blanca","hacienda-de-cabanas","hacienda-de-la-bolsa","hacienda-de-marquez","hacienda-heights","hacienda-los-fresnos","hacienda-nueva","hacienda-san-pedro","hacienda-santa-fe","hacienda-sotavento","hacienda-tecate","haciendaarriba","haciendablanca","haciendadecabanas","haciendadelabolsa","haciendademarquez","haciendaheights","haciendalacruzfraccionamiento","haciendalosfresnos","haciendanueva","haciendasanpedro","haciendasantafe","haciendasotavento","haciendatecate","hackberry","hackensack","hackettstown","hackleburg","haddington","haddon-heights","haddonfield","haddonheights","hadley","hafb","hagaman","hagerman","hagerstown","hahira","hahnville","haiku","haiku-pauwela","haikupauwela","hailey","haines","haines-city","hainescity","hainesville","halacho","halawa","halawa-heights","halawaheights","hale-center","halecenter","haledon","haleiwa","hales-corners","halescorners","halesite","haleyville","half-moon","half-moon-bay","halfmoon","halfmoonbay","halfway","halfway-house","halfwayhouse","haliburton-village","haliburtonvillage","halifax","haliimaile","hall-park","hallam","hallandale-beach","hallandalebeach","hallettsville","hallock","hallowell","hallpark","halls","hallstead","hallsville","halstead","haltom-city","haltomcity","ham-lake","hamburg","hamden","hamilton","hamilton-city","hamilton-square","hamilton-worcester","hamiltoncity","hamiltonsquare","hamiltonworcester","hamlake","hamlet","hamlin","hammond","hammonton","hampden","hampden-sydney","hampdensydney","hampolol","hampshire","hampstead","hampton","hampton-bays","hampton-beach","hampton-falls","hampton-manor","hamptonbays","hamptonbeach","hamptonfalls","hamptonmanor","hamtramck","hana","hanahan","hanamaulu","hanapepe","hanapepe-heights","hanapepeheights","hanceville","hancock","hanford","hanley-hills","hanleyhills","hanna","hanna-city","hannacity","hannahs-mill","hannahsmill","hannawa-falls","hannawafalls","hannibal","hanover","hanover-park","hanoverpark","hansen","hanson","hansville","hantsport","hapeville","happy-camp","happy-valley","happy-valley-goose-bay","happycamp","happyvalley","happyvalleygoosebay","harahan","harbison-canyon","harbisoncanyon","harbor","harbor-beach","harbor-bluffs","harbor-hills","harbor-isle","harbor-springs","harborbeach","harborbluffs","harborhills","harborisle","harborsprings","harbour-breton","harbour-heights","harbourbreton","harbourheights","harbourmainchapelscovelakeview","hardeeville","hardin","hardinsburg","hardwick","harker-heights","harkerheights","harkers-island","harkersisland","harlan","harleigh","harlem","harlem-heights","harlemheights","harleysville","harlingen","harlowton","haro","harper","harper-woods","harpersville","harperwoods","harpswell-center","harpswellcenter","harrah","harriman","harrington","harrington-park","harringtonpark","harris","harris-hill","harrisburg","harrishill","harrison","harrisonburg","harrisonville","harriston","harristown","harrisville","harrodsburg","harrogate","hart","hartford","hartford-city","hartfordcity","hartington","hartland","hartley","hartranft","hartsdale","hartselle","hartshorne","hartsville","hartville","hartwell","harvard","harvest","harvey","harveys-lake","harveyslake","harwich","harwich-center","harwich-port","harwichcenter","harwichport","harwood-heights","harwoodheights","hasbrouck-heights","hasbrouckheights","haskell","haskins","haslet","haslett","hasson-heights","hassonheights","hastings","hastings-on-hudson","hastingsonhudson","hatboro","hatch","hatfield","hattiesburg","haubstadt","haughton","hauppauge","hauterive","hauula","havana","havelock","haven","haverhill","haverstraw","haviland","havre","havre-de-grace","havre-saint-pierre","havredegrace","havresaintpierre","haw-river","hawaii","hawaii-kai","hawaiian-acres","hawaiian-beaches","hawaiian-gardens","hawaiian-ocean-view","hawaiian-paradise-park","hawaiianacres","hawaiianbeaches","hawaiiangardens","hawaiianoceanview","hawaiianparadisepark","hawaiikai","hawarden","hawesville","hawi","hawkesbury","hawkins","hawkinsville","hawl","hawley","haworth","hawriver","hawthorn-woods","hawthorne","hawthornwoods","hay-river","hayden","hayes-center","hayes-subdivision","hayescenter","hayessubdivision","hayesville","hayfield","hayfork","haymarket","haynesville","hayneville","hayriver","hays","haysville","hayti","hayward","hazard","hazardville","hazel-crest","hazel-dell","hazel-green","hazel-park","hazelcrest","hazeldell","hazelgreen","hazelpark","hazelwood","hazen","hazlehurst","hazleton","hb","hbp","hc","hcb","hcdt","hcs","hcv","hd","hda","hdc","hdd","hdg","hdj","hdlb","hdln","hdlv","hdm","hdn","hdo","hdr","hdz","he","hea","head-of-the-harbor","head-of-westport","headingley","headland","headoftheharbor","headofwestport","healdsburg","healdton","healy","hearne","hearst","heath","heathcote","heathrow","heathsville","heavener","hebbronville","heber","heber-city","heber-overgaard","heber-springs","hebercity","heberovergaard","hebersprings","hebron","hebron-estates","hebronestates","hec","hecelchakan","hector","hector-caballero","hectorcaballero","hedwig-village","hedwigvillage","heeia","heflin","heidelberg","helemano","helena","helena-valley-northeast","helena-valley-northwest","helena-valley-southeast","helena-valley-west-central","helena-west-helena","helena-west-side","helenavalleynortheast","helenavalleynorthwest","helenavalleysoutheast","helenavalleywestcentral","helenawesthelena","helenawestside","helio-garcia-alfaro","heliogarciaalfaro","hellertown","hells-kitchen","hellskitchen","helmetta","helotes","helper","hemby-bridge","hembybridge","hemet","hemlock","hemlock-farms","hemlockfarms","hemphill","hempstead","henagar","henderson","hendersonville","hendron","hennepin","hennessey","henniker","henrietta","henry","henry-farm","henry-fork","henryetta","henryfarm","henryfork","henryville","hephzibah","heppner","herald","herald-harbor","heraldharbor","herculaneum","hercules","hereford","heribertovaldezromeroelguayabo","herington","heritage-creek","heritage-hills","heritage-lake","heritage-pines","heritage-pointe","heritage-village","heritagecreek","heritagehills","heritagelake","heritagepines","heritagepointe","heritagevillage","herkimer","hermann","hermanos-cedillo","hermanoscedillo","hermantown","hermenegildo-galeana","hermenegildo-j-aldana","hermenegildogaleana","hermenegildogaleana2daseccion","hermenegildojaldana","hermiston","hermitage","hermon","hermosa-beach","hermosabeach","hermosillo","hernandez","hernando","hernando-beach","hernandobeach","herndon","heroes-de-chapultepec","heroesdechapultepec","heroica-caborca","heroica-ciudad-de-tlaxiaco","heroica-matamoros","heroica-zitacuaro","heroicacaborca","heroicaciudaddetlaxiaco","heroicamatamoros","heroicazitacuaro","herouxville","herricks","herriman","herrin","herscher","hershey","hertford","hesperia","hesston","hettinger","hewitt","hewlett","hewlett-harbor","hewlettharbor","heyburn","heyworth","hf","hg","hg2s","hga","hh","hhi","hhk","hhw","hi","hialeah","hialeah-gardens","hialeahgardens","hiawassee","hiawatha","hibbing","hickam-field","hickamfield","hickman","hickory","hickory-creek","hickory-hills","hickory-withe","hickorycreek","hickoryhills","hickorywithe","hicksville","hico","hid","hidalgo","hidalgo-amajac","hidalgo-joshil","hidalgoamajac","hidalgojoshil","hidalgotitlan","hidden-hills","hidden-meadows","hidden-spring","hidden-valley","hidden-valley-lake","hiddenhills","hiddenmeadows","hiddenspring","hiddenvalley","hiddenvalleylake","hide-a-way-lake","hideaway","hideawaylake","higganum","higginsville","high-bridge","high-level","high-park-north","high-park-swansea","high-point","high-prairie","high-ridge","high-river","high-springs","highbridge","highfield-cascade","highfieldcascade","highgrove","highland","highland-acres","highland-beach","highland-city","highland-creek","highland-falls","highland-heights","highland-lake","highland-lakes","highland-mills","highland-park","highland-springs","highland-village","highlandacres","highlandbeach","highlandcity","highlandcreek","highlandfalls","highlandheights","highlandlake","highlandlakes","highlandmills","highlandpark","highlands","highlands-baywood-park","highlands-ranch","highlandsbaywoodpark","highlandsprings","highlandsranch","highlandvillage","highlevel","highmore","highparknorth","highparkswansea","highpoint","highprairie","highridge","highriver","highspire","highsprings","hightstown","highview","highwood","higinio-olivo","higinioolivo","higuera-blanca","higuera-de-los-vega","higuera-de-zaragoza","higuerablanca","higueradelosvega","higueradezaragoza","higueras","higueras-de-abuya","higueras-de-los-natoches","higuerasdeabuya","higuerasdelosnatoches","higuerillas","higueron","hiland-park","hilandpark","hilbert","hildale","hildebran","hill","hill-air-force-base","hill-city","hill-country-village","hill-n-dale","hillairforcebase","hillandale","hillcity","hillcountryvillage","hillcrest","hillcrest-heights","hillcrest-village","hillcrestheights","hillcrestvillage","hilldale","hiller","hilliard","hillndale","hillsboro","hillsboro-beach","hillsborobeach","hillsborough","hillsdale","hillside","hillside-lake","hillsidelake","hillsmere-shores","hillsmereshores","hillsville","hilltop-lakes","hilltoplakes","hillview","hilmar-irwin","hilmarirwin","hilo","hilton","hilton-head","hilton-head-island","hiltonhead","hiltonheadisland","hinckley","hindman","hines","hinesburg","hinesville","hingham","hinsdale","hinton","hiram","his","hitchcock","hith","hj","hja","hk","hl","hlcf","hlf","hlr","hm","hmb","hmn","hms","hn","hnd","ho","ho-ho-kus","hoback","hobart","hobbs","hobe-sound","hobesound","hoboken","hocaba","hockessin","hockinson","hoctun","hodgdon","hodgenville","hodgkins","hoffman-estates","hoffmanestates","hogansville","hoh","hohenwald","hohokus","hoisington","hokendauqua","hokes-bluff","hokesbluff","holbrook","holca","holcomb","holden","holden-heights","holdenheights","holdenville","holderness","holdrege","holgate","holiday","holiday-city-berkeley","holiday-city-south","holiday-heights","holiday-island","holiday-lakes","holiday-shores","holiday-valley","holidaycityberkeley","holidaycitysouth","holidayheights","holidayisland","holidaylakes","holidayshores","holidayvalley","holladay","holland","hollandale","holley","holliday","hollidaysburg","hollins","hollis","hollis-center","holliscenter","hollister","holliston","holloman-air-force-base","hollomanairforcebase","holly","holly-hill","holly-hills","holly-lake-ranch","holly-ridge","holly-springs","hollyhill","hollyhills","hollylakeranch","hollymead","hollyridge","hollysprings","hollywood","hollywood-park","hollywoodpark","holmen","holmes-beach","holmesbeach","holmesburg","holstein","holt","holton","holts-summit","holtssummit","holtsville","holtville","holualoa","holyoke","home","home-garden","home-gardens","homeacre-lyndora","homeacrelyndora","homedale","homegarden","homegardens","homeland","homeland-park","homelandpark","homer","homer-city","homer-glen","homercity","homerglen","homerville","homestead","homestead-meadows-north","homestead-meadows-south","homesteadmeadowsnorth","homesteadmeadowssouth","hometown","homewood","hominy","homosassa","homosassa-springs","homosassasprings","homun","honaker","honalo","honaunau-napoopoo","honaunaunapoopoo","hondo","honea-path","honeapath","honeoye-falls","honeoyefalls","honesdale","honey","honey-brook","honey-grove","honeybrook","honeygrove","honeyville","honokaa","honolulu","hood-river","hoodriver","hooker","hooks","hooksett","hool","hoolehua","hooper","hooper-bay","hooperbay","hoopers-creek","hooperscreek","hoopeston","hoosick-falls","hoosickfalls","hoover","hooverson-heights","hooversonheights","hopatcong","hopatcong-hills","hopatconghills","hope","hope-mills","hope-valley","hopedale","hopelchen","hopemills","hopevalley","hopewell","hopkins","hopkinsville","hopkinton","hopwood","hoquiam","horace","horatio","horcasitas","horicon","horizon-city","horizon-west","horizoncity","horizonwest","hormiguero","horn-lake","hornby-island","hornbyisland","hornell","hornepayne","hornitos","hornlake","hornsby-bend","hornsbybend","horse-cave","horse-pasture","horse-shoe","horsecave","horseheads","horseheads-north","horseheadsnorth","horsepasture","horseshoe","horseshoe-bay","horseshoe-bend","horseshoebay","horseshoebend","horsham","horton","hortonville","hoschton","hostotipaquillo","hot-springs","hot-springs-village","hot-sulphur-springs","hoth","hotsprings","hotspringsvillage","hotsulphursprings","houck","hough","houghton","houghton-lake","houghtonlake","houlton","houma","housatonic","houserville","houston","hov","how","howard","howard-beach","howard-city","howard-lake","howardbeach","howardcity","howardlake","howards-grove","howardsgrove","howe","howell","howey-in-the-hills","howeyinthehills","howland","howland-center","howland-island","howlandcenter","howlandisland","hoxie","hoyadecintoralahoyadearriba","hoyt-lakes","hoytlakes","hp","hpn","hpp","hps","hr","hs","hsf","hsm","hsmf","hsp","hss","hsv","ht","htc","huacapa-y-amestoy","huacapayamestoy","huachichil","huachinantla","huachinera","huachuca-city","huachucacity","huahuaxtla","huajicori","huajimic","huajintepec","huajintlan","huajoyuca","huajumbaro","hualahuises","hualcaltzinco","hualula","huamantla","huamuchapa","huamuchil","huamuxtitlan","huancito","huandacareo","huanguitio","huanimaro","huaniqueo-de-morales","huaniqueodemorales","huanusco","huapacal-1ra-seccion","huapacal1raseccion","huapacal2daseccionpuntabrava","huapinol","huaquechula","huasabas","huasca-de-ocampo","huascadeocampo","huascato","huatabampo","huatecalco","huatlatlauca","huatusco","huauchinango","huautepec","huautla","huautla-de-jimenez","huautladejimenez","huaxcaleca","huaxtla","huay-max","huay-pix","huayacanes","huayacocotla","huaymax","huaypix","huazantlan-del-rio","huazantlandelrio","huazulco","huazuntlan","hubbard","hubbard-lake","hubbardlake","hubbardston","huber-heights","huber-ridge","huberheights","huberridge","hudson","hudson-bay","hudson-bend","hudson-falls","hudson-lake","hudson-oaks","hudsonbay","hudsonbend","hudsonfalls","hudsonlake","hudsonoaks","hudsonville","huecahuasco","huehuetan","huehuetla","huehuetlan","huehuetlan-el-chico","huehuetlanelchico","huehuetoca","huejonapan","huejotitan","huejotzingo","huejucar","huejuquilla-el-alto","huejuquillaelalto","huejutla-de-reyes","huejutladereyes","huelo","huemetla","huepac","huepaco","huepalcalco-san-miguel","huepalcalcosanmiguel","huetamo-de-nunez","huetamodenunez","huexotitla","hueyapa","hueyapan","hueyapan-de-ocampo","hueyapandeocampo","hueycantenango","hueyitlalpan","hueyotlipan","hueypoxtla","hueytamalco","hueytepec","hueytlalpan","hueytown","hughes","hughes-springs","hughessprings","hughestown","hughesville","hughson","hugo","hugoton","huguenot","huguley","huhi","huichapan","huichihuayan","huilacapixtla","huilango","huiloapan","huiloapan-de-cuauhtemoc","huiloapandecuauhtemoc","huimanguillo","huimilpan","huiramba","huitchila","huitel","huitepec","huitiupan","huitron","huitzatarito","huitzila","huitzilac","huitzilan","huitzililla","huitziltepec","huitzitzilingo","huitzmaloc","huitzoltepec","huixcolotla","huixquilucan","huixquilucan-de-degollado","huixquilucandedegollado","huixtan","huixtepec","huixtla","huizachal","hull","humansville","humber-heights-westmount","humber-summit","humberheightswestmount","humbermede","humbersummit","humble","humboldt","humboldt-hill","humboldthill","humewood-cedarvale","humewoodcedarvale","hummels-wharf","hummelstown","hummelswharf","hunt-valley","hunter","hunters-creek","hunters-creek-village","hunterscreek","hunterscreekvillage","huntersville","huntertown","hunting-park","huntingburg","huntingdon","huntingpark","huntington","huntington-bay","huntington-beach","huntington-park","huntington-station","huntington-woods","huntingtonbay","huntingtonbeach","huntingtonpark","huntingtonstation","huntingtonwoods","huntingtown","huntingtown-town-center","huntingtowntowncenter","huntley","hunts-point","huntspoint","huntsville","huntvalley","hunucma","hunuku","hurley","hurlock","huron","huron-east","huroneast","hurricane","hurst","hurstbourne","hurstbourne-acres","hurstbourneacres","hurt","hustisford","hutchins","hutchinson","hutchinson-island-south","hutchinsonislandsouth","hutto","huxley","hv","hvgb","hvl","hvn","hvs","hvwc","hw","hwh","hws","hya","hyannis","hyattsville","hybla-valley","hyblavalley","hyde","hyde-park","hyden","hydepark","hydesville","hypoluxo","hyrum","hysham","hz","ia","iac","iaga","iagb","ib","ibarra","ibarrilla","ic","icard","iccw","ichan","icxotitla","id","ida-grove","idabel","idagrove","idaho","idaho-city","idaho-falls","idaho-springs","idahocity","idahofalls","idahosprings","idalou","idb","idc","idj","idlc","idlh","idli","idll","idlm","idlr","idls","idm","ido","idr","ids","idyllwild","idyllwild-pine-cove","idyllwildpinecove","idylwood","ie","iec","if","ifh","ig","igg","igh","igloolik","ignacio-allende","ignacio-allende-concepcion","ignacio-de-la-llave","ignacio-gutierrez-gomez","ignacio-lopez-rayon","ignacio-manuel-altamirano","ignacio-perez","ignacio-ramirez","ignacio-zaragoza","ignacio-zaragoza-1ra-seccion","ignacio-zaragoza-el-morro","ignacioallende","ignacioallendeconcepcion","ignaciodelallave","ignaciogutierrezgomez","ignaciolopezrayon","ignaciomanuelaltamirano","ignacioperez","ignacioramirez","ignaciozaragoza","ignaciozaragoza1raseccion","ignaciozaragozaelmorro","iguala-de-la-independencia","igualadelaindependencia","igualapa","ih","ihb","ihcs","ihn","ihp","ihs","ihuatzio","il","ilamatlan","ilchester","ile-des-chenes","iledeschenes","iliatenco","ilion","ill","illescas","illinois","ilr","im","ima","imdi","iml","imlay-city","imlaycity","immokalee","imperial","imperial-beach","imperialbeach","imuris","in","ina","incline-village","inclinevillage","indaparapeo","inde","independence","independencia","independent-hill","independenthill","india-hook","indiahook","indialantic","indian-harbour-beach","indian-head","indian-head-park","indian-heights","indian-hills","indian-hills-cherokee-section","indian-mountain-lake","indian-river","indian-river-estates","indian-river-shores","indian-rocks-beach","indian-shores","indian-springs","indian-springs-village","indian-trail","indian-wells","indiana","indianapolis","indianharbourbeach","indianhead","indianheadpark","indianheights","indianhills","indianhillscherokeesection","indianmountainlake","indianola","indianriver","indianriverestates","indianrivershores","indianrocksbeach","indianshores","indiansprings","indianspringsvillage","indiantown","indiantrail","indianwells","indio","industry","inez","ingalls","ingalls-park","ingallspark","ingersoll","ingleside","inglewood","inglewood-finn-hill","inglewoodfinnhill","inglis","ingram","inkerman","inkster","inman","inman-mills","inmanmills","innisfil","inniswold","inola","intercourse","interlachen","interlaken","international-falls","internationalfalls","inuvik","inver-grove-heights","invergroveheights","invermere","inverness","inverness-highlands-north","inverness-highlands-south","invernesshighlandsnorth","invernesshighlandssouth","inwood","inyo","inyokern","ioh","iola","ion","iona","ione","ionia","ionview","iop","iota","iow","iowa","iowa-city","iowa-colony","iowa-falls","iowa-park","iowacity","iowacolony","iowafalls","iowapark","ip","ipalapa","ipc","ipswich","iqaluit","iquinuapa","ir","iraan","iramuco","irapeo","irapuato","iratzio","irb","ire","irimbo","irmo","irolo","iron-mountain","iron-river","irondale","irondequoit","ironmountain","ironriver","ironton","ironville","ironwood","iroquois-falls","iroquois-point","iroquoisfalls","iroquoispoint","irricana","irrigon","irs","irvine","irvinehealthandsciencecomplex","irving","irving-park","irvingpark","irvington","irwin","irwindale","irwinton","is","isaacarriagasantaanamancera","isanti","iselin","ishpeming","isla","isla-aguada","isla-del-bosque","isla-holbox","isla-mujeres","isla-soyaltepec","isla-vista","islaaguada","isladelbosque","islaholbox","islamorada","islamujeres","island","island-city","island-heights","island-lake","island-park","island-walk","islandcity","islandheights","islandia","islandlake","islandpark","islandwalk","islas-agrarias-grupo-a","islas-agrarias-grupo-b","islasagrariasgrupoa","islasagrariasgrupob","islasoyaltepec","islavista","isle-of-hope","isle-of-normandy","isle-of-palms","isle-of-wight","isleofhope","isleofnormandy","isleofpalms","isleofwight","islington-city-centre-west","islingtoncitycentrewest","islip","islip-terrace","islipterrace","islita","issaquah","istaro","isv","it","italy","itasca","ithaca","itta-bena","ittabena","iturbide","itzamatitlan","itzoteno","iuka","iv","iva","ivanhoe","ives-estates","ivesestates","ivins","ivyland","iw","iwilei-anuenue","iwileianuenue","ixcamilpa","ixcapa","ixcapantla","ixcapuzalco","ixcateopan","ixcateopan-de-cuauhtemoc","ixcateopandecuauhtemoc","ixcatepec","ixcatla","ixcatlan","ixcuinquitlapilco","ixhuacan-de-los-reyes","ixhuacandelosreyes","ixhuapan","ixhuatan","ixhuatlan-de-madero","ixhuatlan-del-cafe","ixhuatlan-del-sureste","ixhuatlancillo","ixhuatlandelcafe","ixhuatlandelsureste","ixhuatlandemadero","ixil","ixmiquilpan","ixonia","ixpantepec-nieves","ixpantepecnieves","ixpila","ixtacamaxtitlan","ixtacapa-el-chico","ixtacapaelchico","ixtacomitan","ixtaczoquitlan","ixtahuiata-la-legua","ixtahuiatalalegua","ixtapa","ixtapa-zihuatanejo","ixtapaluca","ixtapan-de-la-concepcion","ixtapan-de-la-sal","ixtapan-del-oro","ixtapandelaconcepcion","ixtapandelasal","ixtapandeloro","ixtapangajoya","ixtapantongo","ixtapazihuatanejo","ixtenco","ixtepec","ixticpan","ixtlahuaca","ixtlahuaca-barrio","ixtlahuaca-de-cuauhtemoc","ixtlahuaca-de-rayon","ixtlahuacabarrio","ixtlahuacadecuauhtemoc","ixtlahuacaderayon","ixtlahuacan","ixtlahuacan-de-los-membrillos","ixtlahuacan-del-rio","ixtlahuacandelosmembrillos","ixtlahuacandelrio","ixtlan-de-juarez","ixtlan-de-los-hervores","ixtlan-del-rio","ixtlandejuarez","ixtlandeloshervores","ixtlandelrio","ixtlilco-el-chico","ixtlilcoelchico","ixtolco-de-morelos","ixtolcodemorelos","iz","iz1s","izamal","izem","izotepec","iztacalco","iztacapa","iztapalapa","izucar-de-matamoros","izucardematamoros","j-jesus-diaz-tzirio","j2s","ja","jaboncillo","jacala","jacarandas","jacinto-city","jacintocity","jack","jackpot","jacksboro","jackson","jackson-center","jackson-heights","jacksoncenter","jacksonheights","jacksonville","jacksonville-beach","jacksonvillebeach","jacksonwald","jacobus","jacona-de-plancarte","jaconadeplancarte","jaet","jaffrey","jaguey-blanco","jagueyblanco","jagueydetellezestaciontellez","jal","jala","jalacingo","jalapa","jalapilla","jalapita","jalcocotan","jalcomulco","jaleaca-de-catalan","jaleacadecatalan","jalipa","jalisco","jalmolonga-la-hacienda","jalmolongalahacienda","jalostotitlan","jalpa","jalpa-de-los-banos","jalpa-de-mendez","jalpadelosbanos","jalpademendez","jalpan","jalpilla","jaltenango-de-la-paz","jaltenangodelapaz","jaltenco","jaltepec","jaltepec-de-candayoc","jaltepecdecandayoc","jaltepetongo","jaltiche-de-arriba","jaltichedearriba","jaltipan-de-morelos","jaltipandemorelos","jaltocan","jaltomate","jaluco","jalupa","jamaica","jamaica-beach","jamaica-plain","jamaicabeach","jamaicaplain","jamapa","jamay","james-city","james-island","jamesburg","jamescity","jamesisland","jamesport","jamestown","jamestown-west","jamestownwest","jamiltepec","jamul","jan-phyl-village","janambo","janamuato","janesville","janitzio","janos","janphylvillage","jantetelco","jaracuaro","jaral-del-progreso","jaraldelprogreso","jarales","jardines-de-la-silla","jardines-de-san-sebastian","jardines-del-eden","jardines-del-grijalva","jardinesdelasilla","jardinesdeleden","jardinesdelgrijalva","jardinesdesansebastian","jarillas","jaripeo","jarrell","jarrettsville","jarvis","jarvis-island","jarvisisland","jasmine-estates","jasmineestates","jasonville","jasper","jasper-park-lodge","jasperparklodge","jauja","jaula-de-abajo","jauladeabajo","jaumave","jauregui","javier-rojo-gomez","javierrojogomez","jay","jayton","jb","jbdc","jblm","jc","jd","jda","jdc","jde","jdf","jdg","jdgs","jdj","jdlb","jdld","jdlg","jdlp","jdls","jdm","jdme","jdp","jdss","jdt","jdz","je","jean-lafitte","jeanerette","jeanlafitte","jeannette","jeb","jec","jecopaco","jefferson","jefferson-city","jefferson-heights","jefferson-hills","jefferson-valley-yorktown","jeffersoncity","jeffersonheights","jeffersonhills","jeffersontown","jeffersonvalleyyorktown","jeffersonville","jeffries-point","jeffriespoint","jeg","jellico","jemez-pueblo","jemezpueblo","jemison","jena","jenison","jenkins","jenkintown","jenks","jennings","jennings-lodge","jenningslodge","jensen-beach","jensenbeach","jerecuaro","jerez-de-garcia-salinas","jerezdegarciasalinas","jericho","jerico","jermyn","jerome","jersey-city","jersey-shore","jersey-village","jerseycity","jerseyshore","jerseyvillage","jerseyville","jerusalen","jessup","jesup","jesus-carranza","jesus-carranza-rancho-de-jesus","jesus-del-monte","jesus-gomez-portugal","jesus-huitznahuac","jesus-maria","jesus-maria-garza","jesus-nazareno","jesus-tepactepec","jesuscarranza","jesuscarranzaranchodejesus","jesusdelmonte","jesusgomezportugal","jesusgomezportugalmargaritas","jesushuitznahuac","jesusmaria","jesusmariagarza","jesusnazareno","jesustepactepec","jetmore","jewell","jewett","jewett-city","jewettcity","jfg","jg","jgp","jgpm","jgr","jh","ji","jicaltepec-autopan","jicaltepec-cuexcontitlan","jicaltepecautopan","jicaltepeccuexcontitlan","jicamas","jicarero","jicayan-de-tovar","jicayandetovar","jicolapa","jilotepec","jilotepec-de-molina-enriquez","jilotepecdemolinaenriquez","jilotlan-de-los-dolores","jilotlandelosdolores","jilotzingo","jim-thorpe","jimenez","jimenez-del-teul","jimenezdelteul","jimthorpe","jiquilpan","jiquilpan-de-juarez","jiquilpan-estacion-bonanza","jiquilpandejuarez","jiquilpanestacionbonanza","jiquipilas","jiquipilco","jitonhueca","jitotol","jitzamuri","jiutepec","jjc","jjdt","jjesusdiaztzirio","jjesusgonzalezortegasanmateo","jjr","jl","jlh","jlt","jm","jmg","jmgm","jmj","jmm","jmps","jn","jnm","jnr","joachin","joanna","joaquin-herrera","joaquin-miguel-gutierrez","joaquinherrera","joaquinmiguelgutierrez","joconoxtle-la-tuna","joconoxtlelatuna","jocoqui","jocotepec","jocotitlan","jofrito","john-day","johnday","johns-creek","johnsburg","johnscreek","johnson","johnson-city","johnson-creek","johnson-lane","johnsonburg","johnsoncity","johnsoncreek","johnsonlane","johnsonville","johnston","johnston-atoll","johnston-city","johnstonatoll","johnstoncity","johnstonville","johnstown","joint-base-lewis-mcchord","joint-base-pearl-harbor-hickam","jointbaselewismcchord","jointbasepearlharborhickam","jojutla","jolalpan","joliet","joliette","jolivue","jolja","jollyville","jolochero-2da-seccion","jolochero2daseccion","jolotichan","jolsibaquil","joltealal","jomanichim","jomulco","jonacapa","jonacatepec","jones","jones-creek","jonesboro","jonesborough","jonescreek","jonesport","jonestown","jonesville","jonotla","jonquiere","jonuta","jopala","joplin","joppatowne","joquicingo","jordan","jorge-jimenez-cantu","jorgejimenezcantu","jorobas","jose-cardel","jose-colomo","jose-esteban-coronado","jose-f-gutierrez","jose-guadalupe-rodriguez","jose-maria-morelos","jose-maria-morelos-la-yegueria","jose-maria-morelos-san-jose","jose-maria-morelos-y-pavon","jose-maria-pino-suarez","jose-mariano-jimenez","jose-narciso-rovirosa","jose-refugio-salcido","josecardel","josecolomo","joseestebancoronado","josefgutierrez","joseguadaluperodriguez","josemariamorelos","josemariamoreloslayegueria","josemariamorelossanjose","josemariamorelossantamonica","josemariamorelosypavon","josemarianojimenez","josemariapinosuarez","josenarcisorovirosa","joseph","joseph-city","josephcity","josephine","joserefugiosalcido","joshil","joshua","joshua-tree","joshuatree","jourdanton","jp","jpl","jpv","jr","jrc","jrg","jrs","js","jt","juamave","juan-aldama","juan-aldama-el-tigre","juan-de-la-granja","juan-del-grijalva","juan-diaz-covarrubias","juan-e-garcia","juan-escutia-borbollon","juan-gil-preciado","juan-jose-rios","juan-martin","juan-morales","juan-n-mendez","juan-rodriguez-clara","juan-sarabia","juanacatlan","juanaldama","juanaldamaeltigre","juandelagranja","juandelgrijalva","juandiazcovarrubias","juanegarcia","juanescutiaborbollon","juangilpreciado","juanjoserios","juanmarcossanjosebuenavista","juanmartin","juanmorales","juannmendez","juanrodriguezclara","juansarabia","juarez","juarez-coronaco","juarezcoronaco","juchipila","juchique-de-ferrer","juchiquedeferrer","juchitan","juchitan-de-zaragoza","juchitandezaragoza","juchitepec","juchitlan","jucutacato","judson","judsonia","julesburg","julian","julian-blanco-dos-caminos","julian-grajales","julian-villagran","julianblancodoscaminos","juliangrajales","julianvillagran","julimes","jumiltepec","junction","junction-area","junction-city","junctionarea","junctioncity","june-park","juneau","junepark","jungapeo-de-juarez","jungapeodejuarez","juniata-park","juniatapark","juno-beach","junobeach","jupiter","jurare","juriquilla","jurupa-valley","jurupavalley","justice","justin","justo-sierra","justosierra","juventino-rosas","juventinorosas","jv","jvy","jw","k-i-sawyer-air-force-base","k3","k4","ka","kaaawa","kaanapali","kaanapali-landing","kaanapalilanding","kachina-village","kachinavillage","kadoka","kahaluu","kahaluu-keauhou","kahaluukeauhou","kahoka","kahuku","kahului","kaibito","kailua","kailua-kona","kailua-town","kailuakona","kailuatown","kaimuki","kalaheo","kalaheo-hillside","kalaheohillside","kalama","kalama-valley","kalamavalley","kalamazoo","kalanipuu","kalaoa","kalida","kalifornsky","kalihi-palama","kalihi-valley","kalihipalama","kalihivalley","kalispell","kalkaska","kalona","kamas","kamehameha-heights","kamehamehaheights","kamiah","kamloops","kamsack","kanab","kanasin","kanata","kancab","kancabchen","kane","kaneohe","kankakee","kannapolis","kansas","kansas-city","kansascity","kantunil","kantunilkin","kanxoc","kapaa","kapaau","kaplan","kapolei","kapuskasing","karnes-city","karnescity","kaser","kasson","kathleen","katonah","katy","kaua","kaufman","kaukauna","kaumakani-hanapepe","kaumakanihanapepe","kaunakakai","kawailoa","kayenta","kaysville","kb","kbb","kc","kdh","ke","keaau","kealakekua","keansburg","kearney","kearney-park","kearneypark","kearns","kearny","kechi","keedysville","keego-harbor","keegoharbor","keeler-farm","keelerfarm","keelesdale-eglinton-west","keelesdaleeglintonwest","keene","keenesburg","keeseville","keewatin","keizer","kekaha","kekaha-waimea","kekahawaimea","keller","kellogg","kellyville","kelowna","kelseyville","kelso","kemah","kemmerer","kemp","kemp-mill","kempmill","kempner","ken-caryl","kenai","kenansville","kenbridge","kencaryl","kendale-lakes","kendalelakes","kendall","kendall-green","kendall-park","kendall-square","kendall-west","kendallgreen","kendallpark","kendallsquare","kendallville","kendallwest","kenduskeag","kenedy","kenhorst","kenilworth","kenly","kenmar","kenmare","kenmore","kennebec","kennebunk","kennebunkport","kennedale","kennedy","kennedy-park","kennedypark","kenner","kennesaw","kenneth-city","kennethcity","kennett","kennett-square","kennettsquare","kennewick","kenora","kenosha","kenosha-streetcar","kenoshastreetcar","kenova","kensett","kensington","kensington-chinatown","kensington-park","kensingtonchinatown","kensingtonpark","kent","kent-acres","kent-city","kentacres","kentcity","kentfield","kentland","kenton","kentucky","kentville","kentwood","kenvil","kenwood","kenyon","keokea","keokuk","keolu-hills","keoluhills","keosauqua","kerens","kerhonkson","kerman","kermit","kern","kernersville","kernville","kerrobert","kerrville","kersey","kershaw","keshena","keswick","keswick-ridge","keswickridge","ketchikan","ketchum","kettering","kettle-falls","kettlefalls","kettleman-city","kettlemancity","keuka-park","keukapark","kew","kew-gardens","kew-gardens-hills","kewanee","kewaskum","kewaunee","kewgardens","kewgardenshills","key-biscayne","key-center","key-largo","key-vista","key-west","keybiscayne","keycenter","keyes","keylargo","keyport","keyser","keystone","keystone-heights","keystoneheights","keytesville","keyvista","keywest","kf","kg","kgh","kh","ki","kiantone","kiawah-island","kiawahisland","kiefer","kiel","kihei","kihei-mauka","kiheimauka","kilauea","kildeer","kilgore","kill-devil-hills","killam","killarney","killdeer","killdevilhills","killeen","killian","killingly-center","killinglycenter","killingworth","kilmanagh","kilmarnock","kiln","kilometro-30","kilometro-40","kilometro-noventa-y-nueve","kilometro30","kilometro40","kilometronoventaynueve","kimball","kimberley","kimberling-city","kimberlingcity","kimberly","kimbila","kincaid","kincardine","kinchil","kinder","kinderhook","kindersley","king","king-and-queen-court-house","king-city","king-cove","king-george","king-of-prussia","king-william","kingandqueencourthouse","kingcity","kingcove","kingfield","kingfisher","kinggeorge","kingman","kingman-reef","kingmanreef","kingofprussia","kings","kings-bay-base","kings-beach","kings-bridge","kings-grant","kings-mills","kings-mountain","kings-park","kings-park-west","kings-point","kingsbaybase","kingsbeach","kingsbridge","kingsburg","kingsbury","kingsessing","kingsey-falls","kingseyfalls","kingsford","kingsford-heights","kingsfordheights","kingsgate","kingsgrant","kingsland","kingsley","kingsmills","kingsmountain","kingspark","kingsparkwest","kingspoint","kingsport","kingston","kingston-estates","kingston-springs","kingstonestates","kingstonsprings","kingstown","kingstree","kingsview-village-the-westway","kingsviewvillagethewestway","kingsville","kingsway-south","kingswaysouth","kingwilliam","kingwood","kini","kinil","kinnelon","kinsey","kinsley","kinston","kiowa","kirby","kirbyville","kirkland","kirkland-lake","kirklandlake","kirksville","kirkville","kirkwood","kirtland","kiryas-joel","kiryasjoel","kisawyerairforcebase","kissee-mills","kisseemills","kissimmee","kitchener","kitimat","kitsap","kittanning","kittery","kittery-point","kitterypoint","kittitas","kittredge","kitty-hawk","kittyhawk","kj","kk","kki","kl","klahanie","klamath","klamath-falls","klamathfalls","km","kn","knightdale","knightsen","knightstown","knik-fairview","knikfairview","knob-noster","knobnoster","knollwood","knottsville","knox","knox-city","knoxcity","knoxville","knyn","ko","ko-olina","kochol","kodiak","kodiak-station","kodiakstation","kohler","kokomo","koloa","koloa-poipu","koloapoipu","komchen","konawa","koolauloa","koolina","koontz-lake","koontzlake","kop","kopoma","koreatown","kosciusko","kotolte","kotzebue","kountze","kouts","kp","kpw","kr","krebs","kremmling","kronenwetter","krotz-springs","krotzsprings","krugerville","krum","ks","kt","kuakini","kualapuu","kugluktuk","kula","kuliouou","kuliouou-kalani-iki","kuliououkalaniiki","kulpmont","kulpsville","kuna","kure-beach","kurebeach","kurtistown","kutztown","kv","kvtw","kw","ky","kyle","l1s","la","la-alameda","la-aldea","la-amistad","la-angostura","la-ascension","la-aurora","la-azozuca","la-ballena","la-barca","la-barra-de-colotepec","la-barreta","la-blanca","la-bocana","la-boveda","la-brecha","la-broquerie","la-cabecera","la-cabecera-concepcion","la-caja","la-calera","la-calera-nacimientos","la-calle","la-camelia","la-campanilla","la-canada","la-canada-flintridge","la-candelaria","la-candelaria-teotlalpan","la-candelaria-tlapala","la-cantera","la-capilla","la-caridad","la-ceiba","la-ceja","la-center","la-central","la-cerquilla","la-chinantla","la-cienega","la-cieneguita","la-ciudad","la-colonia","la-colonia-guadalupe","la-colorada","la-compania","la-competencia","la-comunidad","la-concepcion","la-concepcion-de-hidalgo","la-concepcion-de-los-banos","la-concepcion-enyege","la-concepcion-la-concha","la-concepcion-xochicuautla","la-conception","la-concha","la-concha-la-concepcion","la-concordia","la-constitucion","la-constitucion-toltepec","la-corregidora","la-coste","la-crescent","la-crescenta-montrose","la-croft","la-crosse","la-cruz","la-cruz-de-loreto","la-cruz-del-palmar","la-cruz-y-carrizal","la-cuesta","la-cuevita","la-curva","la-cygne","la-d","la-defensa","la-despensa","la-dicha","la-encarnacion","la-ermita","la-ermita-nueva-jerusalen","la-erradura","la-escalera","la-escondida","la-esmeralda","la-esperanza","la-esperanza-el-zapotal","la-esquina","la-estacada","la-estacion","la-estancia","la-estancia-de-amezcua","la-estanzuela","la-estrella","la-fe","la-feria","la-finca","la-flor","la-floresta","la-florida","la-fortuna","la-fuente","la-fundicion-quinta-manzana","la-galarza","la-garita","la-gavia","la-gloria","la-glorieta","la-goleta","la-goma","la-gotera","la-grande","la-grandeza","la-grange","la-grange-park","la-griega","la-grulla","la-guadalupana","la-guadalupe","la-guadeloupe","la-guasima","la-habra","la-habra-heights","la-harpe","la-haute-saint-charles","la-herradura","la-higuera","la-higuerilla-los-lirios","la-homa","la-horqueta-poblado-doce","la-huacana","la-huanica","la-huerta","la-humedad","la-iberica-la-gotera","la-independencia","la-independencia-las-pilas","la-isla","la-isla-de-chapachapa","la-isla-kilometro-10","la-isla-km-10","la-jolla","la-joya","la-joya-de-calvillo","la-junta","la-labor","la-laborcita","la-laguna","la-laguna-y-monte-del-castillo","la-lagunilla","la-laja","la-libertad","la-lima","la-linea","la-lira","la-llave","la-lobera","la-loma","la-loma-cuexcontitlan","la-loma-de-los-negritos","la-loma-la-loma-de-quila","la-lucha","la-luz","la-luz-de-juarez","la-magdalena","la-magdalena-chichicaspa","la-magdalena-tenexpan","la-magdalena-tetela-morelos","la-magdalena-tlaltelulco","la-magdalena-yancuitlalpan","la-malbaie","la-manga-2da-seccion-el-jobal","la-manzanilla","la-manzanilla-de-la-paz","la-marque","la-mesa","la-mesa-de-chosto","la-mesa-de-los-conejos","la-mesa-la-mesa-de-cedano","la-mesilla","la-mezquitera","la-mina","la-minerve","la-mintzita-piedra-dura","la-mira","la-mirada","la-mision","la-mohonera","la-mojonera","la-moncada","la-monja","la-monte","la-negreta","la-noria","la-noria-de-san-antonio","la-norita","la-nueva-era","la-nueva-victoria","la-ordena","la-orduna","la-orilla","la-ortiga","la-pahua","la-palma","la-palma-las-palmas","la-palmilla","la-palmita-y-anexos-la-presita","la-paloma","la-panadera","la-partida","la-pastoria","la-patria","la-paz","la-paz-de-ordaz","la-pe","la-pedrera","la-pendencia","la-peninsula","la-penita-de-jaltomba","la-perla","la-pesca","la-piedad","la-pila","la-pimienta","la-pine","la-pinta","la-placita-de-morelos","la-planada","la-planada-el-arenal","la-plata","la-playa","la-plaza-del-limon","la-pocatiere","la-popular","la-porte","la-porte-city","la-pradera","la-prairie","la-presa","la-presita","la-presita-segundo-cuartel","la-presumida","la-primavera","la-providencia","la-providencia-siglo-xxi","la-pryor","la-puebla","la-puente","la-puerta-del-pilar","la-punta","la-purificacion","la-purisima","la-quemada","la-quinta","la-reforma","la-resolana","la-resurreccion","la-ribera","la-rinconada","la-rinconoda","la-rivera","la-riviera","la-roca","la-ronge","la-rosa","la-sabana","la-sabinita","la-sala-la-caliente","la-salle","la-sardina","la-sarre","la-sauceda","la-selva","la-selva-beach","la-sidra","la-solana","la-soledad","la-soledad-barrio","la-sombra","la-subida","la-tabaquera","la-tesorera","la-tigrilla","la-tijera","la-tinaja","la-toma","la-tortuga","la-trinidad","la-trinidad-chautenco","la-trinidad-chimalpa","la-trinidad-tenexyecac","la-trinidad-tianguismanalco","la-trinitaria","la-tuque","la-unidad-huitzizilapan","la-union","la-union-del-cuatro","la-union-ejido-mexcaltepec","la-union-paso-largo","la-vale","la-valla","la-vega","la-venta","la-venta-del-astillero","la-ventilla","la-ventosa","la-vergne","la-verne","la-vernia","la-versolilla","la-victoria","la-victoria-la-penita","la-villa","la-vista","la-y","la-yesca","la-zacatecana","laalameda","laaldea","laamistad","laangostura","laascension","laaurora","laazozuca","labadieville","laballena","labarca","labarque-creek","labarquecreek","labarradecolotepec","labarreta","labelle","lablanca","labocana","labor-de-peralta","labordeperalta","laboveda","labrador-city","labradorcity","labrecha","labroquerie","lac-alouette","lac-brome","lac-connelly","lac-des-aigles","lac-du-bonnet","lac-du-flambeau","lac-la-biche","lac-lapierre","lac-megantic","lac-simon","lacabecera","lacabeceraconcepcion","lacaja","lacalera","lacaleranacimientos","lacalle","lacalouette","lacamelia","lacampanilla","lacanada","lacanadaflintridge","lacandelaria","lacandelariateotlalpan","lacandelariatlapala","lacandon","lacantera","lacapan-camallagne","lacapancamallagne","lacapilla","lacaridad","lacbrome","lacconnelly","lacdesaigles","lacdubonnet","lacduflambeau","laceiba","laceja","lacenter","lacentral","lacerquilla","lacey","lachinantla","lachute","lacienega","lacieneguita","laciudad","lackawanna","lackland-air-force-base","lacklandairforcebase","laclabiche","laclapierre","lacmegantic","lacolle","lacolonia","lacoloniaguadalupe","lacolorada","lacombe","lacompania","lacompetencia","lacomunidad","lacon","laconcepcion","laconcepcioncoatipaclaconchita","laconcepciondehidalgo","laconcepciondelosbanos","laconcepcionenyege","laconcepcionlaconcha","laconcepcionxochicuautla","laconception","laconcha","laconchalaconcepcion","laconcordia","laconia","laconstitucion","laconstituciontoltepec","lacoochee","lacorregidora","lacoste","lacrescent","lacrescentamontrose","lacroft","lacrosse","lacruz","lacruzdeloreto","lacruzdelpalmar","lacruzycarrizal","lacsimon","lacuchillaextramurosdetesistan","lacuesta","lacuevita","lacurva","lacy-lakeview","lacygne","lacylakeview","lad","ladd","ladefensa","ladera","ladera-heights","ladera-ranch","laderaheights","laderaranch","ladespensa","ladicha","ladner","ladonia","ladrillera-entronque-pesqueria","ladrilleraentronquepesqueria","ladrilleras-de-ocoro","ladrilleras-del-refugio","ladrillerasdelrefugio","ladrillerasdeocoro","ladson","ladue","lady-lake","ladylake","ladysmith","laencarnacion","laermita","laermitanuevajerusalen","laerradura","laescalera","laescondida","laesmeralda","laesperanza","laesperanzaelzapotal","laesperanzagranjasfamiliares","laesquina","laestacada","laestacion","laestancia","laestanciadeamezcua","laestanciadesanjosedelcarmen","laestanciasectorunolaestancia","laestanzuela","laestrella","lafayette","lafayette-hill","lafayettehill","lafb","lafe","laferia","lafinca","laflin","laflor","lafloresta","laflorida","lafollette","lafortuna","lafuente","lafundicionquintamanzana","lagalarza","lagarita","lagartera-1ra-seccion","lagartera1raseccion","lagavia","lagloria","laglorieta","lago-vista","lagoleta","lagoma","lagos-de-moreno","lagosdemoreno","lagotera","lagovista","lagrande","lagrandeza","lagrange","lagrangepark","lagriega","lagrulla","laguadalupana","laguadalupe","laguadeloupe","laguasima","laguna","laguna-beach","laguna-chica-pueblo-nuevo","laguna-de-farfan","laguna-de-guadalupe","laguna-de-san-vicente","laguna-de-santa-rita","laguna-de-vaquerias","laguna-del-cofre","laguna-del-mante","laguna-heights","laguna-hills","laguna-larga","laguna-larga-de-cortes","laguna-niguel","laguna-park","laguna-seca","laguna-vista","laguna-woods","lagunabeach","lagunachicapueblonuevo","lagunadefarfan","lagunadeguadalupe","lagunadelcofre","lagunadelmante","lagunadelreyquimicasdelrey","lagunadesantarita","lagunadesanvicente","lagunadetabernillaselresbaloso","lagunadevaquerias","lagunaheights","lagunahills","lagunalarga","lagunalargadecortes","lagunaniguel","lagunapark","lagunaseca","lagunavista","lagunawoods","laguneta","lagunilla","lagunillas","lagunitas","lagunitas-forest-knolls","lagunitasforestknolls","lah","lahabra","lahabraheights","lahaina","laharpe","lahautesaintcharles","laherradura","lahiguera","lahiguerillaloslirios","lahigueritacoloniasanrafael","lahoma","lahorquetapobladodoce","lahuacana","lahuanica","lahuerta","lahumedad","laibericalagotera","laie","laindependencia","laindependencialaspilas","laingsburg","laisla","laisladechapachapa","laislakilometro10","laislakm10","lajolla","lajoya","lajoyadecalvillo","lajunta","lake","lake-alfred","lake-andes","lake-arbor","lake-arrowhead","lake-arthur","lake-barcroft","lake-barrington","lake-belvedere-estates","lake-bluff","lake-brownwood","lake-butler","lake-camelot","lake-carmel","lake-catherine","lake-charles","lake-city","lake-clarke-shores","lake-como","lake-cowichan","lake-crystal","lake-dalecarlia","lake-dallas","lake-darby","lake-delton","lake-dunlap","lake-echo","lake-elmo","lake-elsinore","lake-erie-beach","lake-fenton","lake-forest","lake-forest-park","lake-geneva","lake-grove","lake-hallie","lake-hamilton","lake-havasu-city","lake-helen","lake-heritage","lake-hiawatha","lake-holiday","lake-hopatcong","lake-in-the-hills","lake-isabella","lake-jackson","lake-junaluska","lake-katrine","lake-kiowa","lake-koshkonong","lake-lakengren","lake-latonka","lake-lorraine","lake-los-angeles","lake-lotawana","lake-lucerne","lake-lure","lake-luzerne","lake-mack-forest-hills","lake-magdalene","lake-marcel-stillwater","lake-mary","lake-meade","lake-michigan-beach","lake-mills","lake-mohawk","lake-mohegan","lake-montezuma","lake-monticello","lake-morton-berrydale","lake-murray-of-richland","lake-nacimiento","lake-nebagamon","lake-norman-of-catawba","lake-odessa","lake-of-the-pines","lake-of-the-woods","lake-orion","lake-oswego","lake-ozark","lake-panasoffkee","lake-panorama","lake-park","lake-placid","lake-pleasant","lake-pocotopaug","lake-providence","lake-purdy","lake-ridge","lake-ripley","lake-ronkonkoma","lake-saint-croix-beach","lake-saint-louis","lake-san-marcos","lake-sarasota","lake-secession","lake-shore","lake-station","lake-stevens","lake-stickney","lake-success","lake-summerset","lake-tansi","lake-telemark","lake-view","lake-villa","lake-village","lake-waccamaw","lake-wales","lake-wazeecha","lake-wildwood","lake-winnebago","lake-wisconsin","lake-wissota","lake-worth","lake-worth-beach","lake-worth-corridor","lake-wylie","lake-wynonah","lake-zurich","lakealfred","lakeandes","lakearbor","lakearrowhead","lakearthur","lakebarcroft","lakebarrington","lakebelvedereestates","lakebluff","lakebrownwood","lakebutler","lakecamelot","lakecarmel","lakecatherine","lakecharles","lakecity","lakeclarkeshores","lakecomo","lakecowichan","lakecrystal","lakedalecarlia","lakedallas","lakedarby","lakedelton","lakedunlap","lakeecho","lakeelmo","lakeelsinore","lakeeriebeach","lakefenton","lakefield","lakeforest","lakeforestpark","lakegeneva","lakegrove","lakehallie","lakehamilton","lakehavasucity","lakehelen","lakeheritage","lakehiawatha","lakehills","lakeholiday","lakehopatcong","lakehurst","lakeinthehills","lakeisabella","lakejackson","lakejunaluska","lakekatrine","lakekiowa","lakekoshkonong","lakelakengren","lakeland","lakeland-highlands","lakeland-north","lakeland-south","lakeland-village","lakelandhighlands","lakelandnorth","lakelandsouth","lakelandvillage","lakelatonka","lakelorraine","lakelosangeles","lakelotawana","lakelucerne","lakelure","lakeluzerne","lakemackforesthills","lakemagdalene","lakemarcelstillwater","lakemary","lakemeade","lakemichiganbeach","lakemills","lakemohawk","lakemohegan","lakemont","lakemontezuma","lakemonticello","lakemoor","lakemore","lakemortonberrydale","lakemurrayofrichland","lakenacimiento","lakenebagamon","lakenormanofcatawba","lakeodessa","lakeofthepines","lakeofthewoods","lakeorion","lakeoswego","lakeozark","lakepanasoffkee","lakepanorama","lakepark","lakeplacid","lakepleasant","lakepocotopaug","lakeport","lakeprovidence","lakepurdy","lakeridge","lakeripley","lakeronkonkoma","lakes","lakes-by-the-bay","lakes-of-the-four-seasons","lakesaintcroixbeach","lakesaintlouis","lakesanmarcos","lakesarasota","lakesbythebay","lakesecession","lakeshire","lakeshore","lakeside","lakeside-park","lakesidepark","lakesite","lakesofthefourseasons","lakestation","lakestevens","lakestickney","lakesuccess","lakesummerset","laketansi","laketelemark","lakeview","lakeview-estates","lakeviewestates","lakevilla","lakevillage","lakeville","lakewaccamaw","lakewales","lakeway","lakewazeecha","lakewildwood","lakewinnebago","lakewisconsin","lakewissota","lakewood","lakewood-club","lakewood-park","lakewood-shores","lakewoodclub","lakewoodpark","lakewoodshores","lakeworth","lakeworthbeach","lakeworthcorridor","lakewylie","lakewynonah","lakezurich","lakin","lakota","lalabor","lalaborcita","lalaguna","lalagunaymontedelcastillo","lalagunilla","lalaja","lalibertad","lalima","lalinea","lalira","lallave","lalobera","laloma","lalomacuexcontitlan","lalomadelosnegritos","lalomalalomadequila","lalucha","laluz","laluzdejuarez","lamadrid","lamagdalena","lamagdalenachichicaspa","lamagdalenatenexpan","lamagdalenatetelamorelos","lamagdalenatlaltelulco","lamagdalenayancuitlalpan","lamalbaie","lamanga2daseccioneljobal","lamanzanilla","lamanzanilladelapaz","lamar","lamarque","lamartine","lambert","lambertville","lambton-baby-point","lambton-shores","lambtonbabypoint","lambtonshores","lame-deer","lamedeer","lamesa","lamesadechosto","lamesadelosconejos","lamesalamesadecedano","lamesilla","lamezquitera","lamina","laminerve","lamintzitapiedradura","lamira","lamirada","lamision","lamohonera","lamojonera","lamoncada","lamoni","lamonja","lamont","lamonte","lamoreaux","lampasas","lampazos-de-naranjo","lampazosdenaranjo","lampeter","lanai-city","lanaicity","lanark","lancaster","lancaster-mill","lancastermill","lancienne-lorette","lanciennelorette","land-o-lakes","landa-de-matamoros","landadematamoros","landen","lander","landero-y-coss","landeroycoss","landin","landing","landis","landisville","landmark","landolakes","landover","landover-hills","landoverhills","landrum","lane","lanegreta","lanesborough","lanett","langdon","lange-gardien","langegardien","langenburg","langford","langham","langhorne","langhorne-manor","langhornemanor","langley","langley-park","langleypark","langston","lanham","lanham-seabrook","lanhamseabrook","lanigan","lanikai","lannon","lanoraie","lanoria","lanoriadesanantonio","lanorita","lansdale","lansdowne","lanse","lansford","lansing","lansing-westgate","lansingwestgate","lantana","lantz","lanuevaera","lanuevavictoria","lao","laordena","laorduna","laorilla","laortiga","lapahua","lapalma","lapalmalaspalmas","lapalmilla","lapalmitalapalmitadesangabriel","lapalmitayanexoslapresita","lapaloma","lapanadera","lapartida","lapastoria","lapatria","lapaz","lapazdeordaz","lape","lapedrera","lapeer","lapel","lapendencia","lapeninsula","lapenitadejaltomba","laperla","lapesca","lapiedad","lapila","lapimienta","lapine","lapinta","laplace","laplacitademorelos","laplanada","laplanadaelarenal","laplata","laplaya","laplazadellimon","lapocatiere","lapopular","laporte","laportecity","lappe","lapradera","laprairie","lapresa","lapresita","lapresitasegundocuartel","lapresumida","laprimavera","laprovidencia","laprovidenciasigloxxi","lapryor","lapuebla","lapuente","lapuertadelpilar","lapunta","lapurificacion","lapurisima","lapwai","laquemada","laquinta","laramie","larch-way","larchmont","larchway","laredo","lareforma","laresolana","laresurreccion","largo","laribera","larimer","larimore","larinconada","larinconoda","larivera","lariviera","larkfield-wikiup","larkfieldwikiup","larkspur","larksville","larned","laroca","laronge","larosa","larose","larrainzar","las-aguamitas","las-amapolas","las-animas","las-arenitas","las-armas","las-barrillas","las-bocas","las-brisas","las-canadas","las-canas","las-catarinas","las-chicharras","las-choapas","las-cieneguitas","las-colonias-de-hidalgo","las-coloradas","las-compuertas","las-cruces","las-cuevas","las-delicias","las-esperanzas-el-ranchito","las-flechas","las-flores","las-grullas-margen-derecha","las-grullas-margen-izquierda","las-higueras","las-higuerillas","las-huertas","las-huertas-tercera-seccion","las-jarretaderas","las-juntas","las-lajas","las-lajitas","las-letras","las-liebres","las-lomas","las-lomas-de-tacamichapan","las-manzanas","las-maravillas","las-margaritas","las-masas-la-luz-masas","las-mercedes-agropecuaria","las-mesas","las-mieleras","las-minas","las-moras","las-nieves","las-norias-de-ojocaliente","las-ollas","las-palmas","las-palmas-ii","las-penas","las-pilas","las-pintas","las-pintas-de-arriba","las-pintitas","las-plazuelas","las-primaveras-invernadero","las-quemazones","las-quintas-fronterizas","las-ranas","las-rosas","las-sabanetas","las-sabinas","las-taponas","las-tazas","las-torres","las-torres-de-guadalupe","las-trancas","las-trojas","las-tunas","las-varas","las-varas-estacion-babicora","las-vegas","las-veredas","las-vigas","las-vigas-de-ramirez","las-yerbitas-aserradero","lasabana","lasabinita","lasaguamitas","lasalalacaliente","lasalle","lasamapolas","lasanimas","lasara","lasardina","lasarenitas","lasarmas","lasarre","lasauceda","lasbarrillas","lasbocas","lasbrisas","lascanadas","lascanas","lascatarinas","lascension-de-notre-seigneur","lascensiondenotreseigneur","laschicharras","laschoapas","lascieneguitas","lascoloniasdehidalgo","lascoloradas","lascompuertas","lascruces","lascuevas","lasdelicias","laselva","laselvabeach","lasesperanzaselranchito","lasflechas","lasflores","lasgolondrinasfraccionamiento","lasgrullasmargenderecha","lasgrullasmargenizquierda","lashigueras","lashiguerillas","lashuertas","lashuertasterceraseccion","lasidra","lasjarretaderas","lasjuntas","laslajas","laslajitas","lasletras","lasliebres","laslomas","laslomasdetacamichapan","lasmanzanas","lasmaravillas","lasmargaritas","lasmasaslaluzmasas","lasmercedesagropecuaria","lasmesas","lasmieleras","lasminas","lasmoras","lasnieves","lasnoriasdeojocaliente","lasolana","lasoledad","lasoledadbarrio","lasollas","lasombra","laspalmas","laspalmasii","laspenas","laspilas","laspintas","laspintasdearriba","laspintitas","lasplazuelas","lasprimaverasinvernadero","lasquemazones","lasquintasfronterizas","lasquintasfronterizascolonia","lasranas","lasrosas","lassabanetas","lassabinas","lassen","lassomption","lastaponas","lastazas","lastorres","lastorresdeguadalupe","lastrancas","lastrojas","lastunas","lasubida","lasvaras","lasvarasestacionbabicora","lasvegas","lasveredas","lasvigas","lasvigasderamirez","lasyerbitasaserradero","lat","latabaquera","latesorera","latham","lathrop","lathrup-village","lathrupvillage","latigrilla","latijera","latimer","latinaja","latoma","laton","latortuga","latrinidad","latrinidadchautenco","latrinidadchimalpa","latrinidadtenexyecac","latrinidadtianguismanalco","latrinitaria","latrobe","latta","lattingtown","latuque","lauderdale","lauderdale-by-the-sea","lauderdale-lakes","lauderdalebythesea","lauderdalelakes","lauderhill","laughlin","laughlin-air-force-base","laughlinairforcebase","launidadhuitzizilapan","launion","launiondelcuatro","launionejidomexcaltepec","launionpasolargo","laupahoehoe","laurel","laurel-bay","laurel-hill","laurel-hollow","laurel-lake","laurel-park","laurel-springs","laurelbay","laureldale","laureles","laurelhill","laurelhollow","laurellake","laurelpark","laurelsprings","laurelton","laurence-harbor","laurenceharbor","laurens","laurentides","laurinburg","laurium","laurys-station","laurysstation","lavaca","laval","lavale","lavalette","lavalla","lavallette","lavaltrie","laveen","lavega","laventa","laventadelastillero","laventilla","laventosa","lavergne","laverkin","laverne","lavernia","laversolilla","lavictoria","lavictorialapenita","lavilla","lavista","lavon","lavonia","lawai","lawndale","lawnside","lawnton","lawrence","lawrence-park","lawrence-park-north","lawrence-park-south","lawrenceburg","lawrencepark","lawrenceparknorth","lawrenceparksouth","lawrenceville","lawson","lawson-heights","lawsonheights","lawtell","lawton","lay","layesca","layhill","laymantown","layton","laytonville","lazacatecana","lazaro-cardenas","lazaro-cardenas-chilil","lazaro-cardenas-el-empalme","lazaro-cardenas-la-purisima","lazaro-cardenas-rancho-grande","lazaro-cardenas-santana","lazarocardenas","lazarocardenaschilil","lazarocardenaselempalme","lazarocardenaslapurisima","lazarocardenasranchogrande","lazarocardenassantana","lazy-mountain","lazymountain","lb","lbdc","lbe","lbj","lblg","lbp","lbtb","lbts","lc","lcc","lccv","lcdh","lcdl","lcdp","lce","lcee","lcf","lcg","lclc","lclp","lcm","lcn","lcpn","lcrg","lcs","lct","lcx","lcyc","ld","lda","ldb","ldc","lde","ldf","ldg","ldj","ldl","ldla","ldlc","ldle","ldlh","ldll","ldlm","ldlp","ldly","ldm","ldn","ldns","ldo","ldp","ldr","lds","ldsa","ldsc","ldsf","ldsj","ldsm","ldsp","ldsr","ldss","ldsv","ldt","ldv","ldy","ldz","le","le-bic","le-center","le-claire","le-grand","le-mars","le-plateau","le-roy","le-sueur","lea-hill","leacaman","leachville","lead","leadville","leadville-north","leadvillenorth","leadwood","league-city","leaguecity","leahill","leakesville","leakey","lealman","leamington","leander","leaside-bennington","leasidebennington","leavenworth","leavittsburg","leawood","leb","lebanon","lebanon-junction","lebanon-south","lebanonjunction","lebanonsouth","lebec","lebel-sur-quevillon","lebelsurquevillon","lebic","leblanc","lecanto","lecenter","lechee","leclaire","lecompte","leda","ledbetter","leduc","ledyard","lee","lee-acres","leeacres","leechburg","leeds","leer","lees-summit","leesburg","leesport","leessummit","leesville","leetonia","leetsdale","leez","legend-lake","legendlake","legf","legrand","lehi","lehigh-acres","lehighacres","lehighton","leicester","leilani-estates","leilaniestates","leipsic","leisure-city","leisure-knoll","leisure-village","leisure-village-east","leisure-world","leisurecity","leisureknoll","leisuretowne","leisurevillage","leisurevillageeast","leisurevillagewestpinelakepark","leisureworld","leitchfield","leith-hatfield","leithhatfield","leland","leland-grove","lelandgrove","lely","lely-resort","lelyresort","lemars","lemay","lemmon","lemmon-valley","lemmonvalley","lemon-grove","lemongrove","lemont","lemoore","lemoore-station","lemoorestation","lemoyne","lempster","lena","lenape-heights","lenapeheights","lenexa","lenj","lennox","lenoir","lenoir-city","lenoircity","lenox","lents","lenwood","leo-cedarville","leocedarville","leola","leominster","leon","leon-de-los-aldama","leon-guzman","leon-valley","leona-valley","leona-vicario","leonard","leonardo","leonardtown","leonavalley","leonavicario","leondelosaldama","leonguzman","leonia","leonvalley","leonville","leoti","lep","lepan","lepanto","lepiphanie","leplateau","lerdo-de-tejada","lerdodetejada","lerma","lerma-de-villada","lermadevillada","leroy","les-cedres","les-coteaux","les-escoumins","lesage","lescedres","lescoteaux","lesescoumins","leslie","lesslie","lester-prairie","lesterprairie","lesueur","lethbridge","lev","levant","level-green","level-park-oak-park","level-plains","levelgreen","levelland","levelparkoakpark","levelplains","leverett","levis","levittown","lewes","lewis","lewis-center","lewisburg","lewiscenter","lewisport","lewisporte","lewiston","lewiston-orchards","lewistonorchards","lewistown","lewisville","lexington","lexington-fayette","lexington-hills","lexington-park","lexingtonfayette","lexingtonhills","lexingtonpark","leyva-solano","leyvasolano","lf","lfk","lfp","lfqm","lg","lgdo","lgf","lgl","lgmd","lgmi","lgp","lh","lhc","lhh","lhll","lhpd","lhsc","lhts","li","libby","liberal","libertad","libertad-alvaro-obregon","libertad-melchor-ocampo","libertad-ventanas","libertadalvaroobregon","libertadmelchorocampo","libertadventanas","liberty","liberty-center","liberty-city","liberty-hill","liberty-lake","libertycenter","libertycity","libertyhill","libertylake","libertyville","libre-union","libres","libreunion","lic","licenciado-benito-juarez","licenciado-gustavo-diaz-ordaz","licenciadobenitojuarez","licenciadogustavodiazordaz","licking","lidc","lido-beach","lidobeach","light-street","lighthouse-point","lighthousepoint","lightstreet","ligonier","lihue","lik1","lilbourn","lilburn","lile-perrot","lileperrot","lilg","liliha-kapalama","lilihakapalama","lillington","lillooet","lilp","lily-lake","lilylake","lima","limerick","limestone","limestone-creek","limestonecreek","limington","limoges","limon","limones","linares","lincoln","lincoln-beach","lincoln-city","lincoln-heights","lincoln-park","lincoln-square","lincoln-village","lincolnbeach","lincolncity","lincolndale","lincolnheights","lincolnia","lincolnpark","lincolnshire","lincolnsquare","lincolnton","lincolnvillage","lincolnville","lincolnwood","lincroft","linda","lindale","lindavista","linden","lindenhurst","lindenwold","lindley","lindon","lindsay","lindsborg","lindstrom","lineville","linganore","linglestown","liniere","linn","linneus","linntown","lino-lakes","linolakes","linthicum","linton","linton-hall","lintonhall","linwood","lions-bay","lionsbay","lionville","lipscomb","lipuntahuaca","lisbon","lisbon-falls","lisbonfalls","lisle","listowel","litchfield","litchfield-park","litchfieldpark","lith","lithia-springs","lithiasprings","lithonia","lithopolis","lititz","little-canada","little-chute","little-cottonwood-creek-valley","little-current","little-elm","little-falls","little-ferry","little-flock","little-havana","little-neck","little-portugal","little-river","little-river-academy","little-rock","little-rock-air-force-base","little-round-lake","little-silver","little-valley","littlecanada","littlechute","littlecottonwoodcreekvalley","littlecurrent","littleelm","littlefalls","littleferry","littlefield","littleflock","littlehavana","littleneck","littleportugal","littleriver","littleriveracademy","littlerock","littlerockairforcebase","littleroundlake","littlesilver","littlestown","littleton","littleton-common","littletoncommon","littlevalley","live-oak","lively","liveoak","livermore","livermore-falls","livermorefalls","liverpool","livingston","livingston-manor","livingstonmanor","livonia","lj","ljdc","lk","ll","lla","llano","llano-de-agua","llano-de-enmedio","llano-de-la-lima","llano-de-la-puerta","llano-de-la-y","llano-de-zacapexco","llano-del-tigre","llano-grande","llano-largo","llano-suchiapa","llanodeagua","llanodeenmedio","llanodelalima","llanodelapuerta","llanodelasfloresbarriodelhueso","llanodelay","llanodeltigre","llanodezacapexco","llanogrande","llanolargo","llanosuchiapa","llb","llc","lldc","lldj","lldt","llera-de-canales","lleradecanales","lloyd-harbor","lloydharbor","lloydminster","llp","lm","lma","lmb","lmc","lmdc","lmfh","lmo","lmor","lmpd","lms","lmt","lmtm","lmy","ln","lndo","lne","lnoc","lnv","lo","lo-arado","lo-de-jesus-campo-romero","lo-de-juarez","lo-de-lamedo","lo-de-marcos","loa","loarado","lobatos","loch-lomond","lochbuie","loche","lochearn","lochlomond","lochmoor-waterway-estates","lochmoorwaterwayestates","lochsloy","lock-haven","lockeford","lockhart","lockhaven","lockland","lockney","lockport","lockport-heights","lockportheights","lockwood","locust","locust-fork","locust-grove","locust-valley","locustfork","locustgrove","locustvalley","lodejesuscamporomero","lodejuarez","lodelamedo","lodemarcos","lodi","lodo-grande","lodogrande","lofall","logan","logan-elm-village","logan-lake","logan-square","loganelmvillage","loganlake","logansport","logansquare","loganville","lol","lolo","loma","loma-alta","loma-alta-taxhimay","loma-angosta","loma-blanca","loma-bonita","loma-chapultepec","loma-de-bacum","loma-de-guadalupe-la-biznaga","loma-de-guamuchil","loma-de-juarez","loma-de-la-esperanza","loma-de-los-carmona","loma-de-los-hoyos","loma-de-san-francisco","loma-de-san-jose","loma-de-san-miguel","loma-de-sogotegoyo","loma-de-yerbabuena","loma-de-zempoala","loma-del-refugio","loma-del-rio","loma-grande","loma-la-paz","loma-larga","loma-linda","loma-pelada","loma-rica","loma-tendida","lomaalta","lomaaltataxhimay","lomaangosta","lomablanca","lomabonita","lomachapultepec","lomadebacum","lomadeguadalupelabiznaga","lomadeguamuchil","lomadejuarez","lomadelaesperanza","lomadeloscarmona","lomadeloshoyos","lomadelrefugio","lomadelrio","lomadesanfrancisco","lomadesanjose","lomadesanmiguel","lomadesogotegoyo","lomadeyerbabuena","lomadezempoala","lomagrande","lomalapaz","lomalarga","lomalargabarriodelomalarga","lomalinda","lomantan","lomapelada","lomarica","lomas-de-ahuatepec","lomas-de-altavista","lomas-de-barrillas","lomas-de-chapultepec","lomas-de-la-maestranza","lomas-de-rio-medio-cuatro","lomas-de-romero","lomas-de-san-agustin","lomas-de-san-juan","lomas-de-san-martin","lomas-de-san-pablo","lomas-de-san-sebastian","lomas-de-santa-anita","lomas-de-santa-cruz","lomas-de-tejeda","lomas-de-tenopalco","lomas-de-tepemecatl","lomas-de-tlatelolco","lomas-del-real","lomas-del-sur","lomas-verdes","lomasdeahuatepec","lomasdealtavista","lomasdebarrillas","lomasdechapultepec","lomasdelamaestranza","lomasdelreal","lomasdelsur","lomasderiomediocuatro","lomasderomero","lomasdesanagustin","lomasdesanjuan","lomasdesanmartin","lomasdesanpablo","lomasdesansebastian","lomasdesantaanita","lomasdesantacruz","lomasdetejeda","lomasdetenopalco","lomasdetepemecatl","lomasdetlatelolco","lomasverdes","lomatendida","lombard","lombardia","lomira","lomita","lomitas","lompico","lompoc","lonaconing","london","londonderry","londontowne","lone-grove","lone-jack","lone-oak","lone-pine","lone-star","lone-tree","lonegrove","lonejack","loneoak","lonepine","lonestar","lonetree","long-beach","long-branch","long-creek","long-grove","long-hill","long-island-city","long-lake","long-neck","long-prairie","long-valley","longbeach","longboat-key","longboatkey","longbranch","longcreek","longgrove","longhill","longislandcity","longlake","longmeadow","longmont","longneck","longprairie","longtown","longueuil","longvalley","longview","longview-heights","longviewheights","longwood","lonoke","lonsdale","loogootee","lookout-mountain","lookoutmountain","loomis","lopez","lopez-rayon","lopezrayon","lopezville","lorain","lorane","lordsburg","lordstown","lorena","lorenz-park","lorenzo","lorenzpark","loreto","lorette","loretto","lorignal","loris","lorraine","lorton","los-achotes","los-aguajes","los-alamitos","los-alamos","los-aldamas","los-algodones","los-almendros","los-altos","los-altos-hills","los-angeles","los-angeles-tetela","los-arana","los-arcos","los-arquitos","los-aztecas","los-azulitos","los-bahuises","los-banos","los-barriles","los-benitos","los-berros","los-cafetales","los-cajones","los-canos","los-cavazos","los-cedros","los-cenotes","los-cerritos","los-charcos","los-chavez","los-cides","los-condes","los-conos","los-corazones","los-cristales-talican","los-cues","los-desmontes","los-divorciados","los-dolores-las-quince-letras","los-dulces-nombres","los-encinos","los-fierros","los-fresnos","los-galvan","los-garcias","los-gatos","los-gavilanes","los-guajes","los-guerra","los-herreras","los-hoyos","los-hucuares","los-idolos","los-indios","los-laureles","los-limones","los-lirios","los-liros","los-lorenzos","los-lunas","los-mancera","los-mangos","los-medranos","los-mochis","los-mogotes","los-molinos","los-naranjos","los-naranjos-esquipulas","los-nicolases","los-nogales","los-ocotes","los-olivos","los-olvera","los-organos-de-san-agustin","los-osos","los-otates","los-palacios","los-parques","los-pescados","los-pilares","los-pinos","los-platanos","los-pocitos","los-pozos","los-prietos","los-ramirez","los-ramones","los-ranchos-de-albuquerque","los-remedios","los-reyes","los-reyes-acaquilpan","los-reyes-acatlixhuayan","los-reyes-de-juarez","los-reyes-de-salgado","los-reyes-quiahuixtlan","los-reyes-tlanechicolpan","los-riegos","los-robles","los-rodriguez","los-romeros","los-ruisenores","los-sabinos","los-sauces","los-saucitos","los-saucos","los-serranos","los-tepames","los-tepetates","los-tigres-san-marcos","los-torrentes","los-tuzos","los-valles","los-zacatones","losachotes","losaguajes","losalamitos","losalamos","losaldamas","losalgodones","losalmendros","losaltos","losaltoshills","losangeles","losangelestetela","losarana","losarcos","losarquitos","losaztecas","losazulitos","losbahuises","losbanos","losbarriles","losbenitos","losberros","loscafetales","loscajones","loscanos","loscavazos","loscedros","loscenotes","loscerritos","loscharcos","loschavez","loscides","loscondes","losconos","loscorazones","loscristalestalican","loscues","losdesmontes","losdivorciados","losdoloreslasquinceletras","losdulcesnombres","losencinos","losfierros","losfresnos","losgalvan","losgarcias","losgatos","losgavilanes","losguajes","losguerra","losherreras","loshoyos","loshucuares","losidolos","losindios","loslaureles","loslimones","loslirios","losliros","loslorenzos","loslunas","losmancera","losmangos","losmedranos","losmochis","losmogotes","losmolinos","losnaranjos","losnaranjosesquipulas","losnicolases","losnogales","losocotes","losolivos","losolvera","losorganosdesanagustin","lososos","losotates","lospalacios","losparques","lospescados","lospilares","lospinos","losplatanos","lospocitos","lospozos","losprietos","losramirez","losramones","losranchosdealbuquerque","losremedios","losreyes","losreyesacaquilpan","losreyesacatlixhuayan","losreyesdejuarez","losreyesdesalgado","losreyesquiahuixtlan","losreyestlanechicolpan","losriegos","losrobles","losrodriguez","losromeros","losruisenores","lossabinos","lossauces","lossaucitos","lossaucos","losserranos","lost-creek","lost-hills","lostcreek","lostepames","lostepetates","losthills","lostigressanmarcos","lostorrentes","lostuzos","losvalles","loszacatones","lotp","lotw","loudon","loudonville","loudoun-valley-estates","loudounvalleyestates","loughman","louisa","louisburg","louiseville","louisiana","louisville","loup-city","loupcity","lourdes","lovejoy","loveland","loveland-park","lovelandpark","lovell","lovelock","loves-park","lovespark","lovettsville","loving","lovingston","lovington","lowell","lowellville","lower-aiea","lower-allen","lower-allston","lower-burrell","lower-grand-lagoon","lower-lake","lower-mccully","lower-moyamensing","lower-palolo","lower-pawaa","lower-pearl-city","lower-sackville","lower-waiau","lower-west-side","lower-wilhelmina","loweraiea","lowerallen","lowerallston","lowerburrell","lowergrandlagoon","lowerlake","lowermccully","lowermoyamensing","lowerpalolo","lowerpawaa","lowerpearlcity","lowersackville","lowerwaiau","lowerwestside","lowerwilhelmina","lowes-island","lowesisland","lowesville","lowry-crossing","lowrycrossing","lowville","loxahatchee-groves","loxahatcheegroves","loxley","loyal","loyalhanna","loyola","loza-de-barrera","loza-de-los-padres","lozadebarrera","lozadelospadres","lp","lpc","lpda","lpdj","lpdl","lpdm","lpdo","lpdp","lpea","lpi","lplp","lpn","lpop","lps","lpsc","lpsx","lq","lqf","lqfc","lr","lra","lrda","lrdj","lrds","lrev","lrl","lrq","lrt","ls","lsb","lscb","lsl","lslc","lsm","lsq","lt","ltc","ltdg","ltsm","ltt","lu","lubbock","lubeck","lucama","lucan","lucas","lucas-valley-marinwood","lucasvalleymarinwood","lucasville","lucedale","lucerne","lucerne-valley","lucernevalley","luceville","luchanas","lucio-blanco-los-gavilanes","lucioblancolosgavilanes","luck","luckey","ludc","ludington","ludlow","ludowici","luem","lufkin","lugoff","luh","luis-espinoza","luis-gil-perez","luis-moya","luis-rodriguez-el-vergel","luisespinoza","luisgilperez","luismoya","luisrodriguezelvergel","lukachukai","lula","luling","lumber-city","lumbercity","lumberton","lumby","lumpkin","lumsden","luna-pier","lunapier","lunenburg","lupl","luray","lusby","lusk","lutcher","lutes-mountain","lutesmountain","luther","lutherville","lutherville-timonium","luthervilletimonium","luttrell","lutz","luverne","luxemburg","luxora","luzerne","lv","lvda","lvdr","lve","lveb","lvlp","lvm","lw","lwb","lwc","lwe","lws","ly","lya","lyc","lyford","lykens","lyman","lyme","lynbrook","lynchburg","lyncourt","lyndeborough","lynden","lyndhurst","lyndon","lyndonville","lynn","lynn-haven","lynnfield","lynnhaven","lynnwood","lynnwood-pricedale","lynnwoodpricedale","lynwood","lyon","lyons","lytle","lz","ma","mabank","mableton","mabscott","mabton","mac","macamic","macapule","macario-j-gomez-colonia","macariojgomezcolonia","macarthur","macclenny","macedon","macedonia","macedonio-alonso","macedonioalonso","machesney-park","machesneypark","machetla","machias","machiasport","macho-de-agua","machodeagua","macin-chico","macinchico","mack","mackenzie","mackinaw","macklin","maclovio-herrera","maclovio-rojas","maclovioherrera","maclovioherreracoloniaaviacion","macloviorojas","macomb","macon","mactun","macuilxochitldeartigascarranza","macultepec","macungie","macuspana","macutzio","macvilho","macy","mad","madawaska","madbury","madeira","madeira-beach","madeirabeach","madelia","madera","madera-acres","maderaacres","madill","madison","madison-center","madison-heights","madison-lake","madison-park","madisoncenter","madisonheights","madisonlake","madisonpark","madisonville","madoc","madras","madrid","maeser","mafafas","mafb","magalia","magdalena","magdalena-apasco","magdalena-atlicpac","magdalena-contreras","magdalena-cuayucatepec","magdalena-de-araceo","magdalena-de-kino","magdalena-jaltepec","magdalena-mixtepec","magdalena-ocotlan","magdalena-teitipac","magdalena-tequisistlan","magdalena-tlacotepec","magdalena-zahuatlan","magdalenaapasco","magdalenaatlicpac","magdalenacontreras","magdalenacuayucatepec","magdalenadearaceo","magdalenadekino","magdalenajaltepec","magdalenamixtepec","magdalenaocotlan","magdalenateitipac","magdalenatequisistlan","magdalenatlacotepec","magdalenazahuatlan","magdaleno-cedillo","magdalenocedillo","magee","maggie-valley","maggievalley","magisterio-digno","magisteriodigno","magna","magnolia","magog","magrath","maguarichi","maguey-blanco","magueyblanco","mahanoy-city","mahanoycity","maharishi-vedic-city","maharishivediccity","mahnomen","mahomet","mahopac","mahtomedi","mahuixtlan","mahwah","maiden","maili","maine","maitinez","maitland","maize","majastic","majomut","makaha","makaha-valley","makahavalley","makakilo","makakilo-city","makakilo-kapolei-honokai-hale","makakilocity","makakilokapoleihonokaihale","makawao","makikilowerpunchbowltantalus","makua-valley","makuavalley","malabar","malad-city","maladcity","malagana-san-antonio-del-monte","malaganasanantoniodelmonte","malakoff","malartic","mald","malden","malibu","malinalco","malinaltepec","maliotenam","mallory","malmstrom-air-force-base","malmstromairforcebase","malone","malpaso","malta","maltby","maltrata","malvern","malverne","mama","mamantel","mamaroneck","mamithi","mammoth","mammoth-lakes","mammothlakes","mamou","manahawkin","manalisco","manana-housing","mananahousing","manantiales","manasota-key","manasotakey","manasquan","manassas","manassas-park","manassaspark","manatee","manatee-road","manateeroad","manawa","manawan","manayunk","mancelona","manchaca","manchester","manchester-by-the-sea","manchester-center","manchesterbythesea","manchestercenter","mancos","mancuernas","mandan","mandeville","mangas","mango","mangonia-park","mangoniapark","mangum","manhasset","manhasset-hills","manhassethills","manhattan","manhattan-beach","manhattan-valley","manhattanbeach","manhattanvalley","manheim","mani","manila","manistee","manistique","manito","manitoba","manitou-beach-devils-lake","manitou-springs","manitoubeachdevilslake","manitousprings","manitouwadge","manitowoc","maniwaki","mankato","manlio-fabio-altamirano","manliofabioaltamirano","manlius","manly","mannford","manning","mannington","manoa","manor","manorhaven","manorville","mansfield","mansfield-center","mansfield-city","mansfieldcenter","mansfieldcity","manson","mansura","mantachie","manteca","manteno","manteo","manti","manto-del-rio-ejido","mantodelrioejido","manton","mantorville","mantua","manuel-avila-camacho","manuel-benavides","manuel-lazos","manuel-leon","manuel-maria-contreras","manuel-ojinaga","manuel-villalongin","manuelavilacamacho","manuelavilacamachoponteduro","manuelbenavides","manueledgardoavalossanisidro","manuellazos","manuelleon","manuelmariacontreras","manuelojinaga","manuelvillalongin","manvel","manville","many","many-farms","manyfarms","manzana-de-san-luis","manzana-la-cofradia","manzana-quinta-la-canada","manzana-segunda","manzana-sexta-parte-centro","manzanadesanluis","manzanalacofradia","manzanaquintalacanada","manzanasegunda","manzanasextapartecentro","manzanillo","mapachapa","mapastepec","mapimi","maple-bluff","maple-creek","maple-glen","maple-grove","maple-heights","maple-heights-lake-desire","maple-lake","maple-leaf","maple-park","maple-plain","maple-ridge","maple-shade","maple-valley","maplebluff","maplecreek","mapleglen","maplegrove","mapleheights","mapleheightslakedesire","maplelake","mapleleaf","maplepark","mapleplain","mapleridge","mapleshade","mapleton","maplevalley","maplewood","maquoketa","mar-mac","marana","marathon","maravatio-de-ocampo","maravatio-del-encinal","maravatiodelencinal","maravatiodeocampo","maravilla-tenejapa","maravillas","maravillatenejapa","marble-falls","marble-hill","marblefalls","marblehead","marblehill","marbleton","marbletown","marbury","marceline","marcelinorodriguezsanignacio","marcellus","march-air-force-base","marchairforcebase","marco","marco-island","marcoisland","marcol","marcus","marcus-hook","marcushook","marengo","marfa","marfil","margaret","margaritas","margate","margate-city","margatecity","maria","maria-de-la-torre","maria-lombardo-de-caso","mariadelatorre","marialombardodecaso","marianna","marianne","mariano-balleza","mariano-escobedo","mariano-matamoros","marianoballeza","marianoescobedo","marianomatamoros","maricopa","mariemont","marienville","marietta","marietta-alderwood","mariettaalderwood","marieville","marin","marin-city","marina","marina-del-rey","marinadelrey","marincity","marine-city","marine-corps-base-hawaii-mcbh","marinecity","marinecorpsbasehawaiimcbh","mariners-harbor","mariners-ridge","marinersharbor","marinersridge","marinette","maringouin","marion","marion-center","marioncenter","marionville","maripa","mariposa","mariscal-subikuski","mariscala-de-juarez","mariscaladejuarez","mariscalsubikuski","marissa","markdale","marked-tree","markedtree","markesan","markham","markland-wood","marklandwood","markle","marks","marksville","marlboro","marlboro-meadows","marlboro-village","marlboromeadows","marlborough","marlborovillage","marlette","marlin","marlinton","marlow","marlow-heights","marlowheights","marlton","marmac","marmaduke","marmet","maroa","marquelia","marquette","marquette-heights","marquetteheights","marrero","marriott-slaterville","marriottslaterville","marroquin","mars","mars-hill","marseilles","marshall","marshallton","marshalltown","marshallville","marshfield","marshfield-hills","marshfieldhills","marshill","marshville","marsing","marstons-mills","marstonsmills","mart","marte-r-gomez","marte-r-gomez-tobarito","martensville","martergomez","martergomeztobarito","martha-lake","marthalake","marthasville","martin","martindale","martinez","martinez-de-la-torre","martinez-dominguez","martinezdelatorre","martinezdominguez","martins-ferry","martinsburg","martinsferry","martinsville","marvell","marvin","mary-esther","maryesther","maryland","maryland-city","maryland-heights","marylandcity","marylandheights","marystown","marysville","maryvale","maryville","mas","masaryktown","mascot","mascota","mascotte","mascouche","mascoutah","mashpee","masiaca","maskinonge","mason","mason-city","masonboro","masoncity","masontown","masonville","maspeth","massac","massachusetts","massanetta-springs","massanettasprings","massanutten","massapequa","massapequa-park","massapequapark","massena","massillon","mastic","mastic-beach","masticbeach","masury","mata-de-indio","mata-loma","mata-naranjo","mata-obscura","mata-tenatito-casco-hacienda","matacapan","matachi","matadeindio","matador","matagami","mataloma","matamoras","matamoros","matanaranjo","matane","matanzas","mataobscura","matatenatitocascohacienda","matatlan","matawan","matehuala","matheny","mathews","mathis","matias-romero","matiasromero","matlahuacales-aquiles-serdan","matlahuacalesaquilesserdan","matlapa","matoaca","mattapan","mattapoisett","mattapoisett-center","mattapoisettcenter","mattawa","mattawan","matteson","matthews","mattituck","mattoon","mattydale","matzaco","matzam","maud","maugansville","mauldin","maumee","maumelle","maunawili","maurice","mauriceville","maury","mauston","mavoro","maxcanu","maxela","maximo-serdan","maximoserdan","maxtleca-de-galeana","maxtlecadegaleana","maxton","maxwell","maya-balam","maya-tecun-i","mayabalam","mayanalan","mayapan","mayatecuni","maybrook","mayer","mayersville","mayerthorpe","mayfield","mayfield-heights","mayfieldheights","mayflower","mayflower-village","mayflowervillage","maynard","maynardville","mayo","mayodan","mayor-wright-housing","mayorazgo-de-leon","mayorazgodeleon","mayorwrighthousing","mayran","mays-chapel","mays-landing","mayschapel","mayslanding","maysville","maytown","mayville","maywood","mazaltepec","mazamitla","mazapa","mazapil","mazapiltepec","mazatan","mazatecochco","mazatepec","mazateupa","mazatlan","mazatlan-villa-de-flores","mazatlanvilladeflores","mazin-grande","mazingrande","mazomanie","mazumiapam","mb","mbdl","mbts","mc","mcadoo","mcalester","mcallen","mcalmont","mcarthur","mccall","mccamey","mccaysville","mcchord-air-force-base","mcchordairforcebase","mccleary","mccloud","mcclusky","mccoll","mccomb","mcconnell-afb","mcconnellafb","mcconnellsburg","mcconnellstown","mcconnelsville","mccook","mccord","mccordsville","mccormick","mccrory","mccullom-lake","mccullomlake","mccully-moiliili","mccullymoiliili","mcdonald","mcdonough","mce","mcewen","mcfarland","mcgehee","mcgill","mcgovern","mcgraw","mcgregor","mcguire-afb","mcguireafb","mchenry","mcintosh","mckee","mckees-rocks","mckeesport","mckeesrocks","mckenzie","mckinley-heights","mckinley-park","mckinleyheights","mckinleypark","mckinleyville","mckinney","mckownville","mclean","mcleansboro","mcleansville","mclendon-chisholm","mclendonchisholm","mclennan","mcloud","mcmechen","mcmillin","mcminnville","mcmurray","mcpherson","mcqueeney","mcrae","mcsherrystown","md","mda","mdac","mdb","mdc","mde","mdg","mdh","mdi","mdj","mdk","mdl","mdll","mdlm","mdls","mdlt","mdm","mdn","mdo","mdp","mdpd","mdr","mdre","mds","mdsa","mdsj","mdsl","me","mead","mead-valley","meade","meadow-glade","meadow-lake","meadow-lakes","meadow-oaks","meadow-vista","meadow-woods","meadowbrook","meadowdale","meadowglade","meadowlake","meadowlakes","meadowoaks","meadowood","meadows-place","meadowsplace","meadowvista","meadowwoods","meads","meadvalley","meadview","meadville","meaford","mebane","mecapalapa","mecatan","mecatepec","mecatlan","mecayapan","mecca","mechanic-falls","mechanicfalls","mechanicsburg","mechanicstown","mechanicsville","mechanicville","mechoacanejo","mecoacan","mecoacan2daseccionsanlorenzo","medellin-de-bravo","medellindebravo","medellinymaderosegundaseccion","medfield","medford","medford-lakes","medfordlakes","media","mediapolis","medias-aguas","mediasaguas","medical-lake","medicallake","medicine-hat","medicine-lodge","medicinehat","medicinelodge","medina","medinah","medio-sitio","mediositio","medora","medulla","medway","meeker","meggett","mehlville","meigs","meiners-oaks","meinersoaks","melbourne","melbourne-beach","melbournebeach","melcher-dallas","melcherdallas","melchor-ocampo","melchorocampo","melfort","melissa","melita","meliton-albanez-dominguez","melitonalbanezdominguez","mellwood","melocheville","melody-hill","melodyhill","melrose","melrose-park","melrosepark","melville","melvindale","memphis","mena","menahga","menands","menard","menasha","mendenhall","mendez","mendham","mendocino","mendon","mendota","mendota-heights","mendotaheights","menifee","menlo-park","menlopark","menominee","menomonee-falls","menomoneefalls","menomonie","menores","mentone","mentor","mentor-on-the-lake","mentoronthelake","meoqui","mequetla","mequon","meraux","merced","merced-del-potrero","merceddelpotrero","mercedes","mercer","mercer-island","mercerisland","mercersburg","mercerville","mercerville-hamilton-square","mercervillehamiltonsquare","merchantville","mercier","meredith","meredosia","merida","meriden","meridian","meridian-hills","meridian-station","meridianhills","meridianstation","meridianville","merino","merkel","merlin","mermaid","merriam","merriam-woods","merriamwoods","merrick","merrifield","merrill","merrillville","merrimac","merrimack","merrionette-park","merrionettepark","merritt","merritt-island","merritt-park","merrittisland","merrittpark","merrydale","merryville","merton","mertzon","mesa","mesa-de-guadalupe","mesa-del-huracan","mesa-del-nayar","mesa-grande","mesa-verde","mesadeguadalupe","mesadelhuracan","mesadelnayar","mesagrande","mesaverde","mescal","mescalero","mesilla","mesillas","meson-de-los-sauces","mesondelossauces","mesonnuevocanadadelamagdalena","mesquite","metabetchouan","metabetchouan-lac-a-la-croix","metabetchouanlacalacroix","metairie","metairie-terrace","metairieterrace","metamora","metapa","metcalfe","metchosin","metepec","metepec-primero","metepecprimero","methuen","metlachernandezmetlacprimero","metlakatla","metlaltoyuca","metlapa","metlatonoc","metropolis","metter","metuchen","metzger","metztitlan","mex","mexcala","mexcalcuautla","mexia","mexicali","mexicaltzingo","mexicanos","mexico","mexico-beach","mexico-city","mexicobeach","mexicocity","mexicostate","mexpan","mexquitic-de-carmona","mexquiticdecarmona","mextepec","mexticacan","meyersdale","mezapa-la-fabrica","mezapalafabrica","mezcala","mezcales","mezquital-del-oro","mezquitaldeloro","mezquite-de-luna","mezquite-de-sotelo","mezquite-gordo","mezquitedeluna","mezquitedesotelo","mezquitegordo","mezquitic","mezquitic-de-la-magdalena","mezquiticdelamagdalena","mezquititlan","mf","mfa","mg","mgs","mh","mhca","mhh","mhld","mhmp","mhs","mhv","mi","mi-patria-es-primero","miacatlan","miahuatlan","miahuatlan-de-porfirio-diaz","miahuatlandeporfiriodiaz","miami","miami-beach","miami-dade","miami-gardens","miami-heights","miami-lakes","miami-shores","miami-springs","miamibeach","miamidade","miamigardens","miamiheights","miamilakes","miamisburg","miamishores","miamisprings","miamitown","mic","micco","michac","michapa","michigan","michigan-center","michigan-city","michigancenter","michigancity","michimaloya","michoacan-de-ocampo","michoacandeocampo","mid-cambridge","mid-city","midcambridge","midcity","middle-island","middle-river","middle-valley","middle-village","middleborough","middleborough-center","middleboroughcenter","middlebourne","middleburg","middleburg-heights","middleburgh","middleburgheights","middlebury","middlebury-village","middleburyvillage","middlebush","middlefield","middleisland","middleport","middleriver","middlesboro","middlesex","middleton","middletown","middlevalley","middlevillage","middleville","midfield","midland","midland-beach","midland-city","midland-park","midlandbeach","midlandcity","midlandpark","midlothian","midpines","midtown","midvale","midway","midway-atoll","midway-city","midway-north","midway-south","midwayatoll","midwaycity","midwaynorth","midwaysouth","midwest-city","midwestcity","mier","mier-y-noriega","mierynoriega","mifflinburg","mifflintown","mifflinville","mignon","miguel-ahumada","miguel-aleman-la-doce","miguel-auza","miguel-hidalgo","miguel-negrete","miguel-utrilla-los-chorros","miguelahumada","miguelalemanladoce","miguelauza","miguelhidalgo","miguelnegrete","miguelutrillaloschorros","miguelvaldezquinteroelcorazon","mikoma","mila-doce","milaca","miladoce","milagros","milam","milan","milbank","milbridge","mildmay","miles-city","milesburg","milescity","milford","milford-mill","milfordmill","mililani-mauka-launani-valley","mililani-town","mililanimaukalaunanivalley","mililanitown","mill-city","mill-creek","mill-creek-east","mill-hall","mill-neck","mill-plain","mill-valley","mill-woods-town-centre","millbourne","millbrae","millbrook","millburn","millbury","millcity","millcreek","millcreekeast","milledgeville","millen","miller","miller-place","millerplace","millers-creek","millers-falls","millersburg","millerscreek","millersfalls","millersport","millersville","millet","millhall","milliken","millington","millinocket","millis","millis-clicquot","millisclicquot","millneck","millplain","mills","mills-river","millsboro","millsriver","millstadt","milltown","millvale","millvalley","millville","millwood","millwoodstowncentre","milo","milpa-alta","milpaalta","milpas-viejas","milpasviejas","milpillas","milpitas","milroy","milton","milton-center","milton-freewater","milton-upper-mills","milton-village","miltoncenter","miltonfreewater","miltonuppermills","miltonvillage","milwaukee","milwaukie","mimico","mims","mina","mina-mexico","mina-vieja","minamexico","minas-de-barroteran","minasdebarroteran","minatitlan","minavieja","minco","minden","mineola","mineral","mineral-de-angangueo","mineral-de-la-luz","mineral-del-monte","mineral-point","mineral-ridge","mineral-springs","mineral-wells","mineraldeangangueo","mineraldelaluz","mineraldelmonte","mineralpoint","mineralridge","mineralsprings","mineralwells","minersville","minerva","minerva-park","minervapark","minetto","mineville","mingo-junction","mingojunction","minier","minkler","minneapolis","minnedosa","minnehaha","minneola","minneota","minnesota","minnetonka","minnetonka-mills","minnetonkamills","minnetrista","minnewaukan","minoa","minonk","minooka","minor","minorca","minot","minot-air-force-base","minotairforcebase","minster","mint-hill","minthill","minturn","minzapan","mio","mipatriaesprimero","miquihuana","mira-mesa","mira-monte","mirabel","miraflores","miramar","miramar-beach","miramarbeach","miramesa","miramichi","miramonte","miravalle","miravalles","mirrormont","misantla","mishawaka","mishicot","misija","mision-de-chichimecas","mision-san-pablo","misiondechichimecas","misionsanpablo","mission","mission-bend","mission-canyon","mission-district","mission-hill","mission-hills","mission-viejo","missionbend","missioncanyon","missiondistrict","missionhill","missionhills","missionviejo","mississauga","mississauga-beach","mississaugabeach","mississippi","missoula","missouri","missouri-city","missouri-valley","missouricity","missourivalley","mistissini","mitchell","mitchellville","mitras-poniente","mitrasponiente","mitziton","mixcum","mixquiahuala-de-juarez","mixquiahualadejuarez","mixquiapan","mixtla","mixtla-de-altamirano","mixtladealtamirano","mixtlalcingo","mixtlan","mj","mjgc","mk","mkhh","ml","ml1s","mlc","mldc","mlf","mll","mln","mlp","mlpt","mm","mmc","mmdj","mmlv","mmpa","mn","mo","moab","moanalua-valley","moanaluavalley","moapa-town","moapa-valley","moapatown","moapavalley","moberly","mobile","mobridge","mochicahui","mochis","mochitlan","mocksville","mococha","mocorito","moctezuma","moctezuma-sonora","moctezumasonora","modena-park","modenapark","modesto","modoc","mogadore","mogul","mohall","mohave","mohave-valley","mohavevalley","mohawk","mohnton","mohoneras","moiliili","mojarras","mojave","mokena","mokuleia","molalla","molango","molas","moline","moline-acres","molineacres","molino","molino-abajo","molino-de-camou","molino-de-san-jose","molino-de-santa-ana","molinoabajo","molinodecamou","molinodesanjose","molinodesantaana","molinos","moloacan","momax","momence","mompani","mona","monaca","monahans","monarch-mill","monarchmill","moncks-corner","monckscorner","monclova","monclova-primer-sector","monclova-segundo-sector","monclovaprimersector","monclovasegundosector","moncton","mondovi","monee","monessen","monett","monette","monfort-heights","monfortheights","monmouth","monmouth-beach","monmouth-junction","monmouthbeach","monmouthjunction","mono","mono-vista","monon","monona","monongah","monongahela","monovista","monroe","monroe-city","monroe-north","monroecity","monroenorth","monroeville","monrovia","monsey","monson","monson-center","monsoncenter","mont-alto","mont-belvieu","mont-joli","mont-laurier","mont-royal","mont-saint-gregoire","mont-saint-hilaire","mont-tremblant","mont-vernon","montague","montalto","montalvin","montana","montana-city","montana-monarca-punta-altozano","montanacity","montanamonarcapuntaaltozano","montara","montauk","montbelvieu","montclair","monte-alegre","monte-alto","monte-blanco","monte-calvario","monte-del-coecillo","monte-escobedo","monte-grande","monte-kristal","monte-largo-1ra-seccion","monte-obscuro","monte-redondo","monte-rio","monte-salas","monte-sereno","monte-verde","monte-verde-chiveria","monte-vista","monteagle","montealegre","montealto","montebello","monteblanco","montecalvario","montecillo","montecillos","montecito","montecristo","montedelcoecillo","monteescobedo","montegrande","montegut","montekristal","montelargo1raseccion","monteleon","montello","montemorelos","montenegro","montenegro-la-lana","montenegrolalana","monteobscuro","monteon","monteredondo","monterey","monterey-park","montereypark","monterio","monterrey","montesalas","montesano","montesereno","montevallo","monteverde","monteverdechiveria","montevideo","montevista","montezuma","montgomery","montgomery-city","montgomery-village","montgomerycity","montgomeryvillage","montgomeryville","monticello","montjoli","montlaurier","montmagny","montoro","montour-falls","montourfalls","montoursville","montpelier","montreal","montreal-est","montreal-ouest","montrealest","montrealouest","montrose","montrose-ghent","montroseghent","montross","montroyal","montsaintgregoire","montsainthilaire","monttremblant","montura","montvale","montverde","montvernon","montville-center","montvillecenter","montz","monument","monument-beach","monument-hills","monumentbeach","monumenthills","moodus","moody","moonachie","moorcroft","moore","moore-haven","moorefield","moorehaven","mooreland","moores-mill","mooresmill","moorestown-lenola","moorestownlenola","mooresville","moorhead","moorpark","moose-factory","moose-jaw","moose-lake","moose-wilson-road","moosefactory","moosejaw","mooselake","moosewilsonroad","moosic","moosomin","moosonee","moosup","mor","mora","mora-villalobos","morada","moraga","moraine","morales","moralillo","moras","moravia","moravian-falls","moravianfalls","moravillalobos","morden","morehead","morehead-city","moreheadcity","moreland","moreland-hills","morelandhills","morelia","morelita","morelos","morelos-canada","morelos-piedra-3ra-seccion","moreloscanada","morelospiedra3raseccion","morenci","moreno-valley","morenovalley","moretown","morgan","morgan-city","morgan-hill","morgan-park","morgancity","morgandale","morganfield","morganhill","morganpark","morgans-point-resort","morganspointresort","morganton","morgantown","morganville","moriarty","moriches","morin-heights","morinheights","morinville","moris","morningside","morningside-heights","morningsideheights","moro","morocco","morocoy","moroleon","moroncarit","morongo-valley","morongovalley","moroni","morrell-park","morrellpark","morrilton","morris","morris-heights","morris-park","morris-plains","morrisania","morrisburg","morrisheights","morrison","morrisonville","morrispark","morrisplains","morristown","morrisville","morro-bay","morrobay","morrow","morton","morton-grove","mortongrove","moscow","moscow-mills","moscowmills","moses-lake","moses-lake-north","moseslake","moseslakenorth","mosheim","mosinee","mosj","mosquero","moss-beach","moss-bluff","moss-park","moss-point","mossbeach","mossbluff","mosspark","mosspoint","motl","motley","motovatha","motozintla","mott","mott-haven","motthaven","motul","motzorongo","moulton","moultonborough","moultrie","mound","mound-bayou","mound-city","moundbayou","moundcity","moundridge","mounds","mounds-view","moundsview","moundsville","moundville","mount-airy","mount-albert","mount-angel","mount-arlington","mount-ayr","mount-brydges","mount-carmel","mount-carroll","mount-clemens","mount-cobb","mount-dennis","mount-dora","mount-ephraim","mount-gay-shamrock","mount-gilead","mount-greenwood","mount-healthy","mount-healthy-heights","mount-hermon","mount-holly","mount-holly-springs","mount-hood-village","mount-hope","mount-horeb","mount-ida","mount-ivy","mount-jackson","mount-joy","mount-juliet","mount-kisco","mount-laurel","mount-lebanon","mount-morris","mount-olive","mount-oliver","mount-olivet","mount-olympus","mount-orab","mount-pearl","mount-penn","mount-pleasant","mount-pleasant-east","mount-pleasant-west","mount-plymouth","mount-pocono","mount-prospect","mount-pulaski","mount-rainier","mount-repose","mount-shasta","mount-sinai","mount-sterling","mount-union","mount-vernon","mount-vista","mount-washington","mount-wolf","mount-zion","mountain-brook","mountain-city","mountain-green","mountain-grove","mountain-home","mountain-house","mountain-iron","mountain-lake","mountain-lake-park","mountain-lakes","mountain-lodge-park","mountain-park","mountain-ranch","mountain-road","mountain-top","mountain-view","mountain-view-acres","mountain-village","mountainaire","mountainbrook","mountaincity","mountaingreen","mountaingrove","mountainhome","mountainhouse","mountainiron","mountainlake","mountainlakepark","mountainlakes","mountainlodgepark","mountainpark","mountainranch","mountainroad","mountainside","mountaintop","mountainview","mountainviewacres","mountainvillage","mountairy","mountalbert","mountangel","mountarlington","mountayr","mountbrydges","mountcarmel","mountcarroll","mountclemens","mountcobb","mountdennis","mountdora","mountephraim","mountgayshamrock","mountgilead","mountgreenwood","mounthealthy","mounthealthyheights","mounthermon","mountholly","mounthollysprings","mounthoodvillage","mounthope","mounthoreb","mountida","mountivy","mountjackson","mountjoy","mountjuliet","mountkisco","mountlake-terrace","mountlaketerrace","mountlaurel","mountlebanon","mountmorris","mountolive","mountoliver","mountolivesilverstonejamestown","mountolivet","mountolympus","mountorab","mountpearl","mountpenn","mountpleasant","mountpleasanteast","mountpleasantwest","mountplymouth","mountpocono","mountprospect","mountpulaski","mountrainier","mountrepose","mountshasta","mountsinai","mountsterling","mountunion","mountvernon","mountville","mountvista","mountwashington","mountwolf","mountzion","moville","mowbray-mountain","mowbraymountain","moweaqua","moyahua-de-estrada","moyahuadeestrada","moyoapan","moyock","moyos","moyotepec","moyotepec-moyotepec-de-juarez","moyotepecmoyotepecdejuarez","moyotzingo","mozomboa","mp","mp3s","mpe","mpep","mpr","mps","mpw","mqlc","mr","mrg","mrgt","mrsi","ms","msg","msh","msim","msp","mspc","mss","mt","mtch","mti","mu","muenster","muhlenberg-park","muhlenbergpark","mukilteo","mukwonago","mulberry","mulc","muldrow","mulege","muleshoe","mulino","mullen","mullens","mullica-hill","mullicahill","mullins","multe","multnomah","mulvane","mum","muna","muncie","muncy","munday","mundelein","mundo-nuevo","mundonuevo","mundys-corner","mundyscorner","munford","munfordville","munhall","munising","munitepec-de-madero","munitepecdemadero","muniz","munoz","munroe-falls","munroefalls","munsey-park","munseypark","munsons-corners","munsonscorners","munster","muquen","murdo","murfreesboro","murillo-colonia","murillocolonia","murphy","murphys","murphys-estates","murphysboro","murphysestates","murray","murraysville","murrells-inlet","murrellsinlet","murrieta","murrieta-hot-springs","murrietahotsprings","murrysville","muscatine","muscle-shoals","muscleshoals","muscoda","muscoy","muse","muskego","muskegon","muskegon-heights","muskegonheights","muskogee","mustang","muttontown","muxupip","mv","mva","mvc","mvdf","mvrg","mw","mwh","mwr","mwtc","myers-corner","myerscorner","myerstown","myersville","myn","myrtle-beach","myrtle-creek","myrtle-grove","myrtle-point","myrtlebeach","myrtlecreek","myrtlegrove","myrtlepoint","myrtletown","mystic","mystic-island","mysticisland","mz","na","nac","nacajuca","nachig","naco","nacogdoches","nacori-chico","nacorichico","nacozari-de-garcia","nacozari-viejo","nacozaridegarcia","nacozariviejo","nacuche","nadadores","nafb","nag","nags-head","nagshead","nahanni-butte","nahannibutte","nahant","nahuatzen","nahunta","naica","nakusp","nal","nambe","namiquipa","nampa","nanacatlan","nanahuatipam","nanaimo","nanakuli","nanawale-estates","nanawaleestates","nanticoke","nanton","nantucket","nanty-glo","nantyglo","nantzha","nanuet","naolinco-de-victoria","naolincodevictoria","napa","napanee","napanee-downtown","napaneedowntown","napanoch","napavine","naperville","napierville","napili-honokowai","napilihonokowai","naples","naples-manor","naples-park","naplesmanor","naplespark","napoleon","napoleonville","nappanee","naranja","naranja-de-tapia","naranjadetapia","naranjal","naranjo","naranjos","narberth","narciso-mendoza","narcisomendoza","narragansett","narragansett-pier","narragansettpier","narrows","nash","nashotah","nashua","nashville","nassau","nassau-bay","nassau-village-ratliff","nassaubay","nassauvillageratliff","natalbany","natalia","natchez","natchitoches","natick","national-city","national-harbor","national-park","nationalcity","nationalharbor","nationalpark","nativitas","naucalpan-de-juarez","naucalpandejuarez","naugatuck","naupan","nautla","nauvoo","nauzontla","nava","navajas","navajo","naval-academy","navalacademy","navarre","navarrete","navasota","navassa","navassa-island","navassaisland","navenchauc","navesink","navojoa","navolato","navy-yard-city","navyyardcity","nay","nayarit","nazareno","nazareth","nazas","nb","nba","nbh","nbs","nbsp","nbv","nc","ncg","nch","nck","ncm","ncn","nct","nd","nda","ndb","ndbn","ndd","nddg","nddl","nddp","ndg","ndh","ndj","ndm","ndph","ndr","ndt","ndv","ne","nealtican","near-north-side","near-south-side","nearnorthside","nearsouthside","neb","nebraska","nebraska-city","nebraskacity","necaxa","necoxcalco","necoxtla","nederland","nedrow","neebing","needham","needles","needville","neenah","neepawa","negaunee","negritas","neillsville","nejapa","nejapa-de-madero","nejapademadero","nekoosa","neligh","nellieburg","nellis-air-force-base","nellisairforcebase","nellysford","nelson","nelsonville","nem","nenehuaca","neodesha","neoga","neosho","nepantladesorjuanainesdelacruz","nepean","nephi","neponsit","nepopualco","neptune-beach","neptune-city","neptunebeach","neptunecity","nesconset","nescopeck","nesquehoning","ness-city","nesscity","netcong","nettleton","netzahualcoyotl","neuse-forest","neuseforest","neutla","neuville","nevada","nevada-city","nevadacity","new-albany","new-athens","new-augusta","new-baden","new-baltimore","new-beaver","new-bedford","new-berlin","new-berlinville","new-bern","new-bloomfield","new-boston","new-braunfels","new-bremen","new-brighton","new-britain","new-brockton","new-brunswick","new-buffalo","new-burlington","new-california","new-canaan","new-caney","new-carlisle","new-carrollton","new-cassel","new-castle","new-castle-northwest","new-century-ks","new-chicago","new-city","new-columbia","new-concord","new-cumberland","new-dorp","new-dorp-beach","new-durham","new-eagle","new-egypt","new-ellenton","new-fairfield","new-fairview","new-franklin","new-freedom","new-glarus","new-glasgow","new-gloucester","new-hamburg","new-hampshire","new-hampton","new-hartford","new-hartford-center","new-haven","new-hempstead","new-holland","new-holstein","new-hope","new-hyde-park","new-iberia","new-ipswich","new-jersey","new-johnsonville","new-kensington","new-kent","new-kingman-butler","new-lebanon","new-lenox","new-lexington","new-lisbon","new-llano","new-london","new-madrid","new-market","new-marlborough","new-martinsville","new-maryland","new-matamoras","new-mexico","new-miami","new-middletown","new-milford","new-orleans","new-oxford","new-palestine","new-paltz","new-paris","new-pekin","new-philadelphia","new-plymouth","new-port-richey","new-port-richey-east","new-prague","new-preston","new-providence","new-richland","new-richmond","new-river","new-roads","new-rochelle","new-rockford","new-sarpy","new-sharon","new-shoreham","new-smyrna-beach","new-south-memphis","new-springville","new-square","new-stanton","new-summerfield","new-tazewell","new-territory","new-toronto","new-town","new-ulm","new-union","new-vienna","new-waterford","new-waverly","new-wes-valley","new-westminster","new-whiteland","new-wilmington","new-windsor","new-york","new-york-city","new-york-mills","newalbany","newark","newathens","newaugusta","newaygo","newbaden","newbaltimore","newbeaver","newbedford","newberg","newberlin","newberlinville","newbern","newberry","newbloomfield","newboston","newbraunfels","newbremen","newbrighton","newbritain","newbrockton","newbrunswick","newbuffalo","newburg","newburgh","newburgh-heights","newburghheights","newburlington","newbury","newburyport","newcalifornia","newcanaan","newcaney","newcarlisle","newcarrollton","newcassel","newcastle","newcastlenorthwest","newcenturyks","newchicago","newcity","newcolumbia","newcomerstown","newconcord","newcumberland","newdorp","newdorpbeach","newdurham","neweagle","newegypt","newell","newellenton","newellton","newfairfield","newfairview","newfane","newfield","newfoundland","newfoundland-and-labrador","newfoundlandandlabrador","newfranklin","newfreedom","newglarus","newglasgow","newgloucester","newhamburg","newhampshire","newhampton","newhartford","newhartfordcenter","newhaven","newhempstead","newholland","newholstein","newhope","newhydepark","newiberia","newington","newipswich","newjersey","newjohnsonville","newkensington","newkent","newkingmanbutler","newkirk","newland","newlebanon","newlenox","newlexington","newlisbon","newllano","newlondon","newmadrid","newman","newmanstown","newmarket","newmarlborough","newmartinsville","newmaryland","newmatamoras","newmexico","newmiami","newmiddletown","newmilford","newnan","neworleans","newoxford","newpalestine","newpaltz","newparis","newpekin","newphiladelphia","newplymouth","newport","newport-beach","newport-east","newport-news","newportbeach","newporteast","newportnews","newportrichey","newportricheyeast","newprague","newpreston","newprovidence","newrichland","newrichmond","newriver","newroads","newrochelle","newrockford","newsarpy","newsharon","newshoreham","newsmyrnabeach","newsouthmemphis","newspringville","newsquare","newstanton","newsummerfield","newtazewell","newterritory","newton","newton-center","newton-corner","newton-falls","newton-highlands","newton-lower-falls","newton-upper-falls","newtonbrook-east","newtonbrook-west","newtonbrookeast","newtonbrookwest","newtoncenter","newtoncorner","newtonfalls","newtonhighlands","newtonlowerfalls","newtonupperfalls","newtonville","newtoronto","newtown","newtown-grant","newtowngrant","newulm","newunion","newvienna","newville","newwaterford","newwaverly","newwestminster","newwesvalley","newwhiteland","newwilmington","newwindsor","newyork","newyorkcity","newyorkmills","nexpan","nexticapan","nextipac","nezahualcoyotl","nezperce","nf","nfdl","nfl","nfm","nfo","nfv","ng","ngd","ngr","nh","nhc","nhp","ni","niagara","niagara-falls","niagara-on-the-lake","niagarafalls","niagaraonthelake","niantic","nibley","nice","nicetown","nicetown-tioga","nicetowntioga","niceville","nicholasville","nicholls","nichols-hills","nicholshills","nicholson","nickerson","nicolas-blanco-san-pancho","nicolas-bravo","nicolas-r-casillas","nicolas-romero","nicolas-ruiz","nicolasblancosanpancho","nicolasbravo","nicolasrcasillas","nicolasromero","nicolasruiz","nicolet","nicollet","nicoma-park","nicomapark","nidr","nieves","nigromante","nikiski","niland","niles","niltepec","ninety-six","ninetysix","ninguno-cereso","ningunocereso","ninnekah","ninos-heroes","ninosheroes","nipawin","nipomo","niskayuna","nissequogue","nisswa","nitro","niu-valley","niuvalley","niverville","niwot","nixa","nixon","nj","njdg","nk","nkb","nkc","nkl","nl","nlc","nle","nlec","nlf","nlr","nlv","nm","nmb","nmer","nmi","nmv","nn","nnhp","nns","no","noank","noble","nobleboro","noblesville","nocatee","nochistlan-de-mejia","nochistlandemejia","nocona","nocupetaro","noe-valley","noel","noevalley","nogales","nokesville","nokomis","nolanville","nolensville","nolo","nombre-de-dios","nombrededios","nome","nonantum","nonoava","nooksack","noonan","nop","nopala-de-villagran","nopaladevillagran","nopalapan","nopalera","nopaltepec","nopalucan","nora-springs","norasprings","norco","norcross","norfolk","norfolk-county","norfolkcounty","noria-de-angeles","noria-del-borrego-norias","noria-nueva","noriadeangeles","noriadelborregonorias","norianueva","norias-del-paso-hondo","norias-del-refugio","noriasdelpasohondo","noriasdelrefugio","norland","norlina","normal","norman","norman-wells","normandin","normandy","normandy-park","normandypark","normanwells","norridge","norridgewock","norris","norris-city","norriscity","norristown","norte-1ra-seccion-san-julian","norte1raseccionsanjulian","north-adams","north-alamo","north-amherst","north-amityville","north-andover","north-andrews-gardens","north-apollo","north-arlington","north-attleborough-center","north-auburn","north-augusta","north-aurora","north-babylon","north-ballston-spa","north-baltimore","north-barrington","north-bath","north-battleford","north-bay","north-bay-shore","north-bay-village","north-beach","north-beach-haven","north-bel-air","north-belle-vernon","north-bellmore","north-bellport","north-bend","north-bennington","north-bergen","north-berwick","north-bethesda","north-bibb","north-boston","north-braddock","north-branch","north-branford","north-brighton","north-brookfield","north-brooksville","north-browning","north-brunswick","north-caldwell","north-canton","north-cape-may","north-carolina","north-castle","north-catasauqua","north-center","north-charleroi","north-charleston","north-chicago","north-chicopee","north-college-hill","north-collins","north-conway","north-corbin","north-cowichan","north-creek","north-crossett","north-dakota","north-decatur","north-deland","north-druid-hills","north-eagle-butte","north-east","north-eastham","north-edwards","north-el-monte","north-elba","north-end","north-english","north-fair-oaks","north-falmouth","north-fond-du-lac","north-fork","north-fork-village","north-fort-lewis","north-fort-myers","north-gates","north-granby","north-great-river","north-grosvenor-dale","north-haledon","north-hampton","north-hartsville","north-haven","north-haverhill","north-hero","north-highlands","north-hills","north-hollywood","north-hudson","north-judson","north-kansas-city","north-kensington","north-key-largo","north-kingstown","north-kingsville","north-la-crosse","north-lakeport","north-lakeville","north-las-vegas","north-lauderdale","north-laurel","north-lawndale","north-lewisburg","north-liberty","north-lindenhurst","north-little-rock","north-logan","north-madison","north-manchester","north-mankato","north-massapequa","north-merrick","north-miami","north-miami-beach","north-middletown","north-muskegon","north-myrtle-beach","north-new-hyde-park","north-newton","north-oaks","north-ogden","north-olmsted","north-oysteryellow-point","north-palm-beach","north-patchogue","north-pekin","north-pembroke","north-peoria","north-perth","north-plainfield","north-plains","north-platte","north-plymouth","north-pole","north-port","north-portland","north-potomac","north-prairie","north-providence","north-puyallup","north-randall","north-reading","north-redington-beach","north-richland-hills","north-richmond","north-ridgeville","north-river-shores","north-riverdale","north-riverside","north-rock-springs","north-royalton","north-saanich","north-saint-paul","north-salt-lake","north-sarasota","north-scituate","north-sea","north-seekonk","north-shore","north-sioux-city","north-smithfield","north-spearfish","north-springfield","north-stamford","north-star","north-stjames-town","north-syracuse","north-terre-haute","north-tonawanda","north-tunica","north-tustin","north-vacherie","north-valley","north-valley-stream","north-vancouver","north-vernon","north-versailles","north-wales","north-wantagh","north-warren","north-webster","north-weeki-wachee","north-westport","north-wildwood","north-wilkesboro","north-windham","north-yelm","north-york","north-zanesville","northadams","northalamo","northamherst","northamityville","northampton","northandover","northandrewsgardens","northapollo","northarlington","northattleboroughcenter","northauburn","northaugusta","northaurora","northbabylon","northballstonspa","northbaltimore","northbarrington","northbath","northbattleford","northbay","northbayshore","northbayvillage","northbeach","northbeachhaven","northbelair","northbellevernon","northbellmore","northbellport","northbend","northbennington","northbergen","northberwick","northbethesda","northbibb","northborough","northboston","northbraddock","northbranch","northbranford","northbridge","northbrighton","northbrook","northbrookfield","northbrooksville","northbrowning","northbrunswick","northcaldwell","northcanton","northcapemay","northcarolina","northcastle","northcatasauqua","northcenter","northcharleroi","northcharleston","northchase","northchicago","northchicopee","northcollegehill","northcollins","northconway","northcorbin","northcowichan","northcreek","northcrest","northcrossett","northdakota","northdale","northdecatur","northdeland","northdruidhills","northeaglebutte","northeast","northeast-ithaca","northeastham","northeastithaca","northedwards","northelba","northelmonte","northend","northenglish","northern-cambria","northern-liberties","northern-mariana-islands","northerncambria","northernliberties","northernmarianaislands","northfairoaks","northfalmouth","northfield","northfonddulac","northfork","northforkvillage","northfortlewis","northfortmyers","northgate","northgates","northglenn","northgranby","northgreatriver","northgrosvenordale","northhaledon","northhampton","northhartsville","northhaven","northhaverhill","northhero","northhighlands","northhills","northhollywood","northhudson","northjudson","northkansascity","northkensington","northkeylargo","northkingstown","northkingsville","northlacrosse","northlake","northlakeport","northlakes","northlakeville","northlasvegas","northlauderdale","northlaurel","northlawndale","northlewisburg","northliberty","northlindenhurst","northlittlerock","northlogan","northmadison","northmanchester","northmankato","northmassapequa","northmerrick","northmiami","northmiamibeach","northmiddletown","northmuskegon","northmyrtlebeach","northnewhydepark","northnewton","northoaks","northogden","northolmsted","northoysteryellowpoint","northpalmbeach","northpatchogue","northpekin","northpembroke","northpeoria","northperth","northplainfield","northplains","northplatte","northplymouth","northpole","northport","northportland","northpotomac","northprairie","northprovidence","northpuyallup","northrandall","northreading","northredingtonbeach","northrichlandhills","northrichmond","northridge","northridgeville","northriverdale","northrivershores","northriverside","northrocksprings","northroyalton","northsaanich","northsaintpaul","northsaltlake","northsarasota","northscituate","northsea","northseekonk","northshore","northsiouxcity","northsmithfield","northspearfish","northspringfield","northstamford","northstar","northstjamestown","northsyracuse","northterrehaute","northtonawanda","northtunica","northtustin","northumberland","northvacherie","northvale","northvalley","northvalleystream","northvancouver","northvernon","northversailles","northview","northville","northwales","northwantagh","northwarren","northwebster","northweekiwachee","northwest-harbor","northwest-harborcreek","northwest-harwich","northwest-harwinton","northwest-ithaca","northwest-territories","northwestharbor","northwestharborcreek","northwestharwich","northwestharwinton","northwestithaca","northwestport","northwestterritories","northwildwood","northwilkesboro","northwindham","northwood","northwoods","northyelm","northyork","northzanesville","norton","norton-center","norton-shores","nortoncenter","nortonshores","nortonville","norwalk","norway","norwell","norwich","norwood","norwood-historical","norwood-young-america","norwoodhistorical","norwoodyoungamerica","notl","notre-dame","notre-dame-de-grace","notre-dame-de-lile-perrot","notre-dame-des-prairies","notre-dame-du-lac","notre-dame-du-mont-carmel","notredame","notredamedegrace","notredamedelileperrot","notredamedesprairies","notredamedulac","notredamedumontcarmel","nottingham","nova-scotia","novara","novascotia","novato","novi","nowata","nowthen","noyack","noyan","np","npb","npc","npnc","npr","npre","nr","nrb","nrc","nrh","nrs","ns","nsb","nsc","nsjc","nsji","nsjp","nsl","nsm","nsp","nsr","nss","nst","nt","nth","ntl","nu","nueces","nueva-america","nueva-ameyalco","nueva-apolonia","nueva-ciudad-guerrero","nueva-colombia","nueva-esperanza","nueva-frontera","nueva-independencia","nueva-italia-de-ruiz","nueva-libertad","nueva-libertad-el-colorado","nueva-morelia","nueva-palestina","nueva-primavera","nueva-rosita","nueva-santa-rosa","nueva-sesecapa","nueva-tenochtitlan-rizo-de-oro","nueva-villa-de-padilla","nuevaamerica","nuevaameyalco","nuevaapolonia","nuevaciudadguerrero","nuevacolombia","nuevadivisiondelbayoguatemala","nuevaesperanza","nuevafrontera","nuevaindependencia","nuevaitaliaderuiz","nuevalibertad","nuevalibertadelcolorado","nuevamorelia","nuevapalestina","nuevaprimavera","nuevarosita","nuevasantarosa","nuevasesecapa","nuevatenochtitlanrizodeoro","nuevavilladepadilla","nuevo","nuevo-amatenango","nuevo-balsas","nuevo-carmen-tonapac","nuevo-casas-grandes","nuevo-crucitas","nuevo-francisco-leon","nuevo-guerrero","nuevo-ideal","nuevo-ixcatlan","nuevo-juan-del-grijalva","nuevo-laredo","nuevo-leon","nuevo-limar","nuevo-mexico","nuevo-michoacan-estacion-riito","nuevo-milenio-valdivia","nuevo-morelos","nuevo-naranjo","nuevo-necaxa","nuevo-nicapa","nuevo-pacayal","nuevo-progreso","nuevo-pumpuapa-cereso","nuevo-san-jose-independencia","nuevo-san-juan-chamula","nuevo-san-juan-parangaricutiro","nuevo-san-martin","nuevo-san-miguel","nuevo-sitala","nuevo-tampaon","nuevo-tantoan","nuevo-torno-largo","nuevo-urecho","nuevo-vallarta","nuevo-vicente-guerrero","nuevo-volcan-chichonal","nuevo-xcan","nuevo-xochimilco","nuevo-zirosto","nuevoamatenango","nuevobalsas","nuevocarmentonapac","nuevocasasgrandes","nuevoceresoregionaldealtamira","nuevocrucitas","nuevofranciscoleon","nuevoguerrero","nuevoideal","nuevoixcatlan","nuevojuandelgrijalva","nuevolaredo","nuevoleon","nuevolimar","nuevomexico","nuevomichoacanestacionriito","nuevomileniovaldivia","nuevomorelos","nuevonaranjo","nuevonecaxa","nuevonicapa","nuevopacayal","nuevopasonazarenochichicazapa","nuevoprogreso","nuevopumpuapacereso","nuevosanjoseindependencia","nuevosanjuanchamula","nuevosanjuanparangaricutiro","nuevosanmartin","nuevosanmiguel","nuevositala","nuevotampaon","nuevotantoan","nuevotornolargo","nuevourecho","nuevovallarta","nuevovicenteguerrero","nuevovolcanchichonal","nuevoxcan","nuevoxochimilco","nuevozirosto","nuf","numaran","nunavut","nunda","nunkini","nurillo","nurio","nutley","nutter-fort","nutterfort","nuuanu-punchbowl","nuuanupunchbowl","nuxco","nv","nvc","nvdp","nvg","nvr","nvs","nw","nwt","nwv","nww","nx","ny","nya","nyack","nyc","nye","nym","nyssa","nz","o1s","o4s","oa","oacalco","oafb","oak-bay","oak-bluffs","oak-brook","oak-cliff-place","oak-creek","oak-forest","oak-grove","oak-harbor","oak-hill","oak-hill-park","oak-hills","oak-hills-place","oak-island","oak-lawn","oak-leaf","oak-park","oak-park-heights","oak-point","oak-ridge","oak-ridge-north","oak-trail-shores","oak-valley","oak-view","oakbay","oakbluffs","oakboro","oakbrook","oakbrook-terrace","oakbrookterrace","oakcliffplace","oakcreek","oakdale","oakes","oakfield","oakforest","oakgrove","oakham","oakharbor","oakhill","oakhillpark","oakhills","oakhillsplace","oakhurst","oakisland","oakland","oakland-city","oakland-park","oaklandcity","oaklandpark","oaklawn","oakleaf","oakleaf-plantation","oakleafplantation","oakley","oaklyn","oakmont","oakpark","oakparkheights","oakpoint","oakport","oakridge","oakridgenorth","oakton","oaktrailshores","oakvalley","oakview","oakville","oakwood","oakwood-hills","oakwood-village","oakwoodhills","oakwoodvillage","oasis","oatfield","oax","oaxaca","oaxtepec","ob","obbr","obc","oberlin","obetz","obion","oblong","obrajuelo","obts","oc","ocala","ocampo","occidental","occidente-4ta-seccion","occidente-san-francisco","occidente4taseccion","occidentesanfrancisco","occoquan","ocean-acres","ocean-bluff-brant-rock","ocean-city","ocean-gate","ocean-grove","ocean-park","ocean-pines","ocean-pointe","ocean-ridge","ocean-shores","ocean-springs","ocean-view","oceana","oceanacres","oceanbluffbrantrock","oceancity","oceangate","oceangrove","oceano","oceanpark","oceanpines","oceanpointe","oceanport","oceanridge","oceanshores","oceanside","oceansprings","oceanview","ocelota","ocho-de-enero","ochodeenero","ochusjob","ocilla","ococh","ocoee","oconahua","oconnor-parkview","oconnorparkview","oconomowoc","oconto","oconto-falls","ocontofalls","ocopulco","ocosingo","ocotal-chico","ocotalchico","ocotepec","ocotequila","ocotillo","ocotitlan","ocotlamanic","ocotlan","ocotlan-de-betancourt","ocotlan-de-morelos","ocotlan-de-venustiano-carranza","ocotlandebetancourt","ocotlandemorelos","ocotlandevenustianocarranza","ocoxaltepec","ocoyoacac","ocozocoautla-de-espinosa","ocozocoautladeespinosa","ocozotepec","ocp","ocr","octaviano-lopez","octavianolopez","octavio-paz","octaviopaz","octeyuco-dos-mil","octeyucodosmil","ocuapan","ocuilan-de-arteaga","ocuilandearteaga","ocuiltzapoyo","ocuituco","ocumicho","ocurio","od","oda","odb","ode","odell","odem","odenton","odenville","odessa","odh","odin","odj","odm","odon","odr","odvc","odz","oe","oelwein","oey","of","ofallon","offutt-air-force-base","offuttairforcebase","ofg","og","ogallala","ogden","ogden-dunes","ogdendunes","ogdensburg","ogh","oglala","oglesby","oglethorpe","ogontz","ogunquit","oh","ohatchee","ohg","ohio","ohioville","ohkay-owingeh","ohkayowingeh","ohp","ohuapan","ohuatipa","ohuilapam","oi","oil-city","oilcity","oildale","oilton","oj","ojai","ojinaga","ojite-rancho-nuevo","ojiteranchonuevo","ojitos","ojo-caliente","ojo-de-agua","ojo-de-agua-de-ballesteros","ojo-de-agua-de-bucio","ojo-de-agua-de-crucitas","ojo-de-agua-de-la-trinidad","ojo-de-agua-de-mendoza","ojo-de-agua-de-moran","ojo-de-agua-de-palmillas","ojo-de-agua-de-solano","ojo-de-agua-del-refugio","ojo-de-rana","ojo-seco","ojocaliente","ojodeagua","ojodeaguadeballesteros","ojodeaguadebucio","ojodeaguadecrucitas","ojodeaguadelatrinidad","ojodeaguadelrefugio","ojodeaguademendoza","ojodeaguademoran","ojodeaguadepalmillas","ojodeaguadesolano","ojoderana","ojoseco","ojuelos-de-jalisco","ojuelosdejalisco","ojus","ok","oka","okanagan","okanagan-falls","okanaganfalls","okanogan","okarche","okauchee-lake","okaucheelake","okawville","okeechobee","okeene","okemah","okemos","oklahoma","oklahoma-city","oklahomacity","okmulgee","okolona","okotoks","ol","ola","olathe","olcott","olcuatitan","old-bethpage","old-bridge","old-brookville","old-city","old-east-york","old-fig-garden","old-forge","old-greenwich","old-jamestown","old-jefferson","old-mystic","old-orchard","old-orchard-beach","old-river-winfree","old-saybrook","old-saybrook-center","old-tappan","old-town","old-westbury","oldbethpage","oldbridge","oldbrookville","oldcity","oldeastyork","oldfiggarden","oldforge","oldgreenwich","oldjamestown","oldjefferson","oldmystic","oldorchard","oldorchardbeach","oldriverwinfree","olds","oldsaybrook","oldsaybrookcenter","oldsmar","oldtappan","oldtown","oldwestbury","olean","oley","olga","olinala","olinda-cdp","olindacdp","olintepec","olintla","olivarez","olive-branch","olive-hill","olivebranch","olivehill","olivehurst","oliver","oliver-springs","oliversprings","olivet","olivette","olivia","olla","olmito","olmos-park","olmospark","olmsted-falls","olmstedfalls","olney","olomana","olton","oluta","olympia","olympia-fields","olympia-heights","olympiafields","olympiaheights","olyphant","om","omaha","omak","omao","omao-kukuiula","omaokukuiula","omealca","omega","omemee","ometepec","omitlan-de-juarez","omitlandejuarez","omoa","omro","on","onalaska","onancock","onarga","onavas","onawa","once-de-abril","oncedeabril","oneida","oneill","oneonta","onida","onion-creek","onioncreek","onondaga","onset","ontario","ontonagon","oo","oob","ooef","oolitic","oologah","oostburg","op","opa-locka","opalocka","opelika","opelousas","oph","opichen","opodepe","opopeo","opp","opportunity","oquawka","oquirrh","oquitoa","or","oracle","oradell","oran","orange","orange-beach","orange-city","orange-cove","orange-grove","orange-lake","orange-park","orangebeach","orangeburg","orangecity","orangecove","orangegrove","orangelake","orangepark","orangetree","orangevale","orangeville","orba-infiernito","orbainfiernito","orchard-city","orchard-grass-hills","orchard-hills","orchard-homes","orchard-lake","orchard-mesa","orchard-park","orchardcity","orchardgrasshills","orchardhills","orchardhomes","orchardlake","orchardmesa","orchardpark","orchards","orchidlands-estates","orchidlandsestates","orcutt","ord","orduna-de-abajo","orduna-de-arriba","ordunadeabajo","ordunadearriba","ordway","ore-city","orecity","oregon","oregon-city","oregoncity","oreland","orem","orford","orfordville","orient-heights","oriental","oriental-de-zapata","orientaldezapata","oriente-1ra-seccion","oriente1raseccion","oriente1raseccionsantodomingo","oriente2daseccionpalmahuaca","oriente2daseccionsancayetano","oriente6taseccionlosmulatos","orientheights","orilla-del-monte","orilladelmonte","orillia","orinda","oriole-beach","oriolebeach","orion","oriskany","orizaba","orizabita","orland","orland-hills","orland-park","orlandhills","orlando","orlandpark","orleans","orlovista","ormond-beach","ormond-by-the-sea","ormondbeach","ormondbythesea","ormstown","orn","oro-valley","orofino","oromocto","orono","oronoco","oronogo","orosi","orovalley","oroville","oroville-east","orovilleeast","orranteno","orrington","orrville","orting","ortiz","ortonville","orw","orwell","orwigsburg","os","osage","osage-beach","osage-city","osagebeach","osagecity","osakis","osawatomie","osborne","osburn","osc","oscar-soto-maynez","oscarsotomaynez","osceola","osceola-mills","osceolamills","osf","osgood","osgoode","oshawa","oshkosh","oskaloosa","osm","oso-viejo","osoviejo","osoyoos","osprey","osseo","ossian","ossining","ossipee","ossun","osterville","ostuacan","osumacinta","oswego","ot","otaez","otates","otatitlan","otatlan","oteapan","othello","otilpan","otis","otis-orchards-east-farms","otisorchardseastfarms","otisville","ots","otsego","ottawa","ottawa-hills","ottawahills","otterbein","otterburn-park","otterburnpark","ottumwa","otumba","otzoloapan","ouray","outlook","ov","overbrook","overland","overland-park","overlandpark","overlea","overton","ovid","oviedo","ovilla","ow","owasso","owatonna","owego","owen-sound","owens-cross-roads","owensboro","owenscrossroads","owensound","owensville","owenton","owings","owings-mills","owingsmills","owingsville","owls-head","owlshead","owosso","oxbow","oxchuc","oxcum","oxeloco","oxford","oxford-circle","oxfordcircle","oxiacaque","oxinam","oxkutzkab","oxnard","oxoboxo-river","oxoboxoriver","oxolotan","oxon-hill","oxon-hill-glassmanor","oxonhill","oxonhillglassmanor","oxtotipac","oxtotitlan","oyameles-de-hidalgo","oyamelesdehidalgo","oyster-bay","oyster-bay-cove","oyster-creek","oysterbay","oysterbaycove","oystercreek","ozark","ozelonacaxtla","ozona","ozone-park","ozonepark","oztotitlan","ozuluama-de-mascarenas","ozuluamademascarenas","ozumba-de-alzate","ozumbadealzate","p1","p1sp","pa","pabellon-de-arteaga","pabellon-de-hidalgo","pabellondearteaga","pabellondehidalgo","pablo","pablo-l-sidar","pablolsidar","pace","pacheco","pachiquita","pacho-nuevo","pacho-viejo","pachonuevo","pachoviejo","pachuca-de-soto","pachucadesoto","pachuquilla","pacific","pacific-city","pacific-grove","pacific-palisades","pacifica","pacificcity","pacificgrove","pacificpalisades","pacolet","pacu","paddock-lake","paddocklake","paden-city","padencity","paducah","pae","page","pagedale","pageland","pagosa-springs","pagosasprings","pahactla","pahala","pahokee","pahrump","pahua-hueca","pahuahueca","pahuatlan","pahuatlan-de-valle","pahuatlandevalle","paia","painesville","paint-rock","painted-post","paintedpost","paintla","paintrock","paintsville","paisanos","paisley","pajacuaran","pajapan","pajaro","palacios","palama","palatine","palatka","palau","palenque","palenville","palermo","palestine","palisade","palisades-park","palisadespark","palizada","palm","palm-aire","palm-bay","palm-beach","palm-beach-gardens","palm-beach-shores","palm-city","palm-coast","palm-desert","palm-harbor","palm-river-clair-mel","palm-springs","palm-springs-north","palm-valley","palma-grande","palma-pegada","palma-sola","palmagrande","palmaire","palmapegada","palmar-chico","palmar-de-bravo","palmar-de-cuautla","palmar-grande","palmar-primero","palmarchico","palmardebravo","palmardecuautla","palmargrande","palmarito-tochapan","palmaritotochapan","palmarprimero","palmas-de-abajo","palmasdeabajo","palmasola","palmbay","palmbeach","palmbeachgardens","palmbeachshores","palmcity","palmcoast","palmdale","palmdesert","palmer","palmer-heights","palmer-lake","palmerheights","palmerlake","palmerston-little-italy","palmerstonlittleitaly","palmerton","palmetto","palmetto-bay","palmetto-estates","palmettobay","palmettoestates","palmharbor","palmhurst","palmillas","palmillas-de-san-juan","palmillasdesanjuan","palmira","palmito-del-verde","palmitodelverde","palmona-park","palmonapark","palmriverclairmel","palmsprings","palmspringsnorth","palmvalley","palmview","palmview-south","palmviewsouth","palmyra","palmyra-atoll","palmyraatoll","palo","palo-alto","palo-bendito","palo-blanco","palo-cedro","palo-colorado","palo-gacho","palo-mulato","palo-pinto","palo-seco-el-gato","paloalto","palobendito","paloblanco","palocedro","palocolorado","palogacho","palolo","paloma-creek","paloma-creek-south","palomacreek","palomacreeksouth","palomar","palomares","palomas","palomulato","palopinto","palos-altos","palos-blancos","palos-heights","palos-hills","palos-park","palos-verdes","palos-verdes-estates","palosaltos","palosblancos","palosecoelgato","palosheights","paloshills","palospark","palosverdes","palosverdesestates","palouse","pamatacuaro","pampa","pamplico","pana","panaba","panales","panales-jamaica-canones","panalesjamaicacanones","panama","panama-city","panama-city-beach","panamacity","panamacitybeach","pandora","pangnirtung","panguitch","panhandle","panhe","panindicuaro","pannill-fork","pannillfork","panora","panorama-village","panoramavillage","panotla","pantanal","pantego","pantelho","pantepec","panthersville","pantitlan","pantla","pantops","panuaya","panuco","panuco-de-coronado","panucodecoronado","paola","paoli","paonia","papaikou","papaloapan","papaloctipan","papalotla","papanoa","papantla-de-olarte","papantladeolarte","papatlatla","papatlazolco","papillion","papineauville","paracho-de-verduzco","parachodeverduzco","parachute","paracuaro","paradis","paradise","paradise-heights","paradise-hills","paradise-valley","paradiseheights","paradisehills","paradisevalley","paragould","parahuen","paraiso","paraiso-del-grijalva","paraiso-novillero","paraisodelgrijalva","paraisonovillero","paraje-el-mirador","paraje-la-pera","paraje-nuevo","paraje-trejo-el-chaparral","parajeelmirador","parajelapera","parajenuevo","parajetrejoelchaparral","paramount","paramount-long-meadow","paramountlongmeadow","paramus","parangarico","paras","parc-boutin","parcboutin","parchment","pardeeville","pardo","paredes","paredon","paredon-colorado","paredoncolorado","pareo","paricuaro","parilla","paris","parish","park-city","park-falls","park-forest","park-forest-village","park-hill","park-hills","park-layne","park-rapids","park-ridge","park-river","park-slope","park-view","parkchester","parkcity","parker","parker-city","parkercity","parkers-prairie","parkersburg","parkersprairie","parkesburg","parkfalls","parkforest","parkforestvillage","parkhill","parkhills","parkin","parkland","parklayne","parkrapids","parkridge","parkriver","parks","parksdale","parkside","parkslope","parkston","parksville","parkview","parkville","parkway","parkwood","parkwood-manor","parkwoodmanor","parkwoods-donalda","parkwoodsdonalda","parlier","parma","parma-heights","parmaheights","parole","parowan","parque-urbano-napateco","parquedepoblamientosolidaridad","parqueindustrialciudadmitras","parqueurbanonapateco","parral","parras-de-la-fuente","parrasdelafuente","parrilla-ii","parrillaii","parrsboro","parry-sound","parrysound","parshall","parsippany","parsons","parsonsfield","pasadena","pasadena-hills","pasadenahills","pasaje","pasatiempo","pascagoula","pascala-del-oro","pascaladeloro","paschall","pasco","pascoag","paseo-de-las-canadas","paseo-de-san-javier","paseo-del-prado","paseo-puente-viejo","paseodelascanadas","paseodelprado","paseodesanjavier","paseopuenteviejo","paseos-de-itzincab","paseos-de-la-pradera","paseos-de-san-juan","paseos-del-marques","paseos-del-pedregal","paseosdeitzincab","paseosdelapradera","paseosdelmarques","paseosdelpedregal","paseosdelvallefraccionamiento","paseosdesanjuan","paso-blanco","paso-bonito","paso-canoa","paso-carretas","paso-de-arena","paso-de-cuarenta","paso-de-hidalgo-paso-de-alamos","paso-de-la-mina-3ra-seccion","paso-de-mata","paso-de-mendez","paso-de-nunez-buenavista","paso-de-ovejas","paso-de-pirules","paso-de-valencia","paso-del-correo","paso-del-macho","paso-del-toro","paso-hondo","paso-morelos","paso-nacional","paso-real-de-sarabia","paso-robles","pasoblanco","pasobonito","pasocanoa","pasocarretas","pasodearena","pasodecuarenta","pasodehidalgopasodealamos","pasodelamina2daseccionbarrial","pasodelamina3raseccion","pasodelcorreo","pasodelmacho","pasodeltoro","pasodemata","pasodemendez","pasodenunezbuenavista","pasodeovejas","pasodepirules","pasodevalencia","pasohondo","pasomorelos","pasonacional","pasorealdesarabia","pasorobles","pass-christian","passaic","passapatanzy","passchristian","paste","pastelera","pastor-ortiz","pastor-rovaix","pastora","pastoria","pastorortiz","pastorrovaix","patambo","pataskala","patchogue","paterson","pathe","patla","patlicha","patosil","patria-nueva","patrianueva","patrianuevasanjoseelcontento","patrick-springs","patricksprings","patten","patterson","patterson-tract","pattersontract","patton","patton-village","pattonvillage","patuan","patzcuaro","paul","paulden","paulding","paulina","paullina","pauls-valley","paulsboro","paulsvalley","pauoa","pavencul","paw-paw","paw-paw-lake","pawcatuck","pawhuska","pawlet","pawling","pawnee","pawnee-city","pawneecity","pawpaw","pawpawlake","pawtucket","paxtang","paxtepec","paxtle","paxton","paxtonia","payette","payne","paynesville","payson","pb","pbg","pbh","pbs","pc","pc4","pcb","pcc","pcec","pchg","pcm","pcs","pcv","pd","pda","pdao","pdap","pdb","pdc","pdd","pddl","pde","pdg","pdh","pdi","pdj","pdl","pdlc","pdlf","pdlh","pdli","pdll","pdlp","pdls","pdlv","pdm","pdmc","pdn","pdnb","pdo","pdp","pdps","pdr","pds","pdsa","pdsf","pdsj","pdsr","pdt","pdv","pdvf","pdz","pe","pea-ridge","peabody","peace-river","peaceful-valley","peacefulvalley","peaceriver","peach-lake","peach-springs","peachlake","peachland","peachsprings","peachtree-city","peachtree-corners","peachtreecity","peachtreecorners","peapack","pearidge","pearisburg","pearl","pearl-beach","pearl-city","pearl-river","pearland","pearlbeach","pearlcity","pearlington","pearlriver","pearsall","pearson","pebble-creek","pebblecreek","pec","pecan-acres","pecan-grove","pecan-plantation","pecanacres","pecangrove","pecanplantation","pecatonica","pechucalco","pechucalco2daseccionlascruces","pecos","peculiar","ped","pedernales","pedley","pedregal-de-san-jose","pedregaldesanjose","pedregoso","pedricena","pedro-amaro","pedro-escobedo","pedroamaro","pedroescobedo","peebles","peekskill","pegram","pegueros","pei","pekin","pelahatchie","pelham","pelham-manor","pelhammanor","pelican-bay","pelican-narrows","pelican-rapids","pelicanbay","pelicannarrows","pelicanrapids","pell-city","pell-lake","pella","pellcity","pelllake","pelmo-park-humberlea","pelmoparkhumberlea","pelt","pem","pemberton","pemberton-heights","pembertonheights","pemberville","pemberwick","pembroke","pembroke-park","pembroke-pines","pembrokepark","pembrokepines","pemucho","pen-argyl","pena-blanca","pena-colorada","pena-del-panal","pena-flores-palo-verde","penablanca","penacolorada","penadelpanal","penaflorespaloverde","penamiller","penargyl","penbrook","pencuyut","pender","pendleton","penhold","penitas","penjamillo-de-degollado","penjamillodedegollado","penjamo","penn-estates","penn-hills","penn-valley","penn-wynne","penn-yan","penndel","pennestates","penngrove","pennhills","pennington","pennington-gap","penningtongap","penns-grove","pennsauken","pennsboro","pennsburg","pennsgrove","pennside","pennsport","pennsville","pennsylvania","pennvalley","pennville","pennwynne","pennyan","pennypack","pennypack-woods","pennypackwoods","penobscot","penon-blanco","penonblanco","penrose","penryn","pensacola","penticton","penuela","penuelas","penuelas-el-cienegal","penuelaselcienegal","peoria","peoria-heights","peoriaheights","peosta","peotillos","peotone","pepeekeo","pepper-pike","pepperell","peppermill-village","peppermillvillage","pepperpike","pequot-lakes","pequotlakes","peralta","peras","perez-de-galeana","perezdegaleana","perezville","perham","periban-de-ramos","peribanderamos","pericos","pericotepec","peridot","perkasie","perkins","perla-de-acapulco","perladeacapulco","perote","perris","perry","perry-hall","perry-heights","perry-park","perryhall","perryheights","perryman","perryopolis","perrypark","perrysburg","perryton","perryville","perseverancia","pershing","perth","perth-amboy","perthamboy","peru","peshtigo","pesqueira","pesqueria","petacalco","petal","petalcingo","petaluma","petapa","petaquillas","petatlan","petawawa","peterborough","petersburg","petite-bourgogne","petitebourgogne","petlalcingo","peto","petoskey","petrolia","pevely","pewaukee","pewee-valley","peweevalley","pezmatlan","pf","pfdc","pflugerville","pfpv","pfv","pg","pgg","pgi","pgls","pgm","ph","pharr","phelan","phelps","phenix-city","phenixcity","phi","phil-campbell","philadelphia","philcampbell","philip","philippi","philipsburg","phillips","phillipsburg","phillipston","philmont","philo","philomath","phippsburg","phoenix","phoenix-lake","phoenixlake","phoenixville","pi","piaxtla","piaxtla-de-abajo","piaxtladeabajo","pic","picardias","picayune","pich","pichataro","picholco","pichucalco","pickens","pickering","pickerington","picm","picnic-point","picnic-point-north-lynnwood","picnicpoint","picnicpointnorthlynnwood","pico-rivera","picorivera","picton","pictou","picture-butte","picture-rocks","picturebutte","picturerocks","pie-de-gallo","piedegallo","piedmont","piedra-blanca","piedra-de-amolar","piedra-gorda","piedra-labrada","piedra-parada","piedra-pesada","piedra-pinta","piedrablanca","piedradeamolar","piedragorda","piedralabrada","piedraparada","piedrapesada","piedrapinta","piedras-de-lumbre","piedras-negras","piedrasdelumbre","piedrasnegras","pierce","pierce-city","piercecity","pierceton","piermont","pierre","pierre-part","pierrepart","pierreville","pierson","pierz","pigeon","pigeon-forge","pigeonforge","piggott","pihuamo","pijijiapan","pike-creek","pike-creek-valley","pike-road","pikecreek","pikecreekvalley","pikeroad","pikesville","piketon","pikeville","pilcaya","piletas","pilot-butte","pilot-mountain","pilot-point","pilot-rock","pilotbutte","pilotmountain","pilotos","pilotpoint","pilotrock","pima","pimmit-hills","pimmithills","pinal","pinal-de-amoles","pinaldeamoles","pinardville","pinch","pincher-creek","pinchercreek","pinckney","pinckneyville","pinconning","pincourt","pine","pine-beach","pine-bluff","pine-bluffs","pine-bush","pine-castle","pine-city","pine-crest","pine-grove","pine-grove-mills","pine-hill","pine-hills","pine-island","pine-island-center","pine-island-ridge","pine-knoll-shores","pine-knot","pine-lake-park","pine-lawn","pine-level","pine-manor","pine-mountain","pine-mountain-club","pine-plains","pine-prairie","pine-ridge","pine-ridge-at-crestwood","pine-valley","pinebeach","pinebluff","pinebluffs","pinebush","pinecastle","pinecity","pinecrest","pinedale","pinegrove","pinegrovemills","pinehill","pinehills","pinehurst","pineisland","pineislandcenter","pineislandridge","pineknollshores","pineknot","pinelakepark","pinelawn","pinelevel","pinellas","pinellas-park","pinellaspark","pinemanor","pinemountain","pinemountainclub","pineplains","pineprairie","pineridge","pineridgeatcrestwood","pinetop-lakeside","pinetoplakeside","pinetops","pinevalley","pineville","pinewood","pinewood-estates","pinewoodestates","piney","piney-green","piney-point-village","pineygreen","pineypointvillage","pingree-grove","pingreegrove","pinicuaro","pink","pino-suarez","pinole","pinon-hills","pinonhills","pinos","pinosuarez","pinotepa-de-don-luis","pinotepa-nacional","pinotepadedonluis","pinotepanacional","pinson","pintillo","pinzandaro","pioche","pioneer","pioneer-village","pioneervillage","piperton","pipestone","piqua","pir","pirtleville","piru","pisaflores","piscataway","piscila","pismo-beach","pismobeach","pistakee-highlands","pistakeehighlands","piste","pitahayal","pitcairn","pitiquito","pitman","pitt-meadows","pittmeadows","pittsboro","pittsburg","pittsburgh","pittsfield","pittsford","pittston","pittsville","pittville","pixley","pixoy","pj","pjc","pjlm","pjs","pk","pks","pl","placentia","placer","placeres-del-oro","placeresdeloro","placerville","placid-lakes","placidlakes","placitas","plain-city","plain-view","plaincity","plainedge","plainfield","plainfield-village","plainfieldvillage","plains","plainsboro-center","plainsborocenter","plainview","plainville","plainwell","plaistow","plan-de-agua-prieta","plan-de-arroyos","plan-de-ayala","plan-de-ayala-campo-cinco","plan-de-iguala","plan-de-las-hayas","plan-del-rio","plan-guanajuato-la-sandia","planada","plancarte","plandeaguaprieta","plandearroyos","plandeayala","plandeayalacampocinco","plandeiguala","plandelashayas","plandelrio","plandome","plandome-heights","plandomeheights","planguanajuatolasandia","plankinton","plano","plant-city","plantagenet","plantation","plantation-mobile-home-park","plantationmobilehomepark","plantcity","plantersville","plaquemine","platanillo","plateau","plateros","platon-sanchez","platonsanchez","platte","platte-city","plattecity","plattekill","platteville","plattsburg","plattsburgh","plattsburgh-west","plattsburghwest","plattsmouth","plattsville","playa-azul","playa-chica","playa-de-chachalacas","playa-de-la-libertad","playa-del-carmen","playa-vicente","playaazul","playachica","playadechachalacas","playadelalibertad","playadelcarmen","playas-del-rosario","playasdelrosario","playavicente","playter-estates-danforth","playterestatesdanforth","plaza-nueva","plazanueva","ple","pleak","pleasant-gap","pleasant-garden","pleasant-grove","pleasant-hill","pleasant-hills","pleasant-prairie","pleasant-ridge","pleasant-run","pleasant-run-farm","pleasant-valley","pleasant-view","pleasantgap","pleasantgarden","pleasantgrove","pleasanthill","pleasanthills","pleasanton","pleasantprairie","pleasantridge","pleasantrun","pleasantrunfarm","pleasantvalley","pleasantview","pleasantville","pleasure-ridge-park","pleasureridgepark","plentywood","plessisville","pli","plm","plover","plp","pls","plum","plum-creek","plum-grove","pluma-hidalgo","plumahidalgo","plumas","plumas-lake","plumaslake","plumcreek","plumgrove","plummer","plumsteadville","plutarcoeliascalleslaygriega","plymouth","plymouth-meeting","plymouthmeeting","plympton","pm","pmc","pmep","pmhp","pn","pnc","pndm","pnt","po","poblado-10","poblado-c-33-20-de-noviembre","poblado-chulavista-el-chorizo","poblado-cinco","poblado-dos","poblado-numero-cinco","poblado-tres","poblado10","pobladoc3320denoviembre","pobladochulavistaelchorizo","pobladocinco","pobladodos","pobladonumerocinco","pobladotres","pocahontas","pocasset","pocatello","pocboc","pochahuizco","pochalcatl","pochotillo","pochutla","pocitos","pocola","pocomoke-city","pocomokecity","pocono-pines","pocono-ranch-lands","poconopines","poconoranchlands","poestenkill","pohenegamook","poinciana","point-baker","point-breeze","point-clear","point-lookout","point-marion","point-of-rocks","point-pleasant","point-pleasant-beach","point-roberts","pointbaker","pointbreeze","pointclear","pointe-calumet","pointe-claire","pointe-du-lac","pointecalumet","pointeclaire","pointedulac","pointlookout","pointmarion","pointofrocks","pointpleasant","pointpleasantbeach","pointroberts","poipu","pojoaque","polanco","poland","poligonos","polk","polk-city","polkcity","polkton","pollock-pines","pollockpines","polo","pololcingo","polotitlan-de-la-ilustracion","polotitlandelailustracion","polson","polutla","polyuc","pomacuaran","pomeroy","pomoca","pomona","pompano-beach","pompano-beach-highlands","pompanobeach","pompanobeachhighlands","pomposo-castellanos","pomposocastellanos","pompton-lakes","pomptonlakes","pomuch","ponca","ponca-city","poncacity","ponce-inlet","ponceinlet","ponchatoula","ponciano-arriaga","poncianoarriaga","poncitlan","pond-inlet","ponder","ponderay","ponderosa-park","ponderosa-pine","ponderosapark","ponderosapine","pondinlet","ponoka","pont-rouge","ponte-vedra-beach","pontevedrabeach","pontiac","pontoon-beach","pontoonbeach","pontotoc","pontrouge","pooler","poolesville","poplar","poplar-bluff","poplar-cotton-center","poplar-grove","poplarbluff","poplarcottoncenter","poplargrove","poplarville","popo-park","popola","popolnah","popopark","poquonock-bridge","poquonockbridge","poquoson","por","porcupine","porfirio-diaz","porfiriodiaz","port-alberni","port-allegany","port-allen","port-angeles","port-angeles-east","port-aransas","port-arthur","port-barre","port-barrington","port-byron","port-carbon","port-cartier","port-charlotte","port-chester","port-clinton","port-colborne","port-coquitlam","port-dickinson","port-edwards","port-ewen","port-gibson","port-hadlock-irondale","port-hawkesbury","port-henry","port-hope","port-hueneme","port-huron","port-isabel","port-jefferson","port-jefferson-station","port-jervis","port-labelle","port-lavaca","port-ludlow","port-mcneill","port-monmouth","port-moody","port-morris","port-neches","port-norris","port-oconnor","port-orange","port-orchard","port-orford","port-perry","port-reading","port-republic","port-richey","port-richmond","port-rowan","port-royal","port-saint-joe","port-saint-john","port-saint-lucie","port-salerno","port-stanley","port-sulphur","port-townsend","port-vue","port-washington","port-washington-north","port-wentworth","port-williams","portaceli","portage","portage-la-prairie","portage-lakes","portage-park","portagelakes","portagelaprairie","portagepark","portageville","portal-de-las-salinas","portalberni","portaldelassalinas","portales","portallegany","portallen","portangeles","portangeleseast","portaransas","portarthur","portbarre","portbarrington","portbyron","portcarbon","portcartier","portcharlotte","portchester","portclinton","portcolborne","portcoquitlam","portdickinson","portedwards","porter","porter-heights","porterdale","porterheights","porterville","portes-gil","portesgil","portewen","portezuelo","portgibson","porthadlockirondale","porthawkesbury","porthenry","porthope","porthueneme","porthuron","porticos-de-san-antonio","porticosdesanantonio","portisabel","portjefferson","portjeffersonstation","portjervis","portlabelle","portland","portlavaca","portlock","portludlow","portmcneill","portmonmouth","portmoody","portmorris","portneches","portneuf","portnorris","portoconnor","portola","portola-hills","portola-valley","portolahills","portolavalley","portorange","portorchard","portorford","portperry","portreading","portrepublic","portrichey","portrichmond","portrowan","portroyal","portsaintjoe","portsaintjohn","portsaintlucie","portsalerno","portsmouth","portsmouth-heights","portsmouthheights","portstanley","portsulphur","porttownsend","portugues-de-galvez","portuguesdegalvez","portvue","portwashington","portwashingtonnorth","portwentworth","portwilliams","porvenir","posen","poseyville","post","post-falls","postfalls","postville","potam","poteau","poteet","poth","pothe","potomac","potomac-heights","potomac-mills","potomac-park","potomacheights","potomacmills","potomacpark","potosi","potrerillo","potrerillo-del-norote","potrerillodelnorote","potrerillos","potrerillos-guanajal","potrerillosguanajal","potrero-del-llano","potrero-viejo","potrerodelllano","potreros","potreroviejo","potsdam","potter-lake","potterlake","potterville","pottsboro","pottsgrove","pottstown","pottsville","poturo","poughkeepsie","poulsbo","poultney","pound-ridge","poundridge","powassan","poway","powder-springs","powderly","powdersprings","powdersville","powell","powell-river","powellriver","powells-crossroads","powellscrossroads","powers-lake","powerslake","powhatan","powhatan-point","powhatanpoint","pownal","poydras","poynette","poza-rica-de-hidalgo","pozaricadehidalgo","pozo-de-ibarra","pozo-de-jarillas","pozo-dulce","pozodeibarra","pozodejarillas","pozodulce","pozos","pozos-de-gamboa","pozosdegamboa","pozuelos","pp","ppb","ppdl","pph","ppl","ppnl","ppv","pr","prac","praderas-de-san-francisco","praderas-del-potrero","praderasdelpotrero","praderasdesanfrancisco","prados-de-san-juan","prados-de-santa-rosa","prados-del-rosario","prados-san-francisco","pradosdelrosario","pradosdesanjuan","pradosdesantarosa","pradossanfrancisco","prague","prairie-city","prairie-creek","prairie-du-chien","prairie-du-sac","prairie-grove","prairie-heights","prairie-ridge","prairie-view","prairie-village","prairiecity","prairiecreek","prairieduchien","prairiedusac","prairiegrove","prairieheights","prairieridge","prairieview","prairievillage","prairieville","pratt","prattville","praxedis-de-guerrero","praxedis-g-guerrero","praxedis-guerrero","praxedisdeguerrero","praxedisgguerrero","praxedisguerrero","prb","prcm","prdh","prds","preeceville","premont","prentiss","presa-blanca","presa-de-rayas","presa-del-rosario","presablanca","presadelrosario","presaderayas","presas","prescott","prescott-valley","prescottvalley","presidente-juarez","presidentejuarez","presidential-lakes-estates","presidentiallakesestates","presidio","presidio-plan-de-libres","presidioplandelibres","presque-isle","presqueisle","presquille","prestbury","preston","preston-city","preston-heights","prestoncity","prestonheights","prestonsburg","pretty-bayou","prettybayou","prevost","prf","pri-chacon","price","prices-fork","pricesfork","priceville","prichacon","prichard","prien","priest-river","priestriver","primer-canton","primera","primera-de-analco","primera-fraccion-de-crespo","primeradeanalco","primerafracciondecrespo","primercanton","primero-de-mayo","primero-de-mayo-chupaderos","primerodemayo","primerodemayochupaderos","primghar","primo-tapia","primotapia","prince-albert","prince-edward","prince-edward-island","prince-frederick","prince-george","prince-rupert","princealbert","princeedward","princeedwardisland","princefrederick","princegeorge","princerupert","princes-lakes","princeslakes","princess-anne","princess-rosethorn","princessanne","princessrosethorn","princeton","princeton-junction","princeton-meadows","princetonjunction","princetonmeadows","princeville","prineville","prior-lake","priorlake","privada-del-alamo","privadadelalamo","privateer","prl","proctor","profesor-carlos-hank-gonzalez","profesorcarloshankgonzalez","profresor-roberto-barrios","profresorrobertobarrios","progreso","progreso-campo-47","progreso-de-alvaro-obregon","progreso-de-juarez","progreso-de-zaragoza","progreso-industrial","progresocampo47","progresodealvaroobregon","progresodejuarez","progresodezaragoza","progresoindustrial","progress","progress-village","progressvillage","prophetstown","prospect","prospect-heights","prospect-park","prospectheights","prospectpark","prosper","prosperity","prosser","providence","providence-village","providencevillage","providencia","providencia-de-napoles","providenciadenapoles","provincetown","provo","provost","prp","prudenville","prudhoe-bay","prudhoebay","prunedale","pryor","pryor-creek","pryorcreek","ps","psc","pseg","psf","psj","psl","psn","pt","ptec","pu","puacuaro","pucte","pue","puebla","pueblillo","pueblito-de-allende","pueblitodeallende","pueblo","pueblo-benito-garcia","pueblo-hidalgo","pueblo-juarez-la-magdalena","pueblo-madero-el-playon","pueblo-mayo","pueblo-nuevo","pueblo-nuevo-de-las-raices","pueblo-nuevo-de-morelos","pueblo-nuevo-tlalmimilolpan","pueblo-viejo","pueblo-west","pueblo-yaqui","pueblobenitogarcia","pueblohidalgo","pueblojuarezlamagdalena","pueblomaderoelplayon","pueblomayo","pueblonuevo","pueblonuevodelasraices","pueblonuevodemorelos","pueblonuevotlalmimilolpan","pueblos-unidos","pueblosunidos","puebloviejo","pueblowest","puebloyaqui","puente-de-camotlan","puente-de-ixtla","puente-de-piedra","puente-grande","puente-jula","puentecillas","puentedecamotlan","puentedeixtla","puentedepiedra","puentegrande","puentejula","puerta-de-mangos","puerta-de-palmillas","puerta-del-llano","puerta-del-monte","puertadelllano","puertadelmonte","puertademangos","puertadepalmillas","puertecito-de-la-virgen","puertecitodelavirgen","puerto-adolfo-lopez-mateos","puerto-angel","puerto-aventuras","puerto-ceiba","puerto-de-aguirre","puerto-de-carroza","puerto-de-chiquihuite","puerto-de-nieto","puerto-de-providencia","puerto-escondido","puerto-esmeralda","puerto-madero","puerto-palomas","puerto-penasco","puerto-rico","puerto-san-carlos","puerto-vallarta","puertoadolfolopezmateos","puertoangel","puertoaventuras","puertoceiba","puertodeaguirre","puertodecarroza","puertodechiquihuite","puertodenieto","puertodeprovidencia","puertoescondido","puertoesmeralda","puertomadero","puertopalomas","puertopenasco","puertorico","puertosancarlos","puertovallarta","puga","pugchen-mumuntic","pugchenmumuntic","puhi","pujal-coy","pujalcoy","pukalani","pulaski","pullman","pumphrey","pumpkin-center","pumpkincenter","pun","punahou","punaluu","punta-arena","punta-de-la-vega","punta-gorda","punta-gorda-isles","punta-rassa","puntaarena","puntadelavega","puntagorda","puntagordaisles","puntarassa","puntilla-aldama","puntillaaldama","puntledge","punxsutawney","puohala-village","puohalavillage","pupukea","purcell","purcellville","purchase","purdy","purechucho","purepero-de-echaiz","pureperodeechaiz","purificacion","purisima","purisima-concepcion-mayorazgo","purisima-de-arista","purisima-de-bustos","purisima-de-covarrubias","purisima-de-cubos-la-purisima","purisima-del-progreso","purisimaconcepcionmayorazgo","purisimadearista","purisimadebustos","purisimadecovarrubias","purisimadecuboslapurisima","purisimadelprogreso","puroagua","puruandiro","puruaran","purvis","pustunich","putla-villa-de-guerrero","putlavilladeguerrero","putlunichuchut-vista-hermosa","putlunichuchutvistahermosa","putnam","putnam-lake","putnamlake","putney","puxcatan","puxtla","puyallup","pv","pvb","pvdg","pve","pvh","pw","pwn","py","pymatuning-central","pymatuningcentral","qa","qbec","qc","qdc","qh","qr","quail-creek","quail-hill","quail-ridge","quail-valley","quailcreek","quailhill","quailridge","quailvalley","quakertown","quamila","quanah","quarryville","quartz-hill","quartzhill","quartzsite","que","quebec","quebec-city","quebeccity","quebrantadero","quecholac","quechulac","quechultenango","queen-anne","queen-city","queen-creek","queen-village","queenanne","queencity","queencreek","queenland","queens","queens-village","queensbury","queensvillage","queenswood-heights","queenswoodheights","queenvillage","quelove","querendaro","querendas","queretaro","querobabi","queseria","quesnel","questa","quetchehueca","quetzalapa","quiamoloapan","quila","quimichis","quinceo","quincy","quinebaug","quinicuena","quinlan","quinnesec","quinta-del-cedro","quintadelcedro","quintana-roo","quintanaroo","quinte-west","quintero","quintewest","quintin-arauz","quintinarauz","quinto-barrio-ejido-cahuacan","quintobarrioejidocahuacan","quinton","quiriego","quiroga","quitman","quitupan","qv","qw","ra","raceland","racine","radcliff","radford","radium-springs","radiumsprings","radnor","raeford","raf","rafael-delgado","rafael-j-garcia","rafael-lucio","rafael-pascacio-gamboa","rafael-ramirez","rafael-yanez-sosa-el-mezquite","rafaeldelgado","rafaeljgarcia","rafaellucio","rafaelpascaciogamboa","rafaelramirez","rafaelyanezsosaelmezquite","rafb","rafter-j-ranch","rafterjranch","ragland","rahway","rainbow","rainbow-city","rainbowcity","rainelle","rainier","rainsville","raleigh","raleigh-hills","raleighhills","ralls","ralston","ramblewood","ramirez","ramon-corona","ramon-f-balboa","ramona","ramoncorona","ramonfbalboa","ramos-arizpe","ramosarizpe","ramseur","ramsey","ramtown","rancheria-de-pocitos","rancheriadepocitos","ranchettes","ranchito-de-castro","ranchitodecastro","rancho-alegre","rancho-alegre-fraccionamiento","rancho-calaveras","rancho-chico","rancho-cordova","rancho-cucamonga","rancho-de-guadalupe","rancho-de-las-lomas","rancho-del-padre","rancho-grande","rancho-mirage","rancho-murieta","rancho-nuevo","rancho-nuevo-de-la-cruz","rancho-nuevo-de-la-luz","rancho-nuevo-del-llanito","rancho-palos-verdes","rancho-penasquitos","rancho-san-diego","rancho-santa-fe","rancho-santa-margarita","rancho-tehama-reserve","rancho-verde","rancho-viejo","ranchoalegre","ranchoalegrefraccionamiento","ranchocalaveras","ranchochico","ranchocordova","ranchocucamonga","ranchodeguadalupe","ranchodelaslomas","ranchodelpadre","ranchogrande","ranchomirage","ranchomurieta","ranchonuevo","ranchonuevodelacruz","ranchonuevodelaluz","ranchonuevodelllanito","ranchopalosverdes","ranchopenasquitos","ranchos-de-taos","ranchosandiego","ranchosantafe","ranchosantamargarita","ranchosdetaos","ranchotehamareserve","ranchoverde","ranchoviejo","rand","randallstown","randleman","randolph","random-lake","randomlake","rangely","ranger","rankin","rankin-inlet","rankininlet","ranlo","ransom-canyon","ransomcanyon","ransomville","ranson","rantoul","raoul","rapid-city","rapid-valley","rapidcity","rapids","rapidvalley","raritan","rascon","rathdrum","raton","raubsville","raudales-malpaso","raudalesmalpaso","raven","ravena","ravenel","ravenna","ravensdale","ravenswood","ravensworth","rawdon","rawlins","rawls-springs","rawlssprings","ray-city","raya-zaragoza","rayazaragoza","raycity","raymond","raymondville","raymore","raymundo-enriquez","raymundoenriquez","rayne","raynham","raynham-center","raynhamcenter","rayon","rayones","rayside-balfour","raysidebalfour","raytown","rayville","rb","rbf","rbs","rbwv","rc","rd","rda","rdb","rdbv","rdc","rdg","rdj","rdl","rdla","rdlh","rdll","rdlp","rdlr","rdls","rdm","rdo","rdp","rdr","rds","rdsf","rdt","rdvi","re","readfield","reading","readville","real-de-catorce","real-del-sol","real-hacienda-metropolis","realdecatorce","realdelsol","realhaciendametropolis","reamstown","recoveco","rector","red-bank","red-bay","red-bluff","red-boiling-springs","red-bud","red-chute","red-cloud","red-corral","red-deer","red-hill","red-hook","red-lake","red-lake-falls","red-lick","red-lion","red-lodge","red-oak","red-oaks-mill","red-springs","red-wing","redan","redbank","redbay","redbluff","redboilingsprings","redbud","redby","redchute","redcloud","redcorral","reddeer","redding","redeer","redfield","redford","redgranite","redhill","redhook","redington-beach","redington-shores","redingtonbeach","redingtonshores","redkey","redlake","redlakefalls","redland","redlands","redlick","redlion","redlodge","redmond","redoak","redoaksmill","redondo-beach","redondobeach","redsprings","redstone-arsenal","redstonearsenal","redwater","redway","redwing","redwood","redwood-city","redwood-falls","redwood-shores","redwood-valley","redwoodcity","redwoodfalls","redwoodshores","redwoodvalley","reed-city","reed-creek","reedcity","reedcreek","reedley","reedsburg","reedsport","reedsville","reese","reform","reforma","reforma-de-pineda","reforma-y-planada","reformadepineda","reformayplanada","refugio","regent-park","regentpark","regina","regina-beach","reginabeach","rego-park","regopark","rehobeth","rehoboth","rehoboth-beach","rehobothbeach","reidland","reidsville","reiffton","reinbeck","reinholds","reisterstown","remerton","reminderville","remington","remsen","remsenburg-speonk","remsenburgspeonk","rendon","renfrew","rennerdale","reno","renovo","rensselaer","renton","renville","repentigny","republic","reseda","reserve","reservoir","residencial-arboledas","residencial-las-olas","residencial-tajin","residencialarboledas","residenciallasolas","residencialtajin","reston","revelstoke","revere","revolucion-mexicana","revolucionmexicana","rexburg","rexdale-kipling","rexdalekipling","reyes-acozac","reyes-etla","reyes-mantecon","reyesacozac","reyesetla","reyesmantecon","reynolds","reynolds-heights","reynoldsburg","reynoldsheights","reynoldstown","reynoldsville","reynosa","rf","rfb","rfdj","rfm","rg","rgc","rh","rhawnhurst","rhe","rheems","rhinebeck","rhinelander","rhm","rhode-island","rhodeisland","rhodhiss","rhome","ri","rialto","rib-mountain","ribmountain","ricardo","ricardo-flores-magon","ricardofloresmagon","rice","rice-lake","ricelake","rich-hill","richardson","richboro","richelieu","richfield","richfield-springs","richfieldsprings","richford","richgrove","richhill","richibucto","richland","richland-center","richland-hills","richlandcenter","richlandhills","richlands","richlandtown","richmond","richmond-heights","richmond-hill","richmond-west","richmondheights","richmondhill","richmondwest","richton","richton-park","richtonpark","richville","richwood","riddle","rideau-park","rideaupark","ridge","ridge-manor","ridge-wood-heights","ridgecrest","ridgefield","ridgefield-park","ridgefieldpark","ridgeland","ridgely","ridgemanor","ridgemark","ridgetop","ridgetown","ridgeville","ridgeway","ridgewood","ridgewoodheights","ridgway","ridley-park","ridleypark","riesel","rifle","rigaud","rigby","rimbey","rimouski","rincon","rincon-chamula","rincon-de-aguirre","rincon-de-barrabas","rincon-de-buena-vista","rincon-de-cano","rincon-de-curungueo","rincon-de-guadalupe","rincon-de-guayabitos","rincon-de-jaimes","rincon-de-lopez","rincon-de-los-pirules","rincon-de-los-reyes","rincon-de-parangueo","rincon-de-romos","rincon-de-tamayo","rincon-del-centeno","rincon-del-porvenir","rincon-moreno","rincon-verde","rinconada","rinconada-de-los-angeles","rinconadadelosangeles","rinconadalalomafraccionamiento","rinconadas-de-san-francisco","rinconadas-del-bosque","rinconadas-del-venado-i","rinconadasdelbosque","rinconadasdelvenadoi","rinconadasdesanfrancisco","rinconchamula","rincondeaguirre","rincondebarrabas","rincondebuenavista","rincondecano","rincondecedenosrincondedolores","rincondecurungueo","rincondeguadalupe","rincondeguayabitos","rincondejaimes","rincondelcenteno","rincondelopez","rincondelospirules","rincondelosreyes","rincondelporvenir","rincondeparangueo","rinconderomos","rincondetamayo","rincones-de-la-hacienda","rinconesdelahacienda","rinconmoreno","rinconverde","rindge","ringgold","ringling","ringwood","rio","rio-blanco","rio-bravo","rio-chancala","rio-chiquito","rio-communities","rio-de-la-soledad","rio-de-medina","rio-de-teapa","rio-del-mar","rio-dell","rio-florido","rio-frio-de-juarez","rio-grande","rio-grande-city","rio-hondo","rio-jordan","rio-lagartos","rio-laja","rio-linda","rio-medio-granja","rio-pachine","rio-rancho","rio-rico","rio-seco-puente-de-doria","rio-verde","rio-viejo-primera-seccion","rio-vista","rioblanco","riobravo","riochancala","riochiquito","riocommunities","riodelasoledad","riodell","riodelmar","riodemedina","riodeteapa","rioflorido","riofriodejuarez","riogrande","riograndecity","riohondo","riojordan","riolagartos","riolaja","riolinda","riomediogranja","riopachine","riorancho","riorico","rioseco2daseccionsantiaguito","riosecopuentededoria","rioverde","rioviejoprimeraseccion","riovista","ripley","ripon","rising-sun","rising-sun-lebanon","risingsun","risingsunlebanon","rison","rittenhouse","rittman","ritzville","riva","riva-palacio","rivapalacio","river-bend","river-edge","river-falls","river-forest","river-grove","river-heights","river-hills","river-oaks","river-park","river-ridge","river-road","river-rouge","river-vale","river-view-park","riverbank","riverbend","riverdale","riverdale-park","riverdalepark","riveredge","riverfalls","riverforest","rivergrove","riverhead","riverheights","riverhills","riveroaks","riverpark","riverridge","riverroad","riverrouge","rivers","riverside","riverton","rivervale","riverview","riverviewpark","riverwoods","riviera-beach","rivierabeach","riviere-du-loup","riviere-rouge","riviereduloup","riviererouge","rizo-de-oro","rizodeoro","rizosdelajoyarizosdelsaucillo","rj","rjg","rjr","rk","rl","rlb","rlf","rlh","rllf","rlo","rlp","rls","rm","rmg","rmh","rmp","rmq","rn","rndl","ro","roaming-shores","roamingshores","roan-mountain","roanmountain","roanoke","roanoke-rapids","roanokerapids","roaring-spring","roaringspring","robbins","robbinsdale","robbinsville","robersonville","robert-lee","robertlee","roberts","robertsdale","robertsville","roberval","robesonia","robins","robins-air-force-base","robinsairforcebase","robinson","robinson-heights","robinsonheights","robinwood","roblada-grande","robladagrande","roblin","robstown","roby","rochelle","rochelle-park","rochellepark","rochester","rochester-hills","rochesterhills","rock-creek","rock-falls","rock-forest","rock-hall","rock-hill","rock-island","rock-port","rock-rapids","rock-springs","rock-valley","rockaway","rockaway-beach","rockaway-point","rockawaybeach","rockawaypoint","rockcliffe-smythe","rockcliffesmythe","rockcreek","rockdale","rockfalls","rockfish","rockford","rockforest","rockhall","rockhill","rockingham","rockisland","rockland","rockledge","rocklin","rockmart","rockport","rockrapids","rocksprings","rockton","rockvalley","rockville","rockville-centre","rockvillecentre","rockwall","rockwell","rockwell-city","rockwellcity","rockwood","rocky-ford","rocky-mount","rocky-mountain-house","rocky-point","rocky-river","rocky-top","rockyford","rockymount","rockymountainhouse","rockypoint","rockyriver","rockytop","rodeo","rodney-village","rodneyvillage","rodolfo-sanchez-taboada","rodolfosancheztaboada","rodrigo","rodrigo-m-quevedo","rodrigomquevedo","rodriguez-tejeda","rodrigueztejeda","rodulfo-figueroa","rodulfofigueroa","roebling","roebuck","roeland-park","roelandpark","roessleville","rogers","rogers-city","rogers-park","rogerscity","rogerspark","rogersville","rogue-river","rogueriver","rohnert-park","rohnertpark","rojas-de-cuauhtemoc","rojasdecuauhtemoc","roland","rolesville","rolla","rolling-fork","rolling-hills","rolling-hills-estates","rolling-meadows","rollingfork","rollinghills","rollinghillsestates","rollingmeadows","rollingwood","rollinsford","rom","roma","roma-los-saenz","romalossaenz","roman-forest","romanforest","rome","rome-city","romecity","romeo","romeoville","romerillo","romero-de-guzman","romero-de-torres","romerodeguzman","romerodetorres","romita","romney","romoland","romulus","ronan","roncesvalles","ronceverte","ronkonkoma","roo","roodhouse","roosevelt","roosevelt-gardens","roosevelt-park","rooseveltgardens","rooseveltpark","roque","rosa-blanca","rosablanca","rosales","rosamond","rosamorada","rosario","rosarito","rosaryville","roscoe","roscommon","rose-hill","rose-lodge","roseau","rosebank","roseboro","rosebud","roseburg","roseburg-north","roseburgnorth","rosedale","rosedale-moore-park","rosedalemoorepark","rosehill","roseland","roselawn","roselle","roselle-park","rosellepark","roselodge","rosemead","rosemere","rosemont","rosemount","rosenberg","rosendale","rosendale-village","rosendalevillage","rosenhayn","rosepine","roseto","rosetown","roseville","rosewood-heights","rosewoodheights","rosharon","rosiclare","rosita-north","rosita-south","rositanorth","rositasouth","roslindale","roslyn","roslyn-estates","roslyn-harbor","roslyn-heights","roslynestates","roslynharbor","roslynheights","ross","rossford","rossland","rosslyn","rossmoor","rossmoyne","rossville","rosthern","roswell","rotan","rothschild","rothsville","rotonda-west","rotondawest","rotterdam","rouge","rougemont","round-lake","round-lake-beach","round-lake-heights","round-lake-park","round-rock","roundlake","roundlakebeach","roundlakeheights","roundlakepark","roundrock","roundup","rouses-point","rousespoint","routt","rouyn-noranda","rouynnoranda","rowland","rowland-heights","rowlandheights","rowlett","rowley","roxana","roxboro","roxborough","roxborough-park","roxboroughpark","roxbury","roxbury-crossing","roxburycrossing","roy","royal-city","royal-kunia","royal-oak","royal-palm-beach","royal-palm-estates","royal-pines","royalcity","royalkunia","royaloak","royalpalmbeach","royalpalmestates","royalpines","royalston","royalton","royersford","royse-city","roysecity","royston","rp","rpb","rpe","rpg","rpv","rr","rs","rsd","rsf","rsl","rsm","rst","rt","rtr","rubidoux","ruckersville","rugby","ruidoso","ruidoso-downs","ruidosodowns","ruiz","ruleville","rumford","rumney","rumorosa","rumson","runaway-bay","runawaybay","runge","runnemede","running-springs","runningsprings","runnymede-bloor-west-village","runnymedebloorwestvillage","rupert","rural-hall","rural-hill","rural-retreat","ruralhall","ruralhill","ruralretreat","rush","rush-city","rush-springs","rushcity","rushford","rushmere","rushsprings","rushville","rusk","ruskin","russell","russell-springs","russells-point","russellspoint","russellsprings","russellton","russellville","russiaville","rustburg","rustic","ruston","rutherford","rutherford-college","rutherfordcollege","rutherfordton","rutland","rutledge","rv","rvp","rvps","rw","rwh","rydal","rye","rye-brook","ryebrook","ryegate","ryers","ryland-heights","rylandheights","ryp","rz","s1s","s2","s2s","sa","saa","saanichton","sab","saban","sabanas-de-xalostoc","sabanasdexalostoc","sabancuy","sabaneta","sabanilla","sabanillas","sabattus","sabetha","sabidos","sabina","sabinal","sabinalito","sabinas","sac","sac-city","sacalum","sacaton","saccity","sachse","sackets-harbor","sacketsharbor","sackville","saclamanton","saco","sacramento","sacre-coeur","sacrecoeur","sacv","sad","sada","sadb","sadc","sadd","saddle-brook","saddle-river","saddlebrook","saddlebrooke","saddleriver","sadf","sadm","sadp","sadr","sadt","sadv","sae","saec","saeg","sael","saep","saer","safb","safety-harbor","safetyharbor","safford","sag","sag-harbor","sagamore","sagharbor","saginaw","saginaw-township-north","saginawtownshipnorth","saguache","saguenay","sah","sahcaba","sahuaral-de-otero","sahuaraldeotero","sahuaripa","sahuarita","sahuayo-de-morelos","sahuayodemorelos","sai","sain-alto","sain-bajo","sainalto","sainbajo","saint-adolphe-dhoward","saint-albans","saint-alexandre","saint-amable","saint-ambroise","saint-andre-avellin","saint-andrews","saint-ann","saint-anne","saint-anselme","saint-ansgar","saint-anthony","saint-antoine","saint-antoine-de-tilly","saint-antonin","saint-augusta","saint-augustin","saint-augustin-de-desmaures","saint-augustine","saint-augustine-beach","saint-augustine-shores","saint-augustine-south","saint-barnabe-sud","saint-basile-le-grand","saint-bernard","saint-bonaventure","saint-boniface","saint-bonifacius","saint-bruno","saint-bruno-de-guigues","saint-bruno-de-montarville","saint-canut","saint-cesaire","saint-charles","saint-clair","saint-clair-shores","saint-clairsville","saint-cloud","saint-colomban","saint-come-liniere","saint-constant","saint-croix-falls","saint-cyrille-de-wendover","saint-damase","saint-david","saint-denis-sur-richelieu","saint-dennis","saint-donat-de-montcalm","saint-edouard","saint-elmo","saint-elzear","saint-ephrem-de-beauce","saint-eustache","saint-felicien","saint-felix-de-valois","saint-francis","saint-francisville","saint-gabriel","saint-gedeon","saint-george","saint-georges","saint-germain-de-grantham","saint-hedwig","saint-helen","saint-helena","saint-helens","saint-henri","saint-henry","saint-hippolyte","saint-honore","saint-hubert","saint-hyacinthe","saint-ignace","saint-isidore","saint-isidore-de-laprairie","saint-jacob","saint-jacques","saint-jacques-le-mineur","saint-james","saint-james-city","saint-jean-baptiste","saint-jean-sur-richelieu","saint-jerome","saint-jo","saint-john","saint-johns","saint-johnsbury","saint-johnsville","saint-joseph","saint-joseph-de-beauce","saint-joseph-de-coleraine","saint-joseph-du-lac","saint-lambert-de-lauzon","saint-laurent","saint-lawrence","saint-lazare","saint-lazare-de-bellechasse","saint-leo","saint-leonard","saint-leonard-daston","saint-liboire","saint-lin-laurentides","saint-louis","saint-louis-du-ha-ha","saint-louis-park","saint-marc-des-carrieres","saint-maries","saint-martin","saint-martins","saint-martinville","saint-marys","saint-mathieu","saint-matthews","saint-michael","saint-michaels","saint-michel","saint-michel-des-saints","saint-nazaire","saint-norbert","saint-pacome","saint-paris","saint-pascal","saint-paul","saint-paul-park","saint-pauls","saint-pete-beach","saint-peter","saint-peters","saint-philippe-de-la-prairie","saint-pie","saint-pie-v","saint-pierre-les-becquets","saint-placide","saint-polycarpe","saint-prime","saint-raphael","saint-raymond","saint-regis-park","saint-remi","saint-remi-de-tingwick","saint-robert","saint-rose","saint-sauveur","saint-sauveur-des-monts","saint-simeon","saint-simon-mills","saint-simons-island","saint-stephen","saint-stephens","saint-thomas","saint-tite","saint-victor","saint-zotique","saintadolphedhoward","saintalbans","saintalexandre","saintamable","saintambroise","saintandreavellin","saintandrews","saintann","saintanne","saintanselme","saintansgar","saintanthony","saintantoine","saintantoinedetilly","saintantonin","saintaugusta","saintaugustin","saintaugustindedesmaures","saintaugustine","saintaugustinebeach","saintaugustineshores","saintaugustinesouth","saintbarnabesud","saintbasilelegrand","saintbernard","saintbonaventure","saintboniface","saintbonifacius","saintbruno","saintbrunodeguigues","saintbrunodemontarville","saintcanut","saintcesaire","saintcharles","saintclair","saintclairshores","saintclairsville","saintcloud","saintcolomban","saintcomeliniere","saintconstant","saintcroixfalls","saintcyrilledewendover","saintdamase","saintdavid","saintdenissurrichelieu","saintdennis","saintdonatdemontcalm","sainte-adele","sainte-agathe-des-monts","sainte-anne-de-bellevue","sainte-anne-des-monts","sainte-anne-des-plaines","sainte-beatrix","sainte-catherine","sainte-croix","sainte-elisabeth","sainte-genevieve","sainte-julie","sainte-julienne","sainte-madeleine","sainte-marie","sainte-marthe-sur-le-lac","sainte-martine","sainte-monique","sainte-sophie","sainte-thecle","sainte-therese","sainteadele","sainteagathedesmonts","sainteannedebellevue","sainteannedesmonts","sainteannedesplaines","saintebeatrix","saintecatherine","saintecroix","saintedouard","sainteelisabeth","saintegenevieve","saintejulie","saintejulienne","saintelmo","saintelzear","saintemadeleine","saintemargueritedulacmasson","saintemarie","saintemarthesurlelac","saintemartine","saintemonique","saintephremdebeauce","saintesophie","saintethecle","saintetherese","sainteustache","saintfelicien","saintfelixdevalois","saintfrancis","saintfrancisville","saintgabriel","saintgedeon","saintgeorge","saintgeorges","saintgermaindegrantham","sainthedwig","sainthelen","sainthelena","sainthelens","sainthenri","sainthenry","sainthippolyte","sainthonore","sainthubert","sainthyacinthe","saintignace","saintisidore","saintisidoredelaprairie","saintjacob","saintjacques","saintjacqueslemineur","saintjames","saintjamescity","saintjeanbaptiste","saintjeansurrichelieu","saintjerome","saintjo","saintjohn","saintjohns","saintjohnsbury","saintjohnsville","saintjoseph","saintjosephdebeauce","saintjosephdecoleraine","saintjosephdulac","saintlambertdelauzon","saintlaurent","saintlawrence","saintlazare","saintlazaredebellechasse","saintleo","saintleonard","saintleonarddaston","saintliboire","saintlinlaurentides","saintlouis","saintlouisduhaha","saintlouispark","saintmarcdescarrieres","saintmaries","saintmartin","saintmartins","saintmartinville","saintmarys","saintmathieu","saintmatthews","saintmichael","saintmichaels","saintmichel","saintmicheldessaints","saintnazaire","saintnorbert","saintpacome","saintparis","saintpascal","saintpaul","saintpaulpark","saintpauls","saintpetebeach","saintpeter","saintpeters","saintphilippedelaprairie","saintpie","saintpierrelesbecquets","saintpiev","saintplacide","saintpolycarpe","saintprime","saintraphael","saintraymond","saintregispark","saintremi","saintremidetingwick","saintrobert","saintrose","saintsauveur","saintsauveurdesmonts","saintsimeon","saintsimonmills","saintsimonsisland","saintstephen","saintstephens","saintthomas","sainttite","saintvictor","saintzotique","saj","saks","sal","salaberry-de-valleyfield","salaberrydevalleyfield","saladero","salado","salamanca","salazar","salcha","saldarriaga","sale-creek","salecreek","salem","salem-heights","salemheights","salguero","sali","salida","salina","salina-cruz","salinacruz","salinas","salinas-de-hidalgo","salinas-victoria","salinasdehidalgo","salinasvictoria","saline","salineville","salisbury","salitral-de-carrera","salitraldecarrera","salitrillo","salix","sall","sallisaw","salluit","salmo","salmon","salmon-arm","salmon-brook","salmon-creek","salmonarm","salmonbrook","salmoncreek","salome","saloya-2da-seccion","saloya2daseccion","salp","salt-lake-city","salt-spring-island","saltabarranca","saltair","saltillo","saltlakecity","salto-de-agua","saltodeagua","salton-city","saltoncity","saltspringisland","saltville","saluda","salunga","salv","salvador-diaz-miron","salvador-rosas-magallon","salvador-urbina","salvadordiazmiron","salvadorrosasmagallon","salvadorurbina","salvatierra","salyersville","sam","sam-rayburn","samachique","samahil","samalayuca","samarkanda","sammamish","samoset","samrayburn","samson","samsula-spruce-creek","samsulasprucecreek","san","san-acateno","san-agustin","san-agustin-amatengo","san-agustin-atenango","san-agustin-atzompa","san-agustin-berros","san-agustin-buenavista","san-agustin-chayuco","san-agustin-citlali","san-agustin-de-las-flores","san-agustin-de-las-juntas","san-agustin-de-las-palmas","san-agustin-del-maiz","san-agustin-del-palmar","san-agustin-del-pulque","san-agustin-etla","san-agustin-huitzizilapan","san-agustin-huixaxtla","san-agustin-loxicha","san-agustin-mextepec","san-agustin-mimbres","san-agustin-oapan","san-agustin-tlaxco","san-agustin-tlaxiaca","san-agustin-yatareni","san-agustin-zapotlan","san-alejo","san-andreas","san-andres","san-andres-ahuashuatepec","san-andres-azumiatla","san-andres-cacaloapan","san-andres-calpan","san-andres-chicahuaxtla","san-andres-cholula","san-andres-cohamiata","san-andres-coru","san-andres-cuexcontitlan","san-andres-de-la-cal","san-andres-de-las-peras","san-andres-de-los-gama","san-andres-del-pedregal","san-andres-dinicuiti","san-andres-duraznal","san-andres-enguaro","san-andres-hidalgo","san-andres-huaxpaltepec","san-andres-huayapam","san-andres-hueyacatitla","san-andres-ixtlahuaca","san-andres-ixtlan","san-andres-metla","san-andres-mixquic","san-andres-nicolas-bravo","san-andres-ocotepec","san-andres-ocotlan","san-andres-paxtlan","san-andres-payuca","san-andres-sinaxtla","san-andres-solaga","san-andres-tenejapan","san-andres-teotilalpam","san-andres-tepetitlan","san-andres-timilpan","san-andres-tlalamac","san-andres-tuxtla","san-andres-yaa","san-andres-yahuitlalpan","san-andres-zautla","san-andres-zirondaro","san-angel","san-angelo","san-anselmo","san-antonino-castillo-velasco","san-antonio","san-antonio-acahualco","san-antonio-alpanocan","san-antonio-arrazola","san-antonio-atotonilco","san-antonio-bonixi","san-antonio-buenavista","san-antonio-bulujib","san-antonio-calichar","san-antonio-canada","san-antonio-cardenas","san-antonio-chiverias","san-antonio-coyahuacan","san-antonio-de-corrales","san-antonio-de-fernandez","san-antonio-de-la-cal","san-antonio-de-la-laguna","san-antonio-de-las-alazanas","san-antonio-de-las-huertas","san-antonio-de-las-palmas","san-antonio-de-los-horcones","san-antonio-de-los-morales","san-antonio-de-los-rios","san-antonio-de-los-tepetates","san-antonio-de-los-vazquez","san-antonio-de-penuelas","san-antonio-de-rivas","san-antonio-de-romerillo","san-antonio-del-cipres","san-antonio-del-coyote","san-antonio-del-monte","san-antonio-del-puente","san-antonio-del-rosario","san-antonio-el-chico","san-antonio-el-grande","san-antonio-el-llanito","san-antonio-el-paso","san-antonio-el-rico","san-antonio-emenguaro","san-antonio-enchisi","san-antonio-gallardo","san-antonio-guaracha","san-antonio-heights","san-antonio-huitepec","san-antonio-juarez","san-antonio-la-isla","san-antonio-la-labor","san-antonio-la-portilla","san-antonio-las-palmas","san-antonio-matlahuacales","san-antonio-mihuacan","san-antonio-molinos","san-antonio-nixini","san-antonio-ocopetlatlan","san-antonio-ocotlan","san-antonio-portezuelo","san-antonio-primero","san-antonio-rayon","san-antonio-sahcabchen","san-antonio-soledad","san-antonio-solis","san-antonio-tariacuri","san-antonio-tecolco","san-antonio-tecomitl","san-antonio-tedzidz","san-antonio-tepetlapa","san-antonio-texas","san-antonio-tlacamilco","san-antonio-tlaltecahuacan","san-antonio-tlatenco","san-antonio-villalongin","san-antonio-virreyes","san-antonio-xahuento","san-antonio-xoquitla","san-antonio-zaragoza","san-atenogenes-la-villita","san-augustine","san-baltazar-atlimeyaya","san-baltazar-chichicapam","san-baltazar-guelavila","san-baltazar-loxicha","san-bartolito-tlaltelolco","san-bartolo","san-bartolo-coyotespec","san-bartolo-cuautlalpan","san-bartolo-cuitareo","san-bartolo-de-berrios","san-bartolo-del-llano","san-bartolo-del-progreso","san-bartolo-el-viejo","san-bartolo-lanzados","san-bartolo-morelos","san-bartolo-oxtotitlan","san-bartolo-ozocalpan","san-bartolo-tlaxihuicalco","san-bartolo-tutotepec","san-bartolo-yautepec","san-bartolome","san-bartolome-aguas-calientes","san-bartolome-atlatlahuca","san-bartolome-ayautla","san-bartolome-coatepec","san-bartolome-cuahuixmatlac","san-bartolome-hueyapan","san-bartolome-loxicha","san-bartolome-quialana","san-bartolome-tenango","san-bartolome-tlaltelulco","san-bartolome-xicomulco","san-benito","san-benito-encinal","san-benito-xaltocan","san-bernabe-de-las-canteras","san-bernabe-temoxtitla","san-bernardino","san-bernardino-lagunas","san-bernardino-tlaxcalancingo","san-bernardo","san-bernardo-mixtepec","san-bernardo-pena-blanca","san-bernardo-tlalmimilolpan","san-blas","san-blas-atempa","san-bruno","san-buenaventura","san-buenaventura-atempan","san-buenaventura-tecaltzingo","san-caralampio","san-carlos","san-carlos-autopan","san-carlos-park","san-carlos-yautepec","san-cayetano","san-ciro-de-acosta","san-clemente","san-clemente-de-lima","san-cosme-atlamaxac","san-cristobal","san-cristobal-amatlan","san-cristobal-amoltepec","san-cristobal-chacon","san-cristobal-de-la-barranca","san-cristobal-de-las-casas","san-cristobal-hidalgo","san-cristobal-honduras","san-cristobal-lachirioag","san-cristobal-los-nava","san-cristobal-nexquipayac","san-cristobal-xochimilpa","san-cristobal-zapotitlan","san-damian-texoloc","san-diego","san-diego-alcala","san-diego-country-estates","san-diego-de-alcala","san-diego-de-alejandria","san-diego-de-la-union","san-diego-del-cerrito","san-diego-el-organal","san-diego-huehuecalco","san-diego-la-huerta","san-diego-linares","san-dimas","san-dionisio-del-mar","san-dionisio-ocotepec","san-dionisio-ocotlan","san-elias","san-elizario","san-esteban","san-esteban-atatlahuca","san-esteban-de-abajo","san-esteban-tizatlan","san-felipe","san-felipe-aztatan","san-felipe-cihualtepec","san-felipe-coamango","san-felipe-de-hijar","san-felipe-de-jesus","san-felipe-de-los-herreros","san-felipe-del-progreso","san-felipe-el-mirasol","san-felipe-hidalgo","san-felipe-jalapa-de-diaz","san-felipe-orizatlan","san-felipe-otlaltepec","san-felipe-pueblo","san-felipe-pueblo-nuevo","san-felipe-quiriceo","san-felipe-santiago","san-felipe-sultepec","san-felipe-tejalapam","san-felipe-teotitlan","san-felipe-tilpam","san-felipe-tizapa","san-felipe-tlalmimilolpan","san-felipe-usila","san-felix-hidalgo","san-felix-rijo","san-fernando","san-francisco","san-francisco-acuautla","san-francisco-atotonilco","san-francisco-ayotuzco","san-francisco-cajonos","san-francisco-chalchihuapan","san-francisco-chimalpa","san-francisco-chindua","san-francisco-coatlan","san-francisco-cozoaltepec","san-francisco-cuapa","san-francisco-cuautlancingo","san-francisco-cuaxusco","san-francisco-cuayalab","san-francisco-cuexcontzi","san-francisco-de-arriba","san-francisco-de-asis","san-francisco-de-borja","san-francisco-de-conchos","san-francisco-de-duran","san-francisco-de-guzman","san-francisco-de-la-palma","san-francisco-de-los-romo","san-francisco-de-rivas","san-francisco-de-tacuichamona","san-francisco-del-mar","san-francisco-del-mar-viejo","san-francisco-del-mezquital","san-francisco-del-rincon","san-francisco-el-calvito","san-francisco-grande","san-francisco-huehuetlan","san-francisco-ixhuatan","san-francisco-jacona","san-francisco-jaltepetongo","san-francisco-javier","san-francisco-koben","san-francisco-lachigolo","san-francisco-logueche","san-francisco-loxicha","san-francisco-magu","san-francisco-mata-clara","san-francisco-mazapa","san-francisco-mihualtepec","san-francisco-nacaxtle","san-francisco-nuxano","san-francisco-ocotlan","san-francisco-oxtotilpan","san-francisco-oxtutla","san-francisco-ozolotepec","san-francisco-ozomatlan","san-francisco-periban","san-francisco-pujiltic","san-francisco-putla","san-francisco-sola","san-francisco-solis","san-francisco-tecoxpa","san-francisco-telixtlahuaca","san-francisco-temetzontla","san-francisco-tenopalco","san-francisco-tepeolulco","san-francisco-tepexoxica","san-francisco-tepeyecac","san-francisco-tetetla","san-francisco-tetlanohcan","san-francisco-tlacuilohcan","san-francisco-tlalcilalcalpan","san-francisco-tlaloc","san-francisco-tlaltica","san-francisco-tutla","san-francisco-xochicuautla","san-francisco-zacacalco","san-francisco-zacapexpan","san-gabriel","san-gabriel-azteca","san-gabriel-chilac","san-gabriel-ixtla","san-gabriel-las-palmas","san-gabriel-mixtepec","san-gabriel-tetzoyocan","san-gabriel-y-san-ignacio","san-gabriel-zepayautla","san-gaspar","san-gaspar-tlahuelilpan","san-gaspar-tonatico","san-german","san-gregorio","san-gregorio-atzompa","san-gregorio-aztotoacan","san-gregorio-cuautzingo","san-hipolito","san-hipolito-chimalpa","san-ignacio","san-ignacio-cerro-gordo","san-ignacio-de-hidalgo","san-ignacio-nopala","san-ignacio-rio-muerto","san-ildefonso","san-ildefonso-amatlan","san-ildefonso-tultepec","san-ildefonso-villa-alta","san-isidro","san-isidro-alta-huerta","san-isidro-apango","san-isidro-boxipe","san-isidro-buen-suceso","san-isidro-buenavista","san-isidro-de-gamboa","san-isidro-de-la-concepcion","san-isidro-de-la-estacada","san-isidro-de-los-sauces","san-isidro-el-berro","san-isidro-el-reservado","san-isidro-huilotepec","san-isidro-las-banderas","san-isidro-mazatepec","san-isidro-miranda","san-isidro-monjas","san-isidro-monterrosas","san-isidro-palotal","san-isidro-vista-hermosa","san-jacinto","san-jacinto-amilpas","san-javier","san-jeronimito","san-jeronimo","san-jeronimo-acazulco","san-jeronimo-almoloya","san-jeronimo-amanalco","san-jeronimo-axochitlan","san-jeronimo-bonchete","san-jeronimo-coaltepec","san-jeronimo-coatlan","san-jeronimo-coyula","san-jeronimo-cuatro-vientos","san-jeronimo-de-araceo","san-jeronimo-de-juarez","san-jeronimo-de-los-jarros","san-jeronimo-el-grande","san-jeronimo-ocotitla","san-jeronimo-purenchecuaro","san-jeronimo-silacayoapilla","san-jeronimo-sosola","san-jeronimo-taviche","san-jeronimo-tecoatl","san-jeronimo-tlacochahuaya","san-jeronimo-totoltepec","san-jeronimo-tulija","san-jeronimo-xayacatlan","san-jeronimo-yahuiche","san-jeronimo-zacualpan","san-joaquin","san-joaquin-coapango","san-joaquin-del-monte","san-joaquin-hills","san-joaquin-zorrillos","san-jorge-nuchita","san-jorge-pueblo-nuevo","san-jorge-tezoquipan","san-jose","san-jose-acateno","san-jose-atlan","san-jose-atoyatenco","san-jose-ayuquila","san-jose-aztatla","san-jose-barbabosa","san-jose-boqui","san-jose-boxay","san-jose-buena-vista","san-jose-buenavista","san-jose-buenavista-el-grande","san-jose-carpinteros","san-jose-casas-caidas","san-jose-chacalapa","san-jose-chalmita","san-jose-chapayal","san-jose-chiapa","san-jose-chiltepec","san-jose-comalco","san-jose-corral-blanco","san-jose-cuamantzingo","san-jose-cuaro","san-jose-cuyachapa","san-jose-de-abajo","san-jose-de-agua-azul","san-jose-de-aura","san-jose-de-ayala","san-jose-de-bacum","san-jose-de-castellanos","san-jose-de-cervera","san-jose-de-duran-los-troncoso","san-jose-de-gracia","san-jose-de-guanajuato","san-jose-de-guaymas","san-jose-de-la-era","san-jose-de-la-laja","san-jose-de-la-montana","san-jose-de-la-paz","san-jose-de-las-flores","san-jose-de-las-pilas","san-jose-de-llanos","san-jose-de-los-olvera","san-jose-de-los-reynoso","san-jose-de-lourdes","san-jose-de-mendoza","san-jose-de-raices","san-jose-de-tapia","san-jose-de-vinedo","san-jose-de-zaragoza","san-jose-del-cabo","san-jose-del-castillo","san-jose-del-jaguey","san-jose-del-potrero","san-jose-del-progreso","san-jose-del-puente","san-jose-del-rincon-centro","san-jose-del-rodeo","san-jose-del-sitio","san-jose-del-tapanco","san-jose-del-torreon","san-jose-del-tunal","san-jose-del-valle","san-jose-el-alto","san-jose-el-cuartel","san-jose-el-llanito","san-jose-el-nuevo","san-jose-el-vidrio","san-jose-estancia-grande","san-jose-guadalupe-otzacatipan","san-jose-huipana","san-jose-independencia","san-jose-itho","san-jose-iturbide","san-jose-ixtapa-barrio-viejo","san-jose-la-garzona","san-jose-la-hacienda","san-jose-lachiguiri","san-jose-las-chicharras","san-jose-las-lomas","san-jose-las-palmas","san-jose-manzanitos","san-jose-mezapa-seccion-i","san-jose-monte-chiquito","san-jose-neria","san-jose-ocotillos","san-jose-ozumba","san-jose-pathe","san-jose-piedras-negras","san-jose-poliutla","san-jose-rio-manzo","san-jose-solis","san-jose-suchil","san-jose-teacalco","san-jose-tejamanil","san-jose-temascatio","san-jose-tenango","san-jose-tenejapa","san-jose-teneria-teneria","san-jose-tepeyahualco","san-jose-tepuzas","san-jose-tetel","san-jose-tilapa","san-jose-tlacotitlan","san-jose-tlacuitlapan","san-jose-toxi","san-jose-tzal","san-jose-viborillas","san-jose-villa-de-allende","san-jose-villarreal","san-jose-vista-hermosa","san-jose-xicohtencatl","san-jose-yashitinin","san-jose-yocnajab","san-juan","san-juan-achichilco","san-juan-achiutla","san-juan-ahuehueco","san-juan-ahuehueyo","san-juan-amecac","san-juan-atenco","san-juan-atepec","san-juan-atezcapan","san-juan-atzingo","san-juan-atzompa","san-juan-bautista","san-juan-bautista-cacalote","san-juan-bautista-jayacatlan","san-juan-bautista-la-raya","san-juan-bautista-lo-de-soto","san-juan-cabeza-del-rio","san-juan-cacahuatepec","san-juan-cancuc","san-juan-capistrano","san-juan-chilateca","san-juan-coajomulco","san-juan-coatzospam","san-juan-colon","san-juan-colorado","san-juan-cosala","san-juan-cote-ejido","san-juan-cotzocon","san-juan-coxtocan","san-juan-cuauhtemoc","san-juan-cuautla","san-juan-daxthi","san-juan-de-abajo","san-juan-de-guadalupe","san-juan-de-la-vaqueria","san-juan-de-la-vega","san-juan-de-las-huertas","san-juan-de-las-manzanas","san-juan-de-los-arcos","san-juan-de-los-cues","san-juan-de-los-jarros","san-juan-de-los-lagos","san-juan-de-los-platanos","san-juan-de-otates","san-juan-de-sabinas","san-juan-de-vina","san-juan-del-estado","san-juan-del-llanito","san-juan-del-rio","san-juan-diuxi","san-juan-epatlan","san-juan-evangelista","san-juan-grande","san-juan-guelavia","san-juan-guichicovi","san-juan-huactzinco","san-juan-hueyapan","san-juan-huiluco","san-juan-ihualtepec","san-juan-ixcaquixtla","san-juan-ixtayopan","san-juan-jalpa-centro","san-juan-jaltepec","san-juan-jaripeo","san-juan-jicayan","san-juan-juquila","san-juan-juquila-vijanos","san-juan-la-isla","san-juan-lachao","san-juan-lachigalla","san-juan-lagunas","san-juan-mazatlan","san-juan-metaltepec","san-juan-mixtepec","san-juan-numi","san-juan-ozolotepec","san-juan-pan-de-arriba","san-juan-pancoac","san-juan-petlapa","san-juan-pueblo-nuevo","san-juan-quetzalcoapan","san-juan-quiahue","san-juan-quiotepec","san-juan-raboso","san-juan-sautla","san-juan-sayultepec","san-juan-seco-de-valencia","san-juan-solis","san-juan-tabaa","san-juan-tahitic","san-juan-tecomatlan","san-juan-tehuixtitlan","san-juan-teitipac","san-juan-tejaluca","san-juan-tepa","san-juan-tepecoculco","san-juan-tepulco","san-juan-tetla","san-juan-texcalpan","san-juan-tezongo","san-juan-tilapa","san-juan-tilcuautla","san-juan-tlacotompa-tlacotompa","san-juan-tomasquillo-herradura","san-juan-totolapan","san-juan-totolcintla","san-juan-tuxco","san-juan-tuxtepec","san-juan-volador","san-juan-xiutetelco","san-juan-xochiaca","san-juan-xoconusco","san-juan-y-san-pedro-tezompa","san-juan-yaee","san-juan-yatzona","san-juan-yautepec","san-juan-zapotitlan","san-juan-zitlaltepec","san-juanico-sector-uno","san-juanito","san-juanito-de-escobedo","san-juanito-itzicuaro","san-julian","san-julio","san-leandro","san-leon","san-leoncio-jamaya","san-lorenzo","san-lorenzo-achiotepec","san-lorenzo-acopilco","san-lorenzo-albarradas","san-lorenzo-axocomanitla","san-lorenzo-cacaotepec","san-lorenzo-chiautzingo","san-lorenzo-cuauhtenco","san-lorenzo-cuaunecuiltitla","san-lorenzo-huehuetitlan","san-lorenzo-itzicuaro","san-lorenzo-joya-de-rodriguez","san-lorenzo-malacota","san-lorenzo-nenamicoyan","san-lorenzo-oyamel","san-lorenzo-querendaro","san-lorenzo-sayula","san-lorenzo-soltepec","san-lorenzo-tenochtitlan","san-lorenzo-tlacotepec","san-lorenzo-tlacoyucan","san-lorenzo-tlalmimilolpan","san-lorenzo-tlaxipehuala","san-lorenzo-toxico","san-lorenzo-vista-hermosa","san-lorenzo-xaltelulco","san-lucas","san-lucas-amalinalco","san-lucas-atzala","san-lucas-camotlan","san-lucas-del-pulque","san-lucas-el-grande","san-lucas-el-viejo","san-lucas-evangelista","san-lucas-huitzilhuacan","san-lucas-ocotepec","san-lucas-ojitlan","san-lucas-pio","san-lucas-quiavini","san-lucas-tecopilco","san-lucas-texcaltitlan","san-lucas-tlacochcalco","san-lucas-totolmaloya","san-lucas-zoquiapam","san-luis","san-luis-acatlan","san-luis-ajajalpan","san-luis-amatlan","san-luis-anahuac-toriles","san-luis-apizaquito","san-luis-ayucan","san-luis-boro","san-luis-coyotzingo","san-luis-de-agua-caliente","san-luis-de-la-loma","san-luis-de-la-paz","san-luis-de-letras","san-luis-de-lozada","san-luis-del-cordero","san-luis-obispo","san-luis-potosi","san-luis-rio-colorado","san-luis-san-pedro","san-luis-soyatlan","san-luis-taxhimay","san-luis-tecuhautitlan","san-luis-tehuiloyocan","san-luqueno","san-manuel","san-marcial-ozolotepec","san-marcos","san-marcos-arteaga","san-marcos-atesquilapan","san-marcos-contla","san-marcos-de-la-cruz","san-marcos-de-la-loma","san-marcos-de-leon","san-marcos-eloxochitlan","san-marcos-guaquilpan","san-marcos-huixtoco","san-marcos-nepantla","san-marcos-tecomaxusco","san-marcos-tlacoyalco","san-marcos-tlazalpan","san-marcos-yachihuacaltepec","san-marcos-zacatepec","san-marino","san-martin","san-martin-ahuatepec","san-martin-azcatepec","san-martin-cachihuapan","san-martin-caltenco","san-martin-chalchicuautla","san-martin-coapaxtongo","san-martin-cuautlalpan","san-martin-de-bolanos","san-martin-de-las-piramides","san-martin-de-los-canseco","san-martin-de-zula","san-martin-ejido","san-martin-esperilla","san-martin-florida","san-martin-hidalgo","san-martin-itunyoso","san-martin-lachila","san-martin-mazateopan","san-martin-ojo-de-agua","san-martin-pachivia-pachivia","san-martin-tilcajete","san-martin-tlamapa","san-martin-tlapala","san-martin-toltepec","san-martin-totolan","san-martin-tuchicuitlapilco","san-mateo","san-mateo-almomoloha","san-mateo-atarasquillo","san-mateo-atenco","san-mateo-ayecac","san-mateo-cajonos","san-mateo-capulhuac","san-mateo-capultitlan","san-mateo-coapexco","san-mateo-del-mar","san-mateo-el-viejo","san-mateo-etlatongo","san-mateo-huitzilzingo","san-mateo-ixtacalco","san-mateo-ixtlahuaca","san-mateo-mozoquilpan","san-mateo-nejapam","san-mateo-otzacatipan","san-mateo-ozolco","san-mateo-parra","san-mateo-pinas","san-mateo-soltepec","san-mateo-tecalco","san-mateo-texcalyacac","san-mateo-tlalchichilpan","san-mateo-xoloc","san-mateo-yoloxochitlan","san-matias-atzala","san-matias-cuijingo","san-matias-tepetomatitlan","san-matias-tlalancaleca","san-melchor-betaza","san-miguel","san-miguel-abejones","san-miguel-achiutla","san-miguel-agua-bendita","san-miguel-aguacomulican","san-miguel-ajusco","san-miguel-almaya","san-miguel-almoloyan","san-miguel-aloapam","san-miguel-amazcala","san-miguel-ameyalco","san-miguel-analco","san-miguel-atepoxco","san-miguel-atlamajac","san-miguel-atlapulco","san-miguel-axoxuca","san-miguel-balderas","san-miguel-canoa","san-miguel-cerezo-el-cerezo","san-miguel-chimalapa","san-miguel-coatlan","san-miguel-coatlinchan","san-miguel-contla","san-miguel-cuyutlan","san-miguel-de-allende","san-miguel-de-cruces","san-miguel-de-horcasitas","san-miguel-de-la-paz","san-miguel-de-la-victoria","san-miguel-de-las-palmas","san-miguel-del-arenal","san-miguel-del-centro","san-miguel-del-milagro","san-miguel-del-progreso","san-miguel-del-puerto","san-miguel-del-valle","san-miguel-ejutla","san-miguel-el-alto","san-miguel-el-grande","san-miguel-emenguaro","san-miguel-enyege","san-miguel-epejan","san-miguel-espejo","san-miguel-figueroa","san-miguel-hila","san-miguel-huautla","san-miguel-ixitlan","san-miguel-ixtapan","san-miguel-jaltocan","san-miguel-la-sardina","san-miguel-laderas","san-miguel-mecatepec","san-miguel-mimlapan","san-miguel-mixtepec","san-miguel-monteverde","san-miguel-ocotenco","san-miguel-octopan","san-miguel-oxtotilpan","san-miguel-panixtlahuaca","san-miguel-papaxtla","san-miguel-peras","san-miguel-quetzaltepec","san-miguel-suchixtepec","san-miguel-tecomatlan","san-miguel-tecpan","san-miguel-tecuiciapan","san-miguel-tecuitlapa","san-miguel-tenango","san-miguel-tenextatiloyan","san-miguel-tenochtitlan","san-miguel-tetepelcingo","san-miguel-tianguistenco","san-miguel-tianguizolco","san-miguel-tilquiapam","san-miguel-tlacamama","san-miguel-tlacotepec","san-miguel-tlaixpan","san-miguel-tlalpoalan","san-miguel-tlamahuco","san-miguel-topilejo","san-miguel-totocuitlapilco","san-miguel-totolapan","san-miguel-totoltepec","san-miguel-vindho","san-miguel-xochitecatitla","san-miguel-xoltepec","san-miguel-xoxtla","san-miguel-yuxtepec","san-miguel-zapotitlan","san-miguel-zoapan","san-miguelito","san-nicolas","san-nicolas-amealco","san-nicolas-buenos-aires","san-nicolas-de-la-condesa","san-nicolas-de-la-torre","san-nicolas-de-los-agustinos","san-nicolas-de-los-garza","san-nicolas-de-los-ranchos","san-nicolas-del-carmen","san-nicolas-el-chico","san-nicolas-el-oro","san-nicolas-guadalupe","san-nicolas-obispo","san-nicolas-peralta","san-nicolas-quialana","san-nicolas-solis","san-nicolas-tecomatlan","san-nicolas-temascatio","san-nicolas-tlazala","san-nicolas-tolentino","san-nicolas-zecalacoayan","san-nicolas-zoyapetlayoca","san-pablito","san-pablo","san-pablo-ahuatempa","san-pablo-anicano","san-pablo-atlazalpan","san-pablo-atotonilco","san-pablo-atzompa","san-pablo-autopan","san-pablo-coatlan","san-pablo-cuatro-venados","san-pablo-de-las-salinas","san-pablo-de-las-tunas","san-pablo-de-los-gallos","san-pablo-de-los-remedios","san-pablo-el-grande","san-pablo-etla","san-pablo-guila","san-pablo-huacano","san-pablo-huantepec","san-pablo-huitzo","san-pablo-huixtepec","san-pablo-ixayoc","san-pablo-ixquitlan","san-pablo-macuiltianguis","san-pablo-oztotepec","san-pablo-pejo","san-pablo-pixtun","san-pablo-tecalco","san-pablo-tejalpa","san-pablo-villa-de-mitla","san-pasqual","san-patricio","san-pedro","san-pedro-abajo","san-pedro-amuzgos","san-pedro-apatlaco","san-pedro-apostol","san-pedro-arriba","san-pedro-arriba-3ra-seccion","san-pedro-atlapulco","san-pedro-atmatla","san-pedro-atocpan","san-pedro-atoyac","san-pedro-benito-juarez","san-pedro-buenavista","san-pedro-cacahuatepec","san-pedro-chiautzingo","san-pedro-chimay","san-pedro-chochula","san-pedro-cholula","san-pedro-comitancillo","san-pedro-coxcaltepec-cantaros","san-pedro-coyutla","san-pedro-cuayuca","san-pedro-cuitlapan","san-pedro-de-ibarra","san-pedro-de-la-cueva","san-pedro-de-los-banos","san-pedro-de-los-metates","san-pedro-de-los-naranjos","san-pedro-de-los-sauces","san-pedro-del-gallo","san-pedro-del-rincon","san-pedro-del-rosal","san-pedro-denxhi-centro","san-pedro-ecatepec","san-pedro-el-alto","san-pedro-garza-garcia","san-pedro-guasave","san-pedro-huamelula","san-pedro-huaquilpan","san-pedro-huilotepec","san-pedro-huitzizilapan","san-pedro-itzican","san-pedro-itztla","san-pedro-ixcatlan","san-pedro-ixtlahuaca","san-pedro-jacuaro","san-pedro-jicayan","san-pedro-juchaltengo","san-pedro-la-joya","san-pedro-lagunillas","san-pedro-las-playas","san-pedro-limon","san-pedro-los-banos","san-pedro-martir","san-pedro-martir-quiechapa","san-pedro-martir-yucuxaco","san-pedro-matamoros","san-pedro-mixtepec","san-pedro-munoztla","san-pedro-nexapa","san-pedro-nichtalucum","san-pedro-nuevo","san-pedro-ocopetatillo","san-pedro-ocotepec","san-pedro-ozumacin","san-pedro-petlacotla","san-pedro-piedra-gorda","san-pedro-pochutla","san-pedro-quiatoni","san-pedro-sochiapam","san-pedro-tapanatepec","san-pedro-tarimbaro","san-pedro-taviche","san-pedro-techuchulco","san-pedro-tejalpa","san-pedro-temamatla","san-pedro-tenango","san-pedro-tenayac","san-pedro-tepetitlan","san-pedro-tesistan","san-pedro-tetitlan","san-pedro-tidaa","san-pedro-tlachichilco","san-pedro-tlacotepec","san-pedro-tlaltizapan","san-pedro-tlanixco","san-pedro-tlaolantongo","san-pedro-tlapacoyan","san-pedro-tlaquilpan","san-pedro-topiltepec","san-pedro-totolapam","san-pedro-totoltepec","san-pedro-tulixtlahuaca","san-pedro-tultepec","san-pedro-xalcaltzinco","san-pedro-xalpa","san-pedro-xochiteotla","san-pedro-yancuitlalpan","san-pedro-yolox","san-pedro-zacachimalpa","san-pedro-zictepec","san-quintin","san-rafael","san-rafael-caleria","san-rafael-ixtapalucan","san-rafael-rio-seco","san-rafael-tecario","san-rafael-tenanyecac","san-rafael-tepatlaxco","san-rafael-tlanalapan","san-rafael-zaragoza","san-ramon","san-raymundo-jalpam","san-roque","san-roque-de-montes","san-roque-de-torres","san-saba","san-salvador","san-salvador-atenco","san-salvador-cuauhtenco","san-salvador-el-seco","san-salvador-el-verde","san-salvador-naranjillo","san-salvador-tizatlalli","san-salvador-torrecillas","san-sebastian","san-sebastian-abasolo","san-sebastian-alcomunga","san-sebastian-buenos-aires","san-sebastian-chimalpa","san-sebastian-coatlan","san-sebastian-de-aparicio","san-sebastian-de-salitre","san-sebastian-del-monte","san-sebastian-del-oeste","san-sebastian-del-sur","san-sebastian-el-grande","san-sebastian-etla","san-sebastian-fraccionamiento","san-sebastian-nicananduta","san-sebastian-rio-hondo","san-sebastian-teitipac","san-sebastian-tenochtitlan","san-sebastian-teteles","san-sebastian-tutla","san-sebastian-xolalpa","san-simeon-xipetzingo","san-simon","san-simon-almolongas","san-simon-atzitzintla","san-simon-de-guerrero","san-simon-de-la-laguna","san-simon-el-alto","san-simon-tlatlahuquitepec","san-simonito","san-tadeo","san-tan-valley","san-vicente","san-vicente-boqueron","san-vicente-chimalhuacan","san-vicente-coatlan","san-vicente-coyotepec","san-vicente-de-flores","san-vicente-de-juarez","san-vicente-el-alto","san-vicente-ferrer","san-vicente-la-mesilla","san-vicente-lachixio","san-vicente-nunu","san-vicente-palapa","san-vicente-pinas","san-vicente-tancuayalab","san-vicente-zoyatlan","san-ysidro","sanacateno","sanagustin","sanagustinamatengo","sanagustinatenango","sanagustinatzompa","sanagustinberros","sanagustinbuenavista","sanagustinchayuco","sanagustincitlali","sanagustindelasflores","sanagustindelasjuntas","sanagustindelaspalmas","sanagustindelmaiz","sanagustindelpalmar","sanagustindelpulque","sanagustinetla","sanagustinhuitzizilapan","sanagustinhuixaxtla","sanagustinloxicha","sanagustinmextepec","sanagustinmimbres","sanagustinoapan","sanagustintlaxco","sanagustintlaxiaca","sanagustinyatareni","sanagustinzapotlan","sanahcat","sanalejo","sanalona","sanandreas","sanandres","sanandresahuashuatepec","sanandresazumiatla","sanandrescacaloapan","sanandrescalpan","sanandreschicahuaxtla","sanandrescholula","sanandrescohamiata","sanandrescoru","sanandrescuexcontitlan","sanandresdelacal","sanandresdelasperas","sanandresdelosgama","sanandresdelpedregal","sanandresdinicuiti","sanandresduraznal","sanandresenguaro","sanandreshidalgo","sanandreshuaxpaltepec","sanandreshuayapam","sanandreshueyacatitla","sanandresixtlahuaca","sanandresixtlan","sanandresmetla","sanandresmixquic","sanandresnicolasbravo","sanandresocotepec","sanandresocotlan","sanandrespaxtlan","sanandrespayuca","sanandressanandreschichayotla","sanandressinaxtla","sanandressolaga","sanandrestenejapan","sanandresteotilalpam","sanandrestepetitlan","sanandrestimilpan","sanandrestlalamac","sanandrestuxtla","sanandresyaa","sanandresyahuitlalpan","sanandreszautla","sanandreszirondaro","sanangel","sanangelo","sananselmo","sanantoninocastillovelasco","sanantonio","sanantonioacahualco","sanantonioalpanocan","sanantonioarrazola","sanantonioatotonilco","sanantoniobonixi","sanantoniobuenavista","sanantoniobulujib","sanantoniocalichar","sanantoniocanada","sanantoniocardenas","sanantoniochiverias","sanantoniocoyahuacan","sanantoniodecorrales","sanantoniodefernandez","sanantoniodelacal","sanantoniodelalaguna","sanantoniodelasalazanas","sanantoniodelashuertas","sanantoniodelaspalmas","sanantoniodelcipres","sanantoniodelcoyote","sanantoniodelmonte","sanantoniodeloshorcones","sanantoniodelosmorales","sanantoniodelosrios","sanantoniodelostepetates","sanantoniodelosvazquez","sanantoniodelpuente","sanantoniodelrosario","sanantoniodepenuelas","sanantonioderivas","sanantonioderomerillo","sanantonioelchico","sanantonioelgrande","sanantonioelllanito","sanantonioelpaso","sanantonioelrico","sanantonioemenguaro","sanantonioenchisi","sanantoniogallardo","sanantonioguaracha","sanantonioheights","sanantoniohuitepec","sanantoniojuarez","sanantoniolaisla","sanantoniolalabor","sanantoniolaportilla","sanantoniolaspalmas","sanantoniomatlahuacales","sanantoniomihuacan","sanantoniomolinos","sanantonionixini","sanantonioocopetlatlan","sanantonioocotlan","sanantonioportezuelo","sanantonioprimero","sanantoniorayon","sanantoniosahcabchen","sanantoniosoledad","sanantoniosolis","sanantoniotariacuri","sanantoniotecolco","sanantoniotecomitl","sanantoniotedzidz","sanantoniotepetlapa","sanantoniotexas","sanantoniotlacamilco","sanantoniotlaltecahuacan","sanantoniotlatenco","sanantoniovillalongin","sanantoniovirreyes","sanantonioxahuento","sanantonioxoquitla","sanantoniozaragoza","sanata-lucia","sanatalucia","sanatenogeneslavillita","sanatoga","sanaugustine","sanb","sanbaltazaratlimeyaya","sanbaltazarchichicapam","sanbaltazarguelavila","sanbaltazarloxicha","sanbartolitotlaltelolco","sanbartolo","sanbartolocoyotespec","sanbartolocuautlalpan","sanbartolocuitareo","sanbartolodeberrios","sanbartolodelllano","sanbartolodelllanosanisidro","sanbartolodelprogreso","sanbartoloelviejo","sanbartololanzados","sanbartolome","sanbartolomeaguascalientes","sanbartolomeatlatlahuca","sanbartolomeayautla","sanbartolomecoatepec","sanbartolomecuahuixmatlac","sanbartolomehueyapan","sanbartolomeloxicha","sanbartolomequialana","sanbartolometenango","sanbartolometlaltelulco","sanbartolomexicomulco","sanbartolomorelos","sanbartolooxtotitlan","sanbartoloozocalpan","sanbartolotlaxihuicalco","sanbartolotutotepec","sanbartoloyautepec","sanbenito","sanbenitoencinal","sanbenitoxaltocan","sanbernabedelascanteras","sanbernabetemoxtitla","sanbernardino","sanbernardinodemilpillaschico","sanbernardinolagunas","sanbernardinotlaxcalancingo","sanbernardo","sanbernardomixtepec","sanbernardopenablanca","sanbernardotlalmimilolpan","sanblas","sanblasatempa","sanborn","sanbornton","sanbornville","sanbruno","sanbuenaventura","sanbuenaventuraatempan","sanbuenaventuratecaltzingo","sancaralampio","sancarlos","sancarlosautopan","sancarlospark","sancarlosyautepec","sancayetano","sanchez","sancirodeacosta","sanclemente","sanclementedelima","sancosmeatlamaxac","sancristobal","sancristobalamatlan","sancristobalamoltepec","sancristobalchacon","sancristobaldelabarranca","sancristobaldelascasas","sancristobalhidalgo","sancristobalhonduras","sancristoballachirioag","sancristoballosnava","sancristobalnexquipayac","sancristobalxochimilpa","sancristobalzapotitlan","sanctorum","sand-hill","sand-lake","sand-point","sand-springs","sandalfoot-cove","sandalfootcove","sandamiantexoloc","sanderson","sandersville","sandhill","sandia-heights","sandia-knolls","sandiaheights","sandiaknolls","sandiego","sandiegoalcala","sandiegocountryestates","sandiegodealcala","sandiegodealejandria","sandiegodelaunion","sandiegodelcerrito","sandiegoelorganal","sandiegohuehuecalco","sandiegolahuerta","sandiegolinares","sandimas","sandionisiodelmar","sandionisioocotepec","sandionisioocotlan","sandlake","sandoval","sandown","sandpoint","sands-point","sandspoint","sandsprings","sandston","sandstone","sandusky","sandwich","sandy","sandy-hills","sandy-hook","sandy-springs","sandy-valley","sandyhills","sandyhook","sandysprings","sandyvalley","sane","sanelias","sanelizario","sanesteban","sanestebanatatlahuca","sanestebandeabajo","sanestebansanmigueltateposco","sanestebantizatlan","sanfelipe","sanfelipeaztatan","sanfelipecihualtepec","sanfelipecoamango","sanfelipedehijar","sanfelipedejesus","sanfelipedelosherreros","sanfelipedelprogreso","sanfelipeelmirasol","sanfelipehidalgo","sanfelipejalapadediaz","sanfelipelosalzaticolonianueva","sanfelipeorizatlan","sanfelipeotlaltepec","sanfelipepueblo","sanfelipepueblonuevo","sanfelipequiriceo","sanfelipesantiago","sanfelipesultepec","sanfelipetejalapam","sanfelipeteotitlan","sanfelipetilpam","sanfelipetizapa","sanfelipetlalmimilolpan","sanfelipeusila","sanfelixhidalgo","sanfelixrijo","sanfernando","sanford","sanfrancisco","sanfranciscoacuautla","sanfranciscoatotonilco","sanfranciscoayotuzco","sanfranciscocajonos","sanfranciscochalchihuapan","sanfranciscochimalpa","sanfranciscochindua","sanfranciscocoatlan","sanfranciscocozoaltepec","sanfranciscocuapa","sanfranciscocuautlancingo","sanfranciscocuaxusco","sanfranciscocuayalab","sanfranciscocuexcontzi","sanfranciscodearriba","sanfranciscodeasis","sanfranciscodeborja","sanfranciscodeconchos","sanfranciscodeduran","sanfranciscodeguzman","sanfranciscodelapalma","sanfranciscodelmar","sanfranciscodelmarviejo","sanfranciscodelmezquital","sanfranciscodelosromo","sanfranciscodelrincon","sanfranciscoderivas","sanfranciscodetacuichamona","sanfranciscoelcalvito","sanfranciscogrande","sanfranciscohuehuetlan","sanfranciscoixhuatan","sanfranciscojacona","sanfranciscojaltepetongo","sanfranciscojavier","sanfranciscokoben","sanfranciscolachigolo","sanfranciscologueche","sanfranciscoloxicha","sanfranciscomagu","sanfranciscomataclara","sanfranciscomazapa","sanfranciscomihualtepec","sanfrancisconacaxtle","sanfrancisconuxano","sanfranciscoocotlan","sanfranciscooxtotilpan","sanfranciscooxtutla","sanfranciscoozolotepec","sanfranciscoozomatlan","sanfranciscoperiban","sanfranciscopujiltic","sanfranciscoputla","sanfranciscosola","sanfranciscosolis","sanfranciscotecoxpa","sanfranciscotelixtlahuaca","sanfranciscotemetzontla","sanfranciscotenopalco","sanfranciscotepeolulco","sanfranciscotepexoxica","sanfranciscotepeyecac","sanfranciscotetetla","sanfranciscotetlanohcan","sanfranciscotlacuilohcan","sanfranciscotlalcilalcalpan","sanfranciscotlaloc","sanfranciscotlaltica","sanfranciscotutla","sanfranciscoxochicuautla","sanfranciscozacacalco","sanfranciscozacapexpan","sangabriel","sangabrielazteca","sangabrielchilac","sangabrielixtla","sangabriellaspalmas","sangabrielmixtepec","sangabrieltetzoyocan","sangabrielysanignacio","sangabrielzepayautla","sangaree","sangaspar","sangaspartlahuelilpan","sangaspartonatico","sanger","sangerman","sangerville","sangregorio","sangregorioatzompa","sangregorioaztotoacan","sangregoriocuautzingo","sanhipolito","sanhipolitochimalpa","sanibel","sanignacio","sanignaciocerrogordo","sanignaciodehidalgo","sanignacioderiveraojodeagua","sanignaciodesanjoseparangueo","sanignacionopala","sanignacioriomuerto","sanikiluaq","sanildefonso","sanildefonsoamatlan","sanildefonsotultepec","sanildefonsovillaalta","sanisidro","sanisidroaltahuerta","sanisidroapango","sanisidroboxipe","sanisidrobuenavista","sanisidrobuensuceso","sanisidrodegamboa","sanisidrodelaconcepcion","sanisidrodelaestacada","sanisidrodelossauces","sanisidroelberro","sanisidroelreservado","sanisidrogallineroelgallinero","sanisidrohuilotepec","sanisidrolasbanderas","sanisidromazatepec","sanisidromiranda","sanisidromonjas","sanisidromonterrosas","sanisidropalotal","sanisidrovistahermosa","sanjacinto","sanjacintoamilpas","sanjavier","sanjeronimito","sanjeronimo","sanjeronimoacazulco","sanjeronimoalmoloya","sanjeronimoamanalco","sanjeronimoaxochitlan","sanjeronimobonchete","sanjeronimocoaltepec","sanjeronimocoatlan","sanjeronimocoyula","sanjeronimocuatrovientos","sanjeronimodearaceo","sanjeronimodejuarez","sanjeronimodelosjarros","sanjeronimoelgrande","sanjeronimoocotitla","sanjeronimopurenchecuaro","sanjeronimosilacayoapilla","sanjeronimososola","sanjeronimotaviche","sanjeronimotecoatl","sanjeronimotlacochahuaya","sanjeronimototoltepec","sanjeronimotulija","sanjeronimoxayacatlan","sanjeronimoyahuiche","sanjeronimozacualpan","sanjoaquin","sanjoaquincoapango","sanjoaquindelmonte","sanjoaquinhills","sanjoaquinzorrillos","sanjorgenuchita","sanjorgepueblonuevo","sanjorgetezoquipan","sanjose","sanjoseacateno","sanjoseatlan","sanjoseatoyatenco","sanjoseayuquila","sanjoseaztatla","sanjosebarbabosa","sanjoseboqui","sanjoseboxay","sanjosebuenavista","sanjosebuenavistaelgrande","sanjosecarpinteros","sanjosecasascaidas","sanjosechacalapa","sanjosechalmita","sanjosechapayal","sanjosechiapa","sanjosechiltepec","sanjosecomalco","sanjosecorralblanco","sanjosecuamantzingo","sanjosecuaro","sanjosecuyachapa","sanjosedeabajo","sanjosedeaguaazul","sanjosedeaura","sanjosedeayala","sanjosedebacum","sanjosedebernalejoelguayabo","sanjosedecastellanos","sanjosedecervera","sanjosededuranlostroncoso","sanjosedegracia","sanjosedeguanajuato","sanjosedeguaymas","sanjosedelaera","sanjosedelalaja","sanjosedelamontana","sanjosedelapaz","sanjosedelasflores","sanjosedelaspilas","sanjosedelcabo","sanjosedelcalicheelcaliche","sanjosedelcastillo","sanjosedelcerritodecamargo","sanjosedeljaguey","sanjosedellanos","sanjosedelosolvera","sanjosedelosreynoso","sanjosedelourdes","sanjosedelpotrero","sanjosedelprogreso","sanjosedelpuente","sanjosedelrinconcentro","sanjosedelrodeo","sanjosedelsitio","sanjosedeltapanco","sanjosedeltorreon","sanjosedeltunal","sanjosedelvalle","sanjosedemendoza","sanjosederaices","sanjosedetapia","sanjosedevinedo","sanjosedezaragoza","sanjoseelalto","sanjoseelcuartel","sanjoseelllanito","sanjoseelnuevo","sanjoseelsaladilloelsaladillo","sanjoseelvidrio","sanjoseestanciagrande","sanjoseguadalupeotzacatipan","sanjosehuipana","sanjoseindependencia","sanjoseitho","sanjoseiturbide","sanjoseixtapabarrioviejo","sanjoselachiguiri","sanjoselagarzona","sanjoselahacienda","sanjoselaschicharras","sanjoselaslomas","sanjoselaspalmas","sanjosemanzanitos","sanjosemezapaseccioni","sanjosemontechiquito","sanjoseneria","sanjoseocotillos","sanjoseozumba","sanjosepathe","sanjosepiedrasnegras","sanjosepoliutla","sanjoseriomanzo","sanjosesolis","sanjosesuchil","sanjoseteacalco","sanjosetejamanil","sanjosetemascatio","sanjosetenango","sanjosetenejapa","sanjoseteneriateneria","sanjosetepeyahualco","sanjosetepuzas","sanjosetetel","sanjosetilapa","sanjosetlacotitlan","sanjosetlacuitlapan","sanjosetoxi","sanjosetzal","sanjoseviborillas","sanjosevilladeallende","sanjosevillarreal","sanjosevistahermosa","sanjosexicohtencatl","sanjoseyashitinin","sanjoseyocnajab","sanjuan","sanjuanachichilco","sanjuanachiutla","sanjuanahuehueco","sanjuanahuehueyo","sanjuanamecac","sanjuanatenco","sanjuanatepec","sanjuanatezcapan","sanjuanatzingo","sanjuanatzompa","sanjuanbautista","sanjuanbautistacacalote","sanjuanbautistajayacatlan","sanjuanbautistalaraya","sanjuanbautistalodesoto","sanjuancabezadelrio","sanjuancacahuatepec","sanjuancancuc","sanjuancapistrano","sanjuanchilateca","sanjuancoajomulco","sanjuancoatzospam","sanjuancolon","sanjuancolorado","sanjuancosala","sanjuancoteejido","sanjuancotzocon","sanjuancoxtocan","sanjuancuauhtemoc","sanjuancuautla","sanjuandaxthi","sanjuandeabajo","sanjuandediosnaranjasdedios","sanjuandeguadalupe","sanjuandelashuertas","sanjuandelasmanzanas","sanjuandelavaqueria","sanjuandelavega","sanjuandelestado","sanjuandelllanito","sanjuandelosarcos","sanjuandeloscues","sanjuandelosjarros","sanjuandeloslagos","sanjuandelosplatanos","sanjuandelrio","sanjuandeotates","sanjuandesabinas","sanjuandevina","sanjuandiuxi","sanjuanepatlan","sanjuanevangelista","sanjuangrande","sanjuanguelavia","sanjuanguichicovi","sanjuanhuactzinco","sanjuanhueyapan","sanjuanhuiluco","sanjuanicosectoruno","sanjuanihualtepec","sanjuanito","sanjuanitodeescobedo","sanjuanitoitzicuaro","sanjuanixcaquixtla","sanjuanixtayopan","sanjuanjalpacentro","sanjuanjaltepec","sanjuanjaripeo","sanjuanjicayan","sanjuanjuquila","sanjuanjuquilavijanos","sanjuanlachao","sanjuanlachigalla","sanjuanlagunas","sanjuanlaisla","sanjuanmazatlan","sanjuanmetaltepec","sanjuanmixtepec","sanjuannumi","sanjuanozolotepec","sanjuanpancoac","sanjuanpandearriba","sanjuanpetlapa","sanjuanpueblonuevo","sanjuanquetzalcoapan","sanjuanquiahue","sanjuanquiotepec","sanjuanraboso","sanjuansautla","sanjuansayultepec","sanjuansecodevalencia","sanjuansolis","sanjuantabaa","sanjuantahitic","sanjuantecomatlan","sanjuantehuixtitlan","sanjuanteitipac","sanjuantejaluca","sanjuantepa","sanjuantepecoculco","sanjuantepulco","sanjuantetla","sanjuantexcalpan","sanjuantezongo","sanjuantilapa","sanjuantilcuautla","sanjuantlacotompatlacotompa","sanjuantomasquilloherradura","sanjuantotolapan","sanjuantotolcintla","sanjuantuxco","sanjuantuxtepec","sanjuanvolador","sanjuanxiutetelco","sanjuanxochiaca","sanjuanxoconusco","sanjuanyaee","sanjuanyatzona","sanjuanyautepec","sanjuanysanpedrotezompa","sanjuanzapotitlan","sanjuanzitlaltepec","sanjulian","sanjulio","sanleandro","sanleon","sanleonciojamaya","sanlorenzo","sanlorenzoachiotepec","sanlorenzoacopilco","sanlorenzoalbarradas","sanlorenzoaxocomanitla","sanlorenzocacaotepec","sanlorenzochiautzingo","sanlorenzocuauhtenco","sanlorenzocuaunecuiltitla","sanlorenzohuehuetitlan","sanlorenzoitzicuaro","sanlorenzojoyaderodriguez","sanlorenzomalacota","sanlorenzonenamicoyan","sanlorenzooyamel","sanlorenzoquerendaro","sanlorenzosayula","sanlorenzosoltepec","sanlorenzotenochtitlan","sanlorenzotlacotepec","sanlorenzotlacoyucan","sanlorenzotlalmimilolpan","sanlorenzotlaxipehuala","sanlorenzotoxico","sanlorenzovistahermosa","sanlorenzoxaltelulco","sanlucas","sanlucasamalinalco","sanlucasatzala","sanlucascamotlan","sanlucasdelpulque","sanlucaselgrande","sanlucaselviejo","sanlucasevangelista","sanlucashuitzilhuacan","sanlucasocotepec","sanlucasojitlan","sanlucaspio","sanlucasquiavini","sanlucastecopilco","sanlucastexcaltitlan","sanlucastlacochcalco","sanlucastotolmaloya","sanlucaszoquiapam","sanluis","sanluisacatlan","sanluisajajalpan","sanluisamatlan","sanluisanahuactoriles","sanluisapizaquito","sanluisayucan","sanluisboro","sanluiscoyotzingo","sanluisdeaguacaliente","sanluisdelaloma","sanluisdelapaz","sanluisdelcordero","sanluisdeletras","sanluisdelozada","sanluisobispo","sanluispotosi","sanluisriocolorado","sanluissanpedro","sanluissoyatlan","sanluistaxhimay","sanluistecuhautitlan","sanluistehuiloyocan","sanluqueno","sanmanuel","sanmarcialozolotepec","sanmarcos","sanmarcosarteaga","sanmarcosatesquilapan","sanmarcoscontla","sanmarcosdelacruz","sanmarcosdelaloma","sanmarcosdeleon","sanmarcoseloxochitlan","sanmarcosguaquilpan","sanmarcoshuixtoco","sanmarcosnepantla","sanmarcostecomaxusco","sanmarcostlacoyalco","sanmarcostlazalpan","sanmarcosyachihuacaltepec","sanmarcoszacatepec","sanmarino","sanmartin","sanmartinahuatepec","sanmartinazcatepec","sanmartincachihuapan","sanmartincaltenco","sanmartinchalchicuautla","sanmartincoapaxtongo","sanmartincuautlalpan","sanmartindebolanos","sanmartindelaspiramides","sanmartindeloscanseco","sanmartindezula","sanmartinejido","sanmartinesperilla","sanmartinflorida","sanmartinhidalgo","sanmartinitunyoso","sanmartinlachila","sanmartinmazateopan","sanmartinojodeagua","sanmartinpachiviapachivia","sanmartintexmelucandelabastida","sanmartintilcajete","sanmartintlamapa","sanmartintlapala","sanmartintoltepec","sanmartintotolan","sanmartintuchicuitlapilco","sanmateo","sanmateoalmomoloha","sanmateoatarasquillo","sanmateoatenco","sanmateoayecac","sanmateocajonos","sanmateocapulhuac","sanmateocapultitlan","sanmateocoapexco","sanmateodelmar","sanmateoelviejo","sanmateoetlatongo","sanmateohuitzilzingo","sanmateoixtacalco","sanmateoixtlahuaca","sanmateomozoquilpan","sanmateonejapam","sanmateootzacatipan","sanmateoozolco","sanmateoparra","sanmateopinas","sanmateosoltepec","sanmateotecalco","sanmateotexcalyacac","sanmateotlalchichilpan","sanmateoxoloc","sanmateoyoloxochitlan","sanmatiasatzala","sanmatiascuijingo","sanmatiastepetomatitlan","sanmatiastlalancaleca","sanmelchorbetaza","sanmiguel","sanmiguelabejones","sanmiguelachiutla","sanmiguelaguabendita","sanmiguelaguacomulican","sanmiguelajusco","sanmiguelalmaya","sanmiguelalmoloyan","sanmiguelaloapam","sanmiguelamazcala","sanmiguelameyalco","sanmiguelanalco","sanmiguelatepoxco","sanmiguelatlamajac","sanmiguelatlapulco","sanmiguelaxoxuca","sanmiguelbalderas","sanmiguelcanoa","sanmiguelcerezoelcerezo","sanmiguelchimalapa","sanmiguelcoatlan","sanmiguelcoatlinchan","sanmiguelcontla","sanmiguelcuyutlan","sanmigueldeallende","sanmigueldecruces","sanmigueldehorcasitas","sanmigueldelapaz","sanmigueldelarenal","sanmigueldelaspalmas","sanmigueldelavictoria","sanmigueldelcentro","sanmigueldelmilagro","sanmigueldelprogreso","sanmigueldelpuerto","sanmigueldelvalle","sanmiguelejutla","sanmiguelelalto","sanmiguelelgrande","sanmiguelelgrandevillajuarez","sanmiguelemenguaro","sanmiguelenyege","sanmiguelepejan","sanmiguelespejo","sanmiguelfigueroa","sanmiguelhila","sanmiguelhuautla","sanmiguelito","sanmiguelixitlan","sanmiguelixtapan","sanmigueljaltocan","sanmiguelladeras","sanmiguellasardina","sanmiguelmecatepec","sanmiguelmimlapan","sanmiguelmixtepec","sanmiguelmonteverde","sanmiguelocotenco","sanmigueloctopan","sanmigueloxtotilpan","sanmiguelpanixtlahuaca","sanmiguelpapaxtla","sanmiguelperas","sanmiguelquetzaltepec","sanmiguelsuchixtepec","sanmigueltecomatlan","sanmigueltecpan","sanmigueltecuiciapan","sanmigueltecuitlapa","sanmigueltenango","sanmigueltenextatiloyan","sanmigueltenochtitlan","sanmigueltetepelcingo","sanmigueltianguistenco","sanmigueltianguizolco","sanmigueltilquiapam","sanmigueltlacamama","sanmigueltlacotepec","sanmigueltlaixpan","sanmigueltlalpoalan","sanmigueltlamahuco","sanmigueltopilejo","sanmigueltotocuitlapilco","sanmigueltotolapan","sanmigueltotoltepec","sanmiguelvindho","sanmiguelxochitecatitla","sanmiguelxoltepec","sanmiguelxoxtla","sanmiguelyuxtepec","sanmiguelzapotitlan","sanmiguelzoapan","sannicolas","sannicolasamealco","sannicolasbuenosaires","sannicolasdelacondesa","sannicolasdelatorre","sannicolasdelcarmen","sannicolasdelosagustinos","sannicolasdelosgarza","sannicolasdelosranchos","sannicolaselchico","sannicolaseloro","sannicolasguadalupe","sannicolasobispo","sannicolasperalta","sannicolasquialana","sannicolassolis","sannicolastecomatlan","sannicolastemascatio","sannicolastlazala","sannicolastolentino","sannicolaszecalacoayan","sannicolaszoyapetlayoca","sanpablito","sanpablo","sanpabloahuatempa","sanpabloanicano","sanpabloatlazalpan","sanpabloatotonilco","sanpabloatzompa","sanpabloautopan","sanpablocoatlan","sanpablocuatrovenados","sanpablodelassalinas","sanpablodelastunas","sanpablodelosgallos","sanpablodelosremedios","sanpabloelgrande","sanpabloetla","sanpabloguila","sanpablohuacano","sanpablohuantepec","sanpablohuitzo","sanpablohuixtepec","sanpabloixayoc","sanpabloixquitlan","sanpablomacuiltianguis","sanpablooztotepec","sanpablopejo","sanpablopixtun","sanpablotecalco","sanpablotejalpa","sanpablovillademitla","sanpasqual","sanpatricio","sanpedro","sanpedroabajo","sanpedroamuzgos","sanpedroapatlaco","sanpedroapostol","sanpedroarriba","sanpedroarriba3raseccion","sanpedroatlapulco","sanpedroatmatla","sanpedroatocpan","sanpedroatoyac","sanpedrobenitojuarez","sanpedrobuenavista","sanpedrocacahuatepec","sanpedrochiautzingo","sanpedrochimay","sanpedrochochula","sanpedrocholula","sanpedrocomitancillo","sanpedrocoxcaltepeccantaros","sanpedrocoyutla","sanpedrocuayuca","sanpedrocuitlapan","sanpedrodeibarra","sanpedrodelacueva","sanpedrodelgallo","sanpedrodelosbanos","sanpedrodelosmetates","sanpedrodelosnaranjos","sanpedrodelossauces","sanpedrodelrincon","sanpedrodelrosal","sanpedrodenxhicentro","sanpedroecatepec","sanpedroelalto","sanpedrogarzagarcia","sanpedroguasave","sanpedrohuamelula","sanpedrohuaquilpan","sanpedrohuilotepec","sanpedrohuitzizilapan","sanpedroitzican","sanpedroitztla","sanpedroixcatlan","sanpedroixtlahuaca","sanpedrojacuaro","sanpedrojicayan","sanpedrojuchaltengo","sanpedrolagunillas","sanpedrolajoya","sanpedrolasplayas","sanpedrolimon","sanpedrolosbanos","sanpedromartir","sanpedromartirquiechapa","sanpedromartiryucuxaco","sanpedromatamoros","sanpedromixtepec","sanpedromunoztla","sanpedronexapa","sanpedronichtalucum","sanpedronuevo","sanpedroocopetatillo","sanpedroocotepec","sanpedroozumacin","sanpedropetlacotla","sanpedropiedragorda","sanpedropochutla","sanpedroquiatoni","sanpedrosochiapam","sanpedrotapanatepec","sanpedrotarimbaro","sanpedrotaviche","sanpedrotechuchulco","sanpedrotejalpa","sanpedrotemamatla","sanpedrotenango","sanpedrotenayac","sanpedrotepetitlan","sanpedrotesistan","sanpedrotetitlan","sanpedrotidaa","sanpedrotlachichilco","sanpedrotlacotepec","sanpedrotlaltizapan","sanpedrotlanixco","sanpedrotlaolantongo","sanpedrotlapacoyan","sanpedrotlaquilpan","sanpedrotopiltepec","sanpedrototolapam","sanpedrototoltepec","sanpedrotulixtlahuaca","sanpedrotultepec","sanpedroxalcaltzinco","sanpedroxalpa","sanpedroxochiteotla","sanpedroyancuitlalpan","sanpedroyolox","sanpedroysanpablotequistepec","sanpedrozacachimalpa","sanpedrozictepec","sanquintin","sanrafael","sanrafaelcaleria","sanrafaelixtapalucan","sanrafaelrioseco","sanrafaeltecario","sanrafaeltenanyecac","sanrafaeltepatlaxco","sanrafaeltlanalapan","sanrafaelzaragoza","sanramon","sanraymundojalpam","sanroque","sanroquedemontes","sanroquedetorres","sans-souci","sansaba","sansalvador","sansalvadoratenco","sansalvadorcuauhtenco","sansalvadorelseco","sansalvadorelverde","sansalvadornaranjillo","sansalvadortizatlalli","sansalvadortorrecillas","sansebastian","sansebastianabasolo","sansebastianalcomunga","sansebastianbuenosaires","sansebastianchimalpa","sansebastiancoatlan","sansebastiandeaparicio","sansebastiandelasbarrancassur","sansebastiandelmonte","sansebastiandeloeste","sansebastiandelsur","sansebastiandesalitre","sansebastianelgrande","sansebastianetla","sansebastianfraccionamiento","sansebastiannicananduta","sansebastianriohondo","sansebastianteitipac","sansebastiantenochtitlan","sansebastianteteles","sansebastiantutla","sansebastianxolalpa","sansimeonxipetzingo","sansimon","sansimonalmolongas","sansimonatzitzintla","sansimondeguerrero","sansimondelalaguna","sansimonelalto","sansimonito","sansimontlatlahuquitepec","sansom-park","sansompark","sanssouci","santa-adelaida","santa-ana","santa-ana-acozautla","santa-ana-ahuehuepan","santa-ana-amatlan","santa-ana-azcapotzaltongo","santa-ana-batha","santa-ana-chapitiro","santa-ana-chiautempan","santa-ana-coapan","santa-ana-coatepec","santa-ana-de-allende","santa-ana-del-pilar","santa-ana-del-valle","santa-ana-hueytlalpan","santa-ana-jilotzingo","santa-ana-la-ladera","santa-ana-maya","santa-ana-mayorazgo","santa-ana-necoxtla","santa-ana-nextlalpan","santa-ana-nichi-ejido","santa-ana-nopalucan","santa-ana-pacueco","santa-ana-tlachiahualpa","santa-ana-tlacotenco","santa-ana-tlapacoyan","santa-ana-tzacuala","santa-ana-xalmimilulco","santa-ana-zegache","santa-ana-zicatecoyan","santa-ana-zirosto","santa-anita","santa-anita-huiloac","santa-anna","santa-apolonia","santa-apolonia-teacalco","santa-barbara","santa-barbara-de-la-cueva","santa-casilda","santa-catalina","santa-catalina-quieri","santa-catarina","santa-catarina-ayometla","santa-catarina-ayotzingo","santa-catarina-cuixtla","santa-catarina-de-tepehuanes","santa-catarina-del-monte","santa-catarina-juquila","santa-catarina-loxicha","santa-catarina-mechoacan","santa-catarina-minas","santa-catarina-otzolotepec","santa-catarina-quiane","santa-catarina-roatina","santa-catarina-tayata","santa-catarina-tlaltempan","santa-catarina-villanueva","santa-catarina-yecahuizotl","santa-cecilia-jalieza","santa-cecilia-tepetitlan","santa-clara","santa-clara-de-juarez","santa-clara-de-valladares","santa-clara-del-cobre","santa-clara-del-tule","santa-clara-huitziltepec","santa-clara-pueblo","santa-clarita","santa-claus","santa-cruz","santa-cruz-acapa","santa-cruz-acatepec","santa-cruz-ajajalpan","santa-cruz-amilpas","santa-cruz-aquiahuac","santa-cruz-atizapan","santa-cruz-ayotuxco","santa-cruz-bombatevi","santa-cruz-cuauhtenco","santa-cruz-cuautomatitla","santa-cruz-de-barcenas","santa-cruz-de-bravo","santa-cruz-de-juarez","santa-cruz-de-la-soledad","santa-cruz-de-las-flores","santa-cruz-del-astillero","santa-cruz-del-monte","santa-cruz-del-valle","santa-cruz-el-grande","santa-cruz-el-porvenir","santa-cruz-escandon","santa-cruz-ex-hacienda","santa-cruz-huitziltepec","santa-cruz-huitzizilapan","santa-cruz-lachixolana","santa-cruz-lujan","santa-cruz-mextepec","santa-cruz-mixtepec","santa-cruz-nundaco","santa-cruz-otlatla","santa-cruz-ozolotepec","santa-cruz-papalutla","santa-cruz-pocitos","santa-cruz-pueblo","santa-cruz-pueblo-nuevo","santa-cruz-quilehtla","santa-cruz-tacache-de-mina","santa-cruz-tayata","santa-cruz-tetela","santa-cruz-texmalaquilla","santa-cruz-tlaxcala","santa-cruz-xaltetela","santa-cruz-xitla","santa-cruz-xoxocotlan","santa-cruz-yucucani","santa-elena","santa-elena-paliseca","santa-fe","santa-fe-de-la-purisima","santa-fe-springs","santa-fe-tepetlapa","santa-fe-y-la-mar","santa-gertrudis","santa-gertrudis-miramar","santa-ines-del-monte","santa-ines-varela-la-luz","santa-ines-yatzeche","santa-isabel","santa-isabel-chalma","santa-isabel-cholula","santa-isabel-fraccionamiento","santa-isabel-ixtapan","santa-isabel-xiloxoxtla","santa-juana","santa-juana-centro","santa-juana-primera-seccion","santa-justina-ecatepec","santa-lucia","santa-lucia-cosamaloapan","santa-lucia-ocotlan","santa-lucia-potrerillo","santa-lucia-teotepec","santa-margarita","santa-margarita-huitepec","santa-maria","santa-maria-acatepec","santa-maria-actipac","santa-maria-acu","santa-maria-ajoloapan","santa-maria-amajac","santa-maria-amealco","santa-maria-apaxco","santa-maria-apazco","santa-maria-asuncion","santa-maria-atexcac","santa-maria-atlihuetzian","santa-maria-atzompa","santa-maria-batha","santa-maria-begona","santa-maria-camotlan","santa-maria-canchesda","santa-maria-chachoapam","santa-maria-chicometepec","santa-maria-chilapa-de-diaz","santa-maria-chimalapa","santa-maria-chimalhuacan","santa-maria-citendeje","santa-maria-coatepec","santa-maria-colotepec","santa-maria-cortijo","santa-maria-coyotepec","santa-maria-cuevas","santa-maria-de-enmedio","santa-maria-de-guadalupe","santa-maria-de-guaymas","santa-maria-de-la-paz","santa-maria-de-los-angeles","santa-maria-del-buaraje","santa-maria-del-llano","santa-maria-del-monte","santa-maria-del-oro","santa-maria-del-refugio","santa-maria-del-rio","santa-maria-del-rosario","santa-maria-del-tule","santa-maria-del-valle","santa-maria-ecatepec","santa-maria-endare","santa-maria-guadalupe-tecola","santa-maria-guelace","santa-maria-guenagati","santa-maria-huamelula","santa-maria-huatulco","santa-maria-huazolotitlan","santa-maria-huecatitla","santa-maria-huexoculco","santa-maria-ilucan","santa-maria-ixtiyucan","santa-maria-ixtulco","santa-maria-jacatepec","santa-maria-jajalpa","santa-maria-jalapa-del-marques","santa-maria-jicaltepec","santa-maria-la-alta","santa-maria-la-asuncion","santa-maria-la-calera","santa-maria-lachixio","santa-maria-macua","santa-maria-magdalena","santa-maria-magdalena-cahuacan","santa-maria-malacatepec","santa-maria-mazatla","santa-maria-mixtequilla","santa-maria-nativitas","santa-maria-nduayaco","santa-maria-nenetzintla","santa-maria-nepopualco","santa-maria-palapa","santa-maria-papalo","santa-maria-puxmetacan","santa-maria-quelites","santa-maria-quiegolani","santa-maria-rayon","santa-maria-sola","santa-maria-tatetla","santa-maria-tecuanulco","santa-maria-temaxcalapa","santa-maria-teopoxco","santa-maria-tepantlali","santa-maria-texmelucan","santa-maria-tiltepec","santa-maria-tlalmimilolpan","santa-maria-tonameca","santa-maria-totoltepec","santa-maria-transpontina","santa-maria-urapicho","santa-maria-velato","santa-maria-xadani","santa-maria-xigui","santa-maria-xonacatepec","santa-maria-yavesia","santa-maria-yucuhiti","santa-maria-yucunicoco","santa-maria-zacatepec","santa-maria-zapotitlan","santa-maria-zolotepec","santa-maria-zoquitlan","santa-martha","santa-martha-chichihualtepec","santa-martha-hidalgo","santa-matilde","santa-monica","santa-paula","santa-rita","santa-rita-tlahuapan","santa-rosa","santa-rosa-abata","santa-rosa-beach","santa-rosa-caxtlahuaca","santa-rosa-de-lima","santa-rosa-de-rivas","santa-rosa-el-huizache","santa-rosa-jauregui","santa-rosa-loma-larga","santa-rosa-los-angeles","santa-rosa-santa-barbara","santa-rosa-segundo","santa-rosa-treinta","santa-rosa-xajay","santa-rosalia","santa-susana","santa-teresa","santa-teresita-de-don-diego","santa-ursula","santa-venetia","santa-ynez","santaadelaida","santaana","santaanaacozautla","santaanaahuehuepan","santaanaamatlan","santaanaazcapotzaltongo","santaanabatha","santaanachapitiro","santaanachiautempan","santaanacoapan","santaanacoatepec","santaanadeallende","santaanadeguerreroelcascabel","santaanadelpilar","santaanadelvalle","santaanahueytlalpan","santaanaixtlahuatzingosantaana","santaanajilotzingo","santaanalaladera","santaanamaya","santaanamayorazgo","santaananecoxtla","santaananextlalpan","santaananichiejido","santaananopalucan","santaanapacueco","santaanatlachiahualpa","santaanatlacotenco","santaanatlapacoyan","santaanatzacuala","santaanaxalmimilulco","santaanazegache","santaanazicatecoyan","santaanazirosto","santaanita","santaanitahuiloac","santaanna","santaapolonia","santaapoloniateacalco","santabarbara","santabarbaradelacueva","santacasilda","santacatalina","santacatalinaquieri","santacatarina","santacatarinaayometla","santacatarinaayotzingo","santacatarinacuixtla","santacatarinadelmonte","santacatarinadetepehuanes","santacatarinajuquila","santacatarinaloxicha","santacatarinamechoacan","santacatarinaminas","santacatarinaotzolotepec","santacatarinaquiane","santacatarinaroatina","santacatarinatayata","santacatarinatlaltempan","santacatarinavillanueva","santacatarinayecahuizotl","santaceciliajalieza","santaceciliatepetitlan","santaclara","santaclaradejuarez","santaclaradelcobre","santaclaradeltule","santaclaradevalladares","santaclarahuitziltepec","santaclarapueblo","santaclarita","santaclaus","santacruz","santacruzacapa","santacruzacatepec","santacruzajajalpan","santacruzamilpas","santacruzaquiahuac","santacruzatizapan","santacruzayotuxco","santacruzbombatevi","santacruzcuauhtenco","santacruzcuautomatitla","santacruzdebarcenas","santacruzdebravo","santacruzdejuarez","santacruzdelalomatepetates","santacruzdelasflores","santacruzdelasoledad","santacruzdelastillero","santacruzdelmonte","santacruzdelvalle","santacruzelgrande","santacruzelporvenir","santacruzescandon","santacruzexhacienda","santacruzhuitziltepec","santacruzhuitzizilapan","santacruzlachixolana","santacruzlujan","santacruzmextepec","santacruzmixtepec","santacruznundaco","santacruzotlatla","santacruzozolotepec","santacruzpapalutla","santacruzpocitos","santacruzpueblo","santacruzpueblonuevo","santacruzquilehtla","santacruztacachedemina","santacruztayata","santacruztetela","santacruztexmalaquilla","santacruztlaxcala","santacruzxaltetela","santacruzxitla","santacruzxoxocotlan","santacruzyucucani","santadeo","santaelena","santaelenapaliseca","santafe","santafedelapurisima","santafesprings","santafetepetlapa","santafeylamar","santagertrudis","santagertrudismiramar","santainesdelmonte","santainesvarelalaluz","santainesyatzeche","santaisabel","santaisabelchalma","santaisabelcholula","santaisabelfraccionamiento","santaisabelixtapan","santaisabelxiloxoxtla","santajuana","santajuanacentro","santajuanaprimeraseccion","santajustinaecatepec","santalucia","santaluciacosamaloapan","santaluciaocotlan","santaluciapotrerillo","santaluciateotepec","santamargarita","santamargaritahuitepec","santamaria","santamariaacatepec","santamariaactipac","santamariaacu","santamariaajoloapan","santamariaamajac","santamariaamealco","santamariaapaxco","santamariaapazco","santamariaaranzazusantamaria","santamariaasuncion","santamariaatexcac","santamariaatlihuetzian","santamariaatzompa","santamariabatha","santamariabegona","santamariacamotlan","santamariacanchesda","santamariachachoapam","santamariachicometepec","santamariachilapadediaz","santamariachimalapa","santamariachimalhuacan","santamariacitendeje","santamariacoatepec","santamariacolotepec","santamariacortijo","santamariacoyotepec","santamariacuevas","santamariadeenmedio","santamariadeguadalupe","santamariadeguaymas","santamariadelapaz","santamariadelbuaraje","santamariadelllano","santamariadelmonte","santamariadeloro","santamariadelosangeles","santamariadelrefugio","santamariadelrio","santamariadelrosario","santamariadeltule","santamariadelvalle","santamariaecatepec","santamariaendare","santamariaguadalupetecola","santamariaguelace","santamariaguenagati","santamariahuamelula","santamariahuatulco","santamariahuazolotitlan","santamariahuecatitla","santamariahuexoculco","santamariailucan","santamariaixtiyucan","santamariaixtulco","santamariajacatepec","santamariajajalpa","santamariajalapadelmarques","santamariajicaltepec","santamarialaalta","santamarialaasuncion","santamarialacalera","santamarialachixio","santamariamacua","santamariamagdalena","santamariamagdalenacahuacan","santamariamagdalenaocotitlan","santamariamalacatepec","santamariamazatla","santamariamixtequilla","santamarianativitas","santamarianduayaco","santamarianenetzintla","santamarianepopualco","santamariapalapa","santamariapapalo","santamariapuxmetacan","santamariaquelites","santamariaquiegolani","santamariarayon","santamariasola","santamariatatetla","santamariatecuanulco","santamariatemaxcalapa","santamariateopoxco","santamariatepantlali","santamariatexmelucan","santamariatiltepec","santamariatlalmimilolpan","santamariatonameca","santamariatotoltepec","santamariatranspontina","santamariaurapicho","santamariavelato","santamariaxadani","santamariaxigui","santamariaxonacatepec","santamariayavesia","santamariayucuhiti","santamariayucunicoco","santamariazacatepec","santamariazapotitlan","santamariazolotepec","santamariazoquitlan","santamartha","santamarthachichihualtepec","santamarthahidalgo","santamatilde","santamonica","santana-2da-seccion-b-la-palma","santana2daseccionblapalma","santander-jimenez","santanderjimenez","santanvalley","santapaula","santaquin","santarita","santaritatlahuapan","santarosa","santarosaabata","santarosabeach","santarosacaxtlahuaca","santarosadelima","santarosaderivas","santarosaelhuizache","santarosajauregui","santarosalia","santarosalomalarga","santarosalosangeles","santarosasantabarbara","santarosasegundo","santarosatreinta","santarosaxajay","santasusana","santateresa","santateresitadedondiego","santaursula","santavenetia","santaynez","santee","santiago","santiago-acatlan","santiago-acayutlan","santiago-acozac","santiago-acutzilapan","santiago-alseseca","santiago-amoltepec","santiago-analco","santiago-apostol","santiago-astata","santiago-atzitzihuacan","santiago-ayuquililla","santiago-azajo","santiago-bayacora","santiago-cacaloxtepec","santiago-camotlan","santiago-capitiro","santiago-casandeje","santiago-centro","santiago-chazumba","santiago-chilixtlahuaca","santiago-chimalpa-chimalpa","santiago-choapam","santiago-coachochitlan","santiago-coltzingo","santiago-comaltepec","santiago-cuaula","santiago-cuautenco","santiago-cuautlalpan","santiago-cuixtla","santiago-de-anaya","santiago-de-cuenda","santiago-de-la-pena","santiago-de-pochotitan","santiago-de-queretaro","santiago-del-monte","santiago-el-pinar","santiago-etla","santiago-huajolotitlan","santiago-huauclilla","santiago-huaxolotipac","santiago-huitlapaltepec","santiago-ixcuintepec","santiago-ixcuintla","santiago-ixtaltepec","santiago-ixtayutla","santiago-jaltepec","santiago-jicayan","santiago-jocotepec","santiago-juxtlahuaca","santiago-lachiguiri","santiago-lalopa","santiago-laollaga","santiago-laxopa","santiago-llano-grande","santiago-malacatepec","santiago-mamalhuazuca","santiago-maravatio","santiago-matatlan","santiago-michac","santiago-miltepec","santiago-momoxpan","santiago-nejapilla","santiago-nundiche","santiago-nuyoo","santiago-oxtempan","santiago-oxthoc","santiago-oxtotitlan","santiago-papasquiaro","santiago-pojcol","santiago-puriatzicuaro","santiago-quiavicuzas","santiago-suchilquitongo","santiago-tangamandapio","santiago-tejocotillos","santiago-tenango","santiago-tepatlaxco","santiago-tepeticpac","santiago-tepetitlan","santiago-tepextla","santiago-tepeyahualco","santiago-tepopula","santiago-tetepec","santiago-texcalcingo","santiago-textitlan","santiago-teyahualco","santiago-tezontlale","santiago-tilantongo","santiago-tilapa","santiago-tillo","santiago-tlacochcalco","santiago-tlacotepec","santiago-tlaltepoxco","santiago-tlapacoya","santiago-tlapanaloya","santiago-tlautla","santiago-tolman","santiago-tulantepec","santiago-tuxtla","santiago-undameo","santiago-xanica","santiago-yaitepec","santiago-yancuictlalpan","santiago-yancuitlalpan","santiago-yeche","santiago-yogana","santiago-yolomecatl","santiago-yosondua","santiago-zacualuca","santiago-zoochila","santiagoacatlan","santiagoacayutlan","santiagoacozac","santiagoacutzilapan","santiagoalseseca","santiagoamoltepec","santiagoanalco","santiagoapostol","santiagoastata","santiagoatzitzihuacan","santiagoayuquililla","santiagoazajo","santiagobayacora","santiagocacaloxtepec","santiagocamotlan","santiagocapitiro","santiagocasandeje","santiagocentro","santiagochazumba","santiagochilixtlahuaca","santiagochimalpachimalpa","santiagochoapam","santiagocoachochitlan","santiagocoltzingo","santiagocomaltepec","santiagocuaula","santiagocuautenco","santiagocuautlalpan","santiagocuixtla","santiagodeanaya","santiagodecuenda","santiagodelapena","santiagodelmonte","santiagodepochotitan","santiagodequeretaro","santiagoelpinar","santiagoetla","santiagohuajolotitlan","santiagohuauclilla","santiagohuaxolotipac","santiagohuitlapaltepec","santiagoixcuintepec","santiagoixcuintla","santiagoixtaltepec","santiagoixtayutla","santiagojaltepec","santiagojicayan","santiagojocotepec","santiagojuxtlahuaca","santiagolachiguiri","santiagolalopa","santiagolaollaga","santiagolaxopa","santiagollanogrande","santiagomalacatepec","santiagomamalhuazuca","santiagomaravatio","santiagomatatlan","santiagomexquititlanbarrio4to","santiagomichac","santiagomiltepec","santiagomomoxpan","santiagonejapilla","santiagonundiche","santiagonuyoo","santiagooxtempan","santiagooxthoc","santiagooxtotitlan","santiagopapasquiaro","santiagopojcol","santiagopuriatzicuaro","santiagoquiavicuzas","santiagosuchilquitongo","santiagotangamandapio","santiagotejocotillos","santiagotenango","santiagotepatlaxco","santiagotepeticpac","santiagotepetitlan","santiagotepextla","santiagotepeyahualco","santiagotepopula","santiagotetepec","santiagotexcalcingo","santiagotextitlan","santiagoteyahualco","santiagotezontlale","santiagotianguistencodegaleana","santiagotilantongo","santiagotilapa","santiagotillo","santiagotlacochcalco","santiagotlacotepec","santiagotlaltepoxco","santiagotlapacoya","santiagotlapanaloya","santiagotlautla","santiagotolman","santiagotulantepec","santiagotuxtla","santiagoundameo","santiagoxanica","santiagoyaitepec","santiagoyancuictlalpan","santiagoyancuitlalpan","santiagoyeche","santiagoyogana","santiagoyolomecatl","santiagoyosondua","santiagozacualuca","santiagozoochila","santiaguillo","santiaguito","santiaguito-tlalcilalcalli","santiaguitotlalcilalcalli","santillan","santo-domingo","santo-domingo-armenta","santo-domingo-atoyatempan","santo-domingo-aztacameca","santo-domingo-chihuitan","santo-domingo-de-guzman","santo-domingo-de-las-palmas","santo-domingo-de-morelos","santo-domingo-huehuetlan","santo-domingo-jalieza","santo-domingo-keste","santo-domingo-ocotitlan","santo-domingo-ozolotepec","santo-domingo-petapa","santo-domingo-pueblo","santo-domingo-roayaga","santo-domingo-shomege-shomege","santo-domingo-tehuantepec","santo-domingo-tepuxtepec","santo-domingo-tlatayapam","santo-domingo-tomaltepec","santo-domingo-tonala","santo-domingo-yanhuitlan","santo-domingo-yodohino","santo-domingo-zanatepec","santo-nino-aguanaval","santo-nombre","santo-tomas","santo-tomas-chiconautla","santo-tomas-de-los-platanos","santo-tomas-huatzindeo","santo-tomas-jalieza","santo-tomas-la-concordia","santo-tomas-tamazulapam","santodomingo","santodomingoarmenta","santodomingoatoyatempan","santodomingoaztacameca","santodomingochihuitan","santodomingodeguzman","santodomingodelaspalmas","santodomingodemorelos","santodomingohuehuetlan","santodomingojalieza","santodomingokeste","santodomingoocotitlan","santodomingoozolotepec","santodomingopetapa","santodomingopueblo","santodomingoroayaga","santodomingoshomegeshomege","santodomingotehuantepec","santodomingotepuxtepec","santodomingotlatayapam","santodomingotomaltepec","santodomingotonala","santodomingoyanhuitlan","santodomingoyodohino","santodomingozanatepec","santoninoaguanaval","santonombre","santos-reyes-nopala","santos-reyes-papalo","santos-reyes-tepejillo","santosreyesnopala","santosreyespapalo","santosreyestepejillo","santotomas","santotomaschiconautla","santotomasdelosplatanos","santotomashuatzindeo","santotomasjalieza","santotomaslaconcordia","santotomastamazulapam","sanvicente","sanvicenteboqueron","sanvicentechimalhuacan","sanvicentecoatlan","sanvicentecoyotepec","sanvicentedeflores","sanvicentedejuarez","sanvicenteelalto","sanvicenteferrer","sanvicentelachixio","sanvicentelamesilla","sanvicentenunu","sanvicentepalapa","sanvicentepinas","sanvicentetancuayalab","sanvicentezoyatlan","sanysidro","sao","sap","sapioris","sappington","sapulpa","sar","sarabia","saraland","saranac","saranac-lake","saranaclake","saranap","sarasota","sarasota-springs","sarasotasprings","saratoga","saratoga-springs","saratogasprings","sarcoxie","sardis","sardis-city","sardiscity","sargentolopez2daseccionelchuzo","saric","sarita","sarnia","sartell","sas","sasaltitla","saskatchewan","saskatoon","sat","satanta","satellite-beach","satellitebeach","saticoy","satsuma","sauceda-de-la-borda","saucedadelaborda","saucier","saucillo","saugerties","saugerties-south","saugertiessouth","saugus","sauk-centre","sauk-city","sauk-rapids","sauk-village","saukcentre","saukcity","saukrapids","saukvillage","saukville","sault-ste-marie","saultstemarie","sausalito","sauta","sauz-de-calera","sauzdecalera","sav","savage","savanna","savannah","savin-hill","savinhill","savoy","saw","saw-creek","sawcreek","sawgrass","sawmills","sawtelle","sawyerwood","sax","saxapahaw","saxon","saxonburg","say","saybrook-manor","saybrookmanor","saylorsburg","saylorville","sayre","sayreville","sayreville-junction","sayrevillejunction","sayula","sayula-de-aleman","sayuladealeman","sayulilla","sayulita","sayville","saz","sb","sba","sbac","sbb","sbc","sbdb","sbdg","sbdl","sbdm","sbdp","sbe","sbev","sbg","sbh","sbl","sblg","sbm","sbo","sbpb","sbq","sbs","sbsr","sbt","sbx","sby","sc","sca","scaggsville","scandia","scappoose","scarborough","scarborough-village","scarboroughvillage","scarsdale","scb","scc","sccp","scda","scdb","scdc","scdj","scdl","scdm","scdt","scdv","scdw","sce","sceg","sceh","scenic","scenic-oaks","scenicoaks","scep","scf","sch","schall-circle","schallcircle","schaumburg","schenectady","schererville","schertz","schiller-park","schillerpark","schlusser","schnecksville","schoeneck","schofield","schofield-barracks","schofieldbarracks","schoharie","schoolcraft","schriever","schulenburg","schuyler","schuylerville","schuylkill","schuylkill-haven","schuylkillhaven","schwenksville","sciotodale","scissors","scituate","scj","scl","scln","scm","scn","sco","scobey","scotch-plains","scotchplains","scotchtown","scotia","scotland","scotland-neck","scotlandneck","scott","scott-air-force-base","scott-city","scott-lake","scottairforcebase","scottcity","scottdale","scottlake","scotts-mill","scotts-valley","scottsbluff","scottsboro","scottsburg","scottsdale","scottsmill","scottsvalley","scottsville","scottville","scp","scpn","scq","scr","scranton","scs","sct","scv","scw","scx","scy","scz","sd","sda","sdc","sdce","sdd","sdda","sddc","sddg","sddm","sde","sdeo","sdg","sdgs","sdh","sdj","sdk","sdl","sdlb","sdlh","sdlp","sdm","sdo","sdp","sdq","sdr","sds","sdsr","sdss","sdt","sdv","sdx","sdy","sdz","se","sea","sea-breeze","sea-bright","sea-cliff","sea-girt","sea-isle-city","sea-ranch","seabeck","seabreeze","seabright","seabrook","seabrook-farms","seabrook-island","seabrookfarms","seabrookisland","seacliff","seadrift","seaford","seaforth","seagate","seagirt","seagoville","seagraves","seaislecity","seal-beach","sealbeach","sealy","searanch","searcy","searingtown","searles-valley","searlesvalley","searsmont","seaside","seaside-heights","seaside-park","seasideheights","seasidepark","seat-pleasant","seatac","seatpleasant","seattle","sebastian","sebastian-lerdo-de-tejada","sebastianlerdodetejada","sebastopol","sebewaing","sebree","sebring","sec","secaucus","seccion-23","seccion-del-cerrito","seccion23","secciondelcerrito","sechelt","sector-h-tres","sectorhtres","security-widefield","securitywidefield","seda","sedalia","sedan","sedb","sedco-hills","sedcohills","sedgwick","sedona","sedro-woolley","sedrowoolley","seekonk","seeley","seeley-lake","seeleylake","seelyville","seffner","seguin","seis-de-enero","seis-de-octubre","seis-de-octubre-santo-nino","seisdeenero","seisdeoctubre","seisdeoctubresantonino","selah","selby","selby-on-the-bay","selbyonthebay","selbyville","selden","selinsgrove","selkirk","sellersburg","sellersville","sells","selma","selmer","selmont-west-selmont","selmontwestselmont","sem","seminole","seminole-manor","seminolemanor","semmes","senath","senatobia","seneca","seneca-falls","seneca-knolls","senecafalls","senecaknolls","senguio","senneterre","senoia","senor","senor-del-pozo","senordelpozo","sentispac","sep","sept-iles","septiles","sequim","serenada","sergeant-bluff","sergeantbluff","sergio-butron-casas","sergio-villasenor","sergiobutroncasas","sergiovillasenor","serrano","ses","sesser","set","setauket-east-setauket","setauketeastsetauket","seth-ward","sethward","seven-corners","seven-fields","seven-hills","seven-lakes","seven-oaks","seven-points","seven-trees","sevencorners","sevenfields","sevenhills","sevenlakes","sevenoaks","sevenpoints","seventrees","severance","severn","severna-park","severnapark","sevierville","seville","sevina","sewalls-point","sewallspoint","sewanee","seward","sewaren","sewell","sewickley","sexsmith","seybaplaya","seye","seymour","sf","sfa","sfc","sfda","sfdb","sfdc","sfdd","sfdg","sfdh","sfdj","sfdm","sfdp","sfdr","sfdt","sfdv","sfec","sfem","sfg","sfh","sfi","sfj","sfk","sfl","sfm","sfmc","sfn","sfo","sfp","sfpn","sfq","sfr","sfs","sft","sfu","sfx","sfz","sg","sga","sgc","sgdg","sgf","sgi","sgl","sglp","sgm","sgr","sgt","sgz","sh","shackelford","shackle-island","shackleisland","shadeland","shadow-hills","shadowhills","shady-cove","shady-hills","shady-hollow","shady-shores","shady-side","shady-spring","shadycove","shadyhills","shadyhollow","shadyshores","shadyside","shadyspring","shafer","shafter","shaker-heights","shakerheights","shakopee","shallotte","shallowater","shamokin","shamokin-dam","shamokindam","shamrock","shandon","shannon","shannon-hills","shannondale","shannonhills","shanor-northvue","shanornorthvue","shapleigh","shark-river-hills","sharkriverhills","sharon","sharon-hill","sharon-springs","sharonhill","sharonsprings","sharonville","sharpes","sharpsburg","sharpsville","shasta","shasta-lake","shastalake","shattuck","shaunavon","shavano-park","shavanopark","shavertown","shaw","shaw-heights","shawano","shawheights","shawinigan","shawmont","shawnee","shawnee-hills","shawnee-land","shawneehills","shawneeland","shawneetown","shawsville","shawville","shc","sheboygan","sheboygan-falls","sheboyganfalls","shediac","shediac-bridge-shediac-river","shediacbridgeshediacriver","sheepshead-bay","sheepsheadbay","sheffield","sheffield-lake","sheffieldlake","shelbina","shelburn","shelburne","shelburne-falls","shelburnefalls","shelby","shelbyville","sheldon","shell-knob","shell-lake","shell-point","shell-rock","shell-valley","shellbrook","shelley","shellknob","shelllake","shellpoint","shellrock","shellvalley","shelter-island","shelter-island-heights","shelterisland","shelterislandheights","shelton","shenandoah","shenandoah-farms","shenandoah-heights","shenandoahfarms","shenandoahheights","shenorock","shepherd","shepherdstown","shepherdsville","sherborn","sherbrooke","sherburn","sherburne","sheridan","sherman","sherman-oaks","shermanoaks","sherrelwood","sherrill","sherrills-ford","sherrillsford","sherwood","sherwood-manor","sherwood-park","sherwood-shores","sherwoodmanor","sherwoodpark","sherwoodshores","shields","shillington","shilo","shiloh","shiner","shingle-springs","shinglehouse","shinglesprings","shingletown","shinnecock-hills","shinnecockhills","shinnston","ship-bottom","shipbottom","shippagan","shippensburg","shiprock","shiremanstown","shirley","shively","shoal-creek","shoalcreek","shoals","shoctic","shoemakersville","shokan","shoreacres","shoreline","shoreview","shorewood","shorewood-forest","shorewood-hills","shorewood-tower-hills-harbert","shorewoodforest","shorewoodhills","shorewoodtowerhillsharbert","short-hills","short-pump","shorthills","shortpump","shortsville","shoshone","show-low","showlow","shreve","shreveport","shrewsbury","shrub-oak","shruboak","sht","shullsburg","shuniah-township","shuniahtownship","shutesbury","si","sia","siah","sib","sibaca","sibanilja-pocolum","sibaniljapocolum","sibley","sibs","sic","sicamous","sicg","sicklerville","sidg","sidh","sidl","sidm","sidney","sieb","sienna-plantation","siennaplantation","sier","sierra","sierra-blanca","sierra-de-agua","sierra-de-guadalupe","sierra-madre","sierra-mojada","sierra-papacal","sierra-view","sierra-vista","sierra-vista-southeast","sierrablanca","sierradeagua","sierradeguadalupe","sierramadre","sierramojada","sierrapapacal","sierraview","sierravista","sierravistasoutheast","siesta-acres","siesta-key","siesta-shores","siestaacres","siestakey","siestashores","sif","signal-hill","signal-mountain","signalhill","signalmountain","sigourney","sih","sihochac","sihuapan","sii","sikeston","silacayoapam","silao","silb","siler-city","silercity","siletz","siloam-springs","siloamsprings","silsbee","silt","siltepec","silva","silver-bay","silver-berry","silver-city","silver-creek","silver-firs","silver-grove","silver-hill","silver-lake","silver-lakes","silver-ridge","silver-spring","silver-springs","silver-springs-shores","silver-summit","silverbay","silverberry","silvercity","silvercreek","silverdale","silverfirs","silvergrove","silverhill","silverlake","silverlakes","silverridge","silverspring","silversprings","silverspringsshores","silversummit","silverthorne","silverton","silvis","sim","simcoe","simeprodeso-colectivo-nuevo","simeprodesocolectivonuevo","simi-valley","simivalley","simmesport","simojovel-de-allende","simojoveldeallende","simon-sarlat","simonsarlat","simonton-lake","simontonlake","simpson","simpsonville","simsbury-center","simsburycenter","sin","sinahua","sinahuiza","sinaloa","sinaloa-de-leyva","sinaloadeleyva","sinanche","sinapan","sindihui","singac","singuilucan","sinking-spring","sinkingspring","sinton","sioux-center","sioux-city","sioux-falls","sioux-lookout","siouxcenter","siouxcity","siouxfalls","siouxlookout","sip","siqueros","sir","siren","sirm","sisal","sisco-heights","siscoheights","siskiyou","sisoguichi","sisseton","sissonville","sisters","sistersville","sit","sitala","sitilpech","sitio-de-xitlapehua","sitio-ejido","sitiodexitlapehua","sitioejido","sitka","sitpach","siva","sivh","siviral","six","six-mile","six-shooter-canyon","sixmile","sixmile-run","sixmilerun","sixshootercanyon","sixteen-mile-stand","sixteenmilestand","siy","sj","sja","sjb","sjbc","sjbj","sjbv","sjc","sjcb","sjcc","sjce","sjcv","sjd","sjda","sjdb","sjdc","sjde","sjdg","sjdj","sjdl","sjdm","sjdo","sjdp","sjdr","sjds","sjdt","sjdv","sjdz","sje","sjea","sjec","sjeg","sjel","sjen","sjev","sjg","sjgo","sjh","sji","sjj","sjjc","sjjv","sjl","sjlc","sjlg","sjlh","sjli","sjll","sjlm","sjlp","sjm","sjmc","sjn","sjo","sjp","sjpj","sjpn","sjps","sjq","sjr","sjrm","sjs","sjsr","sjsu","sjt","sjth","sjtt","sjv","sjvh","sjx","sjy","sjz","sk","skagit","skagway","skaneateles","skatepark","skiatook","skidaway-island","skidawayisland","skidway-lake","skidwaylake","skippack","skippers-corner","skipperscorner","skokie","skowhegan","sky-lake","sky-valley","skylake","skyline-acres","skyline-ganipa","skyline-view","skylineacres","skylineganipa","skylineview","skyvalley","sl","sla","slat","slater","slater-marietta","slatermarietta","slatington","slaton","slaughterville","slave-lake","slavelake","slayton","slb","slc","sld","sldb","sldc","sldl","sldp","sldt","sle","sleepy-eye","sleepy-hollow","sleepyeye","sleepyhollow","sleg","slev","slg","slh","sli","slidell","slinger","slippery-rock","slipperyrock","slj","sll","slm","sln","slo","sloan","sloatsburg","slocomb","slp","slq","slrc","sls","slsp","slt","slvh","slx","slz","sm","sma","smab","smackover","smb","smb4","smc","smda","smdb","smdc","smde","smdg","smdh","smdl","smdm","smdo","smdp","smdr","smds","smdt","smdv","smdz","sme","smea","smeg","smethport","smev","smf","smg","smgt","smh","smi","smith","smith-center","smith-mills","smith-valley","smithcenter","smithers","smithfield","smithland","smithmills","smiths-falls","smiths-station","smithsburg","smithsfalls","smithsstation","smithton","smithtown","smithvalley","smithville","smithville-sanders","smithvillesanders","smj","sml","smla","smlc","smls","smm","smmc","smmo","smn","smo","smoke-rise","smokerise","smokey-point","smokeypoint","smoky-lake","smokylake","smooth-rock-falls","smoothrockfalls","smp","smpp","smq","smr","sms","smt","smtt","smu","smv","smx","smy","smyrna","smz","sn","sna","snba","sndc","sneads","sneads-ferry","sneadsferry","snec","sneedville","snellville","sneo","sng","sno","snohomish","snoqualmie","snow-hill","snowflake","snowhill","snowmass-village","snowmassvillage","snp","snq","sns","snt","snyder","snyderville","snz","so","soap-lake","soaplake","sob","socastee","socavon-el-carmen","socavonelcarmen","sochiapa","social-circle","socialcircle","society-hill","societyhill","socoltenango","soconusco","socorro","socorromissionnumber1colonia","soda-bay","soda-springs","sodabay","sodasprings","soddy-daisy","soddydaisy","sodus","solalpan-1ra-seccion","solalpan1raseccion","solana-beach","solanabeach","solano","soldotna","soledad","soledad-atzompa","soledad-de-doblado","soledad-de-graciano-sanchez","soledad-morelos","soledad-nueva","soledad-salinas","soledadatzompa","soledaddedoblado","soledaddegracianosanchez","soledadmorelos","soledadnueva","soledadsalinas","solima","solomon","solomons","solon","solosuchiapa","soltepec","solvang","solvay","sombrerete","somerdale","somers","somers-point","somerset","somerspoint","somersworth","somerton","somerville","somonauk","son","sonoma","sonora","sonoyta","sontecomapan","sooke","sop","soperton","sophia","soquel","sorel-tracy","soreltracy","sorrento","sorrento-valley","sorrentovalley","sosa","sotb","soteapan","sotelo","soto-la-marina","sotolamarina","sotuta","souderton","soulsbyville","sound-beach","soundbeach","sour-lake","souris","sourlake","south-alamo","south-amboy","south-amherst","south-apopka","south-ashburnham","south-barre","south-barrington","south-bay","south-beach","south-bel-air","south-belmar","south-beloit","south-bend","south-berwick","south-bloomfield","south-blooming-grove","south-boston","south-bound-brook","south-bradenton","south-brooksville","south-browning","south-burlington","south-canal","south-carolina","south-carthage","south-charleston","south-chicago","south-chicago-heights","south-cleveland","south-coatesville","south-congaree","south-connellsville","south-corning","south-coventry","south-dakota","south-daytona","south-deerfield","south-dennis","south-dos-palos","south-duxbury","south-el-monte","south-elgin","south-eliot","south-euclid","south-fallsburg","south-farmingdale","south-floral-park","south-fulton","south-gastonia","south-gate","south-gate-ridge","south-glens-falls","south-greeley","south-greensburg","south-gull-lake","south-hadley","south-haven","south-hempstead","south-henderson","south-highpoint","south-hill","south-holland","south-hooksett","south-houston","south-huntington","south-huron","south-hutchinson","south-jacksonville","south-jordan","south-jordan-heights","south-kensington","south-kingstown","south-lake-tahoe","south-lancaster","south-laurel","south-lawndale","south-lebanon","south-lockport","south-lyon","south-miami","south-miami-heights","south-milwaukee","south-monroe","south-nyack","south-ogden","south-old-bridge","south-orange","south-oroville","south-ozone-park","south-padre-island","south-palm-beach","south-paris","south-park","south-park-township","south-parkdale","south-pasadena","south-patrick-shores","south-peabody","south-pekin","south-pender-harbour","south-pittsburg","south-plainfield","south-point","south-portland","south-portland-gardens","south-pottstown","south-riding","south-river","south-riverdale","south-rockwood","south-rosemary","south-roxana","south-russell","south-saint-paul","south-salt-lake","south-san-francisco","south-san-gabriel","south-san-jose-hills","south-sanford","south-sarasota","south-shore","south-sioux-city","south-suffolk","south-sumter","south-taft","south-temple","south-thomaston","south-toms-river","south-tucson","south-uniontown","south-vacherie","south-valley","south-valley-stream","south-venice","south-vineland","south-waverly","south-weber","south-wenatchee","south-whitley","south-whittier","south-willard","south-williamsport","south-windham","south-windsor","south-woodstock","south-yarmouth","south-yuba-city","south-zanesville","southalamo","southamboy","southamherst","southampton","southapopka","southashburnham","southaven","southbarre","southbarrington","southbay","southbeach","southbelair","southbelmar","southbeloit","southbend","southberwick","southbloomfield","southbloominggrove","southborough","southboston","southboundbrook","southbradenton","southbridge","southbrooksville","southbrowning","southburlington","southbury","southcanal","southcarolina","southcarthage","southcharleston","southchase","southchicago","southchicagoheights","southcleveland","southcoatesville","southcongaree","southconnellsville","southcorning","southcoventry","southdakota","southdaytona","southdeerfield","southdennis","southdospalos","southduxbury","southeast-arcadia","southeastarcadia","southelgin","southeliot","southelmonte","southern-gateway","southern-pines","southern-shops","southern-shores","southern-view","southerngateway","southernpines","southernshops","southernshores","southernview","southeuclid","southfallsburg","southfarmingdale","southfield","southfloralpark","southfulton","southgastonia","southgate","southgateridge","southglenn","southglensfalls","southgreeley","southgreensburg","southgulllake","southhadley","southhaven","southhempstead","southhenderson","southhighpoint","southhill","southholland","southhooksett","southhouston","southhuntington","southhuron","southhutchinson","southjacksonville","southjordan","southjordanheights","southkensington","southkingstown","southlake","southlaketahoe","southlancaster","southlaurel","southlawndale","southlebanon","southlockport","southlyon","southmayd","southmiami","southmiamiheights","southmilwaukee","southmonroe","southmont","southnyack","southogden","southold","southoldbridge","southorange","southoroville","southozonepark","southpadreisland","southpalmbeach","southparis","southpark","southparkdale","southparktownship","southpasadena","southpatrickshores","southpeabody","southpekin","southpenderharbour","southpittsburg","southplainfield","southpoint","southport","southportland","southportlandgardens","southpottstown","southriding","southriver","southriverdale","southrockwood","southrosemary","southroxana","southrussell","southsaintpaul","southsaltlake","southsanford","southsanfrancisco","southsangabriel","southsanjosehills","southsarasota","southshore","southside","southside-place","southsideplace","southsiouxcity","southsuffolk","southsumter","southtaft","southtemple","souththomaston","southtomsriver","southtucson","southuniontown","southvacherie","southvalley","southvalleystream","southvenice","southvineland","southwaverly","southweber","southwenatchee","southwest-greensburg","southwest-ranches","southwest-schuylkill","southwestgreensburg","southwestranches","southwestschuylkill","southwhitley","southwhittier","southwick","southwillard","southwilliamsport","southwindham","southwindsor","southwood-acres","southwoodacres","southwoodstock","southworth","southyarmouth","southyubacity","southzanesville","soyalo","soyaltepec","soyaniquilpan","soyata","soyataco","soyatitan","soyatlan-de-afuera","soyatlan-del-oro","soyatlandeafuera","soyatlandeloro","soyopa","sp","spa","spackenkill","spanaway","spangler","spanish-fork","spanish-fort","spanish-lake","spanish-springs","spanishfork","spanishfort","spanishlake","spanishsprings","sparkill","sparks","sparrow-bush","sparrowbush","sparta","spartanburg","sparwood","spb","spbj","spc","spcc","spcv","spd","spdc","spdg","spdi","spdr","spe","spea","spearfish","spearman","speedway","speers","speg","spencer","spencerport","spencerville","sperry","spg","spgg","sph","spi","spicer","spindale","spinnerstown","spirit-lake","spirit-river","spiritlake","spiritriver","spiro","spj","spl","splb","splendora","splj","splp","spm","spmq","spmy","spn","spo","spokane","spokane-valley","spokanevalley","spooner","spotswood","spotsylvania","spotsylvania-courthouse","spotsylvaniacourthouse","spp","sppg","spq","spreckelsville","spring","spring-arbor","spring-city","spring-creek","spring-glen","spring-green","spring-grove","spring-hill","spring-hope","spring-house","spring-lake","spring-lake-heights","spring-lake-park","spring-mount","spring-park","spring-ridge","spring-valley","spring-valley-lake","springarbor","springboro","springbrook","springcity","springcreek","springdale","springerville","springfield","springfield-gardens","springfieldgardens","springglen","springgreen","springgrove","springhill","springhope","springhouse","springlake","springlakeheights","springlakepark","springmount","springpark","springridge","springs","springtown","springvale","springvalley","springvalleylake","springview","springville","spruce-grove","spruce-hill","spruce-pine","sprucegrove","sprucehill","sprucepine","spry","sps","spt","spur","spurgeon","spuyten-duyvil","spuytenduyvil","spv","spx","spy","spz","sq","squamish","sr","sra","srb","src","srdl","srdm","srdr","srdt","sreh","srf","srh","sri","srj","srla","srll","srm","srn","srp","srrs","srs","srsb","srt","srx","srz","ss","ssa","ssba","ssc","ssda","ssdg","ssdm","ssdo","ssds","ssdv","sse","ssea","sseg","sses","ssev","ssf","ssg","ssh","ssi","ssjh","ssl","ssm","ssn","ssp","ssrh","sss","sst","ssx","st","st-adolphe","st-albert","st-andrew-windfields","st-anthony","st-catharines","st-charles","st-george","st-jean-port-joli","st-johns","st-johnsbury","st-louis","st-lucie","st-marys","st-paul","st-petersburg","st-stephen","st-thomas","stacy","stadolphe","stafford","stafford-springs","staffordsprings","stagecoach","stalbert","stallings","stallion-springs","stallionsprings","stambaugh-iron-river","stambaughironriver","stamford","stamps","stanaford","stanardsville","stanberry","standish","standrewwindfields","stanfield","stanford","stanhope","stanislaus","stanley","stanleytown","stansbury-park","stansburypark","stanthony","stanton","stanwood","staples","stapleton","star","star-city","star-valley","star-valley-ranch","starbuck","starcity","starke","starksboro","starkville","starlight-village","starlightvillage","starvalley","starvalleyranch","state-center","state-college","state-line","stateburg","statecenter","statecollege","stateline","staten-island","statenisland","statenville","statesboro","statesville","statham","staunton","stayton","stc","stcatharines","stcharles","stdg","steamboat-springs","steamboatsprings","stearns","stedman","steele","steeles","steeleville","steelton","steelville","steep-falls","steepfalls","steger","steilacoom","steinbach","steinhatchee","steinway","stephens-city","stephenscity","stephenville","stephenville-crossing","stephenvillecrossing","sterling","sterling-city","sterling-heights","sterlingcity","sterlingheights","sterlington","stetson","stettler","steuben","steubenville","stevens-point","stevenson","stevenson-ranch","stevensonranch","stevenspoint","stevensville","stewart-manor","stewartmanor","stewartstown","stewartville","stgeorge","sth","sthh","stickney","stigler","stiles","stillman-valley","stillmanvalley","stillwater","stilwell","stinnett","stirling","stj","stjeanportjoli","stjohns","stjohnsbury","stlc","stlouis","stlucie","stmarys","stn","stock-island","stockbridge","stockdale","stockisland","stockton","stockton-springs","stocktonsprings","stockville","stokesdale","stone-mountain","stone-park","stone-ridge","stoneboro","stonecrest","stonegate","stonegate-queensway","stonegatequeensway","stoneham","stonemountain","stonepark","stoneridge","stoneville","stonewall","stonewood","stoney-point","stoneypoint","stonington","stony-brook","stony-creek-mills","stony-plain","stony-point","stony-prairie","stonybrook","stonycreekmills","stonyplain","stonypoint","stonyprairie","storey","storm-lake","stormlake","stormstown","storrs","story-city","storycity","stottville","stouffville","stoughton","stover","stow","stowe","stowell","stpaul","stpetersburg","str","strafford","strasburg","stratford","stratham-station","strathamstation","strathmore","stratmoor","strawberry","strawberry-mansion","strawberry-point","strawberrymansion","strawberrypoint","streamwood","streator","streetsboro","stromsburg","strong","strongsville","stroud","stroudsburg","strum","struthers","stryker","ststephen","stt","stthomas","stuart","stuarts-draft","stuartsdraft","studio-city","studiocity","sturbridge","sturgeon","sturgeon-bay","sturgeonbay","sturgis","sturtevant","stuttgart","stv","su","suamico","suaqui-grande","suaquigrande","sublette","sublimity","subteniente-lopez","subtenientelopez","suc-tuc","succasunna","suchiapa","suchil","suchilapan-del-rio","suchilapandelrio","suchitlan","sucila","sucopo","suctuc","sudbury","sudden-valley","suddenvalley","sudley","sudzal","suffern","suffield-depot","suffielddepot","suffolk","suffolk-downs-station","suffolkdownsstation","sugar-city","sugar-creek","sugar-grove","sugar-hill","sugar-land","sugarcity","sugarcreek","sugarcreek-police-dept","sugarcreekpolicedept","sugargrove","sugarhill","sugarland","sugarland-run","sugarlandrun","sugarmill-woods","sugarmillwoods","suisun","suitland","suitland-silver-hill","suitlandsilverhill","sulligent","sullivan","sullivan-city","sullivancity","sullivans-island","sullivansisland","sulphur","sulphur-springs","sulphursprings","sultan","sultepec","suma-de-hidalgo","sumadehidalgo","sumas","sumidero","sumiton","summerdale","summerfield","summerland","summerlin-south","summerlinsouth","summerset","summerside","summersville","summerville","summit","summit-hill","summit-park","summit-view","summithill","summitpark","summitview","sumner","sumrall","sumter","sun-city","sun-city-center","sun-city-west","sun-lakes","sun-prairie","sun-valley","sun-village","sunapee","sunbury","suncity","suncitycenter","suncitywest","suncoast-estates","suncoastestates","suncook","sundance","sunderland","sundown","sundre","sunflower","sunlakes","sunland","sunland-park","sunlandpark","sunman","sunny-isles-beach","sunnyislesbeach","sunnyside","sunnyside-tahoe-city","sunnysidetahoecity","sunnyslope","sunnyvale","sunprairie","sunray","sunrise","sunrise-lake","sunrise-manor","sunriselake","sunrisemanor","sunriver","sunset","sunset-beach","sunset-hills","sunset-park","sunsetbeach","sunsethills","sunsetpark","sunshine-ranches","sunshineranches","sunuapa","sunvalley","sunvillage","superior","supreme","suquamish","surf-city","surfcity","surfside","surfside-beach","surfsidebeach","surgoinsville","surprise","surrey","surry","susanville","susitna-north","susitnanorth","suspiro-picacho","suspiropicacho","susquehanna","susquehanna-trails","susquehannatrails","sussex","susticacan","susupuato-de-guerrero","susupuatodeguerrero","sutherland","sutherlin","sutter","sutter-creek","suttercreek","sutton","sutton-alpine","suttonalpine","suwanee","sv","svb","svc","svdf","svdj","svea","svf","svl","svlm","svn","svp","svr","svs","svt","svz","sw","swainsboro","swampscott","swan-hills","swan-river","swanhills","swannanoa","swanquarter","swanriver","swansboro","swansea","swanton","swanville","swanzey","swarthmore","swartz","swartz-creek","swartzcreek","swartzville","swedesboro","sweeny","sweet-home","sweet-springs","sweethome","sweetser","sweetsprings","sweetwater","swepsonville","swift-current","swift-trail-junction","swiftcurrent","swifttrailjunction","swissvale","swoyersville","sws","sx","sy","syc","sycamore","sydenham","sydney","sydney-mines","sydneymines","sykesville","sylacauga","sylmar","sylva","sylvan-beach","sylvan-lake","sylvan-springs","sylvanbeach","sylvania","sylvanlake","sylvansprings","sylvester","syosset","syracuse","sz","t1s","t2s","ta","tab","tabasco","taber","tabor-city","taborcity","tac","tacambaro-de-codallos","tacambarodecodallos","tacatzcuaro","tacicuaro","tacoaleche","tacoma","tacony","tacopan","tacotalpa","tacuba-nueva","tacubanueva","tacubaya","tacuro-santa-maria-tacuro","tacurosantamariatacuro","tafb","tafetan","taft","taft-heights","taft-mosswood","taft-southwest-historical","taftheights","taftmosswood","taftsouthwesthistorical","tahdzibichen","tahdziu","tahlequah","tahmek","tahoe-vista","tahoevista","tahoka","tahoma","tainter-lake","tainterlake","takoma-park","takomapark","tala","talbotton","talent","talihina","talisman","talladega","tallahassee","tallapoosa","tallassee","tallmadge","tallulah","talmage","taloga","talol","talpa-de-allende","talpadeallende","talty","tam","tam-oshanter-sullivan","tama","tamalin","tamalpais-homestead-valley","tamalpais-valley","tamalpaishomesteadvalley","tamalpaisvalley","taman","tamandaro","tamapatz","tamaqua","tamarac","tamarack","tamasopo","tamaulipas","tamazola","tamazula","tamazula-de-gordiano","tamazula-de-victoria","tamazuladegordiano","tamazuladevictoria","tamazulapam","tamazulapam-del-espiritu-santo","tamazulapam-villa-del-progreso","tamazulapamdelespiritusanto","tamazulapamvilladelprogreso","tamazulita","tamazunchale","tambaca","tamcuime","tamiahua","tamiami","tamoshantersullivan","tampa","tampacan","tampamolon-corona","tampamoloncorona","tampate","tampemoche","tampico","tampico-alto","tampicoalto","tampiquito","tamuin","tamulte-de-las-sabanas","tamultedelassabanas","tamworth","tanaco","tanaina","tanamacoyan","tanaquillo","tancanhuitz","tancazahuela","tancitaro","tancoco","tandzumadz","tanetze-de-zaragoza","tanetzedezaragoza","taneytown","tangancicuaro-de-arista","tangancicuarodearista","tanganhuato","tangelo-park","tangelopark","tangent","tangerine","tanglewilde","tanglewilde-thompson-place","tanglewildethompsonplace","tanhuato-de-guerrero","tanhuatodeguerrero","tanhuixco","taniche","taniperla","tankuche","tanlajas","tanner","tannersville","tanque-verde","tanques","tanqueverde","tanquian-de-escobedo","tanquiandeescobedo","tantalus","tantima","tantoyuca","tanute","taos","taos-pueblo","taospueblo","tapachula","tapalapa","tapalapan","tapalpa","tapanala","tapeixtles","tapijulapa","tapilula","tapotzingo","tappahannock","tappan","tara-hills","tarahills","tarandacuao","tarboro","tarecuato","tarejero","tarentum","taretan","tariffville","tarimbaro","tarimoro","tarkio","tarpey-village","tarpeyvillage","tarpon-springs","tarponsprings","tarrant","tarrytown","tasquillo","tatahuicapa","tatahuicapan","tataltepec-de-valdes","tataltepecdevaldes","tatamy","tatatila","tatauzoquico","tatoxcac","tatum","taunton","tavares","tavera","tavernier","tavistock","tawas-city","tawascity","taxadho","taxco","taxco-de-alarcon","taxco-el-viejo","taxcodealarcon","taxcoelviejo","taxtes","tayahua","taylor","taylor-creek","taylor-lake-village","taylor-massey","taylor-mill","taylorcreek","taylorlakevillage","taylormassey","taylormill","taylors","taylors-falls","taylorsfalls","taylorsville","taylorville","tayoltita","taza-de-agua-ojo-zarco","tazadeaguaojozarco","tazaquil","tazewell","tazumbo","tb","tb1s","tbb","tbh","tbn","tc","tchula","tcsp","td","tda","tdac","tdb","tdc","tdd","tde","tdes","tdf","tdfv","tdg","tdgo","tdh","tdi","tdj","tdjm","tdl","tdlf","tdls","tdm","tdme","tdmp","tdo","tdp","tdr","tdrc","tds","tdsr","tdt","tdv","tdz","te","tea","teabo","teacalco","teacapan","teague","teaneck","teapa","teaticket","teayo","teays-valley","teaysvalley","teb","tecacahuaco","tecajec","tecali","tecalitlan","tecalpulco","tecama","tecamac","tecamac-de-felipe-villanueva","tecamacdefelipevillanueva","tecamachalco","tecamalucan","tecario","tecate","tecax","tecaxic","techachalco","techachaltitla","techaluta-de-montenegro","techalutademontenegro","techichili","tecoac-santa-maria-nativitas","tecoacsantamarianativitas","tecoanapa","tecolapan","tecolcuautla","tecolotlan","tecolots","tecoltepec","tecoluta-2da-seccion","tecoluta2daseccion","tecolutla","tecoman","tecomatan","tecomatepec","tecomates","tecomatlan","tecomavaca","tecomaxtlahuaca","tecominoacan","tecozautla","tecpan-de-galeana","tecpandegaleana","tecpantzacoalco","tecpatan","tecuala","tecualilla","tecualtitan","tecuanipa","tecuanipan","tecuexcomac","tecuexcontitlantecoescontitlan","tecumseh","tedder","tega-cay","tegacay","tehachapi","tehama","tehuacan","tehuetlan","tehuilotepec","tehuipango","tehuitzingo","tehuixtla","tejalpa","tejaluca","tejocote-de-calera","tejocotedecalera","tejupa","tejupilco-de-hidalgo","tejupilcodehidalgo","tekal-de-venegas","tekaldevenegas","tekamah","tekanto","tekik-de-regil","tekikderegil","tekit","tekoh","tekom","telchac-pueblo","telchac-puerto","telchacpueblo","telchacpuerto","telchaquillo","telcruz","telford","telixtac","tell-city","tellcity","tellico-village","tellicovillage","telluride","teloloapan","teloxtoc","telpatlan","teltipan-de-juarez","teltipandejuarez","temalacaco","temalacayuca","temamatla","temango","temapache","temascal","temascalapa","temascalcingo","temascaltepec-de-gonzalez","temascaltepecdegonzalez","temastian-la-cantera","temastianlacantera","temax","temaxcaltepec","temecula","temelec","temextla","temimilcingo","temiscaming","temiskaming-shores","temiskamingshores","temixco","temoac","temoaya","temoris","temosachic","temozon","tempe","tempe-junction","tempejunction","temperance","temple","temple-city","temple-hills","temple-terrace","templecity","templehills","templeterrace","templeton","templeton-est","templetonest","tempoal-de-sanchez","tempoaldesanchez","ten","ten-hills","ten-mile-run","tenabo","tenafly","tenaha","tenamaxtlan","tenampa","tenampulco","tenancingo","tenancingo-de-degollado","tenancingodedegollado","tenango","tenango-de-arista","tenango-de-doria","tenango-de-las-flores","tenango-del-aire","tenango-el-nuevo","tenangodearista","tenangodedoria","tenangodelaire","tenangodelasflores","tenangoelnuevo","tenantitla","tenayuca","tenejapa","tenenexpan","teneria","teneria-del-santuario","teneriadelsantuario","tenexio","tenexpa","tenextepango","tenguecho","tenhills","tenino","tenixtepec","tenjay","tenmilerun","tennessee","tennessee-ridge","tennesseeridge","tennille","tenochtitlan","tenosique","tentic","teocalco","teocaltiche","teocelo","teococuilco-de-marcos-perez","teococuilcodemarcosperez","teocuitatlan-de-corona","teocuitatlandecorona","teofani","teojomulco","teolocholco","teoloyucan","teontepec","teopantlan","teopisca","teotihuacan","teotihuacan-de-arista","teotihuacandearista","teotitlan","teotitlan-del-valle","teotitlandelvalle","teotlalco","teotlaltzingo","tepache","tepakan","tepalcatepec","tepalcingo","tepanco","tepango","tepapayeca","tepatepec","tepatitlan-de-morelos","tepatitlandemorelos","tepatlaxco","tepatlaxco-de-hidalgo","tepatlaxcodehidalgo","tepazolco","tepeaca","tepeapulco","tepec","tepechicotlan","tepechitlan","tepecoacuilco-de-trujano","tepecoacuilcodetrujano","tepehuacan-de-guerrero","tepehuacandeguerrero","tepeitic","tepeji-del-rio-de-ocampo","tepejidelriodeocampo","tepenixtlahuaca","tepeojuma","tepepa","tepetates","tepeteno-de-iturbide","tepetenodeiturbide","tepetitan","tepetitanreyeshogpandehidalgo","tepetitla","tepetitlan","tepetixtla","tepetlacolco","tepetlan","tepetlaoxtoc-de-hidalgo","tepetlaoxtocdehidalgo","tepetlapa","tepetlixpa","tepetongo","tepetzingo","tepetzintla","tepetzitzintla","tepexco","tepexi","tepexititla","tepexpan","tepeyahualco","tepeyanco","tepeyehualco-de-hidalgo","tepeyehualcodehidalgo","tepezala","tepic","tepich","tepojaco","teposcolula","tepotzotlan","tepoxtepec","tepozcuautla","tepoztlan","tepusco","tepuxtepec","tequepexpan","tequesquitengo","tequesquitlan","tequesta","tequexquinahuac","tequicuilco","tequila","tequila-1ra-seccion-la-aurora","tequila1raseccionlaaurora","tequisistlan","tequisistlan-primero","tequisistlanprimero","tequisquiapan","tequixquiac","tercera-manzana-de-zaragoza","terceramanzanadezaragoza","teremendo","terminal-de-providencia","terminaldeprovidencia","terra-alta","terra-bella","terra-mar","terraalta","terrabella","terrace","terrace-heights","terrace-park","terraceheights","terracepark","terramar","terramuggus","terrasse-des-pins","terrassedespins","terrazas-del-valle","terrazasdelvalle","terre-du-lac","terre-haute","terre-hill","terrebonne","terredulac","terrehaute","terrehill","terrell","terrell-hills","terrellhills","terrenate","terry","terrytown","terryville","tesechoacan","tesistan","tesoco","testerazo","tetecala","tetecalita","tetecolala","tetela","tetela-de-ocampo","tetela-del-volcan","teteladelvolcan","teteladeocampo","tetelcingo","tetelco","teteles-de-avila-castillo","tetelesdeavilacastillo","tetelilla","teteltzingo","tetepango","tetillas","tetipac","tetitlan","tetiz","tetla","tetlanohcan","tetlatlahuca","tetlatzinga","tetlaxco","tetzacual","teuchitlan","teul-de-gonzalez-ortega","teuldegonzalezortega","teutila","teutopolis","tev","teviston","tewksbury","texalpan-de-abajo","texalpan-de-arriba","texalpandeabajo","texalpandearriba","texan-de-palomeque","texandepalomeque","texanna","texarkana","texas","texas-city","texascity","texca","texcaco","texcala","texcalac","texcalapa-de-juarez","texcalapadejuarez","texcaltepec","texcaltic","texcaltitanxoteapantexcaltitan","texcaltitlan","texcalyacac","texcapa","texcapilla","texcatepec","texcatitlan","texcoco-de-mora","texcocodemora","texhuacan","texico","texin","texistepec","texmelucan","texmola","texocoyohuac","teya","tezapotla","tezhuatepec","teziutlan","tezoatlan-de-segura-y-luna","tezoatlandesegurayluna","tezonapa","tezonteopan-de-bonilla","tezonteopandebonilla","tezontepec","tezontepec-de-aldama","tezontepecdealdama","tezoquipa","tezoyuca","tf","tg","tgt","th","thatcher","thayer","the-acreage","the-beaches","the-bronx","the-colony","the-crossings","the-dalles","the-galena-territory","the-hammocks","the-hideout","the-hills","the-meadows","the-pas","the-pinery","the-plains","the-village","the-village-of-indian-hill","the-villages","the-villas-at-aeloa","the-woodlands","theacreage","thebeaches","thebronx","thecolony","thecrossings","thedalles","thedford","thegalenaterritory","thehammocks","thehideout","thehills","themeadows","theodore","thepas","thepinery","theplains","theresa","thermal","thermalito","thermopolis","thessalon","thetford-mines","thetfordmines","thevillage","thevillageofindianhill","thevillages","thevillasataeloa","thewoodlands","thibodaux","thief-river-falls","thiefriverfalls","thiells","thiensville","third-lake","thirdlake","thistletown-beaumond-heights","thistletownbeaumondheights","thomas","thomasboro","thomaston","thomasville","thompson","thompson-falls","thompsonfalls","thompsons-station","thompsonsstation","thompsonville","thomson","thonotosassa","thoreau","thorncliffe-park","thorncliffepark","thorndale","thornport","thornton","thorntown","thornwood","thorold","thorp","thorsby","thousand-oaks","thousand-palms","thousandoaks","thousandpalms","three-forks","three-hills","three-lakes","three-oaks","three-points","three-rivers","three-way","threeforks","threehills","threelakes","threeoaks","threepoints","threerivers","threeway","throckmorton","throgs-neck","throgsneck","throop","thunder-bay","thunderbay","thunderbolt","thurmond","thurmont","thurso","thurston","thv","ti","tianguismanalco","tianguistengo","tianguistengo-la-romera","tianguistengolaromera","tianguistongo","tibolon","tiburon","tice","tichigan","ticonderoga","ticopo","ticul","ticuman","tierra-amarilla","tierra-blanca","tierra-blanca-booxter","tierra-buena","tierra-colorada","tierra-fria","tierra-larga-campo-nuevo","tierra-negra","tierra-nueva","tierra-verde","tierra-y-libertad","tierraamarilla","tierrablanca","tierrablancabooxter","tierrabuena","tierracolorada","tierrafria","tierralargacamponuevo","tierranegra","tierranueva","tierras-coloradas","tierras-coloradas-san-pedro","tierrascoloradas","tierrascoloradassanpedro","tierraverde","tierraylibertad","tieton","tiffin","tifton","tigard","tiger-point","tigerpoint","tigerville","tiholop","tihosuco","tihuatlan","tijuana","tiki-island","tikiisland","tikinmul","tikuch","tila","tilapa","tilapan","tilden","tillamook","tillmans-corner","tillmanscorner","tillson","tiltepec","tilton","tilton-northfield","tiltonnorthfield","tiltonsville","tilzapotla","timber-lake","timber-pines","timberlake","timberlane","timberlea","timberpines","timberville","timberwood-park","timberwoodpark","times-square","timessquare","timmins","timmonsville","timonium","timpson","timucuy","tinajas","tinajas-1ra-seccion","tinajas1raseccion","tinajitas","tincontlan","tingambato","tinguindin","tinicum","tinley-park","tinleypark","tinton-falls","tintonfalls","tinum","tioga","tionesta","tipp-city","tippcity","tipton","tiptonville","tiquicheo","tirindaro","tiripetio","tisdale","tishomingo","titusville","tiverton","tivoli","tixcacalcupul","tixcacaltuyub","tixcancal","tixhualactun","tixkokob","tixmadeje-chiquito","tixmadejechiquito","tixmehuac","tixpehual","tixtla-de-guerrero","tixtladeguerrero","tixtlancingo","tizapan-el-alto","tizapanelalto","tizayuca","tizimin","tj","tl","tla","tlacamilco","tlachaloya","tlachichila","tlachichilco","tlachichuca","tlacoachistlahuaca","tlacoapa","tlacoatzintepec","tlacoaxtla","tlacojalpan","tlacolula","tlacolula-de-matamoros","tlacoluladematamoros","tlacolulan","tlacomulco","tlacotalpan","tlacote-el-bajo","tlacoteelbajo","tlacotepec","tlacotepec-de-jose-manzo","tlacotepec-de-mejia","tlacotepec-san-mateo","tlacotepecdejosemanzo","tlacotepecdemejia","tlacotepecsanmateo","tlacpac","tlacuilola","tlacuilolapan","tlacuilotepec","tlacuitapan","tlacuitlapa","tlahuac","tlahualilo-de-zaragoza","tlahualilodezaragoza","tlahuapa","tlahuelilpan","tlahuitoltepec","tlaixpan","tlajomulco-de-zuniga","tlajomulcodezuniga","tlalchapa","tlalchiyahualica","tlalconteno","tlalcozotitlan","tlalixcoyan","tlalixtac-de-cabrera","tlalixtacdecabrera","tlalixtaquilla","tlalmanalco","tlalminulpa","tlalnelhuayocan","tlalnepantla","tlalpan","tlalpujahua-de-rayon","tlalpujahuaderayon","tlaltecahuacan","tlaltempanapa","tlaltenango","tlaltenango-de-sanchez-roman","tlaltenangodesanchezroman","tlaltenanguito","tlaltepango","tlaltetela","tlaltizapan","tlamacazapa","tlamaco-san-geronimo-tlamaco","tlamacosangeronimotlamaco","tlamanca","tlamanca-de-hernandez","tlamancadehernandez","tlamatoca","tlamaya-grande","tlamayagrande","tlaminca","tlamixtlahuacan","tlanalapa","tlanalapan","tlanchinol","tlancualpican","tlanepantla","tlanipatla","tlaola","tlapa-de-comonfort","tlapacoyan","tlapadecomonfort","tlapala","tlapanala","tlapanaloya","tlapehuala","tlaquepaque","tlaquilpa","tlaquiltenango","tlaquiltepec","tlatempa","tlatempan","tlatenchi","tlatilpa","tlatlauquitepec","tlatlaya","tlatzala","tlaxcala","tlaxcalantongo","tlaxcalilla","tlaxcalixtlahuaca","tlaxco","tlaxco-santiago-tlaxco","tlaxcoapan","tlaxcosantiagotlaxco","tlaxinga-clatzinga","tlaxingaclatzinga","tlaxmalac","tlaxocoyucan","tlaxpanaloya","tlayacapan","tlayehualancingo","tlazala-de-fabela","tlazaladefabela","tlazazalca","tlc","tlcn","tlilapan","tlixco","tlr","tlv","tm","tmdz","tmr","tn","tnc","to","toast","tobaccoville","tobarito","tobermory","toc","tocatlan","toccoa","tochimilco","tochtepec","tocob-leglemal","tocobleglemal","tocoy","tocumbo","todd-creek","toddcreek","todos-santos","todossantos","tofield","tofino","toftrees","tok","tolcayuca","toledo","toliman","tolland","tolleson","tolome","tolono","toluca","toluca-de-guadalupe","tolucadeguadalupe","tom-bean","tomah","tomahawk","tomaquilapa","tomatlan","tomball","tombean","tombstone","tome","tomelopitos","tomendan","tomochic","tompkinsville","toms-river","tomsriver","tonala","tonalaco","tonalapa","tonalapa-del-sur","tonalapadelsur","tonalapan","tonalixco","tonanitla","tonasket","tonawanda","tonaya","tonayan","tonganoxie","tonila","tonka-bay","tonkabay","tonkawa","tonopah","tontitown","tonto-basin","tontobasin","tooele","tool","topanga","topaz-ranch-estates","topazranchestates","topeka","topia","topilco-de-juarez","topilcodejuarez","topiltepec","topolobampo","toppenish","topsfield","topsham","topton","toquerville","torbay","toreo-bajo-el-toreo-bajo","toreobajoeltoreobajo","tornado","tornillo","toro-canyon","torocanyon","toronto","torrance","torreon","torresdale","torrington","tortolita","tos","totatiche","totolac","totolapa","totolapan","totolmajac","totoltepec","totoltepec-de-guerrero","totoltepecdeguerrero","totomixtlahuaca","totontepec-villa-de-morelos","totontepecvillademorelos","tototepec","tototlan","totowa","tottenham","totutla","toughkenamon","toulon","towamensing-trails","towamensingtrails","towanda","towaoc","tower-city","tower-lake","towercity","towerlake","town-and-country","town-creek","town-line","town-n-country","townandcountry","towncreek","towner","townline","townncountry","townsend","townshend","towson","toxpalan","toxtla","tozihuic","tozongo","tp","tr","trabuco-canyon","trabucocanyon","tracadie-sheila","tracadiesheila","tracy","tracy-city","tracycity","tracyton","traer","trafalgar","trafford","trail","trail-creek","trailcreek","trainer","trancoso","transfiguracion","transito-tular","transitotular","transporte","trapiche-de-abra","trapiche-del-rosario","trapiche-viejo","trapichedeabra","trapichedelrosario","trapicheviejo","trappe","travelers-rest","travelersrest","traverse-city","traversecity","travilah","travis","travis-ranch","travisranch","trdh","tre","treasure-island","treasure-lake","treasureisland","treasurelake","trejos","tremont","tremonton","trempealeau","trent-woods","trenton","trentwood","trentwoods","tres-bocas-1ra-seccion","tres-cerros","tres-de-mayo","tres-estrellas","tres-garantias","tres-marias","tres-mezquites","tres-palos","tres-picos","tres-valles","tres-zapotes","tresbocas1raseccion","trescerros","tresdemayo","tresestrellas","tresgarantias","tresmarias","tresmezquites","trespalos","trespicos","tresvalles","treszapotes","trevorton","trevose","trexlertown","trf","tri-cities","tri-city","tri-lakes","triangle","tribeca","tribes-hill","tribeshill","tribune","tricities","tricity","trilakes","trincheras","trinidad","trinidad-de-viguera","trinidad-garcia-de-la-cadena","trinidad-zaachila","trinidaddeviguera","trinidadgarciadelacadena","trinidadzaachila","trinity","trinity-bay-north","trinity-bellwoods","trinitybaynorth","trinitybellwoods","trion","tripoli","trois-rivieres","troisrivieres","tronconal","trooper","trophy-club","trophyclub","trotwood","troup","troutdale","troutman","trowbridge-park","trowbridgepark","troy","truckee","trucksville","truman","trumann","trumansburg","trumbull","truro","trussville","truth-or-consequences","truthorconsequences","tryon","ts","tsaile","tsawwassen","tsft","tsgt","tsh","tsm","tsmn","tsmt","tss","tst","tt","ttp","tu","tualatin","tuba-city","tubac","tubacity","tubutama","tuckahoe","tucker","tuckerman","tuckerton","tucson","tucson-estates","tucsonestates","tucta","tucumcari","tuftonboro","tufts-university","tuftsuniversity","tujunga","tukwila","tula","tula-de-allende","tuladeallende","tulalip","tulalip-bay","tulalipbay","tulancingo","tulantongo","tulapam","tulare","tularosa","tulcingo","tulcingo-de-valle","tulcingodevalle","tulia","tulillos-de-abajo","tulillosdeabajo","tuliman","tulimanca","tulipanes","tullahoma","tullytown","tulpehocken","tulsa","tultepec","tultitlan-de-mariano-escobedo","tultitlandemarianoescobedo","tulum","tumbala","tumbiscatio-de-ruiz","tumbiscatioderuiz","tumbler-ridge","tumblerridge","tumwater","tuncingo","tungareo","tunica","tunica-resorts","tunicaresorts","tunititlan","tunkas","tunkhannock","tuolumne","tuolumne-city","tuolumnecity","tupataro","tupelo","tupper-lake","tupperlake","turcio-segunda-seccion","turciosegundaseccion","turicato","turicuaro","turley","turlock","turner","turners-falls","turnersfalls","turnersville","turpin-hills","turpinhills","turtle-creek","turtle-lake","turtle-rock","turtlecreek","turtlelake","turtlerock","turuachi","tuscaloosa","tuscarawas","tuscola","tusculum","tuscumbia","tuskegee","tustin","tustin-legacy","tustinlegacy","tutepec","tuttle","tutwiler","tuxcacuesco","tuxcueca","tuxpam-de-rodriguez-cano","tuxpamderodriguezcano","tuxpan","tuxpan-de-bolanos","tuxpandebolanos","tuxpanguillo","tuxtepec","tuxtilla","tuxtla","tuxtla-chico","tuxtlachico","tuzamapan","tuzantan","tuzantla","tuzuapan","tv","tvaa","tvdm","tvdp","tw","twain-harte","twainharte","tweed","twentynine-palms","twentyninepalms","twin-city","twin-falls","twin-grove","twin-lake","twin-lakes","twin-rivers","twincity","twinfalls","twingrove","twinlake","twinlakes","twinrivers","twinsburg","two-harbors","two-hills","two-rivers","twoharbors","twohills","tworivers","tx","txt","tybee-island","tybeeisland","tye","tyhee","tyl","tyler","tylertown","tyndall","tyndall-air-force-base","tyndallairforcebase","tyngsboro","tyro","tyrone","tysons","tz","tzajala","tzajalchen","tzaquiviljok","tzeltal","tzicatlacoyan","tzicatlan","tzimol","tzinacapan","tzinil","tzintzimeo","tzintzingareo","tzintzuntzan","tziritzicuaro","tziscao","tzitzio","tzoeptic","tzompantepec","tzontehuitz","tzopilja","tzucacab","ua","uayalceh-de-peon","uayalcehdepeon","uayma","ub","ubc","ubilio-garcia","ubiliogarcia","ubv","uc","uc-irvine","ucareo","uci","ucirvine","ucluelet","ucon","ucu","ucum","udc","udp","udsa","udt","ue","uf","ug","ugi","ugl","uh","uhland","uhmm","uhnh","uhra","uhrichsville","uhst","ui","uic","uintah","uj","ukiah","ukum","ukv","ul","ulysses","um","uman","umatilla","un","unadilla","unalaska","uncasville","underwood-petersville","underwoodpetersville","unicoi","unidad-acaquilpan","unidad-grajales-infonavit","unidad-minera-11-de-julio","unidad-san-miguel-jagueyes","unidadacaquilpan","unidades-habitacionales","unidadeshabitacionales","unidadgrajalesinfonavit","unidadhabitacional10deabril","unidadhabitacionalsantateresa","unidadminera11dejulio","unidadsanmigueljagueyes","unidos-avanzamos","unidosavanzamos","union","union-beach","union-buena-vista","union-buenavista","union-city","union-de-corrientes","union-de-san-antonio","union-de-tula","union-ejidal-tierra-y-libertad","union-gap","union-grove","union-hall","union-hidalgo","union-hill-novelty-hill","union-juarez","union-park","union-point","union-roja","union-springs","union-square","union-y-progreso","unionbeach","unionbuenavista","unioncity","uniondale","uniondecorrientes","uniondesanantonio","uniondetula","unionejidaltierraylibertad","uniongap","uniongrove","unionhall","unionhidalgo","unionhillnoveltyhill","unionjuarez","unionpark","unionpoint","unionport","unionroja","unionsprings","unionsquare","uniontown","unionville","unionyprogreso","united-states-virgin-islands","unitedstatesvirginislands","unity","universal-city","universalcity","university","university-center","university-city","university-gardens","university-heights","university-park","university-place","university-town-center","universitycenter","universitycity","universitygardens","universityheights","universitypark","universityplace","universitytowncenter","up","uphams-corner","uphamscorner","upland","upper-alton","upper-arlington","upper-bear-creek","upper-brookville","upper-fruitland","upper-grand-lagoon","upper-island-cove","upper-kalihi-valley","upper-lake","upper-manoa","upper-marlboro","upper-montclair","upper-nyack","upper-palolo","upper-pauoa","upper-pohatcong","upper-roxborough","upper-saddle-river","upper-saint-clair","upper-sandusky","upper-west-side","upperalton","upperarlington","upperbearcreek","upperbrookville","upperfruitland","uppergrandlagoon","upperislandcove","upperkalihivalley","upperlake","uppermanoa","uppermarlboro","uppermontclair","uppernyack","upperpalolo","upperpauoa","upperpohatcong","upperroxborough","uppersaddleriver","uppersaintclair","uppersandusky","upperwestside","upton","uptown","ur","urania","urbana","urbancrest","urbandale","urecho","uren","ures-municipality","uresmunicipality","uriangato","uricho","uripitio","urique","urireo","ursulo-galvan","ursulogalvan","uruachi","uruapan","uruetaro","us","usc","usipa","usmajac","usmj","uspero","usr","usvi","ut","utah","utc","utica","utqiagvik","uvalde","uvalde-estates","uvaldeestates","uws","uxbridge","uyp","uzeta","va","vac","vacaville","vadnais-heights","vadnaisheights","vado","vail","vails-gate","vailsgate","val-david","val-des-monts","val-des-sources","val-dor","val-morin","val-verde","val-verde-park","valadeces","valatie","valcourt","valdavid","valdeflores","valdese","valdesmonts","valdessources","valdez","valdor","valdosta","vale","valencia","valencia-de-cerro-gordo","valencia-west","valenciadecerrogordo","valencianita","valenciawest","valente-diaz","valentediaz","valentine","valhalla","valinda","valladolid","valle-de-banderas","valle-de-bravo","valle-de-guadalupe","valle-de-juarez","valle-de-lincoln","valle-de-santiago","valle-de-vaquerias","valle-de-vazquez","valle-de-zaragoza","valle-del-rio","valle-dorado-inn","valle-hermoso","valle-luz","valle-nacional","valle-verde","valle-vista","vallecillo","vallecitos-de-zaragoza","vallecitosdezaragoza","valledebanderas","valledebravo","valledeguadalupe","valledejuarez","valledelincoln","valledelrio","valledesantiago","valledevaquerias","valledevazquez","valledezaragoza","valledoradoinn","vallee-jonction","valleejonction","vallehermoso","vallejo","vallejo-porvenir-vallejo","vallejoporvenirvallejo","valleluz","vallenacional","valleverde","vallevista","valley","valley-center","valley-city","valley-cottage","valley-east","valley-falls","valley-glen","valley-grande","valley-green","valley-hill","valley-mills","valley-park","valley-springs","valley-station","valley-stream","valley-view","valleycenter","valleycity","valleycottage","valleyeast","valleyfalls","valleyglen","valleygrande","valleygreen","valleyhill","valleymills","valleypark","valleysprings","valleystation","valleystream","valleyview","valmeyer","valmorin","valparaiso","valrico","valtierrilla","valverde","valverdepark","vamo","vamos-tamaulipas","vamostamaulipas","van","van-alstyne","van-buren","van-horn","van-lear","van-meter","van-nest","van-nuys","van-vleck","van-wert","vanalstyne","vanburen","vance","vanceburg","vancleave","vancouver","vandalia","vandenberg-space-force-base","vandenberg-village","vandenbergspaceforcebase","vandenbergvillage","vander","vandercook-lake","vandercooklake","vandergrift","vanderhoof","vandiver","vanegas","vanhorn","vanier","vanlear","vanmeter","vannest","vannuys","vanvleck","vanwert","vaquerias","vardaman","vare-chiquichuca","varechiquichuca","varennes","vargas","varnell","varnville","vashon","vassalboro","vassar","vaudreuil-dorion","vaudreuildorion","vaughan","vauxhall","vb","vbs","vc","vcdh","vcpb","vd","vda","vdb","vdc","vdcg","vdcr","vdd","vde","vdf","vdg","vdgm","vdi","vdj","vdl","vdlf","vdll","vdln","vdlp","vdm","vdmf","vdn","vdo","vdr","vds","vdv","vdz","ve","veazie","vec","veedersburg","vega","vega-de-alatorre","vega-del-rosario","vega-del-sol","vegadealatorre","vegadelrosario","vegadelsol","vegasdelasoledadysoledaddos","vegreville","veinte-de-noviembre","veintedenoviembre","veintedenoviembresantalucia","veintidos-de-febrero","veintidosdefebrero","veintiuno-de-agosto","veintiunodeagosto","velardena","velda-village","velda-village-hills","veldavillage","veldavillagehills","velva","venado","venceremos","venecia","venersborg","veneta","venetian-village","venetianvillage","venice","venice-gardens","venicegardens","venise-en-quebec","veniseenquebec","venta-de-bravo","venta-de-ocotillos","venta-grande","ventadebravo","ventadeocotillos","ventagrande","ventana","ventnor-city","ventnorcity","ventoquipa","ventura","venus","venustiano-carranza","venustianocarranza","venustianocarranzapenablanca","veq","ver","veracruz","veracruzdeignaciodelallave","veradale","verapaz","vercheres","verde-village","verdevillage","verdi","verdigris","vergennes","vermilion","vermilion-on-the-lake","vermiliononthelake","vermillion","vermont","vermont-square","vermontsquare","vernal","vernon","vernon-center","vernon-hills","vernon-valley","vernoncenter","vernonhills","vernonia","vernonvalley","vero-beach","vero-beach-south","verobeach","verobeachsouth","verona","verona-walk","veronawalk","verplanck","versailles","vestal","vestavia-hills","vestaviahills","vetagrande","vevay","vez","vf","vff","vg","vgg","vggr","vgo","vgsj","vh","vhc","vhdn","vhec","vhlp","vi","vian","viborillas","vicam","vicente-camalote","vicente-guerrero","vicente-guerrero-san-javier","vicente-herrera","vicentecamalote","vicenteguerrero","vicenteguerrerosanjavier","vicenteherrera","vicksburg","victor","victor-rosales","victoria","victoria-de-cortazar","victoria-de-durango","victoria-village","victoriadecortazar","victoriadedurango","victoriavillage","victoriaville","victorrosales","victorville","victory-gardens","victory-lakes","victorygardens","victorylakes","vida-mejor-i","vidalia","vidamejori","vidor","viec","vienna","vienna-bend","viennabend","viera-east","viera-west","vieraeast","vierawest","viesca","view-park-windsor-hills","viewparkwindsorhills","viking","villa-aldama","villa-alta","villa-avila-camacho","villa-azueta","villa-chalcatongo-de-hidalgo","villa-comaltitlan","villa-corona","villa-corzo","villa-cuauhtemoc","villa-de-almoloya-de-juarez","villa-de-arista","villa-de-arriaga","villa-de-cos","villa-de-costa-rica","villa-de-etla","villa-de-garcia-marquez","villa-de-guadalupe","villa-de-la-paz","villa-de-las-flores","villa-de-los-ninos","villa-de-ramos","villa-de-reyes","villa-de-zaachila","villa-del-campo","villa-del-carbon","villa-del-prado-2da-seccion","villa-diaz-ordaz","villa-emiliano-zapata","villa-emilio-carranza","villa-garcia","villa-gonzalez-ortega","villa-gregorio-garcia","villa-grove","villa-guerrero","villa-hermosa","villa-hermosa-las-pozas","villa-hidalgo","villa-hidalgo-el-cubo","villa-hills","villa-independencia","villa-insurgentes-el-calabazal","villa-jimenez","villa-juarez","villa-la-venta","villa-las-esperanzas","villa-lazaro-cardenas","villa-luvianos","villa-madero","villa-magna","villa-mainero","villa-mariano-matamoros","villa-montemorelos","villa-morelos","villa-nicolas-bravo","villa-ocampo","villa-park","villa-pesqueira","villa-progreso","villa-rica","villa-ridge","villa-rotaria","villa-santiago","villa-sola-de-vega","villa-talea-de-castro","villa-tecolutilla","villa-tejupam-de-la-union","villa-union","villa-urbi-del-rey","villa-vicente-guerrero","villa-victoria","villa-zaragoza","villa-zempoala","villaaldama","villaalta","villaavilacamacho","villaazueta","villachalcatongodehidalgo","villachuato","villacomaltitlan","villacorona","villacorzo","villacuauhtemoc","villadealmoloyadejuarez","villadearista","villadearriaga","villadecos","villadecostarica","villadeelcarmentequexquitla","villadeetla","villadegarciamarquez","villadeguadalupe","villadelapaz","villadelasflores","villadelcampo","villadelcarbon","villadelosninos","villadelprado2daseccion","villaderamos","villadereyes","villadezaachila","villadiazordaz","villaemilianozapata","villaemiliocarranza","villaflores","villagarcia","village-green","village-green-green-ridge","village-of-campton-hills","village-of-oak-creek-big-park","village-of-the-branch","village-park","village-saint-george","village-shires","villagegreen","villagegreengreenridge","villageofcamptonhills","villageofoakcreekbigpark","villageofthebranch","villagepark","villages-of-oriole","villagesaintgeorge","villageshires","villagesoforiole","villagonzalezortega","villagran","villagregoriogarcia","villagrove","villaguerrero","villahermosa","villahermosa-yaluma","villahermosalaspozas","villahermosayaluma","villahidalgo","villahidalgoelcubo","villahills","villaindependencia","villainsurgenteselcalabazal","villajimenez","villajuarez","villalasesperanzas","villalaventa","villalazarocardenas","villaluvianos","villamadero","villamagna","villamainero","villamar","villamarianomatamoros","villamontemorelos","villamorelos","villanicolasbravo","villano-beach","villanobeach","villanueva","villaocampo","villapark","villapesqueira","villaprogreso","villarica","villaridge","villarotaria","villas","villas-de-alcala","villas-de-irapuato","villas-de-la-laguna","villas-de-la-loma","villas-del-campo","villasantiago","villasdealcala","villasdeirapuato","villasdelalaguna","villasdelaloma","villasdelcampo","villasoladevega","villataleadecastro","villatecolutilla","villatejupamdelaunion","villaunion","villaurbidelrey","villavicenteguerrero","villavictoria","villazaragoza","villazempoala","ville-marie","ville-platte","villemarie","villeplatte","villisca","vilonia","vinalhaven","vinas-del-sol","vinasdelsol","vincennes","vincent","vincentown","vinco","vine-grove","vine-hill","vinegrove","vinehill","vineland","vineyard","vineyard-haven","vineyardhaven","vineyards","vinings","vinita","vinita-park","vinitapark","vinton","viola","violet","virden","virgil","virginia","virginia-beach","virginia-city","virginia-gardens","virginiabeach","virginiacity","virginiagardens","virginias","viroqua","visalia","visitacion-valley","visitacionvalley","vista","vista-center","vista-hermosa","vista-hermosa-cuasinada","vista-hermosa-de-negrete","vista-santa-rosa","vistacenter","vistahermosa","vistahermosacuasinada","vistahermosadenegrete","vistasantarosa","vistasdelmagueyfraccionamiento","vistha","vito","viva-cardenas","viva-mexico","vivacardenas","vivamexico","vivian","vizarron","vj","vl","vlc","vle","vlv","vm","vmi","vmm","vn","vnb","vo","voch","volcano","volga","volney","volo","volusia","von-ormy","vonore","vonormy","voo","voorhees","voorheesville","votb","votl","vp","vpv","vpwh","vr","vs","vsdv","vsfb","vsg","vsr","vt","vtdc","vu","vudr","vulcan","vv","vvg","vvh","vvp","vw","vy","vz","wa","wabana","wabash","wabasha","wabasso-beach","wabassobeach","waco","waconia","wacousta","wade","wade-hampton","wadehampton","wadena","wadesboro","wading-river","wadingriver","wadley","wadsworth","wael","wafb","waggaman","wagner","wagoner","wahiawa","wahneta","wahoo","wahpeton","waialae-iki","waialae-kahala","waialae-nui-ridge-ainakoa","waialaeiki","waialaekahala","waialaenuiridgeainakoa","waialua","waianae","waihee-waiehu","waiheewaiehu","waikapu","waikiki","waikoloa","wailea","wailea-makena","waileamakena","wailua","wailua-homesteads","wailuahomesteads","wailuku","wailupe","waimalu","waimanalo","waimanalo-beach","waimanalobeach","waimea","wainaku","wainwright","waipahu","waipio","waipio-acres","waipioacres","waite-park","waitepark","waitsburg","wakarusa","wake-forest","wake-island","wake-village","wakeeney","wakefield","wakefield-peacedale","wakefieldpeacedale","wakeforest","wakeisland","wakeman","wakevillage","walbridge","walcott","walden","waldo","waldoboro","waldon","waldorf","waldport","waldron","waldwick","wales","walford","walhalla","walker","walker-mill","walkermill","walkersville","walkerton","walkertown","walla-walla","walla-walla-east","wallace","wallawalla","wallawallaeast","wallburg","walled-lake","walledlake","wallenpaupack-lake-estates","wallenpaupacklakeestates","waller","wallingford","wallingford-center","wallingfordcenter","wallington","wallis","wallkill","walls","walnut","walnut-cove","walnut-creek","walnut-grove","walnut-hill","walnut-hills","walnut-park","walnut-ridge","walnut-village","walnutcove","walnutcreek","walnutgrove","walnuthill","walnuthills","walnutpark","walnutport","walnutridge","walnutvillage","walpole","walpole-island","walpoleisland","walsenburg","walterboro","walters","walthall","waltham","walthourville","walton","walton-hills","walton-park","waltonhills","waltonpark","walworth","wamac","wamego","wampsville","wanakah","wanamassa","wanamingo","wanaque","wanatah","wanchese","wantagh","wapakoneta","wapato","wapello","wappingers-falls","wappingersfalls","ward","ward-village","warden","wardsville","wardvillage","ware","ware-shoals","wareham-center","warehamcenter","wareshoals","waretown","warm-beach","warm-mineral-springs","warm-springs","warman","warmbeach","warminster-heights","warminsterheights","warmmineralsprings","warmsprings","warner","warner-robins","warnerrobins","warr-acres","warracres","warren","warren-park","warren-township","warrenpark","warrensburg","warrensville-heights","warrensvilleheights","warrenton","warrentownship","warrenville","warrington","warrior","warroad","warsaw","warson-woods","warsonwoods","wartburg","warwick","wasaga-beach","wasagabeach","wasco","waseca","washburn","washington","washington-court-house","washington-heights","washington-mills","washington-park","washington-square","washington-terrace","washingtoncourthouse","washingtonheights","washingtonmills","washingtonpark","washingtonsquare","washingtonterrace","washingtonville","washoe","washougal","wasilla","waskaganish","waskom","waswanipi","watauga","watchtower","watchung","water-mill","water-valley","waterboro","waterbury","waterflow","waterford","waterfrontcommunitiestheisland","waterloo","waterman","watermill","watertown","watertown-square","watertownsquare","watervalley","waterville","watervliet","watford","watford-city","watfordcity","wathena","watkins-glen","watkinsglen","watkinsville","watonga","watrous","watseka","watson","watson-lake","watsonlake","watsontown","watsonville","watterson-park","wattersonpark","watts-mills","wattsmills","wattsville","wauchula","wauconda","waukee","waukegan","waukesha","waukomis","waukon","wauna","waunakee","waupaca","waupun","wauregan","waurika","wausau","wauseon","wautoma","wauwatosa","waveland","waverly","wawa","wawarsing","waxahachie","waxhaw","waycross","wayland","waymart","wayne","wayne-city","wayne-heights","waynecity","wayneheights","waynesboro","waynesburg","waynesville","wayzata","wb","wbl","wbs","wbt","wc","wcc","wch","wcm","wcr","wcs","wcti","wd","wdm","we","weare","weatherby-lake","weatherbylake","weatherford","weatherly","weatogue","weaver","weaverville","webb","webb-city","webbcity","webberville","weber-city","webercity","webster","webster-city","webster-groves","webster-springs","webstercity","webstergroves","webstersprings","wect","weddington","wedgefield","wedgewood","wedowee","weed","weedon-centre","weedoncentre","weedpatch","weedsport","weehawken","weeki-wachee-gardens","weekiwacheegardens","weeping-water","weepingwater","weigelstown","weimar","weirton","weirton-heights","weirtonheights","weiser","weissport-east","weissporteast","wekiwa-springs","wekiwasprings","welby","welch","welcome","welcome-beach","welcomebeach","weld","weldon","weldon-spring","weldonspring","welland","wellborn","wellesley","wellfleet","wellford","wellington","wellman","wells","wells-beach-station","wells-branch","wellsbeachstation","wellsboro","wellsbranch","wellsburg","wellston","wellsville","wellton","welsh","wembley","wenatchee","wendell","wendover","wenham","wenonah","wentworth","wentzville","wernersville","wescosville","weslaco","wesley-chapel","wesley-hills","wesleychapel","wesleyhills","wesleyville","wessington-springs","wessingtonsprings","wesson","west","west-albany","west-alexandria","west-allis","west-and-east-lealman","west-athens","west-babylon","west-baraboo","west-barnstable","west-bay-shore","west-belmar","west-bend","west-bishop","west-blocton","west-bloomfield-township","west-bountiful","west-boylston","west-bradenton","west-branch","west-brattleboro","west-bridgewater","west-brookfield","west-buechel","west-burlington","west-caldwell","west-cambridgeharvard-square","west-canton","west-cape-may","west-carrollton-city","west-carson","west-carthage","west-chatham","west-chester","west-chicago","west-clarkston-highland","west-columbia","west-concord","west-conshohocken","west-coon-rapids","west-covina","west-crossett","west-deland","west-dennis","west-des-moines","west-dundee","west-easton","west-elkridge","west-elmira","west-elsdon","west-end","west-end-cobb-town","west-englewood","west-fairview","west-falls-church","west-falmouth","west-fargo","west-fens","west-ferriday","west-fork","west-frankfort","west-freehold","west-garfield-park","west-gate","west-glendive","west-glens-falls","west-greenwich","west-grove","west-gulfport","west-hamburg","west-hammond","west-hartford","west-hattiesburg","west-haven","west-haven-sylvan","west-haverstraw","west-hazleton","west-helena","west-hempstead","west-henrietta","west-hill","west-hills","west-hollywood","west-homestead","west-humber-clairville","west-hurley","west-ishpeming","west-islip","west-jefferson","west-jordan","west-kelowna","west-kennebunk","west-kensington","west-kittanning","west-lafayette","west-lake-hills","west-lake-sammamish","west-lake-stevens","west-laurel","west-lawn","west-leechburg","west-liberty","west-linn","west-little-river","west-livingston","west-long-branch","west-longview","west-lorne","west-lynchburg","west-marion","west-mayfield","west-melbourne","west-memphis","west-menlo-park","west-miami","west-mifflin","west-milford","west-milton","west-milwaukee","west-modesto","west-monroe","west-mount-airy","west-mountain","west-new-york","west-newbury","west-newton","west-norriton","west-nyack","west-oak-lane","west-ocean-city","west-odessa","west-orange","west-palm-beach","west-paris","west-park","west-pasco","west-pensacola","west-peoria","west-perrine","west-pittston","west-plains","west-pleasant-view","west-point","west-portsmouth","west-puente-valley","west-raleigh","west-rancho-dominguez","west-reading","west-richland","west-ridge","west-roxbury","west-rutland","west-sacramento","west-saint-paul","west-salem","west-samoset","west-sand-lake","west-sayville","west-scarborough","west-sedona","west-seneca","west-sharyland","west-side-highway","west-simsbury","west-slope","west-somervilledavis-square","west-springfield","west-st-paul","west-stockbridge","west-swanzey","west-tawakoni","west-terre-haute","west-tisbury","west-torrington","west-town","west-union","west-unity","west-university-place","west-valley","west-valley-city","west-vancouver","west-vero-corridor","west-view","west-virginia","west-wareham","west-warrenton","west-warwick","west-wenatchee","west-wendover","west-whittier-los-nietos","west-wyoming","west-wyomissing","west-yarmouth","west-yellowstone","west-york","westalbany","westalexandria","westallis","westandeastlealman","westathens","westbabylon","westbaraboo","westbarnstable","westbayshore","westbelmar","westbend","westbishop","westblocton","westbloomfieldtownship","westborough","westbountiful","westboylston","westbradenton","westbranch","westbrattleboro","westbridgewater","westbrook","westbrook-center","westbrookcenter","westbrookfield","westbuechel","westburlington","westbury","westby","westcaldwell","westcambridgeharvardsquare","westcanton","westcapemay","westcarrolltoncity","westcarson","westcarthage","westchase","westchatham","westchester","westchicago","westclarkstonhighland","westcliffe","westcolumbia","westconcord","westconshohocken","westcoonrapids","westcovina","westcrossett","westdeland","westdennis","westdesmoines","westdundee","westeaston","westelkridge","westelmira","westelsdon","westend","westendcobbtown","westenglewood","westerleigh","westerly","western-lake","western-springs","westernlake","westernport","westernsprings","westerville","westfairview","westfallschurch","westfalmouth","westfargo","westfens","westferriday","westfield","westfield-center","westfieldcenter","westford","westfork","westfrankfort","westfreehold","westgarfieldpark","westgate","westglendive","westglensfalls","westgreenwich","westgrove","westgulfport","westhamburg","westhammond","westhampton","westhampton-beach","westhamptonbeach","westhartford","westhattiesburg","westhaven","westhaven-moonstone","westhavenmoonstone","westhavensylvan","westhaverstraw","westhazleton","westhelena","westhempstead","westhenrietta","westhill","westhills","westhollywood","westhomestead","westhumberclairville","westhurley","westishpeming","westislip","westjefferson","westjordan","westkelowna","westkennebunk","westkensington","westkittanning","westlafayette","westlake","westlake-village","westlakehills","westlakesammamish","westlakestevens","westlakevillage","westland","westlaurel","westlawn","westleechburg","westliberty","westlinn","westlittleriver","westlivingston","westlock","westlongbranch","westlongview","westlorne","westlynchburg","westmarion","westmayfield","westmelbourne","westmemphis","westmenlopark","westmere","westmiami","westmifflin","westmilford","westmilton","westmilwaukee","westminster","westminster-branson","westminsterbranson","westmodesto","westmonroe","westmont","westmoreland","westmorland","westmount","westmountain","westmountairy","westnewbury","westnewton","westnewyork","westnorriton","westnyack","westoaklane","westoceancity","westodessa","weston","weston-lakes","weston-mills","weston-pellam-park","westonlakes","westonmills","westonpellampark","westons-mills","westonsmills","westorange","westover","westpalmbeach","westparis","westpark","westpasco","westpensacola","westpeoria","westperrine","westphalia","westpittston","westplains","westpleasantview","westpoint","westport","westportsmouth","westpuentevalley","westraleigh","westranchodominguez","westreading","westrichland","westridge","westroxbury","westrutland","westsacramento","westsaintpaul","westsalem","westsamoset","westsandlake","westsayville","westscarborough","westsedona","westseneca","westsharyland","westsidehighway","westsimsbury","westslope","westsomervilledavissquare","westspringfield","weststockbridge","weststpaul","westswanzey","westtawakoni","westterrehaute","westtisbury","westtorrington","westtown","westunion","westunity","westuniversityplace","westvale","westvalley","westvalleycity","westvancouver","westverocorridor","westview","westville","westvirginia","westwareham","westwarrenton","westwarwick","westway","westwego","westwenatchee","westwendover","westwhittierlosnietos","westwood","westwood-lake","westwoodlake","westworth","westwyoming","westwyomissing","westyarmouth","westyellowstone","westyork","wetaskiwin","wetherington","wethersfield","wetumka","wetumpka","wewahitchka","weweantic","wewoka","wexfordmaryvale","weyauwega","weyburn","weyers-cave","weyerscave","weymontachie","weymouth","wf","wfc","wg","wgf","wgp","wh","wharton","whatcom","whately","whc","wheat-ridge","wheatland","wheatley-heights","wheatleyheights","wheaton","wheatridge","wheeler","wheelersburg","wheeling","whetstone","whippany","whiskey-creek","whiskeycreek","whispering-pines","whisperingpines","whistler","whitaker","white-bear-lake","white-bluff","white-castle","white-center","white-city","white-cloud","white-hall","white-haven","white-horse","white-house","white-island-shores","white-marsh","white-meadow-lake","white-mountain-lake","white-oak","white-pigeon","white-pine","white-plains","white-river","white-river-junction","white-rock","white-salmon","white-sands","white-settlement","white-sulphur-springs","whitebearlake","whitebluff","whitecastle","whitecenter","whitecity","whitecloud","whitecourt","whitefield","whitefish","whitefish-bay","whitefishbay","whitehall","whitehall-township","whitehalltownship","whitehaven","whitehorse","whitehouse","whitehouse-station","whitehousestation","whiteislandshores","whiteland","whiteman-air-force-base","whitemanairforcebase","whitemarsh","whitemarsh-island","whitemarshisland","whitemeadowlake","whitemountainlake","whiteoak","whitepigeon","whitepine","whiteplains","whiteriver","whiteriverjunction","whiterock","whitesalmon","whitesands","whitesboro","whitesboro-burleigh","whitesboroburleigh","whitesburg","whitesettlement","whitestone","whitestown","whitesulphursprings","whiteville","whitewater","whitewright","whitfield","whiting","whitinsville","whitley-city","whitleycity","whitman","whitmire","whitmore-lake","whitmore-village","whitmorelake","whitmorevillage","whitney","whittier","whittingham","whitwell","whs","wi","wibaux","wichita","wichita-falls","wichitafalls","wickenburg","wickerham-manor-fisher","wickerhammanorfisher","wickliffe","wiggins","wilber","wilberforce","wilbraham","wilburton","wild-peach-village","wild-rose","wilder","wilderness-rim","wildernessrim","wildomar","wildpeachvillage","wildrose","wildwood","wildwood-crest","wildwood-lake","wildwoodcrest","wildwoodlake","wiley-ford","wileyford","wilkes-barre","wilkesbarre","wilkesboro","wilkie","wilkinsburg","wilkinson-heights","wilkinsonheights","willacoochee","willamina","willard","willcox","williams","williams-bay","williams-lake","williamsbay","williamsburg","williamslake","williamson","williamsport","williamston","williamstown","williamsville","willimantic","willingboro","willis","williston","williston-highlands","williston-park","willistonhighlands","willistonpark","willits","willmar","willoughby","willoughby-hills","willoughbyhills","willow","willow-creek","willow-grove","willow-oak","willow-park","willow-springs","willow-street","willow-valley","willowbrook","willowcreek","willowdale","willowdale-east","willowdale-west","willowdaleeast","willowdalewest","willowgrove","willowick","willowoak","willowpark","willowridgemartingroverichview","willows","willowsprings","willowstreet","willowvalley","wills-point","willspoint","wilmer","wilmerding","wilmette","wilmington","wilmington-island","wilmington-manor","wilmingtonisland","wilmingtonmanor","wilmore","wilmot","wilson","wilson-conococheague","wilsonconococheague","wilsons-mills","wilsonsmills","wilsonville","wilton","wilton-manors","wiltonmanors","wimauma","wimberley","winamac","winchendon","winchester","winchester-center","winchester-park","winchestercenter","winchesterpark","wind-gap","wind-lake","wind-point","windber","windcrest","windemere","winder","windermere","windgap","windham","windlake","windom","window-rock","windowrock","windpoint","windsor","windsor-heights","windsor-locks","windsorheights","windsorlocks","windy-hills","windyhills","winfield","wingate","wingham","wink","winkler","winlock","winnebago","winneconne","winnemucca","winner","winnetka","winnett","winnfield","winnie","winnipeg","winnsboro","winnsboro-mills","winnsboromills","winona","winona-lake","winonalake","winooski","winslow","winsted","winston","winston-salem","winstonsalem","winter-beach","winter-garden","winter-gardens","winter-haven","winter-hill","winter-park","winter-springs","winterbeach","wintergarden","wintergardens","winterhaven","winterhill","winterpark","winterport","winters","winterset","wintersprings","wintersville","winterville","winthrop","winthrop-harbor","winthropharbor","winton","wis","wiscasset","wisconsin","wisconsin-dells","wisconsin-rapids","wisconsindells","wisconsinrapids","wise","wisner","wissinoming","wister","withamsville","wittenberg","wixom","wj","wk","wl","wlb","wle","wlh","wlr","wls","wm","wma","wmf","wml","wmp","wmr","wms","wn","wnra","wny","wo","woburn","woc","wofford-heights","woffordheights","wol","wolcott","wolcottville","wolf-creek","wolf-lake","wolf-point","wolf-trap","wolfcreek","wolfdale","wolfe-city","wolfeboro","wolfecity","wolfforth","wolfhurst","wolflake","wolfpoint","wolftrap","wolfville","wollochet","wolverine-lake","wolverinelake","womelsdorf","wonder-lake","wonderlake","wood-dale","wood-lynne","wood-ridge","wood-river","wood-village","woodacre","woodbine","woodbine-corridor","woodbine-lumsden","woodbinecorridor","woodbinelumsden","woodbourne","woodbranch","woodbridge","woodburn","woodbury","woodbury-center","woodbury-heights","woodburycenter","woodburyheights","woodcliff-lake","woodclifflake","woodcreek","woodcrest","wooddale","woodfield","woodfin","woodhaven","woodinville","woodlake","woodland","woodland-beach","woodland-heights","woodland-hills","woodland-park","woodlandbeach","woodlandheights","woodlandhills","woodlandpark","woodlawn","woodlawn-beach","woodlawnbeach","woodlyn","woodlynne","woodmere","woodmont","woodmoor","woodmore","woodridge","woodriver","woodrow","woodruff","woods-creek","woods-cross","woodsboro","woodscreek","woodscross","woodsfield","woodside","woodside-east","woodsideeast","woodson-terrace","woodsonterrace","woodstock","woodstown","woodsville","woodvillage","woodville","woodward","woodway","woodworth","woolwich","woonsocket","wooster","worcester","worden","worland","wormleysburg","worth","wortham","worthington","worthington-hills","worthingtonhills","woxall","wp","wpa","wpb","wpp","wpv","wr","wrangell","wray","wrd","wrens","wrentham","wright","wright-city","wright-patterson-afb","wrightcity","wrightpattersonafb","wrightsboro","wrightstown","wrightsville","wrightsville-beach","wrightsvillebeach","wrightwood","wrj","ws","wsca","wsh","wsl","wsp","wss","wt","wth","wu","wup","wurtland","wurtsboro","wv","wvc","ww","wwe","wwg","wwln","wy","wyandanch","wyandotte","wychwood","wyckoff","wykagyl","wyldwood","wylie","wymore","wynantskill","wyncote","wyndham","wyndmoor","wynne","wynnefield-heights","wynnefieldheights","wynnewood","wynyard","wyoming","wyomissing","wyomissing-hills","wyomissinghills","wytheville","x-cabil","x-can","x-hazil-sur","x-pichil","xaaga","xacaxomulco","xadani","xagacia","xalacapan-de-lucke","xalacapandelucke","xalapa-de-enriquez","xalapadeenriquez","xalatlaco","xalatzala","xalisco","xalitla","xalitzintla","xalostoc","xaloztoc","xalpatlahuac","xaltepec","xaltepuxtla","xaltianguis","xalticpac","xaltocan","xanaba","xaya","xayacatlan-de-bravo","xayacatlandebravo","xbacab","xc","xcabil","xcan","xcanatun","xcl","xdb","xdc","xde","xdj","xdl","xdmx","xdz","xeg","xenia","xh","xhazilsur","xhimojay","xhitey","xhixhata","xhs","xichu","xico","xicohtzinco","xicotencatl","xicotepec-de-juarez","xicotepecdejuarez","xicotlan","xilitla","xilocuautla","xiquila","xiteje-de-zapata","xitejedezapata","xitlama","xmaben","xoampolco","xocchel","xocen","xochapa","xochiapa","xochiapulco","xochiatipan-de-castillo","xochiatipandecastillo","xochicalco-cirenio-longares","xochicalcocireniolongares","xochicoatlan","xochicuautla","xochihuehuetlan","xochiltepec","xochimanca","xochimilco","xochinanacatlan","xochipala","xochistlahuaca","xochitepec","xochitlan","xochitlan-todos-santos","xochitlantodossantos","xochitlaxco-san-baltazar","xochitlaxcosanbaltazar","xochitonalco","xococapa","xoconoxtle-el-grande","xoconoxtleelgrande","xocotepec","xocotla","xocotlan","xocoyolzintla","xocoyucan","xohuayan","xoloateno","xolostitlademorelosxolostitla","xolotla","xometla","xonacatlan","xonalpu","xonocuautla","xopilapa","xoteapan","xoxocotla","xoxolpa","xoxonacatla","xp","xpichil","xpujil","xsb","xts","xuchapa","xul","xul-ha","xulha","yacolt","yadkinville","yaganiza","yago","yah","yahualica","yahualica-de-gonzalez-gallo","yahualicadegonzalezgallo","yajalon","yakima","yalaha","yale","yalina","yalkoba","yaltem","yamachiche","yamhill","yanceyville","yanga","yankton","yaonahuac","yaphank","yardley","yardville","yarmouth","yarmouth-port","yarmouthport","yarrow-point","yarrowpoint","yasha","yashanal","yates-center","yatescenter","yatzachi","yauhquemehcan","yautepec","yavapai","yavaros","yaxcaba","yaxcopoil","yaxe","yaxhachen","yaxkukul","yazoo-city","yazoocity","yb","yc","ydg","ydgg","ydj","ye","yeadon","yeagertown","yecapixteca","yecapixtla","yecora","yecuatla","yehualtepec","yellow-springs","yellowknife","yellowsprings","yellville","yelm","yerbabuena","yerington","yetla","yetla-de-juarez","yetladejuarez","yetlancingo","yextla","ygp","yh","yibeljoj","yl","yoakum","yobain","yoe","yokuts-valley","yokutsvalley","yolo","yolotepec","yoloxochitl","yoncalla","yonge-eglinton","yonge-stclair","yongeeglinton","yongestclair","yonkers","yopi","yorba-linda","yorbalinda","york","york-beach","york-harbor","york-university-heights","yorkbeach","yorkdale-glen-park","yorkdaleglenpark","yorketown","yorkharbor","yorklyn","yorkshire","yorkton","yorktown","yorktown-heights","yorktownheights","yorkuniversityheights","yorkville","yosemite-lakes","yosemite-valley","yosemitelakes","yosemitevalley","yoshib","yosphi","yotholin","young-america-historical","young-harris","youngamericahistorical","youngharris","youngstown","youngsville","youngtown","youngwood","yountville","yp","ypsilanti","yreka","ys","yt","yuba","yuba-city","yubacity","yuc","yucaipa","yucatan","yucca-valley","yuccavalley","yucuita","yucuyachi","yuh","yukon","yulee","yuma","yurecuaro","yuriria","yustis","yutan","yutanduchi-de-guerrero","yutanduchideguerrero","yv","zac","zacacoyuca","zacacuautla","zacalaca","zacamixtle","zacamulpa","zacamulpa-tlalmimilolpan","zacamulpatlalmimilolpan","zacango","zacaola","zacapala","zacapalco","zacapechpan","zacapoaxtla","zacapu","zacapuato","zacatal","zacate-colorado","zacatecas","zacatecolorado","zacatelco","zacatepec","zacatla","zacatlan","zacatonal-de-juarez","zacatonaldejuarez","zacatula","zacazonapan","zachary","zacoalco","zacoalpan","zacualpa","zacualpan","zacualpan-de-amilpas","zacualpandeamilpas","zacualtipan","zacualtipanito","zahuatlan-de-morelos-san-jose","zahuatlandemorelossanjose","zalamea","zamachihue","zamora","zamora-pico-de-oro","zamorano","zamorapicodeoro","zanesville","zangarro-zangarro-nuevo","zangarrozangarronuevo","zaniza","zapata","zapoapan","zapoapan-de-amapan","zapoapan-de-cabanas","zapoapandeamapan","zapoapandecabanas","zapopan","zapopan2","zapotan","zapotanito","zapote-de-barajas","zapote-de-cestao","zapote-de-palomas","zapote-de-peralta","zapotedebarajas","zapotedecestao","zapotedepalomas","zapotedeperalta","zapotillo-de-mogotes","zapotillodemogotes","zapotiltic","zapotitan-de-hidalgo","zapotitandehidalgo","zapotitlan","zapotitlan-de-vadillo","zapotitlan-lagunas","zapotitlan-palmas","zapotitlan-tablas","zapotitlandevadillo","zapotitlanlagunas","zapotitlanpalmas","zapotitlantablas","zapotlan","zapotlan-de-juarez","zapotlan-del-rey","zapotlandejuarez","zapotlandelrey","zapotlanejo","zapuyo","zaragoza","zaragoza-la-montana","zaragoza-puerto-de-medina","zaragozalamontana","zaragozapuertodemedina","zarzal","zautla","zc","zcsf","zda","zdb","zdc","zdg","zdh","zdj","zdl","zdlb","zdlc","zdm","zdp","zdr","zdv","zebulon","zeeland","zeigler","zelienople","zellwood","zelocotitlan","zempoala","zena","zentlalpan","zephyrhills","zephyrhills-north","zephyrhills-south","zephyrhills-west","zephyrhillsnorth","zephyrhillssouth","zephyrhillswest","zequentic","zicuicho","zicuiran","zihuateutla","zilacayotitlan","zillah","zilwaukee","zimapan","zimatepec","zimatlan-de-alvarez","zimatlandealvarez","zimmerman","zinacantan","zinacantepec","zinacatepec","zinaparo","zinapecuaro","zion","zionsville","zipiajo","ziquitaro","zirahuato-de-los-bernal","zirahuatodelosbernal","zirahuen","zirandaro-de-los-chavez","zirandarodeloschavez","zirimicuaro","zitlala","zitlaltepec","zizicazapa","zl","zlm","zn","zoatecpan","zocea","zocoteaca-de-leon","zocoteacadeleon","zoh-laguna","zohlaguna","zolfo-springs","zolfosprings","zolonquiapa","zona-urbana-ejidal","zona-urbana-ejido-isla-mujeres","zonaurbanaejidal","zonaurbanaejidoislamujeres","zongolica","zongozotla","zontecomatlandelopezyfuentes","zoogocho","zopoco","zoquiapa","zoquiapan","zoquiopan","zoquite","zoquitipan","zoquitlan","zothe","zotoltitlan","zotoluca","zoyatitla","zoyatlan","zoyatzingo","zoyotla","zozocolco-de-guerrero","zozocolco-de-hidalgo","zozocolcodeguerrero","zozocolcodehidalgo","zozutla","zp","zpdm","zpdo","zs","zt","zue","zula","zumbrota","zumpahuacan","zumpango","zumpango-del-rio","zumpangodelrio","zuni-pueblo","zunipueblo","zurumbeneo","zw","zwolle","zzn"];new Set(Lf);const Rf={name:"Public",secret:"8b3387e9c5cdea6ac9e5edbaa115cd72"},Nf=function(){const a="abcdefghijklmnopqrstuvwxyz0123456789",e=[];for(const n of a)e.push(n);for(const n of a)for(const o of a)e.push(n+o);for(const n of a)for(const o of a)for(const t of a)e.push(n+o+t);return e}(),If=["southbay","south-bay","bot","ventura","weather","wardrive","test","sbcountymesh","sb-county-mesh","sbcounty","sb-county","meshbud","mesh-bud","ai-bot","aibot","hdmesh","hd-mesh","hdme","hdme7","hdme7yard","hdmeyard","hdmeshtayrd","hdmestayrd","hdmestyard","hdmetayrd","hdmeshtnyard","mustard","socalmesh","socal-mesh","meshla","mesh-la","lamesh","la-mesh","westcoast","west-coast","wcmesh","wc-mesh","eastcoast","east-coast","midwest","southwest","northwest","northeast","southeast","california","cali","santaclarita","santa-clarita","scv","newhall","valencia","saugus","castaic","palmdale","lancaster","antelopevalley","antelope-valley","avmesh","av-mesh","highdesert","high-desert","mojave","victorville","hesperia","barstow","pomona","claremont","glendora","azusa","covina","westcovina","west-covina","walnut","diamondbar","diamond-bar","whittier","brea","yorbalinda","yorba-linda","montebello","montereypark","monterey-park","alhambra","arcadia","monrovia","duarte","hermosabeach","hermosa-beach","manhattanbeach","manhattan-beach","redondobeach","redondo-beach","palosverdes","palos-verdes","sanpedro","san-pedro","ojai","fillmore","santapaula","santa-paula","porthueneme","port-hueneme","general","public","main","default","chat","local","mesh","network","emergency","sos","help","news","info","status","alerts","announce","random","offtopic","off-topic","lobby","lounge","hangout","testing","dev","development","beta","alpha","experimental","personaltest","personal-test","mytest","my-test","testchannel","test-channel","meshcore","mesh-core","meshtastic","lora","lo-ra","lorawan","lora-wan","radio","ham","amateur","hamradio","ham-radio","amateurradio","repeater","repeaters","gateway","node","nodes","rf","rfmesh","offgrid","off-grid","prepper","preppers","emcomm","ares","races","socal","so-cal","southerncalifornia","southern-california","losangeles","los-angeles","la","laarea","la-area","greaterla","sfv","sfvalley","sf-valley","sanfernandovalley","san-fernando-valley","sanfernando","san-fernando","valley","thevalley","the-valley","westla","west-la","eastla","east-la","southla","south-la","dtla","downtown","downtownla","downtown-la","hollywood","beverlyhills","beverly-hills","santamonica","santa-monica","culvercity","culver-city","marinadelrey","marina-del-rey","longbeach","long-beach","torrance","carson","compton","inglewood","pasadena","glendale","burbank","noho","northhollywood","north-hollywood","encino","tarzana","woodland","woodlandhills","woodland-hills","calabasas","malibu","topanga","agoura","agourahills","agoura-hills","thousandoaks","thousand-oaks","simivalley","simi-valley","simi","venturacounty","ventura-county","oxnard","camarillo","moorpark","santabarbara","santa-barbara","sb","goleta","carpinteria","orangecounty","orange-county","oc","irvine","anaheim","fullerton","costamesa","costa-mesa","newportbeach","newport-beach","huntingtonbeach","inlandempire","inland-empire","ie","riverside","sanbernardino","san-bernardino","ontario","rancho","ranchocucamonga","rancho-cucamonga","fontana","corona","palmsprings","palm-springs","palmdesert","palm-desert","coachella","temecula","murrieta","hemet","perris","menifee","sandiego","san-diego","sd","sdmesh","sd-mesh","norcal","nor-cal","northerncalifornia","northern-california","bayarea","bay-area","sfbay","sf-bay","sfbayarea","sf-bay-area","sanfrancisco","san-francisco","sf","sfmesh","sf-mesh","oakland","berkeley","eastbay","east-bay","alameda","sanjose","san-jose","sj","southbay","south-bay","siliconvalley","silicon-valley","santaclara","santa-clara","sunnyvale","mountainview","mountain-view","paloalto","palo-alto","menlopark","menlo-park","redwoodcity","redwood-city","fremont","hayward","unioncity","union-city","newark","milpitas","santacruz","santa-cruz","watsonville","monterey","montereybay","monterey-bay","salinas","carmel","pacificgrove","pacific-grove","sacramento","sac","sactown","westsac","west-sac","roseville","folsom","fresno","bakersfield","stockton","modesto","visalia","seattle","seattlemesh","seattle-mesh","pnw","pacificnorthwest","pacific-northwest","portland","pdx","portlandmesh","portland-mesh","oregon","denver","denvermesh","denver-mesh","colorado","boulder","fortcollins","austin","austinmesh","austin-mesh","atx","texas","sanantonio","san-antonio","dallas","dfw","dallasmesh","dallas-mesh","fortworth","fort-worth","houston","houstonmesh","houston-mesh","htx","phoenix","phoenixmesh","phoenix-mesh","arizona","az","tucson","mesa","tempe","lasvegas","las-vegas","vegas","vegasmesh","vegas-mesh","nevada","henderson","saltlake","salt-lake","slc","saltlakecity","salt-lake-city","utah","chicago","chicagomesh","chicago-mesh","chitown","illinois","detroit","detroitmesh","detroit-mesh","michigan","annarbor","ann-arbor","minneapolis","twincities","twin-cities","minnesota","stpaul","st-paul","atlanta","atlantamesh","atlanta-mesh","atl","georgia","miami","miamimesh","miami-mesh","florida","tampa","orlando","jacksonville","boston","bostonmesh","boston-mesh","massachusetts","cambridge","newyork","new-york","nyc","nycmesh","nyc-mesh","brooklyn","manhattan","queens","newjersey","new-jersey","nj","jersey","philly","philadelphia","philadelphiamesh","philadelphia-mesh","pennsylvania","dc","washingtondc","washington-dc","dmv","nova","maryland","virginia","raleigh","durham","rdu","triangle","northcarolina","north-carolina","charlotte","clt","southcarolina","south-carolina","nashville","tennessee","memphis","knoxville","neworleans","new-orleans","nola","louisiana","hawaii","oahu","honolulu","maui","bigisland","big-island","alaska","anchorage","fairbanks","canada","toronto","vancouver","montreal","calgary","edmonton","ottawa","uk","london","manchester","birmingham","edinburgh","glasgow","bristol","germany","berlin","munich","hamburg","frankfurt","cologne","france","paris","lyon","marseille","spain","madrid","barcelona","italy","rome","milan","netherlands","amsterdam","rotterdam","australia","sydney","melbourne","brisbane","perth","adelaide","newzealand","new-zealand","auckland","wellington","japan","tokyo","osaka","kyoto","southkorea","south-korea","korea","seoul","taiwan","taipei","singapore","hongkong","hong-kong","india","mumbai","delhi","bangalore","brazil","saopaulo","sao-paulo","rio","mexico","mexicocity","mexico-city","guadalajara","tijuana","gps","location","tracking","tracker","position","coordinates","sensor","sensors","telemetry","data","iot","aprs","beacon","beacons","ping","pings","debug","admin","ops","operations","monitor","monitoring","security","secure","private","encrypted","hiking","camping","outdoors","outdoor","backcountry","trails","offroad","off-road","overlanding","jeep","offroading","sailing","boating","marine","maritime","aviation","flying","pilots","drone","drones","weather","wx","storm","storms","skywarn","traffic","commute","transit","community","group","team","club","family","friends","neighbors","neighborhood","block","street","local","town","city","county","region","north","south","east","west","central","downtown","uptown","midtown","home","house","cabin","ranch","farm","test1","test2","test3","test4","test5","channel1","channel2","channel3","mesh1","mesh2","mesh3","group1","group2","group3","team1","team2","team3","net1","net2","net3","relay","relays","link","links","hub","hubs","core","backbone","qso","ragchew","net","nets","roundtable","simplex","duplex","vhf","uhf","hf","2m","70cm","33cm","23cm","900mhz","915mhz","ism","ism-band","ism915","ism868","license-free","event","events","exercise","drill","training","practice","race","marathon","cycling","running","triathlon","ironman","festival","concert","gathering","meetup","meet-up","convention","hamfest","ham-fest","field-day","fieldday","winter-field-day","sota","pota","summits","parks","parks-on-the-air","2024","2025","2026","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec","winter","spring","summer","fall","autumn","mountain","mountains","hills","peak","summit","ridge","canyon","beach","coast","coastal","shore","bay","lake","river","creek","park","forest","woods","desert","island","peninsula","urban","suburban","rural","metro","area","zone","sector","base","mobile","portable","handheld","fixed","station","primary","secondary","backup","alternate","spare","alpha","bravo","charlie","delta","echo","foxtrot","red","blue","green","yellow","orange","purple","black","white","trace","traces","log","logs","metrics","stats","statistics","raw","stream","feed","live","realtime","real-time","sync","replication","mirror","copy","archive","open","closed","free","premium","pro","plus","lite","basic","new","old","legacy","current","next","future","one","two","three","four","five","six","seven","eight","nine","ten","hamradio","ham-radio","amateurradio","amateur-radio","arrl","dxcc","dxing","morsecode","morse-code","fldigi","js8call","winlink","vara","pactor","packet","ax25","aprsmesh","qrp","qro","qrz","qsl","qth","ragchew","rag-chew","elmer","elmers","technician","amateur","microwave","satellite","ariss","amsat","cubesat","sdr","rtlsdr","rtl-sdr","hackrf","portapack","yaesu","icom","kenwood","elecraft","flexradio","alinco","baofeng","quansheng","antennas","dipole","vertical","yagi","efhw","endfed","wwff","iota","contesting","cwops","auxcomm","satern","maker","makers","makerspace","maker-space","hackerspace","hacker-space","fablab","fab-lab","doityourself","homebrew","home-brew","fromscratch","arduino","esp32","esp8266","stm32","teensy","pico","rp2040","attiny","raspberrypi","raspberry-pi","rpi","beaglebone","beagle-bone","orangepi","orange-pi","kicad","eagle","altium","oshpark","jlcpcb","pcbway","soldering","throughhole","oscilloscope","multimeter","logicanalyzer","logic-analyzer","testbench","3dprinting","3d-printing","3dprint","printer","prusa","ender","creality","bambu","voron","lasercutter","laser-cutter","woodworking","metalworking","welding","resin","fdm","sla","fusion360","fusion-360","freecad","openscad","solidworks","programming","coding","software","developer","developers","devops","sysadmin","linux","unix","bsd","freebsd","openbsd","netbsd","macos","windows","android","ios","python","javascript","typescript","rust","golang","java","kotlin","swift","ruby","perl","csharp","dotnet","haskell","lisp","clojure","elixir","erlang","react","angular","svelte","nodejs","deno","nextjs","nuxt","docker","kubernetes","terraform","ansible","puppet","vagrant","github","gitlab","bitbucket","opensource","open-source","foss","floss","homelab","home-lab","selfhost","self-host","selfhosted","self-hosted","homelabbers","homeassistant","home-assistant","hass","openhab","domoticz","nodered","node-red","mqtt","zigbee","zwave","thread","wifi","bluetooth","rfid","infosec","cybersec","cybersecurity","cyber-security","netsec","opsec","hacking","hacker","hackers","pentest","pentesting","redteam","red-team","blueteam","blue-team","capture-the-flag","bugbounty","bug-bounty","vuln","exploit","malware","reverse","defcon","blackhat","bsides","shmoocon","derbycon","toorcon","hacktheplanet","lockpicking","locksport","toool","deviant","socialeng","social-eng","osint","privacy","anonymity","encryption","crypto","signal","hiking","hiker","hikers","backpacking","backpacker","thru-hike","thruhike","camper","campers","glamping","dispersed","primitive","wilderness","climbing","climber","climbers","rockclimbing","rock-climbing","bouldering","trad","sport","mountaineering","alpine","peaks","fourteeners","14ers","highpoints","skiing","skier","snowboard","snowboarder","backcountry-ski","touring","splitboard","kayak","kayaking","kayaker","canoe","canoeing","paddle","paddling","paddleboard","surfing","surfer","surfers","bodyboard","longboard","shortboard","waves","scuba","freedive","freediving","snorkel","underwater","spearfishing","fishing","angler","anglers","flyfishing","fly-fishing","trout","hunting","hunter","hunters","archery","bowhunting","bow-hunting","rifle","shotgun","cyclist","biking","bicycle","bicycling","roadbike","road-bike","mountainbike","mountain-bike","mountainbiking","mountain-biking","trailriding","ebike","e-bike","ebikes","electric-bike","peloton","strava","zwift","gravel","gravelbike","gravel-bike","bikepacking","bike-packing","randonneur","fixie","fixedgear","fixed-gear","singlespeed","single-speed","commuter","offroading","off-roading","fourwheeling","4wd","awd","jeeping","wrangler","gladiator","tacoma","runner","4runner","overland","overlander","rooftoptent","rooftop-tent","expedition","utv","sxs","sidebyside","side-by-side","rzr","canam","polaris","dirtbike","dirt-bike","motocross","enduro","dualsport","dual-sport","motorcycle","moto","harley","sportbike","cruiser","rving","motorhome","campervan","camper-van","vanlife","van-life","skoolie","trucker","trucking","diesel","semi","bigrig","big-rig","pilot","pilots","flying","flight","airplane","aircraft","planes","cessna","piper","cirrus","beechcraft","mooney","bonanza","skyhawk","helicopter","heli","rotor","rotorcraft","chopper","robinson","glider","gliding","soaring","sailplane","paraglider","paragliding","hangglider","drones","uav","uas","fpv","quadcopter","multirotor","mavic","phantom","rocketry","rockets","hpr","nar","tripoli","model-rocket","amateur-rocket","spacex","nasa","esa","starlink","starship","falcon","artemis","boat","boats","boater","boaters","yachting","yacht","sail","sailor","powerboat","speedboat","fishing-boat","pontoon","jetski","jet-ski","pwc","waverunner","marina","harbor","harbour","dock","pier","anchorage","mooring","liveaboard","cruising","bluewater","blue-water","inshore","intracoastal","marine-radio","marineradio","ais","chartplotter","navionics","opencpn","prepper","preppers","prepping","survival","survivalist","shtf","teotwawki","bol","bugout","bug-out","bugin","bug-in","edc","everyday-carry","loadout","firstaid","first-aid","trauma","tccc","stopthebleed","aed","waterpurification","water-purification","berkey","sawyer","lifestraw","foodstorage","food-storage","canning","dehydrating","freezedried","freeze-dried","battery","generator","inverter","offgrid","off-grid","griddown","grid-down","communications","gmrs","frs","murs","citizens-band","shortwave","homestead","homesteading","homesteader","farming","farmer","farmers","ranching","garden","gardening","gardener","permaculture","organic","regenerative","sustainable","chickens","poultry","goats","sheep","cattle","pigs","livestock","beekeeping","bees","apiary","greenhouse","hydroponics","aquaponics","vertical-farm","indoor-garden","growroom","grow-room","meteorology","stormchasing","storm-chasing","tornado","hurricane","earthquake","quake","seismic","tsunami","volcano","volcanic","geology","geologist","astronomy","stargazing","telescope","astrophotography","astrophoto","deepsky","deep-sky","citizen-science","citizenscience","research","science","stem","education","learning","gaming","gamer","gamers","videogames","video-games","pcgaming","pc-gaming","console","esports","e-sports","competitive","tournament","lan-party","retrogaming","minecraft","terraria","valheim","rust-game","dayz","tarkov","pubg","fortnite","apex","virtualreality","virtual-reality","augmentedreality","augmented-reality","oculus","tabletop","boardgames","board-games","dungeons-dragons","ttrpg","pathfinder","musician","musicians","bands","livemusic","live-music","concerts","guitar","guitarist","bassist","drums","drummer","keyboard","synth","synthesizer","production","producer","producers","beatmaking","beat-making","ableton","flstudio","audiophile","hifi","hi-fi","vinyl","records","turntable","headphones","speakers","podcast","podcasting","podcaster","streaming","streamer","twitch","youtube","content","photography","photographer","photographers","photog","cameras","dslr","mirrorless","canon","nikon","fuji","fujifilm","panasonic","olympus","leica","hasselblad","portrait","wildlife","macro","nightsky","night-sky","timelapse","videography","videographer","filmmaker","filmmaking","cinematography","editing","premiere","davinci","finalcut","final-cut","aftereffects","after-effects","vfx","artist","artists","artwork","creative","creatives","designer","designers","illustration","illustrator","drawing","sketch","sketching","digital-art","digitalart","graphicdesign","graphic-design","uiux","ui-ux","webdesign","web-design","animation","animator","motion","motiongraphics","motion-graphics","3dart","3d-art","blender","foodie","foodies","cooking","cooks","chef","chefs","culinary","kitchen","barbecue","grilling","smoking","smoker","brisket","ribs","pulled-pork","lownslow","baking","baker","sourdough","pastry","dessert","cakes","cookies","brewing","craft-beer","craftbeer","ipa","lager","stout","espresso","barista","roasting","whiskey","bourbon","cocktails","fitness","workout","lifting","weightlifting","powerlifting","bodybuilding","crossfit","hiit","cardio","runners","ultramarathon","triathlete","swimming","swimmer","openwater","open-water","yoga","pilates","meditation","mindfulness","wellness","nutrition","basketball","football","soccer","baseball","hockey","tennis","volleyball","dogs","puppy","puppies","canine","dogtraining","dog-training","cats","kitten","kittens","feline","meow","pets","animals","birding","birdwatching","bird-watching","aquarium","reeftank","reef-tank","saltwater","freshwater","planted-tank","reptiles","reptile","snakes","lizard","gecko","bearded-dragon","neighborhood","nextdoor","meet-up","volunteer","volunteering","nonprofit","non-profit","charity","mutual-aid","mutualaid","parents","parenting","families","children","youth","teens","seniors","lgbtq","pride","queer","nonbinary","ally","allies","inclusive","diversity","burningman","burning-man","playa","blackrock","coachella","sxsw","defcon","hope","layerone","layer-one","supercon","makerfaire","maker-faire","bamboozle","lightning","ragbrai","burnitdown","burning","regional","decomp","toorcamp","chaos","congress","hackathon","ctf-event","capture","wardriving","foxhunt","fox-hunt","brc","ttitd","center-camp","centercamp","esplanade","deep-playa","effigy","temple","soundcamp","sound-camp","mutant-vehicle","art-car","ranger","rangers","lamplighters","dgs","leave-no-trace","moop","gifting","radical-self","immediacy","participation","decommodification","overlandexpo","overland-expo","overlandtrail","overland-trail","overlandbound","overlandjournal","adventurebike","adventure-bike","dirtevery","rubicontrail","rubicon-trail","moab","deathvalley","death-valley","joshua-tree","joshuatree","bigbear","big-bear","mammoth","tahoe","yosemite","sequoia","kingscyn","kings-canyon","meshcore","mesh-core","meshcore-test","meshcore-dev","meshcore-beta","mctest","mc-test","mcdev","mc-dev","mcmain","mc-main","mcpublic","meshcorebot","meshcore-bot","mcbot","mc-bot","meshchat","mesh-chat","meshnet","mesh-net","meshnetwork","mesh-network","meshlink","mesh-link","meshhub","mesh-hub","meshnode","mesh-node","meshrelay","mesh-relay","meshgateway","mesh-gateway","meshbridge","mesh-bridge","meshrouter","meshtalk","mesh-talk","meshvoice","mesh-voice","meshdata","mesh-data","meshsensor","mesh-sensor","meshtrack","mesh-track","meshgps","mesh-gps","meshmap","mesh-map","meshstatus","mesh-status","meshping","mesh-ping","meshtest","mesh-test","meshtesting","mesh-testing","meshdev","mesh-dev","meshops","mesh-ops","meshadmin","mesh-admin","meshmon","mesh-mon","meshlog","mesh-log","meshdebug","mesh-debug","meshdiag","mesh-diag","meshcore-alpha","meshcore-stable","meshcore-main","meshcore-local","mc-alpha","mc-beta","mc-stable","mc-local","mc-ops","mc-admin","meshcoretest","meshcoredev","meshcorebeta","meshcorealpha","meshcoremain","meshcorelocal","meshcoreops","meshcoreadmin","meshcoremon","meshcorelog","meshcorechat","meshcorenet","meshcorelink","meshcorehub","meshcorenode","meshcorerelay","meshcoregateway","meshcorebridge","meshcorerouter","meshcoresensor","meshcoretrack","meshcoregps","meshcoremap","meshcoreping","mcnetwork","mc-network","mcchat","mc-chat","mclink","mc-link","mchub","mc-hub","mcnode","mc-node","mcrelay","mc-relay","mcgateway","mc-gateway","mcbridge","mc-bridge","mcrouter","mc-router","mcsensor","mc-sensor","mctrack","mc-track","mcgps","mc-gps","mcmap","mc-map","mcstatus","mc-status","mcping","mc-ping","mcmon","mc-mon","mclog","mc-log","mcdebug","mc-debug","mcdiag","mc-diag","meshroom","mesh-room","meshrooms","mesh-rooms","meshserver","mesh-server","meshclient","mesh-client","meshcompanion","mesh-companion","meshrepeater","mesh-repeater","meshbase","mesh-base","meshportal","mesh-portal","meshtastic","mesh-tastic","meshtastictest","meshtastic-test","meshtasticdev","meshtastic-dev","meshtasticlocal","meshtastic-local","mttest","mt-test","mtdev","mt-dev","mtlocal","mt-local","longfast","long-fast","longmod","long-mod","longslow","long-slow","shortfast","short-fast","shortslow","short-slow","medfast","med-fast","medslow","med-slow","verylongslow","very-long-slow","meshtastic-alpha","meshtastic-beta","meshtastic-main","meshtastic-stable","meshtasticbeta","meshtasticalpha","meshtasticmain","meshtasticstable","mtbeta","mt-beta","mtalpha","mt-alpha","mtmain","mt-main","mtstable","mt-stable","mtops","mt-ops","mtadmin","mt-admin","mtchat","mt-chat","mtnet","mt-net","mtlink","mt-link","mthub","mt-hub","mtnode","mt-node","mtrelay","mt-relay","longrange","long-range","shortrange","short-range","medrange","med-range","ultralong","ultra-long","ultrafast","ultra-fast","ultraslow","ultra-slow","mediumfast","medium-fast","mediumslow","medium-slow","mediummod","medium-mod","turbofast","turbo-fast","turboslow","turbo-slow","lora","lo-ra","lorawan","lora-wan","loratest","lora-test","loradev","lora-dev","loranet","lora-net","loramesh","lora-mesh","loralink","lora-link","lorahub","lora-hub","loranode","lora-node","lora915","lora-915","lora868","lora-868","lora433","lora-433","sx1262","sx1276","sx1278","semtech","chirp","chirpstack","lorabeta","lora-beta","loraalpha","lora-alpha","loramain","lora-main","lorastable","lora-stable","loraops","lora-ops","loraadmin","lora-admin","lorachat","lora-chat","lorarelay","lora-relay","loragateway","lora-gateway","lorabridge","lora-bridge","lorarouter","lora-router","loraserver","lora-server","lorasensor","lora-sensor","loratrack","lora-track","loragps","lora-gps","loramap","lora-map","lorastatus","lora-status","loraping","lora-ping","loramon","lora-mon","loralog","lora-log","loradebug","lora-debug","lora923","lora-923","lora865","lora-865","lora470","lora-470","sx1261","sx1280","sx1268","sx126x","sx127x","sx128x","llcc68","lr1110","lr1120","lr1121","stm32wl","ra01","ra02","heltec","heltec-lora","ttgo","ttgo-lora","lilygo","lilygo-lora","rak","rak-lora","rak4631","rak3172","rak811","wisblock","test","testing","test1","test2","test3","test123","testchannel","test-channel","testnet","test-net","testmesh","test-mesh","dev","devel","develop","development","devtest","dev-test","sandbox","playground","scratch","temp","temporary","tmp","debug","debugging","diag","diagnostic","diagnostics","alpha","beta","gamma","canary","nightly","unstable","stable","experiment","experimental","trial","pilot","prototype","poc","test4","test5","test6","test7","test8","test9","test10","test01","test02","test03","test-1","test-2","test-3","testA","testB","testC","test-a","test-b","test-c","testing1","testing2","testing3","testing-1","testing-2","testing-3","devnet","dev-net","devmesh","dev-mesh","devchannel","dev-channel","stagenet","stage-net","staging","stage","stagetest","stage-test","qanet","qa-net","qa","qatest","qa-test","qachannel","qa-channel","labnet","lab-net","lab","labtest","lab-test","testlab","test-lab","benchnet","bench-net","benchmark","bench","perftest","perf-test","loadtest","load-test","stresstest","stress-test","smoketest","smoke-test","unittest","unit-test","integtest","integ-test","e2etest","e2e-test","mocknet","mock-net","mock","faker","dummy","sample","example","demonet","demo-net","demo","showcase","preview","prerelease","pre-release","release","rc","release-candidate","releasecandidate","final","production","emergency","emergencies","emer","emerg","911","999","112","sos","mayday","help","rescue","distress","urgent","priority","alert","alerts","warning","warnings","alarm","alarms","safety","safe","danger","hazard","caution","critical","evacuation","evac","evacuate","shelter","shelterinplace","shelter-in-place","lockdown","allclear","all-clear","fire","fires","wildfire","wildfires","brushfire","forestfire","flood","floods","flooding","flashflood","flash-flood","quake","earthquake","aftershock","tsunami","tremor","tornado","hurricane","cyclone","typhoon","storm","severe","missing","missingperson","missing-person","amber","silveralert","medical","medic","ems","ambulance","paramedic","firstaid","first-aid","police","sheriff","lawenforcement","law-enforcement","cert","cert-team","certteam","voad","redcross","red-cross","emergencynet","emergency-net","emergencychannel","emergency-channel","emeralert","emer-alert","sosnet","sos-net","soschannel","sos-channel","maydaynet","mayday-net","maydaychannel","mayday-channel","helpnet","help-net","helpchannel","help-channel","helpline","help-line","rescuenet","rescue-net","rescuechannel","rescue-channel","rescueteam","rescue-team","disaster","disasters","disasternet","disaster-net","disasterrelief","disaster-relief","crisis","crisisnet","crisis-net","crisischannel","crisis-channel","incident","incidentnet","incident-net","incidentchannel","incident-channel","alertnet","alert-net","alertchannel","alert-channel","alertsystem","alert-system","warningnet","warning-net","warningchannel","warning-channel","safetynet","safety-net","safetychannel","safety-channel","safetycheck","safety-check","hazardnet","hazard-net","hazardchannel","hazard-channel","hazmat","haz-mat","firenet","fire-net","firechannel","fire-channel","firefighter","fire-fighter","firedept","fire-dept","firehouse","fire-house","firestation","fire-station","wildfirenet","wildfire-net","wildfirechannel","wildfire-channel","campfire","camp-fire","structurefire","structure-fire","grassfire","grass-fire","floodnet","flood-net","floodchannel","flood-channel","floodwatch","flood-watch","floodwarning","flood-warning","highwater","high-water","risingwater","rising-water","earthquakenet","earthquake-net","earthquakechannel","earthquake-channel","tornadonet","tornado-net","tornadochannel","tornado-channel","hurricanenet","hurricane-net","hurricanechannel","hurricane-channel","stormnet","storm-net","stormchannel","storm-channel","severeweather","severe-weather","medicalnet","medical-net","medicalchannel","medical-channel","traumanet","trauma-net","traumachannel","trauma-channel","traumacenter","trauma-center","hospital","hospitals","clinic","clinics","urgent-care","urgentcare","poisoncontrol","poison-control","cpr-net","cprnet","lifesaver","life-saver","searchandrescue","search-and-rescue","sar","sarnet","sar-net","sarteam","sar-team","coastguard","coast-guard","uscg","lifeguard","life-guard","beachpatrol","beach-patrol","mountainrescue","mountain-rescue","caverescue","cave-rescue","swiftwater","swift-water","k9unit","k9-unit","searchdog","search-dog","rescuedog","rescue-dog","civildefense","civil-defense","fema","dhs","oem","eoc","eocnet","eoc-net","weather","wx","wxalert","wx-alert","wxwatch","wx-watch","wxwarning","wx-warning","wxreport","wx-report","wxupdate","wx-update","forecast","conditions","climate","temperature","temp","temps","rain","rainfall","precipitation","precip","snow","snowfall","wind","winds","windy","gust","gusts","breeze","humidity","humid","dewpoint","dew-point","barometer","pressure","sunny","cloudy","overcast","fog","foggy","mist","haze","smog","heat","heatwave","heat-wave","cold","coldsnap","cold-snap","freeze","lightning","thunder","thunderstorm","tstorm","t-storm","hail","sleet","ice","icy","blackice","black-ice","frost","noaa","nws","skywarn","spotter","spotters","stormspotter","weathernet","weather-net","weatherchannel","weather-channel","wxnet","wx-net","wxchannel","wx-channel","wxstation","wx-station","forecastnet","forecast-net","forecastchannel","forecast-channel","localwx","local-wx","localweather","local-weather","dailywx","daily-wx","hourlywx","hourly-wx","weeklyforecast","weekly-forecast","rainnet","rain-net","rainchannel","rain-channel","rainalert","rain-alert","rainwatch","rain-watch","rainwarning","rain-warning","heavyrain","heavy-rain","snownet","snow-net","snowchannel","snow-channel","snowalert","snow-alert","snowwatch","snow-watch","snowwarning","snow-warning","heavysnow","heavy-snow","blizzard","blizzardwatch","blizzard-watch","blizzardwarning","blizzard-warning","windnet","wind-net","windchannel","wind-channel","windalert","wind-alert","windwatch","wind-watch","windwarning","wind-warning","highwind","high-wind","tempnet","temp-net","tempchannel","temp-channel","tempalert","temp-alert","heatnet","heat-net","heatchannel","heat-channel","heatalert","heat-alert","heatwatch","heat-watch","heatwarning","heat-warning","extremeheat","extreme-heat","coldnet","cold-net","coldchannel","cold-channel","coldalert","cold-alert","coldwatch","cold-watch","coldwarning","cold-warning","extremecold","extreme-cold","winterstorm","winter-storm","icestorm","ice-storm","freezingrain","freezing-rain","thunderstormnet","thunderstorm-net","thunderstormwatch","thunderstorm-watch","thunderstormwarning","thunderstorm-warning","severethunderstorm","severe-thunderstorm","lightningnet","lightning-net","lightningchannel","lightning-channel","lightningalert","lightning-alert","lightningwatch","lightning-watch","tornadowatch","tornado-watch","tornadowarning","tornado-warning","hurricanewatch","hurricane-watch","hurricanewarning","hurricane-warning","tropicalstorm","tropical-storm","tropicaldepression","tropical-depression","stormwatch","storm-watch","stormwarning","storm-warning","stormalert","storm-alert","skywarnnet","skywarn-net","skywarnchannel","skywarn-channel","spotternetwork","spotter-network","stormchase","storm-chase","stormchaser","storm-chaser","amateurwx","amateur-wx","citizenwx","citizen-wx","pwswx","pws-wx","weatherstation","weather-station","wxstation","wx-station","metar","taf","status","stat","stats","statistics","metrics","health","healthcheck","monitor","monitoring","mon","watch","watcher","watchdog","uptime","downtime","outage","outages","incident","incidents","report","reports","reporting","update","updates","bulletin","announce","announcement","announcements","broadcast","broadcasts","notify","notification","notifications","ping","pong","heartbeat","check","checkin","check-in","checkout","check-out","rollcall","roll-call","statusnet","status-net","statuschannel","status-channel","statusupdate","status-update","statusreport","status-report","statuscheck","status-check","statusboard","status-board","monitornet","monitor-net","monitorchannel","monitor-channel","monitoringnet","monitoring-net","monitoringchannel","monitoring-channel","watchnet","watch-net","watchchannel","watch-channel","watchlist","watch-list","healthnet","health-net","healthchannel","health-channel","healthstatus","health-status","uptimenet","uptime-net","uptimechannel","uptime-channel","uptimemonitor","uptime-monitor","outagenet","outage-net","outagechannel","outage-channel","outagereport","outage-report","incidentnet","incident-net","incidentchannel","incident-channel","incidentreport","incident-report","incidentresponse","incident-response","alertsnet","alerts-net","alertschannel","alerts-channel","updatenet","update-net","updatechannel","update-channel","updatefeed","update-feed","bulletinnet","bulletin-net","bulletinchannel","bulletin-channel","bulletinboard","bulletin-board","noticeboard","notice-board","announcenet","announce-net","announcechannel","announce-channel","broadcastnet","broadcast-net","broadcastchannel","broadcast-channel","notifynet","notify-net","notifychannel","notify-channel","pingnet","ping-net","pingchannel","ping-channel","pingtest","ping-test","heartbeatnet","heartbeat-net","heartbeatchannel","heartbeat-channel","rollcallnet","rollcall-net","rollcallchannel","rollcall-channel","checkinnet","checkin-net","checkinchannel","checkin-channel","headcount","head-count","accountability","welfare","wellbeing","well-being","ops","operations","opsnet","ops-net","opschannel","ops-channel","admin","admins","administrator","root","superuser","sudo","control","command","cmd","hq","headquarters","base","basecamp","dispatch","dispatcher","coord","coordinate","coordination","tactical","tac","tacnet","tac-net","tacchannel","tac-channel","logistics","logi","supply","supplies","resource","resources","comms","comm","communications","radio","radionet","radio-net","opsteam","ops-team","opsgroup","ops-group","opscenter","ops-center","opsroom","ops-room","opsdesk","ops-desk","opslead","ops-lead","adminnet","admin-net","adminchannel","admin-channel","adminteam","admin-team","adminops","admin-ops","admingroup","admin-group","admindesk","admin-desk","controlnet","control-net","controlchannel","control-channel","controlroom","control-room","controlcenter","control-center","commandnet","command-net","commandchannel","command-channel","commandpost","command-post","commandcenter","command-center","hqnet","hq-net","hqchannel","hq-channel","hqops","hq-ops","dispatchnet","dispatch-net","dispatchchannel","dispatch-channel","dispatchcenter","dispatch-center","dispatchdesk","dispatch-desk","coordnet","coord-net","coordchannel","coord-channel","coordteam","coord-team","coordcenter","coord-center","coordinationcenter","coordination-center","tacops","tac-ops","tacteam","tac-team","tacgroup","tac-group","taccom","tac-com","taccomms","tac-comms","tacradio","tac-radio","logisticsnet","logistics-net","logisticschannel","logistics-channel","logisticsteam","logistics-team","logisticsops","logistics-ops","supplynet","supply-net","supplychannel","supply-channel","supplychain","supply-chain","resourcenet","resource-net","resourcechannel","resource-channel","commsnet","comms-net","commschannel","comms-channel","commsteam","comms-team","commsops","comms-ops","commscheck","comms-check","commstest","comms-test","radioops","radio-ops","radioteam","radio-team","radiocheck","radio-check","netcontrol","net-control","netops","net-ops","noc","nocnet","noc-net","info","information","infochannel","info-channel","fyi","news","newsfeed","news-feed","headlines","breaking","latest","traffic","trafficreport","traffic-report","roadconditions","road-conditions","transit","bus","train","subway","metro","commute","commuter","events","calendar","schedule","agenda","upcoming","whats-on","infonet","info-net","infohub","info-hub","infodesk","info-desk","infoboard","info-board","infopoint","info-point","infoline","info-line","newsnet","news-net","newschannel","news-channel","newshub","news-hub","newsdesk","news-desk","newsroom","news-room","newsflash","news-flash","breakingnews","breaking-news","latestnews","latest-news","topnews","top-news","localnews","local-news","regionalnews","regional-news","worldnews","world-news","trafficnet","traffic-net","trafficchannel","traffic-channel","trafficupdate","traffic-update","trafficalert","traffic-alert","roadnet","road-net","roadchannel","road-channel","roadupdate","road-update","transitnet","transit-net","transitchannel","transit-channel","transitupdate","transit-update","transitalert","transit-alert","busnet","bus-net","buschannel","bus-channel","busupdate","bus-update","trainnet","train-net","trainchannel","train-channel","trainupdate","train-update","subwaynet","subway-net","subwaychannel","subway-channel","metronet","metro-net","metrochannel","metro-channel","metroupdate","metro-update","commuternet","commuter-net","commuterchannel","commuter-channel","eventsnet","events-net","eventschannel","events-channel","eventshub","events-hub","eventcalendar","event-calendar","localevents","local-events","calendarnet","calendar-net","calendarchannel","calendar-channel","schedulenet","schedule-net","schedulechannel","schedule-channel","agendanet","agenda-net","agendachannel","agenda-channel","upcomingnet","upcoming-net","upcomingchannel","upcoming-channel","location","locations","gps","position","positions","coordinates","track","tracker","tracking","trace","tracer","tracing","beacon","beacons","waypoint","waypoints","checkpoint","checkpoints","geofence","geolocation","geo","mapping","maps","navigate","navigation","locationnet","location-net","locationchannel","location-channel","locationtrack","location-track","locationshare","location-share","gpsnet","gps-net","gpschannel","gps-channel","gpstrack","gps-track","gpsshare","gps-share","gpslog","gps-log","gpsdata","gps-data","positionnet","position-net","positionchannel","position-channel","positiontrack","position-track","positionshare","position-share","coordnet","coord-net","coordchannel","coord-channel","coordshare","coord-share","tracknet","track-net","trackchannel","track-channel","trackshare","track-share","trackingnet","tracking-net","trackingchannel","tracking-channel","tracernet","tracer-net","tracerchannel","tracer-channel","beaconnet","beacon-net","beaconchannel","beacon-channel","beacontrack","beacon-track","beaconshare","beacon-share","waypointnet","waypoint-net","waypointchannel","waypoint-channel","waypointshare","waypoint-share","waypointlog","waypoint-log","checkpointnet","checkpoint-net","checkpointchannel","checkpoint-channel","geofencenet","geofence-net","geofencechannel","geofence-channel","geofencealert","geofence-alert","geozonenet","geozone-net","geonet","geo-net","geochannel","geo-channel","geotrack","geo-track","mappingnet","mapping-net","mappingchannel","mapping-channel","mapnet","map-net","mapchannel","map-channel","mapshare","map-share","navnet","nav-net","navchannel","nav-channel","navtrack","nav-track","navigationnet","navigation-net","navigationchannel","navigation-channel","fleettrack","fleet-track","fleetnet","fleet-net","assettrack","asset-track","whereis","where-is","findme","find-me","locateme","locate-me","nocap","no-cap","frfr","fr-fr","bussin","sheesh","slay","slaps","goated","goat","goats","based","cringe","mid","lowkey","highkey","vibe","vibes","vibing","vibecheck","vibe-check","goodvibes","good-vibes","sus","sussy","sussy-baka","imposter","amongus","among-us","bet","bets","yeet","yeeted","yoink","skibidi","rizz","ohio","bruh","bruv","fam","bestie","besties","squad","squadgoals","squad-goals","slayyy","periodt","purr","queen","king","icon","iconic","legend","main-character","maincharacter","npc","npcs","side-quest","sidequest","understood-the-assignment","ate","served","mother","mothering","rent-free","rentfree","living-rent-free","touch-grass","touchgrass","copium","hopium","doom","doomer","bloomer","zoomer","zoomers","ratio","ratiod","caught-in-4k","receipts","tea","spillthetea","spill-the-tea","simp","simping","stan","stanning","oomf","moots","mutuals","tiktok","fyp","foryou","for-you","foryoupage","trending","viral","cheugy","basic","pick-me","pickme","girlboss","girl-boss","iykyk","iyky","ifykyk","valid","hits-different","hitsdifferent","unhinged","chaotic","feral","unalive","delulu","delusion","bereal","be-real","dump","photodump","photo-dump","core","coded","aesthetic","cottagecore","darkacademia","dark-academia","goblinmode","goblin-mode","softlaunch","soft-launch","hardlaunch","hard-launch","ngl","tbh","ong","on-god","ongod","deadass","dead-ass","fr","real","cap","capping","no-cap-fr","nocapfr","respectfully","allegedly","understood","assignment","ate-that","atethat","devoured","cleared","snatched","slayed","bodied","ended","finished","done","over","deceased","screaming","crying","sobbing","im-weak","imweak","sending-me","sendingme","its-giving","itsgiving","giving","serve","serving","ate-left-no-crumbs","main","protagonist","background-character","backgroundcharacter","side-character","sidecharacter","villain-era","villainera","redemption-arc","character-development","characterdevelopment","plot-twist","plottwist","lore","lore-drop","loredrop","deep-lore","deeplore","canon","fanon","ick","icks","red-flag","redflag","green-flag","greenflag","beige-flag","situationship","talking-stage","talkingstage","roster","rotation","era","eras","villain-arc","healing-era","flop-era","flopping","ate-and-left","understood-assignment","no-thoughts","nothoughts","brain-rot","brainrot","rotted","chronically-online","chronicallyonline","parasocial","hyperfixation","hyperfixating","special-interest","infodump","info-dump","infodumping","yapping","yap","yapper","glazing","glaze","glazer","meat-riding","meatriding","dickriding","aura","aura-points","aurapoints","negative-aura","positiveaura","sigma","sigma-grindset","sigmagrindset","alpha","beta","omega","mewing","mew","looksmax","looksmaxxing","mogging","mog","mogger","gyat","gyatt","bussin-bussin","respectfully-disrespectfully","real-ones","realones","day-ones","dayones","ride-or-die","rideordie","caught-lacking","caughtlacking","down-bad","downbad","down-tremendous","downhorrendous","down-horrendous","astronomically-down","abysmal","its-joever","joever","its-so-over","we-are-so-back","weareback","lock-in","lockin","locked-in","lockedin","locked-tf-in","cooked","cooking","cookin","chef","michelin","gourmet","fr-ong","frong","no-diddy","nodiddy","pause","unpause","resume","edging","edged","gooning","gooned","fanum-tax","fanumtax","hawk-tuah","hawktuah","kai-cenat","speed","ishowspeed","prime","adulting","adult","grown","grownup","grown-up","oldmillennial","avocadotoast","avocado-toast","brunch","brunching","mimosas","doggo","doggie","pupper","puppers","floof","chonk","chonky","birb","smol","smoll","smolbean","smol-bean","boop","snoot","blep","mlem","feels","allthefeels","all-the-feels","rightinthefeels","right-in-the-feels","mood","bigmood","big-mood","sadboi","sad-boi","sadgirl","sad-girl","aesthetic","vsco","vsco-girl","vscogirl","sksksk","andioop","and-i-oop","netflix","netflixandchill","netflix-and-chill","binge","bingewatch","throwback","tbt","throwbackthursday","throwback-thursday","flashback","nostalgia","nostalgic","90skid","90s-kid","80skid","80s-kid","pokemon","pikachu","nintendo","zelda","mario","sonic","sega","harrypotter","harry-potter","hogwarts","hufflepuff","gryffindor","slytherin","ravenclaw","muggle","potterhead","potter-head","starwars","star-wars","jedi","sith","mandalorian","mando","yoda","marvel","mcu","avengers","thanos","ironman","iron-man","spiderman","lotr","lordoftherings","lord-of-the-rings","hobbit","gandalf","frodo","gameofthrones","game-of-thrones","got","thrones","winteriscoming","nailed-it","nailedit","winning","fail","fails","epic","epicfail","fml","yolo","swag","swagger","legit","literally","literally-cant","cant-even","canteven","dying","dead","imdead","im-dead","deceased","goals","lifegoals","life-goals","relationshipgoals","relationship-goals","bae","babe","babes","hubby","wifey","fiance","soulmate","soul-mate","foodporn","food-porn","foodie","nomnom","nom-nom","yummy","delish","wanderlust","travelbug","travel-bug","jetset","jet-set","jetsetter","selfie","selfies","selfietime","selfie-time","groupie","photobomb","blessed","grateful","thankful","humbled","mindblown","mind-blown","extra","salty","shook","triggered","woke","cancelled","cancel","ghosting","ghosted","ghost","friendzone","friend-zone","friendzoned","shade","throwing-shade","tea","spill","spilltea","spill-tea","savage","clap-back","clapback","drag","dragged","read","receipts","tfw","mfw","mrw","dae","eli5","tldr","tl-dr","ama","iama","reddit","redditor","upvote","downvote","karma","cakeday","cake-day","meme","memes","dank","dankmemes","dank-memes","memelord","meme-lord","oldmillenial","xennial","geriatricmillennial","geriatric-millennial","youngmillennial","young-millennial","eldermillennial","elder-millennial","millennialproblems","millennial-problems","millenniallife","millennial-life","firstworldproblems","first-world-problems","struggle","struggles","thestruggle","broke","brokemillennial","broke-millennial","studentloans","student-loans","sidehustle","side-hustle","hustleculture","hustle-culture","grind","grinding","worklifebalance","work-life-balance","burnout","burn-out","selfcare","self-care","treatyoself","treat-yo-self","treatyourself","indulgence","splurge","athleisure","leggings","yoga","yogapants","yoga-pants","pilates","kale","quinoa","acai","matcha","oatmilk","oat-milk","plantbased","plant-based","glutenfree","gluten-free","organic","nongmo","non-gmo","farmtotable","farm-to-table","craftbeer","craft-beer","craftcocktails","craft-cocktails","speakeasy","rooftopbar","rooftop-bar","happyhour","happy-hour","winenight","wine-night","tacotuesday","taco-tuesday","pizzanight","pizza-night","takeout","take-out","doordash","ubereats","uber-eats","grubhub","postmates","instacart","plantmom","plant-mom","plantdad","plant-dad","plantparent","plant-parent","crazycatlady","crazy-cat-lady","dogmom","dog-mom","dogdad","dog-dad","furbaby","fur-baby","furbabies","rescuedog","rescue-dog","adoptdontshop","engagement","engaged","shesaidyes","she-said-yes","weddingplanning","wedding-planning","bridesquad","bride-squad","groomsmen","bachelorette","bachelor","honeymoon","firsthome","first-home","homeowner","home-owner","housegoals","house-goals","diy","diyer","fixer-upper","fixerupper","hgtv","pinterestfail","pinterest-fail","netflix-queue","netflixqueue","bingeing","binge-watching","streamingwars","truecrimeobsessed","true-crime-obsessed","truecrime","true-crime","murderino","podcastaddict","podcast-addict","serialpodcast","serial-podcast","officelife","office-life","corporatelife","corporate-life","cubicle","openoffice","slack","slackchannel","slack-channel","zoomlife","zoom-life","zoommeetings","wfh","workfromhome","work-from-home","remotework","remote-work","hybridwork","quietquitting","quiet-quitting","thegreatresignation","thegreatreshuffling","sundayscaries","sunday-scaries","mondaymotivation","monday-motivation","humpday","hump-day","tgif","fridayfeeling","friday-feeling","fridayvibes","itstheweekend","weekendvibes","weekend-vibes","weekendmode","weekend-mode","lol","lmao","lmfao","rofl","roflmao","omg","wtf","ftw","smh","tbh","icymi","fomo","jomo","fwiw","imho","imo","brb","gtg","ttyl","nbd","idk","idgaf","stfu","nsfw","tmi","btw","afaik","iirc","ymmv","ianal","whatever","whatev","whatevs","meh","blah","ugh","duh","psych","noway","no-way","asif","as-if","getreal","get-real","talktotheh","talk-to-the-hand","nottt","not","sike","syke","psyche","gnarly","rad","radical","tubular","bodacious","righteous","excellent","bogus","heinous","grody","gag-me","gagme","barf","barfbag","gross","dude","dudes","dudette","bro","bros","broski","homie","homies","homes","peeps","posse","crew","gang","clique","tribe","chill","chillax","chillaxin","chilling","chillin","kickin","kickback","kick-back","hangout","hang-out","hangtime","hang-time","couch","couchpotato","couch-potato","vegging","veggingout","vegging-out","slacker","slackers","slack","slacking","procrastinate","procrastinating","grunge","grungy","alternative","alt","indie","underground","mtv","vh1","headbangers","headbanging","moshing","moshpit","mosh-pit","nirvana","cobain","soundgarden","pearljam","pearl-jam","aliceinchains","beavis","butthead","beavisandbutthead","daria","simpsons","bartman","waynesworld","waynes-world","partyon","party-on","schwing","excellent","billted","bill-ted","bogusjourney","bogus-journey","stationn","ferris","ferrisbueller","ferris-bueller","dayoff","day-off","buellerr","breakfast-club","breakfastclub","sixteen-candles","sixteencandles","pretty-in-pink","prettyinpink","mollyringwald","molly-ringwald","johnhughes","john-hughes","hughes","brat-pack","bratpack","pager","beeper","pagenme","page-me","callme","call-me","hitmeup","snailmail","snail-mail","aol","aim","icq","uh-oh","a-s-l","asl","netscape","geocities","angelfire","tripod","webcrawler","askjeeves","gen-x","genx","genxer","gen-xer","xer","xers","forgottengeneration","latchkeykid","latchkey-kid","latchkey","unsupervised","freerange","free-range","mtv-generation","mtvgeneration","mtvkids","mtv-kids","videokilled","video-killed","reagan-era","reaganera","coldwar","cold-war","coldwarkids","cold-war-kids","afterschoolspecial","after-school-special","justdontdoit","saynotodrugs","dareprogram","dare-program","scared-straight","scaredstraight","whatcha-talkin-bout","diffrentstrokes","factsoflife","facts-of-life","familyties","family-ties","growinpains","growin-pains","cosby","cheers","thirtysomething","thirty-something","madaboutyou","mad-about-you","seinfeld","seinfeldian","kramers","masterofyourdomain","yada-yada-yada","friends","centralpark","central-perk","rachel","ross","chandler","monica","melrose","melroseplace","melrose-place","90210","beverlyhills90210","myso-called-life","mysocalledlife","angela","jordan-catalano","jordancatalano","freaksandgeeks","freaks-and-geeks","lindsay","undeclared","realworld","real-world","truestory","true-story","roadrules","road-rules","unplugged","mtv-unplugged","mtvunplugged","acoustic","coffehouse","grunge-era","grungeera","seattlesound","seattle-sound","subpop","sub-pop","smellsliketeenspirit","smells-like-teen-spirit","nevermind","bleach","ten","superunknown","dirt","facelift","jaroffies","jar-of-flies","greenday","green-day","dookie","basketcase","basket-case","wheniseptember","blink182","blink-182","enema","whats-my-age-again","allthesmallthings","sublime","santeria","wrongway","wrong-way","40oz","forty-oz","rage","ratm","rageagainstthemachine","killinginthename","bulls-on-parade","tool","lateralus","aenima","undertow","opiate","spiralout","spiral-out","nineinchnails","nine-inch-nails","nin","closer","headlikeahole","smashingpumpkins","smashing-pumpkins","siamesedream","mellon-collie","radiohead","okcomputer","ok-computer","creep","karma-police","paranoidandroid","beck","loser","odelay","whereitsat","where-its-at","twoturnstables","pulpfiction","pulp-fiction","royalewithcheese","saywhatagain","ezekiel","clerks","viewaskew","view-askew","jayandsilentbob","snootchie","officespace","office-space","tpsreports","tps-reports","piecesofflair","thematrix","the-matrix","redpill","bluepill","neo","morpheus","followthewhiterabbit","fightclub","fight-club","firstrandbeof","projectmayhem","tylerdurden","xfiles","x-files","mulderandscully","thetruthisoutthere","iwanttobelieve","buffy","buffythevampireslayer","buffy-tvs","scoobygang","sunnydale","groovy","far-out","farout","outtasite","outta-sight","righteous","cool","coolio","coolcat","cool-cat","coolbeans","cool-beans","neato","solid","solidgold","solid-gold","golden","goldies","oldies","classics","keen","swell","peachy","peachykeen","peachy-keen","hunky-dory","hunkydory","hip","hipster","hipcat","hip-cat","hep","hepcat","hep-cat","jazzy","square","squares","squaresville","uptight","uncool","unhip","bread","dough","moolah","bucks","clams","greenbacks","benjamins","pad","crib","digs","joint","spot","place","casa","hacienda","wheels","ride","whip","jalopy","hooptie","beater","clunker","oldtimer","old-timer","oldschool","old-school","vintage","retro","classic","backyard","frontporch","front-porch","patio","deck","garage","workshop","hamshack","ham-shack","radioshack","radio-shack","basement","attic","lodge","elks","moose","eagles","vfw","legion","american-legion","rotary","kiwanis","lions","shriners","masons","masonic","fraternal","church","chapel","parish","congregation","fellowship","ministry","sunday","sabbath","potluck","pot-luck","social","supper","supperclub","bridge","bridgeclub","bridge-club","cards","cardgame","card-game","bingo","bunco","poker","pokernight","poker-night","gamenight","game-night","bowling","bowlingalley","bowling-alley","bowlingleague","bowling-league","golf","golfclub","golf-club","teeoff","tee-off","links","fairway","fishing","fishinghole","fishing-hole","fishingbuddy","fishing-buddy","hunting","huntingcamp","hunting-camp","deercamp","deer-camp","cabin","rv","rvclub","rv-club","camper","campground","koa","goodsam","good-sam","snowbird","snowbirds","sunbird","sunbirds","winter-texan","wintertexan","retired","retirement","goldenage","golden-age","goldenyears","golden-years","aarp","seniors","seniormoments","senior-moments","grandkids","grandchildren","boomer","boomers","babyboomer","baby-boomer","babyboomers","baby-boomers","woodstock","woodstocknation","woodstock-nation","hippie","hippies","hippy","peacelove","peace-love","peacesign","peace-sign","makelovenotowar","flowerpower","flower-power","flowerchild","flower-child","summerofove","counterculture","counter-culture","freebird","free-bird","freespirit","tune-in-turn-on","dropmeout","trippingout","tripping-out","psychedelic","grateful-dead","gratefuldead","deadhead","dead-head","deadheads","beatles","beatlemania","fab-four","fabfour","johnpaugeorgeringo","rollingstones","rolling-stones","stones","jagger","keithrichards","thewho","the-who","mygeneration","my-generation","tommyboy","ledzeppelin","led-zeppelin","zeppelin","stairway","stairwaytoheaven","pinkfloyd","pink-floyd","thewall","the-wall","darkside","darksidemoon","doors","thedoors","jimmorrison","jim-morrison","lightmyfire","riders","hendrix","jimi","jimihendrix","purplehaze","purple-haze","voodoo-child","janis","janisjoplin","janis-joplin","mercedesbenz","piecemyheart","ccr","creedence","creedence-clearwater","fortunateson","badmoonrising","eagles","hotelcalifornia","hotel-california","desperado","takiteasy","fleetwood","fleetwoodmac","fleetwood-mac","rumours","dreams","thchain","carlysimon","carly-simon","youresovain","anticipation","simongarfunkel","simon-garfunkel","soundofsilence","bridgeovertroubledwater","caroleking","carole-king","tapestry","youvegotafriend","naturalwoman","crosbystillsnash","crosby-stills-nash","csny","suite-judy-blue-eyes","vietnam","vietnamera","vietnam-era","vietnamvet","vietnam-vet","napalm","civilrights","civil-rights","mlk","martin-luther-king","ihaveadream","moonlanding","moon-landing","apollo","apollo11","onesmallstep","jfk","kennedy","camelot","asknotwhat","cubanmissilecrisis","coldwars","watergate","nixon","rosemarywoods","18minutes","deepthroat","mash","allinthefamily","all-in-the-family","archie","archiebunker","happydays","happy-days","fonzie","thfonz","aaayyyy","jumptheshark","laverne-shirley","laverneshirley","schlemiel","schlimazel","marytylermore","mary-tyler-moore","rhoda","lou-grant","lourant","bobnehart","bob-newhart","newhart","hiimbob","thisislarrybrother","sanford-son","sanfordandson","bigdummy","elizabethimcoming","jeffersons","thejeffersons","movingonup","moving-on-up","deluxe","goodtimes","good-times","dynomite","dy-no-mite","jj","chico-man","chicoman","chicoandtheman","lookingfordwardo","kolchak","nightstalker","night-stalker","barnaby","barnabyjones","columbo","onmorething","one-more-thing","justonemorething","magnum","magnumpi","magnum-pi","selleck","tomelleck","ferrari308","rockfordfiles","rockford-files","jimrockford","answeringmachine","dallastv","dallas-tv","whoshotjr","who-shot-jr","ewingsouthfork","dynasty","alexis","crystalcarrington","catfight","shoulderpads","sixmilliondollarman","bionicwoman","bionic-woman","wecanrebuildhim","the","be","to","of","and","a","in","that","have","i","it","for","not","on","with","he","as","you","do","at","this","but","his","by","from","they","we","say","her","she","or","an","will","my","one","all","would","there","their","what","so","up","out","if","about","who","get","which","go","me","when","make","can","like","time","no","just","him","know","take","people","into","year","your","good","some","could","them","see","other","than","then","now","look","only","come","its","over","think","also","back","after","use","two","how","our","work","first","well","way","even","new","want","because","any","these","give","day","most","us","is","are","was","were","been","good","bad","great","best","worst","first","last","next","only","own","free","open","close","closed","new","old","young","big","small","little","long","short","high","low","fast","slow","quick","hot","cold","warm","cool","hard","soft","easy","difficult","simple","complex","clear","dark","light","bright","deep","shallow","wide","narrow","thick","thin","heavy","full","empty","clean","dirty","wet","dry","loud","quiet","silent","strong","weak","rich","poor","cheap","expensive","safe","dangerous","healthy","sick","happy","sad","angry","calm","busy","lazy","crazy","smart","stupid","clever","wise","dumb","funny","serious","strange","normal","weird","perfect","broken","whole","complete","partial","ready","active","passive","alive","dead","awake","asleep","aware","blind","bold","brave","calm","careful","certain","chief","common","curious","current","direct","double","early","entire","exact","extra","fair","false","famous","final","fine","firm","flat","former","forward","fresh","front","frozen","general","giant","global","golden","grand","green","gross","guilty","hidden","hollow","honest","huge","human","humble","hungry","ideal","ill","inner","instant","intense","internal","joint","just","keen","key","kind","known","large","late","latter","leading","legal","likely","limited","linear","liquid","live","living","local","logical","lonely","loose","lost","lovely","lower","lucky","mad","magic","main","major","male","female","manual","married","massive","master","maximum","mean","medium","mental","middle","military","minimum","minor","missing","mixed","mobile","modern","monthly","moral","mutual","naked","narrow","nasty","native","natural","nearby","neat","negative","nervous","neutral","next","nice","noble","noisy","normal","northern","novel","obvious","odd","official","ok","okay","olympic","only","open","opening","opposite","optional","orange","ordinary","organic","original","other","outdoor","outer","outside","overall","overseas","owing","own","pale","parallel","partial","particular","past","patient","peaceful","peculiar","permanent","personal","petty","physical","pink","plain","pleasant","plenty","plus","pointed","polite","political","popular","positive","possible","potential","powerful","practical","precious","precise","pregnant","present","presidential","pretty","previous","primary","prime","principal","prior","private","probable","productive","professional","profound","progressive","prominent","proper","prospective","protective","proud","provincial","psychological","public","pure","purple","qualified","quick","quiet","radical","random","rapid","rare","raw","ready","real","realistic","reasonable","recent","red","redundant","regional","regular","relative","relevant","reliable","religious","reluctant","remaining","remarkable","remote","representative","resident","resistant","respective","responsible","resulting","revolutionary","rich","ridiculous","right","rigid","rising","risky","rival","romantic","rough","round","royal","ruling","running","rural","sacred","sad","safe","salty","same","sample","go","come","get","give","take","make","do","say","see","look","find","use","tell","ask","work","seem","feel","try","leave","call","keep","let","begin","start","show","hear","play","run","move","live","believe","hold","bring","happen","write","provide","sit","stand","lose","pay","meet","include","continue","set","learn","change","lead","understand","watch","follow","stop","create","speak","read","allow","add","spend","grow","open","walk","win","offer","remember","love","consider","appear","buy","wait","serve","die","send","expect","build","stay","fall","cut","reach","kill","remain","suggest","raise","pass","sell","require","report","decide","pull","break","push","throw","catch","jump","kick","hit","fly","swim","drive","ride","climb","dance","sing","cook","eat","drink","sleep","wake","wash","dress","fight","help","save","teach","study","test","check","join","connect","link","share","post","send","receive","accept","reject","approve","deny","confirm","cancel","reset","restart","refresh","reload","update","upgrade","install","uninstall","download","upload","sync","backup","restore","recover","repair","fix","solve","resolve","complete","finish","time","year","people","way","day","man","woman","child","world","life","hand","part","place","case","week","company","system","program","question","work","government","number","night","point","home","water","room","mother","area","money","story","fact","month","lot","right","study","book","eye","job","word","business","issue","side","kind","head","house","service","friend","father","power","hour","game","line","end","member","law","car","city","community","name","president","team","minute","idea","kid","body","information","back","parent","face","others","level","office","door","health","person","art","war","history","party","result","change","morning","reason","research","girl","guy","moment","air","teacher","force","education","hello","hi","hey","hola","bonjour","ciao","aloha","howdy","greetings","welcome","goodbye","bye","farewell","later","peace","cheers","thanks","thankyou","thank-you","please","sorry","excuse","pardon","congrats","congratulations","bravo","wow","amazing","awesome","cool","nice","great","excellent","perfect","wonderful","fantastic","incredible","unbelievable","omg","wtf","lol","lmao","rofl","haha","hehe","xoxo","hugs","kisses","python","javascript","typescript","java","csharp","cpp","cplusplus","golang","go-lang","rust","rustlang","rust-lang","ruby","php","perl","swift","kotlin","scala","haskell","lisp","clojure","erlang","elixir","fsharp","ocaml","lua","r-lang","rlang","julia","dart","fortran","cobol","assembly","asm","wasm","webassembly","sql","nosql","graphql","mongodb","postgres","postgresql","mysql","mariadb","sqlite","redis","memcached","cassandra","dynamodb","firebase","supabase","prisma","sequelize","typeorm","react","reactjs","react-native","reactnative","angular","angularjs","vue","vuejs","svelte","sveltekit","nextjs","next-js","nuxt","nuxtjs","gatsby","remix","astro","solid","solidjs","preact","qwik","htmx","alpine","tailwind","tailwindcss","bootstrap","bulma","foundation","materialui","chakra","antd","ant-design","shadcn","radix","headlessui","daisyui","nodejs","node-js","deno","bun","express","fastify","koa","nestjs","django","flask","fastapi","rails","rubyonrails","laravel","symfony","spring","springboot","spring-boot","dotnet","aspnet","blazor","maui","electron","tauri","flutter","ionic","capacitor","cordova","xamarin","unity","unreal","godot","pygame","phaser","threejs","three-js","babylon","webpack","vite","rollup","parcel","esbuild","swc","babel","eslint","prettier","jest","vitest","mocha","jasmine","cypress","playwright","selenium","puppeteer","storybook","chromatic","ladle","histoire","docker","kubernetes","k8s","k3s","minikube","helm","istio","envoy","podman","containerd","crio","rancher","openshift","nomad","consul","terraform","pulumi","crossplane","ansible","puppet","chef","saltstack","vagrant","packer","vault","boundary","waypoint","atlantis","argocd","argo-cd","fluxcd","flux-cd","jenkins","circleci","travisci","travis-ci","github-actions","githubactions","gitlab-ci","gitlabci","bitbucket-pipelines","azure-devops","azuredevops","teamcity","bamboo","drone","tekton","spinnaker","aws","amazon","azure","gcp","google-cloud","googlecloud","digitalocean","linode","vultr","hetzner","ovh","scaleway","upcloud","heroku","vercel","netlify","cloudflare","fastly","akamai","cloudfront","railway","render","fly-io","flyio","deno-deploy","workers","cloudflare-workers","lambda","serverless","faas","paas","iaas","saas","baas","kaas","daas","nginx","apache","caddy","traefik","haproxy","envoy","kong","apisix","grafana","prometheus","loki","tempo","jaeger","zipkin","datadog","newrelic","splunk","elastic","elasticsearch","kibana","logstash","elk","fluentd","fluentbit","vector","telegraf","influxdb","timescaledb","questdb","pagerduty","opsgenie","victorops","statuspage","incident-io","rootly","ai","artificial-intelligence","ml","machine-learning","machinelearning","deep-learning","deeplearning","neural","neuralnet","neural-network","tensorflow","pytorch","keras","jax","flax","scikit","sklearn","scipy","numpy","pandas","matplotlib","seaborn","plotly","bokeh","altair","huggingface","hugging-face","transformers","diffusers","datasets","openai","gpt","gpt4","gpt-4","chatgpt","chat-gpt","claude","anthropic","gemini","bard","palm","llama","llama2","llama-2","mistral","mixtral","falcon","mpt","dolly","alpaca","vicuna","orca","phi","zephyr","yi","qwen","deepseek","codellama","code-llama","starcoder","codegen","copilot","cursor","tabnine","codeium","replit","sourcegraph","cody","continue","langchain","llamaindex","llama-index","autogpt","auto-gpt","babyagi","agentgpt","superagi","crewai","autogen","semantic-kernel","guidance","ollama","lmstudio","lm-studio","localai","local-ai","gpt4all","koboldai","oobabooga","text-generation-webui","vllm","tgi","triton","tensorrt","stable-diffusion","stablediffusion","midjourney","dalle","dall-e","imagen","sdxl","controlnet","lora","dreambooth","textual-inversion","automatic1111","comfyui","invokeai","fooocus","kohya","runpod","replicate","banana","modal","anyscale","ray","mlflow","weights-biases","wandb","comet","neptune","clearml","dvc","lakefs","pachyderm","kubeflow","mlrun","seldon","bentoml","mlserver","torchserve","triton-inference","sagemaker","vertex","azure-ml","databricks","snowflake","dbt","airbyte","fivetran","security","cybersec","infosec","netsec","appsec","devsecops","secops","hacking","hacker","hackers","pentest","pentesting","redteam","red-team","blueteam","blue-team","purpleteam","purple-team","bugbounty","bug-bounty","ctf","capture-the-flag","wargames","hackthebox","tryhackme","picoctf","overthewire","vulnhub","exploit","exploits","exploit-db","cve","nvd","mitre","attck","att-ck","owasp","sans","nist","iso27001","soc2","gdpr","hipaa","pci","pci-dss","compliance","audit","forensics","malware","ransomware","trojan","virus","worm","rootkit","botnet","phishing","spearphishing","whaling","vishing","smishing","social-eng","osint","recon","reconnaissance","footprinting","scanning","enumeration","privilege-escalation","privesc","lateral-movement","persistence","exfil","firewall","ids","ips","waf","siem","soar","edr","xdr","mdr","ndr","vpn","proxy","tor","onion","i2p","freenet","darknet","darkweb","encryption","decryption","cipher","hash","hashing","sha","md5","bcrypt","argon2","scrypt","aes","rsa","ecc","ecdsa","ed25519","curve25519","ssl","tls","https","certificates","pki","x509","acme","letsencrypt","oauth","oauth2","oidc","saml","jwt","tokens","sessions","cookies","mfa","2fa","totp","hotp","fido","fido2","webauthn","passkeys","biometrics","password","passwords","passphrase","keychain","vault","secrets","keys","nmap","masscan","zmap","shodan","censys","greynoise","binaryedge","burp","burpsuite","zap","owasp-zap","nikto","sqlmap","metasploit","cobalt-strike","cobaltstrike","empire","covenant","sliver","mythic","mimikatz","bloodhound","responder","impacket","crackmapexec","evil-winrm","hashcat","john","johntheripper","hydra","medusa","aircrack","aircrack-ng","wireshark","tcpdump","tshark","scapy","ettercap","bettercap","mitmproxy","ghidra","ida","radare2","r2","binary-ninja","hopper","cutter","x64dbg","immunity","ollydbg","gdb","lldb","windbg","frida","objection","cycript","blockchain","crypto","cryptocurrency","defi","de-fi","cefi","ce-fi","bitcoin","btc","ethereum","eth","solana","sol","cardano","ada","polkadot","dot","avalanche","avax","polygon","matic","arbitrum","arb","optimism","op","base","zksync","zk-sync","starknet","scroll","linea","cosmos","atom","osmosis","osmo","celestia","tia","injective","inj","near","nearprotocol","aptos","apt","sui","mina","algorand","algo","tezos","xtz","hedera","hbar","fantom","ftm","harmony","one","elrond","egld","flow","icp","internet-computer","filecoin","fil","arweave","ar","storj","sia","akash","akt","render","rndr","chainlink","link","thegraph","grt","api3","band","uma","tellor","uniswap","uni","sushiswap","sushi","pancakeswap","cake","curve","crv","aave","compound","comp","makerdao","maker","mkr","dai","synthetix","lido","steth","rocketpool","reth","frax","convex","cvx","yearn","yfi","dydx","gmx","perpetual","perp","vertex","hyperliquid","drift","opensea","blur","looksrare","x2y2","sudoswap","nftx","rarible","foundation","nft","nfts","pfp","generative","ordinals","inscriptions","brc20","brc-20","wallet","wallets","metamask","phantom","rainbow","rabby","frame","zerion","ledger","trezor","coldcard","bitbox","keystone","hardware-wallet","seed","seedphrase","seed-phrase","mnemonic","private-key","privatekey","mining","miner","miners","hashrate","hash-rate","pow","pos","dpos","staking","stake","validator","validators","delegation","slashing","gas","gwei","eip","eip1559","erc20","erc721","erc1155","erc4626","dao","daos","governance","proposal","voting","snapshot","tally","multisig","multi-sig","gnosis","safe","timelock","vesting","airdrop","hardware","electronics","circuits","pcb","breadboard","soldering","arduino","esp32","esp8266","stm32","teensy","pico","rp2040","attiny","raspberrypi","raspberry-pi","rpi","rpi4","rpi5","rpi-zero","rpizero","beaglebone","beagle-bone","orangepi","orange-pi","bananapi","banana-pi","jetson","nvidia-jetson","nano","xavier","orin","coral","edge-tpu","fpga","verilog","vhdl","systemverilog","chisel","myhdl","amaranth","xilinx","altera","intel-fpga","lattice","gowin","efinix","anlogic","asic","risc","risc-v","riscv","arm","arm64","aarch64","x86","x64","mips","powerpc","sparc","xtensa","avr","pic","msp430","8051","microcontroller","mcu","soc","cpu","gpu","npu","tpu","dpu","ipu","memory","ram","dram","sram","flash","eeprom","rom","nvram","mram","ssd","nvme","hdd","storage","raid","nas","san","das","iscsi","usb","usb-c","thunderbolt","pcie","sata","nvlink","hdmi","displayport","ethernet","wifi","bluetooth","ble","zigbee","zwave","thread","matter","lora","lorawan","sigfox","nbiot","nb-iot","lte-m","catm1","5g","4g","antenna","antennas","rf","sdr","rtl-sdr","hackrf","limesdr","pluto","oscilloscope","logic-analyzer","multimeter","power-supply","signal-gen","3dprinter","3d-printer","3dprinting","fdm","sla","resin","filament","cnc","laser","lasercutter","laser-cutter","plasma","waterjet","edm","physics","quantum","quantum-physics","quantumphysics","quantummechanics","relativity","einstein","newton","particle","particles","hadron","cern","fermion","boson","higgs","quark","lepton","neutrino","photon","electron","proton","neutron","atom","atoms","atomic","nuclear","fission","fusion","plasma","magnetism","electromagnetism","gravity","gravitation","spacetime","blackhole","black-hole","singularity","wormhole","darkmatter","dark-matter","darkenergy","dark-energy","cosmology","bigbang","big-bang","inflation","astronomy","astrophysics","cosmos","universe","multiverse","galaxy","galaxies","milkyway","milky-way","andromeda","nebula","nebulae","pulsar","quasar","magnetar","supernova","nova","dwarf","whitedwarf","reddwarf","star","stars","stellar","solar","sun","sunspot","corona","flare","planet","planets","planetary","exoplanet","mercury","venus","earth","mars","jupiter","saturn","uranus","neptune","pluto","ceres","eris","moon","moons","lunar","asteroid","asteroids","comet","comets","meteor","telescope","telescopes","hubble","webb","jwst","james-webb","chandra","spitzer","kepler","tess","gaia","vlt","elt","keck","alma","ska","nasa","esa","jaxa","isro","roscosmos","cnsa","spacex","blueorigin","virgin-galactic","rocketlab","relativity-space","firefly","astra","chemistry","chem","chemical","chemicals","molecule","molecules","molecular","organic","inorganic","polymer","polymers","catalyst","reaction","synthesis","element","elements","periodic","periodic-table","hydrogen","helium","lithium","carbon","nitrogen","oxygen","sulfur","phosphorus","potassium","calcium","iron","copper","zinc","silver","gold","platinum","uranium","plutonium","biology","bio","biological","bioscience","lifescience","life-science","cell","cells","cellular","dna","rna","mrna","gene","genes","genetic","genetics","genomics","genome","chromosome","protein","proteins","enzyme","bacteria","bacterial","virus","viral","microbe","microbes","microbiology","fungus","fungi","yeast","algae","plankton","protozoa","amoeba","evolution","darwin","natural-selection","species","taxonomy","phylogeny","ecology","ecosystem","biodiversity","conservation","endangered","extinction","botany","botanical","plant","plants","flora","flower","flowers","tree","trees","forest","forests","rainforest","jungle","grassland","savanna","zoology","animal","animals","fauna","mammal","mammals","reptile","reptiles","amphibian","amphibians","bird","birds","avian","fish","fishes","marine","insect","insects","arthropod","arachnid","spider","spiders","butterfly","earth","earthscience","earth-science","geology","geological","geologist","rock","rocks","mineral","minerals","crystal","crystals","gem","gems","volcano","volcanoes","volcanic","lava","magma","eruption","tectonic","earthquake","earthquakes","seismic","seismology","fault","faults","mountain","mountains","peak","peaks","summit","ridge","range","alps","himalayas","rockies","andes","everest","kilimanjaro","fuji","denali","ocean","oceans","oceanic","atlantic","pacific","indian","arctic","antarctic","sea","seas","mediterranean","caribbean","baltic","adriatic","aegean","river","rivers","stream","streams","creek","creeks","delta","estuary","lake","lakes","pond","ponds","reservoir","wetland","wetlands","swamp","island","islands","peninsula","cape","bay","gulf","strait","channel","continent","continents","africa","asia","europe","northamerica","southamerica","australia","oceania","antarctica","arctic","polar","tropical","equator","climate","weather","meteorology","atmosphere","stratosphere","troposphere","temperature","precipitation","humidity","pressure","wind","winds","storm","storms","hurricane","typhoon","cyclone","tornado","tornadoes","lightning","thunder","thunderstorm","monsoon","blizzard","drought","environment","environmental","eco","ecology","green","sustainable","sustainability","renewable","renewables","solar","solar-power","solarpower","wind-power","windpower","hydro","hydroelectric","geothermal","biomass","nuclear-power","nuclearpower","fusion-power","fusionpower","clean-energy","carbon","carbon-neutral","carbonneutral","netzero","net-zero","emissions","greenhouse","co2","methane","ozone","pollution","pollutants","smog","recycle","recycling","compost","composting","waste","zerowaste","zero-waste","plastic","plastics","microplastic","biodegradable","reusable","disposable","organic","natural","vegan","vegetarian","plantbased","plant-based","climate-change","climatechange","global-warming","globalwarming","ipcc","paris-agreement","cop","cop28","unfccc","epa","wwf","greenpeace","sports","sport","athletics","athletic","athlete","athletes","fitness","workout","workouts","exercise","exercises","training","trainer","gym","football","nfl","soccer","fifa","worldcup","world-cup","premier-league","champions-league","laliga","la-liga","bundesliga","seriea","serie-a","basketball","nba","wnba","ncaa","march-madness","hoops","dunk","slam","baseball","mlb","homerun","home-run","worldseries","world-series","hockey","nhl","ice-hockey","icehockey","puck","slap-shot","goalie","tennis","atp","wta","wimbledon","usopen","us-open","roland-garros","golf","pga","lpga","masters","ryder-cup","birdie","eagle","hole-in-one","boxing","mma","ufc","bellator","wrestling","wwe","aew","judo","karate","taekwondo","jiu-jitsu","jiujitsu","bjj","muay-thai","kickboxing","kung-fu","olympics","olympic","paralympics","paralympic","commonwealthgames","running","runner","runners","marathon","marathons","half-marathon","5k","10k","ultra","ultramarathon","trail-running","trailrunning","cross-country","cycling","cyclist","cycling","tour-de-france","tourdefrance","giro","vuelta","time-trial","peloton","velodrome","bmx","mountainbike","mtb","swimming","swimmer","swimmers","pool","freestyle","backstroke","butterfly","triathlon","triathlete","ironman","sprint-tri","olympic-tri","duathlon","weightlifting","powerlifting","crossfit","bodybuilding","strongman","yoga","pilates","aerobics","zumba","hiit","cardio","stretching","mobility","surfing","surf","surfer","surfers","waves","barrel","pipeline","wsl","skateboarding","skate","skater","skaters","sk8","halfpipe","vert","street","snowboarding","snowboard","snowboarder","skiing","ski","skier","slopes","climbing","climber","climbers","bouldering","trad","sport-climbing","parkour","freerunning","free-running","traceur","movement","calisthenics","music","musician","musicians","musical","song","songs","album","albums","artist","artists","band","bands","singer","singers","vocalist","voice","rock","rock-music","rockmusic","rocknroll","rock-n-roll","classic-rock","pop","pop-music","popmusic","kpop","k-pop","jpop","j-pop","cpop","c-pop","hiphop","hip-hop","rap","rapper","rappers","trap","drill","grime","rnb","r-n-b","soul","funk","disco","motown","reggae","dancehall","ska","jazz","jazz-music","jazzmusic","bebop","swing","bigband","big-band","blues","blues-music","bluesmusic","delta-blues","chicago-blues","electric","country","country-music","countrymusic","bluegrass","americana","folk","electronic","edm","techno","house","trance","dubstep","drum-and-bass","dnb","drumnbass","ambient","chillout","chill-out","lofi","lo-fi","beats","classical","classical-music","classicalmusic","orchestra","symphony","opera","choir","choral","chamber","baroque","romantic","contemporary","metal","heavy-metal","heavymetal","death-metal","black-metal","thrash","punk","punk-rock","punkrock","hardcore","emo","screamo","post-punk","indie","indie-rock","indierock","indie-pop","indiepop","alternative","grunge","shoegaze","dream-pop","dreampop","noise","experimental","world-music","worldmusic","latin","salsa","merengue","bachata","cumbia","afrobeat","afro-beat","afropop","afro-pop","highlife","juju","mbalax","guitar","guitarist","bass","bassist","drums","drummer","percussion","keyboard","keyboardist","piano","pianist","synth","synthesizer","keys","violin","violinist","cello","cellist","viola","bass","doublebass","saxophone","sax","trumpet","trombone","clarinet","flute","oboe","horn","dj","deejay","turntable","turntables","mixing","mixer","scratching","producer","producers","production","beatmaker","beat-maker","beats","recording","studio","studios","mastering","mixing","mixing-board","spotify","apple-music","applemusic","tidal","deezer","soundcloud","bandcamp","youtube-music","youtubemusic","amazon-music","amazonmusic","vinyl","records","record","lp","ep","single","singles","discography","concert","concerts","gig","gigs","tour","touring","festival","festivals","coachella","glastonbury","lollapalooza","bonnaroo","burning-man","sxsw","grammy","grammys","brit-awards","vma","ama","billboard","rolling-stone","movies","movie","film","films","cinema","cinematic","theater","theatre","hollywood","bollywood","nollywood","tollywood","anime","animation","documentary","documentaries","doc","docs","docuseries","docu-series","tv","television","series","show","shows","episode","episodes","season","drama","dramas","comedy","comedies","romcom","rom-com","sitcom","sitcoms","action","adventure","thriller","thrillers","horror","scary","slasher","scifi","sci-fi","science-fiction","sciencefiction","fantasy","dystopia","superhero","superheroes","marvel","mcu","dc","dceu","batman","superman","spiderman","spider-man","avengers","xmen","x-men","fantastic-four","starwars","star-wars","startrek","star-trek","trekkie","trekkies","lotr","lord-of-the-rings","lordoftherings","hobbit","tolkien","middle-earth","harrypotter","harry-potter","hogwarts","wizarding","potterhead","gameofthrones","game-of-thrones","got","westeros","houseofdragon","stranger-things","strangerthings","breaking-bad","breakingbad","bettercallsaul","netflix","hulu","disney-plus","disneyplus","hbo","hbomax","max","amazon-prime","amazonprime","primevideo","prime-video","appletv","paramount-plus","paramountplus","peacock","criterion","mubi","shudder","director","directors","filmmaker","filmmakers","cinematographer","dop","actor","actors","actress","actresses","cast","casting","audition","screenwriter","screenwriting","script","scripts","screenplay","storyboard","oscar","oscars","academy-awards","academyawards","emmy","emmys","golden-globe","goldenglobes","bafta","cannes","sundance","tribeca","toronto","tiff","venice","berlinale","sxsw-film","telluride","gaming","gamer","gamers","games","game","videogames","video-games","pc-gaming","pcgaming","console","consoles","handheld","mobile-gaming","playstation","ps5","ps4","ps3","psn","xbox","xboxone","xbox-series","nintendo","switch","switch-2","wii","wiiu","gamecube","n64","snes","nes","steam","steamdeck","steam-deck","epic","epicgames","epic-games","gog","rpg","jrpg","mmorpg","mmo","fps","tps","rts","moba","battle-royale","sandbox","survival","roguelike","roguelite","metroidvania","souls-like","platformer","puzzle","adventure","simulation","sim","sims","strategy","minecraft","fortnite","valorant","csgo","cs2","counterstrike","counter-strike","league","leagueoflegends","league-of-legends","lol","dota","dota2","overwatch","ow2","apex","apexlegends","apex-legends","warzone","callofduty","gta","grandtheftauto","grand-theft-auto","gta6","gta5","rockstar","eldenring","elden-ring","darksouls","dark-souls","bloodborne","sekiro","zelda","totk","botw","tears-of-the-kingdom","breath-of-the-wild","link","mario","supermario","super-mario","mariokart","mario-kart","smashbros","pokemon","pokemongo","pokemon-go","pikachu","scarlet","violet","finalfantasy","final-fantasy","ff16","ff14","ffxiv","squareenix","destiny","destiny2","bungie","halo","haloinfinite","343industries","diablo","diablo4","worldofwarcraft","world-of-warcraft","wow","blizzard","starcraft","hearthstone","overwatch","battlenet","battle-net","assassinscreed","assassins-creed","farcry","far-cry","watchdogs","ubisoft","cyberpunk","cyberpunk2077","witcher","witcher3","cdprojekt","cdpr","baldursgate","baldurs-gate","bg3","larian","divinity","dos2","esports","e-sports","competitive","tournament","tournaments","lan","twitch","streamer","streamers","streaming","youtube-gaming","kick","speedrun","speedrunner","speedrunning","gdq","agdq","sgdq","food","foods","foodie","foodies","cooking","cook","cooks","chef","chefs","recipe","recipes","kitchen","kitchens","culinary","gastronomy","gourmet","restaurant","restaurants","dining","dine","eat","eating","meal","meals","breakfast","brunch","lunch","dinner","supper","snack","snacks","dessert","appetizer","appetizers","entree","entrees","side","sides","course","pizza","pizzas","burger","burgers","sandwich","sandwiches","wrap","wraps","taco","tacos","burrito","burritos","quesadilla","nachos","enchilada","sushi","sashimi","ramen","udon","soba","tempura","teriyaki","bento","pasta","spaghetti","lasagna","ravioli","gnocchi","risotto","italian","steak","steaks","bbq","barbeque","barbecue","grill","grilling","smoker","chicken","beef","pork","lamb","fish","seafood","shrimp","lobster","crab","vegetarian","vegan","plantbased","plant-based","meatless","tofu","tempeh","salad","salads","soup","soups","stew","stews","chili","curry","curries","bread","breads","baking","baker","bakery","pastry","pastries","cake","cookies","brownies","pie","pies","tart","tarts","donut","donuts","coffee","espresso","latte","cappuccino","mocha","americano","coldbrew","tea","teas","greentea","green-tea","blacktea","black-tea","herbal","chai","beer","beers","craft-beer","craftbeer","ipa","lager","stout","ale","brew","wine","wines","redwine","red-wine","whitewine","white-wine","rose","sparkling","cocktail","cocktails","mixology","bartender","bartending","spirits","whiskey","whisky","bourbon","scotch","vodka","gin","rum","tequila","fashion","style","styling","stylist","stylish","trendy","trend","trends","clothing","clothes","outfit","outfits","ootd","lookbook","wardrobe","dress","dresses","shirt","shirts","pants","jeans","shorts","skirt","jacket","jackets","coat","coats","sweater","hoodie","hoodies","blazer","shoes","sneakers","boots","heels","sandals","loafers","footwear","accessories","accessory","jewelry","jewellery","watch","watches","bag","bags","handbag","purse","wallet","sunglasses","hat","hats","scarf","designer","designers","luxury","luxe","haute-couture","hautecouture","runway","catwalk","model","models","modeling","modelling","supermodel","vogue","elle","harpers-bazaar","gq","esquire","cosmopolitan","instyle","beauty","beautiful","gorgeous","stunning","glam","glamour","glamorous","makeup","make-up","cosmetics","lipstick","mascara","eyeliner","eyeshadow","foundation","concealer","blush","bronzer","highlighter","contour","skincare","skin-care","skincareroutine","cleanser","moisturizer","serum","sunscreen","spf","anti-aging","antiaging","wrinkles","acne","pores","hair","haircare","hair-care","hairstyle","hairstyles","haircut","haircolor","blonde","brunette","redhead","highlights","balayage","ombre","extensions","nails","manicure","pedicure","nailart","nail-art","gelnails","acrylics","fragrance","perfume","cologne","scent","scents","aromatherapy","essentials","travel","traveling","travelling","traveler","traveller","travelers","trip","trips","vacation","vacations","holiday","holidays","getaway","adventure","adventures","explore","exploring","explorer","wanderlust","backpacking","backpacker","backpackers","hostel","hostels","hotel","hotels","airbnb","vrbo","booking","expedia","tripadvisor","kayak","skyscanner","flight","flights","airline","airlines","airport","airports","terminal","cruise","cruises","cruising","sailing","yacht","charter","island-hopping","roadtrip","road-trip","roadtrips","driving","scenic","route","routes","hiking","hike","hikes","trail","trails","trek","trekking","camping","beach","beaches","coastal","seaside","oceanfront","beachfront","shore","mountain","mountains","alpine","summit","peak","valley","canyon","gorge","city","cities","urban","metropolitan","downtown","cityscape","skyline","village","villages","town","towns","countryside","rural","scenic","landmark","landmarks","monument","monuments","heritage","unesco","historic","paris","london","newyork","new-york","tokyo","rome","barcelona","amsterdam","berlin","vienna","prague","budapest","lisbon","madrid","athens","istanbul","dubai","singapore","hongkong","hong-kong","bangkok","seoul","taipei","sydney","melbourne","auckland","capetown","cape-town","cairo","marrakech","nairobi","rio","buenosaires","buenos-aires","mexicocity","mexico-city","lima","bogota","sanfrancisco","san-francisco","losangeles","los-angeles","chicago","miami","lasvegas","las-vegas","seattle","boston","austin","denver","portland","vancouver","toronto","montreal","calgary","ottawa","quebec","edmonton","family","families","familytime","family-time","familyfirst","famfam","parents","parenting","parent","parenthood","parentlife","parent-life","mom","moms","momlife","mom-life","mommy","mother","mothers","motherhood","dad","dads","dadlife","dad-life","daddy","father","fathers","fatherhood","kids","kid","children","child","childhood","kidlife","kid-life","toddler","baby","babies","newborn","infant","pregnancy","pregnant","expecting","grandparents","grandma","grandpa","grandmother","grandfather","nana","papa","siblings","sibling","brother","brothers","sister","sisters","twins","friends","friend","friendship","friendships","bestfriend","best-friend","bff","besties","bestie","squad","squadgoals","squad-goals","crew","gang","dating","date","dates","relationship","relationships","couple","couples","boyfriend","girlfriend","partner","partners","significant-other","so","engaged","engagement","fiance","fiancee","wedding","weddings","bride","groom","married","marriage","spouse","husband","wife","newlyweds","anniversary","anniversaries","love","loving","romance","romantic","single","singles","singlelife","single-life","bachelor","bachelorette","divorce","divorced","separated","coparenting","co-parenting","stepparent","blended","blendedfamily","blended-family","adoption","adopted","foster","lgbtq","lgbt","lgbtqia","queer","pride","pridemonth","pride-month","gay","gays","lesbian","lesbians","bisexual","bi","pansexual","pan","transgender","trans","nonbinary","non-binary","nb","genderfluid","genderqueer","asexual","ace","aromantic","aro","demisexual","demi","intersex","ally","coming-out","comingout","outandproud","out-and-proud","loveislove","love-is-love","feminist","feminism","feminists","womensrights","womens-rights","equality","civilrights","civil-rights","humanrights","human-rights","socialjustice","blm","blacklivesmatter","black-lives-matter","antiracism","anti-racism","indigenous","native","firstnations","first-nations","aboriginal","tribal","disability","disabled","accessibility","a11y","inclusion","inclusive","neurodivergent","adhd","autism","autistic","dyslexia","dyslexic","mental-health","mentalhealth","anxiety","depression","bipolar","ptsd","ocd","therapy","selfcare","self-care","wellness","wellbeing","well-being","mindfulness","meditation","meditate","mindful","zen","calm","peace","peaceful","serenity","recovery","sober","sobriety","clean","aa","na","12steps","12-steps","support","supportgroup","support-group","community","communities","tribe","religion","religious","faith","faithful","belief","believe","believer","spiritual","spirituality","spirit","spirits","soul","souls","divine","christian","christianity","christians","church","churches","jesus","christ","catholic","catholicism","catholics","protestant","evangelical","baptist","methodist","lutheran","presbyterian","orthodox","episcopal","anglican","mormon","lds","latterday","latter-day","jehovah","adventist","pentecostal","jewish","judaism","jews","hebrew","israel","israeli","kosher","sabbath","torah","talmud","synagogue","temple","rabbi","hanukkah","passover","yom-kippur","muslim","islam","islamic","muslims","quran","koran","allah","muhammad","mosque","masjid","imam","halal","ramadan","eid","hajj","mecca","medina","hindu","hinduism","hindus","vedic","yoga","karma","dharma","mantra","temple","temples","krishna","shiva","vishnu","ganesh","diwali","holi","buddhist","buddhism","buddhists","buddha","zen","tibetan","dalai-lama","meditation","enlightenment","nirvana","sangha","dharma","sutra","sikh","sikhism","sikhs","guru","gurus","gurdwara","punjabi","pagan","paganism","wicca","wiccan","witchcraft","witch","witches","atheist","atheism","agnostic","agnosticism","secular","humanist","humanism","prayer","prayers","praying","worship","worshipping","praise","praising","blessing","blessings","blessed","miracle","miracles","grace","salvation","heaven","hell","afterlife","eternal","eternity","resurrection","redemption","work","working","worker","workers","workplace","worklife","work-life","job","jobs","career","careers","profession","professional","professionals","office","offices","corporate","corporation","company","companies","business","startup","startups","entrepreneur","entrepreneurs","entrepreneurship","founder","ceo","cto","cfo","coo","cmo","ciso","vp","director","manager","lead","employee","employees","employer","employers","hr","humanresources","human-resources","hiring","hire","recruit","recruiting","recruitment","talent","headhunter","interview","interviews","interviewing","resume","cv","linkedin","networking","salary","salaries","compensation","benefits","perks","bonus","bonuses","promotion","promoted","raise","negotiation","negotiate","contract","contracts","remote","remotework","remote-work","wfh","workfromhome","work-from-home","hybrid","flexible","flexibility","freelance","freelancer","freelancing","gig","gigeconomy","gig-economy","sideproject","side-project","sidehustle","meeting","meetings","presentation","presentations","conference","conferences","project","projects","deadline","deadlines","milestone","milestones","deliverable","team","teams","teamwork","collaboration","collaborate","agile","scrum","kanban","leadership","leader","leaders","management","manage","managing","productivity","efficiency","efficient","effective","performance","kpi","okr","metrics","burnout","stress","stressed","workload","overtime","quit","quitting","resign","retirement","retired","retiring","pension","401k","ira","savings","invest","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","42","50","60","69","70","80","88","90","99","100","101","111","123","200","222","247","300","333","365","400","404","420","444","500","555","666","700","777","800","888","900","911","999","1000","1111","1234","2000","2020","2021","2022","2023","2024","2025","2026","2027","2028","2029","2030","2050","3000","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ch1","ch2","ch3","ch4","ch5","ch6","ch7","ch8","ch9","ch10","ch11","ch12","ch13","ch14","ch15","ch16","ch17","ch18","ch19","ch20","channel1","channel2","channel3","channel4","channel5","channel6","channel7","channel8","channel9","channel10","channel11","channel12","channel13","room1","room2","room3","room4","room5","room6","room7","room8","room9","room10","group1","group2","group3","group4","group5","group6","group7","group8","group9","group10","team1","team2","team3","team4","team5","team6","team7","team8","team9","team10","zone1","zone2","zone3","zone4","zone5","zone6","zone7","zone8","zone9","zone10","area1","area2","area3","area4","area5","area6","area7","area8","area9","area10","sector1","sector2","sector3","sector4","sector5","sector6","sector7","sector8","net1","net2","net3","net4","net5","net6","net7","net8","net9","net10","link1","link2","link3","link4","link5","link6","link7","link8","link9","link10","node1","node2","node3","node4","node5","node6","node7","node8","node9","node10","hub1","hub2","hub3","hub4","hub5","hub6","hub7","hub8","hub9","hub10","mesh1","mesh2","mesh3","mesh4","mesh5","mesh6","mesh7","mesh8","mesh9","mesh10","radio1","radio2","radio3","radio4","radio5","radio6","radio7","radio8","radio9","relay1","relay2","relay3","relay4","relay5","relay6","relay7","relay8","relay9","base1","base2","base3","base4","base5","base6","base7","base8","base9","base10","unit1","unit2","unit3","unit4","unit5","unit6","unit7","unit8","unit9","unit10","server1","server2","server3","server4","server5","server6","server7","server8","dev1","dev2","dev3","dev4","dev5","prod1","prod2","prod3","stage1","stage2","test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","user1","user2","user3","user4","user5","admin1","admin2","admin3","ops1","ops2","alpha","bravo","charlie","delta","echo","foxtrot","golf","hotel","india","juliet","kilo","lima","mike","november","oscar","papa","quebec","romeo","sierra","tango","uniform","victor","whiskey","xray","x-ray","yankee","zulu","alpha1","bravo1","charlie1","delta1","echo1","foxtrot1","alpha-team","bravo-team","charlie-team","delta-team","echo-team","team-alpha","team-bravo","team-charlie","team-delta","team-echo","red","blue","green","yellow","orange","purple","pink","black","white","gray","grey","brown","gold","silver","bronze","copper","platinum","cyan","magenta","teal","navy","maroon","olive","lime","aqua","coral","crimson","indigo","violet","turquoise","beige","ivory","tan","khaki","red-team","blue-team","green-team","yellow-team","orange-team","purple-team","team-red","team-blue","team-green","team-yellow","team-orange","team-purple","rednet","bluenet","greennet","blacknet","whitenet","darknet","clearnet","monday","tuesday","wednesday","thursday","friday","saturday","sunday","mon","tue","wed","thu","fri","sat","sun","weekday","weekend","january","february","march","april","may","june","july","august","september","october","november","december","jan","feb","mar","apr","jun","jul","aug","sep","oct","nov","dec","spring","summer","fall","autumn","winter","season","seasons","seasonal","morning","afternoon","evening","night","midnight","noon","dawn","dusk","daily","weekly","monthly","yearly","annual","quarterly","hourly","today","tomorrow","yesterday","now","later","soon","always","never","24-7","247","round-the-clock","nonstop","non-stop","always-on","alwayson","north","south","east","west","northeast","northwest","southeast","southwest","northern","southern","eastern","western","central","middle","center","up","down","left","right","top","bottom","front","back","side","upper","lower","inner","outer","inside","outside","above","below","near","far","close","distant","local","remote","nearby","faraway","here","there","everywhere","anywhere","somewhere","nowhere","wherever","mini","micro","nano","tiny","small","little","medium","large","big","huge","giant","massive","mega","giga","tera","peta","exa","ultra","super","hyper","extreme","max","maximum","min","minimum","plus","extra","lite","light","heavy","full","empty","half","partial","complete","total","all-chat","allchat","main-chat","mainchat","public-chat","publicchat","general-chat","generalchat","global-chat","globalchat","world-chat","worldchat","local-chat","localchat","open-chat","openchat","free-chat","freechat","random-chat","randomchat","voice-chat","voicechat","text-chat","textchat","all-net","allnet","main-net","mainnet","test-net","testnet","dev-net","devnet","local-net","localnet","global-net","globalnet","public-net","publicnet","mesh-net","meshnet","radio-net","radionet","ham-net","hamnet","emerg-net","emergnet","all-hands","allhands","town-hall","townhall","standby","stand-by","on-call","oncall","help-desk","helpdesk","support","tech-support","techsupport","customer-support","feedback","suggestions","ideas","feature-requests","featurerequests","bug-reports","watercooler","water-cooler","coffee-break","coffeebreak","break-room","breakroom","off-topic","offtopic","random","misc","miscellaneous","other","everything-else","introductions","intro","intros","welcome","new-members","newmembers","onboarding","announcements","announce","news","updates","changelog","releases","roadmap","rules","guidelines","faq","faqs","help","how-to","howto","tutorial","tutorials","resources","links","useful-links","usefullinks","bookmarks","reference","docs","showcase","show-and-tell","showandtell","gallery","portfolio","projects","builds","jobs","hiring","careers","opportunities","gigs","freelance","classifieds","buy-sell","buysell","marketplace","trade","trading","swap","swaps","deals","events","meetups","meetup","gatherings","conferences","workshops","webinars","study-group","studygroup","book-club","bookclub","movie-night","movienight","game-night","gamenight","trivia","quiz","contests","challenges","competitions","reddit","twitter","x","facebook","fb","instagram","ig","insta","tiktok","youtube","yt","pinterest","snapchat","snap","linkedin","tumblr","threads","mastodon","fediverse","bluesky","bsky","discord","slack","telegram","signal","whatsapp","messenger","wechat","line","kakao","viber","matrix","element","clubhouse","spaces","periscope","vine","myspace","digg","stumbleupon","quora","medium","substack","patreon","onlyfans","fanhouse","gumroad","behance","dribbble","deviantart","artstation","pixiv","flickr","500px","meme","memes","dank","dankmemes","dank-memes","cursed","blessed","blursed","cringe","based","redpill","redpilled","blackpill","copium","hopium","cope","poggers","pog","pogchamp","pepe","wojak","gigachad","chad","virgin","simp","simping","stan","stanning","parasocial","irl","afk","brb","ttyl","fomo","yolo","goat","goated","lit","fire","slay","slaying","periodt","sus","sussy","imposter","amogus","amongus","among-us","crewmate","ratio","ratiod","L","W","big-L","big-W","touch-grass","touchgrass","npc","npcs","normie","normies","sheeple","boomer","zoomer","doomer","coomer","consoomer","wagie","neet","incel","volcel","blackpilled","glowie","janny","jannie","based-and-redpilled","keyed","kino","sovl","tfw","mfw","mrw","imo","imho","afaik","eli5","tldr","tl-dr","reddit-moment","leddit","hivemind","groupthink","echo-chamber","circlejerk","wholesome","wholesome100","chungus","big-chungus","keanu","reeves","stonks","not-stonks","diamond-hands","diamondhands","paper-hands","hodl","to-the-moon","tothemoon","moon","mooning","ape","apes","ape-together","tendies","gme","gamestop","wallstreetbets","wsb","yeet","yeeted","yoink","noob","newb","newbie","scrub","pwned","owned","rekt","wrecked","gg","ggwp","ggez","ez","ezpz","no-cap","nocap","cap","capping","fr","frfr","bussin","valid","bet","no-shot","sheesh","sheeesh","ong","ongggg","mid","L-take","W-take","hot-take","cold-take","spicy","spicy-take","rent-free","rentfree","living-rent-free","unhinged","brainrot","brain-rot","vtuber","vtubers","vtubing","hololive","nijisanji","vshoujo","idol","content","content-creator","contentcreator","creator","creators","influencer","influencers","viral","viralvideo","viral-video","trending","fyp","foryou","for-you","foryoupage","algorithm","algo","engagement","analytics","metrics","subscriber","subscribers","subs","sub","follower","followers","following","like","likes","share","shares","repost","reposts","retweet","rt","quote","comment","comments","reply","replies","dm","dms","direct-message","inbox","notification","notifications","notif","notifs","ping","pings","mention","highlight","highlights","clip","clips","vod","vods","archive","archives","premiere","premieres","watchparty","watch-party","reaction","reactions","react","reacting","review","reviews","tier-list","tierlist","ranking","collab","collabs","collaboration","crossover","feature","featured","guest","host","hosting","cohost","co-host","panel","panels","podcast","podcasts","episode","ep","eps","season","seasons","series","miniseries","mini-series","subreddit","subreddits","sub","subs","thread","threads","post","posts","forum","forums","board","boards","chan","chans","4chan","8chan","8kun","imageboard","textboard","bbs","bulletin-board","usenet","newsgroup","irc","ircnet","efnet","freenode","libera","oftc","rizon","undernet","xmpp","jabber","mumble","teamspeak","ts3","ventrilo","vent","raidcall","wiki","wikipedia","wikia","fandom","tvtropes","knowyourmeme","kym","encyclopediadramatica","ed","urban-dictionary","urbandictionary","ud","google","alphabet","apple","microsoft","msft","amazon","meta","facebook","nvidia","nvda","amd","intel","qualcomm","broadcom","samsung","tsmc","oracle","sap","salesforce","adobe","autodesk","vmware","dell","hp","hpe","ibm","cisco","juniper","arista","palo-alto","fortinet","crowdstrike","palantir","snowflake","databricks","mongodb","elastic","splunk","datadog","zoom","webex","teams","meet","slack","atlassian","jira","confluence","notion","airtable","coda","asana","monday","clickup","trello","basecamp","figma","sketch","invision","zeplin","framer","webflow","squarespace","wix","shopify","bigcommerce","magento","woocommerce","stripe","paypal","square","plaid","brex","ramp","affirm","klarna","afterpay","coinbase","binance","robinhood","fidelity","vanguard","schwab","etrade","interactive-brokers","uber","lyft","doordash","grubhub","instacart","postmates","deliveroo","airbnb","vrbo","booking","expedia","kayak","tripadvisor","yelp","spotify","apple-music","pandora","soundcloud","bandcamp","tidal","deezer","dropbox","box","onedrive","gdrive","google-drive","icloud","mega","nintendo","sony","playstation","xbox","microsoft-gaming","activision","blizzard","activision-blizzard","ea","electronic-arts","ubisoft","epic","valve","steam","rockstar","take-two","2k","bethesda","zenimax","id-software","bioware","dice","respawn","bungie","343","naughtydog","insomniac","santa-monica","guerrilla","sucker-punch","bend","bluepoint","housemarque","fromsoftware","from-software","bandainamco","bandai-namco","capcom","konami","sega","atlus","squareenix","square-enix","enix","square","level5","gamefreak","game-freak","creatures","pokemon-company","mihoyo","hoyoverse","riot","riot-games","tencent","netease","nexon","ncsoft","krafton","pubg","supercell","king","rovio","zynga","playtika","scopely","jam-city","paradox","firaxis","amplitude","creative-assembly","relic","obsidian","larian","cd-projekt","cdpr","techland","4a-games","remedy","io-interactive","disney","pixar","marvel","lucasfilm","warner","warnerbros","warner-bros","universal","paramount","sony-pictures","lionsgate","mgm","dreamworks","illumination","laika","ghibli","studio-ghibli","toei","sunrise","bones","madhouse","mappa","wit","trigger","kyoani","kyoto-animation","ufotable","a1-pictures","cloverworks","shaft","gainax","khara","production-ig","ig","netflix","hulu","hbo","max","disney-plus","prime-video","peacock","paramount-plus","apple-tv","crunchyroll","funimation","hidive","vrv","cbs","nbc","abc","fox","cw","amc","fx","showtime","starz","epix","bbc","itv","channel4","sky","britbox","hayu","acorn","curiositystream","discovery","discovery-plus","history","natgeo","nat-geo","animal-planet","tesla","rivian","lucid","nio","xpeng","byd","polestar","fisker","ford","gm","general-motors","chevy","chevrolet","dodge","ram","jeep","chrysler","toyota","honda","nissan","mazda","subaru","mitsubishi","hyundai","kia","genesis","volkswagen","vw","audi","bmw","mercedes","porsche","lamborghini","ferrari","maserati","alfa-romeo","fiat","volvo","land-rover","range-rover","jaguar","bentley","rolls-royce","aston-martin","mclaren","bugatti","koenigsegg","pagani","rimac","lotus","alpine","medical","medicine","healthcare","health-care","hospital","hospitals","doctor","doctors","dr","physician","physicians","surgeon","surgeons","nurse","nurses","nursing","rn","lpn","cna","np","pa","physician-assistant","pharmacy","pharmacist","pharmacists","pharma","pharmaceutical","rx","dentist","dentists","dental","dentistry","orthodontist","orthodontics","optometrist","ophthalmologist","optometry","vision","eye-care","eyecare","therapist","therapists","therapy","counselor","counseling","psychologist","psychiatrist","psychiatry","psychology","mental-health","mentalhealth","physical-therapy","pt","occupational-therapy","ot","speech-therapy","slp","chiropractor","chiropractic","acupuncture","acupuncturist","naturopath","emt","paramedic","paramedics","ems","emergency","er","icu","nicu","radiology","radiologist","xray","mri","ct","ultrasound","imaging","pathology","pathologist","lab","laboratory","diagnostics","testing","oncology","oncologist","cancer","tumor","chemotherapy","radiation","cardiology","cardiologist","heart","cardiac","cardiovascular","cv","neurology","neurologist","neuro","brain","spine","neurosurgery","pediatrics","pediatrician","peds","children","child-health","childhealth","geriatrics","geriatrician","elderly","senior-care","seniorcare","aging","dermatology","dermatologist","derm","skin","skincare","skin-care","orthopedics","orthopedic","ortho","bone","joint","sports-medicine","gastroenterology","gastro","gi","digestive","gut","intestinal","endocrinology","endocrine","diabetes","thyroid","hormone","hormones","pulmonology","pulmonologist","respiratory","lung","lungs","breathing","nephrology","nephrologist","kidney","kidneys","renal","dialysis","urology","urologist","bladder","prostate","urinary","reproductive","obgyn","ob-gyn","obstetrics","gynecology","obstetrician","gynecologist","fertility","ivf","reproductive-health","reproductivehealth","prenatal","legal","lawyer","lawyers","attorney","attorneys","law","laws","lawfirm","paralegal","paralegals","legal-assistant","legalassistant","clerk","clerks","judge","judges","court","courts","courthouse","trial","trials","jury","litigation","litigator","litigators","lawsuit","lawsuits","case","cases","criminal","criminal-law","defense","defender","prosecution","prosecutor","civil","civil-law","tort","torts","injury","personal-injury","malpractice","corporate-law","corporatelaw","business-law","commercial","contracts","intellectual-property","ip","patent","patents","trademark","copyright","family-law","familylaw","divorce","custody","child-support","alimony","immigration","immigration-law","visa","visas","citizenship","naturalization","real-estate-law","property-law","estate","estates","probate","trusts","tax-law","taxlaw","irs","tax-attorney","taxattorney","audit","audits","employment-law","labor-law","hr-law","discrimination","harassment","constitutional","constitutional-law","civil-rights","human-rights","environmental-law","epa","regulation","regulations","compliance","bankruptcy","restructuring","insolvency","creditor","debtor","debt","education","educator","educators","teach","teaching","teacher","teachers","professor","professors","prof","profs","faculty","academic","academics","student","students","pupil","pupils","learner","learners","learning","school","schools","elementary","primary","middle-school","middleschool","high-school","highschool","secondary","k12","k-12","grade","grades","college","colleges","university","universities","uni","campus","campuses","undergraduate","undergrad","graduate","grad","postgrad","phd","doctorate","masters","bachelors","associates","degree","degrees","diploma","diplomas","curriculum","syllabus","course","courses","class","classes","lecture","seminar","seminars","workshop","workshops","lab","labs","laboratory","tutor","tutors","tutoring","mentor","mentors","mentoring","mentorship","homeschool","homeschooling","unschool","unschooling","montessori","waldorf","stem","steam","science","math","mathematics","calculus","algebra","english","literature","writing","grammar","composition","rhetoric","history","geography","social-studies","socialstudies","civics","economics","art","arts","music","drama","theater","theatre","dance","visual-arts","physical-education","pe","gym","athletics","sports","health","wellness","construction","contractor","contractors","builder","builders","building","carpenter","carpenters","carpentry","woodwork","woodworking","woodworker","electrician","electricians","electrical","electric","wiring","power","plumber","plumbers","plumbing","pipes","piping","drainage","sewage","hvac","heating","cooling","ac","air-conditioning","ventilation","duct","roofer","roofers","roofing","roof","roofs","shingles","gutters","mason","masons","masonry","brick","bricks","stone","concrete","cement","painter","painters","painting","paint","wallpaper","drywall","finishing","welder","welders","welding","fabrication","fabricator","metalwork","machinist","machinists","machining","lathe","mill","milling","turning","mechanic","mechanics","mechanical","automotive","auto","car-repair","landscaper","landscapers","landscaping","lawn","garden","gardening","surveyor","surveyors","surveying","survey","land","property","boundary","architect","architects","architecture","architectural","design","drafting","engineer","engineers","engineering","structural","civil-engineering","inspector","inspectors","inspection","code","codes","permit","permits","firefighter","firefighters","fire","fire-department","firedepartment","fd","police","police-officer","policeofficer","cop","cops","officer","officers","sheriff","sheriffs","deputy","deputies","detective","detectives","state-trooper","trooper","troopers","highway-patrol","patrol","patrolling","swat","tactical","k9","k-9","canine","bomb-squad","bombsquad","hostage","emt","emts","paramedic","paramedics","ambulance","ems","first-responder","dispatcher","dispatchers","dispatch","911","emergency","emergencies","search-rescue","sar","rescue","rescuer","rescuers","coast-guard","lifeguard","hazmat","hazardous","decon","decontamination","chemical","biological","military","armed-forces","armedforces","defense","defence","dod","mod","army","soldier","soldiers","infantry","armor","artillery","cavalry","navy","sailor","sailors","naval","fleet","submarine","surface","carrier","airforce","air-force","pilot","pilots","aviator","aviation","fighter","marines","marine","marinecorps","marine-corps","leatherneck","oorah","coastguard","coast-guard","uscg","maritime","port","harbor","border","spaceforce","space-force","ussf","space","satellite","orbital","launch","national-guard","nationalguard","guard","reserve","reserves","reservist","veteran","veterans","vet","vets","retired","retiree","retirees","officer","officers","enlisted","nco","warrant","general","admiral","special-ops","specialops","specops","sof","delta","seals","rangers","green-berets","greenberets","airborne","paratrooper","paratroopers","outdoor","outdoors","outside","nature","wilderness","wild","backcountry","hiking","hiker","hikers","backpacking","backpacker","thru-hike","thruhike","camping","camper","campers","campsite","tent","tenting","glamping","rv","rving","campervan","vanlife","van-life","overlanding","overland","fishing","fisher","fishers","angler","anglers","angling","fly-fishing","hunting","hunter","hunters","hunt","game","wildlife","deer","elk","duck","birding","birdwatching","bird-watching","birder","birders","ornithology","foraging","forager","foragers","mushroom","mushrooms","fungi","mycology","kayaking","kayak","kayaker","kayakers","canoeing","canoe","paddling","rafting","raft","rafts","whitewater","white-water","rapids","river","scuba","diving","diver","divers","snorkeling","snorkel","freediving","sailing","sailor","sailors","sail","sailboat","yacht","yachting","rock-climbing","rockclimbing","bouldering","climber","climbers","crag","mountaineering","mountaineer","alpinism","alpine","summit","peak-bagging","caving","caver","cavers","spelunking","spelunker","cave","caves","offroad","off-road","atv","utv","sxs","dirtbike","dirt-bike","quad","photography","photographer","photographers","photo","photos","camera","videography","videographer","video","videos","filming","filmmaking","painting","painter","painters","canvas","acrylic","oil","watercolor","drawing","drawer","drawers","sketch","sketching","pencil","charcoal","sculpting","sculptor","sculptors","sculpture","clay","pottery","ceramics","knitting","knitter","knitters","knit","yarn","wool","needles","pattern","crocheting","crochet","crocheter","hook","hooks","amigurumi","blanket","sewing","sewer","sewers","seamstress","tailor","fabric","quilting","embroidery","embroiderer","cross-stitch","crossstitch","needlepoint","woodworking","woodworker","woodworkers","carpentry","furniture","lathe","metalworking","metalworker","blacksmith","blacksmithing","forge","forging","leatherworking","leatherwork","leather","leathercraft","tanning","tooling","jewelry-making","jewelrymaking","jeweler","beading","beads","wirework","origami","paper-craft","papercraft","scrapbooking","scrapbook","cardmaking","calligraphy","calligrapher","lettering","hand-lettering","handlettering","candle-making","candlemaking","soap-making","soapmaking","bath-bombs","collecting","collector","collectors","collection","collections","collectible","stamps","stamp","philately","philatelist","postage","postal","letters","coins","coin","numismatics","numismatist","currency","bullion","precious","cards","card","trading-cards","tradingcards","tcg","ccg","mtg","pokemon-tcg","comics","comic","comic-books","comicbooks","graphic-novels","graphicnovels","manga","manhwa","manhua","webtoon","webtoons","light-novel","lightnovel","figurines","figure","figures","statue","statues","action-figures","toys","funko","funko-pop","funkopop","pop","pops","nendoroid","figma","sh-figuarts","model-kits","modelkits","gunpla","gundam","plamo","scale-models","miniatures","lego","legos","bricks","moc","mocs","afol","tfol","kfol","megabloks","antiques","antique","vintage","retro","thrift","thrifting","estate-sale","vinyl","records","record","lp","lps","turntable","audiophile","hifi","watches","watch","horology","horologist","timepiece","wristwatch","pocket","boardgame","boardgames","board-games","board-game","tabletop","table-top","cardgame","cardgames","card-games","card-game","deckbuilder","deck-builder","rpg","rpgs","tabletop-rpg","ttrpg","pen-and-paper","roleplay","roleplaying","dnd","d-and-d","dungeons-and-dragons","dungeonsanddragons","dungeon","dragon","pathfinder","starfinder","call-of-cthulhu","coc","shadowrun","cyberpunk-red","warhammer","warhammer40k","40k","age-of-sigmar","aos","sigmar","gw","warmachine","hordes","infinity","malifaux","necromunda","kill-team","killteam","miniature","miniatures","minis","mini","wargaming","wargames","wargamer","painting-minis","paintingminis","mini-painting","minipainting","terrain","chess","checkers","go","baduk","weiqi","shogi","mahjong","mah-jong","poker","blackjack","bridge","canasta","rummy","hearts","spades","solitaire","catan","settlers","ticket-to-ride","tickettoride","pandemic","wingspan","gloomhaven","spirit-island","spiritisland","terraforming-mars","scythe","pets","pet","petcare","pet-care","petowner","pet-owner","petparents","dogs","dog","puppy","puppies","pupper","doggo","doggos","canine","k9","cats","cat","kitten","kittens","kitty","kitties","feline","meow","birds","bird","parrot","parrots","parakeet","budgie","cockatiel","finch","fish","aquarium","aquariums","fishtank","fish-tank","freshwater","saltwater","reef","reeftank","reef-tank","coral","corals","marine","aquascape","reptiles","reptile","snake","snakes","lizard","lizards","gecko","bearded","turtle","turtles","tortoise","tortoises","terrapin","amphibian","frog","rabbit","rabbits","bunny","bunnies","hare","lagomorph","binky","binkies","hamster","hamsters","gerbil","gerbils","mouse","mice","rat","rats","guinea-pig","guineapig","guinea","cavy","cavies","chinchilla","ferret","horse","horses","equine","equestrian","pony","ponies","riding","stable","farm","farming","farmlife","farm-life","livestock","chicken","chickens","goat","goats","sheep","lamb","lambs","pig","pigs","cow","cows","cattle","english","spanish","espanol","french","francais","german","deutsch","italian","italiano","portuguese","portugues","russian","russkiy","japanese","nihongo","chinese","mandarin","cantonese","zhongwen","korean","hangul","hangugeo","arabic","hindi","urdu","bengali","turkish","turkce","persian","farsi","dutch","nederlands","polish","swedish","svenska","norwegian","norsk","danish","dansk","finnish","greek","ellinika","hebrew","ivrit","vietnamese","tiengviet","thai","indonesian","bahasa","malay","tagalog","filipino","swahili","kiswahili","czech","cestina","hungarian","magyar","romanian","romana","ukrainian","usa","united-states","unitedstates","america","american","americans","canada","canadian","canadians","mexico","mexican","mexicans","brasil","brazil","brazilian","argentina","argentine","chile","chilean","peru","colombia","colombian","venezuela","venezuelan","ecuador","uruguay","uk","united-kingdom","unitedkingdom","britain","british","england","scotland","scottish","wales","welsh","ireland","irish","northern-ireland","france","french","germany","german","germans","italy","italian","italians","spain","spanish","portugal","portuguese","netherlands","dutch","belgium","switzerland","swiss","austria","austrian","poland","polish","czech","russia","russian","russians","ukraine","ukrainian","ukrainians","belarus","china","chinese","taiwan","taiwanese","hongkong","hong-kong","macau","japan","japanese","korea","korean","koreans","north-korea","south-korea","india","indian","indians","pakistan","pakistani","bangladesh","bangladeshi","australia","australian","australians","aussie","aussies","nz","newzealand","new-zealand","kiwi","kiwis","fiji","fijian","samoa","samoan","tonga","philippines","filipino","filipinos","pinoy","pinay","vietnam","vietnamese","thailand","thai","thais","indonesia","indonesian","malaysia","malaysian","singapore","singaporean","brunei","myanmar","burmese","cambodia","cambodian","laos","laotian","nepal","nepali","srilanka","sri-lanka","srilankan","egypt","egyptian","egyptians","morocco","moroccan","algeria","algerian","tunisia","tunisian","libya","libyan","sudan","sudanese","ethiopia","kenya","kenyan","kenyans","tanzania","tanzanian","uganda","ugandan","nigeria","nigerian","nigerians","ghana","ghanaian","senegal","senegalese","southafrica","south-africa","southafrican","south-african","namibia","botswana","zimbabwe","zambia","mozambique","angola","congo","congolese","israel","israeli","israelis","palestine","palestinian","palestinians","jordan","jordanian","lebanon","lebanese","syria","syrian","iraq","iraqi","iran","iranian","iranians","persian","persians","saudi","saudi-arabia","uae","emirates","emirati","dubai","abudhabi","abu-dhabi","qatar","qatari","kuwait","kuwaiti","bahrain","bahraini","oman","omani","yemen","yemeni","turkey","turkish","turks","greece","greek","greeks","cyprus","cypriot","scandinavia","scandinavian","nordic","norway","norwegian","sweden","swedish","denmark","danish","finland","finnish","finns","iceland","icelandic","baltics","baltic","estonia","estonian","latvia","latvian","lithuania","balkans","balkan","serbia","serbian","croatia","croatian","bosnia","slovenia","slovenian","macedonia","macedonian","albania","albanian","romania","romanian","bulgaria","bulgarian","hungary","hungarian","slovakia","slovak","slovakian","moldova","moldovan","georgia","georgian","armenia","armenian","azerbaijan","azerbaijani","kazakhstan","kazakh","uzbekistan","uzbek","turkmenistan","kyrgyzstan","tajikistan","mongolia","caribbean","jamaica","jamaican","bahamas","bahamian","barbados","trinidad","cuba","cuban","haiti","haitian","dominican","puerto-rico","puertorico","latin","latino","latina","latinx","hispanic","latinoamerica","latam","california","cali","ca","socal","norcal","bayarea","bay-area","la","texas","tx","houston","dallas","austin","sanantonio","san-antonio","florida","fl","miami","orlando","tampa","jacksonville","fortlauderdale","newyork","new-york","ny","nyc","brooklyn","manhattan","queens","bronx","pennsylvania","pa","philly","philadelphia","pittsburgh","harrisburg","illinois","il","chicago","chi","chiraq","chitown","springfield","ohio","oh","cleveland","columbus","cincinnati","toledo","akron","georgia","ga","atlanta","atl","savannah","augusta","macon","northcarolina","north-carolina","nc","charlotte","raleigh","durham","southcarolina","south-carolina","sc","charleston","columbia","greenville","michigan","mi","detroit","annarbor","ann-arbor","grandrapids","lansing","newjersey","new-jersey","nj","jersey","newark","trenton","atlantic-city","virginia","va","richmond","norfolk","vb","virginia-beach","alexandria","washington","wa","seattle","tacoma","spokane","olympia","bellevue","arizona","az","phoenix","phx","tucson","scottsdale","mesa","tempe","massachusetts","ma","boston","cambridge","worcester","springfield","tennessee","tn","nashville","memphis","knoxville","chattanooga","indiana","in","indianapolis","indy","fortwayne","fort-wayne","southbend","missouri","mo","stlouis","st-louis","kansascity","kansas-city","springfield","maryland","md","baltimore","bmore","annapolis","bethesda","rockville","wisconsin","wi","milwaukee","madison","greenbay","green-bay","kenosha","colorado","co","denver","boulder","coloradosprings","colorado-springs","minnesota","mn","minneapolis","stpaul","st-paul","twincities","twin-cities","alabama","al","birmingham","montgomery","mobile","huntsville","tuscaloosa","louisiana","la","neworleans","new-orleans","nola","batonrouge","baton-rouge","kentucky","ky","louisville","lexington","bowling-green","frankfort","oregon","or","portland","pdx","eugene","salem","bend","medford","oklahoma","ok","okc","oklahomacity","oklahoma-city","tulsa","norman","connecticut","ct","hartford","newhaven","new-haven","stamford","bridgeport","utah","ut","saltlakecity","salt-lake-city","slc","provo","ogden","iowa","ia","desmoines","des-moines","cedarrapids","cedar-rapids","davenport","nevada","nv","lasvegas","las-vegas","vegas","reno","henderson","sparks","arkansas","ar","littlerock","little-rock","fayetteville","fortsmith","mississippi","ms","jackson","gulfport","biloxi","hattiesburg","southaven","kansas","ks","wichita","overlandpark","overland-park","kansascity","topeka","newmexico","new-mexico","nm","albuquerque","santafe","santa-fe","lascruces","nebraska","ne","omaha","lincoln","bellevue","grandisland","grand-island","idaho","id","boise","meridian","nampa","idahofalls","idaho-falls","pocatello","westvirginia","west-virginia","wv","charleston","huntington","morgantown","hawaii","hi","honolulu","maui","oahu","kauai","bigisland","big-island","newhampshire","new-hampshire","nh","manchester","nashua","concord","portsmouth","maine","me","portland","lewiston","bangor","auburn","augusta","rhodeisland","rhode-island","ri","providence","warwick","cranston","newport","montana","mt","billings","missoula","greatfalls","great-falls","bozeman","delaware","de","wilmington","dover","newark","middletown","smyrna","southdakota","south-dakota","sd","siouxfalls","sioux-falls","rapidcity","northdakota","north-dakota","nd","fargo","bismarck","grandforks","grand-forks","alaska","ak","anchorage","fairbanks","juneau","sitka","ketchikan","vermont","vt","burlington","essex","rutland","colchester","bennington","wyoming","wy","cheyenne","casper","laramie","gillette","rocksprings","dc","washingtondc","washington-dc","dmv","nova","northern-virginia","puertorico","puerto-rico","pr","sanjuan","san-juan","bayamon","carolina","midwest","midwestern","northeast","northeastern","southeast","southeastern","southwest","southwestern","northwest","northwestern","pacificnorthwest","pnw","newengland","new-england","deepouth","deep-south","sunbelt","sun-belt","rustbelt","rust-belt","biblebelt","bible-belt","cornbelt","corn-belt",...Lf,...Nf];async function _f(a){const e=function(a){let e=a.startsWith("#")?a.slice(1):a;return e=e.toLowerCase().replace(/[^a-z0-9-]/g,""),e=e.replace(/-+/g,"-"),e=e.replace(/^-+|-+$/g,""),e}(a);if(!e)throw new Error(`Invalid channel name: "${a}" filters to empty string`);const n=`#${e}`,o=(new TextEncoder).encode(n),t=(await yf(o)).slice(0,16),r=(await yf(t))[0],s=new Uint8Array(32);return s.set(t),{name:`#${e}`,channelHash:r,aesKey:t,hmacKey:s,autoDiscovered:!0}}let Vf=null,Of=null;const $f=new Map;let Wf=null;const Uf="pymc_discovered_channels";function Hf(a){$f.set(a.channelHash,a),a.autoDiscovered&&function(){try{const a=[];for(const e of $f.values())e.autoDiscovered&&a.push({name:e.name,hash:e.channelHash});localStorage.setItem(Uf,JSON.stringify(a))}catch(a){}}()}async function Yf(){Vf||(Of||(Of=(async()=>{await async function(){try{const a=localStorage.getItem(Uf);if(!a)return;const e=JSON.parse(a);for(const{name:n}of e)try{const a=await _f(n);$f.set(a.channelHash,a)}catch{}e.length}catch(a){}}();const a=new Map;for(const e of If)try{const n=await _f(e),o=a.get(n.channelHash)||[];o.push(n),a.set(n.channelHash,o)}catch{}Vf=a})()),await Of)}async function Gf(a,e,n){const o=await async function(a,e){if(hf())try{const n=new ArrayBuffer(a.length);new Uint8Array(n).set(a);const o=new ArrayBuffer(e.length);new Uint8Array(o).set(e);const t=await crypto.subtle.importKey("raw",n,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),r=await crypto.subtle.sign("HMAC",t,o);return new Uint8Array(r)}catch{}return async function(a,e){const n=64;let o;a.length>n?(o=new Uint8Array(n),o.set(ff(a))):(o=new Uint8Array(n),o.set(a));const t=new Uint8Array(n),r=new Uint8Array(n);for(let c=0;c=2024&&n<=2030;if(!o)return{valid:!1,confidence:"low"};const t=a.slice(5);if(0===t.length)return{valid:!1,confidence:"low"};let r=0,s=!1;for(let l=0;l=32&&a<=126||0===a||10===a||13===a||9===a)&&r++,58===a&&(s=!0)}const i=r/t.length;return i>=.85&&s&&o?{valid:!0,confidence:"high"}:i>=.7&&o?{valid:!0,confidence:"medium"}:{valid:!1,confidence:"low"}}async function Xf(a,e,n){await Yf();const o=await async function(){return Wf||(Wf=await async function(a,e=!1){const n=sf(a.secret),o=(await yf(n))[0],t=new Uint8Array(32);return t.set(n.slice(0,32)),{name:a.name,channelHash:o,aesKey:t.slice(0,16),hmacKey:t,autoDiscovered:e}}(Rf)),Wf}();if(o.channelHash===a&&await Gf(o.hmacKey,e,n))return{channelName:"Public",plaintext:Ef(o.aesKey,n),keys:o};const t=$f.get(a);if(t&&await Gf(t.hmacKey,e,n)){const a=Ef(t.aesKey,n);return{channelName:t.name,plaintext:a,keys:t}}const r=(null==Vf?void 0:Vf.get(a))||[],s=[];for(const l of r){if(await Gf(l.hmacKey,e,n)){Hf(l);const a=Ef(l.aesKey,n);return{channelName:l.name,plaintext:a,keys:l}}s.push(l)}let i=null;for(const l of s)try{const a=Ef(l.aesKey,n),e=Kf(a);if(e.valid){if("high"===e.confidence)return{channelName:l.name,plaintext:a,keys:l,macCorrupted:!0};"medium"!==e.confidence||i||(i={keys:l,plaintext:a,confidence:"medium"})}}catch{}return i?{channelName:i.keys.name,plaintext:i.plaintext,keys:i.keys,macCorrupted:!0}:null}async function Jf(a){return await Yf(),((null==Vf?void 0:Vf.get(a))||[]).map(a=>a.name)}async function Zf(a,e,n,o){try{const t=await _f(a);if(t.channelHash!==e)return{success:!1,error:`Hash mismatch: "${a}" has hash 0x${t.channelHash.toString(16).toUpperCase().padStart(2,"0")}, packet has 0x${e.toString(16).toUpperCase().padStart(2,"0")}`};if(!(await Gf(t.hmacKey,n,o)))return{success:!1,error:"MAC verification failed - wrong channel name or corrupted data"};const r=Ef(t.aesKey,o);return Hf(t),{success:!0,result:{channelName:t.name,plaintext:r,keys:t}}}catch(t){return{success:!1,error:`Error: ${t instanceof Error?t.message:String(t)}`}}}function Qf(a){return{decoded:a.success?{type:"grp_txt",channelHash:a.channelHash,channelName:a.channelName,text:a.text??"",decrypted:!0,senderName:a.senderName,timestamp:a.timestamp,flags:a.flags,macCorrupted:a.macCorrupted,isPublicHashChannel:!0}:null,timestamp:a.packetTimestamp,rssi:a.rssi,snr:a.snr}}const ay=w((a,e)=>{let n=!1;return{messages:new Map,stableMessages:new Map,lastSnapshotUpdate:0,processing:new Set,progress:{total:0,processed:0,percent:0,isDecoding:!1},initialDecodeComplete:!1,queueDecryption:async(o,t)=>{const{messages:r,processing:s}=e(),i=(null==t?void 0:t.quickMode)??!1;let l=o.filter(a=>(a.type??a.payload_type)===_b.GRP_TXT&&a.raw_packet&&!r.has(a.packet_hash)&&!s.has(a.packet_hash));if(0===l.length)return;if(i&&l.length>100&&(l=l.sort((a,e)=>(e.timestamp??0)-(a.timestamp??0)).slice(0,100)),n)return;n=!0;const c=new Set(l.map(a=>a.packet_hash));a(a=>({processing:new Set([...a.processing,...c]),progress:{total:l.length,processed:0,percent:0,isDecoding:!0}}));try{const{totalCount:n}=await bb.decrypt(l,{onProgress:(e,n)=>{a({progress:{total:n,processed:e,percent:Math.round(e/n*100),isDecoding:!0}})},onResult:e=>{a(a=>{const n=new Map(a.messages);n.set(e.packetHash,Qf(e));const o=new Map(a.stableMessages);return o.set(e.packetHash,Qf(e)),{messages:n,stableMessages:o,lastSnapshotUpdate:Date.now()}})}}),o=e().messages;if(o.size>5e4){const e=Array.from(o.entries()).sort((a,e)=>a[1].timestamp-e[1].timestamp).slice(0,o.size-5e4),n=new Map(o);for(const[a]of e)n.delete(a);a({messages:n,stableMessages:new Map(n)})}a({processing:new Set,initialDecodeComplete:!0,progress:{total:n,processed:n,percent:100,isDecoding:!1}})}catch(d){a({processing:new Set,progress:{total:0,processed:0,percent:0,isDecoding:!1}})}finally{n=!1}},getMessage:a=>e().messages.get(a),getSuccessfulMessages:()=>{var a;const{messages:n}=e(),o=[];for(const e of n.values())(null==(a=e.decoded)?void 0:a.decrypted)&&!e.decoded.macCorrupted&&o.push(e);return o.sort((a,e)=>a.timestamp-e.timestamp)},clear:()=>{a({messages:new Map,stableMessages:new Map,lastSnapshotUpdate:0,processing:new Set,progress:{total:0,processed:0,percent:0,isDecoding:!1},initialDecodeComplete:!1})}}});function ey(a){return ay(e=>e.messages.get(a))}function ny(){return ay(a=>a.progress)}function oy(){return ay(a=>a.initialDecodeComplete)}function ty(){return ay(a=>a.stableMessages)}function ry(a){return a.startsWith("0x")||a.startsWith("0X")?a.slice(2,4).toUpperCase():a.slice(0,2).toUpperCase()}function sy(a,e){let n=a.forwarded_path??a.original_path;if("string"==typeof n)try{n=JSON.parse(n)}catch{return null}if(!n||!Array.isArray(n)||0===n.length)return null;const o=n.map(a=>String(a).toUpperCase()),t=e?ry(e):null,r=o[o.length-1],s=null!==t&&r===t,i=s?o.slice(0,-1):[...o];return{effective:i,original:o,hadLocal:s,effectiveLength:i.length}}function iy(a,e){const n=a.toUpperCase();return e.startsWith("0x")||e.startsWith("0X")?e.slice(2).toUpperCase().startsWith(n):e.toUpperCase().startsWith(n)}const ly=[{label:"20m",minutes:20,buckets:80},{label:"1h",minutes:60,buckets:80},{label:"3h",minutes:180,buckets:80},{label:"12h",minutes:720,buckets:80},{label:"24h",minutes:1440,buckets:80},{label:"3d",minutes:4320,buckets:80},{label:"7d",minutes:10080,buckets:80},{label:"14d",minutes:20160,buckets:80}],cy=[{label:"1h",hours:1},{label:"3h",hours:3},{label:"12h",hours:12},{label:"24h",hours:24},{label:"3d",hours:72},{label:"7d",hours:168},{label:"14d",hours:336}];function dy(a,e=12){return Math.max(e,Math.round(a/15))}const uy={hero:dy(1200),statsCard:dy(380)};function hy(a){switch(a){case 1:return 3600;case 3:case 12:return 5400;case 24:return 8640;case 72:case 168:case 336:return 720;default:{const e=3600*a,n=Math.round(e/10);return Math.min(Math.max(360,n),720)}}}const my="'JetBrains Mono', 'SF Mono', Monaco, monospace",py={stats:3e3,packets:3e3,logs:2e3,system:3e3},gy={DEBUG:"text-sys-brown",INFO:"text-sys-cyan",WARNING:"text-sys-amber",ERROR:"text-sys-red",CRITICAL:"text-sys-pink"};function by(a){return gy[a]??"text-text-muted border-border-subtle"}function fy(a){return a?(a.startsWith("0x")?a.slice(2):a).slice(0,2).toUpperCase():""}function yy(a,e){if(!a)return"expired";const n=e/1e3-a;return n<=10800?"active":n<=86400?"stale":"expired"}function vy(a,e,n=Date.now()){if(!a)return[];const o=Object.keys(a);if(0===o.length)return[];const t=[];for(let r=0;re.count!==a.count?e.count-a.count:e.lastSeen-a.lastSeen),t}const wy={critical:0,high:150,medium:300,low:450};let ky=!1;const xy=[],jy=new Set;function zy(a,e="medium"){if(ky){const n=setTimeout(()=>{a(),jy.delete(n)},wy[e]);return jy.add(n),()=>{clearTimeout(n),jy.delete(n)}}{const n={callback:a,priority:e};return xy.push(n),()=>{const a=xy.indexOf(n);-1!==a&&xy.splice(a,1)}}}const Cy="pymc-hidden-contacts",Ay="pymc-quick-neighbors",Dy="pymc-local-hash",Ey="pymc-global-time-range";let By=null;function Fy(a){return 4===(a.type??a.payload_type)&&!0!==a.transmitted&&function(a){const e=function(a){if(Array.isArray(a))return a;if("string"==typeof a&&a.startsWith("["))try{const e=JSON.parse(a);return Array.isArray(e)?e:[]}catch{return[]}return[]}(a.original_path),n=a.route??a.route_type;return 2===(o=n)||3===o?0===e.length:sr(n)?e.length<=1:0===e.length;var o}(a)}function qy(a,e,n,o){if(!a)return null;let t=a;if(a.length<=4){const o=a.replace(/^0x/i,"").toUpperCase();if(o===e)return null;const r=n.get(o);if(!r)return null;t=r}return o.has(t)?ry(t)===e?null:t:null}function Sy(a,e){a.count++,void 0!==e.rssi&&null!==e.rssi&&(a.rssiSum+=e.rssi,a.rssiCount++),void 0!==e.snr&&null!==e.snr&&(a.snrSum+=e.snr,a.snrCount++);const n=e.timestamp??0;n>a.lastSeen&&(a.lastSeen=n)}function My(a){return{hash:a,count:0,rssiSum:0,rssiCount:0,snrSum:0,snrCount:0,lastSeen:0}}function Ty(a,e){const n=function(a,e){const n=e-1e3*a;return n<=6048e5?"active":n<=12096e5?"stale":"expired"}(a.lastSeen,e);return"expired"===n?null:{hash:a.hash,prefix:ry(a.hash),count:a.count,avgRssi:a.rssiCount>0?a.rssiSum/a.rssiCount:null,avgSnr:a.snrCount>0?a.snrSum/a.snrCount:null,lastSeen:a.lastSeen,status:n}}function Py(){if("undefined"==typeof window)return[];try{const a=localStorage.getItem(Ay);if(a)return JSON.parse(a)}catch{}return[]}function Ly(a){"undefined"!=typeof window&&(By&&clearTimeout(By),By=setTimeout(()=>{try{localStorage.setItem(Ay,JSON.stringify(a))}catch{}By=null},1e3))}function Ry(){if("undefined"!=typeof window)try{const a=localStorage.getItem(Dy);if(a)return a}catch{}}function Ny(a){if("undefined"!=typeof window)try{localStorage.setItem(Dy,a)}catch{}}function Iy(){if("undefined"==typeof window)return new Set;try{const a=localStorage.getItem(Cy);if(a)return new Set(JSON.parse(a))}catch{}return new Set}function _y(){if("undefined"==typeof window)return 4;try{const a=localStorage.getItem(Ey);if(a){const e=parseInt(a,10);if(!isNaN(e)&&e>=0&&e<=7)return e>4?4:e}}catch{}return 4}const Vy=w((a,e)=>({stats:null,statsLoading:!1,statsError:null,packets:Gg.getPackets(),packetsLoading:!1,packetsError:null,lastPacketTimestamp:Gg.getNewestTimestamp(),logs:[],logsLoading:!1,liveMode:!0,flashReceived:0,flashAdvert:0,pendingAdvertLocalHash:null,pendingAdvertTimestamp:null,resourceHistory:[],lastResourceFetch:0,hardwareStats:null,hardwareStatsLoading:!1,hardwareStatsError:null,hiddenContacts:Iy(),quickNeighbors:Py(),cachedLocalHash:Ry(),initialized:!1,packetCacheState:Gg.getState(),mutationsInFlight:new Set,globalTimeRangeIndex:_y(),initializeApp:async()=>{const{initialized:n}=e();if(n)return;a({initialized:!0,statsLoading:!0,packetsLoading:!0}),Gg.subscribe(e=>{a({packetCacheState:e})});const{hiddenContacts:o}=e();let t=null;Ag().then(e=>{const n=vy(e.neighbors,o),t=e.local_hash;a({stats:e,statsLoading:!1,quickNeighbors:n,cachedLocalHash:t}),Ly(n),t&&Ny(t)}).catch(e=>{a({statsError:e instanceof Error?e.message:"Failed to fetch stats",statsLoading:!1})}),Gg.initialLoad(()=>{t&&clearTimeout(t),t=setTimeout(()=>{const e=Gg.getPackets();if(e.length>0){const n=Gg.getNewestTimestamp();a({packets:e,lastPacketTimestamp:n})}},250)}).then(n=>{if(t&&clearTimeout(t),n.length>0){const o=Gg.getNewestTimestamp();a({packets:n,packetsLoading:!1,lastPacketTimestamp:o});const t=(a,e)=>{"requestIdleCallback"in window?requestIdleCallback(()=>a(),{timeout:e}):setTimeout(a,100)};t(()=>e().triggerTopologyCompute(),2e3),t(()=>e().triggerSparklineCompute(),1e3),setTimeout(()=>function(){if(!ky){ky=!0;for(const a of xy){const e=wy[a.priority],n=setTimeout(()=>{a.callback(),jy.delete(n)},e);jy.add(n)}xy.length=0}}(),16),setTimeout(()=>{ay.getState().queueDecryption(n,{quickMode:!0})},500)}else a({packetsLoading:!1})}).catch(e=>{a({packetsError:e instanceof Error?e.message:"Failed to load packets",packetsLoading:!1})}),nb.getState().initialize(),Qg.onPacket(n=>{const{lastPacketTimestamp:o,mutationsInFlight:t}=e();if(t.size>0)return;eb.stage(n);const r=n.timestamp??0;r>o&&a({flashReceived:e().flashReceived+1,lastPacketTimestamp:r})}),Qg.onStats(n=>{const{mutationsInFlight:o,hiddenContacts:t}=e();if(o.size>0)return;const r=vy(n.neighbors,t),s=n.local_hash;a({stats:n,statsLoading:!1,statsError:null,quickNeighbors:r,cachedLocalHash:s}),Ly(r),s&&Ny(s)}),Qg.onPacketStats(n=>{const{stats:o,mutationsInFlight:t}=e();if(!o||t.size>0)return;const r={...o,rx_count:n.rx_count??o.rx_count,tx_count:n.tx_count??o.tx_count,forwarded_count:n.forwarded_count??o.forwarded_count,dropped_count:n.dropped_count??o.dropped_count};a({stats:r})});{const n="";Ig.init({apiBaseUrl:n,authToken:sg()??void 0,statsIntervalMs:py.stats,packetsIntervalMs:py.packets}).then(()=>{if(Ig.onStats((n,o)=>{const{mutationsInFlight:t,hiddenContacts:r}=e();if(t.size>0)return;const s=vy(n.neighbors,r),i=n.local_hash;a({stats:n,statsLoading:!1,statsError:null,quickNeighbors:s,cachedLocalHash:i}),Ly(s),i&&Ny(i),gb.getState().updateRestHealth(!0)}),Ig.onPackets((n,o,t)=>{if(0===n.length)return;const{lastPacketTimestamp:r}=e(),s=n.map(a=>a.packet_hash).filter(a=>!!a);eb.confirmBatch(s),Gg.mergePacketsDirectly(n);const i=t>r;i&&Fg();const l=Gg.getPackets();a({packets:l,packetsLoading:!1,packetsError:null,lastPacketTimestamp:Math.max(t,r)}),i&&e().triggerTopologyCompute(),ay.getState().queueDecryption(n)}),Ig.onError((e,n)=>{"stats"===e?(a({statsError:n}),gb.getState().updateRestHealth(!1)):a({packetsError:n})}),"undefined"!=typeof document){let a=Date.now();const n=3e5;document.addEventListener("visibilitychange",async()=>{if(document.hidden)a=Date.now();else{const o=Date.now()-a>n;o&&(Qg.resetSupported(),Qg.isConnected()?await Qg.verifyConnection(3e3)||(Qg.disconnect(),Qg.connect()):Qg.isSupported()&&Qg.connect()),Ig.forceRefresh(),o&&e().fetchStats({force:!0})}})}}).catch(a=>{!function(a){setInterval(()=>{Gg.isHeavyLoadInProgress()||a().fetchStats()},py.stats),setInterval(()=>{a().liveMode&&!Gg.isHeavyLoadInProgress()&&a().fetchPackets()},py.packets)}(e)})}e().fetchHardwareStats(),setInterval(()=>{"undefined"!=typeof document&&document.hidden||e().fetchHardwareStats()},py.system)},prefetchForRoute:a=>{switch(a){case"/logs":Dg().catch(()=>{});break;case"/system":Sg().catch(()=>{});break;case"/statistics":(async function(a=24){return kg(`/api/packet_type_graph_data?hours=${a}`)})(3).catch(()=>{}),Eg(3).catch(()=>{});break;case"/settings":(async function(){return kg("/api/radio_presets")})().catch(()=>{})}},fetchStats:async n=>{const{stats:o,mutationsInFlight:t,hiddenContacts:r}=e();if(!(t.size>0)||(null==n?void 0:n.force)){o||a({statsLoading:!0}),a({statsError:null});try{const e=await Ag(),n=vy(e.neighbors,r),o=e.local_hash;a({stats:e,statsLoading:!1,quickNeighbors:n,cachedLocalHash:o}),Ly(n),o&&Ny(o)}catch(s){a({statsError:s instanceof Error?s.message:"Failed to fetch stats",statsLoading:!1})}}},fetchPackets:async n=>{const{packets:o,lastPacketTimestamp:t}=e();0===o.length&&a({packetsLoading:!0}),a({packetsError:null});try{const n=await Gg.poll(),r=Gg.getNewestTimestamp(),s=r>t&&t>0,i=n.length!==o.length||s;s&&(a({flashReceived:e().flashReceived+1}),Fg()),a(i?{packets:n,packetsLoading:!1,lastPacketTimestamp:r||t}:{packetsLoading:!1}),s&&(e().triggerTopologyCompute(),ay.getState().queueDecryption(n))}catch(r){a({packetsError:r instanceof Error?r.message:"Failed to fetch packets",packetsLoading:!1})}},fetchLogs:async()=>{const{logs:n}=e();0===n.length&&a({logsLoading:!0});try{const e=await Dg();a({logs:e.logs,logsLoading:!1})}catch{a({logsLoading:!1})}},setLiveMode:e=>{a({liveMode:e}),Ig.isReady()&&Ig.setLiveMode(e)},setMode:async n=>{const o="setMode",{mutationsInFlight:t}=e(),r=new Set(t);r.add(o),a({mutationsInFlight:r});try{if(!(await Lg(n)).success)throw new Error("Backend returned unsuccessful response");await e().fetchStats({force:!0})}catch(s){const{mutationsInFlight:n}=e(),t=new Set(n);throw t.delete(o),a({mutationsInFlight:t}),s}},clearModeMutation:()=>{const{mutationsInFlight:n}=e(),o=new Set(n);o.delete("setMode"),a({mutationsInFlight:o})},setDutyCycle:async n=>{const o="setDutyCycle",{mutationsInFlight:t}=e(),r=new Set(t);r.add(o),a({mutationsInFlight:r});try{if(!(await Rg(n)).success)throw new Error("Backend returned unsuccessful response");await e().fetchStats({force:!0})}finally{const{mutationsInFlight:n}=e(),t=new Set(n);t.delete(o),a({mutationsInFlight:t})}},setDutyCycleConfig:async n=>{var o;const t="setDutyCycleConfig",{mutationsInFlight:r}=e(),s=new Set(r);s.add(t),a({mutationsInFlight:s});try{const a=await async function(a){return kg("/api/update_duty_cycle_config",{method:"POST",body:JSON.stringify(a)})}(n);if(!a.success&&!(null==(o=a.data)?void 0:o.persisted))throw new Error("Backend returned unsuccessful response");await e().fetchStats({force:!0})}catch(i){const{mutationsInFlight:n}=e(),o=new Set(n);throw o.delete(t),a({mutationsInFlight:o}),i}},clearDutyCycleMutation:()=>{const{mutationsInFlight:n}=e(),o=new Set(n);o.delete("setDutyCycleConfig"),a({mutationsInFlight:o})},startMutation:n=>{const{mutationsInFlight:o}=e(),t=new Set(o);t.add(n),a({mutationsInFlight:t})},clearMutation:n=>{const{mutationsInFlight:o}=e(),t=new Set(o);t.delete(n),a({mutationsInFlight:t})},sendAdvert:async()=>{try{const n=await Pg();return n.success?(a({flashAdvert:e().flashAdvert+1}),{success:!0}):{success:!1,error:n.error||"Failed to send advert"}}catch(n){return{success:!1,error:n instanceof Error?n.message:"Unknown error"}}},triggerFlashReceived:()=>{a({flashReceived:e().flashReceived+1})},triggerFlashAdvert:()=>{a({flashAdvert:e().flashAdvert+1})},fetchHardwareStats:async()=>{try{const n=await Sg();if(n.success&&n.data){const o=n.data;a({hardwareStats:o,hardwareStatsLoading:!1,hardwareStatsError:null});const t=80;e().addResourceDataPoint(o.cpu.usage_percent,o.memory.usage_percent,t)}else a({hardwareStatsError:n.error??"Failed to fetch hardware stats",hardwareStatsLoading:!1})}catch(n){a({hardwareStatsError:n instanceof Error?n.message:"Failed to fetch hardware stats",hardwareStatsLoading:!1})}},addResourceDataPoint:(n,o,t)=>{const r=Date.now(),{lastResourceFetch:s,resourceHistory:i}=e();if(r-s<1e3)return;const l=[...i,{timestamp:r,time:new Date(r).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),cpu:n,memory:o}],c=l.length>t?l.slice(-t):l;a({resourceHistory:c,lastResourceFetch:r})},hideContact:n=>{const{hiddenContacts:o}=e(),t=new Set(o);t.add(n),a({hiddenContacts:t}),function(a){if("undefined"!=typeof window)try{localStorage.setItem(Cy,JSON.stringify([...a]))}catch{}}(t)},clearPacketCache:()=>{Gg.clear(),a({packets:[],lastPacketTimestamp:0}),Gg.quickLoad().then(n=>{if(n.length>0){const o=n.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:n,lastPacketTimestamp:o}),e().triggerTopologyCompute()}})},triggerTopologyCompute:()=>{var a,n,o,t;const{packets:r,stats:s,hiddenContacts:i}=e();if(0===r.length||!s)return;const l=s.neighbors??{},c=Object.fromEntries(Object.entries(l).filter(([a])=>!i.has(a))),d=s.local_hash;let u=null==(n=null==(a=s.config)?void 0:a.repeater)?void 0:n.latitude,h=null==(t=null==(o=s.config)?void 0:o.repeater)?void 0:t.longitude;if(!u||!h||0===u&&0===h){const a=mb.getState().getEffectiveLocation();a&&(u=a.latitude,h=a.longitude)}const m=[];for(const[e,g]of Object.entries(c))g.zero_hop&&m.push({hash:e,advertCount:g.advert_count??1,avgRssi:g.rssi??null,avgSnr:g.snr??null,lastSeen:g.last_seen??0,latitude:g.latitude,longitude:g.longitude});const p=ib.getState().getTerrainGridForDisambiguation();Jg.compute(r,c,d,u,h,void 0,m,p??void 0)},triggerDeepAnalysis:async()=>{await Gg.forceDeepLoad();const n=Gg.getPackets();if(n.length>0){const o=n.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:n,lastPacketTimestamp:o}),e().triggerTopologyCompute(),e().triggerSparklineCompute()}},updateQuickNeighbors:()=>{const{packets:n,stats:o,hiddenContacts:t}=e();if(0===n.length||!o)return;const r=o.neighbors??{},s=function(a,e,n){if(!n||0===a.length||0===Object.keys(e).length)return[];const o=Date.now(),t=ry(n),r=new Set(Object.keys(e)),s=function(a){var e,n;const o=new Map;for(const t of Object.keys(a)){const r=ry(t),s=o.get(r);if(s){const i=null==(e=a[s])?void 0:e.zero_hop;(null==(n=a[t])?void 0:n.zero_hop)&&!i&&o.set(r,t)}else o.set(r,t)}return o}(e),i=new Map;for(const c of a){if(!Fy(c))continue;const a=qy(c.src_hash,t,s,r);if(!a)continue;let e=i.get(a);e||(e=My(a),i.set(a,e)),Sy(e,c)}for(const[c,d]of Object.entries(e))ry(c)!==t&&d.zero_hop&&!i.has(c)&&i.set(c,{hash:c,count:d.advert_count??0,rssiSum:d.rssi??0,rssiCount:void 0!==d.rssi?1:0,snrSum:d.snr??0,snrCount:void 0!==d.snr?1:0,lastSeen:d.last_seen??0});const l=[];for(const c of i.values()){const a=Ty(c,o);a&&l.push(a)}return l.sort((a,e)=>e.count!==a.count?e.count-a.count:e.lastSeen-a.lastSeen),l}(n,Object.fromEntries(Object.entries(r).filter(([a])=>!t.has(a))),o.local_hash),i=e().quickNeighbors;(s.length!==i.length||s.some((a,e)=>{var n,o;return a.hash!==(null==(n=i[e])?void 0:n.hash)||a.count!==(null==(o=i[e])?void 0:o.count)}))&&(a({quickNeighbors:s}),Ly(s))},triggerSparklineCompute:()=>{const{packets:a,stats:n,hiddenContacts:o}=e();if(0===a.length||!n)return;const t=n.neighbors??{},r=Object.keys(t).filter(a=>!o.has(a));0!==r.length&&Zg.compute(a,r)},requestSevenDayData:async()=>{await Gg.loadSevenDays(()=>{const e=Gg.getPackets();if(e.length>0){const n=e.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:[...e],lastPacketTimestamp:n})}});const n=Gg.getPackets();if(n.length>0){const o=n.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:[...n],lastPacketTimestamp:o}),e().triggerTopologyCompute(),e().triggerSparklineCompute(),ay.getState().queueDecryption(n)}},requestThreeDayData:async()=>{await Gg.loadThreeDays(()=>{const e=Gg.getPackets();if(e.length>0){const n=e.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:[...e],lastPacketTimestamp:n})}});const n=Gg.getPackets();if(n.length>0){const o=n.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:[...n],lastPacketTimestamp:o}),e().triggerTopologyCompute(),e().triggerSparklineCompute(),ay.getState().queueDecryption(n)}},requestFourteenDayData:async()=>{await Gg.loadFourteenDays(()=>{const e=Gg.getPackets();if(e.length>0){const n=e.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:[...e],lastPacketTimestamp:n})}});const n=Gg.getPackets();if(n.length>0){const o=n.reduce((a,e)=>Math.max(a,e.timestamp??0),0);a({packets:[...n],lastPacketTimestamp:o}),e().triggerTopologyCompute(),e().triggerSparklineCompute(),ay.getState().queueDecryption(n)}},setGlobalTimeRange:n=>{a({globalTimeRangeIndex:n}),function(a){if("undefined"!=typeof window)try{localStorage.setItem(Ey,a.toString())}catch{}}(n);const o={0:1,1:1,2:3,3:12,4:24,5:72,6:168,7:336}[n]??24;Ig.setTimeWindow(o);const{packetCacheState:t,requestThreeDayData:r,requestSevenDayData:s,requestFourteenDayData:i,triggerTopologyCompute:l,triggerSparklineCompute:c}=e();let d=!1;if(5!==n||t.threeDayLoadComplete||t.isBackgroundLoading||(r(),d=!0),6!==n||t.sevenDayLoadComplete||t.isBackgroundLoading||(s(),d=!0),7!==n||t.fourteenDayLoadComplete||t.isBackgroundLoading||(i(),d=!0),!d&&n>=5&&(l(),c()),!d){const{packets:a}=e();ay.getState().queueDecryption(a)}}})),Oy=Vy,$y=()=>Vy(a=>a.stats),Wy=()=>Vy(a=>a.statsError),Uy=()=>Vy(a=>a.packets),Hy=()=>Vy(a=>a.packetsLoading),Yy=()=>Vy(a=>a.logs),Gy=()=>Vy(a=>a.logsLoading),Ky=()=>Vy(a=>a.liveMode),Xy=()=>Vy(a=>a.fetchLogs),Jy=()=>Vy(a=>a.setLiveMode),Zy=()=>Vy(a=>a.resourceHistory),Qy=()=>Vy(a=>a.hardwareStats),av=()=>Vy(a=>a.hardwareStatsLoading),ev=()=>Vy(a=>a.hardwareStatsError),nv=()=>Vy(a=>a.fetchHardwareStats),ov=()=>Vy(a=>a.hiddenContacts),tv=()=>Vy(a=>a.hideContact),rv=()=>Vy(a=>a.packetCacheState),sv=()=>Vy(a=>a.quickNeighbors),iv=()=>Vy(a=>a.cachedLocalHash),lv=()=>Vy(a=>a.lastPacketTimestamp),cv=()=>Vy(a=>a.globalTimeRangeIndex),dv=()=>Vy(a=>a.setGlobalTimeRange),uv=()=>Vy(a=>null!==a.stats&&a.packetCacheState.backgroundLoadComplete),hv=()=>Vy(a=>a.packets.length>0);function mv(){const a=Vy(a=>{var e,n,o;return null==(o=null==(n=null==(e=a.stats)?void 0:e.config)?void 0:n.repeater)?void 0:o.latitude}),e=Vy(a=>{var e,n,o;return null==(o=null==(n=null==(e=a.stats)?void 0:e.config)?void 0:n.repeater)?void 0:o.longitude}),n=Vy(a=>{var e,n,o;return(null==(n=null==(e=a.stats)?void 0:e.config)?void 0:n.node_name)||(null==(o=a.stats)?void 0:o.node_name)||"Local Node"}),o=mb(a=>a.latitude),t=mb(a=>a.longitude),r=mb(a=>a.enabled);return a&&e&&(0!==a||0!==e)?{latitude:a,longitude:e,name:n,isStealth:!1}:r&&null!==o&&null!==t?{latitude:o,longitude:t,name:n,isStealth:!0}:null}const pv={healthy:{p3:"color(display-p3 0.2 1 0.4)",fallback:"#00FF66"},degraded:{p3:"color(display-p3 1 0.7 0.2)",fallback:"#FFB020"},offline:{p3:"color(display-p3 1 0.3 0.3)",fallback:"#EF4444"},connecting:{p3:"color(display-p3 0.4 0.6 1)",fallback:"#6699FF"},rx:{p3:"color(display-p3 0.2 1 0.4)",fallback:"#00FF66"},tx:{p3:"color(display-p3 1 0.9 0.2)",fallback:"#FFDD00"},idle:{p3:"color(display-p3 0.3 0.3 0.35)",fallback:"#4A4A55"}};function gv({color:a,pulse:e=!1,className:n}){var o;return r.jsx("span",{className:i("inline-block rounded-full w-1 h-1",e&&"animate-pulse",n),style:{backgroundColor:a.fallback,...(null==(o=CSS.supports)?void 0:o.call(CSS,"color","color(display-p3 1 1 1)"))&&{backgroundColor:a.p3}}})}function bv({showLabel:a=!1,className:e}){const n=Vy(a=>a.flashReceived),o=Vy(a=>a.flashAdvert),s=nb(a=>"connected"===a.connectionState),l=gb(a=>a.health),c=gb(a=>a.isInitializing),[d,u]=t.useState("idle"),h=t.useRef(0),m=t.useRef(0);t.useEffect(()=>{if(n<=0)return;const a=Date.now();if(a-h.current<50)return;h.current=a,u("rx");const e=setTimeout(()=>u("idle"),100);return()=>clearTimeout(e)},[n]),t.useEffect(()=>{if(o<=0)return;const a=Date.now();if(a-m.current<50)return;m.current=a,u("tx");const e=setTimeout(()=>u("idle"),100);return()=>clearTimeout(e)},[o]);let p=pv.healthy,g=!1,b="LIVE",f="Real-time (WebSocket)";c?(p=pv.connecting,g=!0,b="WAIT",f="Connecting..."):"offline"===l?(p=pv.offline,g=!0,b="DOWN",f="Cannot reach server"):"degraded"===l?(p=pv.degraded,b="POLL",f="Real-time unavailable, using REST polling"):s?(p=pv.healthy,b="LIVE",f="Real-time (WebSocket)"):(p=pv.healthy,b="POLL",f="Database polling");const y="rx"===d?pv.rx:"tx"===d?pv.tx:pv.idle;return r.jsxs("span",{className:i("inline-flex items-center gap-1.5",e),title:f,children:[r.jsxs("span",{className:"inline-flex items-center justify-center gap-1 w-5 h-5 rounded bg-black border border-white/[0.08]",children:[r.jsx(gv,{color:p,pulse:g}),r.jsx(gv,{color:y})]}),a&&r.jsx("span",{className:i("font-mono text-[10px] tracking-wider","DOWN"===b?"text-status-danger":"WAIT"===b?"text-accent-primary":"POLL"===b?"text-status-warning":"text-text-muted"),children:b})]})}function fv({borderRadius:a}){return r.jsx(dp.div,{initial:{opacity:0},animate:{opacity:.8,backgroundPosition:["200% 0%","-200% 0%"]},exit:{opacity:0},transition:{opacity:{duration:.2},backgroundPosition:{duration:2,ease:"easeInOut",repeat:1/0}},style:{position:"absolute",inset:0,zIndex:1,pointerEvents:"none",borderRadius:a,padding:2,background:"linear-gradient(\n 90deg,\n transparent 0%,\n transparent 25%,\n var(--accent-primary) 50%,\n transparent 75%,\n transparent 100%\n )",backgroundSize:"200% 100%",mask:"\n linear-gradient(#fff 0 0) content-box,\n linear-gradient(#fff 0 0)\n ",maskComposite:"exclude",WebkitMaskComposite:"xor"}})}function yv({children:a,isLoading:e=!0,className:n,borderRadius:o=12}){return r.jsxs("div",{className:i("relative overflow-hidden",n),style:{borderRadius:o},children:[r.jsx(Xh,{children:e&&r.jsx(fv,{borderRadius:o})}),r.jsx("div",{className:"relative z-10",children:a})]})}function vv({className:a}){return r.jsx("div",{className:i("relative w-10 h-1 rounded-sm overflow-hidden","bg-bg-elevated",a),children:r.jsx(dp.div,{animate:{backgroundPosition:["200% 0%","-200% 0%"]},transition:{duration:1.5,ease:"easeInOut",repeat:1/0},className:"absolute inset-0",style:{background:"linear-gradient(\n 90deg,\n transparent 0%,\n var(--accent-primary) 50%,\n transparent 100%\n )",backgroundSize:"200% 100%"}})})}const wv=w(a=>({sparklines:new Map,isComputing:!1,lastUpdated:0,nodeCount:0,setSparklines:e=>a({sparklines:e,lastUpdated:Date.now(),nodeCount:e.size,isComputing:!1}),setComputing:e=>a({isComputing:e})}));"undefined"!=typeof window&&setTimeout(()=>{Zg.subscribe((a,e)=>{const n=wv.getState();e&&!n.isComputing?n.setComputing(!0):!e&&a.size>0?n.setSparklines(a):!e&&n.isComputing&&n.setComputing(!1)})},0);const kv=()=>wv(a=>a.isComputing),xv=[],jv=new Map;function zv(a){return wv(e=>{const n=e.sparklines.get(a);if(!n||0===n.length)return xv;const o=jv.get(a);return o===n?o:(jv.set(a,n),n)})}const Cv=w(a=>({topology:{edges:[],validatedEdges:[],weakEdges:[],certainEdges:[],uncertainEdges:[],edgeMap:new Map,maxPacketCount:0,maxCertainCount:0,neighborAffinity:new Map,fullAffinity:new Map,localPrefix:null,centrality:new Map,hubNodes:[],gatewayNodes:[],loops:[],loopEdgeKeys:new Set,txDelayRecommendations:new Map,pathRegistry:Xg(),edgeBetweenness:new Map,backboneEdges:[],nodeMobility:new Map,mobileNodes:[],pathHealth:[],lastHopNeighbors:[],disambiguationStats:{totalPrefixes:0,unambiguousPrefixes:0,collisionPrefixes:0,collisionRate:0,avgConfidence:0,lowConfidencePrefixes:[],highCollisionPrefixes:[],totalResolutions:0},discoveredNodes:[],viterbiStats:{totalPaths:0,pathsWithGhosts:0,avgPathCost:0,avgPathConfidence:0,observationOverrideCount:0,tracePacketsProcessed:0,pathPacketsProcessed:0,distantEdgesDiscovered:0,duplicateGroupsFound:0,duplicatePathsUnique:0,echolocationEdgesInferred:0},nodeMetrics:new Map,communityCount:0,backboneNodes:[]},isComputing:!1,lastComputeTimeMs:0,lastUpdated:0,setTopology:(e,n)=>a({topology:e,lastComputeTimeMs:n,lastUpdated:Date.now(),isComputing:!1}),setComputing:e=>a({isComputing:e})}));"undefined"!=typeof window&&Jg.subscribe((a,e)=>{Cv.getState().setTopology(a,e)});const Av=()=>Cv(a=>a.topology),Dv=()=>Cv(a=>a.topology.hubNodes),Ev=()=>Cv(a=>a.topology.centrality),Bv=()=>Cv(a=>a.topology.fullAffinity),Fv=()=>Cv(a=>a.isComputing),qv=()=>Cv(a=>a.lastUpdated);let Sv=null,Mv=null,Tv=null,Pv=null;const Lv=()=>Cv(a=>(a.topology.hubNodes!==Mv&&(Mv=a.topology.hubNodes,Sv=new Set(a.topology.hubNodes)),Sv)),Rv=()=>Cv(a=>a.topology.pathHealth),Nv=()=>Cv(a=>a.topology.disambiguationStats),Iv=()=>Cv(a=>a.topology.disambiguationStats.highCollisionPrefixes),_v=()=>Cv(a=>a.topology.disambiguationStats.totalPrefixes>0),Vv=()=>Cv(a=>a.topology.discoveredNodes),Ov=()=>Cv(a=>a.topology.viterbiStats),$v=()=>Cv(a=>(a.topology.discoveredNodes!==Pv&&(Pv=a.topology.discoveredNodes,Tv=a.topology.discoveredNodes.filter(a=>a.isLikelyReal)),Tv)),Wv=()=>Cv(a=>a.topology.nodeMetrics);function Uv(a){if(a<60)return`${Math.floor(a)}s`;const e=Math.floor(a/86400),n=Math.floor(a%86400/3600),o=Math.floor(a%3600/60),t=[];return e>0&&t.push(`${e}d`),n>0&&t.push(`${n}h`),(o>0||0===t.length)&&t.push(`${o}m`),t.join(" ")}function Hv(a){const e=Date.now()/1e3-a;return e<60?"just now":e<3600?`${Math.floor(e/60)}m ago`:e<86400?`${Math.floor(e/3600)}h ago`:`${Math.floor(e/86400)}d ago`}function Yv(a){return new Date(1e3*a).toLocaleString()}function Gv(a){const e=new Date(1e3*a);return`${e.toLocaleString("en-US",{month:"short"})} ${e.getDate()}, ${e.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}`}function Kv(a){return new Date(1e3*a).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Xv(a){return`${(a/1e6).toFixed(3)} MHz`}function Jv(a){return`${(a/1e3).toFixed(1)} kHz`}function Zv(a){const e=a>1e12?a:1e3*a,n=Date.now(),o=Math.abs(n-e),t=Math.floor(o/1e3),r=Math.floor(t/60),s=Math.floor(r/60),i=Math.floor(s/24);return i>0?`${i} day${1!==i?"s":""}`:s>0?`${s} hour${1!==s?"s":""}`:r>0?`${r} minute${1!==r?"s":""}`:`${t} second${1!==t?"s":""}`}function Qv(a){a<0&&(a=0);const e=Math.floor(a/1e3),n=Math.floor(e/60),o=Math.floor(n/60);if(o>0){const a=n%60;return a>0?`${o}h ${a}m`:`${o}h`}if(n>0){const a=e%60;return a>0?`${n}m ${a}s`:`${n}m`}if(e>0){const n=a%1e3;return n>0?`${e}.${Math.floor(n/100)}s`:`${e}s`}return`${a}ms`}t.memo(function({options:a,data:e,className:n="",onCreate:o}){const s=t.useRef(null),i=t.useRef(null);return t.useEffect(()=>{const n=s.current;if(!n)return;const t=n.getBoundingClientRect(),r=Math.floor(t.width)||400,l=Math.floor(t.height)||200,c=new Ht({...a,width:r,height:l},e,n);return i.current=c,null==o||o(c),()=>{c.destroy(),i.current=null}},[a]),t.useEffect(()=>{i.current&&e&&i.current.setData(e)},[e]),t.useEffect(()=>{const a=s.current;if(!a)return;const e=new ResizeObserver(a=>{const e=a[0];if(!e||!i.current)return;const{width:n,height:o}=e.contentRect;n>0&&o>0&&i.current.setSize({width:Math.floor(n),height:Math.floor(o)})});return e.observe(a),()=>{e.disconnect()}},[]),r.jsx("div",{ref:s,className:`w-full h-full ${n}`,style:{minHeight:100}})});const aw=new Map;function ew(a){var e;if(!a.startsWith("var("))return a;const n=aw.get(a);if(n)return n;const o=a.match(/var\(([^,)]+)(?:,\s*([^)]+))?\)/);if(!o)return a;const t=o[1].trim(),r=(null==(e=o[2])?void 0:e.trim())||"#888888",s=getComputedStyle(document.documentElement).getPropertyValue(t).trim()||r;return aw.set(a,s),s}function nw(a,e,n=!1){if(e.length<2)return;if(a.beginPath(),a.moveTo(e[0].x,e[0].y),2===e.length)return void a.lineTo(e[1].x,e[1].y);const o=.5;for(let t=0;t{p.current=a,g.current=e,b.current=o,f.current=n});const v=t.useRef({band:s,innerBand:i,mean:l,median:c,average:d,cursor:u});t.useLayoutEffect(()=>{v.current={band:s,innerBand:i,mean:l,median:c,average:d,cursor:u}});const w=t.useMemo(()=>[a.map(a=>a.timestamp),a.map(a=>a.max)],[a]),k=t.useMemo(()=>{const a=function(a,e,n,o){return{hooks:{draw:t=>{const r=a.current,s=e.current,i=n.current,l=o.current;if(0===r.length)return;const c=t.ctx,d=t.bbox,u=d.left,h=d.top,m=d.width,p=d.height;if(m<=0||p<=0)return;const g=t.data[0],b=g.length;if(0===b)return;const f=g[0],y=g[b-1]-f||1,v=a=>u+(a-f)/y*m,w=a=>h+p*(1-a/s),k={min:r.map(a=>({x:v(a.timestamp),y:w(a.min)})),max:r.map(a=>({x:v(a.timestamp),y:w(a.max)})),p5:r.map(a=>({x:v(a.timestamp),y:w(a.p5)})),p95:r.map(a=>({x:v(a.timestamp),y:w(a.p95)})),p25:r.map(a=>({x:v(a.timestamp),y:w(a.p25)})),p75:r.map(a=>({x:v(a.timestamp),y:w(a.p75)})),mean:r.map(a=>({x:v(a.timestamp),y:w(a.mean)})),median:r.map(a=>({x:v(a.timestamp),y:w(a.median)})),average:r.map(a=>({x:v(a.timestamp),y:w(a.average)}))},x=(a,e)=>i?i===a?Math.min(1,1.5*e):"minMax"===i||"p5p95"===i||"p25p75"===i?.3*e:e:e,j=a=>i?i===a?1:"mean"===i||"median"===i||"average"===i?.3:1:1,z={band:ew(l.band),innerBand:ew(l.innerBand),mean:ew(l.mean),median:ew(l.median),average:ew(l.average)};c.save(),c.strokeStyle=z.average,c.lineWidth=4,c.globalAlpha=j("average"),nw(c,k.average),c.stroke(),c.globalAlpha=x("minMax",.15),c.fillStyle=z.band,c.beginPath(),nw(c,k.max);const C=[...k.min].reverse();for(const a of C)c.lineTo(a.x,a.y);c.closePath(),c.fill(),c.globalAlpha=x("p5p95",.3),c.fillStyle=z.band,c.beginPath(),nw(c,k.p95);const A=[...k.p5].reverse();for(const a of A)c.lineTo(a.x,a.y);c.closePath(),c.fill(),c.globalAlpha=x("p25p75",.55),c.fillStyle=z.innerBand,c.beginPath(),nw(c,k.p75);const D=[...k.p25].reverse();for(const a of D)c.lineTo(a.x,a.y);c.closePath(),c.fill(),c.strokeStyle=z.median,c.lineWidth=1.5,c.globalAlpha=j("median"),c.setLineDash([4,4]),nw(c,k.median),c.stroke(),c.strokeStyle=z.mean,c.lineWidth=1.5,c.globalAlpha=j("mean"),c.setLineDash([]),nw(c,k.mean),c.stroke(),c.restore()}}}}(p,g,b,v);return{width:400,height:200,padding:[4,4,4,4],cursor:{show:!0,x:!0,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,e]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],hooks:{setCursor:[a=>{var e,n;const o=a.cursor.idx;null!=o&&o>=0?null==(e=f.current)||e.call(f,o):null==(n=f.current)||n.call(f,null)}]},plugins:[a]}},[e]);t.useEffect(()=>{const e=h.current;if(!e||0===a.length)return;const n=y.current,o=a.length,t=Math.abs(o-n);if(!(!m.current||t>100||n>0&&t/n>.1)&&m.current)return m.current.setData(w),void(y.current=o);m.current&&m.current.destroy();const r=e.getBoundingClientRect(),s=Math.floor(r.width)||400,i=Math.floor(r.height)||200,l=new Ht({...k,width:s,height:i},w,e);return m.current=l,y.current=o,()=>{l.destroy(),m.current=null}},[k,w,a.length]),t.useEffect(()=>{const a=h.current;if(!a)return;const e=new ResizeObserver(a=>{const e=a[0];if(!e||!m.current)return;const{width:n,height:o}=e.contentRect;n>0&&o>0&&m.current.setSize({width:Math.floor(n),height:Math.floor(o)})});return e.observe(a),()=>{e.disconnect()}},[]),t.useEffect(()=>{m.current&&m.current.redraw()},[o,a]);const x=t.useCallback(()=>{null==n||n(null)},[n]);return 0===a.length?r.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):r.jsx("div",{ref:h,className:"w-full h-full rounded-2xl overflow-hidden",onMouseLeave:x})});const ow="undefined"!=typeof window&&(null==(e=null==(a=window.matchMedia)?void 0:a.call(window,"(color-gamut: p3)"))?void 0:e.matches);let tw=null,rw=0;function sw(){const a=performance.now();if(tw&&a-rw<1e3)return tw;const e=getComputedStyle(document.documentElement),n=e.getPropertyValue("--font-data").trim()||'"JetBrains Mono", ui-monospace, monospace',o=e.getPropertyValue("--chart-axis-tick").trim()||"rgba(255, 255, 255, 0.4)",t=e.getPropertyValue("--chart-grid").trim()||"rgba(255, 255, 255, 0.06)",r=e.getPropertyValue("--text-muted").trim()||"#727272",s=e.getPropertyValue("--text-primary").trim()||"#FFFFFF",i=e.getPropertyValue("--signal-critical").trim()||"#EF4444",l=e.getPropertyValue("--bg-body").trim()||"#171717";return tw={fontFamily:n,axisColor:o,gridColor:t,textMuted:r,textPrimary:s,signalCritical:i,bgBody:l},rw=a,tw}const iw=["min","max","p75","p95","p99","mean","median","average","midpoint"];function lw(a){const e=lr(function(a){const{colormap:e,baseIndex:n,halfSize:o}=ur(),t=Math.max(0,Math.min(1,a)),r=Math.min(n+Math.floor(t*(o-1)),e.discrete.length-1);return e.discrete[r]}(a)),n=`color(display-p3 ${(e.r/255).toFixed(3)} ${(e.g/255).toFixed(3)} ${(e.b/255).toFixed(3)})`;return{...e,p3:n}}function cw(a,e,n,o,t,r,s,i,l,c=null,d=null,u=1,h=null,m="airtime",p=.5){if(0===e.length)return;const g=a.ctx,{left:b,top:f,width:y,height:v}=a.bbox,w=window.devicePixelRatio||1;if(y<=0||v<=0)return;const k=a.data[0],x=k.length;if(0===x)return;const j=k[0],z=k[x-1],C=n,A="share"===m,D=A?function(a){const e=[10,20,25,50,100,200,250,500,1e3],n=a/4.5;for(const o of e)if(o>=n)return o;return a>5e3?1e3*Math.ceil(n/1e3):100*Math.ceil(n/100)}(C):5,E=r.signalCritical,B=r.bgBody;g.save(),g.fillStyle="#000000";const F=8*w;g.beginPath(),g.roundRect(b,f,y,v,F),g.fill(),g.restore();const q=parseInt(B.slice(1,3),16)||23,S=parseInt(B.slice(3,5),16)||23,M=parseInt(B.slice(5,7),16)||23;if(!A&&C>=20){g.save();const a=f+v*(1-20/C);g.fillStyle=`rgba(${q}, ${S}, ${M}, 0.5)`,g.fillRect(b,f,y,a-f),g.restore()}g.save(),g.lineWidth=1*w,g.setLineDash([4*w,4*w]);for(let P=D;Pn+t)return;const i=sw().textPrimary;a.save(),a.strokeStyle=i,a.globalAlpha=.5,a.lineWidth=1*s,a.setLineDash([4*s,4*s]),a.beginPath(),a.moveTo(Math.round(e)+.5,o),a.lineTo(Math.round(e)+.5,o+r),a.stroke(),a.restore()}(g,h,b,f,y,v,w),s){!function(a,e,n,o,t,r,s=null,i=null,l=1,c=25){const{points:d,rawValues:u,count:h,packetTypes:m,timestamps:p}=e,g=1*l*(window.devicePixelRatio||1);a.globalCompositeOperation="source-over";const b=s?parseInt(s.replace("TYPE_",""),10):null;for(let f=0;f=i.start&&a0&&function(a,e,n,o,t,r,s,i,l,c,d=.5){if(0===e.length)return;const u=l-i||1,h=function(a,e=1.3,n=.15){const o=function(a){const e=a.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(e){const a=parseFloat(e[1]),n=parseFloat(e[2]),o=parseFloat(e[3]);return{r:Math.round(255*a),g:Math.round(255*n),b:Math.round(255*o),p3r:a,p3g:n,p3b:o}}if(a.startsWith("#")){const e=a.replace("#",""),n=parseInt(e.slice(0,2),16),o=parseInt(e.slice(2,4),16),t=parseInt(e.slice(4,6),16);return{r:n,g:o,b:t,p3r:n/255,p3g:o/255,p3b:t/255}}const n=a.match(/rgba?\(([\d.]+),?\s*([\d.]+),?\s*([\d.]+)/);if(n){const a=Math.round(parseFloat(n[1])),e=Math.round(parseFloat(n[2])),o=Math.round(parseFloat(n[3]));return{r:a,g:e,b:o,p3r:a/255,p3g:e/255,p3b:o/255}}return{r:255,g:255,b:255,p3r:1,p3g:1,p3b:1}}(a),t=function(a,e,n,o=1.25,t=.15){const r=(Math.max(a,e,n)+Math.min(a,e,n))/2;return{p3r:Math.min(1,r+(a-r)*o+t),p3g:Math.min(1,r+(e-r)*o+t),p3b:Math.min(1,r+(n-r)*o+t)}}(o.p3r,o.p3g,o.p3b,e,n);return{r:Math.round(255*Math.min(1,t.p3r)),g:Math.round(255*Math.min(1,t.p3g)),b:Math.round(255*Math.min(1,t.p3b)),p3r:Math.min(1,t.p3r),p3g:Math.min(1,t.p3g),p3b:Math.min(1,t.p3b)}}(sw().signalCritical);a.save(),a.globalAlpha=d,a.fillStyle=ow?`color(display-p3 ${h.p3r} ${h.p3g} ${h.p3b})`:`rgb(${h.r}, ${h.g}, ${h.b})`;for(const m of e){if(m.endTsl)continue;const e=o+(Math.max(m.startTs,i)-i)/u*r,n=o+(Math.min(m.endTs,l)-i)/u*r,d=Math.max(n-e,2*c);a.fillRect(e,t,d,s)}a.restore()}(g,i,0,b,f,y,v,j,z,w,d?Math.max(.03,.03*p):p)}const dw=t.memo(function({data:a,maxValue:e,visibleLines:n=iw,highlightedLine:o=null,onHover:s,scatterData:i=null,noiseFloorAnomalies:l=null,showNoiseFloorOverlay:c=!1,overlayOpacity:d=.5,highlightedType:u=null,hoveredTimeRange:h=null,timeRangeHours:m=24,yAxisMode:p="airtime"}){const g=t.useRef(null),b=t.useRef(null),f=t.useRef(a),y=t.useRef(e),v=t.useRef(n),w=t.useRef(o),k=t.useRef(s),x=t.useRef(i),j=t.useRef(l),z=t.useRef(c),C=t.useRef(u),A=t.useRef(h),D=t.useRef(null),E=t.useRef(null),B=t.useRef(p),F=t.useRef(d),q=m<=12?1.2:1,S=t.useRef(q),M=t.useRef(a.length);t.useLayoutEffect(()=>{f.current=a,y.current=e,v.current=n,w.current=o,k.current=s,x.current=i,j.current=l,z.current=c,C.current=u,A.current=h,S.current=q,B.current=p,F.current=d}),t.useEffect(()=>{D.current=sw()},[]);const T=t.useMemo(()=>[a.map(a=>a.timestamp),new Array(a.length).fill(1)],[a]),P=t.useMemo(()=>({hooks:{draw:a=>{const e=D.current||sw();cw(a,f.current,y.current,v.current,w.current,e,x.current,j.current,z.current,C.current,A.current,S.current,E.current,B.current,F.current)}}}),[]),L=t.useMemo(()=>({width:400,height:200,padding:[8,0,8,28],cursor:{show:!1,x:!1,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],plugins:[P]}),[P]);t.useEffect(()=>{const e=g.current;if(!e||0===a.length)return;const n=M.current,o=a.length,t=Math.abs(o-n);if(!(!b.current||t>100||n>0&&t/n>.1)&&b.current)return b.current.setData(T),void(M.current=o);b.current&&b.current.destroy();const r=e.getBoundingClientRect(),s=Math.floor(r.width)||400,i=Math.floor(r.height)||200,l=new Ht({...L,width:s,height:i},T,e);return b.current=l,M.current=o,()=>{l.destroy(),b.current=null}},[L,T,a.length]),t.useEffect(()=>{const a=g.current;if(!a)return;const e=new ResizeObserver(a=>{const e=a[0];if(!e||!b.current)return;const{width:n,height:o}=e.contentRect;n>0&&o>0&&b.current.setSize({width:Math.floor(n),height:Math.floor(o)})});return e.observe(a),()=>{e.disconnect()}},[]),t.useEffect(()=>{b.current&&b.current.redraw()},[o,n,a,i,l,c,d,u,h,q]);const R=t.useCallback(e=>{var n,o;const t=g.current,r=b.current;if(!t||!r||0===a.length)return;const s=t.getBoundingClientRect(),i=e.clientX-s.left,l=window.devicePixelRatio||1,c=r.bbox,d=c.left/l,u=c.width/l;if(id+u)return E.current=null,r.redraw(),void(null==(n=k.current)||n.call(k,null));E.current=i*l;const h=(i-d)/u,m=a.length,p=Math.floor(h*m),f=Math.max(0,Math.min(m-1,p));r.redraw(),null==(o=k.current)||o.call(k,f)},[a.length]),N=t.useCallback(()=>{var a;E.current=null,b.current&&b.current.redraw(),null==(a=k.current)||a.call(k,null)},[]);return 0===a.length?r.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No data available"}):r.jsx("div",{ref:g,className:"w-full h-full rounded-lg overflow-hidden",onMouseMove:R,onMouseLeave:N})}),uw=-70;let hw=null,mw=0;function pw(a,e){if(0===a.length)return 0;const n=e/100*(a.length-1),o=Math.floor(n),t=Math.ceil(n);return o===t?a[o]:a[o]+(a[t]-a[o])*(n-o)}function gw(a){const e=a.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)\)/);if(e)return{r:Math.round(255*parseFloat(e[1])),g:Math.round(255*parseFloat(e[2])),b:Math.round(255*parseFloat(e[3]))};const n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);return n?{r:parseInt(n[1],16),g:parseInt(n[2],16),b:parseInt(n[3],16)}:{r:250,g:189,b:47}}function bw(a,e){const n=Math.max(0,Math.min(1,a))*(e.length-1),o=Math.floor(n),t=n-o;if(o>=e.length-1)return e[e.length-1];const r=e[o],s=e[o+1];return{r:Math.round(r.r+(s.r-r.r)*t),g:Math.round(r.g+(s.g-r.g)*t),b:Math.round(r.b+(s.b-r.b)*t)}}function fw(a,e,n){const o=Math.max(0,Math.min(1,a));return{r:Math.round(e.r+(n.r-e.r)*o),g:Math.round(e.g+(n.g-e.g)*o),b:Math.round(e.b+(n.b-e.b)*o)}}const yw=t.memo(function({timestamps:a,values:e,onStatsChange:n,compact:o=!1,height:s}){var i,l;const[c,d]=t.useState(!0),u=t.useRef(null),h=t.useRef(null),m=t.useRef(null),p=t.useRef(o),g=t.useMemo(()=>{const a=e.filter(a=>a<=uw);if(0===a.length)return null;const n=Math.min(...a),o=Math.max(...a),t=a.reduce((a,e)=>a+e,0)/a.length,r=[...a].sort((a,e)=>a-e);return{min:n,max:o,avg:t,p5:pw(r,5),p95:pw(r,95)}},[e]);t.useEffect(()=>{null==n||n(g)},[g]);const b=t.useCallback(()=>{d(a=>!a)},[]),{heatmapData:f,xLabels:y,yLabels:v}=t.useMemo(()=>{if(0===a.length||0===e.length||!g)return{heatmapData:null,xLabels:[],yLabels:[]};let n,t;if(c){const a=e.filter(a=>a<=uw);if(0===a.length)return{heatmapData:null,xLabels:[],yLabels:[]};const o=[...a].sort((a,e)=>a-e),r=pw(o,5),s=pw(o,95),i=.1*(s-r||1);n=r-i,t=s+i}else{const a=e.filter(a=>a<=uw);if(0===a.length)return{heatmapData:null,xLabels:[],yLabels:[]};const o=Math.min(...a),r=Math.max(...a),s=.1*(r-o||1);n=o-s,t=r+s}const r=t-n,s=a[0],i=a[a.length-1]-s||1,l=120,d=48,u=new Float32Array(5760),h=[];for(let o=0;ouw)continue;const m=(a[o]-s)/i,p=1-(Math.max(n,Math.min(t,c))-n)/r;u[Math.min(119,Math.floor(m*l))*d+Math.min(47,Math.floor(p*d))]++,h.push(a[o])}let m=0;for(let a=0;am&&(m=u[a]);const p=[],b=[];for(let a=0;ae&&(e=o,n=t)}if(-1===n||0===e)continue;const o=t-(n+.5)/d*r,c=s+(a+.5)/l*i;p.push(c),b.push(o)}const f=function(a,e,n){if(0===a.length)return[];const o=function(a,e){if(0===a.length)return[];const n=Math.floor(e/2),o=new Array(a.length),t=new Array(e);for(let r=0;ra-e),o[r]=t[n]}return o}(a,e),t=new Array(a.length);t[0]=o[0];for(let r=1;r0){const a=Math.min(...f),e=Math.max(...f),n=.4*(e-a||1);y=a-n,v=e+n,w=v-y}const k=[];for(let a=0;a{m.current=f,p.current=o});const w=t.useMemo(()=>{if(0===a.length)return[[],[]];const e=new Array(a.length).fill(1);return[a,e]},[a]),k=t.useMemo(()=>({hooks:{draw:a=>{!function(a,e,n){if(!e)return;const o=a.ctx,{left:t,top:r,width:s,height:i}=a.bbox,l=window.devicePixelRatio||1;if(s<=0||i<=0)return;const c=function(){const a=performance.now();if(hw&&a-mw<1e3)return hw;const e=getComputedStyle(document.documentElement);return hw={heatGradient:[gw(e.getPropertyValue("--sys-purple").trim()),gw(e.getPropertyValue("--sys-blue").trim()),gw(e.getPropertyValue("--sys-teal").trim()),gw(e.getPropertyValue("--sys-amber").trim()),gw(e.getPropertyValue("--sys-orange").trim())],trendLineColor:gw(e.getPropertyValue("--accent-secondary").trim()),stabilityHot:gw(e.getPropertyValue("--sys-amber").trim()),stabilityCool:gw(e.getPropertyValue("--sys-blue").trim()),typography:{fontFamily:e.getPropertyValue("--font-data").trim()||'"JetBrains Mono", ui-monospace, monospace',textMuted:e.getPropertyValue("--text-muted").trim()||"#727272",textSecondary:e.getPropertyValue("--text-secondary").trim()||"#A0A0A0",gridColor:e.getPropertyValue("--chart-grid-line").trim()||"rgba(255,255,255,0.06)"}},mw=a,hw}();o.clearRect(t,r,s,i),n||function(a,e,n,o,t,r,s){a.save(),a.strokeStyle=s,a.lineWidth=1*r,a.setLineDash([3*r,3*r]);for(const i of[0,.25,.5,.75,1]){const r=Math.round(n+t*i)+.5;a.beginPath(),a.moveTo(e,r),a.lineTo(e+o,r),a.stroke()}a.restore()}(o,t,r,s,i,l,c.typography.gridColor),function(a,e,n,o,t,r,s,i,l){const{trendLine:c,trendCount:d}=e;if(d<2)return;a.save();const u=s?3*.6:3;if(a.lineWidth=u*i,a.lineCap="round",a.lineJoin="round",s){let e=1/0,s=-1/0;for(let a=0;as&&(s=n)}const i=(e+s)/2,u=(s-e)/2||.01;for(let h=1;h({width:400,height:200,padding:[0,0,0,0],cursor:{show:!1,x:!1,y:!1,drag:{x:!1,y:!1},points:{show:!1}},scales:{x:{time:!0},y:{range:[0,1]}},axes:[{show:!1},{show:!1}],series:[{},{show:!1}],plugins:[k]}),[k,o]);return t.useEffect(()=>{const e=u.current;if(!e||0===a.length)return;h.current&&h.current.destroy();const n=e.getBoundingClientRect(),o=Math.floor(n.width)||400,t=Math.floor(n.height)||200,r=new Ht({...x,width:o,height:t},w,e);return h.current=r,()=>{r.destroy(),h.current=null}},[x,w,a.length]),t.useEffect(()=>{const a=u.current;if(!a)return;const e=new ResizeObserver(a=>{const e=a[0];if(!e||!h.current)return;const{width:n,height:o}=e.contentRect;n>0&&o>0&&h.current.setSize({width:Math.floor(n),height:Math.floor(o)})});return e.observe(a),()=>{e.disconnect()}},[]),t.useEffect(()=>{h.current&&h.current.redraw()},[f,c]),f?o?r.jsx("div",{ref:u,className:"w-full",style:{height:s??28},role:"img","aria-label":"Noise floor sparkline"}):r.jsxs("div",{className:"relative w-full h-full",role:"img","aria-label":`RF noise floor heatmap showing values from ${(null==(i=null==g?void 0:g.min)?void 0:i.toFixed(0))??"N/A"} to ${(null==(l=null==g?void 0:g.max)?void 0:l.toFixed(0))??"N/A"} dBm`,children:[r.jsx("div",{className:"absolute top-0 left-0 flex flex-col justify-between",style:{width:32,bottom:20},"aria-hidden":"true",children:v.map((a,e)=>r.jsx("span",{className:"type-data-xs text-text-secondary tabular-nums text-right pr-1.5",style:{position:"absolute",top:`${a.pos}%`,transform:"translateY(-50%)",right:0},children:a.label},e))}),r.jsx("div",{ref:u,className:"absolute overflow-hidden",style:{left:32,right:0,top:0,bottom:20},children:r.jsx("button",{type:"button",onClick:b,className:"absolute bottom-1 right-1 z-10 p-1.5 rounded bg-tooltip-bg/80 hover:bg-tooltip-bg active:bg-tooltip-bg transition-colors touch-manipulation",title:c?"Show full range (min/max)":"Show trimmed range (P5-P95)","aria-label":c?"Expand to show full data range":"Shrink to show trimmed percentile range","aria-pressed":!c,children:c?r.jsx(Vr,{className:"w-3.5 h-3.5 text-text-muted","aria-hidden":"true"}):r.jsx(es,{className:"w-3.5 h-3.5 text-text-muted","aria-hidden":"true"})})}),r.jsx("div",{className:"absolute left-0 right-0 bottom-0",style:{left:32,height:20},"aria-hidden":"true",children:y.map((a,e)=>r.jsx("span",{className:"type-data-xs text-text-secondary tabular-nums absolute top-1",style:{left:`${a.pos}%`,transform:"translateX(-50%)"},children:a.label},e))})]}):o?r.jsx("div",{className:"w-full rounded bg-bg-subtle/50",style:{height:s??28},"aria-hidden":"true"}):r.jsx("div",{className:"h-full flex items-center justify-center text-text-muted",children:"No noise floor data available"})}),vw=[{name:"Dashboard",to:"/",icon:Ur},{name:"Contacts",to:"/contacts",icon:Gr},{name:"Packets",to:"/packets",icon:Hr},{name:"Statistics",to:"/statistics",icon:Nr},{name:"MeshGraph",to:"/meshgraph",icon:ts},{name:"System",to:"/system",icon:$r},{name:"Logs",to:"/logs",icon:Or},{name:"Terminal",to:"/terminal",icon:os},{name:"Configuration",to:"/configuration",icon:as}];function ww(){var a,e,n,o,s,l;const{pathname:c}=k(),{stats:d,setMode:u,setDutyCycle:h,sendAdvert:m}=Oy(),p=function(){const a=sg();if(!a)return null;const e=dg(a);return e&&e.sub?e.sub:null}(),g=Vy(a=>a.prefetchForRoute),b=rv(),f=Vy(a=>a.packetCacheState.dataTier),y=cv(),v=Math.max(1,Math.ceil(ly[y].minutes/60)),w=kv(),x=Fv(),j=$v();let z=null;try{z=function(){const a=t.useContext(Tp);if(!a)throw new Error("useSidebar must be used within a SidebarLayout");return a}()}catch{}const[C,A]=t.useState(!1),[D,E]=t.useState("idle"),[B,F]=t.useState(null),[q,S]=t.useState([]),M=t.useRef(null),T=t.useCallback(a=>{a!==c&&(M.current&&clearTimeout(M.current),M.current=setTimeout(()=>{g(a)},100))},[c,g]),P=t.useCallback(()=>{M.current&&(clearTimeout(M.current),M.current=null)},[]);t.useEffect(()=>{const a=async()=>{var a;try{const e=await Eg(v);e.success&&(null==(a=e.data)?void 0:a.history)&&S(e.data.history)}catch{}};a();const e=setInterval(a,6e4);return()=>clearInterval(e)},[v]);const L=null==d?void 0:d.noise_floor_dbm,R=(null==(e=null==(a=null==d?void 0:d.config)?void 0:a.repeater)?void 0:e.mode)??"forward",N=(null==(o=null==(n=null==d?void 0:d.config)?void 0:n.duty_cycle)?void 0:o.enforcement_enabled)??!1,I=(null==(l=null==(s=null==d?void 0:d.config)?void 0:s.duty_cycle)?void 0:l.max_airtime_percent)??10,_=b.isLoading||b.isBackgroundLoading||b.isTopologyLoading,V=_||w||x,O=b.loadProgress,$=()=>{null==z||z.close()};return r.jsxs(Ap,{children:[r.jsxs(Dp,{className:"px-5 py-6",children:[r.jsx("h1",{className:"sr-only",children:"pyMC Console"}),r.jsx(Kp,{responsive:!0,className:"block"}),r.jsxs("p",{className:"type-data-xs text-text-muted mt-1.5",children:["v",Yp]})]}),r.jsxs(Ep,{className:"py-4",children:[r.jsx(Fp,{children:vw.map(a=>{const e=c===a.to;return r.jsxs(qp,{href:a.to,current:e,onClick:$,onMouseEnter:()=>T(a.to),onMouseLeave:P,children:[r.jsx(a.icon,{}),r.jsx(Sp,{children:a.name}),"/contacts"===a.to&&j.length>0&&r.jsxs(Mp,{variant:"accent",children:[r.jsx(Wr,{className:"w-3 h-3"}),r.jsx("span",{children:j.length})]}),"/meshgraph"===a.to&&r.jsx(Mp,{variant:"default",children:"Beta"})]},a.name)})}),V&&r.jsx("div",{className:"px-0 py-3",children:r.jsx(yv,{isLoading:_,borderRadius:12,children:r.jsxs("div",{className:"bg-glass-surface/50 rounded-xl p-2",children:[r.jsxs("div",{className:"flex items-center gap-2 px-1 py-0.5",children:[r.jsxs("div",{className:"relative flex h-2 w-2",children:[r.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-accent-primary opacity-75"}),r.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-accent-primary"})]}),r.jsx("span",{className:"type-data-xs text-text-muted flex-1 truncate",children:b.isLoading&&O?"Loading 24h history...":b.isBackgroundLoading&&O?b.statusMessage||`Loading ${f} history...`:b.isTopologyLoading?"Loading topology data...":w?"Computing sparklines":x?"Building topology":"Analyzing database"}),null!==(null==O?void 0:O.percent)&&void 0!==(null==O?void 0:O.percent)&&_&&r.jsxs("span",{className:"type-data-xs text-text-muted tabular-nums",children:[O.percent,"%"]})]}),r.jsx("div",{className:"mt-1.5 h-1 bg-subtle-fill rounded-full overflow-hidden",children:null!==(null==O?void 0:O.percent)&&void 0!==(null==O?void 0:O.percent)&&_?r.jsx("div",{className:"h-full bg-accent-primary/60 rounded-full transition-all duration-300 ease-out",style:{width:`${O.percent}%`}}):r.jsx("div",{className:"h-full bg-accent-primary/40 rounded-full w-full"})}),!_&&r.jsxs("div",{className:"mt-1.5 flex items-center gap-1.5 px-1",children:[r.jsx("span",{className:"type-micro text-text-muted",children:"Data:"}),r.jsx("span",{className:"type-data-xs text-accent-primary",children:(a=>{switch(a){case"24h":return"24 hours";case"3d":return"3 days";case"7d":return"7 days";case"14d":return"14 days";default:return a}})(f)})]})]})})}),r.jsx("div",{className:"flex-1"}),r.jsx(Hp,{label:"Controls",icon:r.jsx(ns,{className:"w-5 h-5 text-accent-primary"}),defaultOpen:!1,direction:"up",dataId:"controls",children:r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx(qr,{color:"success"===D?"success":"error"===D?"danger":"primary",onClick:async()=>{A(!0),E("idle"),F(null);const a=await m();A(!1),a.success?(E("success"),setTimeout(()=>E("idle"),1500)):(E("error"),F(a.error||"Failed to send"),setTimeout(()=>{E("idle"),F(null)},3e3))},disabled:C,className:"w-full justify-center",children:C?r.jsxs(r.Fragment,{children:[r.jsxs("svg",{"data-slot":"icon",className:"animate-spin",viewBox:"0 0 24 24",fill:"none",children:[r.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3"}),r.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]}),"Sending..."]}):"success"===D?r.jsxs(r.Fragment,{children:[r.jsx("svg",{"data-slot":"icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:r.jsx("polyline",{points:"20 6 9 17 4 12"})}),"Sent!"]}):"error"===D?r.jsxs(r.Fragment,{children:[r.jsxs("svg",{"data-slot":"icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[r.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),r.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]}),"Failed"]}):r.jsxs(r.Fragment,{children:[r.jsx(Qr,{"data-slot":"icon"}),"Send Advert"]})}),B&&r.jsx("p",{className:"text-accent-danger text-xs text-center",children:B}),r.jsxs("div",{className:"flex items-center justify-between gap-2",children:[r.jsx("span",{className:"text-xs text-text-muted",children:"Repeat"}),r.jsx("span",{className:i("text-xs font-medium","forward"===R?"text-accent-success":"text-accent-secondary"),children:"forward"===R?"ON":"OFF"})]}),r.jsx(qr,{color:"forward"===R?"success":"warning",onClick:()=>{u("forward"===R?"monitor":"forward")},className:"w-full justify-center",children:"forward"===R?r.jsxs(r.Fragment,{children:[r.jsx(Jr,{"data-slot":"icon"}),"Repeating"]}):r.jsxs(r.Fragment,{children:[r.jsx(Xr,{"data-slot":"icon"}),"Monitor Only"]})}),r.jsxs("div",{className:"flex items-center justify-between gap-2 mt-1",children:[r.jsx("span",{className:"text-xs text-text-muted",children:"Duty Cycle"}),r.jsx("span",{className:i("text-xs font-medium tabular-nums",N?"text-accent-secondary":"text-text-muted"),children:N?`${I}%`:"OFF"})]}),r.jsxs(qr,{color:N?"warning":"muted",onClick:()=>{h(!N)},className:"w-full justify-center",children:[r.jsx($r,{"data-slot":"icon"}),N?`Limited to ${I}%`:"Disabled"]})]})})]}),r.jsx(Bp,{children:r.jsxs("div",{className:"p-3 flex flex-col gap-1",children:[void 0!==(null==d?void 0:d.uptime_seconds)&&r.jsxs("div",{className:"flex items-center gap-3 px-3 py-2",children:[r.jsx(_r,{className:"w-5 h-5 text-text-muted flex-shrink-0"}),r.jsxs("span",{className:"type-data-xs text-text-secondary tabular-nums",children:[Uv(d.uptime_seconds)," uptime"]})]}),r.jsxs("div",{className:"flex items-center gap-3 px-3 pt-2 pb-0.5",children:[r.jsx(Zr,{className:"w-5 h-5 text-accent-primary flex-shrink-0"}),r.jsx("span",{className:"type-data-xs text-text-muted",children:"Noise Floor"}),r.jsx("span",{className:"ml-auto type-data text-text-primary tabular-nums",children:null!=L?`${L.toFixed(0)} dBm`:"—"})]}),q.length>0&&r.jsx("div",{className:"px-3 pt-1 pb-1",children:r.jsxs("div",{className:"relative rounded-sm border-x border-white/25 bg-transparent overflow-hidden py-2",children:[r.jsx("div",{className:"absolute inset-y-0 left-0 w-2 bg-gradient-to-r from-sys-amber/15 to-transparent pointer-events-none"}),r.jsx("div",{className:"absolute inset-y-0 right-0 w-2 bg-gradient-to-l from-sys-amber/15 to-transparent pointer-events-none"}),r.jsx(yw,{timestamps:q.map(a=>a.timestamp),values:q.map(a=>a.noise_floor_dbm),compact:!0,height:28})]})}),r.jsxs("div",{className:"flex items-center gap-3 px-3 py-2",children:[r.jsx(bv,{showLabel:!0}),(null==d?void 0:d.version)&&r.jsxs("span",{className:"type-data-xs text-text-muted truncate",title:`v${d.version}`,children:["v",d.version]})]}),r.jsxs("button",{onClick:()=>{lg(),window.location.href="/login"},className:"flex items-center gap-3 px-3 py-2 rounded-xl text-text-muted hover:text-accent-danger hover:bg-accent-danger/10 transition-all duration-150",children:[r.jsx(Yr,{className:"w-5 h-5 flex-shrink-0"}),r.jsx("span",{className:"type-body-sm",children:"Sign Out"}),p&&r.jsxs("span",{className:"ml-auto type-data-xs",children:["(",p,")"]})]})]})})]})}function kw(){const a=rv(),e=a.isLoading||a.isBackgroundLoading||a.isTopologyLoading;return r.jsxs(Np,{children:[r.jsxs(Ip,{children:[r.jsx("h1",{className:"sr-only",children:"pyMC Console"}),r.jsx(Kp,{height:26,className:"block"}),e&&r.jsx(vv,{className:"ml-2"})]}),r.jsx(_p,{}),r.jsxs(Ip,{children:[r.jsxs("p",{className:"type-data-xs text-text-muted",children:["v",Yp]}),r.jsx(bv,{})]})]})}const xw=t.memo(function(){const{theme:a}=er(),{backgroundImage:e,brightness:n,colorScheme:o}=a,t=fa(o),s=(null==t?void 0:t.meta.backgroundImage)||null==t?void 0:t.meta.backgroundColor,i=(100-n)/100;return r.jsxs(r.Fragment,{children:[e?r.jsx("div",{className:"fixed inset-0 -z-20",style:{contain:"paint"},"aria-hidden":"true",children:r.jsx("div",{className:"absolute inset-0 bg-cover bg-center bg-no-repeat transition-opacity duration-300 ease-out",style:{backgroundImage:`url(${e})`}})}):s?r.jsx("div",{className:"fixed inset-0 -z-20 transition-colors duration-300 ease-out",style:{backgroundColor:s,contain:"paint"},"aria-hidden":"true"}):null,r.jsx("div",{className:"fixed inset-0 -z-10 bg-black pointer-events-none transition-opacity duration-200 ease-out",style:{opacity:i,contain:"paint"},"aria-hidden":"true"})]})}),jw=20,zw=12,Cw=t.createContext(null);function Aw({children:a}){const[e,n]=t.useState({content:null,mouseX:0,mouseY:0,visible:!1}),o=t.useRef(null),[s,i]=t.useState({x:0,y:0}),l=t.useCallback((a,e,o)=>{n({content:a,mouseX:e,mouseY:o,visible:!0})},[]),c=t.useCallback(()=>{n(a=>({...a,visible:!1}))},[]),d=t.useCallback((a,e)=>{n(n=>n.visible?{...n,mouseX:a,mouseY:e}:n)},[]);t.useEffect(()=>{if(!e.visible||!o.current)return;const a=o.current.getBoundingClientRect(),{mouseX:n,mouseY:t}=e,r=window.innerWidth,s=window.innerHeight;let l,c;l=n+jw+a.width+zw>r?n-jw-a.width:n+jw,l=Math.max(zw,Math.min(l,r-a.width-zw)),c=t-jw-a.height{c.current&&(clearTimeout(c.current),c.current=null)},h=t.useCallback(e=>{u(),c.current=setTimeout(()=>{d.current=!0,o(a,e.clientX,e.clientY)},n)},[o,a,n]),m=t.useCallback(a=>{d.current&&i(a.clientX,a.clientY)},[i]),p=t.useCallback(()=>{u(),d.current=!1,s()},[s]),g=t.useCallback(()=>{if(u(),!l.current)return;const e=l.current.getBoundingClientRect();c.current=setTimeout(()=>{d.current=!0,o(a,e.left+e.width/2,e.top)},n)},[o,a,n]),b=t.useCallback(()=>{u(),d.current=!1,s()},[s]);return t.useEffect(()=>()=>{u(),d.current&&(d.current=!1,s())},[s]),t.useEffect(()=>{const a=()=>{d.current&&(u(),d.current=!1,s())};return document.addEventListener("click",a,!0),()=>document.removeEventListener("click",a,!0)},[s]),r.jsx("span",{ref:l,onMouseEnter:h,onMouseMove:m,onMouseLeave:p,onFocus:g,onBlur:b,className:"contents",children:e})}function Ew({label:a}){return r.jsx("div",{className:"min-h-[50vh]","aria-label":`Loading ${a}`,"aria-busy":"true"})}function Bw(){return r.jsx(Ew,{label:"dashboard"})}function Fw(){return r.jsx(Ew,{label:"list"})}function qw(){return r.jsx(Ew,{label:"map"})}function Sw(){return r.jsx(Ew,{label:"charts"})}function Mw(){return r.jsx(Ew,{label:"settings"})}function Tw(){return r.jsx(Ew,{label:"system"})}function Pw({children:a}){return r.jsx(r.Fragment,{children:a})}const Lw=t.lazy(()=>y(()=>import("./Login-DJBcf-C6.js"),__vite__mapDeps([0,1,2,3]))),Rw=t.lazy(()=>y(()=>import("./Dashboard-Hxpnr4og.js"),__vite__mapDeps([4,1,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,3,25,26,27]))),Nw=t.lazy(()=>y(()=>import("./Packets-5FmM_VMr.js"),__vite__mapDeps([28,1,14,10,11,12,13,15,16,17,18,19,20,21,22,23,6,9,29,5,26,3]))),Iw=t.lazy(()=>y(()=>import("./Contacts-DHVYuXFa.js").then(a=>a.C),__vite__mapDeps([30,1,31,5,32,19,24,12,33,18,21,14,29,34,17,22,35,36,3,37,16,38]))),_w=t.lazy(()=>y(()=>import("./Statistics-CGJSoMIn.js"),__vite__mapDeps([39,1,40,6,20,41,8,9,5,14,35,36,3,19,17,26,42,32,27,37,38]))),Vw=t.lazy(()=>y(()=>import("./MeshGraph-jA9fGpu6.js"),__vite__mapDeps([43,1,44,2,14,32,23,16,33,18,37,15,3]))),Ow=t.lazy(()=>y(()=>import("./MeshGraphLabelTest-Cv3ODNn6.js"),__vite__mapDeps([45,1,16,3]))),$w=t.lazy(()=>y(()=>import("./System-bU7CQZPd.js"),__vite__mapDeps([46,1,6,5,19,26,13,37,21,47,27,3]))),Ww=t.lazy(()=>y(()=>import("./Logs-C6iBCeIs.js"),__vite__mapDeps([48,1,40,5,26,3]))),Uw=t.lazy(()=>y(()=>import("./Terminal-CFdtTKrf.js"),__vite__mapDeps([49,1,31,3,11,5]))),Hw=t.lazy(()=>y(()=>import("./Configuration-Bh26u4ks.js"),__vite__mapDeps([50,1,34,19,51,25,5,14,26,16,42,27,22,47,15,3])));function Yw({children:a}){const e=k();return cg()?r.jsx(r.Fragment,{children:a}):r.jsx(z,{to:"/login",state:{from:e},replace:!0})}class Gw extends t.Component{constructor(a){super(a),this.state={hasError:!1}}static getDerivedStateFromError(a){return{hasError:!0,error:a}}render(){var a;return this.state.hasError?r.jsxs("div",{className:"surface-base rounded-2xl p-8 text-center",children:[r.jsx("p",{className:"type-subheading text-accent-red mb-2",children:"Page failed to render"}),r.jsx("p",{className:"type-body text-white/50 mb-4",children:(null==(a=this.state.error)?void 0:a.message)||"Unknown error"}),r.jsx("button",{onClick:()=>this.setState({hasError:!1}),className:"px-4 py-2 bg-accent-primary/20 text-accent-primary rounded-lg hover:bg-accent-primary/30 transition-colors",children:"Try Again"})]}):this.props.children}}function Kw(){const a=Vy(a=>a.initializeApp),e=cg();return t.useEffect(()=>{if(!e)return;a(),gb.getState().initialize();const n=setInterval(()=>{fg()},3e4);return fg(),function(){if(yg)return;if("undefined"==typeof document)return;const a=async()=>{if("visible"!==document.visibilityState)return;if(!sg())return;if(ug())return lg(),void("undefined"==typeof window||window.location.pathname.includes("/login")||(window.location.href="/login"));const a=hg();a>0&&a<300&&await gg()};document.addEventListener("visibilitychange",a),yg=!0,"visible"===document.visibilityState&&a()}(),()=>clearInterval(n)},[a,e]),r.jsxs(Aw,{children:[r.jsx(xw,{}),r.jsxs(x,{children:[r.jsx(j,{path:"/login",element:r.jsx(t.Suspense,{fallback:r.jsx("div",{className:"min-h-screen bg-bg-body"}),children:r.jsx(Lw,{})})}),r.jsx(j,{path:"/meshgraph-label-test",element:r.jsx(t.Suspense,{fallback:r.jsx("div",{className:"min-h-screen bg-black"}),children:r.jsx(Ow,{})})}),r.jsx(j,{path:"/*",element:r.jsx(Yw,{children:r.jsx(Rp,{sidebar:r.jsx(ww,{}),navbar:r.jsx(kw,{}),children:r.jsx("div",{className:"px-4 sm:px-6 lg:px-8 pt-5 pb-4 sm:pb-6 lg:pb-8 max-w-7xl mx-auto",children:r.jsx(Gw,{children:r.jsxs(x,{children:[r.jsx(j,{path:"/",element:r.jsx(t.Suspense,{fallback:r.jsx(Bw,{}),children:r.jsx(Pw,{children:r.jsx(Rw,{})})})}),r.jsx(j,{path:"/packets",element:r.jsx(t.Suspense,{fallback:r.jsx(Fw,{}),children:r.jsx(Pw,{children:r.jsx(Nw,{})})})}),r.jsx(j,{path:"/contacts",element:r.jsx(t.Suspense,{fallback:r.jsx(qw,{}),children:r.jsx(Pw,{children:r.jsx(Iw,{})})})}),r.jsx(j,{path:"/statistics",element:r.jsx(t.Suspense,{fallback:r.jsx(Sw,{}),children:r.jsx(Pw,{children:r.jsx(_w,{})})})}),r.jsx(j,{path:"/meshgraph",element:r.jsx(t.Suspense,{fallback:r.jsx(Sw,{}),children:r.jsx(Pw,{children:r.jsx(Vw,{})})})}),r.jsx(j,{path:"/system",element:r.jsx(t.Suspense,{fallback:r.jsx(Tw,{}),children:r.jsx(Pw,{children:r.jsx($w,{})})})}),r.jsx(j,{path:"/logs",element:r.jsx(t.Suspense,{fallback:r.jsx(Fw,{}),children:r.jsx(Pw,{children:r.jsx(Ww,{})})})}),r.jsx(j,{path:"/terminal",element:r.jsx(t.Suspense,{fallback:r.jsx(Fw,{}),children:r.jsx(Pw,{children:r.jsx(Uw,{})})})}),r.jsx(j,{path:"/configuration",element:r.jsx(t.Suspense,{fallback:r.jsx(Mw,{}),children:r.jsx(Pw,{children:r.jsx(Hw,{})})})})]})})})})})})]})]})}const Xw=console.warn;console.warn=(...a)=>{const e=a[0];if("string"==typeof e){if(e.includes("width")&&e.includes("height")&&e.includes("chart should be greater than 0"))return;if(e.includes("Unable to load glyph range"))return}Xw.apply(console,a)},f.createRoot(document.getElementById("root")).render(r.jsx(t.StrictMode,{children:r.jsx(ar,{children:r.jsx(C,{children:r.jsx(Kw,{})})})}));export{Kv as $,Xh as A,Cr as B,kp as C,ly as D,zp as E,Ir as F,Wy as G,hv as H,rv as I,qg as J,Nr as K,bv as L,tr as M,qr as N,Pc as O,Kp as P,Ac as Q,Zr as R,uy as S,Dw as T,is as U,cs as V,tf as W,rs as X,rf as Y,sf as Z,wr as _,or as a,by as a$,br as a0,fr as a1,iy as a2,gp as a3,Qh as a4,Vb as a5,Yv as a6,_r as a7,Zf as a8,Qr as a9,Jt as aA,my as aB,Nv as aC,_v as aD,$v as aE,ts as aF,cy as aG,hy as aH,yw as aI,zy as aJ,Av as aK,Wv as aL,Xr as aM,Jr as aN,py as aO,Qy as aP,av as aQ,ev as aR,nv as aS,Zy as aT,Uv as aU,Mg as aV,Yy as aW,Gy as aX,Xy as aY,Jy as aZ,Or as a_,Lv as aa,Bv as ab,Vv as ac,ey as ad,Ar as ae,Qv as af,Gv as ag,rr as ah,Vp as ai,Rv as aj,Ov as ak,Wr as al,Zv as am,zv as an,kv as ao,Iv as ap,Oy as aq,tv as ar,Dv as as,Ev as at,uv as au,mv as av,pr as aw,jg as ax,zg as ay,dw as az,Uy as b,Xv as b$,Yp as b0,lf as b1,Ag as b2,Pg as b3,Lg as b4,Rg as b5,Tg as b6,Ng as b7,os as b8,fb as b9,Ib as bA,Nb as bB,Tb as bC,Eb as bD,Db as bE,Rb as bF,Mb as bG,Sb as bH,Bb as bI,Lb as bJ,Pb as bK,Fb as bL,qb as bM,Xf as bN,Jf as bO,Xb as bP,Kb as bQ,Gb as bR,Yb as bS,Qb as bT,kg as bU,er as bV,Ea as bW,Ta as bX,mb as bY,as as bZ,ns as b_,Ab as ba,yb as bb,vb as bc,wb as bd,kb as be,nf as bf,af as bg,ef as bh,Pf as bi,cf as bj,df as bk,Ob as bl,Sf as bm,Ub as bn,uf as bo,Tf as bp,Bf as bq,Ff as br,qf as bs,$b as bt,Hb as bu,Wb as bv,Mf as bw,of as bx,Jb as by,Zb as bz,Rr as c,Jv as c0,jp as c1,Cp as c2,Gg as c3,sy as c4,sr as c5,iv as c6,ib as c7,Vs as c8,Fd as c9,Fv as cA,qv as cB,yv as cC,bd as ca,im as cb,_h as cc,xc as cd,Jc as ce,Ri as cf,hs as cg,Dc as ch,ml as ci,Qi as cj,hl as ck,Ql as cl,zs as cm,xs as cn,md as co,pd as cp,pu as cq,su as cr,wd as cs,ah as ct,Mc as cu,dl as cv,ou as cw,Yh as cx,Is as cy,th as cz,Hy as d,Ky as e,$y as f,og as g,sv as h,cg as i,ov as j,cv as k,pg as l,dp as m,Eg as n,lv as o,ry as p,ay as q,ty as r,tg as s,ny as t,Ht as u,oy as v,eb as w,_b as x,Hv as y,dv as z}; diff --git a/frontend/dist/assets/index-DVRwteP8.css b/frontend/dist/assets/index-DVRwteP8.css deleted file mode 100644 index d2847116..00000000 --- a/frontend/dist/assets/index-DVRwteP8.css +++ /dev/null @@ -1 +0,0 @@ -.uplot,.uplot *,.uplot *:before,.uplot *:after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:700}.u-wrap{position:relative;-webkit-user-select:none;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box!important}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:#00000012;position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607D8B}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607D8B}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;background-clip:padding-box!important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-400-normal-C38fXH4l.woff2) format("woff2"),url(/assets/inter-latin-400-normal-CyCys3Eg.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-500-normal-Cerq10X2.woff2) format("woff2"),url(/assets/inter-latin-500-normal-BL9OpVg8.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-600-normal-LgqL8muc.woff2) format("woff2"),url(/assets/inter-latin-600-normal-CiBQ2DWP.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-700-normal-Yt3aPRUw.woff2) format("woff2"),url(/assets/inter-latin-700-normal-BLAVimhd.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/jetbrains-mono-latin-600-normal-C8RAYTDA.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-600-normal-BfsvjouI.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/jetbrains-mono-latin-700-normal-BYuf6tUa.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/jetbrains-mono-latin-800-normal-D2mQHRMK.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-800-normal-Dj9qwObk.woff) format("woff")}/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-950:oklch(13% .028 261.692);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-5xl:3rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:4px;--radius-sm:6px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:20px;--drop-shadow-lg:0 4px 4px #00000026;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-display);--default-mono-font-family:var(--font-data);--font-title:var(--font-title);--duration-instant:75ms;--duration-fast:.15s;--duration-normal:.2s}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-x-3{inset-inline:calc(var(--spacing)*3)}.inset-x-\[8\%\]{inset-inline:8%}.-inset-y-0,.inset-y-0{inset-block:calc(var(--spacing)*0)}.inset-y-2{inset-block:calc(var(--spacing)*2)}.-top-0\.5{top:calc(var(--spacing)*-.5)}.-top-2{top:calc(var(--spacing)*-2)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-3{top:calc(var(--spacing)*3)}.top-4{top:calc(var(--spacing)*4)}.top-10{top:calc(var(--spacing)*10)}.top-\[2px\]{top:2px}.top-\[40px\]{top:40px}.top-\[var\(--tip-y\,0\)\]{top:var(--tip-y,0)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing)*-.5)}.-right-1{right:calc(var(--spacing)*-1)}.-right-2{right:calc(var(--spacing)*-2)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-1\.5{right:calc(var(--spacing)*1.5)}.right-2{right:calc(var(--spacing)*2)}.right-2\.5{right:calc(var(--spacing)*2.5)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.-bottom-0\.5{bottom:calc(var(--spacing)*-.5)}.-bottom-1{bottom:calc(var(--spacing)*-1)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-3{bottom:calc(var(--spacing)*3)}.bottom-\[-20px\]{bottom:-20px}.bottom-\[72px\]{bottom:72px}.bottom-full{bottom:100%}.-left-2{left:calc(var(--spacing)*-2)}.-left-3{left:calc(var(--spacing)*-3)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-\[2px\]{left:2px}.left-\[19px\]{left:19px}.left-\[var\(--tip-x\,0\)\]{left:var(--tip-x,0)}.isolate{isolation:isolate}.-z-10{z-index:-10}.-z-20{z-index:-20}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[600\]{z-index:600}.z-\[9999\]{z-index:9999}.z-\[10001\]{z-index:10001}.z-\[10002\]{z-index:10002}.z-\[10003\]{z-index:10003}.z-\[10010\]{z-index:10010}.col-auto{grid-column:auto}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:475px){.container{max-width:475px}}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-m-1{margin:calc(var(--spacing)*-1)}.-m-1\.5{margin:calc(var(--spacing)*-1.5)}.m-2{margin:calc(var(--spacing)*2)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.mx-0\.5{margin-inline:calc(var(--spacing)*.5)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.-mt-5{margin-top:calc(var(--spacing)*-5)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing)*.5)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.-mb-4{margin-bottom:calc(var(--spacing)*-4)}.mb-0{margin-bottom:calc(var(--spacing)*0)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-9{margin-left:calc(var(--spacing)*9)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-\[2\/1\]{aspect-ratio:2}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing)*1.5);height:calc(var(--spacing)*1.5)}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.size-2\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-12{width:calc(var(--spacing)*12);height:calc(var(--spacing)*12)}.size-16{width:calc(var(--spacing)*16);height:calc(var(--spacing)*16)}.size-\[max\(100\%\,2\.75rem\)\]{width:max(100%,2.75rem);height:max(100%,2.75rem)}.size-full{width:100%;height:100%}.\!h-3{height:calc(var(--spacing)*3)!important}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-56{height:calc(var(--spacing)*56)}.h-64{height:calc(var(--spacing)*64)}.h-\[1\.2em\]{height:1.2em}.h-\[2px\]{height:2px}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-\[18px\]{height:18px}.h-\[30px\]{height:30px}.h-\[32px\]{height:32px}.h-\[36px\]{height:36px}.h-\[38px\]{height:38px}.h-\[70vh\]{height:70vh}.h-\[75vh\]{height:75vh}.h-\[80vh\]{height:80vh}.h-\[200px\]{height:200px}.h-\[240px\]{height:240px}.h-\[calc\(100dvh-56px\)\]{height:calc(100dvh - 56px)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing)*0)}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[45vh\]{max-height:45vh}.max-h-\[200px\]{max-height:200px}.max-h-\[700px\]{max-height:700px}.max-h-\[calc\(100vh-80px\)\]{max-height:calc(100vh - 80px)}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.max-h-\[calc\(100vh-300px\)\]{max-height:calc(100vh - 300px)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[8px\]{min-height:8px}.min-h-\[28px\]{min-height:28px}.min-h-\[32px\]{min-height:32px}.min-h-\[40px\]{min-height:40px}.min-h-\[44px\]{min-height:44px}.min-h-\[50vh\]{min-height:50vh}.min-h-\[80px\]{min-height:80px}.min-h-\[120px\]{min-height:120px}.min-h-\[300px\]{min-height:300px}.min-h-\[500px\]{min-height:500px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.\!w-3{width:calc(var(--spacing)*3)!important}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-18{width:calc(var(--spacing)*18)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-30{width:calc(var(--spacing)*30)}.w-32{width:calc(var(--spacing)*32)}.w-48{width:calc(var(--spacing)*48)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-80{width:calc(var(--spacing)*80)}.w-\[0\.6em\]{width:.6em}.w-\[1\.75rem\]{width:1.75rem}.w-\[2\.25rem\]{width:2.25rem}.w-\[2px\]{width:2px}.w-\[3px\]{width:3px}.w-\[14px\]{width:14px}.w-\[28px\]{width:28px}.w-\[30px\]{width:30px}.w-\[32px\]{width:32px}.w-\[52px\]{width:52px}.w-\[240px\]{width:240px}.w-\[540px\]{width:540px}.w-\[var\(--button-width\)\]{width:var(--button-width)}.w-\[var\(--input-width\)\]{width:var(--input-width)}.w-full{width:100%}.w-px{width:1px}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[70px\]{max-width:70px}.max-w-\[80px\]{max-width:80px}.max-w-\[85\%\]{max-width:85%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[100px\]{max-width:100px}.max-w-\[140px\]{max-width:140px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-20{min-width:calc(var(--spacing)*20)}.min-w-\[2\.25rem\]{min-width:2.25rem}.min-w-\[18px\]{min-width:18px}.min-w-\[44px\]{min-width:44px}.min-w-\[60px\]{min-width:60px}.min-w-\[80px\]{min-width:80px}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[130px\]{min-width:130px}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-0{flex-basis:calc(var(--spacing)*0)}.origin-bottom{transform-origin:bottom}.origin-top{transform-origin:top}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-1\/4{--tw-translate-x: -25% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-90{rotate:-90deg}.rotate-0{rotate:none}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.rotate-\[135deg\]{rotate:135deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.touch-manipulation{touch-action:manipulation}.resize{resize:both}.scroll-py-1{scroll-padding-block:calc(var(--spacing)*1)}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.columns-2{columns:2}.columns-3{columns:3}.columns-4{columns:4}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[auto_minmax\(0\,1fr\)_auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-\[2px\]{gap:2px}.gap-\[3\%\]{gap:3%}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-3{column-gap:calc(var(--spacing)*3)}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-2{row-gap:calc(var(--spacing)*2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border-subtle>:not(:last-child)),:where(.divide-border-subtle\/30>:not(:last-child)){border-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){:where(.divide-border-subtle\/30>:not(:last-child)){border-color:color-mix(in oklab,var(--border-subtle)30%,transparent)}}:where(.divide-white\/5>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){:where(.divide-white\/5>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.self-center{align-self:center}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.justify-self-center{justify-self:center}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\!overflow-hidden{overflow:hidden!important}.\!overflow-visible{overflow:visible!important}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.\!rounded{border-radius:.25rem!important}.\!rounded-md{border-radius:8px!important}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:20px}.rounded-\[1\.125rem\]{border-radius:1.125rem}.rounded-\[1px\]{border-radius:1px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:12px}.rounded-md{border-radius:8px}.rounded-sm{border-radius:6px}.rounded-xl{border-radius:16px}.rounded-xs{border-radius:4px}.rounded-t-lg{border-top-left-radius:12px;border-top-right-radius:12px}.rounded-tl-md{border-top-left-radius:8px}.rounded-tr-md{border-top-right-radius:8px}.\!rounded-b-none{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-\[var\(--route-direct\)\]\/30{border-color:var(--route-direct)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--route-direct\)\]\/30{border-color:color-mix(in oklab,var(--route-direct)30%,transparent)}}.border-\[var\(--route-flood\)\]\/30{border-color:var(--route-flood)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--route-flood\)\]\/30{border-color:color-mix(in oklab,var(--route-flood)30%,transparent)}}.border-\[var\(--route-transport\)\]\/30{border-color:var(--route-transport)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--route-transport\)\]\/30{border-color:color-mix(in oklab,var(--route-transport)30%,transparent)}}.border-accent-danger,.border-accent-danger\/20{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-danger\/20{border-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.border-accent-danger\/30{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-danger\/30{border-color:color-mix(in oklab,var(--accent-danger)30%,transparent)}}.border-accent-danger\/50{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-danger\/50{border-color:color-mix(in oklab,var(--accent-danger)50%,transparent)}}.border-accent-primary,.border-accent-primary\/20{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/20{border-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.border-accent-primary\/30{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/30{border-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.border-accent-primary\/40{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/40{border-color:color-mix(in oklab,var(--accent-primary)40%,transparent)}}.border-accent-primary\/50{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/50{border-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.border-accent-purple\/30{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-purple\/30{border-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.border-accent-red\/50{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-red\/50{border-color:color-mix(in oklab,var(--accent-danger)50%,transparent)}}.border-accent-secondary\/20{border-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.border-accent-secondary\/20{border-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.border-accent-secondary\/30{border-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.border-accent-secondary\/30{border-color:color-mix(in oklab,var(--accent-secondary)30%,transparent)}}.border-accent-success\/20{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/20{border-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.border-accent-success\/30{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/30{border-color:color-mix(in oklab,var(--accent-success)30%,transparent)}}.border-accent-success\/40{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/40{border-color:color-mix(in oklab,var(--accent-success)40%,transparent)}}.border-accent-success\/50{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/50{border-color:color-mix(in oklab,var(--accent-success)50%,transparent)}}.border-accent-tertiary\/20{border-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.border-accent-tertiary\/20{border-color:color-mix(in oklab,var(--accent-tertiary)20%,transparent)}}.border-accent-tertiary\/30{border-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.border-accent-tertiary\/30{border-color:color-mix(in oklab,var(--accent-tertiary)30%,transparent)}}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.border-border-subtle,.border-border-subtle\/30{border-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){.border-border-subtle\/30{border-color:color-mix(in oklab,var(--border-subtle)30%,transparent)}}.border-border-subtle\/50{border-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){.border-border-subtle\/50{border-color:color-mix(in oklab,var(--border-subtle)50%,transparent)}}.border-card{border-color:var(--bg-surface)}.border-current\/30{border-color:currentColor}@supports (color:color-mix(in lab,red,red)){.border-current\/30{border-color:color-mix(in oklab,currentcolor 30%,transparent)}}.border-gray-800{border-color:var(--color-gray-800)}.border-orange-300\/50{border-color:#ffb96d80}@supports (color:color-mix(in lab,red,red)){.border-orange-300\/50{border-color:color-mix(in oklab,var(--color-orange-300)50%,transparent)}}.border-signal-poor\/30{border-color:var(--signal-poor)}@supports (color:color-mix(in lab,red,red)){.border-signal-poor\/30{border-color:color-mix(in oklab,var(--signal-poor)30%,transparent)}}.border-text-muted\/30{border-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.border-text-muted\/30{border-color:color-mix(in oklab,var(--text-muted)30%,transparent)}}.border-toggle-on{border-color:var(--toggle-on)}.border-transparent{border-color:#0000}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/\[0\.08\]{border-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.08\]{border-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.border-t-text-muted{border-top-color:var(--text-muted)}.border-t-transparent{border-top-color:#0000}.border-l-amber-400{border-left-color:var(--color-amber-400)}.bg-\[\#007AFF\]{background-color:#007aff}.bg-\[\#0074BE\]{background-color:#0074be}.bg-\[\#242627\]{background-color:#242627}.bg-\[\#F5F5F5\]{background-color:#f5f5f5}.bg-\[\#FF5F57\]{background-color:#ff5f57}.bg-\[var\(--route-direct\)\]\/20{background-color:var(--route-direct)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--route-direct\)\]\/20{background-color:color-mix(in oklab,var(--route-direct)20%,transparent)}}.bg-\[var\(--route-flood\)\]\/20{background-color:var(--route-flood)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--route-flood\)\]\/20{background-color:color-mix(in oklab,var(--route-flood)20%,transparent)}}.bg-\[var\(--route-transport\)\]\/20{background-color:var(--route-transport)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--route-transport\)\]\/20{background-color:color-mix(in oklab,var(--route-transport)20%,transparent)}}.bg-\[var\(--signal-critical\)\]{background-color:var(--signal-critical)}.bg-\[var\(--signal-excellent\)\]{background-color:var(--signal-excellent)}.bg-\[var\(--signal-fair\)\]{background-color:var(--signal-fair)}.bg-\[var\(--signal-good\)\]{background-color:var(--signal-good)}.bg-\[var\(--signal-poor\)\]{background-color:var(--signal-poor)}.bg-\[var\(--signal-unknown\)\]{background-color:var(--signal-unknown)}.bg-accent-danger,.bg-accent-danger\/10{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-danger\/10{background-color:color-mix(in oklab,var(--accent-danger)10%,transparent)}}.bg-accent-danger\/15{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-danger\/15{background-color:color-mix(in oklab,var(--accent-danger)15%,transparent)}}.bg-accent-danger\/20{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-danger\/20{background-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.bg-accent-primary,.bg-accent-primary\/5{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/5{background-color:color-mix(in oklab,var(--accent-primary)5%,transparent)}}.bg-accent-primary\/10{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/10{background-color:color-mix(in oklab,var(--accent-primary)10%,transparent)}}.bg-accent-primary\/15{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/15{background-color:color-mix(in oklab,var(--accent-primary)15%,transparent)}}.bg-accent-primary\/20{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/20{background-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.bg-accent-primary\/25{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/25{background-color:color-mix(in oklab,var(--accent-primary)25%,transparent)}}.bg-accent-primary\/30{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/30{background-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.bg-accent-primary\/40{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/40{background-color:color-mix(in oklab,var(--accent-primary)40%,transparent)}}.bg-accent-primary\/60{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/60{background-color:color-mix(in oklab,var(--accent-primary)60%,transparent)}}.bg-accent-primary\/90{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/90{background-color:color-mix(in oklab,var(--accent-primary)90%,transparent)}}.bg-accent-purple\/30{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-purple\/30{background-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.bg-accent-red\/10{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-red\/10{background-color:color-mix(in oklab,var(--accent-danger)10%,transparent)}}.bg-accent-secondary,.bg-accent-secondary\/5{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/5{background-color:color-mix(in oklab,var(--accent-secondary)5%,transparent)}}.bg-accent-secondary\/10{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/10{background-color:color-mix(in oklab,var(--accent-secondary)10%,transparent)}}.bg-accent-secondary\/15{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/15{background-color:color-mix(in oklab,var(--accent-secondary)15%,transparent)}}.bg-accent-secondary\/20{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/20{background-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.bg-accent-success,.bg-accent-success\/10{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.bg-accent-success\/10{background-color:color-mix(in oklab,var(--accent-success)10%,transparent)}}.bg-accent-success\/15{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.bg-accent-success\/15{background-color:color-mix(in oklab,var(--accent-success)15%,transparent)}}.bg-accent-success\/20{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.bg-accent-success\/20{background-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.bg-accent-tertiary,.bg-accent-tertiary\/5{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/5{background-color:color-mix(in oklab,var(--accent-tertiary)5%,transparent)}}.bg-accent-tertiary\/10{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/10{background-color:color-mix(in oklab,var(--accent-tertiary)10%,transparent)}}.bg-accent-tertiary\/15{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/15{background-color:color-mix(in oklab,var(--accent-tertiary)15%,transparent)}}.bg-accent-tertiary\/20{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/20{background-color:color-mix(in oklab,var(--accent-tertiary)20%,transparent)}}.bg-amber-400\/5{background-color:#fcbb000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/5{background-color:color-mix(in oklab,var(--color-amber-400)5%,transparent)}}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500)15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-amber-600{background-color:var(--color-amber-600)}.bg-bg-0{background-color:var(--palette-bg-0)}.bg-bg-1{background-color:var(--palette-bg-1)}.bg-bg-body,.bg-bg-body\/50{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.bg-bg-body\/50{background-color:color-mix(in oklab,var(--bg-body)50%,transparent)}}.bg-bg-elevated,.bg-bg-elevated\/20{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/20{background-color:color-mix(in oklab,var(--bg-elevated)20%,transparent)}}.bg-bg-elevated\/50{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/50{background-color:color-mix(in oklab,var(--bg-elevated)50%,transparent)}}.bg-bg-elevated\/80{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/80{background-color:color-mix(in oklab,var(--bg-elevated)80%,transparent)}}.bg-bg-elevated\/90{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/90{background-color:color-mix(in oklab,var(--bg-elevated)90%,transparent)}}.bg-bg-elevated\/95{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/95{background-color:color-mix(in oklab,var(--bg-elevated)95%,transparent)}}.bg-bg-subtle,.bg-bg-subtle\/30{background-color:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-bg-subtle\/30{background-color:color-mix(in oklab,var(--bg-subtle)30%,transparent)}}.bg-bg-subtle\/50{background-color:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-bg-subtle\/50{background-color:color-mix(in oklab,var(--bg-subtle)50%,transparent)}}.bg-bg-surface,.bg-bg-surface\/80{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.bg-bg-surface\/80{background-color:color-mix(in oklab,var(--bg-surface)80%,transparent)}}.bg-bg-surface\/85{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.bg-bg-surface\/85{background-color:color-mix(in oklab,var(--bg-surface)85%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-border-subtle,.bg-border-subtle\/50{background-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-border-subtle\/50{background-color:color-mix(in oklab,var(--border-subtle)50%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500)15%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.bg-signal-excellent\/10{background-color:var(--signal-excellent)}@supports (color:color-mix(in lab,red,red)){.bg-signal-excellent\/10{background-color:color-mix(in oklab,var(--signal-excellent)10%,transparent)}}.bg-signal-fair\/10{background-color:var(--signal-fair)}@supports (color:color-mix(in lab,red,red)){.bg-signal-fair\/10{background-color:color-mix(in oklab,var(--signal-fair)10%,transparent)}}.bg-signal-good\/10{background-color:var(--signal-good)}@supports (color:color-mix(in lab,red,red)){.bg-signal-good\/10{background-color:color-mix(in oklab,var(--signal-good)10%,transparent)}}.bg-signal-poor,.bg-signal-poor\/10{background-color:var(--signal-poor)}@supports (color:color-mix(in lab,red,red)){.bg-signal-poor\/10{background-color:color-mix(in oklab,var(--signal-poor)10%,transparent)}}.bg-sky-500\/15{background-color:#00a5ef26}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/15{background-color:color-mix(in oklab,var(--color-sky-500)15%,transparent)}}.bg-subtle-fill{background-color:var(--subtle-fill)}.bg-subtle-fill-hover{background-color:var(--subtle-fill-hover)}.bg-subtle-fill-strong{background-color:var(--subtle-fill-strong)}.bg-subtle-fill\/50{background-color:var(--subtle-fill)}@supports (color:color-mix(in lab,red,red)){.bg-subtle-fill\/50{background-color:color-mix(in oklab,var(--subtle-fill)50%,transparent)}}.bg-sys-amber,.bg-sys-amber\/20{background-color:var(--sys-amber)}@supports (color:color-mix(in lab,red,red)){.bg-sys-amber\/20{background-color:color-mix(in oklab,var(--sys-amber)20%,transparent)}}.bg-sys-cyan\/20{background-color:var(--sys-cyan)}@supports (color:color-mix(in lab,red,red)){.bg-sys-cyan\/20{background-color:color-mix(in oklab,var(--sys-cyan)20%,transparent)}}.bg-sys-green{background-color:var(--sys-green)}.bg-sys-indigo\/20{background-color:var(--sys-indigo)}@supports (color:color-mix(in lab,red,red)){.bg-sys-indigo\/20{background-color:color-mix(in oklab,var(--sys-indigo)20%,transparent)}}.bg-sys-orange{background-color:var(--sys-orange)}.bg-sys-red,.bg-sys-red\/15{background-color:var(--sys-red)}@supports (color:color-mix(in lab,red,red)){.bg-sys-red\/15{background-color:color-mix(in oklab,var(--sys-red)15%,transparent)}}.bg-sys-teal,.bg-sys-teal\/15{background-color:var(--sys-teal)}@supports (color:color-mix(in lab,red,red)){.bg-sys-teal\/15{background-color:color-mix(in oklab,var(--sys-teal)15%,transparent)}}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/10{background-color:color-mix(in oklab,var(--color-teal-500)10%,transparent)}}.bg-text-muted,.bg-text-muted\/15{background-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.bg-text-muted\/15{background-color:color-mix(in oklab,var(--text-muted)15%,transparent)}}.bg-text-muted\/20{background-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.bg-text-muted\/20{background-color:color-mix(in oklab,var(--text-muted)20%,transparent)}}.bg-text-muted\/30{background-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.bg-text-muted\/30{background-color:color-mix(in oklab,var(--text-muted)30%,transparent)}}.bg-toggle-off{background-color:var(--toggle-off)}.bg-toggle-on{background-color:var(--toggle-on)}.bg-tooltip-bg,.bg-tooltip-bg\/80{background-color:var(--tooltip-bg)}@supports (color:color-mix(in lab,red,red)){.bg-tooltip-bg\/80{background-color:color-mix(in oklab,var(--tooltip-bg)80%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500)5%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500)15%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.bg-white\/30{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-white)2%,transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white)3%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.bg-white\/\[0\.15\]{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.15\]{background-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.bg-zinc-500\/10{background-color:#71717b1a}@supports (color:color-mix(in lab,red,red)){.bg-zinc-500\/10{background-color:color-mix(in oklab,var(--color-zinc-500)10%,transparent)}}.bg-zinc-500\/15{background-color:#71717b26}@supports (color:color-mix(in lab,red,red)){.bg-zinc-500\/15{background-color:color-mix(in oklab,var(--color-zinc-500)15%,transparent)}}.bg-zinc-600{background-color:var(--color-zinc-600)}.bg-zinc-600\/40{background-color:#52525c66}@supports (color:color-mix(in lab,red,red)){.bg-zinc-600\/40{background-color:color-mix(in oklab,var(--color-zinc-600)40%,transparent)}}.bg-zinc-700\/50{background-color:#3f3f4680}@supports (color:color-mix(in lab,red,red)){.bg-zinc-700\/50{background-color:color-mix(in oklab,var(--color-zinc-700)50%,transparent)}}.bg-zinc-900\/20{background-color:#18181b33}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/20{background-color:color-mix(in oklab,var(--color-zinc-900)20%,transparent)}}.bg-cover{background-size:cover}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.fill-accent-success{fill:var(--accent-success)}.fill-text-secondary{fill:var(--text-secondary)}.stroke-current{stroke:currentColor}.stroke-white{stroke:var(--color-white)}.object-cover{object-fit:cover}.\!p-0{padding:calc(var(--spacing)*0)!important}.\!p-1\.5{padding:calc(var(--spacing)*1.5)!important}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-12{padding:calc(var(--spacing)*12)}.\!px-1{padding-inline:calc(var(--spacing)*1)!important}.\!px-1\.5{padding-inline:calc(var(--spacing)*1.5)!important}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-3\.5{padding-inline:calc(var(--spacing)*3.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.\!py-0{padding-block:calc(var(--spacing)*0)!important}.\!py-0\.5{padding-block:calc(var(--spacing)*.5)!important}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-14{padding-block:calc(var(--spacing)*14)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-0\.5{padding-top:calc(var(--spacing)*.5)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\.5{padding-top:calc(var(--spacing)*1.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\.5{padding-right:calc(var(--spacing)*1.5)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-2\.5{padding-right:calc(var(--spacing)*2.5)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-10{padding-right:calc(var(--spacing)*10)}.pr-12{padding-right:calc(var(--spacing)*12)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-5{padding-left:calc(var(--spacing)*5)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-11{padding-left:calc(var(--spacing)*11)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:var(--font-data)}.font-sans{font-family:var(--font-display)}.\!text-xs{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm\/6{font-size:var(--text-sm);line-height:calc(var(--spacing)*6)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\!text-\[8px\]{font-size:8px!important}.\!text-\[9px\]{font-size:9px!important}.\!text-\[10px\]{font-size:10px!important}.text-\[0\.6em\]{font-size:.6em}.text-\[0\.625rem\]{font-size:.625rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[1\.5em\]{font-size:1.5em}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[20px\]{font-size:20px}.\!leading-none{--tw-leading:1!important;line-height:1!important}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#2D2D2D\]{color:#2d2d2d}.text-\[\#4A0000\]{color:#4a0000}.text-\[\#58b99d\]{color:#58b99d}.text-\[var\(--pkt-ack\)\]{color:var(--pkt-ack)}.text-\[var\(--pkt-advert\)\]{color:var(--pkt-advert)}.text-\[var\(--pkt-anon\)\]{color:var(--pkt-anon)}.text-\[var\(--pkt-flood\)\]{color:var(--pkt-flood)}.text-\[var\(--pkt-grp-data\)\]{color:var(--pkt-grp-data)}.text-\[var\(--pkt-grp-txt\)\]{color:var(--pkt-grp-txt)}.text-\[var\(--pkt-path\)\]{color:var(--pkt-path)}.text-\[var\(--pkt-req\)\]{color:var(--pkt-req)}.text-\[var\(--pkt-response\)\]{color:var(--pkt-response)}.text-\[var\(--pkt-trace\)\]{color:var(--pkt-trace)}.text-\[var\(--pkt-txt-msg\)\]{color:var(--pkt-txt-msg)}.text-\[var\(--pkt-unknown\)\]{color:var(--pkt-unknown)}.text-\[var\(--route-direct\)\]{color:var(--route-direct)}.text-\[var\(--route-flood\)\]{color:var(--route-flood)}.text-\[var\(--route-transport\)\]{color:var(--route-transport)}.text-\[var\(--signal-fair\)\]{color:var(--signal-fair)}.text-\[var\(--status-warning\)\]{color:var(--status-warning)}.text-accent-danger{color:var(--accent-danger)}.text-accent-primary,.text-accent-purple{color:var(--accent-primary)}.text-accent-red{color:var(--accent-danger)}.text-accent-secondary{color:var(--accent-secondary)}.text-accent-success{color:var(--accent-success)}.text-accent-tertiary{color:var(--accent-tertiary)}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/60{color:#fcbb0099}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/60{color:color-mix(in oklab,var(--color-amber-400)60%,transparent)}}.text-amber-400\/70{color:#fcbb00b3}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/70{color:color-mix(in oklab,var(--color-amber-400)70%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-bg-body{color:var(--bg-body)}.text-black{color:var(--color-black)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-border-subtle{color:var(--border-subtle)}.text-emerald-400{color:var(--color-emerald-400)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-green-400{color:var(--color-green-400)}.text-icon-card-title{color:var(--icon-card-title)}.text-icon-page-title{color:var(--icon-page-title)}.text-icon-widget{color:var(--icon-widget)}.text-map-neighbor-color{color:var(--map-neighbor-color)}.text-primary{color:var(--accent-tertiary)}.text-purple-600{color:var(--color-purple-600)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-secondary{color:var(--accent-secondary)}.text-signal-critical{color:var(--signal-critical)}.text-signal-excellent{color:var(--signal-excellent)}.text-signal-fair{color:var(--signal-fair)}.text-signal-good{color:var(--signal-good)}.text-signal-poor{color:var(--signal-poor)}.text-sky-400{color:var(--color-sky-400)}.text-sys-amber{color:var(--sys-amber)}.text-sys-brown{color:var(--sys-brown)}.text-sys-cyan{color:var(--sys-cyan)}.text-sys-green{color:var(--sys-green)}.text-sys-indigo{color:var(--sys-indigo)}.text-sys-pink{color:var(--sys-pink)}.text-sys-purple{color:var(--sys-purple)}.text-sys-red{color:var(--sys-red)}.text-sys-teal{color:var(--sys-teal)}.text-teal-400{color:var(--color-teal-400)}.text-teal-600{color:var(--color-teal-600)}.text-text-muted,.text-text-muted\/40{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/40{color:color-mix(in oklab,var(--text-muted)40%,transparent)}}.text-text-muted\/50{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/50{color:color-mix(in oklab,var(--text-muted)50%,transparent)}}.text-text-muted\/60{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/60{color:color-mix(in oklab,var(--text-muted)60%,transparent)}}.text-text-muted\/70{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/70{color:color-mix(in oklab,var(--text-muted)70%,transparent)}}.text-text-muted\/80{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/80{color:color-mix(in oklab,var(--text-muted)80%,transparent)}}.text-text-primary{color:var(--text-primary)}.text-text-secondary,.text-text-secondary\/60{color:var(--text-secondary)}@supports (color:color-mix(in lab,red,red)){.text-text-secondary\/60{color:color-mix(in oklab,var(--text-secondary)60%,transparent)}}.text-transparent{color:#0000}.text-violet-400{color:var(--color-violet-400)}.text-violet-400\/70{color:#a685ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-400\/70{color:color-mix(in oklab,var(--color-violet-400)70%,transparent)}}.text-white{color:var(--color-white)}.text-white\/20{color:#fff3}@supports (color:color-mix(in lab,red,red)){.text-white\/20{color:color-mix(in oklab,var(--color-white)20%,transparent)}}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white)30%,transparent)}}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab,red,red)){.text-white\/40{color:color-mix(in oklab,var(--color-white)40%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-900{color:var(--color-zinc-900)}.text-zinc-900\/70{color:#18181bb3}@supports (color:color-mix(in lab,red,red)){.text-zinc-900\/70{color:color-mix(in oklab,var(--color-zinc-900)70%,transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.placeholder-text-muted::placeholder{color:var(--text-muted)}.accent-accent-purple{accent-color:var(--accent-primary)}.accent-primary{accent-color:var(--accent-tertiary)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow\!{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[1\.5px\]{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1.5px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[\#E0443E\]{--tw-ring-color:#e0443e}.ring-accent-danger{--tw-ring-color:var(--accent-danger)}.ring-accent-primary,.ring-accent-primary\/30{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.ring-accent-primary\/30{--tw-ring-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.ring-accent-primary\/40{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.ring-accent-primary\/40{--tw-ring-color:color-mix(in oklab,var(--accent-primary)40%,transparent)}}.ring-accent-primary\/50{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.ring-accent-primary\/50{--tw-ring-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.ring-accent-success{--tw-ring-color:var(--accent-success)}.ring-amber-500\/30{--tw-ring-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.ring-amber-500\/30{--tw-ring-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.ring-border-subtle{--tw-ring-color:var(--border-subtle)}.ring-sys-amber\/50{--tw-ring-color:var(--sys-amber)}@supports (color:color-mix(in lab,red,red)){.ring-sys-amber\/50{--tw-ring-color:color-mix(in oklab,var(--sys-amber)50%,transparent)}}.ring-sys-cyan\/50{--tw-ring-color:var(--sys-cyan)}@supports (color:color-mix(in lab,red,red)){.ring-sys-cyan\/50{--tw-ring-color:color-mix(in oklab,var(--sys-cyan)50%,transparent)}}.ring-sys-red\/25{--tw-ring-color:var(--sys-red)}@supports (color:color-mix(in lab,red,red)){.ring-sys-red\/25{--tw-ring-color:color-mix(in oklab,var(--sys-red)25%,transparent)}}.ring-sys-teal\/25{--tw-ring-color:var(--sys-teal)}@supports (color:color-mix(in lab,red,red)){.ring-sys-teal\/25{--tw-ring-color:color-mix(in oklab,var(--sys-teal)25%,transparent)}}.ring-white\/5{--tw-ring-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.ring-white\/5{--tw-ring-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.ring-white\/10{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.ring-white\/10{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.ring-white\/40{--tw-ring-color:#fff6}@supports (color:color-mix(in lab,red,red)){.ring-white\/40{--tw-ring-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.ring-white\/\[0\.1\]{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.ring-white\/\[0\.1\]{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.ring-white\/\[0\.06\]{--tw-ring-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.ring-white\/\[0\.06\]{--tw-ring-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.ring-zinc-600\/50{--tw-ring-color:#52525c80}@supports (color:color-mix(in lab,red,red)){.ring-zinc-600\/50{--tw-ring-color:color-mix(in oklab,var(--color-zinc-600)50%,transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a))drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a)drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-lg{--tw-drop-shadow-size:drop-shadow(0 4px 4px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{--tw-ease:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}:is(.\*\:w-full>*){width:100%}@media(hover:hover){.group-hover\:inline-block:is(:where(.group):hover *){display:inline-block}.group-hover\:text-accent-purple:is(:where(.group):hover *){color:var(--accent-primary)}.group-hover\:text-text-secondary:is(:where(.group):hover *){color:var(--text-secondary)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/tip\:visible:is(:where(.group\/tip):hover *){visibility:visible}.group-hover\/tip\:opacity-100:is(:where(.group\/tip):hover *){opacity:1}}.group-has-\[\:disabled\]\:stroke-gray-950\/25:is(:where(.group):has(:disabled) *){stroke:#03071240}@supports (color:color-mix(in lab,red,red)){.group-has-\[\:disabled\]\:stroke-gray-950\/25:is(:where(.group):has(:disabled) *){stroke:color-mix(in oklab,var(--color-gray-950)25%,transparent)}}.group-data-\[open\]\:rotate-180:is(:where(.group)[data-open] *){rotate:180deg}.selection\:bg-transparent ::selection{background-color:#0000}.selection\:bg-transparent::selection{background-color:#0000}.placeholder\:font-normal::placeholder{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.placeholder\:text-text-muted::placeholder,.placeholder\:text-text-muted\/50::placeholder{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-text-muted\/50::placeholder{color:color-mix(in oklab,var(--text-muted)50%,transparent)}}.placeholder\:text-text-muted\/60::placeholder{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-text-muted\/60::placeholder{color:color-mix(in oklab,var(--text-muted)60%,transparent)}}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:-inset-px:before{content:var(--tw-content);top:-1px;right:-1px;bottom:-1px;left:-1px}.before\:rounded-lg:before{content:var(--tw-content);border-radius:12px}.before\:bg-white\/5:before{content:var(--tw-content);background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.before\:bg-white\/5:before{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-accent-danger\/50:hover{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-danger\/50:hover{border-color:color-mix(in oklab,var(--accent-danger)50%,transparent)}}.hover\:border-accent-primary\/30:hover{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-primary\/30:hover{border-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.hover\:border-accent-primary\/50:hover{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-primary\/50:hover{border-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.hover\:border-accent-secondary\/50:hover{border-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-secondary\/50:hover{border-color:color-mix(in oklab,var(--accent-secondary)50%,transparent)}}.hover\:border-accent-success\/50:hover{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-success\/50:hover{border-color:color-mix(in oklab,var(--accent-success)50%,transparent)}}.hover\:border-border-strong:hover{border-color:var(--border-strong)}.hover\:bg-\[\#FF6961\]:hover{background-color:#ff6961}.hover\:bg-accent-danger\/10:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/10:hover{background-color:color-mix(in oklab,var(--accent-danger)10%,transparent)}}.hover\:bg-accent-danger\/20:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/20:hover{background-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.hover\:bg-accent-danger\/30:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/30:hover{background-color:color-mix(in oklab,var(--accent-danger)30%,transparent)}}.hover\:bg-accent-danger\/90:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/90:hover{background-color:color-mix(in oklab,var(--accent-danger)90%,transparent)}}.hover\:bg-accent-primary:hover,.hover\:bg-accent-primary\/10:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/10:hover{background-color:color-mix(in oklab,var(--accent-primary)10%,transparent)}}.hover\:bg-accent-primary\/20:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/20:hover{background-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.hover\:bg-accent-primary\/30:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/30:hover{background-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.hover\:bg-accent-primary\/80:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/80:hover{background-color:color-mix(in oklab,var(--accent-primary)80%,transparent)}}.hover\:bg-accent-primary\/90:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/90:hover{background-color:color-mix(in oklab,var(--accent-primary)90%,transparent)}}.hover\:bg-accent-secondary\/10:hover{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-secondary\/10:hover{background-color:color-mix(in oklab,var(--accent-secondary)10%,transparent)}}.hover\:bg-accent-secondary\/20:hover{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-secondary\/20:hover{background-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.hover\:bg-accent-secondary\/90:hover{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-secondary\/90:hover{background-color:color-mix(in oklab,var(--accent-secondary)90%,transparent)}}.hover\:bg-accent-success\/10:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/10:hover{background-color:color-mix(in oklab,var(--accent-success)10%,transparent)}}.hover\:bg-accent-success\/20:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/20:hover{background-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.hover\:bg-accent-success\/80:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/80:hover{background-color:color-mix(in oklab,var(--accent-success)80%,transparent)}}.hover\:bg-accent-success\/90:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/90:hover{background-color:color-mix(in oklab,var(--accent-success)90%,transparent)}}.hover\:bg-accent-tertiary\/10:hover{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-tertiary\/10:hover{background-color:color-mix(in oklab,var(--accent-tertiary)10%,transparent)}}.hover\:bg-accent-tertiary\/20:hover{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-tertiary\/20:hover{background-color:color-mix(in oklab,var(--accent-tertiary)20%,transparent)}}.hover\:bg-accent-tertiary\/25:hover{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-tertiary\/25:hover{background-color:color-mix(in oklab,var(--accent-tertiary)25%,transparent)}}.hover\:bg-amber-400\/10:hover{background-color:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-400\/10:hover{background-color:color-mix(in oklab,var(--color-amber-400)10%,transparent)}}.hover\:bg-amber-500:hover{background-color:var(--color-amber-500)}.hover\:bg-bg-elevated:hover,.hover\:bg-bg-elevated\/50:hover{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bg-elevated\/50:hover{background-color:color-mix(in oklab,var(--bg-elevated)50%,transparent)}}.hover\:bg-bg-subtle:hover{background-color:var(--bg-subtle)}.hover\:bg-bg-surface:hover{background-color:var(--bg-surface)}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.hover\:bg-signal-fair\/10:hover{background-color:var(--signal-fair)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-signal-fair\/10:hover{background-color:color-mix(in oklab,var(--signal-fair)10%,transparent)}}.hover\:bg-subtle-fill:hover{background-color:var(--subtle-fill)}.hover\:bg-subtle-fill-hover:hover{background-color:var(--subtle-fill-hover)}.hover\:bg-subtle-fill-strong:hover{background-color:var(--subtle-fill-strong)}.hover\:bg-subtle-fill\/30:hover{background-color:var(--subtle-fill)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-subtle-fill\/30:hover{background-color:color-mix(in oklab,var(--subtle-fill)30%,transparent)}}.hover\:bg-tooltip-bg:hover{background-color:var(--tooltip-bg)}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\:bg-white\/\[0\.02\]:hover{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.02\]:hover{background-color:color-mix(in oklab,var(--color-white)2%,transparent)}}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab,var(--color-white)3%,transparent)}}.hover\:bg-zinc-500:hover{background-color:var(--color-zinc-500)}.hover\:bg-zinc-900\/20:hover{background-color:#18181b33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-900\/20:hover{background-color:color-mix(in oklab,var(--color-zinc-900)20%,transparent)}}.hover\:bg-zinc-900\/30:hover{background-color:#18181b4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-900\/30:hover{background-color:color-mix(in oklab,var(--color-zinc-900)30%,transparent)}}.hover\:text-accent-danger:hover{color:var(--accent-danger)}.hover\:text-accent-primary:hover,.hover\:text-accent-primary\/80:hover{color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-accent-primary\/80:hover{color:color-mix(in oklab,var(--accent-primary)80%,transparent)}}.hover\:text-accent-secondary:hover{color:var(--accent-secondary)}.hover\:text-accent-tertiary:hover{color:var(--accent-tertiary)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-signal-critical\/80:hover{color:var(--signal-critical)}@supports (color:color-mix(in lab,red,red)){.hover\:text-signal-critical\/80:hover{color:color-mix(in oklab,var(--signal-critical)80%,transparent)}}.hover\:text-text-primary:hover{color:var(--text-primary)}.hover\:text-text-secondary:hover{color:var(--text-secondary)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-300:hover{color:var(--color-zinc-300)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-100:hover{opacity:1}.hover\:ring-accent-primary\/50:hover{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:ring-accent-primary\/50:hover{--tw-ring-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.focus\:border-accent-primary\/50:focus{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.focus\:border-accent-primary\/50:focus{border-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.focus\:border-zinc-500:focus{border-color:var(--color-zinc-500)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-accent-primary:focus{--tw-ring-color:var(--accent-primary)}.focus\:ring-accent-tertiary\/50:focus{--tw-ring-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-accent-tertiary\/50:focus{--tw-ring-color:color-mix(in oklab,var(--accent-tertiary)50%,transparent)}}.focus\:ring-signal-fair\/50:focus{--tw-ring-color:var(--signal-fair)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-signal-fair\/50:focus{--tw-ring-color:color-mix(in oklab,var(--signal-fair)50%,transparent)}}.focus\:ring-white\/30:focus{--tw-ring-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.focus\:ring-white\/30:focus{--tw-ring-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.focus\:ring-offset-bg-elevated:focus{--tw-ring-offset-color:var(--bg-elevated)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[\#FF5F57\]:focus-visible{--tw-ring-color:#ff5f57}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-accent-primary:focus-visible{outline-color:var(--accent-primary)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-\[\#E04840\]:active{background-color:#e04840}.active\:bg-accent-danger\/20:active{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-danger\/20:active{background-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.active\:bg-accent-danger\/80:active{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-danger\/80:active{background-color:color-mix(in oklab,var(--accent-danger)80%,transparent)}}.active\:bg-accent-primary\/20:active{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-primary\/20:active{background-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.active\:bg-accent-primary\/70:active{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-primary\/70:active{background-color:color-mix(in oklab,var(--accent-primary)70%,transparent)}}.active\:bg-accent-primary\/80:active{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-primary\/80:active{background-color:color-mix(in oklab,var(--accent-primary)80%,transparent)}}.active\:bg-accent-secondary\/20:active{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-secondary\/20:active{background-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.active\:bg-accent-secondary\/80:active{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-secondary\/80:active{background-color:color-mix(in oklab,var(--accent-secondary)80%,transparent)}}.active\:bg-accent-success\/20:active{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-success\/20:active{background-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.active\:bg-accent-success\/70:active{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-success\/70:active{background-color:color-mix(in oklab,var(--accent-success)70%,transparent)}}.active\:bg-accent-success\/80:active{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-success\/80:active{background-color:color-mix(in oklab,var(--accent-success)80%,transparent)}}.active\:bg-amber-700:active{background-color:var(--color-amber-700)}.active\:bg-bg-elevated:active,.active\:bg-bg-elevated\/70:active{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.active\:bg-bg-elevated\/70:active{background-color:color-mix(in oklab,var(--bg-elevated)70%,transparent)}}.active\:bg-bg-surface:active{background-color:var(--bg-surface)}.active\:bg-subtle-fill:active{background-color:var(--subtle-fill)}.active\:bg-subtle-fill-strong:active{background-color:var(--subtle-fill-strong)}.active\:bg-tooltip-bg:active{background-color:var(--tooltip-bg)}.active\:bg-white\/5:active{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.active\:bg-white\/5:active{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.active\:bg-white\/\[0\.04\]:active{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.active\:bg-white\/\[0\.04\]:active{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.active\:text-blue-300:active{color:var(--color-blue-300)}.active\:brightness-90:active{--tw-brightness:brightness(90%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.data-\[closed\]\:opacity-0[data-closed]{opacity:0}.data-\[enter\]\:duration-150[data-enter]{--tw-duration:.15s;transition-duration:.15s}.data-\[leave\]\:duration-100[data-leave]{--tw-duration:.1s;transition-duration:.1s}@media(min-width:520px){.min-\[520px\]\:inline{display:inline}}@media(min-width:600px){.min-\[600px\]\:hidden{display:none}.min-\[600px\]\:inline-flex{display:inline-flex}.min-\[600px\]\:gap-1\.5{gap:calc(var(--spacing)*1.5)}.min-\[600px\]\:gap-3{gap:calc(var(--spacing)*3)}.min-\[600px\]\:px-3{padding-inline:calc(var(--spacing)*3)}.min-\[600px\]\:py-2\.5{padding-block:calc(var(--spacing)*2.5)}.min-\[600px\]\:text-\[11px\]{font-size:11px}}@media(min-width:900px){.min-\[900px\]\:block{display:block}.min-\[900px\]\:gap-2{gap:calc(var(--spacing)*2)}}@media(min-width:40rem){.sm\:top-4{top:calc(var(--spacing)*4)}.sm\:top-11{top:calc(var(--spacing)*11)}.sm\:right-3{right:calc(var(--spacing)*3)}.sm\:right-4{right:calc(var(--spacing)*4)}.sm\:bottom-16{bottom:calc(var(--spacing)*16)}.sm\:left-auto{left:auto}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:-mx-6{margin-inline:calc(var(--spacing)*-6)}.sm\:mt-1{margin-top:calc(var(--spacing)*1)}.sm\:mt-2{margin-top:calc(var(--spacing)*2)}.sm\:mt-4{margin-top:calc(var(--spacing)*4)}.sm\:-mb-6{margin-bottom:calc(var(--spacing)*-6)}.sm\:mb-1{margin-bottom:calc(var(--spacing)*1)}.sm\:mb-2{margin-bottom:calc(var(--spacing)*2)}.sm\:mb-3{margin-bottom:calc(var(--spacing)*3)}.sm\:-ml-px{margin-left:-1px}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:aspect-\[4\/3\]{aspect-ratio:4/3}.sm\:h-3{height:calc(var(--spacing)*3)}.sm\:h-3\.5{height:calc(var(--spacing)*3.5)}.sm\:h-4{height:calc(var(--spacing)*4)}.sm\:h-6{height:calc(var(--spacing)*6)}.sm\:h-\[85vh\]{height:85vh}.sm\:h-\[500px\]{height:500px}.sm\:max-h-96{max-height:calc(var(--spacing)*96)}.sm\:max-h-\[600px\]{max-height:600px}.sm\:max-h-\[800px\]{max-height:800px}.sm\:max-h-\[calc\(100vh-180px\)\]{max-height:calc(100vh - 180px)}.sm\:max-h-\[calc\(100vh-250px\)\]{max-height:calc(100vh - 250px)}.sm\:min-h-0{min-height:calc(var(--spacing)*0)}.sm\:min-h-\[60px\]{min-height:60px}.sm\:w-3{width:calc(var(--spacing)*3)}.sm\:w-3\.5{width:calc(var(--spacing)*3.5)}.sm\:w-4{width:calc(var(--spacing)*4)}.sm\:w-6{width:calc(var(--spacing)*6)}.sm\:w-14{width:calc(var(--spacing)*14)}.sm\:w-16{width:calc(var(--spacing)*16)}.sm\:w-28{width:calc(var(--spacing)*28)}.sm\:w-64{width:calc(var(--spacing)*64)}.sm\:w-\[320px\]{width:320px}.sm\:w-auto{width:auto}.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-3xl{max-width:var(--container-3xl)}.sm\:max-w-4xl{max-width:var(--container-4xl)}.sm\:max-w-5xl{max-width:var(--container-5xl)}.sm\:max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:max-w-xs{max-width:var(--container-xs)}.sm\:min-w-0{min-width:calc(var(--spacing)*0)}.sm\:min-w-\[700px\]{min-width:700px}.sm\:flex-initial{flex:0 auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[280px_minmax\(400px\,1fr\)\]{grid-template-columns:280px minmax(400px,1fr)}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1{gap:calc(var(--spacing)*1)}.sm\:gap-1\.5{gap:calc(var(--spacing)*1.5)}.sm\:gap-2{gap:calc(var(--spacing)*2)}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:gap-4{gap:calc(var(--spacing)*4)}.sm\:gap-6{gap:calc(var(--spacing)*6)}.sm\:gap-8{gap:calc(var(--spacing)*8)}:where(.sm\:space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}.sm\:gap-x-3{column-gap:calc(var(--spacing)*3)}.sm\:gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}.sm\:self-auto{align-self:auto}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:\!p-0\.5{padding:calc(var(--spacing)*.5)!important}.sm\:p-1\.5{padding:calc(var(--spacing)*1.5)}.sm\:p-2{padding:calc(var(--spacing)*2)}.sm\:p-4{padding:calc(var(--spacing)*4)}.sm\:p-5{padding:calc(var(--spacing)*5)}.sm\:px-2{padding-inline:calc(var(--spacing)*2)}.sm\:px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.sm\:px-4{padding-inline:calc(var(--spacing)*4)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:py-1{padding-block:calc(var(--spacing)*1)}.sm\:py-1\.5{padding-block:calc(var(--spacing)*1.5)}.sm\:py-2{padding-block:calc(var(--spacing)*2)}.sm\:py-3{padding-block:calc(var(--spacing)*3)}.sm\:py-4{padding-block:calc(var(--spacing)*4)}.sm\:pt-0{padding-top:calc(var(--spacing)*0)}.sm\:pt-2{padding-top:calc(var(--spacing)*2)}.sm\:pt-4{padding-top:calc(var(--spacing)*4)}.sm\:pr-2{padding-right:calc(var(--spacing)*2)}.sm\:pr-6{padding-right:calc(var(--spacing)*6)}.sm\:pb-4{padding-bottom:calc(var(--spacing)*4)}.sm\:pb-6{padding-bottom:calc(var(--spacing)*6)}.sm\:pl-6{padding-left:calc(var(--spacing)*6)}.sm\:pl-7{padding-left:calc(var(--spacing)*7)}.sm\:pl-11{padding-left:calc(var(--spacing)*11)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[11px\]{font-size:11px}.sm\:opacity-100{opacity:1}:is(.sm\:\*\:w-auto>*){width:auto}}@media(min-width:48rem){.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:h-\[80vh\]{height:80vh}.md\:max-h-\[900px\]{max-height:900px}.md\:w-72{width:calc(var(--spacing)*72)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:p-5{padding:calc(var(--spacing)*5)}}@media(min-width:64rem){.lg\:-mx-3{margin-inline:calc(var(--spacing)*-3)}.lg\:-mx-8{margin-inline:calc(var(--spacing)*-8)}.lg\:-mb-8{margin-bottom:calc(var(--spacing)*-8)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:table-cell{display:table-cell}.lg\:aspect-video{aspect-ratio:var(--aspect-video)}.lg\:h-dvh{height:100dvh}.lg\:w-32{width:calc(var(--spacing)*32)}.lg\:w-\[380px\]{width:380px}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:gap-3{gap:calc(var(--spacing)*3)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:pb-8{padding-bottom:calc(var(--spacing)*8)}}@media(prefers-color-scheme:dark){.dark\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:bg-amber-400\/10{background-color:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-400\/10{background-color:color-mix(in oklab,var(--color-amber-400)10%,transparent)}}.dark\:bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400)10%,transparent)}}.dark\:bg-purple-400\/10{background-color:#c07eff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-400\/10{background-color:color-mix(in oklab,var(--color-purple-400)10%,transparent)}}.dark\:bg-teal-400\/10{background-color:#00d3bd1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-teal-400\/10{background-color:color-mix(in oklab,var(--color-teal-400)10%,transparent)}}.dark\:bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:bg-yellow-400\/10{background-color:#fac8001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-400\/10{background-color:color-mix(in oklab,var(--color-yellow-400)10%,transparent)}}.dark\:bg-zinc-400\/10{background-color:#9f9fa91a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-zinc-400\/10{background-color:color-mix(in oklab,var(--color-zinc-400)10%,transparent)}}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-teal-400{color:var(--color-teal-400)}.dark\:text-yellow-400{color:var(--color-yellow-400)}.dark\:text-zinc-400{color:var(--color-zinc-400)}}@media(forced-colors:active){.forced-colors\:appearance-auto{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.\[\&\:\:-moz-range-thumb\]\:h-4::-moz-range-thumb{height:calc(var(--spacing)*4)}.\[\&\:\:-moz-range-thumb\]\:w-4::-moz-range-thumb{width:calc(var(--spacing)*4)}.\[\&\:\:-moz-range-thumb\]\:cursor-pointer::-moz-range-thumb{cursor:pointer}.\[\&\:\:-moz-range-thumb\]\:appearance-none::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-moz-range-thumb\]\:rounded-full::-moz-range-thumb{border-radius:3.40282e38px}.\[\&\:\:-moz-range-thumb\]\:border-0::-moz-range-thumb{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-slider-thumb\]\:h-3\.5::-webkit-slider-thumb{height:calc(var(--spacing)*3.5)}.\[\&\:\:-webkit-slider-thumb\]\:h-4::-webkit-slider-thumb{height:calc(var(--spacing)*4)}.\[\&\:\:-webkit-slider-thumb\]\:w-3\.5::-webkit-slider-thumb{width:calc(var(--spacing)*3.5)}.\[\&\:\:-webkit-slider-thumb\]\:w-4::-webkit-slider-thumb{width:calc(var(--spacing)*4)}.\[\&\:\:-webkit-slider-thumb\]\:cursor-pointer::-webkit-slider-thumb{cursor:pointer}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-accent-secondary::-webkit-slider-thumb{background-color:var(--accent-secondary)}.\[\&\:\:-webkit-slider-thumb\]\:shadow-lg::-webkit-slider-thumb{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\:\:-webkit-slider-thumb\]\:shadow-md::-webkit-slider-thumb{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\:\:-webkit-slider-thumb\]\:transition-transform::-webkit-slider-thumb{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.\[\&\:\:-webkit-slider-thumb\]\:hover\:scale-110::-webkit-slider-thumb:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}}.\[\&\>\[data-slot\=icon\]\]\:h-4>[data-slot=icon]{height:calc(var(--spacing)*4)}.\[\&\>\[data-slot\=icon\]\]\:w-4>[data-slot=icon]{width:calc(var(--spacing)*4)}.\[\&\>\[data-slot\=icon\]\]\:shrink-0>[data-slot=icon]{flex-shrink:0}.\[\&\>\[data-slot\=section\]\+\[data-slot\=section\]\]\:mt-2\.5>[data-slot=section]+[data-slot=section]{margin-top:calc(var(--spacing)*2.5)}.\[\&\>\[data-slot\=section\]\+\[data-slot\=section\]\]\:mt-6>[data-slot=section]+[data-slot=section]{margin-top:calc(var(--spacing)*6)}.\[\&\>svg\]\:h-5>svg{height:calc(var(--spacing)*5)}.\[\&\>svg\]\:w-5>svg{width:calc(var(--spacing)*5)}.\[\&\>svg\]\:flex-shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-accent-primary>svg{color:var(--accent-primary)}.\[\&\>svg\]\:text-text-muted>svg{color:var(--text-muted)}@media(hover:hover){.hover\:\[\&\>svg\]\:text-text-primary:hover>svg{color:var(--text-primary)}}@media(pointer:fine){.\[\@media\(pointer\:fine\)\]\:hidden{display:none}}}@supports (color:color(display-p3 1 1 1)){:root{--accent-primary:color(display-p3 .443 .612 .875);--accent-secondary:color(display-p3 .875 .737 .447);--accent-tertiary:color(display-p3 .435 .737 .741);--accent-danger:color(display-p3 .882 .15 .447);--accent-success:color(display-p3 .443 .596 .447);--signal-excellent:color(display-p3 0 1 0);--signal-good:color(display-p3 .55 .9 .15);--signal-fair:color(display-p3 1 .85 0);--signal-poor:color(display-p3 1 .55 .15);--signal-critical:color(display-p3 1 .2 .2);--sparkline-excellent:color(display-p3 .1 .9 .35);--sparkline-good:color(display-p3 .45 .85 .05);--sparkline-fair:color(display-p3 1 .8 0);--sparkline-poor:color(display-p3 1 .5 .1);--sparkline-critical:color(display-p3 1 .15 .15);--status-success:color(display-p3 .443 .596 .447);--status-warning:color(display-p3 .875 .737 .447);--status-danger:color(display-p3 .882 .15 .447);--status-info:color(display-p3 .435 .737 .741);--pkt-advert:color(display-p3 .875 .737 .447);--pkt-flood:color(display-p3 .435 .737 .741);--pkt-txt-msg:color(display-p3 .443 .596 .447);--pkt-ack:color(display-p3 .6 .604 .741);--pkt-trace:color(display-p3 .439 .741 .875);--pkt-req:color(display-p3 0 .455 .745);--pkt-response:color(display-p3 .596 .737 .6);--pkt-grp-txt:color(display-p3 .882 .471 .6);--pkt-grp-data:color(display-p3 .745 .459 .447);--pkt-path:color(display-p3 .439 .741 .875);--pkt-anon:color(display-p3 .741 .733 .447);--chart-1:color(display-p3 .443 .612 .875);--chart-2:color(display-p3 0 .455 .745);--chart-3:color(display-p3 .435 .737 .741);--chart-4:color(display-p3 .875 .737 .447);--chart-5:color(display-p3 .443 .596 .447);--chart-6:color(display-p3 .882 .15 .447);--chart-7:color(display-p3 .882 .471 .6);--chart-8:color(display-p3 .6 .604 .741);--metric-received:color(display-p3 .443 .596 .447);--metric-forwarded:color(display-p3 0 .455 .745);--metric-transmitted:color(display-p3 .875 .737 .447);--metric-dropped:color(display-p3 .882 .15 .447);--log-info:color(display-p3 .435 .737 .741);--log-warning:color(display-p3 .875 .737 .447);--log-error:color(display-p3 .882 .15 .447);--log-critical:color(display-p3 .745 .459 .447);--map-hub-color:color(display-p3 .65 .5 .85);--map-local-color:color(display-p3 1 .8 .1);--map-neighbor-color:color(display-p3 1 .8 .1);--map-mobile-color:color(display-p3 1 .5 .1);--map-room-color:color(display-p3 1 .45 .65);--link-strong:color(display-p3 .443 .596 .447);--link-medium:color(display-p3 .875 .737 .447);--link-weak:color(display-p3 .745 .459 .447);--hop-0:color(display-p3 .435 .737 .741);--hop-1:color(display-p3 .443 .596 .447);--hop-2:color(display-p3 .596 .737 .6);--hop-3:color(display-p3 .875 .737 .447);--hop-hub:color(display-p3 .984 .749 .141);--palette-red:color(display-p3 .745 .459 .447);--palette-red-bright:color(display-p3 .882 .15 .447);--palette-orange:color(display-p3 .851 .467 .259);--palette-orange-bright:color(display-p3 .961 .62 .043);--palette-yellow:color(display-p3 .741 .733 .447);--palette-yellow-bright:color(display-p3 .875 .737 .447);--palette-green:color(display-p3 .443 .596 .447);--palette-green-bright:color(display-p3 .596 .737 .6);--palette-aqua:color(display-p3 .435 .737 .741);--palette-aqua-bright:color(display-p3 .439 .741 .875);--palette-blue:color(display-p3 0 .455 .745);--palette-blue-bright:color(display-p3 .443 .612 .875);--palette-purple:color(display-p3 .545 .482 .678);--palette-purple-bright:color(display-p3 .6 .604 .741);--map-edge-hover-direct:color(display-p3 .2 .9 .92);--map-edge-hover-loop:color(display-p3 .7 .5 .92);--map-edge-hover-neighbor:color(display-p3 1 .8 0);--map-edge-highlight:color(display-p3 1 .9 0)}}a,button,[role=button],.interactive,.surface-base,.glass-card,.data-card,.chart-container,.pill-tag,.pill-subtle,.toggle-group-item,.roster-row,.nav-item{transition:all .15s ease-out}a:hover,button:hover,[role=button]:hover,.interactive:hover,.surface-base:hover,.glass-card:hover,.data-card:hover,.chart-container:hover,.pill-tag:hover,.pill-subtle:hover,.toggle-group-item:hover,.roster-row:hover,.nav-item:hover{transition-duration:0s}a,button,[role=button],input,select,textarea{touch-action:manipulation;-webkit-tap-highlight-color:transparent}a,button{cursor:pointer}.truncate[title],.line-clamp-1[title],.line-clamp-2[title],.text-ellipsis[title]{cursor:help;position:relative}.truncate[title]:hover:after,.line-clamp-1[title]:hover:after,.line-clamp-2[title]:hover:after,.text-ellipsis[title]:hover:after{content:attr(title);z-index:9999;background:var(--bg-elevated);border:1px solid var(--border-subtle);width:max-content;max-width:300px;font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);color:var(--text-primary);white-space:normal;word-break:break-all;pointer-events:none;border-radius:6px;margin-top:4px;padding:6px 10px;line-height:1.4;animation:.15s ease-out tooltip-fade-in;position:absolute;top:100%;left:0;box-shadow:0 4px 12px #0000004d}@keyframes tooltip-fade-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.type-hero{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-5xl);font-weight:var(--font-semibold);letter-spacing:var(--tracking-tight);color:var(--text-primary);line-height:1.05}.type-metric{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-4xl);font-weight:var(--font-semibold);letter-spacing:var(--tracking-tight);color:var(--text-primary);line-height:1.1}.type-title{font-family:var(--font-title),system-ui,sans-serif;font-size:var(--text-2xl);font-weight:var(--font-semibold);line-height:var(--leading-snug);letter-spacing:var(--tracking-tight);color:var(--text-primary)}.type-heading{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-lg);font-weight:var(--font-semibold);line-height:var(--leading-snug);color:var(--text-primary)}.type-subheading{font-family:var(--font-card-title,var(--font-display)),system-ui,sans-serif;font-size:var(--text-card-title,var(--text-lg));font-weight:var(--font-card-title-weight,var(--font-semibold));line-height:var(--leading-snug);color:var(--text-primary)}.type-body{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-base);font-weight:var(--font-normal);line-height:var(--leading-normal);color:var(--text-secondary)}.type-body-lg{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-md);font-weight:var(--font-normal);line-height:var(--leading-normal);color:var(--text-secondary)}.type-body-sm,.type-label{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-sm);font-weight:var(--font-medium);line-height:var(--leading-normal);color:var(--text-secondary)}.type-micro{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-xs);font-weight:var(--font-medium);line-height:var(--leading-normal);letter-spacing:.12em;text-transform:uppercase;color:var(--text-secondary)}.type-data{font-family:var(--font-data);font-size:var(--text-base);font-weight:var(--font-normal);line-height:var(--leading-normal);letter-spacing:var(--tracking-wide);font-feature-settings:"zero","tnum"}.type-data-lg{font-family:var(--font-data);font-size:var(--text-lg);font-weight:var(--font-medium);line-height:var(--leading-snug);letter-spacing:var(--tracking-normal);font-feature-settings:"zero","tnum"}.type-data-xl{font-family:var(--font-data);font-size:var(--text-xl);font-weight:var(--font-semibold);line-height:var(--leading-snug);letter-spacing:-.01em;font-feature-settings:"zero","tnum"}.type-data-hero{font-family:var(--font-data);font-size:var(--text-2xl);font-weight:var(--font-semibold);letter-spacing:-.03em;font-feature-settings:"zero","tnum";line-height:1.1}@media(min-width:640px){.type-data-hero{font-size:var(--text-3xl)}}:root{--punc-margin-comma:-.15em;--punc-margin-period:-.12em;--punc-margin-colon:-.08em;--punc-margin-slash:-.06em;--punc-margin-mult:-.1em}.data-tight{display:inline}.data-tight .punc,.punc-tight{margin-right:var(--punc-margin-comma);margin-left:-.05em;display:inline-block}.data-tight .punc-period,.punc-period{margin-right:var(--punc-margin-period);margin-left:-.03em}.data-tight .punc-colon,.punc-colon{margin-right:var(--punc-margin-colon);margin-left:var(--punc-margin-colon)}.data-tight .punc-slash,.punc-slash{margin-right:var(--punc-margin-slash);margin-left:var(--punc-margin-slash)}.data-tight .punc-mult,.punc-mult{margin-right:var(--punc-margin-mult);margin-left:0;display:inline-block}.type-data-sm{font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);line-height:var(--leading-normal);letter-spacing:var(--tracking-wider);font-feature-settings:"zero","tnum"}.type-data-xs{font-family:var(--font-data);font-size:var(--text-xs);font-weight:var(--font-medium);line-height:var(--leading-normal);letter-spacing:var(--tracking-widest);font-feature-settings:"zero","tnum"}.type-code{font-family:var(--font-data);font-size:.875em;font-weight:var(--font-normal);line-height:var(--leading-relaxed);font-feature-settings:"zero","tnum"}.type-badge{font-family:var(--font-data);font-size:var(--text-xs);font-weight:var(--font-medium);letter-spacing:.08em;text-transform:uppercase;line-height:1}.type-tag{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-xs);font-weight:var(--font-medium);letter-spacing:.05em;line-height:1}.font-mono{font-feature-settings:"zero";font-family:var(--font-data)!important}.font-title{font-family:var(--font-title),system-ui,sans-serif!important}.font-display{font-family:var(--font-display),system-ui,sans-serif!important}.tabular-nums{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}.pb-safe{padding-bottom:env(safe-area-inset-bottom,0)}.pt-safe{padding-top:env(safe-area-inset-top,0)}.pl-safe{padding-left:env(safe-area-inset-left,0)}.pr-safe{padding-right:env(safe-area-inset-right,0)}.p-safe{padding-top:env(safe-area-inset-top,0);padding-right:env(safe-area-inset-right,0);padding-bottom:env(safe-area-inset-bottom,0);padding-left:env(safe-area-inset-left,0)}@keyframes shimmer{0%{opacity:.5;transform:translate(-100%)}50%{opacity:1}to{opacity:.5;transform:translate(100%)}}:root{--duration-instant:75ms;--duration-fast:.15s;--duration-normal:.2s;--duration-slow:.3s;--duration-slower:.5s;--ease-linear:linear;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--ease-bounce:cubic-bezier(.34,1.56,.64,1);--ease-spring:cubic-bezier(.175,.885,.32,1.275);--hover-scale-subtle:1.02;--hover-scale-pop:1.05;--hover-lift-y:-2px;--hover-lift-shadow:0 4px 12px #00000026;--active-scale:.98;--active-opacity:.9;--active-y:1px;--disabled-opacity:.4;--loading-opacity:.6}.interactive{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out);cursor:pointer}.interactive-fast{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter;transition-duration:var(--duration-instant);transition-timing-function:var(--ease-out);cursor:pointer}.interactive-slow{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter;transition-duration:var(--duration-normal);transition-timing-function:var(--ease-in-out);cursor:pointer}.hover-bg:hover{background-color:var(--subtle-fill-hover)}.hover-bg-strong:hover{background-color:var(--subtle-fill-strong)}.hover-lift:hover{transform:translateY(var(--hover-lift-y));box-shadow:var(--hover-lift-shadow)}.hover-scale:hover{transform:scale(var(--hover-scale-subtle))}.hover-pop:hover{transform:scale(var(--hover-scale-pop))}.hover-bright:hover{filter:brightness(1.1)}.hover-dim:hover{filter:brightness(.95)}.hover-opacity:hover{opacity:.8}.hover-border:hover{border-color:var(--border-strong)}.hover-text:hover{color:var(--text-primary)}.row-hover{transition-property:background-color,border-color,color;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.row-hover:hover{background-color:var(--subtle-fill-hover)}.card-hover{transition-property:transform,box-shadow,border-color;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.card-hover:hover{transform:translateY(var(--hover-lift-y));box-shadow:var(--surface-shadow-md)}.btn-hover{transition-property:background-color,border-color,color,transform;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.btn-hover:hover{background-color:var(--subtle-fill-hover)}.icon-hover{transition-property:transform,filter,opacity;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.icon-hover:hover{transform:scale(var(--hover-scale-subtle));filter:brightness(1.15)}.active-press:active{transform:scale(var(--active-scale))}.active-depress:active{transform:translateY(var(--active-y))}.active-dim:active{opacity:var(--active-opacity)}.active-full:active{transform:scale(var(--active-scale));opacity:var(--active-opacity)}.state-disabled,.disabled{pointer-events:none;opacity:var(--disabled-opacity);cursor:not-allowed}.state-loading,.loading{pointer-events:none;opacity:var(--loading-opacity);cursor:wait}.loading-pulse{pointer-events:none;animation:pulse 1.5s var(--ease-in-out)infinite}@keyframes pulse{50%{opacity:.5}}.transition-base{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.transition-transform{transition-property:transform;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-in-out)}.transition-opacity{transition-property:opacity;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.transition-shadow{transition-property:box-shadow;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}:root{--radius-xs:4px;--radius-sm:6px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:20px;--radius-3xl:24px;--surface-opacity-base:80%;--surface-opacity-elevated:85%;--surface-opacity-solid:95%;--surface-blur-sm:8px;--surface-blur-md:16px;--surface-blur-lg:24px;--surface-ring:inset 0 0 0 1px #ffffff1a;--surface-ring-strong:inset 0 0 0 1px #ffffff26;--surface-shadow-sm:0 4px 6px -4px #0000001a;--surface-shadow-md:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--surface-shadow-lg:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--surface-shadow-xl:0 25px 50px -12px #00000040;--surface-tint-subtle:#ffffff08;--surface-tint-light:#ffffff0d;--surface-border-subtle:#ffffff0d;--stroke-none:0px;--stroke-thin:1px;--stroke-medium:1.5px;--stroke-thick:2px;--ring-width-default:2px;--ring-width-thick:3px;--ring-offset:2px;--ring-color:var(--accent-primary);--ring-color-error:var(--accent-danger)}.surface-base{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-base{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.surface-base{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));box-shadow:var(--surface-ring)}.surface-elevated{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-elevated{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-elevated),transparent)}}.surface-elevated{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));box-shadow:var(--surface-ring),var(--surface-shadow-lg)}.surface-modal{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-modal{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.surface-modal{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));box-shadow:var(--surface-ring),var(--surface-shadow-xl)}.surface-sidebar{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-sidebar{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.surface-sidebar{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));border-right:1px solid var(--border-subtle)}.surface-header{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.surface-header{background-color:color-mix(in srgb,var(--bg-body)70%,transparent)}}.surface-header{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border-bottom:1px solid var(--border-subtle)}.surface-header[data-variant=dark]{-webkit-backdrop-filter:blur(var(--surface-blur-sm));backdrop-filter:blur(var(--surface-blur-sm));border-bottom-color:var(--border-subtle);background-color:#000c}@supports (color:color-mix(in lab,red,red)){.surface-header[data-variant=dark]{border-bottom-color:color-mix(in srgb,var(--border-subtle)50%,transparent)}}.surface-inner{background-color:var(--surface-tint-subtle);border:1px solid var(--surface-border-subtle);border-radius:var(--radius-md);box-shadow:inset 0 1px 2px #0000000d}.surface-badge{background-color:var(--surface-tint-light);box-shadow:var(--surface-ring)}.surface-control{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.surface-control{background-color:color-mix(in srgb,var(--bg-elevated)92%,transparent)}}.surface-control{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));border:1px solid var(--border-subtle);box-shadow:var(--surface-shadow-md)}.surface-input{background-color:var(--surface-tint-light);box-shadow:var(--surface-ring);transition:box-shadow .15s}.surface-input:focus{box-shadow:inset 0 0 0 2px var(--accent-primary)}.surface-checkbox{background-color:var(--surface-tint-light);border:1px solid #ffffff1a;transition:background-color .15s,border-color .15s}.surface-checkbox:checked{background-color:var(--accent-primary);border-color:var(--accent-primary)}.surface-reflex{box-shadow:var(--surface-ring),inset 1.5px 2.5px 0 -1.5px #ffffff40,inset -1.5px -1.5px 0 -1.5px #fff3,inset -2px -6px 1px -4px #ffffff26,inset 0 2px 3px -1.5px #0000001f,inset -.25px -1px 3px #00000014;position:relative;overflow:hidden}.surface-reflex:before{content:"";pointer-events:none;border-radius:inherit;background:linear-gradient(#ffffff0f,#0000 30px),linear-gradient(0deg,#0000000a,#0000 40px);position:absolute;top:0;right:0;bottom:0;left:0}.surface-themed[data-theme=terminal]{background-color:var(--terminal-bg)}.surface-themed[data-theme=terminal-input]{background-color:var(--terminal-bg-input);border-top:1px solid var(--terminal-border)}.surface-themed[data-theme=terminal-status]{background-color:var(--terminal-bg-status);border-top:1px solid var(--terminal-border)}.surface-themed[data-theme=terminal-autocomplete]{background-color:var(--terminal-autocomplete-bg);-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border:1px solid var(--terminal-autocomplete-border);box-shadow:var(--surface-shadow-xl),var(--surface-shadow-lg)}.surface-divider-bottom{border-bottom:1px solid var(--border-subtle)}.surface-divider-top{border-top:1px solid var(--border-subtle)}.surface-divider[data-theme=terminal]{border-color:var(--terminal-border)}.surface-header-mobile{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.surface-header-mobile{background-color:color-mix(in srgb,var(--bg-body)70%,transparent)}}.surface-header-mobile{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border-bottom:1px solid var(--border-subtle)}.surface-appbar{-webkit-backdrop-filter:blur(var(--surface-blur-sm));backdrop-filter:blur(var(--surface-blur-sm));border-bottom:1px solid var(--border-subtle);background-color:#000c}@supports (color:color-mix(in lab,red,red)){.surface-appbar{border-bottom:1px solid color-mix(in srgb,var(--border-subtle)50%,transparent)}}.surface-terminal{background-color:var(--terminal-bg)}.surface-terminal-input{background-color:var(--terminal-bg-input);border-top:1px solid var(--terminal-border)}.surface-terminal-status{background-color:var(--terminal-bg-status);border-top:1px solid var(--terminal-border)}.surface-terminal-autocomplete{background-color:var(--terminal-autocomplete-bg);-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border:1px solid var(--terminal-autocomplete-border);box-shadow:var(--surface-shadow-xl),var(--surface-shadow-lg)}.surface-terminal-autocomplete-item{border-bottom:1px solid var(--terminal-border)}.surface-terminal-autocomplete-footer{background-color:var(--terminal-autocomplete-hover);border-top:1px solid var(--terminal-border)}.card-reflex{box-shadow:var(--surface-ring),inset 1.5px 2.5px 0 -1.5px #ffffff40,inset -1.5px -1.5px 0 -1.5px #fff3,inset -2px -6px 1px -4px #ffffff26,inset 0 2px 3px -1.5px #0000001f,inset -.25px -1px 3px #00000014;position:relative;overflow:hidden}.card-reflex:before{content:"";pointer-events:none;border-radius:inherit;background:linear-gradient(#ffffff0f,#0000 30px),linear-gradient(0deg,#0000000a,#0000 40px);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-card{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.glass-card{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));box-shadow:var(--surface-ring);border-radius:var(--radius-xl)}.glass-card-elevated{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-card-elevated{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-elevated),transparent)}}.glass-card-elevated{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));box-shadow:var(--surface-ring),var(--surface-shadow-lg);border-radius:var(--radius-xl)}.glass-card-glow{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-card-glow{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.glass-card-glow{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));box-shadow:var(--surface-ring);border-radius:var(--radius-xl)}.glass-sidebar{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-sidebar{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.glass-sidebar{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));border-right:1px solid var(--border-subtle)}.glass-card-inner{background-color:var(--surface-tint-subtle);border:1px solid var(--surface-border-subtle);border-radius:var(--radius-md);box-shadow:inset 0 1px 2px #0000000d}.radius-card{border-radius:var(--radius-xl)}.radius-inset{border-radius:var(--radius-lg)}.radius-inner{border-radius:var(--radius-md)}.radius-control{border-radius:var(--radius-sm)}.radius-badge{border-radius:var(--radius-xs)}.radius-hero{border-radius:var(--radius-2xl)}.radius-none{border-radius:0}.radius-pill{border-radius:9999px}.border-card,.border-control{border:var(--stroke-thin)solid var(--border-subtle)}.border-emphasis{border:var(--stroke-medium)solid var(--border-strong)}.ring-focus:focus-visible{outline:var(--ring-width-default)solid var(--ring-color);outline-offset:var(--ring-offset)}.ring-focus-inset:focus-visible{box-shadow:inset 0 0 0 var(--ring-width-default) var(--ring-color);outline:none}.ring-focus-error:focus-visible{outline:var(--ring-width-default)solid var(--ring-color-error);outline-offset:var(--ring-offset)}.divider-bottom{border-bottom:var(--stroke-thin)solid var(--border-subtle)}.divider-top{border-top:var(--stroke-thin)solid var(--border-subtle)}.divider-right{border-right:var(--stroke-thin)solid var(--border-subtle)}.divider-left{border-left:var(--stroke-thin)solid var(--border-subtle)}.liquid-glass{background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.liquid-glass{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.liquid-glass{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.liquid-glass{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.liquid-glass:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.liquid-glass-elevated{background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.liquid-glass-elevated{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity-elevated),transparent)}}.liquid-glass-elevated{-webkit-backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 2px 1px 0 -1px var(--glass-light),inset -1.5px -1px 0 -1px var(--glass-light),inset -2px -6px 1px -5px var(--glass-light),inset -1px 2px 3px -1px var(--glass-dark),inset 0 -4px 1px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.liquid-glass-elevated{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 2px 1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -1.5px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -2px -6px 1px -5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -1px 2px 3px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 -4px 1px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.liquid-glass-elevated:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.liquid-glass-glow{background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.liquid-glass-glow{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.liquid-glass-glow{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--accent-primary),inset 1.8px 3px 0 -2px var(--accent-primary),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.liquid-glass-glow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.liquid-glass-glow:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.liquid-glass-sm{border-radius:var(--radius-md)}.liquid-glass-md{border-radius:var(--radius-lg)}.liquid-glass-lg{border-radius:var(--radius-xl)}.liquid-glass-xl{border-radius:var(--radius-2xl)}.liquid-glass-pill{border-radius:9999px}.liquid-glass-none{border-radius:0}.glass-card{border-radius:var(--radius-xl);background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-card{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.glass-card{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.glass-card:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card-stroke,.stroke-only .glass-card,.stroke-only .glass-card-glow,.stroke-only .glass-card-elevated{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:var(--glass-stroke-width,1px)solid var(--glass-stroke-color,#e0e0e0)!important;box-shadow:none!important;background-color:#0000!important}.glass-card-stroke:before,.stroke-only .glass-card:before,.stroke-only .glass-card-glow:before,.stroke-only .glass-card-elevated:before{display:none!important}.stroke-only .glass-sidebar{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-right:var(--glass-stroke-width,1px)solid var(--glass-stroke-color,#e0e0e0)!important;box-shadow:none!important;background-color:#0000!important}.stroke-only .glass-sidebar:before{display:none!important}.glass-card-ribbon,.ribbon-mode .glass-card,.ribbon-mode .glass-card-glow,.ribbon-mode .glass-card-elevated{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-bottom:var(--glass-ribbon-border-width,8px)solid var(--glass-ribbon-border-color,#2d2d2d)!important;box-shadow:none!important;background-color:#0000!important;border-radius:0!important}.glass-card-ribbon:before,.ribbon-mode .glass-card:before,.ribbon-mode .glass-card-glow:before,.ribbon-mode .glass-card-elevated:before{display:none!important}.ribbon-mode .glass-sidebar{background-color:var(--sidebar-bg,transparent)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-right:var(--glass-ribbon-border-width,2px)solid var(--glass-ribbon-border-color,#7a7a7a)!important;box-shadow:none!important;border-radius:0!important}.ribbon-mode .glass-sidebar:before{display:none!important}.ribbon-mode .glass-sidebar nav a[class*=bg-accent-primary]{background-color:var(--sidebar-nav-active-bg)!important;color:var(--sidebar-nav-active-text)!important}.ribbon-mode .glass-sidebar nav a[class*=text-accent-primary],.ribbon-mode .glass-sidebar nav a[class*=bg-accent-primary] svg,.ribbon-mode .glass-sidebar nav a[class*=text-accent-primary] svg{color:var(--sidebar-nav-active-text)!important}.ribbon-mode .glass-sidebar nav a:hover{background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .data-card,.ribbon-mode .chart-container{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-bottom:var(--glass-ribbon-border-width,4px)solid var(--glass-ribbon-border-color,#2d2d2d)!important;box-shadow:none!important;background-color:#0000!important;border-radius:0!important}.ribbon-mode .data-card:before,.ribbon-mode .chart-container:before{display:none!important}.ribbon-mode .mini-widget{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-bottom:var(--glass-ribbon-border-width,4px)solid var(--glass-ribbon-border-color,#2d2d2d)!important;box-shadow:none!important;background-color:#0000!important;border-radius:0!important}.ribbon-mode .mini-widget:before{display:none!important}.ribbon-mode .toggle-group{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:2px solid var(--glass-ribbon-border-color,#7a7a7a)!important;box-shadow:none!important;background-color:#0000!important}.ribbon-mode .toggle-group:before{display:none!important}.ribbon-mode .toggle-group-item:hover:not(.active){background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .toggle-group-item.active{background-color:var(--accent-primary)!important;color:var(--text-invert)!important;box-shadow:none!important;border:none!important}.ribbon-mode .segmented-toggle{border:none!important}.ribbon-mode .segmented-toggle-item:hover:not(.active){background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .segmented-toggle-item.active{background-color:var(--accent-primary)!important;color:var(--text-invert)!important;box-shadow:none!important;border:none!important}.ribbon-mode .map-control-glass,.ribbon-mode .map-controls-container,.ribbon-mode .maplibregl-ctrl-group{background-color:var(--bg-body)!important;border-radius:.5rem!important;box-shadow:0 1px 3px #0000001f,0 4px 12px #00000014!important}.ribbon-mode .map-control-glass:after,.ribbon-mode .map-control-glass-active:after,.ribbon-mode .maplibregl-ctrl-group:after{display:none!important}.ribbon-mode .map-control-btn:hover{background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .map-control-active-amber,.ribbon-mode .map-control-active-sky,.ribbon-mode .map-control-active-teal{background-color:var(--accent-primary)!important}.ribbon-mode .map-control-active-amber .map-control-icon,.ribbon-mode .map-control-active-sky .map-control-icon,.ribbon-mode .map-control-active-teal .map-control-icon{color:var(--text-invert)!important}.ribbon-mode .glass-card-elevated{background-color:var(--bg-body)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:var(--glass-ribbon-border-width,2px)solid var(--glass-ribbon-border-color,#7a7a7a)!important;box-shadow:none!important}.ribbon-mode .glass-card-elevated:before{display:none!important}.ribbon-mode .type-title{font-size:var(--text-2xl);letter-spacing:-.05em;line-height:1.1}@media(min-width:640px){.ribbon-mode .type-title{font-size:var(--text-3xl)}}.ribbon-mode .type-subheading{font-size:var(--text-xl);letter-spacing:-.03em}.ribbon-mode .map-container-16-9>div{box-shadow:0 2px 6px #0000001a,0 8px 24px #00000014}.ribbon-mode .map-container-fullscreen>div{box-shadow:none}.glass-card-glow{border-radius:var(--radius-xl);background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-card-glow{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.glass-card-glow{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--accent-primary),inset 1.8px 3px 0 -2px var(--accent-primary),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card-glow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.glass-card-glow:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card-elevated{border-radius:var(--radius-xl);background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-card-elevated{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity-elevated),transparent)}}.glass-card-elevated{-webkit-backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 2px 1px 0 -1px var(--glass-light),inset -1.5px -1px 0 -1px var(--glass-light),inset -2px -6px 1px -5px var(--glass-light),inset -1px 2px 3px -1px var(--glass-dark),inset 0 -4px 1px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card-elevated{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 2px 1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -1.5px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -2px -6px 1px -5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -1px 2px 3px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 -4px 1px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.glass-card-elevated:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-sidebar{background-color:var(--glass-tint);border:none;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-sidebar{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.glass-sidebar{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset -1px 0 0 0 var(--glass-light),inset 1px 0 0 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-sidebar{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset -1px 0 color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*8%),transparent),inset 1px 0 color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent)}}.glass-sidebar:before{content:"";pointer-events:none;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card-inner{background-color:var(--glass-tint)}@supports (color:color-mix(in lab,red,red)){.glass-card-inner{background-color:color-mix(in srgb,var(--glass-tint)8%,transparent)}}.glass-card-inner{border:1px solid var(--glass-light)}@supports (color:color-mix(in lab,red,red)){.glass-card-inner{border:1px solid color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*5%),transparent)}}.glass-card-inner{border-radius:var(--radius-md);box-shadow:inset 0 1px 2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card-inner{box-shadow:inset 0 1px 2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*5%),transparent)}}.glass-thumbnail{border-radius:var(--radius-sm);border:none;position:relative;overflow:hidden}.glass-thumbnail:after{content:"";z-index:10;pointer-events:none;border-radius:inherit;box-shadow:inset 0 0 0 .5px var(--glass-light),inset .9px 1.5px 0 -1px var(--glass-light),inset -1px -1px 0 -1px var(--glass-light),inset -1.5px -4px .5px -3px var(--glass-light),inset -.15px -.5px 2px 0 var(--glass-dark),inset -.75px 1.25px 0 -1px var(--glass-dark),inset 0 1.5px 2px -1px var(--glass-dark);position:absolute;top:0;right:0;bottom:0;left:0}@supports (color:color-mix(in lab,red,red)){.glass-thumbnail:after{box-shadow:inset 0 0 0 .5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*16%),transparent),inset .9px 1.5px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*140%),transparent),inset -1px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*125%),transparent),inset -1.5px -4px .5px -3px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*94%),transparent),inset -.15px -.5px 2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*18%),transparent),inset -.75px 1.25px 0 -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent),inset 0 1.5px 2px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent)}}.glass-thumbnail-selected:after{box-shadow:inset 0 0 0 1.5px var(--accent-primary),inset .9px 1.5px 0 -1px var(--glass-light),inset -1px -1px 0 -1px var(--glass-light),inset -1.5px -4px .5px -3px var(--glass-light),inset -.15px -.5px 2px 0 var(--glass-dark),inset -.75px 1.25px 0 -1px var(--glass-dark),inset 0 1.5px 2px -1px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-thumbnail-selected:after{box-shadow:inset 0 0 0 1.5px var(--accent-primary),inset .9px 1.5px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*140%),transparent),inset -1px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*125%),transparent),inset -1.5px -4px .5px -3px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*94%),transparent),inset -.15px -.5px 2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*18%),transparent),inset -.75px 1.25px 0 -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent),inset 0 1.5px 2px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent)}}.glass-card-frame{z-index:1000;box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark);border-radius:1.125rem;position:relative}@supports (color:color-mix(in lab,red,red)){.glass-card-frame{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*15%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*25%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*25%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*15%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent)}}.glass-card-frame:before{content:"";pointer-events:none;border-radius:inherit;z-index:1001;background:var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.separator-line{background:linear-gradient(to right,transparent,var(--glass-light)20%,var(--glass-light)80%,transparent);height:1px}@supports (color:color-mix(in lab,red,red)){.separator-line{background:linear-gradient(to right,transparent,color-mix(in srgb,var(--glass-light)8%,transparent)20%,color-mix(in srgb,var(--glass-light)8%,transparent)80%,transparent)}}.separator-line-vertical{background:linear-gradient(to bottom,transparent,var(--glass-light)20%,var(--glass-light)80%,transparent);width:1px}@supports (color:color-mix(in lab,red,red)){.separator-line-vertical{background:linear-gradient(to bottom,transparent,color-mix(in srgb,var(--glass-light)8%,transparent)20%,color-mix(in srgb,var(--glass-light)8%,transparent)80%,transparent)}}.rounded-pill{border-radius:9999px}.rounded-card{border-radius:var(--radius-xl)}.catalyst-mode .glass-card,.catalyst-mode .glass-card-glow,.catalyst-mode .glass-card-elevated{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 2px #0000000d!important;border:none!important}.catalyst-mode .glass-card:before,.catalyst-mode .glass-card-glow:before,.catalyst-mode .glass-card-elevated:before{display:none!important}.catalyst-mode .glass-card-elevated{background-color:var(--bg-elevated)!important}.catalyst-mode .glass-sidebar{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-right:1px solid var(--border-subtle)!important;box-shadow:none!important}.catalyst-mode .glass-sidebar:before{display:none!important}.catalyst-mode .glass-card-inner{background-color:var(--bg-subtle)!important;border:1px solid var(--border-subtle)!important;border-radius:var(--radius-md)!important;box-shadow:none!important}.catalyst-mode .mini-widget{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.catalyst-mode .mini-widget:before{display:none!important}.catalyst-mode .toggle-group{background-color:var(--bg-subtle)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-md)!important;box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.catalyst-mode .toggle-group:before{display:none!important}.catalyst-mode .glass-card-frame{border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.catalyst-mode .glass-card-frame:before{display:none!important}.catalyst-mode .map-control-glass,.catalyst-mode .map-controls-container,.catalyst-mode .maplibregl-ctrl-group{background-color:var(--bg-surface)!important;border-radius:var(--radius-md)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 3px #0000001a!important}.catalyst-mode .map-control-glass:after,.catalyst-mode .maplibregl-ctrl-group:after{display:none!important}.catalyst-mode .glass-thumbnail:after{box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.sidebar-panel{background-color:var(--glass-tint);border:none;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.sidebar-panel{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.sidebar-panel{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset -1px 0 0 0 var(--glass-light),inset 1px 0 0 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.sidebar-panel{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset -1px 0 color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*8%),transparent),inset 1px 0 color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent)}}.sidebar-panel:before{content:"";pointer-events:none;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.catalyst-mode .sidebar-panel{background-color:var(--bg-body)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;box-shadow:none!important;border:none!important}.catalyst-mode .sidebar-panel:before{display:none!important}.catalyst-mode [data-slot=section] a,.catalyst-mode [data-slot=section] button{border-radius:var(--radius-lg)!important}.catalyst-mode [data-slot=section] a:hover,.catalyst-mode [data-slot=section] button:hover{background-color:var(--bg-surface)!important}.catalyst-mode [data-slot=section] a[data-current=true],.catalyst-mode [data-slot=section] button[data-current=true]{background-color:var(--bg-surface)!important;color:var(--text-primary)!important}.catalyst-mode [data-slot=section] a[data-current=true] svg,.catalyst-mode [data-slot=section] button[data-current=true] svg{color:var(--text-primary)!important}.catalyst-mode [data-slot=section] .absolute.bg-accent-primary{display:none!important}.mobile-header{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.mobile-header{background-color:color-mix(in srgb,var(--bg-body)70%,transparent)}}.mobile-header{-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);border-bottom:1px solid var(--border-subtle)}.catalyst-mode .mobile-header{background-color:var(--bg-body)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important}.catalyst-mode .main-content{background-color:var(--bg-surface);box-shadow:inset 0 0 0 1px var(--border-subtle);border-radius:.75rem 0 0 .75rem;margin:.5rem 0}@media(max-width:1023px){.catalyst-mode .main-content{border-radius:0;margin:0}}.catalyst-mode .data-card{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 2px #0000000d!important;border:none!important}.catalyst-mode .data-card:before{display:none!important}.catalyst-mode .chart-container{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 2px #0000000d!important;border:none!important}.catalyst-mode .chart-container:before{display:none!important}.card-sm{min-height:7rem}.card-md{min-height:11rem}.card-lg{min-height:14rem}.card-hero{min-height:20rem}.card-auto{min-height:auto}@media(max-width:640px){.card-sm{min-height:6rem}.card-md{min-height:9rem}.card-lg{min-height:12rem}.card-hero{min-height:16rem}}.icon-sm{flex-shrink:0;width:1rem;height:1rem}.icon-md{flex-shrink:0;width:1.25rem;height:1.25rem}.icon-lg{flex-shrink:0;width:1.5rem;height:1.5rem}.icon-xl{flex-shrink:0;width:2rem;height:2rem}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--bg-surface)}::-webkit-scrollbar-thumb{background-color:var(--border-strong);border-radius:4px}::-webkit-scrollbar-thumb:hover{background-color:var(--text-muted)}.sidebar-scroll{scrollbar-width:thin;scrollbar-color:transparent transparent}.sidebar-scroll:hover{scrollbar-color:var(--border-subtle)transparent}.sidebar-scroll::-webkit-scrollbar{width:4px}.sidebar-scroll::-webkit-scrollbar-track{background:0 0}.sidebar-scroll::-webkit-scrollbar-thumb{background-color:#0000;border-radius:2px}.sidebar-scroll:hover::-webkit-scrollbar-thumb{background-color:var(--border-subtle)}.layout-container{width:100%;max-width:80rem;margin-left:auto;margin-right:auto}.grid-12{grid-template-columns:repeat(12,minmax(0,1fr));gap:1rem;display:grid}@media(min-width:768px){.grid-12{gap:1.5rem}}.col-span-6{grid-column:span 6/span 6}.col-span-4{grid-column:span 4/span 4}.col-span-3{grid-column:span 3/span 3}@media(min-width:640px){.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-3{grid-column:span 3/span 3}}@media(min-width:768px){.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-12{grid-column:span 12/span 12}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-12{grid-column:span 12/span 12}}@media(min-width:1280px){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-8{grid-column:span 8/span 8}}.gap-space-2{gap:.5rem}.gap-space-3{gap:.75rem}.gap-space-4{gap:1rem}.gap-space-6{gap:1.5rem}.gap-space-8{gap:2rem}.gap-y-space-4{row-gap:1rem}.gap-y-space-6{row-gap:1.5rem}.gap-y-space-8{row-gap:2rem}.gap-x-space-4{column-gap:1rem}.gap-x-space-6{column-gap:1.5rem}.gap-x-space-8{column-gap:2rem}.card-padding{padding:1rem}@media(min-width:640px){.card-padding{padding:1.25rem}}.card-padding-sm{padding:.75rem}@media(min-width:640px){.card-padding-sm{padding:1rem}}.card-padding-xs{padding:.5rem}@media(min-width:640px){.card-padding-xs{padding:.75rem}}.section-gap{flex-direction:column;gap:1.5rem;display:flex}@media(min-width:1024px){.section-gap{gap:2rem}}.bento-section{flex-direction:column;gap:1rem;display:flex}.stats-row-hero{grid-template-columns:repeat(2,1fr);gap:1rem;display:grid}@media(min-width:768px){.stats-row-hero{grid-template-columns:repeat(3,1fr);gap:1.5rem}}@media(min-width:1280px){.stats-row-hero{grid-template-columns:repeat(5,1fr)}}.stats-row-secondary{grid-template-columns:1fr;gap:1rem;display:grid}@media(min-width:640px){.stats-row-secondary{grid-template-columns:repeat(2,1fr)}}@media(min-width:1024px){.stats-row-secondary{grid-template-columns:repeat(4,1fr);gap:1.5rem}}.content-grid{grid-template-columns:1fr;gap:1rem;display:grid}@media(min-width:768px){.content-grid{gap:1.5rem}}@media(min-width:1280px){.content-grid{grid-template-columns:2fr 1fr}}.content-main,.content-sidebar{min-width:0}.bento-row{grid-template-columns:repeat(12,minmax(0,1fr));align-items:stretch;display:grid}.bento-row-hero{min-height:15rem}@media(min-width:768px){.bento-row-hero{min-height:17.5rem}}@media(min-width:1024px){.bento-row-hero{min-height:20rem}}.bento-row-hero-tall{height:20rem;min-height:20rem}@media(min-width:768px){.bento-row-hero-tall{height:23.3125rem;min-height:23.3125rem}}@media(min-width:1024px){.bento-row-hero-tall{height:26.625rem;min-height:26.625rem}}.bento-row-hero-auto{min-height:20rem}@media(min-width:768px){.bento-row-hero-auto{min-height:23.3125rem}}@media(min-width:1024px){.bento-row-hero-auto{min-height:26.625rem}}.bento-row-panel{grid-auto-rows:18.75rem}.bento-row-feature{grid-auto-rows:12.5rem}@media(min-width:768px){.bento-row-feature{grid-auto-rows:15rem}}@media(min-width:1024px){.bento-row-feature{grid-auto-rows:16.25rem}}.bento-row-standard{min-height:11.25rem}@media(min-width:768px){.bento-row-standard{min-height:12.5rem}}@media(min-width:1024px){.bento-row-standard{min-height:13.75rem}}.bento-row-compact{min-height:8.75rem}@media(min-width:768px){.bento-row-compact{min-height:10rem}}@media(min-width:1024px){.bento-row-compact{min-height:11.25rem}}.bento-row-widget{min-height:6.25rem}@media(min-width:768px){.bento-row-widget{min-height:6.875rem}}@media(min-width:1024px){.bento-row-widget{min-height:7.5rem}}.bento-row-auto{min-height:auto}.analyzer-chart-height{height:13rem}@media(min-width:768px){.analyzer-chart-height{height:17rem}}@media(min-width:1024px){.analyzer-chart-height{height:20rem}}.dashboard-chart-height{height:9rem}@media(min-width:640px){.dashboard-chart-height{height:11rem}}@media(min-width:1024px){.dashboard-chart-height{height:13.5rem}}.packet-byte-chart-height{height:17rem}.legend-item{cursor:pointer;border-radius:.25rem;align-items:center;gap:.25rem;padding:.25rem .375rem;font-size:.6875rem;line-height:1.2;transition:background-color .15s,opacity .15s;display:flex}.legend-item:hover{background-color:var(--hover-tint)}.legend-item-active{background-color:var(--bg-subtle);opacity:1}.legend-item-dimmed{opacity:.35}.legend-item-chart-active{background-color:var(--hover-tint);opacity:1}.legend-label{color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;max-width:5.5rem;overflow:hidden}.legend-value{font-family:var(--font-data);font-variant-numeric:tabular-nums;color:var(--text-secondary);flex-shrink:0;margin-left:auto;font-weight:600}.legend-value-live{color:var(--text-primary)}.bento-gap{gap:1rem}.bento-gap-sm{gap:.5rem}@media(min-width:640px){.bento-gap-sm{gap:.75rem}}@media(min-width:768px){.bento-gap-sm{gap:1rem}}.bento-gap-lg{gap:1rem}@media(min-width:640px){.bento-gap-lg{gap:1.25rem}}@media(min-width:768px){.bento-gap-lg{gap:1.5rem}}@media(min-width:1024px){.bento-gap-lg{gap:2rem}}.bento-cell{flex-direction:column;min-width:0;min-height:0;display:flex}.bento-cell>*{flex:auto;min-height:0}.bento-col-1{grid-column:span 1/span 1}.bento-col-2{grid-column:span 2/span 2}.bento-col-3{grid-column:span 3/span 3}.bento-col-4{grid-column:span 4/span 4}.bento-col-5{grid-column:span 5/span 5}.bento-col-6{grid-column:span 6/span 6}.bento-col-7{grid-column:span 7/span 7}.bento-col-8{grid-column:span 8/span 8}.bento-col-9{grid-column:span 9/span 9}.bento-col-10{grid-column:span 10/span 10}.bento-col-11{grid-column:span 11/span 11}.bento-col-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-auto{grid-column:auto}.bento-col-1-5{grid-column:span 2/span 2}@media(min-width:640px){.sm\:bento-col-1{grid-column:span 1/span 1}.sm\:bento-col-2{grid-column:span 2/span 2}.sm\:bento-col-3{grid-column:span 3/span 3}.sm\:bento-col-4{grid-column:span 4/span 4}.sm\:bento-col-5{grid-column:span 5/span 5}.sm\:bento-col-6{grid-column:span 6/span 6}.sm\:bento-col-7{grid-column:span 7/span 7}.sm\:bento-col-8{grid-column:span 8/span 8}.sm\:bento-col-9{grid-column:span 9/span 9}.sm\:bento-col-10{grid-column:span 10/span 10}.sm\:bento-col-11{grid-column:span 11/span 11}.sm\:bento-col-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:bento-col-1-5{grid-column:span 2/span 2}}@media(min-width:768px){.md\:bento-col-1{grid-column:span 1/span 1}.md\:bento-col-2{grid-column:span 2/span 2}.md\:bento-col-3{grid-column:span 3/span 3}.md\:bento-col-4{grid-column:span 4/span 4}.md\:bento-col-5{grid-column:span 5/span 5}.md\:bento-col-6{grid-column:span 6/span 6}.md\:bento-col-7{grid-column:span 7/span 7}.md\:bento-col-8{grid-column:span 8/span 8}.md\:bento-col-9{grid-column:span 9/span 9}.md\:bento-col-10{grid-column:span 10/span 10}.md\:bento-col-11{grid-column:span 11/span 11}.md\:bento-col-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:bento-col-1-5{grid-column:span 2/span 2}}@media(min-width:1024px){.lg\:bento-col-1{grid-column:span 1/span 1}.lg\:bento-col-2{grid-column:span 2/span 2}.lg\:bento-col-3{grid-column:span 3/span 3}.lg\:bento-col-4{grid-column:span 4/span 4}.lg\:bento-col-5{grid-column:span 5/span 5}.lg\:bento-col-6{grid-column:span 6/span 6}.lg\:bento-col-7{grid-column:span 7/span 7}.lg\:bento-col-8{grid-column:span 8/span 8}.lg\:bento-col-9{grid-column:span 9/span 9}.lg\:bento-col-10{grid-column:span 10/span 10}.lg\:bento-col-11{grid-column:span 11/span 11}.lg\:bento-col-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:bento-col-1-5{grid-column:span 2/span 2}}@media(min-width:1280px){.xl\:bento-col-1{grid-column:span 1/span 1}.xl\:bento-col-2{grid-column:span 2/span 2}.xl\:bento-col-3{grid-column:span 3/span 3}.xl\:bento-col-4{grid-column:span 4/span 4}.xl\:bento-col-5{grid-column:span 5/span 5}.xl\:bento-col-6{grid-column:span 6/span 6}.xl\:bento-col-7{grid-column:span 7/span 7}.xl\:bento-col-8{grid-column:span 8/span 8}.xl\:bento-col-9{grid-column:span 9/span 9}.xl\:bento-col-10{grid-column:span 10/span 10}.xl\:bento-col-11{grid-column:span 11/span 11}.xl\:bento-col-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:bento-col-1-5{grid-column:span 2/span 2}}.pill-filled{background:var(--accent-primary);color:var(--bg-body);border-radius:9999px;align-items:center;gap:.375rem;padding:.375rem .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:opacity .15s;display:inline-flex}.pill-filled:hover{opacity:.9}.pill-subtle{background:var(--bg-subtle);color:var(--text-secondary);border:1px solid var(--border-subtle);border-radius:9999px;align-items:center;gap:.375rem;padding:.375rem .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:all .15s;display:inline-flex}.pill-subtle:hover{background:var(--bg-elevated);color:var(--text-primary)}.pill-metric{text-transform:uppercase;letter-spacing:.05em;border-radius:9999px;align-items:center;gap:.25rem;padding:.25rem .5rem;font-size:.625rem;font-weight:600;line-height:1;display:inline-flex}.pill-metric-positive{background:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.pill-metric-positive{background:color-mix(in srgb,var(--accent-success)15%,transparent)}}.pill-metric-positive{color:var(--accent-success)}.pill-metric-negative{background:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.pill-metric-negative{background:color-mix(in srgb,var(--accent-danger)15%,transparent)}}.pill-metric-negative{color:var(--accent-danger)}.pill-metric-neutral{background:var(--overlay-soft);color:var(--text-secondary)}.pill-tag{background:var(--accent-primary);border-radius:9999px;align-items:center;padding:.125rem .5rem;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pill-tag{background:color-mix(in srgb,var(--accent-primary)10%,transparent)}}.pill-tag{color:var(--accent-primary);text-transform:uppercase;letter-spacing:.08em;font-size:.625rem;font-weight:600}.toggle-group{background-color:var(--glass-tint);border-radius:9999px;padding:.25rem;display:inline-flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.toggle-group{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.toggle-group{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.toggle-group{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent)}}.toggle-group:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.toggle-group-item{color:var(--text-muted);border-radius:9999px;padding:.375rem .75rem;font-size:.75rem;font-weight:500;transition:all .15s}.toggle-group-item:hover{color:var(--text-secondary)}.toggle-group-item.active{background-color:var(--glass-tint)}@supports (color:color-mix(in lab,red,red)){.toggle-group-item.active{background-color:color-mix(in srgb,var(--glass-tint)36%,transparent)}}.toggle-group-item.active{color:var(--accent-primary);box-shadow:inset 0 0 0 1px var(--glass-light),inset 2px 1px 0 -1px var(--glass-light),inset -1.5px -1px 0 -1px var(--glass-light),inset -2px -6px 1px -5px var(--glass-light),inset -1px 2px 3px -1px var(--glass-dark),inset 0 -4px 1px -2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.toggle-group-item.active{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 2px 1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -1.5px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -2px -6px 1px -5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -1px 2px 3px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 0 -4px 1px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*6%),transparent)}}.toggle-group-sm{padding:.1875rem}.toggle-group-sm .toggle-group-item{padding:.25rem .5rem;font-size:.6875rem}.toggle-group-micro{padding:.125rem}.toggle-group-micro .toggle-group-item{padding:.1875rem .375rem;font-size:.625rem}.data-card{border-radius:var(--radius-xl);contain:layout style;isolation:isolate;background-color:var(--glass-tint);border:none;flex-direction:column;height:100%;padding:.75rem;display:flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.data-card{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.data-card{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.data-card{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*6%),transparent)}}@media(min-width:640px){.data-card{padding:1rem}}.data-card:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.data-card-header{justify-content:space-between;align-items:center;margin-bottom:.75rem;display:flex}.data-card-title{text-transform:uppercase;letter-spacing:.1em;color:var(--text-muted);font-size:.6875rem;font-weight:600}.data-card-controls{align-items:center;gap:.5rem;display:flex}.data-card-value{color:var(--text-primary);font-variant-numeric:tabular-nums;font-size:2rem;font-weight:600;line-height:1.1}.data-card-secondary{color:var(--text-muted);margin-top:.25rem;font-size:.75rem}.chart-container{border-radius:var(--radius-xl);isolation:isolate;background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.chart-container{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.chart-container{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.chart-container{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*6%),transparent)}}.chart-container:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.chart-header{border-bottom:1px solid var(--border-subtle);justify-content:space-between;align-items:center;padding:1rem 1.25rem;display:flex}.chart-title{color:var(--text-primary);align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;display:flex}.chart-title-icon{width:1.125rem;height:1.125rem;color:var(--icon-card-title)}.chart-body{padding:1rem;position:relative}.chart-axis-label{color:var(--text-muted);font-variant-numeric:tabular-nums;font-size:.6875rem}.chart-gridline{stroke:var(--chart-grid);stroke-dasharray:4 4}.chart-glow-primary{filter:drop-shadow(0 0 6px var(--accent-primary))}.chart-glow-secondary{filter:drop-shadow(0 0 6px var(--accent-secondary))}.chart-glow-tertiary{filter:drop-shadow(0 0 6px var(--accent-tertiary))}.roster-list{flex-direction:column;display:flex}.roster-row{border-radius:var(--radius-lg);align-items:center;gap:.5rem;padding:.75rem .75rem .75rem .5rem;transition:background .15s;display:flex}@media(min-width:640px){.roster-row{gap:.75rem;padding:.75rem 1rem .75rem .75rem}}.roster-row:hover{background:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.roster-row:hover{background:color-mix(in srgb,var(--bg-subtle)80%,transparent)}}.roster-row-interactive{cursor:pointer}.roster-row-interactive:active{background:var(--bg-subtle)}.roster-row.selected{background:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.roster-row.selected{background:color-mix(in srgb,var(--accent-primary)8%,transparent)}}.roster-icon{border-radius:var(--radius-md);background-color:var(--glass-tint);flex-shrink:0;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex}@supports (color:color-mix(in lab,red,red)){.roster-icon{background-color:color-mix(in srgb,var(--glass-tint)10%,transparent)}}.roster-icon{box-shadow:inset 0 0 0 1px var(--glass-light),inset .5px 1px 0 0 var(--glass-light)}@supports (color:color-mix(in lab,red,red)){.roster-icon{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*5%),transparent),inset .5px 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*30%),transparent)}}.roster-icon-sm{border-radius:var(--radius-md);width:2rem;height:2rem}.roster-content{flex-direction:column;flex:1;gap:.125rem;min-width:0;display:flex}.roster-title{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:.875rem;font-weight:500;overflow:hidden}.roster-subtitle{color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;font-size:.75rem;overflow:hidden}.roster-metrics{color:var(--text-muted);align-items:center;gap:1rem;display:flex}.roster-metric{color:var(--text-secondary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.8125rem;font-weight:600}@media(max-width:639px){.roster-row{flex-wrap:wrap;gap:.375rem;padding:.5rem .5rem .5rem .375rem}.roster-icon{border-radius:var(--radius-sm);width:1.75rem;height:1.75rem}.roster-content{flex:1 1 0;min-width:0;overflow:hidden}.roster-title{font-size:.75rem}.roster-metrics{flex-wrap:wrap;order:3;gap:.5rem;width:100%;margin-top:.25rem;padding-left:2.25rem}.roster-metric{flex-shrink:0;margin-left:auto;font-size:.6875rem}}@media(min-width:640px)and (max-width:767px){.roster-row{gap:.5rem}.roster-icon{border-radius:var(--radius-md);width:2rem;height:2rem}.roster-metrics{gap:.75rem}}@media(min-width:768px)and (max-width:1023px){.roster-metrics{gap:.875rem}}@media(min-width:1024px){.roster-row{gap:.875rem}.roster-metrics{gap:1rem}}.contacts-grid-header,.contacts-grid-row{grid-template-columns:1fr;grid-template-areas:"node";align-items:center;gap:.75rem;display:grid}.contacts-grid-row{padding:.625rem .75rem;transition:background .15s}.contacts-grid-row:hover{background:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.contacts-grid-row:hover{background:color-mix(in srgb,var(--bg-subtle)80%,transparent)}}@media(max-width:639px){.contacts-grid-row{flex-wrap:nowrap;gap:.5rem;padding:.5rem .625rem;display:flex}.contacts-col-signal,.contacts-col-distance,.contacts-col-centrality,.contacts-col-activity{display:none}.contacts-col-node{flex:1 1 0;min-width:0}.contacts-col-seen,.contacts-col-actions{flex-shrink:0;align-self:center}}@media(min-width:640px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(200px,1fr) 100px 60px 68px;grid-template-areas:"node signal seen actions"}.contacts-col-node{grid-area:node}.contacts-col-signal{grid-area:signal;display:flex}.contacts-col-seen{grid-area:seen}.contacts-col-actions{grid-area:actions}.contacts-col-distance,.contacts-col-centrality,.contacts-col-activity{display:none}}@media(min-width:768px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(240px,1fr) 110px 80px 60px 68px;grid-template-areas:"node signal distance seen actions"}.contacts-col-distance{grid-area:distance;display:flex}}@media(min-width:1024px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(280px,1fr) 110px 80px 64px 64px 68px;grid-template-areas:"node signal distance centrality seen actions"}.contacts-col-centrality{grid-area:centrality;display:flex}}@media(min-width:1280px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(320px,1fr) 120px 80px 64px 64px 68px 68px;grid-template-areas:"node signal distance centrality activity seen actions"}.contacts-col-activity{grid-area:activity;display:flex}}.contacts-col-node{min-width:0}.contacts-col-signal,.contacts-col-distance,.contacts-col-centrality,.contacts-col-activity,.contacts-col-seen,.contacts-col-actions{white-space:nowrap;flex-shrink:0;overflow:hidden}.roster-separator{background:linear-gradient(to right,transparent,var(--border-subtle)20%,var(--border-subtle)80%,transparent);height:1px;margin:0 1rem}.roster-empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;padding:3rem 1.5rem;display:flex}.roster-empty-icon{width:3rem;height:3rem;color:var(--text-muted);opacity:.5;margin-bottom:1rem}.roster-empty-title{color:var(--text-secondary);margin-bottom:.25rem;font-size:.875rem;font-weight:500}.roster-empty-text{color:var(--text-muted);font-size:.75rem}.btn-skeuo{border-radius:var(--radius-md);cursor:pointer;background:var(--ctrl-base);border:1px solid var(--ctrl-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-shadow-dark),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-highlight),inset 0 -2px 0 var(--ctrl-inset);justify-content:center;align-items:center;gap:.5rem;padding:.75rem 1.25rem;font-size:.875rem;font-weight:600;transition:all .12s ease-out;display:inline-flex;position:relative}.btn-skeuo:hover{background:var(--ctrl-base-hover);border-color:var(--ctrl-border-hover);box-shadow:0 4px 0 var(--ctrl-shadow-dark),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-highlight),inset 0 -2px 0 var(--ctrl-inset)}.btn-skeuo:active{background:var(--ctrl-base-active);box-shadow:0 0 0 var(--ctrl-shadow-dark),0 1px 3px var(--ctrl-shadow-mid),inset 0 3px 6px var(--ctrl-shadow-mid),inset 0 1px 0 var(--ctrl-shadow-dark);transform:translateY(3px)}.btn-skeuo:disabled{opacity:.4;cursor:not-allowed;transform:none}.btn-skeuo-primary{background:var(--ctrl-primary);border-color:var(--ctrl-primary-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-primary-shadow),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-primary-highlight),inset 0 -2px 0 var(--ctrl-primary-inset)}.btn-skeuo-primary:hover{background:var(--ctrl-primary-hover);border-color:var(--ctrl-primary-highlight);box-shadow:0 4px 0 var(--ctrl-primary-shadow),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-primary-highlight),inset 0 -2px 0 var(--ctrl-primary-inset)}.btn-skeuo-success{background:var(--ctrl-success);border-color:var(--ctrl-success-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-success-shadow),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-success-highlight),inset 0 -2px 0 var(--ctrl-success-inset)}.btn-skeuo-success:hover{background:var(--ctrl-success-hover);border-color:var(--ctrl-success-highlight);box-shadow:0 4px 0 var(--ctrl-success-shadow),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-success-highlight),inset 0 -2px 0 var(--ctrl-success-inset)}.btn-skeuo-warning{background:var(--ctrl-warning);border-color:var(--ctrl-warning-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-warning-shadow),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-warning-highlight),inset 0 -2px 0 var(--ctrl-warning-inset)}.btn-skeuo-warning:hover{background:var(--ctrl-warning-hover);border-color:var(--ctrl-warning-highlight);box-shadow:0 4px 0 var(--ctrl-warning-shadow),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-warning-highlight),inset 0 -2px 0 var(--ctrl-warning-inset)}.btn-skeuo-neutral{background:var(--ctrl-base);border-color:var(--ctrl-border);color:var(--text-secondary);box-shadow:0 3px 0 var(--ctrl-shadow-dark),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-highlight),inset 0 -2px 0 var(--ctrl-inset)}.btn-skeuo-neutral:hover{background:var(--ctrl-base-hover);color:var(--text-primary);box-shadow:0 4px #18191d,0 8px 20px #08090b,0 3px 8px #0d0e12,inset 0 1px #5e5f6b,inset 0 -2px #26272e}.control-card{border-radius:var(--radius-lg);background-color:var(--glass-tint);padding:1rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.control-card{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.control-card{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.control-card{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent)}}.control-card:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.control-card-header{justify-content:space-between;align-items:center;margin-bottom:.75rem;display:flex}.control-card-label{color:var(--text-muted);font-size:.8125rem}.control-card-value{font-size:.8125rem;font-weight:600}.control-card-value-active{color:var(--accent-success)}.control-card-value-inactive{color:var(--text-muted)}.btn-skeuo-icon{stroke-width:2.5px;width:1.125rem;height:1.125rem}.mini-widget{border-radius:var(--radius-xl);contain:layout style;background-color:var(--glass-tint);flex-direction:column;gap:.25rem;padding:.75rem;display:flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.mini-widget{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.mini-widget{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.mini-widget{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.mini-widget:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.mini-widget:hover{box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.mini-widget:hover{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*100%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.mini-widget-header{align-items:center;gap:.375rem;min-height:1.25rem;display:flex}.mini-widget-icon{width:1rem;height:1rem;color:var(--icon-widget);flex-shrink:0}.mini-widget-title{font-family:Poppins,sans-serif;font-size:var(--text-xs);color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;text-overflow:ellipsis;font-weight:500;line-height:1.2;overflow:hidden}.mini-widget-value{font-family:var(--font-data);font-size:var(--text-xl);color:var(--text-primary);font-weight:600;line-height:1.1}.mini-widget-value-lg{font-size:var(--text-2xl)}.mini-widget-value-sm{font-size:var(--text-lg)}.mini-widget-unit{font-size:var(--text-xs);color:var(--text-muted);margin-left:.125rem;font-weight:400}.mini-widget-subtitle{font-family:var(--font-data);font-size:var(--text-sm);color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;line-height:1.3;overflow:hidden}.mini-widget-status-dot{border-radius:50%;flex-shrink:0;width:.5rem;height:.5rem}.mini-widget-status-dot.excellent{background:var(--signal-excellent)}.mini-widget-status-dot.good{background:var(--signal-good)}.mini-widget-status-dot.fair{background:var(--signal-fair)}.mini-widget-status-dot.poor{background:var(--signal-poor)}.mini-widget-status-dot.critical{background:var(--signal-critical)}.mini-widget-status-dot.unknown{background:var(--signal-unknown)}.mini-widget-trend{font-size:var(--text-xs);align-items:center;gap:.125rem;font-weight:500;display:flex}.mini-widget-trend.up{color:var(--accent-danger)}.mini-widget-trend.down{color:var(--accent-success)}.mini-widget-trend.stable{color:var(--text-muted)}.mini-widget-sparkline{width:100%;min-width:1px;height:1.5rem;min-height:1px;margin-top:auto}.mini-widget-loading{justify-content:center;align-items:center;min-height:4rem;display:flex}.mini-widget-loading-spinner{border:2px solid var(--border-subtle);border-top-color:var(--accent-primary);border-radius:50%;width:1rem;height:1rem;animation:.8s linear infinite spin}.mini-widget-error{min-height:4rem;color:var(--text-muted);font-size:var(--text-sm);justify-content:center;align-items:center;display:flex}.mini-widget-progress{background:var(--bg-subtle);border-radius:.125rem;height:.25rem;margin-top:auto;overflow:hidden}.mini-widget-progress-bar{border-radius:.125rem;height:100%;transition:width .3s}.mini-widget-progress-bar.excellent{background:var(--signal-excellent)}.mini-widget-progress-bar.good{background:var(--signal-good)}.mini-widget-progress-bar.fair{background:var(--signal-fair)}.mini-widget-progress-bar.poor{background:var(--signal-poor)}.mini-widget-progress-bar.critical{background:var(--signal-critical)}.mini-widget-toggle{align-items:center;gap:.5rem;display:flex}.mini-widget-toggle-track{background:var(--bg-subtle);border:1px solid var(--border-subtle);cursor:pointer;border-radius:.5rem;width:2rem;height:1rem;transition:all .2s;position:relative}.mini-widget-toggle-track.active{background:var(--accent-success);border-color:var(--accent-success)}.mini-widget-toggle-thumb{background:#fff;border-radius:50%;width:.75rem;height:.75rem;transition:left .2s;position:absolute;top:50%;left:.125rem;transform:translateY(-50%)}.mini-widget-toggle-track.active .mini-widget-toggle-thumb{left:calc(100% - .875rem)}.mesh-health-container{margin-bottom:1rem}@media(min-width:640px){.mesh-health-container{margin-bottom:1.5rem}}.mesh-health-header{align-items:center;gap:.375rem;margin-bottom:.5rem;display:flex}@media(min-width:640px){.mesh-health-header{gap:.5rem;margin-bottom:.75rem}}.widget-row{gap:.5rem;display:grid}@media(min-width:640px){.widget-row{gap:.75rem}}@media(min-width:768px){.widget-row{grid-template-columns:repeat(3,1fr)}.mini-widget{height:7.5rem}}@media(max-width:767px){.widget-row{grid-template-columns:repeat(2,1fr)}.mini-widget{height:6rem;padding:.5rem}.mini-widget-title{font-size:.625rem}.mini-widget-value{font-size:var(--text-base)}.mini-widget-value-lg{font-size:var(--text-lg)}.mini-widget-subtitle{font-size:var(--text-xs)}}.mini-widget-value.excellent{color:var(--signal-excellent)}.mini-widget-value.good{color:var(--signal-good)}.mini-widget-value.fair{color:var(--signal-fair)}.mini-widget-value.poor{color:var(--signal-poor)}.mini-widget-value.critical{color:var(--signal-critical)}.data-box{border-radius:var(--radius-sm);background:var(--data-box-bg);border:1px solid var(--data-box-border);font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);--data-box-color:var(--text-primary);color:var(--data-box-color);letter-spacing:-.03em;font-variant-numeric:tabular-nums;font-feature-settings:"zero","tnum";white-space:nowrap;text-overflow:ellipsis;justify-content:center;align-items:center;min-width:0;padding:.25rem .5rem;line-height:1.2;display:inline-flex;overflow:hidden}.data-box-compact,.data-box-responsive{font-size:var(--text-xs);border-radius:var(--radius-xs);padding:.125rem .375rem}@media(min-width:640px){.data-box-responsive{font-size:var(--text-sm);border-radius:var(--radius-sm);padding:.25rem .5rem}}.data-box-hug{width:auto}.data-box-fill{width:100%;display:flex}.data-box-left{justify-content:flex-start}.data-box-center{justify-content:center}.data-box-right{justify-content:flex-end}.data-box-label{font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);color:var(--text-muted);margin-bottom:.25rem;line-height:1.3}.input-base{border-radius:var(--radius-sm);background-color:var(--surface-tint-light);border:var(--stroke-thin)solid var(--border-subtle);width:100%;color:var(--text-primary);transition:border-color var(--duration-fast)var(--ease-out),box-shadow var(--duration-fast)var(--ease-out);padding:.625rem .875rem;font-size:.875rem;line-height:1.5}.input-base::placeholder{color:var(--text-muted)}.input-base:focus{border-color:var(--accent-primary);box-shadow:0 0 0 var(--ring-width-default) var(--accent-primary);outline:none}@supports (color:color-mix(in lab,red,red)){.input-base:focus{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-primary)25%,transparent)}}.input-base:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.input-compact{padding:.375rem .625rem;font-size:.8125rem}.input-error{border-color:var(--accent-danger)}.input-error:focus{box-shadow:0 0 0 var(--ring-width-default) var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.input-error:focus{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-danger)25%,transparent)}}.input-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--radius-sm);background-color:var(--surface-tint-light);border:var(--stroke-thin)solid var(--border-subtle);width:100%;color:var(--text-primary);cursor:pointer;transition:border-color var(--duration-fast)var(--ease-out);padding:.625rem 2.5rem .625rem .875rem;font-size:.875rem}.input-select:focus{border-color:var(--accent-primary);box-shadow:0 0 0 var(--ring-width-default) var(--accent-primary);outline:none}@supports (color:color-mix(in lab,red,red)){.input-select:focus{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-primary)25%,transparent)}}.input-group{align-items:center;display:flex;position:relative}.input-group-icon{pointer-events:none;color:var(--text-muted);width:1rem;height:1rem;position:absolute;left:.75rem}.input-group .input-base{padding-left:2.25rem}.input-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--radius-xs);background-color:var(--surface-tint-light);border:var(--stroke-thin)solid var(--border-subtle);cursor:pointer;width:1rem;height:1rem;transition:background-color var(--duration-fast)var(--ease-out),border-color var(--duration-fast)var(--ease-out)}.input-checkbox:checked{background-color:var(--accent-primary);border-color:var(--accent-primary)}.input-checkbox:focus-visible{box-shadow:0 0 0 var(--ring-width-default) var(--accent-primary);outline:none}@supports (color:color-mix(in lab,red,red)){.input-checkbox:focus-visible{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-primary)25%,transparent)}}input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}input:focus-visible{box-shadow:0 0 0 2px var(--accent-primary);outline:none}select{background-image:none}.terminal-card{height:calc(100dvh - 160px);min-height:300px;max-height:calc(100vh - 120px);padding-bottom:env(safe-area-inset-bottom,0)}@media(min-width:640px){.terminal-card{height:calc(100dvh - 180px);min-height:400px}}@media(min-width:1024px){.terminal-card{height:calc(100vh - 180px);min-height:500px}}.terminal-ascii{letter-spacing:-.5px;font-size:8px}@media(min-width:375px){.terminal-ascii{letter-spacing:0;font-size:9px}}@media(min-width:414px){.terminal-ascii{font-size:10px}}@media(min-width:640px){.terminal-ascii{font-size:11px}}@media(min-width:768px){.terminal-ascii{font-size:12px}}@media(min-width:1024px){.terminal-ascii{font-size:13px}}@supports (-webkit-touch-callout:none){.terminal-card input{font-size:16px}}.terminal-card>div:first-child{-webkit-overflow-scrolling:touch;overscroll-behavior:contain}@keyframes flash-white-fade{0%{opacity:.2}to{opacity:0}}.flash-overlay{border-radius:inherit;pointer-events:none;z-index:50;background-color:#fff;animation:.6s ease-out forwards flash-white-fade;position:absolute;top:0;right:0;bottom:0;left:0}@keyframes flash-row-bg{0%{background-color:#fff3}to{background-color:#0000}}.flash-row{animation:.6s ease-out forwards flash-row-bg}@keyframes flash-icon-pulse{0%{color:#fff;filter:drop-shadow(0 0 6px #fffc)}to{color:var(--text-muted);filter:none}}.flash-icon{animation:.6s ease-out forwards flash-icon-pulse}@keyframes pulse-slow{0%,to{opacity:1}50%{opacity:.4}}.animate-pulse-slow{animation:3s ease-in-out infinite pulse-slow}@keyframes shimmer-border{0%{background-position:200% 0}to{background-position:-200% 0}}.shimmer-border{z-index:1;pointer-events:none;background:linear-gradient(90deg,transparent 0%,transparent 25%,var(--accent-primary)50%,transparent 75%,transparent 100%);border-radius:inherit;opacity:.8;background-size:200% 100%;padding:2px;animation:2s ease-in-out infinite shimmer-border;position:absolute;top:0;right:0;bottom:0;left:0;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);mask-image:linear-gradient(#fff 0,#fff 0),linear-gradient(#fff 0,#fff 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.shimmer-border-light{background:linear-gradient(90deg,#0000,#0000,#fff6,#0000,#0000)}.shimmer-indicator{background:var(--bg-elevated);border-radius:2px;width:40px;height:4px;position:relative;overflow:hidden}.shimmer-indicator-inner{background:linear-gradient(90deg,transparent 0%,var(--accent-primary)50%,transparent 100%);background-size:200% 100%;animation:1.5s ease-in-out infinite shimmer-border;position:absolute;top:0;right:0;bottom:0;left:0}.map-container-16-9{width:100%;height:80dvh;min-height:320px;max-height:900px;position:relative}@media(max-width:639px){.map-container-16-9{width:calc(100% + 2rem);height:70dvh;min-height:280px;max-height:600px;margin-left:-1rem;margin-right:-1rem}.map-container-16-9>div{border-radius:0!important}}@media(min-width:640px)and (max-width:1023px){.map-container-16-9{height:75dvh;max-height:700px}}@media(min-width:1920px){.map-container-16-9{max-height:1000px}}.map-container-fullscreen{width:100vw!important;height:calc(100dvh - 3.5rem)!important;aspect-ratio:unset!important;min-height:unset!important;max-height:unset!important;z-index:999!important;border-radius:0!important;padding-bottom:0!important;position:fixed!important;top:3.5rem!important;right:0!important;bottom:0!important;left:0!important}@media(min-width:1024px){.map-container-fullscreen{height:100dvh!important;top:0!important}}.map-blue-water{position:relative}.map-blue-water .leaflet-tile-pane{filter:sepia(.15)hue-rotate(180deg)saturate(.7)brightness(.95)}.map-blue-water:after{content:"";background:linear-gradient(180deg,var(--map-overlay-blue-dark)0%,var(--map-overlay-blue-light)100%);pointer-events:none;z-index:400;mix-blend-mode:multiply;position:absolute;top:0;right:0;bottom:0;left:0}.map-blue-water .leaflet-marker-pane,.map-blue-water .leaflet-popup-pane,.map-blue-water .leaflet-overlay-pane{filter:none!important}.leaflet-control-attribution{background:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.leaflet-control-attribution{background:color-mix(in srgb,var(--bg-body)85%,transparent)!important}}.leaflet-control-attribution{color:var(--text-muted)!important;border-radius:var(--radius-xs)0 0 0!important;padding:2px 6px!important;font-size:10px!important}.leaflet-control-attribution a{color:var(--text-secondary)!important}.leaflet-control-zoom{overflow:hidden;border-radius:var(--radius-lg)!important;background:var(--bg-body)!important;border:none!important;margin-top:1rem!important;margin-left:1rem!important}@supports (color:color-mix(in lab,red,red)){.leaflet-control-zoom{background:color-mix(in srgb,var(--bg-body)85%,transparent)!important}}.leaflet-control-zoom{-webkit-backdrop-filter:blur(12px);border:1px solid var(--map-border-accent)!important}.leaflet-control-zoom a{color:var(--text-secondary)!important;border:none!important;border-bottom:1px solid var(--map-border-accent-subtle)!important;background:0 0!important;width:32px!important;height:32px!important;font-size:16px!important;font-weight:500!important;line-height:32px!important}.leaflet-control-zoom a:last-child{border-bottom:none!important}.leaflet-control-zoom a:hover{background:var(--map-hover-tint)!important;color:var(--text-primary)!important}.leaflet-control-zoom a.leaflet-disabled{opacity:.5;color:var(--text-muted)!important}.map-dot-marker{background:0 0!important;border:none!important}.map-ring-marker,.map-filled-marker,.map-local-marker{cursor:pointer!important;z-index:500!important;pointer-events:auto!important;background:0 0!important;border:none!important}.leaflet-marker-pane{z-index:600!important;pointer-events:auto!important}.leaflet-marker-pane .leaflet-marker-icon{pointer-events:auto!important}.leaflet-popup-content-wrapper{border-radius:var(--radius-lg)!important;background-color:var(--map-popup-bg)!important;-webkit-backdrop-filter:blur(12px)brightness(.7)saturate(.9)!important;backdrop-filter:blur(12px)brightness(.7)saturate(.9)!important;box-shadow:inset 0 0 0 1px var(--map-hover-tint),var(--map-popup-shadow)!important;border:none!important;padding:0!important;position:relative!important;overflow:hidden!important}.leaflet-popup-content{color:var(--text-primary)!important;margin:.75rem!important}.leaflet-popup-content strong{color:var(--text-primary)!important}.leaflet-popup-content hr{border-color:var(--map-border-accent-subtle)!important;margin:.5rem 0!important}.leaflet-popup-tip-container{display:none!important}.leaflet-popup-close-button{color:var(--text-muted)!important;width:24px!important;height:24px!important;padding:6px!important;font-size:18px!important;top:4px!important;right:4px!important}.leaflet-popup-close-button:hover{color:var(--text-primary)!important;background:var(--map-hover-tint)!important;border-radius:var(--radius-xs)!important}.leaflet-tooltip{white-space:nowrap;border-radius:var(--radius-md)!important;background-color:var(--bg-body)!important;box-shadow:inset 0 0 0 1px var(--glass-border-glow),inset 1.5px 2px 0 -1px var(--glass-highlight-tl),inset -1.5px -1.5px 0 -1px var(--glass-highlight-br),inset 0 -1px 3px 0 var(--glass-shadow-inner)!important;color:var(--text-primary)!important;border:none!important;padding:.375rem .5rem!important;font-size:11px!important;position:relative!important;overflow:hidden!important}.leaflet-tooltip:after{content:""!important;pointer-events:none!important;border-radius:inherit!important;z-index:999!important;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom)!important;position:absolute!important;top:0!important;right:0!important;bottom:0!important;left:0!important}.leaflet-tooltip:before{display:none!important}.leaflet-tooltip .text-text-muted{color:var(--text-muted)!important}.maplibregl-popup{font-family:var(--font-display),system-ui,-apple-system,sans-serif;font-size:var(--text-sm)}.maplibregl-popup-content{min-width:140px;border-radius:var(--radius-lg)!important;background-color:var(--bg-body)!important;box-shadow:inset 0 0 0 1px var(--glass-border-glow),inset 1.8px 3px 0 -2px var(--glass-highlight-tl),inset -2px -2px 0 -2px var(--glass-highlight-br),inset -3px -8px 1px -6px var(--glass-highlight-edge),inset -.3px -1px 4px 0 var(--glass-shadow-inner),inset 0 3px 4px -2px var(--glass-shadow-top)!important;color:var(--text-primary)!important;border:none!important;padding:.75rem!important;position:relative!important;overflow:hidden!important}.maplibregl-popup-content:after{content:""!important;pointer-events:none!important;border-radius:inherit!important;z-index:999!important;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom)!important;position:absolute!important;top:0!important;right:0!important;bottom:0!important;left:0!important}.maplibregl-popup-close-button{border-radius:var(--radius-xs);transition:background .1s,color .1s;color:var(--text-muted)!important;width:24px!important;height:24px!important;padding:6px!important;font-size:18px!important;top:4px!important;right:4px!important}.maplibregl-popup-close-button:hover{color:var(--text-primary)!important;background:var(--map-hover-tint)!important}.maplibregl-popup-tip{display:none!important}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{border-top-color:var(--tooltip-bg)!important}.maplibregl-marker.local-node-marker{z-index:10!important}.maplibregl-marker:has(.z-50){z-index:20!important}.maplibregl-popup{z-index:100!important}.maplibregl-ctrl-attrib{background:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.maplibregl-ctrl-attrib{background:color-mix(in srgb,var(--bg-body)80%,transparent)!important}}.maplibregl-ctrl-attrib{color:var(--text-muted)!important;padding:2px 6px!important;font-size:10px!important}.maplibregl-ctrl-attrib a{color:var(--text-secondary)!important}.maplibregl-ctrl-attrib.maplibregl-compact{background:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.maplibregl-ctrl-attrib.maplibregl-compact{background:color-mix(in srgb,var(--bg-body)80%,transparent)!important}}.maplibregl-ctrl-attrib.maplibregl-compact{border-radius:var(--radius-xs)!important}.maplibregl-map,.leaflet-container{touch-action:pan-x pan-y;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.maplibregl-ctrl button:focus,.leaflet-control a:focus{outline:2px solid var(--accent-primary);outline-offset:2px}@media(prefers-contrast:high){.maplibregl-ctrl button,.leaflet-control a{border:2px solid!important}.map-legend,.map-controls{border:2px solid var(--text-primary)!important}}@media(prefers-reduced-motion:reduce){.maplibregl-map,.leaflet-container{transition:none!important}.maplibregl-map *{transition:none!important;animation:none!important}}@-moz-document url-prefix(){.maplibregl-canvas{transform:translateZ(0)}}@supports (-webkit-touch-callout:none){.maplibregl-canvas{will-change:transform;transform:translateZ(0)}}@media(forced-colors:active){.maplibregl-ctrl button,.leaflet-control a{forced-color-adjust:none;color:buttontext!important;background:canvas!important;border:1px solid buttontext!important}.maplibregl-popup-content,.leaflet-popup-content-wrapper{color:canvastext!important;background:canvas!important;border:2px solid canvastext!important}}.maplibregl-ctrl-attrib-button{background-color:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.maplibregl-ctrl-attrib-button{background-color:color-mix(in srgb,var(--bg-body)80%,transparent)!important}}.maplibregl-ctrl-attrib-button{border-radius:var(--radius-xs)!important}.maplibregl-ctrl-group{border-radius:var(--radius-md)!important;background-color:var(--map-ui-bg,var(--bg-surface))!important;box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a)!important;border:none!important;position:relative!important;overflow:hidden!important}.maplibregl-ctrl-group:after{display:none!important}.maplibregl-ctrl-group button{border:none!important;border-bottom:1px solid var(--map-ui-border,var(--border-subtle))!important;background:0 0!important;width:28px!important;height:28px!important}.maplibregl-ctrl-group button:last-child{border-bottom:none!important}.maplibregl-ctrl-group button:hover{background:var(--map-ui-hover,var(--bg-elevated))!important}.maplibregl-ctrl-group button .maplibregl-ctrl-icon{filter:invert()brightness(.75)}.maplibregl-ctrl-group button:hover .maplibregl-ctrl-icon{filter:invert()brightness()}[data-basemap=light] .maplibregl-ctrl-group button .maplibregl-ctrl-icon{filter:brightness(.3)}[data-basemap=light] .maplibregl-ctrl-group button:hover .maplibregl-ctrl-icon{filter:brightness(.1)}.maplibregl-ctrl-scale{border:1px solid var(--map-local-color)!important;color:var(--map-local-color)!important;font-size:10px!important;font-family:var(--font-data)!important;background:0 0!important;border-top:none!important;border-radius:0!important;padding:2px 6px!important;line-height:1.2!important}.map-control-glass{border-radius:var(--radius-md);background-color:var(--map-ui-bg,var(--bg-surface));color:var(--map-ui-text,var(--text-primary));box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);position:relative;overflow:hidden}.map-control-glass:after{display:none}.map-control-glass-active{border-radius:var(--radius-md);background-color:var(--map-ui-bg,var(--bg-surface));color:var(--map-ui-text,var(--text-primary));box-shadow:inset 0 0 0 1px var(--map-ui-border-strong,var(--border-strong)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);position:relative;overflow:hidden}.map-control-glass-active:after{display:none}.map-control-glass .text-text-secondary,.map-control-glass-active .text-text-secondary,.map-legend-stack .text-text-secondary{color:var(--map-ui-text-secondary,var(--text-secondary))}.map-control-glass .text-text-muted,.map-control-glass-active .text-text-muted,.map-legend-stack .text-text-muted{color:var(--map-ui-text-muted,var(--text-muted))}.map-controls-container{background-color:var(--map-ui-bg,var(--bg-surface));max-width:calc(100vw - 1.5rem);color:var(--map-ui-text,var(--text-primary));border-radius:var(--radius-md);box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);flex-direction:column;align-items:stretch;gap:0;display:flex;overflow:hidden}.map-controls-row{flex-wrap:wrap;justify-content:flex-end;gap:.25rem;padding:.25rem;display:flex}.map-controls-row+.map-controls-row{border-top:1px solid var(--map-ui-border,var(--border-subtle))}.map-controls-secondary{flex-wrap:wrap}.map-control-btn{touch-action:manipulation;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;padding:.375rem;transition:background-color .15s}@media(hover:hover)and (pointer:fine){.map-control-btn:hover{background-color:var(--map-ui-hover,var(--bg-elevated))}}.map-control-btn:active{background-color:var(--map-ui-active,var(--bg-subtle))}.map-control-icon{width:16px;height:16px}.map-nav-module{padding:.25rem}.map-control-active-amber{background-color:var(--map-control-active-amber)!important}.map-control-active-sky{background-color:var(--map-control-active-sky)!important}.map-control-active-teal{background-color:var(--map-control-active-teal)!important}@media(max-width:639px){.map-controls-container{border-radius:var(--radius-md);max-width:calc(100vw - 1rem)}.map-controls-row{gap:.125rem;padding:.1875rem}.map-control-btn{justify-content:center;align-items:center;min-width:32px;min-height:32px;padding:.375rem;display:flex}.map-control-icon{width:14px;height:14px}.map-control-label{display:none}.map-nav-module{padding:.1875rem}.maplibregl-ctrl-group{border-radius:var(--radius-md)!important}.maplibregl-ctrl-group button{width:28px!important;height:28px!important}.maplibregl-ctrl-group button .maplibregl-ctrl-icon{width:18px!important;height:18px!important}}@media(min-width:640px)and (max-width:1023px){.map-controls-row,.map-nav-module{padding:.25rem}}@media(min-width:1024px){.map-controls-row{gap:.375rem;padding:.375rem}.map-nav-module{padding:.375rem}}.map-legend-stack{z-index:600;background-color:var(--map-ui-bg,var(--bg-surface));max-width:150px;max-height:calc(100% - 1.5rem);color:var(--map-ui-text,var(--text-primary));border-radius:var(--radius-md);box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);flex-direction:column;gap:0;display:flex;position:absolute;bottom:.75rem;left:.75rem;overflow:hidden auto}.map-legend-stack>*{box-shadow:none;background-color:#0000;border-radius:0}.map-legend-stack>:first-child{border-radius:var(--radius-md)var(--radius-md)0 0}.map-legend-stack>:last-child{border-radius:0 0 var(--radius-md)var(--radius-md)}.map-legend-stack>:only-child{border-radius:var(--radius-md)}.map-legend-stack>*+*{border-top:1px solid var(--map-ui-border,var(--border-subtle))}@media(min-width:640px){.map-legend-stack{max-width:160px;bottom:1rem;left:1rem}}.map-edge-tooltip{z-index:1000;pointer-events:none;max-width:calc(100vw - 2rem);position:absolute;bottom:1rem;left:calc(50% + 85px);transform:translate(-50%)}.map-edge-tooltip-inner{pointer-events:auto;padding:.625rem 1rem}@media(max-width:639px){.map-edge-tooltip{bottom:.5rem;left:.5rem;right:.5rem;transform:none}.map-edge-tooltip-inner{border-radius:var(--radius-lg);background-color:var(--map-ui-bg,var(--bg-body));padding:.75rem}.map-edge-tooltip .w-\[540px\]{width:100%;max-width:100%}}.map-container-fullscreen .map-edge-tooltip{bottom:1.5rem}[data-basemap=light]{--map-edge-rest:#0003;--map-edge-rest-bright:#0000004d;--map-edge-rest-dim:#0000001f;--map-ui-bg:#f8f8f8;--map-ui-bg-elevated:#fff;--map-ui-border:#0000001f;--map-ui-border-strong:#0003;--map-ui-text:#1a1a1a;--map-ui-text-secondary:#4a4a4a;--map-ui-text-muted:#737373;--map-ui-hover:#0000000f;--map-ui-active:#0000001a;--map-ui-shadow:0 2px 8px #00000014,0 4px 16px #0000000a}[data-basemap=dark]{--map-ui-bg:var(--bg-surface);--map-ui-bg-elevated:var(--bg-elevated);--map-ui-border:var(--border-subtle);--map-ui-border-strong:var(--border-strong);--map-ui-text:var(--text-primary);--map-ui-text-secondary:var(--text-secondary);--map-ui-text-muted:var(--text-muted);--map-ui-hover:var(--hover-tint);--map-ui-active:var(--bg-elevated);--map-ui-shadow:0 2px 8px #00000026,0 4px 16px #0000001a}[data-basemap] .map-control-glass,[data-basemap] .map-controls-container,[data-basemap] .map-legend-stack,[data-basemap] .map-legend-stack button,[data-basemap] .maplibregl-ctrl-group,[data-basemap] .maplibregl-ctrl-group button{transition:background-color .3s,color .3s,box-shadow .3s,border-color .3s!important}[data-basemap] .map-control-glass .text-text-secondary,[data-basemap] .map-control-glass .text-text-muted,[data-basemap] .map-legend-stack .text-text-secondary,[data-basemap] .map-legend-stack .text-text-muted{transition:color .3s!important}[data-basemap] .map-legend-stack>*+*,[data-basemap] .map-controls-row+.map-controls-row{transition:border-color .3s!important}[data-basemap=light] .map-control-glass,[data-basemap=light] .map-controls-container,[data-basemap=light] .map-legend-stack{color:#1a1a1a!important;background-color:#f8f8f8!important;box-shadow:inset 0 0 0 1px #0000001f,0 2px 8px #00000014,0 4px 16px #0000000a!important}[data-basemap=light] .maplibregl-ctrl-group{background-color:#f8f8f8!important;box-shadow:inset 0 0 0 1px #0000001f,0 2px 8px #00000014,0 4px 16px #0000000a!important}[data-basemap=light] .maplibregl-ctrl-group button{border-bottom-color:#0000001f!important}[data-basemap=light] .maplibregl-ctrl-group button:hover{background-color:#0000000f!important}[data-basemap=light] .map-control-glass .text-text-secondary,[data-basemap=light] .map-legend-stack .text-text-secondary{color:#4a4a4a!important}[data-basemap=light] .map-control-glass .text-text-muted,[data-basemap=light] .map-legend-stack .text-text-muted{color:#737373!important}[data-basemap=light] .map-control-glass .text-text-primary,[data-basemap=light] .map-legend-stack .text-text-primary{color:#1a1a1a!important}[data-basemap=light] .map-control-glass button.text-text-muted,[data-basemap=light] .map-control-glass [class*=text-text-muted]{color:#737373!important}[data-basemap=light] .map-control-glass button:hover.text-text-muted,[data-basemap=light] .map-control-glass button:hover .text-text-muted{color:#1a1a1a!important}[data-basemap=light] .map-legend-stack>*+*,[data-basemap=light] .map-controls-row+.map-controls-row{border-top-color:#0000001f!important}[data-basemap=light] .map-control-glass .bg-border-subtle,[data-basemap=light] .map-control-glass .border-border-subtle{background-color:#0000001f!important;border-color:#0000001f!important}[data-basemap=light] .map-control-btn:hover{background-color:#0000000f!important}[data-basemap=light] .map-control-btn:active{background-color:#0000001a!important}[data-basemap=light] .map-control-glass button:hover{background-color:#0000000f!important}[data-basemap=light] .map-control-glass button:active{background-color:#0000001a!important}.border-map-ui-border{border-color:var(--map-ui-border)}@supports (color:color(display-p3 1 1 1)){.signal-bar-active{background-color:var(--p3-color,inherit)}}[data-theme="kde breeze"]{--glass-reflection-top:none;--glass-reflection-bottom:none;--glass-surface-tint:none}:root{--bg-body:#171717;--bg-surface:#252525;--bg-elevated:#333233;--bg-subtle:#3f3f3f;--border-subtle:#4b4b4b;--border-strong:#616161;--text-primary:#e8e8e8;--text-secondary:#c9c9c9;--text-muted:#a8a8a8;--text-invert:#171717;--accent-primary:#719cdf;--accent-secondary:#dfbc72;--accent-tertiary:#6fbcbd;--accent-danger:#e12672;--accent-success:#719872;--overlay-soft:#ffffff0a;--shadow-tint:#719cdf59;--sidebar-tint:#719cdf0f;--tooltip-bg:#252525;--hover-tint:#719cdf14;--glass-tint:#252525;--glass-light:#fff;--glass-dark:#000;--glass-reflex-light:.15;--glass-reflex-dark:.8;--glass-blur:6px;--glass-blur-elevated:8px;--glass-brightness:1;--glass-surface-tint:linear-gradient(to bottom,#ffffff06,#ffffff04);--glass-reflection-top:linear-gradient(to bottom,#ffffff05 0px,transparent 16px);--glass-reflection-bottom:linear-gradient(to top,#ffffff05 0px,transparent 20px);--glass-border-glow:#ffffff14;--glass-highlight-tl:#ffffff1f;--glass-highlight-br:#ffffff14;--glass-highlight-edge:#ffffff0f;--glass-shadow-inner:#00000026;--glass-shadow-top:#0000001f;--glass-bg-opacity:8%;--glass-bg-opacity-elevated:12%;--signal-excellent:#0f0;--signal-good:#8ce619;--signal-fair:#ffd900;--signal-poor:#ff8c26;--signal-critical:#f33;--signal-unknown:#616161;--sparkline-excellent:#0f0;--sparkline-good:#8ce619;--sparkline-fair:#ffd900;--sparkline-poor:#ff8c26;--sparkline-critical:#f33;--status-success:#719872;--status-warning:#dfbc72;--status-danger:#e12672;--status-info:#6fbcbd;--status-muted:#616161;--pkt-advert:#dfbc72;--pkt-flood:#6fbcbd;--pkt-txt-msg:#719872;--pkt-ack:#999abd;--pkt-trace:#70bddf;--pkt-req:#0074be;--pkt-response:#98bc99;--pkt-grp-txt:#e17899;--pkt-grp-data:#be7572;--pkt-path:#70bddf;--pkt-anon:#bdbb72;--pkt-unknown:#616161;--pkt-science-req:#0090ff;--pkt-science-anon-req:#06c;--pkt-science-response:#6cf;--pkt-science-ack:#00e699;--pkt-science-advert:#fff200;--pkt-science-txt-msg:#ffb300;--pkt-science-grp-txt:#ff80c0;--pkt-science-grp-data:#f60;--pkt-science-multipart:#b3b3b3;--pkt-science-raw-custom:#e666cc;--pkt-science-path:#66b3ff;--pkt-science-trace:#33ffb3;--pkt-science-unknown:gray;--route-flood:var(--accent-primary);--route-direct:#dfbc72;--route-transport:#999abd;--chart-1:#719cdf;--chart-2:#0074be;--chart-3:#6fbcbd;--chart-4:#dfbc72;--chart-5:#719872;--chart-6:#e12672;--chart-7:#e17899;--chart-8:#999abd;--chart-grid:#bfbfbf26;--chart-axis-tick:var(--text-secondary);--chart-cursor:#fff3;--metric-received:#719872;--metric-forwarded:#0074be;--metric-transmitted:#dfbc72;--metric-dropped:#e12672;--metric-neutral:#bfbfbf;--log-debug:var(--sys-brown);--log-info:var(--sys-cyan);--log-warning:var(--sys-amber);--log-error:var(--sys-red);--log-critical:var(--sys-pink);--icon-page-title:var(--accent-primary);--icon-card-title:var(--accent-primary);--icon-widget:var(--text-secondary);--icon-action:var(--text-secondary);--icon-nav:var(--text-muted);--icon-nav-active:var(--accent-primary);--toggle-on:var(--accent-success);--toggle-off:var(--bg-elevated);--data-box-bg:#ffffff08;--data-box-border:#ffffff0f;--map-node-fill:#3b82f6;--map-node-stroke:#ffffffe6;--map-hub-color:var(--sys-purple);--map-hub-stroke:#ffffffe6;--map-gateway-color:var(--sys-indigo);--map-gateway-stroke:#ffffffd9;--map-local-color:var(--sys-amber);--map-neighbor-color:var(--sys-amber);--map-neighbor-stroke:#0006;--map-mobile-color:var(--sys-orange);--map-room-color:var(--sys-pink);--map-ghost-color:var(--sys-cyan);--palette-bg-0:#171717;--palette-bg-1:#1f1f1f;--palette-bg-2:#252525;--palette-bg-3:#2d2d2d;--palette-bg-4:#3f3f3f;--palette-bg-5:#4b4b4b;--palette-bg-6:#616161;--palette-bg-7:#727272;--palette-fg-0:#8a8a8a;--palette-fg-1:#a3a3a3;--palette-fg-2:#bfbfbf;--palette-fg-3:#e1e1e1;--palette-fg-4:#f5f5f5;--palette-red:#be7572;--palette-red-bright:#e12672;--palette-orange:#d97742;--palette-orange-bright:#f59e0b;--palette-yellow:#bdbb72;--palette-yellow-bright:#dfbc72;--palette-green:#719872;--palette-green-bright:#98bc99;--palette-aqua:#6fbcbd;--palette-aqua-bright:#70bddf;--palette-blue:#0074be;--palette-blue-bright:#719cdf;--palette-purple:#8b7bad;--palette-purple-bright:#999abd;--map-popup-bg:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){:root{--map-popup-bg:color-mix(in srgb,var(--bg-body)92%,transparent)}}:root{--map-popup-shadow:0 4px 16px #00000080;--map-overlay-blue-dark:#0d1e3226;--map-overlay-blue-light:#14284614;--map-border-accent:#8ca0c833;--map-border-accent-subtle:#8ca0c826;--map-hover-tint:#ffffff1a;--map-edge-rest:#ffffff40;--map-edge-rest-bright:#ffffff59;--map-edge-rest-dim:#ffffff26;--map-edge-hover-direct:#6fbcbd;--map-edge-hover-loop:#8b7bad;--map-edge-hover-standard:#8a8a8a;--map-edge-hover-neighbor:#fbbf24;--map-edge-highlight:gold;--link-strong:#719872;--link-medium:#dfbc72;--link-weak:#be7572;--hop-0:#6fbcbd;--hop-1:#719872;--hop-2:#98bc99;--hop-3:#dfbc72;--hop-distant:#727272;--hop-hub:#fbbf24;--sys-red:#e5484d;--sys-orange:#f76b15;--sys-amber:#ffb224;--sys-yellow:#f5d90a;--sys-brown:#ad7f58;--sys-green:#46a758;--sys-teal:#12a594;--sys-cyan:#00a2c7;--sys-blue:#3b82f6;--sys-indigo:#5b5bd6;--sys-purple:#8e4ec6;--sys-pink:#d6409f;--ctrl-base:var(--palette-bg-4);--ctrl-base-hover:var(--palette-bg-5);--ctrl-base-active:var(--palette-bg-3);--ctrl-border:var(--palette-bg-5);--ctrl-border-hover:var(--palette-bg-6);--ctrl-shadow-dark:var(--palette-bg-1);--ctrl-shadow-mid:var(--palette-bg-0);--ctrl-highlight:var(--palette-bg-6);--ctrl-inset:var(--palette-bg-3);--ctrl-primary:#5a6b9f;--ctrl-primary-hover:#6a7baf;--ctrl-primary-border:#7a8bbf;--ctrl-primary-shadow:#2a3b5f;--ctrl-primary-highlight:#8a9bcf;--ctrl-primary-inset:#4a5b8f;--ctrl-success:#4a7854;--ctrl-success-hover:#5a8864;--ctrl-success-border:#6a9874;--ctrl-success-shadow:#2a4834;--ctrl-success-highlight:#7aa884;--ctrl-success-inset:#3a6844;--ctrl-warning:#9f8a4a;--ctrl-warning-hover:#af9a5a;--ctrl-warning-border:#bfaa6a;--ctrl-warning-shadow:#5f4a2a;--ctrl-warning-highlight:#cfba7a;--ctrl-warning-inset:#8f7a3a;--ctrl-panel-top:var(--palette-bg-2);--ctrl-panel-mid:var(--palette-bg-1);--ctrl-panel-bottom:var(--palette-bg-0);--ctrl-panel-border:var(--palette-bg-4);--background:var(--bg-body);--foreground:var(--text-secondary);--foreground-muted:var(--text-muted);--foreground-subtle:var(--border-subtle);--primary:var(--accent-tertiary);--secondary:var(--accent-secondary);--accent-green:var(--accent-success);--accent-red:var(--accent-danger);--accent-purple:var(--accent-primary);--accent-cyan:var(--accent-tertiary);--card-bg:var(--bg-surface);--border:var(--border-subtle);--theme-transition:.4s ease;--text-xs:.64rem;--text-sm:.8rem;--text-base:1rem;--text-md:1.125rem;--text-lg:1.25rem;--text-xl:1.563rem;--text-2xl:1.953rem;--text-3xl:2.441rem;--text-4xl:3.052rem;--text-5xl:3.815rem;--text-6xl:4.768rem;--leading-tight:1.1;--leading-snug:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--tracking-tight:-.025em;--tracking-normal:0;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--font-normal:400;--font-medium:500;--font-semibold:600;--font-bold:700;--font-extrabold:800}body{background:var(--bg-body);color:var(--text-secondary);font-family:var(--font-display),system-ui,-apple-system,sans-serif;font-weight:var(--font-normal);font-size:var(--text-base);line-height:var(--leading-normal);letter-spacing:var(--tracking-normal);font-feature-settings:"cv02","cv03","cv04";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-height:100vh}.bg-subtle-fill{background:var(--subtle-fill)}.bg-subtle-fill-hover{background:var(--subtle-fill-hover)}.bg-subtle-fill-strong{background:var(--subtle-fill-strong)}.hover\:bg-subtle-fill:hover{background:var(--subtle-fill)}.hover\:bg-subtle-fill-hover:hover{background:var(--subtle-fill-hover)}.hover\:bg-subtle-fill-strong:hover{background:var(--subtle-fill-strong)}.css-label--labels-container{pointer-events:none;z-index:10!important}.css-label--label{font-size:11px;font-family:var(--font-data),monospace;white-space:nowrap;border-radius:3px;padding:2px 6px;font-weight:500;box-shadow:0 1px 3px #0000004d;z-index:11!important;pointer-events:auto!important;text-shadow:none!important;color:#000!important;background:#fff!important}.meshgraph-label-cat-0{background:var(--meshgraph-label-0,#505050)!important;color:#fff!important}.meshgraph-label-cat-1{background:var(--meshgraph-label-1,#707070)!important;color:#fff!important}.meshgraph-label-cat-2{background:var(--meshgraph-label-2,#909090)!important;color:#000!important}.meshgraph-label-cat-3{background:var(--meshgraph-label-3,silver)!important;color:#000!important}.meshgraph-label-cat-4{background:var(--meshgraph-label-4,#fff)!important;color:#000!important}.meshgraph-label-cat-5{background:var(--meshgraph-label-5,#719cdf)!important;color:#fff!important}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}} diff --git a/frontend/dist/assets/index-DWq9tBbL.css b/frontend/dist/assets/index-DWq9tBbL.css new file mode 100644 index 00000000..1545dd71 --- /dev/null +++ b/frontend/dist/assets/index-DWq9tBbL.css @@ -0,0 +1 @@ +.uplot,.uplot *,.uplot *:before,.uplot *:after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:700}.u-wrap{position:relative;-webkit-user-select:none;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box!important}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:#00000012;position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607D8B}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607D8B}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;background-clip:padding-box!important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-400-normal-C38fXH4l.woff2) format("woff2"),url(/assets/inter-latin-400-normal-CyCys3Eg.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-500-normal-Cerq10X2.woff2) format("woff2"),url(/assets/inter-latin-500-normal-BL9OpVg8.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-600-normal-LgqL8muc.woff2) format("woff2"),url(/assets/inter-latin-600-normal-CiBQ2DWP.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-700-normal-Yt3aPRUw.woff2) format("woff2"),url(/assets/inter-latin-700-normal-BLAVimhd.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/jetbrains-mono-latin-600-normal-C8RAYTDA.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-600-normal-BfsvjouI.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/jetbrains-mono-latin-700-normal-BYuf6tUa.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff) format("woff")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:800;src:url(/assets/jetbrains-mono-latin-800-normal-D2mQHRMK.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-800-normal-Dj9qwObk.woff) format("woff")}/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-950:oklch(13% .028 261.692);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-5xl:3rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:4px;--radius-sm:6px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:20px;--drop-shadow-lg:0 4px 4px #00000026;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-display);--default-mono-font-family:var(--font-data);--font-title:var(--font-title);--duration-instant:75ms;--duration-fast:.15s;--duration-normal:.2s}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-x-3{inset-inline:calc(var(--spacing)*3)}.inset-x-\[8\%\]{inset-inline:8%}.-inset-y-0,.inset-y-0{inset-block:calc(var(--spacing)*0)}.inset-y-2{inset-block:calc(var(--spacing)*2)}.-top-0\.5{top:calc(var(--spacing)*-.5)}.-top-2{top:calc(var(--spacing)*-2)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-3{top:calc(var(--spacing)*3)}.top-4{top:calc(var(--spacing)*4)}.top-10{top:calc(var(--spacing)*10)}.top-\[2px\]{top:2px}.top-\[40px\]{top:40px}.top-\[var\(--tip-y\,0\)\]{top:var(--tip-y,0)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing)*-.5)}.-right-1{right:calc(var(--spacing)*-1)}.-right-2{right:calc(var(--spacing)*-2)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-1\.5{right:calc(var(--spacing)*1.5)}.right-2{right:calc(var(--spacing)*2)}.right-2\.5{right:calc(var(--spacing)*2.5)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.-bottom-0\.5{bottom:calc(var(--spacing)*-.5)}.-bottom-1{bottom:calc(var(--spacing)*-1)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-3{bottom:calc(var(--spacing)*3)}.bottom-\[-20px\]{bottom:-20px}.bottom-\[72px\]{bottom:72px}.bottom-full{bottom:100%}.-left-2{left:calc(var(--spacing)*-2)}.-left-3{left:calc(var(--spacing)*-3)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-\[2px\]{left:2px}.left-\[19px\]{left:19px}.left-\[var\(--tip-x\,0\)\]{left:var(--tip-x,0)}.isolate{isolation:isolate}.-z-10{z-index:-10}.-z-20{z-index:-20}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[600\]{z-index:600}.z-\[9999\]{z-index:9999}.z-\[10001\]{z-index:10001}.z-\[10002\]{z-index:10002}.z-\[10003\]{z-index:10003}.z-\[10010\]{z-index:10010}.col-auto{grid-column:auto}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:475px){.container{max-width:475px}}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-m-1{margin:calc(var(--spacing)*-1)}.-m-1\.5{margin:calc(var(--spacing)*-1.5)}.m-2{margin:calc(var(--spacing)*2)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.mx-0\.5{margin-inline:calc(var(--spacing)*.5)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.-mt-5{margin-top:calc(var(--spacing)*-5)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing)*.5)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.-mb-4{margin-bottom:calc(var(--spacing)*-4)}.mb-0{margin-bottom:calc(var(--spacing)*0)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-9{margin-left:calc(var(--spacing)*9)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-\[2\/1\]{aspect-ratio:2}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing)*1.5);height:calc(var(--spacing)*1.5)}.size-2{width:calc(var(--spacing)*2);height:calc(var(--spacing)*2)}.size-2\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-12{width:calc(var(--spacing)*12);height:calc(var(--spacing)*12)}.size-16{width:calc(var(--spacing)*16);height:calc(var(--spacing)*16)}.size-\[max\(100\%\,2\.75rem\)\]{width:max(100%,2.75rem);height:max(100%,2.75rem)}.size-full{width:100%;height:100%}.\!h-3{height:calc(var(--spacing)*3)!important}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-56{height:calc(var(--spacing)*56)}.h-64{height:calc(var(--spacing)*64)}.h-\[1\.2em\]{height:1.2em}.h-\[2px\]{height:2px}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-\[18px\]{height:18px}.h-\[30px\]{height:30px}.h-\[32px\]{height:32px}.h-\[36px\]{height:36px}.h-\[38px\]{height:38px}.h-\[60px\]{height:60px}.h-\[70vh\]{height:70vh}.h-\[75vh\]{height:75vh}.h-\[80vh\]{height:80vh}.h-\[120px\]{height:120px}.h-\[200px\]{height:200px}.h-\[240px\]{height:240px}.h-\[calc\(100dvh-56px\)\]{height:calc(100dvh - 56px)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing)*0)}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[45vh\]{max-height:45vh}.max-h-\[200px\]{max-height:200px}.max-h-\[700px\]{max-height:700px}.max-h-\[calc\(100vh-80px\)\]{max-height:calc(100vh - 80px)}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.max-h-\[calc\(100vh-300px\)\]{max-height:calc(100vh - 300px)}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[8px\]{min-height:8px}.min-h-\[28px\]{min-height:28px}.min-h-\[32px\]{min-height:32px}.min-h-\[40px\]{min-height:40px}.min-h-\[44px\]{min-height:44px}.min-h-\[50vh\]{min-height:50vh}.min-h-\[120px\]{min-height:120px}.min-h-\[300px\]{min-height:300px}.min-h-\[500px\]{min-height:500px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.\!w-3{width:calc(var(--spacing)*3)!important}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-18{width:calc(var(--spacing)*18)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-30{width:calc(var(--spacing)*30)}.w-32{width:calc(var(--spacing)*32)}.w-48{width:calc(var(--spacing)*48)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-80{width:calc(var(--spacing)*80)}.w-\[0\.6em\]{width:.6em}.w-\[1\.75rem\]{width:1.75rem}.w-\[2\.25rem\]{width:2.25rem}.w-\[2px\]{width:2px}.w-\[3px\]{width:3px}.w-\[14px\]{width:14px}.w-\[28px\]{width:28px}.w-\[30px\]{width:30px}.w-\[32px\]{width:32px}.w-\[52px\]{width:52px}.w-\[240px\]{width:240px}.w-\[540px\]{width:540px}.w-\[var\(--button-width\)\]{width:var(--button-width)}.w-\[var\(--input-width\)\]{width:var(--input-width)}.w-full{width:100%}.w-px{width:1px}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[70px\]{max-width:70px}.max-w-\[80px\]{max-width:80px}.max-w-\[85\%\]{max-width:85%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[100px\]{max-width:100px}.max-w-\[140px\]{max-width:140px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-20{min-width:calc(var(--spacing)*20)}.min-w-\[2\.25rem\]{min-width:2.25rem}.min-w-\[18px\]{min-width:18px}.min-w-\[44px\]{min-width:44px}.min-w-\[60px\]{min-width:60px}.min-w-\[80px\]{min-width:80px}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[130px\]{min-width:130px}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-0{flex-basis:calc(var(--spacing)*0)}.origin-bottom{transform-origin:bottom}.origin-top{transform-origin:top}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-1\/4{--tw-translate-x: -25% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-90{rotate:-90deg}.rotate-0{rotate:none}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.rotate-\[135deg\]{rotate:135deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.touch-manipulation{touch-action:manipulation}.resize{resize:both}.scroll-py-1{scroll-padding-block:calc(var(--spacing)*1)}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.columns-2{columns:2}.columns-3{columns:3}.columns-4{columns:4}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[auto_minmax\(0\,1fr\)_auto_minmax\(0\,1fr\)\]{grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr)}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-\[2px\]{gap:2px}.gap-\[3\%\]{gap:3%}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-3{column-gap:calc(var(--spacing)*3)}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-2{row-gap:calc(var(--spacing)*2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border-subtle>:not(:last-child)),:where(.divide-border-subtle\/30>:not(:last-child)){border-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){:where(.divide-border-subtle\/30>:not(:last-child)){border-color:color-mix(in oklab,var(--border-subtle)30%,transparent)}}:where(.divide-white\/5>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){:where(.divide-white\/5>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.self-center{align-self:center}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.justify-self-center{justify-self:center}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\!overflow-hidden{overflow:hidden!important}.\!overflow-visible{overflow:visible!important}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.\!rounded{border-radius:.25rem!important}.\!rounded-md{border-radius:8px!important}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:20px}.rounded-\[1\.125rem\]{border-radius:1.125rem}.rounded-\[1px\]{border-radius:1px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:12px}.rounded-md{border-radius:8px}.rounded-sm{border-radius:6px}.rounded-xl{border-radius:16px}.rounded-xs{border-radius:4px}.rounded-t-lg{border-top-left-radius:12px;border-top-right-radius:12px}.rounded-tl-md{border-top-left-radius:8px}.rounded-tr-md{border-top-right-radius:8px}.\!rounded-b-none{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-\[var\(--route-direct\)\]\/30{border-color:var(--route-direct)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--route-direct\)\]\/30{border-color:color-mix(in oklab,var(--route-direct)30%,transparent)}}.border-\[var\(--route-flood\)\]\/30{border-color:var(--route-flood)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--route-flood\)\]\/30{border-color:color-mix(in oklab,var(--route-flood)30%,transparent)}}.border-\[var\(--route-transport\)\]\/30{border-color:var(--route-transport)}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--route-transport\)\]\/30{border-color:color-mix(in oklab,var(--route-transport)30%,transparent)}}.border-accent-danger,.border-accent-danger\/20{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-danger\/20{border-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.border-accent-danger\/30{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-danger\/30{border-color:color-mix(in oklab,var(--accent-danger)30%,transparent)}}.border-accent-danger\/50{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-danger\/50{border-color:color-mix(in oklab,var(--accent-danger)50%,transparent)}}.border-accent-primary,.border-accent-primary\/20{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/20{border-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.border-accent-primary\/30{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/30{border-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.border-accent-primary\/40{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/40{border-color:color-mix(in oklab,var(--accent-primary)40%,transparent)}}.border-accent-primary\/50{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-primary\/50{border-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.border-accent-purple\/30{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.border-accent-purple\/30{border-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.border-accent-red\/50{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.border-accent-red\/50{border-color:color-mix(in oklab,var(--accent-danger)50%,transparent)}}.border-accent-secondary\/20{border-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.border-accent-secondary\/20{border-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.border-accent-secondary\/30{border-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.border-accent-secondary\/30{border-color:color-mix(in oklab,var(--accent-secondary)30%,transparent)}}.border-accent-success\/20{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/20{border-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.border-accent-success\/30{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/30{border-color:color-mix(in oklab,var(--accent-success)30%,transparent)}}.border-accent-success\/40{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/40{border-color:color-mix(in oklab,var(--accent-success)40%,transparent)}}.border-accent-success\/50{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.border-accent-success\/50{border-color:color-mix(in oklab,var(--accent-success)50%,transparent)}}.border-accent-tertiary\/20{border-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.border-accent-tertiary\/20{border-color:color-mix(in oklab,var(--accent-tertiary)20%,transparent)}}.border-accent-tertiary\/30{border-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.border-accent-tertiary\/30{border-color:color-mix(in oklab,var(--accent-tertiary)30%,transparent)}}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.border-black\/10{border-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.border-border-subtle,.border-border-subtle\/30{border-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){.border-border-subtle\/30{border-color:color-mix(in oklab,var(--border-subtle)30%,transparent)}}.border-border-subtle\/50{border-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){.border-border-subtle\/50{border-color:color-mix(in oklab,var(--border-subtle)50%,transparent)}}.border-card{border-color:var(--bg-surface)}.border-current\/30{border-color:currentColor}@supports (color:color-mix(in lab,red,red)){.border-current\/30{border-color:color-mix(in oklab,currentcolor 30%,transparent)}}.border-gray-800{border-color:var(--color-gray-800)}.border-orange-300\/50{border-color:#ffb96d80}@supports (color:color-mix(in lab,red,red)){.border-orange-300\/50{border-color:color-mix(in oklab,var(--color-orange-300)50%,transparent)}}.border-signal-poor\/30{border-color:var(--signal-poor)}@supports (color:color-mix(in lab,red,red)){.border-signal-poor\/30{border-color:color-mix(in oklab,var(--signal-poor)30%,transparent)}}.border-text-muted\/30{border-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.border-text-muted\/30{border-color:color-mix(in oklab,var(--text-muted)30%,transparent)}}.border-toggle-on{border-color:var(--toggle-on)}.border-transparent{border-color:#0000}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/25{border-color:#ffffff40}@supports (color:color-mix(in lab,red,red)){.border-white\/25{border-color:color-mix(in oklab,var(--color-white)25%,transparent)}}.border-white\/\[0\.08\]{border-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.border-white\/\[0\.08\]{border-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.border-t-text-muted{border-top-color:var(--text-muted)}.border-t-transparent{border-top-color:#0000}.border-l-amber-400{border-left-color:var(--color-amber-400)}.bg-\[\#007AFF\]{background-color:#007aff}.bg-\[\#0074BE\]{background-color:#0074be}.bg-\[\#242627\]{background-color:#242627}.bg-\[\#F5F5F5\]{background-color:#f5f5f5}.bg-\[\#FF5F57\]{background-color:#ff5f57}.bg-\[var\(--route-direct\)\]\/20{background-color:var(--route-direct)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--route-direct\)\]\/20{background-color:color-mix(in oklab,var(--route-direct)20%,transparent)}}.bg-\[var\(--route-flood\)\]\/20{background-color:var(--route-flood)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--route-flood\)\]\/20{background-color:color-mix(in oklab,var(--route-flood)20%,transparent)}}.bg-\[var\(--route-transport\)\]\/20{background-color:var(--route-transport)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--route-transport\)\]\/20{background-color:color-mix(in oklab,var(--route-transport)20%,transparent)}}.bg-\[var\(--signal-critical\)\]{background-color:var(--signal-critical)}.bg-\[var\(--signal-excellent\)\]{background-color:var(--signal-excellent)}.bg-\[var\(--signal-fair\)\]{background-color:var(--signal-fair)}.bg-\[var\(--signal-good\)\]{background-color:var(--signal-good)}.bg-\[var\(--signal-poor\)\]{background-color:var(--signal-poor)}.bg-\[var\(--signal-unknown\)\]{background-color:var(--signal-unknown)}.bg-accent-danger,.bg-accent-danger\/10{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-danger\/10{background-color:color-mix(in oklab,var(--accent-danger)10%,transparent)}}.bg-accent-danger\/15{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-danger\/15{background-color:color-mix(in oklab,var(--accent-danger)15%,transparent)}}.bg-accent-danger\/20{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-danger\/20{background-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.bg-accent-primary,.bg-accent-primary\/5{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/5{background-color:color-mix(in oklab,var(--accent-primary)5%,transparent)}}.bg-accent-primary\/10{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/10{background-color:color-mix(in oklab,var(--accent-primary)10%,transparent)}}.bg-accent-primary\/15{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/15{background-color:color-mix(in oklab,var(--accent-primary)15%,transparent)}}.bg-accent-primary\/20{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/20{background-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.bg-accent-primary\/25{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/25{background-color:color-mix(in oklab,var(--accent-primary)25%,transparent)}}.bg-accent-primary\/30{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/30{background-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.bg-accent-primary\/40{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/40{background-color:color-mix(in oklab,var(--accent-primary)40%,transparent)}}.bg-accent-primary\/60{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/60{background-color:color-mix(in oklab,var(--accent-primary)60%,transparent)}}.bg-accent-primary\/90{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-primary\/90{background-color:color-mix(in oklab,var(--accent-primary)90%,transparent)}}.bg-accent-purple\/30{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-purple\/30{background-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.bg-accent-red\/10{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.bg-accent-red\/10{background-color:color-mix(in oklab,var(--accent-danger)10%,transparent)}}.bg-accent-secondary,.bg-accent-secondary\/5{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/5{background-color:color-mix(in oklab,var(--accent-secondary)5%,transparent)}}.bg-accent-secondary\/10{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/10{background-color:color-mix(in oklab,var(--accent-secondary)10%,transparent)}}.bg-accent-secondary\/15{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/15{background-color:color-mix(in oklab,var(--accent-secondary)15%,transparent)}}.bg-accent-secondary\/20{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-secondary\/20{background-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.bg-accent-success,.bg-accent-success\/10{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.bg-accent-success\/10{background-color:color-mix(in oklab,var(--accent-success)10%,transparent)}}.bg-accent-success\/15{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.bg-accent-success\/15{background-color:color-mix(in oklab,var(--accent-success)15%,transparent)}}.bg-accent-success\/20{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.bg-accent-success\/20{background-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.bg-accent-tertiary,.bg-accent-tertiary\/5{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/5{background-color:color-mix(in oklab,var(--accent-tertiary)5%,transparent)}}.bg-accent-tertiary\/10{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/10{background-color:color-mix(in oklab,var(--accent-tertiary)10%,transparent)}}.bg-accent-tertiary\/15{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/15{background-color:color-mix(in oklab,var(--accent-tertiary)15%,transparent)}}.bg-accent-tertiary\/20{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-accent-tertiary\/20{background-color:color-mix(in oklab,var(--accent-tertiary)20%,transparent)}}.bg-amber-400\/5{background-color:#fcbb000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/5{background-color:color-mix(in oklab,var(--color-amber-400)5%,transparent)}}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500)15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-amber-600{background-color:var(--color-amber-600)}.bg-bg-0{background-color:var(--palette-bg-0)}.bg-bg-1{background-color:var(--palette-bg-1)}.bg-bg-body,.bg-bg-body\/50{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.bg-bg-body\/50{background-color:color-mix(in oklab,var(--bg-body)50%,transparent)}}.bg-bg-elevated,.bg-bg-elevated\/20{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/20{background-color:color-mix(in oklab,var(--bg-elevated)20%,transparent)}}.bg-bg-elevated\/50{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/50{background-color:color-mix(in oklab,var(--bg-elevated)50%,transparent)}}.bg-bg-elevated\/80{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/80{background-color:color-mix(in oklab,var(--bg-elevated)80%,transparent)}}.bg-bg-elevated\/90{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/90{background-color:color-mix(in oklab,var(--bg-elevated)90%,transparent)}}.bg-bg-elevated\/95{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-bg-elevated\/95{background-color:color-mix(in oklab,var(--bg-elevated)95%,transparent)}}.bg-bg-subtle,.bg-bg-subtle\/30{background-color:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-bg-subtle\/30{background-color:color-mix(in oklab,var(--bg-subtle)30%,transparent)}}.bg-bg-subtle\/50{background-color:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-bg-subtle\/50{background-color:color-mix(in oklab,var(--bg-subtle)50%,transparent)}}.bg-bg-surface,.bg-bg-surface\/80{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.bg-bg-surface\/80{background-color:color-mix(in oklab,var(--bg-surface)80%,transparent)}}.bg-bg-surface\/85{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.bg-bg-surface\/85{background-color:color-mix(in oklab,var(--bg-surface)85%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-border-subtle,.bg-border-subtle\/50{background-color:var(--border-subtle)}@supports (color:color-mix(in lab,red,red)){.bg-border-subtle\/50{background-color:color-mix(in oklab,var(--border-subtle)50%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500)15%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500)10%,transparent)}}.bg-signal-excellent\/10{background-color:var(--signal-excellent)}@supports (color:color-mix(in lab,red,red)){.bg-signal-excellent\/10{background-color:color-mix(in oklab,var(--signal-excellent)10%,transparent)}}.bg-signal-fair\/10{background-color:var(--signal-fair)}@supports (color:color-mix(in lab,red,red)){.bg-signal-fair\/10{background-color:color-mix(in oklab,var(--signal-fair)10%,transparent)}}.bg-signal-good\/10{background-color:var(--signal-good)}@supports (color:color-mix(in lab,red,red)){.bg-signal-good\/10{background-color:color-mix(in oklab,var(--signal-good)10%,transparent)}}.bg-signal-poor,.bg-signal-poor\/10{background-color:var(--signal-poor)}@supports (color:color-mix(in lab,red,red)){.bg-signal-poor\/10{background-color:color-mix(in oklab,var(--signal-poor)10%,transparent)}}.bg-sky-500\/15{background-color:#00a5ef26}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/15{background-color:color-mix(in oklab,var(--color-sky-500)15%,transparent)}}.bg-subtle-fill{background-color:var(--subtle-fill)}.bg-subtle-fill-hover{background-color:var(--subtle-fill-hover)}.bg-subtle-fill-strong{background-color:var(--subtle-fill-strong)}.bg-subtle-fill\/50{background-color:var(--subtle-fill)}@supports (color:color-mix(in lab,red,red)){.bg-subtle-fill\/50{background-color:color-mix(in oklab,var(--subtle-fill)50%,transparent)}}.bg-sys-amber,.bg-sys-amber\/20{background-color:var(--sys-amber)}@supports (color:color-mix(in lab,red,red)){.bg-sys-amber\/20{background-color:color-mix(in oklab,var(--sys-amber)20%,transparent)}}.bg-sys-cyan\/20{background-color:var(--sys-cyan)}@supports (color:color-mix(in lab,red,red)){.bg-sys-cyan\/20{background-color:color-mix(in oklab,var(--sys-cyan)20%,transparent)}}.bg-sys-green{background-color:var(--sys-green)}.bg-sys-indigo\/20{background-color:var(--sys-indigo)}@supports (color:color-mix(in lab,red,red)){.bg-sys-indigo\/20{background-color:color-mix(in oklab,var(--sys-indigo)20%,transparent)}}.bg-sys-orange{background-color:var(--sys-orange)}.bg-sys-red,.bg-sys-red\/15{background-color:var(--sys-red)}@supports (color:color-mix(in lab,red,red)){.bg-sys-red\/15{background-color:color-mix(in oklab,var(--sys-red)15%,transparent)}}.bg-sys-teal,.bg-sys-teal\/15{background-color:var(--sys-teal)}@supports (color:color-mix(in lab,red,red)){.bg-sys-teal\/15{background-color:color-mix(in oklab,var(--sys-teal)15%,transparent)}}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/10{background-color:color-mix(in oklab,var(--color-teal-500)10%,transparent)}}.bg-text-muted,.bg-text-muted\/15{background-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.bg-text-muted\/15{background-color:color-mix(in oklab,var(--text-muted)15%,transparent)}}.bg-text-muted\/20{background-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.bg-text-muted\/20{background-color:color-mix(in oklab,var(--text-muted)20%,transparent)}}.bg-text-muted\/30{background-color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.bg-text-muted\/30{background-color:color-mix(in oklab,var(--text-muted)30%,transparent)}}.bg-toggle-off{background-color:var(--toggle-off)}.bg-toggle-on{background-color:var(--toggle-on)}.bg-tooltip-bg,.bg-tooltip-bg\/80{background-color:var(--tooltip-bg)}@supports (color:color-mix(in lab,red,red)){.bg-tooltip-bg\/80{background-color:color-mix(in oklab,var(--tooltip-bg)80%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500)5%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500)15%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.bg-white\/30{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-white)2%,transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white)3%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.bg-white\/\[0\.08\]{background-color:#ffffff14}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.08\]{background-color:color-mix(in oklab,var(--color-white)8%,transparent)}}.bg-white\/\[0\.15\]{background-color:#ffffff26}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.15\]{background-color:color-mix(in oklab,var(--color-white)15%,transparent)}}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.bg-zinc-500\/10{background-color:#71717b1a}@supports (color:color-mix(in lab,red,red)){.bg-zinc-500\/10{background-color:color-mix(in oklab,var(--color-zinc-500)10%,transparent)}}.bg-zinc-500\/15{background-color:#71717b26}@supports (color:color-mix(in lab,red,red)){.bg-zinc-500\/15{background-color:color-mix(in oklab,var(--color-zinc-500)15%,transparent)}}.bg-zinc-600{background-color:var(--color-zinc-600)}.bg-zinc-600\/40{background-color:#52525c66}@supports (color:color-mix(in lab,red,red)){.bg-zinc-600\/40{background-color:color-mix(in oklab,var(--color-zinc-600)40%,transparent)}}.bg-zinc-700\/50{background-color:#3f3f4680}@supports (color:color-mix(in lab,red,red)){.bg-zinc-700\/50{background-color:color-mix(in oklab,var(--color-zinc-700)50%,transparent)}}.bg-zinc-900\/20{background-color:#18181b33}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/20{background-color:color-mix(in oklab,var(--color-zinc-900)20%,transparent)}}.bg-gradient-to-l{--tw-gradient-position:to left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-sys-amber\/15{--tw-gradient-from:var(--sys-amber)}@supports (color:color-mix(in lab,red,red)){.from-sys-amber\/15{--tw-gradient-from:color-mix(in oklab,var(--sys-amber)15%,transparent)}}.from-sys-amber\/15{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-cover{background-size:cover}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.fill-accent-success{fill:var(--accent-success)}.fill-text-secondary{fill:var(--text-secondary)}.stroke-current{stroke:currentColor}.stroke-white{stroke:var(--color-white)}.object-cover{object-fit:cover}.\!p-0{padding:calc(var(--spacing)*0)!important}.\!p-1\.5{padding:calc(var(--spacing)*1.5)!important}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-12{padding:calc(var(--spacing)*12)}.\!px-1{padding-inline:calc(var(--spacing)*1)!important}.\!px-1\.5{padding-inline:calc(var(--spacing)*1.5)!important}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-3\.5{padding-inline:calc(var(--spacing)*3.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.\!py-0{padding-block:calc(var(--spacing)*0)!important}.\!py-0\.5{padding-block:calc(var(--spacing)*.5)!important}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-14{padding-block:calc(var(--spacing)*14)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-0\.5{padding-top:calc(var(--spacing)*.5)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-1\.5{padding-top:calc(var(--spacing)*1.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-1\.5{padding-right:calc(var(--spacing)*1.5)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-2\.5{padding-right:calc(var(--spacing)*2.5)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-10{padding-right:calc(var(--spacing)*10)}.pr-12{padding-right:calc(var(--spacing)*12)}.pb-0\.5{padding-bottom:calc(var(--spacing)*.5)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-5{padding-left:calc(var(--spacing)*5)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-11{padding-left:calc(var(--spacing)*11)}.text-center{text-align:center}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:var(--font-data)}.font-sans{font-family:var(--font-display)}.\!text-xs{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm\/6{font-size:var(--text-sm);line-height:calc(var(--spacing)*6)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\!text-\[8px\]{font-size:8px!important}.\!text-\[9px\]{font-size:9px!important}.\!text-\[10px\]{font-size:10px!important}.text-\[0\.6em\]{font-size:.6em}.text-\[0\.625rem\]{font-size:.625rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[1\.5em\]{font-size:1.5em}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[20px\]{font-size:20px}.\!leading-none{--tw-leading:1!important;line-height:1!important}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#2D2D2D\]{color:#2d2d2d}.text-\[\#4A0000\]{color:#4a0000}.text-\[\#58b99d\]{color:#58b99d}.text-\[var\(--pkt-ack\)\]{color:var(--pkt-ack)}.text-\[var\(--pkt-advert\)\]{color:var(--pkt-advert)}.text-\[var\(--pkt-anon\)\]{color:var(--pkt-anon)}.text-\[var\(--pkt-flood\)\]{color:var(--pkt-flood)}.text-\[var\(--pkt-grp-data\)\]{color:var(--pkt-grp-data)}.text-\[var\(--pkt-grp-txt\)\]{color:var(--pkt-grp-txt)}.text-\[var\(--pkt-path\)\]{color:var(--pkt-path)}.text-\[var\(--pkt-req\)\]{color:var(--pkt-req)}.text-\[var\(--pkt-response\)\]{color:var(--pkt-response)}.text-\[var\(--pkt-trace\)\]{color:var(--pkt-trace)}.text-\[var\(--pkt-txt-msg\)\]{color:var(--pkt-txt-msg)}.text-\[var\(--pkt-unknown\)\]{color:var(--pkt-unknown)}.text-\[var\(--route-direct\)\]{color:var(--route-direct)}.text-\[var\(--route-flood\)\]{color:var(--route-flood)}.text-\[var\(--route-transport\)\]{color:var(--route-transport)}.text-\[var\(--signal-fair\)\]{color:var(--signal-fair)}.text-\[var\(--status-warning\)\]{color:var(--status-warning)}.text-accent-danger{color:var(--accent-danger)}.text-accent-primary,.text-accent-purple{color:var(--accent-primary)}.text-accent-red{color:var(--accent-danger)}.text-accent-secondary{color:var(--accent-secondary)}.text-accent-success{color:var(--accent-success)}.text-accent-tertiary{color:var(--accent-tertiary)}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/60{color:#fcbb0099}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/60{color:color-mix(in oklab,var(--color-amber-400)60%,transparent)}}.text-amber-400\/70{color:#fcbb00b3}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/70{color:color-mix(in oklab,var(--color-amber-400)70%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-bg-body{color:var(--bg-body)}.text-black{color:var(--color-black)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-border-subtle{color:var(--border-subtle)}.text-emerald-400{color:var(--color-emerald-400)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-green-400{color:var(--color-green-400)}.text-icon-card-title{color:var(--icon-card-title)}.text-icon-page-title{color:var(--icon-page-title)}.text-icon-widget{color:var(--icon-widget)}.text-map-neighbor-color{color:var(--map-neighbor-color)}.text-primary{color:var(--accent-tertiary)}.text-purple-600{color:var(--color-purple-600)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-secondary{color:var(--accent-secondary)}.text-signal-critical{color:var(--signal-critical)}.text-signal-excellent{color:var(--signal-excellent)}.text-signal-fair{color:var(--signal-fair)}.text-signal-good{color:var(--signal-good)}.text-signal-poor{color:var(--signal-poor)}.text-sky-400{color:var(--color-sky-400)}.text-sys-amber{color:var(--sys-amber)}.text-sys-brown{color:var(--sys-brown)}.text-sys-cyan{color:var(--sys-cyan)}.text-sys-green{color:var(--sys-green)}.text-sys-indigo{color:var(--sys-indigo)}.text-sys-pink{color:var(--sys-pink)}.text-sys-purple{color:var(--sys-purple)}.text-sys-red{color:var(--sys-red)}.text-sys-teal{color:var(--sys-teal)}.text-teal-400{color:var(--color-teal-400)}.text-teal-600{color:var(--color-teal-600)}.text-text-muted,.text-text-muted\/40{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/40{color:color-mix(in oklab,var(--text-muted)40%,transparent)}}.text-text-muted\/50{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/50{color:color-mix(in oklab,var(--text-muted)50%,transparent)}}.text-text-muted\/60{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/60{color:color-mix(in oklab,var(--text-muted)60%,transparent)}}.text-text-muted\/70{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/70{color:color-mix(in oklab,var(--text-muted)70%,transparent)}}.text-text-muted\/80{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/80{color:color-mix(in oklab,var(--text-muted)80%,transparent)}}.text-text-primary{color:var(--text-primary)}.text-text-secondary,.text-text-secondary\/60{color:var(--text-secondary)}@supports (color:color-mix(in lab,red,red)){.text-text-secondary\/60{color:color-mix(in oklab,var(--text-secondary)60%,transparent)}}.text-transparent{color:#0000}.text-violet-400{color:var(--color-violet-400)}.text-violet-400\/70{color:#a685ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-400\/70{color:color-mix(in oklab,var(--color-violet-400)70%,transparent)}}.text-white{color:var(--color-white)}.text-white\/20{color:#fff3}@supports (color:color-mix(in lab,red,red)){.text-white\/20{color:color-mix(in oklab,var(--color-white)20%,transparent)}}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.text-white\/30{color:color-mix(in oklab,var(--color-white)30%,transparent)}}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab,red,red)){.text-white\/40{color:color-mix(in oklab,var(--color-white)40%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-900{color:var(--color-zinc-900)}.text-zinc-900\/70{color:#18181bb3}@supports (color:color-mix(in lab,red,red)){.text-zinc-900\/70{color:color-mix(in oklab,var(--color-zinc-900)70%,transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.placeholder-text-muted::placeholder{color:var(--text-muted)}.accent-accent-purple{accent-color:var(--accent-primary)}.accent-primary{accent-color:var(--accent-tertiary)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow\!{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[1\.5px\]{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1.5px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[\#E0443E\]{--tw-ring-color:#e0443e}.ring-accent-danger{--tw-ring-color:var(--accent-danger)}.ring-accent-primary,.ring-accent-primary\/20{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.ring-accent-primary\/20{--tw-ring-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.ring-accent-primary\/30{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.ring-accent-primary\/30{--tw-ring-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.ring-accent-primary\/40{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.ring-accent-primary\/40{--tw-ring-color:color-mix(in oklab,var(--accent-primary)40%,transparent)}}.ring-accent-primary\/50{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.ring-accent-primary\/50{--tw-ring-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.ring-accent-success{--tw-ring-color:var(--accent-success)}.ring-amber-500\/30{--tw-ring-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.ring-amber-500\/30{--tw-ring-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.ring-border-subtle{--tw-ring-color:var(--border-subtle)}.ring-sys-amber\/50{--tw-ring-color:var(--sys-amber)}@supports (color:color-mix(in lab,red,red)){.ring-sys-amber\/50{--tw-ring-color:color-mix(in oklab,var(--sys-amber)50%,transparent)}}.ring-sys-cyan\/50{--tw-ring-color:var(--sys-cyan)}@supports (color:color-mix(in lab,red,red)){.ring-sys-cyan\/50{--tw-ring-color:color-mix(in oklab,var(--sys-cyan)50%,transparent)}}.ring-sys-red\/25{--tw-ring-color:var(--sys-red)}@supports (color:color-mix(in lab,red,red)){.ring-sys-red\/25{--tw-ring-color:color-mix(in oklab,var(--sys-red)25%,transparent)}}.ring-sys-teal\/25{--tw-ring-color:var(--sys-teal)}@supports (color:color-mix(in lab,red,red)){.ring-sys-teal\/25{--tw-ring-color:color-mix(in oklab,var(--sys-teal)25%,transparent)}}.ring-white\/5{--tw-ring-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.ring-white\/5{--tw-ring-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.ring-white\/10{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.ring-white\/10{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.ring-white\/40{--tw-ring-color:#fff6}@supports (color:color-mix(in lab,red,red)){.ring-white\/40{--tw-ring-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.ring-white\/\[0\.1\]{--tw-ring-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.ring-white\/\[0\.1\]{--tw-ring-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.ring-white\/\[0\.06\]{--tw-ring-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.ring-white\/\[0\.06\]{--tw-ring-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.ring-zinc-600\/50{--tw-ring-color:#52525c80}@supports (color:color-mix(in lab,red,red)){.ring-zinc-600\/50{--tw-ring-color:color-mix(in oklab,var(--color-zinc-600)50%,transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a))drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a)drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-lg{--tw-drop-shadow-size:drop-shadow(0 4px 4px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{--tw-ease:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}:is(.\*\:w-full>*){width:100%}@media(hover:hover){.group-hover\:inline-block:is(:where(.group):hover *){display:inline-block}.group-hover\:text-accent-purple:is(:where(.group):hover *){color:var(--accent-primary)}.group-hover\:text-text-secondary:is(:where(.group):hover *){color:var(--text-secondary)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/tip\:visible:is(:where(.group\/tip):hover *){visibility:visible}.group-hover\/tip\:opacity-100:is(:where(.group\/tip):hover *){opacity:1}}.group-has-\[\:disabled\]\:stroke-gray-950\/25:is(:where(.group):has(:disabled) *){stroke:#03071240}@supports (color:color-mix(in lab,red,red)){.group-has-\[\:disabled\]\:stroke-gray-950\/25:is(:where(.group):has(:disabled) *){stroke:color-mix(in oklab,var(--color-gray-950)25%,transparent)}}.group-data-\[open\]\:rotate-180:is(:where(.group)[data-open] *){rotate:180deg}.selection\:bg-transparent ::selection{background-color:#0000}.selection\:bg-transparent::selection{background-color:#0000}.placeholder\:font-normal::placeholder{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.placeholder\:text-text-muted::placeholder,.placeholder\:text-text-muted\/50::placeholder{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-text-muted\/50::placeholder{color:color-mix(in oklab,var(--text-muted)50%,transparent)}}.placeholder\:text-text-muted\/60::placeholder{color:var(--text-muted)}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-text-muted\/60::placeholder{color:color-mix(in oklab,var(--text-muted)60%,transparent)}}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:-inset-px:before{content:var(--tw-content);top:-1px;right:-1px;bottom:-1px;left:-1px}.before\:rounded-lg:before{content:var(--tw-content);border-radius:12px}.before\:bg-white\/5:before{content:var(--tw-content);background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.before\:bg-white\/5:before{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-accent-danger\/50:hover{border-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-danger\/50:hover{border-color:color-mix(in oklab,var(--accent-danger)50%,transparent)}}.hover\:border-accent-primary\/30:hover{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-primary\/30:hover{border-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.hover\:border-accent-primary\/50:hover{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-primary\/50:hover{border-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.hover\:border-accent-secondary\/50:hover{border-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-secondary\/50:hover{border-color:color-mix(in oklab,var(--accent-secondary)50%,transparent)}}.hover\:border-accent-success\/50:hover{border-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent-success\/50:hover{border-color:color-mix(in oklab,var(--accent-success)50%,transparent)}}.hover\:border-border-strong:hover{border-color:var(--border-strong)}.hover\:bg-\[\#FF6961\]:hover{background-color:#ff6961}.hover\:bg-accent-danger\/10:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/10:hover{background-color:color-mix(in oklab,var(--accent-danger)10%,transparent)}}.hover\:bg-accent-danger\/20:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/20:hover{background-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.hover\:bg-accent-danger\/30:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/30:hover{background-color:color-mix(in oklab,var(--accent-danger)30%,transparent)}}.hover\:bg-accent-danger\/90:hover{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-danger\/90:hover{background-color:color-mix(in oklab,var(--accent-danger)90%,transparent)}}.hover\:bg-accent-primary:hover,.hover\:bg-accent-primary\/10:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/10:hover{background-color:color-mix(in oklab,var(--accent-primary)10%,transparent)}}.hover\:bg-accent-primary\/20:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/20:hover{background-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.hover\:bg-accent-primary\/30:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/30:hover{background-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.hover\:bg-accent-primary\/80:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/80:hover{background-color:color-mix(in oklab,var(--accent-primary)80%,transparent)}}.hover\:bg-accent-primary\/90:hover{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-primary\/90:hover{background-color:color-mix(in oklab,var(--accent-primary)90%,transparent)}}.hover\:bg-accent-secondary\/10:hover{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-secondary\/10:hover{background-color:color-mix(in oklab,var(--accent-secondary)10%,transparent)}}.hover\:bg-accent-secondary\/20:hover{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-secondary\/20:hover{background-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.hover\:bg-accent-secondary\/90:hover{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-secondary\/90:hover{background-color:color-mix(in oklab,var(--accent-secondary)90%,transparent)}}.hover\:bg-accent-success\/10:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/10:hover{background-color:color-mix(in oklab,var(--accent-success)10%,transparent)}}.hover\:bg-accent-success\/20:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/20:hover{background-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.hover\:bg-accent-success\/80:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/80:hover{background-color:color-mix(in oklab,var(--accent-success)80%,transparent)}}.hover\:bg-accent-success\/90:hover{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-success\/90:hover{background-color:color-mix(in oklab,var(--accent-success)90%,transparent)}}.hover\:bg-accent-tertiary\/10:hover{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-tertiary\/10:hover{background-color:color-mix(in oklab,var(--accent-tertiary)10%,transparent)}}.hover\:bg-accent-tertiary\/20:hover{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-tertiary\/20:hover{background-color:color-mix(in oklab,var(--accent-tertiary)20%,transparent)}}.hover\:bg-accent-tertiary\/25:hover{background-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent-tertiary\/25:hover{background-color:color-mix(in oklab,var(--accent-tertiary)25%,transparent)}}.hover\:bg-amber-400\/10:hover{background-color:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-400\/10:hover{background-color:color-mix(in oklab,var(--color-amber-400)10%,transparent)}}.hover\:bg-amber-500:hover{background-color:var(--color-amber-500)}.hover\:bg-bg-elevated:hover,.hover\:bg-bg-elevated\/50:hover{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bg-elevated\/50:hover{background-color:color-mix(in oklab,var(--bg-elevated)50%,transparent)}}.hover\:bg-bg-subtle:hover{background-color:var(--bg-subtle)}.hover\:bg-bg-surface:hover{background-color:var(--bg-surface)}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.hover\:bg-signal-fair\/10:hover{background-color:var(--signal-fair)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-signal-fair\/10:hover{background-color:color-mix(in oklab,var(--signal-fair)10%,transparent)}}.hover\:bg-subtle-fill:hover{background-color:var(--subtle-fill)}.hover\:bg-subtle-fill-hover:hover{background-color:var(--subtle-fill-hover)}.hover\:bg-subtle-fill-strong:hover{background-color:var(--subtle-fill-strong)}.hover\:bg-subtle-fill\/30:hover{background-color:var(--subtle-fill)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-subtle-fill\/30:hover{background-color:color-mix(in oklab,var(--subtle-fill)30%,transparent)}}.hover\:bg-tooltip-bg:hover{background-color:var(--tooltip-bg)}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\:bg-white\/\[0\.02\]:hover{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.02\]:hover{background-color:color-mix(in oklab,var(--color-white)2%,transparent)}}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab,var(--color-white)3%,transparent)}}.hover\:bg-zinc-500:hover{background-color:var(--color-zinc-500)}.hover\:bg-zinc-900\/20:hover{background-color:#18181b33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-900\/20:hover{background-color:color-mix(in oklab,var(--color-zinc-900)20%,transparent)}}.hover\:bg-zinc-900\/30:hover{background-color:#18181b4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-900\/30:hover{background-color:color-mix(in oklab,var(--color-zinc-900)30%,transparent)}}.hover\:text-accent-danger:hover{color:var(--accent-danger)}.hover\:text-accent-primary:hover,.hover\:text-accent-primary\/80:hover{color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:text-accent-primary\/80:hover{color:color-mix(in oklab,var(--accent-primary)80%,transparent)}}.hover\:text-accent-secondary:hover{color:var(--accent-secondary)}.hover\:text-accent-tertiary:hover{color:var(--accent-tertiary)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-signal-critical\/80:hover{color:var(--signal-critical)}@supports (color:color-mix(in lab,red,red)){.hover\:text-signal-critical\/80:hover{color:color-mix(in oklab,var(--signal-critical)80%,transparent)}}.hover\:text-text-primary:hover{color:var(--text-primary)}.hover\:text-text-secondary:hover{color:var(--text-secondary)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-300:hover{color:var(--color-zinc-300)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-100:hover{opacity:1}.hover\:ring-accent-primary\/30:hover{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:ring-accent-primary\/30:hover{--tw-ring-color:color-mix(in oklab,var(--accent-primary)30%,transparent)}}.hover\:ring-accent-primary\/50:hover{--tw-ring-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.hover\:ring-accent-primary\/50:hover{--tw-ring-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.focus\:border-accent-primary\/50:focus{border-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.focus\:border-accent-primary\/50:focus{border-color:color-mix(in oklab,var(--accent-primary)50%,transparent)}}.focus\:border-zinc-500:focus{border-color:var(--color-zinc-500)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-accent-primary:focus{--tw-ring-color:var(--accent-primary)}.focus\:ring-accent-tertiary\/50:focus{--tw-ring-color:var(--accent-tertiary)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-accent-tertiary\/50:focus{--tw-ring-color:color-mix(in oklab,var(--accent-tertiary)50%,transparent)}}.focus\:ring-signal-fair\/50:focus{--tw-ring-color:var(--signal-fair)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-signal-fair\/50:focus{--tw-ring-color:color-mix(in oklab,var(--signal-fair)50%,transparent)}}.focus\:ring-white\/30:focus{--tw-ring-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.focus\:ring-white\/30:focus{--tw-ring-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.focus\:ring-offset-bg-elevated:focus{--tw-ring-offset-color:var(--bg-elevated)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[\#FF5F57\]:focus-visible{--tw-ring-color:#ff5f57}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-accent-primary:focus-visible{outline-color:var(--accent-primary)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-\[\#E04840\]:active{background-color:#e04840}.active\:bg-accent-danger\/20:active{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-danger\/20:active{background-color:color-mix(in oklab,var(--accent-danger)20%,transparent)}}.active\:bg-accent-danger\/80:active{background-color:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-danger\/80:active{background-color:color-mix(in oklab,var(--accent-danger)80%,transparent)}}.active\:bg-accent-primary\/20:active{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-primary\/20:active{background-color:color-mix(in oklab,var(--accent-primary)20%,transparent)}}.active\:bg-accent-primary\/70:active{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-primary\/70:active{background-color:color-mix(in oklab,var(--accent-primary)70%,transparent)}}.active\:bg-accent-primary\/80:active{background-color:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-primary\/80:active{background-color:color-mix(in oklab,var(--accent-primary)80%,transparent)}}.active\:bg-accent-secondary\/20:active{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-secondary\/20:active{background-color:color-mix(in oklab,var(--accent-secondary)20%,transparent)}}.active\:bg-accent-secondary\/80:active{background-color:var(--accent-secondary)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-secondary\/80:active{background-color:color-mix(in oklab,var(--accent-secondary)80%,transparent)}}.active\:bg-accent-success\/20:active{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-success\/20:active{background-color:color-mix(in oklab,var(--accent-success)20%,transparent)}}.active\:bg-accent-success\/70:active{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-success\/70:active{background-color:color-mix(in oklab,var(--accent-success)70%,transparent)}}.active\:bg-accent-success\/80:active{background-color:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.active\:bg-accent-success\/80:active{background-color:color-mix(in oklab,var(--accent-success)80%,transparent)}}.active\:bg-amber-700:active{background-color:var(--color-amber-700)}.active\:bg-bg-elevated:active,.active\:bg-bg-elevated\/70:active{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.active\:bg-bg-elevated\/70:active{background-color:color-mix(in oklab,var(--bg-elevated)70%,transparent)}}.active\:bg-bg-surface:active{background-color:var(--bg-surface)}.active\:bg-subtle-fill:active{background-color:var(--subtle-fill)}.active\:bg-subtle-fill-strong:active{background-color:var(--subtle-fill-strong)}.active\:bg-tooltip-bg:active{background-color:var(--tooltip-bg)}.active\:bg-white\/5:active{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.active\:bg-white\/5:active{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.active\:bg-white\/\[0\.04\]:active{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.active\:bg-white\/\[0\.04\]:active{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.active\:text-blue-300:active{color:var(--color-blue-300)}.active\:brightness-90:active{--tw-brightness:brightness(90%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.data-\[closed\]\:opacity-0[data-closed]{opacity:0}.data-\[enter\]\:duration-150[data-enter]{--tw-duration:.15s;transition-duration:.15s}.data-\[leave\]\:duration-100[data-leave]{--tw-duration:.1s;transition-duration:.1s}@media(min-width:520px){.min-\[520px\]\:inline{display:inline}}@media(min-width:600px){.min-\[600px\]\:hidden{display:none}.min-\[600px\]\:inline-flex{display:inline-flex}.min-\[600px\]\:gap-1\.5{gap:calc(var(--spacing)*1.5)}.min-\[600px\]\:gap-3{gap:calc(var(--spacing)*3)}.min-\[600px\]\:px-3{padding-inline:calc(var(--spacing)*3)}.min-\[600px\]\:py-2\.5{padding-block:calc(var(--spacing)*2.5)}.min-\[600px\]\:text-\[11px\]{font-size:11px}}@media(min-width:900px){.min-\[900px\]\:block{display:block}.min-\[900px\]\:gap-2{gap:calc(var(--spacing)*2)}}@media(min-width:40rem){.sm\:top-4{top:calc(var(--spacing)*4)}.sm\:top-11{top:calc(var(--spacing)*11)}.sm\:right-3{right:calc(var(--spacing)*3)}.sm\:right-4{right:calc(var(--spacing)*4)}.sm\:bottom-16{bottom:calc(var(--spacing)*16)}.sm\:left-auto{left:auto}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:-mx-6{margin-inline:calc(var(--spacing)*-6)}.sm\:mt-1{margin-top:calc(var(--spacing)*1)}.sm\:mt-2{margin-top:calc(var(--spacing)*2)}.sm\:mt-4{margin-top:calc(var(--spacing)*4)}.sm\:-mb-6{margin-bottom:calc(var(--spacing)*-6)}.sm\:mb-1{margin-bottom:calc(var(--spacing)*1)}.sm\:mb-2{margin-bottom:calc(var(--spacing)*2)}.sm\:mb-3{margin-bottom:calc(var(--spacing)*3)}.sm\:-ml-px{margin-left:-1px}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:aspect-\[4\/3\]{aspect-ratio:4/3}.sm\:h-3{height:calc(var(--spacing)*3)}.sm\:h-3\.5{height:calc(var(--spacing)*3.5)}.sm\:h-4{height:calc(var(--spacing)*4)}.sm\:h-6{height:calc(var(--spacing)*6)}.sm\:h-\[85vh\]{height:85vh}.sm\:h-\[500px\]{height:500px}.sm\:max-h-96{max-height:calc(var(--spacing)*96)}.sm\:max-h-\[600px\]{max-height:600px}.sm\:max-h-\[800px\]{max-height:800px}.sm\:max-h-\[calc\(100vh-180px\)\]{max-height:calc(100vh - 180px)}.sm\:max-h-\[calc\(100vh-250px\)\]{max-height:calc(100vh - 250px)}.sm\:min-h-0{min-height:calc(var(--spacing)*0)}.sm\:min-h-\[60px\]{min-height:60px}.sm\:w-3{width:calc(var(--spacing)*3)}.sm\:w-3\.5{width:calc(var(--spacing)*3.5)}.sm\:w-4{width:calc(var(--spacing)*4)}.sm\:w-6{width:calc(var(--spacing)*6)}.sm\:w-14{width:calc(var(--spacing)*14)}.sm\:w-16{width:calc(var(--spacing)*16)}.sm\:w-28{width:calc(var(--spacing)*28)}.sm\:w-48{width:calc(var(--spacing)*48)}.sm\:w-64{width:calc(var(--spacing)*64)}.sm\:w-\[320px\]{width:320px}.sm\:w-auto{width:auto}.sm\:max-w-2xl{max-width:var(--container-2xl)}.sm\:max-w-3xl{max-width:var(--container-3xl)}.sm\:max-w-4xl{max-width:var(--container-4xl)}.sm\:max-w-5xl{max-width:var(--container-5xl)}.sm\:max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:max-w-md{max-width:var(--container-md)}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:max-w-xl{max-width:var(--container-xl)}.sm\:max-w-xs{max-width:var(--container-xs)}.sm\:min-w-0{min-width:calc(var(--spacing)*0)}.sm\:min-w-\[700px\]{min-width:700px}.sm\:flex-initial{flex:0 auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[280px_minmax\(400px\,1fr\)\]{grid-template-columns:280px minmax(400px,1fr)}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-1{gap:calc(var(--spacing)*1)}.sm\:gap-1\.5{gap:calc(var(--spacing)*1.5)}.sm\:gap-2{gap:calc(var(--spacing)*2)}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:gap-4{gap:calc(var(--spacing)*4)}.sm\:gap-6{gap:calc(var(--spacing)*6)}.sm\:gap-8{gap:calc(var(--spacing)*8)}:where(.sm\:space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}.sm\:gap-x-3{column-gap:calc(var(--spacing)*3)}.sm\:gap-y-0\.5{row-gap:calc(var(--spacing)*.5)}.sm\:self-auto{align-self:auto}.sm\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.sm\:\!p-0\.5{padding:calc(var(--spacing)*.5)!important}.sm\:p-1\.5{padding:calc(var(--spacing)*1.5)}.sm\:p-2{padding:calc(var(--spacing)*2)}.sm\:p-4{padding:calc(var(--spacing)*4)}.sm\:p-5{padding:calc(var(--spacing)*5)}.sm\:px-2{padding-inline:calc(var(--spacing)*2)}.sm\:px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.sm\:px-4{padding-inline:calc(var(--spacing)*4)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:py-1{padding-block:calc(var(--spacing)*1)}.sm\:py-1\.5{padding-block:calc(var(--spacing)*1.5)}.sm\:py-2{padding-block:calc(var(--spacing)*2)}.sm\:py-3{padding-block:calc(var(--spacing)*3)}.sm\:py-4{padding-block:calc(var(--spacing)*4)}.sm\:pt-0{padding-top:calc(var(--spacing)*0)}.sm\:pt-2{padding-top:calc(var(--spacing)*2)}.sm\:pt-4{padding-top:calc(var(--spacing)*4)}.sm\:pr-2{padding-right:calc(var(--spacing)*2)}.sm\:pr-6{padding-right:calc(var(--spacing)*6)}.sm\:pb-4{padding-bottom:calc(var(--spacing)*4)}.sm\:pb-6{padding-bottom:calc(var(--spacing)*6)}.sm\:pl-6{padding-left:calc(var(--spacing)*6)}.sm\:pl-7{padding-left:calc(var(--spacing)*7)}.sm\:pl-11{padding-left:calc(var(--spacing)*11)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[11px\]{font-size:11px}.sm\:opacity-100{opacity:1}:is(.sm\:\*\:w-auto>*){width:auto}}@media(min-width:48rem){.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:h-\[80vh\]{height:80vh}.md\:max-h-\[900px\]{max-height:900px}.md\:w-72{width:calc(var(--spacing)*72)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:p-5{padding:calc(var(--spacing)*5)}}@media(min-width:64rem){.lg\:-mx-3{margin-inline:calc(var(--spacing)*-3)}.lg\:-mx-8{margin-inline:calc(var(--spacing)*-8)}.lg\:-mb-8{margin-bottom:calc(var(--spacing)*-8)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:table-cell{display:table-cell}.lg\:aspect-video{aspect-ratio:var(--aspect-video)}.lg\:h-dvh{height:100dvh}.lg\:w-32{width:calc(var(--spacing)*32)}.lg\:w-\[380px\]{width:380px}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:gap-3{gap:calc(var(--spacing)*3)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:pb-8{padding-bottom:calc(var(--spacing)*8)}}@media(prefers-color-scheme:dark){.dark\:border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:bg-amber-400\/10{background-color:#fcbb001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-400\/10{background-color:color-mix(in oklab,var(--color-amber-400)10%,transparent)}}.dark\:bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400)10%,transparent)}}.dark\:bg-purple-400\/10{background-color:#c07eff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-400\/10{background-color:color-mix(in oklab,var(--color-purple-400)10%,transparent)}}.dark\:bg-teal-400\/10{background-color:#00d3bd1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-teal-400\/10{background-color:color-mix(in oklab,var(--color-teal-400)10%,transparent)}}.dark\:bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:bg-yellow-400\/10{background-color:#fac8001a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-400\/10{background-color:color-mix(in oklab,var(--color-yellow-400)10%,transparent)}}.dark\:bg-zinc-400\/10{background-color:#9f9fa91a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-zinc-400\/10{background-color:color-mix(in oklab,var(--color-zinc-400)10%,transparent)}}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-teal-400{color:var(--color-teal-400)}.dark\:text-yellow-400{color:var(--color-yellow-400)}.dark\:text-zinc-400{color:var(--color-zinc-400)}}@media(forced-colors:active){.forced-colors\:appearance-auto{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}.\[\&\:\:-moz-range-thumb\]\:h-4::-moz-range-thumb{height:calc(var(--spacing)*4)}.\[\&\:\:-moz-range-thumb\]\:w-4::-moz-range-thumb{width:calc(var(--spacing)*4)}.\[\&\:\:-moz-range-thumb\]\:cursor-pointer::-moz-range-thumb{cursor:pointer}.\[\&\:\:-moz-range-thumb\]\:appearance-none::-moz-range-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-moz-range-thumb\]\:rounded-full::-moz-range-thumb{border-radius:3.40282e38px}.\[\&\:\:-moz-range-thumb\]\:border-0::-moz-range-thumb{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-slider-thumb\]\:h-3\.5::-webkit-slider-thumb{height:calc(var(--spacing)*3.5)}.\[\&\:\:-webkit-slider-thumb\]\:h-4::-webkit-slider-thumb{height:calc(var(--spacing)*4)}.\[\&\:\:-webkit-slider-thumb\]\:w-3\.5::-webkit-slider-thumb{width:calc(var(--spacing)*3.5)}.\[\&\:\:-webkit-slider-thumb\]\:w-4::-webkit-slider-thumb{width:calc(var(--spacing)*4)}.\[\&\:\:-webkit-slider-thumb\]\:cursor-pointer::-webkit-slider-thumb{cursor:pointer}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-accent-secondary::-webkit-slider-thumb{background-color:var(--accent-secondary)}.\[\&\:\:-webkit-slider-thumb\]\:shadow-lg::-webkit-slider-thumb{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\:\:-webkit-slider-thumb\]\:shadow-md::-webkit-slider-thumb{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.\[\&\:\:-webkit-slider-thumb\]\:transition-transform::-webkit-slider-thumb{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.\[\&\:\:-webkit-slider-thumb\]\:hover\:scale-110::-webkit-slider-thumb:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}}.\[\&\>\[data-slot\=icon\]\]\:h-4>[data-slot=icon]{height:calc(var(--spacing)*4)}.\[\&\>\[data-slot\=icon\]\]\:w-4>[data-slot=icon]{width:calc(var(--spacing)*4)}.\[\&\>\[data-slot\=icon\]\]\:shrink-0>[data-slot=icon]{flex-shrink:0}.\[\&\>\[data-slot\=section\]\+\[data-slot\=section\]\]\:mt-2\.5>[data-slot=section]+[data-slot=section]{margin-top:calc(var(--spacing)*2.5)}.\[\&\>\[data-slot\=section\]\+\[data-slot\=section\]\]\:mt-6>[data-slot=section]+[data-slot=section]{margin-top:calc(var(--spacing)*6)}.\[\&\>svg\]\:h-5>svg{height:calc(var(--spacing)*5)}.\[\&\>svg\]\:w-5>svg{width:calc(var(--spacing)*5)}.\[\&\>svg\]\:flex-shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-accent-primary>svg{color:var(--accent-primary)}.\[\&\>svg\]\:text-text-muted>svg{color:var(--text-muted)}@media(hover:hover){.hover\:\[\&\>svg\]\:text-text-primary:hover>svg{color:var(--text-primary)}}@media(pointer:fine){.\[\@media\(pointer\:fine\)\]\:hidden{display:none}}}@supports (color:color(display-p3 1 1 1)){:root{--accent-primary:color(display-p3 .443 .612 .875);--accent-secondary:color(display-p3 .875 .737 .447);--accent-tertiary:color(display-p3 .435 .737 .741);--accent-danger:color(display-p3 .882 .15 .447);--accent-success:color(display-p3 .443 .596 .447);--signal-excellent:color(display-p3 0 1 0);--signal-good:color(display-p3 .55 .9 .15);--signal-fair:color(display-p3 1 .85 0);--signal-poor:color(display-p3 1 .55 .15);--signal-critical:color(display-p3 1 .2 .2);--sparkline-excellent:color(display-p3 .1 .9 .35);--sparkline-good:color(display-p3 .45 .85 .05);--sparkline-fair:color(display-p3 1 .8 0);--sparkline-poor:color(display-p3 1 .5 .1);--sparkline-critical:color(display-p3 1 .15 .15);--status-success:color(display-p3 .443 .596 .447);--status-warning:color(display-p3 .875 .737 .447);--status-danger:color(display-p3 .882 .15 .447);--status-info:color(display-p3 .435 .737 .741);--pkt-advert:color(display-p3 .875 .737 .447);--pkt-flood:color(display-p3 .435 .737 .741);--pkt-txt-msg:color(display-p3 .443 .596 .447);--pkt-ack:color(display-p3 .6 .604 .741);--pkt-trace:color(display-p3 .439 .741 .875);--pkt-req:color(display-p3 0 .455 .745);--pkt-response:color(display-p3 .596 .737 .6);--pkt-grp-txt:color(display-p3 .882 .471 .6);--pkt-grp-data:color(display-p3 .745 .459 .447);--pkt-path:color(display-p3 .439 .741 .875);--pkt-anon:color(display-p3 .741 .733 .447);--chart-1:color(display-p3 .443 .612 .875);--chart-2:color(display-p3 0 .455 .745);--chart-3:color(display-p3 .435 .737 .741);--chart-4:color(display-p3 .875 .737 .447);--chart-5:color(display-p3 .443 .596 .447);--chart-6:color(display-p3 .882 .15 .447);--chart-7:color(display-p3 .882 .471 .6);--chart-8:color(display-p3 .6 .604 .741);--metric-received:color(display-p3 .443 .596 .447);--metric-forwarded:color(display-p3 0 .455 .745);--metric-transmitted:color(display-p3 .875 .737 .447);--metric-dropped:color(display-p3 .882 .15 .447);--log-info:color(display-p3 .435 .737 .741);--log-warning:color(display-p3 .875 .737 .447);--log-error:color(display-p3 .882 .15 .447);--log-critical:color(display-p3 .745 .459 .447);--map-hub-color:color(display-p3 .65 .5 .85);--map-local-color:color(display-p3 1 .8 .1);--map-neighbor-color:color(display-p3 1 .8 .1);--map-mobile-color:color(display-p3 1 .5 .1);--map-room-color:color(display-p3 1 .45 .65);--link-strong:color(display-p3 .443 .596 .447);--link-medium:color(display-p3 .875 .737 .447);--link-weak:color(display-p3 .745 .459 .447);--hop-0:color(display-p3 .435 .737 .741);--hop-1:color(display-p3 .443 .596 .447);--hop-2:color(display-p3 .596 .737 .6);--hop-3:color(display-p3 .875 .737 .447);--hop-hub:color(display-p3 .984 .749 .141);--palette-red:color(display-p3 .745 .459 .447);--palette-red-bright:color(display-p3 .882 .15 .447);--palette-orange:color(display-p3 .851 .467 .259);--palette-orange-bright:color(display-p3 .961 .62 .043);--palette-yellow:color(display-p3 .741 .733 .447);--palette-yellow-bright:color(display-p3 .875 .737 .447);--palette-green:color(display-p3 .443 .596 .447);--palette-green-bright:color(display-p3 .596 .737 .6);--palette-aqua:color(display-p3 .435 .737 .741);--palette-aqua-bright:color(display-p3 .439 .741 .875);--palette-blue:color(display-p3 0 .455 .745);--palette-blue-bright:color(display-p3 .443 .612 .875);--palette-purple:color(display-p3 .545 .482 .678);--palette-purple-bright:color(display-p3 .6 .604 .741);--map-edge-hover-direct:color(display-p3 .2 .9 .92);--map-edge-hover-loop:color(display-p3 .7 .5 .92);--map-edge-hover-neighbor:color(display-p3 1 .8 0);--map-edge-highlight:color(display-p3 1 .9 0)}}a,button,[role=button],.interactive,.surface-base,.glass-card,.data-card,.chart-container,.pill-tag,.pill-subtle,.toggle-group-item,.roster-row,.nav-item{transition:all .15s ease-out}a:hover,button:hover,[role=button]:hover,.interactive:hover,.surface-base:hover,.glass-card:hover,.data-card:hover,.chart-container:hover,.pill-tag:hover,.pill-subtle:hover,.toggle-group-item:hover,.roster-row:hover,.nav-item:hover{transition-duration:0s}a,button,[role=button],input,select,textarea{touch-action:manipulation;-webkit-tap-highlight-color:transparent}a,button{cursor:pointer}.truncate[title],.line-clamp-1[title],.line-clamp-2[title],.text-ellipsis[title]{cursor:help;position:relative}.truncate[title]:hover:after,.line-clamp-1[title]:hover:after,.line-clamp-2[title]:hover:after,.text-ellipsis[title]:hover:after{content:attr(title);z-index:9999;background:var(--bg-elevated);border:1px solid var(--border-subtle);width:max-content;max-width:300px;font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);color:var(--text-primary);white-space:normal;word-break:break-all;pointer-events:none;border-radius:6px;margin-top:4px;padding:6px 10px;line-height:1.4;animation:.15s ease-out tooltip-fade-in;position:absolute;top:100%;left:0;box-shadow:0 4px 12px #0000004d}@keyframes tooltip-fade-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.type-hero{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-5xl);font-weight:var(--font-semibold);letter-spacing:var(--tracking-tight);color:var(--text-primary);line-height:1.05}.type-metric{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-4xl);font-weight:var(--font-semibold);letter-spacing:var(--tracking-tight);color:var(--text-primary);line-height:1.1}.type-title{font-family:var(--font-title),system-ui,sans-serif;font-size:var(--text-2xl);font-weight:var(--font-semibold);line-height:var(--leading-snug);letter-spacing:var(--tracking-tight);color:var(--text-primary)}.type-heading{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-lg);font-weight:var(--font-semibold);line-height:var(--leading-snug);color:var(--text-primary)}.type-subheading{font-family:var(--font-card-title,var(--font-display)),system-ui,sans-serif;font-size:var(--text-card-title,var(--text-lg));font-weight:var(--font-card-title-weight,var(--font-semibold));line-height:var(--leading-snug);color:var(--text-primary)}.type-body{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-base);font-weight:var(--font-normal);line-height:var(--leading-normal);color:var(--text-secondary)}.type-body-lg{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-md);font-weight:var(--font-normal);line-height:var(--leading-normal);color:var(--text-secondary)}.type-body-sm,.type-label{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-sm);font-weight:var(--font-medium);line-height:var(--leading-normal);color:var(--text-secondary)}.type-micro{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-xs);font-weight:var(--font-medium);line-height:var(--leading-normal);letter-spacing:.12em;text-transform:uppercase;color:var(--text-secondary)}.type-data{font-family:var(--font-data);font-size:var(--text-base);font-weight:var(--font-normal);line-height:var(--leading-normal);letter-spacing:var(--tracking-wide);font-feature-settings:"zero","tnum"}.type-data-lg{font-family:var(--font-data);font-size:var(--text-lg);font-weight:var(--font-medium);line-height:var(--leading-snug);letter-spacing:var(--tracking-normal);font-feature-settings:"zero","tnum"}.type-data-xl{font-family:var(--font-data);font-size:var(--text-xl);font-weight:var(--font-semibold);line-height:var(--leading-snug);letter-spacing:-.01em;font-feature-settings:"zero","tnum"}.type-data-hero{font-family:var(--font-data);font-size:var(--text-2xl);font-weight:var(--font-semibold);letter-spacing:-.03em;font-feature-settings:"zero","tnum";line-height:1.1}@media(min-width:640px){.type-data-hero{font-size:var(--text-3xl)}}:root{--punc-margin-comma:-.15em;--punc-margin-period:-.12em;--punc-margin-colon:-.08em;--punc-margin-slash:-.06em;--punc-margin-mult:-.1em}.data-tight{display:inline}.data-tight .punc,.punc-tight{margin-right:var(--punc-margin-comma);margin-left:-.05em;display:inline-block}.data-tight .punc-period,.punc-period{margin-right:var(--punc-margin-period);margin-left:-.03em}.data-tight .punc-colon,.punc-colon{margin-right:var(--punc-margin-colon);margin-left:var(--punc-margin-colon)}.data-tight .punc-slash,.punc-slash{margin-right:var(--punc-margin-slash);margin-left:var(--punc-margin-slash)}.data-tight .punc-mult,.punc-mult{margin-right:var(--punc-margin-mult);margin-left:0;display:inline-block}.type-data-sm{font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);line-height:var(--leading-normal);letter-spacing:var(--tracking-wider);font-feature-settings:"zero","tnum"}.type-data-xs{font-family:var(--font-data);font-size:var(--text-xs);font-weight:var(--font-medium);line-height:var(--leading-normal);letter-spacing:var(--tracking-widest);font-feature-settings:"zero","tnum"}.type-code{font-family:var(--font-data);font-size:.875em;font-weight:var(--font-normal);line-height:var(--leading-relaxed);font-feature-settings:"zero","tnum"}.type-badge{font-family:var(--font-data);font-size:var(--text-xs);font-weight:var(--font-medium);letter-spacing:.08em;text-transform:uppercase;line-height:1}.type-tag{font-family:var(--font-display),system-ui,sans-serif;font-size:var(--text-xs);font-weight:var(--font-medium);letter-spacing:.05em;line-height:1}.font-mono{font-feature-settings:"zero";font-family:var(--font-data)!important}.font-title{font-family:var(--font-title),system-ui,sans-serif!important}.font-display{font-family:var(--font-display),system-ui,sans-serif!important}.tabular-nums{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}.pb-safe{padding-bottom:env(safe-area-inset-bottom,0)}.pt-safe{padding-top:env(safe-area-inset-top,0)}.pl-safe{padding-left:env(safe-area-inset-left,0)}.pr-safe{padding-right:env(safe-area-inset-right,0)}.p-safe{padding-top:env(safe-area-inset-top,0);padding-right:env(safe-area-inset-right,0);padding-bottom:env(safe-area-inset-bottom,0);padding-left:env(safe-area-inset-left,0)}@keyframes shimmer{0%{opacity:.5;transform:translate(-100%)}50%{opacity:1}to{opacity:.5;transform:translate(100%)}}:root{--duration-instant:75ms;--duration-fast:.15s;--duration-normal:.2s;--duration-slow:.3s;--duration-slower:.5s;--ease-linear:linear;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--ease-bounce:cubic-bezier(.34,1.56,.64,1);--ease-spring:cubic-bezier(.175,.885,.32,1.275);--hover-scale-subtle:1.02;--hover-scale-pop:1.05;--hover-lift-y:-2px;--hover-lift-shadow:0 4px 12px #00000026;--active-scale:.98;--active-opacity:.9;--active-y:1px;--disabled-opacity:.4;--loading-opacity:.6}.interactive{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out);cursor:pointer}.interactive-fast{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter;transition-duration:var(--duration-instant);transition-timing-function:var(--ease-out);cursor:pointer}.interactive-slow{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter;transition-duration:var(--duration-normal);transition-timing-function:var(--ease-in-out);cursor:pointer}.hover-bg:hover{background-color:var(--subtle-fill-hover)}.hover-bg-strong:hover{background-color:var(--subtle-fill-strong)}.hover-lift:hover{transform:translateY(var(--hover-lift-y));box-shadow:var(--hover-lift-shadow)}.hover-scale:hover{transform:scale(var(--hover-scale-subtle))}.hover-pop:hover{transform:scale(var(--hover-scale-pop))}.hover-bright:hover{filter:brightness(1.1)}.hover-dim:hover{filter:brightness(.95)}.hover-opacity:hover{opacity:.8}.hover-border:hover{border-color:var(--border-strong)}.hover-text:hover{color:var(--text-primary)}.row-hover{transition-property:background-color,border-color,color;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.row-hover:hover{background-color:var(--subtle-fill-hover)}.card-hover{transition-property:transform,box-shadow,border-color;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.card-hover:hover{transform:translateY(var(--hover-lift-y));box-shadow:var(--surface-shadow-md)}.btn-hover{transition-property:background-color,border-color,color,transform;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.btn-hover:hover{background-color:var(--subtle-fill-hover)}.icon-hover{transition-property:transform,filter,opacity;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.icon-hover:hover{transform:scale(var(--hover-scale-subtle));filter:brightness(1.15)}.active-press:active{transform:scale(var(--active-scale))}.active-depress:active{transform:translateY(var(--active-y))}.active-dim:active{opacity:var(--active-opacity)}.active-full:active{transform:scale(var(--active-scale));opacity:var(--active-opacity)}.state-disabled,.disabled{pointer-events:none;opacity:var(--disabled-opacity);cursor:not-allowed}.state-loading,.loading{pointer-events:none;opacity:var(--loading-opacity);cursor:wait}.loading-pulse{pointer-events:none;animation:pulse 1.5s var(--ease-in-out)infinite}@keyframes pulse{50%{opacity:.5}}.transition-base{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.transition-transform{transition-property:transform;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-in-out)}.transition-opacity{transition-property:opacity;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}.transition-shadow{transition-property:box-shadow;transition-duration:var(--duration-fast);transition-timing-function:var(--ease-out)}:root{--radius-xs:4px;--radius-sm:6px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:20px;--radius-3xl:24px;--surface-opacity-base:80%;--surface-opacity-elevated:85%;--surface-opacity-solid:95%;--surface-blur-sm:8px;--surface-blur-md:16px;--surface-blur-lg:24px;--surface-ring:inset 0 0 0 1px #ffffff1a;--surface-ring-strong:inset 0 0 0 1px #ffffff26;--surface-shadow-sm:0 4px 6px -4px #0000001a;--surface-shadow-md:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--surface-shadow-lg:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--surface-shadow-xl:0 25px 50px -12px #00000040;--surface-tint-subtle:#ffffff08;--surface-tint-light:#ffffff0d;--surface-border-subtle:#ffffff0d;--stroke-none:0px;--stroke-thin:1px;--stroke-medium:1.5px;--stroke-thick:2px;--ring-width-default:2px;--ring-width-thick:3px;--ring-offset:2px;--ring-color:var(--accent-primary);--ring-color-error:var(--accent-danger)}.surface-base{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-base{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.surface-base{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));box-shadow:var(--surface-ring)}.surface-elevated{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-elevated{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-elevated),transparent)}}.surface-elevated{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));box-shadow:var(--surface-ring),var(--surface-shadow-lg)}.surface-modal{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-modal{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.surface-modal{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));box-shadow:var(--surface-ring),var(--surface-shadow-xl)}.surface-sidebar{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.surface-sidebar{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.surface-sidebar{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));border-right:1px solid var(--border-subtle)}.surface-header{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.surface-header{background-color:color-mix(in srgb,var(--bg-body)70%,transparent)}}.surface-header{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border-bottom:1px solid var(--border-subtle)}.surface-header[data-variant=dark]{-webkit-backdrop-filter:blur(var(--surface-blur-sm));backdrop-filter:blur(var(--surface-blur-sm));border-bottom-color:var(--border-subtle);background-color:#000c}@supports (color:color-mix(in lab,red,red)){.surface-header[data-variant=dark]{border-bottom-color:color-mix(in srgb,var(--border-subtle)50%,transparent)}}.surface-inner{background-color:var(--surface-tint-subtle);border:1px solid var(--surface-border-subtle);border-radius:var(--radius-md);box-shadow:inset 0 1px 2px #0000000d}.surface-badge{background-color:var(--surface-tint-light);box-shadow:var(--surface-ring)}.surface-control{background-color:var(--bg-elevated)}@supports (color:color-mix(in lab,red,red)){.surface-control{background-color:color-mix(in srgb,var(--bg-elevated)92%,transparent)}}.surface-control{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));border:1px solid var(--border-subtle);box-shadow:var(--surface-shadow-md)}.surface-input{background-color:var(--surface-tint-light);box-shadow:var(--surface-ring);transition:box-shadow .15s}.surface-input:focus{box-shadow:inset 0 0 0 2px var(--accent-primary)}.surface-checkbox{background-color:var(--surface-tint-light);border:1px solid #ffffff1a;transition:background-color .15s,border-color .15s}.surface-checkbox:checked{background-color:var(--accent-primary);border-color:var(--accent-primary)}.surface-reflex{box-shadow:var(--surface-ring),inset 1.5px 2.5px 0 -1.5px #ffffff40,inset -1.5px -1.5px 0 -1.5px #fff3,inset -2px -6px 1px -4px #ffffff26,inset 0 2px 3px -1.5px #0000001f,inset -.25px -1px 3px #00000014;position:relative;overflow:hidden}.surface-reflex:before{content:"";pointer-events:none;border-radius:inherit;background:linear-gradient(#ffffff0f,#0000 30px),linear-gradient(0deg,#0000000a,#0000 40px);position:absolute;top:0;right:0;bottom:0;left:0}.surface-themed[data-theme=terminal]{background-color:var(--terminal-bg)}.surface-themed[data-theme=terminal-input]{background-color:var(--terminal-bg-input);border-top:1px solid var(--terminal-border)}.surface-themed[data-theme=terminal-status]{background-color:var(--terminal-bg-status);border-top:1px solid var(--terminal-border)}.surface-themed[data-theme=terminal-autocomplete]{background-color:var(--terminal-autocomplete-bg);-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border:1px solid var(--terminal-autocomplete-border);box-shadow:var(--surface-shadow-xl),var(--surface-shadow-lg)}.surface-divider-bottom{border-bottom:1px solid var(--border-subtle)}.surface-divider-top{border-top:1px solid var(--border-subtle)}.surface-divider[data-theme=terminal]{border-color:var(--terminal-border)}.surface-header-mobile{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.surface-header-mobile{background-color:color-mix(in srgb,var(--bg-body)70%,transparent)}}.surface-header-mobile{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border-bottom:1px solid var(--border-subtle)}.surface-appbar{-webkit-backdrop-filter:blur(var(--surface-blur-sm));backdrop-filter:blur(var(--surface-blur-sm));border-bottom:1px solid var(--border-subtle);background-color:#000c}@supports (color:color-mix(in lab,red,red)){.surface-appbar{border-bottom:1px solid color-mix(in srgb,var(--border-subtle)50%,transparent)}}.surface-terminal{background-color:var(--terminal-bg)}.surface-terminal-input{background-color:var(--terminal-bg-input);border-top:1px solid var(--terminal-border)}.surface-terminal-status{background-color:var(--terminal-bg-status);border-top:1px solid var(--terminal-border)}.surface-terminal-autocomplete{background-color:var(--terminal-autocomplete-bg);-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));border:1px solid var(--terminal-autocomplete-border);box-shadow:var(--surface-shadow-xl),var(--surface-shadow-lg)}.surface-terminal-autocomplete-item{border-bottom:1px solid var(--terminal-border)}.surface-terminal-autocomplete-footer{background-color:var(--terminal-autocomplete-hover);border-top:1px solid var(--terminal-border)}.card-reflex{box-shadow:var(--surface-ring),inset 1.5px 2.5px 0 -1.5px #ffffff40,inset -1.5px -1.5px 0 -1.5px #fff3,inset -2px -6px 1px -4px #ffffff26,inset 0 2px 3px -1.5px #0000001f,inset -.25px -1px 3px #00000014;position:relative;overflow:hidden}.card-reflex:before{content:"";pointer-events:none;border-radius:inherit;background:linear-gradient(#ffffff0f,#0000 30px),linear-gradient(0deg,#0000000a,#0000 40px);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-card{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.glass-card{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));box-shadow:var(--surface-ring);border-radius:var(--radius-xl)}.glass-card-elevated{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-card-elevated{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-elevated),transparent)}}.glass-card-elevated{-webkit-backdrop-filter:blur(var(--surface-blur-lg));backdrop-filter:blur(var(--surface-blur-lg));box-shadow:var(--surface-ring),var(--surface-shadow-lg);border-radius:var(--radius-xl)}.glass-card-glow{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-card-glow{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.glass-card-glow{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));box-shadow:var(--surface-ring);border-radius:var(--radius-xl)}.glass-sidebar{background-color:var(--bg-surface)}@supports (color:color-mix(in lab,red,red)){.glass-sidebar{background-color:color-mix(in srgb,var(--bg-surface)var(--surface-opacity-base),transparent)}}.glass-sidebar{-webkit-backdrop-filter:blur(var(--surface-blur-md));backdrop-filter:blur(var(--surface-blur-md));border-right:1px solid var(--border-subtle)}.glass-card-inner{background-color:var(--surface-tint-subtle);border:1px solid var(--surface-border-subtle);border-radius:var(--radius-md);box-shadow:inset 0 1px 2px #0000000d}.radius-card{border-radius:var(--radius-xl)}.radius-inset{border-radius:var(--radius-lg)}.radius-inner{border-radius:var(--radius-md)}.radius-control{border-radius:var(--radius-sm)}.radius-badge{border-radius:var(--radius-xs)}.radius-hero{border-radius:var(--radius-2xl)}.radius-none{border-radius:0}.radius-pill{border-radius:9999px}.border-card,.border-control{border:var(--stroke-thin)solid var(--border-subtle)}.border-emphasis{border:var(--stroke-medium)solid var(--border-strong)}.ring-focus:focus-visible{outline:var(--ring-width-default)solid var(--ring-color);outline-offset:var(--ring-offset)}.ring-focus-inset:focus-visible{box-shadow:inset 0 0 0 var(--ring-width-default) var(--ring-color);outline:none}.ring-focus-error:focus-visible{outline:var(--ring-width-default)solid var(--ring-color-error);outline-offset:var(--ring-offset)}.divider-bottom{border-bottom:var(--stroke-thin)solid var(--border-subtle)}.divider-top{border-top:var(--stroke-thin)solid var(--border-subtle)}.divider-right{border-right:var(--stroke-thin)solid var(--border-subtle)}.divider-left{border-left:var(--stroke-thin)solid var(--border-subtle)}.liquid-glass{background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.liquid-glass{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.liquid-glass{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.liquid-glass{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.liquid-glass:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.liquid-glass-elevated{background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.liquid-glass-elevated{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity-elevated),transparent)}}.liquid-glass-elevated{-webkit-backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 2px 1px 0 -1px var(--glass-light),inset -1.5px -1px 0 -1px var(--glass-light),inset -2px -6px 1px -5px var(--glass-light),inset -1px 2px 3px -1px var(--glass-dark),inset 0 -4px 1px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.liquid-glass-elevated{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 2px 1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -1.5px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -2px -6px 1px -5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -1px 2px 3px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 -4px 1px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.liquid-glass-elevated:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.liquid-glass-glow{background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.liquid-glass-glow{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.liquid-glass-glow{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--accent-primary),inset 1.8px 3px 0 -2px var(--accent-primary),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.liquid-glass-glow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.liquid-glass-glow:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.liquid-glass-sm{border-radius:var(--radius-md)}.liquid-glass-md{border-radius:var(--radius-lg)}.liquid-glass-lg{border-radius:var(--radius-xl)}.liquid-glass-xl{border-radius:var(--radius-2xl)}.liquid-glass-pill{border-radius:9999px}.liquid-glass-none{border-radius:0}.glass-card{border-radius:var(--radius-xl);background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-card{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.glass-card{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.glass-card:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card-stroke,.stroke-only .glass-card,.stroke-only .glass-card-glow,.stroke-only .glass-card-elevated{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:var(--glass-stroke-width,1px)solid var(--glass-stroke-color,#e0e0e0)!important;box-shadow:none!important;background-color:#0000!important}.glass-card-stroke:before,.stroke-only .glass-card:before,.stroke-only .glass-card-glow:before,.stroke-only .glass-card-elevated:before{display:none!important}.stroke-only .glass-sidebar{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-right:var(--glass-stroke-width,1px)solid var(--glass-stroke-color,#e0e0e0)!important;box-shadow:none!important;background-color:#0000!important}.stroke-only .glass-sidebar:before{display:none!important}.glass-card-ribbon,.ribbon-mode .glass-card,.ribbon-mode .glass-card-glow,.ribbon-mode .glass-card-elevated{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-bottom:var(--glass-ribbon-border-width,8px)solid var(--glass-ribbon-border-color,#2d2d2d)!important;box-shadow:none!important;background-color:#0000!important;border-radius:0!important}.glass-card-ribbon:before,.ribbon-mode .glass-card:before,.ribbon-mode .glass-card-glow:before,.ribbon-mode .glass-card-elevated:before{display:none!important}.ribbon-mode .glass-sidebar{background-color:var(--sidebar-bg,transparent)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-right:var(--glass-ribbon-border-width,2px)solid var(--glass-ribbon-border-color,#7a7a7a)!important;box-shadow:none!important;border-radius:0!important}.ribbon-mode .glass-sidebar:before{display:none!important}.ribbon-mode .glass-sidebar nav a[class*=bg-accent-primary]{background-color:var(--sidebar-nav-active-bg)!important;color:var(--sidebar-nav-active-text)!important}.ribbon-mode .glass-sidebar nav a[class*=text-accent-primary],.ribbon-mode .glass-sidebar nav a[class*=bg-accent-primary] svg,.ribbon-mode .glass-sidebar nav a[class*=text-accent-primary] svg{color:var(--sidebar-nav-active-text)!important}.ribbon-mode .glass-sidebar nav a:hover{background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .data-card,.ribbon-mode .chart-container{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-bottom:var(--glass-ribbon-border-width,4px)solid var(--glass-ribbon-border-color,#2d2d2d)!important;box-shadow:none!important;background-color:#0000!important;border-radius:0!important}.ribbon-mode .data-card:before,.ribbon-mode .chart-container:before{display:none!important}.ribbon-mode .mini-widget{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-bottom:var(--glass-ribbon-border-width,4px)solid var(--glass-ribbon-border-color,#2d2d2d)!important;box-shadow:none!important;background-color:#0000!important;border-radius:0!important}.ribbon-mode .mini-widget:before{display:none!important}.ribbon-mode .toggle-group{-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:2px solid var(--glass-ribbon-border-color,#7a7a7a)!important;box-shadow:none!important;background-color:#0000!important}.ribbon-mode .toggle-group:before{display:none!important}.ribbon-mode .toggle-group-item:hover:not(.active){background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .toggle-group-item.active{background-color:var(--accent-primary)!important;color:var(--text-invert)!important;box-shadow:none!important;border:none!important}.ribbon-mode .segmented-toggle{border:none!important}.ribbon-mode .segmented-toggle-item:hover:not(.active){background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .segmented-toggle-item.active{background-color:var(--accent-primary)!important;color:var(--text-invert)!important;box-shadow:none!important;border:none!important}.ribbon-mode .map-control-glass,.ribbon-mode .map-controls-container,.ribbon-mode .maplibregl-ctrl-group{background-color:var(--bg-body)!important;border-radius:.5rem!important;box-shadow:0 1px 3px #0000001f,0 4px 12px #00000014!important}.ribbon-mode .map-control-glass:after,.ribbon-mode .map-control-glass-active:after,.ribbon-mode .maplibregl-ctrl-group:after{display:none!important}.ribbon-mode .map-control-btn:hover{background-color:var(--sidebar-nav-hover-bg)!important}.ribbon-mode .map-control-active-amber,.ribbon-mode .map-control-active-sky,.ribbon-mode .map-control-active-teal{background-color:var(--accent-primary)!important}.ribbon-mode .map-control-active-amber .map-control-icon,.ribbon-mode .map-control-active-sky .map-control-icon,.ribbon-mode .map-control-active-teal .map-control-icon{color:var(--text-invert)!important}.ribbon-mode .glass-card-elevated{background-color:var(--bg-body)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:var(--glass-ribbon-border-width,2px)solid var(--glass-ribbon-border-color,#7a7a7a)!important;box-shadow:none!important}.ribbon-mode .glass-card-elevated:before{display:none!important}.ribbon-mode .type-title{font-size:var(--text-2xl);letter-spacing:-.05em;line-height:1.1}@media(min-width:640px){.ribbon-mode .type-title{font-size:var(--text-3xl)}}.ribbon-mode .type-subheading{font-size:var(--text-xl);letter-spacing:-.03em}.ribbon-mode .map-container-16-9>div{box-shadow:0 2px 6px #0000001a,0 8px 24px #00000014}.ribbon-mode .map-container-fullscreen>div{box-shadow:none}.glass-card-glow{border-radius:var(--radius-xl);background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-card-glow{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.glass-card-glow{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--accent-primary),inset 1.8px 3px 0 -2px var(--accent-primary),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card-glow{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--accent-primary)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.glass-card-glow:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card-elevated{border-radius:var(--radius-xl);background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-card-elevated{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity-elevated),transparent)}}.glass-card-elevated{-webkit-backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur-elevated))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 2px 1px 0 -1px var(--glass-light),inset -1.5px -1px 0 -1px var(--glass-light),inset -2px -6px 1px -5px var(--glass-light),inset -1px 2px 3px -1px var(--glass-dark),inset 0 -4px 1px -2px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card-elevated{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 2px 1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -1.5px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -2px -6px 1px -5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -1px 2px 3px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 -4px 1px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.glass-card-elevated:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-sidebar{background-color:var(--glass-tint);border:none;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.glass-sidebar{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.glass-sidebar{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset -1px 0 0 0 var(--glass-light),inset 1px 0 0 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-sidebar{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset -1px 0 color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*8%),transparent),inset 1px 0 color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent)}}.glass-sidebar:before{content:"";pointer-events:none;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.glass-card-inner{background-color:var(--glass-tint)}@supports (color:color-mix(in lab,red,red)){.glass-card-inner{background-color:color-mix(in srgb,var(--glass-tint)8%,transparent)}}.glass-card-inner{border:1px solid var(--glass-light)}@supports (color:color-mix(in lab,red,red)){.glass-card-inner{border:1px solid color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*5%),transparent)}}.glass-card-inner{border-radius:var(--radius-md);box-shadow:inset 0 1px 2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-card-inner{box-shadow:inset 0 1px 2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*5%),transparent)}}.glass-thumbnail{border-radius:var(--radius-sm);border:none;position:relative;overflow:hidden}.glass-thumbnail:after{content:"";z-index:10;pointer-events:none;border-radius:inherit;box-shadow:inset 0 0 0 .5px var(--glass-light),inset .9px 1.5px 0 -1px var(--glass-light),inset -1px -1px 0 -1px var(--glass-light),inset -1.5px -4px .5px -3px var(--glass-light),inset -.15px -.5px 2px 0 var(--glass-dark),inset -.75px 1.25px 0 -1px var(--glass-dark),inset 0 1.5px 2px -1px var(--glass-dark);position:absolute;top:0;right:0;bottom:0;left:0}@supports (color:color-mix(in lab,red,red)){.glass-thumbnail:after{box-shadow:inset 0 0 0 .5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*16%),transparent),inset .9px 1.5px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*140%),transparent),inset -1px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*125%),transparent),inset -1.5px -4px .5px -3px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*94%),transparent),inset -.15px -.5px 2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*18%),transparent),inset -.75px 1.25px 0 -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent),inset 0 1.5px 2px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent)}}.glass-thumbnail-selected:after{box-shadow:inset 0 0 0 1.5px var(--accent-primary),inset .9px 1.5px 0 -1px var(--glass-light),inset -1px -1px 0 -1px var(--glass-light),inset -1.5px -4px .5px -3px var(--glass-light),inset -.15px -.5px 2px 0 var(--glass-dark),inset -.75px 1.25px 0 -1px var(--glass-dark),inset 0 1.5px 2px -1px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.glass-thumbnail-selected:after{box-shadow:inset 0 0 0 1.5px var(--accent-primary),inset .9px 1.5px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*140%),transparent),inset -1px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*125%),transparent),inset -1.5px -4px .5px -3px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*94%),transparent),inset -.15px -.5px 2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*18%),transparent),inset -.75px 1.25px 0 -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent),inset 0 1.5px 2px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*31%),transparent)}}.glass-card-frame{z-index:1000;box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark);border-radius:1.125rem;position:relative}@supports (color:color-mix(in lab,red,red)){.glass-card-frame{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*15%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*25%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*25%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*15%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent)}}.glass-card-frame:before{content:"";pointer-events:none;border-radius:inherit;z-index:1001;background:var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.separator-line{background:linear-gradient(to right,transparent,var(--glass-light)20%,var(--glass-light)80%,transparent);height:1px}@supports (color:color-mix(in lab,red,red)){.separator-line{background:linear-gradient(to right,transparent,color-mix(in srgb,var(--glass-light)8%,transparent)20%,color-mix(in srgb,var(--glass-light)8%,transparent)80%,transparent)}}.separator-line-vertical{background:linear-gradient(to bottom,transparent,var(--glass-light)20%,var(--glass-light)80%,transparent);width:1px}@supports (color:color-mix(in lab,red,red)){.separator-line-vertical{background:linear-gradient(to bottom,transparent,color-mix(in srgb,var(--glass-light)8%,transparent)20%,color-mix(in srgb,var(--glass-light)8%,transparent)80%,transparent)}}.rounded-pill{border-radius:9999px}.rounded-card{border-radius:var(--radius-xl)}.catalyst-mode .glass-card,.catalyst-mode .glass-card-glow,.catalyst-mode .glass-card-elevated{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 2px #0000000d!important;border:none!important}.catalyst-mode .glass-card:before,.catalyst-mode .glass-card-glow:before,.catalyst-mode .glass-card-elevated:before{display:none!important}.catalyst-mode .glass-card-elevated{background-color:var(--bg-elevated)!important}.catalyst-mode .glass-sidebar{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:none!important;border-right:1px solid var(--border-subtle)!important;box-shadow:none!important}.catalyst-mode .glass-sidebar:before{display:none!important}.catalyst-mode .glass-card-inner{background-color:var(--bg-subtle)!important;border:1px solid var(--border-subtle)!important;border-radius:var(--radius-md)!important;box-shadow:none!important}.catalyst-mode .mini-widget{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.catalyst-mode .mini-widget:before{display:none!important}.catalyst-mode .toggle-group{background-color:var(--bg-subtle)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-md)!important;box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.catalyst-mode .toggle-group:before{display:none!important}.catalyst-mode .glass-card-frame{border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.catalyst-mode .glass-card-frame:before{display:none!important}.catalyst-mode .map-control-glass,.catalyst-mode .map-controls-container,.catalyst-mode .maplibregl-ctrl-group{background-color:var(--bg-surface)!important;border-radius:var(--radius-md)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 3px #0000001a!important}.catalyst-mode .map-control-glass:after,.catalyst-mode .maplibregl-ctrl-group:after{display:none!important}.catalyst-mode .glass-thumbnail:after{box-shadow:inset 0 0 0 1px var(--border-subtle)!important}.sidebar-panel{background-color:var(--glass-tint);border:none;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.sidebar-panel{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.sidebar-panel{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset -1px 0 0 0 var(--glass-light),inset 1px 0 0 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.sidebar-panel{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset -1px 0 color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*8%),transparent),inset 1px 0 color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent)}}.sidebar-panel:before{content:"";pointer-events:none;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.catalyst-mode .sidebar-panel{background-color:var(--bg-body)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;box-shadow:none!important;border:none!important}.catalyst-mode .sidebar-panel:before{display:none!important}.catalyst-mode [data-slot=section] a,.catalyst-mode [data-slot=section] button{border-radius:var(--radius-lg)!important}.catalyst-mode [data-slot=section] a:hover,.catalyst-mode [data-slot=section] button:hover{background-color:var(--bg-surface)!important}.catalyst-mode [data-slot=section] a[data-current=true],.catalyst-mode [data-slot=section] button[data-current=true]{background-color:var(--bg-surface)!important;color:var(--text-primary)!important}.catalyst-mode [data-slot=section] a[data-current=true] svg,.catalyst-mode [data-slot=section] button[data-current=true] svg{color:var(--text-primary)!important}.catalyst-mode [data-slot=section] .absolute.bg-accent-primary{display:none!important}.mobile-header{background-color:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){.mobile-header{background-color:color-mix(in srgb,var(--bg-body)70%,transparent)}}.mobile-header{-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);border-bottom:1px solid var(--border-subtle)}.catalyst-mode .mobile-header{background-color:var(--bg-body)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important}.catalyst-mode .main-content{background-color:var(--bg-surface);box-shadow:inset 0 0 0 1px var(--border-subtle);border-radius:.75rem 0 0 .75rem;margin:.5rem 0}@media(max-width:1023px){.catalyst-mode .main-content{border-radius:0;margin:0}}.catalyst-mode .data-card{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 2px #0000000d!important;border:none!important}.catalyst-mode .data-card:before{display:none!important}.catalyst-mode .chart-container{background-color:var(--bg-surface)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border-radius:var(--radius-xl)!important;box-shadow:inset 0 0 0 1px var(--border-subtle),0 1px 2px #0000000d!important;border:none!important}.catalyst-mode .chart-container:before{display:none!important}.card-sm{min-height:7rem}.card-md{min-height:11rem}.card-lg{min-height:14rem}.card-hero{min-height:20rem}.card-auto{min-height:auto}@media(max-width:640px){.card-sm{min-height:6rem}.card-md{min-height:9rem}.card-lg{min-height:12rem}.card-hero{min-height:16rem}}.icon-sm{flex-shrink:0;width:1rem;height:1rem}.icon-md{flex-shrink:0;width:1.25rem;height:1.25rem}.icon-lg{flex-shrink:0;width:1.5rem;height:1.5rem}.icon-xl{flex-shrink:0;width:2rem;height:2rem}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--bg-surface)}::-webkit-scrollbar-thumb{background-color:var(--border-strong);border-radius:4px}::-webkit-scrollbar-thumb:hover{background-color:var(--text-muted)}.sidebar-scroll{scrollbar-width:thin;scrollbar-color:transparent transparent}.sidebar-scroll:hover{scrollbar-color:var(--border-subtle)transparent}.sidebar-scroll::-webkit-scrollbar{width:4px}.sidebar-scroll::-webkit-scrollbar-track{background:0 0}.sidebar-scroll::-webkit-scrollbar-thumb{background-color:#0000;border-radius:2px}.sidebar-scroll:hover::-webkit-scrollbar-thumb{background-color:var(--border-subtle)}.layout-container{width:100%;max-width:80rem;margin-left:auto;margin-right:auto}.grid-12{grid-template-columns:repeat(12,minmax(0,1fr));gap:1rem;display:grid}@media(min-width:768px){.grid-12{gap:1.5rem}}.col-span-6{grid-column:span 6/span 6}.col-span-4{grid-column:span 4/span 4}.col-span-3{grid-column:span 3/span 3}@media(min-width:640px){.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-3{grid-column:span 3/span 3}}@media(min-width:768px){.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-12{grid-column:span 12/span 12}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-12{grid-column:span 12/span 12}}@media(min-width:1280px){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-8{grid-column:span 8/span 8}}.gap-space-2{gap:.5rem}.gap-space-3{gap:.75rem}.gap-space-4{gap:1rem}.gap-space-6{gap:1.5rem}.gap-space-8{gap:2rem}.gap-y-space-4{row-gap:1rem}.gap-y-space-6{row-gap:1.5rem}.gap-y-space-8{row-gap:2rem}.gap-x-space-4{column-gap:1rem}.gap-x-space-6{column-gap:1.5rem}.gap-x-space-8{column-gap:2rem}.card-padding{padding:1rem}@media(min-width:640px){.card-padding{padding:1.25rem}}.card-padding-sm{padding:.75rem}@media(min-width:640px){.card-padding-sm{padding:1rem}}.card-padding-xs{padding:.5rem}@media(min-width:640px){.card-padding-xs{padding:.75rem}}.section-gap{flex-direction:column;gap:1.5rem;display:flex}@media(min-width:1024px){.section-gap{gap:2rem}}.bento-section{flex-direction:column;gap:1rem;display:flex}.stats-row-hero{grid-template-columns:repeat(2,1fr);gap:1rem;display:grid}@media(min-width:768px){.stats-row-hero{grid-template-columns:repeat(3,1fr);gap:1.5rem}}@media(min-width:1280px){.stats-row-hero{grid-template-columns:repeat(5,1fr)}}.stats-row-secondary{grid-template-columns:1fr;gap:1rem;display:grid}@media(min-width:640px){.stats-row-secondary{grid-template-columns:repeat(2,1fr)}}@media(min-width:1024px){.stats-row-secondary{grid-template-columns:repeat(4,1fr);gap:1.5rem}}.content-grid{grid-template-columns:1fr;gap:1rem;display:grid}@media(min-width:768px){.content-grid{gap:1.5rem}}@media(min-width:1280px){.content-grid{grid-template-columns:2fr 1fr}}.content-main,.content-sidebar{min-width:0}.bento-row{grid-template-columns:repeat(12,minmax(0,1fr));align-items:stretch;display:grid}.bento-row-hero{min-height:15rem}@media(min-width:768px){.bento-row-hero{min-height:17.5rem}}@media(min-width:1024px){.bento-row-hero{min-height:20rem}}.bento-row-hero-tall{height:20rem;min-height:20rem}@media(min-width:768px){.bento-row-hero-tall{height:23.3125rem;min-height:23.3125rem}}@media(min-width:1024px){.bento-row-hero-tall{height:26.625rem;min-height:26.625rem}}.bento-row-hero-auto{min-height:20rem}@media(min-width:768px){.bento-row-hero-auto{min-height:23.3125rem}}@media(min-width:1024px){.bento-row-hero-auto{min-height:26.625rem}}.bento-row-panel{grid-auto-rows:18.75rem}.bento-row-feature{grid-auto-rows:12.5rem}@media(min-width:768px){.bento-row-feature{grid-auto-rows:15rem}}@media(min-width:1024px){.bento-row-feature{grid-auto-rows:16.25rem}}.bento-row-standard{min-height:11.25rem}@media(min-width:768px){.bento-row-standard{min-height:12.5rem}}@media(min-width:1024px){.bento-row-standard{min-height:13.75rem}}.bento-row-compact{min-height:8.75rem}@media(min-width:768px){.bento-row-compact{min-height:10rem}}@media(min-width:1024px){.bento-row-compact{min-height:11.25rem}}.bento-row-widget{min-height:6.25rem}@media(min-width:768px){.bento-row-widget{min-height:6.875rem}}@media(min-width:1024px){.bento-row-widget{min-height:7.5rem}}.bento-row-auto{min-height:auto}.analyzer-chart-height{height:13rem}@media(min-width:768px){.analyzer-chart-height{height:17rem}}@media(min-width:1024px){.analyzer-chart-height{height:20rem}}.dashboard-chart-height{height:9rem}@media(min-width:640px){.dashboard-chart-height{height:11rem}}@media(min-width:1024px){.dashboard-chart-height{height:13.5rem}}.packet-byte-chart-height{height:17rem}.legend-item{cursor:pointer;border-radius:.25rem;align-items:center;gap:.25rem;padding:.25rem .375rem;font-size:.6875rem;line-height:1.2;transition:background-color .15s,opacity .15s;display:flex}.legend-item:hover{background-color:var(--hover-tint)}.legend-item-active{background-color:var(--bg-subtle);opacity:1}.legend-item-dimmed{opacity:.35}.legend-item-chart-active{background-color:var(--hover-tint);opacity:1}.legend-label{color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;max-width:5.5rem;overflow:hidden}.legend-value{font-family:var(--font-data);font-variant-numeric:tabular-nums;color:var(--text-secondary);flex-shrink:0;margin-left:auto;font-weight:600}.legend-value-live{color:var(--text-primary)}.bento-gap{gap:1rem}.bento-gap-sm{gap:.5rem}@media(min-width:640px){.bento-gap-sm{gap:.75rem}}@media(min-width:768px){.bento-gap-sm{gap:1rem}}.bento-gap-lg{gap:1rem}@media(min-width:640px){.bento-gap-lg{gap:1.25rem}}@media(min-width:768px){.bento-gap-lg{gap:1.5rem}}@media(min-width:1024px){.bento-gap-lg{gap:2rem}}.bento-cell{flex-direction:column;min-width:0;min-height:0;display:flex}.bento-cell>*{flex:auto;min-height:0}.bento-col-1{grid-column:span 1/span 1}.bento-col-2{grid-column:span 2/span 2}.bento-col-3{grid-column:span 3/span 3}.bento-col-4{grid-column:span 4/span 4}.bento-col-5{grid-column:span 5/span 5}.bento-col-6{grid-column:span 6/span 6}.bento-col-7{grid-column:span 7/span 7}.bento-col-8{grid-column:span 8/span 8}.bento-col-9{grid-column:span 9/span 9}.bento-col-10{grid-column:span 10/span 10}.bento-col-11{grid-column:span 11/span 11}.bento-col-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-auto{grid-column:auto}.bento-col-1-5{grid-column:span 2/span 2}@media(min-width:640px){.sm\:bento-col-1{grid-column:span 1/span 1}.sm\:bento-col-2{grid-column:span 2/span 2}.sm\:bento-col-3{grid-column:span 3/span 3}.sm\:bento-col-4{grid-column:span 4/span 4}.sm\:bento-col-5{grid-column:span 5/span 5}.sm\:bento-col-6{grid-column:span 6/span 6}.sm\:bento-col-7{grid-column:span 7/span 7}.sm\:bento-col-8{grid-column:span 8/span 8}.sm\:bento-col-9{grid-column:span 9/span 9}.sm\:bento-col-10{grid-column:span 10/span 10}.sm\:bento-col-11{grid-column:span 11/span 11}.sm\:bento-col-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:bento-col-1-5{grid-column:span 2/span 2}}@media(min-width:768px){.md\:bento-col-1{grid-column:span 1/span 1}.md\:bento-col-2{grid-column:span 2/span 2}.md\:bento-col-3{grid-column:span 3/span 3}.md\:bento-col-4{grid-column:span 4/span 4}.md\:bento-col-5{grid-column:span 5/span 5}.md\:bento-col-6{grid-column:span 6/span 6}.md\:bento-col-7{grid-column:span 7/span 7}.md\:bento-col-8{grid-column:span 8/span 8}.md\:bento-col-9{grid-column:span 9/span 9}.md\:bento-col-10{grid-column:span 10/span 10}.md\:bento-col-11{grid-column:span 11/span 11}.md\:bento-col-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:bento-col-1-5{grid-column:span 2/span 2}}@media(min-width:1024px){.lg\:bento-col-1{grid-column:span 1/span 1}.lg\:bento-col-2{grid-column:span 2/span 2}.lg\:bento-col-3{grid-column:span 3/span 3}.lg\:bento-col-4{grid-column:span 4/span 4}.lg\:bento-col-5{grid-column:span 5/span 5}.lg\:bento-col-6{grid-column:span 6/span 6}.lg\:bento-col-7{grid-column:span 7/span 7}.lg\:bento-col-8{grid-column:span 8/span 8}.lg\:bento-col-9{grid-column:span 9/span 9}.lg\:bento-col-10{grid-column:span 10/span 10}.lg\:bento-col-11{grid-column:span 11/span 11}.lg\:bento-col-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:bento-col-1-5{grid-column:span 2/span 2}}@media(min-width:1280px){.xl\:bento-col-1{grid-column:span 1/span 1}.xl\:bento-col-2{grid-column:span 2/span 2}.xl\:bento-col-3{grid-column:span 3/span 3}.xl\:bento-col-4{grid-column:span 4/span 4}.xl\:bento-col-5{grid-column:span 5/span 5}.xl\:bento-col-6{grid-column:span 6/span 6}.xl\:bento-col-7{grid-column:span 7/span 7}.xl\:bento-col-8{grid-column:span 8/span 8}.xl\:bento-col-9{grid-column:span 9/span 9}.xl\:bento-col-10{grid-column:span 10/span 10}.xl\:bento-col-11{grid-column:span 11/span 11}.xl\:bento-col-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:bento-col-1-5{grid-column:span 2/span 2}}.pill-filled{background:var(--accent-primary);color:var(--bg-body);border-radius:9999px;align-items:center;gap:.375rem;padding:.375rem .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:opacity .15s;display:inline-flex}.pill-filled:hover{opacity:.9}.pill-subtle{background:var(--bg-subtle);color:var(--text-secondary);border:1px solid var(--border-subtle);border-radius:9999px;align-items:center;gap:.375rem;padding:.375rem .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:all .15s;display:inline-flex}.pill-subtle:hover{background:var(--bg-elevated);color:var(--text-primary)}.pill-metric{text-transform:uppercase;letter-spacing:.05em;border-radius:9999px;align-items:center;gap:.25rem;padding:.25rem .5rem;font-size:.625rem;font-weight:600;line-height:1;display:inline-flex}.pill-metric-positive{background:var(--accent-success)}@supports (color:color-mix(in lab,red,red)){.pill-metric-positive{background:color-mix(in srgb,var(--accent-success)15%,transparent)}}.pill-metric-positive{color:var(--accent-success)}.pill-metric-negative{background:var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.pill-metric-negative{background:color-mix(in srgb,var(--accent-danger)15%,transparent)}}.pill-metric-negative{color:var(--accent-danger)}.pill-metric-neutral{background:var(--overlay-soft);color:var(--text-secondary)}.pill-tag{background:var(--accent-primary);border-radius:9999px;align-items:center;padding:.125rem .5rem;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.pill-tag{background:color-mix(in srgb,var(--accent-primary)10%,transparent)}}.pill-tag{color:var(--accent-primary);text-transform:uppercase;letter-spacing:.08em;font-size:.625rem;font-weight:600}.toggle-group{background-color:var(--glass-tint);border-radius:9999px;padding:.25rem;display:inline-flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.toggle-group{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.toggle-group{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.toggle-group{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent)}}.toggle-group:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.toggle-group-item{color:var(--text-muted);border-radius:9999px;padding:.375rem .75rem;font-size:.75rem;font-weight:500;transition:all .15s}.toggle-group-item:hover{color:var(--text-secondary)}.toggle-group-item.active{background-color:var(--glass-tint)}@supports (color:color-mix(in lab,red,red)){.toggle-group-item.active{background-color:color-mix(in srgb,var(--glass-tint)36%,transparent)}}.toggle-group-item.active{color:var(--accent-primary);box-shadow:inset 0 0 0 1px var(--glass-light),inset 2px 1px 0 -1px var(--glass-light),inset -1.5px -1px 0 -1px var(--glass-light),inset -2px -6px 1px -5px var(--glass-light),inset -1px 2px 3px -1px var(--glass-dark),inset 0 -4px 1px -2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.toggle-group-item.active{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 2px 1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -1.5px -1px 0 -1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -2px -6px 1px -5px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -1px 2px 3px -1px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 0 -4px 1px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*6%),transparent)}}.toggle-group-sm{padding:.1875rem}.toggle-group-sm .toggle-group-item{padding:.25rem .5rem;font-size:.6875rem}.toggle-group-micro{padding:.125rem}.toggle-group-micro .toggle-group-item{padding:.1875rem .375rem;font-size:.625rem}.data-card{border-radius:var(--radius-xl);contain:layout style;isolation:isolate;background-color:var(--glass-tint);border:none;flex-direction:column;height:100%;padding:.75rem;display:flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.data-card{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.data-card{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.data-card{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*6%),transparent)}}@media(min-width:640px){.data-card{padding:1rem}}.data-card:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.data-card-header{justify-content:space-between;align-items:center;margin-bottom:.75rem;display:flex}.data-card-title{text-transform:uppercase;letter-spacing:.1em;color:var(--text-muted);font-size:.6875rem;font-weight:600}.data-card-controls{align-items:center;gap:.5rem;display:flex}.data-card-value{color:var(--text-primary);font-variant-numeric:tabular-nums;font-size:2rem;font-weight:600;line-height:1.1}.data-card-secondary{color:var(--text-muted);margin-top:.25rem;font-size:.75rem}.chart-container{border-radius:var(--radius-xl);isolation:isolate;background-color:var(--glass-tint);border:none;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.chart-container{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.chart-container{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.chart-container{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*6%),transparent)}}.chart-container:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.chart-header{border-bottom:1px solid var(--border-subtle);justify-content:space-between;align-items:center;padding:1rem 1.25rem;display:flex}.chart-title{color:var(--text-primary);align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;display:flex}.chart-title-icon{width:1.125rem;height:1.125rem;color:var(--icon-card-title)}.chart-body{padding:1rem;position:relative}.chart-axis-label{color:var(--text-muted);font-variant-numeric:tabular-nums;font-size:.6875rem}.chart-gridline{stroke:var(--chart-grid);stroke-dasharray:4 4}.chart-glow-primary{filter:drop-shadow(0 0 6px var(--accent-primary))}.chart-glow-secondary{filter:drop-shadow(0 0 6px var(--accent-secondary))}.chart-glow-tertiary{filter:drop-shadow(0 0 6px var(--accent-tertiary))}.roster-list{flex-direction:column;display:flex}.roster-row{border-radius:var(--radius-lg);align-items:center;gap:.5rem;padding:.75rem .75rem .75rem .5rem;transition:background .15s;display:flex}@media(min-width:640px){.roster-row{gap:.75rem;padding:.75rem 1rem .75rem .75rem}}.roster-row:hover{background:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.roster-row:hover{background:color-mix(in srgb,var(--bg-subtle)80%,transparent)}}.roster-row-interactive{cursor:pointer}.roster-row-interactive:active{background:var(--bg-subtle)}.roster-row.selected{background:var(--accent-primary)}@supports (color:color-mix(in lab,red,red)){.roster-row.selected{background:color-mix(in srgb,var(--accent-primary)8%,transparent)}}.roster-icon{border-radius:var(--radius-md);background-color:var(--glass-tint);flex-shrink:0;justify-content:center;align-items:center;width:2.5rem;height:2.5rem;display:flex}@supports (color:color-mix(in lab,red,red)){.roster-icon{background-color:color-mix(in srgb,var(--glass-tint)10%,transparent)}}.roster-icon{box-shadow:inset 0 0 0 1px var(--glass-light),inset .5px 1px 0 0 var(--glass-light)}@supports (color:color-mix(in lab,red,red)){.roster-icon{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*5%),transparent),inset .5px 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*30%),transparent)}}.roster-icon-sm{border-radius:var(--radius-md);width:2rem;height:2rem}.roster-content{flex-direction:column;flex:1;gap:.125rem;min-width:0;display:flex}.roster-title{color:var(--text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:.875rem;font-weight:500;overflow:hidden}.roster-subtitle{color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;font-size:.75rem;overflow:hidden}.roster-metrics{color:var(--text-muted);align-items:center;gap:1rem;display:flex}.roster-metric{color:var(--text-secondary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:.8125rem;font-weight:600}@media(max-width:639px){.roster-row{flex-wrap:wrap;gap:.375rem;padding:.5rem .5rem .5rem .375rem}.roster-icon{border-radius:var(--radius-sm);width:1.75rem;height:1.75rem}.roster-content{flex:1 1 0;min-width:0;overflow:hidden}.roster-title{font-size:.75rem}.roster-metrics{flex-wrap:wrap;order:3;gap:.5rem;width:100%;margin-top:.25rem;padding-left:2.25rem}.roster-metric{flex-shrink:0;margin-left:auto;font-size:.6875rem}}@media(min-width:640px)and (max-width:767px){.roster-row{gap:.5rem}.roster-icon{border-radius:var(--radius-md);width:2rem;height:2rem}.roster-metrics{gap:.75rem}}@media(min-width:768px)and (max-width:1023px){.roster-metrics{gap:.875rem}}@media(min-width:1024px){.roster-row{gap:.875rem}.roster-metrics{gap:1rem}}.contacts-grid-header,.contacts-grid-row{grid-template-columns:1fr;grid-template-areas:"node";align-items:center;gap:.75rem;display:grid}.contacts-grid-row{padding:.625rem .75rem;transition:background .15s}.contacts-grid-row:hover{background:var(--bg-subtle)}@supports (color:color-mix(in lab,red,red)){.contacts-grid-row:hover{background:color-mix(in srgb,var(--bg-subtle)80%,transparent)}}@media(max-width:639px){.contacts-grid-row{flex-wrap:nowrap;gap:.5rem;padding:.5rem .625rem;display:flex}.contacts-col-signal,.contacts-col-distance,.contacts-col-centrality,.contacts-col-activity{display:none}.contacts-col-node{flex:1 1 0;min-width:0}.contacts-col-seen,.contacts-col-actions{flex-shrink:0;align-self:center}}@media(min-width:640px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(200px,1fr) 100px 60px 68px;grid-template-areas:"node signal seen actions"}.contacts-col-node{grid-area:node}.contacts-col-signal{grid-area:signal;display:flex}.contacts-col-seen{grid-area:seen}.contacts-col-actions{grid-area:actions}.contacts-col-distance,.contacts-col-centrality,.contacts-col-activity{display:none}}@media(min-width:768px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(240px,1fr) 110px 80px 60px 68px;grid-template-areas:"node signal distance seen actions"}.contacts-col-distance{grid-area:distance;display:flex}}@media(min-width:1024px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(280px,1fr) 110px 80px 64px 64px 68px;grid-template-areas:"node signal distance centrality seen actions"}.contacts-col-centrality{grid-area:centrality;display:flex}}@media(min-width:1280px){.contacts-grid-header,.contacts-grid-row{grid-template-columns:minmax(320px,1fr) 120px 80px 64px 64px 68px 68px;grid-template-areas:"node signal distance centrality activity seen actions"}.contacts-col-activity{grid-area:activity;display:flex}}.contacts-col-node{min-width:0}.contacts-col-signal,.contacts-col-distance,.contacts-col-centrality,.contacts-col-activity,.contacts-col-seen,.contacts-col-actions{white-space:nowrap;flex-shrink:0;overflow:hidden}.roster-separator{background:linear-gradient(to right,transparent,var(--border-subtle)20%,var(--border-subtle)80%,transparent);height:1px;margin:0 1rem}.roster-empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;padding:3rem 1.5rem;display:flex}.roster-empty-icon{width:3rem;height:3rem;color:var(--text-muted);opacity:.5;margin-bottom:1rem}.roster-empty-title{color:var(--text-secondary);margin-bottom:.25rem;font-size:.875rem;font-weight:500}.roster-empty-text{color:var(--text-muted);font-size:.75rem}.btn-skeuo{border-radius:var(--radius-md);cursor:pointer;background:var(--ctrl-base);border:1px solid var(--ctrl-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-shadow-dark),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-highlight),inset 0 -2px 0 var(--ctrl-inset);justify-content:center;align-items:center;gap:.5rem;padding:.75rem 1.25rem;font-size:.875rem;font-weight:600;transition:all .12s ease-out;display:inline-flex;position:relative}.btn-skeuo:hover{background:var(--ctrl-base-hover);border-color:var(--ctrl-border-hover);box-shadow:0 4px 0 var(--ctrl-shadow-dark),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-highlight),inset 0 -2px 0 var(--ctrl-inset)}.btn-skeuo:active{background:var(--ctrl-base-active);box-shadow:0 0 0 var(--ctrl-shadow-dark),0 1px 3px var(--ctrl-shadow-mid),inset 0 3px 6px var(--ctrl-shadow-mid),inset 0 1px 0 var(--ctrl-shadow-dark);transform:translateY(3px)}.btn-skeuo:disabled{opacity:.4;cursor:not-allowed;transform:none}.btn-skeuo-primary{background:var(--ctrl-primary);border-color:var(--ctrl-primary-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-primary-shadow),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-primary-highlight),inset 0 -2px 0 var(--ctrl-primary-inset)}.btn-skeuo-primary:hover{background:var(--ctrl-primary-hover);border-color:var(--ctrl-primary-highlight);box-shadow:0 4px 0 var(--ctrl-primary-shadow),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-primary-highlight),inset 0 -2px 0 var(--ctrl-primary-inset)}.btn-skeuo-success{background:var(--ctrl-success);border-color:var(--ctrl-success-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-success-shadow),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-success-highlight),inset 0 -2px 0 var(--ctrl-success-inset)}.btn-skeuo-success:hover{background:var(--ctrl-success-hover);border-color:var(--ctrl-success-highlight);box-shadow:0 4px 0 var(--ctrl-success-shadow),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-success-highlight),inset 0 -2px 0 var(--ctrl-success-inset)}.btn-skeuo-warning{background:var(--ctrl-warning);border-color:var(--ctrl-warning-border);color:var(--text-primary);box-shadow:0 3px 0 var(--ctrl-warning-shadow),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-warning-highlight),inset 0 -2px 0 var(--ctrl-warning-inset)}.btn-skeuo-warning:hover{background:var(--ctrl-warning-hover);border-color:var(--ctrl-warning-highlight);box-shadow:0 4px 0 var(--ctrl-warning-shadow),0 8px 20px var(--ctrl-shadow-mid),0 3px 8px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-warning-highlight),inset 0 -2px 0 var(--ctrl-warning-inset)}.btn-skeuo-neutral{background:var(--ctrl-base);border-color:var(--ctrl-border);color:var(--text-secondary);box-shadow:0 3px 0 var(--ctrl-shadow-dark),0 6px 16px var(--ctrl-shadow-mid),0 2px 6px var(--ctrl-shadow-dark),inset 0 1px 0 var(--ctrl-highlight),inset 0 -2px 0 var(--ctrl-inset)}.btn-skeuo-neutral:hover{background:var(--ctrl-base-hover);color:var(--text-primary);box-shadow:0 4px #18191d,0 8px 20px #08090b,0 3px 8px #0d0e12,inset 0 1px #5e5f6b,inset 0 -2px #26272e}.control-card{border-radius:var(--radius-lg);background-color:var(--glass-tint);padding:1rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.control-card{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.control-card{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.control-card{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*50%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*40%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent)}}.control-card:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.control-card-header{justify-content:space-between;align-items:center;margin-bottom:.75rem;display:flex}.control-card-label{color:var(--text-muted);font-size:.8125rem}.control-card-value{font-size:.8125rem;font-weight:600}.control-card-value-active{color:var(--accent-success)}.control-card-value-inactive{color:var(--text-muted)}.btn-skeuo-icon{stroke-width:2.5px;width:1.125rem;height:1.125rem}.mini-widget{border-radius:var(--radius-xl);contain:layout style;background-color:var(--glass-tint);flex-direction:column;gap:.25rem;padding:.75rem;display:flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.mini-widget{background-color:color-mix(in srgb,var(--glass-tint)var(--glass-bg-opacity),transparent)}}.mini-widget{-webkit-backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));backdrop-filter:blur(var(--glass-blur))brightness(var(--glass-brightness));box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.mini-widget{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*10%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*80%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*60%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.mini-widget:before{content:"";pointer-events:none;border-radius:inherit;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom);position:absolute;top:0;right:0;bottom:0;left:0}.mini-widget:hover{box-shadow:inset 0 0 0 1px var(--glass-light),inset 1.8px 3px 0 -2px var(--glass-light),inset -2px -2px 0 -2px var(--glass-light),inset -3px -8px 1px -6px var(--glass-light),inset -.3px -1px 4px 0 var(--glass-dark),inset -1.5px 2.5px 0 -2px var(--glass-dark),inset 0 3px 4px -2px var(--glass-dark),inset 2px -6.5px 1px -4px var(--glass-dark),0 1px 5px 0 var(--glass-dark),0 6px 16px 0 var(--glass-dark)}@supports (color:color-mix(in lab,red,red)){.mini-widget:hover{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*15%),transparent),inset 1.8px 3px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*100%),transparent),inset -2px -2px 0 -2px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*90%),transparent),inset -3px -8px 1px -6px color-mix(in srgb,var(--glass-light)calc(var(--glass-reflex-light)*70%),transparent),inset -.3px -1px 4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*12%),transparent),inset -1.5px 2.5px 0 -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 0 3px 4px -2px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*20%),transparent),inset 2px -6.5px 1px -4px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 1px 5px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*10%),transparent),0 6px 16px color-mix(in srgb,var(--glass-dark)calc(var(--glass-reflex-dark)*8%),transparent)}}.mini-widget-header{align-items:center;gap:.375rem;min-height:1.25rem;display:flex}.mini-widget-icon{width:1rem;height:1rem;color:var(--icon-widget);flex-shrink:0}.mini-widget-title{font-family:Poppins,sans-serif;font-size:var(--text-xs);color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;text-overflow:ellipsis;font-weight:500;line-height:1.2;overflow:hidden}.mini-widget-value{font-family:var(--font-data);font-size:var(--text-xl);color:var(--text-primary);font-weight:600;line-height:1.1}.mini-widget-value-lg{font-size:var(--text-2xl)}.mini-widget-value-sm{font-size:var(--text-lg)}.mini-widget-unit{font-size:var(--text-xs);color:var(--text-muted);margin-left:.125rem;font-weight:400}.mini-widget-subtitle{font-family:var(--font-data);font-size:var(--text-sm);color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;line-height:1.3;overflow:hidden}.mini-widget-status-dot{border-radius:50%;flex-shrink:0;width:.5rem;height:.5rem}.mini-widget-status-dot.excellent{background:var(--signal-excellent)}.mini-widget-status-dot.good{background:var(--signal-good)}.mini-widget-status-dot.fair{background:var(--signal-fair)}.mini-widget-status-dot.poor{background:var(--signal-poor)}.mini-widget-status-dot.critical{background:var(--signal-critical)}.mini-widget-status-dot.unknown{background:var(--signal-unknown)}.mini-widget-trend{font-size:var(--text-xs);align-items:center;gap:.125rem;font-weight:500;display:flex}.mini-widget-trend.up{color:var(--accent-danger)}.mini-widget-trend.down{color:var(--accent-success)}.mini-widget-trend.stable{color:var(--text-muted)}.mini-widget-sparkline{width:100%;min-width:1px;height:1.5rem;min-height:1px;margin-top:auto}.mini-widget-loading{justify-content:center;align-items:center;min-height:4rem;display:flex}.mini-widget-loading-spinner{border:2px solid var(--border-subtle);border-top-color:var(--accent-primary);border-radius:50%;width:1rem;height:1rem;animation:.8s linear infinite spin}.mini-widget-error{min-height:4rem;color:var(--text-muted);font-size:var(--text-sm);justify-content:center;align-items:center;display:flex}.mini-widget-progress{background:var(--bg-subtle);border-radius:.125rem;height:.25rem;margin-top:auto;overflow:hidden}.mini-widget-progress-bar{border-radius:.125rem;height:100%;transition:width .3s}.mini-widget-progress-bar.excellent{background:var(--signal-excellent)}.mini-widget-progress-bar.good{background:var(--signal-good)}.mini-widget-progress-bar.fair{background:var(--signal-fair)}.mini-widget-progress-bar.poor{background:var(--signal-poor)}.mini-widget-progress-bar.critical{background:var(--signal-critical)}.mini-widget-toggle{align-items:center;gap:.5rem;display:flex}.mini-widget-toggle-track{background:var(--bg-subtle);border:1px solid var(--border-subtle);cursor:pointer;border-radius:.5rem;width:2rem;height:1rem;transition:all .2s;position:relative}.mini-widget-toggle-track.active{background:var(--accent-success);border-color:var(--accent-success)}.mini-widget-toggle-thumb{background:#fff;border-radius:50%;width:.75rem;height:.75rem;transition:left .2s;position:absolute;top:50%;left:.125rem;transform:translateY(-50%)}.mini-widget-toggle-track.active .mini-widget-toggle-thumb{left:calc(100% - .875rem)}.mesh-health-container{margin-bottom:1rem}@media(min-width:640px){.mesh-health-container{margin-bottom:1.5rem}}.mesh-health-header{align-items:center;gap:.375rem;margin-bottom:.5rem;display:flex}@media(min-width:640px){.mesh-health-header{gap:.5rem;margin-bottom:.75rem}}.widget-row{gap:.5rem;display:grid}@media(min-width:640px){.widget-row{gap:.75rem}}@media(min-width:768px){.widget-row{grid-template-columns:repeat(3,1fr)}.mini-widget{height:7.5rem}}@media(max-width:767px){.widget-row{grid-template-columns:repeat(2,1fr)}.mini-widget{height:6rem;padding:.5rem}.mini-widget-title{font-size:.625rem}.mini-widget-value{font-size:var(--text-base)}.mini-widget-value-lg{font-size:var(--text-lg)}.mini-widget-subtitle{font-size:var(--text-xs)}}.mini-widget-value.excellent{color:var(--signal-excellent)}.mini-widget-value.good{color:var(--signal-good)}.mini-widget-value.fair{color:var(--signal-fair)}.mini-widget-value.poor{color:var(--signal-poor)}.mini-widget-value.critical{color:var(--signal-critical)}.data-box{border-radius:var(--radius-sm);background:var(--data-box-bg);border:1px solid var(--data-box-border);font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);--data-box-color:var(--text-primary);color:var(--data-box-color);letter-spacing:-.03em;font-variant-numeric:tabular-nums;font-feature-settings:"zero","tnum";white-space:nowrap;text-overflow:ellipsis;justify-content:center;align-items:center;min-width:0;padding:.25rem .5rem;line-height:1.2;display:inline-flex;overflow:hidden}.data-box-compact,.data-box-responsive{font-size:var(--text-xs);border-radius:var(--radius-xs);padding:.125rem .375rem}@media(min-width:640px){.data-box-responsive{font-size:var(--text-sm);border-radius:var(--radius-sm);padding:.25rem .5rem}}.data-box-hug{width:auto}.data-box-fill{width:100%;display:flex}.data-box-left{justify-content:flex-start}.data-box-center{justify-content:center}.data-box-right{justify-content:flex-end}.data-box-label{font-family:var(--font-data);font-size:var(--text-sm);font-weight:var(--font-normal);color:var(--text-muted);margin-bottom:.25rem;line-height:1.3}.input-base{border-radius:var(--radius-sm);background-color:var(--surface-tint-light);border:var(--stroke-thin)solid var(--border-subtle);width:100%;color:var(--text-primary);transition:border-color var(--duration-fast)var(--ease-out),box-shadow var(--duration-fast)var(--ease-out);padding:.625rem .875rem;font-size:.875rem;line-height:1.5}.input-base::placeholder{color:var(--text-muted)}.input-base:focus{border-color:var(--accent-primary);box-shadow:0 0 0 var(--ring-width-default) var(--accent-primary);outline:none}@supports (color:color-mix(in lab,red,red)){.input-base:focus{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-primary)25%,transparent)}}.input-base:disabled{opacity:var(--disabled-opacity);cursor:not-allowed}.input-compact{padding:.375rem .625rem;font-size:.8125rem}.input-error{border-color:var(--accent-danger)}.input-error:focus{box-shadow:0 0 0 var(--ring-width-default) var(--accent-danger)}@supports (color:color-mix(in lab,red,red)){.input-error:focus{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-danger)25%,transparent)}}.input-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--radius-sm);background-color:var(--surface-tint-light);border:var(--stroke-thin)solid var(--border-subtle);width:100%;color:var(--text-primary);cursor:pointer;transition:border-color var(--duration-fast)var(--ease-out);padding:.625rem 2.5rem .625rem .875rem;font-size:.875rem}.input-select:focus{border-color:var(--accent-primary);box-shadow:0 0 0 var(--ring-width-default) var(--accent-primary);outline:none}@supports (color:color-mix(in lab,red,red)){.input-select:focus{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-primary)25%,transparent)}}.input-group{align-items:center;display:flex;position:relative}.input-group-icon{pointer-events:none;color:var(--text-muted);width:1rem;height:1rem;position:absolute;left:.75rem}.input-group .input-base{padding-left:2.25rem}.input-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--radius-xs);background-color:var(--surface-tint-light);border:var(--stroke-thin)solid var(--border-subtle);cursor:pointer;width:1rem;height:1rem;transition:background-color var(--duration-fast)var(--ease-out),border-color var(--duration-fast)var(--ease-out)}.input-checkbox:checked{background-color:var(--accent-primary);border-color:var(--accent-primary)}.input-checkbox:focus-visible{box-shadow:0 0 0 var(--ring-width-default) var(--accent-primary);outline:none}@supports (color:color-mix(in lab,red,red)){.input-checkbox:focus-visible{box-shadow:0 0 0 var(--ring-width-default) color-mix(in srgb,var(--accent-primary)25%,transparent)}}input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}input:focus-visible{box-shadow:0 0 0 2px var(--accent-primary);outline:none}select{background-image:none}.terminal-card{height:calc(100dvh - 160px);min-height:300px;max-height:calc(100vh - 120px);padding-bottom:env(safe-area-inset-bottom,0)}@media(min-width:640px){.terminal-card{height:calc(100dvh - 180px);min-height:400px}}@media(min-width:1024px){.terminal-card{height:calc(100vh - 180px);min-height:500px}}.terminal-ascii{letter-spacing:-.5px;font-size:8px}@media(min-width:375px){.terminal-ascii{letter-spacing:0;font-size:9px}}@media(min-width:414px){.terminal-ascii{font-size:10px}}@media(min-width:640px){.terminal-ascii{font-size:11px}}@media(min-width:768px){.terminal-ascii{font-size:12px}}@media(min-width:1024px){.terminal-ascii{font-size:13px}}@supports (-webkit-touch-callout:none){.terminal-card input{font-size:16px}}.terminal-card>div:first-child{-webkit-overflow-scrolling:touch;overscroll-behavior:contain}@keyframes flash-white-fade{0%{opacity:.2}to{opacity:0}}.flash-overlay{border-radius:inherit;pointer-events:none;z-index:50;background-color:#fff;animation:.6s ease-out forwards flash-white-fade;position:absolute;top:0;right:0;bottom:0;left:0}@keyframes flash-row-bg{0%{background-color:#fff3}to{background-color:#0000}}.flash-row{animation:.6s ease-out forwards flash-row-bg}@keyframes flash-icon-pulse{0%{color:#fff;filter:drop-shadow(0 0 6px #fffc)}to{color:var(--text-muted);filter:none}}.flash-icon{animation:.6s ease-out forwards flash-icon-pulse}@keyframes pulse-slow{0%,to{opacity:1}50%{opacity:.4}}.animate-pulse-slow{animation:3s ease-in-out infinite pulse-slow}@keyframes shimmer-border{0%{background-position:200% 0}to{background-position:-200% 0}}.shimmer-border{z-index:1;pointer-events:none;background:linear-gradient(90deg,transparent 0%,transparent 25%,var(--accent-primary)50%,transparent 75%,transparent 100%);border-radius:inherit;opacity:.8;background-size:200% 100%;padding:2px;animation:2s ease-in-out infinite shimmer-border;position:absolute;top:0;right:0;bottom:0;left:0;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);mask-image:linear-gradient(#fff 0,#fff 0),linear-gradient(#fff 0,#fff 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.shimmer-border-light{background:linear-gradient(90deg,#0000,#0000,#fff6,#0000,#0000)}.shimmer-indicator{background:var(--bg-elevated);border-radius:2px;width:40px;height:4px;position:relative;overflow:hidden}.shimmer-indicator-inner{background:linear-gradient(90deg,transparent 0%,var(--accent-primary)50%,transparent 100%);background-size:200% 100%;animation:1.5s ease-in-out infinite shimmer-border;position:absolute;top:0;right:0;bottom:0;left:0}.map-container-16-9{width:100%;height:80dvh;min-height:320px;max-height:900px;position:relative}@media(max-width:639px){.map-container-16-9{width:calc(100% + 2rem);height:70dvh;min-height:280px;max-height:600px;margin-left:-1rem;margin-right:-1rem}.map-container-16-9>div{border-radius:0!important}}@media(min-width:640px)and (max-width:1023px){.map-container-16-9{height:75dvh;max-height:700px}}@media(min-width:1920px){.map-container-16-9{max-height:1000px}}.map-container-fullscreen{width:100vw!important;height:calc(100dvh - 3.5rem)!important;aspect-ratio:unset!important;min-height:unset!important;max-height:unset!important;z-index:999!important;border-radius:0!important;padding-bottom:0!important;position:fixed!important;top:3.5rem!important;right:0!important;bottom:0!important;left:0!important}@media(min-width:1024px){.map-container-fullscreen{height:100dvh!important;top:0!important}}.map-blue-water{position:relative}.map-blue-water .leaflet-tile-pane{filter:sepia(.15)hue-rotate(180deg)saturate(.7)brightness(.95)}.map-blue-water:after{content:"";background:linear-gradient(180deg,var(--map-overlay-blue-dark)0%,var(--map-overlay-blue-light)100%);pointer-events:none;z-index:400;mix-blend-mode:multiply;position:absolute;top:0;right:0;bottom:0;left:0}.map-blue-water .leaflet-marker-pane,.map-blue-water .leaflet-popup-pane,.map-blue-water .leaflet-overlay-pane{filter:none!important}.leaflet-control-attribution{background:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.leaflet-control-attribution{background:color-mix(in srgb,var(--bg-body)85%,transparent)!important}}.leaflet-control-attribution{color:var(--text-muted)!important;border-radius:var(--radius-xs)0 0 0!important;padding:2px 6px!important;font-size:10px!important}.leaflet-control-attribution a{color:var(--text-secondary)!important}.leaflet-control-zoom{overflow:hidden;border-radius:var(--radius-lg)!important;background:var(--bg-body)!important;border:none!important;margin-top:1rem!important;margin-left:1rem!important}@supports (color:color-mix(in lab,red,red)){.leaflet-control-zoom{background:color-mix(in srgb,var(--bg-body)85%,transparent)!important}}.leaflet-control-zoom{-webkit-backdrop-filter:blur(12px);border:1px solid var(--map-border-accent)!important}.leaflet-control-zoom a{color:var(--text-secondary)!important;border:none!important;border-bottom:1px solid var(--map-border-accent-subtle)!important;background:0 0!important;width:32px!important;height:32px!important;font-size:16px!important;font-weight:500!important;line-height:32px!important}.leaflet-control-zoom a:last-child{border-bottom:none!important}.leaflet-control-zoom a:hover{background:var(--map-hover-tint)!important;color:var(--text-primary)!important}.leaflet-control-zoom a.leaflet-disabled{opacity:.5;color:var(--text-muted)!important}.map-dot-marker{background:0 0!important;border:none!important}.map-ring-marker,.map-filled-marker,.map-local-marker{cursor:pointer!important;z-index:500!important;pointer-events:auto!important;background:0 0!important;border:none!important}.leaflet-marker-pane{z-index:600!important;pointer-events:auto!important}.leaflet-marker-pane .leaflet-marker-icon{pointer-events:auto!important}.leaflet-popup-content-wrapper{border-radius:var(--radius-lg)!important;background-color:var(--map-popup-bg)!important;-webkit-backdrop-filter:blur(12px)brightness(.7)saturate(.9)!important;backdrop-filter:blur(12px)brightness(.7)saturate(.9)!important;box-shadow:inset 0 0 0 1px var(--map-hover-tint),var(--map-popup-shadow)!important;border:none!important;padding:0!important;position:relative!important;overflow:hidden!important}.leaflet-popup-content{color:var(--text-primary)!important;margin:.75rem!important}.leaflet-popup-content strong{color:var(--text-primary)!important}.leaflet-popup-content hr{border-color:var(--map-border-accent-subtle)!important;margin:.5rem 0!important}.leaflet-popup-tip-container{display:none!important}.leaflet-popup-close-button{color:var(--text-muted)!important;width:24px!important;height:24px!important;padding:6px!important;font-size:18px!important;top:4px!important;right:4px!important}.leaflet-popup-close-button:hover{color:var(--text-primary)!important;background:var(--map-hover-tint)!important;border-radius:var(--radius-xs)!important}.leaflet-tooltip{white-space:nowrap;border-radius:var(--radius-md)!important;background-color:var(--bg-body)!important;box-shadow:inset 0 0 0 1px var(--glass-border-glow),inset 1.5px 2px 0 -1px var(--glass-highlight-tl),inset -1.5px -1.5px 0 -1px var(--glass-highlight-br),inset 0 -1px 3px 0 var(--glass-shadow-inner)!important;color:var(--text-primary)!important;border:none!important;padding:.375rem .5rem!important;font-size:11px!important;position:relative!important;overflow:hidden!important}.leaflet-tooltip:after{content:""!important;pointer-events:none!important;border-radius:inherit!important;z-index:999!important;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom)!important;position:absolute!important;top:0!important;right:0!important;bottom:0!important;left:0!important}.leaflet-tooltip:before{display:none!important}.leaflet-tooltip .text-text-muted{color:var(--text-muted)!important}.maplibregl-popup{font-family:var(--font-display),system-ui,-apple-system,sans-serif;font-size:var(--text-sm)}.maplibregl-popup-content{min-width:140px;border-radius:var(--radius-lg)!important;background-color:var(--bg-body)!important;box-shadow:inset 0 0 0 1px var(--glass-border-glow),inset 1.8px 3px 0 -2px var(--glass-highlight-tl),inset -2px -2px 0 -2px var(--glass-highlight-br),inset -3px -8px 1px -6px var(--glass-highlight-edge),inset -.3px -1px 4px 0 var(--glass-shadow-inner),inset 0 3px 4px -2px var(--glass-shadow-top)!important;color:var(--text-primary)!important;border:none!important;padding:.75rem!important;position:relative!important;overflow:hidden!important}.maplibregl-popup-content:after{content:""!important;pointer-events:none!important;border-radius:inherit!important;z-index:999!important;background:var(--glass-surface-tint),var(--glass-reflection-top),var(--glass-reflection-bottom)!important;position:absolute!important;top:0!important;right:0!important;bottom:0!important;left:0!important}.maplibregl-popup-close-button{border-radius:var(--radius-xs);transition:background .1s,color .1s;color:var(--text-muted)!important;width:24px!important;height:24px!important;padding:6px!important;font-size:18px!important;top:4px!important;right:4px!important}.maplibregl-popup-close-button:hover{color:var(--text-primary)!important;background:var(--map-hover-tint)!important}.maplibregl-popup-tip{display:none!important}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{border-top-color:var(--tooltip-bg)!important}.maplibregl-marker.local-node-marker{z-index:10!important}.maplibregl-marker:has(.z-50){z-index:20!important}.maplibregl-popup{z-index:100!important}.maplibregl-ctrl-attrib{background:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.maplibregl-ctrl-attrib{background:color-mix(in srgb,var(--bg-body)80%,transparent)!important}}.maplibregl-ctrl-attrib{color:var(--text-muted)!important;padding:2px 6px!important;font-size:10px!important}.maplibregl-ctrl-attrib a{color:var(--text-secondary)!important}.maplibregl-ctrl-attrib.maplibregl-compact{background:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.maplibregl-ctrl-attrib.maplibregl-compact{background:color-mix(in srgb,var(--bg-body)80%,transparent)!important}}.maplibregl-ctrl-attrib.maplibregl-compact{border-radius:var(--radius-xs)!important}.maplibregl-map,.leaflet-container{touch-action:pan-x pan-y;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.maplibregl-ctrl button:focus,.leaflet-control a:focus{outline:2px solid var(--accent-primary);outline-offset:2px}@media(prefers-contrast:high){.maplibregl-ctrl button,.leaflet-control a{border:2px solid!important}.map-legend,.map-controls{border:2px solid var(--text-primary)!important}}@media(prefers-reduced-motion:reduce){.maplibregl-map,.leaflet-container{transition:none!important}.maplibregl-map *{transition:none!important;animation:none!important}}@-moz-document url-prefix(){.maplibregl-canvas{transform:translateZ(0)}}@supports (-webkit-touch-callout:none){.maplibregl-canvas{will-change:transform;transform:translateZ(0)}}@media(forced-colors:active){.maplibregl-ctrl button,.leaflet-control a{forced-color-adjust:none;color:buttontext!important;background:canvas!important;border:1px solid buttontext!important}.maplibregl-popup-content,.leaflet-popup-content-wrapper{color:canvastext!important;background:canvas!important;border:2px solid canvastext!important}}.maplibregl-ctrl-attrib-button{background-color:var(--bg-body)!important}@supports (color:color-mix(in lab,red,red)){.maplibregl-ctrl-attrib-button{background-color:color-mix(in srgb,var(--bg-body)80%,transparent)!important}}.maplibregl-ctrl-attrib-button{border-radius:var(--radius-xs)!important}.maplibregl-ctrl-group{border-radius:var(--radius-md)!important;background-color:var(--map-ui-bg,var(--bg-surface))!important;box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a)!important;border:none!important;position:relative!important;overflow:hidden!important}.maplibregl-ctrl-group:after{display:none!important}.maplibregl-ctrl-group button{border:none!important;border-bottom:1px solid var(--map-ui-border,var(--border-subtle))!important;background:0 0!important;width:28px!important;height:28px!important}.maplibregl-ctrl-group button:last-child{border-bottom:none!important}.maplibregl-ctrl-group button:hover{background:var(--map-ui-hover,var(--bg-elevated))!important}.maplibregl-ctrl-group button .maplibregl-ctrl-icon{filter:invert()brightness(.75)}.maplibregl-ctrl-group button:hover .maplibregl-ctrl-icon{filter:invert()brightness()}[data-basemap=light] .maplibregl-ctrl-group button .maplibregl-ctrl-icon{filter:brightness(.3)}[data-basemap=light] .maplibregl-ctrl-group button:hover .maplibregl-ctrl-icon{filter:brightness(.1)}.maplibregl-ctrl-scale{border:1px solid var(--map-local-color)!important;color:var(--map-local-color)!important;font-size:10px!important;font-family:var(--font-data)!important;background:0 0!important;border-top:none!important;border-radius:0!important;padding:2px 6px!important;line-height:1.2!important}.map-control-glass{border-radius:var(--radius-md);background-color:var(--map-ui-bg,var(--bg-surface));color:var(--map-ui-text,var(--text-primary));box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);position:relative;overflow:hidden}.map-control-glass:after{display:none}.map-control-glass-active{border-radius:var(--radius-md);background-color:var(--map-ui-bg,var(--bg-surface));color:var(--map-ui-text,var(--text-primary));box-shadow:inset 0 0 0 1px var(--map-ui-border-strong,var(--border-strong)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);position:relative;overflow:hidden}.map-control-glass-active:after{display:none}.map-control-glass .text-text-secondary,.map-control-glass-active .text-text-secondary,.map-legend-stack .text-text-secondary{color:var(--map-ui-text-secondary,var(--text-secondary))}.map-control-glass .text-text-muted,.map-control-glass-active .text-text-muted,.map-legend-stack .text-text-muted{color:var(--map-ui-text-muted,var(--text-muted))}.map-controls-container{background-color:var(--map-ui-bg,var(--bg-surface));max-width:calc(100vw - 1.5rem);color:var(--map-ui-text,var(--text-primary));border-radius:var(--radius-md);box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);flex-direction:column;align-items:stretch;gap:0;display:flex;overflow:hidden}.map-controls-row{flex-wrap:wrap;justify-content:flex-end;gap:.25rem;padding:.25rem;display:flex}.map-controls-row+.map-controls-row{border-top:1px solid var(--map-ui-border,var(--border-subtle))}.map-controls-secondary{flex-wrap:wrap}.map-control-btn{touch-action:manipulation;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;padding:.375rem;transition:background-color .15s}@media(hover:hover)and (pointer:fine){.map-control-btn:hover{background-color:var(--map-ui-hover,var(--bg-elevated))}}.map-control-btn:active{background-color:var(--map-ui-active,var(--bg-subtle))}.map-control-icon{width:16px;height:16px}.map-nav-module{padding:.25rem}.map-control-active-amber{background-color:var(--map-control-active-amber)!important}.map-control-active-sky{background-color:var(--map-control-active-sky)!important}.map-control-active-teal{background-color:var(--map-control-active-teal)!important}@media(max-width:639px){.map-controls-container{border-radius:var(--radius-md);max-width:calc(100vw - 1rem)}.map-controls-row{gap:.125rem;padding:.1875rem}.map-control-btn{justify-content:center;align-items:center;min-width:32px;min-height:32px;padding:.375rem;display:flex}.map-control-icon{width:14px;height:14px}.map-control-label{display:none}.map-nav-module{padding:.1875rem}.maplibregl-ctrl-group{border-radius:var(--radius-md)!important}.maplibregl-ctrl-group button{width:28px!important;height:28px!important}.maplibregl-ctrl-group button .maplibregl-ctrl-icon{width:18px!important;height:18px!important}}@media(min-width:640px)and (max-width:1023px){.map-controls-row,.map-nav-module{padding:.25rem}}@media(min-width:1024px){.map-controls-row{gap:.375rem;padding:.375rem}.map-nav-module{padding:.375rem}}.map-legend-stack{z-index:600;background-color:var(--map-ui-bg,var(--bg-surface));max-width:150px;max-height:calc(100% - 1.5rem);color:var(--map-ui-text,var(--text-primary));border-radius:var(--radius-md);box-shadow:inset 0 0 0 1px var(--map-ui-border,var(--border-subtle)),var(--map-ui-shadow,0 2px 8px #00000026,0 4px 16px #0000001a);flex-direction:column;gap:0;display:flex;position:absolute;bottom:.75rem;left:.75rem;overflow:hidden auto}.map-legend-stack>*{box-shadow:none;background-color:#0000;border-radius:0}.map-legend-stack>:first-child{border-radius:var(--radius-md)var(--radius-md)0 0}.map-legend-stack>:last-child{border-radius:0 0 var(--radius-md)var(--radius-md)}.map-legend-stack>:only-child{border-radius:var(--radius-md)}.map-legend-stack>*+*{border-top:1px solid var(--map-ui-border,var(--border-subtle))}@media(min-width:640px){.map-legend-stack{max-width:160px;bottom:1rem;left:1rem}}.map-edge-tooltip{z-index:1000;pointer-events:none;max-width:calc(100vw - 2rem);position:absolute;bottom:1rem;left:calc(50% + 85px);transform:translate(-50%)}.map-edge-tooltip-inner{pointer-events:auto;padding:.625rem 1rem}@media(max-width:639px){.map-edge-tooltip{bottom:.5rem;left:.5rem;right:.5rem;transform:none}.map-edge-tooltip-inner{border-radius:var(--radius-lg);background-color:var(--map-ui-bg,var(--bg-body));padding:.75rem}.map-edge-tooltip .w-\[540px\]{width:100%;max-width:100%}}.map-container-fullscreen .map-edge-tooltip{bottom:1.5rem}[data-basemap=light]{--map-edge-rest:#0003;--map-edge-rest-bright:#0000004d;--map-edge-rest-dim:#0000001f;--map-ui-bg:#f8f8f8;--map-ui-bg-elevated:#fff;--map-ui-border:#0000001f;--map-ui-border-strong:#0003;--map-ui-text:#1a1a1a;--map-ui-text-secondary:#4a4a4a;--map-ui-text-muted:#737373;--map-ui-hover:#0000000f;--map-ui-active:#0000001a;--map-ui-shadow:0 2px 8px #00000014,0 4px 16px #0000000a}[data-basemap=dark]{--map-ui-bg:var(--bg-surface);--map-ui-bg-elevated:var(--bg-elevated);--map-ui-border:var(--border-subtle);--map-ui-border-strong:var(--border-strong);--map-ui-text:var(--text-primary);--map-ui-text-secondary:var(--text-secondary);--map-ui-text-muted:var(--text-muted);--map-ui-hover:var(--hover-tint);--map-ui-active:var(--bg-elevated);--map-ui-shadow:0 2px 8px #00000026,0 4px 16px #0000001a}[data-basemap] .map-control-glass,[data-basemap] .map-controls-container,[data-basemap] .map-legend-stack,[data-basemap] .map-legend-stack button,[data-basemap] .maplibregl-ctrl-group,[data-basemap] .maplibregl-ctrl-group button{transition:background-color .3s,color .3s,box-shadow .3s,border-color .3s!important}[data-basemap] .map-control-glass .text-text-secondary,[data-basemap] .map-control-glass .text-text-muted,[data-basemap] .map-legend-stack .text-text-secondary,[data-basemap] .map-legend-stack .text-text-muted{transition:color .3s!important}[data-basemap] .map-legend-stack>*+*,[data-basemap] .map-controls-row+.map-controls-row{transition:border-color .3s!important}[data-basemap=light] .map-control-glass,[data-basemap=light] .map-controls-container,[data-basemap=light] .map-legend-stack{color:#1a1a1a!important;background-color:#f8f8f8!important;box-shadow:inset 0 0 0 1px #0000001f,0 2px 8px #00000014,0 4px 16px #0000000a!important}[data-basemap=light] .maplibregl-ctrl-group{background-color:#f8f8f8!important;box-shadow:inset 0 0 0 1px #0000001f,0 2px 8px #00000014,0 4px 16px #0000000a!important}[data-basemap=light] .maplibregl-ctrl-group button{border-bottom-color:#0000001f!important}[data-basemap=light] .maplibregl-ctrl-group button:hover{background-color:#0000000f!important}[data-basemap=light] .map-control-glass .text-text-secondary,[data-basemap=light] .map-legend-stack .text-text-secondary{color:#4a4a4a!important}[data-basemap=light] .map-control-glass .text-text-muted,[data-basemap=light] .map-legend-stack .text-text-muted{color:#737373!important}[data-basemap=light] .map-control-glass .text-text-primary,[data-basemap=light] .map-legend-stack .text-text-primary{color:#1a1a1a!important}[data-basemap=light] .map-control-glass button.text-text-muted,[data-basemap=light] .map-control-glass [class*=text-text-muted]{color:#737373!important}[data-basemap=light] .map-control-glass button:hover.text-text-muted,[data-basemap=light] .map-control-glass button:hover .text-text-muted{color:#1a1a1a!important}[data-basemap=light] .map-legend-stack>*+*,[data-basemap=light] .map-controls-row+.map-controls-row{border-top-color:#0000001f!important}[data-basemap=light] .map-control-glass .bg-border-subtle,[data-basemap=light] .map-control-glass .border-border-subtle{background-color:#0000001f!important;border-color:#0000001f!important}[data-basemap=light] .map-control-btn:hover{background-color:#0000000f!important}[data-basemap=light] .map-control-btn:active{background-color:#0000001a!important}[data-basemap=light] .map-control-glass button:hover{background-color:#0000000f!important}[data-basemap=light] .map-control-glass button:active{background-color:#0000001a!important}.border-map-ui-border{border-color:var(--map-ui-border)}@supports (color:color(display-p3 1 1 1)){.signal-bar-active{background-color:var(--p3-color,inherit)}}[data-theme="kde breeze"]{--glass-reflection-top:none;--glass-reflection-bottom:none;--glass-surface-tint:none}:root{--bg-body:#171717;--bg-surface:#252525;--bg-elevated:#333233;--bg-subtle:#3f3f3f;--border-subtle:#4b4b4b;--border-strong:#616161;--text-primary:#e8e8e8;--text-secondary:#c9c9c9;--text-muted:#a8a8a8;--text-invert:#171717;--accent-primary:#719cdf;--accent-secondary:#dfbc72;--accent-tertiary:#6fbcbd;--accent-danger:#e12672;--accent-success:#719872;--overlay-soft:#ffffff0a;--shadow-tint:#719cdf59;--sidebar-tint:#719cdf0f;--tooltip-bg:#252525;--hover-tint:#719cdf14;--glass-tint:#252525;--glass-light:#fff;--glass-dark:#000;--glass-reflex-light:.15;--glass-reflex-dark:.8;--glass-blur:6px;--glass-blur-elevated:8px;--glass-brightness:1;--glass-surface-tint:linear-gradient(to bottom,#ffffff06,#ffffff04);--glass-reflection-top:linear-gradient(to bottom,#ffffff05 0px,transparent 16px);--glass-reflection-bottom:linear-gradient(to top,#ffffff05 0px,transparent 20px);--glass-border-glow:#ffffff14;--glass-highlight-tl:#ffffff1f;--glass-highlight-br:#ffffff14;--glass-highlight-edge:#ffffff0f;--glass-shadow-inner:#00000026;--glass-shadow-top:#0000001f;--glass-bg-opacity:8%;--glass-bg-opacity-elevated:12%;--signal-excellent:#0f0;--signal-good:#8ce619;--signal-fair:#ffd900;--signal-poor:#ff8c26;--signal-critical:#f33;--signal-unknown:#616161;--sparkline-excellent:#0f0;--sparkline-good:#8ce619;--sparkline-fair:#ffd900;--sparkline-poor:#ff8c26;--sparkline-critical:#f33;--status-success:#719872;--status-warning:#dfbc72;--status-danger:#e12672;--status-info:#6fbcbd;--status-muted:#616161;--pkt-advert:#dfbc72;--pkt-flood:#6fbcbd;--pkt-txt-msg:#719872;--pkt-ack:#999abd;--pkt-trace:#70bddf;--pkt-req:#0074be;--pkt-response:#98bc99;--pkt-grp-txt:#e17899;--pkt-grp-data:#be7572;--pkt-path:#70bddf;--pkt-anon:#bdbb72;--pkt-unknown:#616161;--pkt-science-req:#0090ff;--pkt-science-anon-req:#06c;--pkt-science-response:#6cf;--pkt-science-ack:#00e699;--pkt-science-advert:#fff200;--pkt-science-txt-msg:#ffb300;--pkt-science-grp-txt:#ff80c0;--pkt-science-grp-data:#f60;--pkt-science-multipart:#b3b3b3;--pkt-science-raw-custom:#e666cc;--pkt-science-path:#66b3ff;--pkt-science-trace:#33ffb3;--pkt-science-unknown:gray;--route-flood:var(--accent-primary);--route-direct:#dfbc72;--route-transport:#999abd;--chart-1:#719cdf;--chart-2:#0074be;--chart-3:#6fbcbd;--chart-4:#dfbc72;--chart-5:#719872;--chart-6:#e12672;--chart-7:#e17899;--chart-8:#999abd;--chart-grid:#bfbfbf26;--chart-axis-tick:var(--text-secondary);--chart-cursor:#fff3;--metric-received:#719872;--metric-forwarded:#0074be;--metric-transmitted:#dfbc72;--metric-dropped:#e12672;--metric-neutral:#bfbfbf;--log-debug:var(--sys-brown);--log-info:var(--sys-cyan);--log-warning:var(--sys-amber);--log-error:var(--sys-red);--log-critical:var(--sys-pink);--icon-page-title:var(--accent-primary);--icon-card-title:var(--accent-primary);--icon-widget:var(--text-secondary);--icon-action:var(--text-secondary);--icon-nav:var(--text-muted);--icon-nav-active:var(--accent-primary);--toggle-on:var(--accent-success);--toggle-off:var(--bg-elevated);--data-box-bg:#ffffff08;--data-box-border:#ffffff0f;--map-node-fill:#3b82f6;--map-node-stroke:#ffffffe6;--map-hub-color:var(--sys-purple);--map-hub-stroke:#ffffffe6;--map-gateway-color:var(--sys-indigo);--map-gateway-stroke:#ffffffd9;--map-local-color:var(--sys-amber);--map-neighbor-color:var(--sys-amber);--map-neighbor-stroke:#0006;--map-mobile-color:var(--sys-orange);--map-room-color:var(--sys-pink);--map-ghost-color:var(--sys-cyan);--palette-bg-0:#171717;--palette-bg-1:#1f1f1f;--palette-bg-2:#252525;--palette-bg-3:#2d2d2d;--palette-bg-4:#3f3f3f;--palette-bg-5:#4b4b4b;--palette-bg-6:#616161;--palette-bg-7:#727272;--palette-fg-0:#8a8a8a;--palette-fg-1:#a3a3a3;--palette-fg-2:#bfbfbf;--palette-fg-3:#e1e1e1;--palette-fg-4:#f5f5f5;--palette-red:#be7572;--palette-red-bright:#e12672;--palette-orange:#d97742;--palette-orange-bright:#f59e0b;--palette-yellow:#bdbb72;--palette-yellow-bright:#dfbc72;--palette-green:#719872;--palette-green-bright:#98bc99;--palette-aqua:#6fbcbd;--palette-aqua-bright:#70bddf;--palette-blue:#0074be;--palette-blue-bright:#719cdf;--palette-purple:#8b7bad;--palette-purple-bright:#999abd;--map-popup-bg:var(--bg-body)}@supports (color:color-mix(in lab,red,red)){:root{--map-popup-bg:color-mix(in srgb,var(--bg-body)92%,transparent)}}:root{--map-popup-shadow:0 4px 16px #00000080;--map-overlay-blue-dark:#0d1e3226;--map-overlay-blue-light:#14284614;--map-border-accent:#8ca0c833;--map-border-accent-subtle:#8ca0c826;--map-hover-tint:#ffffff1a;--map-edge-rest:#ffffff40;--map-edge-rest-bright:#ffffff59;--map-edge-rest-dim:#ffffff26;--map-edge-hover-direct:#6fbcbd;--map-edge-hover-loop:#8b7bad;--map-edge-hover-standard:#8a8a8a;--map-edge-hover-neighbor:#fbbf24;--map-edge-highlight:gold;--link-strong:#719872;--link-medium:#dfbc72;--link-weak:#be7572;--hop-0:#6fbcbd;--hop-1:#719872;--hop-2:#98bc99;--hop-3:#dfbc72;--hop-distant:#727272;--hop-hub:#fbbf24;--sys-red:#e5484d;--sys-orange:#f76b15;--sys-amber:#ffb224;--sys-yellow:#f5d90a;--sys-brown:#ad7f58;--sys-green:#46a758;--sys-teal:#12a594;--sys-cyan:#00a2c7;--sys-blue:#3b82f6;--sys-indigo:#5b5bd6;--sys-purple:#8e4ec6;--sys-pink:#d6409f;--ctrl-base:var(--palette-bg-4);--ctrl-base-hover:var(--palette-bg-5);--ctrl-base-active:var(--palette-bg-3);--ctrl-border:var(--palette-bg-5);--ctrl-border-hover:var(--palette-bg-6);--ctrl-shadow-dark:var(--palette-bg-1);--ctrl-shadow-mid:var(--palette-bg-0);--ctrl-highlight:var(--palette-bg-6);--ctrl-inset:var(--palette-bg-3);--ctrl-primary:#5a6b9f;--ctrl-primary-hover:#6a7baf;--ctrl-primary-border:#7a8bbf;--ctrl-primary-shadow:#2a3b5f;--ctrl-primary-highlight:#8a9bcf;--ctrl-primary-inset:#4a5b8f;--ctrl-success:#4a7854;--ctrl-success-hover:#5a8864;--ctrl-success-border:#6a9874;--ctrl-success-shadow:#2a4834;--ctrl-success-highlight:#7aa884;--ctrl-success-inset:#3a6844;--ctrl-warning:#9f8a4a;--ctrl-warning-hover:#af9a5a;--ctrl-warning-border:#bfaa6a;--ctrl-warning-shadow:#5f4a2a;--ctrl-warning-highlight:#cfba7a;--ctrl-warning-inset:#8f7a3a;--ctrl-panel-top:var(--palette-bg-2);--ctrl-panel-mid:var(--palette-bg-1);--ctrl-panel-bottom:var(--palette-bg-0);--ctrl-panel-border:var(--palette-bg-4);--background:var(--bg-body);--foreground:var(--text-secondary);--foreground-muted:var(--text-muted);--foreground-subtle:var(--border-subtle);--primary:var(--accent-tertiary);--secondary:var(--accent-secondary);--accent-green:var(--accent-success);--accent-red:var(--accent-danger);--accent-purple:var(--accent-primary);--accent-cyan:var(--accent-tertiary);--card-bg:var(--bg-surface);--border:var(--border-subtle);--theme-transition:.4s ease;--text-xs:.64rem;--text-sm:.8rem;--text-base:1rem;--text-md:1.125rem;--text-lg:1.25rem;--text-xl:1.563rem;--text-2xl:1.953rem;--text-3xl:2.441rem;--text-4xl:3.052rem;--text-5xl:3.815rem;--text-6xl:4.768rem;--leading-tight:1.1;--leading-snug:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--tracking-tight:-.025em;--tracking-normal:0;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--font-normal:400;--font-medium:500;--font-semibold:600;--font-bold:700;--font-extrabold:800}body{background:var(--bg-body);color:var(--text-secondary);font-family:var(--font-display),system-ui,-apple-system,sans-serif;font-weight:var(--font-normal);font-size:var(--text-base);line-height:var(--leading-normal);letter-spacing:var(--tracking-normal);font-feature-settings:"cv02","cv03","cv04";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-height:100vh}.bg-subtle-fill{background:var(--subtle-fill)}.bg-subtle-fill-hover{background:var(--subtle-fill-hover)}.bg-subtle-fill-strong{background:var(--subtle-fill-strong)}.hover\:bg-subtle-fill:hover{background:var(--subtle-fill)}.hover\:bg-subtle-fill-hover:hover{background:var(--subtle-fill-hover)}.hover\:bg-subtle-fill-strong:hover{background:var(--subtle-fill-strong)}.css-label--labels-container{pointer-events:none;z-index:10!important}.css-label--label{font-size:11px;font-family:var(--font-data),monospace;white-space:nowrap;border-radius:3px;padding:2px 6px;font-weight:500;box-shadow:0 1px 3px #0000004d;z-index:11!important;pointer-events:auto!important;text-shadow:none!important;color:#000!important;background:#fff!important}.meshgraph-label-cat-0{background:var(--meshgraph-label-0,#505050)!important;color:#fff!important}.meshgraph-label-cat-1{background:var(--meshgraph-label-1,#707070)!important;color:#fff!important}.meshgraph-label-cat-2{background:var(--meshgraph-label-2,#909090)!important;color:#000!important}.meshgraph-label-cat-3{background:var(--meshgraph-label-3,silver)!important;color:#000!important}.meshgraph-label-cat-4{background:var(--meshgraph-label-4,#fff)!important;color:#000!important}.meshgraph-label-cat-5{background:var(--meshgraph-label-5,#719cdf)!important;color:#fff!important}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}} diff --git a/frontend/dist/assets/index-bDa2a9Y2.js b/frontend/dist/assets/index-bDa2a9Y2.js new file mode 100644 index 00000000..72ea2e5e --- /dev/null +++ b/frontend/dist/assets/index-bDa2a9Y2.js @@ -0,0 +1 @@ +import{r as t,j as e}from"./vendor-react-Cwum97tW.js";import{c8 as n,c9 as r,ca as a,cb as s,cc as i,U as o,cd as l,ce as u,cf as c,cg as f,ch as p,ci as y,cj as d,ck as h,cl as m,cm as g,cn as x,co as v,cp as j,cq as b,cr as w,cs as k,ct as A,cu as $,cv as M,m as D,cw as S,cx as C,A as R,a4 as I,cy as E,cz as F}from"./index-D22MpaCY.js";function N(t,e){return n(t)?t[((t,e,n)=>{const r=e-0;return((n-0)%r+r)%r+0})(0,t.length,e)]:t}class P{constructor(t){this.stop=()=>this.runAll("stop"),this.animations=t.filter(Boolean)}get finished(){return Promise.all(this.animations.map(t=>t.finished))}getAll(t){return this.animations[0][t]}setAll(t,e){for(let n=0;ne.attachTimeline(t));return()=>{e.forEach((t,e)=>{t&&t(),this.animations[e].stop()})}}get time(){return this.getAll("time")}set time(t){this.setAll("time",t)}get speed(){return this.getAll("speed")}set speed(t){this.setAll("speed",t)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){return T(this.animations,"duration")}get iterationDuration(){return T(this.animations,"iterationDuration")}runAll(t){this.animations.forEach(e=>e[t]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}function T(t,e){let n=0;for(let r=0;rn&&(n=a)}return n}class O extends P{then(t,e){return this.finished.finally(t).then(()=>{})}}class W extends r{constructor(){super(...arguments),this.type="object"}readValueFromInstance(t,e){if(function(t,e){return t in e}(e,t)){const n=t[e];if("string"==typeof n||"number"==typeof n)return n}}getBaseTargetFromProps(){}removeValueFromRenderState(t,e){delete e.output[t]}measureInstanceViewportBox(){return a()}build(t,e){Object.assign(t.output,e)}renderInstance(t,{output:e}){Object.assign(t,e)}sortInstanceNodePosition(){return 0}}function L({children:n,isValidProp:r,...a}){r&&s(r),(a={...t.useContext(i),...a}).isStatic=o(()=>a.isStatic);const l=t.useMemo(()=>a,[JSON.stringify(a.transition),a.transformPagePoint,a.reducedMotion]);return e.jsx(i.Provider,{value:l,children:n})}function V(t){return"object"==typeof t&&!Array.isArray(t)}function B(t,e,n,r){return null==t?[]:"string"==typeof t&&V(e)?u(t,n,r):t instanceof NodeList?Array.from(t):Array.isArray(t)?t.filter(t=>null!=t):[t]}function z(t,e,n){return t*(e+1)}function H(t,e,n,r){return"number"==typeof e?e:e.startsWith("-")||e.startsWith("+")?Math.max(0,t+parseFloat(e)):"<"===e?n:e.startsWith("<")?Math.max(0,n+parseFloat(e.slice(1))):r.get(e)??t}function K(t,e,n,r,a,s){!function(t,e,n){for(let r=0;re&&a.at"number"==typeof t,Y=t=>t.every(Q);function Z(t){const e={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},n=v(t)&&!j(t)?new b(e):new w(e);n.mount(t),k.set(t,n)}function tt(t){const e=new W({presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}});e.mount(t),k.set(t,e)}function et(t,e,n,r){const a=[];if(function(t,e){return p(t)||"number"==typeof t||"string"==typeof t&&!V(e)}(t,e))a.push(A(t,V(e)&&e.default||e,n&&n.default||n));else{if(null==t)return a;const s=B(t,e,r),i=s.length;for(let t=0;t{const l=_(t),{delay:u=0,times:c=y(l),type:p=e.type||"keyframes",repeat:x,repeatType:j,repeatDelay:b=0,...k}=n;let{ease:A=e.ease||"easeOut",duration:$}=n;const M="function"==typeof u?u(i,o):u,D=l.length,S=m(p)?p:null==a?void 0:a[p||"keyframes"];if(D<=2&&S){let t=100;if(2===D&&Y(l)){const e=l[1]-l[0];t=Math.abs(e)}const n={...e,...k};void 0!==$&&(n.duration=g($));const r=d(n,t,S);A=r.ease,$=r.duration}$??($=s);const C=f+M;1===c.length&&0===c[0]&&(c[1]=1);const R=c.length-l.length;if(R>0&&h(c,R),1===l.length&&l.unshift(null),x){$=z($,x);const t=[...l],e=[...c];A=Array.isArray(A)?[...A]:[A];const n=[...A];for(let r=0;r{for(const a in t){const s=t[a];s.sort(q);const o=[],l=[],u=[];for(let t=0;t{r.push(...et(n,t,e))}),r}(t,e,rt);else{const{onComplete:s,...i}=n||{};"function"==typeof s&&(r=s),a=et(t,e,i,rt)}var s;const i=new O(a);return r&&i.finished.then(r),i};var rt;const at="var(--mask-height, 0.15em)",st="var(--mask-width, 0.5em)",it=`calc(${st} / var(--invert-x, 1))`,ot="#000 0, transparent 71%",lt=`linear-gradient(to right, transparent 0, #000 ${it}, #000 calc(100% - ${it}), transparent),linear-gradient(to bottom, transparent 0, #000 ${at}, #000 calc(100% - ${at}), transparent 100%),radial-gradient(at bottom right, ${ot}),radial-gradient(at bottom left, ${ot}), radial-gradient(at top left, ${ot}), radial-gradient(at top right, ${ot})`,ut=`100% calc(100% - ${at} * 2),calc(100% - ${it} * 2) 100%,${it} ${at},${it} ${at},${it} ${at},${it} ${at}`;function ct({children:t,layoutDependency:n}){return e.jsx(D.span,{layout:!0,layoutDependency:n,"aria-hidden":!0,style:{display:"inline-flex","--invert-x":1,margin:`0 calc(-1*${st})`,padding:`calc(${at}/2) ${st}`,position:"relative",zIndex:-1,overflow:"clip",WebkitMaskImage:lt,WebkitMaskSize:ut,WebkitMaskPosition:"center, center, top left, top right, bottom right, bottom left",WebkitMaskRepeat:"no-repeat"},children:t})}function ft(){const e=t.useRef(!0);return t.useEffect(()=>{e.current=!1},[]),e.current}function pt(t){const{width:e,fontSize:n}=getComputedStyle(t);return parseFloat(e)/parseFloat(n)+"em"}S({"--invert-x":{correct:(t,{treeScale:e,projectionDelta:n})=>n.x.scale*e.x}});const yt=new WeakMap,dt=t.forwardRef(function({value:n,initialValue:r=n,...a},s){const{transition:o}=t.useContext(i),l=t.useRef(r).current,u=ft(),c=t.useRef(null),f=t.useRef(null);t.useImperativeHandle(s,()=>f.current,[]);const p=t.useRef(new Array(10)),y=C(),d=y?n:0;t.useLayoutEffect(()=>{c.current&&p.current[l]&&(c.current.style.width=pt(p.current[l]))},[]);const h=t.useRef(r);t.useLayoutEffect(()=>{var t;if(!c.current||d===h.current)return;const e=c.current.getBoundingClientRect(),n=null==(t=f.current)?void 0:t.getBoundingClientRect(),r=e.height*(d-h.current)+(e.top-(n?n.top||0:e.top));return nt(c.current,{y:[r,0]},o),()=>{h.current=d}},[d]);const[m,g]=t.useState();t.useEffect(()=>{if(u&&l===d)return;if(!p.current[d])return;const t=pt(p.current[d]);f.current&&yt.set(f.current,t),g(t)},[d]);const x=t=>e.jsx("span",{style:{display:"inline-block",padding:`calc(${at}/2) 0`},ref:e=>{p.current[t]=e},children:t},t);return e.jsx(D.span,{...a,ref:f,layout:"position","data-state":y?void 0:"exiting",style:{display:"inline-flex",justifyContent:"center",width:m},children:e.jsxs("span",{ref:c,style:{display:"inline-flex",justifyContent:"center",flexDirection:"column",alignItems:"center",position:"relative"},children:[0!==d&&e.jsx("span",{style:{...ht,bottom:"100%",left:0},children:new Array(d).fill(null).map((t,e)=>x(e))}),x(d),9!==d&&e.jsx("span",{style:{...ht,top:"100%",left:0},children:new Array(9-d).fill(null).map((t,e)=>x(d+e+1))})]})})}),ht={display:"flex",flexDirection:"column",alignItems:"center",position:"absolute",width:"100%"},mt=t.createContext({justify:"left"}),gt=t.forwardRef(function({partKey:n,type:r,children:a,layoutDependency:s,...i},o){const l=C(),{justify:u}=t.useContext(mt);return e.jsx(D.span,{...i,"data-state":l?void 0:"exiting",style:{display:"inline-flex",justifyContent:u,padding:`calc(${at}/2) 0`,position:"relative"},layout:"position",layoutDependency:s,ref:o,children:e.jsx(R,{mode:"popLayout",anchorX:u,initial:!1,children:e.jsx(D.span,{layout:"right"===u&&"position",layoutDependency:s,initial:{opacity:0},animate:{opacity:[null,1]},exit:{opacity:[null,0]},style:{display:"inline-block",whiteSpace:"pre"},children:a},a)})})}),xt=t.forwardRef(function({parts:n,justify:r="left",mode:a,style:s,name:i,layoutDependency:o,...l},u){const c=t.useRef(null);t.useImperativeHandle(u,()=>c.current,[]);const f=t.useMemo(()=>({justify:r}),[r]),p=t.useRef(null),y=ft(),[d,h]=t.useState();return t.useEffect(()=>{if(!p.current)return;if(y)return void(c.current&&(c.current.style.width=pt(p.current)));const t=Array.from(p.current.children).map(t=>{if(!(t instanceof HTMLElement))return;if("exiting"===t.dataset.state){const e=t.nextSibling;return t.remove(),()=>{p.current&&p.current.insertBefore(t,e)}}const e=yt.get(t);if(!e)return;const n=t.style.width;return t.style.width=e,()=>{t.style.width=n}});h(pt(p.current));for(let e=t.length-1;e>=0;e--){const n=t[e];n&&n()}},[n.map(t=>t.value).join("")]),e.jsx(mt.Provider,{value:f,children:e.jsx(D.span,{layoutDependency:o,...l,ref:c,className:`number-section-${i}`,style:{...s,display:"inline-flex",justifyContent:r,width:d},children:e.jsxs("span",{ref:p,style:{display:"inline-flex",justifyContent:"inherit",position:"relative"},children:["​",e.jsx(R,{mode:a,anchorX:r,initial:!1,children:n.map(t=>"integer"===t.type||"fraction"===t.type?e.jsx(dt,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},value:t.value,initialValue:y?void 0:0,layoutDependency:o},t.key):e.jsx(gt,{type:t.type,partKey:t.key,initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},layoutDependency:o,children:t.value},"literal"===t.type?`${t.key}:${t.value}`:t.key))})]})})})}),vt={opacity:{duration:1,ease:E},layout:{type:"spring",duration:1,bounce:0},y:{type:"spring",duration:1,bounce:0}},jt=t.forwardRef(function({children:n,locales:r,format:a,transition:s,style:o,suffix:l,prefix:u,...c},f){const p=t.useMemo(()=>((t,{locales:e,format:n},r,a)=>{const s=new Intl.NumberFormat(e,n).formatToParts(Number(t));r&&s.unshift({type:"prefix",value:r}),a&&s.push({type:"suffix",value:a});const i=[],o=[],l=[],u=[],c={},f=t=>`${t}:${c[t]=(c[t]??-1)+1}`;let p="",y=!1,d=!1;for(const m of s){p+=m.value;const t="minusSign"===m.type||"plusSign"===m.type?"sign":m.type;switch(t){case"integer":y=!0,o.push(...m.value.split("").map(e=>({type:t,value:parseInt(e)})));break;case"group":o.push({type:t,value:m.value});break;case"decimal":d=!0,l.push({type:t,value:m.value,key:f(t)});break;case"fraction":l.push(...m.value.split("").map(e=>({type:t,value:parseInt(e),key:f(t)})));break;default:(y||d?u:i).push({type:t,value:m.value,key:f(t)})}}const h=[];for(let m=o.length-1;m>=0;m--)h.unshift({...o[m],key:f(o[m].type)});return{pre:i,integer:h,fraction:l,post:u,formatted:p}})(n,{locales:r,format:a},u,l),[n,r,a]),{pre:y,integer:d,fraction:h,post:m,formatted:g}=p,x=t.useContext(i).transition;s=s??x??vt;const{layoutDependency:v}=c,j=t.useMemo(()=>{if(void 0!==v)return{layoutDependency:v,value:n}},[v,n]);return e.jsx(I,{children:e.jsx(L,{transition:s,children:e.jsx(D.div,{...c,ref:f,layout:!0,layoutDependency:j,style:{lineHeight:1,...o,display:"inline-flex",isolation:"isolate",whiteSpace:"nowrap"},children:e.jsxs(D.div,{layout:!0,layoutDependency:j,"aria-label":g,style:{display:"inline-flex",direction:"ltr",isolation:"isolate",position:"relative",zIndex:-1},children:[e.jsx(xt,{style:{padding:`calc(${at}/2) 0`},layoutDependency:j,"aria-hidden":!0,justify:"right",mode:"popLayout",parts:y,name:"pre"}),e.jsxs(ct,{layoutDependency:j,children:[e.jsx(xt,{layoutDependency:j,justify:"right",parts:d,name:"integer"}),e.jsx(xt,{layout:"position",layoutDependency:j,parts:h,name:"fraction"})]}),e.jsx(xt,{style:{padding:`calc(${at}/2) 0`},"aria-hidden":!0,layout:"position",layoutDependency:j,mode:"popLayout",parts:m,name:"post"})]})})})})});function bt(t,e){return t.length>e.length||t.length>0&&!e.startsWith(t)}function wt(t,e,n){return t+(e-t)*n}D.create(t.Fragment);const kt=new Set([".",",","!","?",":",";","'",'"',"-","(",")"]),At=new Set(["!","@","#","$","%","^","&","*","(",")","_","+","{","}","|",":",'"',"<",">","?"]);const $t={slow:130,normal:75,fast:30};t.forwardRef(function({children:n="",as:r,speed:a="normal",variance:s="natural",cursorClassName:u="motion-typewriter-cursor",cursorStyle:c,cursorBlinkDuration:f=.5,onComplete:p,play:y=!0,"aria-label":d,textClassName:h,textStyle:m,replace:g="type",backspace:x="character",backspaceFactor:v=.2,...j},b){const w=r||"span",k=t.useRef(n),A=function(){const e=o(()=>l("")),{isStatic:n}=t.useContext(i);if(n){const[,n]=t.useState("");t.useEffect(()=>e.on("change",n),[])}return e}(),$=t.useRef(null),M=t.useRef(null),S=t.useRef(null),C="number"==typeof a?a:$t[a],R=()=>{var t;null==(t=$.current)||t.call($),$.current=null},I=()=>{M.current=nt(S.current,{opacity:[1,1,0,0]},{duration:f,times:[0,.5,.5,1],ease:"linear",repeat:1/0,repeatType:"reverse"})};return t.useEffect(()=>{"all"===g&&n!==k.current&&A.set(""),k.current=n},[n,g]),t.useEffect(()=>{var t;if(!y)return I(),void R();null==(t=M.current)||t.cancel();const e=()=>{const t=function(t,e,n,r){if("type"===n&&bt(t,e)){if("all"===r)return e.slice(0,function(t,e){const n=Math.min(t.length,e.length);let r=0;for(let a=0;a=0&&/\s/.test(t[n]);)n--;for(;n>=0&&!/\s/.test(t[n]);)n--;return Math.max(0,n+1)}(t,t.length);return t.slice(0,e)}return t.slice(0,-1)}return e.slice(0,t.length+1)}(A.get(),n,g,x);A.set(t),t!==n?r():(I(),null==p||p())},r=()=>{$.current=F(e,function(t,e,n,r,a){if(bt(e,t))return n*a;if("natural"===r)return function(t,e,n){const r=e.length,a=t[r],s=t[r-1];if(!a)return n;const i=t.slice(0,r).lastIndexOf(" "),o=r-i-1,l=i+1,u=t.slice(r).indexOf(" "),c=(-1===u?t.length:r+u)-l;let f=1;s&&/[.!?]/.test(s)&&" "===a&&(f*=3),c<=3?f*=.7:(0===o&&" "!==a&&(f*=1.5),o===c-1&&(f*=1.4)),o>0&&o3&&(f*=1-Math.min(o/c,.4)),kt.has(a)&&(f*=1.5),At.has(a)&&(f*=1.5),/\d/.test(a)&&(f*=1.3),c>8&&(f*=1.3),a!==a.toLowerCase()&&(f*=1.25),r>200&&(f*=1+Math.min((r-200)/1e3,.3)),f*=1+wt(-.25,.25,Math.random());const p=n*f;return Math.max(.2*n,p)}(t,e,n);if("number"==typeof r&&r>0){const t=n*(r/100);return n+wt(-t,t,Math.random())}return n}(n,A.get(),C,s,v))};return $.current||r(),R},[y,p,n,C,s,v,x]),e.jsxs(w,{ref:b,...j,"aria-label":d||n,children:[e.jsx(D.span,{className:h,style:m,children:A}),e.jsx(D.span,{ref:S,className:u,style:{display:"inline-block",width:"2px",height:"1em",backgroundColor:"currentColor",position:"relative",top:"0.1em",left:"0.2em",...c}})]})});export{jt as A}; diff --git a/frontend/dist/assets/info-pu09_Xxl.js b/frontend/dist/assets/info-BojcGhYE.js similarity index 68% rename from frontend/dist/assets/info-pu09_Xxl.js rename to frontend/dist/assets/info-BojcGhYE.js index fb91df77..f816bd8d 100644 --- a/frontend/dist/assets/info-pu09_Xxl.js +++ b/frontend/dist/assets/info-BojcGhYE.js @@ -1 +1 @@ -import{c as e}from"./index-CZBrdv20.js";const c=e("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);export{c as I}; +import{c as e}from"./index-D22MpaCY.js";const c=e("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);export{c as I}; diff --git a/frontend/dist/assets/link-scoring-BY8TYwtV.js b/frontend/dist/assets/link-scoring-BnkyjnFT.js similarity index 78% rename from frontend/dist/assets/link-scoring-BY8TYwtV.js rename to frontend/dist/assets/link-scoring-BnkyjnFT.js index 5afc2ab4..27de48b2 100644 --- a/frontend/dist/assets/link-scoring-BY8TYwtV.js +++ b/frontend/dist/assets/link-scoring-BnkyjnFT.js @@ -1 +1 @@ -import{c as t,z as e,bS as n}from"./index-CZBrdv20.js";const o=t("moon",[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]]),a=t("sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);function s(t){if(Array.isArray(t))return t;if("string"==typeof t&&t.startsWith("["))try{const e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}return[]}function r(t,o,a){const r=new Map;for(const n of o){const t=e(n);r.has(t)||r.set(t,n)}const c=new Map,h=new Map;for(const e of t){const t=e.route??e.route_type;if(!n(t))continue;const o=s(e.original_path);if(0===o.length)continue;const i=o.map(t=>t.toUpperCase());if(!e.transmitted&&i.length>=2){const t=i[i.length-2];if(t){const e=r.get(t);e&&h.set(e,(h.get(e)??0)+1)}}if(i.includes(a))for(const e of i){if(e===a)continue;const t=r.get(e);t&&c.set(t,(c.get(t)??0)+1)}}let i=0,f=0;for(const e of o)i=Math.max(i,c.get(e)??0),f=Math.max(f,h.get(e)??0);const p=new Map;let u=0,d=0,m=0;for(const e of o){const t=c.get(e)??0,n=h.get(e)??0,o=i>0?Math.round(t/i*100):0,a=f>0?Math.round(n/f*100):0,s=o+a;p.set(e,{hash:e,listenerCount:t,loudCount:n,listenerScore:o,loudScore:a,blendedScore:s}),u=Math.max(u,o),d=Math.max(d,a),m=Math.max(m,s)}return{scores:p,maxListenerScore:u,maxLoudScore:d,maxBlendedScore:m}}const c={YELLOW:"#FFB224",GREEN:"#46A758",RED:"#E5484D",GRAY:"#505050"};export{c as L,o as M,a as S,r as c}; +import{c as t,p as e,c5 as n}from"./index-D22MpaCY.js";const o=t("moon",[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]]),a=t("sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);function s(t){if(Array.isArray(t))return t;if("string"==typeof t&&t.startsWith("["))try{const e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}return[]}function r(t,o,a){const r=new Map;for(const n of o){const t=e(n);r.has(t)||r.set(t,n)}const c=new Map,h=new Map;for(const e of t){const t=e.route??e.route_type;if(!n(t))continue;const o=s(e.original_path);if(0===o.length)continue;const i=o.map(t=>t.toUpperCase());if(!e.transmitted&&i.length>=2){const t=i[i.length-2];if(t){const e=r.get(t);e&&h.set(e,(h.get(e)??0)+1)}}if(i.includes(a))for(const e of i){if(e===a)continue;const t=r.get(e);t&&c.set(t,(c.get(t)??0)+1)}}let i=0,p=0;for(const e of o)i=Math.max(i,c.get(e)??0),p=Math.max(p,h.get(e)??0);const f=new Map;let u=0,d=0,m=0;for(const e of o){const t=c.get(e)??0,n=h.get(e)??0,o=i>0?Math.round(t/i*100):0,a=p>0?Math.round(n/p*100):0,s=o+a;f.set(e,{hash:e,listenerCount:t,loudCount:n,listenerScore:o,loudScore:a,blendedScore:s}),u=Math.max(u,o),d=Math.max(d,a),m=Math.max(m,s)}return{scores:f,maxListenerScore:u,maxLoudScore:d,maxBlendedScore:m}}const c={YELLOW:"#FFB224",GREEN:"#46A758",RED:"#E5484D",GRAY:"#505050"};export{c as L,o as M,a as S,r as c}; diff --git a/frontend/dist/assets/loader-circle-BLG0SL8e.js b/frontend/dist/assets/loader-circle-2q9lT2qG.js similarity index 54% rename from frontend/dist/assets/loader-circle-BLG0SL8e.js rename to frontend/dist/assets/loader-circle-2q9lT2qG.js index 846c6e26..321e9508 100644 --- a/frontend/dist/assets/loader-circle-BLG0SL8e.js +++ b/frontend/dist/assets/loader-circle-2q9lT2qG.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const e=a("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);export{e as L}; +import{c as a}from"./index-D22MpaCY.js";const e=a("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);export{e as L}; diff --git a/frontend/dist/assets/map-pin-BnrkOs2D.js b/frontend/dist/assets/map-pin-kiJDSdn0.js similarity index 74% rename from frontend/dist/assets/map-pin-BnrkOs2D.js rename to frontend/dist/assets/map-pin-kiJDSdn0.js index 6f8a247b..fe6820b2 100644 --- a/frontend/dist/assets/map-pin-BnrkOs2D.js +++ b/frontend/dist/assets/map-pin-kiJDSdn0.js @@ -1 +1 @@ -import{c}from"./index-CZBrdv20.js";const r=c("map-pin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);export{r as M}; +import{c}from"./index-D22MpaCY.js";const r=c("map-pin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);export{r as M}; diff --git a/frontend/dist/assets/network-Did0WXxt.js b/frontend/dist/assets/network-Dz5VqBhN.js similarity index 83% rename from frontend/dist/assets/network-Did0WXxt.js rename to frontend/dist/assets/network-Dz5VqBhN.js index fc9584bd..a829f964 100644 --- a/frontend/dist/assets/network-Did0WXxt.js +++ b/frontend/dist/assets/network-Dz5VqBhN.js @@ -1 +1 @@ -import{c as e}from"./index-CZBrdv20.js";const t=e("network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);export{t as N}; +import{c as e}from"./index-D22MpaCY.js";const t=e("network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);export{t as N}; diff --git a/frontend/dist/assets/packet-CCmg5Y4j.js b/frontend/dist/assets/packet-CCmg5Y4j.js deleted file mode 100644 index a70bde07..00000000 --- a/frontend/dist/assets/packet-CCmg5Y4j.js +++ /dev/null @@ -1 +0,0 @@ -var t=Object.defineProperty,s=(s,a,e)=>((s,a,e)=>a in s?t(s,a,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[a]=e)(s,"symbol"!=typeof a?a+"":a,e);import{a4 as a,bi as e,bj as r,bk as h,bl as i,af as n,bm as o,bn as p,bo as y,bp as d,bq as l,br as u,bs as g,ba as c,bt as b,bu as T,bv as m,bw as C,bx as L,by as w,bz as f,bA as S,bB as N,bC as $,bD as x,bE as A}from"./index-CZBrdv20.js";class U{constructor(){s(this,"header",0),s(this,"transportCodes",[0,0]),s(this,"pathLen",0),s(this,"path",new Uint8Array(0)),s(this,"payload",new Uint8Array(0)),s(this,"decrypted",{}),s(this,"_rssi",0),s(this,"_snr",0)}static fromBytes(t){const s=new U;try{return s.readFrom(t),{success:!0,packet:s}}catch(a){return{success:!1,error:a instanceof Error?a.message:String(a)}}}static fromHex(t){try{const s=a(t);return U.fromBytes(s)}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}get routeType(){return this.header&e}get routeTypeName(){return r[this.routeType]??`UNKNOWN(${this.routeType})`}get payloadType(){return this.header>>h&i}get payloadTypeName(){return n[this.payloadType]??`UNKNOWN(${this.payloadType})`}get payloadVersion(){return this.header>>o&p}hasTransportCodes(){return y(this.routeType)}isFlood(){return d(this.routeType)}isDirect(){return l(this.routeType)}get pathBytes(){return Array.from(this.path)}get pathString(){return u(this.path)}get pathHexArray(){return Array.from(this.path).map(t=>g(t,!0))}get payloadLen(){return this.payload.length}get payloadHex(){return c(this.payload,!0)}getPayloadAppData(){const t=$+x+A;return this.payload.length>=t?this.payload.slice(t):new Uint8Array(0)}get rssi(){return this._rssi}set rssi(t){this._rssi=t}get snr(){return this._snr}set snr(t){this._snr=t}readFrom(t){let s=0;const a=t.length;b(s,1,a,"Missing header byte"),this.header=t[s++];const e=this.payloadVersion;if(e>T)throw new Error(`Unsupported packet version: ${e}`);if(this.hasTransportCodes()?(b(s,4,a,"Missing transport codes"),this.transportCodes=[m(t,s),m(t,s+2)],s+=4):this.transportCodes=[0,0],b(s,1,a,"Missing path_len"),this.pathLen=t[s++],this.pathLen>C)throw new Error(`path_len too large: ${this.pathLen} > ${C}`);return b(s,this.pathLen,a,"Truncated path"),this.path=t.slice(s,s+this.pathLen),s+=this.pathLen,this.payload=t.slice(s),L(this.payload.length),!0}writeTo(){let t=1;this.hasTransportCodes()&&(t+=4),t+=1,t+=this.path.length,t+=this.payload.length;const s=new Uint8Array(t);let a=0;return s[a++]=this.header,this.hasTransportCodes()&&(w(this.transportCodes[0],s,a),w(this.transportCodes[1],s,a+2),a+=4),s[a++]=this.path.length,s.set(this.path,a),a+=this.path.length,s.set(this.payload,a),s}toHex(){return c(this.writeTo(),!0)}async calculateHash(){return f(this.payloadType,this.pathLen,this.payload)}async calculateHashString(t){return S(this.payloadType,this.pathLen,this.payload,t)}async calculateCRC(){return N(this.payloadType,this.pathLen,this.payload)}getRawLength(){let t=2+this.pathLen+this.payload.length;return this.hasTransportCodes()&&(t+=4),t}getSummary(){return{header:g(this.header,!0),routeType:this.routeTypeName,payloadType:this.payloadTypeName,version:this.payloadVersion,pathLen:this.pathLen,pathStr:this.pathString,transportCodes:this.hasTransportCodes()?[this.transportCodes[0].toString(16).toUpperCase().padStart(4,"0"),this.transportCodes[1].toString(16).toUpperCase().padStart(4,"0")]:null,payloadLen:this.payload.length,payloadHex:this.payloadHex,rawLength:this.getRawLength()}}toString(){const t=[`[${this.routeTypeName}/${this.payloadTypeName} v${this.payloadVersion}]`,`path=${this.pathString||"(empty)"}`,`payload=${this.payload.length}B`];return this.hasTransportCodes()&&t.push(`transport=[${this.transportCodes[0]},${this.transportCodes[1]}]`),t.join(" ")}}export{U as P}; diff --git a/frontend/dist/assets/payload-decoders-B_w2m9Or.js b/frontend/dist/assets/payload-decoders-B_w2m9Or.js new file mode 100644 index 00000000..c802d7bc --- /dev/null +++ b/frontend/dist/assets/payload-decoders-B_w2m9Or.js @@ -0,0 +1 @@ +var t=Object.defineProperty,e=(e,a,s)=>((e,a,s)=>a in e?t(e,a,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[a]=s)(e,"symbol"!=typeof a?a+"":a,s);import{Z as a,b9 as s,ba as r,bb as n,bc as h,a5 as i,bd as o,be as p,bf as l,bg as c,bh as u,bi as d,bj as y,b1 as g,bk as b,bl as f,bm as m,bn as x,bo as T,bp as C,bq as H,br as w,bs as S,bt as L,bu as N,bv as A,bw as F,bx as $,by as _,bz as U,bA as D,bB as V,bC as k,bD as v,bE as B,bF as E,bG as P,bH as j,bI as O,bJ as I,bK as K,bL as M,bM as R,bN as W,bO as q,bP as z,bQ as G,bR as J,bS as Q,bT as Z}from"./index-D22MpaCY.js";class X{constructor(){e(this,"header",0),e(this,"transportCodes",[0,0]),e(this,"pathLen",0),e(this,"path",new Uint8Array(0)),e(this,"payload",new Uint8Array(0)),e(this,"decrypted",{}),e(this,"_rssi",0),e(this,"_snr",0)}static fromBytes(t){const e=new X;try{return e.readFrom(t),{success:!0,packet:e}}catch(a){return{success:!1,error:a instanceof Error?a.message:String(a)}}}static fromHex(t){try{const e=a(t);return X.fromBytes(e)}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}get routeType(){return this.header&s}get routeTypeName(){return r[this.routeType]??`UNKNOWN(${this.routeType})`}get payloadType(){return this.header>>n&h}get payloadTypeName(){return i[this.payloadType]??`UNKNOWN(${this.payloadType})`}get payloadVersion(){return this.header>>o&p}hasTransportCodes(){return l(this.routeType)}isFlood(){return c(this.routeType)}isDirect(){return u(this.routeType)}get pathBytes(){return Array.from(this.path)}get pathString(){return d(this.path)}get pathHexArray(){return Array.from(this.path).map(t=>y(t,!0))}get payloadLen(){return this.payload.length}get payloadHex(){return g(this.payload,!0)}getPayloadAppData(){const t=L+N+A;return this.payload.length>=t?this.payload.slice(t):new Uint8Array(0)}get rssi(){return this._rssi}set rssi(t){this._rssi=t}get snr(){return this._snr}set snr(t){this._snr=t}readFrom(t){let e=0;const a=t.length;b(e,1,a,"Missing header byte"),this.header=t[e++];const s=this.payloadVersion;if(s>f)throw new Error(`Unsupported packet version: ${s}`);if(this.hasTransportCodes()?(b(e,4,a,"Missing transport codes"),this.transportCodes=[m(t,e),m(t,e+2)],e+=4):this.transportCodes=[0,0],b(e,1,a,"Missing path_len"),this.pathLen=t[e++],this.pathLen>x)throw new Error(`path_len too large: ${this.pathLen} > ${x}`);return b(e,this.pathLen,a,"Truncated path"),this.path=t.slice(e,e+this.pathLen),e+=this.pathLen,this.payload=t.slice(e),T(this.payload.length),!0}writeTo(){let t=1;this.hasTransportCodes()&&(t+=4),t+=1,t+=this.path.length,t+=this.payload.length;const e=new Uint8Array(t);let a=0;return e[a++]=this.header,this.hasTransportCodes()&&(C(this.transportCodes[0],e,a),C(this.transportCodes[1],e,a+2),a+=4),e[a++]=this.path.length,e.set(this.path,a),a+=this.path.length,e.set(this.payload,a),e}toHex(){return g(this.writeTo(),!0)}async calculateHash(){return H(this.payloadType,this.pathLen,this.payload)}async calculateHashString(t){return w(this.payloadType,this.pathLen,this.payload,t)}async calculateCRC(){return S(this.payloadType,this.pathLen,this.payload)}getRawLength(){let t=2+this.pathLen+this.payload.length;return this.hasTransportCodes()&&(t+=4),t}getSummary(){return{header:y(this.header,!0),routeType:this.routeTypeName,payloadType:this.payloadTypeName,version:this.payloadVersion,pathLen:this.pathLen,pathStr:this.pathString,transportCodes:this.hasTransportCodes()?[this.transportCodes[0].toString(16).toUpperCase().padStart(4,"0"),this.transportCodes[1].toString(16).toUpperCase().padStart(4,"0")]:null,payloadLen:this.payload.length,payloadHex:this.payloadHex,rawLength:this.getRawLength()}}toString(){const t=[`[${this.routeTypeName}/${this.payloadTypeName} v${this.payloadVersion}]`,`path=${this.pathString||"(empty)"}`,`payload=${this.payload.length}B`];return this.hasTransportCodes()&&t.push(`transport=[${this.transportCodes[0]},${this.transportCodes[1]}]`),t.join(" ")}}function Y(t){const e=L+N+A+1;if(t.lengtha&&(p.name=(new TextDecoder).decode(t.slice(a,e)))}return p}function tt(t,e){const a=function(t){if(t.length<9)return{type:"trace",traceTag:"00000000",traceTagValue:0,authCode:0,flags:0,pathHashes:[],pathString:"",snrValues:[],isComplete:!1,path:[],targetHash:""};const e=F(t,0),a=e.toString(16).toUpperCase().padStart(8,"0"),s=F(t,4),r=t[8],n=t.slice(9),h=Array.from(n).map(t=>y(t,!0)),i=h.join("->");return{type:"trace",traceTag:a,traceTagValue:e,authCode:s,flags:r,pathHashes:h,pathString:i,snrValues:[],isComplete:!1,path:h,targetHash:h.length>0?h[0]:""}}(t);if(!a)return null;const s=[],r=e instanceof Uint8Array?Array.from(e):e;for(let h=0;h127&&(t-=256),s.push(t/4)}const n=s.length>=a.pathHashes.length;return{...a,snrValues:s,isComplete:n}}async function et(t){if(t.length<4)return null;const e=t[0],a=y(e,!0),s=t.slice(1,3),r=t.slice(3),n={type:"grp_txt",channelHash:a,text:g(r),decrypted:!1,ciphertextHex:g(r),macHex:g(s)};try{const t=await W(e,s,r);if(t&&t.plaintext.length>=5){n.channelName=t.channelName;const e=t.plaintext,a=F(e,0),s=e[4],r=new TextDecoder("utf-8",{fatal:!1}).decode(e.slice(5)).replace(/\uFFFD/g,"").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/g,"").replace(/\x00+$/,"").trim();n.decrypted=!0,n.isPublicHashChannel=!0,n.timestamp=a,n.flags=s,t.macCorrupted&&(n.macCorrupted=!0);const h=r.indexOf(": ");h>0?(n.senderName=r.slice(0,h),n.text=r.slice(h+2)):n.text=r}else{const t=await q(e);n.isPublicHashChannel=t.length>0}}catch{}return n}async function at(t){if(t.length<4)return null;const e=t[0],a=y(e,!0),s=t.slice(1,3),r=t.slice(3),n={type:"grp_data",channelHash:a,dataHex:g(r),dataLength:r.length,decrypted:!1,macHex:g(s)};try{const t=await W(e,s,r);t&&(n.channelName=t.channelName,n.decrypted=!0,n.decryptedHex=g(t.plaintext))}catch{}return n}function st(t,e,a){return{type:"generic",payloadType:e,payloadTypeName:a,rawHex:g(t),length:t.length}}function rt(t){const{payload:e,payloadType:a,payloadTypeName:s}=t;switch(a){case R:return Y(e)??st(e,a,s);case M:return function(t){if(t.length<4)return null;const e=F(t,0);return{type:"ack",crc:e.toString(16).toUpperCase().padStart(8,"0"),crcValue:e}}(e)??st(e,a,s);case K:return function(t){if(0===t.length)return{type:"path",path:[],pathString:""};const e=Array.from(t).map(t=>y(t,!0)),a=e.join("->");return{type:"path",path:e,pathString:a}}(e)??st(e,a,s);case I:return tt(e,t.path)??st(e,a,s);case O:return function(t){if(t.length<2)return null;const e=y(t[0],!0),a=y(t[1],!0),s=t.slice(2);let r="",n=!0;try{const t=new TextDecoder("utf-8",{fatal:!0}).decode(s);/^[\x20-\x7E\u00A0-\uFFFF\n\r\t]*$/.test(t)&&(r=t,n=!1)}catch{}return n&&(r=g(s)),{type:"txt_msg",destHash:e,srcHash:a,timestamp:0,text:r,encrypted:n}}(e)??st(e,a,s);case j:return function(t){if(t.length<4)return null;const e=t[0],a=y(e,!0),s=t.slice(1,3),r=t.slice(3);return{type:"grp_txt",channelHash:a,text:g(r),decrypted:!1,ciphertextHex:g(r),macHex:g(s)}}(e)??st(e,a,s);case P:return function(t){if(t.length<4)return null;const e=t[0],a=y(e,!0),s=t.slice(1,3),r=t.slice(3);return{type:"grp_data",channelHash:a,dataHex:g(r),dataLength:r.length,decrypted:!1,macHex:g(s)}}(e)??st(e,a,s);case E:return function(t){return t.length<4?null:{type:"multipart",messageId:g(t.slice(0,2)),partNumber:t[2],totalParts:t[3],partData:g(t.slice(4))}}(e)??st(e,a,s);default:return st(e,a,s)}}export{X as P,tt as a,et as b,at as c,rt as d,Y as e}; diff --git a/frontend/dist/assets/ping-DAjkGztv.js b/frontend/dist/assets/ping-o6tDyVoV.js similarity index 94% rename from frontend/dist/assets/ping-DAjkGztv.js rename to frontend/dist/assets/ping-o6tDyVoV.js index e0a84901..56743418 100644 --- a/frontend/dist/assets/ping-DAjkGztv.js +++ b/frontend/dist/assets/ping-o6tDyVoV.js @@ -1 +1 @@ -import{bF as t}from"./index-CZBrdv20.js";async function e(e,r=10){return t("/api/ping_neighbor",{method:"POST",body:JSON.stringify({target_id:e,timeout:r})})}const r=["Chat Node","Repeater","Room Server","Hybrid Node","Unknown"];async function s(s,o=10){if(o<1||o>60)return{success:!1,error:"Timeout must be 1-60 seconds"};let n;const a=s.match(/^(0x)?([0-9a-fA-F]{1,2})$/);if(a)n=`0x${a[2].padStart(2,"0")}`;else{const e=await async function(e){const s=e.toLowerCase();for(const o of r)try{const e=await t(`/api/adverts_by_contact_type?contact_type=${encodeURIComponent(o)}&hours=168`),r=e.success&&e.data?e.data:e,n=(Array.isArray(r)?r:[]).find(t=>t.node_name&&t.node_name.toLowerCase()===s);if(n&&n.pubkey)return`0x${n.pubkey.substring(0,2)}`}catch{continue}return null}(s);if(!e)return{success:!1,error:`Node '${s}' not found`};n=e}const c=await e(n,o);if(!c.success||!c.data)return{success:!1,error:c.error||"Ping failed"};const i=(u=c.data).rtt_ms>500||u.rssi<-120?"Poor":u.rtt_ms>250||u.rssi<-100?"Fair":u.rtt_ms>100||u.rssi<-80?"Good":"Excellent";var u;return{success:!0,data:{...c.data,quality:i}}}export{s as a,e as p}; +import{bU as t}from"./index-D22MpaCY.js";async function e(e,r=10){return t("/api/ping_neighbor",{method:"POST",body:JSON.stringify({target_id:e,timeout:r})})}const r=["Chat Node","Repeater","Room Server","Hybrid Node","Unknown"];async function s(s,o=10){if(o<1||o>60)return{success:!1,error:"Timeout must be 1-60 seconds"};let n;const a=s.match(/^(0x)?([0-9a-fA-F]{1,2})$/);if(a)n=`0x${a[2].padStart(2,"0")}`;else{const e=await async function(e){const s=e.toLowerCase();for(const o of r)try{const e=await t(`/api/adverts_by_contact_type?contact_type=${encodeURIComponent(o)}&hours=168`),r=e.success&&e.data?e.data:e,n=(Array.isArray(r)?r:[]).find(t=>t.node_name&&t.node_name.toLowerCase()===s);if(n&&n.pubkey)return`0x${n.pubkey.substring(0,2)}`}catch{continue}return null}(s);if(!e)return{success:!1,error:`Node '${s}' not found`};n=e}const c=await e(n,o);if(!c.success||!c.data)return{success:!1,error:c.error||"Ping failed"};const i=(u=c.data).rtt_ms>500||u.rssi<-120?"Poor":u.rtt_ms>250||u.rssi<-100?"Fair":u.rtt_ms>100||u.rssi<-80?"Good":"Excellent";var u;return{success:!0,data:{...c.data,quality:i}}}export{s as a,e as p}; diff --git a/frontend/dist/assets/refresh-cw-B42SG81L.js b/frontend/dist/assets/refresh-cw-BtHqSStQ.js similarity index 79% rename from frontend/dist/assets/refresh-cw-B42SG81L.js rename to frontend/dist/assets/refresh-cw-BtHqSStQ.js index 88356847..49a42afd 100644 --- a/frontend/dist/assets/refresh-cw-B42SG81L.js +++ b/frontend/dist/assets/refresh-cw-BtHqSStQ.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const e=a("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);export{e as R}; +import{c as a}from"./index-D22MpaCY.js";const e=a("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);export{e as R}; diff --git a/frontend/dist/assets/route-CHkUVMnV.js b/frontend/dist/assets/route-ExVvvUtv.js similarity index 92% rename from frontend/dist/assets/route-CHkUVMnV.js rename to frontend/dist/assets/route-ExVvvUtv.js index 6d41e19a..c39015f0 100644 --- a/frontend/dist/assets/route-CHkUVMnV.js +++ b/frontend/dist/assets/route-ExVvvUtv.js @@ -1 +1 @@ -import{c as y}from"./index-CZBrdv20.js";const a=y("hash",[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]]),e=y("layers",[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]]),l=y("route",[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]]);export{a as H,e as L,l as R}; +import{c as y}from"./index-D22MpaCY.js";const a=y("hash",[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]]),e=y("layers",[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]]),l=y("route",[["circle",{cx:"6",cy:"19",r:"3",key:"1kj8tv"}],["path",{d:"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",key:"1d8sl"}],["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}]]);export{a as H,e as L,l as R}; diff --git a/frontend/dist/assets/target-5KyqyCil.js b/frontend/dist/assets/target-BlWNMuhi.js similarity index 87% rename from frontend/dist/assets/target-5KyqyCil.js rename to frontend/dist/assets/target-BlWNMuhi.js index 8f5ab37b..e0d6c2ba 100644 --- a/frontend/dist/assets/target-5KyqyCil.js +++ b/frontend/dist/assets/target-BlWNMuhi.js @@ -1 +1 @@ -import{c}from"./index-CZBrdv20.js";const e=c("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),r=c("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]),y=c("target",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]]);export{e as E,r as S,y as T}; +import{c}from"./index-D22MpaCY.js";const e=c("eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),r=c("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]),y=c("target",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]]);export{e as E,r as S,y as T}; diff --git a/frontend/dist/assets/trending-up-xQoBxaWx.js b/frontend/dist/assets/trending-up-D5ntwkR1.js similarity index 87% rename from frontend/dist/assets/trending-up-xQoBxaWx.js rename to frontend/dist/assets/trending-up-D5ntwkR1.js index 7a27b2ec..f3a96fb2 100644 --- a/frontend/dist/assets/trending-up-xQoBxaWx.js +++ b/frontend/dist/assets/trending-up-D5ntwkR1.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const t=a("message-square",[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]]),e=a("minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]),s=a("trending-down",[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]]),h=a("trending-up",[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]]);export{e as M,h as T,s as a,t as b}; +import{c as a}from"./index-D22MpaCY.js";const t=a("message-square",[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]]),e=a("minus",[["path",{d:"M5 12h14",key:"1ays0h"}]]),s=a("trending-down",[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]]),h=a("trending-up",[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]]);export{e as M,h as T,s as a,t as b}; diff --git a/frontend/dist/assets/triangle-alert-DlaBoont.js b/frontend/dist/assets/triangle-alert-TfoZuZfW.js similarity index 75% rename from frontend/dist/assets/triangle-alert-DlaBoont.js rename to frontend/dist/assets/triangle-alert-TfoZuZfW.js index 990e66a6..910b18a2 100644 --- a/frontend/dist/assets/triangle-alert-DlaBoont.js +++ b/frontend/dist/assets/triangle-alert-TfoZuZfW.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const e=a("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);export{e as T}; +import{c as a}from"./index-D22MpaCY.js";const e=a("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);export{e as T}; diff --git a/frontend/dist/assets/usePolling-ZH_j5bYw.js b/frontend/dist/assets/usePolling-XMUhKpB6.js similarity index 75% rename from frontend/dist/assets/usePolling-ZH_j5bYw.js rename to frontend/dist/assets/usePolling-XMUhKpB6.js index 2f2a19fd..5ef929a3 100644 --- a/frontend/dist/assets/usePolling-ZH_j5bYw.js +++ b/frontend/dist/assets/usePolling-XMUhKpB6.js @@ -1 +1 @@ -import{r}from"./vendor-react-DFCqJxYC.js";function e(e,t,n=!0,c=!1){const u=r.useRef(e);r.useEffect(()=>{u.current=e},[e]),r.useEffect(()=>{if(!n)return;c||u.current();const r=setInterval(()=>{u.current()},t);return()=>clearInterval(r)},[t,n,c])}export{e as u}; +import{r}from"./vendor-react-Cwum97tW.js";function e(e,t,n=!0,c=!1){const u=r.useRef(e);r.useEffect(()=>{u.current=e},[e]),r.useEffect(()=>{if(!n)return;c||u.current();const r=setInterval(()=>{u.current()},t);return()=>clearInterval(r)},[t,n,c])}export{e as u}; diff --git a/frontend/dist/assets/useThemeColors-CzhUM4y-.js b/frontend/dist/assets/useThemeColors-S-uaxvPT.js similarity index 60% rename from frontend/dist/assets/useThemeColors-CzhUM4y-.js rename to frontend/dist/assets/useThemeColors-S-uaxvPT.js index 60657c1d..262c58c1 100644 --- a/frontend/dist/assets/useThemeColors-CzhUM4y-.js +++ b/frontend/dist/assets/useThemeColors-S-uaxvPT.js @@ -1 +1 @@ -var r=Object.defineProperty,t=(t,e,o)=>((t,e,o)=>e in t?r(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o)(t,"symbol"!=typeof e?e+"":e,o);import{r as e}from"./vendor-react-DFCqJxYC.js";const o=new class{constructor(){t(this,"observer",null),t(this,"subscribers",new Set),t(this,"isObserving",!1)}subscribe(r){return this.subscribers.add(r),this.isObserving||this.startObserving(),()=>{this.subscribers.delete(r),0===this.subscribers.size&&this.stopObserving()}}get subscriberCount(){return this.subscribers.size}startObserving(){"undefined"!=typeof window&&(this.isObserving||(this.observer=new MutationObserver(r=>{for(const t of r)if("data-theme"===t.attributeName||"data-color-scheme"===t.attributeName||"class"===t.attributeName){setTimeout(()=>this.notifySubscribers(),50);break}}),this.observer.observe(document.documentElement,{attributes:!0}),this.isObserving=!0))}stopObserving(){this.observer&&(this.observer.disconnect(),this.observer=null),this.isObserving=!1}notifySubscribers(){for(const t of this.subscribers)try{t()}catch(r){}}};function a(r){if(!r)return null;const t=r.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(t)return{r:Math.round(255*Math.min(1,Math.max(0,parseFloat(t[1])))),g:Math.round(255*Math.min(1,Math.max(0,parseFloat(t[2])))),b:Math.round(255*Math.min(1,Math.max(0,parseFloat(t[3]))))};if(r.startsWith("#")){const t=r.replace("#","");if(3===t.length)return{r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16)};if(t.length>=6)return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}}const e=r.match(/rgba?\(([\d.]+),?\s*([\d.]+),?\s*([\d.]+)/);return e?{r:Math.round(parseFloat(e[1])),g:Math.round(parseFloat(e[2])),b:Math.round(parseFloat(e[3]))}:null}function n(r){return"undefined"==typeof window?"":getComputedStyle(document.documentElement).getPropertyValue(r).trim()}function s(r){return function(r){if(!r)return"";if(r.startsWith("#"))return r;const t=r.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(t){const r=Math.round(255*Math.min(1,Math.max(0,parseFloat(t[1])))),e=Math.round(255*Math.min(1,Math.max(0,parseFloat(t[2])))),o=Math.round(255*Math.min(1,Math.max(0,parseFloat(t[3]))));return`#${r.toString(16).padStart(2,"0")}${e.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}`}const e=r.match(/rgba?\(([\d.]+),?\s*([\d.]+),?\s*([\d.]+)/);if(e){const r=Math.round(parseFloat(e[1])),t=Math.round(parseFloat(e[2])),o=Math.round(parseFloat(e[3]));return`#${r.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}`}return r}(n(r))}function i(r,t){const[a,n]=e.useState(t),s=e.useCallback(()=>{n(r())},[r]);return e.useEffect(()=>(s(),o.subscribe(s)),[s]),a}const c={chart1:"#719CDF",chart2:"#0074BE",chart3:"#6FBCBD",chart4:"#DFBC72",chart5:"#719872",chart6:"#E12672",chart7:"#E17899",chart8:"#999ABD"},h="#00FF00",u="#8CE619",l="#FFD900",d="#FF8C26",g="#FF3333",b={primary:"#719CDF",secondary:"#DFBC72",tertiary:"#6FBCBD",success:"#719872",danger:"#E12672"},m={primary:"#E4E4E4",secondary:"#BFBFBF",muted:"#727272"},p={nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hubColor:"#8E4EC6",hubStroke:"rgba(255,255,255,0.9)",gatewayColor:"#5B5BD6",gatewayStroke:"rgba(255,255,255,0.85)",localColor:"#FFB224",neighborColor:"#FFB224",neighborStroke:"rgba(0,0,0,0.4)",mobileColor:"#F76B15",roomColor:"#D6409F",ghostColor:"#00A2C7"};function f(){return"undefined"==typeof window?c:{chart1:n("--chart-1")||c.chart1,chart2:n("--chart-2")||c.chart2,chart3:n("--chart-3")||c.chart3,chart4:n("--chart-4")||c.chart4,chart5:n("--chart-5")||c.chart5,chart6:n("--chart-6")||c.chart6,chart7:n("--chart-7")||c.chart7,chart8:n("--chart-8")||c.chart8}}function y(){return"undefined"==typeof window?m:{primary:n("--text-primary")||m.primary,secondary:n("--text-secondary")||m.secondary,muted:n("--text-muted")||m.muted}}function F(){return"undefined"==typeof window?b:{primary:n("--accent-primary")||b.primary,secondary:n("--accent-secondary")||b.secondary,tertiary:n("--accent-tertiary")||b.tertiary,success:n("--accent-success")||b.success,danger:n("--accent-danger")||b.danger}}function S(){return i(f,c)}function C(){return i(y,m)}function k(){return i(F,b)}function w(){return"undefined"==typeof window?p:{nodeFill:n("--map-node-fill")||p.nodeFill,nodeStroke:n("--map-node-stroke")||p.nodeStroke,hubColor:n("--map-hub-color")||p.hubColor,hubStroke:n("--map-hub-stroke")||p.hubStroke,gatewayColor:n("--map-gateway-color")||p.gatewayColor,gatewayStroke:n("--map-gateway-stroke")||p.gatewayStroke,localColor:n("--map-local-color")||p.localColor,neighborColor:n("--map-neighbor-color")||p.neighborColor,neighborStroke:n("--map-neighbor-stroke")||p.neighborStroke,mobileColor:n("--map-mobile-color")||p.mobileColor,roomColor:n("--map-room-color")||p.roomColor,ghostColor:n("--map-ghost-color")||p.ghostColor}}function v(){return i(w,p)}const B={nodeStroke:"rgba(0,0,0,0.6)",hubStroke:"rgba(0,0,0,0.5)",gatewayStroke:"rgba(0,0,0,0.45)",neighborStroke:"rgba(0,0,0,0.5)"},M={nodeStroke:"rgba(255,255,255,0.9)",hubStroke:"rgba(255,255,255,0.9)",gatewayStroke:"rgba(255,255,255,0.85)",neighborStroke:"rgba(0,0,0,0.4)"};function D(r){if("undefined"==typeof window)return p;const t="light"===function(){if("undefined"==typeof window)return"dark";const r=document.querySelector("[data-basemap]");return r&&r.getAttribute("data-basemap")||"dark"}()?B:M;return{nodeFill:s("--map-node-fill")||p.nodeFill,nodeStroke:t.nodeStroke,hubColor:s("--map-hub-color")||p.hubColor,hubStroke:t.hubStroke,gatewayColor:s("--map-gateway-color")||p.gatewayColor,gatewayStroke:t.gatewayStroke,localColor:s("--map-local-color")||p.localColor,neighborColor:s("--map-neighbor-color")||p.neighborColor,neighborStroke:t.neighborStroke,mobileColor:s("--map-mobile-color")||p.mobileColor,roomColor:s("--map-room-color")||p.roomColor,ghostColor:s("--map-ghost-color")||p.ghostColor}}const x={rest:"#4B4B4B",restBright:"#616161",restDim:"#3F3F3F",hoverDirect:"#6FBCBD",hoverLoop:"#8B7BAD",hoverStandard:"#8A8A8A",hoverNeighbor:"#FBBF24",highlight:"#FFD700"},E={rest:"rgba(0, 0, 0, 0.20)",restBright:"rgba(0, 0, 0, 0.30)",restDim:"rgba(0, 0, 0, 0.12)"},O={rest:"rgba(255, 255, 255, 0.25)",restBright:"rgba(255, 255, 255, 0.35)",restDim:"rgba(255, 255, 255, 0.15)"};function A(r){if("undefined"==typeof window)return x;const t="light"===r?E:O;return{rest:t.rest,restBright:t.restBright,restDim:t.restDim,hoverDirect:s("--map-edge-hover-direct")||x.hoverDirect,hoverLoop:s("--map-edge-hover-loop")||x.hoverLoop,hoverStandard:s("--map-edge-hover-standard")||x.hoverStandard,hoverNeighbor:s("--map-edge-hover-neighbor")||x.hoverNeighbor,highlight:s("--map-edge-highlight")||x.highlight}}const I={grid:"rgba(191, 191, 191, 0.15)",axisTick:"#BFBFBF",cursor:"rgba(255, 255, 255, 0.2)"};function $(){return"undefined"==typeof window?I:{grid:n("--chart-grid")||I.grid,axisTick:n("--chart-axis-tick")||I.axisTick,cursor:n("--chart-cursor")||I.cursor}}function N(){return i($,I)}function q(r,t){return n(`--palette-${r}-${t}`)||""}function L(){const r=[];for(let t=0;t<24;t++){const e=t/23,o=1-e,a=q("aqua",[900,800,700,600,500,400,300,200,100,50][Math.min(8,Math.floor(9*o))]),n=parseInt(a.slice(1,3),16)||0,s=parseInt(a.slice(3,5),16)||0,i=parseInt(a.slice(5,7),16)||0,c=Math.round(80+130*e);r.push([n,s,i,c])}return r}function T(){const r=n("--signal-excellent")||h,t=n("--signal-good")||u,e=n("--signal-fair")||l,o=n("--signal-poor")||d,a=n("--signal-critical")||g,s=[];for(let n=0;n<24;n++){let i;i=n<5?r:n<10?t:n<15?e:n<20?o:a,s.push(i)}return s}function j(){const r=s("--signal-excellent")||h,t=s("--signal-good")||u,e=s("--signal-fair")||l,o=s("--signal-poor")||d,a=s("--signal-critical")||g,n=[];for(let s=0;s<24;s++){let i;i=s<5?r:s<10?t:s<15?e:s<20?o:a,n.push(i)}return n}function z(){const[r,t]=e.useState(()=>T());return e.useEffect(()=>{const r=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t(T())})})};return r(),o.subscribe(r)},[]),r}function P(r){const t=(Math.max(-12,Math.min(12,r))- -12)/24;return Math.round(23*(1-t))}function W(){const r=e.useCallback(()=>"undefined"!=typeof document&&document.documentElement.classList.contains("ribbon-mode"),[]),[t,a]=e.useState(r);return e.useEffect(()=>(a(r()),o.subscribe(()=>a(r()))),[r]),t}export{k as a,C as b,z as c,S as d,W as e,j as f,T as g,D as h,A as i,v as j,L as k,a as p,P as s,N as u}; +var r=Object.defineProperty,t=(t,e,o)=>((t,e,o)=>e in t?r(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o)(t,"symbol"!=typeof e?e+"":e,o);import{r as e}from"./vendor-react-Cwum97tW.js";const o=new class{constructor(){t(this,"observer",null),t(this,"subscribers",new Set),t(this,"isObserving",!1)}subscribe(r){return this.subscribers.add(r),this.isObserving||this.startObserving(),()=>{this.subscribers.delete(r),0===this.subscribers.size&&this.stopObserving()}}get subscriberCount(){return this.subscribers.size}startObserving(){"undefined"!=typeof window&&(this.isObserving||(this.observer=new MutationObserver(r=>{for(const t of r)if("data-theme"===t.attributeName||"data-color-scheme"===t.attributeName||"class"===t.attributeName){setTimeout(()=>this.notifySubscribers(),50);break}}),this.observer.observe(document.documentElement,{attributes:!0}),this.isObserving=!0))}stopObserving(){this.observer&&(this.observer.disconnect(),this.observer=null),this.isObserving=!1}notifySubscribers(){for(const t of this.subscribers)try{t()}catch(r){}}};function a(r){if(!r)return null;const t=r.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(t)return{r:Math.round(255*Math.min(1,Math.max(0,parseFloat(t[1])))),g:Math.round(255*Math.min(1,Math.max(0,parseFloat(t[2])))),b:Math.round(255*Math.min(1,Math.max(0,parseFloat(t[3]))))};if(r.startsWith("#")){const t=r.replace("#","");if(3===t.length)return{r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16)};if(t.length>=6)return{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}}const e=r.match(/rgba?\(([\d.]+),?\s*([\d.]+),?\s*([\d.]+)/);return e?{r:Math.round(parseFloat(e[1])),g:Math.round(parseFloat(e[2])),b:Math.round(parseFloat(e[3]))}:null}function n(r){return"undefined"==typeof window?"":getComputedStyle(document.documentElement).getPropertyValue(r).trim()}function s(r){return function(r){if(!r)return"";if(r.startsWith("#"))return r;const t=r.match(/color\(display-p3\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/);if(t){const r=Math.round(255*Math.min(1,Math.max(0,parseFloat(t[1])))),e=Math.round(255*Math.min(1,Math.max(0,parseFloat(t[2])))),o=Math.round(255*Math.min(1,Math.max(0,parseFloat(t[3]))));return`#${r.toString(16).padStart(2,"0")}${e.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}`}const e=r.match(/rgba?\(([\d.]+),?\s*([\d.]+),?\s*([\d.]+)/);if(e){const r=Math.round(parseFloat(e[1])),t=Math.round(parseFloat(e[2])),o=Math.round(parseFloat(e[3]));return`#${r.toString(16).padStart(2,"0")}${t.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}`}return r}(n(r))}function i(r,t){const[a,n]=e.useState(t),s=e.useCallback(()=>{n(r())},[r]);return e.useEffect(()=>(s(),o.subscribe(s)),[s]),a}const c={chart1:"#719CDF",chart2:"#0074BE",chart3:"#6FBCBD",chart4:"#DFBC72",chart5:"#719872",chart6:"#E12672",chart7:"#E17899",chart8:"#999ABD"},l="#00FF00",u="#8CE619",h="#FFD900",d="#FF8C26",g="#FF3333",b={primary:"#719CDF",secondary:"#DFBC72",tertiary:"#6FBCBD",success:"#719872",danger:"#E12672"},p={primary:"#E4E4E4",secondary:"#BFBFBF",muted:"#727272"},m={nodeFill:"#3B82F6",nodeStroke:"rgba(255,255,255,0.9)",hubColor:"#8E4EC6",hubStroke:"rgba(255,255,255,0.9)",gatewayColor:"#5B5BD6",gatewayStroke:"rgba(255,255,255,0.85)",localColor:"#FFB224",neighborColor:"#FFB224",neighborStroke:"rgba(0,0,0,0.4)",mobileColor:"#F76B15",roomColor:"#D6409F",ghostColor:"#00A2C7"};function f(){return"undefined"==typeof window?c:{chart1:n("--chart-1")||c.chart1,chart2:n("--chart-2")||c.chart2,chart3:n("--chart-3")||c.chart3,chart4:n("--chart-4")||c.chart4,chart5:n("--chart-5")||c.chart5,chart6:n("--chart-6")||c.chart6,chart7:n("--chart-7")||c.chart7,chart8:n("--chart-8")||c.chart8}}function y(){return"undefined"==typeof window?p:{primary:n("--text-primary")||p.primary,secondary:n("--text-secondary")||p.secondary,muted:n("--text-muted")||p.muted}}function F(){return"undefined"==typeof window?b:{primary:n("--accent-primary")||b.primary,secondary:n("--accent-secondary")||b.secondary,tertiary:n("--accent-tertiary")||b.tertiary,success:n("--accent-success")||b.success,danger:n("--accent-danger")||b.danger}}function C(){return i(f,c)}function S(){return i(y,p)}function w(){return i(F,b)}function k(){return"undefined"==typeof window?m:{nodeFill:n("--map-node-fill")||m.nodeFill,nodeStroke:n("--map-node-stroke")||m.nodeStroke,hubColor:n("--map-hub-color")||m.hubColor,hubStroke:n("--map-hub-stroke")||m.hubStroke,gatewayColor:n("--map-gateway-color")||m.gatewayColor,gatewayStroke:n("--map-gateway-stroke")||m.gatewayStroke,localColor:n("--map-local-color")||m.localColor,neighborColor:n("--map-neighbor-color")||m.neighborColor,neighborStroke:n("--map-neighbor-stroke")||m.neighborStroke,mobileColor:n("--map-mobile-color")||m.mobileColor,roomColor:n("--map-room-color")||m.roomColor,ghostColor:n("--map-ghost-color")||m.ghostColor}}function B(){return i(k,m)}const v={nodeStroke:"rgba(0,0,0,0.6)",hubStroke:"rgba(0,0,0,0.5)",gatewayStroke:"rgba(0,0,0,0.45)",neighborStroke:"rgba(0,0,0,0.5)"},M={nodeStroke:"rgba(255,255,255,0.9)",hubStroke:"rgba(255,255,255,0.9)",gatewayStroke:"rgba(255,255,255,0.85)",neighborStroke:"rgba(0,0,0,0.4)"};function D(r){if("undefined"==typeof window)return m;const t="light"===function(){if("undefined"==typeof window)return"dark";const r=document.querySelector("[data-basemap]");return r&&r.getAttribute("data-basemap")||"dark"}()?v:M;return{nodeFill:s("--map-node-fill")||m.nodeFill,nodeStroke:t.nodeStroke,hubColor:s("--map-hub-color")||m.hubColor,hubStroke:t.hubStroke,gatewayColor:s("--map-gateway-color")||m.gatewayColor,gatewayStroke:t.gatewayStroke,localColor:s("--map-local-color")||m.localColor,neighborColor:s("--map-neighbor-color")||m.neighborColor,neighborStroke:t.neighborStroke,mobileColor:s("--map-mobile-color")||m.mobileColor,roomColor:s("--map-room-color")||m.roomColor,ghostColor:s("--map-ghost-color")||m.ghostColor}}const E={rest:"#4B4B4B",restBright:"#616161",restDim:"#3F3F3F",hoverDirect:"#6FBCBD",hoverLoop:"#8B7BAD",hoverStandard:"#8A8A8A",hoverNeighbor:"#FBBF24",highlight:"#FFD700"},x={rest:"rgba(0, 0, 0, 0.20)",restBright:"rgba(0, 0, 0, 0.30)",restDim:"rgba(0, 0, 0, 0.12)"},A={rest:"rgba(255, 255, 255, 0.25)",restBright:"rgba(255, 255, 255, 0.35)",restDim:"rgba(255, 255, 255, 0.15)"};function O(r){if("undefined"==typeof window)return E;const t="light"===r?x:A;return{rest:t.rest,restBright:t.restBright,restDim:t.restDim,hoverDirect:s("--map-edge-hover-direct")||E.hoverDirect,hoverLoop:s("--map-edge-hover-loop")||E.hoverLoop,hoverStandard:s("--map-edge-hover-standard")||E.hoverStandard,hoverNeighbor:s("--map-edge-hover-neighbor")||E.hoverNeighbor,highlight:s("--map-edge-highlight")||E.highlight}}const I={grid:"rgba(191, 191, 191, 0.15)",axisTick:"#BFBFBF",cursor:"rgba(255, 255, 255, 0.2)"};function $(){return"undefined"==typeof window?I:{grid:n("--chart-grid")||I.grid,axisTick:n("--chart-axis-tick")||I.axisTick,cursor:n("--chart-cursor")||I.cursor}}function N(){return i($,I)}function q(r,t){return n(`--palette-${r}-${t}`)||""}function L(){const r=[];for(let t=0;t<24;t++){const e=t/23,o=1-e,a=q("aqua",[900,800,700,600,500,400,300,200,100,50][Math.min(8,Math.floor(9*o))]),n=parseInt(a.slice(1,3),16)||0,s=parseInt(a.slice(3,5),16)||0,i=parseInt(a.slice(5,7),16)||0,c=Math.round(80+130*e);r.push([n,s,i,c])}return r}function T(){const r=n("--signal-excellent")||l,t=n("--signal-good")||u,e=n("--signal-fair")||h,o=n("--signal-poor")||d,a=n("--signal-critical")||g,s=[];for(let n=0;n<24;n++){let i;i=n<5?r:n<10?t:n<15?e:n<20?o:a,s.push(i)}return s}function j(){const r=s("--signal-excellent")||l,t=s("--signal-good")||u,e=s("--signal-fair")||h,o=s("--signal-poor")||d,a=s("--signal-critical")||g,n=[];for(let s=0;s<24;s++){let i;i=s<5?r:s<10?t:s<15?e:s<20?o:a,n.push(i)}return n}function z(){const[r,t]=e.useState(()=>T());return e.useEffect(()=>{const r=()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t(T())})})};return r(),o.subscribe(r)},[]),r}function P(r){const t=(Math.max(-12,Math.min(12,r))- -12)/24;return Math.round(23*(1-t))}const W={red:"#E5484D",orange:"#F76B15",amber:"#FFB224",yellow:"#F5D90A",brown:"#AD7F58",green:"#46A758",teal:"#12A594",cyan:"#00A2C7",blue:"#3B82F6",indigo:"#5B5BD6",purple:"#8E4EC6",pink:"#D6409F"};function V(){return"undefined"==typeof window?W:{red:s("--sys-red")||W.red,orange:s("--sys-orange")||W.orange,amber:s("--sys-amber")||W.amber,yellow:s("--sys-yellow")||W.yellow,brown:s("--sys-brown")||W.brown,green:s("--sys-green")||W.green,teal:s("--sys-teal")||W.teal,cyan:s("--sys-cyan")||W.cyan,blue:s("--sys-blue")||W.blue,indigo:s("--sys-indigo")||W.indigo,purple:s("--sys-purple")||W.purple,pink:s("--sys-pink")||W.pink}}function G(){const r=e.useCallback(()=>"undefined"!=typeof document&&document.documentElement.classList.contains("ribbon-mode"),[]),[t,a]=e.useState(r);return e.useEffect(()=>(a(r()),o.subscribe(()=>a(r()))),[r]),t}export{w as a,S as b,z as c,C as d,G as e,V as f,T as g,j as h,D as i,O as j,B as k,L as l,a as p,P as s,N as u}; diff --git a/frontend/dist/assets/users-DbmAVTAI.js b/frontend/dist/assets/users-dFI4fg5G.js similarity index 87% rename from frontend/dist/assets/users-DbmAVTAI.js rename to frontend/dist/assets/users-dFI4fg5G.js index c4a98705..d239c4fc 100644 --- a/frontend/dist/assets/users-DbmAVTAI.js +++ b/frontend/dist/assets/users-dFI4fg5G.js @@ -1 +1 @@ -import{c as a}from"./index-CZBrdv20.js";const e=a("funnel",[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]]),s=a("users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]]);export{e as F,s as U}; +import{c as a}from"./index-D22MpaCY.js";const e=a("funnel",[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]]),s=a("users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]]);export{e as F,s as U}; diff --git a/frontend/dist/assets/vendor-core-Dhs13Wlh.js b/frontend/dist/assets/vendor-core-CDrKesoV.js similarity index 99% rename from frontend/dist/assets/vendor-core-Dhs13Wlh.js rename to frontend/dist/assets/vendor-core-CDrKesoV.js index 1a8f3f6d..ccc29812 100644 --- a/frontend/dist/assets/vendor-core-Dhs13Wlh.js +++ b/frontend/dist/assets/vendor-core-CDrKesoV.js @@ -1 +1 @@ -import{r as e,a as t}from"./vendor-react-DFCqJxYC.js";var n="popstate";function r(e,t){if(!1===e||null==e)throw new Error(t)}function a(e,t){if(!e)try{throw new Error(t)}catch(n){}}function o(e,t){return{usr:e.state,key:e.key,idx:t}}function i(e,t,n=null,r){return{pathname:"string"==typeof e?e:e.pathname,search:"",hash:"",..."string"==typeof t?s(t):t,state:n,key:t&&t.key||r||Math.random().toString(36).substring(2,10)}}function l({pathname:e="/",search:t="",hash:n=""}){return t&&"?"!==t&&(e+="?"===t.charAt(0)?t:"?"+t),n&&"#"!==n&&(e+="#"===n.charAt(0)?n:"#"+n),e}function s(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function u(e,t,n="/"){return function(e,t,n){let r=C(("string"==typeof t?s(t):t).pathname||"/",n);if(null==r)return null;let a=c(e);!function(e){e.sort((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)))}(a);let o=null;for(let i=0;null==o&&i{let u={relativePath:void 0===s?e.path||"":s,caseSensitive:!0===e.caseSensitive,childrenIndex:i,route:e};if(u.relativePath.startsWith("/")){if(!u.relativePath.startsWith(a)&&l)return;r(u.relativePath.startsWith(a),`Absolute route path "${u.relativePath}" nested under path "${a}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),u.relativePath=u.relativePath.slice(a.length)}let h=k([a,u.relativePath]),d=n.concat(u);e.children&&e.children.length>0&&(r(!0!==e.index,`Index routes must not have child routes. Please remove all child routes from route path "${h}".`),c(e.children,t,d,h,l)),(null!=e.path||e.index)&&t.push({path:h,score:w(h,e.index),routesMeta:d})};return e.forEach((e,t)=>{var n;if(""!==e.path&&(null==(n=e.path)?void 0:n.includes("?")))for(let r of h(e.path))i(e,t,!0,r);else i(e,t)}),t}function h(e){let t=e.split("/");if(0===t.length)return[];let[n,...r]=t,a=n.endsWith("?"),o=n.replace(/\?$/,"");if(0===r.length)return a?[o,""]:[o];let i=h(r.join("/")),l=[];return l.push(...i.map(e=>""===e?o:[o,e].join("/"))),a&&l.push(...i),l.map(t=>e.startsWith("/")&&""===t?"/":t)}var d=/^:[\w-]+$/,p=3,m=2,f=1,v=10,g=-2,y=e=>"*"===e;function w(e,t){let n=e.split("/"),r=n.length;return n.some(y)&&(r+=g),t&&(r+=m),n.filter(e=>!y(e)).reduce((e,t)=>e+(d.test(t)?p:""===t?f:v),r)}function b(e,t,n=!1){let{routesMeta:r}=e,a={},o="/",i=[];for(let l=0;l(r.push({paramName:t,isOptional:null!=n}),n?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(r.push({paramName:"*"}),o+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?o+="\\/*$":""!==e&&"/"!==e&&(o+="(?:(?=\\/|$))"),[new RegExp(o,t?void 0:"i"),r]}(e.path,e.caseSensitive,e.end),o=t.match(n);if(!o)return null;let i=o[0],l=i.replace(/(.)\/+$/,"$1"),s=o.slice(1);return{params:r.reduce((e,{paramName:t,isOptional:n},r)=>{if("*"===t){let e=s[r]||"";l=i.slice(0,i.length-e.length).replace(/(.)\/+$/,"$1")}const a=s[r];return e[t]=n&&!a?void 0:(a||"").replace(/%2F/g,"/"),e},{}),pathname:i,pathnameBase:l,pattern:e}}function x(e){try{return e.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(t){return a(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function C(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&"/"!==r?null:e.slice(n)||"/"}var R=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function S(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(e=>{".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)}),n.length>1?n.join("/"):"/"}function $(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function L(e){let t=function(e){return e.filter((e,t)=>0===t||e.route.path&&e.route.path.length>0)}(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function T(e,t,n,o=!1){let i;"string"==typeof e?i=s(e):(i={...e},r(!i.pathname||!i.pathname.includes("?"),$("?","pathname","search",i)),r(!i.pathname||!i.pathname.includes("#"),$("#","pathname","hash",i)),r(!i.search||!i.search.includes("#"),$("#","search","hash",i)));let l,u=""===e||""===i.pathname,c=u?"/":i.pathname;if(null==c)l=n;else{let e=t.length-1;if(!o&&c.startsWith("..")){let t=c.split("/");for(;".."===t[0];)t.shift(),e-=1;i.pathname=t.join("/")}l=e>=0?t[e]:"/"}let h=function(e,t="/"){let n,{pathname:r,search:o="",hash:i=""}="string"==typeof e?s(e):e;if(r)if(l=r,R.test(l))n=r;else{if(r.includes("//")){let e=r;r=r.replace(/\/\/+/g,"/"),a(!1,`Pathnames cannot have embedded double slashes - normalizing ${e} -> ${r}`)}n=r.startsWith("/")?S(r.substring(1),"/"):S(r,t)}else n=t;var l;return{pathname:n,search:N(o),hash:O(i)}}(i,l),d=c&&"/"!==c&&c.endsWith("/"),p=(u||"."===c)&&n.endsWith("/");return h.pathname.endsWith("/")||!d&&!p||(h.pathname+="/"),h}var k=e=>e.join("/").replace(/\/\/+/g,"/"),P=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),N=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",O=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";function F(e){return e.map(e=>e.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var M=["POST","PUT","PATCH","DELETE"];new Set(M);var A=["GET",...M];new Set(A);var D=e.createContext(null);D.displayName="DataRouter";var j=e.createContext(null);j.displayName="DataRouterState",e.createContext(!1);var W=e.createContext({isTransitioning:!1});W.displayName="ViewTransition",e.createContext(new Map).displayName="Fetchers",e.createContext(null).displayName="Await";var I=e.createContext(null);I.displayName="Navigation";var B=e.createContext(null);B.displayName="Location";var _=e.createContext({outlet:null,matches:[],isDataRoute:!1});_.displayName="Route";var U=e.createContext(null);function H(){return null!=e.useContext(B)}function z(){return r(H(),"useLocation() may be used only in the context of a component."),e.useContext(B).location}U.displayName="RouteError";var J="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Y(t){e.useContext(I).static||e.useLayoutEffect(t)}function K(){let{isDataRoute:t}=e.useContext(_);return t?function(){let{router:t}=function(){let t=e.useContext(D);return r(t,ee("useNavigate")),t}(),n=te("useNavigate"),o=e.useRef(!1);return Y(()=>{o.current=!0}),e.useCallback(async(e,r={})=>{a(o.current,J),o.current&&("number"==typeof e?await t.navigate(e):await t.navigate(e,{fromRouteId:n,...r}))},[t,n])}():function(){r(H(),"useNavigate() may be used only in the context of a component.");let t=e.useContext(D),{basename:n,navigator:o}=e.useContext(I),{matches:i}=e.useContext(_),{pathname:l}=z(),s=JSON.stringify(L(i)),u=e.useRef(!1);return Y(()=>{u.current=!0}),e.useCallback((e,r={})=>{if(a(u.current,J),!u.current)return;if("number"==typeof e)return void o.go(e);let i=T(e,JSON.parse(s),l,"path"===r.relative);null==t&&"/"!==n&&(i.pathname="/"===i.pathname?n:k([n,i.pathname])),(r.replace?o.replace:o.push)(i,r.state,r)},[n,o,s,l,t])}()}function V(t,{relative:n}={}){let{matches:r}=e.useContext(_),{pathname:a}=z(),o=JSON.stringify(L(r));return e.useMemo(()=>T(t,JSON.parse(o),a,"path"===n),[t,o,a,n])}function q(t,n,o,i,l){var c;r(H(),"useRoutes() may be used only in the context of a component.");let{navigator:h}=e.useContext(I),{matches:d}=e.useContext(_),p=d[d.length-1],m=p?p.params:{},f=p?p.pathname:"/",v=p?p.pathnameBase:"/",g=p&&p.route;{let e=g&&g.path||"";re(f,!g||e.endsWith("*")||e.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${f}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.\n\nPlease change the parent to .`)}let y,w=z();if(n){let e="string"==typeof n?s(n):n;r("/"===v||(null==(c=e.pathname)?void 0:c.startsWith(v)),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${v}" but pathname "${e.pathname}" was given in the \`location\` prop.`),y=e}else y=w;let b=y.pathname||"/",E=b;if("/"!==v){let e=v.replace(/^\//,"").split("/");E="/"+b.replace(/^\//,"").split("/").slice(e.length).join("/")}let x=u(t,{pathname:E});a(g||null!=x,`No routes matched location "${y.pathname}${y.search}${y.hash}" `),a(null==x||void 0!==x[x.length-1].route.element||void 0!==x[x.length-1].route.Component||void 0!==x[x.length-1].route.lazy,`Matched leaf route at location "${y.pathname}${y.search}${y.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let C=function(t,n=[],a=null,o=null){if(null==t){if(!a)return null;if(a.errors)t=a.matches;else{if(0!==n.length||a.initialized||!(a.matches.length>0))return null;t=a.matches}}let i=t,l=null==a?void 0:a.errors;if(null!=l){let e=i.findIndex(e=>e.route.id&&void 0!==(null==l?void 0:l[e.route.id]));r(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(l).join(",")}`),i=i.slice(0,Math.min(i.length,e+1))}let s=!1,u=-1;if(a)for(let e=0;e=0?i.slice(0,u+1):[i[0]];break}}}let c=a&&o?(e,t)=>{var n,r;o(e,{location:a.location,params:(null==(r=null==(n=a.matches)?void 0:n[0])?void 0:r.params)??{},unstable_pattern:F(a.matches),errorInfo:t})}:void 0;return i.reduceRight((t,r,o)=>{let h,d=!1,p=null,m=null;a&&(h=l&&r.route.id?l[r.route.id]:void 0,p=r.route.errorElement||X,s&&(u<0&&0===o?(re("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,m=null):u===o&&(d=!0,m=r.route.hydrateFallbackElement||null)));let f=n.concat(i.slice(0,o+1)),v=()=>{let n;return n=h?p:d?m:r.route.Component?e.createElement(r.route.Component,null):r.route.element?r.route.element:t,e.createElement(Z,{match:r,routeContext:{outlet:t,matches:f,isDataRoute:null!=a},children:n})};return a&&(r.route.ErrorBoundary||r.route.errorElement||0===o)?e.createElement(Q,{location:a.location,revalidation:a.revalidation,component:p,error:h,children:v(),routeContext:{outlet:null,matches:f,isDataRoute:!0},onError:c}):v()},null)}(x&&x.map(e=>Object.assign({},e,{params:Object.assign({},m,e.params),pathname:k([v,h.encodeLocation?h.encodeLocation(e.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:e.pathname]),pathnameBase:"/"===e.pathnameBase?v:k([v,h.encodeLocation?h.encodeLocation(e.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:e.pathnameBase])})),d,o,i);return n&&C?e.createElement(B.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...y},navigationType:"POP"}},C):C}function G(){let t=function(){var t;let n=e.useContext(U),a=function(){let t=e.useContext(j);return r(t,ee("useRouteError")),t}(),o=te("useRouteError");return void 0!==n?n:null==(t=a.errors)?void 0:t[o]}(),n=function(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"boolean"==typeof e.internal&&"data"in e}(t)?`${t.status} ${t.statusText}`:t instanceof Error?t.message:JSON.stringify(t),a=t instanceof Error?t.stack:null,o="rgba(200,200,200, 0.5)",i={padding:"0.5rem",backgroundColor:o},l={padding:"2px 4px",backgroundColor:o},s=null;return s=e.createElement(e.Fragment,null,e.createElement("p",null,"💿 Hey developer 👋"),e.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",e.createElement("code",{style:l},"ErrorBoundary")," or"," ",e.createElement("code",{style:l},"errorElement")," prop on your route.")),e.createElement(e.Fragment,null,e.createElement("h2",null,"Unexpected Application Error!"),e.createElement("h3",{style:{fontStyle:"italic"}},n),a?e.createElement("pre",{style:i},a):null,s)}e.createContext(null);var X=e.createElement(G,null),Q=class extends e.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||"idle"!==t.revalidation&&"idle"===e.revalidation?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:void 0!==e.error?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError&&this.props.onError(e,t)}render(){return void 0!==this.state.error?e.createElement(_.Provider,{value:this.props.routeContext},e.createElement(U.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function Z({routeContext:t,match:n,children:r}){let a=e.useContext(D);return a&&a.static&&a.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=n.route.id),e.createElement(_.Provider,{value:t},r)}function ee(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function te(t){let n=function(t){let n=e.useContext(_);return r(n,ee(t)),n}(t),a=n.matches[n.matches.length-1];return r(a.route.id,`${t} can only be used on routes that contain a unique "id"`),a.route.id}var ne={};function re(e,t,n){t||ne[e]||(ne[e]=!0,a(!1,n))}function ae({to:t,replace:n,state:o,relative:i}){r(H()," may be used only in the context of a component.");let{static:l}=e.useContext(I);a(!l," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:s}=e.useContext(_),{pathname:u}=z(),c=K(),h=T(t,L(s),u,"path"===i),d=JSON.stringify(h);return e.useEffect(()=>{c(JSON.parse(d),{replace:n,state:o,relative:i})},[c,d,i,n,o]),null}function oe(e){r(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function ie({basename:t="/",children:n=null,location:o,navigationType:i="POP",navigator:l,static:u=!1,unstable_useTransitions:c}){r(!H(),"You cannot render a inside another . You should never have more than one in your app.");let h=t.replace(/^\/*/,"/"),d=e.useMemo(()=>({basename:h,navigator:l,static:u,unstable_useTransitions:c,future:{}}),[h,l,u,c]);"string"==typeof o&&(o=s(o));let{pathname:p="/",search:m="",hash:f="",state:v=null,key:g="default"}=o,y=e.useMemo(()=>{let e=C(p,h);return null==e?null:{location:{pathname:e,search:m,hash:f,state:v,key:g},navigationType:i}},[h,p,m,f,v,g,i]);return a(null!=y,` is not able to match the URL "${p}${m}${f}" because it does not start with the basename, so the won't render anything.`),null==y?null:e.createElement(I.Provider,{value:d},e.createElement(B.Provider,{children:n,value:y}))}function le({children:e,location:t}){return q(se(e),t)}function se(t,n=[]){let a=[];return e.Children.forEach(t,(t,o)=>{if(!e.isValidElement(t))return;let i=[...n,o];if(t.type===e.Fragment)return void a.push.apply(a,se(t.props.children,i));r(t.type===oe,`[${"string"==typeof t.type?t.type:t.type.name}] is not a component. All component children of must be a or `),r(!t.props.index||!t.props.children,"An index route cannot have child routes.");let l={id:t.props.id||i.join("-"),caseSensitive:t.props.caseSensitive,element:t.props.element,Component:t.props.Component,index:t.props.index,path:t.props.path,middleware:t.props.middleware,loader:t.props.loader,action:t.props.action,hydrateFallbackElement:t.props.hydrateFallbackElement,HydrateFallback:t.props.HydrateFallback,errorElement:t.props.errorElement,ErrorBoundary:t.props.ErrorBoundary,hasErrorBoundary:!0===t.props.hasErrorBoundary||null!=t.props.ErrorBoundary||null!=t.props.errorElement,shouldRevalidate:t.props.shouldRevalidate,handle:t.props.handle,lazy:t.props.lazy};t.props.children&&(l.children=se(t.props.children,i)),a.push(l)}),a}e.memo(function({routes:e,future:t,state:n,unstable_onError:r}){return q(e,void 0,n,r)});var ue="get",ce="application/x-www-form-urlencoded";function he(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement}var de=null,pe=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function me(e){return null==e||pe.has(e)?e:(a(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${ce}"`),null)}function fe(e,t){if(!1===e||null==e)throw new Error(t)}function ve(e){return null!=e&&(null==e.href?"preload"===e.rel&&"string"==typeof e.imageSrcSet&&"string"==typeof e.imageSizes:"string"==typeof e.rel&&"string"==typeof e.href)}function ge(e,t,n,r,a,o){let i=(e,t)=>!n[t]||e.route.id!==n[t].route.id,l=(e,t)=>{var r;return n[t].pathname!==e.pathname||(null==(r=n[t].route.path)?void 0:r.endsWith("*"))&&n[t].params["*"]!==e.params["*"]};return"assets"===o?t.filter((e,t)=>i(e,t)||l(e,t)):"data"===o?t.filter((t,o)=>{var s;let u=r.routes[t.route.id];if(!u||!u.hasLoader)return!1;if(i(t,o)||l(t,o))return!0;if(t.route.shouldRevalidate){let r=t.route.shouldRevalidate({currentUrl:new URL(a.pathname+a.search+a.hash,window.origin),currentParams:(null==(s=n[0])?void 0:s.params)||{},nextUrl:new URL(e,window.origin),nextParams:t.params,defaultShouldRevalidate:!0});if("boolean"==typeof r)return r}return!0}):[]}function ye(){let t=e.useContext(D);return fe(t,"You must render this element inside a element"),t}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var we=e.createContext(void 0);function be(){let t=e.useContext(we);return fe(t,"You must render this element inside a element"),t}function Ee(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function xe({page:t,...n}){let{router:r}=ye(),a=e.useMemo(()=>u(r.routes,t,r.basename),[r.routes,t,r.basename]);return a?e.createElement(Ce,{page:t,matches:a,...n}):null}function Ce({page:t,matches:n,...r}){let a=z(),{manifest:o,routeModules:i}=be(),{basename:l}=ye(),{loaderData:s,matches:u}=function(){let t=e.useContext(j);return fe(t,"You must render this element inside a element"),t}(),c=e.useMemo(()=>ge(t,n,u,o,a,"data"),[t,n,u,o,a]),h=e.useMemo(()=>ge(t,n,u,o,a,"assets"),[t,n,u,o,a]),d=e.useMemo(()=>{if(t===a.pathname+a.search+a.hash)return[];let e=new Set,r=!1;if(n.forEach(t=>{var n;let a=o.routes[t.route.id];a&&a.hasLoader&&(!c.some(e=>e.route.id===t.route.id)&&t.route.id in s&&(null==(n=i[t.route.id])?void 0:n.shouldRevalidate)||a.hasClientLoader?r=!0:e.add(t.route.id))}),0===e.size)return[];let u=function(e,t,n){let r="string"==typeof e?new URL(e,"undefined"==typeof window?"server://singlefetch/":window.location.origin):e;return"/"===r.pathname?r.pathname=`_root.${n}`:t&&"/"===C(r.pathname,t)?r.pathname=`${t.replace(/\/$/,"")}/_root.${n}`:r.pathname=`${r.pathname.replace(/\/$/,"")}.${n}`,r}(t,l,"data");return r&&e.size>0&&u.searchParams.set("_routes",n.filter(t=>e.has(t.route.id)).map(e=>e.route.id).join(",")),[u.pathname+u.search]},[l,s,a,o,c,n,t,i]),p=e.useMemo(()=>function(e,t,{includeHydrateFallback:n}={}){return r=e.map(e=>{let r=t.routes[e.route.id];if(!r)return[];let a=[r.module];return r.clientActionModule&&(a=a.concat(r.clientActionModule)),r.clientLoaderModule&&(a=a.concat(r.clientLoaderModule)),n&&r.hydrateFallbackModule&&(a=a.concat(r.hydrateFallbackModule)),r.imports&&(a=a.concat(r.imports)),a}).flat(1),[...new Set(r)];var r}(h,o),[h,o]),m=function(t){let{manifest:n,routeModules:r}=be(),[a,o]=e.useState([]);return e.useEffect(()=>{let e=!1;return async function(e,t,n){return function(e){let t=new Set;return new Set(void 0),e.reduce((e,n)=>{let r=JSON.stringify(function(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}(n));return t.has(r)||(t.add(r),e.push({key:r,link:n})),e},[])}((await Promise.all(e.map(async e=>{let r=t.routes[e.route.id];if(r){let e=await async function(e,t){if(e.id in t)return t[e.id];try{let n=await import(e.module);return t[e.id]=n,n}catch(n){return window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}(r,n);return e.links?e.links():[]}return[]}))).flat(1).filter(ve).filter(e=>"stylesheet"===e.rel||"preload"===e.rel).map(e=>"stylesheet"===e.rel?{...e,rel:"prefetch",as:"style"}:{...e,rel:"prefetch"}))}(t,n,r).then(t=>{e||o(t)}),()=>{e=!0}},[t,n,r]),a}(h);return e.createElement(e.Fragment,null,d.map(t=>e.createElement("link",{key:t,rel:"prefetch",as:"fetch",href:t,...r})),p.map(t=>e.createElement("link",{key:t,rel:"modulepreload",href:t,...r})),m.map(({key:t,link:n})=>e.createElement("link",{key:t,nonce:r.nonce,...n})))}function Re(...e){return t=>{e.forEach(e=>{"function"==typeof e?e(t):null!=e&&(e.current=t)})}}we.displayName="FrameworkContext";var Se="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement;try{Se&&(window.__reactRouterVersion="7.10.1")}catch(Ie){}function $e({basename:t,children:a,unstable_useTransitions:s,window:u}){let c=e.useRef();null==c.current&&(c.current=function(e={}){return function(e,t,a,s={}){let{window:u=document.defaultView,v5Compat:c=!1}=s,h=u.history,d="POP",p=null,m=f();function f(){return(h.state||{idx:null}).idx}function v(){d="POP";let e=f(),t=null==e?null:e-m;m=e,p&&p({action:d,location:y.location,delta:t})}function g(e){return function(e,t=!1){let n="http://localhost";"undefined"!=typeof window&&(n="null"!==window.location.origin?window.location.origin:window.location.href),r(n,"No window.location.(origin|href) available to create URL");let a="string"==typeof e?e:l(e);return a=a.replace(/ $/,"%20"),!t&&a.startsWith("//")&&(a=n+a),new URL(a,n)}(e)}null==m&&(m=0,h.replaceState({...h.state,idx:m},""));let y={get action(){return d},get location(){return e(u,h)},listen(e){if(p)throw new Error("A history only accepts one active listener");return u.addEventListener(n,v),p=e,()=>{u.removeEventListener(n,v),p=null}},createHref:e=>t(u,e),createURL:g,encodeLocation(e){let t=g(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){d="PUSH";let n=i(y.location,e,t);m=f()+1;let r=o(n,m),a=y.createHref(n);try{h.pushState(r,"",a)}catch(l){if(l instanceof DOMException&&"DataCloneError"===l.name)throw l;u.location.assign(a)}c&&p&&p({action:d,location:y.location,delta:1})},replace:function(e,t){d="REPLACE";let n=i(y.location,e,t);m=f();let r=o(n,m),a=y.createHref(n);h.replaceState(r,"",a),c&&p&&p({action:d,location:y.location,delta:0})},go:e=>h.go(e)};return y}(function(e,t){let{pathname:n,search:r,hash:a}=e.location;return i("",{pathname:n,search:r,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||"default")},function(e,t){return"string"==typeof t?t:l(t)},0,e)}({window:u,v5Compat:!0}));let h=c.current,[d,p]=e.useState({action:h.action,location:h.location}),m=e.useCallback(t=>{!1===s?p(t):e.startTransition(()=>p(t))},[s]);return e.useLayoutEffect(()=>h.listen(m),[h,m]),e.createElement(ie,{basename:t,children:a,location:d.location,navigationType:d.action,navigator:h,unstable_useTransitions:!0===s})}var Le=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Te=e.forwardRef(function({onClick:t,discover:n="render",prefetch:o="none",relative:i,reloadDocument:s,replace:u,state:c,target:h,to:d,preventScrollReset:p,viewTransition:m,...f},v){let g,{basename:y,unstable_useTransitions:w}=e.useContext(I),b="string"==typeof d&&Le.test(d),E=!1;if("string"==typeof d&&b&&(g=d,Se))try{let e=new URL(window.location.href),t=d.startsWith("//")?new URL(e.protocol+d):new URL(d),n=C(t.pathname,y);t.origin===e.origin&&null!=n?d=n+t.search+t.hash:E=!0}catch(Ie){a(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}let x=function(t,{relative:n}={}){r(H(),"useHref() may be used only in the context of a component.");let{basename:a,navigator:o}=e.useContext(I),{hash:i,pathname:l,search:s}=V(t,{relative:n}),u=l;return"/"!==a&&(u="/"===l?a:k([a,l])),o.createHref({pathname:u,search:s,hash:i})}(d,{relative:i}),[R,S,$]=function(t,n){let r=e.useContext(we),[a,o]=e.useState(!1),[i,l]=e.useState(!1),{onFocus:s,onBlur:u,onMouseEnter:c,onMouseLeave:h,onTouchStart:d}=n,p=e.useRef(null);e.useEffect(()=>{if("render"===t&&l(!0),"viewport"===t){let e=new IntersectionObserver(e=>{e.forEach(e=>{l(e.isIntersecting)})},{threshold:.5});return p.current&&e.observe(p.current),()=>{e.disconnect()}}},[t]),e.useEffect(()=>{if(a){let e=setTimeout(()=>{l(!0)},100);return()=>{clearTimeout(e)}}},[a]);let m=()=>{o(!0)},f=()=>{o(!1),l(!1)};return r?"intent"!==t?[i,p,{}]:[i,p,{onFocus:Ee(s,m),onBlur:Ee(u,f),onMouseEnter:Ee(c,m),onMouseLeave:Ee(h,f),onTouchStart:Ee(d,m)}]:[!1,p,{}]}(o,f),L=function(t,{target:n,replace:r,state:a,preventScrollReset:o,relative:i,viewTransition:s,unstable_useTransitions:u}={}){let c=K(),h=z(),d=V(t,{relative:i});return e.useCallback(p=>{if(function(e,t){return!(0!==e.button||t&&"_self"!==t||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e))}(p,n)){p.preventDefault();let n=void 0!==r?r:l(h)===l(d),m=()=>c(t,{replace:n,state:a,preventScrollReset:o,relative:i,viewTransition:s});u?e.startTransition(()=>m()):m()}},[h,c,d,r,a,n,t,o,i,s,u])}(d,{replace:u,state:c,target:h,preventScrollReset:p,relative:i,viewTransition:m,unstable_useTransitions:w}),T=e.createElement("a",{...f,...$,href:g||x,onClick:E||s?t:function(e){t&&t(e),e.defaultPrevented||L(e)},ref:Re(v,S),target:h,"data-discover":b||"render"!==n?void 0:"true"});return R&&!b?e.createElement(e.Fragment,null,T,e.createElement(xe,{page:x})):T});function ke(t){let n=e.useContext(D);return r(n,function(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}(t)),n}Te.displayName="Link",e.forwardRef(function({"aria-current":t="page",caseSensitive:n=!1,className:a="",end:o=!1,style:i,to:l,viewTransition:s,children:u,...c},h){let d=V(l,{relative:c.relative}),p=z(),m=e.useContext(j),{navigator:f,basename:v}=e.useContext(I),g=null!=m&&function(t,{relative:n}={}){let a=e.useContext(W);r(null!=a,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:o}=ke("useViewTransitionState"),i=V(t,{relative:n});if(!a.isTransitioning)return!1;let l=C(a.currentLocation.pathname,o)||a.currentLocation.pathname,s=C(a.nextLocation.pathname,o)||a.nextLocation.pathname;return null!=E(i.pathname,s)||null!=E(i.pathname,l)}(d)&&!0===s,y=f.encodeLocation?f.encodeLocation(d).pathname:d.pathname,w=p.pathname,b=m&&m.navigation&&m.navigation.location?m.navigation.location.pathname:null;n||(w=w.toLowerCase(),b=b?b.toLowerCase():null,y=y.toLowerCase()),b&&v&&(b=C(b,v)||b);const x="/"!==y&&y.endsWith("/")?y.length-1:y.length;let R,S=w===y||!o&&w.startsWith(y)&&"/"===w.charAt(x),$=null!=b&&(b===y||!o&&b.startsWith(y)&&"/"===b.charAt(y.length)),L={isActive:S,isPending:$,isTransitioning:g},T=S?t:void 0;R="function"==typeof a?a(L):[a,S?"active":null,$?"pending":null,g?"transitioning":null].filter(Boolean).join(" ");let k="function"==typeof i?i(L):i;return e.createElement(Te,{...c,"aria-current":T,className:R,ref:h,style:k,to:l,viewTransition:s},"function"==typeof u?u(L):u)}).displayName="NavLink",e.forwardRef(({discover:t="render",fetcherKey:n,navigate:a,reloadDocument:o,replace:i,state:s,method:u=ue,action:c,onSubmit:h,relative:d,preventScrollReset:p,viewTransition:m,...f},v)=>{let{unstable_useTransitions:g}=e.useContext(I),y=function(){let{router:t}=ke("useSubmit"),{basename:n}=e.useContext(I),r=te("useRouteId"),a=t.fetch,o=t.navigate;return e.useCallback(async(e,t={})=>{let{action:i,method:l,encType:s,formData:u,body:c}=function(e,t){let n,r,a,o,i;if(he(l=e)&&"form"===l.tagName.toLowerCase()){let i=e.getAttribute("action");r=i?C(i,t):null,n=e.getAttribute("method")||ue,a=me(e.getAttribute("enctype"))||ce,o=new FormData(e)}else if(function(e){return he(e)&&"button"===e.tagName.toLowerCase()}(e)||function(e){return he(e)&&"input"===e.tagName.toLowerCase()}(e)&&("submit"===e.type||"image"===e.type)){let i=e.form;if(null==i)throw new Error('Cannot submit a