diff --git a/dist/assets/analysis-modal-CYhcFxIW.js b/dist/assets/analysis-modal-CYhcFxIW.js new file mode 100644 index 0000000..1d0e5a2 --- /dev/null +++ b/dist/assets/analysis-modal-CYhcFxIW.js @@ -0,0 +1,11 @@ +import{M as oe}from"./bootstrap-D1-uvFxm.js";import{ax as re}from"./openlayers-J9qS6Th1.js";import{i as j,f as I,a as se,b as ae,c as ie,d as le,e as ue,g as ce}from"./turf-B-0GbNlN.js";import{s as D}from"./index-BYEiD6vv.js";import"./geotiff-BaoeLn6q.js";import"./pako-Xa-UToif.js";import"./ol-ext-C5frl4dY.js";import"./shpjs-Doisr2ug.js";const Y=4e5,de=new re;function L(e,n="EPSG:3857"){const o=[];for(const r of e||[]){if(!(r.getGeometry&&r.getGeometry()))continue;const s=de.writeFeatureObject(r,{dataProjection:"EPSG:4326",featureProjection:n});s&&s.geometry&&o.push(s)}return o}function S(e){const n=e&&e.geometry;if(!n||!n.coordinates)return null;let o=1/0,r=1/0,a=-1/0,s=-1/0;const l=i=>{if(typeof i[0]=="number"){i[0]a&&(a=i[0]),i[1]s&&(s=i[1]);return}for(const d of i)l(d)};return l(n.coordinates),Number.isFinite(o)?[o,r,a,s]:null}function F(e,n){return!e||!n?!1:!(e[2]=e[0]&&n<=e[2]&&o>=e[1]&&o<=e[3]:!1}function A(e){return(e||[]).filter(n=>{const o=n?.geometry?.type;return o==="Polygon"||o==="MultiPolygon"})}function ye(e,n,o="b_"){const r={...e||{}};for(const[a,s]of Object.entries(n||{}))r[Object.prototype.hasOwnProperty.call(r,a)?`${o}${a}`:a]=s;return r}function k(e){return{type:"FeatureCollection",features:e}}function q(e,n,o={}){const{keepBAttributes:r=!0}=o,a=A(L(e)),s=A(L(n)),l=s.map(S);let i=0;const d=[];for(const c of a){const m=S(c);for(let u=0;uY)throw U(i);let p=null;try{p=ae(I([c,s[u]]))}catch{p=null}!p||!p.geometry||(p.properties=r?ye(c.properties,s[u].properties):{...c.properties||{}},d.push(p))}}return k(d)}function me(e,n,o={}){return q(e,n,{...o,keepBAttributes:!1})}function pe(e,n){const o=A(L(e)),r=A(L(n)),a=r.map(S);let s=0;const l=[];for(const i of o){const d=S(i);let c=i;for(let m=0;mY)throw U(s);try{const u=se(I([c,r[m]]));c=u&&u.geometry?u:null}catch{}}c&&c.geometry&&(c.properties={...i.properties||{}},l.push(c))}return k(l)}function he(e,n=[]){const o=A([...L(e),...L(n)]);if(o.length===0)return k([]);if(o.length===1)return k([o[0]]);let r=null;try{r=j(I(o))}catch{r=o[0];for(let a=1;a{const E=B?.geometry?.type;return E==="Polygon"||E==="MultiPolygon"}),i=L(n)||[];if(l.length===0)throw new Error("The zone layer contains no polygons.");const d=a==="centroid"?i.map(B=>{try{return ie(B)}catch{return null}}):null,c=a==="centroid"?null:i.map(S),m=l.map(S);let u=0;const p=[];for(let B=0;BP)throw G(u);h=le(w,E)}else{if(!F(H,c[f]))continue;if(++u>P)throw G(u);h=ue(i[f],E)}}catch{h=!1}h&&M.push(i[f])}const v=r?M.map(f=>ve(f.properties?f.properties[r]:null)).filter(f=>f!==null):[],x={};for(const f of o)switch(f){case"count":x[`${s}count`]=M.length;break;case"sum":x[`${s}sum`]=v.length?N(v.reduce((h,w)=>h+w,0)):0;break;case"mean":x[`${s}mean`]=v.length?N(v.reduce((h,w)=>h+w,0)/v.length):null;break;case"min":x[`${s}min`]=v.length?N(Math.min(...v)):null;break;case"max":x[`${s}max`]=v.length?N(Math.max(...v)):null;break;case"area":{let h=0;for(const w of M)try{h+=ce(w)}catch{}x[`${s}area_m2`]=Math.round(h);break}}E.properties={...E.properties||{},...x},p.push({...Be(E),...x})}return{geojson:{type:"FeatureCollection",features:l},rows:p}}function G(e){return new Error(`More than ${e.toLocaleString()} features fall within the zones' bounding boxes, which is too much to summarise in the browser. Narrow the inputs using “Apply to” (current map view or selected features).`)}function N(e){return Math.round(e*1e3)/1e3}function Be(e){const n=e.properties||{};for(const o of["zone_name","name","ZONE_NAME","NAME","upn","UPN","id","ID"])if(n[o]!==void 0&&n[o]!==null&&String(n[o]).trim()!=="")return{zone:String(n[o])};return{zone:"(unnamed)"}}const Ee=9001,O="Analysis",t={};let C=null,g=null,$=[],b=null;function xe(){t.root||(t.root=document.getElementById("analysisModal"),t.mode=Array.from(document.querySelectorAll('input[name="analysis-mode"]')),t.overlayBox=document.getElementById("analysis-overlay-box"),t.zonalBox=document.getElementById("analysis-zonal-box"),t.op=document.getElementById("analysis-op"),t.opHint=document.getElementById("analysis-op-hint"),t.layerA=document.getElementById("analysis-layer-a"),t.layerB=document.getElementById("analysis-layer-b"),t.layerBWrap=document.getElementById("analysis-layer-b-wrap"),t.zoneLayer=document.getElementById("analysis-zone-layer"),t.inputLayer=document.getElementById("analysis-input-layer"),t.membership=document.getElementById("analysis-membership"),t.memberHint=document.getElementById("analysis-membership-hint"),t.field=document.getElementById("analysis-field"),t.statsBox=document.getElementById("analysis-stats-box"),t.outName=document.getElementById("analysis-output-name"),t.result=document.getElementById("analysis-result"),t.btnRun=document.getElementById("analysis-run"),t.scope=document.getElementById("analysis-scope"),t.scopeHint=document.getElementById("analysis-scope-hint"),t.root.dataset.wired||(t.root.dataset.wired="1",t.mode.forEach(e=>e.addEventListener("change",J)),t.op.addEventListener("change",Z),t.membership.addEventListener("change",K),t.inputLayer.addEventListener("change",X),t.scope.addEventListener("change",ee),t.btnRun.addEventListener("click",$e)))}function R(e=null){return $.map((n,o)=>``).join("")}function Le(){t.op.innerHTML=_.map(e=>``).join(""),t.membership.innerHTML=V.map(e=>``).join(""),t.statsBox.innerHTML=W.map(e=>` +
+ + +
`).join("")}function X(){const e=$[Number(t.inputLayer.value)],n=e?e.layer.getSource().getFeatures():[],o=be(n);t.field.innerHTML=''+o.map(r=>``).join(""),t.field.disabled=o.length===0}function T(){return(t.mode.find(e=>e.checked)||{}).value||"overlay"}function J(){const e=T()==="overlay";t.overlayBox.classList.toggle("d-none",!e),t.zonalBox.classList.toggle("d-none",e),Q()}function Z(){const e=_.find(o=>o.key===t.op.value);t.opHint.textContent=e?e.hint:"";const n=e?e.needsB:!0;t.layerBWrap.querySelector("label").textContent=n?"Layer B":"Layer B (optional)",Q()}function K(){const e=V.find(n=>n.key===t.membership.value);t.memberHint.textContent=e?e.hint:""}function Q(){if(t.outName.dataset.touched!=="1")if(T()==="overlay"){const e=t.op.value||"overlay";t.outName.value=`${e}_result`}else t.outName.value="zonal_stats"}function z(e){const n=$[Number(e.value)];if(!n)return[];const o=n.layer.getSource(),r=t.scope?t.scope.value:"all";if(r==="view"){const a=g.getMap(),s=a.getView().calculateExtent(a.getSize());return o.getFeaturesInExtent(s)}if(r==="selection"){const a=new Set(g.getSelectedFeatures());return o.getFeatures().filter(s=>a.has(s))}return r==="drawn"&&b?o.getFeatures().filter(a=>b.features.has(a)):o.getFeatures()}function ee(){const e=t.scope.value;if(e==="drawn"&&b)t.scopeHint.textContent=`${b.features.size.toLocaleString()} feature(s) caught by the ${b.label}.`;else if(e==="selection"){const n=g?g.getSelectedFeatures().length:0;t.scopeHint.textContent=n===0?"Nothing selected yet — use the Digitise tool: shift-click features, or hold Ctrl/Cmd and drag a box.":`${n.toLocaleString()} feature(s) currently selected.`}else e==="view"?t.scopeHint.textContent="Only features inside the current map view are analysed — zoom to the area of interest first.":t.scopeHint.textContent="Every feature in the chosen layer. Narrow this if a large layer is slow."}function ke(){let e=g.getLayerGroupByTitle(O);return e||(g.addLayerGroup(Ee,O,"Results of client-side spatial analysis"),e=g.getLayerGroupByTitle(O)),e}function $e(){t.result.innerHTML="",t.btnRun.disabled=!0,setTimeout(()=>{try{const e=T(),n=(t.outName.value||"").trim()||(e==="overlay"?"overlay_result":"zonal_stats");let o,r;if(e==="overlay"){const s=t.op.value,l=z(t.layerA),i=z(t.layerB),d=(_.find(c=>c.key===s)||{}).needsB;if(l.length===0)throw new Error("Layer A has no features.");if(d&&i.length===0)throw new Error("This operation needs a second layer with features.");o=ge(s,l,i),r=`${o.features.length.toLocaleString()} feature(s) produced.`}else{const s=z(t.zoneLayer),l=z(t.inputLayer),i=Array.from(t.statsBox.querySelectorAll("input:checked")).map(u=>u.value),d=t.field.value||null;if(i.length===0)throw new Error("Select at least one statistic.");if(i.some(u=>(W.find(p=>p.key===u)||{}).needsField)&&!d)throw new Error("Sum / mean / min / max need a numeric field.");const m=we({zoneFeatures:s,inputFeatures:l,stats:i,field:d,membership:t.membership.value});o=m.geojson,r=Se(m.rows)}if(!o.features.length){t.result.innerHTML='
No result features — the layers may not overlap.
';return}const a=ke();g.addGeoJSONLayer(o,n,{strokeColor:"#d97706",strokeWidth:2,fillColor:"rgba(217,119,6,0.18)"},a),t.result.innerHTML=`
Added layer “${y(n)}”.
`+(typeof r=="string"&&r.startsWith("<")?r:`
${y(r)}
`),D(`Analysis complete — “${n}” added to the Analysis group.`,"success",4e3)}catch(e){console.error("[Analysis] run failed:",e),t.result.innerHTML=`
${y(e.message||String(e))}
`}finally{t.btnRun.disabled=!1}},20)}function Se(e){if(!e||!e.length)return"";const n=Object.keys(e[0]).filter(a=>a!=="zone"),o=["Zone",...n.map(a=>a.replace(/^zs_/,""))].map(a=>`${y(a)}`).join(""),r=e.map(a=>`${y(String(a.zone))}`+n.map(s=>`${a[s]===null||a[s]===void 0?"—":y(String(a[s]))}`).join("")+"").join("");return`
+ + ${o} + ${r} +
`}function Te(e,n={}){if(g=e,xe(),b=n.scopeFeatures&&n.scopeFeatures.length?{features:new Set(n.scopeFeatures),label:n.scopeLabel||"drawn area"}:null,Ae(),$=g.listVectorLayers({nonEmptyOnly:!0}),$.length===0){D("No vector layers with features are loaded — nothing to analyse yet.","warning",5e3);return}Le();const o=R(0),r=R($.length>1?1:0);t.layerA.innerHTML=o,t.layerB.innerHTML=r,t.zoneLayer.innerHTML=o,t.inputLayer.innerHTML=r,t.outName.dataset.touched="",t.outName.addEventListener("input",()=>{t.outName.dataset.touched="1"},{once:!0}),t.result.innerHTML="",t.scope.value=b?"drawn":"all",X(),Z(),K(),ee(),J(),C=C||new oe(t.root),C.show()}function Ae(){const e=t.scope.querySelector('option[value="drawn"]');if(!b){e&&e.remove();return}const n=`From ${b.label} (${b.features.size.toLocaleString()} features)`;if(e)e.textContent=n;else{const o=document.createElement("option");o.value="drawn",o.textContent=n,t.scope.insertBefore(o,t.scope.firstChild)}}function y(e){return String(e).replace(/[&<>"']/g,n=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[n])}export{Te as openAnalysisModal}; +//# sourceMappingURL=analysis-modal-CYhcFxIW.js.map diff --git a/dist/assets/analysis-modal-CYhcFxIW.js.map b/dist/assets/analysis-modal-CYhcFxIW.js.map new file mode 100644 index 0000000..5d6b376 --- /dev/null +++ b/dist/assets/analysis-modal-CYhcFxIW.js.map @@ -0,0 +1 @@ +{"version":3,"file":"analysis-modal-CYhcFxIW.js","sources":["../../src/analysis/overlay.js","../../src/analysis/zonal.js","../../src/analysis-modal.js"],"sourcesContent":["/**\n * overlay.js — client-side vector overlay operations (Stage 1 of the\n * LUPMIS2 GIS Analytical Tools concept).\n *\n * Pure geometry helpers built on Turf.js. No DOM, no map — the caller hands\n * in OpenLayers features and gets a GeoJSON FeatureCollection back, ready for\n * MapView.addGeoJSONLayer().\n *\n * All Turf work happens in EPSG:4326 (Turf's area/length functions assume\n * WGS84), so features are reprojected out of the map's EPSG:3857 on the way\n * in and the result is handed back as WGS84 GeoJSON — the same convention\n * gis-export.js uses.\n *\n * intersectFeatures(a, b) → parts of A that fall inside B (attrs: A + B)\n * clipFeatures(a, b) → parts of A that fall inside B (attrs: A only)\n * differenceFeatures(a, b) → parts of A that fall OUTSIDE B (attrs: A)\n * unionFeatures(a[, b]) → dissolved outline of A (and B)\n */\n\nimport GeoJSON from 'ol/format/GeoJSON';\nimport intersect from '@turf/intersect';\nimport union from '@turf/union';\nimport difference from '@turf/difference';\nimport { featureCollection } from '@turf/helpers';\n\n/**\n * Guard: only *candidate* pairs (those whose bounding boxes actually overlap)\n * reach the expensive geometry test, so this ceiling is about real work, not\n * the raw n×m product. District-scale data (tens of thousands of parcels\n * against a few dozen zones) sits far below it.\n */\nexport const MAX_OVERLAY_CANDIDATES = 400000;\n\nconst fmt = new GeoJSON();\n\n/**\n * Convert OpenLayers features (map projection) to WGS84 GeoJSON features.\n * @param {Array} features\n * @param {string} [mapProjection='EPSG:3857']\n * @returns {Array} GeoJSON Features\n */\nexport function toGeoJSONFeatures(features, mapProjection = 'EPSG:3857') {\n const out = [];\n for (const f of features || []) {\n const geom = f.getGeometry && f.getGeometry();\n if (!geom) continue;\n const gj = fmt.writeFeatureObject(f, {\n dataProjection: 'EPSG:4326',\n featureProjection: mapProjection,\n });\n if (gj && gj.geometry) out.push(gj);\n }\n return out;\n}\n\n/**\n * Bounding box of a GeoJSON feature as [minX, minY, maxX, maxY].\n * Walks the coordinate arrays directly — no extra dependency, and fast enough\n * to run over tens of thousands of features.\n * @param {Object} feature GeoJSON Feature\n * @returns {number[]|null}\n */\nexport function bboxOf(feature) {\n const geom = feature && feature.geometry;\n if (!geom || !geom.coordinates) return null;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const walk = (c) => {\n if (typeof c[0] === 'number') {\n if (c[0] < minX) minX = c[0];\n if (c[0] > maxX) maxX = c[0];\n if (c[1] < minY) minY = c[1];\n if (c[1] > maxY) maxY = c[1];\n return;\n }\n for (const sub of c) walk(sub);\n };\n walk(geom.coordinates);\n return Number.isFinite(minX) ? [minX, minY, maxX, maxY] : null;\n}\n\n/** Do two bounding boxes overlap? Cheap pre-filter before real geometry work. */\nexport function bboxOverlaps(a, b) {\n if (!a || !b) return false;\n return !(a[2] < b[0] || b[2] < a[0] || a[3] < b[1] || b[3] < a[1]);\n}\n\n/** Is a point [x, y] inside a bounding box? */\nexport function bboxContainsPoint(box, x, y) {\n if (!box) return false;\n return x >= box[0] && x <= box[2] && y >= box[1] && y <= box[3];\n}\n\n/** Keep only polygonal features — overlay is undefined for points/lines here. */\nfunction polygonsOnly(gjFeatures) {\n return (gjFeatures || []).filter((f) => {\n const t = f?.geometry?.type;\n return t === 'Polygon' || t === 'MultiPolygon';\n });\n}\n\n/** Merge two property bags, prefixing B's keys on collision so nothing is lost. */\nfunction mergeProps(propsA, propsB, prefixB = 'b_') {\n const out = { ...(propsA || {}) };\n for (const [k, v] of Object.entries(propsB || {})) {\n out[Object.prototype.hasOwnProperty.call(out, k) ? `${prefixB}${k}` : k] = v;\n }\n return out;\n}\n\nfunction fc(features) {\n return { type: 'FeatureCollection', features };\n}\n\n/**\n * Intersection: every piece of A that also lies inside B.\n * Result carries A's attributes merged with the matching B feature's.\n *\n * @param {Array} aFeatures OL features (layer A)\n * @param {Array} bFeatures OL features (layer B)\n * @param {Object} [opts]\n * @param {boolean} [opts.keepBAttributes=true] merge B's properties into the result\n * @returns {Object} GeoJSON FeatureCollection (WGS84)\n */\nexport function intersectFeatures(aFeatures, bFeatures, opts = {}) {\n const { keepBAttributes = true } = opts;\n const A = polygonsOnly(toGeoJSONFeatures(aFeatures));\n const B = polygonsOnly(toGeoJSONFeatures(bFeatures));\n\n // Pre-compute B's boxes once, then only test pairs that can possibly meet.\n const bBoxes = B.map(bboxOf);\n let candidates = 0;\n const out = [];\n for (const a of A) {\n const aBox = bboxOf(a);\n for (let i = 0; i < B.length; i++) {\n if (!bboxOverlaps(aBox, bBoxes[i])) continue;\n if (++candidates > MAX_OVERLAY_CANDIDATES) throw candidateOverflow(candidates);\n let piece = null;\n try { piece = intersect(featureCollection([a, B[i]])); } catch { piece = null; }\n if (!piece || !piece.geometry) continue;\n piece.properties = keepBAttributes\n ? mergeProps(a.properties, B[i].properties)\n : { ...(a.properties || {}) };\n out.push(piece);\n }\n }\n return fc(out);\n}\n\n/**\n * Clip: same geometry result as intersect, but the output keeps ONLY layer A's\n * attributes — the usual \"cut this layer to that boundary\" operation.\n */\nexport function clipFeatures(aFeatures, clipFeatures_, opts = {}) {\n return intersectFeatures(aFeatures, clipFeatures_, { ...opts, keepBAttributes: false });\n}\n\n/**\n * Difference: the parts of A that do NOT fall inside any feature of B.\n * Each A feature is reduced by every overlapping B feature in turn; features\n * fully covered by B drop out of the result.\n *\n * @returns {Object} GeoJSON FeatureCollection (WGS84)\n */\nexport function differenceFeatures(aFeatures, bFeatures) {\n const A = polygonsOnly(toGeoJSONFeatures(aFeatures));\n const B = polygonsOnly(toGeoJSONFeatures(bFeatures));\n\n const bBoxes = B.map(bboxOf);\n let candidates = 0;\n const out = [];\n for (const a of A) {\n const aBox = bboxOf(a);\n let remainder = a;\n for (let i = 0; i < B.length; i++) {\n if (!remainder) break;\n // Only subtract a B feature that can actually touch what's left.\n if (!bboxOverlaps(aBox, bBoxes[i])) continue;\n if (++candidates > MAX_OVERLAY_CANDIDATES) throw candidateOverflow(candidates);\n try {\n const next = difference(featureCollection([remainder, B[i]]));\n remainder = next && next.geometry ? next : null;\n } catch {\n // A malformed pair shouldn't kill the whole run — keep what we have.\n }\n }\n if (remainder && remainder.geometry) {\n remainder.properties = { ...(a.properties || {}) };\n out.push(remainder);\n }\n }\n return fc(out);\n}\n\n/**\n * Union / dissolve: merge everything into a single outline. Pass only `a` to\n * dissolve one layer, or both to merge two layers together.\n *\n * @returns {Object} GeoJSON FeatureCollection with 0 or 1 feature (WGS84)\n */\nexport function unionFeatures(aFeatures, bFeatures = []) {\n const all = polygonsOnly([\n ...toGeoJSONFeatures(aFeatures),\n ...toGeoJSONFeatures(bFeatures),\n ]);\n if (all.length === 0) return fc([]);\n if (all.length === 1) return fc([all[0]]);\n\n let merged = null;\n try {\n merged = union(featureCollection(all));\n } catch {\n // Fall back to a pairwise fold if the bulk union chokes on bad geometry.\n merged = all[0];\n for (let i = 1; i < all.length; i++) {\n try {\n const next = union(featureCollection([merged, all[i]]));\n if (next && next.geometry) merged = next;\n } catch { /* skip the offending feature */ }\n }\n }\n if (!merged || !merged.geometry) return fc([]);\n merged.properties = { parts: all.length };\n return fc([merged]);\n}\n\n/** @private Raised only when genuinely overlapping work exceeds the budget. */\nfunction candidateOverflow(count) {\n return new Error(\n `This overlay has more than ${count.toLocaleString()} genuinely overlapping feature pairs, ` +\n `which is too much to run in the browser. Narrow the inputs using “Apply to” ` +\n `(current map view or selected features), or run it server-side.`\n );\n}\n\n/** Operation registry used by the Analysis panel. */\nexport const OVERLAY_OPS = [\n { key: 'intersect', label: 'Intersect', needsB: true,\n hint: 'Keep the parts of layer A that fall inside layer B (attributes from both).' },\n { key: 'clip', label: 'Clip', needsB: true,\n hint: 'Cut layer A to the boundary of layer B (keeps only A’s attributes).' },\n { key: 'difference', label: 'Difference', needsB: true,\n hint: 'Keep the parts of layer A that fall outside layer B.' },\n { key: 'union', label: 'Union / Dissolve', needsB: false,\n hint: 'Merge features into a single outline (optionally with a second layer).' },\n];\n\n/**\n * Run an overlay operation by key.\n * @param {string} op one of OVERLAY_OPS keys\n * @param {Array} aFeatures\n * @param {Array} bFeatures\n * @returns {Object} GeoJSON FeatureCollection (WGS84)\n */\nexport function runOverlay(op, aFeatures, bFeatures) {\n switch (op) {\n case 'intersect': return intersectFeatures(aFeatures, bFeatures);\n case 'clip': return clipFeatures(aFeatures, bFeatures);\n case 'difference': return differenceFeatures(aFeatures, bFeatures);\n case 'union': return unionFeatures(aFeatures, bFeatures);\n default: throw new Error(`Unknown overlay operation: ${op}`);\n }\n}\n","/**\n * zonal.js — vector-in-vector zonal statistics (Stage 1 of the LUPMIS2 GIS\n * Analytical Tools concept).\n *\n * Answers questions like \"how many parcels are in each collector zone?\" or\n * \"what is the mean plot size per zone?\" — the classic *summarize within*\n * operation. Raster × vector zonal statistics arrives with the raster pipeline\n * in Stage 2; this module is pure vector and runs fully offline.\n *\n * Membership rules:\n * 'centroid' — a feature belongs to the zone containing its centroid\n * (default; each feature counts exactly once)\n * 'intersects' — a feature belongs to every zone it touches\n * (features straddling a boundary are counted more than once)\n */\n\nimport booleanPointInPolygon from '@turf/boolean-point-in-polygon';\nimport booleanIntersects from '@turf/boolean-intersects';\nimport centroid from '@turf/centroid';\nimport area from '@turf/area';\nimport { toGeoJSONFeatures, bboxOf, bboxOverlaps, bboxContainsPoint } from './overlay.js';\n\n/**\n * Guard on *candidate* pairs only — a bounding-box pre-filter means a feature\n * is geometry-tested against a zone only when it could plausibly fall in it.\n * A district of 25,000 parcels across 40-odd zones produces roughly one\n * candidate per parcel, so real workloads sit far below this ceiling.\n */\nexport const MAX_ZONAL_CANDIDATES = 400000;\n\nexport const MEMBERSHIP_MODES = [\n { key: 'centroid', label: 'Centroid inside zone',\n hint: 'Each feature is counted once, in the zone containing its centre.' },\n { key: 'intersects', label: 'Any overlap with zone',\n hint: 'A feature is counted in every zone it touches (may double-count).' },\n];\n\n/** Statistics offered by the Analysis panel. */\nexport const STATS = [\n { key: 'count', label: 'Count', needsField: false },\n { key: 'sum', label: 'Sum', needsField: true },\n { key: 'mean', label: 'Mean', needsField: true },\n { key: 'min', label: 'Minimum', needsField: true },\n { key: 'max', label: 'Maximum', needsField: true },\n { key: 'area', label: 'Total area (m²)', needsField: false },\n];\n\n/**\n * List the numeric attribute names available across a set of OL features, so\n * the panel can offer only fields that can actually be summed or averaged.\n * @param {Array} features OL features\n * @returns {string[]}\n */\nexport function listNumericFields(features) {\n const counts = new Map();\n for (const f of features || []) {\n const props = f.getProperties ? f.getProperties() : {};\n for (const [k, v] of Object.entries(props)) {\n if (k === 'geometry' || k.startsWith('_')) continue;\n const n = typeof v === 'number' ? v : (v !== '' && v != null && !Number.isNaN(Number(v)) ? Number(v) : null);\n if (n === null) continue;\n counts.set(k, (counts.get(k) || 0) + 1);\n }\n }\n return Array.from(counts.keys()).sort();\n}\n\n/** Coerce a property to a finite number, or null when it isn't numeric. */\nfunction num(value) {\n if (value === null || value === undefined || value === '') return null;\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Compute zonal statistics.\n *\n * @param {Object} params\n * @param {Array} params.zoneFeatures OL features defining the zones (polygons)\n * @param {Array} params.inputFeatures OL features to summarise\n * @param {string[]} params.stats keys from STATS\n * @param {string} [params.field] numeric attribute (for sum/mean/min/max)\n * @param {string} [params.membership] 'centroid' | 'intersects'\n * @param {string} [params.prefix='zs_'] prefix for the new attribute names\n * @returns {{ geojson: Object, rows: Array }}\n * geojson — the zones with statistics attached (WGS84), ready to add as a layer\n * rows — a plain table of the same numbers, for display/export\n */\nexport function zonalStatistics({\n zoneFeatures,\n inputFeatures,\n stats = ['count'],\n field = null,\n membership = 'centroid',\n prefix = 'zs_',\n}) {\n const zones = (toGeoJSONFeatures(zoneFeatures) || []).filter((z) => {\n const t = z?.geometry?.type;\n return t === 'Polygon' || t === 'MultiPolygon';\n });\n const inputs = toGeoJSONFeatures(inputFeatures) || [];\n\n if (zones.length === 0) throw new Error('The zone layer contains no polygons.');\n\n // Pre-compute once: each input's centroid (centroid mode) or bbox\n // (intersects mode), and every zone's bbox. The bbox comparisons below are\n // cheap arithmetic; only survivors reach the real geometry test.\n const centroids = membership === 'centroid'\n ? inputs.map((f) => { try { return centroid(f); } catch { return null; } })\n : null;\n const inputBoxes = membership === 'centroid' ? null : inputs.map(bboxOf);\n const zoneBoxes = zones.map(bboxOf);\n\n let candidates = 0;\n const rows = [];\n for (let z = 0; z < zones.length; z++) {\n const zone = zones[z];\n const zBox = zoneBoxes[z];\n const members = [];\n for (let i = 0; i < inputs.length; i++) {\n let inside = false;\n try {\n if (membership === 'centroid') {\n const c = centroids[i];\n if (!c) continue;\n const [cx, cy] = c.geometry.coordinates;\n if (!bboxContainsPoint(zBox, cx, cy)) continue; // cheap reject\n if (++candidates > MAX_ZONAL_CANDIDATES) throw candidateOverflow(candidates);\n inside = booleanPointInPolygon(c, zone);\n } else {\n if (!bboxOverlaps(zBox, inputBoxes[i])) continue; // cheap reject\n if (++candidates > MAX_ZONAL_CANDIDATES) throw candidateOverflow(candidates);\n inside = booleanIntersects(inputs[i], zone);\n }\n } catch { inside = false; }\n if (inside) members.push(inputs[i]);\n }\n\n const values = field\n ? members.map((f) => num(f.properties ? f.properties[field] : null)).filter((v) => v !== null)\n : [];\n\n const result = {};\n for (const s of stats) {\n switch (s) {\n case 'count':\n result[`${prefix}count`] = members.length; break;\n case 'sum':\n result[`${prefix}sum`] = values.length ? round(values.reduce((a, b) => a + b, 0)) : 0; break;\n case 'mean':\n result[`${prefix}mean`] = values.length\n ? round(values.reduce((a, b) => a + b, 0) / values.length) : null; break;\n case 'min':\n result[`${prefix}min`] = values.length ? round(Math.min(...values)) : null; break;\n case 'max':\n result[`${prefix}max`] = values.length ? round(Math.max(...values)) : null; break;\n case 'area': {\n let total = 0;\n for (const m of members) { try { total += area(m); } catch { /* skip */ } }\n result[`${prefix}area_m2`] = Math.round(total); break;\n }\n default: break;\n }\n }\n\n zone.properties = { ...(zone.properties || {}), ...result };\n rows.push({ ...labelOf(zone), ...result });\n }\n\n return { geojson: { type: 'FeatureCollection', features: zones }, rows };\n}\n\n/** @private Raised only when genuinely plausible pairs exceed the budget. */\nfunction candidateOverflow(count) {\n return new Error(\n `More than ${count.toLocaleString()} features fall within the zones' bounding boxes, ` +\n `which is too much to summarise in the browser. Narrow the inputs using “Apply to” ` +\n `(current map view or selected features).`\n );\n}\n\n/** Round to 3 decimals to keep attribute tables readable. */\nfunction round(n) {\n return Math.round(n * 1000) / 1000;\n}\n\n/**\n * Pick a human label for a zone row — first of the usual naming fields,\n * else a generic index.\n */\nfunction labelOf(zone) {\n const p = zone.properties || {};\n for (const k of ['zone_name', 'name', 'ZONE_NAME', 'NAME', 'upn', 'UPN', 'id', 'ID']) {\n if (p[k] !== undefined && p[k] !== null && String(p[k]).trim() !== '') {\n return { zone: String(p[k]) };\n }\n }\n return { zone: '(unnamed)' };\n}\n","/**\n * Analysis panel controller — Stage 1 of the GIS Analytical Tools concept.\n *\n * openAnalysisModal(mapView)\n *\n * Drives two families of client-side analysis:\n * • Overlays — intersect / clip / difference / union between layers\n * • Zonal statistics — summarise features (or a numeric field) per zone\n *\n * Both run entirely in the browser via Turf.js, so they work offline. Results\n * are added to the map as a new styled layer in an \"Analysis\" group, from\n * where they can be exported with the existing GIS export tools.\n *\n * Same Bootstrap modal pattern as src/export-gis-modal.js and src/import-modal.js.\n */\n\nimport { Modal } from 'bootstrap';\nimport { runOverlay, OVERLAY_OPS } from './analysis/overlay.js';\nimport { zonalStatistics, listNumericFields, STATS, MEMBERSHIP_MODES } from './analysis/zonal.js';\nimport { showToast } from './toast.js';\n\nconst ANALYSIS_GROUP_ID = 9001;\nconst ANALYSIS_GROUP_TITLE = 'Analysis';\n\nconst els = {};\nlet modal = null;\nlet mapView = null;\nlet layerChoices = []; // [{ layer, title, count }]\nlet drawnScope = null; // { features: Set, label } when opened from a Circle/Area popup\n\n// ---------------------------------------------------------------------------\n// Element wiring\n// ---------------------------------------------------------------------------\n\nfunction cacheEls() {\n if (els.root) return;\n els.root = document.getElementById('analysisModal');\n els.mode = Array.from(document.querySelectorAll('input[name=\"analysis-mode\"]'));\n els.overlayBox = document.getElementById('analysis-overlay-box');\n els.zonalBox = document.getElementById('analysis-zonal-box');\n els.op = document.getElementById('analysis-op');\n els.opHint = document.getElementById('analysis-op-hint');\n els.layerA = document.getElementById('analysis-layer-a');\n els.layerB = document.getElementById('analysis-layer-b');\n els.layerBWrap = document.getElementById('analysis-layer-b-wrap');\n els.zoneLayer = document.getElementById('analysis-zone-layer');\n els.inputLayer = document.getElementById('analysis-input-layer');\n els.membership = document.getElementById('analysis-membership');\n els.memberHint = document.getElementById('analysis-membership-hint');\n els.field = document.getElementById('analysis-field');\n els.statsBox = document.getElementById('analysis-stats-box');\n els.outName = document.getElementById('analysis-output-name');\n els.result = document.getElementById('analysis-result');\n els.btnRun = document.getElementById('analysis-run');\n els.scope = document.getElementById('analysis-scope');\n els.scopeHint = document.getElementById('analysis-scope-hint');\n\n if (!els.root.dataset.wired) {\n els.root.dataset.wired = '1';\n els.mode.forEach((r) => r.addEventListener('change', onModeChange));\n els.op.addEventListener('change', onOpChange);\n els.membership.addEventListener('change', onMembershipChange);\n els.inputLayer.addEventListener('change', refreshFieldOptions);\n els.scope.addEventListener('change', onScopeChange);\n els.btnRun.addEventListener('click', onRun);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Population\n// ---------------------------------------------------------------------------\n\nfunction layerOptionsHtml(selectedIdx = null) {\n return layerChoices.map((c, i) =>\n ``\n ).join('');\n}\n\nfunction populateOps() {\n els.op.innerHTML = OVERLAY_OPS\n .map((o) => ``).join('');\n els.membership.innerHTML = MEMBERSHIP_MODES\n .map((m) => ``).join('');\n els.statsBox.innerHTML = STATS.map((s) => `\n
\n \n \n
`).join('');\n}\n\nfunction refreshFieldOptions() {\n const choice = layerChoices[Number(els.inputLayer.value)];\n const feats = choice ? choice.layer.getSource().getFeatures() : [];\n const fields = listNumericFields(feats);\n els.field.innerHTML = '' +\n fields.map((f) => ``).join('');\n els.field.disabled = fields.length === 0;\n}\n\n// ---------------------------------------------------------------------------\n// UI reactions\n// ---------------------------------------------------------------------------\n\nfunction currentMode() {\n return (els.mode.find((r) => r.checked) || {}).value || 'overlay';\n}\n\nfunction onModeChange() {\n const overlay = currentMode() === 'overlay';\n els.overlayBox.classList.toggle('d-none', !overlay);\n els.zonalBox.classList.toggle('d-none', overlay);\n suggestName();\n}\n\nfunction onOpChange() {\n const op = OVERLAY_OPS.find((o) => o.key === els.op.value);\n els.opHint.textContent = op ? op.hint : '';\n // Union can run on a single layer; the others need a second one.\n const needsB = op ? op.needsB : true;\n els.layerBWrap.querySelector('label').textContent =\n needsB ? 'Layer B' : 'Layer B (optional)';\n suggestName();\n}\n\nfunction onMembershipChange() {\n const m = MEMBERSHIP_MODES.find((x) => x.key === els.membership.value);\n els.memberHint.textContent = m ? m.hint : '';\n}\n\nfunction suggestName() {\n if (els.outName.dataset.touched === '1') return;\n if (currentMode() === 'overlay') {\n const op = els.op.value || 'overlay';\n els.outName.value = `${op}_result`;\n } else {\n els.outName.value = 'zonal_stats';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Run\n// ---------------------------------------------------------------------------\n\n/**\n * Features of the chosen layer, narrowed by the \"Apply to\" scope.\n * 'view' uses the source's spatial index, so it stays fast on large layers.\n */\nfunction featuresOf(select) {\n const choice = layerChoices[Number(select.value)];\n if (!choice) return [];\n const source = choice.layer.getSource();\n const scope = els.scope ? els.scope.value : 'all';\n\n if (scope === 'view') {\n const map = mapView.getMap();\n const extent = map.getView().calculateExtent(map.getSize());\n return source.getFeaturesInExtent(extent);\n }\n if (scope === 'selection') {\n const selected = new Set(mapView.getSelectedFeatures());\n return source.getFeatures().filter((f) => selected.has(f));\n }\n if (scope === 'drawn' && drawnScope) {\n return source.getFeatures().filter((f) => drawnScope.features.has(f));\n }\n return source.getFeatures();\n}\n\nfunction onScopeChange() {\n const scope = els.scope.value;\n if (scope === 'drawn' && drawnScope) {\n els.scopeHint.textContent =\n `${drawnScope.features.size.toLocaleString()} feature(s) caught by the ${drawnScope.label}.`;\n } else if (scope === 'selection') {\n const n = mapView ? mapView.getSelectedFeatures().length : 0;\n els.scopeHint.textContent = n === 0\n ? 'Nothing selected yet — use the Digitise tool: shift-click features, or hold Ctrl/Cmd and drag a box.'\n : `${n.toLocaleString()} feature(s) currently selected.`;\n } else if (scope === 'view') {\n els.scopeHint.textContent = 'Only features inside the current map view are analysed — zoom to the area of interest first.';\n } else {\n els.scopeHint.textContent = 'Every feature in the chosen layer. Narrow this if a large layer is slow.';\n }\n}\n\nfunction ensureAnalysisGroup() {\n let group = mapView.getLayerGroupByTitle(ANALYSIS_GROUP_TITLE);\n if (!group) {\n mapView.addLayerGroup(ANALYSIS_GROUP_ID, ANALYSIS_GROUP_TITLE,\n 'Results of client-side spatial analysis');\n group = mapView.getLayerGroupByTitle(ANALYSIS_GROUP_TITLE);\n }\n return group;\n}\n\nfunction onRun() {\n els.result.innerHTML = '';\n els.btnRun.disabled = true;\n // Yield a frame so the button state paints before a heavy synchronous run.\n setTimeout(() => {\n try {\n const mode = currentMode();\n const name = (els.outName.value || '').trim() ||\n (mode === 'overlay' ? 'overlay_result' : 'zonal_stats');\n\n let geojson, summary;\n if (mode === 'overlay') {\n const op = els.op.value;\n const a = featuresOf(els.layerA);\n const b = featuresOf(els.layerB);\n const needsB = (OVERLAY_OPS.find((o) => o.key === op) || {}).needsB;\n if (a.length === 0) throw new Error('Layer A has no features.');\n if (needsB && b.length === 0) throw new Error('This operation needs a second layer with features.');\n geojson = runOverlay(op, a, b);\n summary = `${geojson.features.length.toLocaleString()} feature(s) produced.`;\n } else {\n const zones = featuresOf(els.zoneLayer);\n const inputs = featuresOf(els.inputLayer);\n const stats = Array.from(els.statsBox.querySelectorAll('input:checked')).map((i) => i.value);\n const field = els.field.value || null;\n if (stats.length === 0) throw new Error('Select at least one statistic.');\n const needsField = stats.some((s) => (STATS.find((x) => x.key === s) || {}).needsField);\n if (needsField && !field) throw new Error('Sum / mean / min / max need a numeric field.');\n\n const res = zonalStatistics({\n zoneFeatures: zones, inputFeatures: inputs,\n stats, field, membership: els.membership.value,\n });\n geojson = res.geojson;\n summary = renderRows(res.rows);\n }\n\n if (!geojson.features.length) {\n els.result.innerHTML =\n `
No result features — the layers may not overlap.
`;\n return;\n }\n\n const group = ensureAnalysisGroup();\n mapView.addGeoJSONLayer(geojson, name, {\n strokeColor: '#d97706', strokeWidth: 2, fillColor: 'rgba(217,119,6,0.18)',\n }, group);\n\n els.result.innerHTML =\n `
Added layer “${escapeHtml(name)}”.
` +\n (typeof summary === 'string' && summary.startsWith('<') ? summary : `
${escapeHtml(summary)}
`);\n showToast(`Analysis complete — “${name}” added to the Analysis group.`, 'success', 4000);\n } catch (err) {\n console.error('[Analysis] run failed:', err);\n els.result.innerHTML =\n `
${escapeHtml(err.message || String(err))}
`;\n } finally {\n els.btnRun.disabled = false;\n }\n }, 20);\n}\n\nfunction renderRows(rows) {\n if (!rows || !rows.length) return '';\n const keys = Object.keys(rows[0]).filter((k) => k !== 'zone');\n const head = ['Zone', ...keys.map((k) => k.replace(/^zs_/, ''))]\n .map((h) => `${escapeHtml(h)}`).join('');\n const body = rows.map((r) =>\n `${escapeHtml(String(r.zone))}` +\n keys.map((k) => `${r[k] === null || r[k] === undefined ? '—' : escapeHtml(String(r[k]))}`).join('') +\n '').join('');\n return `
\n \n ${head}\n ${body}\n
`;\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Open the Analysis panel.\n * @param {import('./components/MapView.js').default} view\n */\nexport function openAnalysisModal(view, opts = {}) {\n mapView = view;\n cacheEls();\n\n // When launched from a Circle/Area analysis popup, offer that catch as a\n // scope and pre-select it — the whole point of starting from a drawn shape.\n drawnScope = (opts.scopeFeatures && opts.scopeFeatures.length)\n ? { features: new Set(opts.scopeFeatures), label: opts.scopeLabel || 'drawn area' }\n : null;\n syncDrawnScopeOption();\n\n layerChoices = mapView.listVectorLayers({ nonEmptyOnly: true });\n if (layerChoices.length === 0) {\n showToast('No vector layers with features are loaded — nothing to analyse yet.', 'warning', 5000);\n return;\n }\n\n populateOps();\n const optsA = layerOptionsHtml(0);\n const optsB = layerOptionsHtml(layerChoices.length > 1 ? 1 : 0);\n els.layerA.innerHTML = optsA;\n els.layerB.innerHTML = optsB;\n els.zoneLayer.innerHTML = optsA;\n els.inputLayer.innerHTML = optsB;\n\n els.outName.dataset.touched = '';\n els.outName.addEventListener('input', () => { els.outName.dataset.touched = '1'; }, { once: true });\n els.result.innerHTML = '';\n\n els.scope.value = drawnScope ? 'drawn' : 'all';\n refreshFieldOptions();\n onOpChange();\n onMembershipChange();\n onScopeChange();\n onModeChange();\n\n modal = modal || new Modal(els.root);\n modal.show();\n}\n\n/**\n * Add or remove the \"From drawn area\" scope option depending on whether the\n * panel was opened from a Circle/Area popup.\n * @private\n */\nfunction syncDrawnScopeOption() {\n const existing = els.scope.querySelector('option[value=\"drawn\"]');\n if (!drawnScope) {\n if (existing) existing.remove();\n return;\n }\n const label = `From ${drawnScope.label} (${drawnScope.features.size.toLocaleString()} features)`;\n if (existing) {\n existing.textContent = label;\n } else {\n const opt = document.createElement('option');\n opt.value = 'drawn';\n opt.textContent = label;\n els.scope.insertBefore(opt, els.scope.firstChild);\n }\n}\n\nfunction escapeHtml(s) {\n return String(s).replace(/[&<>\"']/g, (c) =>\n ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' }[c]));\n}\n"],"names":["MAX_OVERLAY_CANDIDATES","fmt","GeoJSON","toGeoJSONFeatures","features","mapProjection","out","f","gj","bboxOf","feature","geom","minX","minY","maxX","maxY","walk","c","sub","bboxOverlaps","a","b","bboxContainsPoint","box","x","y","polygonsOnly","gjFeatures","t","mergeProps","propsA","propsB","prefixB","k","v","fc","intersectFeatures","aFeatures","bFeatures","opts","keepBAttributes","A","B","bBoxes","candidates","aBox","i","candidateOverflow","piece","intersect","featureCollection","clipFeatures","clipFeatures_","differenceFeatures","remainder","next","difference","unionFeatures","all","merged","union","count","OVERLAY_OPS","runOverlay","op","MAX_ZONAL_CANDIDATES","MEMBERSHIP_MODES","STATS","listNumericFields","counts","props","num","value","zonalStatistics","zoneFeatures","inputFeatures","stats","field","membership","prefix","zones","z","inputs","centroids","centroid","inputBoxes","zoneBoxes","rows","zone","zBox","members","inside","cx","cy","booleanPointInPolygon","booleanIntersects","values","result","s","round","total","m","area","labelOf","n","p","ANALYSIS_GROUP_ID","ANALYSIS_GROUP_TITLE","els","modal","mapView","layerChoices","drawnScope","cacheEls","r","onModeChange","onOpChange","onMembershipChange","refreshFieldOptions","onScopeChange","onRun","layerOptionsHtml","selectedIdx","escapeHtml","populateOps","o","choice","feats","fields","currentMode","overlay","suggestName","needsB","featuresOf","select","source","scope","map","extent","selected","ensureAnalysisGroup","group","mode","name","geojson","summary","res","renderRows","showToast","err","keys","head","h","body","openAnalysisModal","view","syncDrawnScopeOption","optsA","optsB","Modal","existing","label","opt"],"mappings":"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"} \ No newline at end of file diff --git a/dist/assets/geotiff-BaoeLn6q.js b/dist/assets/geotiff-BaoeLn6q.js new file mode 100644 index 0000000..3e17d00 --- /dev/null +++ b/dist/assets/geotiff-BaoeLn6q.js @@ -0,0 +1,81 @@ +import{Q as st,U as Bt,W as Ct,X as CA,Y as Qt,Z as Et,_ as V,$ as ct,a0 as OA,a1 as ft,a2 as uA,a3 as lt,a4 as ht,a5 as ue,a6 as de,a7 as ut,a8 as dt,a9 as wt,aa as Dt,ab as yt,ac as mt,s as pt,ad as kt,ae as Gt,af as we,ag as De,ah as ye,ai as Ft,aj as St}from"./openlayers-J9qS6Th1.js";import{i as Ye}from"./pako-Xa-UToif.js";const Rt="modulepreload",xt=function(o){return"/"+o},me={},gA=function(A,e,t){let r=Promise.resolve();if(e&&e.length>0){let B=function(I){return Promise.all(I.map(n=>Promise.resolve(n).then(i=>({status:"fulfilled",value:i}),i=>({status:"rejected",reason:i}))))};document.getElementsByTagName("link");const s=document.querySelector("meta[property=csp-nonce]"),w=s?.nonce||s?.getAttribute("nonce");r=B(e.map(I=>{if(I=xt(I),I in me)return;me[I]=!0;const n=I.endsWith(".css"),i=n?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${I}"]${i}`))return;const E=document.createElement("link");if(E.rel=n?"stylesheet":Rt,n||(E.as="script"),E.crossOrigin="",E.href=I,w&&E.setAttribute("nonce",w),document.head.appendChild(E),n)return new Promise((C,g)=>{E.addEventListener("load",C),E.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${I}`)))})}))}function a(B){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=B,window.dispatchEvent(s),!s.defaultPrevented)throw B}return r.then(B=>{for(const s of B||[])s.status==="rejected"&&a(s.reason);return A().catch(a)})};function pe(o,A){const e=` + attribute vec2 ${OA.TEXTURE_COORD}; + uniform mat4 ${V.TILE_TRANSFORM}; + uniform float ${V.TEXTURE_PIXEL_WIDTH}; + uniform float ${V.TEXTURE_PIXEL_HEIGHT}; + uniform float ${V.TEXTURE_RESOLUTION}; + uniform float ${V.TEXTURE_ORIGIN_X}; + uniform float ${V.TEXTURE_ORIGIN_Y}; + uniform float ${V.DEPTH}; + + varying vec2 v_textureCoord; + varying vec2 v_mapCoord; + + void main() { + v_textureCoord = ${OA.TEXTURE_COORD}; + v_mapCoord = vec2( + ${V.TEXTURE_ORIGIN_X} + ${V.TEXTURE_RESOLUTION} * ${V.TEXTURE_PIXEL_WIDTH} * v_textureCoord[0], + ${V.TEXTURE_ORIGIN_Y} - ${V.TEXTURE_RESOLUTION} * ${V.TEXTURE_PIXEL_HEIGHT} * v_textureCoord[1] + ); + gl_Position = ${V.TILE_TRANSFORM} * vec4(${OA.TEXTURE_COORD}, ${V.DEPTH}, 1.0); + } + `,t={...Qt(),bandCount:A},r=[];if(o.color!==void 0){const i=CA(t,o.color,ft);r.push(`color = ${i};`)}if(o.contrast!==void 0){const i=CA(t,o.contrast,uA);r.push(`color.rgb = clamp((${i} + 1.0) * color.rgb - (${i} / 2.0), vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));`)}if(o.exposure!==void 0){const i=CA(t,o.exposure,uA);r.push(`color.rgb = clamp((${i} + 1.0) * color.rgb, vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));`)}if(o.saturation!==void 0){const i=CA(t,o.saturation,uA);r.push(` + float saturation = ${i} + 1.0; + float sr = (1.0 - saturation) * 0.2126; + float sg = (1.0 - saturation) * 0.7152; + float sb = (1.0 - saturation) * 0.0722; + mat3 saturationMatrix = mat3( + sr + saturation, sr, sr, + sg, sg + saturation, sg, + sb, sb, sb + saturation + ); + color.rgb = clamp(saturationMatrix * color.rgb, vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0)); + `)}if(o.gamma!==void 0){const i=CA(t,o.gamma,uA);r.push(`color.rgb = pow(color.rgb, vec3(1.0 / ${i}));`)}if(o.brightness!==void 0){const i=CA(t,o.brightness,uA);r.push(`color.rgb = clamp(color.rgb + ${i}, vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));`)}const a={},B=Object.keys(t.variables).length;if(B>1&&!o.variables)throw new Error(`Missing variables in style (expected ${t.variables})`);for(let i=0;i ${V.RENDER_EXTENT}[2] || + v_mapCoord[1] > ${V.RENDER_EXTENT}[3] + ) { + discard; + } + + vec4 color = texture2D(${V.TILE_TEXTURE_ARRAY}[0], v_textureCoord); + + ${r.join(` +`)} + + gl_FragColor = color; + gl_FragColor.rgb *= gl_FragColor.a; + gl_FragColor *= ${V.TRANSITION_ALPHA}; + }`;return{vertexShader:e,fragmentShader:n,uniforms:a,paletteTextures:t.paletteTextures}}class He extends st{constructor(A){A=A?Object.assign({},A):{};const e=A.style||{};delete A.style,super(A),this.sources_=A.sources,this.renderedSource_=null,this.renderedResolution_=NaN,this.style_=e,this.styleVariables_=this.style_.variables||{},this.handleSourceUpdate_(),this.addChangeListener(Bt.SOURCE,this.handleSourceUpdate_)}getSources(A,e){const t=this.getSource();return this.sources_?typeof this.sources_=="function"?this.sources_(A,e):this.sources_:t?[t]:[]}getRenderSource(){return this.renderedSource_||this.getSource()}getSourceState(){const A=this.getRenderSource();return A?A.getState():"undefined"}handleSourceUpdate_(){this.hasRenderer()&&this.getRenderer().clearCache();const A=this.getSource();if(A)if(A.getState()==="loading"){const e=()=>{A.getState()==="ready"&&(A.removeEventListener("change",e),this.setStyle(this.style_))};A.addEventListener("change",e)}else this.setStyle(this.style_)}getSourceBandCount_(){const A=Number.MAX_SAFE_INTEGER,e=this.getSources([-A,-A,A,A],A);return e&&e.length&&"bandCount"in e[0]?e[0].bandCount:4}createRenderer(){const A=pe(this.style_,this.getSourceBandCount_());return new Ct(this,{vertexShader:A.vertexShader,fragmentShader:A.fragmentShader,uniforms:A.uniforms,cacheSize:this.getCacheSize(),paletteTextures:A.paletteTextures})}renderSources(A,e){const t=this.getRenderer();let r;for(let a=0,B=e.length;a{I.getState()=="ready"&&(I.removeEventListener("change",i),this.changed())};I.addEventListener("change",i)}a=a&&n=="ready"}const B=this.renderSources(A,r);if(this.getRenderer().renderComplete&&a)return this.renderedResolution_=t.resolution,B;if(this.renderedResolution_>.5*t.resolution){const s=this.getSources(A.extent,this.renderedResolution_).filter(w=>!r.includes(w));if(s.length>0)return this.renderSources(A,s)}return B}setStyle(A){if(this.styleVariables_=A.variables||{},this.style_=A,this.hasRenderer()){const e=pe(this.style_,this.getSourceBandCount_());this.getRenderer().reset({vertexShader:e.vertexShader,fragmentShader:e.fragmentShader,uniforms:e.uniforms,paletteTextures:e.paletteTextures}),this.changed()}}updateStyleVariables(A){Object.assign(this.styleVariables_,A),this.changed()}}He.prototype.dispose;const Zr=Object.freeze(Object.defineProperty({__proto__:null,default:He},Symbol.toStringTag,{value:"Module"}));function j(o){return(A,...e)=>Ut(o,A,e)}function lA(o,A){return j(Ke(o,A).get)}const{apply:Ut,getOwnPropertyDescriptor:Ke,getPrototypeOf:ae,ownKeys:Lt}=Reflect,{iterator:pA,toStringTag:vt}=Symbol,Mt=Object,{create:ge,defineProperty:bt}=Mt,Nt=Array,qt=Nt.prototype,Oe=qt[pA],Jt=j(Oe),Ve=ArrayBuffer,Tt=Ve.prototype;lA(Tt,"byteLength");const ke=typeof SharedArrayBuffer<"u"?SharedArrayBuffer:null;ke&&lA(ke.prototype,"byteLength");const _e=ae(Uint8Array);_e.from;const z=_e.prototype;z[pA];j(z.keys);j(z.values);j(z.entries);j(z.set);j(z.reverse);j(z.fill);j(z.copyWithin);j(z.sort);j(z.slice);j(z.subarray);lA(z,"buffer");lA(z,"byteOffset");lA(z,"length");lA(z,vt);const Yt=Uint8Array,Pe=Uint16Array,Ie=Uint32Array,Ht=Float32Array,mA=ae([][pA]()),Xe=j(mA.next),Kt=j((function*(){})().next),Ot=ae(mA),Vt=DataView.prototype,_t=j(Vt.getUint16),se=WeakMap,je=se.prototype,ze=j(je.get),Pt=j(je.set),We=new se,Xt=ge(null,{next:{value:function(){const A=ze(We,this);return Xe(A)}},[pA]:{value:function(){return this}}});function jt(o){if(o[pA]===Oe&&mA.next===Xe)return o;const A=ge(Xt);return Pt(We,A,Jt(o)),A}const zt=new se,Wt=ge(Ot,{next:{value:function(){const A=ze(zt,this);return Kt(A)},writable:!0,configurable:!0}});for(const o of Lt(mA))o!=="next"&&bt(Wt,o,Ke(mA,o));const Ze=new Ve(4),Zt=new Ht(Ze),$t=new Ie(Ze),tA=new Pe(512),iA=new Yt(512);for(let o=0;o<256;++o){const A=o-127;A<-24?(tA[o]=0,tA[o|256]=32768,iA[o]=24,iA[o|256]=24):A<-14?(tA[o]=1024>>-A-14,tA[o|256]=1024>>-A-14|32768,iA[o]=-A-1,iA[o|256]=-A-1):A<=15?(tA[o]=A+15<<10,tA[o|256]=A+15<<10|32768,iA[o]=13,iA[o|256]=13):A<128?(tA[o]=31744,tA[o|256]=64512,iA[o]=24,iA[o|256]=24):(tA[o]=31744,tA[o|256]=64512,iA[o]=13,iA[o|256]=13)}const Be=new Ie(2048);for(let o=1;o<1024;++o){let A=o<<13,e=0;for(;(A&8388608)===0;)A<<=1,e-=8388608;A&=-8388609,e+=947912704,Be[o]=A|e}for(let o=1024;o<2048;++o)Be[o]=939524096+(o-1024<<13);const hA=new Ie(64);for(let o=1;o<31;++o)hA[o]=o<<23;hA[31]=1199570944;hA[32]=2147483648;for(let o=33;o<63;++o)hA[o]=2147483648+(o-32<<23);hA[63]=3347054592;const $e=new Pe(64);for(let o=1;o<64;++o)o!==32&&($e[o]=1024);function Ai(o){const A=o>>10;return $t[0]=Be[$e[A]+(o&1023)]+hA[A],Zt[0]}function At(o,A,...e){return Ai(_t(o,A,...jt(e)))}var $r=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ce(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var GA={exports:{}},Ge;function ei(){if(Ge)return GA.exports;Ge=1;function o(A,e,t){const r=t&&t.debug||!1;r&&console.log("[xml-utils] getting "+e+" in "+A);const a=typeof A=="object"?A.outer:A,B=a.slice(0,a.indexOf(">")+1),s=['"',"'"];for(let w=0;w/]`,I);if(s&&console.log("[xml-utils] start:",n),n===-1)return;const i=r.slice(n+a.length);let E=A(i,"^[^<]*[ /]>",0);const C=E!==-1&&i[E-1]==="/";if(s&&console.log("[xml-utils] selfClosing:",C),C===!1)if(w){let c=0,l=1,u=0;for(;(E=A(i,"[ /]"+a+">",c))!==-1;){const y=i.substring(c,E+1);if(l+=e(y,"<"+a+`[ + >]`),u+=e(y,""),u>=l)break;c=E}}else E=A(i,"[ /]"+a+">",0);const g=n+a.length+E+1;if(s&&console.log("[xml-utils] end:",g),g===-1)return;const h=r.slice(n,g);let Q;return C?Q=null:Q=h.slice(h.indexOf(">")+1,h.lastIndexOf("<")),{inner:Q,outer:h,start:n,end:g}}return SA.exports=t,SA.exports.default=t,SA.exports}var Ue;function ai(){if(Ue)return FA.exports;Ue=1;const o=oi();function A(e,t,r){const a=[],B=r&&r.debug||!1,s=r&&typeof r.nested=="boolean"?r.nested:!0;let w=r&&r.startIndex||0,I;for(;I=o(e,t,{debug:B,startIndex:w});)s?w=I.start+1+t.length:w=I.end,a.push(I);return B&&console.log("findTagsByName found",a.length,"tags"),a}return FA.exports=A,FA.exports.default=A,FA.exports}var gi=ai();const Ii=Ce(gi),DA={315:"Artist",258:"BitsPerSample",265:"CellLength",264:"CellWidth",320:"ColorMap",259:"Compression",33432:"Copyright",306:"DateTime",338:"ExtraSamples",266:"FillOrder",289:"FreeByteCounts",288:"FreeOffsets",291:"GrayResponseCurve",290:"GrayResponseUnit",316:"HostComputer",270:"ImageDescription",257:"ImageLength",256:"ImageWidth",271:"Make",281:"MaxSampleValue",280:"MinSampleValue",272:"Model",254:"NewSubfileType",274:"Orientation",262:"PhotometricInterpretation",284:"PlanarConfiguration",296:"ResolutionUnit",278:"RowsPerStrip",277:"SamplesPerPixel",305:"Software",279:"StripByteCounts",273:"StripOffsets",255:"SubfileType",263:"Threshholding",282:"XResolution",283:"YResolution",326:"BadFaxLines",327:"CleanFaxData",343:"ClipPath",328:"ConsecutiveBadFaxLines",433:"Decode",434:"DefaultImageColor",269:"DocumentName",336:"DotRange",321:"HalftoneHints",346:"Indexed",347:"JPEGTables",285:"PageName",297:"PageNumber",317:"Predictor",319:"PrimaryChromaticities",532:"ReferenceBlackWhite",339:"SampleFormat",340:"SMinSampleValue",341:"SMaxSampleValue",559:"StripRowCounts",330:"SubIFDs",292:"T4Options",293:"T6Options",325:"TileByteCounts",323:"TileLength",324:"TileOffsets",322:"TileWidth",301:"TransferFunction",318:"WhitePoint",344:"XClipPathUnits",286:"XPosition",529:"YCbCrCoefficients",531:"YCbCrPositioning",530:"YCbCrSubSampling",345:"YClipPathUnits",287:"YPosition",37378:"ApertureValue",40961:"ColorSpace",36868:"DateTimeDigitized",36867:"DateTimeOriginal",34665:"Exif IFD",36864:"ExifVersion",33434:"ExposureTime",41728:"FileSource",37385:"Flash",40960:"FlashpixVersion",33437:"FNumber",42016:"ImageUniqueID",37384:"LightSource",37500:"MakerNote",37377:"ShutterSpeedValue",37510:"UserComment",33723:"IPTC",34675:"ICC Profile",700:"XMP",42112:"GDAL_METADATA",42113:"GDAL_NODATA",34377:"Photoshop",33550:"ModelPixelScale",33922:"ModelTiepoint",34264:"ModelTransformation",34735:"GeoKeyDirectory",34736:"GeoDoubleParams",34737:"GeoAsciiParams",50674:"LercParameters"},rA={};for(const o in DA)DA.hasOwnProperty(o)&&(rA[DA[o]]=parseInt(o,10));const si=[rA.BitsPerSample,rA.ExtraSamples,rA.SampleFormat,rA.StripByteCounts,rA.StripOffsets,rA.StripRowCounts,rA.TileByteCounts,rA.TileOffsets,rA.SubIFDs],_A={1:"BYTE",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",6:"SBYTE",7:"UNDEFINED",8:"SSHORT",9:"SLONG",10:"SRATIONAL",11:"FLOAT",12:"DOUBLE",13:"IFD",16:"LONG8",17:"SLONG8",18:"IFD8"},T={};for(const o in _A)_A.hasOwnProperty(o)&&(T[_A[o]]=parseInt(o,10));const Z={WhiteIsZero:0,BlackIsZero:1,RGB:2,Palette:3,CMYK:5,YCbCr:6,CIELab:8,ICCLab:9},Bi={Unspecified:0},Ci={AddCompression:1},PA={None:0,Deflate:1,Zstandard:2},Qi={1024:"GTModelTypeGeoKey",1025:"GTRasterTypeGeoKey",1026:"GTCitationGeoKey",2048:"GeographicTypeGeoKey",2049:"GeogCitationGeoKey",2050:"GeogGeodeticDatumGeoKey",2051:"GeogPrimeMeridianGeoKey",2052:"GeogLinearUnitsGeoKey",2053:"GeogLinearUnitSizeGeoKey",2054:"GeogAngularUnitsGeoKey",2055:"GeogAngularUnitSizeGeoKey",2056:"GeogEllipsoidGeoKey",2057:"GeogSemiMajorAxisGeoKey",2058:"GeogSemiMinorAxisGeoKey",2059:"GeogInvFlatteningGeoKey",2060:"GeogAzimuthUnitsGeoKey",2061:"GeogPrimeMeridianLongGeoKey",2062:"GeogTOWGS84GeoKey",3072:"ProjectedCSTypeGeoKey",3073:"PCSCitationGeoKey",3074:"ProjectionGeoKey",3075:"ProjCoordTransGeoKey",3076:"ProjLinearUnitsGeoKey",3077:"ProjLinearUnitSizeGeoKey",3078:"ProjStdParallel1GeoKey",3079:"ProjStdParallel2GeoKey",3080:"ProjNatOriginLongGeoKey",3081:"ProjNatOriginLatGeoKey",3082:"ProjFalseEastingGeoKey",3083:"ProjFalseNorthingGeoKey",3084:"ProjFalseOriginLongGeoKey",3085:"ProjFalseOriginLatGeoKey",3086:"ProjFalseOriginEastingGeoKey",3087:"ProjFalseOriginNorthingGeoKey",3088:"ProjCenterLongGeoKey",3089:"ProjCenterLatGeoKey",3090:"ProjCenterEastingGeoKey",3091:"ProjCenterNorthingGeoKey",3092:"ProjScaleAtNatOriginGeoKey",3093:"ProjScaleAtCenterGeoKey",3094:"ProjAzimuthAngleGeoKey",3095:"ProjStraightVertPoleLongGeoKey",3096:"ProjRectifiedGridAngleGeoKey",4096:"VerticalCSTypeGeoKey",4097:"VerticalCitationGeoKey",4098:"VerticalDatumGeoKey",4099:"VerticalUnitsGeoKey"};function Ei(o,A){const{width:e,height:t}=o,r=new Uint8Array(e*t*3);let a;for(let B=0,s=0;B>24,w=o[r+2]<<24>>24;let I=(B+16)/116,n=s/500+I,i=I-w/200,E,C,g;n=ui*(n*n*n>.008856?n*n*n:(n-16/116)/7.787),I=di*(I*I*I>.008856?I*I*I:(I-16/116)/7.787),i=wi*(i*i*i>.008856?i*i*i:(i-16/116)/7.787),E=n*3.2406+I*-1.5372+i*-.4986,C=n*-.9689+I*1.8758+i*.0415,g=n*.0557+I*-.204+i*1.057,E=E>.0031308?1.055*E**(1/2.4)-.055:12.92*E,C=C>.0031308?1.055*C**(1/2.4)-.055:12.92*C,g=g>.0031308?1.055*g**(1/2.4)-.055:12.92*g,t[a]=Math.max(0,Math.min(1,E))*255,t[a+1]=Math.max(0,Math.min(1,C))*255,t[a+2]=Math.max(0,Math.min(1,g))*255}return t}const et=new Map;function IA(o,A){Array.isArray(o)||(o=[o]),o.forEach(e=>et.set(e,A))}async function tt(o){const A=et.get(o.Compression);if(!A)throw new Error(`Unknown compression method identifier: ${o.Compression}`);const e=await A();return new e(o)}IA([void 0,1],()=>gA(()=>Promise.resolve().then(()=>mr),void 0).then(o=>o.default));IA(5,()=>gA(()=>Promise.resolve().then(()=>Sr),void 0).then(o=>o.default));IA(6,()=>{throw new Error("old style JPEG compression is not supported.")});IA(7,()=>gA(()=>Promise.resolve().then(()=>vr),void 0).then(o=>o.default));IA([8,32946],()=>gA(()=>Promise.resolve().then(()=>br),void 0).then(o=>o.default));IA(32773,()=>gA(()=>Promise.resolve().then(()=>qr),void 0).then(o=>o.default));IA(34887,()=>gA(()=>Promise.resolve().then(()=>Or),void 0).then(async o=>(await o.zstd.init(),o)).then(o=>o.default));IA(50001,()=>gA(()=>Promise.resolve().then(()=>_r),void 0).then(o=>o.default));function HA(o,A,e,t=1){return new(Object.getPrototypeOf(o)).constructor(A*e*t)}function yi(o,A,e,t,r){const a=A/t,B=e/r;return o.map(s=>{const w=HA(s,t,r);for(let I=0;I{const w=HA(s,t,r);for(let I=0;I>8-r-f&i;else if(f+r<=16)n[y]=s.getUint16(m)>>16-r-f&i;else if(f+r<=24){const D=s.getUint16(m)<<8|s.getUint8(m+2);n[y]=D>>24-r-f&i}else n[y]=s.getUint32(m)>>32-r-f&i}}}}return n.buffer}class it{constructor(A,e,t,r,a,B){this.fileDirectory=A,this.geoKeys=e,this.dataView=t,this.littleEndian=r,this.tiles=a?{}:null,this.isTiled=!A.StripOffsets;const s=A.PlanarConfiguration;if(this.planarConfiguration=typeof s>"u"?1:s,this.planarConfiguration!==1&&this.planarConfiguration!==2)throw new Error("Invalid planar configuration.");this.source=B}getFileDirectory(){return this.fileDirectory}getGeoKeys(){return this.geoKeys}getWidth(){return this.fileDirectory.ImageWidth}getHeight(){return this.fileDirectory.ImageLength}getSamplesPerPixel(){return typeof this.fileDirectory.SamplesPerPixel<"u"?this.fileDirectory.SamplesPerPixel:1}getTileWidth(){return this.isTiled?this.fileDirectory.TileWidth:this.getWidth()}getTileHeight(){return this.isTiled?this.fileDirectory.TileLength:typeof this.fileDirectory.RowsPerStrip<"u"?Math.min(this.fileDirectory.RowsPerStrip,this.getHeight()):this.getHeight()}getBlockWidth(){return this.getTileWidth()}getBlockHeight(A){return this.isTiled||(A+1)*this.getTileHeight()<=this.getHeight()?this.getTileHeight():this.getHeight()-A*this.getTileHeight()}getBytesPerPixel(){let A=0;for(let e=0;e=this.fileDirectory.BitsPerSample.length)throw new RangeError(`Sample index ${A} is out of range.`);return Math.ceil(this.fileDirectory.BitsPerSample[A]/8)}getReaderForSample(A){const e=this.fileDirectory.SampleFormat?this.fileDirectory.SampleFormat[A]:1,t=this.fileDirectory.BitsPerSample[A];switch(e){case 1:if(t<=8)return DataView.prototype.getUint8;if(t<=16)return DataView.prototype.getUint16;if(t<=32)return DataView.prototype.getUint32;break;case 2:if(t<=8)return DataView.prototype.getInt8;if(t<=16)return DataView.prototype.getInt16;if(t<=32)return DataView.prototype.getInt32;break;case 3:switch(t){case 16:return function(r,a){return At(this,r,a)};case 32:return DataView.prototype.getFloat32;case 64:return DataView.prototype.getFloat64}break}throw Error("Unsupported data format/bitsPerSample")}getSampleFormat(A=0){return this.fileDirectory.SampleFormat?this.fileDirectory.SampleFormat[A]:1}getBitsPerSample(A=0){return this.fileDirectory.BitsPerSample[A]}getArrayForSample(A,e){const t=this.getSampleFormat(A),r=this.getBitsPerSample(A);return ee(t,r,e)}async getTileOrStrip(A,e,t,r,a){const B=Math.ceil(this.getWidth()/this.getTileWidth()),s=Math.ceil(this.getHeight()/this.getTileHeight());let w;const{tiles:I}=this;this.planarConfiguration===1?w=e*B+A:this.planarConfiguration===2&&(w=t*B*s+e*B+A);let n,i;this.isTiled?(n=this.fileDirectory.TileOffsets[w],i=this.fileDirectory.TileByteCounts[w]):(n=this.fileDirectory.StripOffsets[w],i=this.fileDirectory.StripByteCounts[w]);const E=(await this.source.fetch([{offset:n,length:i}],a))[0];let C;return I===null||!I[w]?(C=(async()=>{let g=await r.decode(this.fileDirectory,E);const h=this.getSampleFormat(),Q=this.getBitsPerSample();return Ri(h,Q)&&(g=xi(g,h,this.planarConfiguration,this.getSamplesPerPixel(),Q,this.getTileWidth(),this.getBlockHeight(e))),g})(),I!==null&&(I[w]=C)):C=I[w],{x:A,y:e,sample:t,data:await C}}async _readRaster(A,e,t,r,a,B,s,w,I){const n=this.getTileWidth(),i=this.getTileHeight(),E=this.getWidth(),C=this.getHeight(),g=Math.max(Math.floor(A[0]/n),0),h=Math.min(Math.ceil(A[2]/n),Math.ceil(E/n)),Q=Math.max(Math.floor(A[1]/i),0),c=Math.min(Math.ceil(A[3]/i),Math.ceil(C/i)),l=A[2]-A[0];let u=this.getBytesPerPixel();const y=[],m=[];for(let d=0;d{const p=k.data,M=new DataView(p),U=this.getBlockHeight(k.y),v=k.y*i,N=k.x*n,b=v+U,K=(k.x+1)*n,_=m[x],L=Math.min(U,U-(b-A[3]),C-v),J=Math.min(n,n-(K-A[2]),E-N);for(let q=Math.max(0,A[1]-v);qn[2]||n[1]>n[3])throw new Error("Invalid subsets");const i=n[2]-n[0],E=n[3]-n[1],C=i*E,g=this.getSamplesPerPixel();if(!e||!e.length)for(let l=0;l=g)return Promise.reject(new RangeError(`Invalid sample index '${e[l]}'.`));let h;if(t){const l=this.fileDirectory.SampleFormat?Math.max.apply(null,this.fileDirectory.SampleFormat):1,u=Math.max.apply(null,this.fileDirectory.BitsPerSample);h=ee(l,u,C*e.length),w&&h.fill(w)}else{h=[];for(let l=0;lI[2]||I[1]>I[3])throw new Error("Invalid subsets");const n=this.fileDirectory.PhotometricInterpretation;if(n===Z.RGB){let c=[0,1,2];if(this.fileDirectory.ExtraSamples!==Bi.Unspecified&&s){c=[];for(let l=0;lVA(a,"sample")===void 0):r=r.filter(a=>Number(VA(a,"sample"))===A);for(let a=0;a[s+r*Q+a*c,i+w*Q+I*c]),g=C.map(Q=>Q[0]),h=C.map(Q=>Q[1]);return[Math.min(...g),Math.min(...h),Math.max(...g),Math.max(...h)]}else{const r=this.getOrigin(),a=this.getResolution(),B=r[0],s=r[1],w=B+a[0]*t,I=s+a[1]*e;return[Math.min(B,w),Math.min(s,I),Math.max(B,w),Math.max(s,I)]}}}class Ui{constructor(A){this._dataView=new DataView(A)}get buffer(){return this._dataView.buffer}getUint64(A,e){const t=this.getUint32(A,e),r=this.getUint32(A+4,e);let a;if(e){if(a=t+2**32*r,!Number.isSafeInteger(a))throw new Error(`${a} exceeds MAX_SAFE_INTEGER. Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues`);return a}if(a=2**32*t+r,!Number.isSafeInteger(a))throw new Error(`${a} exceeds MAX_SAFE_INTEGER. Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues`);return a}getInt64(A,e){let t=0;const r=(this._dataView.getUint8(A+(e?7:0))&128)>0;let a=!0;for(let B=0;B<8;B++){let s=this._dataView.getUint8(A+(e?B:7-B));r&&(a?s!==0&&(s=~(s-1)&255,a=!1):s=~s&255),t+=s*256**B}return r&&(t=-t),t}getUint8(A,e){return this._dataView.getUint8(A,e)}getInt8(A,e){return this._dataView.getInt8(A,e)}getUint16(A,e){return this._dataView.getUint16(A,e)}getInt16(A,e){return this._dataView.getInt16(A,e)}getUint32(A,e){return this._dataView.getUint32(A,e)}getInt32(A,e){return this._dataView.getInt32(A,e)}getFloat16(A,e){return At(this._dataView,A,e)}getFloat32(A,e){return this._dataView.getFloat32(A,e)}getFloat64(A,e){return this._dataView.getFloat64(A,e)}}class Li{constructor(A,e,t,r){this._dataView=new DataView(A),this._sliceOffset=e,this._littleEndian=t,this._bigTiff=r}get sliceOffset(){return this._sliceOffset}get sliceTop(){return this._sliceOffset+this.buffer.byteLength}get littleEndian(){return this._littleEndian}get bigTiff(){return this._bigTiff}get buffer(){return this._dataView.buffer}covers(A,e){return this.sliceOffset<=A&&this.sliceTop>=A+e}readUint8(A){return this._dataView.getUint8(A-this._sliceOffset,this._littleEndian)}readInt8(A){return this._dataView.getInt8(A-this._sliceOffset,this._littleEndian)}readUint16(A){return this._dataView.getUint16(A-this._sliceOffset,this._littleEndian)}readInt16(A){return this._dataView.getInt16(A-this._sliceOffset,this._littleEndian)}readUint32(A){return this._dataView.getUint32(A-this._sliceOffset,this._littleEndian)}readInt32(A){return this._dataView.getInt32(A-this._sliceOffset,this._littleEndian)}readFloat32(A){return this._dataView.getFloat32(A-this._sliceOffset,this._littleEndian)}readFloat64(A){return this._dataView.getFloat64(A-this._sliceOffset,this._littleEndian)}readUint64(A){const e=this.readUint32(A),t=this.readUint32(A+4);let r;if(this._littleEndian){if(r=e+2**32*t,!Number.isSafeInteger(r))throw new Error(`${r} exceeds MAX_SAFE_INTEGER. Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues`);return r}if(r=2**32*e+t,!Number.isSafeInteger(r))throw new Error(`${r} exceeds MAX_SAFE_INTEGER. Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues`);return r}readInt64(A){let e=0;const t=(this._dataView.getUint8(A+(this._littleEndian?7:0))&128)>0;let r=!0;for(let a=0;a<8;a++){let B=this._dataView.getUint8(A+(this._littleEndian?a:7-a));t&&(r?B!==0&&(B=~(B-1)&255,r=!1):B=~B&255),e+=B*256**a}return t&&(e=-e),e}readOffset(A){return this._bigTiff?this.readUint64(A):this.readUint32(A)}}const vi=typeof navigator<"u"&&navigator.hardwareConcurrency||2;class Mi{constructor(A=vi,e){this.workers=null,this._awaitingDecoder=null,this.size=A,this.messageId=0,A&&(this._awaitingDecoder=e?Promise.resolve(e):new Promise(t=>{gA(()=>Promise.resolve().then(()=>jr),void 0).then(r=>{t(r.create)})}),this._awaitingDecoder.then(t=>{this._awaitingDecoder=null,this.workers=[];for(let r=0;rt.decode(A,e)):new Promise(t=>{const r=this.workers.find(s=>s.idle)||this.workers[Math.floor(Math.random()*this.size)];r.idle=!1;const a=this.messageId++,B=s=>{s.data.id===a&&(r.idle=!0,t(s.data.decoded),r.worker.removeEventListener("message",B))};r.worker.addEventListener("message",B),r.worker.postMessage({fileDirectory:A,buffer:e,id:a},[e])})}destroy(){this.workers&&(this.workers.forEach(A=>{A.worker.terminate()}),this.workers=null)}}const Le=`\r +\r +`;function rt(o){if(typeof Object.fromEntries<"u")return Object.fromEntries(o);const A={};for(const[e,t]of o)A[e.toLowerCase()]=t;return A}function bi(o){const A=o.split(`\r +`).map(e=>{const t=e.split(":").map(r=>r.trim());return t[0]=t[0].toLowerCase(),t});return rt(A)}function Ni(o){const[A,...e]=o.split(";").map(r=>r.trim()),t=e.map(r=>r.split("="));return{type:A,params:rt(t)}}function te(o){let A,e,t;return o&&([,A,e,t]=o.match(/bytes (\d+)-(\d+)\/(\d+)/),A=parseInt(A,10),e=parseInt(e,10),t=parseInt(t,10)),{start:A,end:e,total:t}}function qi(o,A){let e=null;const t=new TextDecoder("ascii"),r=[],a=`--${A}`,B=`${a}--`;for(let s=0;s<10;++s)t.decode(new Uint8Array(o,s,a.length))===a&&(e=s);if(e===null)throw new Error("Could not find initial boundary");for(;ethis.fetchSlice(t,e)))}async fetchSlice(A){throw new Error(`fetching of slice ${A} not possible, not implemented`)}get fileSize(){return null}async close(){}}class Ji extends Map{constructor(A={}){if(super(),!(A.maxSize&&A.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof A.maxAge=="number"&&A.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");this.maxSize=A.maxSize,this.maxAge=A.maxAge||Number.POSITIVE_INFINITY,this.onEviction=A.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_emitEvictions(A){if(typeof this.onEviction=="function")for(const[e,t]of A)this.onEviction(e,t.value)}_deleteIfExpired(A,e){return typeof e.expiry=="number"&&e.expiry<=Date.now()?(typeof this.onEviction=="function"&&this.onEviction(A,e.value),this.delete(A)):!1}_getOrDeleteIfExpired(A,e){if(this._deleteIfExpired(A,e)===!1)return e.value}_getItemValue(A,e){return e.expiry?this._getOrDeleteIfExpired(A,e):e.value}_peek(A,e){const t=e.get(A);return this._getItemValue(A,t)}_set(A,e){this.cache.set(A,e),this._size++,this._size>=this.maxSize&&(this._size=0,this._emitEvictions(this.oldCache),this.oldCache=this.cache,this.cache=new Map)}_moveToRecent(A,e){this.oldCache.delete(A),this._set(A,e)}*_entriesAscending(){for(const A of this.oldCache){const[e,t]=A;this.cache.has(e)||this._deleteIfExpired(e,t)===!1&&(yield A)}for(const A of this.cache){const[e,t]=A;this._deleteIfExpired(e,t)===!1&&(yield A)}}get(A){if(this.cache.has(A)){const e=this.cache.get(A);return this._getItemValue(A,e)}if(this.oldCache.has(A)){const e=this.oldCache.get(A);if(this._deleteIfExpired(A,e)===!1)return this._moveToRecent(A,e),e.value}}set(A,e,{maxAge:t=this.maxAge}={}){const r=typeof t=="number"&&t!==Number.POSITIVE_INFINITY?Date.now()+t:void 0;return this.cache.has(A)?this.cache.set(A,{value:e,expiry:r}):this._set(A,{value:e,expiry:r}),this}has(A){return this.cache.has(A)?!this._deleteIfExpired(A,this.cache.get(A)):this.oldCache.has(A)?!this._deleteIfExpired(A,this.oldCache.get(A)):!1}peek(A){if(this.cache.has(A))return this._peek(A,this.cache);if(this.oldCache.has(A))return this._peek(A,this.oldCache)}delete(A){const e=this.cache.delete(A);return e&&this._size--,this.oldCache.delete(A)||e}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}resize(A){if(!(A&&A>0))throw new TypeError("`maxSize` must be a number greater than 0");const e=[...this._entriesAscending()],t=e.length-A;t<0?(this.cache=new Map(e),this.oldCache=new Map,this._size=e.length):(t>0&&this._emitEvictions(e.slice(0,t)),this.oldCache=new Map(e.slice(t)),this.cache=new Map,this._size=0),this.maxSize=A}*keys(){for(const[A]of this)yield A}*values(){for(const[,A]of this)yield A}*[Symbol.iterator](){for(const A of this.cache){const[e,t]=A;this._deleteIfExpired(e,t)===!1&&(yield[e,t.value])}for(const A of this.oldCache){const[e,t]=A;this.cache.has(e)||this._deleteIfExpired(e,t)===!1&&(yield[e,t.value])}}*entriesDescending(){let A=[...this.cache];for(let e=A.length-1;e>=0;--e){const t=A[e],[r,a]=t;this._deleteIfExpired(r,a)===!1&&(yield[r,a.value])}A=[...this.oldCache];for(let e=A.length-1;e>=0;--e){const t=A[e],[r,a]=t;this.cache.has(r)||this._deleteIfExpired(r,a)===!1&&(yield[r,a.value])}}*entriesAscending(){for(const[A,e]of this._entriesAscending())yield[A,e.value]}get size(){if(!this._size)return this.oldCache.size;let A=0;for(const e of this.oldCache.keys())this.cache.has(e)||A++;return Math.min(this._size+A,this.maxSize)}entries(){return this.entriesAscending()}forEach(A,e=this){for(const[t,r]of this.entriesAscending())A.call(e,r,t,this)}get[Symbol.toStringTag](){return JSON.stringify([...this.entriesAscending()])}}async function Ti(o){return new Promise(A=>setTimeout(A,o))}function Yi(o,A){const e=Array.isArray(o)?o:Array.from(o),t=Array.isArray(A)?A:Array.from(A);return e.map((r,a)=>[r,t[a]])}class fA extends Error{constructor(A){super(A),Error.captureStackTrace&&Error.captureStackTrace(this,fA),this.name="AbortError"}}class Hi extends Error{constructor(A,e){super(e),this.errors=A,this.message=e,this.name="AggregateError"}}const Ki=Hi;class Oi{constructor(A,e,t=null){this.offset=A,this.length=e,this.data=t}get top(){return this.offset+this.length}}class ve{constructor(A,e,t){this.offset=A,this.length=e,this.blockIds=t}}class Vi extends Qe{constructor(A,{blockSize:e=65536,cacheSize:t=100}={}){super(),this.source=A,this.blockSize=e,this.blockCache=new Ji({maxSize:t,onEviction:(r,a)=>{this.evictedBlocks.set(r,a)}}),this.evictedBlocks=new Map,this.blockRequests=new Map,this.blockIdsToFetch=new Set,this.abortedBlockIds=new Set}get fileSize(){return this.source.fileSize}async fetch(A,e){const t=[],r=[],a=[];this.evictedBlocks.clear();for(const{offset:E,length:C}of A){let g=E+C;const{fileSize:h}=this;h!==null&&(g=Math.min(g,h));const Q=Math.floor(E/this.blockSize)*this.blockSize;for(let c=Q;cthis.abortedBlockIds.has(E)||!this.blockCache.has(E));if(w.forEach(E=>this.blockIdsToFetch.add(E)),w.length>0&&e&&!e.aborted){this.fetchBlocks(null);for(const E of w){const C=this.blockRequests.get(E);if(!C)throw new Error(`Block ${E} is not in the block requests`);s.push(C)}await Promise.allSettled(s)}if(e&&e.aborted)throw new fA("Request was aborted");const I=a.map(E=>this.blockCache.get(E)||this.evictedBlocks.get(E)),n=I.filter(E=>!E);if(n.length)throw new Ki(n,"Request failed");const i=new Map(Yi(a,I));return this.readSliceData(A,i)}fetchBlocks(A){if(this.blockIdsToFetch.size>0){const e=this.groupBlocks(this.blockIdsToFetch),t=this.source.fetch(e,A);for(let r=0;r{try{const s=(await t)[r],w=B*this.blockSize,I=w-s.offset,n=Math.min(I+this.blockSize,s.data.byteLength),i=s.data.slice(I,n),E=new Oi(w,i.byteLength,i,B);this.blockCache.set(B,E),this.abortedBlockIds.delete(B)}catch(s){if(s.name==="AbortError")s.signal=A,this.blockCache.delete(B),this.abortedBlockIds.add(B);else throw s}finally{this.blockRequests.delete(B)}})())}this.blockIdsToFetch.clear()}}groupBlocks(A){const e=Array.from(A).sort((B,s)=>B-s);if(e.length===0)return[];let t=[],r=null;const a=[];for(const B of e)r===null||r+1===B?(t.push(B),r=B):(a.push(new ve(t[0]*this.blockSize,t.length*this.blockSize,t)),t=[B],r=B);return a.push(new ve(t[0]*this.blockSize,t.length*this.blockSize,t)),a}readSliceData(A,e){return A.map(t=>{let r=t.offset+t.length;this.fileSize!==null&&(r=Math.min(this.fileSize,r));const a=Math.floor(t.offset/this.blockSize),B=Math.floor(r/this.blockSize),s=new ArrayBuffer(t.length),w=new Uint8Array(s);for(let I=a;I<=B;++I){const n=e.get(I),i=n.offset-t.offset,E=n.top-r;let C=0,g=0,h;i<0?C=-i:i>0&&(g=i),E<0?h=n.length-C:h=r-n.offset-C;const Q=new Uint8Array(n.data,C,h);w.set(Q,g)}return s})}}class Ee{get ok(){return this.status>=200&&this.status<=299}get status(){throw new Error("not implemented")}getHeader(A){throw new Error("not implemented")}async getData(){throw new Error("not implemented")}}class ce{constructor(A){this.url=A}async request({headers:A,signal:e}={}){throw new Error("request is not implemented")}}class _i extends Ee{constructor(A){super(),this.response=A}get status(){return this.response.status}getHeader(A){return this.response.headers.get(A)}async getData(){return this.response.arrayBuffer?await this.response.arrayBuffer():(await this.response.buffer()).buffer}}class Pi extends ce{constructor(A,e){super(A),this.credentials=e}async request({headers:A,signal:e}={}){const t=await fetch(this.url,{headers:A,credentials:this.credentials,signal:e});return new _i(t)}}class Xi extends Ee{constructor(A,e){super(),this.xhr=A,this.data=e}get status(){return this.xhr.status}getHeader(A){return this.xhr.getResponseHeader(A)}async getData(){return this.data}}class ji extends ce{constructRequest(A,e){return new Promise((t,r)=>{const a=new XMLHttpRequest;a.open("GET",this.url),a.responseType="arraybuffer";for(const[B,s]of Object.entries(A))a.setRequestHeader(B,s);a.onload=()=>{const B=a.response;t(new Xi(a,B))},a.onerror=r,a.onabort=()=>r(new fA("Request aborted")),a.send(),e&&(e.aborted&&a.abort(),e.addEventListener("abort",()=>a.abort()))})}async request({headers:A,signal:e}={}){return await this.constructRequest(A,e)}}const XA={};class zi extends Ee{constructor(A,e){super(),this.response=A,this.dataPromise=e}get status(){return this.response.statusCode}getHeader(A){return this.response.headers[A]}async getData(){return await this.dataPromise}}class Wi extends ce{constructor(A){super(A),this.parsedUrl=XA.parse(this.url),this.httpApi=(this.parsedUrl.protocol==="http:",XA)}constructRequest(A,e){return new Promise((t,r)=>{const a=this.httpApi.get({...this.parsedUrl,headers:A},B=>{const s=new Promise(w=>{const I=[];B.on("data",n=>{I.push(n)}),B.on("end",()=>{const n=Buffer.concat(I).buffer;w(n)}),B.on("error",r)});t(new zi(B,s))});a.on("error",r),e&&(e.aborted&&a.destroy(new fA("Request aborted")),e.addEventListener("abort",()=>a.destroy(new fA("Request aborted"))))})}async request({headers:A,signal:e}={}){return await this.constructRequest(A,e)}}class fe extends Qe{constructor(A,e,t,r){super(),this.client=A,this.headers=e,this.maxRanges=t,this.allowFullFile=r,this._fileSize=null}async fetch(A,e){return this.maxRanges>=A.length?this.fetchSlices(A,e):(this.maxRanges>0&&A.length>1,Promise.all(A.map(t=>this.fetchSlice(t,e))))}async fetchSlices(A,e){const t=await this.client.request({headers:{...this.headers,Range:`bytes=${A.map(({offset:r,length:a})=>`${r}-${r+a}`).join(",")}`},signal:e});if(t.ok)if(t.status===206){const{type:r,params:a}=Ni(t.getHeader("content-type"));if(r==="multipart/byteranges"){const i=qi(await t.getData(),a.boundary);return this._fileSize=i[0].fileSize||null,i}const B=await t.getData(),{start:s,end:w,total:I}=te(t.getHeader("content-range"));this._fileSize=I||null;const n=[{data:B,offset:s,length:w-s}];if(A.length>1){const i=await Promise.all(A.slice(1).map(E=>this.fetchSlice(E,e)));return n.concat(i)}return n}else{if(!this.allowFullFile)throw new Error("Server responded with full file");const r=await t.getData();return this._fileSize=r.byteLength,[{data:r,offset:0,length:r.byteLength}]}else throw new Error("Error fetching data.")}async fetchSlice(A,e){const{offset:t,length:r}=A,a=await this.client.request({headers:{...this.headers,Range:`bytes=${t}-${t+r}`},signal:e});if(a.ok)if(a.status===206){const B=await a.getData(),{total:s}=te(a.getHeader("content-range"));return this._fileSize=s||null,{data:B,offset:t,length:r}}else{if(!this.allowFullFile)throw new Error("Server responded with full file");const B=await a.getData();return this._fileSize=B.byteLength,{data:B,offset:0,length:B.byteLength}}else throw new Error("Error fetching data.")}get fileSize(){return this._fileSize}}function le(o,{blockSize:A,cacheSize:e}){return A===null?o:new Vi(o,{blockSize:A,cacheSize:e})}function Zi(o,{headers:A={},credentials:e,maxRanges:t=0,allowFullFile:r=!1,...a}={}){const B=new Pi(o,e),s=new fe(B,A,t,r);return le(s,a)}function $i(o,{headers:A={},maxRanges:e=0,allowFullFile:t=!1,...r}={}){const a=new ji(o),B=new fe(a,A,e,t);return le(B,r)}function Ar(o,{headers:A={},maxRanges:e=0,allowFullFile:t=!1,...r}={}){const a=new Wi(o),B=new fe(a,A,e,t);return le(B,r)}function ie(o,{forceXHR:A=!1,...e}={}){return typeof fetch=="function"&&!A?Zi(o,e):typeof XMLHttpRequest<"u"?$i(o,e):Ar(o,e)}class er extends Qe{constructor(A){super(),this.file=A}async fetchSlice(A,e){return new Promise((t,r)=>{const a=this.file.slice(A.offset,A.offset+A.length),B=new FileReader;B.onload=s=>t(s.target.result),B.onerror=r,B.onabort=r,B.readAsArrayBuffer(a),e&&e.addEventListener("abort",()=>B.abort())})}}function tr(o){return new er(o)}function ir(o,A){let e=o.length-A,t=0;do{for(let r=A;r>0;r--)o[t+A]+=o[t],t++;e-=A}while(e>0)}function rr(o,A,e){let t=0,r=o.length;const a=r/e;for(;r>A;){for(let s=A;s>0;--s)o[t+A]+=o[t],++t;r-=A}const B=o.slice();for(let s=0;s=o.byteLength);++w){let I;if(A===2){switch(r[0]){case 8:I=new Uint8Array(o,w*s*e*B,s*e*B);break;case 16:I=new Uint16Array(o,w*s*e*B,s*e*B/2);break;case 32:I=new Uint32Array(o,w*s*e*B,s*e*B/4);break;default:throw new Error(`Predictor 2 not allowed with ${r[0]} bits per sample.`)}ir(I,s)}else A===3&&(I=new Uint8Array(o,w*s*e*B,s*e*B),rr(I,s,B))}return o}class BA{async decode(A,e){const t=await this.decodeBlock(e),r=A.Predictor||1;if(r!==1){const a=!A.StripOffsets,B=a?A.TileWidth:A.ImageWidth,s=a?A.TileLength:A.RowsPerStrip||A.ImageLength;return nr(t,r,B,s,A.BitsPerSample,A.PlanarConfiguration)}return t}}function re(o){switch(o){case T.BYTE:case T.ASCII:case T.SBYTE:case T.UNDEFINED:return 1;case T.SHORT:case T.SSHORT:return 2;case T.LONG:case T.SLONG:case T.FLOAT:case T.IFD:return 4;case T.RATIONAL:case T.SRATIONAL:case T.DOUBLE:case T.LONG8:case T.SLONG8:case T.IFD8:return 8;default:throw new RangeError(`Invalid field type: ${o}`)}}function or(o){const A=o.GeoKeyDirectory;if(!A)return null;const e={};for(let t=4;t<=A[3]*4;t+=4){const r=Qi[A[t]],a=A[t+1]?DA[A[t+1]]:null,B=A[t+2],s=A[t+3];let w=null;if(!a)w=s;else{if(w=o[a],typeof w>"u"||w===null)throw new Error(`Could not get value of geoKey '${r}'.`);typeof w=="string"?w=w.substring(s,s+B-1):w.subarray&&(w=w.subarray(s,s+B),B===1&&(w=w[0]))}e[r]=w}return e}function QA(o,A,e,t){let r=null,a=null;const B=re(A);switch(A){case T.BYTE:case T.ASCII:case T.UNDEFINED:r=new Uint8Array(e),a=o.readUint8;break;case T.SBYTE:r=new Int8Array(e),a=o.readInt8;break;case T.SHORT:r=new Uint16Array(e),a=o.readUint16;break;case T.SSHORT:r=new Int16Array(e),a=o.readInt16;break;case T.LONG:case T.IFD:r=new Uint32Array(e),a=o.readUint32;break;case T.SLONG:r=new Int32Array(e),a=o.readInt32;break;case T.LONG8:case T.IFD8:r=new Array(e),a=o.readUint64;break;case T.SLONG8:r=new Array(e),a=o.readInt64;break;case T.RATIONAL:r=new Uint32Array(e*2),a=o.readUint32;break;case T.SRATIONAL:r=new Int32Array(e*2),a=o.readInt32;break;case T.FLOAT:r=new Float32Array(e),a=o.readFloat32;break;case T.DOUBLE:r=new Float64Array(e),a=o.readFloat64;break;default:throw new RangeError(`Invalid field type: ${A}`)}if(A===T.RATIONAL||A===T.SRATIONAL)for(let s=0;sg.getWidth()-h.getWidth());for(let g=0;gQ||B&&B>c)break}}let E=e;if(s){const[C,g]=w.getOrigin(),[h,Q]=I.getResolution(w);E=[Math.round((s[0]-C)/h),Math.round((s[1]-g)/Q),Math.round((s[2]-C)/h),Math.round((s[3]-g)/Q)],E=[Math.min(E[0],E[2]),Math.min(E[1],E[3]),Math.max(E[0],E[2]),Math.max(E[1],E[3])]}return I.readRasters({...A,window:E})}}let YA=class ot extends nt{constructor(A,e,t,r,a={}){super(),this.source=A,this.littleEndian=e,this.bigTiff=t,this.firstIFDOffset=r,this.cache=a.cache||!1,this.ifdRequests=[],this.ghostValues=null}async getSlice(A,e){const t=this.bigTiff?4048:1024;return new Li((await this.source.fetch([{offset:A,length:typeof e<"u"?e:t}]))[0],A,this.littleEndian,this.bigTiff)}async parseFileDirectoryAt(A){const e=this.bigTiff?20:12,t=this.bigTiff?8:2;let r=await this.getSlice(A);const a=this.bigTiff?r.readUint64(A):r.readUint16(A),B=a*e+(this.bigTiff?16:6);r.covers(A,B)||(r=await this.getSlice(A,B));const s={};let w=A+(this.bigTiff?8:2);for(let i=0;i{const e=await this.ifdRequests[A-1];if(e.nextIFDByteOffset===0)throw new LA(A);return this.parseFileDirectoryAt(e.nextIFDByteOffset)})(),this.ifdRequests[A]}async getImage(A=0){const e=await this.requestIFD(A);return new it(e.fileDirectory,e.geoKeyDirectory,this.dataView,this.littleEndian,this.cache,this.source)}async getImageCount(){let A=0,e=!0;for(;e;)try{await this.requestIFD(A),++A}catch(t){if(t instanceof LA)e=!1;else throw t}return A}async getGhostValues(){const A=this.bigTiff?16:8;if(this.ghostValues)return this.ghostValues;const e="GDAL_STRUCTURAL_METADATA_SIZE=",t=e.length+100;let r=await this.getSlice(A,t);if(e===QA(r,T.ASCII,e.length,A)){const B=QA(r,T.ASCII,t,A).split(` +`)[0],s=Number(B.split("=")[1].split(" ")[0])+B.length;s>t&&(r=await this.getSlice(A,s));const w=QA(r,T.ASCII,s,A);this.ghostValues={},w.split(` +`).filter(I=>I.length>0).map(I=>I.split("=")).forEach(([I,n])=>{this.ghostValues[I]=n})}return this.ghostValues}static async fromSource(A,e,t){const r=(await A.fetch([{offset:0,length:1024}],t))[0],a=new Ui(r),B=a.getUint16(0,0);let s;if(B===18761)s=!0;else if(B===19789)s=!1;else throw new TypeError("Invalid byte order value.");const w=a.getUint16(2,s);let I;if(w===42)I=!1;else if(w===43){if(I=!0,a.getUint16(4,s)!==8)throw new Error("Unsupported offset byte-size.")}else throw new TypeError("Invalid magic number.");const n=I?a.getUint64(8,s):a.getUint32(4,s);return new ot(A,s,I,n,e)}close(){return typeof this.source.close=="function"?this.source.close():!1}};class gr extends nt{constructor(A,e){super(),this.mainFile=A,this.overviewFiles=e,this.imageFiles=[A].concat(e),this.fileDirectoriesPerFile=null,this.fileDirectoriesPerFileParsing=null,this.imageCount=null}async parseFileDirectoriesPerFile(){const A=[this.mainFile.parseFileDirectoryAt(this.mainFile.firstIFDOffset)].concat(this.overviewFiles.map(e=>e.parseFileDirectoryAt(e.firstIFDOffset)));return this.fileDirectoriesPerFile=await Promise.all(A),this.fileDirectoriesPerFile}async getImage(A=0){await this.getImageCount(),await this.parseFileDirectoriesPerFile();let e=0,t=0;for(let r=0;re.getImageCount()));return this.imageCounts=await Promise.all(A),this.imageCount=this.imageCounts.reduce((e,t)=>e+t,0),this.imageCount}}async function Ir(o,A={},e){return YA.fromSource(ie(o,A),e)}async function sr(o,A){return YA.fromSource(tr(o),A)}async function Br(o,A=[],e={},t){const r=await YA.fromSource(ie(o,e),t),a=await Promise.all(A.map(B=>YA.fromSource(ie(B,e))));return new gr(r,a)}function Cr(o){return((o.fileDirectory.NewSubfileType||0)&4)===4}function Qr(o,A){if(!o)return!1;if(o===!0)return!0;if(A.getSamplesPerPixel()!==3)return!1;const e=A.fileDirectory.PhotometricInterpretation,t=Z;return e===t.CMYK||e===t.YCbCr||e===t.CIELab||e===t.ICCLab}const Me="STATISTICS_MAXIMUM",be="STATISTICS_MINIMUM",jA=256;let zA;function Er(){return zA||(zA=new Mi),zA}function cr(o){try{return o.getBoundingBox(!0)}catch{return[0,0,o.getWidth(),o.getHeight()]}}function fr(o){try{return o.getOrigin().slice(0,2)}catch{return[0,o.getHeight()]}}function lr(o,A){try{return o.getResolution(A)}catch{return[A.getWidth()/o.getWidth(),A.getHeight()/o.getHeight()]}}function hr(o){const A=o.geoKeys;if(!A)return null;if(A.ProjectedCSTypeGeoKey&&A.ProjectedCSTypeGeoKey!==32767){const e="EPSG:"+A.ProjectedCSTypeGeoKey;let t=we(e);if(!t){const r=De(A.ProjLinearUnitsGeoKey);r&&(t=new ye({code:e,units:r}))}return t}if(A.GeographicTypeGeoKey&&A.GeographicTypeGeoKey!==32767){const e="EPSG:"+A.GeographicTypeGeoKey;let t=we(e);if(!t){const r=De(A.GeogAngularUnitsGeoKey);r&&(t=new ye({code:e,units:r}))}return t}return null}function ur(o){return o.getImageCount().then(function(A){const e=new Array(A);for(let t=0;te*o)throw new Error(t)}function wr(o){return o instanceof Int8Array?-128:o instanceof Int16Array?-32768:o instanceof Int32Array?-2147483648:o instanceof Float32Array?12e-39:0}function Dr(o){return o instanceof Int8Array?127:o instanceof Uint8Array||o instanceof Uint8ClampedArray?255:o instanceof Int16Array?32767:o instanceof Uint16Array?65535:o instanceof Int32Array?2147483647:o instanceof Uint32Array?4294967295:o instanceof Float32Array?34e37:255}class at extends ht{constructor(A){super({state:"loading",tileGrid:null,projection:A.projection||null,transition:A.transition,interpolate:A.interpolate!==!1,wrapX:A.wrapX}),this.sourceInfo_=A.sources;const e=this.sourceInfo_.length;this.sourceOptions_=A.sourceOptions,this.sourceImagery_=new Array(e),this.sourceMasks_=new Array(e),this.resolutionFactors_=new Array(e),this.samplesPerPixel_,this.nodataValues_,this.metadata_,this.normalize_=A.normalize!==!1,this.addAlpha_=!1,this.error_=null,this.convertToRGB_=A.convertToRGB||!1,this.setKey(this.sourceInfo_.map(a=>a.url).join(","));const t=this,r=new Array(e);for(let a=0;a=0;--t){const r=e[t],a=hr(r);if(a){this.projection=a;break}}}determineTransformMatrix(A){const e=A[0];for(let t=e.length-1;t>=0;--t){const a=e[t].fileDirectory.ModelTransformation;if(a){const[B,s,w,I,n,i,E,C]=a,g=de(de([1/Math.sqrt(B*B+n*n),0,0,-1/Math.sqrt(s*s+i*i),I,C],[B,n,s,i,0,0]),[1,0,0,1,-I,-C]);this.transformMatrix=g,this.addAlpha_=!0;break}}}configure_(A){let e,t,r,a,B;const s=new Array(A.length),w=new Array(A.length),I=new Array(A.length);let n=0;const i=A.length;for(let Q=0;Q{Cr(G)?l.push(G):c.push(G)});const u=c.length;if(l.length>0&&l.length!==u)throw new Error(`Expected one mask per image found ${l.length} masks and ${u} images`);let y,m;const f=new Array(u),D=new Array(u),d=new Array(u);w[Q]=new Array(u),I[Q]=new Array(u);for(let G=0;Gd.length&&(n=B.length-d.length);const G=B[B.length-1]/d[d.length-1];this.resolutionFactors_[Q]=G;const R=d.map(x=>x*=G),F=`Resolution mismatch for source ${Q}, got [${R}] but expected [${B}]`;wA(B.slice(n,B.length),R,.02,F,this.viewRejector)}r?wA(r.slice(n,r.length),D,.01,`Tile size mismatch for source ${Q}`,this.viewRejector):r=D,a?wA(a.slice(n,a.length),f,0,`Tile size mismatch for source ${Q}`,this.viewRejector):a=f,this.sourceImagery_[Q]=c.reverse(),this.sourceMasks_[Q]=l.reverse()}for(let Q=0,c=this.sourceImagery_.length;QSt(Q,l));h=Dt(e,c)}this.viewResolver({showFullExtent:!0,projection:this.projection,resolutions:B,center:mt(pt(h),this.projection),extent:yt(h,this.projection),zoom:g})}loadTile_(A,e,t,r){const a=this.getTileSize(A),B=this.sourceImagery_.length,s=new Array(B*2),w=this.nodataValues_,I=this.sourceInfo_,n=Er();for(let i=0;i=o.length)return console.warn("ran off the end of the buffer before finding EOI_CODE (end on input code)"),ne;let I=o[r]&2**(8-t)-1;I<<=e-a;let n=I;if(r+1>>s;i<<=Math.max(0,e-w),n+=i}if(B>8&&r+2>>i;n+=E}return n}function ZA(o,A){for(let e=A.length-1;e>=0;e--)o.push(A[e]);return o}function Gr(o){const A=new Uint16Array(4093),e=new Uint8Array(4093);for(let g=0;g<=257;g++)A[g]=4096,e[g]=g;let t=258,r=Ne,a=0;function B(){t=258,r=Ne}function s(g){const h=kr(g,a,r);return a+=r,h}function w(g,h){return e[t]=h,A[t]=g,t++,t-1}function I(g){const h=[];for(let Q=g;Q!==4096;Q=A[Q])h.push(e[Q]);return h}const n=[];B();const i=new Uint8Array(o);let E=s(i),C;for(;E!==ne;){if(E===WA){for(B(),E=s(i);E===WA;)E=s(i);if(E===ne)break;if(E>WA)throw new Error(`corrupted code at scanline ${E}`);{const g=I(E);ZA(n,g),C=E}}else if(E=2**r&&(r===pr?C=void 0:r++),E=s(i)}return new Uint8Array(n)}class Fr extends BA{decodeBlock(A){return Gr(A).buffer}}const Sr=Object.freeze(Object.defineProperty({__proto__:null,default:Fr},Symbol.toStringTag,{value:"Module"})),yA=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),vA=4017,MA=799,bA=3406,NA=2276,qA=1567,JA=3784,EA=5793,TA=2896;function qe(o,A){let e=0;const t=[];let r=16;for(;r>0&&!o[r-1];)--r;t.push({children:[],index:0});let a=t[0],B;for(let s=0;s0;)a=t.pop();for(a.index++,t.push(a);t.length<=s;)t.push(B={children:[],index:0}),a.children[a.index]=B.children,a=B;e++}s+10)return g--,C>>g&1;if(C=o[E++],C===255){const L=o[E++];if(L)throw new Error(`unexpected marker: ${(C<<8|L).toString(16)}`)}return g=7,C>>>7}function Q(L){let J=L,q;for(;(q=h())!==null;){if(J=J[q],typeof J=="number")return J;if(typeof J!="object")throw new Error("invalid huffman sequence")}return null}function c(L){let J=L,q=0;for(;J>0;){const H=h();if(H===null)return;q=q<<1|H,--J}return q}function l(L){const J=c(L);return J>=1<>4;if(X===0){if($<15)break;O+=16}else{O+=$;const W=yA[O];J[W]=l(X),O++}}}function y(L,J){const q=Q(L.huffmanTableDC),H=q===0?0:l(q)<0){f--;return}let q=a;const H=B;for(;q<=H;){const O=Q(L.huffmanTableAC),P=O&15,X=O>>4;if(P===0){if(X<15){f=c(X)+(1<>4,W===0)O<15?(f=c(O)+(1<=65488&&b<=65495)E+=2;else break}return E-i}function xr(o,A){const e=[],{blocksPerLine:t,blocksPerColumn:r}=A,a=t<<3,B=new Int32Array(64),s=new Uint8Array(64);function w(I,n,i){const E=A.quantizationTable;let C,g,h,Q,c,l,u,y,m;const f=i;let D;for(D=0;D<64;D++)f[D]=I[D]*E[D];for(D=0;D<8;++D){const d=8*D;if(f[1+d]===0&&f[2+d]===0&&f[3+d]===0&&f[4+d]===0&&f[5+d]===0&&f[6+d]===0&&f[7+d]===0){m=EA*f[0+d]+512>>10,f[0+d]=m,f[1+d]=m,f[2+d]=m,f[3+d]=m,f[4+d]=m,f[5+d]=m,f[6+d]=m,f[7+d]=m;continue}C=EA*f[0+d]+128>>8,g=EA*f[4+d]+128>>8,h=f[2+d],Q=f[6+d],c=TA*(f[1+d]-f[7+d])+128>>8,y=TA*(f[1+d]+f[7+d])+128>>8,l=f[3+d]<<4,u=f[5+d]<<4,m=C-g+1>>1,C=C+g+1>>1,g=m,m=h*JA+Q*qA+128>>8,h=h*qA-Q*JA+128>>8,Q=m,m=c-u+1>>1,c=c+u+1>>1,u=m,m=y+l+1>>1,l=y-l+1>>1,y=m,m=C-Q+1>>1,C=C+Q+1>>1,Q=m,m=g-h+1>>1,g=g+h+1>>1,h=m,m=c*NA+y*bA+2048>>12,c=c*bA-y*NA+2048>>12,y=m,m=l*MA+u*vA+2048>>12,l=l*vA-u*MA+2048>>12,u=m,f[0+d]=C+y,f[7+d]=C-y,f[1+d]=g+u,f[6+d]=g-u,f[2+d]=h+l,f[5+d]=h-l,f[3+d]=Q+c,f[4+d]=Q-c}for(D=0;D<8;++D){const d=D;if(f[8+d]===0&&f[16+d]===0&&f[24+d]===0&&f[32+d]===0&&f[40+d]===0&&f[48+d]===0&&f[56+d]===0){m=EA*i[D+0]+8192>>14,f[0+d]=m,f[8+d]=m,f[16+d]=m,f[24+d]=m,f[32+d]=m,f[40+d]=m,f[48+d]=m,f[56+d]=m;continue}C=EA*f[0+d]+2048>>12,g=EA*f[32+d]+2048>>12,h=f[16+d],Q=f[48+d],c=TA*(f[8+d]-f[56+d])+2048>>12,y=TA*(f[8+d]+f[56+d])+2048>>12,l=f[24+d],u=f[40+d],m=C-g+1>>1,C=C+g+1>>1,g=m,m=h*JA+Q*qA+2048>>12,h=h*qA-Q*JA+2048>>12,Q=m,m=c-u+1>>1,c=c+u+1>>1,u=m,m=y+l+1>>1,l=y-l+1>>1,y=m,m=C-Q+1>>1,C=C+Q+1>>1,Q=m,m=g-h+1>>1,g=g+h+1>>1,h=m,m=c*NA+y*bA+2048>>12,c=c*bA-y*NA+2048>>12,y=m,m=l*MA+u*vA+2048>>12,l=l*vA-u*MA+2048>>12,u=m,f[0+d]=C+y,f[56+d]=C-y,f[8+d]=g+u,f[48+d]=g-u,f[16+d]=h+l,f[40+d]=h-l,f[24+d]=Q+c,f[32+d]=Q-c}for(D=0;D<64;++D){const d=128+(f[D]+8>>4);d<0?n[D]=0:d>255?n[D]=255:n[D]=d}}for(let I=0;I>4===0)for(let i=0;i<64;i++){const E=yA[i];n[E]=A[e++]}else if(I>>4===1)for(let i=0;i<64;i++){const E=yA[i];n[E]=t()}else throw new Error("DQT: invalid table spec");this.quantizationTables[I&15]=n}break}case 65472:case 65473:case 65474:{t();const s={extended:B===65473,progressive:B===65474,precision:A[e++],scanLines:t(),samplesPerLine:t(),components:{},componentsOrder:[]},w=A[e++];let I;for(let n=0;n>4,E=A[e+1]&15,C=A[e+2];s.componentsOrder.push(I),s.components[I]={h:i,v:E,quantizationIdx:C},e+=3}a(s),this.frames.push(s);break}case 65476:{const s=t();for(let w=2;w>4===0?this.huffmanTablesDC[I&15]=qe(n,E):this.huffmanTablesAC[I&15]=qe(n,E)}break}case 65501:t(),this.resetInterval=t();break;case 65498:{t();const s=A[e++],w=[],I=this.frames[0];for(let g=0;g>4],h.huffmanTableAC=this.huffmanTablesAC[Q&15],w.push(h)}const n=A[e++],i=A[e++],E=A[e++],C=Rr(A,e,I,w,this.resetInterval,n,i,E>>4,E&15);e+=C;break}case 65535:A[e]!==255&&e--;break;default:if(A[e-3]===255&&A[e-2]>=192&&A[e-2]<=254){e-=3;break}throw new Error(`unknown JPEG marker ${B.toString(16)}`)}B=t()}}getResult(){const{frames:A}=this;if(this.frames.length===0)throw new Error("no frames were decoded");this.frames.length>1&&console.warn("more than one frame is not supported");for(let n=0;n>3],_<<=M&7),F=0;F>3]),_&128?(G&&(G[M]=1),D=v.encoding<2?N[b++]:K,f=f>D?D:f,d[M++]=D):(G&&(G[M]=0),d[M++]=g),_<<=1;M+=U}else if(v.encoding<2)for(x=0;xD?D:f,d[M++]=D;M+=U}else for(f=f>K?K:f,x=0;x0){var c=new Uint8Array(Math.ceil(g.width*g.height/8));Q=new DataView(i,E,g.mask.numBytes);var l=Q.getInt16(0,!0),u=2,y=0;do{if(l>0)for(;l--;)c[y++]=Q.getUint8(u++);else{var m=Q.getUint8(u++);for(l=-l;l--;)c[y++]=m}l=Q.getInt16(u,!0),u+=2}while(u0?1:0),G=D+(g.height%D>0?1:0);g.pixels.blocks=new Array(d*G);for(var R=0,F=0;F3)throw"Invalid block encoding ("+k.encoding+")";if(k.encoding===2){E++;continue}if(p!==0&&p!==2){if(p>>=6,k.offsetType=p,p===2)k.offset=Q.getInt8(1),S++;else if(p===1)k.offset=Q.getInt16(1,!0),S+=2;else if(p===0)k.offset=Q.getFloat32(1,!0),S+=4;else throw"Invalid block offset type";if(k.encoding===1)if(p=Q.getUint8(S),S++,k.bitsPerPixel=p&63,p>>=6,k.numValidPixelsType=p,p===2)k.numValidPixels=Q.getUint8(S),S++;else if(p===1)k.numValidPixels=Q.getUint16(S,!0),S+=2;else if(p===0)k.numValidPixels=Q.getUint32(S,!0),S+=4;else throw"Invalid valid pixel count type"}if(E+=S,k.encoding!==3){var M,U;if(k.encoding===0){var v=(g.pixels.numBytes-1)/4;if(v!==Math.floor(v))throw"uncompressed block has invalid length";M=new ArrayBuffer(v*4),U=new Uint8Array(M),U.set(new Uint8Array(i,E,v*4));var N=new Float32Array(M);k.rawData=N,E+=v*4}else if(k.encoding===1){var b=Math.ceil(k.numValidPixels*k.bitsPerPixel/8),K=Math.ceil(b/4);M=new ArrayBuffer(K*4),U=new Uint8Array(M),U.set(new Uint8Array(i,E,b)),k.stuffedData=new Uint32Array(M),E+=b}}}return g.eofOffset=E,g},n=function(i,E,C,g,h,Q,c){var l=(1<=E)f=D>>>m-E&l,m-=E;else{var R=E-m;f=(D&l)<>>m}Q[y]=f=i?(m=f>>>y-i&c,y-=i):(D=i-y,m=(f&c)<>>y),n[u]=C[m];else for(d=Math.ceil((Q-g)/h),u=0;u=i?(m=f>>>y-i&c,y-=i):(D=i-y,m=(f&c)<>>y),n[u]=m=n?(y=m>>>u-n&h,u-=n):(l=n-u,y=(m&h)<>>u),f[c]=y=i?(f=D>>>m&c,y-=i,m+=i):(d=i-y,f=D>>>m&c,D=I[l++],y=32-d,f|=(D&(1<=i?(f=D>>>m&c,y-=i,m+=i):(d=i-y,f=D>>>m&c,D=I[l++],y=32-d,f|=(D&(1<=n?(y=f>>>m&h,u-=n,m+=n):(l=n-u,y=f>>>m&h,f=I[Q++],u=32-l,y|=(f&(1<=i?(c=l>>>Q-i&C,Q-=i):(u=i-Q,c=(l&C)<>>Q),n[h]=c;return n},originalUnstuff2:function(I,n,i,E){var C=(1<=i?(l=u>>>c&C,Q-=i,c+=i):(y=i-Q,l=u>>>c&C,u=I[g++],Q=32-y,l|=(u&(1<=359?359:C;C-=h;do n+=I[g++]<<8,i+=n+=I[g++];while(--h);n=(n&65535)+(n>>>16),i=(i&65535)+(i>>>16)}return E&1&&(i+=n+=I[g]<<8),n=(n&65535)+(n>>>16),i=(i&65535)+(i>>>16),(i<<16|n)>>>0},readHeaderInfo:function(I,n){var i=n.ptr,E=new Uint8Array(I,i,6),C={};if(C.fileIdentifierString=String.fromCharCode.apply(null,E),C.fileIdentifierString.lastIndexOf("Lerc2",0)!==0)throw"Unexpected file identifier string (expect Lerc2 ): "+C.fileIdentifierString;i+=6;var g=new DataView(I,i,8),h=g.getInt32(0,!0);C.fileVersion=h,i+=4,h>=3&&(C.checksum=g.getUint32(4,!0),i+=4),g=new DataView(I,i,12),C.height=g.getUint32(0,!0),C.width=g.getUint32(4,!0),i+=8,h>=4?(C.numDims=g.getUint32(8,!0),i+=4):C.numDims=1,g=new DataView(I,i,40),C.numValidPixel=g.getUint32(0,!0),C.microBlockSize=g.getInt32(4,!0),C.blobSize=g.getInt32(8,!0),C.imageType=g.getInt32(12,!0),C.maxZError=g.getFloat64(16,!0),C.zMin=g.getFloat64(24,!0),C.zMax=g.getFloat64(32,!0),i+=40,n.headerInfo=C,n.ptr=i;var Q,c;if(h>=3&&(c=h>=4?52:48,Q=this.computeChecksumFletcher32(new Uint8Array(I,i-c,C.blobSize-14)),Q!==C.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(I,n){var i=n.headerInfo,E=this.getDataTypeArray(i.imageType),C=i.numDims*this.getDataTypeSize(i.imageType),g=this.readSubArray(I,n.ptr,E,C),h=this.readSubArray(I,n.ptr+C,E,C);n.ptr+=2*C;var Q,c=!0;for(Q=0;Q0){c=new Uint8Array(Math.ceil(C/8)),h=new DataView(I,i,Q.numBytes);var u=h.getInt16(0,!0),y=2,m=0,f=0;do{if(u>0)for(;u--;)c[m++]=h.getUint8(y++);else for(f=h.getUint8(y++),u=-u;u--;)c[m++]=f;u=h.getInt16(y,!0),y+=2}while(y>3],D<<=d&7):D=c[d>>3],D&128&&(l[d]=1);n.pixels.resultMask=l,Q.bitset=c,i+=Q.numBytes}return n.ptr=i,n.mask=Q,!0},readDataOneSweep:function(I,n,i,E){var C=n.ptr,g=n.headerInfo,h=g.numDims,Q=g.width*g.height,c=g.imageType,l=g.numValidPixel*B.getDataTypeSize(c)*h,u,y=n.pixels.resultMask;if(i===Uint8Array)u=new Uint8Array(I,C,l);else{var m=new ArrayBuffer(l),f=new Uint8Array(m);f.set(new Uint8Array(I,C,l)),u=new i(m)}if(u.length===Q*h)E?n.pixels.resultPixels=B.swapDimensionOrder(u,Q,h,i,!0):n.pixels.resultPixels=u;else{n.pixels.resultPixels=new i(Q*h);var D=0,d=0,G=0,R=0;if(h>1){if(E){for(d=0;d=Q)return!1;var c=new Uint32Array(Q-h);B.decodeBits(I,n,c);var l=[],u,y,m,f;for(u=h;u0&&(l[y].second=S<>>32-f,32-x>=f?(x+=f,x===32&&(x=0,Y++,S=F[Y])):(x+=f-32,Y++,S=F[Y],l[y].second|=S>>>32-x));var k=0,p=0,M=new s;for(u=0;u=i?p=i:p=k;var U=[],v,N,b,K,_,L;for(u=h;u0)if(v=[f,y],f<=p)for(N=l[y].second<=0;K--)_=N>>>K&1,_?(L.right||(L.right=new s),L=L.right):(L.left||(L.left=new s),L=L.left),K===0&&!L.val&&(L.val=v[1]);return{decodeLut:U,numBitsLUTQick:p,numBitsLUT:k,tree:M,stuffedData:F,srcPtr:Y,bitPos:x}},readHuffman:function(I,n,i,E){var C=n.headerInfo,g=C.numDims,h=n.headerInfo.height,Q=n.headerInfo.width,c=Q*h,l=this.readHuffmanTree(I,n),u=l.decodeLut,y=l.tree,m=l.stuffedData,f=l.srcPtr,D=l.bitPos,d=l.numBitsLUTQick,G=l.numBitsLUT,R=n.headerInfo.imageType===0?128:0,F,x,S,Y=n.pixels.resultMask,k,p,M,U,v,N,b,K=0;D>0&&(f++,D=0);var _=m[f],L=n.encodeMode===1,J=new i(c*g),q=J,H;if(g<2||L){for(H=0;H1&&(q=new i(J.buffer,c*H,c),K=0),n.headerInfo.numValidPixel===Q*h)for(N=0,U=0;U>>32-d,p=k,32-D>>64-D-d,p=k),u[p])x=u[p][1],D+=u[p][0];else for(k=_<>>32-G,p=k,32-D>>64-D-G,p=k),F=y,b=0;b>>G-b-1&1,F=M?F.right:F.left,!(F.left||F.right)){x=F.val,D=D+b+1;break}D>=32&&(D-=32,f++,_=m[f]),S=x-R,L?(v>0?S+=K:U>0?S+=q[N-Q]:S+=K,S&=255,q[N]=S,K=S):q[N]=S}else for(N=0,U=0;U>>32-d,p=k,32-D>>64-D-d,p=k),u[p])x=u[p][1],D+=u[p][0];else for(k=_<>>32-G,p=k,32-D>>64-D-G,p=k),F=y,b=0;b>>G-b-1&1,F=M?F.right:F.left,!(F.left||F.right)){x=F.val,D=D+b+1;break}D>=32&&(D-=32,f++,_=m[f]),S=x-R,L?(v>0&&Y[N-1]?S+=K:U>0&&Y[N-Q]?S+=q[N-Q]:S+=K,S&=255,q[N]=S,K=S):q[N]=S}}else for(N=0,U=0;U>>32-d,p=k,32-D>>64-D-d,p=k),u[p])x=u[p][1],D+=u[p][0];else for(k=_<>>32-G,p=k,32-D>>64-D-G,p=k),F=y,b=0;b>>G-b-1&1,F=M?F.right:F.left,!(F.left||F.right)){x=F.val,D=D+b+1;break}D>=32&&(D-=32,f++,_=m[f]),S=x-R,q[N]=S}n.ptr=n.ptr+(f+1)*4+(D>0?4:0),n.pixels.resultPixels=J,g>1&&!E&&(n.pixels.resultPixels=B.swapDimensionOrder(J,c,g,i))},decodeBits:function(I,n,i,E,C){{var g=n.headerInfo,h=g.fileVersion,Q=0,c=I.byteLength-n.ptr>=5?5:I.byteLength-n.ptr,l=new DataView(I,n.ptr,c),u=l.getUint8(0);Q++;var y=u>>6,m=y===0?4:3-y,f=(u&32)>0,D=u&31,d=0;if(m===1)d=l.getUint8(Q),Q++;else if(m===2)d=l.getUint16(Q,!0),Q+=2;else if(m===4)d=l.getUint32(Q,!0),Q+=4;else throw"Invalid valid pixel count type";var G=2*g.maxZError,R,F,x,S,Y,k,p,M,U,v=g.numDims>1?g.maxValues[C]:g.zMax;if(f){for(n.counter.lut++,M=l.getUint8(Q),Q++,S=Math.ceil((M-1)*D/8),Y=Math.ceil(S/4),F=new ArrayBuffer(Y*4),x=new Uint8Array(F),n.ptr+=Q,x.set(new Uint8Array(I,n.ptr,S)),p=new Uint32Array(F),n.ptr+=S,U=0;M-1>>>U;)U++;S=Math.ceil(d*U/8),Y=Math.ceil(S/4),F=new ArrayBuffer(Y*4),x=new Uint8Array(F),x.set(new Uint8Array(I,n.ptr,S)),R=new Uint32Array(F),n.ptr+=S,h>=3?k=a.unstuffLUT2(p,D,M-1,E,G,v):k=a.unstuffLUT(p,D,M-1,E,G,v),h>=3?a.unstuff2(R,i,U,d,k):a.unstuff(R,i,U,d,k)}else n.counter.bitstuffer++,U=D,n.ptr+=Q,U>0&&(S=Math.ceil(d*U/8),Y=Math.ceil(S/4),F=new ArrayBuffer(Y*4),x=new Uint8Array(F),x.set(new Uint8Array(I,n.ptr,S)),R=new Uint32Array(F),n.ptr+=S,h>=3?E==null?a.originalUnstuff2(R,i,U,d):a.unstuff2(R,i,U,d,!1,E,G,v):E==null?a.originalUnstuff(R,i,U,d):a.unstuff(R,i,U,d,!1,E,G,v))}},readTiles:function(I,n,i,E){var C=n.headerInfo,g=C.width,h=C.height,Q=g*h,c=C.microBlockSize,l=C.imageType,u=B.getDataTypeSize(l),y=Math.ceil(g/c),m=Math.ceil(h/c);n.pixels.numBlocksY=m,n.pixels.numBlocksX=y,n.pixels.ptr=0;var f=0,D=0,d=0,G=0,R=0,F=0,x=0,S=0,Y=0,k=0,p=0,M=0,U=0,v=0,N=0,b=0,K,_,L,J,q,H,O=new i(c*c),P=h%c||c,X=g%c||c,$,W,kA=C.numDims,sA,eA=n.pixels.resultMask,AA=n.pixels.resultPixels,It=C.fileVersion,he=It>=5?14:15,oA,KA=C.zMax,aA;for(d=0;d1?(aA=AA,p=d*g*c+G*c,AA=new i(n.pixels.resultPixels.buffer,Q*sA*u,Q),KA=C.maxValues[sA]):aA=null,x=I.byteLength-n.ptr,K=new DataView(I,n.ptr,Math.min(10,x)),_={},b=0,S=K.getUint8(0),b++,oA=C.fileVersion>=5?S&4:0,Y=S>>6&255,k=S>>2&he,k!==(G*c>>3&he)||oA&&sA===0)throw"integrity issue";if(H=S&3,H>3)throw n.ptr+=b,"Invalid block encoding ("+H+")";if(H===2){if(oA)if(eA)for(f=0;f1&&!E&&(n.pixels.resultPixels=B.swapDimensionOrder(n.pixels.resultPixels,Q,kA,i))},formatFileInfo:function(I){return{fileIdentifierString:I.headerInfo.fileIdentifierString,fileVersion:I.headerInfo.fileVersion,imageType:I.headerInfo.imageType,height:I.headerInfo.height,width:I.headerInfo.width,numValidPixel:I.headerInfo.numValidPixel,microBlockSize:I.headerInfo.microBlockSize,blobSize:I.headerInfo.blobSize,maxZError:I.headerInfo.maxZError,pixelType:B.getPixelType(I.headerInfo.imageType),eofOffset:I.eofOffset,mask:I.mask?{numBytes:I.mask.numBytes}:null,pixels:{numBlocksX:I.pixels.numBlocksX,numBlocksY:I.pixels.numBlocksY,maxValue:I.headerInfo.zMax,minValue:I.headerInfo.zMin,noDataValue:I.noDataValue}}},constructConstantSurface:function(I,n){var i=I.headerInfo.zMax,E=I.headerInfo.zMin,C=I.headerInfo.maxValues,g=I.headerInfo.numDims,h=I.headerInfo.height*I.headerInfo.width,Q=0,c=0,l=0,u=I.pixels.resultMask,y=I.pixels.resultPixels;if(u)if(g>1){if(n)for(Q=0;Q1&&E!==i)if(n)for(Q=0;Q=-128&&n<=127;break;case 1:i=n>=0&&n<=255;break;case 2:i=n>=-32768&&n<=32767;break;case 3:i=n>=0&&n<=65536;break;case 4:i=n>=-2147483648&&n<=2147483647;break;case 5:i=n>=0&&n<=4294967296;break;case 6:i=n>=-34027999387901484e22&&n<=34027999387901484e22;break;case 7:i=n>=-17976931348623157e292&&n<=17976931348623157e292;break;default:i=!1}return i},getDataTypeSize:function(I){var n=0;switch(I){case 0:case 1:n=1;break;case 2:case 3:n=2;break;case 4:case 5:case 6:n=4;break;case 7:n=8;break;default:n=I}return n},getDataTypeUsed:function(I,n){var i=I;switch(I){case 2:case 4:i=I-n;break;case 3:case 5:i=I-2*n;break;case 6:n===0?i=I:n===1?i=2:i=1;break;case 7:n===0?i=I:i=I-2*n+1;break;default:i=I;break}return i},getOnePixel:function(I,n,i,E){var C=0;switch(i){case 0:C=E.getInt8(n);break;case 1:C=E.getUint8(n);break;case 2:C=E.getInt16(n,!0);break;case 3:C=E.getUint16(n,!0);break;case 4:C=E.getInt32(n,!0);break;case 5:C=E.getUInt32(n,!0);break;case 6:C=E.getFloat32(n,!0);break;case 7:C=E.getFloat64(n,!0);break;default:throw"the decoder does not understand this pixel type"}return C},swapDimensionOrder:function(I,n,i,E,C){var g=0,h=0,Q=0,c=0,l=I;if(i>1)if(l=new E(n*i),C)for(g=0;g5)throw"unsupported lerc version 2."+h;B.readMask(I,C),g.numValidPixel!==g.width*g.height&&!C.pixels.resultMask&&(C.pixels.resultMask=n.maskData);var c=g.width*g.height;C.pixels.resultPixels=new Q(c*g.numDims),C.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0};var l=!n.returnPixelInterleavedDims;if(g.numValidPixel!==0)if(g.zMax===g.zMin)B.constructConstantSurface(C,l);else if(h>=4&&B.checkMinMaxRanges(I,C))B.constructConstantSurface(C,l);else{var u=new DataView(I,C.ptr,2),y=u.getUint8(0);if(C.ptr++,y)B.readDataOneSweep(I,C,Q,l);else if(h>1&&g.imageType<=1&&Math.abs(g.maxZError-.5)<1e-5){var m=u.getUint8(1);if(C.ptr++,C.encodeMode=m,m>2||h<4&&m>1)throw"Invalid Huffman flag "+m;m?B.readHuffman(I,C,Q,l):B.readTiles(I,C,Q,l)}else B.readTiles(I,C,Q,l)}C.eofOffset=C.ptr;var f;n.inputOffset?(f=C.headerInfo.blobSize+n.inputOffset-C.ptr,Math.abs(f)>=1&&(C.eofOffset=n.inputOffset+C.headerInfo.blobSize)):(f=C.headerInfo.blobSize-C.ptr,Math.abs(f)>=1&&(C.eofOffset=C.headerInfo.blobSize));var D={width:g.width,height:g.height,pixelData:C.pixels.resultPixels,minValue:g.zMin,maxValue:g.zMax,validPixelCount:g.numValidPixel,dimCount:g.numDims,dimStats:{minValues:g.minValues,maxValues:g.maxValues},maskData:C.pixels.resultMask};if(C.pixels.resultMask&&B.isValidPixelValue(g.imageType,i)){var d=C.pixels.resultMask;for(E=0;E1&&(c&&h.push(c),y.fileInfo.mask&&y.fileInfo.mask.numBytes>0&&u++),E++,l.pixels.push(y.pixelData),l.statistics.push({minValue:y.minValue,maxValue:y.maxValue,noDataValue:y.noDataValue,dimStats:y.dimStats})}var m,f,D;if(i>1&&u>1){for(D=l.width*l.height,l.bandMasks=h,c=new Uint8Array(D),c.set(h[0]),m=1;mA.arrayBuffer()).then(A=>WebAssembly.instantiate(A,Ae)).then(this._init):dA=WebAssembly.instantiate(Buffer.from(Te,"base64"),Ae).then(this._init),dA)}_init(A){nA=A.instance,Ae.env.emscripten_notify_memory_growth(0)}decode(A,e=0){if(!nA)throw new Error("ZSTDDecoder: Await .init() before decoding.");const t=A.byteLength,r=nA.exports.malloc(t);oe.set(A,r),e=e||Number(nA.exports.ZSTD_findDecompressedSize(r,t));const a=nA.exports.malloc(e),B=nA.exports.ZSTD_decompress(a,e,r,t),s=oe.slice(a,a+B);return nA.exports.free(r),nA.exports.free(a),s}}const Te="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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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",gt=new Hr;class Kr extends BA{constructor(A){super(),this.planarConfiguration=typeof A.PlanarConfiguration<"u"?A.PlanarConfiguration:1,this.samplesPerPixel=typeof A.SamplesPerPixel<"u"?A.SamplesPerPixel:1,this.addCompression=A.LercParameters[Ci.AddCompression]}decodeBlock(A){switch(this.addCompression){case PA.None:break;case PA.Deflate:A=Ye(new Uint8Array(A)).buffer;break;case PA.Zstandard:A=gt.decode(new Uint8Array(A)).buffer;break;default:throw new Error(`Unsupported LERC additional compression method identifier: ${this.addCompression}`)}return Yr.decode(A,{returnPixelInterleavedDims:this.planarConfiguration===1}).pixels[0].buffer}}const Or=Object.freeze(Object.defineProperty({__proto__:null,default:Kr,zstd:gt},Symbol.toStringTag,{value:"Module"}));class Vr extends BA{constructor(){if(super(),typeof createImageBitmap>"u")throw new Error("Cannot decode WebImage as `createImageBitmap` is not available");if(typeof document>"u"&&typeof OffscreenCanvas>"u")throw new Error("Cannot decode WebImage as neither `document` nor `OffscreenCanvas` is not available")}async decode(A,e){const t=new Blob([e]),r=await createImageBitmap(t);let a;typeof document<"u"?(a=document.createElement("canvas"),a.width=r.width,a.height=r.height):a=new OffscreenCanvas(r.width,r.height);const B=a.getContext("2d");return B.drawImage(r,0,0),B.getImageData(0,0,r.width,r.height).data.buffer}}const _r=Object.freeze(Object.defineProperty({__proto__:null,default:Vr},Symbol.toStringTag,{value:"Module"})),Pr=typeof Worker<"u"?Worker:void 0;function Xr(){const o='function A(A,e,t,i,r,I,g){try{var n=A[I](g),a=n.value}catch(A){return void t(A)}n.done?e(a):Promise.resolve(a).then(i,r)}function e(e){return function(){var t=this,i=arguments;return new Promise((function(r,I){var g=e.apply(t,i);function n(e){A(g,r,I,n,a,"next",e)}function a(e){A(g,r,I,n,a,"throw",e)}n(void 0)}))}}function t(A){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},t(A)}var i={exports:{}};!function(A){var e=function(A){var e,i=Object.prototype,r=i.hasOwnProperty,I="function"==typeof Symbol?Symbol:{},g=I.iterator||"@@iterator",n=I.asyncIterator||"@@asyncIterator",a=I.toStringTag||"@@toStringTag";function o(A,e,t){return Object.defineProperty(A,e,{value:t,enumerable:!0,configurable:!0,writable:!0}),A[e]}try{o({},"")}catch(A){o=function(A,e,t){return A[e]=t}}function B(A,e,t,i){var r=e&&e.prototype instanceof h?e:h,I=Object.create(r.prototype),g=new S(i||[]);return I._invoke=function(A,e,t){var i=Q;return function(r,I){if(i===s)throw new Error("Generator is already running");if(i===f){if("throw"===r)throw I;return R()}for(t.method=r,t.arg=I;;){var g=t.delegate;if(g){var n=m(g,t);if(n){if(n===c)continue;return n}}if("next"===t.method)t.sent=t._sent=t.arg;else if("throw"===t.method){if(i===Q)throw i=f,t.arg;t.dispatchException(t.arg)}else"return"===t.method&&t.abrupt("return",t.arg);i=s;var a=C(A,e,t);if("normal"===a.type){if(i=t.done?f:E,a.arg===c)continue;return{value:a.arg,done:t.done}}"throw"===a.type&&(i=f,t.method="throw",t.arg=a.arg)}}}(A,t,g),I}function C(A,e,t){try{return{type:"normal",arg:A.call(e,t)}}catch(A){return{type:"throw",arg:A}}}A.wrap=B;var Q="suspendedStart",E="suspendedYield",s="executing",f="completed",c={};function h(){}function l(){}function u(){}var w={};o(w,g,(function(){return this}));var d=Object.getPrototypeOf,D=d&&d(d(v([])));D&&D!==i&&r.call(D,g)&&(w=D);var y=u.prototype=h.prototype=Object.create(w);function k(A){["next","throw","return"].forEach((function(e){o(A,e,(function(A){return this._invoke(e,A)}))}))}function p(A,e){function i(I,g,n,a){var o=C(A[I],A,g);if("throw"!==o.type){var B=o.arg,Q=B.value;return Q&&"object"===t(Q)&&r.call(Q,"__await")?e.resolve(Q.__await).then((function(A){i("next",A,n,a)}),(function(A){i("throw",A,n,a)})):e.resolve(Q).then((function(A){B.value=A,n(B)}),(function(A){return i("throw",A,n,a)}))}a(o.arg)}var I;this._invoke=function(A,t){function r(){return new e((function(e,r){i(A,t,e,r)}))}return I=I?I.then(r,r):r()}}function m(A,t){var i=A.iterator[t.method];if(i===e){if(t.delegate=null,"throw"===t.method){if(A.iterator.return&&(t.method="return",t.arg=e,m(A,t),"throw"===t.method))return c;t.method="throw",t.arg=new TypeError("The iterator does not provide a \'throw\' method")}return c}var r=C(i,A.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,c;var I=r.arg;return I?I.done?(t[A.resultName]=I.value,t.next=A.nextLoc,"return"!==t.method&&(t.method="next",t.arg=e),t.delegate=null,c):I:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,c)}function G(A){var e={tryLoc:A[0]};1 in A&&(e.catchLoc=A[1]),2 in A&&(e.finallyLoc=A[2],e.afterLoc=A[3]),this.tryEntries.push(e)}function F(A){var e=A.completion||{};e.type="normal",delete e.arg,A.completion=e}function S(A){this.tryEntries=[{tryLoc:"root"}],A.forEach(G,this),this.reset(!0)}function v(A){if(A){var t=A[g];if(t)return t.call(A);if("function"==typeof A.next)return A;if(!isNaN(A.length)){var i=-1,I=function t(){for(;++i=0;--I){var g=this.tryEntries[I],n=g.completion;if("root"===g.tryLoc)return i("end");if(g.tryLoc<=this.prev){var a=r.call(g,"catchLoc"),o=r.call(g,"finallyLoc");if(a&&o){if(this.prev=0;--t){var i=this.tryEntries[t];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--e){var t=this.tryEntries[e];if(t.finallyLoc===A)return this.complete(t.completion,t.afterLoc),F(t),c}},catch:function(A){for(var e=this.tryEntries.length-1;e>=0;--e){var t=this.tryEntries[e];if(t.tryLoc===A){var i=t.completion;if("throw"===i.type){var r=i.arg;F(t)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(A,t,i){return this.delegate={iterator:v(A),resultName:t,nextLoc:i},"next"===this.method&&(this.arg=e),c}},A}(A.exports);try{regeneratorRuntime=e}catch(A){"object"===("undefined"==typeof globalThis?"undefined":t(globalThis))?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}}(i);var r=i.exports,I=new Map;function g(A,e){Array.isArray(A)||(A=[A]),A.forEach((function(A){return I.set(A,e)}))}function n(A){return a.apply(this,arguments)}function a(){return(a=e(r.mark((function A(e){var t,i;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:if(t=I.get(e.Compression)){A.next=3;break}throw new Error("Unknown compression method identifier: ".concat(e.Compression));case 3:return A.next=5,t();case 5:return i=A.sent,A.abrupt("return",new i(e));case 7:case"end":return A.stop()}}),A)})))).apply(this,arguments)}g([void 0,1],(function(){return Promise.resolve().then((function(){return y})).then((function(A){return A.default}))})),g(5,(function(){return Promise.resolve().then((function(){return F})).then((function(A){return A.default}))})),g(6,(function(){throw new Error("old style JPEG compression is not supported.")})),g(7,(function(){return Promise.resolve().then((function(){return N})).then((function(A){return A.default}))})),g([8,32946],(function(){return Promise.resolve().then((function(){return OA})).then((function(A){return A.default}))})),g(32773,(function(){return Promise.resolve().then((function(){return _A})).then((function(A){return A.default}))})),g(34887,(function(){return Promise.resolve().then((function(){return le})).then(function(){var A=e(r.mark((function A(e){return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return A.next=2,e.zstd.init();case 2:return A.abrupt("return",e);case 3:case"end":return A.stop()}}),A)})));return function(e){return A.apply(this,arguments)}}()).then((function(A){return A.default}))})),g(50001,(function(){return Promise.resolve().then((function(){return de})).then((function(A){return A.default}))}));var o=globalThis;function B(A,e){if(!(A instanceof e))throw new TypeError("Cannot call a class as a function")}function C(A,e){for(var t=0;t0;r--)A[i+e]+=A[i],i++;t-=e}while(t>0)}function l(A,e,t){for(var i=0,r=A.length,I=r/t;r>e;){for(var g=e;g>0;--g)A[i+e]+=A[i],++i;r-=e}for(var n=A.slice(),a=0;a=A.byteLength);++o){var B=void 0;if(2===e){switch(r[0]){case 8:B=new Uint8Array(A,o*a*t*n,a*t*n);break;case 16:B=new Uint16Array(A,o*a*t*n,a*t*n/2);break;case 32:B=new Uint32Array(A,o*a*t*n,a*t*n/4);break;default:throw new Error("Predictor 2 not allowed with ".concat(r[0]," bits per sample."))}h(B,a)}else 3===e&&l(B=new Uint8Array(A,o*a*t*n,a*t*n),a,n)}return A}o.addEventListener("message",function(){var A=e(r.mark((function A(e){var t,i,I,g,a,B;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return t=e.data,i=t.id,I=t.fileDirectory,g=t.buffer,A.next=3,n(I);case 3:return a=A.sent,A.next=6,a.decode(I,g);case 6:B=A.sent,o.postMessage({decoded:B,id:i},[B]);case 8:case"end":return A.stop()}}),A)})));return function(e){return A.apply(this,arguments)}}());var w=function(){function A(){B(this,A)}var t;return Q(A,[{key:"decode",value:(t=e(r.mark((function A(e,t){var i,I,g,n,a;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return A.next=2,this.decodeBlock(t);case 2:if(i=A.sent,1===(I=e.Predictor||1)){A.next=9;break}return g=!e.StripOffsets,n=g?e.TileWidth:e.ImageWidth,a=g?e.TileLength:e.RowsPerStrip||e.ImageLength,A.abrupt("return",u(i,I,n,a,e.BitsPerSample,e.PlanarConfiguration));case 9:return A.abrupt("return",i);case 10:case"end":return A.stop()}}),A,this)}))),function(A,e){return t.apply(this,arguments)})}]),A}();function d(A){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var D=function(A){s(t,w);var e=d(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:"decodeBlock",value:function(A){return A}}]),t}(),y=Object.freeze({__proto__:null,default:D});function k(A){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}function p(A,e){for(var t=e.length-1;t>=0;t--)A.push(e[t]);return A}function m(A){for(var e=new Uint16Array(4093),t=new Uint8Array(4093),i=0;i<=257;i++)e[i]=4096,t[i]=i;var r=258,I=9,g=0;function n(){r=258,I=9}function a(A){var e=function(A,e,t){var i=e%8,r=Math.floor(e/8),I=8-i,g=e+t-8*(r+1),n=8*(r+2)-(e+t),a=8*(r+2)-e;if(n=Math.max(0,n),r>=A.length)return console.warn("ran off the end of the buffer before finding EOI_CODE (end on input code)"),257;var o=A[r]&Math.pow(2,8-i)-1,B=o<<=t-I;if(r+1>>n;B+=C<<=Math.max(0,t-a)}if(g>8&&r+2>>Q}return B}(A,g,I);return g+=I,e}function o(A,i){return t[r]=i,e[r]=A,++r-1}function B(A){for(var i=[],r=A;4096!==r;r=e[r])i.push(t[r]);return i}var C=[];n();for(var Q,E=new Uint8Array(A),s=a(E);257!==s;){if(256===s){for(n(),s=a(E);256===s;)s=a(E);if(257===s)break;if(s>256)throw new Error("corrupted code at scanline ".concat(s));p(C,B(s)),Q=s}else if(s=Math.pow(2,I)&&(12===I?Q=void 0:I++),s=a(E)}return new Uint8Array(C)}var G=function(A){s(t,w);var e=k(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:"decodeBlock",value:function(A){return m(A).buffer}}]),t}(),F=Object.freeze({__proto__:null,default:G});function S(A){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var v=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]);function R(A,e){for(var t=0,i=[],r=16;r>0&&!A[r-1];)--r;i.push({children:[],index:0});for(var I,g=i[0],n=0;n0;)g=i.pop();for(g.index++,i.push(g);i.length<=n;)i.push(I={children:[],index:0}),g.children[g.index]=I.children,g=I;t++}n+10)return f--,s>>f&1;if(255===(s=A[E++])){var e=A[E++];if(e)throw new Error("unexpected marker: ".concat((s<<8|e).toString(16)))}return f=7,s>>>7}function h(A){for(var e,i=A;null!==(e=c());){if("number"==typeof(i=i[e]))return i;if("object"!==t(i))throw new Error("invalid huffman sequence")}return null}function l(A){for(var e=A,t=0;e>0;){var i=c();if(null===i)return;t=t<<1|i,--e}return t}function u(A){var e=l(A);return e>=1<0)w--;else for(var t=g,i=n;t<=i;){var r=h(A.huffmanTableAC),I=15&r,a=r>>4;if(0===I){if(a<15){w=l(a)+(1<>4,0===C)r<15?(w=l(r)+(1<>4;if(0===g){if(n<15)break;r+=16}else e[v[r+=n]]=u(g),r++}};var L,b,M=0;b=1===U?r[0].blocksPerLine*r[0].blocksPerColumn:B*i.mcusPerColumn;for(var N=I||b;M=65488&&L<=65495))break;E+=2}return E-Q}function L(A,e){var t=[],i=e.blocksPerLine,r=e.blocksPerColumn,I=i<<3,g=new Int32Array(64),n=new Uint8Array(64);function a(A,t,i){var r,I,g,n,a,o,B,C,Q,E,s=e.quantizationTable,f=i;for(E=0;E<64;E++)f[E]=A[E]*s[E];for(E=0;E<8;++E){var c=8*E;0!==f[1+c]||0!==f[2+c]||0!==f[3+c]||0!==f[4+c]||0!==f[5+c]||0!==f[6+c]||0!==f[7+c]?(r=5793*f[0+c]+128>>8,I=5793*f[4+c]+128>>8,g=f[2+c],n=f[6+c],a=2896*(f[1+c]-f[7+c])+128>>8,C=2896*(f[1+c]+f[7+c])+128>>8,o=f[3+c]<<4,Q=r-I+1>>1,r=r+I+1>>1,I=Q,Q=3784*g+1567*n+128>>8,g=1567*g-3784*n+128>>8,n=Q,Q=a-(B=f[5+c]<<4)+1>>1,a=a+B+1>>1,B=Q,Q=C+o+1>>1,o=C-o+1>>1,C=Q,Q=r-n+1>>1,r=r+n+1>>1,n=Q,Q=I-g+1>>1,I=I+g+1>>1,g=Q,Q=2276*a+3406*C+2048>>12,a=3406*a-2276*C+2048>>12,C=Q,Q=799*o+4017*B+2048>>12,o=4017*o-799*B+2048>>12,B=Q,f[0+c]=r+C,f[7+c]=r-C,f[1+c]=I+B,f[6+c]=I-B,f[2+c]=g+o,f[5+c]=g-o,f[3+c]=n+a,f[4+c]=n-a):(Q=5793*f[0+c]+512>>10,f[0+c]=Q,f[1+c]=Q,f[2+c]=Q,f[3+c]=Q,f[4+c]=Q,f[5+c]=Q,f[6+c]=Q,f[7+c]=Q)}for(E=0;E<8;++E){var h=E;0!==f[8+h]||0!==f[16+h]||0!==f[24+h]||0!==f[32+h]||0!==f[40+h]||0!==f[48+h]||0!==f[56+h]?(r=5793*f[0+h]+2048>>12,I=5793*f[32+h]+2048>>12,g=f[16+h],n=f[48+h],a=2896*(f[8+h]-f[56+h])+2048>>12,C=2896*(f[8+h]+f[56+h])+2048>>12,o=f[24+h],Q=r-I+1>>1,r=r+I+1>>1,I=Q,Q=3784*g+1567*n+2048>>12,g=1567*g-3784*n+2048>>12,n=Q,Q=a-(B=f[40+h])+1>>1,a=a+B+1>>1,B=Q,Q=C+o+1>>1,o=C-o+1>>1,C=Q,Q=r-n+1>>1,r=r+n+1>>1,n=Q,Q=I-g+1>>1,I=I+g+1>>1,g=Q,Q=2276*a+3406*C+2048>>12,a=3406*a-2276*C+2048>>12,C=Q,Q=799*o+4017*B+2048>>12,o=4017*o-799*B+2048>>12,B=Q,f[0+h]=r+C,f[56+h]=r-C,f[8+h]=I+B,f[48+h]=I-B,f[16+h]=g+o,f[40+h]=g-o,f[24+h]=n+a,f[32+h]=n-a):(Q=5793*i[E+0]+8192>>14,f[0+h]=Q,f[8+h]=Q,f[16+h]=Q,f[24+h]=Q,f[32+h]=Q,f[40+h]=Q,f[48+h]=Q,f[56+h]=Q)}for(E=0;E<64;++E){var l=128+(f[E]+8>>4);t[E]=l<0?0:l>255?255:l}}for(var o=0;o>4==0)for(var C=0;C<64;C++){B[v[C]]=A[e++]}else{if(o>>4!=1)throw new Error("DQT: invalid table spec");for(var Q=0;Q<64;Q++){B[v[Q]]=t()}}this.quantizationTables[15&o]=B}break;case 65472:case 65473:case 65474:t();for(var E={extended:65473===g,progressive:65474===g,precision:A[e++],scanLines:t(),samplesPerLine:t(),components:{},componentsOrder:[]},s=A[e++],f=void 0,c=0;c>4,l=15&A[e+1],u=A[e+2];E.componentsOrder.push(f),E.components[f]={h:h,v:l,quantizationIdx:u},e+=3}i(E),this.frames.push(E);break;case 65476:for(var w=t(),d=2;d>4==0?this.huffmanTablesDC[15&D]=R(y,m):this.huffmanTablesAC[15&D]=R(y,m)}break;case 65501:t(),this.resetInterval=t();break;case 65498:t();for(var F=A[e++],S=[],L=this.frames[0],b=0;b>4],M.huffmanTableAC=this.huffmanTablesAC[15&N],S.push(M)}var x=A[e++],J=A[e++],q=A[e++],Y=U(A,e,L,S,this.resetInterval,x,J,q>>4,15&q);e+=Y;break;case 65535:255!==A[e]&&e--;break;default:if(255===A[e-3]&&A[e-2]>=192&&A[e-2]<=254){e-=3;break}throw new Error("unknown JPEG marker ".concat(g.toString(16)))}g=t()}}},{key:"getResult",value:function(){var A=this.frames;if(0===this.frames.length)throw new Error("no frames were decoded");this.frames.length>1&&console.warn("more than one frame is not supported");for(var e=0;e=0;)A[e]=0}x(new Array(576)),x(new Array(60)),x(new Array(512)),x(new Array(256)),x(new Array(29)),x(new Array(30));var J=function(A,e,t,i){for(var r=65535&A|0,I=A>>>16&65535|0,g=0;0!==t;){t-=g=t>2e3?2e3:t;do{I=I+(r=r+e[i++]|0)|0}while(--g);r%=65521,I%=65521}return r|I<<16|0},q=new Uint32Array(function(){for(var A,e=[],t=0;t<256;t++){A=t;for(var i=0;i<8;i++)A=1&A?3988292384^A>>>1:A>>>1;e[t]=A}return e}()),Y=function(A,e,t,i){var r=q,I=i+t;A^=-1;for(var g=i;g>>8^r[255&(A^e[g])];return-1^A},K={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},H={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},O=function(A,e){return Object.prototype.hasOwnProperty.call(A,e)},P=function(A){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var i=e.shift();if(i){if("object"!==t(i))throw new TypeError(i+"must be non-object");for(var r in i)O(i,r)&&(A[r]=i[r])}}return A},T=function(A){for(var e=0,t=0,i=A.length;t=252?6:X>=248?5:X>=240?4:X>=224?3:X>=192?2:1;_[254]=_[254]=1;var Z=function(A){if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(A);var e,t,i,r,I,g=A.length,n=0;for(r=0;r>>6,e[I++]=128|63&t):t<65536?(e[I++]=224|t>>>12,e[I++]=128|t>>>6&63,e[I++]=128|63&t):(e[I++]=240|t>>>18,e[I++]=128|t>>>12&63,e[I++]=128|t>>>6&63,e[I++]=128|63&t);return e},j=function(A,e){var t,i,r=e||A.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(A.subarray(0,e));var I=new Array(2*r);for(i=0,t=0;t4)I[i++]=65533,t+=n-1;else{for(g&=2===n?31:3===n?15:7;n>1&&t1?I[i++]=65533:g<65536?I[i++]=g:(g-=65536,I[i++]=55296|g>>10&1023,I[i++]=56320|1023&g)}}}return function(A,e){if(e<65534&&A.subarray&&V)return String.fromCharCode.apply(null,A.length===e?A:A.subarray(0,e));for(var t="",i=0;iA.length&&(e=A.length);for(var t=e-1;t>=0&&128==(192&A[t]);)t--;return t<0||0===t?e:t+_[A[t]]>e?t:e};var z=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},$=function(A,e){var t,i,r,I,g,n,a,o,B,C,Q,E,s,f,c,h,l,u,w,d,D,y,k,p,m=A.state;t=A.next_in,k=A.input,i=t+(A.avail_in-5),r=A.next_out,p=A.output,I=r-(e-A.avail_out),g=r+(A.avail_out-257),n=m.dmax,a=m.wsize,o=m.whave,B=m.wnext,C=m.window,Q=m.hold,E=m.bits,s=m.lencode,f=m.distcode,c=(1<>>=u=l>>>24,E-=u,0===(u=l>>>16&255))p[r++]=65535&l;else{if(!(16&u)){if(0==(64&u)){l=s[(65535&l)+(Q&(1<>>=u,E-=u),E<15&&(Q+=k[t++]<>>=u=l>>>24,E-=u,!(16&(u=l>>>16&255))){if(0==(64&u)){l=f[(65535&l)+(Q&(1<n){A.msg="invalid distance too far back",m.mode=30;break A}if(Q>>>=u,E-=u,d>(u=r-I)){if((u=d-u)>o&&m.sane){A.msg="invalid distance too far back",m.mode=30;break A}if(D=0,y=C,0===B){if(D+=a-u,u2;)p[r++]=y[D++],p[r++]=y[D++],p[r++]=y[D++],w-=3;w&&(p[r++]=y[D++],w>1&&(p[r++]=y[D++]))}else{D=r-d;do{p[r++]=p[D++],p[r++]=p[D++],p[r++]=p[D++],w-=3}while(w>2);w&&(p[r++]=p[D++],w>1&&(p[r++]=p[D++]))}break}}break}}while(t>3,Q&=(1<<(E-=w<<3))-1,A.next_in=t,A.next_out=r,A.avail_in=t=1&&0===v[d];d--);if(D>d&&(D=d),0===d)return r[I++]=20971520,r[I++]=20971520,n.bits=1,0;for(w=1;w0&&(0===A||1!==d))return-1;for(R[1]=0,l=1;l<15;l++)R[l+1]=R[l]+v[l];for(u=0;u852||2===A&&m>592)return 1;for(;;){s=l-k,g[u]E?(f=U[L+g[u]],c=F[S+g[u]]):(f=96,c=0),a=1<>k)+(o-=a)]=s<<24|f<<16|c|0}while(0!==o);for(a=1<>=1;if(0!==a?(G&=a-1,G+=a):G=0,u++,0==--v[l]){if(l===d)break;l=e[t+g[u]]}if(l>D&&(G&C)!==B){for(0===k&&(k=D),Q+=w,p=1<<(y=l-k);y+k852||2===A&&m>592)return 1;r[B=G&C]=D<<24|y<<16|Q-I|0}}return 0!==G&&(r[Q+G]=l-k<<24|64<<16|0),n.bits=D,0},IA=H.Z_FINISH,gA=H.Z_BLOCK,nA=H.Z_TREES,aA=H.Z_OK,oA=H.Z_STREAM_END,BA=H.Z_NEED_DICT,CA=H.Z_STREAM_ERROR,QA=H.Z_DATA_ERROR,EA=H.Z_MEM_ERROR,sA=H.Z_BUF_ERROR,fA=H.Z_DEFLATED,cA=function(A){return(A>>>24&255)+(A>>>8&65280)+((65280&A)<<8)+((255&A)<<24)};function hA(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}var lA,uA,wA=function(A){if(!A||!A.state)return CA;var e=A.state;return A.total_in=A.total_out=e.total=0,A.msg="",e.wrap&&(A.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,aA},dA=function(A){if(!A||!A.state)return CA;var e=A.state;return e.wsize=0,e.whave=0,e.wnext=0,wA(A)},DA=function(A,e){var t;if(!A||!A.state)return CA;var i=A.state;return e<0?(t=0,e=-e):(t=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?CA:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=t,i.wbits=e,dA(A))},yA=function(A,e){if(!A)return CA;var t=new hA;A.state=t,t.window=null;var i=DA(A,e);return i!==aA&&(A.state=null),i},kA=!0,pA=function(A){if(kA){lA=new Int32Array(512),uA=new Int32Array(32);for(var e=0;e<144;)A.lens[e++]=8;for(;e<256;)A.lens[e++]=9;for(;e<280;)A.lens[e++]=7;for(;e<288;)A.lens[e++]=8;for(rA(1,A.lens,0,288,lA,0,A.work,{bits:9}),e=0;e<32;)A.lens[e++]=5;rA(2,A.lens,0,32,uA,0,A.work,{bits:5}),kA=!1}A.lencode=lA,A.lenbits=9,A.distcode=uA,A.distbits=5},mA=function(A,e,t,i){var r,I=A.state;return null===I.window&&(I.wsize=1<=I.wsize?(I.window.set(e.subarray(t-I.wsize,t),0),I.wnext=0,I.whave=I.wsize):((r=I.wsize-I.wnext)>i&&(r=i),I.window.set(e.subarray(t-i,t-i+r),I.wnext),(i-=r)?(I.window.set(e.subarray(t-i,t),0),I.wnext=i,I.whave=I.wsize):(I.wnext+=r,I.wnext===I.wsize&&(I.wnext=0),I.whave>>8&255,t.check=Y(t.check,G,2,0),o=0,B=0,t.mode=2;break}if(t.flags=0,t.head&&(t.head.done=!1),!(1&t.wrap)||(((255&o)<<8)+(o>>8))%31){A.msg="incorrect header check",t.mode=30;break}if((15&o)!==fA){A.msg="unknown compression method",t.mode=30;break}if(B-=4,D=8+(15&(o>>>=4)),0===t.wbits)t.wbits=D;else if(D>t.wbits){A.msg="invalid window size",t.mode=30;break}t.dmax=1<>8&1),512&t.flags&&(G[0]=255&o,G[1]=o>>>8&255,t.check=Y(t.check,G,2,0)),o=0,B=0,t.mode=3;case 3:for(;B<32;){if(0===n)break A;n--,o+=i[I++]<>>8&255,G[2]=o>>>16&255,G[3]=o>>>24&255,t.check=Y(t.check,G,4,0)),o=0,B=0,t.mode=4;case 4:for(;B<16;){if(0===n)break A;n--,o+=i[I++]<>8),512&t.flags&&(G[0]=255&o,G[1]=o>>>8&255,t.check=Y(t.check,G,2,0)),o=0,B=0,t.mode=5;case 5:if(1024&t.flags){for(;B<16;){if(0===n)break A;n--,o+=i[I++]<>>8&255,t.check=Y(t.check,G,2,0)),o=0,B=0}else t.head&&(t.head.extra=null);t.mode=6;case 6:if(1024&t.flags&&((E=t.length)>n&&(E=n),E&&(t.head&&(D=t.head.extra_len-t.length,t.head.extra||(t.head.extra=new Uint8Array(t.head.extra_len)),t.head.extra.set(i.subarray(I,I+E),D)),512&t.flags&&(t.check=Y(t.check,i,E,I)),n-=E,I+=E,t.length-=E),t.length))break A;t.length=0,t.mode=7;case 7:if(2048&t.flags){if(0===n)break A;E=0;do{D=i[I+E++],t.head&&D&&t.length<65536&&(t.head.name+=String.fromCharCode(D))}while(D&&E>9&1,t.head.done=!0),A.adler=t.check=0,t.mode=12;break;case 10:for(;B<32;){if(0===n)break A;n--,o+=i[I++]<>>=7&B,B-=7&B,t.mode=27;break}for(;B<3;){if(0===n)break A;n--,o+=i[I++]<>>=1)){case 0:t.mode=14;break;case 1:if(pA(t),t.mode=20,e===nA){o>>>=2,B-=2;break A}break;case 2:t.mode=17;break;case 3:A.msg="invalid block type",t.mode=30}o>>>=2,B-=2;break;case 14:for(o>>>=7&B,B-=7&B;B<32;){if(0===n)break A;n--,o+=i[I++]<>>16^65535)){A.msg="invalid stored block lengths",t.mode=30;break}if(t.length=65535&o,o=0,B=0,t.mode=15,e===nA)break A;case 15:t.mode=16;case 16:if(E=t.length){if(E>n&&(E=n),E>a&&(E=a),0===E)break A;r.set(i.subarray(I,I+E),g),n-=E,I+=E,a-=E,g+=E,t.length-=E;break}t.mode=12;break;case 17:for(;B<14;){if(0===n)break A;n--,o+=i[I++]<>>=5,B-=5,t.ndist=1+(31&o),o>>>=5,B-=5,t.ncode=4+(15&o),o>>>=4,B-=4,t.nlen>286||t.ndist>30){A.msg="too many length or distance symbols",t.mode=30;break}t.have=0,t.mode=18;case 18:for(;t.have>>=3,B-=3}for(;t.have<19;)t.lens[F[t.have++]]=0;if(t.lencode=t.lendyn,t.lenbits=7,k={bits:t.lenbits},y=rA(0,t.lens,0,19,t.lencode,0,t.work,k),t.lenbits=k.bits,y){A.msg="invalid code lengths set",t.mode=30;break}t.have=0,t.mode=19;case 19:for(;t.have>>16&255,l=65535&m,!((c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>>=c,B-=c,t.lens[t.have++]=l;else{if(16===l){for(p=c+2;B>>=c,B-=c,0===t.have){A.msg="invalid bit length repeat",t.mode=30;break}D=t.lens[t.have-1],E=3+(3&o),o>>>=2,B-=2}else if(17===l){for(p=c+3;B>>=c)),o>>>=3,B-=3}else{for(p=c+7;B>>=c)),o>>>=7,B-=7}if(t.have+E>t.nlen+t.ndist){A.msg="invalid bit length repeat",t.mode=30;break}for(;E--;)t.lens[t.have++]=D}}if(30===t.mode)break;if(0===t.lens[256]){A.msg="invalid code -- missing end-of-block",t.mode=30;break}if(t.lenbits=9,k={bits:t.lenbits},y=rA(1,t.lens,0,t.nlen,t.lencode,0,t.work,k),t.lenbits=k.bits,y){A.msg="invalid literal/lengths set",t.mode=30;break}if(t.distbits=6,t.distcode=t.distdyn,k={bits:t.distbits},y=rA(2,t.lens,t.nlen,t.ndist,t.distcode,0,t.work,k),t.distbits=k.bits,y){A.msg="invalid distances set",t.mode=30;break}if(t.mode=20,e===nA)break A;case 20:t.mode=21;case 21:if(n>=6&&a>=258){A.next_out=g,A.avail_out=a,A.next_in=I,A.avail_in=n,t.hold=o,t.bits=B,$(A,Q),g=A.next_out,r=A.output,a=A.avail_out,I=A.next_in,i=A.input,n=A.avail_in,o=t.hold,B=t.bits,12===t.mode&&(t.back=-1);break}for(t.back=0;h=(m=t.lencode[o&(1<>>16&255,l=65535&m,!((c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>u)])>>>16&255,l=65535&m,!(u+(c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>>=u,B-=u,t.back+=u}if(o>>>=c,B-=c,t.back+=c,t.length=l,0===h){t.mode=26;break}if(32&h){t.back=-1,t.mode=12;break}if(64&h){A.msg="invalid literal/length code",t.mode=30;break}t.extra=15&h,t.mode=22;case 22:if(t.extra){for(p=t.extra;B>>=t.extra,B-=t.extra,t.back+=t.extra}t.was=t.length,t.mode=23;case 23:for(;h=(m=t.distcode[o&(1<>>16&255,l=65535&m,!((c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>u)])>>>16&255,l=65535&m,!(u+(c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>>=u,B-=u,t.back+=u}if(o>>>=c,B-=c,t.back+=c,64&h){A.msg="invalid distance code",t.mode=30;break}t.offset=l,t.extra=15&h,t.mode=24;case 24:if(t.extra){for(p=t.extra;B>>=t.extra,B-=t.extra,t.back+=t.extra}if(t.offset>t.dmax){A.msg="invalid distance too far back",t.mode=30;break}t.mode=25;case 25:if(0===a)break A;if(E=Q-a,t.offset>E){if((E=t.offset-E)>t.whave&&t.sane){A.msg="invalid distance too far back",t.mode=30;break}E>t.wnext?(E-=t.wnext,s=t.wsize-E):s=t.wnext-E,E>t.length&&(E=t.length),f=t.window}else f=r,s=g-t.offset,E=t.length;E>a&&(E=a),a-=E,t.length-=E;do{r[g++]=f[s++]}while(--E);0===t.length&&(t.mode=21);break;case 26:if(0===a)break A;r[g++]=t.length,a--,t.mode=21;break;case 27:if(t.wrap){for(;B<32;){if(0===n)break A;n--,o|=i[I++]<=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||A&&A.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new z,this.strm.avail_out=0;var t=GA.inflateInit2(this.strm,e.windowBits);if(t!==UA)throw new Error(K[t]);if(this.header=new FA,GA.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=Z(e.dictionary):"[object ArrayBuffer]"===SA.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(t=GA.inflateSetDictionary(this.strm,e.dictionary))!==UA))throw new Error(K[t])}function qA(A,e){var t=new JA(e);if(t.push(A),t.err)throw t.msg||K[t.err];return t.result}JA.prototype.push=function(A,e){var t,i,r,I=this.strm,g=this.options.chunkSize,n=this.options.dictionary;if(this.ended)return!1;for(i=e===~~e?e:!0===e?RA:vA,"[object ArrayBuffer]"===SA.call(A)?I.input=new Uint8Array(A):I.input=A,I.next_in=0,I.avail_in=I.input.length;;){for(0===I.avail_out&&(I.output=new Uint8Array(g),I.next_out=0,I.avail_out=g),(t=GA.inflate(I,i))===bA&&n&&((t=GA.inflateSetDictionary(I,n))===UA?t=GA.inflate(I,i):t===NA&&(t=bA));I.avail_in>0&&t===LA&&I.state.wrap>0&&0!==A[I.next_in];)GA.inflateReset(I),t=GA.inflate(I,i);switch(t){case MA:case NA:case bA:case xA:return this.onEnd(t),this.ended=!0,!1}if(r=I.avail_out,I.next_out&&(0===I.avail_out||t===LA))if("string"===this.options.to){var a=W(I.output,I.next_out),o=I.next_out-a,B=j(I.output,a);I.next_out=o,I.avail_out=g-o,o&&I.output.set(I.output.subarray(a,a+o),0),this.onData(B)}else this.onData(I.output.length===I.next_out?I.output:I.output.subarray(0,I.next_out));if(t!==UA||0!==r){if(t===LA)return t=GA.inflateEnd(this.strm),this.onEnd(t),this.ended=!0,!0;if(0===I.avail_in)break}}return!0},JA.prototype.onData=function(A){this.chunks.push(A)},JA.prototype.onEnd=function(A){A===UA&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=T(this.chunks)),this.chunks=[],this.err=A,this.msg=this.strm.msg};var YA={Inflate:JA,inflate:qA,inflateRaw:function(A,e){return(e=e||{}).raw=!0,qA(A,e)},ungzip:qA,constants:H}.inflate;function KA(A){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var HA=function(A){s(t,w);var e=KA(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:"decodeBlock",value:function(A){return YA(new Uint8Array(A)).buffer}}]),t}(),OA=Object.freeze({__proto__:null,default:HA});function PA(A){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var TA,VA=function(A){s(t,w);var e=PA(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:"decodeBlock",value:function(A){for(var e=new DataView(A),t=[],i=0;i>3],m<<=7&G),c=0;c>3]),128&m?(a&&(a[G]=1),f=f>(g=S.encoding<2?y[k++]:p)?g:f,n[G++]=g):(a&&(a[G]=0),n[G++]=i),m<<=1;G+=F}else if(S.encoding<2)for(h=0;h(g=y[k++])?g:f,n[G++]=g;G+=F}else for(f=f>p?p:f,h=0;h0){var g=new Uint8Array(Math.ceil(i.width*i.height/8)),n=(I=new DataView(A,e,i.mask.numBytes)).getInt16(0,!0),a=2,o=0;do{if(n>0)for(;n--;)g[o++]=I.getUint8(a++);else{var B=I.getUint8(a++);for(n=-n;n--;)g[o++]=B}n=I.getInt16(a,!0),a+=2}while(a0?1:0),s=Q+(i.height%Q>0?1:0);i.pixels.blocks=new Array(E*s);for(var f=0,c=0;c3)throw"Invalid block encoding ("+w.encoding+")";if(2!==w.encoding){if(0!==d&&2!==d){if(d>>=6,w.offsetType=d,2===d)w.offset=I.getInt8(1),l++;else if(1===d)w.offset=I.getInt16(1,!0),l+=2;else{if(0!==d)throw"Invalid block offset type";w.offset=I.getFloat32(1,!0),l+=4}if(1===w.encoding)if(d=I.getUint8(l),l++,w.bitsPerPixel=63&d,d>>=6,w.numValidPixelsType=d,2===d)w.numValidPixels=I.getUint8(l),l++;else if(1===d)w.numValidPixels=I.getUint16(l,!0),l+=2;else{if(0!==d)throw"Invalid valid pixel count type";w.numValidPixels=I.getUint32(l,!0),l+=4}}var D;if(e+=l,3!==w.encoding)if(0===w.encoding){var y=(i.pixels.numBytes-1)/4;if(y!==Math.floor(y))throw"uncompressed block has invalid length";D=new ArrayBuffer(4*y),new Uint8Array(D).set(new Uint8Array(A,e,4*y));var k=new Float32Array(D);w.rawData=k,e+=4*y}else if(1===w.encoding){var p=Math.ceil(w.numValidPixels*w.bitsPerPixel/8),m=Math.ceil(p/4);D=new ArrayBuffer(4*m),new Uint8Array(D).set(new Uint8Array(A,e,p)),w.stuffedData=new Uint32Array(D),e+=p}}else e++}return i.eofOffset=e,i},I=function(A,e,t,i,r,I,g){var n,a,o,B=(1<=e)a=o>>>Q-e&B,Q-=e;else{var f=e-Q;a=(o&B)<>>(Q=32-f)}I[n]=a=t?(o=B>>>f-t&E,f-=t):(o=(B&E)<<(C=t-f)&E,o+=(B=A[s++])>>>(f=32-C)),e[a]=r[o];else for(Q=Math.ceil((n-I)/g),a=0;a=t?(o=B>>>f-t&E,f-=t):(o=(B&E)<<(C=t-f)&E,o+=(B=A[s++])>>>(f=32-C)),e[a]=o=e?(Q=g>>>C-e&n,C-=e):(Q=(g&n)<<(B=e-C)&n,Q+=(g=A[a++])>>>(C=32-B)),E[o]=Q=t?(o=B>>>f&Q,s-=t,f+=t):(o=B>>>f&Q,s=32-(C=t-s),o|=((B=A[E++])&(1<=t?(o=B>>>f&Q,s-=t,f+=t):(o=B>>>f&Q,s=32-(C=t-s),o|=((B=A[E++])&(1<=e?(Q=g>>>E&n,C-=e,E+=e):(Q=g>>>E&n,C=32-(B=e-C),Q|=((g=A[a++])&(1<=t?(I=g>>>B-t&a,B-=t):(I=(g&a)<<(n=t-B)&a,I+=(g=A[o++])>>>(B=32-n)),e[r]=I;return e},C=function(A,e,t,i){var r,I,g,n,a=(1<=t?(I=g>>>C&a,B-=t,C+=t):(I=g>>>C&a,B=32-(n=t-B),I|=((g=A[o++])&(1<=359?359:r;r-=g;do{e+=A[I++]<<8,t+=e+=A[I++]}while(--g);e=(65535&e)+(e>>>16),t=(65535&t)+(t>>>16)}return 1&i&&(t+=e+=A[I]<<8),((t=(65535&t)+(t>>>16))<<16|(e=(65535&e)+(e>>>16)))>>>0},readHeaderInfo:function(A,e){var t=e.ptr,i=new Uint8Array(A,t,6),r={};if(r.fileIdentifierString=String.fromCharCode.apply(null,i),0!==r.fileIdentifierString.lastIndexOf("Lerc2",0))throw"Unexpected file identifier string (expect Lerc2 ): "+r.fileIdentifierString;t+=6;var I,g=new DataView(A,t,8),n=g.getInt32(0,!0);if(r.fileVersion=n,t+=4,n>=3&&(r.checksum=g.getUint32(4,!0),t+=4),g=new DataView(A,t,12),r.height=g.getUint32(0,!0),r.width=g.getUint32(4,!0),t+=8,n>=4?(r.numDims=g.getUint32(8,!0),t+=4):r.numDims=1,g=new DataView(A,t,40),r.numValidPixel=g.getUint32(0,!0),r.microBlockSize=g.getInt32(4,!0),r.blobSize=g.getInt32(8,!0),r.imageType=g.getInt32(12,!0),r.maxZError=g.getFloat64(16,!0),r.zMin=g.getFloat64(24,!0),r.zMax=g.getFloat64(32,!0),t+=40,e.headerInfo=r,e.ptr=t,n>=3&&(I=n>=4?52:48,this.computeChecksumFletcher32(new Uint8Array(A,t-I,r.blobSize-14))!==r.checksum))throw"Checksum failed.";return!0},checkMinMaxRanges:function(A,e){var t=e.headerInfo,i=this.getDataTypeArray(t.imageType),r=t.numDims*this.getDataTypeSize(t.imageType),I=this.readSubArray(A,e.ptr,i,r),g=this.readSubArray(A,e.ptr+r,i,r);e.ptr+=2*r;var n,a=!0;for(n=0;n0){t=new Uint8Array(Math.ceil(g/8));var B=(a=new DataView(A,r,o.numBytes)).getInt16(0,!0),C=2,Q=0,E=0;do{if(B>0)for(;B--;)t[Q++]=a.getUint8(C++);else for(E=a.getUint8(C++),B=-B;B--;)t[Q++]=E;B=a.getInt16(C,!0),C+=2}while(C>3],s<<=7&f):s=t[f>>3],128&s&&(i[f]=1);e.pixels.resultMask=i,o.bitset=t,r+=o.numBytes}return e.ptr=r,e.mask=o,!0},readDataOneSweep:function(A,e,t,i){var r,I=e.ptr,g=e.headerInfo,n=g.numDims,a=g.width*g.height,o=g.imageType,B=g.numValidPixel*Q.getDataTypeSize(o)*n,C=e.pixels.resultMask;if(t===Uint8Array)r=new Uint8Array(A,I,B);else{var E=new ArrayBuffer(B);new Uint8Array(E).set(new Uint8Array(A,I,B)),r=new t(E)}if(r.length===a*n)e.pixels.resultPixels=i?Q.swapDimensionOrder(r,a,n,t,!0):r;else{e.pixels.resultPixels=new t(a*n);var s=0,f=0,c=0,h=0;if(n>1){if(i){for(f=0;f=g)return!1;var n=new Uint32Array(g-I);Q.decodeBits(A,e,n);var a,o,B,C,s=[];for(a=I;a0&&(s[o].second=l<>>32-C,32-w>=C?32===(w+=C)&&(w=0,l=u[++d]):(w+=C-32,l=u[++d],s[o].second|=l>>>32-w));var D=0,y=0,k=new E;for(a=0;a=t?t:D;var p,m,G,F,S,v=[];for(a=I;a0)if(p=[C,o],C<=y)for(m=s[o].second<=0;F--)m>>>F&1?(S.right||(S.right=new E),S=S.right):(S.left||(S.left=new E),S=S.left),0!==F||S.val||(S.val=p[1]);return{decodeLut:v,numBitsLUTQick:y,numBitsLUT:D,tree:k,stuffedData:u,srcPtr:d,bitPos:w}},readHuffman:function(A,e,t,i){var r,I,g,n,a,o,B,C,E,s=e.headerInfo.numDims,f=e.headerInfo.height,c=e.headerInfo.width,h=c*f,l=this.readHuffmanTree(A,e),u=l.decodeLut,w=l.tree,d=l.stuffedData,D=l.srcPtr,y=l.bitPos,k=l.numBitsLUTQick,p=l.numBitsLUT,m=0===e.headerInfo.imageType?128:0,G=e.pixels.resultMask,F=0;y>0&&(D++,y=0);var S,v=d[D],R=1===e.encodeMode,U=new t(h*s),L=U;if(s<2||R){for(S=0;S1&&(L=new t(U.buffer,h*S,h),F=0),e.headerInfo.numValidPixel===c*f)for(C=0,o=0;o>>32-k,32-y>>64-y-k),u[a])I=u[a][1],y+=u[a][0];else for(a=n=v<>>32-p,32-y>>64-y-p),r=w,E=0;E>>p-E-1&1?r.right:r.left).left&&!r.right){I=r.val,y=y+E+1;break}y>=32&&(y-=32,v=d[++D]),g=I-m,R?(g+=B>0?F:o>0?L[C-c]:F,g&=255,L[C]=g,F=g):L[C]=g}else for(C=0,o=0;o>>32-k,32-y>>64-y-k),u[a])I=u[a][1],y+=u[a][0];else for(a=n=v<>>32-p,32-y>>64-y-p),r=w,E=0;E>>p-E-1&1?r.right:r.left).left&&!r.right){I=r.val,y=y+E+1;break}y>=32&&(y-=32,v=d[++D]),g=I-m,R?(B>0&&G[C-1]?g+=F:o>0&&G[C-c]?g+=L[C-c]:g+=F,g&=255,L[C]=g,F=g):L[C]=g}}else for(C=0,o=0;o>>32-k,32-y>>64-y-k),u[a])I=u[a][1],y+=u[a][0];else for(a=n=v<>>32-p,32-y>>64-y-p),r=w,E=0;E>>p-E-1&1?r.right:r.left).left&&!r.right){I=r.val,y=y+E+1;break}y>=32&&(y-=32,v=d[++D]),g=I-m,L[C]=g}e.ptr=e.ptr+4*(D+1)+(y>0?4:0),e.pixels.resultPixels=U,s>1&&!i&&(e.pixels.resultPixels=Q.swapDimensionOrder(U,h,s,t))},decodeBits:function(A,e,t,i,r){var I=e.headerInfo,Q=I.fileVersion,E=0,s=A.byteLength-e.ptr>=5?5:A.byteLength-e.ptr,f=new DataView(A,e.ptr,s),c=f.getUint8(0);E++;var h=c>>6,l=0===h?4:3-h,u=(32&c)>0,w=31&c,d=0;if(1===l)d=f.getUint8(E),E++;else if(2===l)d=f.getUint16(E,!0),E+=2;else{if(4!==l)throw"Invalid valid pixel count type";d=f.getUint32(E,!0),E+=4}var D,y,k,p,m,G,F,S,v,R=2*I.maxZError,U=I.numDims>1?I.maxValues[r]:I.zMax;if(u){for(e.counter.lut++,S=f.getUint8(E),E++,p=Math.ceil((S-1)*w/8),m=Math.ceil(p/4),y=new ArrayBuffer(4*m),k=new Uint8Array(y),e.ptr+=E,k.set(new Uint8Array(A,e.ptr,p)),F=new Uint32Array(y),e.ptr+=p,v=0;S-1>>>v;)v++;p=Math.ceil(d*v/8),m=Math.ceil(p/4),y=new ArrayBuffer(4*m),(k=new Uint8Array(y)).set(new Uint8Array(A,e.ptr,p)),D=new Uint32Array(y),e.ptr+=p,G=Q>=3?o(F,w,S-1,i,R,U):n(F,w,S-1,i,R,U),Q>=3?a(D,t,v,d,G):g(D,t,v,d,G)}else e.counter.bitstuffer++,v=w,e.ptr+=E,v>0&&(p=Math.ceil(d*v/8),m=Math.ceil(p/4),y=new ArrayBuffer(4*m),(k=new Uint8Array(y)).set(new Uint8Array(A,e.ptr,p)),D=new Uint32Array(y),e.ptr+=p,Q>=3?null==i?C(D,t,v,d):a(D,t,v,d,!1,i,R,U):null==i?B(D,t,v,d):g(D,t,v,d,!1,i,R,U))},readTiles:function(A,e,t,i){var r=e.headerInfo,I=r.width,g=r.height,n=I*g,a=r.microBlockSize,o=r.imageType,B=Q.getDataTypeSize(o),C=Math.ceil(I/a),E=Math.ceil(g/a);e.pixels.numBlocksY=E,e.pixels.numBlocksX=C,e.pixels.ptr=0;var s,f,c,h,l,u,w,d,D,y,k=0,p=0,m=0,G=0,F=0,S=0,v=0,R=0,U=0,L=0,b=0,M=0,N=0,x=0,J=0,q=new t(a*a),Y=g%a||a,K=I%a||a,H=r.numDims,O=e.pixels.resultMask,P=e.pixels.resultPixels,T=r.fileVersion>=5?14:15,V=r.zMax;for(m=0;m1?(y=P,L=m*I*a+G*a,P=new t(e.pixels.resultPixels.buffer,n*d*B,n),V=r.maxValues[d]):y=null,v=A.byteLength-e.ptr,f={},J=0,R=(s=new DataView(A,e.ptr,Math.min(10,v))).getUint8(0),J++,D=r.fileVersion>=5?4&R:0,U=R>>6&255,(R>>2&T)!=(G*a>>3&T))throw"integrity issue";if(D&&0===d)throw"integrity issue";if((l=3&R)>3)throw e.ptr+=J,"Invalid block encoding ("+l+")";if(2!==l)if(0===l){if(D)throw"integrity issue";if(e.counter.uncompressed++,e.ptr+=J,M=(M=F*S*B)<(N=A.byteLength-e.ptr)?M:N,c=new ArrayBuffer(M%B==0?M:M+B-M%B),new Uint8Array(c).set(new Uint8Array(A,e.ptr,M)),h=new t(c),x=0,O)for(k=0;k1&&!i&&(e.pixels.resultPixels=Q.swapDimensionOrder(e.pixels.resultPixels,n,H,t))},formatFileInfo:function(A){return{fileIdentifierString:A.headerInfo.fileIdentifierString,fileVersion:A.headerInfo.fileVersion,imageType:A.headerInfo.imageType,height:A.headerInfo.height,width:A.headerInfo.width,numValidPixel:A.headerInfo.numValidPixel,microBlockSize:A.headerInfo.microBlockSize,blobSize:A.headerInfo.blobSize,maxZError:A.headerInfo.maxZError,pixelType:Q.getPixelType(A.headerInfo.imageType),eofOffset:A.eofOffset,mask:A.mask?{numBytes:A.mask.numBytes}:null,pixels:{numBlocksX:A.pixels.numBlocksX,numBlocksY:A.pixels.numBlocksY,maxValue:A.headerInfo.zMax,minValue:A.headerInfo.zMin,noDataValue:A.noDataValue}}},constructConstantSurface:function(A,e){var t=A.headerInfo.zMax,i=A.headerInfo.zMin,r=A.headerInfo.maxValues,I=A.headerInfo.numDims,g=A.headerInfo.height*A.headerInfo.width,n=0,a=0,o=0,B=A.pixels.resultMask,C=A.pixels.resultPixels;if(B)if(I>1){if(e)for(n=0;n1&&i!==t)if(e)for(n=0;n=-128&&e<=127;break;case 1:t=e>=0&&e<=255;break;case 2:t=e>=-32768&&e<=32767;break;case 3:t=e>=0&&e<=65536;break;case 4:t=e>=-2147483648&&e<=2147483647;break;case 5:t=e>=0&&e<=4294967296;break;case 6:t=e>=-34027999387901484e22&&e<=34027999387901484e22;break;case 7:t=e>=-17976931348623157e292&&e<=17976931348623157e292;break;default:t=!1}return t},getDataTypeSize:function(A){var e=0;switch(A){case 0:case 1:e=1;break;case 2:case 3:e=2;break;case 4:case 5:case 6:e=4;break;case 7:e=8;break;default:e=A}return e},getDataTypeUsed:function(A,e){var t=A;switch(A){case 2:case 4:t=A-e;break;case 3:case 5:t=A-2*e;break;case 6:t=0===e?A:1===e?2:1;break;case 7:t=0===e?A:A-2*e+1;break;default:t=A}return t},getOnePixel:function(A,e,t,i){var r=0;switch(t){case 0:r=i.getInt8(e);break;case 1:r=i.getUint8(e);break;case 2:r=i.getInt16(e,!0);break;case 3:r=i.getUint16(e,!0);break;case 4:r=i.getInt32(e,!0);break;case 5:r=i.getUInt32(e,!0);break;case 6:r=i.getFloat32(e,!0);break;case 7:r=i.getFloat64(e,!0);break;default:throw"the decoder does not understand this pixel type"}return r},swapDimensionOrder:function(A,e,t,i,r){var I=0,g=0,n=0,a=0,o=A;if(t>1)if(o=new i(e*t),r)for(I=0;I5)throw"unsupported lerc version 2."+g;Q.readMask(A,r),I.numValidPixel===I.width*I.height||r.pixels.resultMask||(r.pixels.resultMask=e.maskData);var a=I.width*I.height;r.pixels.resultPixels=new n(a*I.numDims),r.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0};var o,B=!e.returnPixelInterleavedDims;if(0!==I.numValidPixel)if(I.zMax===I.zMin)Q.constructConstantSurface(r,B);else if(g>=4&&Q.checkMinMaxRanges(A,r))Q.constructConstantSurface(r,B);else{var C=new DataView(A,r.ptr,2),E=C.getUint8(0);if(r.ptr++,E)Q.readDataOneSweep(A,r,n,B);else if(g>1&&I.imageType<=1&&Math.abs(I.maxZError-.5)<1e-5){var s=C.getUint8(1);if(r.ptr++,r.encodeMode=s,s>2||g<4&&s>1)throw"Invalid Huffman flag "+s;s?Q.readHuffman(A,r,n,B):Q.readTiles(A,r,n,B)}else Q.readTiles(A,r,n,B)}r.eofOffset=r.ptr,e.inputOffset?(o=r.headerInfo.blobSize+e.inputOffset-r.ptr,Math.abs(o)>=1&&(r.eofOffset=e.inputOffset+r.headerInfo.blobSize)):(o=r.headerInfo.blobSize-r.ptr,Math.abs(o)>=1&&(r.eofOffset=r.headerInfo.blobSize));var f={width:I.width,height:I.height,pixelData:r.pixels.resultPixels,minValue:I.zMin,maxValue:I.zMax,validPixelCount:I.numValidPixel,dimCount:I.numDims,dimStats:{minValues:I.minValues,maxValues:I.maxValues},maskData:r.pixels.resultMask};if(r.pixels.resultMask&&Q.isValidPixelValue(I.imageType,t)){var c=r.pixels.resultMask;for(i=0;i1&&(o&&f.push(o),d.fileInfo.mask&&d.fileInfo.mask.numBytes>0&&w++),E++,u.pixels.push(d.pixelData),u.statistics.push({minValue:d.minValue,maxValue:d.maxValue,noDataValue:d.noDataValue,dimStats:d.dimStats})}if(i>1&&w>1){for(Q=u.width*u.height,u.bandMasks=f,(o=new Uint8Array(Q)).set(f[0]),B=1;B1&&void 0!==arguments[1]?arguments[1]:0;if(!jA)throw new Error("ZSTDDecoder: Await .init() before decoding.");var t=A.byteLength,i=jA.exports.malloc(t);WA.set(A,i),e=e||Number(jA.exports.ZSTD_findDecompressedSize(i,t));var r=jA.exports.malloc(e),I=jA.exports.ZSTD_decompress(r,e,i,t),g=WA.slice(r,r+I);return jA.exports.free(i),jA.exports.free(r),g}}]),A}(),ee="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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQhBSAGQQR2IQRBICAAdCIAQQFyIQkgASgCACEPQQAhAiADIQYCQANAIAlBAkggAiAPS3JFBEAgAiEHAkAgCARAA0AgBEH//wNxQf//A0YEQCAHQRhqIQcgBiAQSQR/IAZBAmoiBigAACAFdgUgBUEQaiEFIARBEHYLIQQMAQsLA0AgBEEDcSIIQQNGBEAgBUECaiEFIARBAnYhBCAHQQNqIQcMAQsLIAcgCGoiByAPSw0EIAVBAmohBQNAIAIgB0kEQCANIAJBAXRqQQA7AQAgAkEBaiECDAELCyAGIA5LQQAgBiAFQQN1aiIHIAxLG0UEQCAHKAAAIAVBB3EiBXYhBAwCCyAEQQJ2IQQLIAYhBwsCfyALQX9qIAQgAEF/anEiBiAAQQF0QX9qIgggCWsiEUkNABogBCAIcSIEQQAgESAEIABIG2shBiALCyEIIA0gAkEBdGogBkF/aiIEOwEAIAlBASAGayAEIAZBAUgbayEJA0AgCSAASARAIABBAXUhACALQX9qIQsMAQsLAn8gByAOS0EAIAcgBSAIaiIFQQN1aiIGIAxLG0UEQCAFQQdxDAELIAUgDCIGIAdrQQN0awshBSACQQFqIQIgBEUhCCAGKAAAIAVBH3F2IQQMAQsLQWwgCUEBRyAFQSBKcg0BGiABIAJBf2o2AgAgBiAFQQdqQQN1aiADawwBC0FQCyEAIApBEGokACAACwkAQQFBBSAAGwsMACAAIAEoAAA2AAALqgMBCn8jAEHwAGsiCiQAIAJBAWohDiAAQQhqIQtBgIAEIAVBf2p0QRB1IQxBACECQQEhBkEBIAV0IglBf2oiDyEIA0AgAiAORkUEQAJAIAEgAkEBdCINai8BACIHQf//A0YEQCALIAhBA3RqIAI2AgQgCEF/aiEIQQEhBwwBCyAGQQAgDCAHQRB0QRB1ShshBgsgCiANaiAHOwEAIAJBAWohAgwBCwsgACAFNgIEIAAgBjYCACAJQQN2IAlBAXZqQQNqIQxBACEAQQAhBkEAIQIDQCAGIA5GBEADQAJAIAAgCUYNACAKIAsgAEEDdGoiASgCBCIGQQF0aiICIAIvAQAiAkEBajsBACABIAUgAhAUayIIOgADIAEgAiAIQf8BcXQgCWs7AQAgASAEIAZBAnQiAmooAgA6AAIgASACIANqKAIANgIEIABBAWohAAwBCwsFIAEgBkEBdGouAQAhDUEAIQcDQCAHIA1ORQRAIAsgAkEDdGogBjYCBANAIAIgDGogD3EiAiAISw0ACyAHQQFqIQcMAQsLIAZBAWohBgwBCwsgCkHwAGokAAsjAEIAIAEQCSAAhUKHla+vmLbem55/fkLj3MqV/M7y9YV/fAsQACAAQn43AwggACABNgIACyQBAX8gAARAIAEoAgQiAgRAIAEoAgggACACEQEADwsgABAmCwsfACAAIAEgAi8BABAINgIAIAEQBBogACACQQRqNgIEC0oBAX9BoCAoAgAiASAAaiIAQX9MBEBBiCBBMDYCAEF/DwsCQCAAPwBBEHRNDQAgABBmDQBBiCBBMDYCAEF/DwtBoCAgADYCACABC9cBAQh/Qbp/IQoCQCACKAIEIgggAigCACIJaiIOIAEgAGtLDQBBbCEKIAkgBCADKAIAIgtrSw0AIAAgCWoiBCACKAIIIgxrIQ0gACABQWBqIg8gCyAJQQAQKSADIAkgC2o2AgACQAJAIAwgBCAFa00EQCANIQUMAQsgDCAEIAZrSw0CIAcgDSAFayIAaiIBIAhqIAdNBEAgBCABIAgQDxoMAgsgBCABQQAgAGsQDyEBIAIgACAIaiIINgIEIAEgAGshBAsgBCAPIAUgCEEBECkLIA4hCgsgCgubAgEBfyMAQYABayINJAAgDSADNgJ8AkAgAkEDSwRAQX8hCQwBCwJAAkACQAJAIAJBAWsOAwADAgELIAZFBEBBuH8hCQwEC0FsIQkgBS0AACICIANLDQMgACAHIAJBAnQiAmooAgAgAiAIaigCABA7IAEgADYCAEEBIQkMAwsgASAJNgIAQQAhCQwCCyAKRQRAQWwhCQwCC0EAIQkgC0UgDEEZSHINAUEIIAR0QQhqIQBBACECA0AgAiAATw0CIAJBQGshAgwAAAsAC0FsIQkgDSANQfwAaiANQfgAaiAFIAYQFSICEAMNACANKAJ4IgMgBEsNACAAIA0gDSgCfCAHIAggAxAYIAEgADYCACACIQkLIA1BgAFqJAAgCQsLACAAIAEgAhALGgsQACAALwAAIAAtAAJBEHRyCy8AAn9BuH8gAUEISQ0AGkFyIAAoAAQiAEF3Sw0AGkG4fyAAQQhqIgAgACABSxsLCwkAIAAgATsAAAsDAAELigYBBX8gACAAKAIAIgVBfnE2AgBBACAAIAVBAXZqQYQgKAIAIgQgAEYbIQECQAJAIAAoAgQiAkUNACACKAIAIgNBAXENACACQQhqIgUgA0EBdkF4aiIDQQggA0EISxtnQR9zQQJ0QYAfaiIDKAIARgRAIAMgAigCDDYCAAsgAigCCCIDBEAgAyACKAIMNgIECyACKAIMIgMEQCADIAIoAgg2AgALIAIgAigCACAAKAIAQX5xajYCAEGEICEAAkACQCABRQ0AIAEgAjYCBCABKAIAIgNBAXENASADQQF2QXhqIgNBCCADQQhLG2dBH3NBAnRBgB9qIgMoAgAgAUEIakYEQCADIAEoAgw2AgALIAEoAggiAwRAIAMgASgCDDYCBAsgASgCDCIDBEAgAyABKAIINgIAQYQgKAIAIQQLIAIgAigCACABKAIAQX5xajYCACABIARGDQAgASABKAIAQQF2akEEaiEACyAAIAI2AgALIAIoAgBBAXZBeGoiAEEIIABBCEsbZ0Efc0ECdEGAH2oiASgCACEAIAEgBTYCACACIAA2AgwgAkEANgIIIABFDQEgACAFNgIADwsCQCABRQ0AIAEoAgAiAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAigCACABQQhqRgRAIAIgASgCDDYCAAsgASgCCCICBEAgAiABKAIMNgIECyABKAIMIgIEQCACIAEoAgg2AgBBhCAoAgAhBAsgACAAKAIAIAEoAgBBfnFqIgI2AgACQCABIARHBEAgASABKAIAQQF2aiAANgIEIAAoAgAhAgwBC0GEICAANgIACyACQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgIoAgAhASACIABBCGoiAjYCACAAIAE2AgwgAEEANgIIIAFFDQEgASACNgIADwsgBUEBdkF4aiIBQQggAUEISxtnQR9zQQJ0QYAfaiICKAIAIQEgAiAAQQhqIgI2AgAgACABNgIMIABBADYCCCABRQ0AIAEgAjYCAAsLDgAgAARAIABBeGoQJQsLgAIBA38CQCAAQQ9qQXhxQYQgKAIAKAIAQQF2ayICEB1Bf0YNAAJAQYQgKAIAIgAoAgAiAUEBcQ0AIAFBAXZBeGoiAUEIIAFBCEsbZ0Efc0ECdEGAH2oiASgCACAAQQhqRgRAIAEgACgCDDYCAAsgACgCCCIBBEAgASAAKAIMNgIECyAAKAIMIgFFDQAgASAAKAIINgIAC0EBIQEgACAAKAIAIAJBAXRqIgI2AgAgAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAygCACECIAMgAEEIaiIDNgIAIAAgAjYCDCAAQQA2AgggAkUNACACIAM2AgALIAELtwIBA38CQAJAIABBASAAGyICEDgiAA0AAkACQEGEICgCACIARQ0AIAAoAgAiA0EBcQ0AIAAgA0EBcjYCACADQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgAgAEEIakYEQCABIAAoAgw2AgALIAAoAggiAQRAIAEgACgCDDYCBAsgACgCDCIBBEAgASAAKAIINgIACyACECchAkEAIQFBhCAoAgAhACACDQEgACAAKAIAQX5xNgIAQQAPCyACQQ9qQXhxIgMQHSICQX9GDQIgAkEHakF4cSIAIAJHBEAgACACaxAdQX9GDQMLAkBBhCAoAgAiAUUEQEGAICAANgIADAELIAAgATYCBAtBhCAgADYCACAAIANBAXRBAXI2AgAMAQsgAEUNAQsgAEEIaiEBCyABC7kDAQJ/IAAgA2ohBQJAIANBB0wEQANAIAAgBU8NAiAAIAItAAA6AAAgAEEBaiEAIAJBAWohAgwAAAsACyAEQQFGBEACQCAAIAJrIgZBB00EQCAAIAItAAA6AAAgACACLQABOgABIAAgAi0AAjoAAiAAIAItAAM6AAMgAEEEaiACIAZBAnQiBkHAHmooAgBqIgIQFyACIAZB4B5qKAIAayECDAELIAAgAhAMCyACQQhqIQIgAEEIaiEACwJAAkACQAJAIAUgAU0EQCAAIANqIQEgBEEBRyAAIAJrQQ9Kcg0BA0AgACACEAwgAkEIaiECIABBCGoiACABSQ0ACwwFCyAAIAFLBEAgACEBDAQLIARBAUcgACACa0EPSnINASAAIQMgAiEEA0AgAyAEEAwgBEEIaiEEIANBCGoiAyABSQ0ACwwCCwNAIAAgAhAHIAJBEGohAiAAQRBqIgAgAUkNAAsMAwsgACEDIAIhBANAIAMgBBAHIARBEGohBCADQRBqIgMgAUkNAAsLIAIgASAAa2ohAgsDQCABIAVPDQEgASACLQAAOgAAIAFBAWohASACQQFqIQIMAAALAAsLQQECfyAAIAAoArjgASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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",te={315:"Artist",258:"BitsPerSample",265:"CellLength",264:"CellWidth",320:"ColorMap",259:"Compression",33432:"Copyright",306:"DateTime",338:"ExtraSamples",266:"FillOrder",289:"FreeByteCounts",288:"FreeOffsets",291:"GrayResponseCurve",290:"GrayResponseUnit",316:"HostComputer",270:"ImageDescription",257:"ImageLength",256:"ImageWidth",271:"Make",281:"MaxSampleValue",280:"MinSampleValue",272:"Model",254:"NewSubfileType",274:"Orientation",262:"PhotometricInterpretation",284:"PlanarConfiguration",296:"ResolutionUnit",278:"RowsPerStrip",277:"SamplesPerPixel",305:"Software",279:"StripByteCounts",273:"StripOffsets",255:"SubfileType",263:"Threshholding",282:"XResolution",283:"YResolution",326:"BadFaxLines",327:"CleanFaxData",343:"ClipPath",328:"ConsecutiveBadFaxLines",433:"Decode",434:"DefaultImageColor",269:"DocumentName",336:"DotRange",321:"HalftoneHints",346:"Indexed",347:"JPEGTables",285:"PageName",297:"PageNumber",317:"Predictor",319:"PrimaryChromaticities",532:"ReferenceBlackWhite",339:"SampleFormat",340:"SMinSampleValue",341:"SMaxSampleValue",559:"StripRowCounts",330:"SubIFDs",292:"T4Options",293:"T6Options",325:"TileByteCounts",323:"TileLength",324:"TileOffsets",322:"TileWidth",301:"TransferFunction",318:"WhitePoint",344:"XClipPathUnits",286:"XPosition",529:"YCbCrCoefficients",531:"YCbCrPositioning",530:"YCbCrSubSampling",345:"YClipPathUnits",287:"YPosition",37378:"ApertureValue",40961:"ColorSpace",36868:"DateTimeDigitized",36867:"DateTimeOriginal",34665:"Exif IFD",36864:"ExifVersion",33434:"ExposureTime",41728:"FileSource",37385:"Flash",40960:"FlashpixVersion",33437:"FNumber",42016:"ImageUniqueID",37384:"LightSource",37500:"MakerNote",37377:"ShutterSpeedValue",37510:"UserComment",33723:"IPTC",34675:"ICC Profile",700:"XMP",42112:"GDAL_METADATA",42113:"GDAL_NODATA",34377:"Photoshop",33550:"ModelPixelScale",33922:"ModelTiepoint",34264:"ModelTransformation",34735:"GeoKeyDirectory",34736:"GeoDoubleParams",34737:"GeoAsciiParams",50674:"LercParameters"},ie={};for(var re in te)te.hasOwnProperty(re)&&(ie[te[re]]=parseInt(re,10));ie.BitsPerSample,ie.ExtraSamples,ie.SampleFormat,ie.StripByteCounts,ie.StripOffsets,ie.StripRowCounts,ie.TileByteCounts,ie.TileOffsets,ie.SubIFDs;var Ie={1:"BYTE",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",6:"SBYTE",7:"UNDEFINED",8:"SSHORT",9:"SLONG",10:"SRATIONAL",11:"FLOAT",12:"DOUBLE",13:"IFD",16:"LONG8",17:"SLONG8",18:"IFD8"},ge={};for(var ne in Ie)Ie.hasOwnProperty(ne)&&(ge[Ie[ne]]=parseInt(ne,10));var ae=1,oe=0,Be=1,Ce=2,Qe={1024:"GTModelTypeGeoKey",1025:"GTRasterTypeGeoKey",1026:"GTCitationGeoKey",2048:"GeographicTypeGeoKey",2049:"GeogCitationGeoKey",2050:"GeogGeodeticDatumGeoKey",2051:"GeogPrimeMeridianGeoKey",2052:"GeogLinearUnitsGeoKey",2053:"GeogLinearUnitSizeGeoKey",2054:"GeogAngularUnitsGeoKey",2055:"GeogAngularUnitSizeGeoKey",2056:"GeogEllipsoidGeoKey",2057:"GeogSemiMajorAxisGeoKey",2058:"GeogSemiMinorAxisGeoKey",2059:"GeogInvFlatteningGeoKey",2060:"GeogAzimuthUnitsGeoKey",2061:"GeogPrimeMeridianLongGeoKey",2062:"GeogTOWGS84GeoKey",3072:"ProjectedCSTypeGeoKey",3073:"PCSCitationGeoKey",3074:"ProjectionGeoKey",3075:"ProjCoordTransGeoKey",3076:"ProjLinearUnitsGeoKey",3077:"ProjLinearUnitSizeGeoKey",3078:"ProjStdParallel1GeoKey",3079:"ProjStdParallel2GeoKey",3080:"ProjNatOriginLongGeoKey",3081:"ProjNatOriginLatGeoKey",3082:"ProjFalseEastingGeoKey",3083:"ProjFalseNorthingGeoKey",3084:"ProjFalseOriginLongGeoKey",3085:"ProjFalseOriginLatGeoKey",3086:"ProjFalseOriginEastingGeoKey",3087:"ProjFalseOriginNorthingGeoKey",3088:"ProjCenterLongGeoKey",3089:"ProjCenterLatGeoKey",3090:"ProjCenterEastingGeoKey",3091:"ProjCenterNorthingGeoKey",3092:"ProjScaleAtNatOriginGeoKey",3093:"ProjScaleAtCenterGeoKey",3094:"ProjAzimuthAngleGeoKey",3095:"ProjStraightVertPoleLongGeoKey",3096:"ProjRectifiedGridAngleGeoKey",4096:"VerticalCSTypeGeoKey",4097:"VerticalCitationGeoKey",4098:"VerticalDatumGeoKey",4099:"VerticalUnitsGeoKey"},Ee={};for(var se in Qe)Qe.hasOwnProperty(se)&&(Ee[Qe[se]]=parseInt(se,10));function fe(A){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var ce=new Ae,he=function(A){s(t,w);var e=fe(t);function t(A){var i;return B(this,t),(i=e.call(this)).planarConfiguration=void 0!==A.PlanarConfiguration?A.PlanarConfiguration:1,i.samplesPerPixel=void 0!==A.SamplesPerPixel?A.SamplesPerPixel:1,i.addCompression=A.LercParameters[ae],i}return Q(t,[{key:"decodeBlock",value:function(A){switch(this.addCompression){case oe:break;case Be:A=YA(new Uint8Array(A)).buffer;break;case Ce:A=ce.decode(new Uint8Array(A)).buffer;break;default:throw new Error("Unsupported LERC additional compression method identifier: ".concat(this.addCompression))}return zA.decode(A,{returnPixelInterleavedDims:1===this.planarConfiguration}).pixels[0].buffer}}]),t}(),le=Object.freeze({__proto__:null,zstd:ce,default:he});function ue(A){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var we=function(A){s(I,w);var t,i=ue(I);function I(){var A;if(B(this,I),A=i.call(this),"undefined"==typeof createImageBitmap)throw new Error("Cannot decode WebImage as `createImageBitmap` is not available");if("undefined"==typeof document&&"undefined"==typeof OffscreenCanvas)throw new Error("Cannot decode WebImage as neither `document` nor `OffscreenCanvas` is not available");return A}return Q(I,[{key:"decode",value:(t=e(r.mark((function A(e,t){var i,I,g,n;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return i=new Blob([t]),A.next=3,createImageBitmap(i);case 3:return I=A.sent,"undefined"!=typeof document?((g=document.createElement("canvas")).width=I.width,g.height=I.height):g=new OffscreenCanvas(I.width,I.height),(n=g.getContext("2d")).drawImage(I,0,0),A.abrupt("return",n.getImageData(0,0,I.width,I.height).data.buffer);case 8:case"end":return A.stop()}}),A)}))),function(A,e){return t.apply(this,arguments)})}]),I}(),de=Object.freeze({__proto__:null,default:we});';return new Pr(typeof Buffer<"u"?"data:application/javascript;base64,"+Buffer.from(o,"binary").toString("base64"):URL.createObjectURL(new Blob([o],{type:"application/javascript"})))}const jr=Object.freeze(Object.defineProperty({__proto__:null,create:Xr},Symbol.toStringTag,{value:"Module"}));export{An as G,Zr as W,gA as _,$r as c,Ce as g}; +//# sourceMappingURL=geotiff-BaoeLn6q.js.map diff --git a/dist/assets/geotiff-BaoeLn6q.js.map b/dist/assets/geotiff-BaoeLn6q.js.map new file mode 100644 index 0000000..bd4c43b --- /dev/null +++ b/dist/assets/geotiff-BaoeLn6q.js.map @@ -0,0 +1 @@ +{"version":3,"mappings":"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","names":["parseStyle","style","bandCount","vertexShader","Attributes","Uniforms","context","newCompilationContext","pipeline","color","expressionToGlsl","ColorType","contrast","NumberType","exposure","saturation","gamma","brightness","uniforms","numVariables","variable","uniformName","uniformNameForVariable","value","getStringNumberEquivalent","uniformDeclarations","name","textureCount","PALETTE_TEXTURE_ARRAY","functionDefintions","fragmentShader","WebGLTileLayer","BaseTileLayer","options","LayerProperty","extent","resolution","source","onChange","max","sources","parsedStyle","WebGLTileLayerRenderer","frameState","layerRenderer","canvas","i","ii","target","viewState","ready","sourceState","altSources","variables","uncurryThis","thisArg","args","ReflectApply","uncurryThisGetter","key","ReflectGetOwnPropertyDescriptor","ReflectGetPrototypeOf","ReflectOwnKeys","SymbolIterator","SymbolToStringTag","NativeObject","ObjectCreate","ObjectDefineProperty","NativeArray","ArrayPrototype","NativeArrayPrototypeSymbolIterator","ArrayPrototypeSymbolIterator","NativeArrayBuffer","ArrayBufferPrototype","NativeSharedArrayBuffer","TypedArray","TypedArrayPrototype","NativeUint8Array","NativeUint16Array","NativeUint32Array","NativeFloat32Array","ArrayIteratorPrototype","ArrayIteratorPrototypeNext","GeneratorPrototypeNext","IteratorPrototype","DataViewPrototype","DataViewPrototypeGetUint16","NativeWeakMap","WeakMapPrototype","WeakMapPrototypeGet","WeakMapPrototypeSet","arrayIterators","SafeIteratorPrototype","arrayIterator","safeIfNeeded","array","safe","generators","DummyArrayIteratorPrototype","generator","buffer","floatView","uint32View","baseTable","shiftTable","e","mantissaTable","m","exponentTable","offsetTable","convertToNumber","float16bits","getFloat16","dataView","byteOffset","opts","getAttribute","tag","attributeName","debug","xml","opening","quotechars","char","pattern","match","getAttributeModule","indexOfMatch","startIndex","indexOfMatchModule","indexOfMatchEnd","indexOfMatchEndModule","countSubstring","string","substring","countSubstringModule","require$$0","require$$1","require$$2","findTagByName","tagName","nested","start","afterStart","relativeEnd","selfClosing","openings","closings","clip","end","outer","inner","findTagByNameModule","findTagsByName","tags","findTagsByNameModule","fieldTagNames","fieldTags","arrayFields","fieldTypeNames","fieldTypes","photometricInterpretations","ExtraSamplesValues","LercParameters","LercAddCompression","geoKeyNames","fromWhiteIsZero","raster","width","height","rgbRaster","j","fromBlackIsZero","fromPalette","colorMap","greenOffset","blueOffset","mapIndex","fromCMYK","cmykRaster","c","y","k","fromYCbCr","yCbCrRaster","cb","cr","Xn","Yn","Zn","fromCIELab","cieLabRaster","L","a_","b_","x","z","r","g","b","registry","addDecoder","cases","importFn","getDecoder","fileDirectory","Decoder","__vitePreload","raw","lzw","jpeg","deflate","packbits","lerc","webimage","copyNewSize","samplesPerPixel","resampleNearest","valueArrays","inWidth","inHeight","outWidth","outHeight","relX","relY","newArray","cy","cx","lerp","v0","v1","t","resampleBilinear","rawY","yl","yh","rawX","tx","xl","xh","ll","hl","lh","hh","resample","method","resampleNearestInterleaved","valueArray","samples","resampleBilinearInterleaved","resampleInterleaved","sum","s","arrayForType","format","bitsPerSample","size","needsNormalization","normalizeArray","inBuffer","planarConfiguration","tileWidth","tileHeight","view","outSize","samplesToTransfer","outArray","bitMask","pixelBitSkip","bitsPerLine","lineBitOffset","pixelBitOffset","bitOffset","outIndex","innerBitOffset","GeoTIFFImage","geoKeys","littleEndian","cache","bytes","sampleIndex","offset","sample","poolOrDecoder","signal","numTilesPerRow","numTilesPerCol","index","tiles","byteCount","slice","request","data","sampleFormat","imageWindow","interleave","resampleMethod","imageWidth","imageHeight","minXTile","maxXTile","minYTile","maxYTile","windowWidth","bytesPerPixel","srcSampleOffsets","sampleReaders","promises","yTile","xTile","getPromise","si","promise","tile","blockHeight","firstLine","firstCol","lastLine","lastCol","reader","ymax","xmax","pixelOffset","windowCoordinate","resampled","wnd","pool","fillValue","imageWindowWidth","imageWindowHeight","numPixels","window","enableAlpha","pi","subOptions","red","green","blue","tiePoints","metadata","items","item","modelTransformation","referenceImage","modelPixelScale","refResX","refResY","refResZ","tilegrid","a","d","f","h","projected","I","J","xs","pt","ys","origin","x1","y1","x2","y2","DataView64","arrayBuffer","left","right","combined","isNegative","carrying","byte","DataSlice","sliceOffset","bigTiff","length","defaultPoolSize","Pool","createWorker","resolve","decoder","module","create","worker","candidate","id","onMessage","CRLFCRLF","itemsToObject","obj","parseHeaders","text","line","kv","str","parseContentType","rawContentType","type","rawParams","paramsItems","param","parseContentRange","rawContentRange","total","parseByteRanges","responseArrayBuffer","boundary","out","startBoundary","endBoundary","innerText","endOfHeaders","headers","startOfData","BaseSource","slices","QuickLRU","maxAge","expiry","deleted","newSize","removeCount","oldCacheSize","callbackFunction","thisArgument","wait","milliseconds","zip","A","B","AbortError","params","CustomAggregateError","errors","message","AggregateError","Block","BlockGroup","blockIds","BlockedSource","blockSize","cacheSize","blockId","block","blockRequests","missingBlockIds","allBlockIds","top","fileSize","firstBlockOffset","current","missingRequests","abortedBlockRequests","abortedBlockIds","blocks","failedBlocks","requiredBlocks","groups","groupRequests","groupIndex","group","response","blockOffset","o","err","sortedBlockIds","lastBlockId","blockIdLow","blockIdHigh","sliceData","sliceView","delta","topDelta","blockInnerOffset","rangeInnerOffset","usedBlockLength","blockView","BaseResponse","headerName","BaseClient","url","FetchResponse","FetchClient","credentials","XHRResponse","xhr","XHRClient","reject","fs","HttpResponse","dataPromise","HttpClient","urlMod","http","resolveData","chunks","chunk","RemoteSource","client","maxRanges","allowFullFile","byteRanges","first","others","maybeWrapInBlockedSource","makeFetchSource","blockOptions","makeXHRSource","makeHttpSource","makeRemoteSource","forceXHR","clientOptions","FileReaderSource","file","blob","event","makeFileReaderSource","decodeRowAcc","row","stride","decodeRowFloatingPoint","bytesPerSample","count","wc","copy","applyPredictor","predictor","BaseDecoder","decoded","isTiled","getFieldTypeLength","fieldType","parseGeoKeyDirectory","rawGeoKeyDirectory","geoKeyDirectory","location","getValues","dataSlice","values","readMethod","fieldTypeLength","ImageFileDirectory","nextIFDByteOffset","GeoTIFFImageIndexError","GeoTIFFBase","resX","resY","bbox","firstImage","usedImage","imageCount","imgBBox","oX","oY","rX","rY","usedBBox","allImages","image","subfileType","newSubfileType","imgResX","imgResY","imageResX","imageResY","GeoTIFF","firstIFDOffset","fallbackSize","entrySize","offsetSize","numDirEntries","byteSize","entryCount","fieldTag","typeCount","fieldValues","valueOffset","actualOffset","fieldDataSlice","previousIfd","ifd","hasNext","detectionString","heuristicAreaSize","metadataSize","fullString","headerData","BOM","magicNumber","MultiGeoTIFF","mainFile","overviewFiles","requests","visited","relativeIndex","imageFile","ifds","fromUrl","fromBlob","fromUrls","mainUrl","overviewUrls","isMask","readRGB","preference","interpretation","interpretations","geotiffGlobals.photometricInterpretations","STATISTICS_MAXIMUM","STATISTICS_MINIMUM","defaultTileSize","workerPool","getWorkerPool","getBoundingBox","getOrigin","getResolutions","getProjection","code","projection","getCachedProjection","units","unitsFromCode","Projection","getImagesForTIFF","tiff","getImagesForSource","tiffFromBlob","tiffFromUrls","tiffFromUrl","assertEqual","expected","got","tolerance","rejector","error","getMinForDataType","getMaxForDataType","GeoTIFFSource","DataTile","numSources","self","logError","firstSource","matrix","multiplyTransform","commonRenderTileSizes","commonSourceTileSizes","resolutions","nodataValues","minZoom","sourceCount","sourceIndex","images","masks","sourceExtent","sourceOrigin","sourceTileSizes","renderTileSizes","sourceResolutions","imageIndex","nodataValue","wantedSamples","level","imageResolutions","sourceTileSize","aspectRatio","getIntersection","resolutionFactor","scaledSourceResolutions","sourceImagery","bands","tileGrid","TileGrid","zoom","viewExtent","makeInverse","createMatrix","transformFn","createTransformFromCoordinateTransform","input","applyMatrix","applyTransform","toUserCoordinate","getCenter","toUserExtent","sourceInfo","pixelBounds","bandNumber","readOptions","maskIndex","mask","sourceSamples","normalize","addAlpha","pixelCount","dataLength","dataIndex","pixelIndex","transparent","min","gain","bias","stats","sourceValue","clamp","nodata","bandIndex","nodataIsNaN","RawDecoder","MIN_BITS","CLEAR_CODE","EOI_CODE","MAX_BYTELENGTH","getByte","position","de","ef","fg","dg","chunk1","chunk2","hi","chunk3","appendReversed","dest","decompress","dictionaryIndex","dictionaryChar","dictionaryLength","byteLength","initDictionary","getNext","addToDictionary","getDictionaryReversed","n","rev","result","oldCode","val","oldVal","LZWDecoder","dctZigZag","dctCos1","dctSin1","dctCos3","dctSin3","dctCos6","dctSin6","dctSqrt2","dctSqrt1d2","buildHuffmanTable","codeLengths","p","q","decodeScan","initialOffset","frame","components","resetInterval","spectralStart","spectralEnd","successivePrev","successive","mcusPerLine","progressive","startOffset","bitsData","bitsCount","readBit","nextByte","decodeHuffman","tree","node","bit","receive","initialLength","receiveAndExtend","decodeBaseline","component","zz","diff","rs","decodeDCFirst","decodeDCSuccessive","eobrun","decodeACFirst","successiveACState","successiveACNextValue","decodeACSuccessive","direction","decodeMcu","decodeFunction","mcu","col","mcuRow","mcuCol","blockRow","blockCol","decodeBlock","componentsLength","decodeFn","marker","mcuExpected","usedResetInterval","v","buildComponentData","lines","blocksPerLine","blocksPerColumn","samplesPerLine","R","quantizeAndInverse","dataOut","dataIn","qt","v2","v3","v4","v5","v6","v7","scanLine","JpegStreamReader","readUint16","readDataBlock","prepareComponents","maxH","maxV","componentId","mcusPerColumn","blocksPerLineForMcu","blocksPerColumnForMcu","fileMarker","appData","quantizationTablesEnd","quantizationTableSpec","tableData","componentsCount","qId","huffmanLength","huffmanTableSpec","codeLengthSum","huffmanValues","selectorsCount","tableSpec","successiveApproximation","processed","frames","cp","componentsOrder","outComponents","oi","JpegDecoder","DeflateDecoder","inflate","PackbitsDecoder","header","next","LercDecode","CntZImage","skipMask","parsedData","parse","noDataValue","uncompressedData","uncompressPixelValues","formatFileInfo","computeUsedBitDepths","TypedArrayClass","maskBitset","storeDecodedMask","blockIdx","numX","numY","blockWidth","scale","minValue","currentValue","resultPixels","resultMask","blockDataBuffer","xx","yy","thisBlockHeight","thisBlockWidth","outPtr","outStride","blockData","blockPtr","constValue","unstuff","maskByte","numBlocks","bitDepths","fp","fileIdView","bitset","cnt","ip","op","numBlocksX","numBlocksY","actualNumBlocksX","actualNumBlocksY","blockI","blockY","blockX","bytesLeft","headerByte","arrayBuf","store8","rawData","dataBytes","dataWords","src","bitsPerPixel","maxValue","bitsLeft","nmax","numInvalidTailBytes","missingBits","Lerc2Decode","BitStuffer","lutArr","bitPos","Lerc2Helpers","sum1","sum2","len","words","tlen","ptr","headerInfo","fileVersion","checksum","keyLength","OutPixelTypeArray","rangeBytes","minValues","maxValues","equal","numBytes","numValidPixel","mb","useBSQForOutputDim","numDims","imageType","nStart","BITS_MAX","version","i0","i1","codeTable","stuffedData","word","srcPtr","numBitsLUT","numBitsLUTQick","TreeNode","decodeLut","entry","numEntries","jj","currentBit","huffmanInfo","valTmp","valTmpQuick","prevVal","deltaEncode","resultPixelsAllDim","iDim","viewByteLength","bits67","doLut","numBits","numElements","lutData","lutBytes","zMax","microBlockSize","dataTypeSize","testCode","bytesleft","blockEncoding","lastBlockHeight","lastBlockWidth","offsetType","fileVersionCheckNum","isDiffEncoding","resultPixelsPrevDim","valMin","tp","isValid","dt","tc","temp","pixels","inputIsBIP","swap","bReadDataOneSweep","flagHuffman","isPlatformLittleEndian","Lerc","encodedData","inputOffset","fileIdentifierString","majorVersion","iPlane","eof","encodedMaskData","bandMasks","bandMask","maskData","decodedPixelBlock","uniqueBandMaskCount","init","instance","heap","IMPORT_OBJECT","ZSTDDecoder","wasm","uncompressedSize","compressedSize","compressedPtr","uncompressedPtr","actualSize","dec","zstd","LercDecoder","WebImageDecoder","imageBitmap","ctx","Worker$1","Worker"],"ignoreList":[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,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"sources":["../../node_modules/ol/layer/WebGLTile.js","../../node_modules/@petamoriken/float16/src/_util/primordials.mjs","../../node_modules/@petamoriken/float16/src/_util/arrayIterator.mjs","../../node_modules/@petamoriken/float16/src/_util/converter.mjs","../../node_modules/@petamoriken/float16/src/DataView.mjs","../../node_modules/xml-utils/get-attribute.js","../../node_modules/xml-utils/index-of-match.js","../../node_modules/xml-utils/index-of-match-end.js","../../node_modules/xml-utils/count-substring.js","../../node_modules/xml-utils/find-tag-by-name.js","../../node_modules/xml-utils/find-tags-by-name.js","../../node_modules/geotiff/dist-module/globals.js","../../node_modules/geotiff/dist-module/rgb.js","../../node_modules/geotiff/dist-module/compression/index.js","../../node_modules/geotiff/dist-module/resample.js","../../node_modules/geotiff/dist-module/geotiffimage.js","../../node_modules/geotiff/dist-module/dataview64.js","../../node_modules/geotiff/dist-module/dataslice.js","../../node_modules/geotiff/dist-module/pool.js","../../node_modules/geotiff/dist-module/source/httputils.js","../../node_modules/geotiff/dist-module/source/basesource.js","../../node_modules/quick-lru/index.js","../../node_modules/geotiff/dist-module/utils.js","../../node_modules/geotiff/dist-module/source/blockedsource.js","../../node_modules/geotiff/dist-module/source/client/base.js","../../node_modules/geotiff/dist-module/source/client/fetch.js","../../node_modules/geotiff/dist-module/source/client/xhr.js","../../__vite-browser-external","../../node_modules/geotiff/dist-module/source/client/http.js","../../node_modules/geotiff/dist-module/source/remote.js","../../node_modules/geotiff/dist-module/source/filereader.js","../../node_modules/geotiff/dist-module/predictor.js","../../node_modules/geotiff/dist-module/compression/basedecoder.js","../../node_modules/geotiff/dist-module/geotiff.js","../../node_modules/ol/source/GeoTIFF.js","../../node_modules/geotiff/dist-module/compression/raw.js","../../node_modules/geotiff/dist-module/compression/lzw.js","../../node_modules/geotiff/dist-module/compression/jpeg.js","../../node_modules/geotiff/dist-module/compression/deflate.js","../../node_modules/geotiff/dist-module/compression/packbits.js","../../node_modules/lerc/LercDecode.js","../../node_modules/zstddec/dist/zstddec.modern.js","../../node_modules/geotiff/dist-module/compression/lerc.js","../../node_modules/geotiff/dist-module/compression/webimage.js","../../node_modules/web-worker/src/browser/index.js","../../node_modules/geotiff/dist-module/worker/decoder.js"],"sourcesContent":["/**\n * @module ol/layer/WebGLTile\n */\nimport {ColorType, NumberType} from '../expr/expression.js';\nimport {\n PALETTE_TEXTURE_ARRAY,\n getStringNumberEquivalent,\n newCompilationContext,\n uniformNameForVariable,\n} from '../expr/gpu.js';\nimport LayerProperty from '../layer/Property.js';\nimport {expressionToGlsl} from '../render/webgl/compileUtil.js';\nimport WebGLTileLayerRenderer, {\n Attributes,\n Uniforms,\n} from '../renderer/webgl/TileLayer.js';\nimport BaseTileLayer from './BaseTile.js';\n\n/**\n * @typedef {import(\"../source/DataTile.js\").default} SourceType\n */\n\n/**\n * @typedef {Object} Style\n * Translates tile data to rendered pixels.\n *\n * @property {Object} [variables] Style variables. Each variable must hold a number or string. These\n * variables can be used in the `color`, `brightness`, `contrast`, `exposure`, `saturation` and `gamma`\n * {@link import(\"../expr/expression.js\").ExpressionValue expressions}, using the `['var', 'varName']` operator.\n * To update style variables, use the {@link import(\"./WebGLTile.js\").default#updateStyleVariables} method.\n * @property {import(\"../expr/expression.js\").ExpressionValue} [color] An expression applied to color values.\n * @property {import(\"../expr/expression.js\").ExpressionValue} [brightness=0] Value used to decrease or increase\n * the layer brightness. Values range from -1 to 1.\n * @property {import(\"../expr/expression.js\").ExpressionValue} [contrast=0] Value used to decrease or increase\n * the layer contrast. Values range from -1 to 1.\n * @property {import(\"../expr/expression.js\").ExpressionValue} [exposure=0] Value used to decrease or increase\n * the layer exposure. Values range from -1 to 1.\n * @property {import(\"../expr/expression.js\").ExpressionValue} [saturation=0] Value used to decrease or increase\n * the layer saturation. Values range from -1 to 1.\n * @property {import(\"../expr/expression.js\").ExpressionValue} [gamma=1] Apply a gamma correction to the layer.\n * Values range from 0 to infinity.\n */\n\n/**\n * @typedef {Object} Options\n * @property {Style} [style] Style to apply to the layer.\n * @property {string} [className='ol-layer'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {number} [preload=0] Preload. Load low-resolution tiles up to `preload` levels. `0`\n * means no preloading.\n * @property {SourceType} [source] Source for this layer.\n * @property {Array|function(import(\"../extent.js\").Extent, number):Array} [sources] Array\n * of sources for this layer. Takes precedence over `source`. Can either be an array of sources, or a function that\n * expects an extent and a resolution (in view projection units per pixel) and returns an array of sources. See\n * {@link module:ol/source.sourcesFromTileGrid} for a helper function to generate sources that are organized in a\n * pyramid following the same pattern as a tile grid. **Note:** All sources must have the same band count and content.\n * @property {import(\"../Map.js\").default} [map] Sets the layer as overlay on a map. The map will not manage\n * this layer in its layers collection, and the layer will be rendered on top. This is useful for\n * temporary layers. The standard way to add a layer to a map and have it managed by the map is to\n * use {@link module:ol/Map~Map#addLayer}.\n * @property {boolean} [useInterimTilesOnError=true] Deprecated. Use interim tiles on error.\n * @property {number} [cacheSize=512] The internal texture cache size. This needs to be large enough to render\n * two zoom levels worth of tiles.\n * @property {Object} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @typedef {Object} ParsedStyle\n * @property {string} vertexShader The vertex shader.\n * @property {string} fragmentShader The fragment shader.\n * @property {Object} uniforms Uniform definitions.\n * @property {Array} paletteTextures Palette textures.\n */\n\n/**\n * @param {Style} style The layer style.\n * @param {number} [bandCount] The number of bands.\n * @return {ParsedStyle} Shaders and uniforms generated from the style.\n */\nfunction parseStyle(style, bandCount) {\n const vertexShader = `\n attribute vec2 ${Attributes.TEXTURE_COORD};\n uniform mat4 ${Uniforms.TILE_TRANSFORM};\n uniform float ${Uniforms.TEXTURE_PIXEL_WIDTH};\n uniform float ${Uniforms.TEXTURE_PIXEL_HEIGHT};\n uniform float ${Uniforms.TEXTURE_RESOLUTION};\n uniform float ${Uniforms.TEXTURE_ORIGIN_X};\n uniform float ${Uniforms.TEXTURE_ORIGIN_Y};\n uniform float ${Uniforms.DEPTH};\n\n varying vec2 v_textureCoord;\n varying vec2 v_mapCoord;\n\n void main() {\n v_textureCoord = ${Attributes.TEXTURE_COORD};\n v_mapCoord = vec2(\n ${Uniforms.TEXTURE_ORIGIN_X} + ${Uniforms.TEXTURE_RESOLUTION} * ${Uniforms.TEXTURE_PIXEL_WIDTH} * v_textureCoord[0],\n ${Uniforms.TEXTURE_ORIGIN_Y} - ${Uniforms.TEXTURE_RESOLUTION} * ${Uniforms.TEXTURE_PIXEL_HEIGHT} * v_textureCoord[1]\n );\n gl_Position = ${Uniforms.TILE_TRANSFORM} * vec4(${Attributes.TEXTURE_COORD}, ${Uniforms.DEPTH}, 1.0);\n }\n `;\n\n /**\n * @type {import(\"../expr/gpu.js\").CompilationContext}\n */\n const context = {\n ...newCompilationContext(),\n bandCount: bandCount,\n };\n\n const pipeline = [];\n\n if (style.color !== undefined) {\n const color = expressionToGlsl(context, style.color, ColorType);\n pipeline.push(`color = ${color};`);\n }\n\n if (style.contrast !== undefined) {\n const contrast = expressionToGlsl(context, style.contrast, NumberType);\n pipeline.push(\n `color.rgb = clamp((${contrast} + 1.0) * color.rgb - (${contrast} / 2.0), vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));`,\n );\n }\n\n if (style.exposure !== undefined) {\n const exposure = expressionToGlsl(context, style.exposure, NumberType);\n pipeline.push(\n `color.rgb = clamp((${exposure} + 1.0) * color.rgb, vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));`,\n );\n }\n\n if (style.saturation !== undefined) {\n const saturation = expressionToGlsl(context, style.saturation, NumberType);\n pipeline.push(`\n float saturation = ${saturation} + 1.0;\n float sr = (1.0 - saturation) * 0.2126;\n float sg = (1.0 - saturation) * 0.7152;\n float sb = (1.0 - saturation) * 0.0722;\n mat3 saturationMatrix = mat3(\n sr + saturation, sr, sr,\n sg, sg + saturation, sg,\n sb, sb, sb + saturation\n );\n color.rgb = clamp(saturationMatrix * color.rgb, vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));\n `);\n }\n\n if (style.gamma !== undefined) {\n const gamma = expressionToGlsl(context, style.gamma, NumberType);\n pipeline.push(`color.rgb = pow(color.rgb, vec3(1.0 / ${gamma}));`);\n }\n\n if (style.brightness !== undefined) {\n const brightness = expressionToGlsl(context, style.brightness, NumberType);\n pipeline.push(\n `color.rgb = clamp(color.rgb + ${brightness}, vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));`,\n );\n }\n\n /** @type {Object} */\n const uniforms = {};\n\n const numVariables = Object.keys(context.variables).length;\n if (numVariables > 1 && !style.variables) {\n throw new Error(\n `Missing variables in style (expected ${context.variables})`,\n );\n }\n\n for (let i = 0; i < numVariables; ++i) {\n const variable = context.variables[Object.keys(context.variables)[i]];\n if (!(variable.name in style.variables)) {\n throw new Error(`Missing '${variable.name}' in style variables`);\n }\n const uniformName = uniformNameForVariable(variable.name);\n uniforms[uniformName] = function () {\n let value = style.variables[variable.name];\n if (typeof value === 'string') {\n value = getStringNumberEquivalent(value);\n }\n return value !== undefined ? value : -9999999; // to avoid matching with the first string literal\n };\n }\n\n const uniformDeclarations = Object.keys(uniforms).map(function (name) {\n return `uniform float ${name};`;\n });\n\n const textureCount = Math.ceil(bandCount / 4);\n uniformDeclarations.push(\n `uniform sampler2D ${Uniforms.TILE_TEXTURE_ARRAY}[${textureCount}];`,\n );\n\n if (context.paletteTextures) {\n uniformDeclarations.push(\n `uniform sampler2D ${PALETTE_TEXTURE_ARRAY}[${context.paletteTextures.length}];`,\n );\n }\n\n const functionDefintions = Object.keys(context.functions).map(\n function (name) {\n return context.functions[name];\n },\n );\n\n const fragmentShader = `\n #ifdef GL_FRAGMENT_PRECISION_HIGH\n precision highp float;\n #else\n precision mediump float;\n #endif\n\n varying vec2 v_textureCoord;\n varying vec2 v_mapCoord;\n uniform vec4 ${Uniforms.RENDER_EXTENT};\n uniform float ${Uniforms.TRANSITION_ALPHA};\n uniform float ${Uniforms.TEXTURE_PIXEL_WIDTH};\n uniform float ${Uniforms.TEXTURE_PIXEL_HEIGHT};\n uniform float ${Uniforms.RESOLUTION};\n uniform float ${Uniforms.ZOOM};\n\n ${uniformDeclarations.join('\\n')}\n\n ${functionDefintions.join('\\n')}\n\n void main() {\n if (\n v_mapCoord[0] < ${Uniforms.RENDER_EXTENT}[0] ||\n v_mapCoord[1] < ${Uniforms.RENDER_EXTENT}[1] ||\n v_mapCoord[0] > ${Uniforms.RENDER_EXTENT}[2] ||\n v_mapCoord[1] > ${Uniforms.RENDER_EXTENT}[3]\n ) {\n discard;\n }\n\n vec4 color = texture2D(${\n Uniforms.TILE_TEXTURE_ARRAY\n }[0], v_textureCoord);\n\n ${pipeline.join('\\n')}\n\n gl_FragColor = color;\n gl_FragColor.rgb *= gl_FragColor.a;\n gl_FragColor *= ${Uniforms.TRANSITION_ALPHA};\n }`;\n\n return {\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n uniforms: uniforms,\n paletteTextures: context.paletteTextures,\n };\n}\n\n/**\n * @classdesc\n * For layer sources that provide pre-rendered, tiled images in grids that are\n * organized by zoom levels for specific resolutions.\n * Note that any property set in the options is set as a {@link module:ol/Object~BaseObject}\n * property on the layer object; for example, setting `title: 'My Title'` in the\n * options means that `title` is observable, and has get/set accessors.\n *\n * @extends BaseTileLayer\n * @fires import(\"../render/Event.js\").RenderEvent#prerender\n * @fires import(\"../render/Event.js\").RenderEvent#postrender\n * @api\n */\nclass WebGLTileLayer extends BaseTileLayer {\n /**\n * @param {Options} [options] Tile layer options.\n */\n constructor(options) {\n options = options ? Object.assign({}, options) : {};\n\n const style = options.style || {};\n delete options.style;\n\n super(options);\n\n /**\n * @type {Array|function(import(\"../extent.js\").Extent, number):Array}\n * @private\n */\n this.sources_ = options.sources;\n\n /**\n * @type {SourceType|null}\n * @private\n */\n this.renderedSource_ = null;\n\n /**\n * @type {number}\n * @private\n */\n this.renderedResolution_ = NaN;\n\n /**\n * @type {Style}\n * @private\n */\n this.style_ = style;\n\n /**\n * @type {Object}\n * @private\n */\n this.styleVariables_ = this.style_.variables || {};\n\n this.handleSourceUpdate_();\n this.addChangeListener(LayerProperty.SOURCE, this.handleSourceUpdate_);\n }\n\n /**\n * Gets the sources for this layer, for a given extent and resolution.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} resolution Resolution.\n * @return {Array} Sources.\n */\n getSources(extent, resolution) {\n const source = this.getSource();\n return this.sources_\n ? typeof this.sources_ === 'function'\n ? this.sources_(extent, resolution)\n : this.sources_\n : source\n ? [source]\n : [];\n }\n\n /**\n * @return {SourceType} The source being rendered.\n * @override\n */\n getRenderSource() {\n return this.renderedSource_ || this.getSource();\n }\n\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n * @override\n */\n getSourceState() {\n const source = this.getRenderSource();\n return source ? source.getState() : 'undefined';\n }\n\n /**\n * @private\n */\n handleSourceUpdate_() {\n if (this.hasRenderer()) {\n this.getRenderer().clearCache();\n }\n const source = this.getSource();\n if (source) {\n if (source.getState() === 'loading') {\n const onChange = () => {\n if (source.getState() === 'ready') {\n source.removeEventListener('change', onChange);\n this.setStyle(this.style_);\n }\n };\n source.addEventListener('change', onChange);\n } else {\n this.setStyle(this.style_);\n }\n }\n }\n\n /**\n * @private\n * @return {number} The number of source bands.\n */\n getSourceBandCount_() {\n const max = Number.MAX_SAFE_INTEGER;\n const sources = this.getSources([-max, -max, max, max], max);\n return sources && sources.length && 'bandCount' in sources[0]\n ? sources[0].bandCount\n : 4;\n }\n\n /**\n * @override\n */\n createRenderer() {\n const parsedStyle = parseStyle(this.style_, this.getSourceBandCount_());\n\n return new WebGLTileLayerRenderer(this, {\n vertexShader: parsedStyle.vertexShader,\n fragmentShader: parsedStyle.fragmentShader,\n uniforms: parsedStyle.uniforms,\n cacheSize: this.getCacheSize(),\n paletteTextures: parsedStyle.paletteTextures,\n });\n }\n\n /**\n * @param {import(\"../Map\").FrameState} frameState Frame state.\n * @param {Array} sources Sources.\n * @return {HTMLElement} Canvas.\n */\n renderSources(frameState, sources) {\n const layerRenderer = this.getRenderer();\n let canvas;\n for (let i = 0, ii = sources.length; i < ii; ++i) {\n this.renderedSource_ = sources[i];\n if (layerRenderer.prepareFrame(frameState)) {\n canvas = layerRenderer.renderFrame(frameState);\n }\n }\n return canvas;\n }\n\n /**\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target which the renderer may (but need not) use\n * for rendering its content.\n * @return {HTMLElement} The rendered element.\n * @override\n */\n render(frameState, target) {\n this.rendered = true;\n const viewState = frameState.viewState;\n const sources = this.getSources(frameState.extent, viewState.resolution);\n let ready = true;\n for (let i = 0, ii = sources.length; i < ii; ++i) {\n const source = sources[i];\n const sourceState = source.getState();\n if (sourceState == 'loading') {\n const onChange = () => {\n if (source.getState() == 'ready') {\n source.removeEventListener('change', onChange);\n this.changed();\n }\n };\n source.addEventListener('change', onChange);\n }\n ready = ready && sourceState == 'ready';\n }\n const canvas = this.renderSources(frameState, sources);\n if (this.getRenderer().renderComplete && ready) {\n // Fully rendered, done.\n this.renderedResolution_ = viewState.resolution;\n return canvas;\n }\n // Render sources from previously fully rendered frames\n if (this.renderedResolution_ > 0.5 * viewState.resolution) {\n const altSources = this.getSources(\n frameState.extent,\n this.renderedResolution_,\n ).filter((source) => !sources.includes(source));\n if (altSources.length > 0) {\n return this.renderSources(frameState, altSources);\n }\n }\n return canvas;\n }\n\n /**\n * Update the layer style. The `updateStyleVariables` function is a more efficient\n * way to update layer rendering. In cases where the whole style needs to be updated,\n * this method may be called instead. Note that calling this method will also replace\n * any previously set variables, so the new style also needs to include new variables,\n * if needed.\n * @param {Style} style The new style.\n */\n setStyle(style) {\n this.styleVariables_ = style.variables || {};\n this.style_ = style;\n if (this.hasRenderer()) {\n const parsedStyle = parseStyle(this.style_, this.getSourceBandCount_());\n const renderer = this.getRenderer();\n renderer.reset({\n vertexShader: parsedStyle.vertexShader,\n fragmentShader: parsedStyle.fragmentShader,\n uniforms: parsedStyle.uniforms,\n paletteTextures: parsedStyle.paletteTextures,\n });\n this.changed();\n }\n }\n\n /**\n * Update any variables used by the layer style and trigger a re-render.\n * @param {Object} variables Variables to update.\n * @api\n */\n updateStyleVariables(variables) {\n Object.assign(this.styleVariables_, variables);\n this.changed();\n }\n}\n\n/**\n * Clean up underlying WebGL resources.\n * @function\n * @api\n */\nWebGLTileLayer.prototype.dispose;\n\nexport default WebGLTileLayer;\n","/* eslint-disable no-restricted-globals, no-restricted-syntax */\n/* global SharedArrayBuffer */\n\nimport { CANNOT_CONVERT_UNDEFINED_OR_NULL_TO_OBJECT } from \"./messages.mjs\";\n\n/** @type { any>(target: T) => (thisArg: ThisType, ...args: any[]) => any} */\nfunction uncurryThis(target) {\n return (thisArg, ...args) => {\n return ReflectApply(target, thisArg, args);\n };\n}\n\n/** @type {(target: any, key: string | symbol) => (thisArg: any, ...args: any[]) => any} */\nfunction uncurryThisGetter(target, key) {\n return uncurryThis(\n ReflectGetOwnPropertyDescriptor(\n target,\n key\n ).get\n );\n}\n\n// Reflect\nexport const {\n apply: ReflectApply,\n construct: ReflectConstruct,\n defineProperty: ReflectDefineProperty,\n get: ReflectGet,\n getOwnPropertyDescriptor: ReflectGetOwnPropertyDescriptor,\n getPrototypeOf: ReflectGetPrototypeOf,\n has: ReflectHas,\n ownKeys: ReflectOwnKeys,\n set: ReflectSet,\n setPrototypeOf: ReflectSetPrototypeOf,\n} = Reflect;\n\n// Proxy\nexport const NativeProxy = Proxy;\n\n// Number\nexport const {\n EPSILON,\n MAX_SAFE_INTEGER,\n isFinite: NumberIsFinite,\n isNaN: NumberIsNaN,\n} = Number;\n\n// Symbol\nexport const {\n iterator: SymbolIterator,\n species: SymbolSpecies,\n toStringTag: SymbolToStringTag,\n for: SymbolFor,\n} = Symbol;\n\n// Object\nexport const NativeObject = Object;\nexport const {\n create: ObjectCreate,\n defineProperty: ObjectDefineProperty,\n freeze: ObjectFreeze,\n is: ObjectIs,\n} = NativeObject;\nconst ObjectPrototype = NativeObject.prototype;\n/** @type {(object: object, key: PropertyKey) => Function | undefined} */\nexport const ObjectPrototype__lookupGetter__ = /** @type {any} */ (ObjectPrototype).__lookupGetter__\n ? uncurryThis(/** @type {any} */ (ObjectPrototype).__lookupGetter__)\n : (object, key) => {\n if (object == null) {\n throw NativeTypeError(\n CANNOT_CONVERT_UNDEFINED_OR_NULL_TO_OBJECT\n );\n }\n\n let target = NativeObject(object);\n do {\n const descriptor = ReflectGetOwnPropertyDescriptor(target, key);\n if (descriptor !== undefined) {\n if (ObjectHasOwn(descriptor, \"get\")) {\n return descriptor.get;\n }\n\n return;\n }\n } while ((target = ReflectGetPrototypeOf(target)) !== null);\n };\n/** @type {(object: object, key: PropertyKey) => boolean} */\nexport const ObjectHasOwn = /** @type {any} */ (NativeObject).hasOwn ||\n uncurryThis(ObjectPrototype.hasOwnProperty);\n\n// Array\nconst NativeArray = Array;\nexport const ArrayIsArray = NativeArray.isArray;\nconst ArrayPrototype = NativeArray.prototype;\n/** @type {(array: ArrayLike, separator?: string) => string} */\nexport const ArrayPrototypeJoin = uncurryThis(ArrayPrototype.join);\n/** @type {(array: T[], ...items: T[]) => number} */\nexport const ArrayPrototypePush = uncurryThis(ArrayPrototype.push);\n/** @type {(array: ArrayLike, ...opts: any[]) => string} */\nexport const ArrayPrototypeToLocaleString = uncurryThis(\n ArrayPrototype.toLocaleString\n);\nexport const NativeArrayPrototypeSymbolIterator = ArrayPrototype[SymbolIterator];\n/** @type {(array: T[]) => IterableIterator} */\nexport const ArrayPrototypeSymbolIterator = uncurryThis(NativeArrayPrototypeSymbolIterator);\n\n// Math\nexport const {\n abs: MathAbs,\n trunc: MathTrunc,\n} = Math;\n\n// ArrayBuffer\nexport const NativeArrayBuffer = ArrayBuffer;\nexport const ArrayBufferIsView = NativeArrayBuffer.isView;\nconst ArrayBufferPrototype = NativeArrayBuffer.prototype;\n/** @type {(buffer: ArrayBuffer, begin?: number, end?: number) => number} */\nexport const ArrayBufferPrototypeSlice = uncurryThis(ArrayBufferPrototype.slice);\n/** @type {(buffer: ArrayBuffer) => ArrayBuffer} */\nexport const ArrayBufferPrototypeGetByteLength = uncurryThisGetter(ArrayBufferPrototype, \"byteLength\");\n\n// SharedArrayBuffer\nexport const NativeSharedArrayBuffer = typeof SharedArrayBuffer !== \"undefined\" ? SharedArrayBuffer : null;\n/** @type {(buffer: SharedArrayBuffer) => SharedArrayBuffer} */\nexport const SharedArrayBufferPrototypeGetByteLength = NativeSharedArrayBuffer\n && uncurryThisGetter(NativeSharedArrayBuffer.prototype, \"byteLength\");\n\n// TypedArray\n/** @typedef {Uint8Array|Uint8ClampedArray|Uint16Array|Uint32Array|Int8Array|Int16Array|Int32Array|Float32Array|Float64Array|BigUint64Array|BigInt64Array} TypedArray */\n/** @type {any} */\nexport const TypedArray = ReflectGetPrototypeOf(Uint8Array);\nconst TypedArrayFrom = TypedArray.from;\nexport const TypedArrayPrototype = TypedArray.prototype;\nexport const NativeTypedArrayPrototypeSymbolIterator = TypedArrayPrototype[SymbolIterator];\n/** @type {(typedArray: TypedArray) => IterableIterator} */\nexport const TypedArrayPrototypeKeys = uncurryThis(TypedArrayPrototype.keys);\n/** @type {(typedArray: TypedArray) => IterableIterator} */\nexport const TypedArrayPrototypeValues = uncurryThis(\n TypedArrayPrototype.values\n);\n/** @type {(typedArray: TypedArray) => IterableIterator<[number, number]>} */\nexport const TypedArrayPrototypeEntries = uncurryThis(\n TypedArrayPrototype.entries\n);\n/** @type {(typedArray: TypedArray, array: ArrayLike, offset?: number) => void} */\nexport const TypedArrayPrototypeSet = uncurryThis(TypedArrayPrototype.set);\n/** @type {(typedArray: T) => T} */\nexport const TypedArrayPrototypeReverse = uncurryThis(\n TypedArrayPrototype.reverse\n);\n/** @type {(typedArray: T, value: number, start?: number, end?: number) => T} */\nexport const TypedArrayPrototypeFill = uncurryThis(TypedArrayPrototype.fill);\n/** @type {(typedArray: T, target: number, start: number, end?: number) => T} */\nexport const TypedArrayPrototypeCopyWithin = uncurryThis(\n TypedArrayPrototype.copyWithin\n);\n/** @type {(typedArray: T, compareFn?: (a: number, b: number) => number) => T} */\nexport const TypedArrayPrototypeSort = uncurryThis(TypedArrayPrototype.sort);\n/** @type {(typedArray: T, start?: number, end?: number) => T} */\nexport const TypedArrayPrototypeSlice = uncurryThis(TypedArrayPrototype.slice);\n/** @type {(typedArray: T, start?: number, end?: number) => T} */\nexport const TypedArrayPrototypeSubarray = uncurryThis(\n TypedArrayPrototype.subarray\n);\n/** @type {((typedArray: TypedArray) => ArrayBuffer)} */\nexport const TypedArrayPrototypeGetBuffer = uncurryThisGetter(\n TypedArrayPrototype,\n \"buffer\"\n);\n/** @type {((typedArray: TypedArray) => number)} */\nexport const TypedArrayPrototypeGetByteOffset = uncurryThisGetter(\n TypedArrayPrototype,\n \"byteOffset\"\n);\n/** @type {((typedArray: TypedArray) => number)} */\nexport const TypedArrayPrototypeGetLength = uncurryThisGetter(\n TypedArrayPrototype,\n \"length\"\n);\n/** @type {(target: unknown) => string} */\nexport const TypedArrayPrototypeGetSymbolToStringTag = uncurryThisGetter(\n TypedArrayPrototype,\n SymbolToStringTag\n);\n\n// Uint8Array\nexport const NativeUint8Array = Uint8Array;\n\n// Uint16Array\nexport const NativeUint16Array = Uint16Array;\n/** @type {Uint16ArrayConstructor[\"from\"]} */\nexport const Uint16ArrayFrom = (...args) => {\n return ReflectApply(TypedArrayFrom, NativeUint16Array, args);\n};\n\n// Uint32Array\nexport const NativeUint32Array = Uint32Array;\n\n// Float32Array\nexport const NativeFloat32Array = Float32Array;\n\n// ArrayIterator\n/** @type {any} */\nexport const ArrayIteratorPrototype = ReflectGetPrototypeOf([][SymbolIterator]());\n/** @type {(arrayIterator: IterableIterator) => IteratorResult} */\nexport const ArrayIteratorPrototypeNext = uncurryThis(ArrayIteratorPrototype.next);\n\n// Generator\n/** @type {(generator: Generator, value?: TNext) => T} */\nexport const GeneratorPrototypeNext = uncurryThis((function* () {})().next);\n\n// Iterator\nexport const IteratorPrototype = ReflectGetPrototypeOf(ArrayIteratorPrototype);\n\n// DataView\nconst DataViewPrototype = DataView.prototype;\n/** @type {(dataView: DataView, byteOffset: number, littleEndian?: boolean) => number} */\nexport const DataViewPrototypeGetUint16 = uncurryThis(\n DataViewPrototype.getUint16\n);\n/** @type {(dataView: DataView, byteOffset: number, value: number, littleEndian?: boolean) => void} */\nexport const DataViewPrototypeSetUint16 = uncurryThis(\n DataViewPrototype.setUint16\n);\n\n// Error\nexport const NativeTypeError = TypeError;\nexport const NativeRangeError = RangeError;\n\n// WeakSet\n/**\n * Do not construct with arguments to avoid calling the \"add\" method\n * @type {{new (): WeakSet}}\n */\nexport const NativeWeakSet = WeakSet;\nconst WeakSetPrototype = NativeWeakSet.prototype;\n/** @type {(set: WeakSet, value: T) => Set} */\nexport const WeakSetPrototypeAdd = uncurryThis(WeakSetPrototype.add);\n/** @type {(set: WeakSet, value: T) => boolean} */\nexport const WeakSetPrototypeHas = uncurryThis(WeakSetPrototype.has);\n\n// WeakMap\n/**\n * Do not construct with arguments to avoid calling the \"set\" method\n * @type {{new (): WeakMap}}\n */\nexport const NativeWeakMap = WeakMap;\nconst WeakMapPrototype = NativeWeakMap.prototype;\n/** @type {(weakMap: WeakMap, key: K) => V} */\nexport const WeakMapPrototypeGet = uncurryThis(WeakMapPrototype.get);\n/** @type {(weakMap: WeakMap, key: K) => boolean} */\nexport const WeakMapPrototypeHas = uncurryThis(WeakMapPrototype.has);\n/** @type {(weakMap: WeakMap, key: K, value: V) => WeakMap} */\nexport const WeakMapPrototypeSet = uncurryThis(WeakMapPrototype.set);\n","import {\n ArrayIteratorPrototype,\n ArrayIteratorPrototypeNext,\n ArrayPrototypeSymbolIterator,\n GeneratorPrototypeNext,\n IteratorPrototype,\n NativeArrayPrototypeSymbolIterator,\n NativeWeakMap,\n ObjectCreate,\n ObjectDefineProperty,\n ReflectGetOwnPropertyDescriptor,\n ReflectOwnKeys,\n SymbolIterator,\n WeakMapPrototypeGet,\n WeakMapPrototypeSet,\n} from \"./primordials.mjs\";\n\n/** @type {WeakMap<{}, IterableIterator>} */\nconst arrayIterators = new NativeWeakMap();\n\nconst SafeIteratorPrototype = ObjectCreate(null, {\n next: {\n value: function next() {\n const arrayIterator = WeakMapPrototypeGet(arrayIterators, this);\n return ArrayIteratorPrototypeNext(arrayIterator);\n },\n },\n\n [SymbolIterator]: {\n value: function values() {\n return this;\n },\n },\n});\n\n/**\n * Wrap the Array around the SafeIterator If Array.prototype [@@iterator] has been modified\n * @type {(array: T[]) => Iterable}\n */\nexport function safeIfNeeded(array) {\n if (\n array[SymbolIterator] === NativeArrayPrototypeSymbolIterator &&\n ArrayIteratorPrototype.next === ArrayIteratorPrototypeNext\n ) {\n return array;\n }\n\n const safe = ObjectCreate(SafeIteratorPrototype);\n WeakMapPrototypeSet(arrayIterators, safe, ArrayPrototypeSymbolIterator(array));\n return safe;\n}\n\n/** @type {WeakMap<{}, Generator>} */\nconst generators = new NativeWeakMap();\n\n/** @see https://tc39.es/ecma262/#sec-%arrayiteratorprototype%-object */\nconst DummyArrayIteratorPrototype = ObjectCreate(IteratorPrototype, {\n next: {\n value: function next() {\n const generator = WeakMapPrototypeGet(generators, this);\n return GeneratorPrototypeNext(generator);\n },\n writable: true,\n configurable: true,\n },\n});\n\nfor (const key of ReflectOwnKeys(ArrayIteratorPrototype)) {\n // next method has already defined\n if (key === \"next\") {\n continue;\n }\n\n // Copy ArrayIteratorPrototype descriptors to DummyArrayIteratorPrototype\n ObjectDefineProperty(DummyArrayIteratorPrototype, key, ReflectGetOwnPropertyDescriptor(ArrayIteratorPrototype, key));\n}\n\n/**\n * Wrap the Generator around the dummy ArrayIterator\n * @type {(generator: Generator) => IterableIterator}\n */\nexport function wrap(generator) {\n const dummy = ObjectCreate(DummyArrayIteratorPrototype);\n WeakMapPrototypeSet(generators, dummy, generator);\n return dummy;\n}\n","import {\n EPSILON,\n MathAbs,\n NativeArrayBuffer,\n NativeFloat32Array,\n NativeUint16Array,\n NativeUint32Array,\n NativeUint8Array,\n NumberIsFinite,\n NumberIsNaN,\n} from \"./primordials.mjs\";\n\nconst INVERSE_OF_EPSILON = 1 / EPSILON;\n\n/**\n * rounds to the nearest value;\n * if the number falls midway, it is rounded to the nearest value with an even least significant digit\n * @param {number} num\n * @returns {number}\n */\nfunction roundTiesToEven(num) {\n return (num + INVERSE_OF_EPSILON) - INVERSE_OF_EPSILON;\n}\n\nconst FLOAT16_MIN_VALUE = 6.103515625e-05;\nconst FLOAT16_MAX_VALUE = 65504;\nconst FLOAT16_EPSILON = 0.0009765625;\n\nconst FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE = FLOAT16_EPSILON * FLOAT16_MIN_VALUE;\nconst FLOAT16_EPSILON_DEVIDED_BY_EPSILON = FLOAT16_EPSILON * INVERSE_OF_EPSILON;\n\n/**\n * round a number to a half float number\n * @param {unknown} num - double float\n * @returns {number} half float number\n */\nexport function roundToFloat16(num) {\n const number = +num;\n\n // NaN, Infinity, -Infinity, 0, -0\n if (!NumberIsFinite(number) || number === 0) {\n return number;\n }\n\n // finite except 0, -0\n const sign = number > 0 ? 1 : -1;\n const absolute = MathAbs(number);\n\n // small number\n if (absolute < FLOAT16_MIN_VALUE) {\n return sign * roundTiesToEven(absolute / FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE) * FLOAT16_EPSILON_MULTIPLIED_BY_FLOAT16_MIN_VALUE;\n }\n\n const temp = (1 + FLOAT16_EPSILON_DEVIDED_BY_EPSILON) * absolute;\n const result = temp - (temp - absolute);\n\n // large number\n if (result > FLOAT16_MAX_VALUE || NumberIsNaN(result)) {\n return sign * Infinity;\n }\n\n return sign * result;\n}\n\n// base algorithm: http://fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst buffer = new NativeArrayBuffer(4);\nconst floatView = new NativeFloat32Array(buffer);\nconst uint32View = new NativeUint32Array(buffer);\n\nconst baseTable = new NativeUint16Array(512);\nconst shiftTable = new NativeUint8Array(512);\n\nfor (let i = 0; i < 256; ++i) {\n const e = i - 127;\n\n // very small number (0, -0)\n if (e < -24) {\n baseTable[i] = 0x0000;\n baseTable[i | 0x100] = 0x8000;\n shiftTable[i] = 24;\n shiftTable[i | 0x100] = 24;\n\n // small number (denorm)\n } else if (e < -14) {\n baseTable[i] = 0x0400 >> (-e - 14);\n baseTable[i | 0x100] = (0x0400 >> (-e - 14)) | 0x8000;\n shiftTable[i] = -e - 1;\n shiftTable[i | 0x100] = -e - 1;\n\n // normal number\n } else if (e <= 15) {\n baseTable[i] = (e + 15) << 10;\n baseTable[i | 0x100] = ((e + 15) << 10) | 0x8000;\n shiftTable[i] = 13;\n shiftTable[i | 0x100] = 13;\n\n // large number (Infinity, -Infinity)\n } else if (e < 128) {\n baseTable[i] = 0x7c00;\n baseTable[i | 0x100] = 0xfc00;\n shiftTable[i] = 24;\n shiftTable[i | 0x100] = 24;\n\n // stay (NaN, Infinity, -Infinity)\n } else {\n baseTable[i] = 0x7c00;\n baseTable[i | 0x100] = 0xfc00;\n shiftTable[i] = 13;\n shiftTable[i | 0x100] = 13;\n }\n}\n\n/**\n * round a number to a half float number bits\n * @param {unknown} num - double float\n * @returns {number} half float number bits\n */\nexport function roundToFloat16Bits(num) {\n floatView[0] = roundToFloat16(num);\n const f = uint32View[0];\n const e = (f >> 23) & 0x1ff;\n return baseTable[e] + ((f & 0x007fffff) >> shiftTable[e]);\n}\n\nconst mantissaTable = new NativeUint32Array(2048);\nfor (let i = 1; i < 1024; ++i) {\n let m = i << 13; // zero pad mantissa bits\n let e = 0; // zero exponent\n\n // normalized\n while ((m & 0x00800000) === 0) {\n m <<= 1;\n e -= 0x00800000; // decrement exponent\n }\n\n m &= ~0x00800000; // clear leading 1 bit\n e += 0x38800000; // adjust bias\n\n mantissaTable[i] = m | e;\n}\nfor (let i = 1024; i < 2048; ++i) {\n mantissaTable[i] = 0x38000000 + ((i - 1024) << 13);\n}\n\nconst exponentTable = new NativeUint32Array(64);\nfor (let i = 1; i < 31; ++i) {\n exponentTable[i] = i << 23;\n}\nexponentTable[31] = 0x47800000;\nexponentTable[32] = 0x80000000;\nfor (let i = 33; i < 63; ++i) {\n exponentTable[i] = 0x80000000 + ((i - 32) << 23);\n}\nexponentTable[63] = 0xc7800000;\n\nconst offsetTable = new NativeUint16Array(64);\nfor (let i = 1; i < 64; ++i) {\n if (i !== 32) {\n offsetTable[i] = 1024;\n }\n}\n\n/**\n * convert a half float number bits to a number\n * @param {number} float16bits - half float number bits\n * @returns {number} double float\n */\nexport function convertToNumber(float16bits) {\n const i = float16bits >> 10;\n uint32View[0] = mantissaTable[offsetTable[i] + (float16bits & 0x3ff)] + exponentTable[i];\n return floatView[0];\n}\n","import { safeIfNeeded } from \"./_util/arrayIterator.mjs\";\nimport { convertToNumber, roundToFloat16Bits } from \"./_util/converter.mjs\";\nimport {\n DataViewPrototypeGetUint16,\n DataViewPrototypeSetUint16,\n} from \"./_util/primordials.mjs\";\n\n/**\n * returns an unsigned 16-bit float at the specified byte offset from the start of the DataView\n * @param {DataView} dataView\n * @param {number} byteOffset\n * @param {[boolean]} opts\n * @returns {number}\n */\nexport function getFloat16(dataView, byteOffset, ...opts) {\n return convertToNumber(\n DataViewPrototypeGetUint16(dataView, byteOffset, ...safeIfNeeded(opts))\n );\n}\n\n/**\n * stores an unsigned 16-bit float value at the specified byte offset from the start of the DataView\n * @param {DataView} dataView\n * @param {number} byteOffset\n * @param {number} value\n * @param {[boolean]} opts\n */\nexport function setFloat16(dataView, byteOffset, value, ...opts) {\n return DataViewPrototypeSetUint16(\n dataView,\n byteOffset,\n roundToFloat16Bits(value),\n ...safeIfNeeded(opts)\n );\n}\n","function getAttribute(tag, attributeName, options) {\n const debug = (options && options.debug) || false;\n if (debug) console.log(\"[xml-utils] getting \" + attributeName + \" in \" + tag);\n\n const xml = typeof tag === \"object\" ? tag.outer : tag;\n\n // only search for attributes in the opening tag\n const opening = xml.slice(0, xml.indexOf(\">\") + 1);\n\n const quotechars = ['\"', \"'\"];\n for (let i = 0; i < quotechars.length; i++) {\n const char = quotechars[i];\n const pattern = attributeName + \"\\\\=\" + char + \"([^\" + char + \"]*)\" + char;\n if (debug) console.log(\"[xml-utils] pattern:\", pattern);\n\n const re = new RegExp(pattern);\n const match = re.exec(opening);\n if (debug) console.log(\"[xml-utils] match:\", match);\n if (match) return match[1];\n }\n}\n\nmodule.exports = getAttribute;\nmodule.exports.default = getAttribute;\n","function indexOfMatch(xml, pattern, startIndex) {\n const re = new RegExp(pattern);\n const match = re.exec(xml.slice(startIndex));\n if (match) return startIndex + match.index;\n else return -1;\n}\n\nmodule.exports = indexOfMatch;\nmodule.exports.default = indexOfMatch;\n","function indexOfMatchEnd(xml, pattern, startIndex) {\n const re = new RegExp(pattern);\n const match = re.exec(xml.slice(startIndex));\n if (match) return startIndex + match.index + match[0].length - 1;\n else return -1;\n}\n\nmodule.exports = indexOfMatchEnd;\nmodule.exports.default = indexOfMatchEnd;\n","function countSubstring(string, substring) {\n const pattern = new RegExp(substring, \"g\");\n const match = string.match(pattern);\n return match ? match.length : 0;\n}\n\nmodule.exports = countSubstring;\nmodule.exports.default = countSubstring;\n","const indexOfMatch = require(\"./index-of-match.js\");\nconst indexOfMatchEnd = require(\"./index-of-match-end.js\");\nconst countSubstring = require(\"./count-substring.js\");\n\nfunction findTagByName(xml, tagName, options) {\n const debug = (options && options.debug) || false;\n const nested = !(options && typeof options.nested === false);\n\n const startIndex = (options && options.startIndex) || 0;\n\n if (debug) console.log(\"[xml-utils] starting findTagByName with\", tagName, \" and \", options);\n\n const start = indexOfMatch(xml, `\\<${tagName}[ \\n\\>\\/]`, startIndex);\n if (debug) console.log(\"[xml-utils] start:\", start);\n if (start === -1) return undefined;\n\n const afterStart = xml.slice(start + tagName.length);\n\n let relativeEnd = indexOfMatchEnd(afterStart, \"^[^<]*[ /]>\", 0);\n\n const selfClosing = relativeEnd !== -1 && afterStart[relativeEnd - 1] === \"/\";\n if (debug) console.log(\"[xml-utils] selfClosing:\", selfClosing);\n\n if (selfClosing === false) {\n // check if tag has subtags with the same name\n if (nested) {\n let startIndex = 0;\n let openings = 1;\n let closings = 0;\n while ((relativeEnd = indexOfMatchEnd(afterStart, \"[ /]\" + tagName + \">\", startIndex)) !== -1) {\n const clip = afterStart.substring(startIndex, relativeEnd + 1);\n openings += countSubstring(clip, \"<\" + tagName + \"[ \\n\\t>]\");\n closings += countSubstring(clip, \"\");\n // we can't have more openings than closings\n if (closings >= openings) break;\n startIndex = relativeEnd;\n }\n } else {\n relativeEnd = indexOfMatchEnd(afterStart, \"[ /]\" + tagName + \">\", 0);\n }\n }\n\n const end = start + tagName.length + relativeEnd + 1;\n if (debug) console.log(\"[xml-utils] end:\", end);\n if (end === -1) return undefined;\n\n const outer = xml.slice(start, end);\n // tag is like urn:ogc:def:crs:EPSG::32617\n\n let inner;\n if (selfClosing) {\n inner = null;\n } else {\n inner = outer.slice(outer.indexOf(\">\") + 1, outer.lastIndexOf(\"<\"));\n }\n\n return { inner, outer, start, end };\n}\n\nmodule.exports = findTagByName;\nmodule.exports.default = findTagByName;\n","const findTagByName = require(\"./find-tag-by-name.js\");\n\nfunction findTagsByName(xml, tagName, options) {\n const tags = [];\n const debug = (options && options.debug) || false;\n const nested = options && typeof options.nested === \"boolean\" ? options.nested : true;\n let startIndex = (options && options.startIndex) || 0;\n let tag;\n while ((tag = findTagByName(xml, tagName, { debug, startIndex }))) {\n if (nested) {\n startIndex = tag.start + 1 + tagName.length;\n } else {\n startIndex = tag.end;\n }\n tags.push(tag);\n }\n if (debug) console.log(\"findTagsByName found\", tags.length, \"tags\");\n return tags;\n}\n\nmodule.exports = findTagsByName;\nmodule.exports.default = findTagsByName;\n","export const fieldTagNames = {\n // TIFF Baseline\n 0x013B: 'Artist',\n 0x0102: 'BitsPerSample',\n 0x0109: 'CellLength',\n 0x0108: 'CellWidth',\n 0x0140: 'ColorMap',\n 0x0103: 'Compression',\n 0x8298: 'Copyright',\n 0x0132: 'DateTime',\n 0x0152: 'ExtraSamples',\n 0x010A: 'FillOrder',\n 0x0121: 'FreeByteCounts',\n 0x0120: 'FreeOffsets',\n 0x0123: 'GrayResponseCurve',\n 0x0122: 'GrayResponseUnit',\n 0x013C: 'HostComputer',\n 0x010E: 'ImageDescription',\n 0x0101: 'ImageLength',\n 0x0100: 'ImageWidth',\n 0x010F: 'Make',\n 0x0119: 'MaxSampleValue',\n 0x0118: 'MinSampleValue',\n 0x0110: 'Model',\n 0x00FE: 'NewSubfileType',\n 0x0112: 'Orientation',\n 0x0106: 'PhotometricInterpretation',\n 0x011C: 'PlanarConfiguration',\n 0x0128: 'ResolutionUnit',\n 0x0116: 'RowsPerStrip',\n 0x0115: 'SamplesPerPixel',\n 0x0131: 'Software',\n 0x0117: 'StripByteCounts',\n 0x0111: 'StripOffsets',\n 0x00FF: 'SubfileType',\n 0x0107: 'Threshholding',\n 0x011A: 'XResolution',\n 0x011B: 'YResolution',\n\n // TIFF Extended\n 0x0146: 'BadFaxLines',\n 0x0147: 'CleanFaxData',\n 0x0157: 'ClipPath',\n 0x0148: 'ConsecutiveBadFaxLines',\n 0x01B1: 'Decode',\n 0x01B2: 'DefaultImageColor',\n 0x010D: 'DocumentName',\n 0x0150: 'DotRange',\n 0x0141: 'HalftoneHints',\n 0x015A: 'Indexed',\n 0x015B: 'JPEGTables',\n 0x011D: 'PageName',\n 0x0129: 'PageNumber',\n 0x013D: 'Predictor',\n 0x013F: 'PrimaryChromaticities',\n 0x0214: 'ReferenceBlackWhite',\n 0x0153: 'SampleFormat',\n 0x0154: 'SMinSampleValue',\n 0x0155: 'SMaxSampleValue',\n 0x022F: 'StripRowCounts',\n 0x014A: 'SubIFDs',\n 0x0124: 'T4Options',\n 0x0125: 'T6Options',\n 0x0145: 'TileByteCounts',\n 0x0143: 'TileLength',\n 0x0144: 'TileOffsets',\n 0x0142: 'TileWidth',\n 0x012D: 'TransferFunction',\n 0x013E: 'WhitePoint',\n 0x0158: 'XClipPathUnits',\n 0x011E: 'XPosition',\n 0x0211: 'YCbCrCoefficients',\n 0x0213: 'YCbCrPositioning',\n 0x0212: 'YCbCrSubSampling',\n 0x0159: 'YClipPathUnits',\n 0x011F: 'YPosition',\n\n // EXIF\n 0x9202: 'ApertureValue',\n 0xA001: 'ColorSpace',\n 0x9004: 'DateTimeDigitized',\n 0x9003: 'DateTimeOriginal',\n 0x8769: 'Exif IFD',\n 0x9000: 'ExifVersion',\n 0x829A: 'ExposureTime',\n 0xA300: 'FileSource',\n 0x9209: 'Flash',\n 0xA000: 'FlashpixVersion',\n 0x829D: 'FNumber',\n 0xA420: 'ImageUniqueID',\n 0x9208: 'LightSource',\n 0x927C: 'MakerNote',\n 0x9201: 'ShutterSpeedValue',\n 0x9286: 'UserComment',\n\n // IPTC\n 0x83BB: 'IPTC',\n\n // ICC\n 0x8773: 'ICC Profile',\n\n // XMP\n 0x02BC: 'XMP',\n\n // GDAL\n 0xA480: 'GDAL_METADATA',\n 0xA481: 'GDAL_NODATA',\n\n // Photoshop\n 0x8649: 'Photoshop',\n\n // GeoTiff\n 0x830E: 'ModelPixelScale',\n 0x8482: 'ModelTiepoint',\n 0x85D8: 'ModelTransformation',\n 0x87AF: 'GeoKeyDirectory',\n 0x87B0: 'GeoDoubleParams',\n 0x87B1: 'GeoAsciiParams',\n\n // LERC\n 0xC5F2: 'LercParameters',\n};\n\nexport const fieldTags = {};\nfor (const key in fieldTagNames) {\n if (fieldTagNames.hasOwnProperty(key)) {\n fieldTags[fieldTagNames[key]] = parseInt(key, 10);\n }\n}\n\nexport const fieldTagTypes = {\n 256: 'SHORT',\n 257: 'SHORT',\n 258: 'SHORT',\n 259: 'SHORT',\n 262: 'SHORT',\n 273: 'LONG',\n 274: 'SHORT',\n 277: 'SHORT',\n 278: 'LONG',\n 279: 'LONG',\n 282: 'RATIONAL',\n 283: 'RATIONAL',\n 284: 'SHORT',\n 286: 'SHORT',\n 287: 'RATIONAL',\n 296: 'SHORT',\n 297: 'SHORT',\n 305: 'ASCII',\n 306: 'ASCII',\n 338: 'SHORT',\n 339: 'SHORT',\n 513: 'LONG',\n 514: 'LONG',\n 1024: 'SHORT',\n 1025: 'SHORT',\n 2048: 'SHORT',\n 2049: 'ASCII',\n 3072: 'SHORT',\n 3073: 'ASCII',\n 33550: 'DOUBLE',\n 33922: 'DOUBLE',\n 34264: 'DOUBLE',\n 34665: 'LONG',\n 34735: 'SHORT',\n 34736: 'DOUBLE',\n 34737: 'ASCII',\n 42113: 'ASCII',\n};\n\nexport const arrayFields = [\n fieldTags.BitsPerSample,\n fieldTags.ExtraSamples,\n fieldTags.SampleFormat,\n fieldTags.StripByteCounts,\n fieldTags.StripOffsets,\n fieldTags.StripRowCounts,\n fieldTags.TileByteCounts,\n fieldTags.TileOffsets,\n fieldTags.SubIFDs,\n];\n\nexport const fieldTypeNames = {\n 0x0001: 'BYTE',\n 0x0002: 'ASCII',\n 0x0003: 'SHORT',\n 0x0004: 'LONG',\n 0x0005: 'RATIONAL',\n 0x0006: 'SBYTE',\n 0x0007: 'UNDEFINED',\n 0x0008: 'SSHORT',\n 0x0009: 'SLONG',\n 0x000A: 'SRATIONAL',\n 0x000B: 'FLOAT',\n 0x000C: 'DOUBLE',\n // IFD offset, suggested by https://owl.phy.queensu.ca/~phil/exiftool/standards.html\n 0x000D: 'IFD',\n // introduced by BigTIFF\n 0x0010: 'LONG8',\n 0x0011: 'SLONG8',\n 0x0012: 'IFD8',\n};\n\nexport const fieldTypes = {};\nfor (const key in fieldTypeNames) {\n if (fieldTypeNames.hasOwnProperty(key)) {\n fieldTypes[fieldTypeNames[key]] = parseInt(key, 10);\n }\n}\n\nexport const photometricInterpretations = {\n WhiteIsZero: 0,\n BlackIsZero: 1,\n RGB: 2,\n Palette: 3,\n TransparencyMask: 4,\n CMYK: 5,\n YCbCr: 6,\n\n CIELab: 8,\n ICCLab: 9,\n};\n\nexport const ExtraSamplesValues = {\n Unspecified: 0,\n Assocalpha: 1,\n Unassalpha: 2,\n};\n\nexport const LercParameters = {\n Version: 0,\n AddCompression: 1,\n};\n\nexport const LercAddCompression = {\n None: 0,\n Deflate: 1,\n Zstandard: 2,\n};\n\nexport const geoKeyNames = {\n 1024: 'GTModelTypeGeoKey',\n 1025: 'GTRasterTypeGeoKey',\n 1026: 'GTCitationGeoKey',\n 2048: 'GeographicTypeGeoKey',\n 2049: 'GeogCitationGeoKey',\n 2050: 'GeogGeodeticDatumGeoKey',\n 2051: 'GeogPrimeMeridianGeoKey',\n 2052: 'GeogLinearUnitsGeoKey',\n 2053: 'GeogLinearUnitSizeGeoKey',\n 2054: 'GeogAngularUnitsGeoKey',\n 2055: 'GeogAngularUnitSizeGeoKey',\n 2056: 'GeogEllipsoidGeoKey',\n 2057: 'GeogSemiMajorAxisGeoKey',\n 2058: 'GeogSemiMinorAxisGeoKey',\n 2059: 'GeogInvFlatteningGeoKey',\n 2060: 'GeogAzimuthUnitsGeoKey',\n 2061: 'GeogPrimeMeridianLongGeoKey',\n 2062: 'GeogTOWGS84GeoKey',\n 3072: 'ProjectedCSTypeGeoKey',\n 3073: 'PCSCitationGeoKey',\n 3074: 'ProjectionGeoKey',\n 3075: 'ProjCoordTransGeoKey',\n 3076: 'ProjLinearUnitsGeoKey',\n 3077: 'ProjLinearUnitSizeGeoKey',\n 3078: 'ProjStdParallel1GeoKey',\n 3079: 'ProjStdParallel2GeoKey',\n 3080: 'ProjNatOriginLongGeoKey',\n 3081: 'ProjNatOriginLatGeoKey',\n 3082: 'ProjFalseEastingGeoKey',\n 3083: 'ProjFalseNorthingGeoKey',\n 3084: 'ProjFalseOriginLongGeoKey',\n 3085: 'ProjFalseOriginLatGeoKey',\n 3086: 'ProjFalseOriginEastingGeoKey',\n 3087: 'ProjFalseOriginNorthingGeoKey',\n 3088: 'ProjCenterLongGeoKey',\n 3089: 'ProjCenterLatGeoKey',\n 3090: 'ProjCenterEastingGeoKey',\n 3091: 'ProjCenterNorthingGeoKey',\n 3092: 'ProjScaleAtNatOriginGeoKey',\n 3093: 'ProjScaleAtCenterGeoKey',\n 3094: 'ProjAzimuthAngleGeoKey',\n 3095: 'ProjStraightVertPoleLongGeoKey',\n 3096: 'ProjRectifiedGridAngleGeoKey',\n 4096: 'VerticalCSTypeGeoKey',\n 4097: 'VerticalCitationGeoKey',\n 4098: 'VerticalDatumGeoKey',\n 4099: 'VerticalUnitsGeoKey',\n};\n\nexport const geoKeys = {};\nfor (const key in geoKeyNames) {\n if (geoKeyNames.hasOwnProperty(key)) {\n geoKeys[geoKeyNames[key]] = parseInt(key, 10);\n }\n}\n","export function fromWhiteIsZero(raster, max) {\n const { width, height } = raster;\n const rgbRaster = new Uint8Array(width * height * 3);\n let value;\n for (let i = 0, j = 0; i < raster.length; ++i, j += 3) {\n value = 256 - (raster[i] / max * 256);\n rgbRaster[j] = value;\n rgbRaster[j + 1] = value;\n rgbRaster[j + 2] = value;\n }\n return rgbRaster;\n}\n\nexport function fromBlackIsZero(raster, max) {\n const { width, height } = raster;\n const rgbRaster = new Uint8Array(width * height * 3);\n let value;\n for (let i = 0, j = 0; i < raster.length; ++i, j += 3) {\n value = raster[i] / max * 256;\n rgbRaster[j] = value;\n rgbRaster[j + 1] = value;\n rgbRaster[j + 2] = value;\n }\n return rgbRaster;\n}\n\nexport function fromPalette(raster, colorMap) {\n const { width, height } = raster;\n const rgbRaster = new Uint8Array(width * height * 3);\n const greenOffset = colorMap.length / 3;\n const blueOffset = colorMap.length / 3 * 2;\n for (let i = 0, j = 0; i < raster.length; ++i, j += 3) {\n const mapIndex = raster[i];\n rgbRaster[j] = colorMap[mapIndex] / 65536 * 256;\n rgbRaster[j + 1] = colorMap[mapIndex + greenOffset] / 65536 * 256;\n rgbRaster[j + 2] = colorMap[mapIndex + blueOffset] / 65536 * 256;\n }\n return rgbRaster;\n}\n\nexport function fromCMYK(cmykRaster) {\n const { width, height } = cmykRaster;\n const rgbRaster = new Uint8Array(width * height * 3);\n for (let i = 0, j = 0; i < cmykRaster.length; i += 4, j += 3) {\n const c = cmykRaster[i];\n const m = cmykRaster[i + 1];\n const y = cmykRaster[i + 2];\n const k = cmykRaster[i + 3];\n\n rgbRaster[j] = 255 * ((255 - c) / 256) * ((255 - k) / 256);\n rgbRaster[j + 1] = 255 * ((255 - m) / 256) * ((255 - k) / 256);\n rgbRaster[j + 2] = 255 * ((255 - y) / 256) * ((255 - k) / 256);\n }\n return rgbRaster;\n}\n\nexport function fromYCbCr(yCbCrRaster) {\n const { width, height } = yCbCrRaster;\n const rgbRaster = new Uint8ClampedArray(width * height * 3);\n for (let i = 0, j = 0; i < yCbCrRaster.length; i += 3, j += 3) {\n const y = yCbCrRaster[i];\n const cb = yCbCrRaster[i + 1];\n const cr = yCbCrRaster[i + 2];\n\n rgbRaster[j] = (y + (1.40200 * (cr - 0x80)));\n rgbRaster[j + 1] = (y - (0.34414 * (cb - 0x80)) - (0.71414 * (cr - 0x80)));\n rgbRaster[j + 2] = (y + (1.77200 * (cb - 0x80)));\n }\n return rgbRaster;\n}\n\nconst Xn = 0.95047;\nconst Yn = 1.00000;\nconst Zn = 1.08883;\n\n// from https://github.com/antimatter15/rgb-lab/blob/master/color.js\n\nexport function fromCIELab(cieLabRaster) {\n const { width, height } = cieLabRaster;\n const rgbRaster = new Uint8Array(width * height * 3);\n\n for (let i = 0, j = 0; i < cieLabRaster.length; i += 3, j += 3) {\n const L = cieLabRaster[i + 0];\n const a_ = cieLabRaster[i + 1] << 24 >> 24; // conversion from uint8 to int8\n const b_ = cieLabRaster[i + 2] << 24 >> 24; // same\n\n let y = (L + 16) / 116;\n let x = (a_ / 500) + y;\n let z = y - (b_ / 200);\n let r;\n let g;\n let b;\n\n x = Xn * ((x * x * x > 0.008856) ? x * x * x : (x - (16 / 116)) / 7.787);\n y = Yn * ((y * y * y > 0.008856) ? y * y * y : (y - (16 / 116)) / 7.787);\n z = Zn * ((z * z * z > 0.008856) ? z * z * z : (z - (16 / 116)) / 7.787);\n\n r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n r = (r > 0.0031308) ? ((1.055 * (r ** (1 / 2.4))) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? ((1.055 * (g ** (1 / 2.4))) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? ((1.055 * (b ** (1 / 2.4))) - 0.055) : 12.92 * b;\n\n rgbRaster[j] = Math.max(0, Math.min(1, r)) * 255;\n rgbRaster[j + 1] = Math.max(0, Math.min(1, g)) * 255;\n rgbRaster[j + 2] = Math.max(0, Math.min(1, b)) * 255;\n }\n return rgbRaster;\n}\n","const registry = new Map();\n\nexport function addDecoder(cases, importFn) {\n if (!Array.isArray(cases)) {\n cases = [cases]; // eslint-disable-line no-param-reassign\n }\n cases.forEach((c) => registry.set(c, importFn));\n}\n\nexport async function getDecoder(fileDirectory) {\n const importFn = registry.get(fileDirectory.Compression);\n if (!importFn) {\n throw new Error(`Unknown compression method identifier: ${fileDirectory.Compression}`);\n }\n const Decoder = await importFn();\n return new Decoder(fileDirectory);\n}\n\n// Add default decoders to registry (end-user may override with other implementations)\naddDecoder([undefined, 1], () => import('./raw.js').then((m) => m.default));\naddDecoder(5, () => import('./lzw.js').then((m) => m.default));\naddDecoder(6, () => {\n throw new Error('old style JPEG compression is not supported.');\n});\naddDecoder(7, () => import('./jpeg.js').then((m) => m.default));\naddDecoder([8, 32946], () => import('./deflate.js').then((m) => m.default));\naddDecoder(32773, () => import('./packbits.js').then((m) => m.default));\naddDecoder(34887, () => import('./lerc.js')\n .then(async (m) => {\n await m.zstd.init();\n return m;\n })\n .then((m) => m.default),\n);\naddDecoder(50001, () => import('./webimage.js').then((m) => m.default));\n","/**\n * @module resample\n */\n\nfunction copyNewSize(array, width, height, samplesPerPixel = 1) {\n return new (Object.getPrototypeOf(array).constructor)(width * height * samplesPerPixel);\n}\n\n/**\n * Resample the input arrays using nearest neighbor value selection.\n * @param {TypedArray[]} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @returns {TypedArray[]} The resampled rasters\n */\nexport function resampleNearest(valueArrays, inWidth, inHeight, outWidth, outHeight) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n return valueArrays.map((array) => {\n const newArray = copyNewSize(array, outWidth, outHeight);\n for (let y = 0; y < outHeight; ++y) {\n const cy = Math.min(Math.round(relY * y), inHeight - 1);\n for (let x = 0; x < outWidth; ++x) {\n const cx = Math.min(Math.round(relX * x), inWidth - 1);\n const value = array[(cy * inWidth) + cx];\n newArray[(y * outWidth) + x] = value;\n }\n }\n return newArray;\n });\n}\n\n// simple linear interpolation, code from:\n// https://en.wikipedia.org/wiki/Linear_interpolation#Programming_language_support\nfunction lerp(v0, v1, t) {\n return ((1 - t) * v0) + (t * v1);\n}\n\n/**\n * Resample the input arrays using bilinear interpolation.\n * @param {TypedArray[]} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @returns {TypedArray[]} The resampled rasters\n */\nexport function resampleBilinear(valueArrays, inWidth, inHeight, outWidth, outHeight) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n\n return valueArrays.map((array) => {\n const newArray = copyNewSize(array, outWidth, outHeight);\n for (let y = 0; y < outHeight; ++y) {\n const rawY = relY * y;\n\n const yl = Math.floor(rawY);\n const yh = Math.min(Math.ceil(rawY), (inHeight - 1));\n\n for (let x = 0; x < outWidth; ++x) {\n const rawX = relX * x;\n const tx = rawX % 1;\n\n const xl = Math.floor(rawX);\n const xh = Math.min(Math.ceil(rawX), (inWidth - 1));\n\n const ll = array[(yl * inWidth) + xl];\n const hl = array[(yl * inWidth) + xh];\n const lh = array[(yh * inWidth) + xl];\n const hh = array[(yh * inWidth) + xh];\n\n const value = lerp(\n lerp(ll, hl, tx),\n lerp(lh, hh, tx),\n rawY % 1,\n );\n newArray[(y * outWidth) + x] = value;\n }\n }\n return newArray;\n });\n}\n\n/**\n * Resample the input arrays using the selected resampling method.\n * @param {TypedArray[]} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {string} [method = 'nearest'] The desired resampling method\n * @returns {TypedArray[]} The resampled rasters\n */\nexport function resample(valueArrays, inWidth, inHeight, outWidth, outHeight, method = 'nearest') {\n switch (method.toLowerCase()) {\n case 'nearest':\n return resampleNearest(valueArrays, inWidth, inHeight, outWidth, outHeight);\n case 'bilinear':\n case 'linear':\n return resampleBilinear(valueArrays, inWidth, inHeight, outWidth, outHeight);\n default:\n throw new Error(`Unsupported resampling method: '${method}'`);\n }\n}\n\n/**\n * Resample the pixel interleaved input array using nearest neighbor value selection.\n * @param {TypedArray} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {number} samples The number of samples per pixel for pixel\n * interleaved data\n * @returns {TypedArray} The resampled raster\n */\nexport function resampleNearestInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n\n const newArray = copyNewSize(valueArray, outWidth, outHeight, samples);\n for (let y = 0; y < outHeight; ++y) {\n const cy = Math.min(Math.round(relY * y), inHeight - 1);\n for (let x = 0; x < outWidth; ++x) {\n const cx = Math.min(Math.round(relX * x), inWidth - 1);\n for (let i = 0; i < samples; ++i) {\n const value = valueArray[(cy * inWidth * samples) + (cx * samples) + i];\n newArray[(y * outWidth * samples) + (x * samples) + i] = value;\n }\n }\n }\n return newArray;\n}\n\n/**\n * Resample the pixel interleaved input array using bilinear interpolation.\n * @param {TypedArray} valueArrays The input arrays to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {number} samples The number of samples per pixel for pixel\n * interleaved data\n * @returns {TypedArray} The resampled raster\n */\nexport function resampleBilinearInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples) {\n const relX = inWidth / outWidth;\n const relY = inHeight / outHeight;\n const newArray = copyNewSize(valueArray, outWidth, outHeight, samples);\n for (let y = 0; y < outHeight; ++y) {\n const rawY = relY * y;\n\n const yl = Math.floor(rawY);\n const yh = Math.min(Math.ceil(rawY), (inHeight - 1));\n\n for (let x = 0; x < outWidth; ++x) {\n const rawX = relX * x;\n const tx = rawX % 1;\n\n const xl = Math.floor(rawX);\n const xh = Math.min(Math.ceil(rawX), (inWidth - 1));\n\n for (let i = 0; i < samples; ++i) {\n const ll = valueArray[(yl * inWidth * samples) + (xl * samples) + i];\n const hl = valueArray[(yl * inWidth * samples) + (xh * samples) + i];\n const lh = valueArray[(yh * inWidth * samples) + (xl * samples) + i];\n const hh = valueArray[(yh * inWidth * samples) + (xh * samples) + i];\n\n const value = lerp(\n lerp(ll, hl, tx),\n lerp(lh, hh, tx),\n rawY % 1,\n );\n newArray[(y * outWidth * samples) + (x * samples) + i] = value;\n }\n }\n }\n return newArray;\n}\n\n/**\n * Resample the pixel interleaved input array using the selected resampling method.\n * @param {TypedArray} valueArray The input array to resample\n * @param {number} inWidth The width of the input rasters\n * @param {number} inHeight The height of the input rasters\n * @param {number} outWidth The desired width of the output rasters\n * @param {number} outHeight The desired height of the output rasters\n * @param {number} samples The number of samples per pixel for pixel\n * interleaved data\n * @param {string} [method = 'nearest'] The desired resampling method\n * @returns {TypedArray} The resampled rasters\n */\nexport function resampleInterleaved(valueArray, inWidth, inHeight, outWidth, outHeight, samples, method = 'nearest') {\n switch (method.toLowerCase()) {\n case 'nearest':\n return resampleNearestInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples,\n );\n case 'bilinear':\n case 'linear':\n return resampleBilinearInterleaved(\n valueArray, inWidth, inHeight, outWidth, outHeight, samples,\n );\n default:\n throw new Error(`Unsupported resampling method: '${method}'`);\n }\n}\n","/** @module geotiffimage */\nimport { getFloat16 } from '@petamoriken/float16';\nimport getAttribute from 'xml-utils/get-attribute.js';\nimport findTagsByName from 'xml-utils/find-tags-by-name.js';\n\nimport { photometricInterpretations, ExtraSamplesValues } from './globals.js';\nimport { fromWhiteIsZero, fromBlackIsZero, fromPalette, fromCMYK, fromYCbCr, fromCIELab } from './rgb.js';\nimport { getDecoder } from './compression/index.js';\nimport { resample, resampleInterleaved } from './resample.js';\n\n/**\n * @typedef {Object} ReadRasterOptions\n * @property {Array} [window=whole window] the subset to read data from in pixels.\n * @property {Array} [bbox=whole image] the subset to read data from in\n * geographical coordinates.\n * @property {Array} [samples=all samples] the selection of samples to read from. Default is all samples.\n * @property {boolean} [interleave=false] whether the data shall be read\n * in one single array or separate\n * arrays.\n * @property {Pool} [pool=null] The optional decoder pool to use.\n * @property {number} [width] The desired width of the output. When the width is not the\n * same as the images, resampling will be performed.\n * @property {number} [height] The desired height of the output. When the width is not the\n * same as the images, resampling will be performed.\n * @property {string} [resampleMethod='nearest'] The desired resampling method.\n * @property {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @property {number|number[]} [fillValue] The value to use for parts of the image\n * outside of the images extent. When multiple\n * samples are requested, an array of fill values\n * can be passed.\n */\n\n/** @typedef {import(\"./geotiff.js\").TypedArray} TypedArray */\n/** @typedef {import(\"./geotiff.js\").ReadRasterResult} ReadRasterResult */\n\nfunction sum(array, start, end) {\n let s = 0;\n for (let i = start; i < end; ++i) {\n s += array[i];\n }\n return s;\n}\n\nfunction arrayForType(format, bitsPerSample, size) {\n switch (format) {\n case 1: // unsigned integer data\n if (bitsPerSample <= 8) {\n return new Uint8Array(size);\n } else if (bitsPerSample <= 16) {\n return new Uint16Array(size);\n } else if (bitsPerSample <= 32) {\n return new Uint32Array(size);\n }\n break;\n case 2: // twos complement signed integer data\n if (bitsPerSample === 8) {\n return new Int8Array(size);\n } else if (bitsPerSample === 16) {\n return new Int16Array(size);\n } else if (bitsPerSample === 32) {\n return new Int32Array(size);\n }\n break;\n case 3: // floating point data\n switch (bitsPerSample) {\n case 16:\n case 32:\n return new Float32Array(size);\n case 64:\n return new Float64Array(size);\n default:\n break;\n }\n break;\n default:\n break;\n }\n throw Error('Unsupported data format/bitsPerSample');\n}\n\nfunction needsNormalization(format, bitsPerSample) {\n if ((format === 1 || format === 2) && bitsPerSample <= 32 && bitsPerSample % 8 === 0) {\n return false;\n } else if (format === 3 && (bitsPerSample === 16 || bitsPerSample === 32 || bitsPerSample === 64)) {\n return false;\n }\n return true;\n}\n\nfunction normalizeArray(inBuffer, format, planarConfiguration, samplesPerPixel, bitsPerSample, tileWidth, tileHeight) {\n // const inByteArray = new Uint8Array(inBuffer);\n const view = new DataView(inBuffer);\n const outSize = planarConfiguration === 2\n ? tileHeight * tileWidth\n : tileHeight * tileWidth * samplesPerPixel;\n const samplesToTransfer = planarConfiguration === 2\n ? 1 : samplesPerPixel;\n const outArray = arrayForType(format, bitsPerSample, outSize);\n // let pixel = 0;\n\n const bitMask = parseInt('1'.repeat(bitsPerSample), 2);\n\n if (format === 1) { // unsigned integer\n // translation of https://github.com/OSGeo/gdal/blob/master/gdal/frmts/gtiff/geotiff.cpp#L7337\n let pixelBitSkip;\n // let sampleBitOffset = 0;\n if (planarConfiguration === 1) {\n pixelBitSkip = samplesPerPixel * bitsPerSample;\n // sampleBitOffset = (samplesPerPixel - 1) * bitsPerSample;\n } else {\n pixelBitSkip = bitsPerSample;\n }\n\n // Bits per line rounds up to next byte boundary.\n let bitsPerLine = tileWidth * pixelBitSkip;\n if ((bitsPerLine & 7) !== 0) {\n bitsPerLine = (bitsPerLine + 7) & (~7);\n }\n\n for (let y = 0; y < tileHeight; ++y) {\n const lineBitOffset = y * bitsPerLine;\n for (let x = 0; x < tileWidth; ++x) {\n const pixelBitOffset = lineBitOffset + (x * samplesToTransfer * bitsPerSample);\n for (let i = 0; i < samplesToTransfer; ++i) {\n const bitOffset = pixelBitOffset + (i * bitsPerSample);\n const outIndex = (((y * tileWidth) + x) * samplesToTransfer) + i;\n\n const byteOffset = Math.floor(bitOffset / 8);\n const innerBitOffset = bitOffset % 8;\n if (innerBitOffset + bitsPerSample <= 8) {\n outArray[outIndex] = (view.getUint8(byteOffset) >> (8 - bitsPerSample) - innerBitOffset) & bitMask;\n } else if (innerBitOffset + bitsPerSample <= 16) {\n outArray[outIndex] = (view.getUint16(byteOffset) >> (16 - bitsPerSample) - innerBitOffset) & bitMask;\n } else if (innerBitOffset + bitsPerSample <= 24) {\n const raw = (view.getUint16(byteOffset) << 8) | (view.getUint8(byteOffset + 2));\n outArray[outIndex] = (raw >> (24 - bitsPerSample) - innerBitOffset) & bitMask;\n } else {\n outArray[outIndex] = (view.getUint32(byteOffset) >> (32 - bitsPerSample) - innerBitOffset) & bitMask;\n }\n\n // let outWord = 0;\n // for (let bit = 0; bit < bitsPerSample; ++bit) {\n // if (inByteArray[bitOffset >> 3]\n // & (0x80 >> (bitOffset & 7))) {\n // outWord |= (1 << (bitsPerSample - 1 - bit));\n // }\n // ++bitOffset;\n // }\n\n // outArray[outIndex] = outWord;\n // outArray[pixel] = outWord;\n // pixel += 1;\n }\n // bitOffset = bitOffset + pixelBitSkip - bitsPerSample;\n }\n }\n } else if (format === 3) { // floating point\n // Float16 is handled elsewhere\n // normalize 16/24 bit floats to 32 bit floats in the array\n // console.time();\n // if (bitsPerSample === 16) {\n // for (let byte = 0, outIndex = 0; byte < inBuffer.byteLength; byte += 2, ++outIndex) {\n // outArray[outIndex] = getFloat16(view, byte);\n // }\n // }\n // console.timeEnd()\n }\n\n return outArray.buffer;\n}\n\n/**\n * GeoTIFF sub-file image.\n */\nclass GeoTIFFImage {\n /**\n * @constructor\n * @param {Object} fileDirectory The parsed file directory\n * @param {Object} geoKeys The parsed geo-keys\n * @param {DataView} dataView The DataView for the underlying file.\n * @param {Boolean} littleEndian Whether the file is encoded in little or big endian\n * @param {Boolean} cache Whether or not decoded tiles shall be cached\n * @param {import('./source/basesource').BaseSource} source The datasource to read from\n */\n constructor(fileDirectory, geoKeys, dataView, littleEndian, cache, source) {\n this.fileDirectory = fileDirectory;\n this.geoKeys = geoKeys;\n this.dataView = dataView;\n this.littleEndian = littleEndian;\n this.tiles = cache ? {} : null;\n this.isTiled = !fileDirectory.StripOffsets;\n const planarConfiguration = fileDirectory.PlanarConfiguration;\n this.planarConfiguration = (typeof planarConfiguration === 'undefined') ? 1 : planarConfiguration;\n if (this.planarConfiguration !== 1 && this.planarConfiguration !== 2) {\n throw new Error('Invalid planar configuration.');\n }\n\n this.source = source;\n }\n\n /**\n * Returns the associated parsed file directory.\n * @returns {Object} the parsed file directory\n */\n getFileDirectory() {\n return this.fileDirectory;\n }\n\n /**\n * Returns the associated parsed geo keys.\n * @returns {Object} the parsed geo keys\n */\n getGeoKeys() {\n return this.geoKeys;\n }\n\n /**\n * Returns the width of the image.\n * @returns {Number} the width of the image\n */\n getWidth() {\n return this.fileDirectory.ImageWidth;\n }\n\n /**\n * Returns the height of the image.\n * @returns {Number} the height of the image\n */\n getHeight() {\n return this.fileDirectory.ImageLength;\n }\n\n /**\n * Returns the number of samples per pixel.\n * @returns {Number} the number of samples per pixel\n */\n getSamplesPerPixel() {\n return typeof this.fileDirectory.SamplesPerPixel !== 'undefined'\n ? this.fileDirectory.SamplesPerPixel : 1;\n }\n\n /**\n * Returns the width of each tile.\n * @returns {Number} the width of each tile\n */\n getTileWidth() {\n return this.isTiled ? this.fileDirectory.TileWidth : this.getWidth();\n }\n\n /**\n * Returns the height of each tile.\n * @returns {Number} the height of each tile\n */\n getTileHeight() {\n if (this.isTiled) {\n return this.fileDirectory.TileLength;\n }\n if (typeof this.fileDirectory.RowsPerStrip !== 'undefined') {\n return Math.min(this.fileDirectory.RowsPerStrip, this.getHeight());\n }\n return this.getHeight();\n }\n\n getBlockWidth() {\n return this.getTileWidth();\n }\n\n getBlockHeight(y) {\n if (this.isTiled || (y + 1) * this.getTileHeight() <= this.getHeight()) {\n return this.getTileHeight();\n } else {\n return this.getHeight() - (y * this.getTileHeight());\n }\n }\n\n /**\n * Calculates the number of bytes for each pixel across all samples. Only full\n * bytes are supported, an exception is thrown when this is not the case.\n * @returns {Number} the bytes per pixel\n */\n getBytesPerPixel() {\n let bytes = 0;\n for (let i = 0; i < this.fileDirectory.BitsPerSample.length; ++i) {\n bytes += this.getSampleByteSize(i);\n }\n return bytes;\n }\n\n getSampleByteSize(i) {\n if (i >= this.fileDirectory.BitsPerSample.length) {\n throw new RangeError(`Sample index ${i} is out of range.`);\n }\n return Math.ceil(this.fileDirectory.BitsPerSample[i] / 8);\n }\n\n getReaderForSample(sampleIndex) {\n const format = this.fileDirectory.SampleFormat\n ? this.fileDirectory.SampleFormat[sampleIndex] : 1;\n const bitsPerSample = this.fileDirectory.BitsPerSample[sampleIndex];\n switch (format) {\n case 1: // unsigned integer data\n if (bitsPerSample <= 8) {\n return DataView.prototype.getUint8;\n } else if (bitsPerSample <= 16) {\n return DataView.prototype.getUint16;\n } else if (bitsPerSample <= 32) {\n return DataView.prototype.getUint32;\n }\n break;\n case 2: // twos complement signed integer data\n if (bitsPerSample <= 8) {\n return DataView.prototype.getInt8;\n } else if (bitsPerSample <= 16) {\n return DataView.prototype.getInt16;\n } else if (bitsPerSample <= 32) {\n return DataView.prototype.getInt32;\n }\n break;\n case 3:\n switch (bitsPerSample) {\n case 16:\n return function (offset, littleEndian) {\n return getFloat16(this, offset, littleEndian);\n };\n case 32:\n return DataView.prototype.getFloat32;\n case 64:\n return DataView.prototype.getFloat64;\n default:\n break;\n }\n break;\n default:\n break;\n }\n throw Error('Unsupported data format/bitsPerSample');\n }\n\n getSampleFormat(sampleIndex = 0) {\n return this.fileDirectory.SampleFormat\n ? this.fileDirectory.SampleFormat[sampleIndex] : 1;\n }\n\n getBitsPerSample(sampleIndex = 0) {\n return this.fileDirectory.BitsPerSample[sampleIndex];\n }\n\n getArrayForSample(sampleIndex, size) {\n const format = this.getSampleFormat(sampleIndex);\n const bitsPerSample = this.getBitsPerSample(sampleIndex);\n return arrayForType(format, bitsPerSample, size);\n }\n\n /**\n * Returns the decoded strip or tile.\n * @param {Number} x the strip or tile x-offset\n * @param {Number} y the tile y-offset (0 for stripped images)\n * @param {Number} sample the sample to get for separated samples\n * @param {import(\"./geotiff\").Pool|import(\"./geotiff\").BaseDecoder} poolOrDecoder the decoder or decoder pool\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise.}\n */\n async getTileOrStrip(x, y, sample, poolOrDecoder, signal) {\n const numTilesPerRow = Math.ceil(this.getWidth() / this.getTileWidth());\n const numTilesPerCol = Math.ceil(this.getHeight() / this.getTileHeight());\n let index;\n const { tiles } = this;\n if (this.planarConfiguration === 1) {\n index = (y * numTilesPerRow) + x;\n } else if (this.planarConfiguration === 2) {\n index = (sample * numTilesPerRow * numTilesPerCol) + (y * numTilesPerRow) + x;\n }\n\n let offset;\n let byteCount;\n if (this.isTiled) {\n offset = this.fileDirectory.TileOffsets[index];\n byteCount = this.fileDirectory.TileByteCounts[index];\n } else {\n offset = this.fileDirectory.StripOffsets[index];\n byteCount = this.fileDirectory.StripByteCounts[index];\n }\n const slice = (await this.source.fetch([{ offset, length: byteCount }], signal))[0];\n\n let request;\n if (tiles === null || !tiles[index]) {\n // resolve each request by potentially applying array normalization\n request = (async () => {\n let data = await poolOrDecoder.decode(this.fileDirectory, slice);\n const sampleFormat = this.getSampleFormat();\n const bitsPerSample = this.getBitsPerSample();\n if (needsNormalization(sampleFormat, bitsPerSample)) {\n data = normalizeArray(\n data,\n sampleFormat,\n this.planarConfiguration,\n this.getSamplesPerPixel(),\n bitsPerSample,\n this.getTileWidth(),\n this.getBlockHeight(y),\n );\n }\n return data;\n })();\n\n // set the cache\n if (tiles !== null) {\n tiles[index] = request;\n }\n } else {\n // get from the cache\n request = tiles[index];\n }\n\n // cache the tile request\n return { x, y, sample, data: await request };\n }\n\n /**\n * Internal read function.\n * @private\n * @param {Array} imageWindow The image window in pixel coordinates\n * @param {Array} samples The selected samples (0-based indices)\n * @param {TypedArray|TypedArray[]} valueArrays The array(s) to write into\n * @param {Boolean} interleave Whether or not to write in an interleaved manner\n * @param {import(\"./geotiff\").Pool|AbstractDecoder} poolOrDecoder the decoder or decoder pool\n * @param {number} width the width of window to be read into\n * @param {number} height the height of window to be read into\n * @param {number} resampleMethod the resampling method to be used when interpolating\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise}\n */\n async _readRaster(imageWindow, samples, valueArrays, interleave, poolOrDecoder, width,\n height, resampleMethod, signal) {\n const tileWidth = this.getTileWidth();\n const tileHeight = this.getTileHeight();\n const imageWidth = this.getWidth();\n const imageHeight = this.getHeight();\n\n const minXTile = Math.max(Math.floor(imageWindow[0] / tileWidth), 0);\n const maxXTile = Math.min(\n Math.ceil(imageWindow[2] / tileWidth),\n Math.ceil(imageWidth / tileWidth),\n );\n const minYTile = Math.max(Math.floor(imageWindow[1] / tileHeight), 0);\n const maxYTile = Math.min(\n Math.ceil(imageWindow[3] / tileHeight),\n Math.ceil(imageHeight / tileHeight),\n );\n const windowWidth = imageWindow[2] - imageWindow[0];\n\n let bytesPerPixel = this.getBytesPerPixel();\n\n const srcSampleOffsets = [];\n const sampleReaders = [];\n for (let i = 0; i < samples.length; ++i) {\n if (this.planarConfiguration === 1) {\n srcSampleOffsets.push(sum(this.fileDirectory.BitsPerSample, 0, samples[i]) / 8);\n } else {\n srcSampleOffsets.push(0);\n }\n sampleReaders.push(this.getReaderForSample(samples[i]));\n }\n\n const promises = [];\n const { littleEndian } = this;\n\n for (let yTile = minYTile; yTile < maxYTile; ++yTile) {\n for (let xTile = minXTile; xTile < maxXTile; ++xTile) {\n let getPromise;\n if (this.planarConfiguration === 1) {\n getPromise = this.getTileOrStrip(xTile, yTile, 0, poolOrDecoder, signal);\n }\n for (let sampleIndex = 0; sampleIndex < samples.length; ++sampleIndex) {\n const si = sampleIndex;\n const sample = samples[sampleIndex];\n if (this.planarConfiguration === 2) {\n bytesPerPixel = this.getSampleByteSize(sample);\n getPromise = this.getTileOrStrip(xTile, yTile, sample, poolOrDecoder, signal);\n }\n const promise = getPromise.then((tile) => {\n const buffer = tile.data;\n const dataView = new DataView(buffer);\n const blockHeight = this.getBlockHeight(tile.y);\n const firstLine = tile.y * tileHeight;\n const firstCol = tile.x * tileWidth;\n const lastLine = firstLine + blockHeight;\n const lastCol = (tile.x + 1) * tileWidth;\n const reader = sampleReaders[si];\n\n const ymax = Math.min(blockHeight, blockHeight - (lastLine - imageWindow[3]), imageHeight - firstLine);\n const xmax = Math.min(tileWidth, tileWidth - (lastCol - imageWindow[2]), imageWidth - firstCol);\n\n for (let y = Math.max(0, imageWindow[1] - firstLine); y < ymax; ++y) {\n for (let x = Math.max(0, imageWindow[0] - firstCol); x < xmax; ++x) {\n const pixelOffset = ((y * tileWidth) + x) * bytesPerPixel;\n const value = reader.call(\n dataView, pixelOffset + srcSampleOffsets[si], littleEndian,\n );\n let windowCoordinate;\n if (interleave) {\n windowCoordinate = ((y + firstLine - imageWindow[1]) * windowWidth * samples.length)\n + ((x + firstCol - imageWindow[0]) * samples.length)\n + si;\n valueArrays[windowCoordinate] = value;\n } else {\n windowCoordinate = (\n (y + firstLine - imageWindow[1]) * windowWidth\n ) + x + firstCol - imageWindow[0];\n valueArrays[si][windowCoordinate] = value;\n }\n }\n }\n });\n promises.push(promise);\n }\n }\n }\n await Promise.all(promises);\n\n if ((width && (imageWindow[2] - imageWindow[0]) !== width)\n || (height && (imageWindow[3] - imageWindow[1]) !== height)) {\n let resampled;\n if (interleave) {\n resampled = resampleInterleaved(\n valueArrays,\n imageWindow[2] - imageWindow[0],\n imageWindow[3] - imageWindow[1],\n width, height,\n samples.length,\n resampleMethod,\n );\n } else {\n resampled = resample(\n valueArrays,\n imageWindow[2] - imageWindow[0],\n imageWindow[3] - imageWindow[1],\n width, height,\n resampleMethod,\n );\n }\n resampled.width = width;\n resampled.height = height;\n return resampled;\n }\n\n valueArrays.width = width || imageWindow[2] - imageWindow[0];\n valueArrays.height = height || imageWindow[3] - imageWindow[1];\n\n return valueArrays;\n }\n\n /**\n * Reads raster data from the image. This function reads all selected samples\n * into separate arrays of the correct type for that sample or into a single\n * combined array when `interleave` is set. When provided, only a subset\n * of the raster is read for each sample.\n *\n * @param {ReadRasterOptions} [options={}] optional parameters\n * @returns {Promise} the decoded arrays as a promise\n */\n async readRasters({\n window: wnd, samples = [], interleave, pool = null,\n width, height, resampleMethod, fillValue, signal,\n } = {}) {\n const imageWindow = wnd || [0, 0, this.getWidth(), this.getHeight()];\n\n // check parameters\n if (imageWindow[0] > imageWindow[2] || imageWindow[1] > imageWindow[3]) {\n throw new Error('Invalid subsets');\n }\n\n const imageWindowWidth = imageWindow[2] - imageWindow[0];\n const imageWindowHeight = imageWindow[3] - imageWindow[1];\n const numPixels = imageWindowWidth * imageWindowHeight;\n const samplesPerPixel = this.getSamplesPerPixel();\n\n if (!samples || !samples.length) {\n for (let i = 0; i < samplesPerPixel; ++i) {\n samples.push(i);\n }\n } else {\n for (let i = 0; i < samples.length; ++i) {\n if (samples[i] >= samplesPerPixel) {\n return Promise.reject(new RangeError(`Invalid sample index '${samples[i]}'.`));\n }\n }\n }\n let valueArrays;\n if (interleave) {\n const format = this.fileDirectory.SampleFormat\n ? Math.max.apply(null, this.fileDirectory.SampleFormat) : 1;\n const bitsPerSample = Math.max.apply(null, this.fileDirectory.BitsPerSample);\n valueArrays = arrayForType(format, bitsPerSample, numPixels * samples.length);\n if (fillValue) {\n valueArrays.fill(fillValue);\n }\n } else {\n valueArrays = [];\n for (let i = 0; i < samples.length; ++i) {\n const valueArray = this.getArrayForSample(samples[i], numPixels);\n if (Array.isArray(fillValue) && i < fillValue.length) {\n valueArray.fill(fillValue[i]);\n } else if (fillValue && !Array.isArray(fillValue)) {\n valueArray.fill(fillValue);\n }\n valueArrays.push(valueArray);\n }\n }\n\n const poolOrDecoder = pool || await getDecoder(this.fileDirectory);\n\n const result = await this._readRaster(\n imageWindow, samples, valueArrays, interleave, poolOrDecoder, width, height, resampleMethod, signal,\n );\n return result;\n }\n\n /**\n * Reads raster data from the image as RGB. The result is always an\n * interleaved typed array.\n * Colorspaces other than RGB will be transformed to RGB, color maps expanded.\n * When no other method is applicable, the first sample is used to produce a\n * grayscale image.\n * When provided, only a subset of the raster is read for each sample.\n *\n * @param {Object} [options] optional parameters\n * @param {Array} [options.window] the subset to read data from in pixels.\n * @param {boolean} [options.interleave=true] whether the data shall be read\n * in one single array or separate\n * arrays.\n * @param {import(\"./geotiff\").Pool} [options.pool=null] The optional decoder pool to use.\n * @param {number} [options.width] The desired width of the output. When the width is no the\n * same as the images, resampling will be performed.\n * @param {number} [options.height] The desired height of the output. When the width is no the\n * same as the images, resampling will be performed.\n * @param {string} [options.resampleMethod='nearest'] The desired resampling method.\n * @param {boolean} [options.enableAlpha=false] Enable reading alpha channel if present.\n * @param {AbortSignal} [options.signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise} the RGB array as a Promise\n */\n async readRGB({ window, interleave = true, pool = null, width, height,\n resampleMethod, enableAlpha = false, signal } = {}) {\n const imageWindow = window || [0, 0, this.getWidth(), this.getHeight()];\n\n // check parameters\n if (imageWindow[0] > imageWindow[2] || imageWindow[1] > imageWindow[3]) {\n throw new Error('Invalid subsets');\n }\n\n const pi = this.fileDirectory.PhotometricInterpretation;\n\n if (pi === photometricInterpretations.RGB) {\n let s = [0, 1, 2];\n if ((!(this.fileDirectory.ExtraSamples === ExtraSamplesValues.Unspecified)) && enableAlpha) {\n s = [];\n for (let i = 0; i < this.fileDirectory.BitsPerSample.length; i += 1) {\n s.push(i);\n }\n }\n return this.readRasters({\n window,\n interleave,\n samples: s,\n pool,\n width,\n height,\n resampleMethod,\n signal,\n });\n }\n\n let samples;\n switch (pi) {\n case photometricInterpretations.WhiteIsZero:\n case photometricInterpretations.BlackIsZero:\n case photometricInterpretations.Palette:\n samples = [0];\n break;\n case photometricInterpretations.CMYK:\n samples = [0, 1, 2, 3];\n break;\n case photometricInterpretations.YCbCr:\n case photometricInterpretations.CIELab:\n samples = [0, 1, 2];\n break;\n default:\n throw new Error('Invalid or unsupported photometric interpretation.');\n }\n\n const subOptions = {\n window: imageWindow,\n interleave: true,\n samples,\n pool,\n width,\n height,\n resampleMethod,\n signal,\n };\n const { fileDirectory } = this;\n const raster = await this.readRasters(subOptions);\n\n const max = 2 ** this.fileDirectory.BitsPerSample[0];\n let data;\n switch (pi) {\n case photometricInterpretations.WhiteIsZero:\n data = fromWhiteIsZero(raster, max);\n break;\n case photometricInterpretations.BlackIsZero:\n data = fromBlackIsZero(raster, max);\n break;\n case photometricInterpretations.Palette:\n data = fromPalette(raster, fileDirectory.ColorMap);\n break;\n case photometricInterpretations.CMYK:\n data = fromCMYK(raster);\n break;\n case photometricInterpretations.YCbCr:\n data = fromYCbCr(raster);\n break;\n case photometricInterpretations.CIELab:\n data = fromCIELab(raster);\n break;\n default:\n throw new Error('Unsupported photometric interpretation.');\n }\n\n // if non-interleaved data is requested, we must split the channels\n // into their respective arrays\n if (!interleave) {\n const red = new Uint8Array(data.length / 3);\n const green = new Uint8Array(data.length / 3);\n const blue = new Uint8Array(data.length / 3);\n for (let i = 0, j = 0; i < data.length; i += 3, ++j) {\n red[j] = data[i];\n green[j] = data[i + 1];\n blue[j] = data[i + 2];\n }\n data = [red, green, blue];\n }\n\n data.width = raster.width;\n data.height = raster.height;\n return data;\n }\n\n /**\n * Returns an array of tiepoints.\n * @returns {Object[]}\n */\n getTiePoints() {\n if (!this.fileDirectory.ModelTiepoint) {\n return [];\n }\n\n const tiePoints = [];\n for (let i = 0; i < this.fileDirectory.ModelTiepoint.length; i += 6) {\n tiePoints.push({\n i: this.fileDirectory.ModelTiepoint[i],\n j: this.fileDirectory.ModelTiepoint[i + 1],\n k: this.fileDirectory.ModelTiepoint[i + 2],\n x: this.fileDirectory.ModelTiepoint[i + 3],\n y: this.fileDirectory.ModelTiepoint[i + 4],\n z: this.fileDirectory.ModelTiepoint[i + 5],\n });\n }\n return tiePoints;\n }\n\n /**\n * Returns the parsed GDAL metadata items.\n *\n * If sample is passed to null, dataset-level metadata will be returned.\n * Otherwise only metadata specific to the provided sample will be returned.\n *\n * @param {number} [sample=null] The sample index.\n * @returns {Object}\n */\n getGDALMetadata(sample = null) {\n const metadata = {};\n if (!this.fileDirectory.GDAL_METADATA) {\n return null;\n }\n const string = this.fileDirectory.GDAL_METADATA;\n\n let items = findTagsByName(string, 'Item');\n\n if (sample === null) {\n items = items.filter((item) => getAttribute(item, 'sample') === undefined);\n } else {\n items = items.filter((item) => Number(getAttribute(item, 'sample')) === sample);\n }\n\n for (let i = 0; i < items.length; ++i) {\n const item = items[i];\n metadata[getAttribute(item, 'name')] = item.inner;\n }\n return metadata;\n }\n\n /**\n * Returns the GDAL nodata value\n * @returns {number|null}\n */\n getGDALNoData() {\n if (!this.fileDirectory.GDAL_NODATA) {\n return null;\n }\n const string = this.fileDirectory.GDAL_NODATA;\n return Number(string.substring(0, string.length - 1));\n }\n\n /**\n * Returns the image origin as a XYZ-vector. When the image has no affine\n * transformation, then an exception is thrown.\n * @returns {Array} The origin as a vector\n */\n getOrigin() {\n const tiePoints = this.fileDirectory.ModelTiepoint;\n const modelTransformation = this.fileDirectory.ModelTransformation;\n if (tiePoints && tiePoints.length === 6) {\n return [\n tiePoints[3],\n tiePoints[4],\n tiePoints[5],\n ];\n }\n if (modelTransformation) {\n return [\n modelTransformation[3],\n modelTransformation[7],\n modelTransformation[11],\n ];\n }\n throw new Error('The image does not have an affine transformation.');\n }\n\n /**\n * Returns the image resolution as a XYZ-vector. When the image has no affine\n * transformation, then an exception is thrown.\n * @param {GeoTIFFImage} [referenceImage=null] A reference image to calculate the resolution from\n * in cases when the current image does not have the\n * required tags on its own.\n * @returns {Array} The resolution as a vector\n */\n getResolution(referenceImage = null) {\n const modelPixelScale = this.fileDirectory.ModelPixelScale;\n const modelTransformation = this.fileDirectory.ModelTransformation;\n\n if (modelPixelScale) {\n return [\n modelPixelScale[0],\n -modelPixelScale[1],\n modelPixelScale[2],\n ];\n }\n if (modelTransformation) {\n if (modelTransformation[1] === 0 && modelTransformation[4] === 0) {\n return [\n modelTransformation[0],\n -modelTransformation[5],\n modelTransformation[10],\n ];\n }\n return [\n Math.sqrt((modelTransformation[0] * modelTransformation[0])\n + (modelTransformation[4] * modelTransformation[4])),\n -Math.sqrt((modelTransformation[1] * modelTransformation[1])\n + (modelTransformation[5] * modelTransformation[5])),\n modelTransformation[10]];\n }\n\n if (referenceImage) {\n const [refResX, refResY, refResZ] = referenceImage.getResolution();\n return [\n refResX * referenceImage.getWidth() / this.getWidth(),\n refResY * referenceImage.getHeight() / this.getHeight(),\n refResZ * referenceImage.getWidth() / this.getWidth(),\n ];\n }\n\n throw new Error('The image does not have an affine transformation.');\n }\n\n /**\n * Returns whether or not the pixels of the image depict an area (or point).\n * @returns {Boolean} Whether the pixels are a point\n */\n pixelIsArea() {\n return this.geoKeys.GTRasterTypeGeoKey === 1;\n }\n\n /**\n * Returns the image bounding box as an array of 4 values: min-x, min-y,\n * max-x and max-y. When the image has no affine transformation, then an\n * exception is thrown.\n * @param {boolean} [tilegrid=false] If true return extent for a tilegrid\n * without adjustment for ModelTransformation.\n * @returns {Array} The bounding box\n */\n getBoundingBox(tilegrid = false) {\n const height = this.getHeight();\n const width = this.getWidth();\n\n if (this.fileDirectory.ModelTransformation && !tilegrid) {\n // eslint-disable-next-line no-unused-vars\n const [a, b, c, d, e, f, g, h] = this.fileDirectory.ModelTransformation;\n\n const corners = [\n [0, 0],\n [0, height],\n [width, 0],\n [width, height],\n ];\n\n const projected = corners.map(([I, J]) => [\n d + (a * I) + (b * J),\n h + (e * I) + (f * J),\n ]);\n\n const xs = projected.map((pt) => pt[0]);\n const ys = projected.map((pt) => pt[1]);\n\n return [\n Math.min(...xs),\n Math.min(...ys),\n Math.max(...xs),\n Math.max(...ys),\n ];\n } else {\n const origin = this.getOrigin();\n const resolution = this.getResolution();\n\n const x1 = origin[0];\n const y1 = origin[1];\n\n const x2 = x1 + (resolution[0] * width);\n const y2 = y1 + (resolution[1] * height);\n\n return [\n Math.min(x1, x2),\n Math.min(y1, y2),\n Math.max(x1, x2),\n Math.max(y1, y2),\n ];\n }\n }\n}\n\nexport default GeoTIFFImage;\n","import { getFloat16 } from '@petamoriken/float16';\n\nexport default class DataView64 {\n constructor(arrayBuffer) {\n this._dataView = new DataView(arrayBuffer);\n }\n\n get buffer() {\n return this._dataView.buffer;\n }\n\n getUint64(offset, littleEndian) {\n const left = this.getUint32(offset, littleEndian);\n const right = this.getUint32(offset + 4, littleEndian);\n let combined;\n if (littleEndian) {\n combined = left + ((2 ** 32) * right);\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n return combined;\n }\n combined = ((2 ** 32) * left) + right;\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n\n return combined;\n }\n\n // adapted from https://stackoverflow.com/a/55338384/8060591\n getInt64(offset, littleEndian) {\n let value = 0;\n const isNegative = (this._dataView.getUint8(offset + (littleEndian ? 7 : 0)) & 0x80) > 0;\n let carrying = true;\n for (let i = 0; i < 8; i++) {\n let byte = this._dataView.getUint8(offset + (littleEndian ? i : 7 - i));\n if (isNegative) {\n if (carrying) {\n if (byte !== 0x00) {\n byte = ~(byte - 1) & 0xff;\n carrying = false;\n }\n } else {\n byte = ~byte & 0xff;\n }\n }\n value += byte * (256 ** i);\n }\n if (isNegative) {\n value = -value;\n }\n return value;\n }\n\n getUint8(offset, littleEndian) {\n return this._dataView.getUint8(offset, littleEndian);\n }\n\n getInt8(offset, littleEndian) {\n return this._dataView.getInt8(offset, littleEndian);\n }\n\n getUint16(offset, littleEndian) {\n return this._dataView.getUint16(offset, littleEndian);\n }\n\n getInt16(offset, littleEndian) {\n return this._dataView.getInt16(offset, littleEndian);\n }\n\n getUint32(offset, littleEndian) {\n return this._dataView.getUint32(offset, littleEndian);\n }\n\n getInt32(offset, littleEndian) {\n return this._dataView.getInt32(offset, littleEndian);\n }\n\n getFloat16(offset, littleEndian) {\n return getFloat16(this._dataView, offset, littleEndian);\n }\n\n getFloat32(offset, littleEndian) {\n return this._dataView.getFloat32(offset, littleEndian);\n }\n\n getFloat64(offset, littleEndian) {\n return this._dataView.getFloat64(offset, littleEndian);\n }\n}\n","export default class DataSlice {\n constructor(arrayBuffer, sliceOffset, littleEndian, bigTiff) {\n this._dataView = new DataView(arrayBuffer);\n this._sliceOffset = sliceOffset;\n this._littleEndian = littleEndian;\n this._bigTiff = bigTiff;\n }\n\n get sliceOffset() {\n return this._sliceOffset;\n }\n\n get sliceTop() {\n return this._sliceOffset + this.buffer.byteLength;\n }\n\n get littleEndian() {\n return this._littleEndian;\n }\n\n get bigTiff() {\n return this._bigTiff;\n }\n\n get buffer() {\n return this._dataView.buffer;\n }\n\n covers(offset, length) {\n return this.sliceOffset <= offset && this.sliceTop >= offset + length;\n }\n\n readUint8(offset) {\n return this._dataView.getUint8(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readInt8(offset) {\n return this._dataView.getInt8(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readUint16(offset) {\n return this._dataView.getUint16(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readInt16(offset) {\n return this._dataView.getInt16(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readUint32(offset) {\n return this._dataView.getUint32(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readInt32(offset) {\n return this._dataView.getInt32(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readFloat32(offset) {\n return this._dataView.getFloat32(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readFloat64(offset) {\n return this._dataView.getFloat64(\n offset - this._sliceOffset, this._littleEndian,\n );\n }\n\n readUint64(offset) {\n const left = this.readUint32(offset);\n const right = this.readUint32(offset + 4);\n let combined;\n if (this._littleEndian) {\n combined = left + ((2 ** 32) * right);\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n return combined;\n }\n combined = ((2 ** 32) * left) + right;\n if (!Number.isSafeInteger(combined)) {\n throw new Error(\n `${combined} exceeds MAX_SAFE_INTEGER. `\n + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',\n );\n }\n\n return combined;\n }\n\n // adapted from https://stackoverflow.com/a/55338384/8060591\n readInt64(offset) {\n let value = 0;\n const isNegative = (this._dataView.getUint8(offset + (this._littleEndian ? 7 : 0)) & 0x80)\n > 0;\n let carrying = true;\n for (let i = 0; i < 8; i++) {\n let byte = this._dataView.getUint8(\n offset + (this._littleEndian ? i : 7 - i),\n );\n if (isNegative) {\n if (carrying) {\n if (byte !== 0x00) {\n byte = ~(byte - 1) & 0xff;\n carrying = false;\n }\n } else {\n byte = ~byte & 0xff;\n }\n }\n value += byte * (256 ** i);\n }\n if (isNegative) {\n value = -value;\n }\n return value;\n }\n\n readOffset(offset) {\n if (this._bigTiff) {\n return this.readUint64(offset);\n }\n return this.readUint32(offset);\n }\n}\n","import { getDecoder } from './compression/index.js';\n\nconst defaultPoolSize = typeof navigator !== 'undefined' ? (navigator.hardwareConcurrency || 2) : 2;\n\n/**\n * @module pool\n */\n\n/**\n * Pool for workers to decode chunks of the images.\n */\nclass Pool {\n /**\n * @constructor\n * @param {Number} [size] The size of the pool. Defaults to the number of CPUs\n * available. When this parameter is `null` or 0, then the\n * decoding will be done in the main thread.\n * @param {function(): Worker} [createWorker] A function that creates the decoder worker.\n * Defaults to a worker with all decoders that ship with geotiff.js. The `createWorker()`\n * function is expected to return a `Worker` compatible with Web Workers. For code that\n * runs in Node, [web-worker](https://www.npmjs.com/package/web-worker) is a good choice.\n *\n * A worker that uses a custom lzw decoder would look like this `my-custom-worker.js` file:\n * ```js\n * import { addDecoder, getDecoder } from 'geotiff';\n * addDecoder(5, () => import ('./my-custom-lzw').then((m) => m.default));\n * self.addEventListener('message', async (e) => {\n * const { id, fileDirectory, buffer } = e.data;\n * const decoder = await getDecoder(fileDirectory);\n * const decoded = await decoder.decode(fileDirectory, buffer);\n * self.postMessage({ decoded, id }, [decoded]);\n * });\n * ```\n * The way the above code is built into a worker by the `createWorker()` function\n * depends on the used bundler. For most bundlers, something like this will work:\n * ```js\n * function createWorker() {\n * return new Worker(new URL('./my-custom-worker.js', import.meta.url));\n * }\n * ```\n */\n constructor(size = defaultPoolSize, createWorker) {\n this.workers = null;\n this._awaitingDecoder = null;\n this.size = size;\n this.messageId = 0;\n if (size) {\n this._awaitingDecoder = createWorker ? Promise.resolve(createWorker) : new Promise((resolve) => {\n import('./worker/decoder.js').then((module) => {\n resolve(module.create);\n });\n });\n this._awaitingDecoder.then((create) => {\n this._awaitingDecoder = null;\n this.workers = [];\n for (let i = 0; i < size; i++) {\n this.workers.push({ worker: create(), idle: true });\n }\n });\n }\n }\n\n /**\n * Decode the given block of bytes with the set compression method.\n * @param {ArrayBuffer} buffer the array buffer of bytes to decode.\n * @returns {Promise} the decoded result as a `Promise`\n */\n async decode(fileDirectory, buffer) {\n if (this._awaitingDecoder) {\n await this._awaitingDecoder;\n }\n return this.size === 0\n ? getDecoder(fileDirectory).then((decoder) => decoder.decode(fileDirectory, buffer))\n : new Promise((resolve) => {\n const worker = this.workers.find((candidate) => candidate.idle)\n || this.workers[Math.floor(Math.random() * this.size)];\n worker.idle = false;\n const id = this.messageId++;\n const onMessage = (e) => {\n if (e.data.id === id) {\n worker.idle = true;\n resolve(e.data.decoded);\n worker.worker.removeEventListener('message', onMessage);\n }\n };\n worker.worker.addEventListener('message', onMessage);\n worker.worker.postMessage({ fileDirectory, buffer, id }, [buffer]);\n });\n }\n\n destroy() {\n if (this.workers) {\n this.workers.forEach((worker) => {\n worker.worker.terminate();\n });\n this.workers = null;\n }\n }\n}\n\nexport default Pool;\n","const CRLFCRLF = '\\r\\n\\r\\n';\n\n/*\n * Shim for 'Object.fromEntries'\n */\nfunction itemsToObject(items) {\n if (typeof Object.fromEntries !== 'undefined') {\n return Object.fromEntries(items);\n }\n const obj = {};\n for (const [key, value] of items) {\n obj[key.toLowerCase()] = value;\n }\n return obj;\n}\n\n/**\n * Parse HTTP headers from a given string.\n * @param {String} text the text to parse the headers from\n * @returns {Object} the parsed headers with lowercase keys\n */\nfunction parseHeaders(text) {\n const items = text\n .split('\\r\\n')\n .map((line) => {\n const kv = line.split(':').map((str) => str.trim());\n kv[0] = kv[0].toLowerCase();\n return kv;\n });\n\n return itemsToObject(items);\n}\n\n/**\n * Parse a 'Content-Type' header value to the content-type and parameters\n * @param {String} rawContentType the raw string to parse from\n * @returns {Object} the parsed content type with the fields: type and params\n */\nexport function parseContentType(rawContentType) {\n const [type, ...rawParams] = rawContentType.split(';').map((s) => s.trim());\n const paramsItems = rawParams.map((param) => param.split('='));\n return { type, params: itemsToObject(paramsItems) };\n}\n\n/**\n * Parse a 'Content-Range' header value to its start, end, and total parts\n * @param {String} rawContentRange the raw string to parse from\n * @returns {Object} the parsed parts\n */\nexport function parseContentRange(rawContentRange) {\n let start;\n let end;\n let total;\n\n if (rawContentRange) {\n [, start, end, total] = rawContentRange.match(/bytes (\\d+)-(\\d+)\\/(\\d+)/);\n start = parseInt(start, 10);\n end = parseInt(end, 10);\n total = parseInt(total, 10);\n }\n\n return { start, end, total };\n}\n\n/**\n * Parses a list of byteranges from the given 'multipart/byteranges' HTTP response.\n * Each item in the list has the following properties:\n * - headers: the HTTP headers\n * - data: the sliced ArrayBuffer for that specific part\n * - offset: the offset of the byterange within its originating file\n * - length: the length of the byterange\n * @param {ArrayBuffer} responseArrayBuffer the response to be parsed and split\n * @param {String} boundary the boundary string used to split the sections\n * @returns {Object[]} the parsed byteranges\n */\nexport function parseByteRanges(responseArrayBuffer, boundary) {\n let offset = null;\n const decoder = new TextDecoder('ascii');\n const out = [];\n\n const startBoundary = `--${boundary}`;\n const endBoundary = `${startBoundary}--`;\n\n // search for the initial boundary, may be offset by some bytes\n // TODO: more efficient to check for `--` in bytes directly\n for (let i = 0; i < 10; ++i) {\n const text = decoder.decode(\n new Uint8Array(responseArrayBuffer, i, startBoundary.length),\n );\n if (text === startBoundary) {\n offset = i;\n }\n }\n\n if (offset === null) {\n throw new Error('Could not find initial boundary');\n }\n\n while (offset < responseArrayBuffer.byteLength) {\n const text = decoder.decode(\n new Uint8Array(responseArrayBuffer, offset,\n Math.min(startBoundary.length + 1024, responseArrayBuffer.byteLength - offset),\n ),\n );\n\n // break if we arrived at the end\n if (text.length === 0 || text.startsWith(endBoundary)) {\n break;\n }\n\n // assert that we are actually dealing with a byterange and are at the correct offset\n if (!text.startsWith(startBoundary)) {\n throw new Error('Part does not start with boundary');\n }\n\n // get a substring from where we read the headers\n const innerText = text.substr(startBoundary.length + 2);\n\n if (innerText.length === 0) {\n break;\n }\n\n // find the double linebreak that denotes the end of the headers\n const endOfHeaders = innerText.indexOf(CRLFCRLF);\n\n // parse the headers to get the content range size\n const headers = parseHeaders(innerText.substr(0, endOfHeaders));\n const { start, end, total } = parseContentRange(headers['content-range']);\n\n // calculate the length of the slice and the next offset\n const startOfData = offset + startBoundary.length + endOfHeaders + CRLFCRLF.length;\n const length = parseInt(end, 10) + 1 - parseInt(start, 10);\n out.push({\n headers,\n data: responseArrayBuffer.slice(startOfData, startOfData + length),\n offset: start,\n length,\n fileSize: total,\n });\n\n offset = startOfData + length + 4;\n }\n\n return out;\n}\n","/**\n * @typedef Slice\n * @property {number} offset\n * @property {number} length\n */\n\nexport class BaseSource {\n /**\n *\n * @param {Slice[]} slices\n * @returns {ArrayBuffer[]}\n */\n async fetch(slices, signal = undefined) {\n return Promise.all(\n slices.map((slice) => this.fetchSlice(slice, signal)),\n );\n }\n\n /**\n *\n * @param {Slice} slice\n * @returns {ArrayBuffer}\n */\n async fetchSlice(slice) {\n throw new Error(`fetching of slice ${slice} not possible, not implemented`);\n }\n\n /**\n * Returns the filesize if already determined and null otherwise\n */\n get fileSize() {\n return null;\n }\n\n async close() {\n // no-op by default\n }\n}\n","export default class QuickLRU extends Map {\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tif (typeof options.maxAge === 'number' && options.maxAge === 0) {\n\t\t\tthrow new TypeError('`maxAge` must be a number greater than 0');\n\t\t}\n\n\t\t// TODO: Use private class fields when ESLint supports them.\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.maxAge = options.maxAge || Number.POSITIVE_INFINITY;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t// TODO: Use private class methods when targeting Node.js 16.\n\t_emitEvictions(cache) {\n\t\tif (typeof this.onEviction !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [key, item] of cache) {\n\t\t\tthis.onEviction(key, item.value);\n\t\t}\n\t}\n\n\t_deleteIfExpired(key, item) {\n\t\tif (typeof item.expiry === 'number' && item.expiry <= Date.now()) {\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tthis.onEviction(key, item.value);\n\t\t\t}\n\n\t\t\treturn this.delete(key);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t_getOrDeleteIfExpired(key, item) {\n\t\tconst deleted = this._deleteIfExpired(key, item);\n\t\tif (deleted === false) {\n\t\t\treturn item.value;\n\t\t}\n\t}\n\n\t_getItemValue(key, item) {\n\t\treturn item.expiry ? this._getOrDeleteIfExpired(key, item) : item.value;\n\t}\n\n\t_peek(key, cache) {\n\t\tconst item = cache.get(key);\n\n\t\treturn this._getItemValue(key, item);\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\t\t\tthis._emitEvictions(this.oldCache);\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\t_moveToRecent(key, item) {\n\t\tthis.oldCache.delete(key);\n\t\tthis._set(key, item);\n\t}\n\n\t* _entriesAscending() {\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\tconst item = this.cache.get(key);\n\n\t\t\treturn this._getItemValue(key, item);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst item = this.oldCache.get(key);\n\t\t\tif (this._deleteIfExpired(key, item) === false) {\n\t\t\t\tthis._moveToRecent(key, item);\n\t\t\t\treturn item.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(key, value, {maxAge = this.maxAge} = {}) {\n\t\tconst expiry =\n\t\t\ttypeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY ?\n\t\t\t\tDate.now() + maxAge :\n\t\t\t\tundefined;\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, {\n\t\t\t\tvalue,\n\t\t\t\texpiry\n\t\t\t});\n\t\t} else {\n\t\t\tthis._set(key, {value, expiry});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.cache.get(key));\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.oldCache.get(key));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this._peek(key, this.cache);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this._peek(key, this.oldCache);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\tresize(newSize) {\n\t\tif (!(newSize && newSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tconst items = [...this._entriesAscending()];\n\t\tconst removeCount = items.length - newSize;\n\t\tif (removeCount < 0) {\n\t\t\tthis.cache = new Map(items);\n\t\t\tthis.oldCache = new Map();\n\t\t\tthis._size = items.length;\n\t\t} else {\n\t\t\tif (removeCount > 0) {\n\t\t\t\tthis._emitEvictions(items.slice(0, removeCount));\n\t\t\t}\n\n\t\t\tthis.oldCache = new Map(items.slice(removeCount));\n\t\t\tthis.cache = new Map();\n\t\t\tthis._size = 0;\n\t\t}\n\n\t\tthis.maxSize = newSize;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesDescending() {\n\t\tlet items = [...this.cache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\titems = [...this.oldCache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesAscending() {\n\t\tfor (const [key, value] of this._entriesAscending()) {\n\t\t\tyield [key, value.value];\n\t\t}\n\t}\n\n\tget size() {\n\t\tif (!this._size) {\n\t\t\treturn this.oldCache.size;\n\t\t}\n\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n\n\tentries() {\n\t\treturn this.entriesAscending();\n\t}\n\n\tforEach(callbackFunction, thisArgument = this) {\n\t\tfor (const [key, value] of this.entriesAscending()) {\n\t\t\tcallbackFunction.call(thisArgument, value, key, this);\n\t\t}\n\t}\n\n\tget [Symbol.toStringTag]() {\n\t\treturn JSON.stringify([...this.entriesAscending()]);\n\t}\n}\n","export function assign(target, source) {\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n }\n}\n\nexport function chunk(iterable, length) {\n const results = [];\n const lengthOfIterable = iterable.length;\n for (let i = 0; i < lengthOfIterable; i += length) {\n const chunked = [];\n for (let ci = i; ci < i + length; ci++) {\n chunked.push(iterable[ci]);\n }\n results.push(chunked);\n }\n return results;\n}\n\nexport function endsWith(string, expectedEnding) {\n if (string.length < expectedEnding.length) {\n return false;\n }\n const actualEnding = string.substr(string.length - expectedEnding.length);\n return actualEnding === expectedEnding;\n}\n\nexport function forEach(iterable, func) {\n const { length } = iterable;\n for (let i = 0; i < length; i++) {\n func(iterable[i], i);\n }\n}\n\nexport function invert(oldObj) {\n const newObj = {};\n for (const key in oldObj) {\n if (oldObj.hasOwnProperty(key)) {\n const value = oldObj[key];\n newObj[value] = key;\n }\n }\n return newObj;\n}\n\nexport function range(n) {\n const results = [];\n for (let i = 0; i < n; i++) {\n results.push(i);\n }\n return results;\n}\n\nexport function times(numTimes, func) {\n const results = [];\n for (let i = 0; i < numTimes; i++) {\n results.push(func(i));\n }\n return results;\n}\n\nexport function toArray(iterable) {\n const results = [];\n const { length } = iterable;\n for (let i = 0; i < length; i++) {\n results.push(iterable[i]);\n }\n return results;\n}\n\nexport function toArrayRecursively(input) {\n if (input.length) {\n return toArray(input).map(toArrayRecursively);\n }\n return input;\n}\n\n// copied from https://github.com/academia-de-codigo/parse-content-range-header/blob/master/index.js\nexport function parseContentRange(headerValue) {\n if (!headerValue) {\n return null;\n }\n\n if (typeof headerValue !== 'string') {\n throw new Error('invalid argument');\n }\n\n const parseInt = (number) => Number.parseInt(number, 10);\n\n // Check for presence of unit\n let matches = headerValue.match(/^(\\w*) /);\n const unit = matches && matches[1];\n\n // check for start-end/size header format\n matches = headerValue.match(/(\\d+)-(\\d+)\\/(\\d+|\\*)/);\n if (matches) {\n return {\n unit,\n first: parseInt(matches[1]),\n last: parseInt(matches[2]),\n length: matches[3] === '*' ? null : parseInt(matches[3]),\n };\n }\n\n // check for size header format\n matches = headerValue.match(/(\\d+|\\*)/);\n if (matches) {\n return {\n unit,\n first: null,\n last: null,\n length: matches[1] === '*' ? null : parseInt(matches[1]),\n };\n }\n\n return null;\n}\n\n/*\n * Promisified wrapper around 'setTimeout' to allow 'await'\n */\nexport async function wait(milliseconds) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\nexport function zip(a, b) {\n const A = Array.isArray(a) ? a : Array.from(a);\n const B = Array.isArray(b) ? b : Array.from(b);\n return A.map((k, i) => [k, B[i]]);\n}\n\n// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\nexport class AbortError extends Error {\n constructor(params) {\n // Pass remaining arguments (including vendor specific ones) to parent constructor\n super(params);\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AbortError);\n }\n\n this.name = 'AbortError';\n }\n}\n\nexport class CustomAggregateError extends Error {\n constructor(errors, message) {\n super(message);\n this.errors = errors;\n this.message = message;\n this.name = 'AggregateError';\n }\n}\n\nexport const AggregateError = CustomAggregateError;\n","import QuickLRU from 'quick-lru';\nimport { BaseSource } from './basesource.js';\nimport { AbortError, AggregateError, wait, zip } from '../utils.js';\n\nclass Block {\n /**\n *\n * @param {number} offset\n * @param {number} length\n * @param {ArrayBuffer} [data]\n */\n constructor(offset, length, data = null) {\n this.offset = offset;\n this.length = length;\n this.data = data;\n }\n\n /**\n * @returns {number} the top byte border\n */\n get top() {\n return this.offset + this.length;\n }\n}\n\nclass BlockGroup {\n /**\n *\n * @param {number} offset\n * @param {number} length\n * @param {number[]} blockIds\n */\n constructor(offset, length, blockIds) {\n this.offset = offset;\n this.length = length;\n this.blockIds = blockIds;\n }\n}\n\nexport class BlockedSource extends BaseSource {\n /**\n *\n * @param {BaseSource} source The underlying source that shall be blocked and cached\n * @param {object} options\n * @param {number} [options.blockSize]\n * @param {number} [options.cacheSize]\n */\n constructor(source, { blockSize = 65536, cacheSize = 100 } = {}) {\n super();\n this.source = source;\n this.blockSize = blockSize;\n\n this.blockCache = new QuickLRU({\n maxSize: cacheSize,\n onEviction: (blockId, block) => {\n this.evictedBlocks.set(blockId, block);\n },\n });\n\n /** @type {Map} */\n this.evictedBlocks = new Map();\n\n // mapping blockId -> Block instance\n this.blockRequests = new Map();\n\n // set of blockIds missing for the current requests\n this.blockIdsToFetch = new Set();\n\n this.abortedBlockIds = new Set();\n }\n\n get fileSize() {\n return this.source.fileSize;\n }\n\n /**\n *\n * @param {import(\"./basesource\").Slice[]} slices\n */\n async fetch(slices, signal) {\n const blockRequests = [];\n const missingBlockIds = [];\n const allBlockIds = [];\n this.evictedBlocks.clear();\n\n for (const { offset, length } of slices) {\n let top = offset + length;\n\n const { fileSize } = this;\n if (fileSize !== null) {\n top = Math.min(top, fileSize);\n }\n\n const firstBlockOffset = Math.floor(offset / this.blockSize) * this.blockSize;\n\n for (let current = firstBlockOffset; current < top; current += this.blockSize) {\n const blockId = Math.floor(current / this.blockSize);\n if (!this.blockCache.has(blockId) && !this.blockRequests.has(blockId)) {\n this.blockIdsToFetch.add(blockId);\n missingBlockIds.push(blockId);\n }\n if (this.blockRequests.has(blockId)) {\n blockRequests.push(this.blockRequests.get(blockId));\n }\n allBlockIds.push(blockId);\n }\n }\n\n // allow additional block requests to accumulate\n await wait();\n this.fetchBlocks(signal);\n\n // Gather all of the new requests that this fetch call is contributing to `fetch`.\n const missingRequests = [];\n for (const blockId of missingBlockIds) {\n // The requested missing block could already be in the cache\n // instead of having its request still be outstanding.\n if (this.blockRequests.has(blockId)) {\n missingRequests.push(this.blockRequests.get(blockId));\n }\n }\n\n // Actually await all pending requests that are needed for this `fetch`.\n await Promise.allSettled(blockRequests);\n await Promise.allSettled(missingRequests);\n\n // Perform retries if a block was interrupted by a previous signal\n const abortedBlockRequests = [];\n const abortedBlockIds = allBlockIds\n .filter((id) => this.abortedBlockIds.has(id) || !this.blockCache.has(id));\n abortedBlockIds.forEach((id) => this.blockIdsToFetch.add(id));\n // start the retry of some blocks if required\n if (abortedBlockIds.length > 0 && signal && !signal.aborted) {\n this.fetchBlocks(null);\n for (const blockId of abortedBlockIds) {\n const block = this.blockRequests.get(blockId);\n if (!block) {\n throw new Error(`Block ${blockId} is not in the block requests`);\n }\n abortedBlockRequests.push(block);\n }\n await Promise.allSettled(abortedBlockRequests);\n }\n\n // throw an abort error\n if (signal && signal.aborted) {\n throw new AbortError('Request was aborted');\n }\n\n const blocks = allBlockIds.map((id) => this.blockCache.get(id) || this.evictedBlocks.get(id));\n const failedBlocks = blocks.filter((i) => !i);\n if (failedBlocks.length) {\n throw new AggregateError(failedBlocks, 'Request failed');\n }\n\n // create a final Map, with all required blocks for this request to satisfy\n const requiredBlocks = new Map(zip(allBlockIds, blocks));\n\n // TODO: satisfy each slice\n return this.readSliceData(slices, requiredBlocks);\n }\n\n /**\n *\n * @param {AbortSignal} signal\n */\n fetchBlocks(signal) {\n // check if we still need to\n if (this.blockIdsToFetch.size > 0) {\n const groups = this.groupBlocks(this.blockIdsToFetch);\n\n // start requesting slices of data\n const groupRequests = this.source.fetch(groups, signal);\n\n for (let groupIndex = 0; groupIndex < groups.length; ++groupIndex) {\n const group = groups[groupIndex];\n\n for (const blockId of group.blockIds) {\n // make an async IIFE for each block\n this.blockRequests.set(blockId, (async () => {\n try {\n const response = (await groupRequests)[groupIndex];\n const blockOffset = blockId * this.blockSize;\n const o = blockOffset - response.offset;\n const t = Math.min(o + this.blockSize, response.data.byteLength);\n const data = response.data.slice(o, t);\n const block = new Block(\n blockOffset,\n data.byteLength,\n data,\n blockId,\n );\n this.blockCache.set(blockId, block);\n this.abortedBlockIds.delete(blockId);\n } catch (err) {\n if (err.name === 'AbortError') {\n // store the signal here, we need it to determine later if an\n // error was caused by this signal\n err.signal = signal;\n this.blockCache.delete(blockId);\n this.abortedBlockIds.add(blockId);\n } else {\n throw err;\n }\n } finally {\n this.blockRequests.delete(blockId);\n }\n })());\n }\n }\n this.blockIdsToFetch.clear();\n }\n }\n\n /**\n *\n * @param {Set} blockIds\n * @returns {BlockGroup[]}\n */\n groupBlocks(blockIds) {\n const sortedBlockIds = Array.from(blockIds).sort((a, b) => a - b);\n if (sortedBlockIds.length === 0) {\n return [];\n }\n let current = [];\n let lastBlockId = null;\n const groups = [];\n\n for (const blockId of sortedBlockIds) {\n if (lastBlockId === null || lastBlockId + 1 === blockId) {\n current.push(blockId);\n lastBlockId = blockId;\n } else {\n groups.push(new BlockGroup(\n current[0] * this.blockSize,\n current.length * this.blockSize,\n current,\n ));\n current = [blockId];\n lastBlockId = blockId;\n }\n }\n\n groups.push(new BlockGroup(\n current[0] * this.blockSize,\n current.length * this.blockSize,\n current,\n ));\n\n return groups;\n }\n\n /**\n *\n * @param {import(\"./basesource\").Slice[]} slices\n * @param {Map} blocks\n */\n readSliceData(slices, blocks) {\n return slices.map((slice) => {\n let top = slice.offset + slice.length;\n if (this.fileSize !== null) {\n top = Math.min(this.fileSize, top);\n }\n const blockIdLow = Math.floor(slice.offset / this.blockSize);\n const blockIdHigh = Math.floor(top / this.blockSize);\n const sliceData = new ArrayBuffer(slice.length);\n const sliceView = new Uint8Array(sliceData);\n\n for (let blockId = blockIdLow; blockId <= blockIdHigh; ++blockId) {\n const block = blocks.get(blockId);\n const delta = block.offset - slice.offset;\n const topDelta = block.top - top;\n let blockInnerOffset = 0;\n let rangeInnerOffset = 0;\n let usedBlockLength;\n\n if (delta < 0) {\n blockInnerOffset = -delta;\n } else if (delta > 0) {\n rangeInnerOffset = delta;\n }\n\n if (topDelta < 0) {\n usedBlockLength = block.length - blockInnerOffset;\n } else {\n usedBlockLength = top - block.offset - blockInnerOffset;\n }\n\n const blockView = new Uint8Array(block.data, blockInnerOffset, usedBlockLength);\n sliceView.set(blockView, rangeInnerOffset);\n }\n\n return sliceData;\n });\n }\n}\n","export class BaseResponse {\n /**\n * Returns whether the response has an ok'ish status code\n */\n get ok() {\n return this.status >= 200 && this.status <= 299;\n }\n\n /**\n * Returns the status code of the response\n */\n get status() {\n throw new Error('not implemented');\n }\n\n /**\n * Returns the value of the specified header\n * @param {string} headerName the header name\n * @returns {string} the header value\n */\n getHeader(headerName) { // eslint-disable-line no-unused-vars\n throw new Error('not implemented');\n }\n\n /**\n * @returns {ArrayBuffer} the response data of the request\n */\n async getData() {\n throw new Error('not implemented');\n }\n}\n\nexport class BaseClient {\n constructor(url) {\n this.url = url;\n }\n\n /**\n * Send a request with the options\n * @param {{headers: HeadersInit, signal: AbortSignal}} [options={}]\n * @returns {Promise}\n */\n async request({ headers, signal } = {}) { // eslint-disable-line no-unused-vars\n throw new Error('request is not implemented');\n }\n}\n","import { BaseClient, BaseResponse } from './base.js';\n\nclass FetchResponse extends BaseResponse {\n /**\n * BaseResponse facade for fetch API Response\n * @param {Response} response\n */\n constructor(response) {\n super();\n this.response = response;\n }\n\n get status() {\n return this.response.status;\n }\n\n getHeader(name) {\n return this.response.headers.get(name);\n }\n\n async getData() {\n const data = this.response.arrayBuffer\n ? await this.response.arrayBuffer()\n : (await this.response.buffer()).buffer;\n return data;\n }\n}\n\nexport class FetchClient extends BaseClient {\n constructor(url, credentials) {\n super(url);\n this.credentials = credentials;\n }\n\n /**\n * @param {{headers: HeadersInit, signal: AbortSignal}} [options={}]\n * @returns {Promise}\n */\n async request({ headers, signal } = {}) {\n const response = await fetch(this.url, {\n headers, credentials: this.credentials, signal,\n });\n return new FetchResponse(response);\n }\n}\n","import { BaseClient, BaseResponse } from './base.js';\nimport { AbortError } from '../../utils.js';\n\nclass XHRResponse extends BaseResponse {\n /**\n * BaseResponse facade for XMLHttpRequest\n * @param {XMLHttpRequest} xhr\n * @param {ArrayBuffer} data\n */\n constructor(xhr, data) {\n super();\n this.xhr = xhr;\n this.data = data;\n }\n\n get status() {\n return this.xhr.status;\n }\n\n getHeader(name) {\n return this.xhr.getResponseHeader(name);\n }\n\n async getData() {\n return this.data;\n }\n}\n\nexport class XHRClient extends BaseClient {\n constructRequest(headers, signal) {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', this.url);\n xhr.responseType = 'arraybuffer';\n for (const [key, value] of Object.entries(headers)) {\n xhr.setRequestHeader(key, value);\n }\n\n // hook signals\n xhr.onload = () => {\n const data = xhr.response;\n resolve(new XHRResponse(xhr, data));\n };\n xhr.onerror = reject;\n xhr.onabort = () => reject(new AbortError('Request aborted'));\n xhr.send();\n\n if (signal) {\n if (signal.aborted) {\n xhr.abort();\n }\n signal.addEventListener('abort', () => xhr.abort());\n }\n });\n }\n\n async request({ headers, signal } = {}) {\n const response = await this.constructRequest(headers, signal);\n return response;\n }\n}\n","export default {}","import http from 'http';\nimport https from 'https';\nimport urlMod from 'url';\n\nimport { BaseClient, BaseResponse } from './base.js';\nimport { AbortError } from '../../utils.js';\n\nclass HttpResponse extends BaseResponse {\n /**\n * BaseResponse facade for node HTTP/HTTPS API Response\n * @param {http.ServerResponse} response\n */\n constructor(response, dataPromise) {\n super();\n this.response = response;\n this.dataPromise = dataPromise;\n }\n\n get status() {\n return this.response.statusCode;\n }\n\n getHeader(name) {\n return this.response.headers[name];\n }\n\n async getData() {\n const data = await this.dataPromise;\n return data;\n }\n}\n\nexport class HttpClient extends BaseClient {\n constructor(url) {\n super(url);\n this.parsedUrl = urlMod.parse(this.url);\n this.httpApi = (this.parsedUrl.protocol === 'http:' ? http : https);\n }\n\n constructRequest(headers, signal) {\n return new Promise((resolve, reject) => {\n const request = this.httpApi.get(\n {\n ...this.parsedUrl,\n headers,\n },\n (response) => {\n const dataPromise = new Promise((resolveData) => {\n const chunks = [];\n\n // collect chunks\n response.on('data', (chunk) => {\n chunks.push(chunk);\n });\n\n // concatenate all chunks and resolve the promise with the resulting buffer\n response.on('end', () => {\n const data = Buffer.concat(chunks).buffer;\n resolveData(data);\n });\n response.on('error', reject);\n });\n resolve(new HttpResponse(response, dataPromise));\n },\n );\n request.on('error', reject);\n\n if (signal) {\n if (signal.aborted) {\n request.destroy(new AbortError('Request aborted'));\n }\n signal.addEventListener('abort', () => request.destroy(new AbortError('Request aborted')));\n }\n });\n }\n\n async request({ headers, signal } = {}) {\n const response = await this.constructRequest(headers, signal);\n return response;\n }\n}\n","import { parseByteRanges, parseContentRange, parseContentType } from './httputils.js';\nimport { BaseSource } from './basesource.js';\nimport { BlockedSource } from './blockedsource.js';\n\nimport { FetchClient } from './client/fetch.js';\nimport { XHRClient } from './client/xhr.js';\nimport { HttpClient } from './client/http.js';\n\nclass RemoteSource extends BaseSource {\n /**\n *\n * @param {BaseClient} client\n * @param {object} headers\n * @param {numbers} maxRanges\n * @param {boolean} allowFullFile\n */\n constructor(client, headers, maxRanges, allowFullFile) {\n super();\n this.client = client;\n this.headers = headers;\n this.maxRanges = maxRanges;\n this.allowFullFile = allowFullFile;\n this._fileSize = null;\n }\n\n /**\n *\n * @param {Slice[]} slices\n */\n async fetch(slices, signal) {\n // if we allow multi-ranges, split the incoming request into that many sub-requests\n // and join them afterwards\n if (this.maxRanges >= slices.length) {\n return this.fetchSlices(slices, signal);\n } else if (this.maxRanges > 0 && slices.length > 1) {\n // TODO: split into multiple multi-range requests\n\n // const subSlicesRequests = [];\n // for (let i = 0; i < slices.length; i += this.maxRanges) {\n // subSlicesRequests.push(\n // this.fetchSlices(slices.slice(i, i + this.maxRanges), signal),\n // );\n // }\n // return (await Promise.all(subSlicesRequests)).flat();\n }\n\n // otherwise make a single request for each slice\n return Promise.all(\n slices.map((slice) => this.fetchSlice(slice, signal)),\n );\n }\n\n async fetchSlices(slices, signal) {\n const response = await this.client.request({\n headers: {\n ...this.headers,\n Range: `bytes=${slices\n .map(({ offset, length }) => `${offset}-${offset + length}`)\n .join(',')\n }`,\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error('Error fetching data.');\n } else if (response.status === 206) {\n const { type, params } = parseContentType(response.getHeader('content-type'));\n if (type === 'multipart/byteranges') {\n const byteRanges = parseByteRanges(await response.getData(), params.boundary);\n this._fileSize = byteRanges[0].fileSize || null;\n return byteRanges;\n }\n\n const data = await response.getData();\n\n const { start, end, total } = parseContentRange(response.getHeader('content-range'));\n this._fileSize = total || null;\n const first = [{\n data,\n offset: start,\n length: end - start,\n }];\n\n if (slices.length > 1) {\n // we requested more than one slice, but got only the first\n // unfortunately, some HTTP Servers don't support multi-ranges\n // and return only the first\n\n // get the rest of the slices and fetch them iteratively\n const others = await Promise.all(slices.slice(1).map((slice) => this.fetchSlice(slice, signal)));\n return first.concat(others);\n }\n return first;\n } else {\n if (!this.allowFullFile) {\n throw new Error('Server responded with full file');\n }\n const data = await response.getData();\n this._fileSize = data.byteLength;\n return [{\n data,\n offset: 0,\n length: data.byteLength,\n }];\n }\n }\n\n async fetchSlice(slice, signal) {\n const { offset, length } = slice;\n const response = await this.client.request({\n headers: {\n ...this.headers,\n Range: `bytes=${offset}-${offset + length}`,\n },\n signal,\n });\n\n // check the response was okay and if the server actually understands range requests\n if (!response.ok) {\n throw new Error('Error fetching data.');\n } else if (response.status === 206) {\n const data = await response.getData();\n\n const { total } = parseContentRange(response.getHeader('content-range'));\n this._fileSize = total || null;\n return {\n data,\n offset,\n length,\n };\n } else {\n if (!this.allowFullFile) {\n throw new Error('Server responded with full file');\n }\n\n const data = await response.getData();\n\n this._fileSize = data.byteLength;\n return {\n data,\n offset: 0,\n length: data.byteLength,\n };\n }\n }\n\n get fileSize() {\n return this._fileSize;\n }\n}\n\nfunction maybeWrapInBlockedSource(source, { blockSize, cacheSize }) {\n if (blockSize === null) {\n return source;\n }\n return new BlockedSource(source, { blockSize, cacheSize });\n}\n\nexport function makeFetchSource(url, { headers = {}, credentials, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const client = new FetchClient(url, credentials);\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\nexport function makeXHRSource(url, { headers = {}, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const client = new XHRClient(url);\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\nexport function makeHttpSource(url, { headers = {}, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const client = new HttpClient(url);\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\nexport function makeCustomSource(client, { headers = {}, maxRanges = 0, allowFullFile = false, ...blockOptions } = {}) {\n const source = new RemoteSource(client, headers, maxRanges, allowFullFile);\n return maybeWrapInBlockedSource(source, blockOptions);\n}\n\n/**\n *\n * @param {string} url\n * @param {object} options\n */\nexport function makeRemoteSource(url, { forceXHR = false, ...clientOptions } = {}) {\n if (typeof fetch === 'function' && !forceXHR) {\n return makeFetchSource(url, clientOptions);\n }\n if (typeof XMLHttpRequest !== 'undefined') {\n return makeXHRSource(url, clientOptions);\n }\n return makeHttpSource(url, clientOptions);\n}\n","import { BaseSource } from './basesource.js';\n\nclass FileReaderSource extends BaseSource {\n constructor(file) {\n super();\n this.file = file;\n }\n\n async fetchSlice(slice, signal) {\n return new Promise((resolve, reject) => {\n const blob = this.file.slice(slice.offset, slice.offset + slice.length);\n const reader = new FileReader();\n reader.onload = (event) => resolve(event.target.result);\n reader.onerror = reject;\n reader.onabort = reject;\n reader.readAsArrayBuffer(blob);\n\n if (signal) {\n signal.addEventListener('abort', () => reader.abort());\n }\n });\n }\n}\n\n/**\n * Create a new source from a given file/blob.\n * @param {Blob} file The file or blob to read from.\n * @returns The constructed source\n */\nexport function makeFileReaderSource(file) {\n return new FileReaderSource(file);\n}\n","function decodeRowAcc(row, stride) {\n let length = row.length - stride;\n let offset = 0;\n do {\n for (let i = stride; i > 0; i--) {\n row[offset + stride] += row[offset];\n offset++;\n }\n\n length -= stride;\n } while (length > 0);\n}\n\nfunction decodeRowFloatingPoint(row, stride, bytesPerSample) {\n let index = 0;\n let count = row.length;\n const wc = count / bytesPerSample;\n\n while (count > stride) {\n for (let i = stride; i > 0; --i) {\n row[index + stride] += row[index];\n ++index;\n }\n count -= stride;\n }\n\n const copy = row.slice();\n for (let i = 0; i < wc; ++i) {\n for (let b = 0; b < bytesPerSample; ++b) {\n row[(bytesPerSample * i) + b] = copy[((bytesPerSample - b - 1) * wc) + i];\n }\n }\n}\n\nexport function applyPredictor(block, predictor, width, height, bitsPerSample,\n planarConfiguration) {\n if (!predictor || predictor === 1) {\n return block;\n }\n\n for (let i = 0; i < bitsPerSample.length; ++i) {\n if (bitsPerSample[i] % 8 !== 0) {\n throw new Error('When decoding with predictor, only multiple of 8 bits are supported.');\n }\n if (bitsPerSample[i] !== bitsPerSample[0]) {\n throw new Error('When decoding with predictor, all samples must have the same size.');\n }\n }\n\n const bytesPerSample = bitsPerSample[0] / 8;\n const stride = planarConfiguration === 2 ? 1 : bitsPerSample.length;\n\n for (let i = 0; i < height; ++i) {\n // Last strip will be truncated if height % stripHeight != 0\n if (i * stride * width * bytesPerSample >= block.byteLength) {\n break;\n }\n let row;\n if (predictor === 2) { // horizontal prediction\n switch (bitsPerSample[0]) {\n case 8:\n row = new Uint8Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample,\n );\n break;\n case 16:\n row = new Uint16Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample / 2,\n );\n break;\n case 32:\n row = new Uint32Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample / 4,\n );\n break;\n default:\n throw new Error(`Predictor 2 not allowed with ${bitsPerSample[0]} bits per sample.`);\n }\n decodeRowAcc(row, stride, bytesPerSample);\n } else if (predictor === 3) { // horizontal floating point\n row = new Uint8Array(\n block, i * stride * width * bytesPerSample, stride * width * bytesPerSample,\n );\n decodeRowFloatingPoint(row, stride, bytesPerSample);\n }\n }\n return block;\n}\n","import { applyPredictor } from '../predictor.js';\n\nexport default class BaseDecoder {\n async decode(fileDirectory, buffer) {\n const decoded = await this.decodeBlock(buffer);\n const predictor = fileDirectory.Predictor || 1;\n if (predictor !== 1) {\n const isTiled = !fileDirectory.StripOffsets;\n const tileWidth = isTiled ? fileDirectory.TileWidth : fileDirectory.ImageWidth;\n const tileHeight = isTiled ? fileDirectory.TileLength : (\n fileDirectory.RowsPerStrip || fileDirectory.ImageLength\n );\n return applyPredictor(\n decoded, predictor, tileWidth, tileHeight, fileDirectory.BitsPerSample,\n fileDirectory.PlanarConfiguration,\n );\n }\n return decoded;\n }\n}\n","/** @module geotiff */\nimport GeoTIFFImage from './geotiffimage.js';\nimport DataView64 from './dataview64.js';\nimport DataSlice from './dataslice.js';\nimport Pool from './pool.js';\n\nimport { makeRemoteSource, makeCustomSource } from './source/remote.js';\nimport { makeBufferSource } from './source/arraybuffer.js';\nimport { makeFileReaderSource } from './source/filereader.js';\nimport { makeFileSource } from './source/file.js';\nimport { BaseClient, BaseResponse } from './source/client/base.js';\n\nimport { fieldTypes, fieldTagNames, arrayFields, geoKeyNames } from './globals.js';\nimport { writeGeotiff } from './geotiffwriter.js';\nimport * as globals from './globals.js';\nimport * as rgb from './rgb.js';\nimport { getDecoder, addDecoder } from './compression/index.js';\nimport { setLogger } from './logging.js';\n\nexport { globals };\nexport { rgb };\nexport { default as BaseDecoder } from './compression/basedecoder.js';\nexport { getDecoder, addDecoder };\nexport { setLogger };\n\n/**\n * @typedef {Uint8Array | Int8Array | Uint16Array | Int16Array | Uint32Array | Int32Array | Float32Array | Float64Array}\n * TypedArray\n */\n\n/**\n * @typedef {{ height:number, width: number }} Dimensions\n */\n\n/**\n * The autogenerated docs are a little confusing here. The effective type is:\n *\n * `TypedArray & { height: number; width: number}`\n * @typedef {TypedArray & Dimensions} TypedArrayWithDimensions\n */\n\n/**\n * The autogenerated docs are a little confusing here. The effective type is:\n *\n * `TypedArray[] & { height: number; width: number}`\n * @typedef {TypedArray[] & Dimensions} TypedArrayArrayWithDimensions\n */\n\n/**\n * The autogenerated docs are a little confusing here. The effective type is:\n *\n * `(TypedArray | TypedArray[]) & { height: number; width: number}`\n * @typedef {TypedArrayWithDimensions | TypedArrayArrayWithDimensions} ReadRasterResult\n */\n\nfunction getFieldTypeLength(fieldType) {\n switch (fieldType) {\n case fieldTypes.BYTE: case fieldTypes.ASCII: case fieldTypes.SBYTE: case fieldTypes.UNDEFINED:\n return 1;\n case fieldTypes.SHORT: case fieldTypes.SSHORT:\n return 2;\n case fieldTypes.LONG: case fieldTypes.SLONG: case fieldTypes.FLOAT: case fieldTypes.IFD:\n return 4;\n case fieldTypes.RATIONAL: case fieldTypes.SRATIONAL: case fieldTypes.DOUBLE:\n case fieldTypes.LONG8: case fieldTypes.SLONG8: case fieldTypes.IFD8:\n return 8;\n default:\n throw new RangeError(`Invalid field type: ${fieldType}`);\n }\n}\n\nfunction parseGeoKeyDirectory(fileDirectory) {\n const rawGeoKeyDirectory = fileDirectory.GeoKeyDirectory;\n if (!rawGeoKeyDirectory) {\n return null;\n }\n\n const geoKeyDirectory = {};\n for (let i = 4; i <= rawGeoKeyDirectory[3] * 4; i += 4) {\n const key = geoKeyNames[rawGeoKeyDirectory[i]];\n const location = (rawGeoKeyDirectory[i + 1])\n ? (fieldTagNames[rawGeoKeyDirectory[i + 1]]) : null;\n const count = rawGeoKeyDirectory[i + 2];\n const offset = rawGeoKeyDirectory[i + 3];\n\n let value = null;\n if (!location) {\n value = offset;\n } else {\n value = fileDirectory[location];\n if (typeof value === 'undefined' || value === null) {\n throw new Error(`Could not get value of geoKey '${key}'.`);\n } else if (typeof value === 'string') {\n value = value.substring(offset, offset + count - 1);\n } else if (value.subarray) {\n value = value.subarray(offset, offset + count);\n if (count === 1) {\n value = value[0];\n }\n }\n }\n geoKeyDirectory[key] = value;\n }\n return geoKeyDirectory;\n}\n\nfunction getValues(dataSlice, fieldType, count, offset) {\n let values = null;\n let readMethod = null;\n const fieldTypeLength = getFieldTypeLength(fieldType);\n\n switch (fieldType) {\n case fieldTypes.BYTE: case fieldTypes.ASCII: case fieldTypes.UNDEFINED:\n values = new Uint8Array(count); readMethod = dataSlice.readUint8;\n break;\n case fieldTypes.SBYTE:\n values = new Int8Array(count); readMethod = dataSlice.readInt8;\n break;\n case fieldTypes.SHORT:\n values = new Uint16Array(count); readMethod = dataSlice.readUint16;\n break;\n case fieldTypes.SSHORT:\n values = new Int16Array(count); readMethod = dataSlice.readInt16;\n break;\n case fieldTypes.LONG: case fieldTypes.IFD:\n values = new Uint32Array(count); readMethod = dataSlice.readUint32;\n break;\n case fieldTypes.SLONG:\n values = new Int32Array(count); readMethod = dataSlice.readInt32;\n break;\n case fieldTypes.LONG8: case fieldTypes.IFD8:\n values = new Array(count); readMethod = dataSlice.readUint64;\n break;\n case fieldTypes.SLONG8:\n values = new Array(count); readMethod = dataSlice.readInt64;\n break;\n case fieldTypes.RATIONAL:\n values = new Uint32Array(count * 2); readMethod = dataSlice.readUint32;\n break;\n case fieldTypes.SRATIONAL:\n values = new Int32Array(count * 2); readMethod = dataSlice.readInt32;\n break;\n case fieldTypes.FLOAT:\n values = new Float32Array(count); readMethod = dataSlice.readFloat32;\n break;\n case fieldTypes.DOUBLE:\n values = new Float64Array(count); readMethod = dataSlice.readFloat64;\n break;\n default:\n throw new RangeError(`Invalid field type: ${fieldType}`);\n }\n\n // normal fields\n if (!(fieldType === fieldTypes.RATIONAL || fieldType === fieldTypes.SRATIONAL)) {\n for (let i = 0; i < count; ++i) {\n values[i] = readMethod.call(\n dataSlice, offset + (i * fieldTypeLength),\n );\n }\n } else { // RATIONAL or SRATIONAL\n for (let i = 0; i < count; i += 2) {\n values[i] = readMethod.call(\n dataSlice, offset + (i * fieldTypeLength),\n );\n values[i + 1] = readMethod.call(\n dataSlice, offset + ((i * fieldTypeLength) + 4),\n );\n }\n }\n\n if (fieldType === fieldTypes.ASCII) {\n return new TextDecoder('utf-8').decode(values);\n }\n return values;\n}\n\n/**\n * Data class to store the parsed file directory, geo key directory and\n * offset to the next IFD\n */\nclass ImageFileDirectory {\n constructor(fileDirectory, geoKeyDirectory, nextIFDByteOffset) {\n this.fileDirectory = fileDirectory;\n this.geoKeyDirectory = geoKeyDirectory;\n this.nextIFDByteOffset = nextIFDByteOffset;\n }\n}\n\n/**\n * Error class for cases when an IFD index was requested, that does not exist\n * in the file.\n */\nclass GeoTIFFImageIndexError extends Error {\n constructor(index) {\n super(`No image at index ${index}`);\n this.index = index;\n }\n}\n\nclass GeoTIFFBase {\n /**\n * (experimental) Reads raster data from the best fitting image. This function uses\n * the image with the lowest resolution that is still a higher resolution than the\n * requested resolution.\n * When specified, the `bbox` option is translated to the `window` option and the\n * `resX` and `resY` to `width` and `height` respectively.\n * Then, the [readRasters]{@link GeoTIFFImage#readRasters} method of the selected\n * image is called and the result returned.\n * @see GeoTIFFImage.readRasters\n * @param {import('./geotiffimage').ReadRasterOptions} [options={}] optional parameters\n * @returns {Promise} the decoded array(s), with `height` and `width`, as a promise\n */\n async readRasters(options = {}) {\n const { window: imageWindow, width, height } = options;\n let { resX, resY, bbox } = options;\n\n const firstImage = await this.getImage();\n let usedImage = firstImage;\n const imageCount = await this.getImageCount();\n const imgBBox = firstImage.getBoundingBox();\n\n if (imageWindow && bbox) {\n throw new Error('Both \"bbox\" and \"window\" passed.');\n }\n\n // if width/height is passed, transform it to resolution\n if (width || height) {\n // if we have an image window (pixel coordinates), transform it to a BBox\n // using the origin/resolution of the first image.\n if (imageWindow) {\n const [oX, oY] = firstImage.getOrigin();\n const [rX, rY] = firstImage.getResolution();\n\n bbox = [\n oX + (imageWindow[0] * rX),\n oY + (imageWindow[1] * rY),\n oX + (imageWindow[2] * rX),\n oY + (imageWindow[3] * rY),\n ];\n }\n\n // if we have a bbox (or calculated one)\n\n const usedBBox = bbox || imgBBox;\n\n if (width) {\n if (resX) {\n throw new Error('Both width and resX passed');\n }\n resX = (usedBBox[2] - usedBBox[0]) / width;\n }\n if (height) {\n if (resY) {\n throw new Error('Both width and resY passed');\n }\n resY = (usedBBox[3] - usedBBox[1]) / height;\n }\n }\n\n // if resolution is set or calculated, try to get the image with the worst acceptable resolution\n if (resX || resY) {\n const allImages = [];\n for (let i = 0; i < imageCount; ++i) {\n const image = await this.getImage(i);\n const { SubfileType: subfileType, NewSubfileType: newSubfileType } = image.fileDirectory;\n if (i === 0 || subfileType === 2 || newSubfileType & 1) {\n allImages.push(image);\n }\n }\n\n allImages.sort((a, b) => a.getWidth() - b.getWidth());\n for (let i = 0; i < allImages.length; ++i) {\n const image = allImages[i];\n const imgResX = (imgBBox[2] - imgBBox[0]) / image.getWidth();\n const imgResY = (imgBBox[3] - imgBBox[1]) / image.getHeight();\n\n usedImage = image;\n if ((resX && resX > imgResX) || (resY && resY > imgResY)) {\n break;\n }\n }\n }\n\n let wnd = imageWindow;\n if (bbox) {\n const [oX, oY] = firstImage.getOrigin();\n const [imageResX, imageResY] = usedImage.getResolution(firstImage);\n\n wnd = [\n Math.round((bbox[0] - oX) / imageResX),\n Math.round((bbox[1] - oY) / imageResY),\n Math.round((bbox[2] - oX) / imageResX),\n Math.round((bbox[3] - oY) / imageResY),\n ];\n wnd = [\n Math.min(wnd[0], wnd[2]),\n Math.min(wnd[1], wnd[3]),\n Math.max(wnd[0], wnd[2]),\n Math.max(wnd[1], wnd[3]),\n ];\n }\n\n return usedImage.readRasters({ ...options, window: wnd });\n }\n}\n\n/**\n * @typedef {Object} GeoTIFFOptions\n * @property {boolean} [cache=false] whether or not decoded tiles shall be cached.\n */\n\n/**\n * The abstraction for a whole GeoTIFF file.\n * @augments GeoTIFFBase\n */\nclass GeoTIFF extends GeoTIFFBase {\n /**\n * @constructor\n * @param {*} source The datasource to read from.\n * @param {boolean} littleEndian Whether the image uses little endian.\n * @param {boolean} bigTiff Whether the image uses bigTIFF conventions.\n * @param {number} firstIFDOffset The numeric byte-offset from the start of the image\n * to the first IFD.\n * @param {GeoTIFFOptions} [options] further options.\n */\n constructor(source, littleEndian, bigTiff, firstIFDOffset, options = {}) {\n super();\n this.source = source;\n this.littleEndian = littleEndian;\n this.bigTiff = bigTiff;\n this.firstIFDOffset = firstIFDOffset;\n this.cache = options.cache || false;\n this.ifdRequests = [];\n this.ghostValues = null;\n }\n\n async getSlice(offset, size) {\n const fallbackSize = this.bigTiff ? 4048 : 1024;\n return new DataSlice(\n (await this.source.fetch([{\n offset,\n length: typeof size !== 'undefined' ? size : fallbackSize,\n }]))[0],\n offset,\n this.littleEndian,\n this.bigTiff,\n );\n }\n\n /**\n * Instructs to parse an image file directory at the given file offset.\n * As there is no way to ensure that a location is indeed the start of an IFD,\n * this function must be called with caution (e.g only using the IFD offsets from\n * the headers or other IFDs).\n * @param {number} offset the offset to parse the IFD at\n * @returns {Promise} the parsed IFD\n */\n async parseFileDirectoryAt(offset) {\n const entrySize = this.bigTiff ? 20 : 12;\n const offsetSize = this.bigTiff ? 8 : 2;\n\n let dataSlice = await this.getSlice(offset);\n const numDirEntries = this.bigTiff\n ? dataSlice.readUint64(offset)\n : dataSlice.readUint16(offset);\n\n // if the slice does not cover the whole IFD, request a bigger slice, where the\n // whole IFD fits: num of entries + n x tag length + offset to next IFD\n const byteSize = (numDirEntries * entrySize) + (this.bigTiff ? 16 : 6);\n if (!dataSlice.covers(offset, byteSize)) {\n dataSlice = await this.getSlice(offset, byteSize);\n }\n\n const fileDirectory = {};\n\n // loop over the IFD and create a file directory object\n let i = offset + (this.bigTiff ? 8 : 2);\n for (let entryCount = 0; entryCount < numDirEntries; i += entrySize, ++entryCount) {\n const fieldTag = dataSlice.readUint16(i);\n const fieldType = dataSlice.readUint16(i + 2);\n const typeCount = this.bigTiff\n ? dataSlice.readUint64(i + 4)\n : dataSlice.readUint32(i + 4);\n\n let fieldValues;\n let value;\n const fieldTypeLength = getFieldTypeLength(fieldType);\n const valueOffset = i + (this.bigTiff ? 12 : 8);\n\n // check whether the value is directly encoded in the tag or refers to a\n // different external byte range\n if (fieldTypeLength * typeCount <= (this.bigTiff ? 8 : 4)) {\n fieldValues = getValues(dataSlice, fieldType, typeCount, valueOffset);\n } else {\n // resolve the reference to the actual byte range\n const actualOffset = dataSlice.readOffset(valueOffset);\n const length = getFieldTypeLength(fieldType) * typeCount;\n\n // check, whether we actually cover the referenced byte range; if not,\n // request a new slice of bytes to read from it\n if (dataSlice.covers(actualOffset, length)) {\n fieldValues = getValues(dataSlice, fieldType, typeCount, actualOffset);\n } else {\n const fieldDataSlice = await this.getSlice(actualOffset, length);\n fieldValues = getValues(fieldDataSlice, fieldType, typeCount, actualOffset);\n }\n }\n\n // unpack single values from the array\n if (typeCount === 1 && arrayFields.indexOf(fieldTag) === -1\n && !(fieldType === fieldTypes.RATIONAL || fieldType === fieldTypes.SRATIONAL)) {\n value = fieldValues[0];\n } else {\n value = fieldValues;\n }\n\n // write the tags value to the file directly\n fileDirectory[fieldTagNames[fieldTag]] = value;\n }\n const geoKeyDirectory = parseGeoKeyDirectory(fileDirectory);\n const nextIFDByteOffset = dataSlice.readOffset(\n offset + offsetSize + (entrySize * numDirEntries),\n );\n\n return new ImageFileDirectory(\n fileDirectory,\n geoKeyDirectory,\n nextIFDByteOffset,\n );\n }\n\n async requestIFD(index) {\n // see if we already have that IFD index requested.\n if (this.ifdRequests[index]) {\n // attach to an already requested IFD\n return this.ifdRequests[index];\n } else if (index === 0) {\n // special case for index 0\n this.ifdRequests[index] = this.parseFileDirectoryAt(this.firstIFDOffset);\n return this.ifdRequests[index];\n } else if (!this.ifdRequests[index - 1]) {\n // if the previous IFD was not yet loaded, load that one first\n // this is the recursive call.\n try {\n this.ifdRequests[index - 1] = this.requestIFD(index - 1);\n } catch (e) {\n // if the previous one already was an index error, rethrow\n // with the current index\n if (e instanceof GeoTIFFImageIndexError) {\n throw new GeoTIFFImageIndexError(index);\n }\n // rethrow anything else\n throw e;\n }\n }\n // if the previous IFD was loaded, we can finally fetch the one we are interested in.\n // we need to wrap this in an IIFE, otherwise this.ifdRequests[index] would be delayed\n this.ifdRequests[index] = (async () => {\n const previousIfd = await this.ifdRequests[index - 1];\n if (previousIfd.nextIFDByteOffset === 0) {\n throw new GeoTIFFImageIndexError(index);\n }\n return this.parseFileDirectoryAt(previousIfd.nextIFDByteOffset);\n })();\n return this.ifdRequests[index];\n }\n\n /**\n * Get the n-th internal subfile of an image. By default, the first is returned.\n *\n * @param {number} [index=0] the index of the image to return.\n * @returns {Promise} the image at the given index\n */\n async getImage(index = 0) {\n const ifd = await this.requestIFD(index);\n return new GeoTIFFImage(\n ifd.fileDirectory, ifd.geoKeyDirectory,\n this.dataView, this.littleEndian, this.cache, this.source,\n );\n }\n\n /**\n * Returns the count of the internal subfiles.\n *\n * @returns {Promise} the number of internal subfile images\n */\n async getImageCount() {\n let index = 0;\n // loop until we run out of IFDs\n let hasNext = true;\n while (hasNext) {\n try {\n await this.requestIFD(index);\n ++index;\n } catch (e) {\n if (e instanceof GeoTIFFImageIndexError) {\n hasNext = false;\n } else {\n throw e;\n }\n }\n }\n return index;\n }\n\n /**\n * Get the values of the COG ghost area as a parsed map.\n * See https://gdal.org/drivers/raster/cog.html#header-ghost-area for reference\n * @returns {Promise} the parsed ghost area or null, if no such area was found\n */\n async getGhostValues() {\n const offset = this.bigTiff ? 16 : 8;\n if (this.ghostValues) {\n return this.ghostValues;\n }\n const detectionString = 'GDAL_STRUCTURAL_METADATA_SIZE=';\n const heuristicAreaSize = detectionString.length + 100;\n let slice = await this.getSlice(offset, heuristicAreaSize);\n if (detectionString === getValues(slice, fieldTypes.ASCII, detectionString.length, offset)) {\n const valuesString = getValues(slice, fieldTypes.ASCII, heuristicAreaSize, offset);\n const firstLine = valuesString.split('\\n')[0];\n const metadataSize = Number(firstLine.split('=')[1].split(' ')[0]) + firstLine.length;\n if (metadataSize > heuristicAreaSize) {\n slice = await this.getSlice(offset, metadataSize);\n }\n const fullString = getValues(slice, fieldTypes.ASCII, metadataSize, offset);\n this.ghostValues = {};\n fullString\n .split('\\n')\n .filter((line) => line.length > 0)\n .map((line) => line.split('='))\n .forEach(([key, value]) => {\n this.ghostValues[key] = value;\n });\n }\n return this.ghostValues;\n }\n\n /**\n * Parse a (Geo)TIFF file from the given source.\n *\n * @param {*} source The source of data to parse from.\n * @param {GeoTIFFOptions} [options] Additional options.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n */\n static async fromSource(source, options, signal) {\n const headerData = (await source.fetch([{ offset: 0, length: 1024 }], signal))[0];\n const dataView = new DataView64(headerData);\n\n const BOM = dataView.getUint16(0, 0);\n let littleEndian;\n if (BOM === 0x4949) {\n littleEndian = true;\n } else if (BOM === 0x4D4D) {\n littleEndian = false;\n } else {\n throw new TypeError('Invalid byte order value.');\n }\n\n const magicNumber = dataView.getUint16(2, littleEndian);\n let bigTiff;\n if (magicNumber === 42) {\n bigTiff = false;\n } else if (magicNumber === 43) {\n bigTiff = true;\n const offsetByteSize = dataView.getUint16(4, littleEndian);\n if (offsetByteSize !== 8) {\n throw new Error('Unsupported offset byte-size.');\n }\n } else {\n throw new TypeError('Invalid magic number.');\n }\n\n const firstIFDOffset = bigTiff\n ? dataView.getUint64(8, littleEndian)\n : dataView.getUint32(4, littleEndian);\n return new GeoTIFF(source, littleEndian, bigTiff, firstIFDOffset, options);\n }\n\n /**\n * Closes the underlying file buffer\n * N.B. After the GeoTIFF has been completely processed it needs\n * to be closed but only if it has been constructed from a file.\n */\n close() {\n if (typeof this.source.close === 'function') {\n return this.source.close();\n }\n return false;\n }\n}\n\nexport { GeoTIFF };\nexport default GeoTIFF;\n\n/**\n * Wrapper for GeoTIFF files that have external overviews.\n * @augments GeoTIFFBase\n */\nclass MultiGeoTIFF extends GeoTIFFBase {\n /**\n * Construct a new MultiGeoTIFF from a main and several overview files.\n * @param {GeoTIFF} mainFile The main GeoTIFF file.\n * @param {GeoTIFF[]} overviewFiles An array of overview files.\n */\n constructor(mainFile, overviewFiles) {\n super();\n this.mainFile = mainFile;\n this.overviewFiles = overviewFiles;\n this.imageFiles = [mainFile].concat(overviewFiles);\n\n this.fileDirectoriesPerFile = null;\n this.fileDirectoriesPerFileParsing = null;\n this.imageCount = null;\n }\n\n async parseFileDirectoriesPerFile() {\n const requests = [this.mainFile.parseFileDirectoryAt(this.mainFile.firstIFDOffset)]\n .concat(this.overviewFiles.map((file) => file.parseFileDirectoryAt(file.firstIFDOffset)));\n\n this.fileDirectoriesPerFile = await Promise.all(requests);\n return this.fileDirectoriesPerFile;\n }\n\n /**\n * Get the n-th internal subfile of an image. By default, the first is returned.\n *\n * @param {number} [index=0] the index of the image to return.\n * @returns {Promise} the image at the given index\n */\n async getImage(index = 0) {\n await this.getImageCount();\n await this.parseFileDirectoriesPerFile();\n let visited = 0;\n let relativeIndex = 0;\n for (let i = 0; i < this.imageFiles.length; i++) {\n const imageFile = this.imageFiles[i];\n for (let ii = 0; ii < this.imageCounts[i]; ii++) {\n if (index === visited) {\n const ifd = await imageFile.requestIFD(relativeIndex);\n return new GeoTIFFImage(\n ifd.fileDirectory, ifd.geoKeyDirectory,\n imageFile.dataView, imageFile.littleEndian, imageFile.cache, imageFile.source,\n );\n }\n visited++;\n relativeIndex++;\n }\n relativeIndex = 0;\n }\n\n throw new RangeError('Invalid image index');\n }\n\n /**\n * Returns the count of the internal subfiles.\n *\n * @returns {Promise} the number of internal subfile images\n */\n async getImageCount() {\n if (this.imageCount !== null) {\n return this.imageCount;\n }\n const requests = [this.mainFile.getImageCount()]\n .concat(this.overviewFiles.map((file) => file.getImageCount()));\n this.imageCounts = await Promise.all(requests);\n this.imageCount = this.imageCounts.reduce((count, ifds) => count + ifds, 0);\n return this.imageCount;\n }\n}\n\nexport { MultiGeoTIFF };\n\n/**\n * Creates a new GeoTIFF from a remote URL.\n * @param {string} url The URL to access the image from\n * @param {object} [options] Additional options to pass to the source.\n * See {@link makeRemoteSource} for details.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise} The resulting GeoTIFF file.\n */\nexport async function fromUrl(url, options = {}, signal) {\n return GeoTIFF.fromSource(makeRemoteSource(url, options), signal);\n}\n\n/**\n * Creates a new GeoTIFF from a custom {@link BaseClient}.\n * @param {BaseClient} client The client.\n * @param {object} [options] Additional options to pass to the source.\n * See {@link makeRemoteSource} for details.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise} The resulting GeoTIFF file.\n */\nexport async function fromCustomClient(client, options = {}, signal) {\n return GeoTIFF.fromSource(makeCustomSource(client, options), signal);\n}\n\n/**\n * Construct a new GeoTIFF from an\n * [ArrayBuffer]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer}.\n * @param {ArrayBuffer} arrayBuffer The data to read the file from.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise} The resulting GeoTIFF file.\n */\nexport async function fromArrayBuffer(arrayBuffer, signal) {\n return GeoTIFF.fromSource(makeBufferSource(arrayBuffer), signal);\n}\n\n/**\n * Construct a GeoTIFF from a local file path. This uses the node\n * [filesystem API]{@link https://nodejs.org/api/fs.html} and is\n * not available on browsers.\n *\n * N.B. After the GeoTIFF has been completely processed it needs\n * to be closed but only if it has been constructed from a file.\n * @param {string} path The file path to read from.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise} The resulting GeoTIFF file.\n */\nexport async function fromFile(path, signal) {\n return GeoTIFF.fromSource(makeFileSource(path), signal);\n}\n\n/**\n * Construct a GeoTIFF from an HTML\n * [Blob]{@link https://developer.mozilla.org/en-US/docs/Web/API/Blob} or\n * [File]{@link https://developer.mozilla.org/en-US/docs/Web/API/File}\n * object.\n * @param {Blob|File} blob The Blob or File object to read from.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise} The resulting GeoTIFF file.\n */\nexport async function fromBlob(blob, signal) {\n return GeoTIFF.fromSource(makeFileReaderSource(blob), signal);\n}\n\n/**\n * Construct a MultiGeoTIFF from the given URLs.\n * @param {string} mainUrl The URL for the main file.\n * @param {string[]} overviewUrls An array of URLs for the overview images.\n * @param {Object} [options] Additional options to pass to the source.\n * See [makeRemoteSource]{@link module:source.makeRemoteSource}\n * for details.\n * @param {AbortSignal} [signal] An AbortSignal that may be signalled if the request is\n * to be aborted\n * @returns {Promise} The resulting MultiGeoTIFF file.\n */\nexport async function fromUrls(mainUrl, overviewUrls = [], options = {}, signal) {\n const mainFile = await GeoTIFF.fromSource(makeRemoteSource(mainUrl, options), signal);\n const overviewFiles = await Promise.all(\n overviewUrls.map((url) => GeoTIFF.fromSource(makeRemoteSource(url, options))),\n );\n\n return new MultiGeoTIFF(mainFile, overviewFiles);\n}\n\n/**\n * Main creating function for GeoTIFF files.\n * @param {(Array)} array of pixel values\n * @returns {metadata} metadata\n */\nexport function writeArrayBuffer(values, metadata) {\n return writeGeotiff(values, metadata);\n}\n\nexport { Pool };\nexport { GeoTIFFImage };\nexport { BaseClient, BaseResponse };\n","/**\n * @module ol/source/GeoTIFF\n */\nimport {\n Pool,\n fromBlob as tiffFromBlob,\n fromUrl as tiffFromUrl,\n fromUrls as tiffFromUrls,\n globals as geotiffGlobals,\n} from 'geotiff';\nimport {error as logError} from '../console.js';\nimport {applyTransform, getCenter, getIntersection} from '../extent.js';\nimport {clamp} from '../math.js';\nimport {fromCode as unitsFromCode} from '../proj/Units.js';\nimport {\n Projection,\n createTransformFromCoordinateTransform,\n get as getCachedProjection,\n toUserCoordinate,\n toUserExtent,\n} from '../proj.js';\nimport TileGrid from '../tilegrid/TileGrid.js';\nimport {\n apply as applyMatrix,\n create as createMatrix,\n makeInverse,\n multiply as multiplyTransform,\n} from '../transform.js';\nimport DataTile from './DataTile.js';\n\n/**\n * Determine if an image type is a mask.\n * See https://www.awaresystems.be/imaging/tiff/tifftags/newsubfiletype.html\n * @param {GeoTIFFImage} image The image.\n * @return {boolean} The image is a mask.\n */\nfunction isMask(image) {\n const fileDirectory = image.fileDirectory;\n const type = fileDirectory.NewSubfileType || 0;\n return (type & 4) === 4;\n}\n\n/**\n * @param {true|false|'auto'} preference The convertToRGB option.\n * @param {GeoTIFFImage} image The image.\n * @return {boolean} Use the `image.readRGB()` method.\n */\nfunction readRGB(preference, image) {\n if (!preference) {\n return false;\n }\n if (preference === true) {\n return true;\n }\n if (image.getSamplesPerPixel() !== 3) {\n return false;\n }\n const interpretation = image.fileDirectory.PhotometricInterpretation;\n const interpretations = geotiffGlobals.photometricInterpretations;\n return (\n interpretation === interpretations.CMYK ||\n interpretation === interpretations.YCbCr ||\n interpretation === interpretations.CIELab ||\n interpretation === interpretations.ICCLab\n );\n}\n\n/**\n * @typedef {Object} SourceInfo\n * @property {string} [url] URL for the source GeoTIFF.\n * @property {Array} [overviews] List of any overview URLs, only applies if the url parameter is given.\n * @property {Blob} [blob] Blob containing the source GeoTIFF. `blob` and `url` are mutually exclusive.\n * @property {number} [min=0] The minimum source data value. Rendered values are scaled from 0 to 1 based on\n * the configured min and max. If not provided and raster statistics are available, those will be used instead.\n * If neither are available, the minimum for the data type will be used. To disable this behavior, set\n * the `normalize` option to `false` in the constructor.\n * @property {number} [max] The maximum source data value. Rendered values are scaled from 0 to 1 based on\n * the configured min and max. If not provided and raster statistics are available, those will be used instead.\n * If neither are available, the maximum for the data type will be used. To disable this behavior, set\n * the `normalize` option to `false` in the constructor.\n * @property {number} [nodata] Values to discard (overriding any nodata values in the metadata).\n * When provided, an additional alpha band will be added to the data. Often the GeoTIFF metadata\n * will include information about nodata values, so you should only need to set this property if\n * you find that it is not already extracted from the metadata.\n * @property {Array} [bands] Band numbers to be read from (where the first band is `1`). If not provided, all bands will\n * be read. For example, if a GeoTIFF has blue (1), green (2), red (3), and near-infrared (4) bands, and you only need the\n * near-infrared band, configure `bands: [4]`.\n */\n\n/**\n * @typedef {Object} GeoKeys\n * @property {number} GTModelTypeGeoKey Model type.\n * @property {number} GTRasterTypeGeoKey Raster type.\n * @property {number} GeogAngularUnitsGeoKey Angular units.\n * @property {number} GeogInvFlatteningGeoKey Inverse flattening.\n * @property {number} GeogSemiMajorAxisGeoKey Semi-major axis.\n * @property {number} GeographicTypeGeoKey Geographic coordinate system code.\n * @property {number} ProjLinearUnitsGeoKey Projected linear unit code.\n * @property {number} ProjectedCSTypeGeoKey Projected coordinate system code.\n */\n\n/**\n * @typedef {import(\"geotiff\").GeoTIFF} GeoTIFF\n */\n\n/**\n * @typedef {import(\"geotiff\").MultiGeoTIFF} MultiGeoTIFF\n */\n\n/**\n * @typedef {Object} GDALMetadata\n * @property {string} STATISTICS_MINIMUM The minimum value (as a string).\n * @property {string} STATISTICS_MAXIMUM The maximum value (as a string).\n */\n\nconst STATISTICS_MAXIMUM = 'STATISTICS_MAXIMUM';\nconst STATISTICS_MINIMUM = 'STATISTICS_MINIMUM';\n\nconst defaultTileSize = 256;\n\n/**\n * @typedef {import(\"geotiff\").GeoTIFFImage} GeoTIFFImage\n */\n\nlet workerPool;\nfunction getWorkerPool() {\n if (!workerPool) {\n workerPool = new Pool();\n }\n return workerPool;\n}\n\n/**\n * Get the bounding box of an image. If the image does not have an affine transform,\n * the pixel bounds are returned.\n * @param {GeoTIFFImage} image The image.\n * @return {Array} The image bounding box.\n */\nfunction getBoundingBox(image) {\n try {\n return image.getBoundingBox(true);\n } catch {\n return [0, 0, image.getWidth(), image.getHeight()];\n }\n}\n\n/**\n * Get the origin of an image. If the image does not have an affine transform,\n * the top-left corner of the pixel bounds is returned.\n * @param {GeoTIFFImage} image The image.\n * @return {Array} The image origin.\n */\nfunction getOrigin(image) {\n try {\n return image.getOrigin().slice(0, 2);\n } catch {\n return [0, image.getHeight()];\n }\n}\n\n/**\n * Get the resolution of an image. If the image does not have an affine transform,\n * the width of the image is compared with the reference image.\n * @param {GeoTIFFImage} image The image.\n * @param {GeoTIFFImage} referenceImage The reference image.\n * @return {Array} The map x and y units per pixel.\n */\nfunction getResolutions(image, referenceImage) {\n try {\n return image.getResolution(referenceImage);\n } catch {\n return [\n referenceImage.getWidth() / image.getWidth(),\n referenceImage.getHeight() / image.getHeight(),\n ];\n }\n}\n\n/**\n * @param {GeoTIFFImage} image A GeoTIFF.\n * @return {import(\"../proj/Projection.js\").default} The image projection.\n */\nfunction getProjection(image) {\n const geoKeys = image.geoKeys;\n if (!geoKeys) {\n return null;\n }\n\n if (\n geoKeys.ProjectedCSTypeGeoKey &&\n geoKeys.ProjectedCSTypeGeoKey !== 32767\n ) {\n const code = 'EPSG:' + geoKeys.ProjectedCSTypeGeoKey;\n let projection = getCachedProjection(code);\n if (!projection) {\n const units = unitsFromCode(geoKeys.ProjLinearUnitsGeoKey);\n if (units) {\n projection = new Projection({\n code: code,\n units: units,\n });\n }\n }\n return projection;\n }\n\n if (geoKeys.GeographicTypeGeoKey && geoKeys.GeographicTypeGeoKey !== 32767) {\n const code = 'EPSG:' + geoKeys.GeographicTypeGeoKey;\n let projection = getCachedProjection(code);\n if (!projection) {\n const units = unitsFromCode(geoKeys.GeogAngularUnitsGeoKey);\n if (units) {\n projection = new Projection({\n code: code,\n units: units,\n });\n }\n }\n return projection;\n }\n\n return null;\n}\n\n/**\n * @param {GeoTIFF|MultiGeoTIFF} tiff A GeoTIFF.\n * @return {Promise>} Resolves to a list of images.\n */\nfunction getImagesForTIFF(tiff) {\n return tiff.getImageCount().then(function (count) {\n const requests = new Array(count);\n for (let i = 0; i < count; ++i) {\n requests[i] = tiff.getImage(i);\n }\n return Promise.all(requests);\n });\n}\n\n/**\n * @param {SourceInfo} source The GeoTIFF source.\n * @param {Object} options Options for the GeoTIFF source.\n * @return {Promise>} Resolves to a list of images.\n */\nfunction getImagesForSource(source, options) {\n let request;\n if (source.blob) {\n request = tiffFromBlob(source.blob);\n } else if (source.overviews) {\n request = tiffFromUrls(source.url, source.overviews, options);\n } else {\n request = tiffFromUrl(source.url, options);\n }\n return request.then(getImagesForTIFF);\n}\n\n/**\n * @param {number|Array|Array>} expected Expected value.\n * @param {number|Array|Array>} got Actual value.\n * @param {number} tolerance Accepted tolerance in fraction of expected between expected and got.\n * @param {string} message The error message.\n * @param {function(Error):void} rejector A function to be called with any error.\n */\nfunction assertEqual(expected, got, tolerance, message, rejector) {\n if (Array.isArray(expected)) {\n const length = expected.length;\n if (!Array.isArray(got) || length != got.length) {\n const error = new Error(message);\n rejector(error);\n throw error;\n }\n for (let i = 0; i < length; ++i) {\n assertEqual(expected[i], got[i], tolerance, message, rejector);\n }\n return;\n }\n\n got = /** @type {number} */ (got);\n if (Math.abs(expected - got) > tolerance * expected) {\n throw new Error(message);\n }\n}\n\n/**\n * @param {Array} array The data array.\n * @return {number} The minimum value.\n */\nfunction getMinForDataType(array) {\n if (array instanceof Int8Array) {\n return -128;\n }\n if (array instanceof Int16Array) {\n return -32768;\n }\n if (array instanceof Int32Array) {\n return -2147483648;\n }\n if (array instanceof Float32Array) {\n return 1.2e-38;\n }\n return 0;\n}\n\n/**\n * @param {Array} array The data array.\n * @return {number} The maximum value.\n */\nfunction getMaxForDataType(array) {\n if (array instanceof Int8Array) {\n return 127;\n }\n if (array instanceof Uint8Array) {\n return 255;\n }\n if (array instanceof Uint8ClampedArray) {\n return 255;\n }\n if (array instanceof Int16Array) {\n return 32767;\n }\n if (array instanceof Uint16Array) {\n return 65535;\n }\n if (array instanceof Int32Array) {\n return 2147483647;\n }\n if (array instanceof Uint32Array) {\n return 4294967295;\n }\n if (array instanceof Float32Array) {\n return 3.4e38;\n }\n return 255;\n}\n\n/**\n * @typedef {Object} GeoTIFFSourceOptions\n * @property {boolean} [forceXHR=false] Whether to force the usage of the browsers XMLHttpRequest API.\n * @property {Object} [headers] additional key-value pairs of headers to be passed with each request. Key is the header name, value the header value.\n * @property {string} [credentials] How credentials shall be handled. See\n * https://developer.mozilla.org/en-US/docs/Web/API/fetch for reference and possible values\n * @property {number} [maxRanges] The maximum amount of ranges to request in a single multi-range request.\n * By default only a single range is used.\n * @property {boolean} [allowFullFile=false] Whether or not a full file is accepted when only a portion is\n * requested. Only use this when you know the source image to be small enough to fit in memory.\n * @property {number} [blockSize=65536] The block size to use.\n * @property {number} [cacheSize=100] The number of blocks that shall be held in a LRU cache.\n */\n\n/**\n * @typedef {Object} Options\n * @property {Array} sources List of information about GeoTIFF sources.\n * Multiple sources can be combined when their resolution sets are equal after applying a scale.\n * The list of sources defines a mapping between input bands as they are read from each GeoTIFF and\n * the output bands that are provided by data tiles. To control which bands to read from each GeoTIFF,\n * use the {@link import(\"./GeoTIFF.js\").SourceInfo bands} property. If, for example, you specify two\n * sources, one with 3 bands and {@link import(\"./GeoTIFF.js\").SourceInfo nodata} configured, and\n * another with 1 band, the resulting data tiles will have 5 bands: 3 from the first source, 1 alpha\n * band from the first source, and 1 band from the second source.\n * @property {GeoTIFFSourceOptions} [sourceOptions] Additional options to be passed to [geotiff.js](https://geotiffjs.github.io/geotiff.js/module-geotiff.html)'s `fromUrl` or `fromUrls` methods.\n * @property {true|false|'auto'} [convertToRGB=false] By default, bands from the sources are read as-is. When\n * reading GeoTIFFs with the purpose of displaying them as RGB images, setting this to `true` will\n * convert other color spaces (YCbCr, CMYK) to RGB. Setting the option to `'auto'` will make it so CMYK, YCbCr,\n * CIELab, and ICCLab images will automatically be converted to RGB.\n * @property {boolean} [normalize=true] By default, the source data is normalized to values between\n * 0 and 1 with scaling factors based on the raster statistics or `min` and `max` properties of each source.\n * If instead you want to work with the raw values in a style expression, set this to `false`. Setting this option\n * to `false` will make it so any `min` and `max` properties on sources are ignored.\n * @property {import(\"../proj.js\").ProjectionLike} [projection] Source projection. If not provided, the GeoTIFF metadata\n * will be read for projection information.\n * @property {number} [transition=250] Duration of the opacity transition for rendering.\n * To disable the opacity transition, pass `transition: 0`.\n * @property {boolean} [wrapX=false] Render tiles beyond the tile grid extent.\n * @property {boolean} [interpolate=true] Use interpolated values when resampling. By default,\n * the linear interpolation is used to resample the data. If false, nearest neighbor is used.\n */\n\n/**\n * @classdesc\n * A source for working with GeoTIFF data.\n * **Note for users of the full build**: The `GeoTIFF` source requires the\n * [geotiff.js](https://github.com/geotiffjs/geotiff.js) library to be loaded as well.\n *\n * @api\n */\nclass GeoTIFFSource extends DataTile {\n /**\n * @param {Options} options Data tile options.\n */\n constructor(options) {\n super({\n state: 'loading',\n tileGrid: null,\n projection: options.projection || null,\n transition: options.transition,\n interpolate: options.interpolate !== false,\n wrapX: options.wrapX,\n });\n\n /**\n * @type {Array}\n * @private\n */\n this.sourceInfo_ = options.sources;\n\n const numSources = this.sourceInfo_.length;\n\n /**\n * @type {Object}\n * @private\n */\n this.sourceOptions_ = options.sourceOptions;\n\n /**\n * @type {Array>}\n * @private\n */\n this.sourceImagery_ = new Array(numSources);\n\n /**\n * @type {Array>}\n * @private\n */\n this.sourceMasks_ = new Array(numSources);\n\n /**\n * @type {Array}\n * @private\n */\n this.resolutionFactors_ = new Array(numSources);\n\n /**\n * @type {Array}\n * @private\n */\n this.samplesPerPixel_;\n\n /**\n * @type {Array>}\n * @private\n */\n this.nodataValues_;\n\n /**\n * @type {Array>}\n * @private\n */\n this.metadata_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.normalize_ = options.normalize !== false;\n\n /**\n * @type {boolean}\n * @private\n */\n this.addAlpha_ = false;\n\n /**\n * @type {Error}\n * @private\n */\n this.error_ = null;\n\n /**\n * @type {true|false|'auto'}\n * @private\n */\n this.convertToRGB_ = options.convertToRGB || false;\n\n this.setKey(this.sourceInfo_.map((source) => source.url).join(','));\n\n const self = this;\n const requests = new Array(numSources);\n for (let i = 0; i < numSources; ++i) {\n requests[i] = getImagesForSource(\n this.sourceInfo_[i],\n this.sourceOptions_,\n );\n }\n Promise.all(requests)\n .then(function (sources) {\n self.configure_(sources);\n })\n .catch(function (error) {\n logError(error);\n self.error_ = error;\n self.setState('error');\n });\n }\n\n /**\n * @return {Error} A source loading error. When the source state is `error`, use this function\n * to get more information about the error. To debug a faulty configuration, you may want to use\n * a listener like\n * ```js\n * geotiffSource.on('change', () => {\n * if (geotiffSource.getState() === 'error') {\n * console.error(geotiffSource.getError());\n * }\n * });\n * ```\n */\n getError() {\n return this.error_;\n }\n\n /**\n * Determine the projection of the images in this GeoTIFF.\n * The default implementation looks at the ProjectedCSTypeGeoKey and the GeographicTypeGeoKey\n * of each image in turn.\n * You can override this method in a subclass to support more projections.\n *\n * @param {Array>} sources Each source is a list of images\n * from a single GeoTIFF.\n */\n determineProjection(sources) {\n const firstSource = sources[0];\n for (let i = firstSource.length - 1; i >= 0; --i) {\n const image = firstSource[i];\n const projection = getProjection(image);\n if (projection) {\n this.projection = projection;\n break;\n }\n }\n }\n\n /**\n * Determine any transform matrix for the images in this GeoTIFF.\n *\n * @param {Array>} sources Each source is a list of images\n * from a single GeoTIFF.\n */\n determineTransformMatrix(sources) {\n const firstSource = sources[0];\n for (let i = firstSource.length - 1; i >= 0; --i) {\n const image = firstSource[i];\n const modelTransformation = image.fileDirectory.ModelTransformation;\n if (modelTransformation) {\n // eslint-disable-next-line no-unused-vars\n const [a, b, c, d, e, f, g, h] = modelTransformation;\n const matrix = multiplyTransform(\n multiplyTransform(\n [\n 1 / Math.sqrt(a * a + e * e),\n 0,\n 0,\n -1 / Math.sqrt(b * b + f * f),\n d,\n h,\n ],\n [a, e, b, f, 0, 0],\n ),\n [1, 0, 0, 1, -d, -h],\n );\n this.transformMatrix = matrix;\n this.addAlpha_ = true;\n break;\n }\n }\n }\n\n /**\n * Configure the tile grid based on images within the source GeoTIFFs. Each GeoTIFF\n * must have the same internal tiled structure.\n * @param {Array>} sources Each source is a list of images\n * from a single GeoTIFF.\n * @private\n */\n configure_(sources) {\n let extent;\n let origin;\n let commonRenderTileSizes;\n let commonSourceTileSizes;\n let resolutions;\n const samplesPerPixel = new Array(sources.length);\n const nodataValues = new Array(sources.length);\n const metadata = new Array(sources.length);\n let minZoom = 0;\n\n const sourceCount = sources.length;\n for (let sourceIndex = 0; sourceIndex < sourceCount; ++sourceIndex) {\n const images = [];\n const masks = [];\n sources[sourceIndex].forEach((item) => {\n if (isMask(item)) {\n masks.push(item);\n } else {\n images.push(item);\n }\n });\n\n const imageCount = images.length;\n if (masks.length > 0 && masks.length !== imageCount) {\n throw new Error(\n `Expected one mask per image found ${masks.length} masks and ${imageCount} images`,\n );\n }\n\n let sourceExtent;\n let sourceOrigin;\n const sourceTileSizes = new Array(imageCount);\n const renderTileSizes = new Array(imageCount);\n const sourceResolutions = new Array(imageCount);\n\n nodataValues[sourceIndex] = new Array(imageCount);\n metadata[sourceIndex] = new Array(imageCount);\n\n for (let imageIndex = 0; imageIndex < imageCount; ++imageIndex) {\n const image = images[imageIndex];\n const nodataValue = image.getGDALNoData();\n metadata[sourceIndex][imageIndex] = image.getGDALMetadata(0);\n nodataValues[sourceIndex][imageIndex] = nodataValue;\n\n const wantedSamples = this.sourceInfo_[sourceIndex].bands;\n samplesPerPixel[sourceIndex] = wantedSamples\n ? wantedSamples.length\n : image.getSamplesPerPixel();\n const level = imageCount - (imageIndex + 1);\n\n if (!sourceExtent) {\n sourceExtent = getBoundingBox(image);\n }\n\n if (!sourceOrigin) {\n sourceOrigin = getOrigin(image);\n }\n\n const imageResolutions = getResolutions(image, images[0]);\n sourceResolutions[level] = imageResolutions[0];\n\n const sourceTileSize = [image.getTileWidth(), image.getTileHeight()];\n\n // request larger blocks for untiled layouts\n if (\n sourceTileSize[0] !== sourceTileSize[1] &&\n sourceTileSize[1] < defaultTileSize\n ) {\n sourceTileSize[0] = defaultTileSize;\n sourceTileSize[1] = defaultTileSize;\n }\n\n sourceTileSizes[level] = sourceTileSize;\n\n const aspectRatio = imageResolutions[0] / Math.abs(imageResolutions[1]);\n renderTileSizes[level] = [\n sourceTileSize[0],\n sourceTileSize[1] / aspectRatio,\n ];\n }\n\n if (!extent) {\n extent = sourceExtent;\n } else {\n getIntersection(extent, sourceExtent, extent);\n }\n\n if (!origin) {\n origin = sourceOrigin;\n } else {\n const message = `Origin mismatch for source ${sourceIndex}, got [${sourceOrigin}] but expected [${origin}]`;\n assertEqual(origin, sourceOrigin, 0, message, this.viewRejector);\n }\n\n if (!resolutions) {\n resolutions = sourceResolutions;\n this.resolutionFactors_[sourceIndex] = 1;\n } else {\n if (resolutions.length - minZoom > sourceResolutions.length) {\n minZoom = resolutions.length - sourceResolutions.length;\n }\n const resolutionFactor =\n resolutions[resolutions.length - 1] /\n sourceResolutions[sourceResolutions.length - 1];\n this.resolutionFactors_[sourceIndex] = resolutionFactor;\n const scaledSourceResolutions = sourceResolutions.map(\n (resolution) => (resolution *= resolutionFactor),\n );\n const message = `Resolution mismatch for source ${sourceIndex}, got [${scaledSourceResolutions}] but expected [${resolutions}]`;\n assertEqual(\n resolutions.slice(minZoom, resolutions.length),\n scaledSourceResolutions,\n 0.02,\n message,\n this.viewRejector,\n );\n }\n\n if (!commonRenderTileSizes) {\n commonRenderTileSizes = renderTileSizes;\n } else {\n assertEqual(\n commonRenderTileSizes.slice(minZoom, commonRenderTileSizes.length),\n renderTileSizes,\n 0.01,\n `Tile size mismatch for source ${sourceIndex}`,\n this.viewRejector,\n );\n }\n\n if (!commonSourceTileSizes) {\n commonSourceTileSizes = sourceTileSizes;\n } else {\n assertEqual(\n commonSourceTileSizes.slice(minZoom, commonSourceTileSizes.length),\n sourceTileSizes,\n 0,\n `Tile size mismatch for source ${sourceIndex}`,\n this.viewRejector,\n );\n }\n\n this.sourceImagery_[sourceIndex] = images.reverse();\n this.sourceMasks_[sourceIndex] = masks.reverse();\n }\n\n for (let i = 0, ii = this.sourceImagery_.length; i < ii; ++i) {\n const sourceImagery = this.sourceImagery_[i];\n while (sourceImagery.length < resolutions.length) {\n sourceImagery.unshift(undefined);\n }\n }\n\n if (!this.getProjection()) {\n this.determineProjection(sources);\n }\n this.determineTransformMatrix(sources);\n\n this.samplesPerPixel_ = samplesPerPixel;\n this.nodataValues_ = nodataValues;\n this.metadata_ = metadata;\n\n // decide if we need to add an alpha band to handle nodata\n outer: for (let sourceIndex = 0; sourceIndex < sourceCount; ++sourceIndex) {\n // option 1: source is configured with a nodata value\n if (this.sourceInfo_[sourceIndex].nodata !== undefined) {\n this.addAlpha_ = true;\n break;\n }\n if (this.sourceMasks_[sourceIndex].length) {\n this.addAlpha_ = true;\n break;\n }\n\n const values = nodataValues[sourceIndex];\n\n // option 2: check image metadata for limited bands\n const bands = this.sourceInfo_[sourceIndex].bands;\n if (bands) {\n for (let i = 0; i < bands.length; ++i) {\n if (values[bands[i] - 1] !== null) {\n this.addAlpha_ = true;\n break outer;\n }\n }\n continue;\n }\n\n // option 3: check image metadata for all bands\n for (let imageIndex = 0; imageIndex < values.length; ++imageIndex) {\n if (values[imageIndex] !== null) {\n this.addAlpha_ = true;\n break outer;\n }\n }\n }\n\n let bandCount = this.addAlpha_ ? 1 : 0;\n for (let sourceIndex = 0; sourceIndex < sourceCount; ++sourceIndex) {\n bandCount += samplesPerPixel[sourceIndex];\n }\n this.bandCount = bandCount;\n\n const tileGrid = new TileGrid({\n extent: extent,\n minZoom: minZoom,\n origin: origin,\n resolutions: resolutions,\n tileSizes: commonRenderTileSizes,\n });\n\n this.tileGrid = tileGrid;\n this.setTileSizes(commonSourceTileSizes);\n\n this.setLoader(this.loadTile_.bind(this));\n this.setState('ready');\n\n const zoom = 1;\n if (resolutions.length === 2) {\n resolutions = [resolutions[0], resolutions[1], resolutions[1] / 2];\n } else if (resolutions.length === 1) {\n resolutions = [resolutions[0] * 2, resolutions[0], resolutions[0] / 2];\n }\n\n let viewExtent = extent;\n if (this.transformMatrix) {\n const matrix = makeInverse(createMatrix(), this.transformMatrix.slice());\n const transformFn = createTransformFromCoordinateTransform((input) =>\n applyMatrix(matrix, input),\n );\n viewExtent = applyTransform(extent, transformFn);\n }\n\n this.viewResolver({\n showFullExtent: true,\n projection: this.projection,\n resolutions: resolutions,\n center: toUserCoordinate(getCenter(viewExtent), this.projection),\n extent: toUserExtent(viewExtent, this.projection),\n zoom: zoom,\n });\n }\n\n /**\n * @param {number} z The z tile index.\n * @param {number} x The x tile index.\n * @param {number} y The y tile index.\n * @param {import('./DataTile.js').LoaderOptions} options The loader options.\n * @return {Promise} The composed tile data.\n * @private\n */\n loadTile_(z, x, y, options) {\n const sourceTileSize = this.getTileSize(z);\n const sourceCount = this.sourceImagery_.length;\n const requests = new Array(sourceCount * 2);\n const nodataValues = this.nodataValues_;\n const sourceInfo = this.sourceInfo_;\n const pool = getWorkerPool();\n for (let sourceIndex = 0; sourceIndex < sourceCount; ++sourceIndex) {\n const source = sourceInfo[sourceIndex];\n const resolutionFactor = this.resolutionFactors_[sourceIndex];\n const pixelBounds = [\n Math.round(x * (sourceTileSize[0] * resolutionFactor)),\n Math.round(y * (sourceTileSize[1] * resolutionFactor)),\n Math.round((x + 1) * (sourceTileSize[0] * resolutionFactor)),\n Math.round((y + 1) * (sourceTileSize[1] * resolutionFactor)),\n ];\n const image = this.sourceImagery_[sourceIndex][z];\n let samples;\n if (source.bands) {\n samples = source.bands.map(function (bandNumber) {\n return bandNumber - 1;\n });\n }\n\n /** @type {number|Array} */\n let fillValue;\n if ('nodata' in source && source.nodata !== null) {\n fillValue = source.nodata;\n } else {\n if (!samples) {\n fillValue = nodataValues[sourceIndex];\n } else {\n fillValue = samples.map(function (sampleIndex) {\n return nodataValues[sourceIndex][sampleIndex];\n });\n }\n }\n\n const readOptions = {\n window: pixelBounds,\n width: sourceTileSize[0],\n height: sourceTileSize[1],\n samples: samples,\n fillValue: fillValue,\n pool: pool,\n interleave: false,\n signal: options.signal,\n };\n if (readRGB(this.convertToRGB_, image)) {\n requests[sourceIndex] = image.readRGB(readOptions);\n } else {\n requests[sourceIndex] = image.readRasters(readOptions);\n }\n\n // requests after `sourceCount` are for mask data (if any)\n const maskIndex = sourceCount + sourceIndex;\n const mask = this.sourceMasks_[sourceIndex][z];\n if (!mask) {\n requests[maskIndex] = Promise.resolve(null);\n continue;\n }\n\n requests[maskIndex] = mask.readRasters({\n window: pixelBounds,\n width: sourceTileSize[0],\n height: sourceTileSize[1],\n samples: [0],\n pool: pool,\n interleave: false,\n });\n }\n\n return Promise.all(requests)\n .then(this.composeTile_.bind(this, sourceTileSize))\n .catch(function (error) {\n logError(error);\n throw error;\n });\n }\n\n /**\n * @param {import(\"../size.js\").Size} sourceTileSize The source tile size.\n * @param {Array} sourceSamples The source samples.\n * @return {import(\"../DataTile.js\").Data} The composed tile data.\n * @private\n */\n composeTile_(sourceTileSize, sourceSamples) {\n const metadata = this.metadata_;\n const sourceInfo = this.sourceInfo_;\n const sourceCount = this.sourceImagery_.length;\n const bandCount = this.bandCount;\n const samplesPerPixel = this.samplesPerPixel_;\n const nodataValues = this.nodataValues_;\n const normalize = this.normalize_;\n const addAlpha = this.addAlpha_;\n\n const pixelCount = sourceTileSize[0] * sourceTileSize[1];\n const dataLength = pixelCount * bandCount;\n\n /** @type {Uint8Array|Float32Array} */\n let data;\n if (normalize) {\n data = new Uint8Array(dataLength);\n } else {\n data = new Float32Array(dataLength);\n }\n\n let dataIndex = 0;\n for (let pixelIndex = 0; pixelIndex < pixelCount; ++pixelIndex) {\n let transparent = addAlpha;\n for (let sourceIndex = 0; sourceIndex < sourceCount; ++sourceIndex) {\n const source = sourceInfo[sourceIndex];\n\n let min = source.min;\n let max = source.max;\n let gain, bias;\n if (normalize) {\n const stats = metadata[sourceIndex][0];\n if (min === undefined) {\n if (stats && STATISTICS_MINIMUM in stats) {\n min = parseFloat(stats[STATISTICS_MINIMUM]);\n } else {\n min = getMinForDataType(sourceSamples[sourceIndex][0]);\n }\n }\n if (max === undefined) {\n if (stats && STATISTICS_MAXIMUM in stats) {\n max = parseFloat(stats[STATISTICS_MAXIMUM]);\n } else {\n max = getMaxForDataType(sourceSamples[sourceIndex][0]);\n }\n }\n\n gain = 255 / (max - min);\n bias = -min * gain;\n }\n\n for (\n let sampleIndex = 0;\n sampleIndex < samplesPerPixel[sourceIndex];\n ++sampleIndex\n ) {\n const sourceValue =\n sourceSamples[sourceIndex][sampleIndex][pixelIndex];\n\n let value;\n if (normalize) {\n value = clamp(gain * sourceValue + bias, 0, 255);\n } else {\n value = sourceValue;\n }\n\n if (!addAlpha) {\n data[dataIndex] = value;\n } else {\n let nodata = source.nodata;\n if (nodata === undefined) {\n let bandIndex;\n if (source.bands) {\n bandIndex = source.bands[sampleIndex] - 1;\n } else {\n bandIndex = sampleIndex;\n }\n nodata = nodataValues[sourceIndex][bandIndex];\n }\n\n const nodataIsNaN = isNaN(nodata);\n if (\n (!nodataIsNaN && sourceValue !== nodata) ||\n (nodataIsNaN && !isNaN(sourceValue))\n ) {\n transparent = false;\n data[dataIndex] = value;\n }\n }\n dataIndex++;\n }\n if (!transparent) {\n const maskIndex = sourceCount + sourceIndex;\n const mask = sourceSamples[maskIndex];\n if (mask && !mask[0][pixelIndex]) {\n transparent = true;\n }\n }\n }\n if (addAlpha) {\n if (!transparent) {\n data[dataIndex] = 255;\n }\n dataIndex++;\n }\n }\n\n return data;\n }\n}\n\n/**\n * Get a promise for view properties based on the source. Use the result of this function\n * as the `view` option in a map constructor.\n *\n * const source = new GeoTIFF(options);\n *\n * const map = new Map({\n * target: 'map',\n * layers: [\n * new TileLayer({\n * source: source,\n * }),\n * ],\n * view: source.getView(),\n * });\n *\n * @function\n * @return {Promise} A promise for view-related properties.\n * @api\n *\n */\nGeoTIFFSource.prototype.getView;\n\nexport default GeoTIFFSource;\n","import BaseDecoder from './basedecoder.js';\n\nexport default class RawDecoder extends BaseDecoder {\n decodeBlock(buffer) {\n return buffer;\n }\n}\n","import BaseDecoder from './basedecoder.js';\n\nconst MIN_BITS = 9;\nconst CLEAR_CODE = 256; // clear code\nconst EOI_CODE = 257; // end of information\nconst MAX_BYTELENGTH = 12;\n\nfunction getByte(array, position, length) {\n const d = position % 8;\n const a = Math.floor(position / 8);\n const de = 8 - d;\n const ef = (position + length) - ((a + 1) * 8);\n let fg = (8 * (a + 2)) - (position + length);\n const dg = ((a + 2) * 8) - position;\n fg = Math.max(0, fg);\n if (a >= array.length) {\n console.warn('ran off the end of the buffer before finding EOI_CODE (end on input code)');\n return EOI_CODE;\n }\n let chunk1 = array[a] & ((2 ** (8 - d)) - 1);\n chunk1 <<= (length - de);\n let chunks = chunk1;\n if (a + 1 < array.length) {\n let chunk2 = array[a + 1] >>> fg;\n chunk2 <<= Math.max(0, (length - dg));\n chunks += chunk2;\n }\n if (ef > 8 && a + 2 < array.length) {\n const hi = ((a + 3) * 8) - (position + length);\n const chunk3 = array[a + 2] >>> hi;\n chunks += chunk3;\n }\n return chunks;\n}\n\nfunction appendReversed(dest, source) {\n for (let i = source.length - 1; i >= 0; i--) {\n dest.push(source[i]);\n }\n return dest;\n}\n\nfunction decompress(input) {\n const dictionaryIndex = new Uint16Array(4093);\n const dictionaryChar = new Uint8Array(4093);\n for (let i = 0; i <= 257; i++) {\n dictionaryIndex[i] = 4096;\n dictionaryChar[i] = i;\n }\n let dictionaryLength = 258;\n let byteLength = MIN_BITS;\n let position = 0;\n\n function initDictionary() {\n dictionaryLength = 258;\n byteLength = MIN_BITS;\n }\n function getNext(array) {\n const byte = getByte(array, position, byteLength);\n position += byteLength;\n return byte;\n }\n function addToDictionary(i, c) {\n dictionaryChar[dictionaryLength] = c;\n dictionaryIndex[dictionaryLength] = i;\n dictionaryLength++;\n return dictionaryLength - 1;\n }\n function getDictionaryReversed(n) {\n const rev = [];\n for (let i = n; i !== 4096; i = dictionaryIndex[i]) {\n rev.push(dictionaryChar[i]);\n }\n return rev;\n }\n\n const result = [];\n initDictionary();\n const array = new Uint8Array(input);\n let code = getNext(array);\n let oldCode;\n while (code !== EOI_CODE) {\n if (code === CLEAR_CODE) {\n initDictionary();\n code = getNext(array);\n while (code === CLEAR_CODE) {\n code = getNext(array);\n }\n\n if (code === EOI_CODE) {\n break;\n } else if (code > CLEAR_CODE) {\n throw new Error(`corrupted code at scanline ${code}`);\n } else {\n const val = getDictionaryReversed(code);\n appendReversed(result, val);\n oldCode = code;\n }\n } else if (code < dictionaryLength) {\n const val = getDictionaryReversed(code);\n appendReversed(result, val);\n addToDictionary(oldCode, val[val.length - 1]);\n oldCode = code;\n } else {\n const oldVal = getDictionaryReversed(oldCode);\n if (!oldVal) {\n throw new Error(`Bogus entry. Not in dictionary, ${oldCode} / ${dictionaryLength}, position: ${position}`);\n }\n appendReversed(result, oldVal);\n result.push(oldVal[oldVal.length - 1]);\n addToDictionary(oldCode, oldVal[oldVal.length - 1]);\n oldCode = code;\n }\n\n if (dictionaryLength + 1 >= (2 ** byteLength)) {\n if (byteLength === MAX_BYTELENGTH) {\n oldCode = undefined;\n } else {\n byteLength++;\n }\n }\n code = getNext(array);\n }\n return new Uint8Array(result);\n}\n\nexport default class LZWDecoder extends BaseDecoder {\n decodeBlock(buffer) {\n return decompress(buffer, false).buffer;\n }\n}\n","import BaseDecoder from './basedecoder.js';\n\n/* -*- tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/*\n Copyright 2011 notmasteryet\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n// - The JPEG specification can be found in the ITU CCITT Recommendation T.81\n// (www.w3.org/Graphics/JPEG/itu-t81.pdf)\n// - The JFIF specification can be found in the JPEG File Interchange Format\n// (www.w3.org/Graphics/JPEG/jfif3.pdf)\n// - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters\n// in PostScript Level 2, Technical Note #5116\n// (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)\n\nconst dctZigZag = new Int32Array([\n 0,\n 1, 8,\n 16, 9, 2,\n 3, 10, 17, 24,\n 32, 25, 18, 11, 4,\n 5, 12, 19, 26, 33, 40,\n 48, 41, 34, 27, 20, 13, 6,\n 7, 14, 21, 28, 35, 42, 49, 56,\n 57, 50, 43, 36, 29, 22, 15,\n 23, 30, 37, 44, 51, 58,\n 59, 52, 45, 38, 31,\n 39, 46, 53, 60,\n 61, 54, 47,\n 55, 62,\n 63,\n]);\n\nconst dctCos1 = 4017; // cos(pi/16)\nconst dctSin1 = 799; // sin(pi/16)\nconst dctCos3 = 3406; // cos(3*pi/16)\nconst dctSin3 = 2276; // sin(3*pi/16)\nconst dctCos6 = 1567; // cos(6*pi/16)\nconst dctSin6 = 3784; // sin(6*pi/16)\nconst dctSqrt2 = 5793; // sqrt(2)\nconst dctSqrt1d2 = 2896;// sqrt(2) / 2\n\nfunction buildHuffmanTable(codeLengths, values) {\n let k = 0;\n const code = [];\n let length = 16;\n while (length > 0 && !codeLengths[length - 1]) {\n --length;\n }\n code.push({ children: [], index: 0 });\n\n let p = code[0];\n let q;\n for (let i = 0; i < length; i++) {\n for (let j = 0; j < codeLengths[i]; j++) {\n p = code.pop();\n p.children[p.index] = values[k];\n while (p.index > 0) {\n p = code.pop();\n }\n p.index++;\n code.push(p);\n while (code.length <= i) {\n code.push(q = { children: [], index: 0 });\n p.children[p.index] = q.children;\n p = q;\n }\n k++;\n }\n if (i + 1 < length) {\n // p here points to last code\n code.push(q = { children: [], index: 0 });\n p.children[p.index] = q.children;\n p = q;\n }\n }\n return code[0].children;\n}\n\nfunction decodeScan(data, initialOffset,\n frame, components, resetInterval,\n spectralStart, spectralEnd,\n successivePrev, successive) {\n const { mcusPerLine, progressive } = frame;\n\n const startOffset = initialOffset;\n let offset = initialOffset;\n let bitsData = 0;\n let bitsCount = 0;\n function readBit() {\n if (bitsCount > 0) {\n bitsCount--;\n return (bitsData >> bitsCount) & 1;\n }\n bitsData = data[offset++];\n if (bitsData === 0xFF) {\n const nextByte = data[offset++];\n if (nextByte) {\n throw new Error(`unexpected marker: ${((bitsData << 8) | nextByte).toString(16)}`);\n }\n // unstuff 0\n }\n bitsCount = 7;\n return bitsData >>> 7;\n }\n function decodeHuffman(tree) {\n let node = tree;\n let bit;\n while ((bit = readBit()) !== null) { // eslint-disable-line no-cond-assign\n node = node[bit];\n if (typeof node === 'number') {\n return node;\n }\n if (typeof node !== 'object') {\n throw new Error('invalid huffman sequence');\n }\n }\n return null;\n }\n function receive(initialLength) {\n let length = initialLength;\n let n = 0;\n while (length > 0) {\n const bit = readBit();\n if (bit === null) {\n return undefined;\n }\n n = (n << 1) | bit;\n --length;\n }\n return n;\n }\n function receiveAndExtend(length) {\n const n = receive(length);\n if (n >= 1 << (length - 1)) {\n return n;\n }\n return n + (-1 << length) + 1;\n }\n function decodeBaseline(component, zz) {\n const t = decodeHuffman(component.huffmanTableDC);\n const diff = t === 0 ? 0 : receiveAndExtend(t);\n component.pred += diff;\n zz[0] = component.pred;\n let k = 1;\n while (k < 64) {\n const rs = decodeHuffman(component.huffmanTableAC);\n const s = rs & 15;\n const r = rs >> 4;\n if (s === 0) {\n if (r < 15) {\n break;\n }\n k += 16;\n } else {\n k += r;\n const z = dctZigZag[k];\n zz[z] = receiveAndExtend(s);\n k++;\n }\n }\n }\n function decodeDCFirst(component, zz) {\n const t = decodeHuffman(component.huffmanTableDC);\n const diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);\n component.pred += diff;\n zz[0] = component.pred;\n }\n function decodeDCSuccessive(component, zz) {\n zz[0] |= readBit() << successive;\n }\n let eobrun = 0;\n function decodeACFirst(component, zz) {\n if (eobrun > 0) {\n eobrun--;\n return;\n }\n let k = spectralStart;\n const e = spectralEnd;\n while (k <= e) {\n const rs = decodeHuffman(component.huffmanTableAC);\n const s = rs & 15;\n const r = rs >> 4;\n if (s === 0) {\n if (r < 15) {\n eobrun = receive(r) + (1 << r) - 1;\n break;\n }\n k += 16;\n } else {\n k += r;\n const z = dctZigZag[k];\n zz[z] = receiveAndExtend(s) * (1 << successive);\n k++;\n }\n }\n }\n let successiveACState = 0;\n let successiveACNextValue;\n function decodeACSuccessive(component, zz) {\n let k = spectralStart;\n const e = spectralEnd;\n let r = 0;\n while (k <= e) {\n const z = dctZigZag[k];\n const direction = zz[z] < 0 ? -1 : 1;\n switch (successiveACState) {\n case 0: { // initial state\n const rs = decodeHuffman(component.huffmanTableAC);\n const s = rs & 15;\n r = rs >> 4;\n if (s === 0) {\n if (r < 15) {\n eobrun = receive(r) + (1 << r);\n successiveACState = 4;\n } else {\n r = 16;\n successiveACState = 1;\n }\n } else {\n if (s !== 1) {\n throw new Error('invalid ACn encoding');\n }\n successiveACNextValue = receiveAndExtend(s);\n successiveACState = r ? 2 : 3;\n }\n continue; // eslint-disable-line no-continue\n }\n case 1: // skipping r zero items\n case 2:\n if (zz[z]) {\n zz[z] += (readBit() << successive) * direction;\n } else {\n r--;\n if (r === 0) {\n successiveACState = successiveACState === 2 ? 3 : 0;\n }\n }\n break;\n case 3: // set value for a zero item\n if (zz[z]) {\n zz[z] += (readBit() << successive) * direction;\n } else {\n zz[z] = successiveACNextValue << successive;\n successiveACState = 0;\n }\n break;\n case 4: // eob\n if (zz[z]) {\n zz[z] += (readBit() << successive) * direction;\n }\n break;\n default:\n break;\n }\n k++;\n }\n if (successiveACState === 4) {\n eobrun--;\n if (eobrun === 0) {\n successiveACState = 0;\n }\n }\n }\n function decodeMcu(component, decodeFunction, mcu, row, col) {\n const mcuRow = (mcu / mcusPerLine) | 0;\n const mcuCol = mcu % mcusPerLine;\n const blockRow = (mcuRow * component.v) + row;\n const blockCol = (mcuCol * component.h) + col;\n decodeFunction(component, component.blocks[blockRow][blockCol]);\n }\n function decodeBlock(component, decodeFunction, mcu) {\n const blockRow = (mcu / component.blocksPerLine) | 0;\n const blockCol = mcu % component.blocksPerLine;\n decodeFunction(component, component.blocks[blockRow][blockCol]);\n }\n\n const componentsLength = components.length;\n let component;\n let i;\n let j;\n let k;\n let n;\n let decodeFn;\n if (progressive) {\n if (spectralStart === 0) {\n decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\n } else {\n decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\n }\n } else {\n decodeFn = decodeBaseline;\n }\n\n let mcu = 0;\n let marker;\n let mcuExpected;\n if (componentsLength === 1) {\n mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\n } else {\n mcuExpected = mcusPerLine * frame.mcusPerColumn;\n }\n\n const usedResetInterval = resetInterval || mcuExpected;\n\n while (mcu < mcuExpected) {\n // reset interval stuff\n for (i = 0; i < componentsLength; i++) {\n components[i].pred = 0;\n }\n eobrun = 0;\n\n if (componentsLength === 1) {\n component = components[0];\n for (n = 0; n < usedResetInterval; n++) {\n decodeBlock(component, decodeFn, mcu);\n mcu++;\n }\n } else {\n for (n = 0; n < usedResetInterval; n++) {\n for (i = 0; i < componentsLength; i++) {\n component = components[i];\n const { h, v } = component;\n for (j = 0; j < v; j++) {\n for (k = 0; k < h; k++) {\n decodeMcu(component, decodeFn, mcu, j, k);\n }\n }\n }\n mcu++;\n\n // If we've reached our expected MCU's, stop decoding\n if (mcu === mcuExpected) {\n break;\n }\n }\n }\n\n // find marker\n bitsCount = 0;\n marker = (data[offset] << 8) | data[offset + 1];\n if (marker < 0xFF00) {\n throw new Error('marker was not found');\n }\n\n if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx\n offset += 2;\n } else {\n break;\n }\n }\n\n return offset - startOffset;\n}\n\nfunction buildComponentData(frame, component) {\n const lines = [];\n const { blocksPerLine, blocksPerColumn } = component;\n const samplesPerLine = blocksPerLine << 3;\n const R = new Int32Array(64);\n const r = new Uint8Array(64);\n\n // A port of poppler's IDCT method which in turn is taken from:\n // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,\n // \"Practical Fast 1-D DCT Algorithms with 11 Multiplications\",\n // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,\n // 988-991.\n function quantizeAndInverse(zz, dataOut, dataIn) {\n const qt = component.quantizationTable;\n let v0;\n let v1;\n let v2;\n let v3;\n let v4;\n let v5;\n let v6;\n let v7;\n let t;\n const p = dataIn;\n let i;\n\n // dequant\n for (i = 0; i < 64; i++) {\n p[i] = zz[i] * qt[i];\n }\n\n // inverse DCT on rows\n for (i = 0; i < 8; ++i) {\n const row = 8 * i;\n\n // check for all-zero AC coefficients\n if (p[1 + row] === 0 && p[2 + row] === 0 && p[3 + row] === 0\n && p[4 + row] === 0 && p[5 + row] === 0 && p[6 + row] === 0\n && p[7 + row] === 0) {\n t = ((dctSqrt2 * p[0 + row]) + 512) >> 10;\n p[0 + row] = t;\n p[1 + row] = t;\n p[2 + row] = t;\n p[3 + row] = t;\n p[4 + row] = t;\n p[5 + row] = t;\n p[6 + row] = t;\n p[7 + row] = t;\n continue; // eslint-disable-line no-continue\n }\n\n // stage 4\n v0 = ((dctSqrt2 * p[0 + row]) + 128) >> 8;\n v1 = ((dctSqrt2 * p[4 + row]) + 128) >> 8;\n v2 = p[2 + row];\n v3 = p[6 + row];\n v4 = ((dctSqrt1d2 * (p[1 + row] - p[7 + row])) + 128) >> 8;\n v7 = ((dctSqrt1d2 * (p[1 + row] + p[7 + row])) + 128) >> 8;\n v5 = p[3 + row] << 4;\n v6 = p[5 + row] << 4;\n\n // stage 3\n t = (v0 - v1 + 1) >> 1;\n v0 = (v0 + v1 + 1) >> 1;\n v1 = t;\n t = ((v2 * dctSin6) + (v3 * dctCos6) + 128) >> 8;\n v2 = ((v2 * dctCos6) - (v3 * dctSin6) + 128) >> 8;\n v3 = t;\n t = (v4 - v6 + 1) >> 1;\n v4 = (v4 + v6 + 1) >> 1;\n v6 = t;\n t = (v7 + v5 + 1) >> 1;\n v5 = (v7 - v5 + 1) >> 1;\n v7 = t;\n\n // stage 2\n t = (v0 - v3 + 1) >> 1;\n v0 = (v0 + v3 + 1) >> 1;\n v3 = t;\n t = (v1 - v2 + 1) >> 1;\n v1 = (v1 + v2 + 1) >> 1;\n v2 = t;\n t = ((v4 * dctSin3) + (v7 * dctCos3) + 2048) >> 12;\n v4 = ((v4 * dctCos3) - (v7 * dctSin3) + 2048) >> 12;\n v7 = t;\n t = ((v5 * dctSin1) + (v6 * dctCos1) + 2048) >> 12;\n v5 = ((v5 * dctCos1) - (v6 * dctSin1) + 2048) >> 12;\n v6 = t;\n\n // stage 1\n p[0 + row] = v0 + v7;\n p[7 + row] = v0 - v7;\n p[1 + row] = v1 + v6;\n p[6 + row] = v1 - v6;\n p[2 + row] = v2 + v5;\n p[5 + row] = v2 - v5;\n p[3 + row] = v3 + v4;\n p[4 + row] = v3 - v4;\n }\n\n // inverse DCT on columns\n for (i = 0; i < 8; ++i) {\n const col = i;\n\n // check for all-zero AC coefficients\n if (p[(1 * 8) + col] === 0 && p[(2 * 8) + col] === 0 && p[(3 * 8) + col] === 0\n && p[(4 * 8) + col] === 0 && p[(5 * 8) + col] === 0 && p[(6 * 8) + col] === 0\n && p[(7 * 8) + col] === 0) {\n t = ((dctSqrt2 * dataIn[i + 0]) + 8192) >> 14;\n p[(0 * 8) + col] = t;\n p[(1 * 8) + col] = t;\n p[(2 * 8) + col] = t;\n p[(3 * 8) + col] = t;\n p[(4 * 8) + col] = t;\n p[(5 * 8) + col] = t;\n p[(6 * 8) + col] = t;\n p[(7 * 8) + col] = t;\n continue; // eslint-disable-line no-continue\n }\n\n // stage 4\n v0 = ((dctSqrt2 * p[(0 * 8) + col]) + 2048) >> 12;\n v1 = ((dctSqrt2 * p[(4 * 8) + col]) + 2048) >> 12;\n v2 = p[(2 * 8) + col];\n v3 = p[(6 * 8) + col];\n v4 = ((dctSqrt1d2 * (p[(1 * 8) + col] - p[(7 * 8) + col])) + 2048) >> 12;\n v7 = ((dctSqrt1d2 * (p[(1 * 8) + col] + p[(7 * 8) + col])) + 2048) >> 12;\n v5 = p[(3 * 8) + col];\n v6 = p[(5 * 8) + col];\n\n // stage 3\n t = (v0 - v1 + 1) >> 1;\n v0 = (v0 + v1 + 1) >> 1;\n v1 = t;\n t = ((v2 * dctSin6) + (v3 * dctCos6) + 2048) >> 12;\n v2 = ((v2 * dctCos6) - (v3 * dctSin6) + 2048) >> 12;\n v3 = t;\n t = (v4 - v6 + 1) >> 1;\n v4 = (v4 + v6 + 1) >> 1;\n v6 = t;\n t = (v7 + v5 + 1) >> 1;\n v5 = (v7 - v5 + 1) >> 1;\n v7 = t;\n\n // stage 2\n t = (v0 - v3 + 1) >> 1;\n v0 = (v0 + v3 + 1) >> 1;\n v3 = t;\n t = (v1 - v2 + 1) >> 1;\n v1 = (v1 + v2 + 1) >> 1;\n v2 = t;\n t = ((v4 * dctSin3) + (v7 * dctCos3) + 2048) >> 12;\n v4 = ((v4 * dctCos3) - (v7 * dctSin3) + 2048) >> 12;\n v7 = t;\n t = ((v5 * dctSin1) + (v6 * dctCos1) + 2048) >> 12;\n v5 = ((v5 * dctCos1) - (v6 * dctSin1) + 2048) >> 12;\n v6 = t;\n\n // stage 1\n p[(0 * 8) + col] = v0 + v7;\n p[(7 * 8) + col] = v0 - v7;\n p[(1 * 8) + col] = v1 + v6;\n p[(6 * 8) + col] = v1 - v6;\n p[(2 * 8) + col] = v2 + v5;\n p[(5 * 8) + col] = v2 - v5;\n p[(3 * 8) + col] = v3 + v4;\n p[(4 * 8) + col] = v3 - v4;\n }\n\n // convert to 8-bit integers\n for (i = 0; i < 64; ++i) {\n const sample = 128 + ((p[i] + 8) >> 4);\n if (sample < 0) {\n dataOut[i] = 0;\n } else if (sample > 0XFF) {\n dataOut[i] = 0xFF;\n } else {\n dataOut[i] = sample;\n }\n }\n }\n\n for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\n const scanLine = blockRow << 3;\n for (let i = 0; i < 8; i++) {\n lines.push(new Uint8Array(samplesPerLine));\n }\n for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) {\n quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);\n\n let offset = 0;\n const sample = blockCol << 3;\n for (let j = 0; j < 8; j++) {\n const line = lines[scanLine + j];\n for (let i = 0; i < 8; i++) {\n line[sample + i] = r[offset++];\n }\n }\n }\n }\n return lines;\n}\n\nclass JpegStreamReader {\n constructor() {\n this.jfif = null;\n this.adobe = null;\n\n this.quantizationTables = [];\n this.huffmanTablesAC = [];\n this.huffmanTablesDC = [];\n this.resetFrames();\n }\n\n resetFrames() {\n this.frames = [];\n }\n\n parse(data) {\n let offset = 0;\n // const { length } = data;\n function readUint16() {\n const value = (data[offset] << 8) | data[offset + 1];\n offset += 2;\n return value;\n }\n function readDataBlock() {\n const length = readUint16();\n const array = data.subarray(offset, offset + length - 2);\n offset += array.length;\n return array;\n }\n function prepareComponents(frame) {\n let maxH = 0;\n let maxV = 0;\n let component;\n let componentId;\n for (componentId in frame.components) {\n if (frame.components.hasOwnProperty(componentId)) {\n component = frame.components[componentId];\n if (maxH < component.h) {\n maxH = component.h;\n }\n if (maxV < component.v) {\n maxV = component.v;\n }\n }\n }\n const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);\n const mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);\n for (componentId in frame.components) {\n if (frame.components.hasOwnProperty(componentId)) {\n component = frame.components[componentId];\n const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);\n const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);\n const blocksPerLineForMcu = mcusPerLine * component.h;\n const blocksPerColumnForMcu = mcusPerColumn * component.v;\n const blocks = [];\n for (let i = 0; i < blocksPerColumnForMcu; i++) {\n const row = [];\n for (let j = 0; j < blocksPerLineForMcu; j++) {\n row.push(new Int32Array(64));\n }\n blocks.push(row);\n }\n component.blocksPerLine = blocksPerLine;\n component.blocksPerColumn = blocksPerColumn;\n component.blocks = blocks;\n }\n }\n frame.maxH = maxH;\n frame.maxV = maxV;\n frame.mcusPerLine = mcusPerLine;\n frame.mcusPerColumn = mcusPerColumn;\n }\n\n let fileMarker = readUint16();\n if (fileMarker !== 0xFFD8) { // SOI (Start of Image)\n throw new Error('SOI not found');\n }\n\n fileMarker = readUint16();\n while (fileMarker !== 0xFFD9) { // EOI (End of image)\n switch (fileMarker) {\n case 0xFF00: break;\n case 0xFFE0: // APP0 (Application Specific)\n case 0xFFE1: // APP1\n case 0xFFE2: // APP2\n case 0xFFE3: // APP3\n case 0xFFE4: // APP4\n case 0xFFE5: // APP5\n case 0xFFE6: // APP6\n case 0xFFE7: // APP7\n case 0xFFE8: // APP8\n case 0xFFE9: // APP9\n case 0xFFEA: // APP10\n case 0xFFEB: // APP11\n case 0xFFEC: // APP12\n case 0xFFED: // APP13\n case 0xFFEE: // APP14\n case 0xFFEF: // APP15\n case 0xFFFE: { // COM (Comment)\n const appData = readDataBlock();\n\n if (fileMarker === 0xFFE0) {\n if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49\n && appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\\x00'\n this.jfif = {\n version: { major: appData[5], minor: appData[6] },\n densityUnits: appData[7],\n xDensity: (appData[8] << 8) | appData[9],\n yDensity: (appData[10] << 8) | appData[11],\n thumbWidth: appData[12],\n thumbHeight: appData[13],\n thumbData: appData.subarray(14, 14 + (3 * appData[12] * appData[13])),\n };\n }\n }\n // TODO APP1 - Exif\n if (fileMarker === 0xFFEE) {\n if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F\n && appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\\x00'\n this.adobe = {\n version: appData[6],\n flags0: (appData[7] << 8) | appData[8],\n flags1: (appData[9] << 8) | appData[10],\n transformCode: appData[11],\n };\n }\n }\n break;\n }\n\n case 0xFFDB: { // DQT (Define Quantization Tables)\n const quantizationTablesLength = readUint16();\n const quantizationTablesEnd = quantizationTablesLength + offset - 2;\n while (offset < quantizationTablesEnd) {\n const quantizationTableSpec = data[offset++];\n const tableData = new Int32Array(64);\n if ((quantizationTableSpec >> 4) === 0) { // 8 bit values\n for (let j = 0; j < 64; j++) {\n const z = dctZigZag[j];\n tableData[z] = data[offset++];\n }\n } else if ((quantizationTableSpec >> 4) === 1) { // 16 bit\n for (let j = 0; j < 64; j++) {\n const z = dctZigZag[j];\n tableData[z] = readUint16();\n }\n } else {\n throw new Error('DQT: invalid table spec');\n }\n this.quantizationTables[quantizationTableSpec & 15] = tableData;\n }\n break;\n }\n\n case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)\n case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)\n case 0xFFC2: { // SOF2 (Start of Frame, Progressive DCT)\n readUint16(); // skip data length\n const frame = {\n extended: (fileMarker === 0xFFC1),\n progressive: (fileMarker === 0xFFC2),\n precision: data[offset++],\n scanLines: readUint16(),\n samplesPerLine: readUint16(),\n components: {},\n componentsOrder: [],\n };\n\n const componentsCount = data[offset++];\n let componentId;\n // let maxH = 0;\n // let maxV = 0;\n for (let i = 0; i < componentsCount; i++) {\n componentId = data[offset];\n const h = data[offset + 1] >> 4;\n const v = data[offset + 1] & 15;\n const qId = data[offset + 2];\n frame.componentsOrder.push(componentId);\n frame.components[componentId] = {\n h,\n v,\n quantizationIdx: qId,\n };\n offset += 3;\n }\n prepareComponents(frame);\n this.frames.push(frame);\n break;\n }\n\n case 0xFFC4: { // DHT (Define Huffman Tables)\n const huffmanLength = readUint16();\n for (let i = 2; i < huffmanLength;) {\n const huffmanTableSpec = data[offset++];\n const codeLengths = new Uint8Array(16);\n let codeLengthSum = 0;\n for (let j = 0; j < 16; j++, offset++) {\n codeLengths[j] = data[offset];\n codeLengthSum += codeLengths[j];\n }\n const huffmanValues = new Uint8Array(codeLengthSum);\n for (let j = 0; j < codeLengthSum; j++, offset++) {\n huffmanValues[j] = data[offset];\n }\n i += 17 + codeLengthSum;\n\n if ((huffmanTableSpec >> 4) === 0) {\n this.huffmanTablesDC[huffmanTableSpec & 15] = buildHuffmanTable(\n codeLengths, huffmanValues,\n );\n } else {\n this.huffmanTablesAC[huffmanTableSpec & 15] = buildHuffmanTable(\n codeLengths, huffmanValues,\n );\n }\n }\n break;\n }\n\n case 0xFFDD: // DRI (Define Restart Interval)\n readUint16(); // skip data length\n this.resetInterval = readUint16();\n break;\n\n case 0xFFDA: { // SOS (Start of Scan)\n readUint16(); // skip length\n const selectorsCount = data[offset++];\n const components = [];\n const frame = this.frames[0];\n for (let i = 0; i < selectorsCount; i++) {\n const component = frame.components[data[offset++]];\n const tableSpec = data[offset++];\n component.huffmanTableDC = this.huffmanTablesDC[tableSpec >> 4];\n component.huffmanTableAC = this.huffmanTablesAC[tableSpec & 15];\n components.push(component);\n }\n const spectralStart = data[offset++];\n const spectralEnd = data[offset++];\n const successiveApproximation = data[offset++];\n const processed = decodeScan(data, offset,\n frame, components, this.resetInterval,\n spectralStart, spectralEnd,\n successiveApproximation >> 4, successiveApproximation & 15);\n offset += processed;\n break;\n }\n\n case 0xFFFF: // Fill bytes\n if (data[offset] !== 0xFF) { // Avoid skipping a valid marker.\n offset--;\n }\n break;\n\n default:\n if (data[offset - 3] === 0xFF\n && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {\n // could be incorrect encoding -- last 0xFF byte of the previous\n // block was eaten by the encoder\n offset -= 3;\n break;\n }\n throw new Error(`unknown JPEG marker ${fileMarker.toString(16)}`);\n }\n fileMarker = readUint16();\n }\n }\n\n getResult() {\n const { frames } = this;\n if (this.frames.length === 0) {\n throw new Error('no frames were decoded');\n } else if (this.frames.length > 1) {\n console.warn('more than one frame is not supported');\n }\n\n // set each frame's components quantization table\n for (let i = 0; i < this.frames.length; i++) {\n const cp = this.frames[i].components;\n for (const j of Object.keys(cp)) {\n cp[j].quantizationTable = this.quantizationTables[cp[j].quantizationIdx];\n delete cp[j].quantizationIdx;\n }\n }\n\n const frame = frames[0];\n const { components, componentsOrder } = frame;\n const outComponents = [];\n const width = frame.samplesPerLine;\n const height = frame.scanLines;\n\n for (let i = 0; i < componentsOrder.length; i++) {\n const component = components[componentsOrder[i]];\n outComponents.push({\n lines: buildComponentData(frame, component),\n scaleX: component.h / frame.maxH,\n scaleY: component.v / frame.maxV,\n });\n }\n\n const out = new Uint8Array(width * height * outComponents.length);\n let oi = 0;\n for (let y = 0; y < height; ++y) {\n for (let x = 0; x < width; ++x) {\n for (let i = 0; i < outComponents.length; ++i) {\n const component = outComponents[i];\n out[oi] = component.lines[0 | y * component.scaleY][0 | x * component.scaleX];\n ++oi;\n }\n }\n }\n return out;\n }\n}\n\nexport default class JpegDecoder extends BaseDecoder {\n constructor(fileDirectory) {\n super();\n this.reader = new JpegStreamReader();\n if (fileDirectory.JPEGTables) {\n this.reader.parse(fileDirectory.JPEGTables);\n }\n }\n\n decodeBlock(buffer) {\n this.reader.resetFrames();\n this.reader.parse(new Uint8Array(buffer));\n return this.reader.getResult().buffer;\n }\n}\n","import { inflate } from 'pako';\nimport BaseDecoder from './basedecoder.js';\n\nexport default class DeflateDecoder extends BaseDecoder {\n decodeBlock(buffer) {\n return inflate(new Uint8Array(buffer)).buffer;\n }\n}\n","import BaseDecoder from './basedecoder.js';\n\nexport default class PackbitsDecoder extends BaseDecoder {\n decodeBlock(buffer) {\n const dataView = new DataView(buffer);\n const out = [];\n\n for (let i = 0; i < buffer.byteLength; ++i) {\n let header = dataView.getInt8(i);\n if (header < 0) {\n const next = dataView.getUint8(i + 1);\n header = -header;\n for (let j = 0; j <= header; ++j) {\n out.push(next);\n }\n i += 1;\n } else {\n for (let j = 0; j <= header; ++j) {\n out.push(dataView.getUint8(i + j + 1));\n }\n i += header + 1;\n }\n }\n return new Uint8Array(out).buffer;\n }\n}\n","/* jshint forin: false, bitwise: false */\n/*\nCopyright 2015-2021 Esri\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\nA copy of the license and additional notices are located with the\nsource distribution at:\n\nhttp://github.com/Esri/lerc/\n\nContributors: Johannes Schmid, (LERC v1)\n Chayanika Khatua, (LERC v1)\n Wenxue Ju (LERC v1, v2.x)\n*/\n\n/* Copyright 2015-2021 Esri. Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */\n\n/**\n * a module for decoding LERC blobs\n * @module Lerc\n */\n(function() {\n //this decoder supports all lerc versions, each version has its own class (LercDecode and Lerc2Decode). \n //the exported module handles format variation autoamtically.\n\n //the original LercDecode for Version 1\n var LercDecode = (function() {\n\n // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of\n // the class was chosen to be future proof.\n\n var CntZImage = {};\n\n CntZImage.defaultNoDataValue = -3.4027999387901484e+38; // smallest Float32 value\n\n /**\n * Decode a LERC byte stream and return an object containing the pixel data and some required and optional\n * information about it, such as the image's width and height.\n *\n * @param {ArrayBuffer} input The LERC input byte stream\n * @param {object} [options] Decoding options, containing any of the following properties:\n * @config {number} [inputOffset = 0]\n * Skip the first inputOffset bytes of the input byte stream. A valid LERC file is expected at that position.\n * @config {Uint8Array} [encodedMask = null]\n * If specified, the decoder will not read mask information from the input and use the specified encoded\n * mask data instead. Mask header/data must not be present in the LERC byte stream in this case.\n * @config {number} [noDataValue = LercCode.defaultNoDataValue]\n * Pixel value to use for masked pixels.\n * @config {ArrayBufferView|Array} [pixelType = Float32Array]\n * The desired type of the pixelData array in the return value. Note that it is the caller's responsibility to\n * provide an appropriate noDataValue if the default pixelType is overridden.\n * @config {boolean} [returnMask = false]\n * If true, the return value will contain a maskData property of type Uint8Array which has one element per\n * pixel, the value of which is 1 or 0 depending on whether that pixel's data is present or masked. If the\n * input LERC data does not contain a mask, maskData will not be returned.\n * @config {boolean} [returnEncodedMask = false]\n * If true, the return value will contain a encodedMaskData property, which can be passed into encode() as\n * encodedMask.\n * @config {boolean} [returnFileInfo = false]\n * If true, the return value will have a fileInfo property that contains metadata obtained from the\n * LERC headers and the decoding process.\n * @config {boolean} [computeUsedBitDepths = false]\n * If true, the fileInfo property in the return value will contain the set of all block bit depths\n * encountered during decoding. Will only have an effect if returnFileInfo option is true.\n * @returns {{width, height, pixelData, minValue, maxValue, noDataValue, maskData, encodedMaskData, fileInfo}}\n */\n CntZImage.decode = function(input, options) {\n options = options || {};\n\n var skipMask = options.encodedMaskData || (options.encodedMaskData === null);\n var parsedData = parse(input, options.inputOffset || 0, skipMask);\n\n var noDataValue = (options.noDataValue !== null) ? options.noDataValue : CntZImage.defaultNoDataValue;\n\n var uncompressedData = uncompressPixelValues(parsedData, options.pixelType || Float32Array,\n options.encodedMaskData, noDataValue, options.returnMask);\n\n var result = {\n width: parsedData.width,\n height: parsedData.height,\n pixelData: uncompressedData.resultPixels,\n minValue: uncompressedData.minValue,\n maxValue: parsedData.pixels.maxValue,\n noDataValue: noDataValue\n };\n\n if (uncompressedData.resultMask) {\n result.maskData = uncompressedData.resultMask;\n }\n\n if (options.returnEncodedMask && parsedData.mask) {\n result.encodedMaskData = parsedData.mask.bitset ? parsedData.mask.bitset : null;\n }\n\n if (options.returnFileInfo) {\n result.fileInfo = formatFileInfo(parsedData);\n if (options.computeUsedBitDepths) {\n result.fileInfo.bitDepths = computeUsedBitDepths(parsedData);\n }\n }\n\n return result;\n };\n\n var uncompressPixelValues = function(data, TypedArrayClass, maskBitset, noDataValue, storeDecodedMask) {\n var blockIdx = 0;\n var numX = data.pixels.numBlocksX;\n var numY = data.pixels.numBlocksY;\n var blockWidth = Math.floor(data.width / numX);\n var blockHeight = Math.floor(data.height / numY);\n var scale = 2 * data.maxZError;\n var minValue = Number.MAX_VALUE, currentValue;\n maskBitset = maskBitset || ((data.mask) ? data.mask.bitset : null);\n\n var resultPixels, resultMask;\n resultPixels = new TypedArrayClass(data.width * data.height);\n if (storeDecodedMask && maskBitset) {\n resultMask = new Uint8Array(data.width * data.height);\n }\n var blockDataBuffer = new Float32Array(blockWidth * blockHeight);\n\n var xx, yy;\n for (var y = 0; y <= numY; y++) {\n var thisBlockHeight = (y !== numY) ? blockHeight : (data.height % numY);\n if (thisBlockHeight === 0) {\n continue;\n }\n for (var x = 0; x <= numX; x++) {\n var thisBlockWidth = (x !== numX) ? blockWidth : (data.width % numX);\n if (thisBlockWidth === 0) {\n continue;\n }\n\n var outPtr = y * data.width * blockHeight + x * blockWidth;\n var outStride = data.width - thisBlockWidth;\n\n var block = data.pixels.blocks[blockIdx];\n\n var blockData, blockPtr, constValue;\n if (block.encoding < 2) {\n // block is either uncompressed or bit-stuffed (encodings 0 and 1)\n if (block.encoding === 0) {\n // block is uncompressed\n blockData = block.rawData;\n } else {\n // block is bit-stuffed\n unstuff(block.stuffedData, block.bitsPerPixel, block.numValidPixels, block.offset, scale, blockDataBuffer, data.pixels.maxValue);\n blockData = blockDataBuffer;\n }\n blockPtr = 0;\n }\n else if (block.encoding === 2) {\n // block is all 0\n constValue = 0;\n }\n else {\n // block has constant value (encoding === 3)\n constValue = block.offset;\n }\n\n var maskByte;\n if (maskBitset) {\n for (yy = 0; yy < thisBlockHeight; yy++) {\n if (outPtr & 7) {\n //\n maskByte = maskBitset[outPtr >> 3];\n maskByte <<= outPtr & 7;\n }\n for (xx = 0; xx < thisBlockWidth; xx++) {\n if (!(outPtr & 7)) {\n // read next byte from mask\n maskByte = maskBitset[outPtr >> 3];\n }\n if (maskByte & 128) {\n // pixel data present\n if (resultMask) {\n resultMask[outPtr] = 1;\n }\n currentValue = (block.encoding < 2) ? blockData[blockPtr++] : constValue;\n minValue = minValue > currentValue ? currentValue : minValue;\n resultPixels[outPtr++] = currentValue;\n } else {\n // pixel data not present\n if (resultMask) {\n resultMask[outPtr] = 0;\n }\n resultPixels[outPtr++] = noDataValue;\n }\n maskByte <<= 1;\n }\n outPtr += outStride;\n }\n } else {\n // mask not present, simply copy block over\n if (block.encoding < 2) {\n // duplicating this code block for performance reasons\n // blockData case:\n for (yy = 0; yy < thisBlockHeight; yy++) {\n for (xx = 0; xx < thisBlockWidth; xx++) {\n currentValue = blockData[blockPtr++];\n minValue = minValue > currentValue ? currentValue : minValue;\n resultPixels[outPtr++] = currentValue;\n }\n outPtr += outStride;\n }\n }\n else {\n // constValue case:\n minValue = minValue > constValue ? constValue : minValue;\n for (yy = 0; yy < thisBlockHeight; yy++) {\n for (xx = 0; xx < thisBlockWidth; xx++) {\n resultPixels[outPtr++] = constValue;\n }\n outPtr += outStride;\n }\n }\n }\n if ((block.encoding === 1) && (blockPtr !== block.numValidPixels)) {\n throw \"Block and Mask do not match\";\n }\n blockIdx++;\n }\n }\n\n return {\n resultPixels: resultPixels,\n resultMask: resultMask,\n minValue: minValue\n };\n };\n\n var formatFileInfo = function(data) {\n return {\n \"fileIdentifierString\": data.fileIdentifierString,\n \"fileVersion\": data.fileVersion,\n \"imageType\": data.imageType,\n \"height\": data.height,\n \"width\": data.width,\n \"maxZError\": data.maxZError,\n \"eofOffset\": data.eofOffset,\n \"mask\": data.mask ? {\n \"numBlocksX\": data.mask.numBlocksX,\n \"numBlocksY\": data.mask.numBlocksY,\n \"numBytes\": data.mask.numBytes,\n \"maxValue\": data.mask.maxValue\n } : null,\n \"pixels\": {\n \"numBlocksX\": data.pixels.numBlocksX,\n \"numBlocksY\": data.pixels.numBlocksY,\n \"numBytes\": data.pixels.numBytes,\n \"maxValue\": data.pixels.maxValue,\n \"noDataValue\": data.noDataValue\n }\n };\n };\n\n var computeUsedBitDepths = function(data) {\n var numBlocks = data.pixels.numBlocksX * data.pixels.numBlocksY;\n var bitDepths = {};\n for (var i = 0; i < numBlocks; i++) {\n var block = data.pixels.blocks[i];\n if (block.encoding === 0) {\n bitDepths.float32 = true;\n } else if (block.encoding === 1) {\n bitDepths[block.bitsPerPixel] = true;\n } else {\n bitDepths[0] = true;\n }\n }\n\n return Object.keys(bitDepths);\n };\n\n var parse = function(input, fp, skipMask) {\n var data = {};\n\n // File header\n var fileIdView = new Uint8Array(input, fp, 10);\n data.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);\n if (data.fileIdentifierString.trim() !== \"CntZImage\") {\n throw \"Unexpected file identifier string: \" + data.fileIdentifierString;\n }\n fp += 10;\n var view = new DataView(input, fp, 24);\n data.fileVersion = view.getInt32(0, true);\n data.imageType = view.getInt32(4, true);\n data.height = view.getUint32(8, true);\n data.width = view.getUint32(12, true);\n data.maxZError = view.getFloat64(16, true);\n fp += 24;\n\n // Mask Header\n if (!skipMask) {\n view = new DataView(input, fp, 16);\n data.mask = {};\n data.mask.numBlocksY = view.getUint32(0, true);\n data.mask.numBlocksX = view.getUint32(4, true);\n data.mask.numBytes = view.getUint32(8, true);\n data.mask.maxValue = view.getFloat32(12, true);\n fp += 16;\n\n // Mask Data\n if (data.mask.numBytes > 0) {\n var bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));\n view = new DataView(input, fp, data.mask.numBytes);\n var cnt = view.getInt16(0, true);\n var ip = 2, op = 0;\n do {\n if (cnt > 0) {\n while (cnt--) { bitset[op++] = view.getUint8(ip++); }\n } else {\n var val = view.getUint8(ip++);\n cnt = -cnt;\n while (cnt--) { bitset[op++] = val; }\n }\n cnt = view.getInt16(ip, true);\n ip += 2;\n } while (ip < data.mask.numBytes);\n if ((cnt !== -32768) || (op < bitset.length)) {\n throw \"Unexpected end of mask RLE encoding\";\n }\n data.mask.bitset = bitset;\n fp += data.mask.numBytes;\n }\n else if ((data.mask.numBytes | data.mask.numBlocksY | data.mask.maxValue) === 0) { // Special case, all nodata\n data.mask.bitset = new Uint8Array(Math.ceil(data.width * data.height / 8));\n }\n }\n\n // Pixel Header\n view = new DataView(input, fp, 16);\n data.pixels = {};\n data.pixels.numBlocksY = view.getUint32(0, true);\n data.pixels.numBlocksX = view.getUint32(4, true);\n data.pixels.numBytes = view.getUint32(8, true);\n data.pixels.maxValue = view.getFloat32(12, true);\n fp += 16;\n\n var numBlocksX = data.pixels.numBlocksX;\n var numBlocksY = data.pixels.numBlocksY;\n // the number of blocks specified in the header does not take into account the blocks at the end of\n // each row/column with a special width/height that make the image complete in case the width is not\n // evenly divisible by the number of blocks.\n var actualNumBlocksX = numBlocksX + ((data.width % numBlocksX) > 0 ? 1 : 0);\n var actualNumBlocksY = numBlocksY + ((data.height % numBlocksY) > 0 ? 1 : 0);\n data.pixels.blocks = new Array(actualNumBlocksX * actualNumBlocksY);\n var blockI = 0;\n for (var blockY = 0; blockY < actualNumBlocksY; blockY++) {\n for (var blockX = 0; blockX < actualNumBlocksX; blockX++) {\n\n // Block\n var size = 0;\n var bytesLeft = input.byteLength - fp;\n view = new DataView(input, fp, Math.min(10, bytesLeft));\n var block = {};\n data.pixels.blocks[blockI++] = block;\n var headerByte = view.getUint8(0); size++;\n block.encoding = headerByte & 63;\n if (block.encoding > 3) {\n throw \"Invalid block encoding (\" + block.encoding + \")\";\n }\n if (block.encoding === 2) {\n fp++;\n continue;\n }\n if ((headerByte !== 0) && (headerByte !== 2)) {\n headerByte >>= 6;\n block.offsetType = headerByte;\n if (headerByte === 2) {\n block.offset = view.getInt8(1); size++;\n } else if (headerByte === 1) {\n block.offset = view.getInt16(1, true); size += 2;\n } else if (headerByte === 0) {\n block.offset = view.getFloat32(1, true); size += 4;\n } else {\n throw \"Invalid block offset type\";\n }\n\n if (block.encoding === 1) {\n headerByte = view.getUint8(size); size++;\n block.bitsPerPixel = headerByte & 63;\n headerByte >>= 6;\n block.numValidPixelsType = headerByte;\n if (headerByte === 2) {\n block.numValidPixels = view.getUint8(size); size++;\n } else if (headerByte === 1) {\n block.numValidPixels = view.getUint16(size, true); size += 2;\n } else if (headerByte === 0) {\n block.numValidPixels = view.getUint32(size, true); size += 4;\n } else {\n throw \"Invalid valid pixel count type\";\n }\n }\n }\n fp += size;\n\n if (block.encoding === 3) {\n continue;\n }\n\n var arrayBuf, store8;\n if (block.encoding === 0) {\n var numPixels = (data.pixels.numBytes - 1) / 4;\n if (numPixels !== Math.floor(numPixels)) {\n throw \"uncompressed block has invalid length\";\n }\n arrayBuf = new ArrayBuffer(numPixels * 4);\n store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, fp, numPixels * 4));\n var rawData = new Float32Array(arrayBuf);\n block.rawData = rawData;\n fp += numPixels * 4;\n } else if (block.encoding === 1) {\n var dataBytes = Math.ceil(block.numValidPixels * block.bitsPerPixel / 8);\n var dataWords = Math.ceil(dataBytes / 4);\n arrayBuf = new ArrayBuffer(dataWords * 4);\n store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, fp, dataBytes));\n block.stuffedData = new Uint32Array(arrayBuf);\n fp += dataBytes;\n }\n }\n }\n data.eofOffset = fp;\n return data;\n };\n\n var unstuff = function(src, bitsPerPixel, numPixels, offset, scale, dest, maxValue) {\n var bitMask = (1 << bitsPerPixel) - 1;\n var i = 0, o;\n var bitsLeft = 0;\n var n, buffer;\n var nmax = Math.ceil((maxValue - offset) / scale);\n // get rid of trailing bytes that are already part of next block\n var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);\n src[src.length - 1] <<= 8 * numInvalidTailBytes;\n\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n }\n if (bitsLeft >= bitsPerPixel) {\n n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;\n bitsLeft -= bitsPerPixel;\n } else {\n var missingBits = (bitsPerPixel - bitsLeft);\n n = ((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n += (buffer >>> bitsLeft);\n }\n //pixel values may exceed max due to quantization\n dest[o] = n < nmax ? offset + n * scale : maxValue;\n }\n return dest;\n };\n\n return CntZImage;\n })();\n\n //version 2. Supports 2.1, 2.2, 2.3\n var Lerc2Decode = (function() {\n \"use strict\";\n // Note: currently, this module only has an implementation for decoding LERC data, not encoding. The name of\n // the class was chosen to be future proof, following LercDecode.\n\n /*****************************************\n * private static class bitsutffer used by Lerc2Decode\n *******************************************/\n var BitStuffer = {\n //methods ending with 2 are for the new byte order used by Lerc2.3 and above.\n //originalUnstuff is used to unpack Huffman code table. code is duplicated to unstuffx for performance reasons.\n unstuff: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {\n var bitMask = (1 << bitsPerPixel) - 1;\n var i = 0, o;\n var bitsLeft = 0;\n var n, buffer, missingBits, nmax;\n\n // get rid of trailing bytes that are already part of next block\n var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);\n src[src.length - 1] <<= 8 * numInvalidTailBytes;\n if (lutArr) {\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n }\n if (bitsLeft >= bitsPerPixel) {\n n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;\n bitsLeft -= bitsPerPixel;\n }\n else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = ((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n += (buffer >>> bitsLeft);\n }\n dest[o] = lutArr[n];//offset + lutArr[n] * scale;\n }\n }\n else {\n nmax = Math.ceil((maxValue - offset) / scale);\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n }\n if (bitsLeft >= bitsPerPixel) {\n n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;\n bitsLeft -= bitsPerPixel;\n }\n else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = ((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n += (buffer >>> bitsLeft);\n }\n //pixel values may exceed max due to quantization\n dest[o] = n < nmax ? offset + n * scale : maxValue;\n }\n }\n },\n\n unstuffLUT: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {\n var bitMask = (1 << bitsPerPixel) - 1;\n var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0;\n var buffer;\n var dest = [];\n\n // get rid of trailing bytes that are already part of next block\n var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);\n src[src.length - 1] <<= 8 * numInvalidTailBytes;\n\n var nmax = Math.ceil((maxValue - offset) / scale);\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n }\n if (bitsLeft >= bitsPerPixel) {\n n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;\n bitsLeft -= bitsPerPixel;\n } else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = ((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n += (buffer >>> bitsLeft);\n }\n //dest.push(n);\n dest[o] = n < nmax ? offset + n * scale : maxValue;\n }\n dest.unshift(offset);//1st one\n return dest;\n },\n\n unstuff2: function(src, dest, bitsPerPixel, numPixels, lutArr, offset, scale, maxValue) {\n var bitMask = (1 << bitsPerPixel) - 1;\n var i = 0, o;\n var bitsLeft = 0, bitPos = 0;\n var n, buffer, missingBits;\n if (lutArr) {\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n bitPos = 0;\n }\n if (bitsLeft >= bitsPerPixel) {\n n = ((buffer >>> bitPos) & bitMask);\n bitsLeft -= bitsPerPixel;\n bitPos += bitsPerPixel;\n } else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = (buffer >>> bitPos) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);\n bitPos = missingBits;\n }\n dest[o] = lutArr[n];\n }\n }\n else {\n var nmax = Math.ceil((maxValue - offset) / scale);\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n bitPos = 0;\n }\n if (bitsLeft >= bitsPerPixel) {\n //no unsigned left shift\n n = ((buffer >>> bitPos) & bitMask);\n bitsLeft -= bitsPerPixel;\n bitPos += bitsPerPixel;\n } else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);\n bitPos = missingBits;\n }\n //pixel values may exceed max due to quantization\n dest[o] = n < nmax ? offset + n * scale : maxValue;\n }\n }\n return dest;\n },\n\n unstuffLUT2: function(src, bitsPerPixel, numPixels, offset, scale, maxValue) {\n var bitMask = (1 << bitsPerPixel) - 1;\n var i = 0, o = 0, missingBits = 0, bitsLeft = 0, n = 0, bitPos = 0;\n var buffer;\n var dest = [];\n var nmax = Math.ceil((maxValue - offset) / scale);\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n bitPos = 0;\n }\n if (bitsLeft >= bitsPerPixel) {\n //no unsigned left shift\n n = ((buffer >>> bitPos) & bitMask);\n bitsLeft -= bitsPerPixel;\n bitPos += bitsPerPixel;\n } else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);\n bitPos = missingBits;\n }\n //dest.push(n);\n dest[o] = n < nmax ? offset + n * scale : maxValue;\n }\n dest.unshift(offset);\n return dest;\n },\n\n originalUnstuff: function(src, dest, bitsPerPixel, numPixels) {\n var bitMask = (1 << bitsPerPixel) - 1;\n var i = 0, o;\n var bitsLeft = 0;\n var n, buffer, missingBits;\n\n // get rid of trailing bytes that are already part of next block\n var numInvalidTailBytes = src.length * 4 - Math.ceil(bitsPerPixel * numPixels / 8);\n src[src.length - 1] <<= 8 * numInvalidTailBytes;\n\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n }\n if (bitsLeft >= bitsPerPixel) {\n n = (buffer >>> (bitsLeft - bitsPerPixel)) & bitMask;\n bitsLeft -= bitsPerPixel;\n }\n else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = ((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n += (buffer >>> bitsLeft);\n }\n dest[o] = n;\n }\n return dest;\n },\n\n originalUnstuff2: function(src, dest, bitsPerPixel, numPixels) {\n var bitMask = (1 << bitsPerPixel) - 1;\n var i = 0, o;\n var bitsLeft = 0, bitPos = 0;\n var n, buffer, missingBits;\n //micro-optimizations\n for (o = 0; o < numPixels; o++) {\n if (bitsLeft === 0) {\n buffer = src[i++];\n bitsLeft = 32;\n bitPos = 0;\n }\n if (bitsLeft >= bitsPerPixel) {\n //no unsigned left shift\n n = ((buffer >>> bitPos) & bitMask);\n bitsLeft -= bitsPerPixel;\n bitPos += bitsPerPixel;\n } else {\n missingBits = (bitsPerPixel - bitsLeft);\n n = (buffer >>> bitPos) & bitMask;//((buffer & bitMask) << missingBits) & bitMask;\n buffer = src[i++];\n bitsLeft = 32 - missingBits;\n n |= (buffer & ((1 << missingBits) - 1)) << (bitsPerPixel - missingBits);\n bitPos = missingBits;\n }\n dest[o] = n;\n }\n return dest;\n }\n };\n\n /*****************************************\n *private static class used by Lerc2Decode\n ******************************************/\n var Lerc2Helpers = {\n HUFFMAN_LUT_BITS_MAX: 12, //use 2^12 lut, treat it like constant\n computeChecksumFletcher32: function(input) {\n\n var sum1 = 0xffff, sum2 = 0xffff;\n var len = input.length;\n var words = Math.floor(len / 2);\n var i = 0;\n while (words) {\n var tlen = (words >= 359) ? 359 : words;\n words -= tlen;\n do {\n sum1 += (input[i++] << 8);\n sum2 += sum1 += input[i++];\n } while (--tlen);\n\n sum1 = (sum1 & 0xffff) + (sum1 >>> 16);\n sum2 = (sum2 & 0xffff) + (sum2 >>> 16);\n }\n\n // add the straggler byte if it exists\n if (len & 1) {\n sum2 += sum1 += (input[i] << 8);\n }\n // second reduction step to reduce sums to 16 bits\n sum1 = (sum1 & 0xffff) + (sum1 >>> 16);\n sum2 = (sum2 & 0xffff) + (sum2 >>> 16);\n\n return (sum2 << 16 | sum1) >>> 0;\n },\n\n readHeaderInfo: function(input, data) {\n var ptr = data.ptr;\n var fileIdView = new Uint8Array(input, ptr, 6);\n var headerInfo = {};\n headerInfo.fileIdentifierString = String.fromCharCode.apply(null, fileIdView);\n if (headerInfo.fileIdentifierString.lastIndexOf(\"Lerc2\", 0) !== 0) {\n throw \"Unexpected file identifier string (expect Lerc2 ): \" + headerInfo.fileIdentifierString;\n }\n ptr += 6;\n var view = new DataView(input, ptr, 8);\n var fileVersion = view.getInt32(0, true);\n headerInfo.fileVersion = fileVersion;\n ptr += 4;\n if (fileVersion >= 3) {\n headerInfo.checksum = view.getUint32(4, true); //nrows\n ptr += 4;\n }\n\n //keys start from here\n view = new DataView(input, ptr, 12);\n headerInfo.height = view.getUint32(0, true); //nrows\n headerInfo.width = view.getUint32(4, true); //ncols\n ptr += 8;\n if (fileVersion >= 4) {\n headerInfo.numDims = view.getUint32(8, true);\n ptr += 4;\n }\n else {\n headerInfo.numDims = 1;\n }\n\n view = new DataView(input, ptr, 40);\n headerInfo.numValidPixel = view.getUint32(0, true);\n headerInfo.microBlockSize = view.getInt32(4, true);\n headerInfo.blobSize = view.getInt32(8, true);\n headerInfo.imageType = view.getInt32(12, true);\n\n headerInfo.maxZError = view.getFloat64(16, true);\n headerInfo.zMin = view.getFloat64(24, true);\n headerInfo.zMax = view.getFloat64(32, true);\n ptr += 40;\n data.headerInfo = headerInfo;\n data.ptr = ptr;\n\n var checksum, keyLength;\n if (fileVersion >= 3) {\n keyLength = fileVersion >= 4 ? 52 : 48;\n checksum = this.computeChecksumFletcher32(new Uint8Array(input, ptr - keyLength, headerInfo.blobSize - 14));\n if (checksum !== headerInfo.checksum) {\n throw \"Checksum failed.\";\n }\n }\n return true;\n },\n\n checkMinMaxRanges: function(input, data) {\n var headerInfo = data.headerInfo;\n var OutPixelTypeArray = this.getDataTypeArray(headerInfo.imageType);\n var rangeBytes = headerInfo.numDims * this.getDataTypeSize(headerInfo.imageType);\n var minValues = this.readSubArray(input, data.ptr, OutPixelTypeArray, rangeBytes);\n var maxValues = this.readSubArray(input, data.ptr + rangeBytes, OutPixelTypeArray, rangeBytes);\n data.ptr += (2 * rangeBytes);\n var i, equal = true;\n for (i = 0; i < headerInfo.numDims; i++) {\n if (minValues[i] !== maxValues[i]) {\n equal = false;\n break;\n }\n }\n headerInfo.minValues = minValues;\n headerInfo.maxValues = maxValues;\n return equal;\n },\n\n readSubArray: function(input, ptr, OutPixelTypeArray, numBytes) {\n var rawData;\n if (OutPixelTypeArray === Uint8Array) {\n rawData = new Uint8Array(input, ptr, numBytes);\n }\n else {\n var arrayBuf = new ArrayBuffer(numBytes);\n var store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, ptr, numBytes));\n rawData = new OutPixelTypeArray(arrayBuf);\n }\n return rawData;\n },\n\n readMask: function(input, data) {\n var ptr = data.ptr;\n var headerInfo = data.headerInfo;\n var numPixels = headerInfo.width * headerInfo.height;\n var numValidPixel = headerInfo.numValidPixel;\n\n var view = new DataView(input, ptr, 4);\n var mask = {};\n mask.numBytes = view.getUint32(0, true);\n ptr += 4;\n\n // Mask Data\n if ((0 === numValidPixel || numPixels === numValidPixel) && 0 !== mask.numBytes) {\n throw (\"invalid mask\");\n }\n var bitset, resultMask;\n if (numValidPixel === 0) {\n bitset = new Uint8Array(Math.ceil(numPixels / 8));\n mask.bitset = bitset;\n resultMask = new Uint8Array(numPixels);\n data.pixels.resultMask = resultMask;\n ptr += mask.numBytes;\n }// ????? else if (data.mask.numBytes > 0 && data.mask.numBytes< data.numValidPixel) {\n else if (mask.numBytes > 0) {\n bitset = new Uint8Array(Math.ceil(numPixels / 8));\n view = new DataView(input, ptr, mask.numBytes);\n var cnt = view.getInt16(0, true);\n var ip = 2, op = 0, val = 0;\n do {\n if (cnt > 0) {\n while (cnt--) { bitset[op++] = view.getUint8(ip++); }\n } else {\n val = view.getUint8(ip++);\n cnt = -cnt;\n while (cnt--) { bitset[op++] = val; }\n }\n cnt = view.getInt16(ip, true);\n ip += 2;\n } while (ip < mask.numBytes);\n if ((cnt !== -32768) || (op < bitset.length)) {\n throw \"Unexpected end of mask RLE encoding\";\n }\n\n resultMask = new Uint8Array(numPixels);\n var mb = 0, k = 0;\n\n for (k = 0; k < numPixels; k++) {\n if (k & 7) {\n mb = bitset[k >> 3];\n mb <<= k & 7;\n }\n else {\n mb = bitset[k >> 3];\n }\n if (mb & 128) {\n resultMask[k] = 1;\n }\n }\n data.pixels.resultMask = resultMask;\n\n mask.bitset = bitset;\n ptr += mask.numBytes;\n }\n data.ptr = ptr;\n data.mask = mask;\n return true;\n },\n\n readDataOneSweep: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {\n var ptr = data.ptr;\n var headerInfo = data.headerInfo;\n var numDims = headerInfo.numDims;\n var numPixels = headerInfo.width * headerInfo.height;\n var imageType = headerInfo.imageType;\n var numBytes = headerInfo.numValidPixel * Lerc2Helpers.getDataTypeSize(imageType) * numDims;\n //data.pixels.numBytes = numBytes;\n var rawData;\n var mask = data.pixels.resultMask;\n if (OutPixelTypeArray === Uint8Array) {\n rawData = new Uint8Array(input, ptr, numBytes);\n }\n else {\n var arrayBuf = new ArrayBuffer(numBytes);\n var store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, ptr, numBytes));\n rawData = new OutPixelTypeArray(arrayBuf);\n }\n if (rawData.length === numPixels * numDims) {\n if (useBSQForOutputDim) {\n data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(rawData, numPixels, numDims, OutPixelTypeArray, true);\n }\n else {\n data.pixels.resultPixels = rawData;\n }\n }\n else //mask\n {\n data.pixels.resultPixels = new OutPixelTypeArray(numPixels * numDims);\n var z = 0, k = 0, i = 0, nStart = 0;\n if (numDims > 1) {\n if (useBSQForOutputDim) {\n for (k = 0; k < numPixels; k++) {\n if (mask[k]) {\n nStart = k;\n for (i = 0; i < numDims; i++, nStart+=numPixels) {\n data.pixels.resultPixels[nStart] = rawData[z++];\n }\n }\n }\n }\n else {\n for (k = 0; k < numPixels; k++) {\n if (mask[k]) {\n nStart = k * numDims;\n for (i = 0; i < numDims; i++) {\n data.pixels.resultPixels[nStart + i] = rawData[z++];\n }\n }\n }\n }\n }\n else {\n for (k = 0; k < numPixels; k++) {\n if (mask[k]) {\n data.pixels.resultPixels[k] = rawData[z++];\n }\n }\n }\n }\n ptr += numBytes;\n data.ptr = ptr; //return data;\n return true;\n },\n\n readHuffmanTree: function(input, data) {\n var BITS_MAX = this.HUFFMAN_LUT_BITS_MAX; //8 is slow for the large test image\n //var size_max = 1 << BITS_MAX;\n /* ************************\n * reading code table\n *************************/\n var view = new DataView(input, data.ptr, 16);\n data.ptr += 16;\n var version = view.getInt32(0, true);\n if (version < 2) {\n throw \"unsupported Huffman version\";\n }\n var size = view.getInt32(4, true);\n var i0 = view.getInt32(8, true);\n var i1 = view.getInt32(12, true);\n if (i0 >= i1) {\n return false;\n }\n var blockDataBuffer = new Uint32Array(i1 - i0);\n Lerc2Helpers.decodeBits(input, data, blockDataBuffer);\n var codeTable = []; //size\n var i, j, k, len;\n\n for (i = i0; i < i1; i++) {\n j = i - (i < size ? 0 : size);//wrap around\n codeTable[j] = { first: blockDataBuffer[i - i0], second: null };\n }\n\n var dataBytes = input.byteLength - data.ptr;\n var dataWords = Math.ceil(dataBytes / 4);\n var arrayBuf = new ArrayBuffer(dataWords * 4);\n var store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, data.ptr, dataBytes));\n var stuffedData = new Uint32Array(arrayBuf); //must start from x*4\n var bitPos = 0, word, srcPtr = 0;\n word = stuffedData[0];\n for (i = i0; i < i1; i++) {\n j = i - (i < size ? 0 : size);//wrap around\n len = codeTable[j].first;\n if (len > 0) {\n codeTable[j].second = (word << bitPos) >>> (32 - len);\n\n if (32 - bitPos >= len) {\n bitPos += len;\n if (bitPos === 32) {\n bitPos = 0;\n srcPtr++;\n word = stuffedData[srcPtr];\n }\n }\n else {\n bitPos += len - 32;\n srcPtr++;\n word = stuffedData[srcPtr];\n codeTable[j].second |= word >>> (32 - bitPos);\n }\n }\n }\n\n //finished reading code table\n\n /* ************************\n * building lut\n *************************/\n var numBitsLUT = 0, numBitsLUTQick = 0;\n var tree = new TreeNode();\n for (i = 0; i < codeTable.length; i++) {\n if (codeTable[i] !== undefined) {\n numBitsLUT = Math.max(numBitsLUT, codeTable[i].first);\n }\n }\n if (numBitsLUT >= BITS_MAX) {\n numBitsLUTQick = BITS_MAX;\n }\n else {\n numBitsLUTQick = numBitsLUT;\n }\n // for debugging purpose\n // if (numBitsLUT >= 30) {\n // console.log(\"WARning, large NUM LUT BITS IS \" + numBitsLUT);\n // }\n var decodeLut = [], entry, code, numEntries, jj, currentBit, node;\n for (i = i0; i < i1; i++) {\n j = i - (i < size ? 0 : size);//wrap around\n len = codeTable[j].first;\n if (len > 0) {\n entry = [len, j];\n if (len <= numBitsLUTQick) {\n code = codeTable[j].second << (numBitsLUTQick - len);\n numEntries = 1 << (numBitsLUTQick - len);\n for (k = 0; k < numEntries; k++) {\n decodeLut[code | k] = entry;\n }\n }\n else {\n //build tree\n code = codeTable[j].second;\n node = tree;\n for (jj = len - 1; jj >= 0; jj--) {\n currentBit = code >>> jj & 1; //no left shift as length could be 30,31\n if (currentBit) {\n if (!node.right) {\n node.right = new TreeNode();\n }\n node = node.right;\n }\n else {\n if (!node.left) {\n node.left = new TreeNode();\n }\n node = node.left;\n }\n if (jj === 0 && !node.val) {\n node.val = entry[1];\n }\n }\n }\n }\n }\n return {\n decodeLut: decodeLut,\n numBitsLUTQick: numBitsLUTQick,\n numBitsLUT: numBitsLUT,\n tree: tree,\n stuffedData: stuffedData,\n srcPtr: srcPtr,\n bitPos: bitPos\n };\n },\n\n readHuffman: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {\n var headerInfo = data.headerInfo;\n var numDims = headerInfo.numDims;\n var height = data.headerInfo.height;\n var width = data.headerInfo.width;\n var numPixels = width * height;\n //var size_max = 1 << BITS_MAX;\n /* ************************\n * reading huffman structure info\n *************************/\n var huffmanInfo = this.readHuffmanTree(input, data);\n var decodeLut = huffmanInfo.decodeLut;\n var tree = huffmanInfo.tree;\n //stuffedData includes huffman headers\n var stuffedData = huffmanInfo.stuffedData;\n var srcPtr = huffmanInfo.srcPtr;\n var bitPos = huffmanInfo.bitPos;\n var numBitsLUTQick = huffmanInfo.numBitsLUTQick;\n var numBitsLUT = huffmanInfo.numBitsLUT;\n var offset = data.headerInfo.imageType === 0 ? 128 : 0;\n /*************************\n * decode\n ***************************/\n var node, val, delta, mask = data.pixels.resultMask, valTmp, valTmpQuick, currentBit;\n var i, j, k, ii;\n var prevVal = 0;\n if (bitPos > 0) {\n srcPtr++;\n bitPos = 0;\n }\n var word = stuffedData[srcPtr];\n var deltaEncode = data.encodeMode === 1;\n var resultPixelsAllDim = new OutPixelTypeArray(numPixels * numDims);\n var resultPixels = resultPixelsAllDim;\n var iDim;\n // TODO: reevaluate the need to keep inlined decoding code as IE support is phasing out\n if (numDims < 2 || deltaEncode) {\n for (iDim = 0; iDim < numDims; iDim++) {\n if (numDims > 1) {\n //get the mem block of current dimension\n resultPixels = new OutPixelTypeArray(resultPixelsAllDim.buffer, numPixels * iDim, numPixels);\n prevVal = 0;\n }\n if (data.headerInfo.numValidPixel === width * height) { //all valid\n for (k = 0, i = 0; i < height; i++) {\n for (j = 0; j < width; j++, k++) {\n val = 0;\n valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);\n valTmpQuick = valTmp;// >>> deltaBits;\n if (32 - bitPos < numBitsLUTQick) {\n valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));\n valTmpQuick = valTmp;// >>> deltaBits;\n }\n if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done\n {\n val = decodeLut[valTmpQuick][1];\n bitPos += decodeLut[valTmpQuick][0];\n }\n else {\n valTmp = (word << bitPos) >>> (32 - numBitsLUT);\n valTmpQuick = valTmp;// >>> deltaBits;\n if (32 - bitPos < numBitsLUT) {\n valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));\n valTmpQuick = valTmp;// >>> deltaBits;\n }\n node = tree;\n for (ii = 0; ii < numBitsLUT; ii++) {\n currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;\n node = currentBit ? node.right : node.left;\n if (!(node.left || node.right)) {\n val = node.val;\n bitPos = bitPos + ii + 1;\n break;\n }\n }\n }\n \n if (bitPos >= 32) {\n bitPos -= 32;\n srcPtr++;\n word = stuffedData[srcPtr];\n }\n \n delta = val - offset;\n if (deltaEncode) {\n if (j > 0) {\n delta += prevVal; // use overflow\n }\n else if (i > 0) {\n delta += resultPixels[k - width];\n }\n else {\n delta += prevVal;\n }\n delta &= 0xFF; //overflow\n resultPixels[k] = delta;//overflow\n prevVal = delta;\n }\n else {\n resultPixels[k] = delta;\n }\n }\n }\n }\n else { //not all valid, use mask\n for (k = 0, i = 0; i < height; i++) {\n for (j = 0; j < width; j++, k++) {\n if (mask[k]) {\n val = 0;\n valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);\n valTmpQuick = valTmp;// >>> deltaBits;\n if (32 - bitPos < numBitsLUTQick) {\n valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));\n valTmpQuick = valTmp;// >>> deltaBits;\n }\n if (decodeLut[valTmpQuick]) // if there, move the correct number of bits and done\n {\n val = decodeLut[valTmpQuick][1];\n bitPos += decodeLut[valTmpQuick][0];\n }\n else {\n valTmp = (word << bitPos) >>> (32 - numBitsLUT);\n valTmpQuick = valTmp;// >>> deltaBits;\n if (32 - bitPos < numBitsLUT) {\n valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));\n valTmpQuick = valTmp;// >>> deltaBits;\n }\n node = tree;\n for (ii = 0; ii < numBitsLUT; ii++) {\n currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;\n node = currentBit ? node.right : node.left;\n if (!(node.left || node.right)) {\n val = node.val;\n bitPos = bitPos + ii + 1;\n break;\n }\n }\n }\n \n if (bitPos >= 32) {\n bitPos -= 32;\n srcPtr++;\n word = stuffedData[srcPtr];\n }\n \n delta = val - offset;\n if (deltaEncode) {\n if (j > 0 && mask[k - 1]) {\n delta += prevVal; // use overflow\n }\n else if (i > 0 && mask[k - width]) {\n delta += resultPixels[k - width];\n }\n else {\n delta += prevVal;\n }\n \n delta &= 0xFF; //overflow\n resultPixels[k] = delta;//overflow\n prevVal = delta;\n }\n else {\n resultPixels[k] = delta;\n }\n }\n }\n }\n }\n }\n }\n else {\n for (k = 0, i = 0; i < height; i++) {\n for (j = 0; j < width; j++) {\n k = i * width + j;\n if (!mask || mask[k]) {\n for (iDim = 0; iDim < numDims; iDim++, k+=numPixels) {\n val = 0;\n valTmp = (word << bitPos) >>> (32 - numBitsLUTQick);\n valTmpQuick = valTmp;\n if (32 - bitPos < numBitsLUTQick) {\n valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUTQick));\n valTmpQuick = valTmp;\n }\n if (decodeLut[valTmpQuick])\n {\n val = decodeLut[valTmpQuick][1];\n bitPos += decodeLut[valTmpQuick][0];\n }\n else {\n valTmp = (word << bitPos) >>> (32 - numBitsLUT);\n valTmpQuick = valTmp;\n if (32 - bitPos < numBitsLUT) {\n valTmp |= ((stuffedData[srcPtr + 1]) >>> (64 - bitPos - numBitsLUT));\n valTmpQuick = valTmp;\n }\n node = tree;\n for (ii = 0; ii < numBitsLUT; ii++) {\n currentBit = valTmp >>> (numBitsLUT - ii - 1) & 1;\n node = currentBit ? node.right : node.left;\n if (!(node.left || node.right)) {\n val = node.val;\n bitPos = bitPos + ii + 1;\n break;\n }\n }\n }\n\n if (bitPos >= 32) {\n bitPos -= 32;\n srcPtr++;\n word = stuffedData[srcPtr];\n }\n\n delta = val - offset;\n resultPixels[k] = delta;\n }\n }\n }\n }\n }\n data.ptr = data.ptr + (srcPtr + 1) * 4 + (bitPos > 0 ? 4 : 0);\n data.pixels.resultPixels = resultPixelsAllDim;\n //swap for BIP layout\n if (numDims > 1 && !useBSQForOutputDim) {\n data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(resultPixelsAllDim, numPixels, numDims, OutPixelTypeArray);\n }\n },\n\n decodeBits: function(input, data, blockDataBuffer, offset, iDim) {\n {\n //bitstuff encoding is 3\n var headerInfo = data.headerInfo;\n var fileVersion = headerInfo.fileVersion;\n //var block = {};\n var blockPtr = 0;\n var viewByteLength = ((input.byteLength - data.ptr) >= 5) ? 5 : (input.byteLength - data.ptr);\n var view = new DataView(input, data.ptr, viewByteLength);\n var headerByte = view.getUint8(0);\n blockPtr++;\n var bits67 = headerByte >> 6;\n var n = (bits67 === 0) ? 4 : 3 - bits67;\n var doLut = (headerByte & 32) > 0 ? true : false;//5th bit\n var numBits = headerByte & 31;\n var numElements = 0;\n if (n === 1) {\n numElements = view.getUint8(blockPtr); blockPtr++;\n } else if (n === 2) {\n numElements = view.getUint16(blockPtr, true); blockPtr += 2;\n } else if (n === 4) {\n numElements = view.getUint32(blockPtr, true); blockPtr += 4;\n } else {\n throw \"Invalid valid pixel count type\";\n }\n //fix: huffman codes are bit stuffed, but not bound by data's max value, so need to use originalUnstuff\n //offset = offset || 0;\n var scale = 2 * headerInfo.maxZError;\n var stuffedData, arrayBuf, store8, dataBytes, dataWords;\n var lutArr, lutData, lutBytes, lutBitsPerElement, bitsPerPixel;\n var zMax = headerInfo.numDims > 1 ? headerInfo.maxValues[iDim] : headerInfo.zMax;\n if (doLut) {\n data.counter.lut++;\n lutBytes = view.getUint8(blockPtr);\n lutBitsPerElement = numBits;\n blockPtr++;\n dataBytes = Math.ceil((lutBytes - 1) * numBits / 8);\n dataWords = Math.ceil(dataBytes / 4);\n arrayBuf = new ArrayBuffer(dataWords * 4);\n store8 = new Uint8Array(arrayBuf);\n\n data.ptr += blockPtr;\n store8.set(new Uint8Array(input, data.ptr, dataBytes));\n\n lutData = new Uint32Array(arrayBuf);\n data.ptr += dataBytes;\n\n bitsPerPixel = 0;\n while ((lutBytes - 1) >>> bitsPerPixel) {\n bitsPerPixel++;\n }\n dataBytes = Math.ceil(numElements * bitsPerPixel / 8);\n dataWords = Math.ceil(dataBytes / 4);\n arrayBuf = new ArrayBuffer(dataWords * 4);\n store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, data.ptr, dataBytes));\n stuffedData = new Uint32Array(arrayBuf);\n data.ptr += dataBytes;\n if (fileVersion >= 3) {\n lutArr = BitStuffer.unstuffLUT2(lutData, numBits, lutBytes - 1, offset, scale, zMax);\n }\n else {\n lutArr = BitStuffer.unstuffLUT(lutData, numBits, lutBytes - 1, offset, scale, zMax);\n }\n //lutArr.unshift(0);\n if (fileVersion >= 3) {\n //BitStuffer.unstuff2(block, blockDataBuffer, headerInfo.zMax);\n BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);\n }\n else {\n BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, lutArr);\n }\n }\n else {\n //console.debug(\"bitstuffer\");\n data.counter.bitstuffer++;\n bitsPerPixel = numBits;\n data.ptr += blockPtr;\n if (bitsPerPixel > 0) {\n dataBytes = Math.ceil(numElements * bitsPerPixel / 8);\n dataWords = Math.ceil(dataBytes / 4);\n arrayBuf = new ArrayBuffer(dataWords * 4);\n store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, data.ptr, dataBytes));\n stuffedData = new Uint32Array(arrayBuf);\n data.ptr += dataBytes;\n if (fileVersion >= 3) {\n if (offset == null) {\n BitStuffer.originalUnstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements);\n }\n else {\n BitStuffer.unstuff2(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);\n }\n }\n else {\n if (offset == null) {\n BitStuffer.originalUnstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements);\n }\n else {\n BitStuffer.unstuff(stuffedData, blockDataBuffer, bitsPerPixel, numElements, false, offset, scale, zMax);\n }\n }\n }\n }\n }\n\n },\n\n readTiles: function(input, data, OutPixelTypeArray, useBSQForOutputDim) {\n var headerInfo = data.headerInfo;\n var width = headerInfo.width;\n var height = headerInfo.height;\n var numPixels = width * height;\n var microBlockSize = headerInfo.microBlockSize;\n var imageType = headerInfo.imageType;\n var dataTypeSize = Lerc2Helpers.getDataTypeSize(imageType);\n var numBlocksX = Math.ceil(width / microBlockSize);\n var numBlocksY = Math.ceil(height / microBlockSize);\n data.pixels.numBlocksY = numBlocksY;\n data.pixels.numBlocksX = numBlocksX;\n data.pixels.ptr = 0;\n var row = 0, col = 0, blockY = 0, blockX = 0, thisBlockHeight = 0, thisBlockWidth = 0, bytesLeft = 0, headerByte = 0, bits67 = 0, testCode = 0, outPtr = 0, outStride = 0, numBytes = 0, bytesleft = 0, z = 0, blockPtr = 0;\n var view, block, arrayBuf, store8, rawData;\n var blockEncoding;\n var blockDataBuffer = new OutPixelTypeArray(microBlockSize * microBlockSize);\n var lastBlockHeight = (height % microBlockSize) || microBlockSize;\n var lastBlockWidth = (width % microBlockSize) || microBlockSize;\n var offsetType, offset;\n var numDims = headerInfo.numDims, iDim;\n var mask = data.pixels.resultMask;\n var resultPixels = data.pixels.resultPixels;\n var fileVersion = headerInfo.fileVersion;\n var fileVersionCheckNum = fileVersion >= 5 ? 14 : 15;\n var isDiffEncoding;\n var zMax = headerInfo.zMax;\n //var resultPixelsAllDim = resultPixels;\n var resultPixelsPrevDim;\n for (blockY = 0; blockY < numBlocksY; blockY++) {\n thisBlockHeight = (blockY !== numBlocksY - 1) ? microBlockSize : lastBlockHeight;\n for (blockX = 0; blockX < numBlocksX; blockX++) {\n //console.debug(\"y\" + blockY + \" x\" + blockX);\n thisBlockWidth = (blockX !== numBlocksX - 1) ? microBlockSize : lastBlockWidth;\n\n outPtr = blockY * width * microBlockSize + blockX * microBlockSize;\n outStride = width - thisBlockWidth;\n\n for (iDim = 0; iDim < numDims; iDim++) {\n if (numDims > 1) {\n resultPixelsPrevDim = resultPixels;\n outPtr = blockY * width * microBlockSize + blockX * microBlockSize;\n resultPixels = new OutPixelTypeArray(data.pixels.resultPixels.buffer, numPixels * iDim * dataTypeSize, numPixels);\n zMax = headerInfo.maxValues[iDim];\n } else {\n resultPixelsPrevDim = null;\n }\n bytesLeft = input.byteLength - data.ptr;\n view = new DataView(input, data.ptr, Math.min(10, bytesLeft));\n block = {};\n blockPtr = 0;\n headerByte = view.getUint8(0);\n blockPtr++;\n isDiffEncoding = headerInfo.fileVersion >= 5 ? headerByte & 4 : 0;\n bits67 = (headerByte >> 6) & 0xFF;\n testCode = (headerByte >> 2) & fileVersionCheckNum; // use bits 2345 for integrity check\n if (testCode !== (((blockX * microBlockSize) >> 3) & fileVersionCheckNum)) {\n throw \"integrity issue\";\n }\n\n if (isDiffEncoding && iDim === 0) {\n throw \"integrity issue\";\n }\n\n blockEncoding = headerByte & 3;\n if (blockEncoding > 3) {\n data.ptr += blockPtr;\n throw \"Invalid block encoding (\" + blockEncoding + \")\";\n }\n else if (blockEncoding === 2) { //constant 0\n if (isDiffEncoding) {\n if (mask) {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n if (mask[outPtr]) {\n resultPixels[outPtr] = resultPixelsPrevDim[outPtr];\n }\n outPtr++;\n }\n }\n }\n else {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n resultPixels[outPtr] = resultPixelsPrevDim[outPtr];\n outPtr++;\n }\n }\n }\n }\n data.counter.constant++;\n data.ptr += blockPtr;\n continue;\n }\n else if (blockEncoding === 0) { //uncompressed\n if (isDiffEncoding) {\n // doesn't make sense, should not happen\n throw \"integrity issue\";\n }\n data.counter.uncompressed++;\n data.ptr += blockPtr;\n numBytes = thisBlockHeight * thisBlockWidth * dataTypeSize;\n bytesleft = input.byteLength - data.ptr;\n numBytes = numBytes < bytesleft ? numBytes : bytesleft;\n //bit alignment\n arrayBuf = new ArrayBuffer((numBytes % dataTypeSize) === 0 ? numBytes : (numBytes + dataTypeSize - numBytes % dataTypeSize));\n store8 = new Uint8Array(arrayBuf);\n store8.set(new Uint8Array(input, data.ptr, numBytes));\n rawData = new OutPixelTypeArray(arrayBuf);\n z = 0;\n if (mask) {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n if (mask[outPtr]) {\n resultPixels[outPtr] = rawData[z++];\n }\n outPtr++;\n }\n outPtr += outStride;\n }\n }\n else {//all valid\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n resultPixels[outPtr++] = rawData[z++];\n }\n outPtr += outStride;\n }\n }\n data.ptr += z * dataTypeSize;\n }\n else { //1 or 3\n offsetType = Lerc2Helpers.getDataTypeUsed((isDiffEncoding && imageType < 6) ? 4 : imageType, bits67);\n offset = Lerc2Helpers.getOnePixel(block, blockPtr, offsetType, view);\n blockPtr += Lerc2Helpers.getDataTypeSize(offsetType);\n if (blockEncoding === 3) //constant offset value\n {\n data.ptr += blockPtr;\n data.counter.constantoffset++;\n //you can delete the following resultMask case in favor of performance because val is constant and users use nodata mask, otherwise nodatavalue post processing handles it too.\n //while the above statement is true, we're not doing it as we want to keep invalid pixel value at 0 rather than arbitrary values\n if (mask) {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n if (mask[outPtr]) {\n resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;\n }\n outPtr++;\n }\n outPtr += outStride;\n }\n }\n else {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n resultPixels[outPtr] = isDiffEncoding ? Math.min(zMax, resultPixelsPrevDim[outPtr] + offset) : offset;\n outPtr++;\n }\n outPtr += outStride;\n }\n }\n }\n else { //bitstuff encoding is 3\n data.ptr += blockPtr;\n //heavy lifting\n Lerc2Helpers.decodeBits(input, data, blockDataBuffer, offset, iDim);\n blockPtr = 0;\n // duplicate code to favor performance, diff encoding is for multidimension only\n if (isDiffEncoding) {\n if (mask) {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n if (mask[outPtr]) {\n resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];\n }\n outPtr++;\n }\n outPtr += outStride;\n }\n }\n else {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n resultPixels[outPtr] = blockDataBuffer[blockPtr++] + resultPixelsPrevDim[outPtr];\n outPtr++;\n }\n outPtr += outStride;\n }\n }\n }\n else if (mask) {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n if (mask[outPtr]) {\n resultPixels[outPtr] = blockDataBuffer[blockPtr++];\n }\n outPtr++;\n }\n outPtr += outStride;\n }\n }\n else {\n for (row = 0; row < thisBlockHeight; row++) {\n for (col = 0; col < thisBlockWidth; col++) {\n resultPixels[outPtr++] = blockDataBuffer[blockPtr++];\n }\n outPtr += outStride;\n }\n }\n }\n }\n }\n }\n }\n //swap for BIP: it's always easier for clients to handle BSQ so we keep existing logic and introduce a swap here to minimze changes\n if (numDims > 1 && !useBSQForOutputDim) {\n data.pixels.resultPixels = Lerc2Helpers.swapDimensionOrder(data.pixels.resultPixels, numPixels, numDims, OutPixelTypeArray);\n }\n },\n\n /*****************\n * private methods (helper methods)\n *****************/\n\n formatFileInfo: function(data) {\n return {\n \"fileIdentifierString\": data.headerInfo.fileIdentifierString,\n \"fileVersion\": data.headerInfo.fileVersion,\n \"imageType\": data.headerInfo.imageType,\n \"height\": data.headerInfo.height,\n \"width\": data.headerInfo.width,\n \"numValidPixel\": data.headerInfo.numValidPixel,\n \"microBlockSize\": data.headerInfo.microBlockSize,\n \"blobSize\": data.headerInfo.blobSize,\n \"maxZError\": data.headerInfo.maxZError,\n \"pixelType\": Lerc2Helpers.getPixelType(data.headerInfo.imageType),\n \"eofOffset\": data.eofOffset,\n \"mask\": data.mask ? {\n \"numBytes\": data.mask.numBytes\n } : null,\n \"pixels\": {\n \"numBlocksX\": data.pixels.numBlocksX,\n \"numBlocksY\": data.pixels.numBlocksY,\n //\"numBytes\": data.pixels.numBytes,\n \"maxValue\": data.headerInfo.zMax,\n \"minValue\": data.headerInfo.zMin,\n \"noDataValue\": data.noDataValue\n }\n };\n },\n\n constructConstantSurface: function(data, useBSQForOutputDim) {\n var val = data.headerInfo.zMax;\n var valMin = data.headerInfo.zMin;\n var maxValues = data.headerInfo.maxValues;\n var numDims = data.headerInfo.numDims;\n var numPixels = data.headerInfo.height * data.headerInfo.width;\n var i = 0, k = 0, nStart = 0;\n var mask = data.pixels.resultMask;\n var resultPixels = data.pixels.resultPixels;\n if (mask) {\n if (numDims > 1) {\n if (useBSQForOutputDim) {\n for (i = 0; i < numDims; i++) {\n nStart = i * numPixels;\n val = maxValues[i];\n for (k = 0; k < numPixels; k++) {\n if (mask[k]) {\n resultPixels[nStart + k] = val;\n }\n }\n } \n }\n else {\n for (k = 0; k < numPixels; k++) {\n if (mask[k]) {\n nStart = k * numDims;\n for (i = 0; i < numDims; i++) {\n resultPixels[nStart + numDims] = maxValues[i];\n }\n }\n }\n }\n }\n else {\n for (k = 0; k < numPixels; k++) {\n if (mask[k]) {\n resultPixels[k] = val;\n }\n }\n }\n }\n else {\n if (numDims > 1 && valMin !== val) {\n if (useBSQForOutputDim) {\n for (i = 0; i < numDims; i++) {\n nStart = i * numPixels;\n val = maxValues[i];\n for (k = 0; k < numPixels; k++) {\n resultPixels[nStart + k] = val;\n }\n }\n }\n else {\n for (k = 0; k < numPixels; k++) {\n nStart = k * numDims;\n for (i = 0; i < numDims; i++) {\n resultPixels[nStart + i] = maxValues[i];\n }\n }\n }\n }\n else {\n for (k = 0; k < numPixels * numDims; k++) {\n resultPixels[k] = val;\n }\n }\n }\n return;\n },\n\n getDataTypeArray: function(t) {\n var tp;\n switch (t) {\n case 0: //char\n tp = Int8Array;\n break;\n case 1: //byte\n tp = Uint8Array;\n break;\n case 2: //short\n tp = Int16Array;\n break;\n case 3: //ushort\n tp = Uint16Array;\n break;\n case 4:\n tp = Int32Array;\n break;\n case 5:\n tp = Uint32Array;\n break;\n case 6:\n tp = Float32Array;\n break;\n case 7:\n tp = Float64Array;\n break;\n default:\n tp = Float32Array;\n }\n return tp;\n },\n\n getPixelType: function(t) {\n var tp;\n switch (t) {\n case 0: //char\n tp = \"S8\";\n break;\n case 1: //byte\n tp = \"U8\";\n break;\n case 2: //short\n tp = \"S16\";\n break;\n case 3: //ushort\n tp = \"U16\";\n break;\n case 4:\n tp = \"S32\";\n break;\n case 5:\n tp = \"U32\";\n break;\n case 6:\n tp = \"F32\";\n break;\n case 7:\n tp = \"F64\";\n break;\n default:\n tp = \"F32\";\n }\n return tp;\n },\n\n isValidPixelValue: function(t, val) {\n if (val == null) {\n return false;\n }\n var isValid;\n switch (t) {\n case 0: //char\n isValid = val >= -128 && val <= 127;\n break;\n case 1: //byte (unsigned char)\n isValid = val >= 0 && val <= 255;\n break;\n case 2: //short\n isValid = val >= -32768 && val <= 32767;\n break;\n case 3: //ushort\n isValid = val >= 0 && val <= 65536;\n break;\n case 4: //int 32\n isValid = val >= -2147483648 && val <= 2147483647;\n break;\n case 5: //uinit 32\n isValid = val >= 0 && val <= 4294967296;\n break;\n case 6:\n isValid = val >= -3.4027999387901484e+38 && val <= 3.4027999387901484e+38;\n break;\n case 7:\n isValid = val >= -1.7976931348623157e+308 && val <= 1.7976931348623157e+308;\n break;\n default:\n isValid = false;\n }\n return isValid;\n },\n\n getDataTypeSize: function(t) {\n var s = 0;\n switch (t) {\n case 0: //ubyte\n case 1: //byte\n s = 1;\n break;\n case 2: //short\n case 3: //ushort\n s = 2;\n break;\n case 4:\n case 5:\n case 6:\n s = 4;\n break;\n case 7:\n s = 8;\n break;\n default:\n s = t;\n }\n return s;\n },\n\n getDataTypeUsed: function(dt, tc) {\n var t = dt;\n switch (dt) {\n case 2: //short\n case 4: //long\n t = dt - tc;\n break;\n case 3: //ushort\n case 5: //ulong\n t = dt - 2 * tc;\n break;\n case 6: //float\n if (0 === tc) {\n t = dt;\n }\n else if (1 === tc) {\n t = 2;\n }\n else {\n t = 1;//byte\n }\n break;\n case 7: //double\n if (0 === tc) {\n t = dt;\n }\n else {\n t = dt - 2 * tc + 1;\n }\n break;\n default:\n t = dt;\n break;\n }\n return t;\n },\n\n getOnePixel: function(block, blockPtr, offsetType, view) {\n var temp = 0;\n switch (offsetType) {\n case 0: //char\n temp = view.getInt8(blockPtr);\n break;\n case 1: //byte\n temp = view.getUint8(blockPtr);\n break;\n case 2:\n temp = view.getInt16(blockPtr, true);\n break;\n case 3:\n temp = view.getUint16(blockPtr, true);\n break;\n case 4:\n temp = view.getInt32(blockPtr, true);\n break;\n case 5:\n temp = view.getUInt32(blockPtr, true);\n break;\n case 6:\n temp = view.getFloat32(blockPtr, true);\n break;\n case 7:\n temp = view.getFloat64(blockPtr, true);\n break;\n default:\n throw (\"the decoder does not understand this pixel type\");\n }\n return temp;\n },\n\n swapDimensionOrder: function(pixels, numPixels, numDims, OutPixelTypeArray, inputIsBIP) {\n var i = 0, j = 0, iDim = 0, temp = 0, swap = pixels;\n if (numDims > 1) {\n swap = new OutPixelTypeArray(numPixels * numDims);\n if (inputIsBIP) {\n for (i=0; i 5) {\n throw \"unsupported lerc version 2.\" + fileVersion;\n }\n\n // Mask Header\n Lerc2Helpers.readMask(input, data);\n if (headerInfo.numValidPixel !== headerInfo.width * headerInfo.height && !data.pixels.resultMask) {\n data.pixels.resultMask = options.maskData;\n }\n\n var numPixels = headerInfo.width * headerInfo.height;\n data.pixels.resultPixels = new OutPixelTypeArray(numPixels * headerInfo.numDims);\n\n data.counter = {\n onesweep: 0,\n uncompressed: 0,\n lut: 0,\n bitstuffer: 0,\n constant: 0,\n constantoffset: 0\n };\n var useBSQForOutputDim = !options.returnPixelInterleavedDims;\n if (headerInfo.numValidPixel !== 0) {\n //not tested\n if (headerInfo.zMax === headerInfo.zMin) //constant surface\n {\n Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);\n }\n else if (fileVersion >= 4 && Lerc2Helpers.checkMinMaxRanges(input, data)) {\n Lerc2Helpers.constructConstantSurface(data, useBSQForOutputDim);\n }\n else {\n var view = new DataView(input, data.ptr, 2);\n var bReadDataOneSweep = view.getUint8(0);\n data.ptr++;\n if (bReadDataOneSweep) {\n //console.debug(\"OneSweep\");\n Lerc2Helpers.readDataOneSweep(input, data, OutPixelTypeArray, useBSQForOutputDim);\n }\n else {\n //lerc2.1: //bitstuffing + lut\n //lerc2.2: //bitstuffing + lut + huffman\n //lerc2.3: new bitstuffer\n if (fileVersion > 1 && headerInfo.imageType <= 1 && Math.abs(headerInfo.maxZError - 0.5) < 0.00001) {\n //this is 2.x plus 8 bit (unsigned and signed) data, possiblity of Huffman\n var flagHuffman = view.getUint8(1);\n data.ptr++;\n data.encodeMode = flagHuffman;\n if (flagHuffman > 2 || (fileVersion < 4 && flagHuffman > 1)) {\n throw \"Invalid Huffman flag \" + flagHuffman;\n }\n if (flagHuffman) {//1 - delta Huffman, 2 - Huffman\n //console.log(\"Huffman\");\n Lerc2Helpers.readHuffman(input, data, OutPixelTypeArray, useBSQForOutputDim);\n }\n else {\n //console.log(\"Tiles\");\n Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);\n }\n }\n else { //lerc2.x non-8 bit data\n //console.log(\"Tiles\");\n Lerc2Helpers.readTiles(input, data, OutPixelTypeArray, useBSQForOutputDim);\n }\n }\n }\n }\n\n data.eofOffset = data.ptr;\n var diff;\n if (options.inputOffset) {\n diff = data.headerInfo.blobSize + options.inputOffset - data.ptr;\n if (Math.abs(diff) >= 1) {\n //console.debug(\"incorrect eof: dataptr \" + data.ptr + \" offset \" + options.inputOffset + \" blobsize \" + data.headerInfo.blobSize + \" diff: \" + diff);\n data.eofOffset = options.inputOffset + data.headerInfo.blobSize;\n }\n }\n else {\n diff = data.headerInfo.blobSize - data.ptr;\n if (Math.abs(diff) >= 1) {\n //console.debug(\"incorrect first band eof: dataptr \" + data.ptr + \" blobsize \" + data.headerInfo.blobSize + \" diff: \" + diff);\n data.eofOffset = data.headerInfo.blobSize;\n }\n }\n\n var result = {\n width: headerInfo.width,\n height: headerInfo.height,\n pixelData: data.pixels.resultPixels,\n minValue: headerInfo.zMin,\n maxValue: headerInfo.zMax,\n validPixelCount: headerInfo.numValidPixel,\n dimCount: headerInfo.numDims,\n dimStats: {\n minValues: headerInfo.minValues,\n maxValues: headerInfo.maxValues\n },\n maskData: data.pixels.resultMask\n //noDataValue: noDataValue\n };\n\n //we should remove this if there's no existing client\n //optional noDataValue processing, it's user's responsiblity\n if (data.pixels.resultMask && Lerc2Helpers.isValidPixelValue(headerInfo.imageType, noDataValue)) {\n var mask = data.pixels.resultMask;\n for (i = 0; i < numPixels; i++) {\n if (!mask[i]) {\n result.pixelData[i] = noDataValue;\n }\n }\n result.noDataValue = noDataValue;\n }\n data.noDataValue = noDataValue;\n if (options.returnFileInfo) {\n result.fileInfo = Lerc2Helpers.formatFileInfo(data);\n }\n return result;\n },\n\n getBandCount: function(/*byte array*/ input) {\n var count = 0;\n var i = 0;\n var temp = {};\n temp.ptr = 0;\n temp.pixels = {};\n while (i < input.byteLength - 58) {\n Lerc2Helpers.readHeaderInfo(input, temp);\n i += temp.headerInfo.blobSize;\n count++;\n temp.ptr = i;\n }\n return count;\n }\n };\n\n return Lerc2Decode;\n })();\n\n var isPlatformLittleEndian = (function() {\n var a = new ArrayBuffer(4);\n var b = new Uint8Array(a);\n var c = new Uint32Array(a);\n c[0] = 1;\n return b[0] === 1;\n })();\n\n var Lerc = {\n /************wrapper**********************************************/\n /**\n * A wrapper for decoding both LERC1 and LERC2 byte streams capable of handling multiband pixel blocks for various pixel types.\n *\n * @alias module:Lerc\n * @param {ArrayBuffer} input The LERC input byte stream\n * @param {object} [options] The decoding options below are optional.\n * @param {number} [options.inputOffset] The number of bytes to skip in the input byte stream. A valid Lerc file is expected at that position.\n * @param {string} [options.pixelType] (LERC1 only) Default value is F32. Valid pixel types for input are U8/S8/S16/U16/S32/U32/F32.\n * @param {number} [options.noDataValue] (LERC1 only). It is recommended to use the returned mask instead of setting this value.\n * @param {boolean} [options.returnPixelInterleavedDims] (nDim LERC2 only) If true, returned dimensions are pixel-interleaved, a.k.a [p1_dim0, p1_dim1, p1_dimn, p2_dim0...], default is [p1_dim0, p2_dim0, ..., p1_dim1, p2_dim1...]\n * @returns {{width, height, pixels, pixelType, mask, statistics}}\n * @property {number} width Width of decoded image.\n * @property {number} height Height of decoded image.\n * @property {array} pixels [band1, band2, …] Each band is a typed array of width*height.\n * @property {string} pixelType The type of pixels represented in the output.\n * @property {mask} mask Typed array with a size of width*height, or null if all pixels are valid.\n * @property {array} statistics [statistics_band1, statistics_band2, …] Each element is a statistics object representing min and max values\n **/\n decode: function(encodedData, options) {\n if (!isPlatformLittleEndian) {\n throw \"Big endian system is not supported.\";\n }\n options = options || {};\n var inputOffset = options.inputOffset || 0;\n var fileIdView = new Uint8Array(encodedData, inputOffset, 10);\n var fileIdentifierString = String.fromCharCode.apply(null, fileIdView);\n var lerc, majorVersion;\n if (fileIdentifierString.trim() === \"CntZImage\") {\n lerc = LercDecode;\n majorVersion = 1;\n }\n else if (fileIdentifierString.substring(0, 5) === \"Lerc2\") {\n lerc = Lerc2Decode;\n majorVersion = 2;\n }\n else {\n throw \"Unexpected file identifier string: \" + fileIdentifierString;\n }\n\n var iPlane = 0, eof = encodedData.byteLength - 10, encodedMaskData, bandMasks = [], bandMask, maskData;\n var decodedPixelBlock = {\n width: 0,\n height: 0,\n pixels: [],\n pixelType: options.pixelType,\n mask: null,\n statistics: []\n };\n var uniqueBandMaskCount = 0;\n\n while (inputOffset < eof) {\n var result = lerc.decode(encodedData, {\n inputOffset: inputOffset,//for both lerc1 and lerc2\n encodedMaskData: encodedMaskData,//lerc1 only\n maskData: maskData,//lerc2 only\n returnMask: iPlane === 0 ? true : false,//lerc1 only\n returnEncodedMask: iPlane === 0 ? true : false,//lerc1 only\n returnFileInfo: true,//for both lerc1 and lerc2\n returnPixelInterleavedDims: options.returnPixelInterleavedDims,//for ndim lerc2 only\n pixelType: options.pixelType || null,//lerc1 only\n noDataValue: options.noDataValue || null//lerc1 only\n });\n\n inputOffset = result.fileInfo.eofOffset;\n maskData = result.maskData;//lerc2\n if (iPlane === 0) {\n encodedMaskData = result.encodedMaskData;//lerc1\n decodedPixelBlock.width = result.width;\n decodedPixelBlock.height = result.height;\n decodedPixelBlock.dimCount = result.dimCount || 1;\n //decodedPixelBlock.dimStats = decodedPixelBlock.dimStats;\n decodedPixelBlock.pixelType = result.pixelType || result.fileInfo.pixelType;\n decodedPixelBlock.mask = maskData;\n }\n if (majorVersion > 1) {\n if (maskData) {\n bandMasks.push(maskData);\n }\n if (result.fileInfo.mask && result.fileInfo.mask.numBytes > 0) {\n uniqueBandMaskCount++;\n }\n }\n\n iPlane++;\n decodedPixelBlock.pixels.push(result.pixelData);\n decodedPixelBlock.statistics.push({\n minValue: result.minValue,\n maxValue: result.maxValue,\n noDataValue: result.noDataValue,\n dimStats: result.dimStats\n });\n }\n var i, j, numPixels;\n if (majorVersion > 1 && uniqueBandMaskCount > 1) {\n numPixels = decodedPixelBlock.width * decodedPixelBlock.height;\n decodedPixelBlock.bandMasks = bandMasks;\n maskData = new Uint8Array(numPixels);\n maskData.set(bandMasks[0]);\n for (i = 1; i < bandMasks.length; i++) {\n bandMask = bandMasks[i];\n for (j = 0; j < numPixels; j++) {\n maskData[j] = maskData[j] & bandMask[j];\n }\n }\n decodedPixelBlock.maskData = maskData;\n }\n\n return decodedPixelBlock;\n }\n };\n\n if (typeof define === \"function\" && define.amd) {/* jshint ignore:line */\n //amd loaders such as dojo and requireJS\n //http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition\n define([], function() { return Lerc; });/* jshint ignore:line */\n }\n else if (typeof module !== \"undefined\" && module.exports) {/* jshint ignore:line */\n //commonJS module 1.0/1.1/1.1.1 systems, such as nodeJS\n //http://wiki.commonjs.org/wiki/Modules\n module.exports = Lerc;/* jshint ignore:line */\n }\n else {\n //assign to this, most likely window\n this.Lerc = Lerc;\n }\n\n})();\n","let init;\nlet instance;\nlet heap;\nconst IMPORT_OBJECT = {\n env: {\n emscripten_notify_memory_growth: function (index) {\n heap = new Uint8Array(instance.exports.memory.buffer);\n }\n }\n};\n/**\r\n * ZSTD (Zstandard) decoder.\r\n */\nclass ZSTDDecoder {\n init() {\n if (init) return init;\n if (typeof fetch !== 'undefined') {\n // Web.\n init = fetch('data:application/wasm;base64,' + wasm).then(response => response.arrayBuffer()).then(arrayBuffer => WebAssembly.instantiate(arrayBuffer, IMPORT_OBJECT)).then(this._init);\n } else {\n // Node.js.\n init = WebAssembly.instantiate(Buffer.from(wasm, 'base64'), IMPORT_OBJECT).then(this._init);\n }\n return init;\n }\n _init(result) {\n instance = result.instance;\n IMPORT_OBJECT.env.emscripten_notify_memory_growth(0); // initialize heap.\n }\n\n decode(array, uncompressedSize = 0) {\n if (!instance) throw new Error(`ZSTDDecoder: Await .init() before decoding.`);\n // Write compressed data into WASM memory.\n const compressedSize = array.byteLength;\n const compressedPtr = instance.exports.malloc(compressedSize);\n heap.set(array, compressedPtr);\n // Decompress into WASM memory.\n uncompressedSize = uncompressedSize || Number(instance.exports.ZSTD_findDecompressedSize(compressedPtr, compressedSize));\n const uncompressedPtr = instance.exports.malloc(uncompressedSize);\n const actualSize = instance.exports.ZSTD_decompress(uncompressedPtr, uncompressedSize, compressedPtr, compressedSize);\n // Read decompressed data and free WASM memory.\n const dec = heap.slice(uncompressedPtr, uncompressedPtr + actualSize);\n instance.exports.free(compressedPtr);\n instance.exports.free(uncompressedPtr);\n return dec;\n }\n}\n/**\r\n * BSD License\r\n *\r\n * For Zstandard software\r\n *\r\n * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * * Neither the name Facebook nor the names of its contributors may be used to\r\n * endorse or promote products derived from this software without specific\r\n * prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\n// wasm:begin\nconst wasm = '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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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';\n// wasm:end\n\nexport { ZSTDDecoder };\n//# sourceMappingURL=zstddec.modern.js.map\n","import { inflate } from 'pako';\nimport Lerc from 'lerc';\nimport { ZSTDDecoder } from 'zstddec';\nimport BaseDecoder from './basedecoder.js';\nimport { LercParameters, LercAddCompression } from '../globals.js';\n\nexport const zstd = new ZSTDDecoder();\n\nexport default class LercDecoder extends BaseDecoder {\n constructor(fileDirectory) {\n super();\n\n this.planarConfiguration = typeof fileDirectory.PlanarConfiguration !== 'undefined' ? fileDirectory.PlanarConfiguration : 1;\n this.samplesPerPixel = typeof fileDirectory.SamplesPerPixel !== 'undefined' ? fileDirectory.SamplesPerPixel : 1;\n\n this.addCompression = fileDirectory.LercParameters[LercParameters.AddCompression];\n }\n\n decodeBlock(buffer) {\n switch (this.addCompression) {\n case LercAddCompression.None:\n break;\n case LercAddCompression.Deflate:\n buffer = inflate(new Uint8Array(buffer)).buffer; // eslint-disable-line no-param-reassign, prefer-destructuring\n break;\n case LercAddCompression.Zstandard:\n buffer = zstd.decode(new Uint8Array(buffer)).buffer; // eslint-disable-line no-param-reassign, prefer-destructuring\n break;\n default:\n throw new Error(`Unsupported LERC additional compression method identifier: ${this.addCompression}`);\n }\n\n const lercResult = Lerc.decode(buffer, { returnPixelInterleavedDims: this.planarConfiguration === 1 });\n const lercData = lercResult.pixels[0];\n return lercData.buffer;\n }\n}\n","import BaseDecoder from './basedecoder.js';\n\n/**\n * class WebImageDecoder\n *\n * This decoder uses the browsers image decoding facilities to read image\n * formats like WebP when supported.\n */\nexport default class WebImageDecoder extends BaseDecoder {\n constructor() {\n super();\n if (typeof createImageBitmap === 'undefined') {\n throw new Error('Cannot decode WebImage as `createImageBitmap` is not available');\n } else if (typeof document === 'undefined' && typeof OffscreenCanvas === 'undefined') {\n throw new Error('Cannot decode WebImage as neither `document` nor `OffscreenCanvas` is not available');\n }\n }\n\n async decode(fileDirectory, buffer) {\n const blob = new Blob([buffer]);\n const imageBitmap = await createImageBitmap(blob);\n\n let canvas;\n if (typeof document !== 'undefined') {\n canvas = document.createElement('canvas');\n canvas.width = imageBitmap.width;\n canvas.height = imageBitmap.height;\n } else {\n canvas = new OffscreenCanvas(imageBitmap.width, imageBitmap.height);\n }\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(imageBitmap, 0, 0);\n\n // TODO: check how many samples per pixel we have, and return RGB/RGBA accordingly\n // it seems like GDAL always encodes via RGBA which does not require a translation\n\n return ctx.getImageData(0, 0, imageBitmap.width, imageBitmap.height).data.buffer;\n }\n}\n","/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport default typeof Worker !== 'undefined' ? Worker : undefined;\n","\n import Worker from 'web-worker';\n export function create() {\n const source = \"function A(A,e,t,i,r,I,g){try{var n=A[I](g),a=n.value}catch(A){return void t(A)}n.done?e(a):Promise.resolve(a).then(i,r)}function e(e){return function(){var t=this,i=arguments;return new Promise((function(r,I){var g=e.apply(t,i);function n(e){A(g,r,I,n,a,\\\"next\\\",e)}function a(e){A(g,r,I,n,a,\\\"throw\\\",e)}n(void 0)}))}}function t(A){return t=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&\\\"function\\\"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?\\\"symbol\\\":typeof A},t(A)}var i={exports:{}};!function(A){var e=function(A){var e,i=Object.prototype,r=i.hasOwnProperty,I=\\\"function\\\"==typeof Symbol?Symbol:{},g=I.iterator||\\\"@@iterator\\\",n=I.asyncIterator||\\\"@@asyncIterator\\\",a=I.toStringTag||\\\"@@toStringTag\\\";function o(A,e,t){return Object.defineProperty(A,e,{value:t,enumerable:!0,configurable:!0,writable:!0}),A[e]}try{o({},\\\"\\\")}catch(A){o=function(A,e,t){return A[e]=t}}function B(A,e,t,i){var r=e&&e.prototype instanceof h?e:h,I=Object.create(r.prototype),g=new S(i||[]);return I._invoke=function(A,e,t){var i=Q;return function(r,I){if(i===s)throw new Error(\\\"Generator is already running\\\");if(i===f){if(\\\"throw\\\"===r)throw I;return R()}for(t.method=r,t.arg=I;;){var g=t.delegate;if(g){var n=m(g,t);if(n){if(n===c)continue;return n}}if(\\\"next\\\"===t.method)t.sent=t._sent=t.arg;else if(\\\"throw\\\"===t.method){if(i===Q)throw i=f,t.arg;t.dispatchException(t.arg)}else\\\"return\\\"===t.method&&t.abrupt(\\\"return\\\",t.arg);i=s;var a=C(A,e,t);if(\\\"normal\\\"===a.type){if(i=t.done?f:E,a.arg===c)continue;return{value:a.arg,done:t.done}}\\\"throw\\\"===a.type&&(i=f,t.method=\\\"throw\\\",t.arg=a.arg)}}}(A,t,g),I}function C(A,e,t){try{return{type:\\\"normal\\\",arg:A.call(e,t)}}catch(A){return{type:\\\"throw\\\",arg:A}}}A.wrap=B;var Q=\\\"suspendedStart\\\",E=\\\"suspendedYield\\\",s=\\\"executing\\\",f=\\\"completed\\\",c={};function h(){}function l(){}function u(){}var w={};o(w,g,(function(){return this}));var d=Object.getPrototypeOf,D=d&&d(d(v([])));D&&D!==i&&r.call(D,g)&&(w=D);var y=u.prototype=h.prototype=Object.create(w);function k(A){[\\\"next\\\",\\\"throw\\\",\\\"return\\\"].forEach((function(e){o(A,e,(function(A){return this._invoke(e,A)}))}))}function p(A,e){function i(I,g,n,a){var o=C(A[I],A,g);if(\\\"throw\\\"!==o.type){var B=o.arg,Q=B.value;return Q&&\\\"object\\\"===t(Q)&&r.call(Q,\\\"__await\\\")?e.resolve(Q.__await).then((function(A){i(\\\"next\\\",A,n,a)}),(function(A){i(\\\"throw\\\",A,n,a)})):e.resolve(Q).then((function(A){B.value=A,n(B)}),(function(A){return i(\\\"throw\\\",A,n,a)}))}a(o.arg)}var I;this._invoke=function(A,t){function r(){return new e((function(e,r){i(A,t,e,r)}))}return I=I?I.then(r,r):r()}}function m(A,t){var i=A.iterator[t.method];if(i===e){if(t.delegate=null,\\\"throw\\\"===t.method){if(A.iterator.return&&(t.method=\\\"return\\\",t.arg=e,m(A,t),\\\"throw\\\"===t.method))return c;t.method=\\\"throw\\\",t.arg=new TypeError(\\\"The iterator does not provide a 'throw' method\\\")}return c}var r=C(i,A.iterator,t.arg);if(\\\"throw\\\"===r.type)return t.method=\\\"throw\\\",t.arg=r.arg,t.delegate=null,c;var I=r.arg;return I?I.done?(t[A.resultName]=I.value,t.next=A.nextLoc,\\\"return\\\"!==t.method&&(t.method=\\\"next\\\",t.arg=e),t.delegate=null,c):I:(t.method=\\\"throw\\\",t.arg=new TypeError(\\\"iterator result is not an object\\\"),t.delegate=null,c)}function G(A){var e={tryLoc:A[0]};1 in A&&(e.catchLoc=A[1]),2 in A&&(e.finallyLoc=A[2],e.afterLoc=A[3]),this.tryEntries.push(e)}function F(A){var e=A.completion||{};e.type=\\\"normal\\\",delete e.arg,A.completion=e}function S(A){this.tryEntries=[{tryLoc:\\\"root\\\"}],A.forEach(G,this),this.reset(!0)}function v(A){if(A){var t=A[g];if(t)return t.call(A);if(\\\"function\\\"==typeof A.next)return A;if(!isNaN(A.length)){var i=-1,I=function t(){for(;++i=0;--I){var g=this.tryEntries[I],n=g.completion;if(\\\"root\\\"===g.tryLoc)return i(\\\"end\\\");if(g.tryLoc<=this.prev){var a=r.call(g,\\\"catchLoc\\\"),o=r.call(g,\\\"finallyLoc\\\");if(a&&o){if(this.prev=0;--t){var i=this.tryEntries[t];if(i.tryLoc<=this.prev&&r.call(i,\\\"finallyLoc\\\")&&this.prev=0;--e){var t=this.tryEntries[e];if(t.finallyLoc===A)return this.complete(t.completion,t.afterLoc),F(t),c}},catch:function(A){for(var e=this.tryEntries.length-1;e>=0;--e){var t=this.tryEntries[e];if(t.tryLoc===A){var i=t.completion;if(\\\"throw\\\"===i.type){var r=i.arg;F(t)}return r}}throw new Error(\\\"illegal catch attempt\\\")},delegateYield:function(A,t,i){return this.delegate={iterator:v(A),resultName:t,nextLoc:i},\\\"next\\\"===this.method&&(this.arg=e),c}},A}(A.exports);try{regeneratorRuntime=e}catch(A){\\\"object\\\"===(\\\"undefined\\\"==typeof globalThis?\\\"undefined\\\":t(globalThis))?globalThis.regeneratorRuntime=e:Function(\\\"r\\\",\\\"regeneratorRuntime = r\\\")(e)}}(i);var r=i.exports,I=new Map;function g(A,e){Array.isArray(A)||(A=[A]),A.forEach((function(A){return I.set(A,e)}))}function n(A){return a.apply(this,arguments)}function a(){return(a=e(r.mark((function A(e){var t,i;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:if(t=I.get(e.Compression)){A.next=3;break}throw new Error(\\\"Unknown compression method identifier: \\\".concat(e.Compression));case 3:return A.next=5,t();case 5:return i=A.sent,A.abrupt(\\\"return\\\",new i(e));case 7:case\\\"end\\\":return A.stop()}}),A)})))).apply(this,arguments)}g([void 0,1],(function(){return Promise.resolve().then((function(){return y})).then((function(A){return A.default}))})),g(5,(function(){return Promise.resolve().then((function(){return F})).then((function(A){return A.default}))})),g(6,(function(){throw new Error(\\\"old style JPEG compression is not supported.\\\")})),g(7,(function(){return Promise.resolve().then((function(){return N})).then((function(A){return A.default}))})),g([8,32946],(function(){return Promise.resolve().then((function(){return OA})).then((function(A){return A.default}))})),g(32773,(function(){return Promise.resolve().then((function(){return _A})).then((function(A){return A.default}))})),g(34887,(function(){return Promise.resolve().then((function(){return le})).then(function(){var A=e(r.mark((function A(e){return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return A.next=2,e.zstd.init();case 2:return A.abrupt(\\\"return\\\",e);case 3:case\\\"end\\\":return A.stop()}}),A)})));return function(e){return A.apply(this,arguments)}}()).then((function(A){return A.default}))})),g(50001,(function(){return Promise.resolve().then((function(){return de})).then((function(A){return A.default}))}));var o=globalThis;function B(A,e){if(!(A instanceof e))throw new TypeError(\\\"Cannot call a class as a function\\\")}function C(A,e){for(var t=0;t0;r--)A[i+e]+=A[i],i++;t-=e}while(t>0)}function l(A,e,t){for(var i=0,r=A.length,I=r/t;r>e;){for(var g=e;g>0;--g)A[i+e]+=A[i],++i;r-=e}for(var n=A.slice(),a=0;a=A.byteLength);++o){var B=void 0;if(2===e){switch(r[0]){case 8:B=new Uint8Array(A,o*a*t*n,a*t*n);break;case 16:B=new Uint16Array(A,o*a*t*n,a*t*n/2);break;case 32:B=new Uint32Array(A,o*a*t*n,a*t*n/4);break;default:throw new Error(\\\"Predictor 2 not allowed with \\\".concat(r[0],\\\" bits per sample.\\\"))}h(B,a)}else 3===e&&l(B=new Uint8Array(A,o*a*t*n,a*t*n),a,n)}return A}o.addEventListener(\\\"message\\\",function(){var A=e(r.mark((function A(e){var t,i,I,g,a,B;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return t=e.data,i=t.id,I=t.fileDirectory,g=t.buffer,A.next=3,n(I);case 3:return a=A.sent,A.next=6,a.decode(I,g);case 6:B=A.sent,o.postMessage({decoded:B,id:i},[B]);case 8:case\\\"end\\\":return A.stop()}}),A)})));return function(e){return A.apply(this,arguments)}}());var w=function(){function A(){B(this,A)}var t;return Q(A,[{key:\\\"decode\\\",value:(t=e(r.mark((function A(e,t){var i,I,g,n,a;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return A.next=2,this.decodeBlock(t);case 2:if(i=A.sent,1===(I=e.Predictor||1)){A.next=9;break}return g=!e.StripOffsets,n=g?e.TileWidth:e.ImageWidth,a=g?e.TileLength:e.RowsPerStrip||e.ImageLength,A.abrupt(\\\"return\\\",u(i,I,n,a,e.BitsPerSample,e.PlanarConfiguration));case 9:return A.abrupt(\\\"return\\\",i);case 10:case\\\"end\\\":return A.stop()}}),A,this)}))),function(A,e){return t.apply(this,arguments)})}]),A}();function d(A){var e=function(){if(\\\"undefined\\\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\\\"function\\\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var D=function(A){s(t,w);var e=d(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:\\\"decodeBlock\\\",value:function(A){return A}}]),t}(),y=Object.freeze({__proto__:null,default:D});function k(A){var e=function(){if(\\\"undefined\\\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\\\"function\\\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}function p(A,e){for(var t=e.length-1;t>=0;t--)A.push(e[t]);return A}function m(A){for(var e=new Uint16Array(4093),t=new Uint8Array(4093),i=0;i<=257;i++)e[i]=4096,t[i]=i;var r=258,I=9,g=0;function n(){r=258,I=9}function a(A){var e=function(A,e,t){var i=e%8,r=Math.floor(e/8),I=8-i,g=e+t-8*(r+1),n=8*(r+2)-(e+t),a=8*(r+2)-e;if(n=Math.max(0,n),r>=A.length)return console.warn(\\\"ran off the end of the buffer before finding EOI_CODE (end on input code)\\\"),257;var o=A[r]&Math.pow(2,8-i)-1,B=o<<=t-I;if(r+1>>n;B+=C<<=Math.max(0,t-a)}if(g>8&&r+2>>Q}return B}(A,g,I);return g+=I,e}function o(A,i){return t[r]=i,e[r]=A,++r-1}function B(A){for(var i=[],r=A;4096!==r;r=e[r])i.push(t[r]);return i}var C=[];n();for(var Q,E=new Uint8Array(A),s=a(E);257!==s;){if(256===s){for(n(),s=a(E);256===s;)s=a(E);if(257===s)break;if(s>256)throw new Error(\\\"corrupted code at scanline \\\".concat(s));p(C,B(s)),Q=s}else if(s=Math.pow(2,I)&&(12===I?Q=void 0:I++),s=a(E)}return new Uint8Array(C)}var G=function(A){s(t,w);var e=k(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:\\\"decodeBlock\\\",value:function(A){return m(A).buffer}}]),t}(),F=Object.freeze({__proto__:null,default:G});function S(A){var e=function(){if(\\\"undefined\\\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\\\"function\\\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var v=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]);function R(A,e){for(var t=0,i=[],r=16;r>0&&!A[r-1];)--r;i.push({children:[],index:0});for(var I,g=i[0],n=0;n0;)g=i.pop();for(g.index++,i.push(g);i.length<=n;)i.push(I={children:[],index:0}),g.children[g.index]=I.children,g=I;t++}n+10)return f--,s>>f&1;if(255===(s=A[E++])){var e=A[E++];if(e)throw new Error(\\\"unexpected marker: \\\".concat((s<<8|e).toString(16)))}return f=7,s>>>7}function h(A){for(var e,i=A;null!==(e=c());){if(\\\"number\\\"==typeof(i=i[e]))return i;if(\\\"object\\\"!==t(i))throw new Error(\\\"invalid huffman sequence\\\")}return null}function l(A){for(var e=A,t=0;e>0;){var i=c();if(null===i)return;t=t<<1|i,--e}return t}function u(A){var e=l(A);return e>=1<0)w--;else for(var t=g,i=n;t<=i;){var r=h(A.huffmanTableAC),I=15&r,a=r>>4;if(0===I){if(a<15){w=l(a)+(1<>4,0===C)r<15?(w=l(r)+(1<>4;if(0===g){if(n<15)break;r+=16}else e[v[r+=n]]=u(g),r++}};var L,b,M=0;b=1===U?r[0].blocksPerLine*r[0].blocksPerColumn:B*i.mcusPerColumn;for(var N=I||b;M=65488&&L<=65495))break;E+=2}return E-Q}function L(A,e){var t=[],i=e.blocksPerLine,r=e.blocksPerColumn,I=i<<3,g=new Int32Array(64),n=new Uint8Array(64);function a(A,t,i){var r,I,g,n,a,o,B,C,Q,E,s=e.quantizationTable,f=i;for(E=0;E<64;E++)f[E]=A[E]*s[E];for(E=0;E<8;++E){var c=8*E;0!==f[1+c]||0!==f[2+c]||0!==f[3+c]||0!==f[4+c]||0!==f[5+c]||0!==f[6+c]||0!==f[7+c]?(r=5793*f[0+c]+128>>8,I=5793*f[4+c]+128>>8,g=f[2+c],n=f[6+c],a=2896*(f[1+c]-f[7+c])+128>>8,C=2896*(f[1+c]+f[7+c])+128>>8,o=f[3+c]<<4,Q=r-I+1>>1,r=r+I+1>>1,I=Q,Q=3784*g+1567*n+128>>8,g=1567*g-3784*n+128>>8,n=Q,Q=a-(B=f[5+c]<<4)+1>>1,a=a+B+1>>1,B=Q,Q=C+o+1>>1,o=C-o+1>>1,C=Q,Q=r-n+1>>1,r=r+n+1>>1,n=Q,Q=I-g+1>>1,I=I+g+1>>1,g=Q,Q=2276*a+3406*C+2048>>12,a=3406*a-2276*C+2048>>12,C=Q,Q=799*o+4017*B+2048>>12,o=4017*o-799*B+2048>>12,B=Q,f[0+c]=r+C,f[7+c]=r-C,f[1+c]=I+B,f[6+c]=I-B,f[2+c]=g+o,f[5+c]=g-o,f[3+c]=n+a,f[4+c]=n-a):(Q=5793*f[0+c]+512>>10,f[0+c]=Q,f[1+c]=Q,f[2+c]=Q,f[3+c]=Q,f[4+c]=Q,f[5+c]=Q,f[6+c]=Q,f[7+c]=Q)}for(E=0;E<8;++E){var h=E;0!==f[8+h]||0!==f[16+h]||0!==f[24+h]||0!==f[32+h]||0!==f[40+h]||0!==f[48+h]||0!==f[56+h]?(r=5793*f[0+h]+2048>>12,I=5793*f[32+h]+2048>>12,g=f[16+h],n=f[48+h],a=2896*(f[8+h]-f[56+h])+2048>>12,C=2896*(f[8+h]+f[56+h])+2048>>12,o=f[24+h],Q=r-I+1>>1,r=r+I+1>>1,I=Q,Q=3784*g+1567*n+2048>>12,g=1567*g-3784*n+2048>>12,n=Q,Q=a-(B=f[40+h])+1>>1,a=a+B+1>>1,B=Q,Q=C+o+1>>1,o=C-o+1>>1,C=Q,Q=r-n+1>>1,r=r+n+1>>1,n=Q,Q=I-g+1>>1,I=I+g+1>>1,g=Q,Q=2276*a+3406*C+2048>>12,a=3406*a-2276*C+2048>>12,C=Q,Q=799*o+4017*B+2048>>12,o=4017*o-799*B+2048>>12,B=Q,f[0+h]=r+C,f[56+h]=r-C,f[8+h]=I+B,f[48+h]=I-B,f[16+h]=g+o,f[40+h]=g-o,f[24+h]=n+a,f[32+h]=n-a):(Q=5793*i[E+0]+8192>>14,f[0+h]=Q,f[8+h]=Q,f[16+h]=Q,f[24+h]=Q,f[32+h]=Q,f[40+h]=Q,f[48+h]=Q,f[56+h]=Q)}for(E=0;E<64;++E){var l=128+(f[E]+8>>4);t[E]=l<0?0:l>255?255:l}}for(var o=0;o>4==0)for(var C=0;C<64;C++){B[v[C]]=A[e++]}else{if(o>>4!=1)throw new Error(\\\"DQT: invalid table spec\\\");for(var Q=0;Q<64;Q++){B[v[Q]]=t()}}this.quantizationTables[15&o]=B}break;case 65472:case 65473:case 65474:t();for(var E={extended:65473===g,progressive:65474===g,precision:A[e++],scanLines:t(),samplesPerLine:t(),components:{},componentsOrder:[]},s=A[e++],f=void 0,c=0;c>4,l=15&A[e+1],u=A[e+2];E.componentsOrder.push(f),E.components[f]={h:h,v:l,quantizationIdx:u},e+=3}i(E),this.frames.push(E);break;case 65476:for(var w=t(),d=2;d>4==0?this.huffmanTablesDC[15&D]=R(y,m):this.huffmanTablesAC[15&D]=R(y,m)}break;case 65501:t(),this.resetInterval=t();break;case 65498:t();for(var F=A[e++],S=[],L=this.frames[0],b=0;b>4],M.huffmanTableAC=this.huffmanTablesAC[15&N],S.push(M)}var x=A[e++],J=A[e++],q=A[e++],Y=U(A,e,L,S,this.resetInterval,x,J,q>>4,15&q);e+=Y;break;case 65535:255!==A[e]&&e--;break;default:if(255===A[e-3]&&A[e-2]>=192&&A[e-2]<=254){e-=3;break}throw new Error(\\\"unknown JPEG marker \\\".concat(g.toString(16)))}g=t()}}},{key:\\\"getResult\\\",value:function(){var A=this.frames;if(0===this.frames.length)throw new Error(\\\"no frames were decoded\\\");this.frames.length>1&&console.warn(\\\"more than one frame is not supported\\\");for(var e=0;e=0;)A[e]=0}x(new Array(576)),x(new Array(60)),x(new Array(512)),x(new Array(256)),x(new Array(29)),x(new Array(30));var J=function(A,e,t,i){for(var r=65535&A|0,I=A>>>16&65535|0,g=0;0!==t;){t-=g=t>2e3?2e3:t;do{I=I+(r=r+e[i++]|0)|0}while(--g);r%=65521,I%=65521}return r|I<<16|0},q=new Uint32Array(function(){for(var A,e=[],t=0;t<256;t++){A=t;for(var i=0;i<8;i++)A=1&A?3988292384^A>>>1:A>>>1;e[t]=A}return e}()),Y=function(A,e,t,i){var r=q,I=i+t;A^=-1;for(var g=i;g>>8^r[255&(A^e[g])];return-1^A},K={2:\\\"need dictionary\\\",1:\\\"stream end\\\",0:\\\"\\\",\\\"-1\\\":\\\"file error\\\",\\\"-2\\\":\\\"stream error\\\",\\\"-3\\\":\\\"data error\\\",\\\"-4\\\":\\\"insufficient memory\\\",\\\"-5\\\":\\\"buffer error\\\",\\\"-6\\\":\\\"incompatible version\\\"},H={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},O=function(A,e){return Object.prototype.hasOwnProperty.call(A,e)},P=function(A){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var i=e.shift();if(i){if(\\\"object\\\"!==t(i))throw new TypeError(i+\\\"must be non-object\\\");for(var r in i)O(i,r)&&(A[r]=i[r])}}return A},T=function(A){for(var e=0,t=0,i=A.length;t=252?6:X>=248?5:X>=240?4:X>=224?3:X>=192?2:1;_[254]=_[254]=1;var Z=function(A){if(\\\"function\\\"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(A);var e,t,i,r,I,g=A.length,n=0;for(r=0;r>>6,e[I++]=128|63&t):t<65536?(e[I++]=224|t>>>12,e[I++]=128|t>>>6&63,e[I++]=128|63&t):(e[I++]=240|t>>>18,e[I++]=128|t>>>12&63,e[I++]=128|t>>>6&63,e[I++]=128|63&t);return e},j=function(A,e){var t,i,r=e||A.length;if(\\\"function\\\"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(A.subarray(0,e));var I=new Array(2*r);for(i=0,t=0;t4)I[i++]=65533,t+=n-1;else{for(g&=2===n?31:3===n?15:7;n>1&&t1?I[i++]=65533:g<65536?I[i++]=g:(g-=65536,I[i++]=55296|g>>10&1023,I[i++]=56320|1023&g)}}}return function(A,e){if(e<65534&&A.subarray&&V)return String.fromCharCode.apply(null,A.length===e?A:A.subarray(0,e));for(var t=\\\"\\\",i=0;iA.length&&(e=A.length);for(var t=e-1;t>=0&&128==(192&A[t]);)t--;return t<0||0===t?e:t+_[A[t]]>e?t:e};var z=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\\\"\\\",this.state=null,this.data_type=2,this.adler=0},$=function(A,e){var t,i,r,I,g,n,a,o,B,C,Q,E,s,f,c,h,l,u,w,d,D,y,k,p,m=A.state;t=A.next_in,k=A.input,i=t+(A.avail_in-5),r=A.next_out,p=A.output,I=r-(e-A.avail_out),g=r+(A.avail_out-257),n=m.dmax,a=m.wsize,o=m.whave,B=m.wnext,C=m.window,Q=m.hold,E=m.bits,s=m.lencode,f=m.distcode,c=(1<>>=u=l>>>24,E-=u,0===(u=l>>>16&255))p[r++]=65535&l;else{if(!(16&u)){if(0==(64&u)){l=s[(65535&l)+(Q&(1<>>=u,E-=u),E<15&&(Q+=k[t++]<>>=u=l>>>24,E-=u,!(16&(u=l>>>16&255))){if(0==(64&u)){l=f[(65535&l)+(Q&(1<n){A.msg=\\\"invalid distance too far back\\\",m.mode=30;break A}if(Q>>>=u,E-=u,d>(u=r-I)){if((u=d-u)>o&&m.sane){A.msg=\\\"invalid distance too far back\\\",m.mode=30;break A}if(D=0,y=C,0===B){if(D+=a-u,u2;)p[r++]=y[D++],p[r++]=y[D++],p[r++]=y[D++],w-=3;w&&(p[r++]=y[D++],w>1&&(p[r++]=y[D++]))}else{D=r-d;do{p[r++]=p[D++],p[r++]=p[D++],p[r++]=p[D++],w-=3}while(w>2);w&&(p[r++]=p[D++],w>1&&(p[r++]=p[D++]))}break}}break}}while(t>3,Q&=(1<<(E-=w<<3))-1,A.next_in=t,A.next_out=r,A.avail_in=t=1&&0===v[d];d--);if(D>d&&(D=d),0===d)return r[I++]=20971520,r[I++]=20971520,n.bits=1,0;for(w=1;w0&&(0===A||1!==d))return-1;for(R[1]=0,l=1;l<15;l++)R[l+1]=R[l]+v[l];for(u=0;u852||2===A&&m>592)return 1;for(;;){s=l-k,g[u]E?(f=U[L+g[u]],c=F[S+g[u]]):(f=96,c=0),a=1<>k)+(o-=a)]=s<<24|f<<16|c|0}while(0!==o);for(a=1<>=1;if(0!==a?(G&=a-1,G+=a):G=0,u++,0==--v[l]){if(l===d)break;l=e[t+g[u]]}if(l>D&&(G&C)!==B){for(0===k&&(k=D),Q+=w,p=1<<(y=l-k);y+k852||2===A&&m>592)return 1;r[B=G&C]=D<<24|y<<16|Q-I|0}}return 0!==G&&(r[Q+G]=l-k<<24|64<<16|0),n.bits=D,0},IA=H.Z_FINISH,gA=H.Z_BLOCK,nA=H.Z_TREES,aA=H.Z_OK,oA=H.Z_STREAM_END,BA=H.Z_NEED_DICT,CA=H.Z_STREAM_ERROR,QA=H.Z_DATA_ERROR,EA=H.Z_MEM_ERROR,sA=H.Z_BUF_ERROR,fA=H.Z_DEFLATED,cA=function(A){return(A>>>24&255)+(A>>>8&65280)+((65280&A)<<8)+((255&A)<<24)};function hA(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}var lA,uA,wA=function(A){if(!A||!A.state)return CA;var e=A.state;return A.total_in=A.total_out=e.total=0,A.msg=\\\"\\\",e.wrap&&(A.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,aA},dA=function(A){if(!A||!A.state)return CA;var e=A.state;return e.wsize=0,e.whave=0,e.wnext=0,wA(A)},DA=function(A,e){var t;if(!A||!A.state)return CA;var i=A.state;return e<0?(t=0,e=-e):(t=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?CA:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=t,i.wbits=e,dA(A))},yA=function(A,e){if(!A)return CA;var t=new hA;A.state=t,t.window=null;var i=DA(A,e);return i!==aA&&(A.state=null),i},kA=!0,pA=function(A){if(kA){lA=new Int32Array(512),uA=new Int32Array(32);for(var e=0;e<144;)A.lens[e++]=8;for(;e<256;)A.lens[e++]=9;for(;e<280;)A.lens[e++]=7;for(;e<288;)A.lens[e++]=8;for(rA(1,A.lens,0,288,lA,0,A.work,{bits:9}),e=0;e<32;)A.lens[e++]=5;rA(2,A.lens,0,32,uA,0,A.work,{bits:5}),kA=!1}A.lencode=lA,A.lenbits=9,A.distcode=uA,A.distbits=5},mA=function(A,e,t,i){var r,I=A.state;return null===I.window&&(I.wsize=1<=I.wsize?(I.window.set(e.subarray(t-I.wsize,t),0),I.wnext=0,I.whave=I.wsize):((r=I.wsize-I.wnext)>i&&(r=i),I.window.set(e.subarray(t-i,t-i+r),I.wnext),(i-=r)?(I.window.set(e.subarray(t-i,t),0),I.wnext=i,I.whave=I.wsize):(I.wnext+=r,I.wnext===I.wsize&&(I.wnext=0),I.whave>>8&255,t.check=Y(t.check,G,2,0),o=0,B=0,t.mode=2;break}if(t.flags=0,t.head&&(t.head.done=!1),!(1&t.wrap)||(((255&o)<<8)+(o>>8))%31){A.msg=\\\"incorrect header check\\\",t.mode=30;break}if((15&o)!==fA){A.msg=\\\"unknown compression method\\\",t.mode=30;break}if(B-=4,D=8+(15&(o>>>=4)),0===t.wbits)t.wbits=D;else if(D>t.wbits){A.msg=\\\"invalid window size\\\",t.mode=30;break}t.dmax=1<>8&1),512&t.flags&&(G[0]=255&o,G[1]=o>>>8&255,t.check=Y(t.check,G,2,0)),o=0,B=0,t.mode=3;case 3:for(;B<32;){if(0===n)break A;n--,o+=i[I++]<>>8&255,G[2]=o>>>16&255,G[3]=o>>>24&255,t.check=Y(t.check,G,4,0)),o=0,B=0,t.mode=4;case 4:for(;B<16;){if(0===n)break A;n--,o+=i[I++]<>8),512&t.flags&&(G[0]=255&o,G[1]=o>>>8&255,t.check=Y(t.check,G,2,0)),o=0,B=0,t.mode=5;case 5:if(1024&t.flags){for(;B<16;){if(0===n)break A;n--,o+=i[I++]<>>8&255,t.check=Y(t.check,G,2,0)),o=0,B=0}else t.head&&(t.head.extra=null);t.mode=6;case 6:if(1024&t.flags&&((E=t.length)>n&&(E=n),E&&(t.head&&(D=t.head.extra_len-t.length,t.head.extra||(t.head.extra=new Uint8Array(t.head.extra_len)),t.head.extra.set(i.subarray(I,I+E),D)),512&t.flags&&(t.check=Y(t.check,i,E,I)),n-=E,I+=E,t.length-=E),t.length))break A;t.length=0,t.mode=7;case 7:if(2048&t.flags){if(0===n)break A;E=0;do{D=i[I+E++],t.head&&D&&t.length<65536&&(t.head.name+=String.fromCharCode(D))}while(D&&E>9&1,t.head.done=!0),A.adler=t.check=0,t.mode=12;break;case 10:for(;B<32;){if(0===n)break A;n--,o+=i[I++]<>>=7&B,B-=7&B,t.mode=27;break}for(;B<3;){if(0===n)break A;n--,o+=i[I++]<>>=1)){case 0:t.mode=14;break;case 1:if(pA(t),t.mode=20,e===nA){o>>>=2,B-=2;break A}break;case 2:t.mode=17;break;case 3:A.msg=\\\"invalid block type\\\",t.mode=30}o>>>=2,B-=2;break;case 14:for(o>>>=7&B,B-=7&B;B<32;){if(0===n)break A;n--,o+=i[I++]<>>16^65535)){A.msg=\\\"invalid stored block lengths\\\",t.mode=30;break}if(t.length=65535&o,o=0,B=0,t.mode=15,e===nA)break A;case 15:t.mode=16;case 16:if(E=t.length){if(E>n&&(E=n),E>a&&(E=a),0===E)break A;r.set(i.subarray(I,I+E),g),n-=E,I+=E,a-=E,g+=E,t.length-=E;break}t.mode=12;break;case 17:for(;B<14;){if(0===n)break A;n--,o+=i[I++]<>>=5,B-=5,t.ndist=1+(31&o),o>>>=5,B-=5,t.ncode=4+(15&o),o>>>=4,B-=4,t.nlen>286||t.ndist>30){A.msg=\\\"too many length or distance symbols\\\",t.mode=30;break}t.have=0,t.mode=18;case 18:for(;t.have>>=3,B-=3}for(;t.have<19;)t.lens[F[t.have++]]=0;if(t.lencode=t.lendyn,t.lenbits=7,k={bits:t.lenbits},y=rA(0,t.lens,0,19,t.lencode,0,t.work,k),t.lenbits=k.bits,y){A.msg=\\\"invalid code lengths set\\\",t.mode=30;break}t.have=0,t.mode=19;case 19:for(;t.have>>16&255,l=65535&m,!((c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>>=c,B-=c,t.lens[t.have++]=l;else{if(16===l){for(p=c+2;B>>=c,B-=c,0===t.have){A.msg=\\\"invalid bit length repeat\\\",t.mode=30;break}D=t.lens[t.have-1],E=3+(3&o),o>>>=2,B-=2}else if(17===l){for(p=c+3;B>>=c)),o>>>=3,B-=3}else{for(p=c+7;B>>=c)),o>>>=7,B-=7}if(t.have+E>t.nlen+t.ndist){A.msg=\\\"invalid bit length repeat\\\",t.mode=30;break}for(;E--;)t.lens[t.have++]=D}}if(30===t.mode)break;if(0===t.lens[256]){A.msg=\\\"invalid code -- missing end-of-block\\\",t.mode=30;break}if(t.lenbits=9,k={bits:t.lenbits},y=rA(1,t.lens,0,t.nlen,t.lencode,0,t.work,k),t.lenbits=k.bits,y){A.msg=\\\"invalid literal/lengths set\\\",t.mode=30;break}if(t.distbits=6,t.distcode=t.distdyn,k={bits:t.distbits},y=rA(2,t.lens,t.nlen,t.ndist,t.distcode,0,t.work,k),t.distbits=k.bits,y){A.msg=\\\"invalid distances set\\\",t.mode=30;break}if(t.mode=20,e===nA)break A;case 20:t.mode=21;case 21:if(n>=6&&a>=258){A.next_out=g,A.avail_out=a,A.next_in=I,A.avail_in=n,t.hold=o,t.bits=B,$(A,Q),g=A.next_out,r=A.output,a=A.avail_out,I=A.next_in,i=A.input,n=A.avail_in,o=t.hold,B=t.bits,12===t.mode&&(t.back=-1);break}for(t.back=0;h=(m=t.lencode[o&(1<>>16&255,l=65535&m,!((c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>u)])>>>16&255,l=65535&m,!(u+(c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>>=u,B-=u,t.back+=u}if(o>>>=c,B-=c,t.back+=c,t.length=l,0===h){t.mode=26;break}if(32&h){t.back=-1,t.mode=12;break}if(64&h){A.msg=\\\"invalid literal/length code\\\",t.mode=30;break}t.extra=15&h,t.mode=22;case 22:if(t.extra){for(p=t.extra;B>>=t.extra,B-=t.extra,t.back+=t.extra}t.was=t.length,t.mode=23;case 23:for(;h=(m=t.distcode[o&(1<>>16&255,l=65535&m,!((c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>u)])>>>16&255,l=65535&m,!(u+(c=m>>>24)<=B);){if(0===n)break A;n--,o+=i[I++]<>>=u,B-=u,t.back+=u}if(o>>>=c,B-=c,t.back+=c,64&h){A.msg=\\\"invalid distance code\\\",t.mode=30;break}t.offset=l,t.extra=15&h,t.mode=24;case 24:if(t.extra){for(p=t.extra;B>>=t.extra,B-=t.extra,t.back+=t.extra}if(t.offset>t.dmax){A.msg=\\\"invalid distance too far back\\\",t.mode=30;break}t.mode=25;case 25:if(0===a)break A;if(E=Q-a,t.offset>E){if((E=t.offset-E)>t.whave&&t.sane){A.msg=\\\"invalid distance too far back\\\",t.mode=30;break}E>t.wnext?(E-=t.wnext,s=t.wsize-E):s=t.wnext-E,E>t.length&&(E=t.length),f=t.window}else f=r,s=g-t.offset,E=t.length;E>a&&(E=a),a-=E,t.length-=E;do{r[g++]=f[s++]}while(--E);0===t.length&&(t.mode=21);break;case 26:if(0===a)break A;r[g++]=t.length,a--,t.mode=21;break;case 27:if(t.wrap){for(;B<32;){if(0===n)break A;n--,o|=i[I++]<=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||A&&A.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg=\\\"\\\",this.ended=!1,this.chunks=[],this.strm=new z,this.strm.avail_out=0;var t=GA.inflateInit2(this.strm,e.windowBits);if(t!==UA)throw new Error(K[t]);if(this.header=new FA,GA.inflateGetHeader(this.strm,this.header),e.dictionary&&(\\\"string\\\"==typeof e.dictionary?e.dictionary=Z(e.dictionary):\\\"[object ArrayBuffer]\\\"===SA.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(t=GA.inflateSetDictionary(this.strm,e.dictionary))!==UA))throw new Error(K[t])}function qA(A,e){var t=new JA(e);if(t.push(A),t.err)throw t.msg||K[t.err];return t.result}JA.prototype.push=function(A,e){var t,i,r,I=this.strm,g=this.options.chunkSize,n=this.options.dictionary;if(this.ended)return!1;for(i=e===~~e?e:!0===e?RA:vA,\\\"[object ArrayBuffer]\\\"===SA.call(A)?I.input=new Uint8Array(A):I.input=A,I.next_in=0,I.avail_in=I.input.length;;){for(0===I.avail_out&&(I.output=new Uint8Array(g),I.next_out=0,I.avail_out=g),(t=GA.inflate(I,i))===bA&&n&&((t=GA.inflateSetDictionary(I,n))===UA?t=GA.inflate(I,i):t===NA&&(t=bA));I.avail_in>0&&t===LA&&I.state.wrap>0&&0!==A[I.next_in];)GA.inflateReset(I),t=GA.inflate(I,i);switch(t){case MA:case NA:case bA:case xA:return this.onEnd(t),this.ended=!0,!1}if(r=I.avail_out,I.next_out&&(0===I.avail_out||t===LA))if(\\\"string\\\"===this.options.to){var a=W(I.output,I.next_out),o=I.next_out-a,B=j(I.output,a);I.next_out=o,I.avail_out=g-o,o&&I.output.set(I.output.subarray(a,a+o),0),this.onData(B)}else this.onData(I.output.length===I.next_out?I.output:I.output.subarray(0,I.next_out));if(t!==UA||0!==r){if(t===LA)return t=GA.inflateEnd(this.strm),this.onEnd(t),this.ended=!0,!0;if(0===I.avail_in)break}}return!0},JA.prototype.onData=function(A){this.chunks.push(A)},JA.prototype.onEnd=function(A){A===UA&&(\\\"string\\\"===this.options.to?this.result=this.chunks.join(\\\"\\\"):this.result=T(this.chunks)),this.chunks=[],this.err=A,this.msg=this.strm.msg};var YA={Inflate:JA,inflate:qA,inflateRaw:function(A,e){return(e=e||{}).raw=!0,qA(A,e)},ungzip:qA,constants:H}.inflate;function KA(A){var e=function(){if(\\\"undefined\\\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\\\"function\\\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var HA=function(A){s(t,w);var e=KA(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:\\\"decodeBlock\\\",value:function(A){return YA(new Uint8Array(A)).buffer}}]),t}(),OA=Object.freeze({__proto__:null,default:HA});function PA(A){var e=function(){if(\\\"undefined\\\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\\\"function\\\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var TA,VA=function(A){s(t,w);var e=PA(t);function t(){return B(this,t),e.apply(this,arguments)}return Q(t,[{key:\\\"decodeBlock\\\",value:function(A){for(var e=new DataView(A),t=[],i=0;i>3],m<<=7&G),c=0;c>3]),128&m?(a&&(a[G]=1),f=f>(g=S.encoding<2?y[k++]:p)?g:f,n[G++]=g):(a&&(a[G]=0),n[G++]=i),m<<=1;G+=F}else if(S.encoding<2)for(h=0;h(g=y[k++])?g:f,n[G++]=g;G+=F}else for(f=f>p?p:f,h=0;h0){var g=new Uint8Array(Math.ceil(i.width*i.height/8)),n=(I=new DataView(A,e,i.mask.numBytes)).getInt16(0,!0),a=2,o=0;do{if(n>0)for(;n--;)g[o++]=I.getUint8(a++);else{var B=I.getUint8(a++);for(n=-n;n--;)g[o++]=B}n=I.getInt16(a,!0),a+=2}while(a0?1:0),s=Q+(i.height%Q>0?1:0);i.pixels.blocks=new Array(E*s);for(var f=0,c=0;c3)throw\\\"Invalid block encoding (\\\"+w.encoding+\\\")\\\";if(2!==w.encoding){if(0!==d&&2!==d){if(d>>=6,w.offsetType=d,2===d)w.offset=I.getInt8(1),l++;else if(1===d)w.offset=I.getInt16(1,!0),l+=2;else{if(0!==d)throw\\\"Invalid block offset type\\\";w.offset=I.getFloat32(1,!0),l+=4}if(1===w.encoding)if(d=I.getUint8(l),l++,w.bitsPerPixel=63&d,d>>=6,w.numValidPixelsType=d,2===d)w.numValidPixels=I.getUint8(l),l++;else if(1===d)w.numValidPixels=I.getUint16(l,!0),l+=2;else{if(0!==d)throw\\\"Invalid valid pixel count type\\\";w.numValidPixels=I.getUint32(l,!0),l+=4}}var D;if(e+=l,3!==w.encoding)if(0===w.encoding){var y=(i.pixels.numBytes-1)/4;if(y!==Math.floor(y))throw\\\"uncompressed block has invalid length\\\";D=new ArrayBuffer(4*y),new Uint8Array(D).set(new Uint8Array(A,e,4*y));var k=new Float32Array(D);w.rawData=k,e+=4*y}else if(1===w.encoding){var p=Math.ceil(w.numValidPixels*w.bitsPerPixel/8),m=Math.ceil(p/4);D=new ArrayBuffer(4*m),new Uint8Array(D).set(new Uint8Array(A,e,p)),w.stuffedData=new Uint32Array(D),e+=p}}else e++}return i.eofOffset=e,i},I=function(A,e,t,i,r,I,g){var n,a,o,B=(1<=e)a=o>>>Q-e&B,Q-=e;else{var f=e-Q;a=(o&B)<>>(Q=32-f)}I[n]=a=t?(o=B>>>f-t&E,f-=t):(o=(B&E)<<(C=t-f)&E,o+=(B=A[s++])>>>(f=32-C)),e[a]=r[o];else for(Q=Math.ceil((n-I)/g),a=0;a=t?(o=B>>>f-t&E,f-=t):(o=(B&E)<<(C=t-f)&E,o+=(B=A[s++])>>>(f=32-C)),e[a]=o=e?(Q=g>>>C-e&n,C-=e):(Q=(g&n)<<(B=e-C)&n,Q+=(g=A[a++])>>>(C=32-B)),E[o]=Q=t?(o=B>>>f&Q,s-=t,f+=t):(o=B>>>f&Q,s=32-(C=t-s),o|=((B=A[E++])&(1<=t?(o=B>>>f&Q,s-=t,f+=t):(o=B>>>f&Q,s=32-(C=t-s),o|=((B=A[E++])&(1<=e?(Q=g>>>E&n,C-=e,E+=e):(Q=g>>>E&n,C=32-(B=e-C),Q|=((g=A[a++])&(1<=t?(I=g>>>B-t&a,B-=t):(I=(g&a)<<(n=t-B)&a,I+=(g=A[o++])>>>(B=32-n)),e[r]=I;return e},C=function(A,e,t,i){var r,I,g,n,a=(1<=t?(I=g>>>C&a,B-=t,C+=t):(I=g>>>C&a,B=32-(n=t-B),I|=((g=A[o++])&(1<=359?359:r;r-=g;do{e+=A[I++]<<8,t+=e+=A[I++]}while(--g);e=(65535&e)+(e>>>16),t=(65535&t)+(t>>>16)}return 1&i&&(t+=e+=A[I]<<8),((t=(65535&t)+(t>>>16))<<16|(e=(65535&e)+(e>>>16)))>>>0},readHeaderInfo:function(A,e){var t=e.ptr,i=new Uint8Array(A,t,6),r={};if(r.fileIdentifierString=String.fromCharCode.apply(null,i),0!==r.fileIdentifierString.lastIndexOf(\\\"Lerc2\\\",0))throw\\\"Unexpected file identifier string (expect Lerc2 ): \\\"+r.fileIdentifierString;t+=6;var I,g=new DataView(A,t,8),n=g.getInt32(0,!0);if(r.fileVersion=n,t+=4,n>=3&&(r.checksum=g.getUint32(4,!0),t+=4),g=new DataView(A,t,12),r.height=g.getUint32(0,!0),r.width=g.getUint32(4,!0),t+=8,n>=4?(r.numDims=g.getUint32(8,!0),t+=4):r.numDims=1,g=new DataView(A,t,40),r.numValidPixel=g.getUint32(0,!0),r.microBlockSize=g.getInt32(4,!0),r.blobSize=g.getInt32(8,!0),r.imageType=g.getInt32(12,!0),r.maxZError=g.getFloat64(16,!0),r.zMin=g.getFloat64(24,!0),r.zMax=g.getFloat64(32,!0),t+=40,e.headerInfo=r,e.ptr=t,n>=3&&(I=n>=4?52:48,this.computeChecksumFletcher32(new Uint8Array(A,t-I,r.blobSize-14))!==r.checksum))throw\\\"Checksum failed.\\\";return!0},checkMinMaxRanges:function(A,e){var t=e.headerInfo,i=this.getDataTypeArray(t.imageType),r=t.numDims*this.getDataTypeSize(t.imageType),I=this.readSubArray(A,e.ptr,i,r),g=this.readSubArray(A,e.ptr+r,i,r);e.ptr+=2*r;var n,a=!0;for(n=0;n0){t=new Uint8Array(Math.ceil(g/8));var B=(a=new DataView(A,r,o.numBytes)).getInt16(0,!0),C=2,Q=0,E=0;do{if(B>0)for(;B--;)t[Q++]=a.getUint8(C++);else for(E=a.getUint8(C++),B=-B;B--;)t[Q++]=E;B=a.getInt16(C,!0),C+=2}while(C>3],s<<=7&f):s=t[f>>3],128&s&&(i[f]=1);e.pixels.resultMask=i,o.bitset=t,r+=o.numBytes}return e.ptr=r,e.mask=o,!0},readDataOneSweep:function(A,e,t,i){var r,I=e.ptr,g=e.headerInfo,n=g.numDims,a=g.width*g.height,o=g.imageType,B=g.numValidPixel*Q.getDataTypeSize(o)*n,C=e.pixels.resultMask;if(t===Uint8Array)r=new Uint8Array(A,I,B);else{var E=new ArrayBuffer(B);new Uint8Array(E).set(new Uint8Array(A,I,B)),r=new t(E)}if(r.length===a*n)e.pixels.resultPixels=i?Q.swapDimensionOrder(r,a,n,t,!0):r;else{e.pixels.resultPixels=new t(a*n);var s=0,f=0,c=0,h=0;if(n>1){if(i){for(f=0;f=g)return!1;var n=new Uint32Array(g-I);Q.decodeBits(A,e,n);var a,o,B,C,s=[];for(a=I;a0&&(s[o].second=l<>>32-C,32-w>=C?32===(w+=C)&&(w=0,l=u[++d]):(w+=C-32,l=u[++d],s[o].second|=l>>>32-w));var D=0,y=0,k=new E;for(a=0;a=t?t:D;var p,m,G,F,S,v=[];for(a=I;a0)if(p=[C,o],C<=y)for(m=s[o].second<=0;F--)m>>>F&1?(S.right||(S.right=new E),S=S.right):(S.left||(S.left=new E),S=S.left),0!==F||S.val||(S.val=p[1]);return{decodeLut:v,numBitsLUTQick:y,numBitsLUT:D,tree:k,stuffedData:u,srcPtr:d,bitPos:w}},readHuffman:function(A,e,t,i){var r,I,g,n,a,o,B,C,E,s=e.headerInfo.numDims,f=e.headerInfo.height,c=e.headerInfo.width,h=c*f,l=this.readHuffmanTree(A,e),u=l.decodeLut,w=l.tree,d=l.stuffedData,D=l.srcPtr,y=l.bitPos,k=l.numBitsLUTQick,p=l.numBitsLUT,m=0===e.headerInfo.imageType?128:0,G=e.pixels.resultMask,F=0;y>0&&(D++,y=0);var S,v=d[D],R=1===e.encodeMode,U=new t(h*s),L=U;if(s<2||R){for(S=0;S1&&(L=new t(U.buffer,h*S,h),F=0),e.headerInfo.numValidPixel===c*f)for(C=0,o=0;o>>32-k,32-y>>64-y-k),u[a])I=u[a][1],y+=u[a][0];else for(a=n=v<>>32-p,32-y>>64-y-p),r=w,E=0;E>>p-E-1&1?r.right:r.left).left&&!r.right){I=r.val,y=y+E+1;break}y>=32&&(y-=32,v=d[++D]),g=I-m,R?(g+=B>0?F:o>0?L[C-c]:F,g&=255,L[C]=g,F=g):L[C]=g}else for(C=0,o=0;o>>32-k,32-y>>64-y-k),u[a])I=u[a][1],y+=u[a][0];else for(a=n=v<>>32-p,32-y>>64-y-p),r=w,E=0;E>>p-E-1&1?r.right:r.left).left&&!r.right){I=r.val,y=y+E+1;break}y>=32&&(y-=32,v=d[++D]),g=I-m,R?(B>0&&G[C-1]?g+=F:o>0&&G[C-c]?g+=L[C-c]:g+=F,g&=255,L[C]=g,F=g):L[C]=g}}else for(C=0,o=0;o>>32-k,32-y>>64-y-k),u[a])I=u[a][1],y+=u[a][0];else for(a=n=v<>>32-p,32-y>>64-y-p),r=w,E=0;E>>p-E-1&1?r.right:r.left).left&&!r.right){I=r.val,y=y+E+1;break}y>=32&&(y-=32,v=d[++D]),g=I-m,L[C]=g}e.ptr=e.ptr+4*(D+1)+(y>0?4:0),e.pixels.resultPixels=U,s>1&&!i&&(e.pixels.resultPixels=Q.swapDimensionOrder(U,h,s,t))},decodeBits:function(A,e,t,i,r){var I=e.headerInfo,Q=I.fileVersion,E=0,s=A.byteLength-e.ptr>=5?5:A.byteLength-e.ptr,f=new DataView(A,e.ptr,s),c=f.getUint8(0);E++;var h=c>>6,l=0===h?4:3-h,u=(32&c)>0,w=31&c,d=0;if(1===l)d=f.getUint8(E),E++;else if(2===l)d=f.getUint16(E,!0),E+=2;else{if(4!==l)throw\\\"Invalid valid pixel count type\\\";d=f.getUint32(E,!0),E+=4}var D,y,k,p,m,G,F,S,v,R=2*I.maxZError,U=I.numDims>1?I.maxValues[r]:I.zMax;if(u){for(e.counter.lut++,S=f.getUint8(E),E++,p=Math.ceil((S-1)*w/8),m=Math.ceil(p/4),y=new ArrayBuffer(4*m),k=new Uint8Array(y),e.ptr+=E,k.set(new Uint8Array(A,e.ptr,p)),F=new Uint32Array(y),e.ptr+=p,v=0;S-1>>>v;)v++;p=Math.ceil(d*v/8),m=Math.ceil(p/4),y=new ArrayBuffer(4*m),(k=new Uint8Array(y)).set(new Uint8Array(A,e.ptr,p)),D=new Uint32Array(y),e.ptr+=p,G=Q>=3?o(F,w,S-1,i,R,U):n(F,w,S-1,i,R,U),Q>=3?a(D,t,v,d,G):g(D,t,v,d,G)}else e.counter.bitstuffer++,v=w,e.ptr+=E,v>0&&(p=Math.ceil(d*v/8),m=Math.ceil(p/4),y=new ArrayBuffer(4*m),(k=new Uint8Array(y)).set(new Uint8Array(A,e.ptr,p)),D=new Uint32Array(y),e.ptr+=p,Q>=3?null==i?C(D,t,v,d):a(D,t,v,d,!1,i,R,U):null==i?B(D,t,v,d):g(D,t,v,d,!1,i,R,U))},readTiles:function(A,e,t,i){var r=e.headerInfo,I=r.width,g=r.height,n=I*g,a=r.microBlockSize,o=r.imageType,B=Q.getDataTypeSize(o),C=Math.ceil(I/a),E=Math.ceil(g/a);e.pixels.numBlocksY=E,e.pixels.numBlocksX=C,e.pixels.ptr=0;var s,f,c,h,l,u,w,d,D,y,k=0,p=0,m=0,G=0,F=0,S=0,v=0,R=0,U=0,L=0,b=0,M=0,N=0,x=0,J=0,q=new t(a*a),Y=g%a||a,K=I%a||a,H=r.numDims,O=e.pixels.resultMask,P=e.pixels.resultPixels,T=r.fileVersion>=5?14:15,V=r.zMax;for(m=0;m1?(y=P,L=m*I*a+G*a,P=new t(e.pixels.resultPixels.buffer,n*d*B,n),V=r.maxValues[d]):y=null,v=A.byteLength-e.ptr,f={},J=0,R=(s=new DataView(A,e.ptr,Math.min(10,v))).getUint8(0),J++,D=r.fileVersion>=5?4&R:0,U=R>>6&255,(R>>2&T)!=(G*a>>3&T))throw\\\"integrity issue\\\";if(D&&0===d)throw\\\"integrity issue\\\";if((l=3&R)>3)throw e.ptr+=J,\\\"Invalid block encoding (\\\"+l+\\\")\\\";if(2!==l)if(0===l){if(D)throw\\\"integrity issue\\\";if(e.counter.uncompressed++,e.ptr+=J,M=(M=F*S*B)<(N=A.byteLength-e.ptr)?M:N,c=new ArrayBuffer(M%B==0?M:M+B-M%B),new Uint8Array(c).set(new Uint8Array(A,e.ptr,M)),h=new t(c),x=0,O)for(k=0;k1&&!i&&(e.pixels.resultPixels=Q.swapDimensionOrder(e.pixels.resultPixels,n,H,t))},formatFileInfo:function(A){return{fileIdentifierString:A.headerInfo.fileIdentifierString,fileVersion:A.headerInfo.fileVersion,imageType:A.headerInfo.imageType,height:A.headerInfo.height,width:A.headerInfo.width,numValidPixel:A.headerInfo.numValidPixel,microBlockSize:A.headerInfo.microBlockSize,blobSize:A.headerInfo.blobSize,maxZError:A.headerInfo.maxZError,pixelType:Q.getPixelType(A.headerInfo.imageType),eofOffset:A.eofOffset,mask:A.mask?{numBytes:A.mask.numBytes}:null,pixels:{numBlocksX:A.pixels.numBlocksX,numBlocksY:A.pixels.numBlocksY,maxValue:A.headerInfo.zMax,minValue:A.headerInfo.zMin,noDataValue:A.noDataValue}}},constructConstantSurface:function(A,e){var t=A.headerInfo.zMax,i=A.headerInfo.zMin,r=A.headerInfo.maxValues,I=A.headerInfo.numDims,g=A.headerInfo.height*A.headerInfo.width,n=0,a=0,o=0,B=A.pixels.resultMask,C=A.pixels.resultPixels;if(B)if(I>1){if(e)for(n=0;n1&&i!==t)if(e)for(n=0;n=-128&&e<=127;break;case 1:t=e>=0&&e<=255;break;case 2:t=e>=-32768&&e<=32767;break;case 3:t=e>=0&&e<=65536;break;case 4:t=e>=-2147483648&&e<=2147483647;break;case 5:t=e>=0&&e<=4294967296;break;case 6:t=e>=-34027999387901484e22&&e<=34027999387901484e22;break;case 7:t=e>=-17976931348623157e292&&e<=17976931348623157e292;break;default:t=!1}return t},getDataTypeSize:function(A){var e=0;switch(A){case 0:case 1:e=1;break;case 2:case 3:e=2;break;case 4:case 5:case 6:e=4;break;case 7:e=8;break;default:e=A}return e},getDataTypeUsed:function(A,e){var t=A;switch(A){case 2:case 4:t=A-e;break;case 3:case 5:t=A-2*e;break;case 6:t=0===e?A:1===e?2:1;break;case 7:t=0===e?A:A-2*e+1;break;default:t=A}return t},getOnePixel:function(A,e,t,i){var r=0;switch(t){case 0:r=i.getInt8(e);break;case 1:r=i.getUint8(e);break;case 2:r=i.getInt16(e,!0);break;case 3:r=i.getUint16(e,!0);break;case 4:r=i.getInt32(e,!0);break;case 5:r=i.getUInt32(e,!0);break;case 6:r=i.getFloat32(e,!0);break;case 7:r=i.getFloat64(e,!0);break;default:throw\\\"the decoder does not understand this pixel type\\\"}return r},swapDimensionOrder:function(A,e,t,i,r){var I=0,g=0,n=0,a=0,o=A;if(t>1)if(o=new i(e*t),r)for(I=0;I5)throw\\\"unsupported lerc version 2.\\\"+g;Q.readMask(A,r),I.numValidPixel===I.width*I.height||r.pixels.resultMask||(r.pixels.resultMask=e.maskData);var a=I.width*I.height;r.pixels.resultPixels=new n(a*I.numDims),r.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0};var o,B=!e.returnPixelInterleavedDims;if(0!==I.numValidPixel)if(I.zMax===I.zMin)Q.constructConstantSurface(r,B);else if(g>=4&&Q.checkMinMaxRanges(A,r))Q.constructConstantSurface(r,B);else{var C=new DataView(A,r.ptr,2),E=C.getUint8(0);if(r.ptr++,E)Q.readDataOneSweep(A,r,n,B);else if(g>1&&I.imageType<=1&&Math.abs(I.maxZError-.5)<1e-5){var s=C.getUint8(1);if(r.ptr++,r.encodeMode=s,s>2||g<4&&s>1)throw\\\"Invalid Huffman flag \\\"+s;s?Q.readHuffman(A,r,n,B):Q.readTiles(A,r,n,B)}else Q.readTiles(A,r,n,B)}r.eofOffset=r.ptr,e.inputOffset?(o=r.headerInfo.blobSize+e.inputOffset-r.ptr,Math.abs(o)>=1&&(r.eofOffset=e.inputOffset+r.headerInfo.blobSize)):(o=r.headerInfo.blobSize-r.ptr,Math.abs(o)>=1&&(r.eofOffset=r.headerInfo.blobSize));var f={width:I.width,height:I.height,pixelData:r.pixels.resultPixels,minValue:I.zMin,maxValue:I.zMax,validPixelCount:I.numValidPixel,dimCount:I.numDims,dimStats:{minValues:I.minValues,maxValues:I.maxValues},maskData:r.pixels.resultMask};if(r.pixels.resultMask&&Q.isValidPixelValue(I.imageType,t)){var c=r.pixels.resultMask;for(i=0;i1&&(o&&f.push(o),d.fileInfo.mask&&d.fileInfo.mask.numBytes>0&&w++),E++,u.pixels.push(d.pixelData),u.statistics.push({minValue:d.minValue,maxValue:d.maxValue,noDataValue:d.noDataValue,dimStats:d.dimStats})}if(i>1&&w>1){for(Q=u.width*u.height,u.bandMasks=f,(o=new Uint8Array(Q)).set(f[0]),B=1;B1&&void 0!==arguments[1]?arguments[1]:0;if(!jA)throw new Error(\\\"ZSTDDecoder: Await .init() before decoding.\\\");var t=A.byteLength,i=jA.exports.malloc(t);WA.set(A,i),e=e||Number(jA.exports.ZSTD_findDecompressedSize(i,t));var r=jA.exports.malloc(e),I=jA.exports.ZSTD_decompress(r,e,i,t),g=WA.slice(r,r+I);return jA.exports.free(i),jA.exports.free(r),g}}]),A}(),ee=\\\"AGFzbQEAAAABpQEVYAF/AX9gAn9/AGADf39/AX9gBX9/f39/AX9gAX8AYAJ/fwF/YAR/f39/AX9gA39/fwBgBn9/f39/fwF/YAd/f39/f39/AX9gAn9/AX5gAn5+AX5gAABgBX9/f39/AGAGf39/f39/AGAIf39/f39/f38AYAl/f39/f39/f38AYAABf2AIf39/f39/f38Bf2ANf39/f39/f39/f39/fwF/YAF/AX4CJwEDZW52H2Vtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgABANpaAEFAAAFAgEFCwACAQABAgIFBQcAAwABDgsBAQcAEhMHAAUBDAQEAAANBwQCAgYCBAgDAwMDBgEACQkHBgICAAYGAgQUBwYGAwIGAAMCAQgBBwUGCgoEEQAEBAEIAwgDBQgDEA8IAAcABAUBcAECAgUEAQCAAgYJAX8BQaCgwAILB2AHBm1lbW9yeQIABm1hbGxvYwAoBGZyZWUAJgxaU1REX2lzRXJyb3IAaBlaU1REX2ZpbmREZWNvbXByZXNzZWRTaXplAFQPWlNURF9kZWNvbXByZXNzAEoGX3N0YXJ0ACQJBwEAQQELASQKussBaA8AIAAgACgCBCABajYCBAsZACAAKAIAIAAoAgRBH3F0QQAgAWtBH3F2CwgAIABBiH9LC34BBH9BAyEBIAAoAgQiA0EgTQRAIAAoAggiASAAKAIQTwRAIAAQDQ8LIAAoAgwiAiABRgRAQQFBAiADQSBJGw8LIAAgASABIAJrIANBA3YiBCABIARrIAJJIgEbIgJrIgQ2AgggACADIAJBA3RrNgIEIAAgBCgAADYCAAsgAQsUAQF/IAAgARACIQIgACABEAEgAgv3AQECfyACRQRAIABCADcCACAAQQA2AhAgAEIANwIIQbh/DwsgACABNgIMIAAgAUEEajYCECACQQRPBEAgACABIAJqIgFBfGoiAzYCCCAAIAMoAAA2AgAgAUF/ai0AACIBBEAgAEEIIAEQFGs2AgQgAg8LIABBADYCBEF/DwsgACABNgIIIAAgAS0AACIDNgIAIAJBfmoiBEEBTQRAIARBAWtFBEAgACABLQACQRB0IANyIgM2AgALIAAgAS0AAUEIdCADajYCAAsgASACakF/ai0AACIBRQRAIABBADYCBEFsDwsgAEEoIAEQFCACQQN0ams2AgQgAgsWACAAIAEpAAA3AAAgACABKQAINwAICy8BAX8gAUECdEGgHWooAgAgACgCAEEgIAEgACgCBGprQR9xdnEhAiAAIAEQASACCyEAIAFCz9bTvtLHq9lCfiAAfEIfiUKHla+vmLbem55/fgsdAQF/IAAoAgggACgCDEYEfyAAKAIEQSBGBUEACwuCBAEDfyACQYDAAE8EQCAAIAEgAhBnIAAPCyAAIAJqIQMCQCAAIAFzQQNxRQRAAkAgAkEBSARAIAAhAgwBCyAAQQNxRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADTw0BIAJBA3ENAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgA0F8aiIEIABJBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAsMACAAIAEpAAA3AAALQQECfyAAKAIIIgEgACgCEEkEQEEDDwsgACAAKAIEIgJBB3E2AgQgACABIAJBA3ZrIgE2AgggACABKAAANgIAQQALDAAgACABKAIANgAAC/cCAQJ/AkAgACABRg0AAkAgASACaiAASwRAIAAgAmoiBCABSw0BCyAAIAEgAhALDwsgACABc0EDcSEDAkACQCAAIAFJBEAgAwRAIAAhAwwDCyAAQQNxRQRAIAAhAwwCCyAAIQMDQCACRQ0EIAMgAS0AADoAACABQQFqIQEgAkF/aiECIANBAWoiA0EDcQ0ACwwBCwJAIAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY0AAQMyIFEAMiBg0AIANBHzYCfCADIANB/ABqIANB+ABqIAQgBCAFaiAGGyIEIAEgAmoiAiAEaxAVIgUQAw0AIAMoAnwiBkEfSw0AIAMoAngiB0EJTw0AIABBiCBqIAMgBkGAC0GADCAHEBggA0E0NgJ8IAMgA0H8AGogA0H4AGogBCAFaiIEIAIgBGsQFSIFEAMNACADKAJ8IgZBNEsNACADKAJ4IgdBCk8NACAAQZAwaiADIAZBgA1B4A4gBxAYIANBIzYCfCADIANB/ABqIANB+ABqIAQgBWoiBCACIARrEBUiBRADDQAgAygCfCIGQSNLDQAgAygCeCIHQQpPDQAgACADIAZBwBBB0BEgBxAYIAQgBWoiBEEMaiIFIAJLDQAgAiAFayEFQQAhAgNAIAJBA0cEQCAEKAAAIgZBf2ogBU8NAiAAIAJBAnRqQZzQAWogBjYCACACQQFqIQIgBEEEaiEEDAELCyAEIAFrIQgLIANBgAFqJAAgCAtGAQN/IABBCGohAyAAKAIEIQJBACEAA0AgACACdkUEQCABIAMgAEEDdGotAAJBFktqIQEgAEEBaiEADAELCyABQQggAmt0C4YDAQV/Qbh/IQcCQCADRQ0AIAItAAAiBEUEQCABQQA2AgBBAUG4fyADQQFGGw8LAn8gAkEBaiIFIARBGHRBGHUiBkF/Sg0AGiAGQX9GBEAgA0EDSA0CIAUvAABBgP4BaiEEIAJBA2oMAQsgA0ECSA0BIAItAAEgBEEIdHJBgIB+aiEEIAJBAmoLIQUgASAENgIAIAVBAWoiASACIANqIgNLDQBBbCEHIABBEGogACAFLQAAIgVBBnZBI0EJIAEgAyABa0HAEEHQEUHwEiAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBmCBqIABBCGogBUEEdkEDcUEfQQggASABIAZqIAgbIgEgAyABa0GAC0GADEGAFyAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBoDBqIABBBGogBUECdkEDcUE0QQkgASABIAZqIAgbIgEgAyABa0GADUHgDkGQGSAAKAKM4QEgACgCnOIBIAQQHyIAEAMNACAAIAFqIAJrIQcLIAcLrQMBCn8jAEGABGsiCCQAAn9BUiACQf8BSw0AGkFUIANBDEsNABogAkEBaiELIABBBGohCUGAgAQgA0F/anRBEHUhCkEAIQJBASEEQQEgA3QiB0F/aiIMIQUDQCACIAtGRQRAAkAgASACQQF0Ig1qLwEAIgZB//8DRgRAIAkgBUECdGogAjoAAiAFQX9qIQVBASEGDAELIARBACAKIAZBEHRBEHVKGyEECyAIIA1qIAY7AQAgAkEBaiECDAELCyAAIAQ7AQIgACADOwEAIAdBA3YgB0EBdmpBA2ohBkEAIQRBACECA0AgBCALRkUEQCABIARBAXRqLgEAIQpBACEAA0AgACAKTkUEQCAJIAJBAnRqIAQ6AAIDQCACIAZqIAxxIgIgBUsNAAsgAEEBaiEADAELCyAEQQFqIQQMAQsLQX8gAg0AGkEAIQIDfyACIAdGBH9BAAUgCCAJIAJBAnRqIgAtAAJBAXRqIgEgAS8BACIBQQFqOwEAIAAgAyABEBRrIgU6AAMgACABIAVB/wFxdCAHazsBACACQQFqIQIMAQsLCyEFIAhBgARqJAAgBQvjBgEIf0FsIQcCQCACQQNJDQACQAJAAkACQCABLQAAIgNBA3EiCUEBaw4DAwEAAgsgACgCiOEBDQBBYg8LIAJBBUkNAkEDIQYgASgAACEFAn8CQAJAIANBAnZBA3EiCEF+aiIEQQFNBEAgBEEBaw0BDAILIAVBDnZB/wdxIQQgBUEEdkH/B3EhAyAIRQwCCyAFQRJ2IQRBBCEGIAVBBHZB//8AcSEDQQAMAQsgBUEEdkH//w9xIgNBgIAISw0DIAEtAARBCnQgBUEWdnIhBEEFIQZBAAshBSAEIAZqIgogAksNAgJAIANBgQZJDQAgACgCnOIBRQ0AQQAhAgNAIAJBg4ABSw0BIAJBQGshAgwAAAsACwJ/IAlBA0YEQCABIAZqIQEgAEHw4gFqIQIgACgCDCEGIAUEQCACIAMgASAEIAYQXwwCCyACIAMgASAEIAYQXQwBCyAAQbjQAWohAiABIAZqIQEgAEHw4gFqIQYgAEGo0ABqIQggBQRAIAggBiADIAEgBCACEF4MAQsgCCAGIAMgASAEIAIQXAsQAw0CIAAgAzYCgOIBIABBATYCiOEBIAAgAEHw4gFqNgLw4QEgCUECRgRAIAAgAEGo0ABqNgIMCyAAIANqIgBBiOMBakIANwAAIABBgOMBakIANwAAIABB+OIBakIANwAAIABB8OIBakIANwAAIAoPCwJ/AkACQAJAIANBAnZBA3FBf2oiBEECSw0AIARBAWsOAgACAQtBASEEIANBA3YMAgtBAiEEIAEvAABBBHYMAQtBAyEEIAEQIUEEdgsiAyAEaiIFQSBqIAJLBEAgBSACSw0CIABB8OIBaiABIARqIAMQCyEBIAAgAzYCgOIBIAAgATYC8OEBIAEgA2oiAEIANwAYIABCADcAECAAQgA3AAggAEIANwAAIAUPCyAAIAM2AoDiASAAIAEgBGo2AvDhASAFDwsCfwJAAkACQCADQQJ2QQNxQX9qIgRBAksNACAEQQFrDgIAAgELQQEhByADQQN2DAILQQIhByABLwAAQQR2DAELIAJBBEkgARAhIgJBj4CAAUtyDQFBAyEHIAJBBHYLIQIgAEHw4gFqIAEgB2otAAAgAkEgahAQIQEgACACNgKA4gEgACABNgLw4QEgB0EBaiEHCyAHC0sAIABC+erQ0OfJoeThADcDICAAQgA3AxggAELP1tO+0ser2UI3AxAgAELW64Lu6v2J9eAANwMIIABCADcDACAAQShqQQBBKBAQGgviAgICfwV+IABBKGoiASAAKAJIaiECAn4gACkDACIDQiBaBEAgACkDECIEQgeJIAApAwgiBUIBiXwgACkDGCIGQgyJfCAAKQMgIgdCEol8IAUQGSAEEBkgBhAZIAcQGQwBCyAAKQMYQsXP2bLx5brqJ3wLIAN8IQMDQCABQQhqIgAgAk0EQEIAIAEpAAAQCSADhUIbiUKHla+vmLbem55/fkLj3MqV/M7y9YV/fCEDIAAhAQwBCwsCQCABQQRqIgAgAksEQCABIQAMAQsgASgAAK1Ch5Wvr5i23puef34gA4VCF4lCz9bTvtLHq9lCfkL5893xmfaZqxZ8IQMLA0AgACACSQRAIAAxAABCxc/ZsvHluuonfiADhUILiUKHla+vmLbem55/fiEDIABBAWohAAwBCwsgA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC+8CAgJ/BH4gACAAKQMAIAKtfDcDAAJAAkAgACgCSCIDIAJqIgRBH00EQCABRQ0BIAAgA2pBKGogASACECAgACgCSCACaiEEDAELIAEgAmohAgJ/IAMEQCAAQShqIgQgA2ogAUEgIANrECAgACAAKQMIIAQpAAAQCTcDCCAAIAApAxAgACkAMBAJNwMQIAAgACkDGCAAKQA4EAk3AxggACAAKQMgIABBQGspAAAQCTcDICAAKAJIIQMgAEEANgJIIAEgA2tBIGohAQsgAUEgaiACTQsEQCACQWBqIQMgACkDICEFIAApAxghBiAAKQMQIQcgACkDCCEIA0AgCCABKQAAEAkhCCAHIAEpAAgQCSEHIAYgASkAEBAJIQYgBSABKQAYEAkhBSABQSBqIgEgA00NAAsgACAFNwMgIAAgBjcDGCAAIAc3AxAgACAINwMICyABIAJPDQEgAEEoaiABIAIgAWsiBBAgCyAAIAQ2AkgLCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQEBogAwVBun8LCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQCxogAwVBun8LC6gCAQZ/IwBBEGsiByQAIABB2OABaikDAEKAgIAQViEIQbh/IQUCQCAEQf//B0sNACAAIAMgBBBCIgUQAyIGDQAgACgCnOIBIQkgACAHQQxqIAMgAyAFaiAGGyIKIARBACAFIAYbayIGEEAiAxADBEAgAyEFDAELIAcoAgwhBCABRQRAQbp/IQUgBEEASg0BCyAGIANrIQUgAyAKaiEDAkAgCQRAIABBADYCnOIBDAELAkACQAJAIARBBUgNACAAQdjgAWopAwBCgICACFgNAAwBCyAAQQA2ApziAQwBCyAAKAIIED8hBiAAQQA2ApziASAGQRRPDQELIAAgASACIAMgBSAEIAgQOSEFDAELIAAgASACIAMgBSAEIAgQOiEFCyAHQRBqJAAgBQtnACAAQdDgAWogASACIAAoAuzhARAuIgEQAwRAIAEPC0G4fyECAkAgAQ0AIABB7OABaigCACIBBEBBYCECIAAoApjiASABRw0BC0EAIQIgAEHw4AFqKAIARQ0AIABBkOEBahBDCyACCycBAX8QVyIERQRAQUAPCyAEIAAgASACIAMgBBBLEE8hACAEEFYgAAs/AQF/AkACQAJAIAAoAqDiAUEBaiIBQQJLDQAgAUEBaw4CAAECCyAAEDBBAA8LIABBADYCoOIBCyAAKAKU4gELvAMCB38BfiMAQRBrIgkkAEG4fyEGAkAgBCgCACIIQQVBCSAAKALs4QEiBRtJDQAgAygCACIHQQFBBSAFGyAFEC8iBRADBEAgBSEGDAELIAggBUEDakkNACAAIAcgBRBJIgYQAw0AIAEgAmohCiAAQZDhAWohCyAIIAVrIQIgBSAHaiEHIAEhBQNAIAcgAiAJECwiBhADDQEgAkF9aiICIAZJBEBBuH8hBgwCCyAJKAIAIghBAksEQEFsIQYMAgsgB0EDaiEHAn8CQAJAAkAgCEEBaw4CAgABCyAAIAUgCiAFayAHIAYQSAwCCyAFIAogBWsgByAGEEcMAQsgBSAKIAVrIActAAAgCSgCCBBGCyIIEAMEQCAIIQYMAgsgACgC8OABBEAgCyAFIAgQRQsgAiAGayECIAYgB2ohByAFIAhqIQUgCSgCBEUNAAsgACkD0OABIgxCf1IEQEFsIQYgDCAFIAFrrFINAQsgACgC8OABBEBBaiEGIAJBBEkNASALEEQhDCAHKAAAIAynRw0BIAdBBGohByACQXxqIQILIAMgBzYCACAEIAI2AgAgBSABayEGCyAJQRBqJAAgBgsuACAAECsCf0EAQQAQAw0AGiABRSACRXJFBEBBYiAAIAEgAhA9EAMNARoLQQALCzcAIAEEQCAAIAAoAsTgASABKAIEIAEoAghqRzYCnOIBCyAAECtBABADIAFFckUEQCAAIAEQWwsL0QIBB38jAEEQayIGJAAgBiAENgIIIAYgAzYCDCAFBEAgBSgCBCEKIAUoAgghCQsgASEIAkACQANAIAAoAuzhARAWIQsCQANAIAQgC0kNASADKAAAQXBxQdDUtMIBRgRAIAMgBBAiIgcQAw0EIAQgB2shBCADIAdqIQMMAQsLIAYgAzYCDCAGIAQ2AggCQCAFBEAgACAFEE5BACEHQQAQA0UNAQwFCyAAIAogCRBNIgcQAw0ECyAAIAgQUCAMQQFHQQAgACAIIAIgBkEMaiAGQQhqEEwiByIDa0EAIAMQAxtBCkdyRQRAQbh/IQcMBAsgBxADDQMgAiAHayECIAcgCGohCEEBIQwgBigCDCEDIAYoAgghBAwBCwsgBiADNgIMIAYgBDYCCEG4fyEHIAQNASAIIAFrIQcMAQsgBiADNgIMIAYgBDYCCAsgBkEQaiQAIAcLRgECfyABIAAoArjgASICRwRAIAAgAjYCxOABIAAgATYCuOABIAAoArzgASEDIAAgATYCvOABIAAgASADIAJrajYCwOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\\\",te={315:\\\"Artist\\\",258:\\\"BitsPerSample\\\",265:\\\"CellLength\\\",264:\\\"CellWidth\\\",320:\\\"ColorMap\\\",259:\\\"Compression\\\",33432:\\\"Copyright\\\",306:\\\"DateTime\\\",338:\\\"ExtraSamples\\\",266:\\\"FillOrder\\\",289:\\\"FreeByteCounts\\\",288:\\\"FreeOffsets\\\",291:\\\"GrayResponseCurve\\\",290:\\\"GrayResponseUnit\\\",316:\\\"HostComputer\\\",270:\\\"ImageDescription\\\",257:\\\"ImageLength\\\",256:\\\"ImageWidth\\\",271:\\\"Make\\\",281:\\\"MaxSampleValue\\\",280:\\\"MinSampleValue\\\",272:\\\"Model\\\",254:\\\"NewSubfileType\\\",274:\\\"Orientation\\\",262:\\\"PhotometricInterpretation\\\",284:\\\"PlanarConfiguration\\\",296:\\\"ResolutionUnit\\\",278:\\\"RowsPerStrip\\\",277:\\\"SamplesPerPixel\\\",305:\\\"Software\\\",279:\\\"StripByteCounts\\\",273:\\\"StripOffsets\\\",255:\\\"SubfileType\\\",263:\\\"Threshholding\\\",282:\\\"XResolution\\\",283:\\\"YResolution\\\",326:\\\"BadFaxLines\\\",327:\\\"CleanFaxData\\\",343:\\\"ClipPath\\\",328:\\\"ConsecutiveBadFaxLines\\\",433:\\\"Decode\\\",434:\\\"DefaultImageColor\\\",269:\\\"DocumentName\\\",336:\\\"DotRange\\\",321:\\\"HalftoneHints\\\",346:\\\"Indexed\\\",347:\\\"JPEGTables\\\",285:\\\"PageName\\\",297:\\\"PageNumber\\\",317:\\\"Predictor\\\",319:\\\"PrimaryChromaticities\\\",532:\\\"ReferenceBlackWhite\\\",339:\\\"SampleFormat\\\",340:\\\"SMinSampleValue\\\",341:\\\"SMaxSampleValue\\\",559:\\\"StripRowCounts\\\",330:\\\"SubIFDs\\\",292:\\\"T4Options\\\",293:\\\"T6Options\\\",325:\\\"TileByteCounts\\\",323:\\\"TileLength\\\",324:\\\"TileOffsets\\\",322:\\\"TileWidth\\\",301:\\\"TransferFunction\\\",318:\\\"WhitePoint\\\",344:\\\"XClipPathUnits\\\",286:\\\"XPosition\\\",529:\\\"YCbCrCoefficients\\\",531:\\\"YCbCrPositioning\\\",530:\\\"YCbCrSubSampling\\\",345:\\\"YClipPathUnits\\\",287:\\\"YPosition\\\",37378:\\\"ApertureValue\\\",40961:\\\"ColorSpace\\\",36868:\\\"DateTimeDigitized\\\",36867:\\\"DateTimeOriginal\\\",34665:\\\"Exif IFD\\\",36864:\\\"ExifVersion\\\",33434:\\\"ExposureTime\\\",41728:\\\"FileSource\\\",37385:\\\"Flash\\\",40960:\\\"FlashpixVersion\\\",33437:\\\"FNumber\\\",42016:\\\"ImageUniqueID\\\",37384:\\\"LightSource\\\",37500:\\\"MakerNote\\\",37377:\\\"ShutterSpeedValue\\\",37510:\\\"UserComment\\\",33723:\\\"IPTC\\\",34675:\\\"ICC Profile\\\",700:\\\"XMP\\\",42112:\\\"GDAL_METADATA\\\",42113:\\\"GDAL_NODATA\\\",34377:\\\"Photoshop\\\",33550:\\\"ModelPixelScale\\\",33922:\\\"ModelTiepoint\\\",34264:\\\"ModelTransformation\\\",34735:\\\"GeoKeyDirectory\\\",34736:\\\"GeoDoubleParams\\\",34737:\\\"GeoAsciiParams\\\",50674:\\\"LercParameters\\\"},ie={};for(var re in te)te.hasOwnProperty(re)&&(ie[te[re]]=parseInt(re,10));ie.BitsPerSample,ie.ExtraSamples,ie.SampleFormat,ie.StripByteCounts,ie.StripOffsets,ie.StripRowCounts,ie.TileByteCounts,ie.TileOffsets,ie.SubIFDs;var Ie={1:\\\"BYTE\\\",2:\\\"ASCII\\\",3:\\\"SHORT\\\",4:\\\"LONG\\\",5:\\\"RATIONAL\\\",6:\\\"SBYTE\\\",7:\\\"UNDEFINED\\\",8:\\\"SSHORT\\\",9:\\\"SLONG\\\",10:\\\"SRATIONAL\\\",11:\\\"FLOAT\\\",12:\\\"DOUBLE\\\",13:\\\"IFD\\\",16:\\\"LONG8\\\",17:\\\"SLONG8\\\",18:\\\"IFD8\\\"},ge={};for(var ne in Ie)Ie.hasOwnProperty(ne)&&(ge[Ie[ne]]=parseInt(ne,10));var ae=1,oe=0,Be=1,Ce=2,Qe={1024:\\\"GTModelTypeGeoKey\\\",1025:\\\"GTRasterTypeGeoKey\\\",1026:\\\"GTCitationGeoKey\\\",2048:\\\"GeographicTypeGeoKey\\\",2049:\\\"GeogCitationGeoKey\\\",2050:\\\"GeogGeodeticDatumGeoKey\\\",2051:\\\"GeogPrimeMeridianGeoKey\\\",2052:\\\"GeogLinearUnitsGeoKey\\\",2053:\\\"GeogLinearUnitSizeGeoKey\\\",2054:\\\"GeogAngularUnitsGeoKey\\\",2055:\\\"GeogAngularUnitSizeGeoKey\\\",2056:\\\"GeogEllipsoidGeoKey\\\",2057:\\\"GeogSemiMajorAxisGeoKey\\\",2058:\\\"GeogSemiMinorAxisGeoKey\\\",2059:\\\"GeogInvFlatteningGeoKey\\\",2060:\\\"GeogAzimuthUnitsGeoKey\\\",2061:\\\"GeogPrimeMeridianLongGeoKey\\\",2062:\\\"GeogTOWGS84GeoKey\\\",3072:\\\"ProjectedCSTypeGeoKey\\\",3073:\\\"PCSCitationGeoKey\\\",3074:\\\"ProjectionGeoKey\\\",3075:\\\"ProjCoordTransGeoKey\\\",3076:\\\"ProjLinearUnitsGeoKey\\\",3077:\\\"ProjLinearUnitSizeGeoKey\\\",3078:\\\"ProjStdParallel1GeoKey\\\",3079:\\\"ProjStdParallel2GeoKey\\\",3080:\\\"ProjNatOriginLongGeoKey\\\",3081:\\\"ProjNatOriginLatGeoKey\\\",3082:\\\"ProjFalseEastingGeoKey\\\",3083:\\\"ProjFalseNorthingGeoKey\\\",3084:\\\"ProjFalseOriginLongGeoKey\\\",3085:\\\"ProjFalseOriginLatGeoKey\\\",3086:\\\"ProjFalseOriginEastingGeoKey\\\",3087:\\\"ProjFalseOriginNorthingGeoKey\\\",3088:\\\"ProjCenterLongGeoKey\\\",3089:\\\"ProjCenterLatGeoKey\\\",3090:\\\"ProjCenterEastingGeoKey\\\",3091:\\\"ProjCenterNorthingGeoKey\\\",3092:\\\"ProjScaleAtNatOriginGeoKey\\\",3093:\\\"ProjScaleAtCenterGeoKey\\\",3094:\\\"ProjAzimuthAngleGeoKey\\\",3095:\\\"ProjStraightVertPoleLongGeoKey\\\",3096:\\\"ProjRectifiedGridAngleGeoKey\\\",4096:\\\"VerticalCSTypeGeoKey\\\",4097:\\\"VerticalCitationGeoKey\\\",4098:\\\"VerticalDatumGeoKey\\\",4099:\\\"VerticalUnitsGeoKey\\\"},Ee={};for(var se in Qe)Qe.hasOwnProperty(se)&&(Ee[Qe[se]]=parseInt(se,10));function fe(A){var e=function(){if(\\\"undefined\\\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\\\"function\\\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var ce=new Ae,he=function(A){s(t,w);var e=fe(t);function t(A){var i;return B(this,t),(i=e.call(this)).planarConfiguration=void 0!==A.PlanarConfiguration?A.PlanarConfiguration:1,i.samplesPerPixel=void 0!==A.SamplesPerPixel?A.SamplesPerPixel:1,i.addCompression=A.LercParameters[ae],i}return Q(t,[{key:\\\"decodeBlock\\\",value:function(A){switch(this.addCompression){case oe:break;case Be:A=YA(new Uint8Array(A)).buffer;break;case Ce:A=ce.decode(new Uint8Array(A)).buffer;break;default:throw new Error(\\\"Unsupported LERC additional compression method identifier: \\\".concat(this.addCompression))}return zA.decode(A,{returnPixelInterleavedDims:1===this.planarConfiguration}).pixels[0].buffer}}]),t}(),le=Object.freeze({__proto__:null,zstd:ce,default:he});function ue(A){var e=function(){if(\\\"undefined\\\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\\\"function\\\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var t,i=c(A);if(e){var r=c(this).constructor;t=Reflect.construct(i,arguments,r)}else t=i.apply(this,arguments);return f(this,t)}}var we=function(A){s(I,w);var t,i=ue(I);function I(){var A;if(B(this,I),A=i.call(this),\\\"undefined\\\"==typeof createImageBitmap)throw new Error(\\\"Cannot decode WebImage as `createImageBitmap` is not available\\\");if(\\\"undefined\\\"==typeof document&&\\\"undefined\\\"==typeof OffscreenCanvas)throw new Error(\\\"Cannot decode WebImage as neither `document` nor `OffscreenCanvas` is not available\\\");return A}return Q(I,[{key:\\\"decode\\\",value:(t=e(r.mark((function A(e,t){var i,I,g,n;return r.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:return i=new Blob([t]),A.next=3,createImageBitmap(i);case 3:return I=A.sent,\\\"undefined\\\"!=typeof document?((g=document.createElement(\\\"canvas\\\")).width=I.width,g.height=I.height):g=new OffscreenCanvas(I.width,I.height),(n=g.getContext(\\\"2d\\\")).drawImage(I,0,0),A.abrupt(\\\"return\\\",n.getImageData(0,0,I.width,I.height).data.buffer);case 8:case\\\"end\\\":return A.stop()}}),A)}))),function(A,e){return t.apply(this,arguments)})}]),I}(),de=Object.freeze({__proto__:null,default:we});\";\n return new Worker(typeof Buffer !== 'undefined' \n ? 'data:application/javascript;base64,' + Buffer.from(source, 'binary').toString('base64')\n : URL.createObjectURL(new Blob([source], {type: 'application/javascript'})));\n }\n \n"],"file":"assets/geotiff-BaoeLn6q.js"} \ No newline at end of file diff --git a/dist/assets/index-DfnW4iL8.js b/dist/assets/index-BYEiD6vv.js similarity index 60% rename from dist/assets/index-DfnW4iL8.js rename to dist/assets/index-BYEiD6vv.js index ba5dd0e..aee8133 100644 --- a/dist/assets/index-DfnW4iL8.js +++ b/dist/assets/index-BYEiD6vv.js @@ -1,6 +1,6 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pdf-export-BG6jqfsR.js","assets/jspdf-BTK_8o8D.js","assets/openlayers-D8ReJJOp.js","assets/openlayers-BtPuoxOl.css"])))=>i.map(i=>d[i]); -import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as Ce,P as dt,Q as ut,n as pe,U as ke,M as Ro,W as $r,X as ee,Y as Br,S as Gr,G as jr,Z as Ur,o as gt,O as Ee,$ as st,a0 as Lt,a1 as Ae,A as qr,T as ae,a2 as Ie,a3 as No,a4 as le,a5 as $o,e as zr,u as qt,s as Hr,a6 as Bn,a7 as So}from"./openlayers-D8ReJJOp.js";import{M as ft}from"./bootstrap-D1-uvFxm.js";import{o as Wr,a as Kr,b as Xr,c as Vr,d as co,e as Bo,f as rt,g as Yr,h as xe,i as Jr,j as Go}from"./ol-ext-P1ircg-B.js";import{r as Zr}from"./shpjs-iyObTF9J.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const i of a.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function t(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(o){if(o.ep)return;o.ep=!0;const a=t(o);fetch(o.href,a)}})();const jo="function",je="64e10b34-2bf7-4616-9668-f99de5aa046e",Qr="get",ea="has",ta="set",{isArray:Et}=Array;let{SharedArrayBuffer:kt,window:oa}=globalThis,{notify:Gn,wait:jn,waitAsync:It}=Atomics,Un=null;It||(It=n=>({value:new Promise(e=>{let t=new Worker("data:application/javascript,onmessage%3D(%7Bdata%3Ab%7D)%3D%3E(Atomics.wait(b%2C0)%2CpostMessage(0))");t.onmessage=e,t.postMessage(n)})}));try{new kt(4)}catch{kt=ArrayBuffer;const e=new WeakMap;if(oa){const t=new Map,{prototype:{postMessage:r}}=Worker,o=a=>{const i=a.data?.[je];if(!Et(i)){a.stopImmediatePropagation();const{id:s,sb:l}=i;t.get(s)(l)}};Un=function(a,...i){const s=a?.[je];if(Et(s)){const[l,c]=s;e.set(c,l),this.addEventListener("message",o)}return r.call(this,a,...i)},It=a=>({value:new Promise(i=>{t.set(e.get(a),i)}).then(i=>{t.delete(e.get(a)),e.delete(a);for(let s=0;s({[je]:{id:r,sb:o}});Gn=r=>{postMessage(t(e.get(r),r))},addEventListener("message",r=>{const o=r.data?.[je];if(Et(o)){const[a,i]=o;e.set(i,a)}})}}/*! (c) Andrea Giammarchi - ISC */const{Int32Array:uo,Map:Uo,Uint16Array:po}=globalThis,{BYTES_PER_ELEMENT:qo}=uo,{BYTES_PER_ELEMENT:na}=po,ra=(n,e,t)=>{for(;jn(n,0,0,e)==="timed-out";)t()},fo=new WeakSet,zt=new WeakMap,aa={value:{then:n=>n()}};let ia=0;const To=(n,{parse:e=JSON.parse,stringify:t=JSON.stringify,transform:r,interrupt:o}=JSON)=>{if(!zt.has(n)){const a=Un||n.postMessage,i=(p,...f)=>a.call(n,{[je]:f},{transfer:p}),s=typeof o===jo?o:o?.handler,l=o?.delay||42,c=new TextDecoder("utf-16"),d=(p,f)=>p?It(f,0):(s?ra(f,l,s):jn(f,0),aa);let u=!1;zt.set(n,new Proxy(new Uo,{[ea]:(p,f)=>typeof f=="string"&&!f.startsWith("_"),[Qr]:(p,f)=>f==="then"?null:((...h)=>{const y=ia++;let g=new uo(new kt(qo*2)),m=[];fo.has(h.at(-1)||m)&&fo.delete(m=h.pop()),i(m,y,g,f,r?h.map(r):h);const b=n!==globalThis;let _=0;return u&&b&&(_=setTimeout(console.warn,1e3,`💀🔒 - Possible deadlock if proxy.${f}(...args) is awaited`)),d(b,g).value.then(()=>{clearTimeout(_);const S=g[1];if(!S)return;const T=na*S;return g=new uo(new kt(T+T%qo)),i([],y,g),d(b,g).value.then(()=>e(c.decode(new po(g.buffer).slice(0,S))))})}),[ta](p,f,h){const y=typeof h;if(y!==jo)throw new Error(`Unable to assign ${f} as ${y}`);if(!p.size){const g=new Uo;n.addEventListener("message",async m=>{const b=m.data?.[je];if(Et(b)){m.stopImmediatePropagation();const[_,S,...T]=b;let v;if(T.length){const[x,P]=T;if(p.has(x)){u=!0;try{const k=await p.get(x)(...P);if(k!==void 0){const q=t(r?r(k):k);g.set(_,q),S[1]=q.length}}catch(k){v=k}finally{u=!1}}else v=new Error(`Unsupported action: ${x}`);S[0]=1}else{const x=g.get(_);g.delete(_);for(let P=new po(S.buffer),k=0;k(fo.add(n),n);function zo(){let n,e;return{lock:async()=>{for(;n;)await n;n=new Promise(o=>{e=o})},unlock:async()=>{const o=e;n=void 0,e=void 0,o?.()}}}async function qn(n,e){let t;if(n instanceof Blob?t=n.stream():t=n,t instanceof ReadableStream&&e){const o=t.getReader();switch(e){case"callback":return async()=>(await o.read()).value;case"buffer":const a=[];let i=!1;for(;!i;){const d=await o.read();d.value&&a.push(d.value),i=d.done}const s=a.reduce((d,u)=>d+u.length,0),l=new Uint8Array(s);let c=0;return a.forEach(d=>{l.set(d,c),c+=d.length}),l.buffer}}else return t}class Pt{constructor(e){Object.defineProperty(this,"sqlite3InitModule",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"sqlite3",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"db",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pointers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"writeCallbacks",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"storageType",{enumerable:!0,configurable:!0,writable:!0,value:"memory"})}async init(e){const{databasePath:t}=e,r=this.getFlags(e);if(!this.sqlite3InitModule){const{default:o}=await Rt(async()=>{const{default:a}=await import("./index-DTMgZTfd.js");return{default:a}},[]);this.sqlite3InitModule=o}this.sqlite3||(this.sqlite3=await this.sqlite3InitModule()),this.db&&await this.destroy(),this.db=new this.sqlite3.oo1.DB(t,r),this.config=e,this.initWriteHook()}onWrite(e){return this.writeCallbacks.add(e),()=>{this.writeCallbacks.delete(e)}}async exec(e){if(!this.db)throw new Error("Driver not initialized");return this.execOnDb(this.db,e)}async execBatch(e){if(!this.db)throw new Error("Driver not initialized");const t=[];return this.db.transaction(r=>{const o=new Map;try{for(let a of e){let i=o.get(a.sql);if(!i){const c=r.prepare(a.sql);o.set(a.sql,c),i=c}a.params?.length&&i.bind(a.params);let s=[],l=[];for(;i.step();)s=i.getColumnNames([]),l.push(i.get([]));t.push({columns:s,rows:l}),i.reset()}}finally{o.forEach(a=>{a.finalize()})}}),t}async isDatabasePersisted(){return!1}async getDatabaseSizeBytes(){const t=(await this.exec({sql:`SELECT page_count * page_size AS size - FROM pragma_page_count(), pragma_page_size()`,method:"get"}))?.rows?.[0];if(typeof t!="number")throw new Error("Failed to query database size");return t}async createFunction(e){if(!this.db)throw new Error("Driver not initialized");switch(e.type){case"callback":case"scalar":this.db.createFunction({name:e.name,xFunc:(t,...r)=>e.func(...r),arity:-1});break;case"aggregate":this.db.createFunction({name:e.name,xStep:(t,...r)=>e.func.step(...r),xFinal:(t,...r)=>e.func.final(...r),arity:-1});break}}async import(e){if(!this.sqlite3||!this.db||!this.config)throw new Error("Driver not initialized");const t=await qn(e,"buffer"),r=this.sqlite3.wasm.allocFromTypedArray(t);this.pointers.push(r);const o=this.sqlite3.capi.sqlite3_deserialize(this.db,"main",r,t.byteLength,t.byteLength,this.config.readOnly?this.sqlite3.capi.SQLITE_DESERIALIZE_READONLY:this.sqlite3.capi.SQLITE_DESERIALIZE_RESIZEABLE);this.db.checkRc(o)}async export(){if(!this.sqlite3||!this.db)throw new Error("Driver not initialized");return{name:"database.sqlite3",data:this.sqlite3.capi.sqlite3_js_db_export(this.db)}}async clear(){}async destroy(){this.closeDb(),this.pointers.forEach(e=>this.sqlite3?.wasm.dealloc(e)),this.pointers=[],this.writeCallbacks.clear()}getFlags(e){const{readOnly:t,verbose:r}=e;return[t===!0?"r":"cw",r===!0?"t":""].join("")}execOnDb(e,t){const r={rows:[],columns:[]},o=e.exec({sql:t.sql,bind:t.params,returnValue:"resultRows",rowMode:"array",columnNames:r.columns});switch(t.method){case"run":break;case"get":r.rows=o[0]??[];break;case"all":default:r.rows=o;break}return r}initWriteHook(){if(!this.config?.reactive)return;if(!this.sqlite3||!this.db)throw new Error("Driver not initialized");const e={[this.sqlite3.capi.SQLITE_INSERT]:"insert",[this.sqlite3.capi.SQLITE_UPDATE]:"update",[this.sqlite3.capi.SQLITE_DELETE]:"delete"};this.sqlite3.capi.sqlite3_update_hook(this.db,(t,r,o,a,i)=>{this.writeCallbacks.forEach(s=>{s({table:a,rowid:i,operation:e[r]})})},0)}closeDb(){this.db&&(this.db.close(),this.db=void 0)}}function sa(n,e,t){let r,o,a,i,s,l,c=0,d=!1,u=!1,p=!0;if(typeof n!="function")throw new TypeError("Expected a function");e=Number(e)||0,typeof t=="object"&&t!==null&&(d=!!t.leading,u="maxWait"in t,a=u?Math.max(Number(t.maxWait)||0,e):0,p="trailing"in t?!!t.trailing:p);function f(v){const x=r,P=o;return r=o=void 0,c=v,i=n.apply(P,x),i}function h(v){return c=v,s=setTimeout(m,e),d?f(v):i}function y(v){const x=v-(l??0),P=v-c,k=e-x;return u?Math.min(k,a-P):k}function g(v){const x=v-(l??0),P=v-c;return l===void 0||x>=e||x<0||u&&P>=a}function m(){const v=Date.now();if(g(v))return b(v);s=setTimeout(m,y(v))}function b(v){return s=void 0,p&&r?f(v):(r=o=void 0,i)}function _(){s!==void 0&&clearTimeout(s),c=0,r=l=o=s=void 0}function S(){return s===void 0?i:b(Date.now())}function T(){const v=Date.now(),x=g(v);if(r=arguments,o=this,l=v,x){if(s===void 0)return h(l);if(u)return s=setTimeout(m,e),f(l)}return s===void 0&&(s=setTimeout(m,e)),i}return T.cancel=_,T.flush=S,T}function xt(){return crypto.randomUUID()}function zn(n,e){switch(n){case"session":case":sessionStorage:":let t=sessionStorage._sqlocal_session_key;return t||(t=xt(),sessionStorage._sqlocal_session_key=t),`session:${t}`;case"local":case":localStorage:":return"local";case":memory:":return`memory:${e}`;default:return`path:${n}`}}class mt{constructor(e){Object.defineProperty(this,"driver",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"userFunctions",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"initMutex",{enumerable:!0,configurable:!0,writable:!0,value:zo()}),Object.defineProperty(this,"transactionMutex",{enumerable:!0,configurable:!0,writable:!0,value:zo()}),Object.defineProperty(this,"transactionKey",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"proxy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dirtyTables",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"effectsChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reinitChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onmessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{if(!(!this.config.databasePath||!this.config.clientKey)){await this.initMutex.lock();try{try{await this.driver.init(this.config)}catch{console.warn(`Persistence failed, so ${this.config.databasePath} will not be saved. For origin private file system persistence, make sure your web server is configured to use the correct HTTP response headers (See https://sqlocal.dev/guide/setup#cross-origin-isolation).`),this.config.databasePath=":memory:",this.driver=new Pt,await this.driver.init(this.config)}const a=zn(this.config.databasePath,this.config.clientKey);this.reinitChannel=new BroadcastChannel(`_sqlocal_reinit_(${a})`),this.reinitChannel.onmessage=i=>{const s=i.data;if(this.config.clientKey!==s.clientKey)switch(s.type){case"reinit":this.init(s.reason);break;case"close":this.driver.destroy();break}},this.config.reactive&&(this.effectsChannel=new BroadcastChannel(`_sqlocal_effects_(${a})`),this.driver.onWrite(async i=>{this.dirtyTables.add(i.table),await this.transactionMutex.lock(),this.emitEffectsDebounced(),await this.transactionMutex.unlock()})),await Promise.all(Array.from(this.userFunctions.values()).map(i=>this.initUserFunction(i))),await this.execInitStatements(),this.emitMessage({type:"event",event:"connect",reason:o})}catch(a){this.emitMessage({type:"error",error:a,queryKey:null}),await this.destroy()}finally{await this.initMutex.unlock()}}}}),Object.defineProperty(this,"postMessage",{enumerable:!0,configurable:!0,writable:!0,value:async(o,a)=>{const i=o instanceof MessageEvent?o.data:o;switch(await this.initMutex.lock(),i.type){case"config":this.editConfig(i);break;case"query":case"batch":case"transaction":this.exec(i);break;case"function":this.createUserFunction(i);break;case"getinfo":this.getDatabaseInfo(i);break;case"import":this.importDb(i);break;case"export":this.exportDb(i);break;case"delete":this.deleteDb(i);break;case"destroy":this.destroy(i);break}await this.initMutex.unlock()}}),Object.defineProperty(this,"emitMessage",{enumerable:!0,configurable:!0,writable:!0,value:(o,a=[])=>{this.onmessage&&this.onmessage(o,a)}}),Object.defineProperty(this,"emitEffects",{enumerable:!0,configurable:!0,writable:!0,value:()=>{!this.effectsChannel||this.dirtyTables.size===0||(this.effectsChannel.postMessage({type:"effects",tables:[...this.dirtyTables]}),this.dirtyTables.clear())}}),Object.defineProperty(this,"emitEffectsDebounced",{enumerable:!0,configurable:!0,writable:!0,value:sa(()=>this.emitEffects(),32,{maxWait:180})}),Object.defineProperty(this,"editConfig",{enumerable:!0,configurable:!0,writable:!0,value:o=>{this.config=o.config,this.init("initial")}}),Object.defineProperty(this,"exec",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{try{const a={type:"data",queryKey:o.queryKey,data:[]};switch(o.type){case"query":const i=this.transactionKey!==null&&this.transactionKey===o.transactionKey;try{i||await this.transactionMutex.lock();const s=await this.driver.exec(o);a.data.push(s)}finally{i||await this.transactionMutex.unlock()}break;case"batch":try{await this.transactionMutex.lock();const s=await this.driver.execBatch(o.statements);a.data.push(...s)}finally{await this.transactionMutex.unlock()}break;case"transaction":if(o.action==="begin"&&(await this.transactionMutex.lock(),this.transactionKey=o.transactionKey,await this.driver.exec({sql:"BEGIN"})),(o.action==="commit"||o.action==="rollback")&&this.transactionKey!==null&&this.transactionKey===o.transactionKey){const s=o.action==="commit"?"COMMIT":"ROLLBACK";await this.driver.exec({sql:s}),this.transactionKey=null,await this.transactionMutex.unlock()}break}this.emitMessage(a)}catch(a){this.emitMessage({type:"error",error:a,queryKey:o.queryKey})}}}),Object.defineProperty(this,"execInitStatements",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{if(this.config.onInitStatements)for(let o of this.config.onInitStatements)await this.driver.exec(o)}}),Object.defineProperty(this,"getDatabaseInfo",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{try{this.emitMessage({type:"info",queryKey:o.queryKey,info:{databasePath:this.config.databasePath,storageType:this.driver.storageType,databaseSizeBytes:await this.driver.getDatabaseSizeBytes(),persisted:await this.driver.isDatabasePersisted()}})}catch(a){this.emitMessage({type:"error",queryKey:o.queryKey,error:a})}}}),Object.defineProperty(this,"createUserFunction",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{functionName:a,functionType:i,queryKey:s}=o;let l;if(this.userFunctions.has(a)){this.emitMessage({type:"error",error:new Error(`A user-defined function with the name "${a}" has already been created for this SQLocal instance.`),queryKey:s});return}switch(i){case"callback":l={type:i,name:a,func:(...c)=>{this.emitMessage({type:"callback",name:a,args:c})}};break;case"scalar":l={type:i,name:a,func:this.proxy[`_sqlocal_func_${a}`]};break;case"aggregate":l={type:i,name:a,func:{step:this.proxy[`_sqlocal_func_${a}_step`],final:this.proxy[`_sqlocal_func_${a}_final`]}};break}try{await this.initUserFunction(l),this.emitMessage({type:"success",queryKey:s})}catch(c){this.emitMessage({type:"error",error:c,queryKey:s})}}}),Object.defineProperty(this,"initUserFunction",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{await this.driver.createFunction(o),this.userFunctions.set(o.name,o)}}),Object.defineProperty(this,"importDb",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{queryKey:a,database:i}=o;let s=!1;try{await this.driver.import(i),this.driver.storageType==="memory"&&await this.execInitStatements()}catch(l){this.emitMessage({type:"error",error:l,queryKey:a}),s=!0}finally{this.driver.storageType!=="memory"&&await this.init("overwrite")}s||this.emitMessage({type:"success",queryKey:a})}}),Object.defineProperty(this,"exportDb",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{queryKey:a}=o;try{const{name:i,data:s}=await this.driver.export();this.emitMessage({type:"buffer",queryKey:a,bufferName:i,buffer:s},[s])}catch(i){this.emitMessage({type:"error",error:i,queryKey:a})}}}),Object.defineProperty(this,"deleteDb",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{queryKey:a}=o;let i=!1;try{await this.driver.clear()}catch(s){this.emitMessage({type:"error",error:s,queryKey:a}),i=!0}finally{await this.init("delete")}i||this.emitMessage({type:"success",queryKey:a})}}),Object.defineProperty(this,"destroy",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{await this.driver.exec({sql:"PRAGMA optimize"}),await this.driver.destroy(),this.effectsChannel&&(this.emitEffectsDebounced.flush(),this.effectsChannel.close(),this.effectsChannel=void 0),this.reinitChannel&&(this.reinitChannel.close(),this.reinitChannel=void 0),o&&this.emitMessage({type:"success",queryKey:o.queryKey})}});const r=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope?To(globalThis):globalThis;this.proxy=r,this.driver=e}}function Mt(n,...e){return{sql:n.join("?"),params:e}}function la(n){return!n.some(e=>!Array.isArray(e))}function Ht(n,e){let t;return la(n)?t=n:t=[n],t.map(r=>{const o={};return e.forEach((a,i)=>{o[a]=r[i]}),o})}function ca(n){return typeof n=="object"&&n!==null&&"getSQL"in n&&typeof n.getSQL=="function"}function da(n){return typeof n=="object"&&n!==null&&"sql"in n&&typeof n.sql=="string"&&"params"in n}function Ho(n){if(typeof n=="function"&&(n=n(Mt)),ca(n))try{if(!("toSQL"in n&&typeof n.toSQL=="function"))throw 1;const r=n.toSQL();if(!da(r))throw 2;const o="all"in n&&typeof n.all=="function"?n.all:void 0;return{...r,exec:o?()=>o():void 0}}catch{throw new Error("The passed statement could not be parsed.")}const e=n.sql;let t=[];return"params"in n?t=n.params:"parameters"in n&&(t=n.parameters),{sql:e,params:t}}function Wo(n,e){let t;return typeof n=="string"?t={sql:n,params:e}:t=Mt(n,...e),t}async function yt(n,e,t,r){return!e&&"locks"in navigator?navigator.locks.request(`_sqlocal_mutation_(${t.databasePath})`,{mode:n},r):r()}class Ko extends Pt{constructor(e,t){super(t),Object.defineProperty(this,"storageType",{enumerable:!0,configurable:!0,writable:!0,value:e})}async init(e){const t=this.getFlags(e);if(e.readOnly)throw new Error(`SQLite storage type "${this.storageType}" does not support read-only mode.`);if(!this.sqlite3InitModule){const{default:r}=await Rt(async()=>{const{default:o}=await import("./index-DTMgZTfd.js");return{default:o}},[]);this.sqlite3InitModule=r}this.sqlite3||(this.sqlite3=await this.sqlite3InitModule()),this.db&&await this.destroy(),this.db=new this.sqlite3.oo1.JsStorageDb({filename:this.storageType,flags:t}),this.config=e,this.initWriteHook()}async isDatabasePersisted(){return navigator.storage?.persisted()}async getDatabaseSizeBytes(){if(!this.db)throw new Error("Driver not initialized");return this.db.storageSize()}async import(e){const t=new Pt;await t.init({}),await t.import(e),await this.clear(),await t.exec({sql:`VACUUM INTO 'file:${this.storageType}?vfs=kvvfs'`}),await t.destroy()}async clear(){if(!this.db)throw new Error("Driver not initialized");this.db.clearStorage()}async destroy(){this.closeDb(),this.writeCallbacks.clear()}}var Hn,Wn;class ua{constructor(e){Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientKey",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"processor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isDestroyed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"bypassMutationLock",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"transactionQueryKeyQueue",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"userCallbacks",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"queriesInProgress",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"proxy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reinitChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"effectsChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"processMessageEvent",{enumerable:!0,configurable:!0,writable:!0,value:c=>{const d=c instanceof MessageEvent?c.data:c,u=this.queriesInProgress;switch(d.type){case"success":case"data":case"buffer":case"info":case"error":if(d.queryKey&&u.has(d.queryKey)){const[f,h]=u.get(d.queryKey);d.type==="error"?h(d.error):f(d),u.delete(d.queryKey)}else if(d.type==="error")throw d.error;break;case"callback":const p=this.userCallbacks.get(d.name);p&&p(...d.args??[]);break;case"event":this.config.onConnect?.(d.reason);break}}}),Object.defineProperty(this,"createQuery",{enumerable:!0,configurable:!0,writable:!0,value:async c=>yt("shared",this.bypassMutationLock||c.type==="import"||c.type==="delete",this.config,async()=>{if(this.isDestroyed===!0)throw new Error("This SQLocal client has been destroyed. You will need to initialize a new client in order to make further queries.");const d=xt();switch(c.type){case"import":this.processor.postMessage({...c,queryKey:d},[c.database]);break;default:this.processor.postMessage({...c,queryKey:d});break}return new Promise((u,p)=>{this.queriesInProgress.set(d,[u,p])})})}),Object.defineProperty(this,"broadcast",{enumerable:!0,configurable:!0,writable:!0,value:c=>{this.reinitChannel.postMessage(c)}}),Object.defineProperty(this,"exec",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d,u="all",p)=>{const f=await this.createQuery({type:"query",transactionKey:p,sql:c,params:d,method:u}),h={rows:[],columns:[]};return f.type==="data"&&(h.rows=f.data[0]?.rows??[],h.columns=f.data[0]?.columns??[]),h}}),Object.defineProperty(this,"execBatch",{enumerable:!0,configurable:!0,writable:!0,value:async c=>{const d=await this.createQuery({type:"batch",statements:c}),u=new Array(c.length).fill({rows:[],columns:[]});return d.type==="data"&&d.data.forEach((p,f)=>{u[f]=p}),u}}),Object.defineProperty(this,"sql",{enumerable:!0,configurable:!0,writable:!0,value:async(c,...d)=>{const u=Wo(c,d),{rows:p,columns:f}=await this.exec(u.sql,u.params,"all");return Ht(p,f)}}),Object.defineProperty(this,"batch",{enumerable:!0,configurable:!0,writable:!0,value:async c=>{const d=c(Mt);return(await this.execBatch(d)).map(({rows:p,columns:f})=>Ht(p,f))}}),Object.defineProperty(this,"beginTransaction",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{const c=xt();await this.createQuery({type:"transaction",transactionKey:c,action:"begin"});const d=async h=>{const y=Ho(h);if(y.exec)return this.transactionQueryKeyQueue.push(c),y.exec();const{rows:g,columns:m}=await this.exec(y.sql,y.params,"all",c);return Ht(g,m)};return{query:d,sql:async(h,...y)=>{const g=Wo(h,y);return await d(g)},commit:async()=>{await this.createQuery({type:"transaction",transactionKey:c,action:"commit"})},rollback:async()=>{await this.createQuery({type:"transaction",transactionKey:c,action:"rollback"})}}}}),Object.defineProperty(this,"transaction",{enumerable:!0,configurable:!0,writable:!0,value:async c=>yt("exclusive",!1,this.config,async()=>{let d;this.bypassMutationLock=!0;try{d=await this.beginTransaction();const u=await c({sql:d.sql,query:d.query});return await d.commit(),u}catch(u){throw await d?.rollback(),u}finally{this.bypassMutationLock=!1}})}),Object.defineProperty(this,"reactiveQuery",{enumerable:!0,configurable:!0,writable:!0,value:c=>{let d=[],u=!1,p=!1,f=0;const h=Ho(c),y=new Set,g=new Set,m=new Set,b=async()=>{try{const S=++f;if(y.size===0){const v=await this.sql("SELECT name, wr FROM tables_used(?) WHERE type = 'table'",h.sql),x=new Set,P=new Set;if(v.forEach(k=>{typeof k.name=="string"&&(k.wr?P.add(k.name):x.add(k.name))}),x.size===0)throw new Error("The passed SQL does not read any tables.");if(Array.from(P).some(k=>x.has(k)))throw new Error("The passed SQL would mutate one or more of the tables that it reads. Doing this in a reactive query would create an infinite loop.");x.forEach(k=>y.add(k))}const T=h.exec?await h.exec():await this.sql(h.sql,...h.params);S===f&&(d=T,u=!0,g.forEach(v=>v(d)))}catch(S){m.forEach(T=>{T(S instanceof Error?S:new Error(String(S)))})}},_=S=>{S.data.tables.some(T=>y.has(T))&&b()};return{get value(){return d},subscribe:(S,T)=>{if(!this.effectsChannel)throw new Error('This SQLocal instance is not configured for reactive queries. Set the "reactive" option to enable them.');return T||(T=v=>{throw v}),g.add(S),m.add(T),p?u&&S(d):(this.effectsChannel.addEventListener("message",_),p=!0,b()),{unsubscribe:()=>{g.delete(S),m.delete(T),g.size===0&&(this.effectsChannel?.removeEventListener("message",_),p=!1)}}}}}}),Object.defineProperty(this,"createCallbackFunction",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{await this.createQuery({type:"function",functionName:c,functionType:"callback"}),this.userCallbacks.set(c,d)}}),Object.defineProperty(this,"createScalarFunction",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{const u=`_sqlocal_func_${c}`,p=()=>{this.proxy[u]=d};this.proxy===globalThis&&p(),await this.createQuery({type:"function",functionName:c,functionType:"scalar"}),this.proxy!==globalThis&&p()}}),Object.defineProperty(this,"createAggregateFunction",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{const u=`_sqlocal_func_${c}`,p=()=>{this.proxy[`${u}_step`]=d.step,this.proxy[`${u}_final`]=d.final};this.proxy===globalThis&&p(),await this.createQuery({type:"function",functionName:c,functionType:"aggregate"}),this.proxy!==globalThis&&p()}}),Object.defineProperty(this,"getDatabaseInfo",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{const c=await this.createQuery({type:"getinfo"});if(c.type==="info")return c.info;throw new Error("The database failed to return valid information.")}}),Object.defineProperty(this,"getDatabaseFile",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{const c=await this.createQuery({type:"export"});if(c.type==="buffer")return new File([c.buffer],c.bufferName,{type:"application/x-sqlite3"});throw new Error("The database failed to export.")}}),Object.defineProperty(this,"overwriteDatabaseFile",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{await yt("exclusive",!1,this.config,async()=>{try{this.broadcast({type:"close",clientKey:this.clientKey});const u=await qn(c,"buffer");await this.createQuery({type:"import",database:u}),typeof d=="function"&&(this.bypassMutationLock=!0,await d()),this.broadcast({type:"reinit",clientKey:this.clientKey,reason:"overwrite"})}finally{this.bypassMutationLock=!1}})}}),Object.defineProperty(this,"deleteDatabaseFile",{enumerable:!0,configurable:!0,writable:!0,value:async c=>{await yt("exclusive",!1,this.config,async()=>{try{this.broadcast({type:"close",clientKey:this.clientKey}),await this.createQuery({type:"delete"}),typeof c=="function"&&(this.bypassMutationLock=!0,await c()),this.broadcast({type:"reinit",clientKey:this.clientKey,reason:"delete"})}finally{this.bypassMutationLock=!1}})}}),Object.defineProperty(this,"destroy",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{await this.createQuery({type:"destroy"}),typeof globalThis.Worker<"u"&&this.processor instanceof Worker&&(this.processor.removeEventListener("message",this.processMessageEvent),this.processor.terminate()),this.queriesInProgress.clear(),this.userCallbacks.clear(),this.reinitChannel.close(),this.effectsChannel?.close(),this.isDestroyed=!0}}),Object.defineProperty(this,Hn,{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.destroy()}}),Object.defineProperty(this,Wn,{enumerable:!0,configurable:!0,writable:!0,value:async()=>{await this.destroy()}});const t=typeof e=="string"?{databasePath:e}:e,{onInit:r,onConnect:o,processor:a,...i}=t,{databasePath:s}=i;this.config=t,this.clientKey=xt();const l=zn(s,this.clientKey);if(this.reinitChannel=new BroadcastChannel(`_sqlocal_reinit_(${l})`),i.reactive&&(this.effectsChannel=new BroadcastChannel(`_sqlocal_effects_(${l})`)),typeof a<"u")this.processor=a;else if(s==="local"||s===":localStorage:"){const c=new Ko("local");this.processor=new mt(c)}else if(s==="session"||s===":sessionStorage:"){const c=new Ko("session");this.processor=new mt(c)}else if(typeof globalThis.Worker<"u"&&s!==":memory:")this.processor=new Worker(new URL("/assets/worker-CuIBOSaM.js",import.meta.url),{type:"module"});else{const c=new Pt;this.processor=new mt(c)}this.processor instanceof mt?(this.processor.onmessage=c=>this.processMessageEvent(c),this.proxy=globalThis):(this.processor.addEventListener("message",this.processMessageEvent),this.proxy=To(this.processor)),this.processor.postMessage({type:"config",config:{...i,clientKey:this.clientKey,onInitStatements:r?.(Mt)??[]}})}}Hn=Symbol.dispose,Wn=Symbol.asyncDispose;const Lo="lupmis2.db",pa="lupmis-db-sync",Kn=new ua(Lo),{sql:w}=Kn;console.log("[Database] SQLocal instance created for:",Lo);const Xn=new BroadcastChannel(pa);let Vn=!1,Yn,Jn;const Xo=new Promise((n,e)=>{Yn=n,Jn=e}),Ct=new Set;function fa(n){return Ct.add(n),()=>Ct.delete(n)}Xn.onmessage=n=>{const{type:e,payload:t}=n.data;if(e==="DB_CHANGE")for(const r of Ct)try{r(t)}catch(o){console.error("[Database] Change listener error:",o)}};function Y(n,e,t=null){Xn.postMessage({type:"DB_CHANGE",payload:{table:n,action:e,id:t,timestamp:Date.now()}});for(const r of Ct)try{r({table:n,action:e,id:t,timestamp:Date.now(),local:!0})}catch(o){console.error("[Database] Change listener error:",o)}}async function ha(){try{console.log("[Database] Initializing schema...");const n=await w`SELECT sqlite_version() as version`;console.log("[Database] SQLite version:",n[0]?.version),console.log("[Database] Creating locations table..."),await w` +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/geotiff-BaoeLn6q.js","assets/openlayers-J9qS6Th1.js","assets/openlayers-BtPuoxOl.css","assets/pako-Xa-UToif.js","assets/pdf-export-BONdNTHD.js","assets/jspdf-FJgf4ijI.js","assets/shpjs-Doisr2ug.js","assets/analysis-modal-CYhcFxIW.js","assets/bootstrap-D1-uvFxm.js","assets/bootstrap-BtmJYOxZ.css","assets/turf-B-0GbNlN.js","assets/ol-ext-C5frl4dY.js","assets/ol-ext-BgKrOIxx.css"])))=>i.map(i=>d[i]); +import{_ as Le}from"./geotiff-BaoeLn6q.js";import{M as ht}from"./bootstrap-D1-uvFxm.js";import{h as M,F as A,j as I,k as fe,m as xo,b as j,V as O,L as he,D as Fe,P as ut,ak as pt,n as pe,al as Pe,M as Ro,am as $r,an as ee,ao as Br,S as Gr,J as jr,G as Ur,ap as zr,aq as qr,ar as Hr,o as mt,O as Ee,as as lt,at as kt,au as Oe,A as Wr,T as ae,av as Me,aw as No,ax as le,ay as $o,e as Kr,u as zt,s as Vr,az as Bn,aA as So}from"./openlayers-J9qS6Th1.js";import{o as Xr,a as Yr,b as Jr,c as Zr,d as co,e as Bo,f as at,g as Qr,h as xe,i as ea,j as Go}from"./ol-ext-C5frl4dY.js";import{r as ta}from"./shpjs-Doisr2ug.js";import"./pako-Xa-UToif.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const i of a.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function t(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(o){if(o.ep)return;o.ep=!0;const a=t(o);fetch(o.href,a)}})();const jo="function",ze="64e10b34-2bf7-4616-9668-f99de5aa046e",oa="get",na="has",ra="set",{isArray:xt}=Array;let{SharedArrayBuffer:It,window:aa}=globalThis,{notify:Gn,wait:jn,waitAsync:Pt}=Atomics,Un=null;Pt||(Pt=n=>({value:new Promise(e=>{let t=new Worker("data:application/javascript,onmessage%3D(%7Bdata%3Ab%7D)%3D%3E(Atomics.wait(b%2C0)%2CpostMessage(0))");t.onmessage=e,t.postMessage(n)})}));try{new It(4)}catch{It=ArrayBuffer;const e=new WeakMap;if(aa){const t=new Map,{prototype:{postMessage:r}}=Worker,o=a=>{const i=a.data?.[ze];if(!xt(i)){a.stopImmediatePropagation();const{id:s,sb:l}=i;t.get(s)(l)}};Un=function(a,...i){const s=a?.[ze];if(xt(s)){const[l,c]=s;e.set(c,l),this.addEventListener("message",o)}return r.call(this,a,...i)},Pt=a=>({value:new Promise(i=>{t.set(e.get(a),i)}).then(i=>{t.delete(e.get(a)),e.delete(a);for(let s=0;s({[ze]:{id:r,sb:o}});Gn=r=>{postMessage(t(e.get(r),r))},addEventListener("message",r=>{const o=r.data?.[ze];if(xt(o)){const[a,i]=o;e.set(i,a)}})}}/*! (c) Andrea Giammarchi - ISC */const{Int32Array:uo,Map:Uo,Uint16Array:po}=globalThis,{BYTES_PER_ELEMENT:zo}=uo,{BYTES_PER_ELEMENT:ia}=po,sa=(n,e,t)=>{for(;jn(n,0,0,e)==="timed-out";)t()},fo=new WeakSet,qt=new WeakMap,la={value:{then:n=>n()}};let ca=0;const Lo=(n,{parse:e=JSON.parse,stringify:t=JSON.stringify,transform:r,interrupt:o}=JSON)=>{if(!qt.has(n)){const a=Un||n.postMessage,i=(f,...p)=>a.call(n,{[ze]:p},{transfer:f}),s=typeof o===jo?o:o?.handler,l=o?.delay||42,c=new TextDecoder("utf-16"),d=(f,p)=>f?Pt(p,0):(s?sa(p,l,s):jn(p,0),la);let u=!1;qt.set(n,new Proxy(new Uo,{[na]:(f,p)=>typeof p=="string"&&!p.startsWith("_"),[oa]:(f,p)=>p==="then"?null:((...h)=>{const m=ca++;let g=new uo(new It(zo*2)),y=[];fo.has(h.at(-1)||y)&&fo.delete(y=h.pop()),i(y,m,g,p,r?h.map(r):h);const w=n!==globalThis;let _=0;return u&&w&&(_=setTimeout(console.warn,1e3,`💀🔒 - Possible deadlock if proxy.${p}(...args) is awaited`)),d(w,g).value.then(()=>{clearTimeout(_);const x=g[1];if(!x)return;const L=ia*x;return g=new uo(new It(L+L%zo)),i([],m,g),d(w,g).value.then(()=>e(c.decode(new po(g.buffer).slice(0,x))))})}),[ra](f,p,h){const m=typeof h;if(m!==jo)throw new Error(`Unable to assign ${p} as ${m}`);if(!f.size){const g=new Uo;n.addEventListener("message",async y=>{const w=y.data?.[ze];if(xt(w)){y.stopImmediatePropagation();const[_,x,...L]=w;let v;if(L.length){const[S,P]=L;if(f.has(S)){u=!0;try{const k=await f.get(S)(...P);if(k!==void 0){const z=t(r?r(k):k);g.set(_,z),x[1]=z.length}}catch(k){v=k}finally{u=!1}}else v=new Error(`Unsupported action: ${S}`);x[0]=1}else{const S=g.get(_);g.delete(_);for(let P=new po(x.buffer),k=0;k(fo.add(n),n);function qo(){let n,e;return{lock:async()=>{for(;n;)await n;n=new Promise(o=>{e=o})},unlock:async()=>{const o=e;n=void 0,e=void 0,o?.()}}}async function zn(n,e){let t;if(n instanceof Blob?t=n.stream():t=n,t instanceof ReadableStream&&e){const o=t.getReader();switch(e){case"callback":return async()=>(await o.read()).value;case"buffer":const a=[];let i=!1;for(;!i;){const d=await o.read();d.value&&a.push(d.value),i=d.done}const s=a.reduce((d,u)=>d+u.length,0),l=new Uint8Array(s);let c=0;return a.forEach(d=>{l.set(d,c),c+=d.length}),l.buffer}}else return t}class Mt{constructor(e){Object.defineProperty(this,"sqlite3InitModule",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"sqlite3",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"db",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pointers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"writeCallbacks",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"storageType",{enumerable:!0,configurable:!0,writable:!0,value:"memory"})}async init(e){const{databasePath:t}=e,r=this.getFlags(e);if(!this.sqlite3InitModule){const{default:o}=await Le(async()=>{const{default:a}=await import("./index-DTMgZTfd.js");return{default:a}},[]);this.sqlite3InitModule=o}this.sqlite3||(this.sqlite3=await this.sqlite3InitModule()),this.db&&await this.destroy(),this.db=new this.sqlite3.oo1.DB(t,r),this.config=e,this.initWriteHook()}onWrite(e){return this.writeCallbacks.add(e),()=>{this.writeCallbacks.delete(e)}}async exec(e){if(!this.db)throw new Error("Driver not initialized");return this.execOnDb(this.db,e)}async execBatch(e){if(!this.db)throw new Error("Driver not initialized");const t=[];return this.db.transaction(r=>{const o=new Map;try{for(let a of e){let i=o.get(a.sql);if(!i){const c=r.prepare(a.sql);o.set(a.sql,c),i=c}a.params?.length&&i.bind(a.params);let s=[],l=[];for(;i.step();)s=i.getColumnNames([]),l.push(i.get([]));t.push({columns:s,rows:l}),i.reset()}}finally{o.forEach(a=>{a.finalize()})}}),t}async isDatabasePersisted(){return!1}async getDatabaseSizeBytes(){const t=(await this.exec({sql:`SELECT page_count * page_size AS size + FROM pragma_page_count(), pragma_page_size()`,method:"get"}))?.rows?.[0];if(typeof t!="number")throw new Error("Failed to query database size");return t}async createFunction(e){if(!this.db)throw new Error("Driver not initialized");switch(e.type){case"callback":case"scalar":this.db.createFunction({name:e.name,xFunc:(t,...r)=>e.func(...r),arity:-1});break;case"aggregate":this.db.createFunction({name:e.name,xStep:(t,...r)=>e.func.step(...r),xFinal:(t,...r)=>e.func.final(...r),arity:-1});break}}async import(e){if(!this.sqlite3||!this.db||!this.config)throw new Error("Driver not initialized");const t=await zn(e,"buffer"),r=this.sqlite3.wasm.allocFromTypedArray(t);this.pointers.push(r);const o=this.sqlite3.capi.sqlite3_deserialize(this.db,"main",r,t.byteLength,t.byteLength,this.config.readOnly?this.sqlite3.capi.SQLITE_DESERIALIZE_READONLY:this.sqlite3.capi.SQLITE_DESERIALIZE_RESIZEABLE);this.db.checkRc(o)}async export(){if(!this.sqlite3||!this.db)throw new Error("Driver not initialized");return{name:"database.sqlite3",data:this.sqlite3.capi.sqlite3_js_db_export(this.db)}}async clear(){}async destroy(){this.closeDb(),this.pointers.forEach(e=>this.sqlite3?.wasm.dealloc(e)),this.pointers=[],this.writeCallbacks.clear()}getFlags(e){const{readOnly:t,verbose:r}=e;return[t===!0?"r":"cw",r===!0?"t":""].join("")}execOnDb(e,t){const r={rows:[],columns:[]},o=e.exec({sql:t.sql,bind:t.params,returnValue:"resultRows",rowMode:"array",columnNames:r.columns});switch(t.method){case"run":break;case"get":r.rows=o[0]??[];break;case"all":default:r.rows=o;break}return r}initWriteHook(){if(!this.config?.reactive)return;if(!this.sqlite3||!this.db)throw new Error("Driver not initialized");const e={[this.sqlite3.capi.SQLITE_INSERT]:"insert",[this.sqlite3.capi.SQLITE_UPDATE]:"update",[this.sqlite3.capi.SQLITE_DELETE]:"delete"};this.sqlite3.capi.sqlite3_update_hook(this.db,(t,r,o,a,i)=>{this.writeCallbacks.forEach(s=>{s({table:a,rowid:i,operation:e[r]})})},0)}closeDb(){this.db&&(this.db.close(),this.db=void 0)}}function da(n,e,t){let r,o,a,i,s,l,c=0,d=!1,u=!1,f=!0;if(typeof n!="function")throw new TypeError("Expected a function");e=Number(e)||0,typeof t=="object"&&t!==null&&(d=!!t.leading,u="maxWait"in t,a=u?Math.max(Number(t.maxWait)||0,e):0,f="trailing"in t?!!t.trailing:f);function p(v){const S=r,P=o;return r=o=void 0,c=v,i=n.apply(P,S),i}function h(v){return c=v,s=setTimeout(y,e),d?p(v):i}function m(v){const S=v-(l??0),P=v-c,k=e-S;return u?Math.min(k,a-P):k}function g(v){const S=v-(l??0),P=v-c;return l===void 0||S>=e||S<0||u&&P>=a}function y(){const v=Date.now();if(g(v))return w(v);s=setTimeout(y,m(v))}function w(v){return s=void 0,f&&r?p(v):(r=o=void 0,i)}function _(){s!==void 0&&clearTimeout(s),c=0,r=l=o=s=void 0}function x(){return s===void 0?i:w(Date.now())}function L(){const v=Date.now(),S=g(v);if(r=arguments,o=this,l=v,S){if(s===void 0)return h(l);if(u)return s=setTimeout(y,e),p(l)}return s===void 0&&(s=setTimeout(y,e)),i}return L.cancel=_,L.flush=x,L}function St(){return crypto.randomUUID()}function qn(n,e){switch(n){case"session":case":sessionStorage:":let t=sessionStorage._sqlocal_session_key;return t||(t=St(),sessionStorage._sqlocal_session_key=t),`session:${t}`;case"local":case":localStorage:":return"local";case":memory:":return`memory:${e}`;default:return`path:${n}`}}class yt{constructor(e){Object.defineProperty(this,"driver",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"userFunctions",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"initMutex",{enumerable:!0,configurable:!0,writable:!0,value:qo()}),Object.defineProperty(this,"transactionMutex",{enumerable:!0,configurable:!0,writable:!0,value:qo()}),Object.defineProperty(this,"transactionKey",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"proxy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dirtyTables",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"effectsChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reinitChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onmessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{if(!(!this.config.databasePath||!this.config.clientKey)){await this.initMutex.lock();try{try{await this.driver.init(this.config)}catch{console.warn(`Persistence failed, so ${this.config.databasePath} will not be saved. For origin private file system persistence, make sure your web server is configured to use the correct HTTP response headers (See https://sqlocal.dev/guide/setup#cross-origin-isolation).`),this.config.databasePath=":memory:",this.driver=new Mt,await this.driver.init(this.config)}const a=qn(this.config.databasePath,this.config.clientKey);this.reinitChannel=new BroadcastChannel(`_sqlocal_reinit_(${a})`),this.reinitChannel.onmessage=i=>{const s=i.data;if(this.config.clientKey!==s.clientKey)switch(s.type){case"reinit":this.init(s.reason);break;case"close":this.driver.destroy();break}},this.config.reactive&&(this.effectsChannel=new BroadcastChannel(`_sqlocal_effects_(${a})`),this.driver.onWrite(async i=>{this.dirtyTables.add(i.table),await this.transactionMutex.lock(),this.emitEffectsDebounced(),await this.transactionMutex.unlock()})),await Promise.all(Array.from(this.userFunctions.values()).map(i=>this.initUserFunction(i))),await this.execInitStatements(),this.emitMessage({type:"event",event:"connect",reason:o})}catch(a){this.emitMessage({type:"error",error:a,queryKey:null}),await this.destroy()}finally{await this.initMutex.unlock()}}}}),Object.defineProperty(this,"postMessage",{enumerable:!0,configurable:!0,writable:!0,value:async(o,a)=>{const i=o instanceof MessageEvent?o.data:o;switch(await this.initMutex.lock(),i.type){case"config":this.editConfig(i);break;case"query":case"batch":case"transaction":this.exec(i);break;case"function":this.createUserFunction(i);break;case"getinfo":this.getDatabaseInfo(i);break;case"import":this.importDb(i);break;case"export":this.exportDb(i);break;case"delete":this.deleteDb(i);break;case"destroy":this.destroy(i);break}await this.initMutex.unlock()}}),Object.defineProperty(this,"emitMessage",{enumerable:!0,configurable:!0,writable:!0,value:(o,a=[])=>{this.onmessage&&this.onmessage(o,a)}}),Object.defineProperty(this,"emitEffects",{enumerable:!0,configurable:!0,writable:!0,value:()=>{!this.effectsChannel||this.dirtyTables.size===0||(this.effectsChannel.postMessage({type:"effects",tables:[...this.dirtyTables]}),this.dirtyTables.clear())}}),Object.defineProperty(this,"emitEffectsDebounced",{enumerable:!0,configurable:!0,writable:!0,value:da(()=>this.emitEffects(),32,{maxWait:180})}),Object.defineProperty(this,"editConfig",{enumerable:!0,configurable:!0,writable:!0,value:o=>{this.config=o.config,this.init("initial")}}),Object.defineProperty(this,"exec",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{try{const a={type:"data",queryKey:o.queryKey,data:[]};switch(o.type){case"query":const i=this.transactionKey!==null&&this.transactionKey===o.transactionKey;try{i||await this.transactionMutex.lock();const s=await this.driver.exec(o);a.data.push(s)}finally{i||await this.transactionMutex.unlock()}break;case"batch":try{await this.transactionMutex.lock();const s=await this.driver.execBatch(o.statements);a.data.push(...s)}finally{await this.transactionMutex.unlock()}break;case"transaction":if(o.action==="begin"&&(await this.transactionMutex.lock(),this.transactionKey=o.transactionKey,await this.driver.exec({sql:"BEGIN"})),(o.action==="commit"||o.action==="rollback")&&this.transactionKey!==null&&this.transactionKey===o.transactionKey){const s=o.action==="commit"?"COMMIT":"ROLLBACK";await this.driver.exec({sql:s}),this.transactionKey=null,await this.transactionMutex.unlock()}break}this.emitMessage(a)}catch(a){this.emitMessage({type:"error",error:a,queryKey:o.queryKey})}}}),Object.defineProperty(this,"execInitStatements",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{if(this.config.onInitStatements)for(let o of this.config.onInitStatements)await this.driver.exec(o)}}),Object.defineProperty(this,"getDatabaseInfo",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{try{this.emitMessage({type:"info",queryKey:o.queryKey,info:{databasePath:this.config.databasePath,storageType:this.driver.storageType,databaseSizeBytes:await this.driver.getDatabaseSizeBytes(),persisted:await this.driver.isDatabasePersisted()}})}catch(a){this.emitMessage({type:"error",queryKey:o.queryKey,error:a})}}}),Object.defineProperty(this,"createUserFunction",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{functionName:a,functionType:i,queryKey:s}=o;let l;if(this.userFunctions.has(a)){this.emitMessage({type:"error",error:new Error(`A user-defined function with the name "${a}" has already been created for this SQLocal instance.`),queryKey:s});return}switch(i){case"callback":l={type:i,name:a,func:(...c)=>{this.emitMessage({type:"callback",name:a,args:c})}};break;case"scalar":l={type:i,name:a,func:this.proxy[`_sqlocal_func_${a}`]};break;case"aggregate":l={type:i,name:a,func:{step:this.proxy[`_sqlocal_func_${a}_step`],final:this.proxy[`_sqlocal_func_${a}_final`]}};break}try{await this.initUserFunction(l),this.emitMessage({type:"success",queryKey:s})}catch(c){this.emitMessage({type:"error",error:c,queryKey:s})}}}),Object.defineProperty(this,"initUserFunction",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{await this.driver.createFunction(o),this.userFunctions.set(o.name,o)}}),Object.defineProperty(this,"importDb",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{queryKey:a,database:i}=o;let s=!1;try{await this.driver.import(i),this.driver.storageType==="memory"&&await this.execInitStatements()}catch(l){this.emitMessage({type:"error",error:l,queryKey:a}),s=!0}finally{this.driver.storageType!=="memory"&&await this.init("overwrite")}s||this.emitMessage({type:"success",queryKey:a})}}),Object.defineProperty(this,"exportDb",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{queryKey:a}=o;try{const{name:i,data:s}=await this.driver.export();this.emitMessage({type:"buffer",queryKey:a,bufferName:i,buffer:s},[s])}catch(i){this.emitMessage({type:"error",error:i,queryKey:a})}}}),Object.defineProperty(this,"deleteDb",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{const{queryKey:a}=o;let i=!1;try{await this.driver.clear()}catch(s){this.emitMessage({type:"error",error:s,queryKey:a}),i=!0}finally{await this.init("delete")}i||this.emitMessage({type:"success",queryKey:a})}}),Object.defineProperty(this,"destroy",{enumerable:!0,configurable:!0,writable:!0,value:async o=>{await this.driver.exec({sql:"PRAGMA optimize"}),await this.driver.destroy(),this.effectsChannel&&(this.emitEffectsDebounced.flush(),this.effectsChannel.close(),this.effectsChannel=void 0),this.reinitChannel&&(this.reinitChannel.close(),this.reinitChannel=void 0),o&&this.emitMessage({type:"success",queryKey:o.queryKey})}});const r=typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope?Lo(globalThis):globalThis;this.proxy=r,this.driver=e}}function At(n,...e){return{sql:n.join("?"),params:e}}function ua(n){return!n.some(e=>!Array.isArray(e))}function Ht(n,e){let t;return ua(n)?t=n:t=[n],t.map(r=>{const o={};return e.forEach((a,i)=>{o[a]=r[i]}),o})}function pa(n){return typeof n=="object"&&n!==null&&"getSQL"in n&&typeof n.getSQL=="function"}function fa(n){return typeof n=="object"&&n!==null&&"sql"in n&&typeof n.sql=="string"&&"params"in n}function Ho(n){if(typeof n=="function"&&(n=n(At)),pa(n))try{if(!("toSQL"in n&&typeof n.toSQL=="function"))throw 1;const r=n.toSQL();if(!fa(r))throw 2;const o="all"in n&&typeof n.all=="function"?n.all:void 0;return{...r,exec:o?()=>o():void 0}}catch{throw new Error("The passed statement could not be parsed.")}const e=n.sql;let t=[];return"params"in n?t=n.params:"parameters"in n&&(t=n.parameters),{sql:e,params:t}}function Wo(n,e){let t;return typeof n=="string"?t={sql:n,params:e}:t=At(n,...e),t}async function bt(n,e,t,r){return!e&&"locks"in navigator?navigator.locks.request(`_sqlocal_mutation_(${t.databasePath})`,{mode:n},r):r()}class Ko extends Mt{constructor(e,t){super(t),Object.defineProperty(this,"storageType",{enumerable:!0,configurable:!0,writable:!0,value:e})}async init(e){const t=this.getFlags(e);if(e.readOnly)throw new Error(`SQLite storage type "${this.storageType}" does not support read-only mode.`);if(!this.sqlite3InitModule){const{default:r}=await Le(async()=>{const{default:o}=await import("./index-DTMgZTfd.js");return{default:o}},[]);this.sqlite3InitModule=r}this.sqlite3||(this.sqlite3=await this.sqlite3InitModule()),this.db&&await this.destroy(),this.db=new this.sqlite3.oo1.JsStorageDb({filename:this.storageType,flags:t}),this.config=e,this.initWriteHook()}async isDatabasePersisted(){return navigator.storage?.persisted()}async getDatabaseSizeBytes(){if(!this.db)throw new Error("Driver not initialized");return this.db.storageSize()}async import(e){const t=new Mt;await t.init({}),await t.import(e),await this.clear(),await t.exec({sql:`VACUUM INTO 'file:${this.storageType}?vfs=kvvfs'`}),await t.destroy()}async clear(){if(!this.db)throw new Error("Driver not initialized");this.db.clearStorage()}async destroy(){this.closeDb(),this.writeCallbacks.clear()}}var Hn,Wn;class ha{constructor(e){Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientKey",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"processor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isDestroyed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"bypassMutationLock",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"transactionQueryKeyQueue",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"userCallbacks",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"queriesInProgress",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"proxy",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reinitChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"effectsChannel",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"processMessageEvent",{enumerable:!0,configurable:!0,writable:!0,value:c=>{const d=c instanceof MessageEvent?c.data:c,u=this.queriesInProgress;switch(d.type){case"success":case"data":case"buffer":case"info":case"error":if(d.queryKey&&u.has(d.queryKey)){const[p,h]=u.get(d.queryKey);d.type==="error"?h(d.error):p(d),u.delete(d.queryKey)}else if(d.type==="error")throw d.error;break;case"callback":const f=this.userCallbacks.get(d.name);f&&f(...d.args??[]);break;case"event":this.config.onConnect?.(d.reason);break}}}),Object.defineProperty(this,"createQuery",{enumerable:!0,configurable:!0,writable:!0,value:async c=>bt("shared",this.bypassMutationLock||c.type==="import"||c.type==="delete",this.config,async()=>{if(this.isDestroyed===!0)throw new Error("This SQLocal client has been destroyed. You will need to initialize a new client in order to make further queries.");const d=St();switch(c.type){case"import":this.processor.postMessage({...c,queryKey:d},[c.database]);break;default:this.processor.postMessage({...c,queryKey:d});break}return new Promise((u,f)=>{this.queriesInProgress.set(d,[u,f])})})}),Object.defineProperty(this,"broadcast",{enumerable:!0,configurable:!0,writable:!0,value:c=>{this.reinitChannel.postMessage(c)}}),Object.defineProperty(this,"exec",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d,u="all",f)=>{const p=await this.createQuery({type:"query",transactionKey:f,sql:c,params:d,method:u}),h={rows:[],columns:[]};return p.type==="data"&&(h.rows=p.data[0]?.rows??[],h.columns=p.data[0]?.columns??[]),h}}),Object.defineProperty(this,"execBatch",{enumerable:!0,configurable:!0,writable:!0,value:async c=>{const d=await this.createQuery({type:"batch",statements:c}),u=new Array(c.length).fill({rows:[],columns:[]});return d.type==="data"&&d.data.forEach((f,p)=>{u[p]=f}),u}}),Object.defineProperty(this,"sql",{enumerable:!0,configurable:!0,writable:!0,value:async(c,...d)=>{const u=Wo(c,d),{rows:f,columns:p}=await this.exec(u.sql,u.params,"all");return Ht(f,p)}}),Object.defineProperty(this,"batch",{enumerable:!0,configurable:!0,writable:!0,value:async c=>{const d=c(At);return(await this.execBatch(d)).map(({rows:f,columns:p})=>Ht(f,p))}}),Object.defineProperty(this,"beginTransaction",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{const c=St();await this.createQuery({type:"transaction",transactionKey:c,action:"begin"});const d=async h=>{const m=Ho(h);if(m.exec)return this.transactionQueryKeyQueue.push(c),m.exec();const{rows:g,columns:y}=await this.exec(m.sql,m.params,"all",c);return Ht(g,y)};return{query:d,sql:async(h,...m)=>{const g=Wo(h,m);return await d(g)},commit:async()=>{await this.createQuery({type:"transaction",transactionKey:c,action:"commit"})},rollback:async()=>{await this.createQuery({type:"transaction",transactionKey:c,action:"rollback"})}}}}),Object.defineProperty(this,"transaction",{enumerable:!0,configurable:!0,writable:!0,value:async c=>bt("exclusive",!1,this.config,async()=>{let d;this.bypassMutationLock=!0;try{d=await this.beginTransaction();const u=await c({sql:d.sql,query:d.query});return await d.commit(),u}catch(u){throw await d?.rollback(),u}finally{this.bypassMutationLock=!1}})}),Object.defineProperty(this,"reactiveQuery",{enumerable:!0,configurable:!0,writable:!0,value:c=>{let d=[],u=!1,f=!1,p=0;const h=Ho(c),m=new Set,g=new Set,y=new Set,w=async()=>{try{const x=++p;if(m.size===0){const v=await this.sql("SELECT name, wr FROM tables_used(?) WHERE type = 'table'",h.sql),S=new Set,P=new Set;if(v.forEach(k=>{typeof k.name=="string"&&(k.wr?P.add(k.name):S.add(k.name))}),S.size===0)throw new Error("The passed SQL does not read any tables.");if(Array.from(P).some(k=>S.has(k)))throw new Error("The passed SQL would mutate one or more of the tables that it reads. Doing this in a reactive query would create an infinite loop.");S.forEach(k=>m.add(k))}const L=h.exec?await h.exec():await this.sql(h.sql,...h.params);x===p&&(d=L,u=!0,g.forEach(v=>v(d)))}catch(x){y.forEach(L=>{L(x instanceof Error?x:new Error(String(x)))})}},_=x=>{x.data.tables.some(L=>m.has(L))&&w()};return{get value(){return d},subscribe:(x,L)=>{if(!this.effectsChannel)throw new Error('This SQLocal instance is not configured for reactive queries. Set the "reactive" option to enable them.');return L||(L=v=>{throw v}),g.add(x),y.add(L),f?u&&x(d):(this.effectsChannel.addEventListener("message",_),f=!0,w()),{unsubscribe:()=>{g.delete(x),y.delete(L),g.size===0&&(this.effectsChannel?.removeEventListener("message",_),f=!1)}}}}}}),Object.defineProperty(this,"createCallbackFunction",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{await this.createQuery({type:"function",functionName:c,functionType:"callback"}),this.userCallbacks.set(c,d)}}),Object.defineProperty(this,"createScalarFunction",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{const u=`_sqlocal_func_${c}`,f=()=>{this.proxy[u]=d};this.proxy===globalThis&&f(),await this.createQuery({type:"function",functionName:c,functionType:"scalar"}),this.proxy!==globalThis&&f()}}),Object.defineProperty(this,"createAggregateFunction",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{const u=`_sqlocal_func_${c}`,f=()=>{this.proxy[`${u}_step`]=d.step,this.proxy[`${u}_final`]=d.final};this.proxy===globalThis&&f(),await this.createQuery({type:"function",functionName:c,functionType:"aggregate"}),this.proxy!==globalThis&&f()}}),Object.defineProperty(this,"getDatabaseInfo",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{const c=await this.createQuery({type:"getinfo"});if(c.type==="info")return c.info;throw new Error("The database failed to return valid information.")}}),Object.defineProperty(this,"getDatabaseFile",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{const c=await this.createQuery({type:"export"});if(c.type==="buffer")return new File([c.buffer],c.bufferName,{type:"application/x-sqlite3"});throw new Error("The database failed to export.")}}),Object.defineProperty(this,"overwriteDatabaseFile",{enumerable:!0,configurable:!0,writable:!0,value:async(c,d)=>{await bt("exclusive",!1,this.config,async()=>{try{this.broadcast({type:"close",clientKey:this.clientKey});const u=await zn(c,"buffer");await this.createQuery({type:"import",database:u}),typeof d=="function"&&(this.bypassMutationLock=!0,await d()),this.broadcast({type:"reinit",clientKey:this.clientKey,reason:"overwrite"})}finally{this.bypassMutationLock=!1}})}}),Object.defineProperty(this,"deleteDatabaseFile",{enumerable:!0,configurable:!0,writable:!0,value:async c=>{await bt("exclusive",!1,this.config,async()=>{try{this.broadcast({type:"close",clientKey:this.clientKey}),await this.createQuery({type:"delete"}),typeof c=="function"&&(this.bypassMutationLock=!0,await c()),this.broadcast({type:"reinit",clientKey:this.clientKey,reason:"delete"})}finally{this.bypassMutationLock=!1}})}}),Object.defineProperty(this,"destroy",{enumerable:!0,configurable:!0,writable:!0,value:async()=>{await this.createQuery({type:"destroy"}),typeof globalThis.Worker<"u"&&this.processor instanceof Worker&&(this.processor.removeEventListener("message",this.processMessageEvent),this.processor.terminate()),this.queriesInProgress.clear(),this.userCallbacks.clear(),this.reinitChannel.close(),this.effectsChannel?.close(),this.isDestroyed=!0}}),Object.defineProperty(this,Hn,{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.destroy()}}),Object.defineProperty(this,Wn,{enumerable:!0,configurable:!0,writable:!0,value:async()=>{await this.destroy()}});const t=typeof e=="string"?{databasePath:e}:e,{onInit:r,onConnect:o,processor:a,...i}=t,{databasePath:s}=i;this.config=t,this.clientKey=St();const l=qn(s,this.clientKey);if(this.reinitChannel=new BroadcastChannel(`_sqlocal_reinit_(${l})`),i.reactive&&(this.effectsChannel=new BroadcastChannel(`_sqlocal_effects_(${l})`)),typeof a<"u")this.processor=a;else if(s==="local"||s===":localStorage:"){const c=new Ko("local");this.processor=new yt(c)}else if(s==="session"||s===":sessionStorage:"){const c=new Ko("session");this.processor=new yt(c)}else if(typeof globalThis.Worker<"u"&&s!==":memory:")this.processor=new Worker(new URL("/assets/worker-CuIBOSaM.js",import.meta.url),{type:"module"});else{const c=new Mt;this.processor=new yt(c)}this.processor instanceof yt?(this.processor.onmessage=c=>this.processMessageEvent(c),this.proxy=globalThis):(this.processor.addEventListener("message",this.processMessageEvent),this.proxy=Lo(this.processor)),this.processor.postMessage({type:"config",config:{...i,clientKey:this.clientKey,onInitStatements:r?.(At)??[]}})}}Hn=Symbol.dispose,Wn=Symbol.asyncDispose;const To="lupmis2.db",ga="lupmis-db-sync",Kn=new ha(To),{sql:b}=Kn;console.log("[Database] SQLocal instance created for:",To);const Vn=new BroadcastChannel(ga);let Xn=!1,Yn,Jn;const Vo=new Promise((n,e)=>{Yn=n,Jn=e}),Ct=new Set;function ma(n){return Ct.add(n),()=>Ct.delete(n)}Vn.onmessage=n=>{const{type:e,payload:t}=n.data;if(e==="DB_CHANGE")for(const r of Ct)try{r(t)}catch(o){console.error("[Database] Change listener error:",o)}};function Y(n,e,t=null){Vn.postMessage({type:"DB_CHANGE",payload:{table:n,action:e,id:t,timestamp:Date.now()}});for(const r of Ct)try{r({table:n,action:e,id:t,timestamp:Date.now(),local:!0})}catch(o){console.error("[Database] Change listener error:",o)}}async function ya(){try{console.log("[Database] Initializing schema...");const n=await b`SELECT sqlite_version() as version`;console.log("[Database] SQLite version:",n[0]?.version),console.log("[Database] Creating locations table..."),await b` CREATE TABLE IF NOT EXISTS locations ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, @@ -12,7 +12,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C updated_at TEXT DEFAULT CURRENT_TIMESTAMP, synced INTEGER DEFAULT 0 ) - `;const e=await w`SELECT name FROM sqlite_master WHERE type='table' AND name='locations'`;console.log("[Database] Locations table exists:",e.length>0),console.log("[Database] Creating sync_log table..."),await w` + `;const e=await b`SELECT name FROM sqlite_master WHERE type='table' AND name='locations'`;console.log("[Database] Locations table exists:",e.length>0),console.log("[Database] Creating sync_log table..."),await b` CREATE TABLE IF NOT EXISTS sync_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, table_name TEXT NOT NULL, @@ -21,13 +21,13 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C timestamp TEXT DEFAULT CURRENT_TIMESTAMP, synced INTEGER DEFAULT 0 ) - `,console.log("[Database] Creating remote_data table..."),await w` + `,console.log("[Database] Creating remote_data table..."),await b` CREATE TABLE IF NOT EXISTS remote_data ( key TEXT PRIMARY KEY, data TEXT NOT NULL, fetched_at TEXT DEFAULT CURRENT_TIMESTAMP ) - `,console.log("[Database] Creating collector_zones table..."),await w` + `,console.log("[Database] Creating collector_zones table..."),await b` CREATE TABLE IF NOT EXISTS collector_zones ( id INTEGER PRIMARY KEY, zone_name TEXT, @@ -35,7 +35,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C properties TEXT, fetched_at TEXT DEFAULT CURRENT_TIMESTAMP ) - `,console.log("[Database] Creating parcels table...");try{const r=await w`PRAGMA table_info(parcels)`;r.length>0&&!r.some(o=>o.name==="upn")&&(console.log("[Database] Migrating parcels table to lu_parcels structure (dropping old cache)..."),await w`DROP TABLE parcels`)}catch(r){console.warn("[Database] parcels migration check failed:",r)}await w` + `,console.log("[Database] Creating parcels table...");try{const r=await b`PRAGMA table_info(parcels)`;r.length>0&&!r.some(o=>o.name==="upn")&&(console.log("[Database] Migrating parcels table to lu_parcels structure (dropping old cache)..."),await b`DROP TABLE parcels`)}catch(r){console.warn("[Database] parcels migration check failed:",r)}await b` CREATE TABLE IF NOT EXISTS parcels ( id INTEGER PRIMARY KEY, upn TEXT, @@ -65,21 +65,21 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C status TEXT DEFAULT 'verified', fetched_at TEXT DEFAULT CURRENT_TIMESTAMP ) - `,console.log("[Database] Creating building_footprints table..."),await w` + `,console.log("[Database] Creating building_footprints table..."),await b` CREATE TABLE IF NOT EXISTS building_footprints ( id INTEGER PRIMARY KEY, geometry_wkt TEXT, properties TEXT, fetched_at TEXT DEFAULT CURRENT_TIMESTAMP ) - `,console.log("[Database] Creating osm_roads table..."),await w` + `,console.log("[Database] Creating osm_roads table..."),await b` CREATE TABLE IF NOT EXISTS osm_roads ( osm_id INTEGER PRIMARY KEY, geometry_wkt TEXT, properties TEXT, fetched_at TEXT DEFAULT CURRENT_TIMESTAMP ) - `,console.log("[Database] Creating upn_grid table..."),await w` + `,console.log("[Database] Creating upn_grid table..."),await b` CREATE TABLE IF NOT EXISTS upn_grid ( id INTEGER PRIMARY KEY AUTOINCREMENT, districtid INTEGER, @@ -87,7 +87,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C geometry_wkt TEXT, fetched_at TEXT DEFAULT CURRENT_TIMESTAMP ) - `,console.log("[Database] Creating gps_trails table..."),await w` + `,console.log("[Database] Creating gps_trails table..."),await b` CREATE TABLE IF NOT EXISTS gps_trails ( id INTEGER PRIMARY KEY AUTOINCREMENT, client_uuid TEXT UNIQUE, @@ -102,7 +102,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C remote_id TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP ) - `,console.log("[Database] Creating gps_trail_points table..."),await w` + `,console.log("[Database] Creating gps_trail_points table..."),await b` CREATE TABLE IF NOT EXISTS gps_trail_points ( id INTEGER PRIMARY KEY AUTOINCREMENT, trail_id INTEGER NOT NULL, @@ -117,7 +117,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C satellites INTEGER, recorded_at TEXT NOT NULL ) - `,console.log("[Database] Creating external_imports table..."),await w` + `,console.log("[Database] Creating external_imports table..."),await b` CREATE TABLE IF NOT EXISTS external_imports ( id INTEGER PRIMARY KEY AUTOINCREMENT, filename TEXT NOT NULL, @@ -130,7 +130,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C created_at TEXT DEFAULT CURRENT_TIMESTAMP, last_uploaded_at TEXT ) - `,console.log("[Database] Creating external_import_features table..."),await w` + `,console.log("[Database] Creating external_import_features table..."),await b` CREATE TABLE IF NOT EXISTS external_import_features ( id INTEGER PRIMARY KEY AUTOINCREMENT, import_id INTEGER NOT NULL REFERENCES external_imports(id) ON DELETE CASCADE, @@ -141,48 +141,48 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C server_id INTEGER, error_message TEXT ) - `,await w`CREATE INDEX IF NOT EXISTS idx_locations_category ON locations(category)`,await w`CREATE INDEX IF NOT EXISTS idx_locations_synced ON locations(synced)`,await w`CREATE INDEX IF NOT EXISTS idx_gps_trails_synced ON gps_trails(synced, status)`,await w`CREATE INDEX IF NOT EXISTS idx_gps_trail_points_trail ON gps_trail_points(trail_id, seq)`,await w`CREATE INDEX IF NOT EXISTS idx_external_imports_status ON external_imports(status)`,await w`CREATE INDEX IF NOT EXISTS idx_external_import_features_import ON external_import_features(import_id, upload_status)`;const t=await w`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`;console.log("[Database] All tables:",t.map(r=>r.name)),Vn=!0,Yn(!0),console.log("[Database] ✓ Schema initialized")}catch(n){throw console.error("[Database] ✗ Schema init failed:",n),Jn(n),n}}async function ga(n,e,t,r={}){const{description:o=null,category:a="default"}=r;console.log("[Database] Adding location:",n,e,t,a);try{const i=await w`SELECT name FROM sqlite_master WHERE type='table' AND name='locations'`;if(console.log("[Database] Table check before insert:",i),i.length===0)throw console.error("[Database] ✗ locations table does not exist!"),new Error("locations table does not exist");console.log("[Database] Executing INSERT..."),await w` + `,await b`CREATE INDEX IF NOT EXISTS idx_locations_category ON locations(category)`,await b`CREATE INDEX IF NOT EXISTS idx_locations_synced ON locations(synced)`,await b`CREATE INDEX IF NOT EXISTS idx_gps_trails_synced ON gps_trails(synced, status)`,await b`CREATE INDEX IF NOT EXISTS idx_gps_trail_points_trail ON gps_trail_points(trail_id, seq)`,await b`CREATE INDEX IF NOT EXISTS idx_external_imports_status ON external_imports(status)`,await b`CREATE INDEX IF NOT EXISTS idx_external_import_features_import ON external_import_features(import_id, upload_status)`;const t=await b`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'`;console.log("[Database] All tables:",t.map(r=>r.name)),Xn=!0,Yn(!0),console.log("[Database] ✓ Schema initialized")}catch(n){throw console.error("[Database] ✗ Schema init failed:",n),Jn(n),n}}async function ba(n,e,t,r={}){const{description:o=null,category:a="default"}=r;console.log("[Database] Adding location:",n,e,t,a);try{const i=await b`SELECT name FROM sqlite_master WHERE type='table' AND name='locations'`;if(console.log("[Database] Table check before insert:",i),i.length===0)throw console.error("[Database] ✗ locations table does not exist!"),new Error("locations table does not exist");console.log("[Database] Executing INSERT..."),await b` INSERT INTO locations (name, longitude, latitude, description, category) VALUES (${n}, ${e}, ${t}, ${o}, ${a}) - `,console.log("[Database] INSERT completed");const l=(await w`SELECT last_insert_rowid() as id`)[0]?.id;console.log("[Database] New ID:",l);const c=await w`SELECT * FROM locations WHERE id = ${l}`;if(console.log("[Database] Verify insert:",c),c.length===0)throw console.error("[Database] ✗ Insert verification failed - row not found!"),new Error("Insert verification failed");return await w` + `,console.log("[Database] INSERT completed");const l=(await b`SELECT last_insert_rowid() as id`)[0]?.id;console.log("[Database] New ID:",l);const c=await b`SELECT * FROM locations WHERE id = ${l}`;if(console.log("[Database] Verify insert:",c),c.length===0)throw console.error("[Database] ✗ Insert verification failed - row not found!"),new Error("Insert verification failed");return await b` INSERT INTO sync_log (table_name, record_id, action) VALUES ('locations', ${l}, 'INSERT') - `,Y("locations","INSERT",l),console.log("[Database] ✓ Location added:",l),{id:l}}catch(i){throw console.error("[Database] ✗ Failed to add location:",i),i}}async function Zn(n={}){const{category:e=null,limit:t=1e3}=n;try{const r=await w`SELECT name FROM sqlite_master WHERE type='table' AND name='locations'`;if(console.log("[Database] getLocations - table exists:",r.length>0),r.length===0)return console.warn("[Database] locations table does not exist yet"),[];let o;return e?o=await w` + `,Y("locations","INSERT",l),console.log("[Database] ✓ Location added:",l),{id:l}}catch(i){throw console.error("[Database] ✗ Failed to add location:",i),i}}async function Zn(n={}){const{category:e=null,limit:t=1e3}=n;try{const r=await b`SELECT name FROM sqlite_master WHERE type='table' AND name='locations'`;if(console.log("[Database] getLocations - table exists:",r.length>0),r.length===0)return console.warn("[Database] locations table does not exist yet"),[];let o;return e?o=await b` SELECT * FROM locations WHERE category = ${e} ORDER BY created_at DESC LIMIT ${t} - `:o=await w` + `:o=await b` SELECT * FROM locations ORDER BY created_at DESC LIMIT ${t} - `,console.log("[Database] getLocations returned",o.length,"rows"),o}catch(r){return console.error("[Database] getLocations error:",r),[]}}async function ma(){try{return(await w`SELECT COUNT(*) as count FROM locations`)[0]?.count??0}catch(n){return console.error("[Database] getLocationCount error:",n),0}}async function Qn(n,e){try{const t=JSON.stringify(e);await w` + `,console.log("[Database] getLocations returned",o.length,"rows"),o}catch(r){return console.error("[Database] getLocations error:",r),[]}}async function wa(){try{return(await b`SELECT COUNT(*) as count FROM locations`)[0]?.count??0}catch(n){return console.error("[Database] getLocationCount error:",n),0}}async function Qn(n,e){try{const t=JSON.stringify(e);await b` INSERT OR REPLACE INTO remote_data (key, data, fetched_at) VALUES (${n}, ${t}, CURRENT_TIMESTAMP) - `,console.log("[Database] ✓ Remote data cached:",n)}catch(t){throw console.error("[Database] ✗ Failed to cache remote data:",n,t),t}}async function er(n){try{const e=await w`SELECT data, fetched_at FROM remote_data WHERE key = ${n}`;if(e.length===0)return null;const t=JSON.parse(e[0].data);return console.log("[Database] ✓ Remote data loaded from cache:",n,"(fetched",e[0].fetched_at+")"),t}catch(e){return console.error("[Database] ✗ Failed to read cached remote data:",n,e),null}}async function ya(n){try{await w`DELETE FROM collector_zones`;for(const e of n){const t=JSON.stringify(e);await w` + `,console.log("[Database] ✓ Remote data cached:",n)}catch(t){throw console.error("[Database] ✗ Failed to cache remote data:",n,t),t}}async function er(n){try{const e=await b`SELECT data, fetched_at FROM remote_data WHERE key = ${n}`;if(e.length===0)return null;const t=JSON.parse(e[0].data);return console.log("[Database] ✓ Remote data loaded from cache:",n,"(fetched",e[0].fetched_at+")"),t}catch(e){return console.error("[Database] ✗ Failed to read cached remote data:",n,e),null}}async function _a(n){try{await b`DELETE FROM collector_zones`;for(const e of n){const t=JSON.stringify(e);await b` INSERT INTO collector_zones (id, zone_name, geometry_wkt, properties, fetched_at) VALUES (${e.colzonenr||e.id}, ${e.colzonename||e.zone_name||""}, ${e.polygon||e.boundary||""}, ${t}, CURRENT_TIMESTAMP) - `}console.log("[Database] ✓ Saved",n.length,"collector zones")}catch(e){throw console.error("[Database] ✗ Failed to save collector zones:",e),e}}async function ba(){try{const n=await w`SELECT properties FROM collector_zones ORDER BY id`;return n.length===0?null:n.map(e=>JSON.parse(e.properties))}catch(n){return console.error("[Database] ✗ Failed to read local collector zones:",n),null}}async function wa(n,e){try{await w`BEGIN`,await w`DELETE FROM upn_grid`;let t=0;for(const r of n){const o=r.polygon||r.geometry_wkt||r.geom||"";await w` + `}console.log("[Database] ✓ Saved",n.length,"collector zones")}catch(e){throw console.error("[Database] ✗ Failed to save collector zones:",e),e}}async function va(){try{const n=await b`SELECT properties FROM collector_zones ORDER BY id`;return n.length===0?null:n.map(e=>JSON.parse(e.properties))}catch(n){return console.error("[Database] ✗ Failed to read local collector zones:",n),null}}async function Ea(n,e){try{await b`BEGIN`,await b`DELETE FROM upn_grid`;let t=0;for(const r of n){const o=r.polygon||r.geometry_wkt||r.geom||"";await b` INSERT INTO upn_grid (districtid, upn_prefix, geometry_wkt, fetched_at) - VALUES (${V(e)}, ${r.upn_prefix??null}, ${o}, CURRENT_TIMESTAMP) - `,t++}await w`COMMIT`,console.log("[Database] ✓ Saved",t,"UPN-grid cells (district",e,")")}catch(t){try{await w`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to save UPN grid:",t),t}}async function _a(n){try{const e=await w` + VALUES (${X(e)}, ${r.upn_prefix??null}, ${o}, CURRENT_TIMESTAMP) + `,t++}await b`COMMIT`,console.log("[Database] ✓ Saved",t,"UPN-grid cells (district",e,")")}catch(t){try{await b`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to save UPN grid:",t),t}}async function xa(n){try{const e=await b` SELECT id, districtid, upn_prefix, geometry_wkt FROM upn_grid - WHERE districtid = ${V(n)} + WHERE districtid = ${X(n)} ORDER BY id - `;return e.length===0?null:e}catch(e){return console.error("[Database] ✗ Failed to read UPN grid:",e),null}}function tr(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=Math.random()*16|0;return(n==="x"?e:e&3|8).toString(16)})}async function va(n){const{filename:e,targetType:t="other",featureCount:r=0}=n,o=tr();try{await w` + `;return e.length===0?null:e}catch(e){return console.error("[Database] ✗ Failed to read UPN grid:",e),null}}function tr(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=Math.random()*16|0;return(n==="x"?e:e&3|8).toString(16)})}async function Sa(n){const{filename:e,targetType:t="other",featureCount:r=0}=n,o=tr();try{await b` INSERT INTO external_imports (filename, target_type, status, feature_count, client_import_id) VALUES (${e}, ${t}, ${t==="other"?"other":"imported"}, ${r}, ${o}) - `;const i=(await w`SELECT last_insert_rowid() AS id`)[0]?.id;return Y("external_imports","INSERT",i),{id:i,client_import_id:o}}catch(a){throw console.error("[Database] ✗ Failed to create external import:",a),a}}async function Ea(n,e){if(!Array.isArray(e)||e.length===0)return 0;try{await w`BEGIN`;let t=0;for(const r of e){const o=r.geometry_wkt||"";if(!o)continue;const a=JSON.stringify(r.properties??{}),i=r.client_uuid||tr();await w` + `;const i=(await b`SELECT last_insert_rowid() AS id`)[0]?.id;return Y("external_imports","INSERT",i),{id:i,client_import_id:o}}catch(a){throw console.error("[Database] ✗ Failed to create external import:",a),a}}async function La(n,e){if(!Array.isArray(e)||e.length===0)return 0;try{await b`BEGIN`;let t=0;for(const r of e){const o=r.geometry_wkt||"";if(!o)continue;const a=JSON.stringify(r.properties??{}),i=r.client_uuid||tr();await b` INSERT INTO external_import_features (import_id, client_uuid, geometry_wkt, properties_json, upload_status) VALUES (${n}, ${i}, ${o}, ${a}, 'pending') - `,t++}return await w`COMMIT`,Y("external_import_features","INSERT",n),t}catch(t){try{await w`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to add import features:",t),t}}async function At(n,e={}){try{const t=await w`SELECT * FROM external_imports WHERE id = ${n}`;if(t.length===0)throw new Error(`Import ${n} not found`);const r=t[0],o=e.targetType??r.target_type,a=e.mapping!==void 0?e.mapping?JSON.stringify(e.mapping):null:r.mapping_json,i=e.status??r.status,s=e.errorCount??r.error_count,l=e.lastUploadedAt??r.last_uploaded_at;await w` + `,t++}return await b`COMMIT`,Y("external_import_features","INSERT",n),t}catch(t){try{await b`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to add import features:",t),t}}async function Ft(n,e={}){try{const t=await b`SELECT * FROM external_imports WHERE id = ${n}`;if(t.length===0)throw new Error(`Import ${n} not found`);const r=t[0],o=e.targetType??r.target_type,a=e.mapping!==void 0?e.mapping?JSON.stringify(e.mapping):null:r.mapping_json,i=e.status??r.status,s=e.errorCount??r.error_count,l=e.lastUploadedAt??r.last_uploaded_at;await b` UPDATE external_imports SET target_type = ${o}, mapping_json = ${a}, @@ -190,55 +190,55 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C error_count = ${s}, last_uploaded_at = ${l} WHERE id = ${n} - `,Y("external_imports","UPDATE",n)}catch(t){throw console.error("[Database] ✗ Failed to update external import:",t),t}}async function xa(n){try{const e=await w`SELECT * FROM external_imports WHERE id = ${n}`;if(e.length===0)return null;const t=e[0];return{...t,mapping:t.mapping_json?JSON.parse(t.mapping_json):null}}catch(e){return console.error("[Database] ✗ Failed to read external import:",e),null}}async function Sa(n){try{return(await w` + `,Y("external_imports","UPDATE",n)}catch(t){throw console.error("[Database] ✗ Failed to update external import:",t),t}}async function Ta(n){try{const e=await b`SELECT * FROM external_imports WHERE id = ${n}`;if(e.length===0)return null;const t=e[0];return{...t,mapping:t.mapping_json?JSON.parse(t.mapping_json):null}}catch(e){return console.error("[Database] ✗ Failed to read external import:",e),null}}async function ka(n){try{return(await b` SELECT id, client_uuid, geometry_wkt, properties_json, upload_status, server_id, error_message FROM external_import_features WHERE import_id = ${n} ORDER BY id - `).map(t=>({...t,properties:t.properties_json?JSON.parse(t.properties_json):{}}))}catch(e){return console.error("[Database] ✗ Failed to read import features:",e),[]}}async function Ta(n,e){try{const t=await w` + `).map(t=>({...t,properties:t.properties_json?JSON.parse(t.properties_json):{}}))}catch(e){return console.error("[Database] ✗ Failed to read import features:",e),[]}}async function Ia(n,e){try{const t=await b` SELECT id, properties_json FROM external_import_features WHERE import_id = ${n} - `;if(t.length===0)return 0;await w`BEGIN`;let r=0;for(const o of t){const a=o.properties_json?JSON.parse(o.properties_json):{},i=e(a)??{};await w` + `;if(t.length===0)return 0;await b`BEGIN`;let r=0;for(const o of t){const a=o.properties_json?JSON.parse(o.properties_json):{},i=e(a)??{};await b` UPDATE external_import_features SET properties_json = ${JSON.stringify(i)} WHERE id = ${o.id} - `,r++}return await w`COMMIT`,Y("external_import_features","UPDATE",n),r}catch(t){try{await w`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to remap import features:",t),t}}async function La(n,e,t){try{if(t!==void 0){const r=JSON.stringify(t);await w` + `,r++}return await b`COMMIT`,Y("external_import_features","UPDATE",n),r}catch(t){try{await b`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to remap import features:",t),t}}async function Pa(n,e,t){try{if(t!==void 0){const r=JSON.stringify(t);await b` UPDATE external_import_features SET geometry_wkt = ${e}, properties_json = ${r} WHERE client_uuid = ${n} - `}else await w` + `}else await b` UPDATE external_import_features SET geometry_wkt = ${e} WHERE client_uuid = ${n} - `;Y("external_import_features","UPDATE",n)}catch(r){throw console.error("[Database] ✗ Failed to update import feature geometry:",r),r}}async function ka(n){try{const e=await w` + `;Y("external_import_features","UPDATE",n)}catch(r){throw console.error("[Database] ✗ Failed to update import feature geometry:",r),r}}async function Ma(n){try{const e=await b` SELECT import_id FROM external_import_features WHERE client_uuid = ${n} - `;if(e.length===0)return;const t=e[0].import_id;await w`BEGIN`;try{await w`DELETE FROM external_import_features WHERE client_uuid = ${n}`,await w` + `;if(e.length===0)return;const t=e[0].import_id;await b`BEGIN`;try{await b`DELETE FROM external_import_features WHERE client_uuid = ${n}`,await b` UPDATE external_imports SET feature_count = MAX(0, feature_count - 1) WHERE id = ${t} - `,await w`COMMIT`}catch(r){try{await w`ROLLBACK`}catch{}throw r}Y("external_import_features","DELETE",n),Y("external_imports","UPDATE",t)}catch(e){throw console.error("[Database] ✗ Failed to delete import feature:",e),e}}function V(n){if(n===""||n===null||n===void 0)return null;const e=Number(n);return Number.isNaN(e)?null:e}async function Ia(n){try{await w`BEGIN`,await w`DELETE FROM parcels`;let e=0;for(const t of n){const r=t.id??t.parcelid??t.parcel_id??null;if(r==null)continue;const o=t.boundary||t.geometry_wkt||t.polygon||t.wkt||(typeof t.geom=="string"?t.geom:"");await w` + `,await b`COMMIT`}catch(r){try{await b`ROLLBACK`}catch{}throw r}Y("external_import_features","DELETE",n),Y("external_imports","UPDATE",t)}catch(e){throw console.error("[Database] ✗ Failed to delete import feature:",e),e}}function X(n){if(n===""||n===null||n===void 0)return null;const e=Number(n);return Number.isNaN(e)?null:e}async function Aa(n){try{await b`BEGIN`,await b`DELETE FROM parcels`;let e=0;for(const t of n){const r=t.id??t.parcelid??t.parcel_id??null;if(r==null)continue;const o=t.boundary||t.geometry_wkt||t.polygon||t.wkt||(typeof t.geom=="string"?t.geom:"");await b` INSERT OR REPLACE INTO parcels ( id, upn, style, landuse, zone_code, zone_name, sector, block, parcel_no, prop_no, st_name, prop_add, fac_name, min_height, max_height, eff_date, lp_name, locality, mmda, last_update, remarks, geometry_wkt, created_at, updated_at, districtid, status, fetched_at ) VALUES ( - ${r}, ${t.upn??null}, ${V(t.style)}, ${t.landuse??null}, + ${r}, ${t.upn??null}, ${X(t.style)}, ${t.landuse??null}, ${t.zone_code??null}, ${t.zone_name??null}, ${t.sector??null}, ${t.block??null}, ${t.parcel_no??null}, ${t.prop_no??null}, ${t.st_name??null}, ${t.prop_add??null}, ${t.fac_name??null}, - ${V(t.min_height)}, ${V(t.max_height)}, ${t.eff_date??null}, + ${X(t.min_height)}, ${X(t.max_height)}, ${t.eff_date??null}, ${t.lp_name??null}, ${t.locality??null}, ${t.mmda??null}, ${t.last_update??null}, ${t.remarks??null}, ${o}, - ${t.created_at??null}, ${t.updated_at??null}, ${V(t.districtid)}, + ${t.created_at??null}, ${t.updated_at??null}, ${X(t.districtid)}, 'verified', CURRENT_TIMESTAMP ) - `,e++}await w`COMMIT`,console.log("[Database] ✓ Saved",e,"parcels (from",n.length,"rows,",n.length-e,"skipped/replaced)")}catch(e){try{await w`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to save parcels:",e),e}}async function Pa(){try{const n=await w`SELECT * FROM parcels ORDER BY id`;return n.length===0?null:n}catch(n){return console.error("[Database] ✗ Failed to read local parcels:",n),null}}async function Ma(n,e){try{await w` + `,e++}await b`COMMIT`,console.log("[Database] ✓ Saved",e,"parcels (from",n.length,"rows,",n.length-e,"skipped/replaced)")}catch(e){try{await b`ROLLBACK`}catch{}throw console.error("[Database] ✗ Failed to save parcels:",e),e}}async function Ca(){try{const n=await b`SELECT * FROM parcels ORDER BY id`;return n.length===0?null:n}catch(n){return console.error("[Database] ✗ Failed to read local parcels:",n),null}}async function Fa(n,e){try{await b` UPDATE parcels SET upn = ${e.upn??null}, - style = ${V(e.style)}, + style = ${X(e.style)}, landuse = ${e.landuse??null}, zone_code = ${e.zone_code??null}, zone_name = ${e.zone_name??null}, @@ -249,69 +249,69 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C st_name = ${e.st_name??null}, prop_add = ${e.prop_add??null}, fac_name = ${e.fac_name??null}, - min_height = ${V(e.min_height)}, - max_height = ${V(e.max_height)}, + min_height = ${X(e.min_height)}, + max_height = ${X(e.max_height)}, eff_date = ${e.eff_date??null}, lp_name = ${e.lp_name??null}, locality = ${e.locality??null}, mmda = ${e.mmda??null}, last_update = ${e.last_update??null}, remarks = ${e.remarks??null}, - districtid = ${V(e.districtid)}, + districtid = ${X(e.districtid)}, updated_at = CURRENT_TIMESTAMP WHERE id = ${n} - `,console.log("[Database] ✓ Parcel updated:",n),Y("parcels","UPDATE",n)}catch(t){throw console.error("[Database] ✗ Failed to update parcel:",n,t),t}}async function Ca(n,e={}){try{await w` + `,console.log("[Database] ✓ Parcel updated:",n),Y("parcels","UPDATE",n)}catch(t){throw console.error("[Database] ✗ Failed to update parcel:",n,t),t}}async function Oa(n,e={}){try{await b` INSERT INTO parcels ( id, upn, style, landuse, zone_code, zone_name, sector, block, parcel_no, prop_no, st_name, prop_add, fac_name, min_height, max_height, eff_date, lp_name, locality, mmda, last_update, remarks, geometry_wkt, created_at, updated_at, districtid, status, fetched_at ) VALUES ( - NULL, ${e.upn??null}, ${V(e.style)}, ${e.landuse??null}, + NULL, ${e.upn??null}, ${X(e.style)}, ${e.landuse??null}, ${e.zone_code??null}, ${e.zone_name??null}, ${e.sector??null}, ${e.block??null}, ${e.parcel_no??null}, ${e.prop_no??null}, ${e.st_name??null}, ${e.prop_add??null}, ${e.fac_name??null}, - ${V(e.min_height)}, ${V(e.max_height)}, ${e.eff_date??null}, + ${X(e.min_height)}, ${X(e.max_height)}, ${e.eff_date??null}, ${e.lp_name??null}, ${e.locality??null}, ${e.mmda??null}, ${e.last_update??null}, ${e.remarks??null}, ${n}, - CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ${V(e.districtid)}, + CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ${X(e.districtid)}, 'new', CURRENT_TIMESTAMP ) - `;const r=(await w`SELECT last_insert_rowid() as id`)[0]?.id;return console.log("[Database] ✓ New parcel inserted:",r,"(status: new)"),Y("parcels","INSERT",r),{id:r}}catch(t){throw console.error("[Database] ✗ Failed to insert new parcel:",t),t}}async function Aa(n){try{if(n.length>0){const e=n[0],t={};for(const[r,o]of Object.entries(e))t[r]=o===null?"null":typeof o;console.log("[Database] First footprint field types:",t)}await w`DELETE FROM building_footprints`;for(const e of n){const t=JSON.stringify(e);let r=e.polygon||e.boundary||e.geom||e.wkt||e.footprint||"";const o=typeof r=="object"?JSON.stringify(r):String(r);let a=e.id||e.footprint_id||e.building_id||null;await w` + `;const r=(await b`SELECT last_insert_rowid() as id`)[0]?.id;return console.log("[Database] ✓ New parcel inserted:",r,"(status: new)"),Y("parcels","INSERT",r),{id:r}}catch(t){throw console.error("[Database] ✗ Failed to insert new parcel:",t),t}}async function Da(n){try{if(n.length>0){const e=n[0],t={};for(const[r,o]of Object.entries(e))t[r]=o===null?"null":typeof o;console.log("[Database] First footprint field types:",t)}await b`DELETE FROM building_footprints`;for(const e of n){const t=JSON.stringify(e);let r=e.polygon||e.boundary||e.geom||e.wkt||e.footprint||"";const o=typeof r=="object"?JSON.stringify(r):String(r);let a=e.id||e.footprint_id||e.building_id||null;await b` INSERT INTO building_footprints (id, geometry_wkt, properties, fetched_at) VALUES (${a!==null&&typeof a=="object"?null:a}, ${o}, ${t}, CURRENT_TIMESTAMP) - `}console.log("[Database] ✓ Saved",n.length,"building footprints")}catch(e){throw console.error("[Database] ✗ Failed to save building footprints:",e),e}}async function Fa(){try{const n=await w`SELECT properties FROM building_footprints ORDER BY id`;return n.length===0?null:n.map(e=>JSON.parse(e.properties))}catch(n){return console.error("[Database] ✗ Failed to read local building footprints:",n),null}}async function Da(n){try{if(n.length>0){const e=n[0],t={};for(const[r,o]of Object.entries(e))t[r]=o===null?"null":typeof o;console.log("[Database] First road field types:",t)}await w`DELETE FROM osm_roads`;for(const e of n){const t=JSON.stringify(e);let r=e.geom||e.geometry||e.wkt||e.road||e.line||"";const o=typeof r=="object"?JSON.stringify(r):String(r);let a=e.osm_id??e.osmid??e.id??null;await w` + `}console.log("[Database] ✓ Saved",n.length,"building footprints")}catch(e){throw console.error("[Database] ✗ Failed to save building footprints:",e),e}}async function Ra(){try{const n=await b`SELECT properties FROM building_footprints ORDER BY id`;return n.length===0?null:n.map(e=>JSON.parse(e.properties))}catch(n){return console.error("[Database] ✗ Failed to read local building footprints:",n),null}}async function Na(n){try{if(n.length>0){const e=n[0],t={};for(const[r,o]of Object.entries(e))t[r]=o===null?"null":typeof o;console.log("[Database] First road field types:",t)}await b`DELETE FROM osm_roads`;for(const e of n){const t=JSON.stringify(e);let r=e.geom||e.geometry||e.wkt||e.road||e.line||"";const o=typeof r=="object"?JSON.stringify(r):String(r);let a=e.osm_id??e.osmid??e.id??null;await b` INSERT OR REPLACE INTO osm_roads (osm_id, geometry_wkt, properties, fetched_at) VALUES (${a!==null&&typeof a=="object"?null:a}, ${o}, ${t}, CURRENT_TIMESTAMP) - `}console.log("[Database] ✓ Saved",n.length,"OSM roads")}catch(e){throw console.error("[Database] ✗ Failed to save OSM roads:",e),e}}async function Oa(){try{const n=await w`SELECT properties FROM osm_roads ORDER BY osm_id`;return n.length===0?null:n.map(e=>JSON.parse(e.properties))}catch(n){return console.error("[Database] ✗ Failed to read local OSM roads:",n),null}}async function Ra(){return Kn.getDatabaseFile()}async function Na(n="lupmis-backup.sqlite3"){const e=await Ra(),t=new Blob([e],{type:"application/x-sqlite3"}),r=URL.createObjectURL(t),o=document.createElement("a");o.href=r,o.download=n,o.click(),URL.revokeObjectURL(r)}async function $a(){return{type:"FeatureCollection",features:(await Zn()).map(e=>({type:"Feature",properties:{id:e.id,name:e.name,category:e.category,notes:e.notes,created_at:e.created_at},geometry:{type:"Point",coordinates:[e.lon,e.lat]}}))}}async function ko(){try{const n=await w` + `}console.log("[Database] ✓ Saved",n.length,"OSM roads")}catch(e){throw console.error("[Database] ✗ Failed to save OSM roads:",e),e}}async function $a(){try{const n=await b`SELECT properties FROM osm_roads ORDER BY osm_id`;return n.length===0?null:n.map(e=>JSON.parse(e.properties))}catch(n){return console.error("[Database] ✗ Failed to read local OSM roads:",n),null}}async function Ba(){return Kn.getDatabaseFile()}async function Ga(n="lupmis-backup.sqlite3"){const e=await Ba(),t=new Blob([e],{type:"application/x-sqlite3"}),r=URL.createObjectURL(t),o=document.createElement("a");o.href=r,o.download=n,o.click(),URL.revokeObjectURL(r)}async function ja(){return{type:"FeatureCollection",features:(await Zn()).map(e=>({type:"Feature",properties:{id:e.id,name:e.name,category:e.category,notes:e.notes,created_at:e.created_at},geometry:{type:"Point",coordinates:[e.lon,e.lat]}}))}}async function ko(){try{const n=await b` SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name - `,e=await ma();return{ready:Vn,databasePath:Lo,tables:n.map(t=>t.name),locationCount:e}}catch(n){return{ready:!1,error:n.message}}}const or=Object.freeze(["parcels","building_footprints","osm_roads","collector_zones","upn_grid","remote_data"]);function nr(n){return or.includes(n)}async function rr(n){if(!nr(n))throw new Error(`Refusing to clear "${n}" — not a known cached-layer table`);const t=(await w(`SELECT COUNT(*) AS n FROM "${n}"`))[0]?.n??0;return await w(`DELETE FROM "${n}"`),console.log(`[Database] ✓ Cleared "${n}" (${t} rows)`),Y(n,"CLEAR",null),t}async function Io(){const n=await w` + `,e=await wa();return{ready:Xn,databasePath:To,tables:n.map(t=>t.name),locationCount:e}}catch(n){return{ready:!1,error:n.message}}}const or=Object.freeze(["parcels","building_footprints","osm_roads","collector_zones","upn_grid","remote_data"]);function nr(n){return or.includes(n)}async function rr(n){if(!nr(n))throw new Error(`Refusing to clear "${n}" — not a known cached-layer table`);const t=(await b(`SELECT COUNT(*) AS n FROM "${n}"`))[0]?.n??0;return await b(`DELETE FROM "${n}"`),console.log(`[Database] ✓ Cleared "${n}" (${t} rows)`),Y(n,"CLEAR",null),t}async function Io(){const n=await b` SELECT name FROM sqlite_master WHERE type='table' AND name IN ( 'parcels', 'building_footprints', 'osm_roads', 'collector_zones', 'upn_grid', 'remote_data' ) - `,e=new Set(n.map(o=>o.name)),t=[];for(const o of or)if(e.has(o))try{const a=await rr(o);t.push({table:o,count:a})}catch(a){console.error(`[Database] Failed to clear ${o}:`,a),t.push({table:o,count:0,error:a.message})}const r=t.reduce((o,a)=>o+a.count,0);return console.log(`[Database] ✓ Cleared all cached layers: ${r} rows across ${t.length} tables`),t}async function Ba(){const n=await w` + `,e=new Set(n.map(o=>o.name)),t=[];for(const o of or)if(e.has(o))try{const a=await rr(o);t.push({table:o,count:a})}catch(a){console.error(`[Database] Failed to clear ${o}:`,a),t.push({table:o,count:0,error:a.message})}const r=t.reduce((o,a)=>o+a.count,0);return console.log(`[Database] ✓ Cleared all cached layers: ${r} rows across ${t.length} tables`),t}async function Ua(){const n=await b` SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name - `;if(n.length===0)return[];const e=n.map(t=>`SELECT '${t.name}' AS name, COUNT(*) AS count FROM "${t.name}"`).join(" UNION ALL ");return w(e)}async function Ga(n,e=200){if((await w` + `;if(n.length===0)return[];const e=n.map(t=>`SELECT '${t.name}' AS name, COUNT(*) AS count FROM "${t.name}"`).join(" UNION ALL ");return b(e)}async function za(n,e=200){if((await b` SELECT name FROM sqlite_master WHERE type='table' AND name = ${n} - `).length===0)throw new Error(`Table "${n}" does not exist`);const r=await w(`SELECT * FROM "${n}" LIMIT ${e}`);return{columns:r.length>0?Object.keys(r[0]):[],rows:r}}async function ja(){console.log("=== DATABASE TEST ===");try{const n=await w`SELECT sqlite_version() as v`;console.log("1. SQLite version:",n[0].v);const e=await w`SELECT name FROM sqlite_master WHERE type='table'`;console.log("2. Tables:",e.map(o=>o.name)),console.log("3. Inserting test row..."),await w`INSERT INTO locations (name, longitude, latitude, category) VALUES ('TEST', -1.0, 7.0, 'test')`;const t=await w`SELECT * FROM locations WHERE name = 'TEST'`;console.log("4. Test row:",t);const r=await w`SELECT COUNT(*) as c FROM locations`;return console.log("5. Total rows:",r[0].c),await w`DELETE FROM locations WHERE name = 'TEST'`,console.log("6. Test row deleted"),console.log("=== TEST PASSED ==="),!0}catch(n){return console.error("=== TEST FAILED ===",n),!1}}typeof window<"u"&&(window.testDatabase=ja,window.dbStatus=ko);async function Ua(n){const{uuid:e,name:t=null,startedAt:r,districtId:o=null}=n;await w` + `).length===0)throw new Error(`Table "${n}" does not exist`);const r=await b(`SELECT * FROM "${n}" LIMIT ${e}`);return{columns:r.length>0?Object.keys(r[0]):[],rows:r}}async function qa(){console.log("=== DATABASE TEST ===");try{const n=await b`SELECT sqlite_version() as v`;console.log("1. SQLite version:",n[0].v);const e=await b`SELECT name FROM sqlite_master WHERE type='table'`;console.log("2. Tables:",e.map(o=>o.name)),console.log("3. Inserting test row..."),await b`INSERT INTO locations (name, longitude, latitude, category) VALUES ('TEST', -1.0, 7.0, 'test')`;const t=await b`SELECT * FROM locations WHERE name = 'TEST'`;console.log("4. Test row:",t);const r=await b`SELECT COUNT(*) as c FROM locations`;return console.log("5. Total rows:",r[0].c),await b`DELETE FROM locations WHERE name = 'TEST'`,console.log("6. Test row deleted"),console.log("=== TEST PASSED ==="),!0}catch(n){return console.error("=== TEST FAILED ===",n),!1}}typeof window<"u"&&(window.testDatabase=qa,window.dbStatus=ko);async function Ha(n){const{uuid:e,name:t=null,startedAt:r,districtId:o=null}=n;await b` INSERT INTO gps_trails (client_uuid, name, district_id, started_at, status) VALUES (${e}, ${t}, ${o}, ${r}, 'recording') - `;const i=(await w`SELECT last_insert_rowid() as id`)[0]?.id;return Y("gps_trails","insert",i),i}async function qa(n,e){const{seq:t,lon:r,lat:o,altitude:a=null,accuracy:i=null,altitudeAccuracy:s=null,heading:l=null,speed:c=null,satellites:d=null,timestamp:u}=e,p=typeof u=="number"?new Date(u).toISOString():u||new Date().toISOString();await w` + `;const i=(await b`SELECT last_insert_rowid() as id`)[0]?.id;return Y("gps_trails","insert",i),i}async function Wa(n,e){const{seq:t,lon:r,lat:o,altitude:a=null,accuracy:i=null,altitudeAccuracy:s=null,heading:l=null,speed:c=null,satellites:d=null,timestamp:u}=e,f=typeof u=="number"?new Date(u).toISOString():u||new Date().toISOString();await b` INSERT INTO gps_trail_points (trail_id, seq, longitude, latitude, altitude, accuracy, altitude_accuracy, heading, speed, satellites, recorded_at) VALUES - (${n}, ${t}, ${r}, ${o}, ${a}, ${i}, ${s}, ${l}, ${c}, ${d}, ${p}) - `}async function za(n,e){const{endedAt:t,pointCount:r=0,distanceM:o=0}=e;await w` + (${n}, ${t}, ${r}, ${o}, ${a}, ${i}, ${s}, ${l}, ${c}, ${d}, ${f}) + `}async function Ka(n,e){const{endedAt:t,pointCount:r=0,distanceM:o=0}=e;await b` UPDATE gps_trails SET ended_at = ${t}, point_count = ${r}, distance_m = ${o}, status = 'completed' WHERE id = ${n} - `,Y("gps_trails","update",n)}async function Ha(){return w`SELECT * FROM gps_trails WHERE synced = 0 AND status = 'completed' ORDER BY started_at ASC`}async function Wa(n){return w`SELECT * FROM gps_trail_points WHERE trail_id = ${n} ORDER BY seq ASC`}async function Ka(n,e=null){await w`UPDATE gps_trails SET synced = 1, remote_id = ${e} WHERE id = ${n}`,Y("gps_trails","update",n)}const ar=3.28084,ir=621371e-9,sr=10.7639,lr=247105e-9,cr=3861e-10;function Nt(){return localStorage.getItem("measurement-system")||"metric"}function Ft(n){if(Nt()==="imperial"){const e=n*ar;return e>=5280?Math.round(n*ir*100)/100+" mi":Math.round(e)+" ft"}return n>1e3?Math.round(n/1e3*100)/100+" km":Math.round(n*100)/100+" m"}function Xa(n){if(Nt()==="imperial"){const e=n*ar,t=n*ir;return e>=5280?`${t.toFixed(2)} mi (${e.toLocaleString("en",{maximumFractionDigits:0})} ft)`:`${e.toLocaleString("en",{maximumFractionDigits:1})} ft`}return n>=1e3?`${(n/1e3).toFixed(2)} km (${n.toLocaleString("en",{maximumFractionDigits:0})} m)`:`${n.toLocaleString("en",{maximumFractionDigits:1})} m`}function lt(n){if(Nt()==="imperial"){const e=n*lr;return e>=640?Math.round(n*cr*100)/100+" mi²":e>=1?Math.round(e*100)/100+" acres":Math.round(n*sr).toLocaleString("en")+" ft²"}return n>1e6?Math.round(n/1e6*100)/100+" km²":Math.round(n*100)/100+" m²"}function Va(n){if(Nt()==="imperial"){const e=n*sr,t=n*lr,r=n*cr;return t>=640?`${r.toFixed(2)} mi² (${t.toLocaleString("en",{maximumFractionDigits:0})} acres)`:t>=1?`${t.toLocaleString("en",{maximumFractionDigits:1})} acres (${e.toLocaleString("en",{maximumFractionDigits:0})} ft²)`:`${e.toLocaleString("en",{maximumFractionDigits:0})} ft²`}return n>1e6?`${(n/1e6).toFixed(2)} km² (${n.toLocaleString("en",{maximumFractionDigits:0})} m²)`:`${n.toLocaleString("en",{maximumFractionDigits:0})} m²`}function Ya(n){return lt(Math.PI*n*n)}function Ja(n,e,t,r,o=1e-10){const a=e[0]-n[0],i=e[1]-n[1],s=r[0]-t[0],l=r[1]-t[1],c=a*l-i*s;if(Math.abs(c)1+o||f<-o||f>1+o?null:{point:[n[0]+p*a,n[1]+p*i],t:Math.max(0,Math.min(1,p)),u:Math.max(0,Math.min(1,f))}}function dr(n){let e=0;for(let t=0,r=n.length;tn[1]!=l>n[1]&&n[0]<(s-a)*(n[1]-i)/(l-i)+a&&(t=!t)}return t}function pt(n,e){return(n[0]-e[0])**2+(n[1]-e[1])**2}function Za(n,e){const t=[];for(let o=0;oo.lineSegIdx!==a.lineSegIdx?o.lineSegIdx-a.lineSegIdx:o.lineT-a.lineT),t}function Qa(n,e){const t=e.map((a,i)=>({...a,origOrder:i}));t.sort((a,i)=>a.ringSegIdx!==i.ringSegIdx?a.ringSegIdx-i.ringSegIdx:a.ringT-i.ringT);const r=n.slice(),o=new Array(t.length);for(let a=t.length-1;a>=0;a--){const i=t[a],s=i.ringSegIdx+1,l=1e-6;if(pt(i.point,r[i.ringSegIdx])=s&&o[t[c].origOrder]++}return{ring:r,indices:o}}function Vo(n,e,t){const r=n.length-1,o=(e%r+r)%r,a=(t%r+r)%r,i=[];let s=o;for(;i.push(n[s]),s!==a;)s=(s+1)%r;return i}function Yo(n,e,t){const r=[e.point],o=e.lineSegIdx,a=t.lineSegIdx;for(let i=o+1;i<=a;i++)r.push(n[i]);return pt(r[r.length-1],t.point)>1e-10&&r.push(t.point),r}function Jo(n,e){const t=dr(n);return e&&t<0||!e&&t>0?n.slice().reverse():n}function Zo(n){if(n.length<2)return n;const e=n[0],t=n[n.length-1];return pt(e,t)>1e-10?[...n,e.slice()]:n}function ei(n,e){let t=1/0,r=1/0,o=-1/0,a=-1/0;for(const c of e)c[0]o&&(o=c[0]),c[1]>a&&(a=c[1]);const i=Math.sqrt((o-t)**2+(a-r)**2)||1,s=n.slice();if(ho(s[0],e)){const c=s[0],d=s[1],u=c[0]-d[0],p=c[1]-d[1],f=Math.sqrt(u*u+p*p)||1,h=i*2/f;s[0]=[c[0]+u*h,c[1]+p*h]}const l=s.length-1;if(ho(s[l],e)){const c=s[l],d=s[l-1],u=c[0]-d[0],p=c[1]-d[1],f=Math.sqrt(u*u+p*p)||1,h=i*2/f;s[l]=[c[0]+u*h,c[1]+p*h]}return s}function St(n,e){const t=n[0],r=n.slice(1),o=ei(e,t),a=Za(t,o);if(a.length!==2)return console.warn(`[polygonSplit] Expected 2 intersections, got ${a.length}`),null;const[i,s]=a,{ring:l,indices:c}=Qa(t,a),d=c[0],u=c[1],[p,f]=d0,T=Jo(m,S),v=Jo(_,S),x=[T],P=[v];for(const k of r){const q=ti(k);ho(q,T)?x.push(k):P.push(k)}return[x,P]}function ti(n){let e=0,t=0;const r=n.length-1;for(let o=0;o=5280?Math.round(n*ir*100)/100+" mi":Math.round(e)+" ft"}return n>1e3?Math.round(n/1e3*100)/100+" km":Math.round(n*100)/100+" m"}function Ja(n){if(Nt()==="imperial"){const e=n*ar,t=n*ir;return e>=5280?`${t.toFixed(2)} mi (${e.toLocaleString("en",{maximumFractionDigits:0})} ft)`:`${e.toLocaleString("en",{maximumFractionDigits:1})} ft`}return n>=1e3?`${(n/1e3).toFixed(2)} km (${n.toLocaleString("en",{maximumFractionDigits:0})} m)`:`${n.toLocaleString("en",{maximumFractionDigits:1})} m`}function ct(n){if(Nt()==="imperial"){const e=n*lr;return e>=640?Math.round(n*cr*100)/100+" mi²":e>=1?Math.round(e*100)/100+" acres":Math.round(n*sr).toLocaleString("en")+" ft²"}return n>1e6?Math.round(n/1e6*100)/100+" km²":Math.round(n*100)/100+" m²"}function Za(n){if(Nt()==="imperial"){const e=n*sr,t=n*lr,r=n*cr;return t>=640?`${r.toFixed(2)} mi² (${t.toLocaleString("en",{maximumFractionDigits:0})} acres)`:t>=1?`${t.toLocaleString("en",{maximumFractionDigits:1})} acres (${e.toLocaleString("en",{maximumFractionDigits:0})} ft²)`:`${e.toLocaleString("en",{maximumFractionDigits:0})} ft²`}return n>1e6?`${(n/1e6).toFixed(2)} km² (${n.toLocaleString("en",{maximumFractionDigits:0})} m²)`:`${n.toLocaleString("en",{maximumFractionDigits:0})} m²`}function Qa(n){return ct(Math.PI*n*n)}function ei(n,e,t,r,o=1e-10){const a=e[0]-n[0],i=e[1]-n[1],s=r[0]-t[0],l=r[1]-t[1],c=a*l-i*s;if(Math.abs(c)1+o||p<-o||p>1+o?null:{point:[n[0]+f*a,n[1]+f*i],t:Math.max(0,Math.min(1,f)),u:Math.max(0,Math.min(1,p))}}function dr(n){let e=0;for(let t=0,r=n.length;tn[1]!=l>n[1]&&n[0]<(s-a)*(n[1]-i)/(l-i)+a&&(t=!t)}return t}function ft(n,e){return(n[0]-e[0])**2+(n[1]-e[1])**2}function ti(n,e){const t=[];for(let o=0;oo.lineSegIdx!==a.lineSegIdx?o.lineSegIdx-a.lineSegIdx:o.lineT-a.lineT),t}function oi(n,e){const t=e.map((a,i)=>({...a,origOrder:i}));t.sort((a,i)=>a.ringSegIdx!==i.ringSegIdx?a.ringSegIdx-i.ringSegIdx:a.ringT-i.ringT);const r=n.slice(),o=new Array(t.length);for(let a=t.length-1;a>=0;a--){const i=t[a],s=i.ringSegIdx+1,l=1e-6;if(ft(i.point,r[i.ringSegIdx])=s&&o[t[c].origOrder]++}return{ring:r,indices:o}}function Xo(n,e,t){const r=n.length-1,o=(e%r+r)%r,a=(t%r+r)%r,i=[];let s=o;for(;i.push(n[s]),s!==a;)s=(s+1)%r;return i}function Yo(n,e,t){const r=[e.point],o=e.lineSegIdx,a=t.lineSegIdx;for(let i=o+1;i<=a;i++)r.push(n[i]);return ft(r[r.length-1],t.point)>1e-10&&r.push(t.point),r}function Jo(n,e){const t=dr(n);return e&&t<0||!e&&t>0?n.slice().reverse():n}function Zo(n){if(n.length<2)return n;const e=n[0],t=n[n.length-1];return ft(e,t)>1e-10?[...n,e.slice()]:n}function ni(n,e){let t=1/0,r=1/0,o=-1/0,a=-1/0;for(const c of e)c[0]o&&(o=c[0]),c[1]>a&&(a=c[1]);const i=Math.sqrt((o-t)**2+(a-r)**2)||1,s=n.slice();if(ho(s[0],e)){const c=s[0],d=s[1],u=c[0]-d[0],f=c[1]-d[1],p=Math.sqrt(u*u+f*f)||1,h=i*2/p;s[0]=[c[0]+u*h,c[1]+f*h]}const l=s.length-1;if(ho(s[l],e)){const c=s[l],d=s[l-1],u=c[0]-d[0],f=c[1]-d[1],p=Math.sqrt(u*u+f*f)||1,h=i*2/p;s[l]=[c[0]+u*h,c[1]+f*h]}return s}function Lt(n,e){const t=n[0],r=n.slice(1),o=ni(e,t),a=ti(t,o);if(a.length!==2)return console.warn(`[polygonSplit] Expected 2 intersections, got ${a.length}`),null;const[i,s]=a,{ring:l,indices:c}=oi(t,a),d=c[0],u=c[1],[f,p]=d0,L=Jo(y,x),v=Jo(_,x),S=[L],P=[v];for(const k of r){const z=ri(k);ho(z,L)?S.push(k):P.push(k)}return[S,P]}function ri(n){let e=0,t=0;const r=n.length-1;for(let o=0;o{a.style.opacity="1",a.style.transform="translateY(0)"});const i=()=>{a.style.opacity="0",a.style.transform="translateY(-8px)",setTimeout(()=>a.remove(),300)};a.addEventListener("click",i),setTimeout(i,t)}const bt=[{stroke:"#ef4444",fill:"rgba(239,68,68,0.25)"},{stroke:"#3b82f6",fill:"rgba(59,130,246,0.25)"}],ni=new M({stroke:new I({color:"#0ea5e9",width:3}),fill:new C({color:"rgba(14,165,233,0.15)"})}),ri=new M({stroke:new I({color:"#f43f5e",width:2,lineDash:[8,6]}),image:new fe({radius:5,fill:new C({color:"#f43f5e"}),stroke:new I({color:"#fff",width:1.5})})});class ai extends xo{constructor(e={}){super({handleEvent:t=>this._handleEvent(t)}),this.snapDistance_=e.snapDistance||25,this._sources=e.sources?Array.isArray(e.sources)?e.sources:[e.sources]:null,this._phase="select",this._selectedFeature=null,this._selectedSource=null,this._drawInteraction=null,this._splitFeatures=null,this._overlaySource=new j({useSpatialIndex:!1}),this._overlayLayer=new N({source:this._overlaySource,displayInLayerSwitcher:!1,style:ni})}setMap(e){this.getMap()&&(this.getMap().removeLayer(this._overlayLayer),this._removeDrawInteraction()),super.setMap(e),e&&this._overlayLayer.setMap(e)}setActive(e){super.setActive(e),e||this._reset()}_getSources(){if(this._sources)return this._sources;if(!this.getMap())return[];const e=[],t=r=>{r.forEach(o=>{o.getVisible()&&(o.getSource&&o.getSource()instanceof j?e.push(o.getSource()):o.getLayers&&t(o.getLayers()))})};return t(this.getMap().getLayers()),e}_handleEvent(e){if(!this.getActive())return!0;if(this._phase==="select"){if(e.type==="pointermove")return this._onSelectMove(e);if(e.type==="singleclick")return this._onSelectClick(e)}if(this._phase==="draw"&&e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._cancelDraw(),!1;if(this._phase==="pick"){if(e.type==="pointermove")return this._onPickMove(e);if(e.type==="singleclick")return this._onPickClick(e);if(e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._reset(),!1}return!0}_onSelectMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestPolygon(e);if(r){const o=r.feature.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onSelectClick(e){const t=this._closestPolygon(e);if(!t)return!0;this._selectedFeature=t.feature,this._selectedSource=t.source,this._overlaySource.clear();const r=t.feature.clone();return this._overlaySource.addFeature(r),this._startDrawPhase(),!1}_closestPolygon(e){let t=null,r=this.snapDistance_+1;for(const o of this._getSources()){const a=o.getClosestFeatureToCoordinate(e.coordinate);if(!a)continue;const i=a.getGeometry();if(!i)continue;const s=i.getType();if(s!=="Polygon"&&s!=="MultiPolygon")continue;const l=i.getClosestPoint(e.coordinate),d=new he([e.coordinate,l]).getLength()/e.frameState.viewState.resolution;d{const r=t.feature.getGeometry().getCoordinates();this._performSplit(r)}),e.addInteraction(this._drawInteraction))}_removeDrawInteraction(){this._drawInteraction&&this.getMap()&&this.getMap().removeInteraction(this._drawInteraction),this._drawInteraction=null}_cancelDraw(){this._removeDrawInteraction(),this._reset()}_performSplit(e){const t=this._selectedFeature,r=this._selectedSource,o=t.getGeometry();let a;o.getType()==="Polygon"?a=o.getCoordinates():o.getType()==="MultiPolygon"&&(a=o.getCoordinates()[0]);const i=St(a,e);if(!i){console.warn("[PolygonSplit] Split failed — line must cross the polygon boundary at exactly 2 points."),this._removeDrawInteraction(),this._startDrawPhase();return}const[s,l]=i,c=t.clone();c.setGeometry(new dt(s)),c.setStyle(new M({stroke:new I({color:bt[0].stroke,width:2.5}),fill:new C({color:bt[0].fill})}));const d=t.clone();d.setGeometry(new dt(l)),d.setStyle(new M({stroke:new I({color:bt[1].stroke,width:2.5}),fill:new C({color:bt[1].fill})}));const u=[c,d];if(this.dispatchEvent({type:"beforesplit",original:t,features:u}),r.dispatchEvent({type:"beforesplit",original:t,features:u}),r.removeFeature(t),r.addFeature(c),r.addFeature(d),this.dispatchEvent({type:"aftersplit",original:t,features:u}),r.dispatchEvent({type:"aftersplit",original:t,features:u}),this._removeDrawInteraction(),t.get("_layerType")==="parcel"){this._splitFeatures=u,this._phase="pick",this._overlaySource.clear();const f=this.getMap();f&&(f.getTargetElement().style.cursor=""),G("Click the polygon that should keep the original identifier.","info",5e3),this.dispatchEvent({type:"splitparcel",features:u,originalProps:t.getProperties(),source:r})}else this._reset()}_onPickMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestSplitPiece(e);if(r){const o=r.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onPickClick(e){const t=this._closestSplitPiece(e);return t?(this.dispatchEvent({type:"splitpick",picked:t,features:this._splitFeatures}),this._reset(),!1):!0}_closestSplitPiece(e){if(!this._splitFeatures)return null;let t=null,r=this.snapDistance_+1;for(const o of this._splitFeatures){const a=o.getGeometry();if(!a)continue;const i=a.getClosestPoint(e.coordinate),l=new he([e.coordinate,i]).getLength()/e.frameState.viewState.resolution;ln[1]!=l>n[1]&&n[0]<(s-a)*(n[1]-i)/(l-i)+a&&(t=!t)}return t}function si(n,e){const t=at(n);return e&&t<0||!e&&t>0?n.slice().reverse():n}function li(n){return n.length<2?n:He(n[0],n[n.length-1])>1e-10?[...n,n[0].slice()]:n}function Ue(n,e,t){const r=t[0]-e[0],o=t[1]-e[1],a=r*r+o*o;if(a<1e-20)return He(n,e);let i=((n[0]-e[0])*r+(n[1]-e[1])*o)/a;i=Math.max(0,Math.min(1,i));const s=e[0]+i*r,l=e[1]+i*o;return(n[0]-s)**2+(n[1]-l)**2}function en(n,e){let t=0,r=1/0;const o=n.length-1;for(let a=0;a0;){const v=(b+1)%a,x=g?(S-1+i)%i:(S+1)%i;if(v===m||x===_)break;if(Ne(n[v],e[x],s)){b=v,S=x;continue}if(Ue(n[v],e[S],e[x])0;){const v=(m-1+a)%a,x=g?(_+1)%i:(_-1+i)%i;if(v===b||x===S)break;if(Ne(n[v],e[x],s)){m=v,_=x;continue}if(Ue(n[v],e[_],e[x])r+1)););return o}function di(n,e,t,r,o=5){const a=n[0],i=e[0],s=n.slice(1),l=e.slice(1),c=en(a,t),d=en(i,r),u=ci(a,i,c.segIdx,d.segIdx,o);if(!u)return console.warn("[polygonMerge] Could not find shared boundary between polygons — seed edges are not near the other ring"),{coords:null,error:"The selected edges are not on a shared boundary. Click edges that lie on the common border between the two polygons."};const{startA:p,endA:f,startB:h,endB:y,reversed:g}=u;a.length-1,i.length-1;const m=Wt(a,f,p);let b;g?b=Wt(i,h,y):b=Wt(i,y,h);const _=[...m,...b.slice(1)],S=o*o;_.length>2&&He(_[_.length-1],_[0])k*1.5)return console.warn(`[polygonMerge] Area mismatch: A=${v.toFixed(1)}, B=${x.toFixed(1)}, merged=${P.toFixed(1)}, expected≈${k.toFixed(1)}`),{coords:null,error:"Merge produced an invalid polygon (area mismatch). The polygons may not be truly adjacent — try clicking closer to the shared boundary."};const q=at(a)>0,z=si(T,q),$=[...s,...l].filter(ce=>{const Q=ce.reduce((H,be)=>H+be[0],0)/(ce.length-1),ye=ce.reduce((H,be)=>H+be[1],0)/(ce.length-1);return ii([Q,ye],z)});return{coords:[z,...$]}}const tn=new M({stroke:new I({color:"#0ea5e9",width:3}),fill:new C({color:"rgba(14,165,233,0.15)"})}),ui=new M({stroke:new I({color:"#f59e0b",width:3}),fill:new C({color:"rgba(245,158,11,0.15)"})}),pi=new M({stroke:new I({color:"#0ea5e9",width:3}),fill:new C({color:"rgba(14,165,233,0.15)"}),text:new ut({text:"A",font:"bold 22px Exo, sans-serif",fill:new C({color:"#0ea5e9"}),stroke:new I({color:"#fff",width:4}),overflow:!0})}),fi=new M({stroke:new I({color:"#f59e0b",width:3}),fill:new C({color:"rgba(245,158,11,0.15)"}),text:new ut({text:"B",font:"bold 22px Exo, sans-serif",fill:new C({color:"#f59e0b"}),stroke:new I({color:"#fff",width:4}),overflow:!0})}),hi=new M({stroke:new I({color:"#ec4899",width:4,lineDash:[10,6]})}),gi=new M({stroke:new I({color:"#10b981",width:2.5}),fill:new C({color:"rgba(16,185,129,0.3)"})});class mi extends xo{constructor(e={}){super({handleEvent:t=>this._handleEvent(t)}),this.snapDistance_=e.snapDistance||25,this.tolerance_=e.tolerance||5,this._phase="select_a",this._featureA=null,this._sourceA=null,this._featureB=null,this._sourceB=null,this._edgeClickA=null,this._edgeClickB=null,this._highlightSource=new j({useSpatialIndex:!1}),this._highlightLayer=new N({source:this._highlightSource,displayInLayerSwitcher:!1,style:t=>t.get("_highlightStyle")||tn}),this._edgeSource=new j({useSpatialIndex:!1}),this._edgeLayer=new N({source:this._edgeSource,displayInLayerSwitcher:!1,style:hi})}setMap(e){this.getMap()&&(this.getMap().removeLayer(this._highlightLayer),this.getMap().removeLayer(this._edgeLayer)),super.setMap(e),e&&(this._highlightLayer.setMap(e),this._edgeLayer.setMap(e))}setActive(e){super.setActive(e),e||this._reset()}_getSources(){if(!this.getMap())return[];const e=[],t=r=>{r.forEach(o=>{o.getVisible()&&(o.getSource&&o.getSource()instanceof j?e.push(o.getSource()):o.getLayers&&t(o.getLayers()))})};return t(this.getMap().getLayers()),e}_handleEvent(e){if(!this.getActive())return!0;if(e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._reset(),!1;switch(this._phase){case"select_a":if(e.type==="pointermove")return this._onSelectMove(e,null);if(e.type==="singleclick")return this._onSelectAClick(e);break;case"select_b":if(e.type==="pointermove")return this._onSelectMove(e,this._featureA);if(e.type==="singleclick")return this._onSelectBClick(e);break;case"click_edge_a":if(e.type==="pointermove")return this._onEdgeMove(e,this._featureA);if(e.type==="singleclick")return this._onEdgeAClick(e);break;case"click_edge_b":if(e.type==="pointermove")return this._onEdgeMove(e,this._featureB);if(e.type==="singleclick")return this._onEdgeBClick(e);break}return!0}_onSelectMove(e,t){const r=this.getMap();if(!r)return!0;this._highlightSource.clear(),this._edgeSource.clear(),this._rebuildHighlights();const o=this._closestPolygon(e,t);if(o){const a=this._phase==="select_a"?tn:ui,i=o.feature.clone();i.set("_highlightStyle",a),this._highlightSource.addFeature(i),r.getTargetElement().style.cursor="pointer"}else r.getTargetElement().style.cursor="";return!0}_onSelectAClick(e){const t=this._closestPolygon(e,null);return t?(this._featureA=t.feature,this._sourceA=t.source,this._phase="select_b",this._rebuildHighlights(),!1):!0}_onSelectBClick(e){const t=this._closestPolygon(e,this._featureA);return t?(this._featureB=t.feature,this._sourceB=t.source,this._phase="click_edge_a",this._rebuildHighlights(),this.getMap().getTargetElement().style.cursor="crosshair",!1):!0}_closestPolygon(e,t){let r=null,o=this.snapDistance_+1;for(const a of this._getSources()){const i=a.getClosestFeatureToCoordinate(e.coordinate);if(!i||t&&i===t)continue;const s=i.getGeometry();if(!s)continue;const l=s.getType();if(l!=="Polygon"&&l!=="MultiPolygon")continue;const c=s.getClosestPoint(e.coordinate),u=new he([e.coordinate,c]).getLength()/e.frameState.viewState.resolution;u{t.get("_permanent")&&e.push(t)}),e.forEach(t=>this._highlightSource.removeFeature(t)),this._featureA){const t=this._featureA.clone();t.set("_highlightStyle",pi),t.set("_permanent",!0),this._highlightSource.addFeature(t)}if(this._featureB){const t=this._featureB.clone();t.set("_highlightStyle",fi),t.set("_permanent",!0),this._highlightSource.addFeature(t)}}_reset(){this._phase="select_a",this._featureA=null,this._sourceA=null,this._featureB=null,this._sourceB=null,this._edgeClickA=null,this._edgeClickB=null,this._highlightSource.clear(),this._edgeSource.clear();const e=this.getMap();e&&(e.getTargetElement().style.cursor="")}}function yi(n,e){return(n[0]-e[0])**2+(n[1]-e[1])**2}function on(n){let e=0;for(let t=0,r=n.length;tt&&(t=d,r=c)}const o=n[r],a=n[r+1],i=Math.sqrt(t),s=[(a[0]-o[0])/i,(a[1]-o[1])/i],l=[-s[1],s[0]];return{p0:o,p1:a,along:s,perp:l}}function Kt(n,e,t,r,o){const a=n[0]+r*e[0],i=n[1]+r*e[1];return[[a-o*t[0],i-o*t[1]],[a+o*t[0],i+o*t[1]]]}function $e(n,e,t){const r=n[0],o=r.length-1;let a=0,i=0;for(let c=0;cu&&(u=_)}const p=(u-d)*1.5,f=[];let h=n,y=e;for(let g=0;gv&&(v=Q)}let x=T,P=v,k=null,q=null,z=1/0;for(let Z=0;Z<40;Z++){const $=(x+P)/2,ce=Kt(l,i,s,$,p),Q=St(h,ce);if(!Q){const D=(P-x)*.01,W=Kt(l,i,s,$+D,p),re=St(h,W);if(re){const[Te,Le]=re,Xe=$e(Te,l,i),Ve=$e(Le,l,i),Ye=Xethis._handleEvent(t)}),this.snapDistance_=e.snapDistance||25,this._sources=e.sources?Array.isArray(e.sources)?e.sources:[e.sources]:null,this._phase="select",this._selectedFeature=null,this._selectedSource=null,this._selectedEdge=null,this._dividedFeatures=null,this._overlaySource=new j({useSpatialIndex:!1}),this._overlayLayer=new N({source:this._overlaySource,displayInLayerSwitcher:!1,style:_i}),this._edgeSource=new j({useSpatialIndex:!1}),this._edgeLayer=new N({source:this._edgeSource,displayInLayerSwitcher:!1,style:vi})}setMap(e){this.getMap()&&(this.getMap().removeLayer(this._overlayLayer),this.getMap().removeLayer(this._edgeLayer)),super.setMap(e),e&&(this._overlayLayer.setMap(e),this._edgeLayer.setMap(e))}setActive(e){super.setActive(e),e||this._reset()}_getSources(){if(this._sources)return this._sources;if(!this.getMap())return[];const e=[],t=r=>{r.forEach(o=>{o.getVisible()&&(o.getSource&&o.getSource()instanceof j?e.push(o.getSource()):o.getLayers&&t(o.getLayers()))})};return t(this.getMap().getLayers()),e}_handleEvent(e){if(!this.getActive())return!0;if(e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._phase==="form"?this.cancelDivide():this._reset(),!1;if(this._phase==="select"){if(e.type==="pointermove")return this._onSelectMove(e);if(e.type==="singleclick")return this._onSelectClick(e)}if(this._phase==="edge"){if(e.type==="pointermove")return this._onEdgeMove(e);if(e.type==="singleclick")return this._onEdgeClick(e)}if(this._phase==="pick"){if(e.type==="pointermove")return this._onPickMove(e);if(e.type==="singleclick")return this._onPickClick(e)}return!0}_onSelectMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestPolygon(e);if(r){const o=r.feature.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onSelectClick(e){const t=this._closestPolygon(e);if(!t)return!0;this._selectedFeature=t.feature,this._selectedSource=t.source,this._overlaySource.clear();const r=t.feature.clone();return r.set("_permanent",!0),this._overlaySource.addFeature(r),this._phase="edge",G("Click the edge to divide along.","info",3e3),!1}_closestPolygon(e){let t=null,r=this.snapDistance_+1;for(const o of this._getSources()){const a=o.getClosestFeatureToCoordinate(e.coordinate);if(!a)continue;const i=a.getGeometry();if(!i)continue;const s=i.getType();if(s!=="Polygon"&&s!=="MultiPolygon")continue;const l=i.getClosestPoint(e.coordinate),d=new he([e.coordinate,l]).getLength()/e.frameState.viewState.resolution;d{const h=t.clone();return h.setGeometry(new dt(p)),h.setStyle(new M({stroke:new I({color:s[f].stroke,width:2.5}),fill:new C({color:s[f].fill})})),h}),c={type:"beforedivide",original:t,features:l};this.dispatchEvent(c),r.dispatchEvent({...c}),r.removeFeature(t);for(const p of l)r.addFeature(p);const d={type:"afterdivide",original:t,features:l};this.dispatchEvent(d),r.dispatchEvent({...d}),t.get("_layerType")==="parcel"?(this._dividedFeatures=l,this._phase="pick",G("Click the polygon that should keep the original identifier.","info",5e3),this.dispatchEvent({type:"dividedparcel",features:l,originalProps:t.getProperties(),source:r})):(G(`Polygon divided into ${e} equal pieces.`,"success"),this._reset())}_onPickMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestDividedPiece(e);if(r){const o=r.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onPickClick(e){const t=this._closestDividedPiece(e);return t?(this.dispatchEvent({type:"dividepick",picked:t,features:this._dividedFeatures}),this._reset(),!1):!0}_closestDividedPiece(e){if(!this._dividedFeatures)return null;let t=null,r=this.snapDistance_+1;for(const o of this._dividedFeatures){const a=o.getGeometry();if(!a)continue;const i=a.getClosestPoint(e.coordinate),l=new he([e.coordinate,i]).getLength()/e.frameState.viewState.resolution;l{const l=this.categoryEmojis[s];return l?l.emoji:"📍"},this.getCategoryOptionsHtml=()=>Object.entries(this.categoryEmojis).map(([s,{emoji:l,label:c}])=>``).join(` - `),this.createEmojiStyle=(s,l=24)=>new M({text:new ut({text:s,font:`${l}px sans-serif`,textBaseline:"bottom",textAlign:"center",offsetY:-5})}),this.defaultStyle=this.createEmojiStyle("📍",32),this.selectedStyle=this.createEmojiStyle("📍",42),this.categoryStyles={};for(const[s,{emoji:l}]of Object.entries(this.categoryEmojis))this.categoryStyles[s]=this.createEmojiStyle(l,32);const r=this.createBaseLayers(t.basemap||"topo");this.markersLayer=new N({title:"Markers",source:this.markerSource,style:s=>this.getFeatureStyle(s),visible:!1}),this.overlayGroup=new ke({title:"Overlays"}),this.map=new Ro({target:e,layers:[r,this.markersLayer,this.overlayGroup],view:new $r({center:ee(t.center||[0,0]),zoom:t.zoom||2,minZoom:t.minZoom||2,maxZoom:t.maxZoom||19})});const o=new Wr({collapsed:!0,mouseover:!0,extent:!0,trash:!1,oninfo:null});this.map.addControl(o),queueMicrotask(()=>{const s=o.element?.querySelector(":scope > button");if(s){const l="/".replace(/\/?$/,"/");s.style.backgroundImage=`url('${l}app-icons/luspa-72x72.png')`}});let a=!1;o.on("drawlist",s=>{this._decorateLayerListItem(s.layer,s.li),a||(a=!0,queueMicrotask(()=>{a=!1,this._refreshLayerSwitcherChrome(o)}))}),this.map.getLayers().on("change",()=>{this._refreshLayerSwitcherChrome(o)}),this._wireLayerSwitcherVisibilityHooks(o),this._createAddLayerDialog(),this._createLegendPanel(),this.scaleBar=new Br({bar:!0,steps:4,text:!0,minWidth:140}),this.map.addControl(this.scaleBar),this._initGpsRendering(),this._createLocationControl(),this._createBaseMapPicker();const i=new Kr({placeholder:"Search location...",typing:300,minLength:3,maxItems:10,collapsed:!0});this.map.addControl(i),i.on("select",s=>{const l=s.search;if(l){const c=parseFloat(l.lon),d=parseFloat(l.lat),u=[c,d],p=ee(u);this.navigateTo(c,d,14);const f={coordinate:p,lonLat:u,name:l.display_name||l.name||"Unknown",searchResult:l};this.searchSelectCallbacks.forEach(h=>h(f))}}),this.searchNominatim=i,this.searchSelectCallbacks=[],this.selectedFeature=null,this.createPopup(),this.createInfoPopup(),this.createAddLocationPopup(),this.createParcelEditPopup(),this.createDrawnPolygonPopup(),this.createMergePopup(),this.createDividePopup(),this.dblClickCallbacks=[],this.editBar=null,this.drawingsSource=null,this.drawingsLayer=null,this.touchCursor=null,this._editBarActive=!1}initEditBar(){this.drawingsSource=new j,this.drawingsLayer=new N({title:"sketches",source:this.drawingsSource,style:new M({stroke:new I({color:"#f59e0b",width:2.5}),fill:new C({color:"rgba(245,158,11,0.15)"}),image:new fe({radius:6,fill:new C({color:"#f59e0b"}),stroke:new I({color:"#fff",width:1.5})})})}),this._drawingsGroup=new ke({title:"Drawings",layers:[this.drawingsLayer]});const e=this.map.getLayers(),t=e.getArray().indexOf(this.overlayGroup);e.insertAt(t>=0?t:e.getLength(),this._drawingsGroup),this._selectInteraction=new Gr({condition:jr,filter:(f,h)=>!!h,layers:f=>f instanceof N}),this._selectInteraction.setActive(!1),this.map.addInteraction(this._selectInteraction),this._modifyInteraction=new Xr({features:this._selectInteraction.getFeatures()}),this._modifyInteraction.setActive(!1),this._modifyInteraction.on("modifyend",f=>{if(!this._featureModifiedCallbacks?.length)return;const h=f.features?.getArray?.()||[];for(const y of h)for(const g of this._featureModifiedCallbacks)try{g(y)}catch(m){console.warn("[MapView] onFeatureModified callback failed:",m)}}),this._undoRedo=new Vr,this.map.addInteraction(this._undoRedo),this.editBar=new co({source:this.drawingsSource,interactions:{Select:this._selectInteraction,ModifySelect:this._modifyInteraction,DrawPoint:!0,DrawLine:!0,DrawPolygon:!0,DrawRegular:!0,DrawHole:!0,Delete:!0,Info:!0,Transform:!0,Split:!1}}),this.map.addControl(this.editBar),this._setupVertexOverlay();const r=new Bo({group:!0,className:"ol-editbar-actions",controls:[new rt({html:'',className:"ol-undo",title:"Undo",handleClick:()=>{this._undoRedo.hasUndo()&&this._undoRedo.undo()}}),new rt({html:'',className:"ol-redo",title:"Redo",handleClick:()=>{this._undoRedo.hasRedo()&&this._undoRedo.redo()}}),new rt({html:'',className:"ol-save",title:"Save drawings",handleClick:()=>{this.dispatchEditEvent("save")}})]});this.editBar.addControl(r),this._lineSplitInteraction=new Yr,this._polygonSplitInteraction=new ai,this.map.addInteraction(this._lineSplitInteraction),this.map.addInteraction(this._polygonSplitInteraction),this._lineSplitInteraction.setActive(!1),this._polygonSplitInteraction.setActive(!1),this._polygonSplitInteraction.on("splitpick",f=>{const h=["UPN","upn","id","parcelid","parcel_id","PARCELID","PARCEL_ID","ID"];for(const y of f.features)if(y!==f.picked)for(const g of h)y.get(g)!==void 0&&y.set(g,"")}),this._polygonDivideInteraction=new xi,this.map.addInteraction(this._polygonDivideInteraction),this._polygonDivideInteraction.setActive(!1);const o=new xe({html:'',className:"ol-split-line",title:"Split Lines",name:"SplitLine",interaction:this._lineSplitInteraction,autoActivate:!0}),a=new xe({html:'',className:"ol-split-polygon",title:"Split Polygons",name:"SplitPolygon",interaction:this._polygonSplitInteraction}),i=new xe({html:'',className:"ol-split-divide",title:"Divide Polygon",name:"DividePolygon",interaction:this._polygonDivideInteraction}),s=new Bo({toggleOne:!0,autoDeactivate:!0,controls:[o,a,i]}),l=new xe({className:"ol-split",title:"Split",name:"Split",bar:s,onToggle:f=>{f||(this._lineSplitInteraction.setActive(!1),this._polygonSplitInteraction.setActive(!1),this._polygonDivideInteraction.setActive(!1))}});this.editBar.addControl(l),this._polygonDivideInteraction.on("divideform",f=>{this.showDividePopup(f.feature,f.source,f.coordinate)}),this._polygonDivideInteraction.on("dividecancel",()=>{this.hideDividePopup()}),this._polygonDivideInteraction.on("dividepick",f=>{const h=["UPN","upn","id","parcelid","parcel_id","PARCELID","PARCEL_ID","ID"];for(const y of f.features)if(y!==f.picked)for(const g of h)y.get(g)!==void 0&&y.set(g,"")}),this._polygonMergeInteraction=new mi,this.map.addInteraction(this._polygonMergeInteraction),this._polygonMergeInteraction.setActive(!1);const c=new xe({html:'',className:"ol-merge",title:"Merge Polygons",name:"Merge",interaction:this._polygonMergeInteraction});this.editBar.addControl(c),this._polygonMergeInteraction.on("mergedparcel",f=>{this.showMergeIdentifierPopup(f.merged,f.propsA,f.propsB,f.coordinate)});const d=this.editBar.element;if(d&&r.element&&r.element.parentNode===d){const f=document.createElement("div");f.className="ol-editbar-break",d.insertBefore(f,r.element)}this._snapGuidesEnabled=localStorage.getItem("snap-guides-enabled")==="1",this._snapGuides=new Jr({pixelTolerance:10,vectorClass:Ur}),this.map.addInteraction(this._snapGuides);const u=["DrawPoint","DrawLine","DrawPolygon","DrawHole","DrawRegular"];for(const f of u){const h=this.editBar.getInteraction(f);h&&h.on("change:active",()=>{h.getActive()&&this._snapGuides.setDrawInteraction(h)})}this._modifyInteraction&&this._snapGuides.setModifyInteraction(this._modifyInteraction);const p=new rt({html:'',className:"ol-snap-toggle"+(this._snapGuidesEnabled?" ol-active":""),title:"Toggle Snap Guides",handleClick:()=>{this._snapGuidesEnabled=!this._snapGuidesEnabled,localStorage.setItem("snap-guides-enabled",this._snapGuidesEnabled?"1":"0"),p.element.classList.toggle("ol-active",this._snapGuidesEnabled),this._snapGuides&&this._snapGuides.setActive(this._snapGuidesEnabled&&this._editBarActive),console.log("[MapView] Snap guides:",this._snapGuidesEnabled?"ON":"OFF")}});this._snapToggleBtn=p,r.addControl(p),this.setEditMode(!1),this._drawingsGroup.on("change:visible",()=>{const f=this._drawingsGroup.getVisible();this.setEditMode(f)}),this._isTouchOnlyDevice()?(this.touchCursor=new Go({className:"ol-editbar-cursor"}),this.map.addInteraction(this.touchCursor),this.touchCursor.setActive(!1),console.log("[MapView] Touch-only device detected — TouchCursor added")):console.log("[MapView] Fine pointer available — TouchCursor skipped"),this._installPointerCapabilityWatcher(),this.drawingsSource.on("addfeature",f=>{const h=f.feature,y=h.getGeometry();if(!y||y.getType()!=="Polygon")return;const g=y.getInteriorPoint().getCoordinates();this.showDrawnPolygonPopup(h,g)}),console.log("[MapView] EditBar initialised with Drawings group, UndoRedo and SnapGuides (default:",this._snapGuidesEnabled?"ON":"OFF",")")}dispatchEditEvent(e){if(!this._editEventListeners)return;const t=this._editEventListeners[e];t&&t.forEach(r=>r())}onEditEvent(e,t){this._editEventListeners||(this._editEventListeners={}),this._editEventListeners[e]||(this._editEventListeners[e]=[]),this._editEventListeners[e].push(t)}setEditMode(e){this._editBarActive=!!e,this.editBar&&(this.editBar.setVisible(this._editBarActive),this._editBarActive||this.editBar.deactivateControls()),this._selectInteraction&&(this._editBarActive||this._selectInteraction.getFeatures().clear(),this._selectInteraction.setActive(this._editBarActive)),this._modifyInteraction&&this._modifyInteraction.setActive(this._editBarActive),this._snapGuides&&this._snapGuides.setActive(this._snapGuidesEnabled&&this._editBarActive),this.touchCursor&&this.touchCursor.setActive(this._editBarActive),!this._editBarActive&&this._vertexOverlaySource&&this._vertexOverlaySource.clear(),console.log("[MapView] Edit mode:",this._editBarActive?"ON":"OFF")}isEditMode(){return this._editBarActive}_isTouchOnlyDevice(){if(!("ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0))return!1;if(typeof window.matchMedia!="function")return!0;const t=window.matchMedia("(any-pointer: fine)").matches,r=window.matchMedia("(any-hover: hover)").matches;return!t&&!r}_refreshTouchCursor(){const e=this._isTouchOnlyDevice();e&&!this.touchCursor?(this.touchCursor=new Go({className:"ol-editbar-cursor"}),this.map.addInteraction(this.touchCursor),this.touchCursor.setActive(this._editBarActive),console.log("[MapView] Pointer change → TouchCursor added")):!e&&this.touchCursor&&(this.map.removeInteraction(this.touchCursor),this.touchCursor=null,console.log("[MapView] Pointer change → TouchCursor removed (fine pointer present)"))}_installPointerCapabilityWatcher(){if(typeof window.matchMedia!="function"||this._pointerMediaQueries)return;const e=["(any-pointer: fine)","(any-hover: hover)"].map(r=>window.matchMedia(r)),t=()=>this._refreshTouchCursor();for(const r of e)typeof r.addEventListener=="function"?r.addEventListener("change",t):typeof r.addListener=="function"&&r.addListener(t);this._pointerMediaQueries=e,this._pointerMediaListener=t}_setupVertexOverlay(){this._vertexOverlaySource=new j,this._vertexOverlayLayer=new N({title:"__vertex_highlight__",source:this._vertexOverlaySource,zIndex:990,style:new M({image:new fe({radius:4,fill:new C({color:"rgba(14,165,233,0.85)"}),stroke:new I({color:"#fff",width:1.2})})})}),this._vertexOverlayLayer.set("displayInLayerSwitcher",!1),this.map.addLayer(this._vertexOverlayLayer),this._onSelectedFeatureGeomChange=()=>this._refreshVertexOverlay(),this._vertexTrackedFeatures=new Set,this._selectInteraction.on("select",()=>this._refreshVertexOverlay())}_refreshVertexOverlay(){if(!this._vertexOverlaySource)return;if(this._vertexOverlaySource.clear(),this._vertexTrackedFeatures){for(const t of this._vertexTrackedFeatures)t.un("change",this._onSelectedFeatureGeomChange);this._vertexTrackedFeatures.clear()}if(!this._editBarActive||!this._selectInteraction)return;const e=this._selectInteraction.getFeatures().getArray();for(const t of e){const r=t.getGeometry();if(!r)continue;const o=r.getType();if(!["Polygon","MultiPolygon","LineString","MultiLineString"].includes(o))continue;const a=this._collectAllVertices(r);for(const i of a)this._vertexOverlaySource.addFeature(new pe(new gt(i)));t.on("change",this._onSelectedFeatureGeomChange),this._vertexTrackedFeatures.add(t)}}_collectAllVertices(e){const t=[],r=s=>Array.isArray(s)&&typeof s[0]=="number",o=(s,l)=>{const c=l&&s.length>1?s.length-1:s.length;for(let d=0;d{if(r(l))t.push(l);else if(Array.isArray(l))for(const c of l)s(c)};s(i)}return t}getDrawingsLayer(){return this.drawingsLayer}getDrawingsSource(){return this.drawingsSource}getEditBar(){return this.editBar}setScaleBarUnits(e){this.scaleBar&&this.scaleBar.setUnits(e==="imperial"?"imperial":"metric")}createPopup(){this.popupElement=document.createElement("div"),this.popupElement.className="map-popup",this.popupElement.style.cssText=` + `,a.textContent=`${o.icon} ${n}`,r.appendChild(a),requestAnimationFrame(()=>{a.style.opacity="1",a.style.transform="translateY(0)"});const i=()=>{a.style.opacity="0",a.style.transform="translateY(-8px)",setTimeout(()=>a.remove(),300)};a.addEventListener("click",i),setTimeout(i,t)}const wt=[{stroke:"#ef4444",fill:"rgba(239,68,68,0.25)"},{stroke:"#3b82f6",fill:"rgba(59,130,246,0.25)"}],ii=new M({stroke:new I({color:"#0ea5e9",width:3}),fill:new A({color:"rgba(14,165,233,0.15)"})}),si=new M({stroke:new I({color:"#f43f5e",width:2,lineDash:[8,6]}),image:new fe({radius:5,fill:new A({color:"#f43f5e"}),stroke:new I({color:"#fff",width:1.5})})});class li extends xo{constructor(e={}){super({handleEvent:t=>this._handleEvent(t)}),this.snapDistance_=e.snapDistance||25,this._sources=e.sources?Array.isArray(e.sources)?e.sources:[e.sources]:null,this._phase="select",this._selectedFeature=null,this._selectedSource=null,this._drawInteraction=null,this._splitFeatures=null,this._overlaySource=new j({useSpatialIndex:!1}),this._overlayLayer=new O({source:this._overlaySource,displayInLayerSwitcher:!1,style:ii})}setMap(e){this.getMap()&&(this.getMap().removeLayer(this._overlayLayer),this._removeDrawInteraction()),super.setMap(e),e&&this._overlayLayer.setMap(e)}setActive(e){super.setActive(e),e||this._reset()}_getSources(){if(this._sources)return this._sources;if(!this.getMap())return[];const e=[],t=r=>{r.forEach(o=>{o.getVisible()&&(o.getSource&&o.getSource()instanceof j?e.push(o.getSource()):o.getLayers&&t(o.getLayers()))})};return t(this.getMap().getLayers()),e}_handleEvent(e){if(!this.getActive())return!0;if(this._phase==="select"){if(e.type==="pointermove")return this._onSelectMove(e);if(e.type==="singleclick")return this._onSelectClick(e)}if(this._phase==="draw"&&e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._cancelDraw(),!1;if(this._phase==="pick"){if(e.type==="pointermove")return this._onPickMove(e);if(e.type==="singleclick")return this._onPickClick(e);if(e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._reset(),!1}return!0}_onSelectMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestPolygon(e);if(r){const o=r.feature.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onSelectClick(e){const t=this._closestPolygon(e);if(!t)return!0;this._selectedFeature=t.feature,this._selectedSource=t.source,this._overlaySource.clear();const r=t.feature.clone();return this._overlaySource.addFeature(r),this._startDrawPhase(),!1}_closestPolygon(e){let t=null,r=this.snapDistance_+1;for(const o of this._getSources()){const a=o.getClosestFeatureToCoordinate(e.coordinate);if(!a)continue;const i=a.getGeometry();if(!i)continue;const s=i.getType();if(s!=="Polygon"&&s!=="MultiPolygon")continue;const l=i.getClosestPoint(e.coordinate),d=new he([e.coordinate,l]).getLength()/e.frameState.viewState.resolution;d{const r=t.feature.getGeometry().getCoordinates();this._performSplit(r)}),e.addInteraction(this._drawInteraction))}_removeDrawInteraction(){this._drawInteraction&&this.getMap()&&this.getMap().removeInteraction(this._drawInteraction),this._drawInteraction=null}_cancelDraw(){this._removeDrawInteraction(),this._reset()}_performSplit(e){const t=this._selectedFeature,r=this._selectedSource,o=t.getGeometry();let a;o.getType()==="Polygon"?a=o.getCoordinates():o.getType()==="MultiPolygon"&&(a=o.getCoordinates()[0]);const i=Lt(a,e);if(!i){console.warn("[PolygonSplit] Split failed — line must cross the polygon boundary at exactly 2 points."),this._removeDrawInteraction(),this._startDrawPhase();return}const[s,l]=i,c=t.clone();c.setGeometry(new ut(s)),c.setStyle(new M({stroke:new I({color:wt[0].stroke,width:2.5}),fill:new A({color:wt[0].fill})}));const d=t.clone();d.setGeometry(new ut(l)),d.setStyle(new M({stroke:new I({color:wt[1].stroke,width:2.5}),fill:new A({color:wt[1].fill})}));const u=[c,d];this.dispatchEvent({type:"beforesplit",original:t,features:u}),r.dispatchEvent({type:"beforesplit",original:t,features:u});const f=this.getMap();if(f?.dispatchEvent("undoblockstart"),r.removeFeature(t),r.addFeature(c),r.addFeature(d),f?.dispatchEvent("undoblockend"),this.dispatchEvent({type:"aftersplit",original:t,features:u}),r.dispatchEvent({type:"aftersplit",original:t,features:u}),this._removeDrawInteraction(),t.get("_layerType")==="parcel"){this._splitFeatures=u,this._phase="pick",this._overlaySource.clear();const h=this.getMap();h&&(h.getTargetElement().style.cursor=""),D("Click the polygon that should keep the original identifier.","info",5e3),this.dispatchEvent({type:"splitparcel",features:u,originalProps:t.getProperties(),source:r})}else this._reset()}_onPickMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestSplitPiece(e);if(r){const o=r.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onPickClick(e){const t=this._closestSplitPiece(e);return t?(this.dispatchEvent({type:"splitpick",picked:t,features:this._splitFeatures}),this._reset(),!1):!0}_closestSplitPiece(e){if(!this._splitFeatures)return null;let t=null,r=this.snapDistance_+1;for(const o of this._splitFeatures){const a=o.getGeometry();if(!a)continue;const i=a.getClosestPoint(e.coordinate),l=new he([e.coordinate,i]).getLength()/e.frameState.viewState.resolution;ln[1]!=l>n[1]&&n[0]<(s-a)*(n[1]-i)/(l-i)+a&&(t=!t)}return t}function di(n,e){const t=it(n);return e&&t<0||!e&&t>0?n.slice().reverse():n}function ui(n){return n.length<2?n:We(n[0],n[n.length-1])>1e-10?[...n,n[0].slice()]:n}function qe(n,e,t){const r=t[0]-e[0],o=t[1]-e[1],a=r*r+o*o;if(a<1e-20)return We(n,e);let i=((n[0]-e[0])*r+(n[1]-e[1])*o)/a;i=Math.max(0,Math.min(1,i));const s=e[0]+i*r,l=e[1]+i*o;return(n[0]-s)**2+(n[1]-l)**2}function en(n,e){let t=0,r=1/0;const o=n.length-1;for(let a=0;a0;){const v=(w+1)%a,S=g?(x-1+i)%i:(x+1)%i;if(v===y||S===_)break;if(Be(n[v],e[S],s)){w=v,x=S;continue}if(qe(n[v],e[x],e[S])0;){const v=(y-1+a)%a,S=g?(_+1)%i:(_-1+i)%i;if(v===w||S===x)break;if(Be(n[v],e[S],s)){y=v,_=S;continue}if(qe(n[v],e[_],e[S])r+1)););return o}function fi(n,e,t,r,o=5){const a=n[0],i=e[0],s=n.slice(1),l=e.slice(1),c=en(a,t),d=en(i,r),u=pi(a,i,c.segIdx,d.segIdx,o);if(!u)return console.warn("[polygonMerge] Could not find shared boundary between polygons — seed edges are not near the other ring"),{coords:null,error:"The selected edges are not on a shared boundary. Click edges that lie on the common border between the two polygons."};const{startA:f,endA:p,startB:h,endB:m,reversed:g}=u;a.length-1,i.length-1;const y=Wt(a,p,f);let w;g?w=Wt(i,h,m):w=Wt(i,m,h);const _=[...y,...w.slice(1)],x=o*o;_.length>2&&We(_[_.length-1],_[0])k*1.5)return console.warn(`[polygonMerge] Area mismatch: A=${v.toFixed(1)}, B=${S.toFixed(1)}, merged=${P.toFixed(1)}, expected≈${k.toFixed(1)}`),{coords:null,error:"Merge produced an invalid polygon (area mismatch). The polygons may not be truly adjacent — try clicking closer to the shared boundary."};const z=it(a)>0,q=di(L,z),B=[...s,...l].filter(ce=>{const Q=ce.reduce((H,be)=>H+be[0],0)/(ce.length-1),ye=ce.reduce((H,be)=>H+be[1],0)/(ce.length-1);return ci([Q,ye],q)});return{coords:[q,...B]}}const tn=new M({stroke:new I({color:"#0ea5e9",width:3}),fill:new A({color:"rgba(14,165,233,0.15)"})}),hi=new M({stroke:new I({color:"#f59e0b",width:3}),fill:new A({color:"rgba(245,158,11,0.15)"})}),gi=new M({stroke:new I({color:"#0ea5e9",width:3}),fill:new A({color:"rgba(14,165,233,0.15)"}),text:new pt({text:"A",font:"bold 22px Exo, sans-serif",fill:new A({color:"#0ea5e9"}),stroke:new I({color:"#fff",width:4}),overflow:!0})}),mi=new M({stroke:new I({color:"#f59e0b",width:3}),fill:new A({color:"rgba(245,158,11,0.15)"}),text:new pt({text:"B",font:"bold 22px Exo, sans-serif",fill:new A({color:"#f59e0b"}),stroke:new I({color:"#fff",width:4}),overflow:!0})}),yi=new M({stroke:new I({color:"#ec4899",width:4,lineDash:[10,6]})}),bi=new M({stroke:new I({color:"#10b981",width:2.5}),fill:new A({color:"rgba(16,185,129,0.3)"})});class wi extends xo{constructor(e={}){super({handleEvent:t=>this._handleEvent(t)}),this.snapDistance_=e.snapDistance||25,this.tolerance_=e.tolerance||5,this._phase="select_a",this._featureA=null,this._sourceA=null,this._featureB=null,this._sourceB=null,this._edgeClickA=null,this._edgeClickB=null,this._highlightSource=new j({useSpatialIndex:!1}),this._highlightLayer=new O({source:this._highlightSource,displayInLayerSwitcher:!1,style:t=>t.get("_highlightStyle")||tn}),this._edgeSource=new j({useSpatialIndex:!1}),this._edgeLayer=new O({source:this._edgeSource,displayInLayerSwitcher:!1,style:yi})}setMap(e){this.getMap()&&(this.getMap().removeLayer(this._highlightLayer),this.getMap().removeLayer(this._edgeLayer)),super.setMap(e),e&&(this._highlightLayer.setMap(e),this._edgeLayer.setMap(e))}setActive(e){super.setActive(e),e||this._reset()}_getSources(){if(!this.getMap())return[];const e=[],t=r=>{r.forEach(o=>{o.getVisible()&&(o.getSource&&o.getSource()instanceof j?e.push(o.getSource()):o.getLayers&&t(o.getLayers()))})};return t(this.getMap().getLayers()),e}_handleEvent(e){if(!this.getActive())return!0;if(e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._reset(),!1;switch(this._phase){case"select_a":if(e.type==="pointermove")return this._onSelectMove(e,null);if(e.type==="singleclick")return this._onSelectAClick(e);break;case"select_b":if(e.type==="pointermove")return this._onSelectMove(e,this._featureA);if(e.type==="singleclick")return this._onSelectBClick(e);break;case"click_edge_a":if(e.type==="pointermove")return this._onEdgeMove(e,this._featureA);if(e.type==="singleclick")return this._onEdgeAClick(e);break;case"click_edge_b":if(e.type==="pointermove")return this._onEdgeMove(e,this._featureB);if(e.type==="singleclick")return this._onEdgeBClick(e);break}return!0}_onSelectMove(e,t){const r=this.getMap();if(!r)return!0;this._highlightSource.clear(),this._edgeSource.clear(),this._rebuildHighlights();const o=this._closestPolygon(e,t);if(o){const a=this._phase==="select_a"?tn:hi,i=o.feature.clone();i.set("_highlightStyle",a),this._highlightSource.addFeature(i),r.getTargetElement().style.cursor="pointer"}else r.getTargetElement().style.cursor="";return!0}_onSelectAClick(e){const t=this._closestPolygon(e,null);return t?(this._featureA=t.feature,this._sourceA=t.source,this._phase="select_b",this._rebuildHighlights(),!1):!0}_onSelectBClick(e){const t=this._closestPolygon(e,this._featureA);return t?(this._featureB=t.feature,this._sourceB=t.source,this._phase="click_edge_a",this._rebuildHighlights(),this.getMap().getTargetElement().style.cursor="crosshair",!1):!0}_closestPolygon(e,t){let r=null,o=this.snapDistance_+1;for(const a of this._getSources()){const i=a.getClosestFeatureToCoordinate(e.coordinate);if(!i||t&&i===t)continue;const s=i.getGeometry();if(!s)continue;const l=s.getType();if(l!=="Polygon"&&l!=="MultiPolygon")continue;const c=s.getClosestPoint(e.coordinate),u=new he([e.coordinate,c]).getLength()/e.frameState.viewState.resolution;u{t.get("_permanent")&&e.push(t)}),e.forEach(t=>this._highlightSource.removeFeature(t)),this._featureA){const t=this._featureA.clone();t.set("_highlightStyle",gi),t.set("_permanent",!0),this._highlightSource.addFeature(t)}if(this._featureB){const t=this._featureB.clone();t.set("_highlightStyle",mi),t.set("_permanent",!0),this._highlightSource.addFeature(t)}}_reset(){this._phase="select_a",this._featureA=null,this._sourceA=null,this._featureB=null,this._sourceB=null,this._edgeClickA=null,this._edgeClickB=null,this._highlightSource.clear(),this._edgeSource.clear();const e=this.getMap();e&&(e.getTargetElement().style.cursor="")}}function _i(n,e){return(n[0]-e[0])**2+(n[1]-e[1])**2}function on(n){let e=0;for(let t=0,r=n.length;tt&&(t=d,r=c)}const o=n[r],a=n[r+1],i=Math.sqrt(t),s=[(a[0]-o[0])/i,(a[1]-o[1])/i],l=[-s[1],s[0]];return{p0:o,p1:a,along:s,perp:l}}function Kt(n,e,t,r,o){const a=n[0]+r*e[0],i=n[1]+r*e[1];return[[a-o*t[0],i-o*t[1]],[a+o*t[0],i+o*t[1]]]}function Ge(n,e,t){const r=n[0],o=r.length-1;let a=0,i=0;for(let c=0;cu&&(u=_)}const f=(u-d)*1.5,p=[];let h=n,m=e;for(let g=0;gv&&(v=Q)}let S=L,P=v,k=null,z=null,q=1/0;for(let Z=0;Z<40;Z++){const B=(S+P)/2,ce=Kt(l,i,s,B,f),Q=Lt(h,ce);if(!Q){const R=(P-S)*.01,W=Kt(l,i,s,B+R,f),re=Lt(h,W);if(re){const[ke,Ie]=re,Xe=Ge(ke,l,i),Ye=Ge(Ie,l,i),Je=Xethis._handleEvent(t)}),this.snapDistance_=e.snapDistance||25,this._sources=e.sources?Array.isArray(e.sources)?e.sources:[e.sources]:null,this._phase="select",this._selectedFeature=null,this._selectedSource=null,this._selectedEdge=null,this._dividedFeatures=null,this._overlaySource=new j({useSpatialIndex:!1}),this._overlayLayer=new O({source:this._overlaySource,displayInLayerSwitcher:!1,style:xi}),this._edgeSource=new j({useSpatialIndex:!1}),this._edgeLayer=new O({source:this._edgeSource,displayInLayerSwitcher:!1,style:Si})}setMap(e){this.getMap()&&(this.getMap().removeLayer(this._overlayLayer),this.getMap().removeLayer(this._edgeLayer)),super.setMap(e),e&&(this._overlayLayer.setMap(e),this._edgeLayer.setMap(e))}setActive(e){super.setActive(e),e||this._reset()}_getSources(){if(this._sources)return this._sources;if(!this.getMap())return[];const e=[],t=r=>{r.forEach(o=>{o.getVisible()&&(o.getSource&&o.getSource()instanceof j?e.push(o.getSource()):o.getLayers&&t(o.getLayers()))})};return t(this.getMap().getLayers()),e}_handleEvent(e){if(!this.getActive())return!0;if(e.type==="keydown"&&e.originalEvent?.key==="Escape")return this._phase==="form"?this.cancelDivide():this._reset(),!1;if(this._phase==="select"){if(e.type==="pointermove")return this._onSelectMove(e);if(e.type==="singleclick")return this._onSelectClick(e)}if(this._phase==="edge"){if(e.type==="pointermove")return this._onEdgeMove(e);if(e.type==="singleclick")return this._onEdgeClick(e)}if(this._phase==="pick"){if(e.type==="pointermove")return this._onPickMove(e);if(e.type==="singleclick")return this._onPickClick(e)}return!0}_onSelectMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestPolygon(e);if(r){const o=r.feature.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onSelectClick(e){const t=this._closestPolygon(e);if(!t)return!0;this._selectedFeature=t.feature,this._selectedSource=t.source,this._overlaySource.clear();const r=t.feature.clone();return r.set("_permanent",!0),this._overlaySource.addFeature(r),this._phase="edge",D("Click the edge to divide along.","info",3e3),!1}_closestPolygon(e){let t=null,r=this.snapDistance_+1;for(const o of this._getSources()){const a=o.getClosestFeatureToCoordinate(e.coordinate);if(!a)continue;const i=a.getGeometry();if(!i)continue;const s=i.getType();if(s!=="Polygon"&&s!=="MultiPolygon")continue;const l=i.getClosestPoint(e.coordinate),d=new he([e.coordinate,l]).getLength()/e.frameState.viewState.resolution;d{const m=t.clone();return m.setGeometry(new ut(p)),m.setStyle(new M({stroke:new I({color:s[h].stroke,width:2.5}),fill:new A({color:s[h].fill})})),m}),c={type:"beforedivide",original:t,features:l};this.dispatchEvent(c),r.dispatchEvent({...c});const d=this.getMap();d?.dispatchEvent("undoblockstart"),r.removeFeature(t);for(const p of l)r.addFeature(p);d?.dispatchEvent("undoblockend");const u={type:"afterdivide",original:t,features:l};this.dispatchEvent(u),r.dispatchEvent({...u}),t.get("_layerType")==="parcel"?(this._dividedFeatures=l,this._phase="pick",D("Click the polygon that should keep the original identifier.","info",5e3),this.dispatchEvent({type:"dividedparcel",features:l,originalProps:t.getProperties(),source:r})):(D(`Polygon divided into ${e} equal pieces.`,"success"),this._reset())}_onPickMove(e){const t=this.getMap();if(!t)return!0;this._overlaySource.clear();const r=this._closestDividedPiece(e);if(r){const o=r.clone();this._overlaySource.addFeature(o),t.getTargetElement().style.cursor="pointer"}else t.getTargetElement().style.cursor="";return!0}_onPickClick(e){const t=this._closestDividedPiece(e);return t?(this.dispatchEvent({type:"dividepick",picked:t,features:this._dividedFeatures}),this._reset(),!1):!0}_closestDividedPiece(e){if(!this._dividedFeatures)return null;let t=null,r=this.snapDistance_+1;for(const o of this._dividedFeatures){const a=o.getGeometry();if(!a)continue;const i=a.getClosestPoint(e.coordinate),l=new he([e.coordinate,i]).getLength()/e.frameState.viewState.resolution;l{const l=this.categoryEmojis[s];return l?l.emoji:"📍"},this.getCategoryOptionsHtml=()=>Object.entries(this.categoryEmojis).map(([s,{emoji:l,label:c}])=>``).join(` + `),this.createEmojiStyle=(s,l=24)=>new M({text:new pt({text:s,font:`${l}px sans-serif`,textBaseline:"bottom",textAlign:"center",offsetY:-5})}),this.defaultStyle=this.createEmojiStyle("📍",32),this.selectedStyle=this.createEmojiStyle("📍",42),this.categoryStyles={};for(const[s,{emoji:l}]of Object.entries(this.categoryEmojis))this.categoryStyles[s]=this.createEmojiStyle(l,32);const r=this.createBaseLayers(t.basemap||"topo");this.markersLayer=new O({title:"Markers",source:this.markerSource,style:s=>this.getFeatureStyle(s),visible:!1}),this.overlayGroup=new Pe({title:"Overlays"}),this.map=new Ro({target:e,layers:[r,this.markersLayer,this.overlayGroup],view:new $r({center:ee(t.center||[0,0]),zoom:t.zoom||2,minZoom:t.minZoom||2,maxZoom:t.maxZoom||19})});const o=new Xr({collapsed:!0,mouseover:!0,extent:!0,trash:!1,oninfo:null});this.map.addControl(o),queueMicrotask(()=>{const s=o.element?.querySelector(":scope > button");if(s){const l="/".replace(/\/?$/,"/");s.style.backgroundImage=`url('${l}app-icons/luspa-72x72.png')`}});let a=!1;o.on("drawlist",s=>{this._decorateLayerListItem(s.layer,s.li),a||(a=!0,queueMicrotask(()=>{a=!1,this._refreshLayerSwitcherChrome(o)}))}),this.map.getLayers().on("change",()=>{this._refreshLayerSwitcherChrome(o)}),this._wireLayerSwitcherVisibilityHooks(o),this._createAddLayerDialog(),this._createLegendPanel(),this.scaleBar=new Br({bar:!0,steps:4,text:!0,minWidth:140}),this.map.addControl(this.scaleBar),this._initGpsRendering(),this._createLocationControl(),this._createBaseMapPicker();const i=new Yr({placeholder:"Search location...",typing:300,minLength:3,maxItems:10,collapsed:!0});this.map.addControl(i),i.on("select",s=>{const l=s.search;if(l){const c=parseFloat(l.lon),d=parseFloat(l.lat),u=[c,d],f=ee(u);this.navigateTo(c,d,14);const p={coordinate:f,lonLat:u,name:l.display_name||l.name||"Unknown",searchResult:l};this.searchSelectCallbacks.forEach(h=>h(p))}}),this.searchNominatim=i,this.searchSelectCallbacks=[],this.selectedFeature=null,this.createPopup(),this.createInfoPopup(),this.createAddLocationPopup(),this.createParcelEditPopup(),this.createDrawnPolygonPopup(),this.createMergePopup(),this.createDividePopup(),this.dblClickCallbacks=[],this.editBar=null,this.drawingsSource=null,this.drawingsLayer=null,this.touchCursor=null,this._editBarActive=!1}initEditBar(){this.drawingsSource=new j,this.drawingsLayer=new O({title:"sketches",source:this.drawingsSource,style:new M({stroke:new I({color:"#f59e0b",width:2.5}),fill:new A({color:"rgba(245,158,11,0.15)"}),image:new fe({radius:6,fill:new A({color:"#f59e0b"}),stroke:new I({color:"#fff",width:1.5})})})}),this._drawingsGroup=new Pe({title:"Drawings",layers:[this.drawingsLayer]});const e=this.map.getLayers(),t=e.getArray().indexOf(this.overlayGroup);e.insertAt(t>=0?t:e.getLength(),this._drawingsGroup),this._selectInteraction=new Gr({condition:Ur,toggleCondition:jr,filter:(p,h)=>!!h,layers:p=>p instanceof O}),this._selectInteraction.setActive(!1),this.map.addInteraction(this._selectInteraction),this._dragBoxSelect=new zr({condition:qr}),this._dragBoxSelect.setActive(!1),this.map.addInteraction(this._dragBoxSelect),this._dragBoxSelect.on("boxend",()=>{const p=this._dragBoxSelect.getGeometry().getExtent(),h=this._selectInteraction.getFeatures();this.map.getLayers().forEach(m=>this._boxAddFromLayer(m,p,h)),this._refreshVertexOverlay?.()}),this._selectInteraction.on("change:active",()=>{this._dragBoxSelect.setActive(this._selectInteraction.getActive())}),this._modifyInteraction=new Jr({features:this._selectInteraction.getFeatures()}),this._modifyInteraction.setActive(!1),this._modifyInteraction.on("modifyend",p=>{if(!this._featureModifiedCallbacks?.length)return;const h=p.features?.getArray?.()||[];for(const m of h)for(const g of this._featureModifiedCallbacks)try{g(m)}catch(y){console.warn("[MapView] onFeatureModified callback failed:",y)}}),this._undoRedo=new Zr,this.map.addInteraction(this._undoRedo),this.editBar=new co({source:this.drawingsSource,interactions:{Select:this._selectInteraction,ModifySelect:this._modifyInteraction,DrawPoint:!0,DrawLine:!0,DrawPolygon:!0,DrawRegular:!0,DrawHole:!0,Delete:!0,Info:!0,Transform:!0,Split:!1}}),this.map.addControl(this.editBar),this._setupVertexOverlay();const r=new Bo({group:!0,className:"ol-editbar-actions",controls:[new at({html:'',className:"ol-undo",title:"Undo",handleClick:()=>{this._undoRedo.hasUndo()&&this._undoRedo.undo()}}),new at({html:'',className:"ol-redo",title:"Redo",handleClick:()=>{this._undoRedo.hasRedo()&&this._undoRedo.redo()}}),new at({html:'',className:"ol-save",title:"Save drawings",handleClick:()=>{this.dispatchEditEvent("save")}})]});this.editBar.addControl(r),this._lineSplitInteraction=new Qr,this._polygonSplitInteraction=new li,this.map.addInteraction(this._lineSplitInteraction),this.map.addInteraction(this._polygonSplitInteraction),this._lineSplitInteraction.setActive(!1),this._polygonSplitInteraction.setActive(!1),this._polygonSplitInteraction.on("splitpick",p=>{const h=["UPN","upn","id","parcelid","parcel_id","PARCELID","PARCEL_ID","ID"];for(const m of p.features)if(m!==p.picked)for(const g of h)m.get(g)!==void 0&&m.set(g,"")}),this._polygonDivideInteraction=new Ti,this.map.addInteraction(this._polygonDivideInteraction),this._polygonDivideInteraction.setActive(!1);const o=new xe({html:'',className:"ol-split-line",title:"Split Lines",name:"SplitLine",interaction:this._lineSplitInteraction,autoActivate:!0}),a=new xe({html:'',className:"ol-split-polygon",title:"Split Polygons",name:"SplitPolygon",interaction:this._polygonSplitInteraction}),i=new xe({html:'',className:"ol-split-divide",title:"Divide Polygon",name:"DividePolygon",interaction:this._polygonDivideInteraction}),s=new Bo({toggleOne:!0,autoDeactivate:!0,controls:[o,a,i]}),l=new xe({className:"ol-split",title:"Split",name:"Split",bar:s,onToggle:p=>{p||(this._lineSplitInteraction.setActive(!1),this._polygonSplitInteraction.setActive(!1),this._polygonDivideInteraction.setActive(!1))}});this.editBar.addControl(l),this._polygonDivideInteraction.on("divideform",p=>{this.showDividePopup(p.feature,p.source,p.coordinate)}),this._polygonDivideInteraction.on("dividecancel",()=>{this.hideDividePopup()}),this._polygonDivideInteraction.on("dividepick",p=>{const h=["UPN","upn","id","parcelid","parcel_id","PARCELID","PARCEL_ID","ID"];for(const m of p.features)if(m!==p.picked)for(const g of h)m.get(g)!==void 0&&m.set(g,"")}),this._polygonMergeInteraction=new wi,this.map.addInteraction(this._polygonMergeInteraction),this._polygonMergeInteraction.setActive(!1);const c=new xe({html:'',className:"ol-merge",title:"Merge Polygons",name:"Merge",interaction:this._polygonMergeInteraction});this.editBar.addControl(c),this._polygonMergeInteraction.on("mergedparcel",p=>{this.showMergeIdentifierPopup(p.merged,p.propsA,p.propsB,p.coordinate)});const d=this.editBar.element;if(d&&r.element&&r.element.parentNode===d){const p=document.createElement("div");p.className="ol-editbar-break",d.insertBefore(p,r.element)}this._snapGuidesEnabled=localStorage.getItem("snap-guides-enabled")==="1",this._snapGuides=new ea({pixelTolerance:10,vectorClass:Hr}),this.map.addInteraction(this._snapGuides);const u=["DrawPoint","DrawLine","DrawPolygon","DrawHole","DrawRegular"];for(const p of u){const h=this.editBar.getInteraction(p);h&&h.on("change:active",()=>{h.getActive()&&this._snapGuides.setDrawInteraction(h)})}this._modifyInteraction&&this._snapGuides.setModifyInteraction(this._modifyInteraction);const f=new at({html:'',className:"ol-snap-toggle"+(this._snapGuidesEnabled?" ol-active":""),title:"Toggle Snap Guides",handleClick:()=>{this._snapGuidesEnabled=!this._snapGuidesEnabled,localStorage.setItem("snap-guides-enabled",this._snapGuidesEnabled?"1":"0"),f.element.classList.toggle("ol-active",this._snapGuidesEnabled),this._snapGuides&&this._snapGuides.setActive(this._snapGuidesEnabled&&this._editBarActive),console.log("[MapView] Snap guides:",this._snapGuidesEnabled?"ON":"OFF")}});this._snapToggleBtn=f,r.addControl(f),this.setEditMode(!1),this._drawingsGroup.on("change:visible",()=>{const p=this._drawingsGroup.getVisible();this.setEditMode(p)}),this._isTouchOnlyDevice()?(this.touchCursor=new Go({className:"ol-editbar-cursor"}),this.map.addInteraction(this.touchCursor),this.touchCursor.setActive(!1),console.log("[MapView] Touch-only device detected — TouchCursor added")):console.log("[MapView] Fine pointer available — TouchCursor skipped"),this._installPointerCapabilityWatcher(),this.drawingsSource.on("addfeature",p=>{const h=p.feature,m=h.getGeometry();if(!m||m.getType()!=="Polygon")return;const g=m.getInteriorPoint().getCoordinates();this.showDrawnPolygonPopup(h,g)}),this._editKeyHandler=p=>{if(p.key!=="Delete"&&p.key!=="Backspace"||!this._editBarActive)return;const h=p.target,m=h&&h.tagName;h?.isContentEditable||m==="INPUT"||m==="TEXTAREA"||m==="SELECT"||this._deleteSelectedFeatures()&&p.preventDefault()},document.addEventListener("keydown",this._editKeyHandler),console.log("[MapView] EditBar initialised with Drawings group, UndoRedo and SnapGuides (default:",this._snapGuidesEnabled?"ON":"OFF",")")}_deleteSelectedFeatures(){if(!this._editBarActive)return!1;const e=this.editBar?.getInteraction("Delete"),t=this._selectInteraction?.getFeatures();return!e||!t||t.getLength()===0?!1:(e.delete(t),t.clear(),this._refreshVertexOverlay?.(),!0)}_boxAddFromLayer(e,t,r){if(!e)return;if(typeof e.getLayers=="function"){e.getLayers().forEach(a=>this._boxAddFromLayer(a,t,r));return}if(!(e instanceof O)||e.getVisible&&!e.getVisible()||e===this._vertexOverlayLayer||e===this._gpsTrailLayer||e===this._gpsPositionLayer||e.get("displayInLayerSwitcher")===!1)return;const o=e.getSource&&e.getSource();!o||typeof o.forEachFeatureIntersectingExtent!="function"||o.forEachFeatureIntersectingExtent(t,a=>{r.getArray().includes(a)||r.push(a)})}dispatchEditEvent(e){if(!this._editEventListeners)return;const t=this._editEventListeners[e];t&&t.forEach(r=>r())}onEditEvent(e,t){this._editEventListeners||(this._editEventListeners={}),this._editEventListeners[e]||(this._editEventListeners[e]=[]),this._editEventListeners[e].push(t)}setEditMode(e){const t=this._editBarActive;if(this._editBarActive=!!e,this._editBarActive&&!t&&this._undoRedo)try{this._undoRedo._watchSources(),this._undoRedo.clear()}catch(r){console.warn("[MapView] UndoRedo re-watch/clear failed:",r)}this.editBar&&(this.editBar.setVisible(this._editBarActive),this._editBarActive||this.editBar.deactivateControls()),this._selectInteraction&&(this._editBarActive||this._selectInteraction.getFeatures().clear(),this._selectInteraction.setActive(this._editBarActive)),this._modifyInteraction&&this._modifyInteraction.setActive(this._editBarActive),this._snapGuides&&this._snapGuides.setActive(this._snapGuidesEnabled&&this._editBarActive),this.touchCursor&&this.touchCursor.setActive(this._editBarActive),!this._editBarActive&&this._vertexOverlaySource&&this._withoutUndoRecording(()=>this._silentClearSource(this._vertexOverlaySource)),console.log("[MapView] Edit mode:",this._editBarActive?"ON":"OFF")}isEditMode(){return this._editBarActive}_isTouchOnlyDevice(){if(!("ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0))return!1;if(typeof window.matchMedia!="function")return!0;const t=window.matchMedia("(any-pointer: fine)").matches,r=window.matchMedia("(any-hover: hover)").matches;return!t&&!r}_refreshTouchCursor(){const e=this._isTouchOnlyDevice();e&&!this.touchCursor?(this.touchCursor=new Go({className:"ol-editbar-cursor"}),this.map.addInteraction(this.touchCursor),this.touchCursor.setActive(this._editBarActive),console.log("[MapView] Pointer change → TouchCursor added")):!e&&this.touchCursor&&(this.map.removeInteraction(this.touchCursor),this.touchCursor=null,console.log("[MapView] Pointer change → TouchCursor removed (fine pointer present)"))}_installPointerCapabilityWatcher(){if(typeof window.matchMedia!="function"||this._pointerMediaQueries)return;const e=["(any-pointer: fine)","(any-hover: hover)"].map(r=>window.matchMedia(r)),t=()=>this._refreshTouchCursor();for(const r of e)typeof r.addEventListener=="function"?r.addEventListener("change",t):typeof r.addListener=="function"&&r.addListener(t);this._pointerMediaQueries=e,this._pointerMediaListener=t}_setupVertexOverlay(){this._vertexOverlaySource=new j,this._vertexOverlayLayer=new O({title:"__vertex_highlight__",source:this._vertexOverlaySource,zIndex:990,style:new M({image:new fe({radius:4,fill:new A({color:"rgba(14,165,233,0.85)"}),stroke:new I({color:"#fff",width:1.2})})})}),this._vertexOverlayLayer.set("displayInLayerSwitcher",!1),this.map.addLayer(this._vertexOverlayLayer),this._onSelectedFeatureGeomChange=()=>this._refreshVertexOverlay(),this._vertexTrackedFeatures=new Set,this._selectInteraction.on("select",()=>this._refreshVertexOverlay())}_withoutUndoRecording(e){const t=this._undoRedo;if(!t)return e();const r=t._record;t._record=!1;try{return e()}finally{t._record=r}}_silentClearSource(e){if(!e)return;const t=e.getFeatures();for(let r=t.length-1;r>=0;r--)e.removeFeature(t[r])}_refreshVertexOverlay(){this._vertexOverlaySource&&this._withoutUndoRecording(()=>{if(this._silentClearSource(this._vertexOverlaySource),this._vertexTrackedFeatures){for(const t of this._vertexTrackedFeatures)t.un("change",this._onSelectedFeatureGeomChange);this._vertexTrackedFeatures.clear()}if(!this._editBarActive||!this._selectInteraction)return;const e=this._selectInteraction.getFeatures().getArray();for(const t of e){const r=t.getGeometry();if(!r)continue;const o=r.getType();if(!["Polygon","MultiPolygon","LineString","MultiLineString"].includes(o))continue;const a=this._collectAllVertices(r);for(const i of a)this._vertexOverlaySource.addFeature(new pe(new mt(i)));t.on("change",this._onSelectedFeatureGeomChange),this._vertexTrackedFeatures.add(t)}})}_collectAllVertices(e){const t=[],r=s=>Array.isArray(s)&&typeof s[0]=="number",o=(s,l)=>{const c=l&&s.length>1?s.length-1:s.length;for(let d=0;d{if(r(l))t.push(l);else if(Array.isArray(l))for(const c of l)s(c)};s(i)}return t}getDrawingsLayer(){return this.drawingsLayer}getDrawingsSource(){return this.drawingsSource}getEditBar(){return this.editBar}setScaleBarUnits(e){this.scaleBar&&this.scaleBar.setUnits(e==="imperial"?"imperial":"metric")}createPopup(){this.popupElement=document.createElement("div"),this.popupElement.className="map-popup",this.popupElement.style.cssText=` position: absolute; background: var(--card, #fff); color: var(--card-foreground, #1e1a4b); @@ -394,25 +394,25 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C z-index: 1001; border: 1px solid var(--border, #1e1a4b1f); overflow: hidden; - `,this.infoPopup=new Ee({element:this.infoPopupElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.infoPopup)}showInfoPopup(e,t,r={}){const{title:o="Feature Info",color:a="#e11d48"}=r,i=e.getProperties(),s=e.getGeometry(),l=s.getType(),c=["geometry","_layerType"];let d="";for(const[p,f]of Object.entries(i))c.includes(p)||f===void 0||f===null||(d+=` + `,this.infoPopup=new Ee({element:this.infoPopupElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.infoPopup)}showInfoPopup(e,t,r={}){const{title:o="Feature Info",color:a="#e11d48"}=r,i=e.getProperties(),s=e.getGeometry(),l=s.getType(),c=["geometry","_layerType"];let d="";for(const[f,p]of Object.entries(i))c.includes(f)||p===void 0||p===null||(d+=` - ${this.escapeHtml(p)} - ${this.escapeHtml(String(f))} + ${this.escapeHtml(f)} + ${this.escapeHtml(String(p))} - `);if(l==="Polygon"||l==="MultiPolygon"){const p=st(s,{projection:"EPSG:3857"}),f=Va(p);d+=` + `);if(l==="Polygon"||l==="MultiPolygon"){const f=lt(s,{projection:"EPSG:3857"}),p=Za(f);d+=` area - ${f} + ${p} - `}else if(l==="LineString"||l==="MultiLineString"){const p=Lt(s,{projection:"EPSG:3857"}),f=Xa(p);d+=` + `}else if(l==="LineString"||l==="MultiLineString"){const f=kt(s,{projection:"EPSG:3857"}),p=Ja(f);d+=` length - ${f} + ${p} - `}else if(l==="Point"){const p=Ae(s.getCoordinates()),f=p[0].toFixed(6),h=p[1].toFixed(6);d+=` + `}else if(l==="Point"){const f=Oe(s.getCoordinates()),p=f[0].toFixed(6),h=f[1].toFixed(6);d+=` longitude - ${f} + ${p} latitude @@ -446,15 +446,15 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C
+ - -
`}_showAnalysisPopup(e,t,r,o,a=null){this.infoPopupElement.innerHTML=this._buildAnalysisPopupHtml(e,t,r),this.infoPopup.setPosition(o),this.infoPopupElement.querySelector("#info-popup-close").addEventListener("click",()=>{this.hideInfoPopup()}),this.infoPopupElement.querySelector("#info-popup-export-pdf")?.addEventListener("click",()=>{const s=r.filter(l=>!l.empty).map(l=>({label:l.label,value:l.value.replace(/<[^>]*>/g,"")}));Rt(async()=>{const{exportAnalysisPDF:l}=await import("./pdf-export-BG6jqfsR.js");return{exportAnalysisPDF:l}},__vite__mapDeps([0,1,2,3])).then(({exportAnalysisPDF:l})=>{l({title:t,rows:s})}).catch(l=>{console.error("[MapView] PDF export failed:",l)})});const i=this.infoPopupElement.querySelector("#info-popup-export-gis");if(i){const s=a?a.parcelFeatures.length+a.zoneFeatures.length+Object.values(a.otherByLayer).reduce((l,c)=>l+c.length,0):0;!a||s===0?(i.disabled=!0,i.style.opacity="0.5",i.style.cursor="not-allowed",i.title="No intersecting features to export"):i.addEventListener("click",()=>{window.dispatchEvent(new CustomEvent("lupmis:export-gis",{detail:{title:t,...a}}))})}}showCircleIntersectionPopup(e,t){const r=e.getGeometry();if(!r||typeof r.getCenter!="function")return;const o=qr(r,64),a=o.getExtent(),i=e.get("_radius")||r.getRadius(),s=[],l=[],c={},d=g=>{const m=g.getGeometry();if(!m)return!1;const b=m.getExtent();return b[2]a[2]||b[3]a[3]?!1:o.intersectsExtent(b)&&this._geometriesIntersect(o,m)},u=(g,m)=>{g.getLayers().forEach(b=>{if(b instanceof ke)u(b,b.get("title")||m);else if(b instanceof N&&b.getVisible()){const _=b.get("title")||m||"Unknown",S=b.getSource();if(!S)return;const T=S.getFeaturesInExtent(a);for(const v of T){const x=v.get("_layerType");x==="measure_circle"||x==="measure_circle_radius"||d(v)&&(x==="parcel"?s.push(v):x==="collector_zone"?l.push(v):(c[_]||(c[_]=[]),c[_].push(v)))}}})};u(this.overlayGroup,"Overlays");const p=Ft(i),f=Math.PI*i*i,h=lt(f),y=[{label:"Radius",value:p,_first:!0},{label:"Area",value:h},...this._collectIntersectionRows(s,l,c)];this._showAnalysisPopup("⭕","Circle Analysis",y,t,{kind:"circle",clipGeometry:o,parcelFeatures:s,zoneFeatures:l,otherByLayer:c})}showAreaIntersectionPopup(e,t){const r=e.getGeometry();if(!r)return;const o=r.getExtent(),a=st(r,{projection:"EPSG:3857"}),i=lt(a),s=Lt(r,{projection:"EPSG:3857"}),l=Ft(s),c=[],d=[],u={},p=y=>{const g=y.getGeometry();if(!g)return!1;const m=g.getExtent();return m[2]o[2]||m[3]o[3]?!1:r.intersectsExtent(m)&&this._geometriesIntersect(r,g)},f=(y,g)=>{y.getLayers().forEach(m=>{if(m instanceof ke)f(m,m.get("title")||g);else if(m instanceof N&&m.getVisible()){const b=m.get("title")||g||"Unknown",_=m.getSource();if(!_)return;const S=_.getFeaturesInExtent(o);for(const T of S){const v=T.get("_layerType");v==="measure_area"||v==="measure_circle"||v==="measure_circle_radius"||p(T)&&(v==="parcel"?c.push(T):v==="collector_zone"?d.push(T):(u[b]||(u[b]=[]),u[b].push(T)))}}})};f(this.overlayGroup,"Overlays");const h=[{label:"Area",value:i,_first:!0},{label:"Perimeter",value:l},...this._collectIntersectionRows(c,d,u)];this._showAnalysisPopup("📐","Area Analysis",h,t,{kind:"area",clipGeometry:r,parcelFeatures:c,zoneFeatures:d,otherByLayer:u})}_geometriesIntersect(e,t){const r=t.getType();if(r==="Polygon"||r==="MultiPolygon"){const o=t.getFlatCoordinates(),a=t.getStride();for(let l=0;l`}_showAnalysisPopup(e,t,r,o,a=null){this.infoPopupElement.innerHTML=this._buildAnalysisPopupHtml(e,t,r),this.infoPopup.setPosition(o),this.infoPopupElement.querySelector("#info-popup-close").addEventListener("click",()=>{this.hideInfoPopup()});const i=r.filter(c=>!c.empty).map(c=>({label:c.label,value:String(c.value).replace(/<[^>]*>/g,"")})),s=this.infoPopupElement.querySelector("#info-popup-analyse");if(s){const c=a?a.parcelFeatures.length+a.zoneFeatures.length+Object.values(a.otherByLayer).reduce((d,u)=>d+u.length,0):0;!a||c===0?(s.disabled=!0,s.style.opacity="0.5",s.style.cursor="not-allowed",s.title="No intersecting features to analyse"):s.addEventListener("click",()=>{window.dispatchEvent(new CustomEvent("lupmis:analyse-features",{detail:{title:t,...a}}))})}const l=this.infoPopupElement.querySelector("#info-popup-export-gis");if(l){const c=a?a.parcelFeatures.length+a.zoneFeatures.length+Object.values(a.otherByLayer).reduce((d,u)=>d+u.length,0):0;!a||c===0?(l.disabled=!0,l.style.opacity="0.5",l.style.cursor="not-allowed",l.title="No intersecting features to export"):l.addEventListener("click",()=>{window.dispatchEvent(new CustomEvent("lupmis:export-gis",{detail:{title:t,pdfRows:i,...a}}))})}}showCircleIntersectionPopup(e,t){const r=e.getGeometry();if(!r||typeof r.getCenter!="function")return;const o=Wr(r,64),a=o.getExtent(),i=e.get("_radius")||r.getRadius(),s=[],l=[],c={},d=g=>{const y=g.getGeometry();if(!y)return!1;const w=y.getExtent();return w[2]a[2]||w[3]a[3]?!1:o.intersectsExtent(w)&&this._geometriesIntersect(o,y)},u=(g,y)=>{g.getLayers().forEach(w=>{if(w instanceof Pe)u(w,w.get("title")||y);else if(w instanceof O&&w.getVisible()){const _=w.get("title")||y||"Unknown",x=w.getSource();if(!x)return;const L=x.getFeaturesInExtent(a);for(const v of L){const S=v.get("_layerType");S==="measure_circle"||S==="measure_circle_radius"||d(v)&&(S==="parcel"?s.push(v):S==="collector_zone"?l.push(v):(c[_]||(c[_]=[]),c[_].push(v)))}}})};u(this.overlayGroup,"Overlays");const f=Ot(i),p=Math.PI*i*i,h=ct(p),m=[{label:"Radius",value:f,_first:!0},{label:"Area",value:h},...this._collectIntersectionRows(s,l,c)];this._showAnalysisPopup("⭕","Circle Analysis",m,t,{kind:"circle",clipGeometry:o,parcelFeatures:s,zoneFeatures:l,otherByLayer:c})}showAreaIntersectionPopup(e,t){const r=e.getGeometry();if(!r)return;const o=r.getExtent(),a=lt(r,{projection:"EPSG:3857"}),i=ct(a),s=kt(r,{projection:"EPSG:3857"}),l=Ot(s),c=[],d=[],u={},f=m=>{const g=m.getGeometry();if(!g)return!1;const y=g.getExtent();return y[2]o[2]||y[3]o[3]?!1:r.intersectsExtent(y)&&this._geometriesIntersect(r,g)},p=(m,g)=>{m.getLayers().forEach(y=>{if(y instanceof Pe)p(y,y.get("title")||g);else if(y instanceof O&&y.getVisible()){const w=y.get("title")||g||"Unknown",_=y.getSource();if(!_)return;const x=_.getFeaturesInExtent(o);for(const L of x){const v=L.get("_layerType");v==="measure_area"||v==="measure_circle"||v==="measure_circle_radius"||f(L)&&(v==="parcel"?c.push(L):v==="collector_zone"?d.push(L):(u[w]||(u[w]=[]),u[w].push(L)))}}})};p(this.overlayGroup,"Overlays");const h=[{label:"Area",value:i,_first:!0},{label:"Perimeter",value:l},...this._collectIntersectionRows(c,d,u)];this._showAnalysisPopup("📐","Area Analysis",h,t,{kind:"area",clipGeometry:r,parcelFeatures:c,zoneFeatures:d,otherByLayer:u})}_geometriesIntersect(e,t){const r=t.getType();if(r==="Polygon"||r==="MultiPolygon"){const o=t.getFlatCoordinates(),a=t.getStride();for(let l=0;l - @@ -493,7 +493,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C - `;this.parcelEditElement.innerHTML=i,this.parcelEditPopup.setPosition(t),this.parcelEditElement.querySelector(".parcel-edit-close").addEventListener("click",()=>{this.hideParcelEditPopup()}),this.parcelEditElement.querySelector(".parcel-edit-cancel").addEventListener("click",()=>{this.hideParcelEditPopup()});const s=this.parcelEditElement.querySelector(".parcel-edit-form");s.addEventListener("submit",l=>{l.preventDefault();const c=new FormData(s),d={};for(const[u,p]of c.entries())d[u]=p;d._layerType="parcel";for(const[u,p]of Object.entries(d))this._parcelEditFeature.set(u,p);for(const u of this._parcelEditCallbacks)u(this._parcelEditFeature,d);this.hideParcelEditPopup()})}hideParcelEditPopup(){this.parcelEditPopup.setPosition(void 0),this._parcelEditFeature=null}onParcelEdit(e){this._parcelEditCallbacks.push(e)}createMergePopup(){this.mergePopupElement=document.createElement("div"),this.mergePopupElement.className="map-merge-popup",this.mergePopupElement.style.cssText=` + `;this.parcelEditElement.innerHTML=i,this.parcelEditPopup.setPosition(t),this.parcelEditElement.querySelector(".parcel-edit-close").addEventListener("click",()=>{this.hideParcelEditPopup()}),this.parcelEditElement.querySelector(".parcel-edit-cancel").addEventListener("click",()=>{this.hideParcelEditPopup()});const s=this.parcelEditElement.querySelector(".parcel-edit-form");s.addEventListener("submit",l=>{l.preventDefault();const c=new FormData(s),d={};for(const[u,f]of c.entries())d[u]=f;d._layerType="parcel";for(const[u,f]of Object.entries(d))this._parcelEditFeature.set(u,f);for(const u of this._parcelEditCallbacks)u(this._parcelEditFeature,d);this.hideParcelEditPopup()})}hideParcelEditPopup(){this.parcelEditPopup.setPosition(void 0),this._parcelEditFeature=null}onParcelEdit(e){this._parcelEditCallbacks.push(e)}createMergePopup(){this.mergePopupElement=document.createElement("div"),this.mergePopupElement.className="map-merge-popup",this.mergePopupElement.style.cssText=` position: absolute; background: var(--card, #fff); color: var(--card-foreground, #1e1a4b); @@ -508,7 +508,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C overflow: hidden; display: flex; flex-direction: column; - `,this.mergePopup=new Ee({element:this.mergePopupElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.mergePopup)}showMergeIdentifierPopup(e,t,r,o){const a=["UPN","upn","id","parcelid","parcel_id","PARCELID","PARCEL_ID","ID"],i=h=>{for(const y of a)if(h[y]!==void 0&&h[y]!==null&&String(h[y]).trim())return{field:y,value:String(h[y])};return{field:"id",value:"Unknown"}},s=i(t),l=i(r),c=` + `,this.mergePopup=new Ee({element:this.mergePopupElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.mergePopup)}showMergeIdentifierPopup(e,t,r,o){const a=["UPN","upn","id","parcelid","parcel_id","PARCELID","PARCEL_ID","ID"],i=h=>{for(const m of a)if(h[m]!==void 0&&h[m]!==null&&String(h[m]).trim())return{field:m,value:String(h[m])};return{field:"id",value:"Unknown"}},s=i(t),l=i(r),c=`
🔗 Merged Parcel — Choose Identifier @@ -542,7 +542,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C
- `;this.mergePopupElement.innerHTML=c,this.mergePopup.setPosition(o);const d=()=>{this.mergePopup.setPosition(void 0)};this.mergePopupElement.querySelector(".merge-popup-close").addEventListener("click",d),this.mergePopupElement.querySelector(".merge-popup-cancel").addEventListener("click",d),this.mergePopupElement.querySelector(".merge-popup-confirm").addEventListener("click",()=>{const y=this.mergePopupElement.querySelector('input[name="merge-choice"]:checked').value==="A"?t:r,g=["geometry"];for(const[m,b]of Object.entries(y))g.includes(m)||e.set(m,b);e.set("_layerType","parcel");for(const m of this._parcelEditCallbacks)m(e,y);d()});const u=this.mergePopupElement.querySelectorAll("label"),p=this.mergePopupElement.querySelectorAll('input[name="merge-choice"]'),f=()=>{u.forEach(h=>{const y=h.querySelector("input");h.style.borderColor=y.checked?y.value==="A"?"#0ea5e9":"#f59e0b":"var(--border, #1e1a4b1f)"})};p.forEach(h=>h.addEventListener("change",f)),f()}createDividePopup(){this.dividePopupElement=document.createElement("div"),this.dividePopupElement.className="map-divide-popup",this.dividePopupElement.style.cssText=` + `;this.mergePopupElement.innerHTML=c,this.mergePopup.setPosition(o);const d=()=>{this.mergePopup.setPosition(void 0)};this.mergePopupElement.querySelector(".merge-popup-close").addEventListener("click",d),this.mergePopupElement.querySelector(".merge-popup-cancel").addEventListener("click",d),this.mergePopupElement.querySelector(".merge-popup-confirm").addEventListener("click",()=>{const m=this.mergePopupElement.querySelector('input[name="merge-choice"]:checked').value==="A"?t:r,g=["geometry"];for(const[y,w]of Object.entries(m))g.includes(y)||e.set(y,w);e.set("_layerType","parcel");for(const y of this._parcelEditCallbacks)y(e,m);d()});const u=this.mergePopupElement.querySelectorAll("label"),f=this.mergePopupElement.querySelectorAll('input[name="merge-choice"]'),p=()=>{u.forEach(h=>{const m=h.querySelector("input");h.style.borderColor=m.checked?m.value==="A"?"#0ea5e9":"#f59e0b":"var(--border, #1e1a4b1f)"})};f.forEach(h=>h.addEventListener("change",p)),p()}createDividePopup(){this.dividePopupElement=document.createElement("div"),this.dividePopupElement.className="map-divide-popup",this.dividePopupElement.style.cssText=` position: absolute; background: var(--card, #fff); color: var(--card-foreground, #1e1a4b); @@ -592,20 +592,20 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C overflow: hidden; display: flex; flex-direction: column; - `,this.drawnPolygonPopup=new Ee({element:this.drawnPolygonElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.drawnPolygonPopup),this._drawnPolygonCallbacks=[],this._drawnPolygonFeature=null}getParcelAttributeKeys(){const e=["geometry","_layerType"],t=[],r=o=>{t.length>0||o.getLayers().forEach(a=>{if(!(t.length>0)){if(a instanceof ke)r(a);else if(a instanceof N){const i=a.getSource();if(!i)return;for(const s of i.getFeatures()){if(s.get("_layerType")!=="parcel")continue;const l=s.getProperties();for(const c of Object.keys(l))e.includes(c)||t.push(c);return}}}})};return r(this.overlayGroup),t}showDrawnPolygonPopup(e,t){this._drawnPolygonFeature=e;const r=this.getParcelAttributeKeys();if(r.length===0){console.warn("[MapView] No parcel attributes found — cannot build form");return}let o="";for(const d of r){const u=this.escapeHtml(d);o+=` + `,this.drawnPolygonPopup=new Ee({element:this.drawnPolygonElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.drawnPolygonPopup),this._drawnPolygonCallbacks=[],this._drawnPolygonFeature=null}getParcelAttributeKeys(){const e=["geometry","_layerType"],t=[],r=o=>{t.length>0||o.getLayers().forEach(a=>{if(!(t.length>0)){if(a instanceof Pe)r(a);else if(a instanceof O){const i=a.getSource();if(!i)return;for(const s of i.getFeatures()){if(s.get("_layerType")!=="parcel")continue;const l=s.getProperties();for(const c of Object.keys(l))e.includes(c)||t.push(c);return}}}})};return r(this.overlayGroup),t}showDrawnPolygonPopup(e,t){this._drawnPolygonFeature=e;const r=this.getParcelAttributeKeys();if(r.length===0){console.warn("[MapView] No parcel attributes found — cannot build form");return}let o="";for(const d of r){const u=this.escapeHtml(d);o+=`
- `}const a=e.getGeometry(),i=st(a,{projection:"EPSG:3857"}),l=` + `}const a=e.getGeometry(),i=lt(a,{projection:"EPSG:3857"}),l=`
📐 Polygon Attributes
- Area: ${lt(i)} + Area: ${ct(i)}
${o} @@ -618,7 +618,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C
- `;this.drawnPolygonElement.innerHTML=l,this.drawnPolygonPopup.setPosition(t),this.drawnPolygonElement.querySelector(".drawn-polygon-close").addEventListener("click",()=>{this.hideDrawnPolygonPopup()}),this.drawnPolygonElement.querySelector(".drawn-polygon-cancel").addEventListener("click",()=>{this.hideDrawnPolygonPopup()});const c=this.drawnPolygonElement.querySelector(".drawn-polygon-form");c.addEventListener("submit",d=>{d.preventDefault();const u=new FormData(c),p={};for(const[f,h]of u.entries())p[f]=h;for(const[f,h]of Object.entries(p))this._drawnPolygonFeature.set(f,h);this._drawnPolygonFeature.set("_layerType","parcel");for(const f of this._drawnPolygonCallbacks)f(this._drawnPolygonFeature,p);this.hideDrawnPolygonPopup()})}hideDrawnPolygonPopup(){this.drawnPolygonPopup.setPosition(void 0),this._drawnPolygonFeature=null}onDrawnPolygonSave(e){this._drawnPolygonCallbacks.push(e)}onFeatureModified(e){this._featureModifiedCallbacks||(this._featureModifiedCallbacks=[]),this._featureModifiedCallbacks.push(e)}onDblClick(e){return this.dblClickCallbacks.push(e),this.dblClickCallbacks.length===1&&this.map.on("dblclick",t=>{const[r,o]=Ae(t.coordinate);let a=null;this.map.forEachFeatureAtPixel(t.pixel,i=>(a=i,!0)),a&&(t.preventDefault(),t.stopPropagation());for(const i of this.dblClickCallbacks)i(r,o,a,t);if(a)return!1}),()=>{const t=this.dblClickCallbacks.indexOf(e);t>-1&&this.dblClickCallbacks.splice(t,1)}}escapeHtml(e){if(!e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML}createAddLocationPopup(){this.addLocationPopupElement=document.createElement("div"),this.addLocationPopupElement.className="map-add-location-popup",this.addLocationPopupElement.innerHTML=` + `;this.drawnPolygonElement.innerHTML=l,this.drawnPolygonPopup.setPosition(t),this.drawnPolygonElement.querySelector(".drawn-polygon-close").addEventListener("click",()=>{this.hideDrawnPolygonPopup()}),this.drawnPolygonElement.querySelector(".drawn-polygon-cancel").addEventListener("click",()=>{this.hideDrawnPolygonPopup()});const c=this.drawnPolygonElement.querySelector(".drawn-polygon-form");c.addEventListener("submit",d=>{d.preventDefault();const u=new FormData(c),f={};for(const[p,h]of u.entries())f[p]=h;for(const[p,h]of Object.entries(f))this._drawnPolygonFeature.set(p,h);this._drawnPolygonFeature.set("_layerType","parcel");for(const p of this._drawnPolygonCallbacks)p(this._drawnPolygonFeature,f);this.hideDrawnPolygonPopup()})}hideDrawnPolygonPopup(){this.drawnPolygonPopup.setPosition(void 0),this._drawnPolygonFeature=null}onDrawnPolygonSave(e){this._drawnPolygonCallbacks.push(e)}onFeatureModified(e){this._featureModifiedCallbacks||(this._featureModifiedCallbacks=[]),this._featureModifiedCallbacks.push(e)}onDblClick(e){return this.dblClickCallbacks.push(e),this.dblClickCallbacks.length===1&&this.map.on("dblclick",t=>{const[r,o]=Oe(t.coordinate);let a=null;this.map.forEachFeatureAtPixel(t.pixel,i=>(a=i,!0)),a&&(t.preventDefault(),t.stopPropagation());for(const i of this.dblClickCallbacks)i(r,o,a,t);if(a)return!1}),()=>{const t=this.dblClickCallbacks.indexOf(e);t>-1&&this.dblClickCallbacks.splice(t,1)}}escapeHtml(e){if(!e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML}createAddLocationPopup(){this.addLocationPopupElement=document.createElement("div"),this.addLocationPopupElement.className="map-add-location-popup",this.addLocationPopupElement.innerHTML=`
➕ Add Location @@ -643,7 +643,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C
- `,this.addLocationPopup=new Ee({element:this.addLocationPopupElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.addLocationPopup),this.addLocationCoords=null,this.addLocationPopupElement.querySelector(".add-location-popup-close").addEventListener("click",()=>{this.hideAddLocationPopup()}),this.addLocationCallbacks=[]}showAddLocationPopup(e){const[t,r]=Ae(e);this.addLocationCoords={lon:t,lat:r};const o=this.addLocationPopupElement.querySelector("#map-location-coords");o.textContent=`${t.toFixed(6)}, ${r.toFixed(6)}`,this.addLocationPopupElement.querySelector("#map-add-location-form").reset(),this.addLocationPopup.setPosition(e)}hideAddLocationPopup(){this.addLocationPopup.setPosition(void 0),this.addLocationCoords=null}onAddLocation(e){if(this.addLocationCallbacks.push(e),this.addLocationCallbacks.length===1){const t=this.addLocationPopupElement.querySelector("#map-add-location-form");t.addEventListener("submit",r=>{if(r.preventDefault(),!this.addLocationCoords)return;const o=new FormData(t),a={name:o.get("name"),category:o.get("category"),description:o.get("description"),lon:this.addLocationCoords.lon,lat:this.addLocationCoords.lat};this.addLocationCallbacks.forEach(i=>i(a)),this.hideAddLocationPopup()})}}createBaseLayers(e){const t=new ae({title:"Topographic",type:"base",zIndex:-100,visible:e==="topo",source:new Ie({url:"https://{a-c}.tile.opentopomap.org/{z}/{x}/{y}.png",attributions:"Map data: © OpenTopoMap",maxZoom:17,crossOrigin:"anonymous"})});t.set("basemapKey","topo");const r=new ae({title:"Carto Light",type:"base",zIndex:-100,visible:e==="carto-light",source:new Ie({url:"https://{a-c}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",attributions:"© CARTO",maxZoom:19,crossOrigin:"anonymous"})});r.set("basemapKey","carto-light");const o=new ae({title:"Carto Dark",type:"base",zIndex:-100,visible:e==="carto-dark",source:new Ie({url:"https://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",attributions:"© CARTO",maxZoom:19,crossOrigin:"anonymous"})});o.set("basemapKey","carto-dark");const a=new ae({title:"OSM Cycle map",type:"base",zIndex:-100,visible:!1,source:new No({url:"https://tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey=ae1339c46dd3446b9c491e7336d38760"})});a.set("basemapKey","cycle");const i=new ae({title:"Satellite",type:"base",zIndex:-100,visible:e==="satellite",source:new Ie({url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",attributions:"Tiles © Esri",maxZoom:19,crossOrigin:"anonymous"})});i.set("basemapKey","satellite");const s=new ae({title:"Google Sat",type:"base",zIndex:-100,visible:e==="googlesat",source:new Ie({url:"http://mt0.google.com/vt/lyrs=y&hl=en&x={x}&y={y}&z={z}&s=Ga",attributions:"Tiles © Google",maxZoom:19,crossOrigin:"anonymous"})});s.set("basemapKey","googlesat");const l=new ae({title:"OpenStreetMap",type:"base",zIndex:-100,visible:e==="osm",source:new No});l.set("basemapKey","osm"),this._baseMapLayers=[r,o,a,i,s,l,t];const c=new ke({title:"Base Maps",layers:[r,o,i,a,s,l,t]});return c.set("displayInLayerSwitcher",!1),c}setBaseMap(e){if(!this._baseMapLayers)return!1;if(e==="none"){for(const r of this._baseMapLayers)r.setVisible(!1);return console.log("[MapView] Base map switched off (none)"),this.map.dispatchEvent({type:"basemapchange",key:"none"}),!0}let t=!1;for(const r of this._baseMapLayers){const o=r.get("basemapKey")===e;r.setVisible(o),o&&(t=!0)}return t&&(console.log("[MapView] Base map switched to:",e),this.map.dispatchEvent({type:"basemapchange",key:e})),t}_createBaseMapPicker(){const e=[{key:"topo",label:"Topographic",grad:"linear-gradient(135deg,#e8d5b7,#a67c52)"},{key:"osm",label:"OpenStreetMap",grad:"linear-gradient(135deg,#d4e6f1,#85c1e9)"},{key:"satellite",label:"Satellite",grad:"linear-gradient(135deg,#1b4332,#40916c)"},{key:"googlesat",label:"Google Sat",grad:"linear-gradient(135deg,#2a5d3d,#4a8c5a)"},{key:"carto-light",label:"Carto Light",grad:"linear-gradient(135deg,#f5f5f5,#d4d4d4)"},{key:"carto-dark",label:"Carto Dark",grad:"linear-gradient(135deg,#1a1a2e,#0f3460)"},{key:"none",label:"None",grad:"repeating-conic-gradient(#e5e7eb 0 25%, #fff 0 50%) 50% / 12px 12px"}],t=this.map.getTargetElement();if(!t)return;const r=document.createElement("button");r.type="button",r.className="ls-basemap-toggle",r.title="Switch base map",r.setAttribute("aria-label","Switch base map"),r.innerHTML='',t.appendChild(r);const o=document.createElement("div");o.className="ls-basemap-panel",o.innerHTML='
Base Map
'+e.map(i=>` + `,this.addLocationPopup=new Ee({element:this.addLocationPopupElement,positioning:"bottom-center",offset:[0,-10],stopEvent:!0,autoPan:!0,autoPanAnimation:{duration:250}}),this.map.addOverlay(this.addLocationPopup),this.addLocationCoords=null,this.addLocationPopupElement.querySelector(".add-location-popup-close").addEventListener("click",()=>{this.hideAddLocationPopup()}),this.addLocationCallbacks=[]}showAddLocationPopup(e){const[t,r]=Oe(e);this.addLocationCoords={lon:t,lat:r};const o=this.addLocationPopupElement.querySelector("#map-location-coords");o.textContent=`${t.toFixed(6)}, ${r.toFixed(6)}`,this.addLocationPopupElement.querySelector("#map-add-location-form").reset(),this.addLocationPopup.setPosition(e)}hideAddLocationPopup(){this.addLocationPopup.setPosition(void 0),this.addLocationCoords=null}onAddLocation(e){if(this.addLocationCallbacks.push(e),this.addLocationCallbacks.length===1){const t=this.addLocationPopupElement.querySelector("#map-add-location-form");t.addEventListener("submit",r=>{if(r.preventDefault(),!this.addLocationCoords)return;const o=new FormData(t),a={name:o.get("name"),category:o.get("category"),description:o.get("description"),lon:this.addLocationCoords.lon,lat:this.addLocationCoords.lat};this.addLocationCallbacks.forEach(i=>i(a)),this.hideAddLocationPopup()})}}createBaseLayers(e){const t=new ae({title:"Topographic",type:"base",zIndex:-100,visible:e==="topo",source:new Me({url:"https://{a-c}.tile.opentopomap.org/{z}/{x}/{y}.png",attributions:"Map data: © OpenTopoMap",maxZoom:17,crossOrigin:"anonymous"})});t.set("basemapKey","topo");const r=new ae({title:"Carto Light",type:"base",zIndex:-100,visible:e==="carto-light",source:new Me({url:"https://{a-c}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",attributions:"© CARTO",maxZoom:19,crossOrigin:"anonymous"})});r.set("basemapKey","carto-light");const o=new ae({title:"Carto Dark",type:"base",zIndex:-100,visible:e==="carto-dark",source:new Me({url:"https://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",attributions:"© CARTO",maxZoom:19,crossOrigin:"anonymous"})});o.set("basemapKey","carto-dark");const a=new ae({title:"OSM Cycle map",type:"base",zIndex:-100,visible:!1,source:new No({url:"https://tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey=ae1339c46dd3446b9c491e7336d38760"})});a.set("basemapKey","cycle");const i=new ae({title:"Satellite",type:"base",zIndex:-100,visible:e==="satellite",source:new Me({url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",attributions:"Tiles © Esri",maxZoom:19,crossOrigin:"anonymous"})});i.set("basemapKey","satellite");const s=new ae({title:"Google Sat",type:"base",zIndex:-100,visible:e==="googlesat",source:new Me({url:"http://mt0.google.com/vt/lyrs=y&hl=en&x={x}&y={y}&z={z}&s=Ga",attributions:"Tiles © Google",maxZoom:19,crossOrigin:"anonymous"})});s.set("basemapKey","googlesat");const l=new ae({title:"OpenStreetMap",type:"base",zIndex:-100,visible:e==="osm",source:new No});l.set("basemapKey","osm"),this._baseMapLayers=[r,o,a,i,s,l,t];const c=new Pe({title:"Base Maps",layers:[r,o,i,a,s,l,t]});return c.set("displayInLayerSwitcher",!1),c}setBaseMap(e){if(!this._baseMapLayers)return!1;if(e==="none"){for(const r of this._baseMapLayers)r.setVisible(!1);return console.log("[MapView] Base map switched off (none)"),this.map.dispatchEvent({type:"basemapchange",key:"none"}),!0}let t=!1;for(const r of this._baseMapLayers){const o=r.get("basemapKey")===e;r.setVisible(o),o&&(t=!0)}return t&&(console.log("[MapView] Base map switched to:",e),this.map.dispatchEvent({type:"basemapchange",key:e})),t}_createBaseMapPicker(){const e=[{key:"topo",label:"Topographic",grad:"linear-gradient(135deg,#e8d5b7,#a67c52)"},{key:"osm",label:"OpenStreetMap",grad:"linear-gradient(135deg,#d4e6f1,#85c1e9)"},{key:"satellite",label:"Satellite",grad:"linear-gradient(135deg,#1b4332,#40916c)"},{key:"googlesat",label:"Google Sat",grad:"linear-gradient(135deg,#2a5d3d,#4a8c5a)"},{key:"carto-light",label:"Carto Light",grad:"linear-gradient(135deg,#f5f5f5,#d4d4d4)"},{key:"carto-dark",label:"Carto Dark",grad:"linear-gradient(135deg,#1a1a2e,#0f3460)"},{key:"none",label:"None",grad:"repeating-conic-gradient(#e5e7eb 0 25%, #fff 0 50%) 50% / 12px 12px"}],t=this.map.getTargetElement();if(!t)return;const r=document.createElement("button");r.type="button",r.className="ls-basemap-toggle",r.title="Switch base map",r.setAttribute("aria-label","Switch base map"),r.innerHTML='',t.appendChild(r);const o=document.createElement("div");o.className="ls-basemap-panel",o.innerHTML='
Base Map
'+e.map(i=>` - `).join("")+"
",t.appendChild(o),this._basemapPanel=o,this._basemapToggle=r;const a=i=>{const s=i||this._baseMapLayers?.find(l=>l.getVisible())?.get("basemapKey");o.querySelectorAll('input[name="lupmis-basemap"]').forEach(l=>{l.checked=l.value===s})};a(),r.addEventListener("click",i=>{i.stopPropagation();const s=!o.classList.contains("open");o.classList.toggle("open",s),r.classList.toggle("active",s),s&&a()}),document.addEventListener("click",i=>{o.classList.contains("open")&&(o.contains(i.target)||r.contains(i.target)||(o.classList.remove("open"),r.classList.remove("active")))}),o.addEventListener("change",i=>{const s=i.target.closest('input[type=radio][name="lupmis-basemap"]');if(!s)return;const l=s.value;this.setBaseMap(l);try{localStorage.setItem("default-basemap",l)}catch{}o.classList.remove("open"),r.classList.remove("active")}),this.map.on("basemapchange",i=>a(i.key))}_initGpsRendering(){this._gpsPositionSource=new j,this._gpsTrailSource=new j,this._gpsTrailCoords=[],this._gpsTrailLayer=new N({source:this._gpsTrailSource,zIndex:940,style:new M({stroke:new I({color:"#ff6d00",width:4,lineCap:"round",lineJoin:"round"})}),properties:{title:"GPS Trail",displayInLayerSwitcher:!1}}),this._gpsPositionLayer=new N({source:this._gpsPositionSource,zIndex:950,style:e=>e.get("_kind")==="accuracy"?new M({fill:new C({color:"rgba(0,94,184,0.12)"}),stroke:new I({color:"rgba(0,94,184,0.35)",width:1})}):new M({image:new fe({radius:7,fill:new C({color:"#005eb8"}),stroke:new I({color:"#ffffff",width:2.5})})}),properties:{title:"GPS Position",displayInLayerSwitcher:!1}}),this.map.addLayer(this._gpsTrailLayer),this.map.addLayer(this._gpsPositionLayer),this._gpsCallbacks={locate:[],record:[]},this._gpsRecording=!1}onLocateMe(e){this._gpsCallbacks.locate.push(e)}onToggleRecording(e){this._gpsCallbacks.record.push(e)}showCurrentPosition(e,t,r=null){if(e==null||t==null)return;const o=ee([e,t]);if(this._gpsPositionSource.clear(),r&&r>0){const i=r/Math.cos(t*Math.PI/180),s=new pe({geometry:new dt([this._circleRing(o,i)])});s.set("_kind","accuracy"),this._gpsPositionSource.addFeature(s)}const a=new pe({geometry:new gt(o)});a.set("_kind","dot"),this._gpsPositionSource.addFeature(a)}_circleRing(e,t,r=48){const o=[],i=t/1;for(let s=0;s<=r;s++){const l=s/r*2*Math.PI;o.push([e[0]+i*Math.cos(l),e[1]+i*Math.sin(l)])}return o}centerOn(e,t,r=16){this.map.getView().animate({center:ee([e,t]),zoom:r,duration:500})}startTrailRender(){this._gpsTrailCoords=[],this._gpsTrailSource.clear()}appendTrailPoint(e,t){e==null||t==null||(this._gpsTrailCoords.push(ee([e,t])),this._gpsTrailSource.clear(),this._gpsTrailCoords.length>=2&&this._gpsTrailSource.addFeature(new pe({geometry:new he(this._gpsTrailCoords)})))}clearTrailRender(){this._gpsTrailCoords=[],this._gpsTrailSource.clear()}setRecordingState(e){this._gpsRecording=!!e,this._recordBtn&&(this._recordBtn.classList.toggle("recording",this._gpsRecording),this._recordBtn.title=this._gpsRecording?"Stop trail recording":"Record GPS trail",this._recordBtn.innerHTML=this._gpsRecording?'':''),this._locateToggle&&this._locateToggle.classList.toggle("recording",this._gpsRecording)}_createLocationControl(){const e=this.map.getTargetElement();if(!e)return;const t=document.createElement("button");t.type="button",t.className="ls-locate-toggle",t.title="My Location",t.setAttribute("aria-label","My Location"),t.innerHTML='',e.appendChild(t);const r=document.createElement("div");r.className="ls-locate-actions",r.innerHTML='',e.appendChild(r),this._locateToggle=t,this._locateActions=r,this._locateMeBtn=r.querySelector(".ls-locate-me"),this._recordBtn=r.querySelector(".ls-locate-record");const o=()=>{r.classList.remove("open"),t.classList.remove("active")},a=()=>{r.classList.add("open"),t.classList.add("active")};t.addEventListener("click",i=>{i.stopPropagation(),r.classList.contains("open")?o():a()}),document.addEventListener("click",i=>{r.classList.contains("open")&&(r.contains(i.target)||t.contains(i.target)||this._gpsRecording||o())}),this._locateMeBtn.addEventListener("click",i=>{i.stopPropagation();for(const s of this._gpsCallbacks.locate)try{s()}catch(l){console.error(l)}this._gpsRecording||o()}),this._recordBtn.addEventListener("click",i=>{i.stopPropagation();const s=!this._gpsRecording;for(const l of this._gpsCallbacks.record)try{l(s)}catch(c){console.error(c)}})}getFeatureStyle(e){const t=e.get("category")||"default",r=this.getEmoji(t);if(e===this.selectedFeature)return[new M({image:new fe({radius:22,fill:new C({color:"rgba(220, 38, 38, 0.25)"}),stroke:new I({color:"#dc2626",width:3})})}),new M({text:new ut({text:r,font:"40px sans-serif",textBaseline:"bottom",textAlign:"center",offsetY:-5})})];const o=e.get("style");return o||(this.categoryStyles[t]?this.categoryStyles[t]:this.defaultStyle)}setCategoryStyles(e){for(const[t,r]of Object.entries(e)){r.emoji&&(this.categoryEmojis[t]?(this.categoryEmojis[t].emoji=r.emoji,r.label&&(this.categoryEmojis[t].label=r.label)):this.categoryEmojis[t]={emoji:r.emoji,label:r.label||t});const o=this.getEmoji(t),a=r.fontSize||28;this.categoryStyles[t]=this.createEmojiStyle(o,a)}this.markerSource.changed()}addMarker(e,t,r={}){console.log("[MapView] Adding marker at",e,t,"with properties:",r);const o=new pe({geometry:new gt(ee([e,t])),...r});return o.set("lon",e),o.set("lat",t),this.markerSource.addFeature(o),console.log("[MapView] Marker added, total features:",this.markerSource.getFeatures().length),o}addMarkers(e){console.log("[MapView] Adding",e.length,"markers");const t=e.map(r=>new pe({geometry:new gt(ee([r.longitude,r.latitude])),id:r.id,name:r.name,description:r.description,category:r.category,lon:r.longitude,lat:r.latitude}));return this.markerSource.addFeatures(t),console.log("[MapView] Markers added, total features:",this.markerSource.getFeatures().length),t}clearMarkers(){this.markerSource.clear(),this.selectedFeature=null}removeMarker(e){if(typeof e=="object")this.markerSource.removeFeature(e);else{const t=this.markerSource.getFeatures().find(r=>r.get("id")===e);t&&this.markerSource.removeFeature(t)}}getMarkers(){return this.markerSource.getFeatures()}findMarker(e){return this.markerSource.getFeatures().find(t=>t.get("id")===e)}selectMarker(e){return typeof e=="object"?this.selectedFeature=e:this.selectedFeature=this.findMarker(e),this.markerSource.changed(),this.selectedFeature}clearSelection(){this.selectedFeature=null,this.markerSource.changed()}zoomTo(e,t,r=15){this.map.getView().animate({center:ee([e,t]),zoom:r,duration:500})}fitToMarkers(e=50){const t=this.markerSource.getExtent();t&&t[0]!==1/0&&this.map.getView().fit(t,{padding:[e,e,e,e],duration:500,maxZoom:16})}getCenter(){const e=this.map.getView().getCenter();return Ae(e)}getZoom(){return this.map.getView().getZoom()}setCenter(e,t){this.map.getView().setCenter(ee([e,t]))}setZoom(e){this.map.getView().setZoom(e)}onClick(e){return this.clickCallbacks.push(e),this.clickCallbacks.length===1&&(this._clickTimer=null,this.map.on("dblclick",()=>{this._clickTimer&&(clearTimeout(this._clickTimer),this._clickTimer=null)}),this.map.on("click",t=>{this._clickTimer&&(clearTimeout(this._clickTimer),this._clickTimer=null),!this._editBarActive&&this._selectInteraction&&this._selectInteraction.getFeatures().clear();let r=!1,o=!1,a=null;if(this.map.forEachFeatureAtPixel(t.pixel,l=>{l.get("_layerType")==="parcel"&&(o=!0),l.get("name")&&(a=l),r=!0}),r&&!o&&!a)return;const[i,s]=Ae(t.coordinate);this._clickTimer=setTimeout(()=>{this._clickTimer=null;let l=null;this.map.forEachFeatureAtPixel(t.pixel,c=>{if(c.get("name"))return l=c,!0});for(const c of this.clickCallbacks)c(i,s,l,t)},300)})),()=>{const t=this.clickCallbacks.indexOf(e);t>-1&&this.clickCallbacks.splice(t,1)}}onPointerMove(e){this.map.on("pointermove",t=>{if(t.dragging)return;const[r,o]=Ae(t.coordinate);let a=null;this.map.forEachFeatureAtPixel(t.pixel,i=>{if(i.get("name"))return a=i,!0}),this.map.getTargetElement().style.cursor=a?"pointer":"",e(r,o,a,t)})}enableHoverCursor(){}addGeoJSONLayer(e,t,r={},o=null){const{strokeColor:a="#3b82f6",strokeWidth:i=2,strokeDash:s=null,fillColor:l="rgba(59,130,246,0.1)",lineCasingColor:c=null,lineCasingWidth:d=null,pointRadius:u=5,pointFillColor:p=null,pointStrokeColor:f="#ffffff",pointStrokeWidth:h=1.5}=r,y=new j({features:new le().readFeatures(e,{featureProjection:"EPSG:3857"})}),g=new C({color:l}),m=new fe({radius:u,fill:new C({color:p||a}),stroke:new I({color:f,width:h})}),b=new I({color:a,width:i,...s?{lineDash:s}:{}});let _;if(c){const x=d??i+2;_=[new M({stroke:new I({color:c,width:x})}),new M({stroke:b,fill:g,image:m})]}else _=new M({stroke:b,fill:g,image:m});const S=new N({title:t,source:y,style:_});S.set("typeTag",r.typeTag||"VEC");const T=x=>x?x.includes("Polygon")?"Vector / Polygon":x.includes("LineString")?"Vector / Line":x.includes("Point")?"Vector / Point":"Vector":null;if(r.typeDescription)S.set("typeDescription",r.typeDescription);else{const x=y.getFeatures(),P=T(x[0]?.getGeometry?.()?.getType?.());if(P)S.set("typeDescription",P);else{const k=q=>{const z=T(q.feature.getGeometry?.()?.getType?.());z&&S.set("typeDescription",z),y.un("addfeature",k)};y.on("addfeature",k)}}return(o||this.overlayGroup).getLayers().push(S),console.log("[MapView] GeoJSON layer added:",t,"→",y.getFeatures().length,"features",o?`(in group "${o.get("title")}")`:""),S}addLayerGroup(e,t,r=""){const o=new ke({title:t.trim()});return o.set("layerId",e),o.set("description",r),this.overlayGroup.getLayers().push(o),console.log("[MapView] Layer group added:",t.trim(),"(id:",e+")"),o}addWMSLayer(e,t,r,o,a={}){const i=this.getLayerGroupByTitle(e);if(!i)return console.warn(`[MapView] Layer group "${e}" not found — cannot add WMS layer "${t}"`),null;const s={LAYERS:o,TILED:!0,WIDTH:256,HEIGHT:256};a.style!==void 0&&(s.STYLES=a.style);const l=new $o({url:r,params:s,serverType:a.serverType!==void 0?a.serverType:"geoserver",crossOrigin:"anonymous",hidpi:!1,attributions:a.attributions}),c=new ae({title:t,visible:a.visible!==void 0?a.visible:!0,source:l,opacity:a.opacity!==void 0?a.opacity:1,zIndex:a.zIndex});if(c.set("typeTag","WMS"),c.set("typeDescription","WMS / Raster"),l.on("tileloaderror",()=>{G(`WMS layer "${t}" — tile load error. Check the URL and layer name.`,"warning",5e3)}),i.getLayers().push(c),a.legendUrl)try{this._registerLegend(c,t,a.legendUrl)}catch(d){console.warn(`[MapView] Could not register legend for "${t}":`,d)}return a.onlineOnly&&this._attachOnlineOnlyHandler(c,t),console.log(`[MapView] WMS layer added: "${t}" → group "${e}"`),c}addXYZLayer(e,t,r,o={}){const a=this.getLayerGroupByTitle(e);if(!a)return console.warn(`[MapView] Layer group "${e}" not found — cannot add XYZ layer "${t}"`),null;const i=new Ie({url:r,crossOrigin:"anonymous",maxZoom:o.maxZoom!==void 0?o.maxZoom:19,attributions:o.attributions}),s=new ae({title:t,visible:o.visible!==void 0?o.visible:!0,source:i,opacity:o.opacity!==void 0?o.opacity:1,zIndex:o.zIndex});if(s.set("typeTag","XYZ"),s.set("typeDescription","XYZ / Tile"),i.on("tileloaderror",()=>{G(`XYZ layer "${t}" — tile load error. Check the URL.`,"warning",5e3)}),a.getLayers().push(s),o.legendUrl)try{this._registerLegend(s,t,o.legendUrl)}catch(l){console.warn(`[MapView] Could not register legend for "${t}":`,l)}return o.onlineOnly&&this._attachOnlineOnlyHandler(s,t),console.log(`[MapView] XYZ layer added: "${t}" → group "${e}"`),s}_createAddLayerDialog(){this._addLayerDialog=document.createElement("div"),this._addLayerDialog.className="map-add-layer-dialog",this._addLayerDialog.style.cssText=` + `).join("")+"
",t.appendChild(o),this._basemapPanel=o,this._basemapToggle=r;const a=i=>{const s=i||this._baseMapLayers?.find(l=>l.getVisible())?.get("basemapKey");o.querySelectorAll('input[name="lupmis-basemap"]').forEach(l=>{l.checked=l.value===s})};a(),r.addEventListener("click",i=>{i.stopPropagation();const s=!o.classList.contains("open");o.classList.toggle("open",s),r.classList.toggle("active",s),s&&a()}),document.addEventListener("click",i=>{o.classList.contains("open")&&(o.contains(i.target)||r.contains(i.target)||(o.classList.remove("open"),r.classList.remove("active")))}),o.addEventListener("change",i=>{const s=i.target.closest('input[type=radio][name="lupmis-basemap"]');if(!s)return;const l=s.value;this.setBaseMap(l);try{localStorage.setItem("default-basemap",l)}catch{}o.classList.remove("open"),r.classList.remove("active")}),this.map.on("basemapchange",i=>a(i.key))}_initGpsRendering(){this._gpsPositionSource=new j,this._gpsTrailSource=new j,this._gpsTrailCoords=[],this._gpsTrailLayer=new O({source:this._gpsTrailSource,zIndex:940,style:new M({stroke:new I({color:"#ff6d00",width:4,lineCap:"round",lineJoin:"round"})}),properties:{title:"GPS Trail",displayInLayerSwitcher:!1}}),this._gpsPositionLayer=new O({source:this._gpsPositionSource,zIndex:950,style:e=>e.get("_kind")==="accuracy"?new M({fill:new A({color:"rgba(0,94,184,0.12)"}),stroke:new I({color:"rgba(0,94,184,0.35)",width:1})}):new M({image:new fe({radius:7,fill:new A({color:"#005eb8"}),stroke:new I({color:"#ffffff",width:2.5})})}),properties:{title:"GPS Position",displayInLayerSwitcher:!1}}),this.map.addLayer(this._gpsTrailLayer),this.map.addLayer(this._gpsPositionLayer),this._gpsCallbacks={locate:[],record:[]},this._gpsRecording=!1}onLocateMe(e){this._gpsCallbacks.locate.push(e)}onToggleRecording(e){this._gpsCallbacks.record.push(e)}showCurrentPosition(e,t,r=null){if(e==null||t==null)return;const o=ee([e,t]);if(this._gpsPositionSource.clear(),r&&r>0){const i=r/Math.cos(t*Math.PI/180),s=new pe({geometry:new ut([this._circleRing(o,i)])});s.set("_kind","accuracy"),this._gpsPositionSource.addFeature(s)}const a=new pe({geometry:new mt(o)});a.set("_kind","dot"),this._gpsPositionSource.addFeature(a)}_circleRing(e,t,r=48){const o=[],i=t/1;for(let s=0;s<=r;s++){const l=s/r*2*Math.PI;o.push([e[0]+i*Math.cos(l),e[1]+i*Math.sin(l)])}return o}centerOn(e,t,r=16){this.map.getView().animate({center:ee([e,t]),zoom:r,duration:500})}startTrailRender(){this._gpsTrailCoords=[],this._gpsTrailSource.clear()}appendTrailPoint(e,t){e==null||t==null||(this._gpsTrailCoords.push(ee([e,t])),this._gpsTrailSource.clear(),this._gpsTrailCoords.length>=2&&this._gpsTrailSource.addFeature(new pe({geometry:new he(this._gpsTrailCoords)})))}clearTrailRender(){this._gpsTrailCoords=[],this._gpsTrailSource.clear()}setRecordingState(e){this._gpsRecording=!!e,this._recordBtn&&(this._recordBtn.classList.toggle("recording",this._gpsRecording),this._recordBtn.title=this._gpsRecording?"Stop trail recording":"Record GPS trail",this._recordBtn.innerHTML=this._gpsRecording?'':''),this._locateToggle&&this._locateToggle.classList.toggle("recording",this._gpsRecording)}_createLocationControl(){const e=this.map.getTargetElement();if(!e)return;const t=document.createElement("button");t.type="button",t.className="ls-locate-toggle",t.title="My Location",t.setAttribute("aria-label","My Location"),t.innerHTML='',e.appendChild(t);const r=document.createElement("div");r.className="ls-locate-actions",r.innerHTML='',e.appendChild(r),this._locateToggle=t,this._locateActions=r,this._locateMeBtn=r.querySelector(".ls-locate-me"),this._recordBtn=r.querySelector(".ls-locate-record");const o=()=>{r.classList.remove("open"),t.classList.remove("active")},a=()=>{r.classList.add("open"),t.classList.add("active")};t.addEventListener("click",i=>{i.stopPropagation(),r.classList.contains("open")?o():a()}),document.addEventListener("click",i=>{r.classList.contains("open")&&(r.contains(i.target)||t.contains(i.target)||this._gpsRecording||o())}),this._locateMeBtn.addEventListener("click",i=>{i.stopPropagation();for(const s of this._gpsCallbacks.locate)try{s()}catch(l){console.error(l)}this._gpsRecording||o()}),this._recordBtn.addEventListener("click",i=>{i.stopPropagation();const s=!this._gpsRecording;for(const l of this._gpsCallbacks.record)try{l(s)}catch(c){console.error(c)}})}getFeatureStyle(e){const t=e.get("category")||"default",r=this.getEmoji(t);if(e===this.selectedFeature)return[new M({image:new fe({radius:22,fill:new A({color:"rgba(220, 38, 38, 0.25)"}),stroke:new I({color:"#dc2626",width:3})})}),new M({text:new pt({text:r,font:"40px sans-serif",textBaseline:"bottom",textAlign:"center",offsetY:-5})})];const o=e.get("style");return o||(this.categoryStyles[t]?this.categoryStyles[t]:this.defaultStyle)}setCategoryStyles(e){for(const[t,r]of Object.entries(e)){r.emoji&&(this.categoryEmojis[t]?(this.categoryEmojis[t].emoji=r.emoji,r.label&&(this.categoryEmojis[t].label=r.label)):this.categoryEmojis[t]={emoji:r.emoji,label:r.label||t});const o=this.getEmoji(t),a=r.fontSize||28;this.categoryStyles[t]=this.createEmojiStyle(o,a)}this.markerSource.changed()}addMarker(e,t,r={}){console.log("[MapView] Adding marker at",e,t,"with properties:",r);const o=new pe({geometry:new mt(ee([e,t])),...r});return o.set("lon",e),o.set("lat",t),this.markerSource.addFeature(o),console.log("[MapView] Marker added, total features:",this.markerSource.getFeatures().length),o}addMarkers(e){console.log("[MapView] Adding",e.length,"markers");const t=e.map(r=>new pe({geometry:new mt(ee([r.longitude,r.latitude])),id:r.id,name:r.name,description:r.description,category:r.category,lon:r.longitude,lat:r.latitude}));return this.markerSource.addFeatures(t),console.log("[MapView] Markers added, total features:",this.markerSource.getFeatures().length),t}clearMarkers(){this.markerSource.clear(),this.selectedFeature=null}removeMarker(e){if(typeof e=="object")this.markerSource.removeFeature(e);else{const t=this.markerSource.getFeatures().find(r=>r.get("id")===e);t&&this.markerSource.removeFeature(t)}}getMarkers(){return this.markerSource.getFeatures()}findMarker(e){return this.markerSource.getFeatures().find(t=>t.get("id")===e)}selectMarker(e){return typeof e=="object"?this.selectedFeature=e:this.selectedFeature=this.findMarker(e),this.markerSource.changed(),this.selectedFeature}clearSelection(){this.selectedFeature=null,this.markerSource.changed()}zoomTo(e,t,r=15){this.map.getView().animate({center:ee([e,t]),zoom:r,duration:500})}fitToMarkers(e=50){const t=this.markerSource.getExtent();t&&t[0]!==1/0&&this.map.getView().fit(t,{padding:[e,e,e,e],duration:500,maxZoom:16})}getCenter(){const e=this.map.getView().getCenter();return Oe(e)}getZoom(){return this.map.getView().getZoom()}setCenter(e,t){this.map.getView().setCenter(ee([e,t]))}setZoom(e){this.map.getView().setZoom(e)}onClick(e){return this.clickCallbacks.push(e),this.clickCallbacks.length===1&&(this._clickTimer=null,this.map.on("dblclick",()=>{this._clickTimer&&(clearTimeout(this._clickTimer),this._clickTimer=null)}),this.map.on("click",t=>{this._clickTimer&&(clearTimeout(this._clickTimer),this._clickTimer=null),!this._editBarActive&&this._selectInteraction&&this._selectInteraction.getFeatures().clear();let r=!1,o=!1,a=null;if(this.map.forEachFeatureAtPixel(t.pixel,l=>{l.get("_layerType")==="parcel"&&(o=!0),l.get("name")&&(a=l),r=!0}),r&&!o&&!a)return;const[i,s]=Oe(t.coordinate);this._clickTimer=setTimeout(()=>{this._clickTimer=null;let l=null;this.map.forEachFeatureAtPixel(t.pixel,c=>{if(c.get("name"))return l=c,!0});for(const c of this.clickCallbacks)c(i,s,l,t)},300)})),()=>{const t=this.clickCallbacks.indexOf(e);t>-1&&this.clickCallbacks.splice(t,1)}}onPointerMove(e){this.map.on("pointermove",t=>{if(t.dragging)return;const[r,o]=Oe(t.coordinate);let a=null;this.map.forEachFeatureAtPixel(t.pixel,i=>{if(i.get("name"))return a=i,!0}),this.map.getTargetElement().style.cursor=a?"pointer":"",e(r,o,a,t)})}enableHoverCursor(){}addGeoJSONLayer(e,t,r={},o=null){const{strokeColor:a="#3b82f6",strokeWidth:i=2,strokeDash:s=null,fillColor:l="rgba(59,130,246,0.1)",lineCasingColor:c=null,lineCasingWidth:d=null,pointRadius:u=5,pointFillColor:f=null,pointStrokeColor:p="#ffffff",pointStrokeWidth:h=1.5}=r,m=new j({features:new le().readFeatures(e,{featureProjection:"EPSG:3857"})}),g=new A({color:l}),y=new fe({radius:u,fill:new A({color:f||a}),stroke:new I({color:p,width:h})}),w=new I({color:a,width:i,...s?{lineDash:s}:{}});let _;if(c){const S=d??i+2;_=[new M({stroke:new I({color:c,width:S})}),new M({stroke:w,fill:g,image:y})]}else _=new M({stroke:w,fill:g,image:y});const x=new O({title:t,source:m,style:_});x.set("typeTag",r.typeTag||"VEC");const L=S=>S?S.includes("Polygon")?"Vector / Polygon":S.includes("LineString")?"Vector / Line":S.includes("Point")?"Vector / Point":"Vector":null;if(r.typeDescription)x.set("typeDescription",r.typeDescription);else{const S=m.getFeatures(),P=L(S[0]?.getGeometry?.()?.getType?.());if(P)x.set("typeDescription",P);else{const k=z=>{const q=L(z.feature.getGeometry?.()?.getType?.());q&&x.set("typeDescription",q),m.un("addfeature",k)};m.on("addfeature",k)}}return(o||this.overlayGroup).getLayers().push(x),console.log("[MapView] GeoJSON layer added:",t,"→",m.getFeatures().length,"features",o?`(in group "${o.get("title")}")`:""),x}addLayerGroup(e,t,r=""){const o=new Pe({title:t.trim()});return o.set("layerId",e),o.set("description",r),this.overlayGroup.getLayers().push(o),console.log("[MapView] Layer group added:",t.trim(),"(id:",e+")"),o}addWMSLayer(e,t,r,o,a={}){const i=this.getLayerGroupByTitle(e);if(!i)return console.warn(`[MapView] Layer group "${e}" not found — cannot add WMS layer "${t}"`),null;const s={LAYERS:o,TILED:!0,WIDTH:256,HEIGHT:256};a.style!==void 0&&(s.STYLES=a.style);const l=new $o({url:r,params:s,serverType:a.serverType!==void 0?a.serverType:"geoserver",crossOrigin:"anonymous",hidpi:!1,attributions:a.attributions}),c=new ae({title:t,visible:a.visible!==void 0?a.visible:!0,source:l,opacity:a.opacity!==void 0?a.opacity:1,zIndex:a.zIndex});if(c.set("typeTag","WMS"),c.set("typeDescription","WMS / Raster"),l.on("tileloaderror",()=>{D(`WMS layer "${t}" — tile load error. Check the URL and layer name.`,"warning",5e3)}),i.getLayers().push(c),a.legendUrl)try{this._registerLegend(c,t,a.legendUrl)}catch(d){console.warn(`[MapView] Could not register legend for "${t}":`,d)}return a.onlineOnly&&this._attachOnlineOnlyHandler(c,t),console.log(`[MapView] WMS layer added: "${t}" → group "${e}"`),c}addXYZLayer(e,t,r,o={}){const a=this.getLayerGroupByTitle(e);if(!a)return console.warn(`[MapView] Layer group "${e}" not found — cannot add XYZ layer "${t}"`),null;const i=new Me({url:r,crossOrigin:"anonymous",maxZoom:o.maxZoom!==void 0?o.maxZoom:19,attributions:o.attributions}),s=new ae({title:t,visible:o.visible!==void 0?o.visible:!0,source:i,opacity:o.opacity!==void 0?o.opacity:1,zIndex:o.zIndex});if(s.set("typeTag","XYZ"),s.set("typeDescription","XYZ / Tile"),i.on("tileloaderror",()=>{D(`XYZ layer "${t}" — tile load error. Check the URL.`,"warning",5e3)}),a.getLayers().push(s),o.legendUrl)try{this._registerLegend(s,t,o.legendUrl)}catch(l){console.warn(`[MapView] Could not register legend for "${t}":`,l)}return o.onlineOnly&&this._attachOnlineOnlyHandler(s,t),console.log(`[MapView] XYZ layer added: "${t}" → group "${e}"`),s}async addCOGLayer(e,t,r,o={}){const a=this.getLayerGroupByTitle(e);if(!a)return console.warn(`[MapView] Layer group "${e}" not found — cannot add COG layer "${t}"`),null;let i,s;try{[{default:i},{default:s}]=await Promise.all([Le(()=>import("./geotiff-BaoeLn6q.js").then(c=>c.W),__vite__mapDeps([0,1,2,3])),Le(()=>import("./geotiff-BaoeLn6q.js").then(c=>c.G),__vite__mapDeps([0,1,2,3]))])}catch(c){return console.error("[MapView] Could not load COG support:",c),D("Raster (COG) support could not be loaded — check your connection.","error",6e3),null}let l=null;try{const c={sources:[{url:r,...o.min!==void 0?{min:o.min}:{},...o.max!==void 0?{max:o.max}:{}}],normalize:o.normalize!==void 0?o.normalize:!0,attributions:o.attributions},d=new s(c);l=new i({title:t,source:d,visible:o.visible!==void 0?o.visible:!0,opacity:o.opacity!==void 0?o.opacity:1,zIndex:o.zIndex,...o.style?{style:o.style}:{}}),l.set("typeTag","COG"),l.set("typeDescription","Cloud-Optimized GeoTIFF"),d.on("error",u=>{console.warn(`[MapView] COG "${t}" source error:`,u),D(`Raster "${t}" could not be loaded. Check that the file is a valid COG and is CORS-enabled.`,"warning",6e3)}),a.getLayers().push(l)}catch(c){return console.error(`[MapView] Failed to add COG layer "${t}":`,c),D(`Could not add raster "${t}": ${c.message}`,"error",6e3),null}return o.onlineOnly&&this._attachOnlineOnlyHandler(l,t),console.log(`[MapView] COG layer added: "${t}" → group "${e}"`),l}getSelectedFeatures(){return this._selectInteraction?this._selectInteraction.getFeatures().getArray().slice():[]}listVectorLayers(e={}){const{visibleOnly:t=!1,nonEmptyOnly:r=!0}=e,o=[],a=i=>{if(!i)return;if(typeof i.getLayers=="function"){i.getLayers().forEach(a);return}if(!(i instanceof O)||i===this._vertexOverlayLayer||i===this._gpsTrailLayer||i===this._gpsPositionLayer||i.get("displayInLayerSwitcher")===!1||t&&i.getVisible&&!i.getVisible())return;const s=i.getSource&&i.getSource();if(!s||typeof s.getFeatures!="function")return;const l=s.getFeatures().length;r&&l===0||o.push({layer:i,title:i.get("title")||"(untitled layer)",count:l})};return this.map.getLayers().forEach(a),o}_createAddLayerDialog(){this._addLayerDialog=document.createElement("div"),this._addLayerDialog.className="map-add-layer-dialog",this._addLayerDialog.style.cssText=` display:none;position:absolute;top:0;left:0;right:0;bottom:0; z-index:1100;background:rgba(0,0,0,0.4); align-items:center;justify-content:center; @@ -707,7 +707,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C - `,this._addLayerDialog.appendChild(e),this.map.getTargetElement().appendChild(this._addLayerDialog);const t=e.querySelector(".add-layer-name-row"),r=e.querySelector(".add-layer-name-hint"),o=e.querySelector(".add-layer-url");e.querySelectorAll('input[name="add-layer-type"]').forEach(i=>{i.addEventListener("change",()=>{const s=i.value;s==="xyz"?(t.style.display="none",o.placeholder="https://example.com/tiles/{z}/{x}/{y}.png"):(t.style.display="",o.placeholder=s==="wms"?"https://example.com/wms":"https://example.com/wfs",r.textContent=s==="wms"?"WMS LAYERS parameter (e.g. workspace:layer)":"WFS typename (e.g. workspace:layer)")})});const a=()=>this._hideAddLayerDialog();e.querySelector(".add-layer-close").addEventListener("click",a),e.querySelector(".add-layer-cancel").addEventListener("click",a),this._addLayerDialog.addEventListener("click",i=>{i.target===this._addLayerDialog&&a()}),e.querySelector(".add-layer-confirm").addEventListener("click",()=>{const i=e.querySelector('input[name="add-layer-type"]:checked').value,s=e.querySelector(".add-layer-url").value.trim(),l=e.querySelector(".add-layer-name").value.trim(),c=e.querySelector(".add-layer-title").value.trim();if(!s){e.querySelector(".add-layer-url").style.borderColor="#ef4444";return}if((i==="wms"||i==="wfs")&&!l){e.querySelector(".add-layer-name").style.borderColor="#ef4444";return}if(!c){e.querySelector(".add-layer-title").style.borderColor="#ef4444";return}this._addExternalLayer(i,s,l,c),this._hideAddLayerDialog()}),e.addEventListener("keydown",i=>{i.key==="Enter"&&(i.preventDefault(),e.querySelector(".add-layer-confirm").click()),i.key==="Escape"&&(i.preventDefault(),a())})}showAddLayerDialog(){const e=this._addLayerDialog;e.querySelector(".add-layer-url").value="",e.querySelector(".add-layer-name").value="",e.querySelector(".add-layer-title").value="",e.querySelectorAll('input[name="add-layer-type"]')[0].checked=!0,e.querySelector(".add-layer-name-row").style.display="",e.querySelector(".add-layer-url").placeholder="https://example.com/wms",e.querySelector(".add-layer-name-hint").textContent="WMS LAYERS parameter (e.g. workspace:layer)",e.querySelectorAll('input[type="text"]').forEach(t=>{t.style.borderColor="var(--border, #1e1a4b1f)"}),e.style.display="flex",e.querySelector(".add-layer-url").focus()}_hideAddLayerDialog(){this._addLayerDialog.style.display="none"}_addExternalLayer(e,t,r,o){const a=this._externalSourceGroup;if(!a){G('Layer group "External Source" not found.',"error",4e3);return}let i;switch(e){case"wms":{const s=new $o({url:t,params:{LAYERS:r,TILED:!0,WIDTH:256,HEIGHT:256},serverType:"geoserver",crossOrigin:"anonymous",hidpi:!1});i=new ae({title:o,visible:!0,source:s}),s.on("tileloaderror",()=>{G(`WMS "${o}" — tile load error. Check URL and layer name.`,"warning",5e3)});break}case"wfs":{const s=`${t}${t.includes("?")?"&":"?"}service=WFS&version=1.1.0&request=GetFeature&typename=${encodeURIComponent(r)}&outputFormat=application/json&srsname=EPSG:3857`,l=new j({url:s,format:new le});l.on("featuresloaderror",()=>{G(`WFS "${o}" — load error. Check URL and layer name.`,"warning",5e3)}),i=new N({title:o,visible:!0,source:l,style:new M({stroke:new I({color:"#e11d48",width:2}),fill:new C({color:"rgba(225,29,72,0.15)"})})});break}case"xyz":i=new ae({title:o,visible:!0,source:new Ie({url:t,crossOrigin:"anonymous"})}),i.getSource().on("tileloaderror",()=>{G(`XYZ "${o}" — tile load error. Check the URL template.`,"warning",5e3)});break;default:G(`Unknown layer type: ${e}`,"error",4e3);return}i.set("typeTag",e.toUpperCase()),i.set("typeDescription",{wms:"WMS / Raster",wfs:"WFS / Vector",xyz:"XYZ / Tile"}[e]||e.toUpperCase()),i.set("removable",!0),a.getLayers().push(i),G(`Layer "${o}" added to External Source.`,"success",3e3),console.log(`[MapView] External ${e.toUpperCase()} layer added: "${o}"`)}_decorateLayerListItem(e,t){const r=e.get("typeTag");if(r){const c=t.querySelector(":scope > .li-content > label > span");if(c&&!c.querySelector(":scope > .ls-type-tag")){const d=document.createElement("span");d.className=`ls-type-tag ls-type-tag-${String(r).toLowerCase()}`,d.textContent=String(r),d.title=`${r} layer`,c.appendChild(d)}}const o=t.querySelector(":scope > .ol-layerswitcher-buttons");if(o){const c=o.querySelector(":scope > .expend-layers, :scope > .collapse-layers");c&&!c.querySelector(":scope > svg.ls-chevron-svg")&&(c.innerHTML='')}const a=t.querySelector(":scope > .li-content"),i=()=>{if(!a)return;const c=e.get("typeDescription");let d=a.querySelector(":scope > .ls-layer-subtitle");if(!c){d&&d.remove();return}if(!d){d=document.createElement("div"),d.className="ls-layer-subtitle";const u=a.querySelector(":scope > label");u&&u.nextSibling?a.insertBefore(d,u.nextSibling):a.appendChild(d)}d.textContent=c};if(i(),e._lsSubtitleHooked||(e._lsSubtitleHooked=!0,e.on("change:typeDescription",()=>{i()})),e.get("removable")===!0&&o&&!o.querySelector(":scope > .ls-remove-btn")){const c=document.createElement("button");c.type="button",c.className="ls-remove-btn",c.title="Remove this layer",c.setAttribute("aria-label","Remove layer"),c.innerHTML='',c.addEventListener("click",d=>{d.stopPropagation(),this._removeLayer(e)}),o.appendChild(c)}const s=e.get("_externalImportId");if(s!=null){const c=t.querySelector(":scope > .li-content > label > span");let d=c?c.querySelector(":scope > .ls-import-chip"):null;const u=e.get("_externalImportStatus")||"mapped",p=e.getSource()?.getFeatures().length??0,f=e.get("_externalImportErrorCount")??0,h=(()=>{switch(u){case"mapped":return{text:`Upload ${p}`,cls:"ls-import-chip-mapped",title:"Upload this dataset to the database",clickable:!0};case"uploading":return{text:"…",cls:"ls-import-chip-uploading",title:"Uploading…",clickable:!1};case"submitted":return{text:"✓ submitted",cls:"ls-import-chip-submitted",title:"Uploaded — awaiting supervisor review",clickable:!1};case"migrated":return{text:"✓ live",cls:"ls-import-chip-migrated",title:"Approved by supervisor and live on the server",clickable:!1};case"failed":return{text:`${f} errors — fix?`,cls:"ls-import-chip-failed",title:"Some rows failed; click to review",clickable:!0};case"other":case null:case void 0:default:return null}})();if(!h)d&&d.remove();else if(c){d||(d=document.createElement("span"),d.className="ls-import-chip",c.appendChild(d)),d.className=`ls-import-chip ${h.cls}`,d.textContent=h.text,d.title=h.title,d.style.cursor=h.clickable?"pointer":"default",d.style.opacity=h.clickable?"1":"0.85";const y=d.cloneNode(!0);d.replaceWith(y),d=y,h.clickable&&d.addEventListener("click",g=>{g.preventDefault(),g.stopPropagation(),window.dispatchEvent(new CustomEvent("lupmis:import-chip-click",{detail:{importId:s,status:u,layer:e}}))})}}if((e.get("title")||"").toLowerCase().includes("external")&&(this._externalSourceGroup=e,o&&!o.querySelector(".ol-add-layer"))){const c=document.createElement("span");c.className="ol-add-layer",c.title="Add external layer",c.textContent="+",c.style.cssText=` + `,this._addLayerDialog.appendChild(e),this.map.getTargetElement().appendChild(this._addLayerDialog);const t=e.querySelector(".add-layer-name-row"),r=e.querySelector(".add-layer-name-hint"),o=e.querySelector(".add-layer-url");e.querySelectorAll('input[name="add-layer-type"]').forEach(i=>{i.addEventListener("change",()=>{const s=i.value;s==="xyz"?(t.style.display="none",o.placeholder="https://example.com/tiles/{z}/{x}/{y}.png"):(t.style.display="",o.placeholder=s==="wms"?"https://example.com/wms":"https://example.com/wfs",r.textContent=s==="wms"?"WMS LAYERS parameter (e.g. workspace:layer)":"WFS typename (e.g. workspace:layer)")})});const a=()=>this._hideAddLayerDialog();e.querySelector(".add-layer-close").addEventListener("click",a),e.querySelector(".add-layer-cancel").addEventListener("click",a),this._addLayerDialog.addEventListener("click",i=>{i.target===this._addLayerDialog&&a()}),e.querySelector(".add-layer-confirm").addEventListener("click",()=>{const i=e.querySelector('input[name="add-layer-type"]:checked').value,s=e.querySelector(".add-layer-url").value.trim(),l=e.querySelector(".add-layer-name").value.trim(),c=e.querySelector(".add-layer-title").value.trim();if(!s){e.querySelector(".add-layer-url").style.borderColor="#ef4444";return}if((i==="wms"||i==="wfs")&&!l){e.querySelector(".add-layer-name").style.borderColor="#ef4444";return}if(!c){e.querySelector(".add-layer-title").style.borderColor="#ef4444";return}this._addExternalLayer(i,s,l,c),this._hideAddLayerDialog()}),e.addEventListener("keydown",i=>{i.key==="Enter"&&(i.preventDefault(),e.querySelector(".add-layer-confirm").click()),i.key==="Escape"&&(i.preventDefault(),a())})}showAddLayerDialog(){const e=this._addLayerDialog;e.querySelector(".add-layer-url").value="",e.querySelector(".add-layer-name").value="",e.querySelector(".add-layer-title").value="",e.querySelectorAll('input[name="add-layer-type"]')[0].checked=!0,e.querySelector(".add-layer-name-row").style.display="",e.querySelector(".add-layer-url").placeholder="https://example.com/wms",e.querySelector(".add-layer-name-hint").textContent="WMS LAYERS parameter (e.g. workspace:layer)",e.querySelectorAll('input[type="text"]').forEach(t=>{t.style.borderColor="var(--border, #1e1a4b1f)"}),e.style.display="flex",e.querySelector(".add-layer-url").focus()}_hideAddLayerDialog(){this._addLayerDialog.style.display="none"}_addExternalLayer(e,t,r,o){const a=this._externalSourceGroup;if(!a){D('Layer group "External Source" not found.',"error",4e3);return}let i;switch(e){case"wms":{const s=new $o({url:t,params:{LAYERS:r,TILED:!0,WIDTH:256,HEIGHT:256},serverType:"geoserver",crossOrigin:"anonymous",hidpi:!1});i=new ae({title:o,visible:!0,source:s}),s.on("tileloaderror",()=>{D(`WMS "${o}" — tile load error. Check URL and layer name.`,"warning",5e3)});break}case"wfs":{const s=`${t}${t.includes("?")?"&":"?"}service=WFS&version=1.1.0&request=GetFeature&typename=${encodeURIComponent(r)}&outputFormat=application/json&srsname=EPSG:3857`,l=new j({url:s,format:new le});l.on("featuresloaderror",()=>{D(`WFS "${o}" — load error. Check URL and layer name.`,"warning",5e3)}),i=new O({title:o,visible:!0,source:l,style:new M({stroke:new I({color:"#e11d48",width:2}),fill:new A({color:"rgba(225,29,72,0.15)"})})});break}case"xyz":i=new ae({title:o,visible:!0,source:new Me({url:t,crossOrigin:"anonymous"})}),i.getSource().on("tileloaderror",()=>{D(`XYZ "${o}" — tile load error. Check the URL template.`,"warning",5e3)});break;default:D(`Unknown layer type: ${e}`,"error",4e3);return}i.set("typeTag",e.toUpperCase()),i.set("typeDescription",{wms:"WMS / Raster",wfs:"WFS / Vector",xyz:"XYZ / Tile"}[e]||e.toUpperCase()),i.set("removable",!0),a.getLayers().push(i),D(`Layer "${o}" added to External Source.`,"success",3e3),console.log(`[MapView] External ${e.toUpperCase()} layer added: "${o}"`)}_decorateLayerListItem(e,t){const r=e.get("typeTag");if(r){const c=t.querySelector(":scope > .li-content > label > span");if(c&&!c.querySelector(":scope > .ls-type-tag")){const d=document.createElement("span");d.className=`ls-type-tag ls-type-tag-${String(r).toLowerCase()}`,d.textContent=String(r),d.title=`${r} layer`,c.appendChild(d)}}const o=t.querySelector(":scope > .ol-layerswitcher-buttons");if(o){const c=o.querySelector(":scope > .expend-layers, :scope > .collapse-layers");c&&!c.querySelector(":scope > svg.ls-chevron-svg")&&(c.innerHTML='')}const a=t.querySelector(":scope > .li-content"),i=()=>{if(!a)return;const c=e.get("typeDescription");let d=a.querySelector(":scope > .ls-layer-subtitle");if(!c){d&&d.remove();return}if(!d){d=document.createElement("div"),d.className="ls-layer-subtitle";const u=a.querySelector(":scope > label");u&&u.nextSibling?a.insertBefore(d,u.nextSibling):a.appendChild(d)}d.textContent=c};if(i(),e._lsSubtitleHooked||(e._lsSubtitleHooked=!0,e.on("change:typeDescription",()=>{i()})),e.get("removable")===!0&&o&&!o.querySelector(":scope > .ls-remove-btn")){const c=document.createElement("button");c.type="button",c.className="ls-remove-btn",c.title="Remove this layer",c.setAttribute("aria-label","Remove layer"),c.innerHTML='',c.addEventListener("click",d=>{d.stopPropagation(),this._removeLayer(e)}),o.appendChild(c)}const s=e.get("_externalImportId");if(s!=null){const c=t.querySelector(":scope > .li-content > label > span");let d=c?c.querySelector(":scope > .ls-import-chip"):null;const u=e.get("_externalImportStatus")||"mapped",f=e.getSource()?.getFeatures().length??0,p=e.get("_externalImportErrorCount")??0,h=(()=>{switch(u){case"mapped":return{text:`Upload ${f}`,cls:"ls-import-chip-mapped",title:"Upload this dataset to the database",clickable:!0};case"uploading":return{text:"…",cls:"ls-import-chip-uploading",title:"Uploading…",clickable:!1};case"submitted":return{text:"✓ submitted",cls:"ls-import-chip-submitted",title:"Uploaded — awaiting supervisor review",clickable:!1};case"migrated":return{text:"✓ live",cls:"ls-import-chip-migrated",title:"Approved by supervisor and live on the server",clickable:!1};case"failed":return{text:`${p} errors — fix?`,cls:"ls-import-chip-failed",title:"Some rows failed; click to review",clickable:!0};case"other":case null:case void 0:default:return null}})();if(!h)d&&d.remove();else if(c){d||(d=document.createElement("span"),d.className="ls-import-chip",c.appendChild(d)),d.className=`ls-import-chip ${h.cls}`,d.textContent=h.text,d.title=h.title,d.style.cursor=h.clickable?"pointer":"default",d.style.opacity=h.clickable?"1":"0.85";const m=d.cloneNode(!0);d.replaceWith(m),d=m,h.clickable&&d.addEventListener("click",g=>{g.preventDefault(),g.stopPropagation(),window.dispatchEvent(new CustomEvent("lupmis:import-chip-click",{detail:{importId:s,status:u,layer:e}}))})}}if((e.get("title")||"").toLowerCase().includes("external")&&(this._externalSourceGroup=e,o&&!o.querySelector(".ol-add-layer"))){const c=document.createElement("span");c.className="ol-add-layer",c.title="Add external layer",c.textContent="+",c.style.cssText=` display:inline-flex !important;align-items:center;justify-content:center; width:22px !important;height:22px !important;border-radius:50%; background:#41b6a6 !important;color:#fff !important; @@ -717,7 +717,7 @@ import{_ as Rt,h as M,F as C,j as I,k as fe,m as xo,b as j,V as N,L as he,D as C transition:background 0.2s;box-sizing:border-box;border:none; `,c.addEventListener("mouseenter",()=>{c.style.background="#329686"}),c.addEventListener("mouseleave",()=>{c.style.background="#41b6a6"}),c.addEventListener("click",d=>{d.stopPropagation(),this.showAddLayerDialog()}),o.prepend(c)}}_removeLayer(e){const t=e.get("title")||"this layer";if(!confirm(`Remove "${t}" from the map? -This only affects the current session — built-in layers cannot be removed.`))return;const r=a=>{const i=a.getLayers();if(i.getArray().includes(e))return i.remove(e),!0;let s=!1;return i.forEach(l=>{!s&&l.getLayers&&(s=r(l))}),s};r(this.overlayGroup)?(console.log(`[MapView] Removed layer "${t}"`),G(`Removed "${t}" from the map.`,"info",3e3)):console.warn(`[MapView] Could not find layer "${t}" in any group`)}_refreshLayerSwitcherChrome(e){const t=e.element?.querySelector(".panel-container"),r=e.element?.querySelector("ul.panel");if(!t||!r)return;let o=t.querySelector(":scope > .ls-active-badge");o||(o=document.createElement("div"),o.className="ls-active-badge",o.innerHTML=` +This only affects the current session — built-in layers cannot be removed.`))return;const r=a=>{const i=a.getLayers();if(i.getArray().includes(e))return i.remove(e),!0;let s=!1;return i.forEach(l=>{!s&&l.getLayers&&(s=r(l))}),s};r(this.overlayGroup)?(console.log(`[MapView] Removed layer "${t}"`),D(`Removed "${t}" from the map.`,"info",3e3)):console.warn(`[MapView] Could not find layer "${t}" in any group`)}_refreshLayerSwitcherChrome(e){const t=e.element?.querySelector(".panel-container"),r=e.element?.querySelector("ul.panel");if(!t||!r)return;let o=t.querySelector(":scope > .ls-active-badge");o||(o=document.createElement("div"),o.className="ls-active-badge",o.innerHTML=` Layers 0 active `,t.insertBefore(o,r));let a=t.querySelector(":scope > .ls-footer-row");a||(a=document.createElement("div"),a.className="ls-footer-row",a.innerHTML=` @@ -726,7 +726,7 @@ This only affects the current session — built-in layers cannot be removed.`))r title="Hide every overlay (base map stays on)"> Reset - `,t.appendChild(a),a.querySelector(".ls-footer-btn").addEventListener("click",s=>{s.stopPropagation(),this._resetAllOverlays()}));const i=this._countLayers();o.querySelector(".ls-active-badge-count").textContent=`${i.activeOverlays} active`,a.querySelector(".ls-footer-note").textContent=`${i.totalOverlays} overlay${i.totalOverlays===1?"":"s"}`}_countLayers(){let e=0,t=0;const r=new Set(["__vertex_highlight__"]),o=a=>{a.getLayers().forEach(i=>{i.get("displayInLayerSwitcher")!==!1&&(r.has(i.get("title"))||(i.getLayers?o(i):(e++,i.getVisible()&&t++)))})};return this.overlayGroup&&o(this.overlayGroup),{totalOverlays:e,activeOverlays:t}}_resetAllOverlays(){const e=new Set(["__vertex_highlight__"]),t=r=>{r.getLayers().forEach(o=>{o.get("displayInLayerSwitcher")!==!1&&(e.has(o.get("title"))||(o.getLayers?t(o):o.setVisible(!1)))})};this.overlayGroup&&t(this.overlayGroup),console.log("[MapView] Reset overlays — all hidden")}_wireLayerSwitcherVisibilityHooks(e){const t=()=>this._refreshLayerSwitcherChrome(e),r=a=>{a._lsVisHooked||(a._lsVisHooked=!0,a.on("change:visible",t))},o=a=>{a.getLayers().forEach(i=>{i.getLayers?(o(i),a._lsAddHooked||(a._lsAddHooked=!0,a.getLayers().on("add",s=>{const l=s.element;l.getLayers?o(l):r(l),t()}))):r(i)})};this.overlayGroup&&o(this.overlayGroup)}_attachOnlineOnlyHandler(e,t){e.set("onlineOnly",!0),e.on("change:visible",()=>{e.getVisible()&&!navigator.onLine&&G(`"${t}" requires an internet connection. Connect to view this layer.`,"info",5e3)})}_createLegendPanel(){this._legendPanel=document.createElement("div"),this._legendPanel.className="map-legend-panel",this._legendPanel.style.cssText=` + `,t.appendChild(a),a.querySelector(".ls-footer-btn").addEventListener("click",s=>{s.stopPropagation(),this._resetAllOverlays()}));const i=this._countLayers();o.querySelector(".ls-active-badge-count").textContent=`${i.activeOverlays} active`,a.querySelector(".ls-footer-note").textContent=`${i.totalOverlays} overlay${i.totalOverlays===1?"":"s"}`}_countLayers(){let e=0,t=0;const r=new Set(["__vertex_highlight__"]),o=a=>{a.getLayers().forEach(i=>{i.get("displayInLayerSwitcher")!==!1&&(r.has(i.get("title"))||(i.getLayers?o(i):(e++,i.getVisible()&&t++)))})};return this.overlayGroup&&o(this.overlayGroup),{totalOverlays:e,activeOverlays:t}}_resetAllOverlays(){const e=new Set(["__vertex_highlight__"]),t=r=>{r.getLayers().forEach(o=>{o.get("displayInLayerSwitcher")!==!1&&(e.has(o.get("title"))||(o.getLayers?t(o):o.setVisible(!1)))})};this.overlayGroup&&t(this.overlayGroup),console.log("[MapView] Reset overlays — all hidden")}_wireLayerSwitcherVisibilityHooks(e){const t=()=>this._refreshLayerSwitcherChrome(e),r=a=>{a._lsVisHooked||(a._lsVisHooked=!0,a.on("change:visible",t))},o=a=>{a.getLayers().forEach(i=>{i.getLayers?(o(i),a._lsAddHooked||(a._lsAddHooked=!0,a.getLayers().on("add",s=>{const l=s.element;l.getLayers?o(l):r(l),t()}))):r(i)})};this.overlayGroup&&o(this.overlayGroup)}_attachOnlineOnlyHandler(e,t){e.set("onlineOnly",!0),e.on("change:visible",()=>{e.getVisible()&&!navigator.onLine&&D(`"${t}" requires an internet connection. Connect to view this layer.`,"info",5e3)})}_createLegendPanel(){this._legendPanel=document.createElement("div"),this._legendPanel.className="map-legend-panel",this._legendPanel.style.cssText=` position:absolute;right:10px;bottom:40px;z-index:900; display:none;flex-direction:column;gap:6px; background:var(--card, #fff);color:var(--card-foreground, #1e1a4b); @@ -742,22 +742,22 @@ This only affects the current session — built-in layers cannot be removed.`))r ${this._escapeHtml(t)} legend - `,this._legendEntries.set(e,o);const a=()=>{try{this._updateLegendPanel()}catch(i){console.warn("[MapView] legend panel update failed:",i)}};e.on("change:visible",a),a()}_updateLegendPanel(){if(!this._legendPanel)return;const e=[];for(const[t,r]of this._legendEntries)t.getVisible()&&e.push(r);this._legendEntries.forEach(t=>{t.style.borderBottom="1px solid var(--border, #1e1a4b1f)",t.style.paddingBottom="6px"}),e.length>0&&(e[e.length-1].style.borderBottom="none",e[e.length-1].style.paddingBottom="0"),this._legendPanel.replaceChildren(...e),this._legendPanel.style.display=e.length>0?"flex":"none"}_escapeHtml(e){return String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}getLayerGroup(e){let t=null;return this.overlayGroup.getLayers().forEach(r=>{r.get("layerId")===e&&(t=r)}),t}getLayerGroupByTitle(e){let t=null;return this.overlayGroup.getLayers().forEach(r=>{r.get("title")===e&&(t=r)}),t}getOverlayGroup(){return this.overlayGroup}getMap(){return this.map}getCurrentViewExtent(){const e=this.map.getView(),t=this.map.getSize();return t?e.calculateExtent(t):null}getDistrictBoundaryExtent(){let e=null;const t=r=>{r.getLayers().forEach(o=>{if(o.getLayers)t(o);else if(o.get("title")==="District Boundary"){const a=o.getSource&&o.getSource();if(a&&typeof a.getExtent=="function"){const i=a.getExtent();i&&Number.isFinite(i[0])&&(e={extent:i,title:o.get("title")})}}})};return t(this.overlayGroup),e}getMarkerSource(){return this.markerSource}getMarkersLayer(){return this.markersLayer}updateSize(){this.map.updateSize()}onSearchSelect(e){this.searchSelectCallbacks.push(e)}navigateTo(e,t,r=14,o=500){const a=ee([e,t]);this.map.getView().animate({center:a,zoom:r,duration:o})}}class Ti{constructor(e,t={}){this.map=e,this.options=t,this.measureSource=new j,this.measureLayer=new N({source:this.measureSource,style:this.getMeasureStyle(),title:"Measurements",zIndex:100}),this.drawSource=new j,this.drawLayer=new N({source:this.drawSource,style:this.getDrawStyle(),title:"Draw sketches",displayInLayerSwitcher:!1,zIndex:99});const r=this.map.getLayers();let o=r.getArray().findIndex(a=>a.get("title")==="Overlays");o<0&&(o=r.getLength()),r.insertAt(o,this.drawLayer),r.insertAt(o,this.measureLayer),this.activeInteraction=null,this.measureTooltip=null,this.measureTooltipElement=null,this.onMeasureCompleteCallbacks=[],this.onDrawCompleteCallbacks=[]}getMeasureStyle(){return new M({fill:new C({color:"rgba(255, 233, 106, 0.2)"}),stroke:new I({color:"#8B008B",lineDash:[10,10],width:2}),image:new fe({radius:5,stroke:new I({color:"#8B008B"}),fill:new C({color:"rgba(255, 233, 106, 0.5)"})})})}getDrawStyle(){return new M({fill:new C({color:"rgba(255, 233, 106, 0.3)"}),stroke:new I({color:"#8B008B",width:2}),image:new fe({radius:6,stroke:new I({color:"#8B008B",width:2}),fill:new C({color:"#FFE96A"})})})}createMeasureTooltip(){this.measureTooltipElement&&this.measureTooltipElement.parentNode.removeChild(this.measureTooltipElement),this.measureTooltipElement=document.createElement("div"),this.measureTooltipElement.className="measure-tooltip",this.measureTooltip=new Ee({element:this.measureTooltipElement,offset:[15,0],positioning:"center-left",stopEvent:!1}),this.map.addOverlay(this.measureTooltip)}deactivate(){this.activeInteraction&&(this.map.removeInteraction(this.activeInteraction),this.activeInteraction=null),this.measureTooltip&&(this.map.removeOverlay(this.measureTooltip),this.measureTooltip=null),this.measureTooltipElement&&this.measureTooltipElement.parentNode&&(this.measureTooltipElement.parentNode.removeChild(this.measureTooltipElement),this.measureTooltipElement=null)}startCircleMeasure(){this.deactivate(),this.createMeasureTooltip();const e=new Ce({source:this.measureSource,type:"Circle",style:new M({fill:new C({color:"rgba(255, 233, 106, 0.2)"}),stroke:new I({color:"rgba(139, 0, 139, 0.7)",lineDash:[10,10],width:2}),image:new fe({radius:5,stroke:new I({color:"rgba(139, 0, 139, 0.7)"}),fill:new C({color:"rgba(255, 233, 106, 0.5)"})})})});this.activeInteraction=e,this.map.addInteraction(e);let t;return e.on("drawstart",r=>{t=r.feature.getGeometry().on("change",a=>{const i=a.target;if(i instanceof zr){const s=i.getRadius(),l=Ya(s),d=`${Ft(s)}
${l}`;this.measureTooltipElement.innerHTML=d,this.measureTooltip.setPosition(i.getLastCoordinate())}})}),e.on("drawend",r=>{const o=r.feature,a=o.getGeometry(),i=a.getCenter(),s=a.getRadius();o.set("_layerType","measure_circle"),o.set("_radius",s),o.set("_center",i);const l=new pe({geometry:new he([i,[i[0]+s,i[1]]])});l.set("_layerType","measure_circle_radius"),this.measureSource.addFeature(l),this.measureTooltipElement.className="measure-tooltip measure-tooltip-static",this.measureTooltip.setOffset([0,-7]),this.measureTooltipElement=null,this.createMeasureTooltip(),qt(t);const c={type:"circle",center:i,radius:s,area:Math.PI*s*s,feature:o};this.onMeasureCompleteCallbacks.forEach(d=>d(c))}),e}startLineMeasure(){this.deactivate(),this.createMeasureTooltip();const e=new Ce({source:this.measureSource,type:"LineString",style:this.getMeasureStyle()});this.activeInteraction=e,this.map.addInteraction(e);let t;return e.on("drawstart",r=>{t=r.feature.getGeometry().on("change",a=>{const i=a.target,s=Lt(i),l=Ft(s);this.measureTooltipElement.innerHTML=l,this.measureTooltip.setPosition(i.getLastCoordinate())})}),e.on("drawend",r=>{const o=r.feature,a=o.getGeometry(),i=Lt(a);this.measureTooltipElement.className="measure-tooltip measure-tooltip-static",this.measureTooltipElement=null,this.createMeasureTooltip(),qt(t);const s={type:"line",length:i,feature:o};this.onMeasureCompleteCallbacks.forEach(l=>l(s))}),e}startAreaMeasure(){this.deactivate(),this.createMeasureTooltip();const e=new Ce({source:this.measureSource,type:"Polygon",style:this.getMeasureStyle()});this.activeInteraction=e,this.map.addInteraction(e);let t;return e.on("drawstart",r=>{t=r.feature.getGeometry().on("change",a=>{const i=a.target,s=st(i),l=lt(s);this.measureTooltipElement.innerHTML=l,this.measureTooltip.setPosition(i.getInteriorPoint().getCoordinates())})}),e.on("drawend",r=>{const o=r.feature,a=o.getGeometry(),i=st(a);o.set("_layerType","measure_area"),o.set("_area",i),this.measureTooltipElement.className="measure-tooltip measure-tooltip-static",this.measureTooltipElement=null,this.createMeasureTooltip(),qt(t);const s={type:"polygon",area:i,feature:o,coordinate:a.getInteriorPoint().getCoordinates()};this.onMeasureCompleteCallbacks.forEach(l=>l(s))}),e}startDrawPoint(){this.deactivate();const e=new Ce({source:this.drawSource,type:"Point",style:this.getDrawStyle()});return this.activeInteraction=e,this.map.addInteraction(e),e.on("drawend",t=>{const r={type:"point",feature:t.feature};this.onDrawCompleteCallbacks.forEach(o=>o(r))}),e}startDrawLine(){this.deactivate();const e=new Ce({source:this.drawSource,type:"LineString",style:this.getDrawStyle()});return this.activeInteraction=e,this.map.addInteraction(e),e.on("drawend",t=>{const r={type:"line",feature:t.feature};this.onDrawCompleteCallbacks.forEach(o=>o(r))}),e}startDrawPolygon(){this.deactivate();const e=new Ce({source:this.drawSource,type:"Polygon",style:this.getDrawStyle()});return this.activeInteraction=e,this.map.addInteraction(e),e.on("drawend",t=>{const r={type:"polygon",feature:t.feature};this.onDrawCompleteCallbacks.forEach(o=>o(r))}),e}clearMeasurements(){this.measureSource.clear(),document.querySelectorAll(".measure-tooltip-static").forEach(t=>t.parentNode.removeChild(t))}clearDrawings(){this.drawSource.clear()}clearAll(){this.clearMeasurements(),this.clearDrawings()}onMeasureComplete(e){this.onMeasureCompleteCallbacks.push(e)}onDrawComplete(e){this.onDrawCompleteCallbacks.push(e)}createControlBar(e={}){e.position;const t=new co({group:!0,className:"map-tools-bar"}),r=new co({toggleOne:!0,group:!0}),o=new xe({html:'',title:"Measure Circle (radius & area)",className:"measure-circle-btn",onToggle:l=>{l?this.startCircleMeasure():this.deactivate()}});r.addControl(o);const a=new xe({html:'📏',title:"Measure Distance",className:"measure-line-btn",onToggle:l=>{l?this.startLineMeasure():this.deactivate()}});r.addControl(a);const i=new xe({html:'',title:"Measure Area",className:"measure-area-btn",onToggle:l=>{l?this.startAreaMeasure():this.deactivate()}});r.addControl(i);const s=new rt({html:'🗑️',title:"Clear Measurements",className:"clear-measure-btn",handleClick:()=>{this.clearMeasurements(),o.setActive(!1),a.setActive(!1),i.setActive(!1)}});return r.addControl(s),t.addControl(r),t}getMeasureLayer(){return this.measureLayer}getDrawLayer(){return this.drawLayer}getMeasureSource(){return this.measureSource}getDrawSource(){return this.drawSource}isActive(){return this.activeInteraction!==null}}let De=null;async function Li(){if(!("serviceWorker"in navigator))return console.warn("[PWA] Service Workers not supported"),null;try{return De=await navigator.serviceWorker.register("/sw.js",{scope:"/"}),console.log("[PWA] Service Worker registered:",De.scope),De.addEventListener("updatefound",()=>{const n=De.installing;n.addEventListener("statechange",()=>{n.state==="installed"&&navigator.serviceWorker.controller&&(console.log("[PWA] New version available"),Mi())})}),De}catch(n){return console.error("[PWA] Service Worker registration failed:",n),null}}let Be=null,_e=null;function ki(n="#install-btn"){if(_e=typeof n=="string"?document.querySelector(n):n,!_e){console.warn("[PWA] Install button not found:",n);return}_e.style.display="none",window.addEventListener("beforeinstallprompt",e=>{e.preventDefault(),Be=e,_e.style.display="block",console.log("[PWA] Install prompt ready")}),_e.addEventListener("click",async()=>{if(!Be){Ii();return}Be.prompt();const{outcome:e}=await Be.userChoice;console.log("[PWA] Install prompt outcome:",e),Be=null,_e.style.display="none"}),window.addEventListener("appinstalled",()=>{console.log("[PWA] App installed"),Be=null,_e.style.display="none"}),window.matchMedia("(display-mode: standalone)").matches&&(_e.style.display="none")}function Ii(){const n=/iPad|iPhone|iPod/.test(navigator.userAgent),e=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);let t=`To install this app: + `,this._legendEntries.set(e,o);const a=()=>{try{this._updateLegendPanel()}catch(i){console.warn("[MapView] legend panel update failed:",i)}};e.on("change:visible",a),a()}_updateLegendPanel(){if(!this._legendPanel)return;const e=[];for(const[t,r]of this._legendEntries)t.getVisible()&&e.push(r);this._legendEntries.forEach(t=>{t.style.borderBottom="1px solid var(--border, #1e1a4b1f)",t.style.paddingBottom="6px"}),e.length>0&&(e[e.length-1].style.borderBottom="none",e[e.length-1].style.paddingBottom="0"),this._legendPanel.replaceChildren(...e),this._legendPanel.style.display=e.length>0?"flex":"none"}_escapeHtml(e){return String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}getLayerGroup(e){let t=null;return this.overlayGroup.getLayers().forEach(r=>{r.get("layerId")===e&&(t=r)}),t}getLayerGroupByTitle(e){let t=null;return this.overlayGroup.getLayers().forEach(r=>{r.get("title")===e&&(t=r)}),t}getOverlayGroup(){return this.overlayGroup}getMap(){return this.map}getCurrentViewExtent(){const e=this.map.getView(),t=this.map.getSize();return t?e.calculateExtent(t):null}getDistrictBoundaryExtent(){let e=null;const t=r=>{r.getLayers().forEach(o=>{if(o.getLayers)t(o);else if(o.get("title")==="District Boundary"){const a=o.getSource&&o.getSource();if(a&&typeof a.getExtent=="function"){const i=a.getExtent();i&&Number.isFinite(i[0])&&(e={extent:i,title:o.get("title")})}}})};return t(this.overlayGroup),e}getMarkerSource(){return this.markerSource}getMarkersLayer(){return this.markersLayer}updateSize(){this.map.updateSize()}onSearchSelect(e){this.searchSelectCallbacks.push(e)}navigateTo(e,t,r=14,o=500){const a=ee([e,t]);this.map.getView().animate({center:a,zoom:r,duration:o})}}class Ii{constructor(e,t={}){this.map=e,this.options=t,this.measureSource=new j,this.measureLayer=new O({source:this.measureSource,style:this.getMeasureStyle(),title:"Measurements",zIndex:100}),this.drawSource=new j,this.drawLayer=new O({source:this.drawSource,style:this.getDrawStyle(),title:"Draw sketches",displayInLayerSwitcher:!1,zIndex:99});const r=this.map.getLayers();let o=r.getArray().findIndex(a=>a.get("title")==="Overlays");o<0&&(o=r.getLength()),r.insertAt(o,this.drawLayer),r.insertAt(o,this.measureLayer),this.activeInteraction=null,this.measureTooltip=null,this.measureTooltipElement=null,this.onMeasureCompleteCallbacks=[],this.onDrawCompleteCallbacks=[]}getMeasureStyle(){return new M({fill:new A({color:"rgba(255, 233, 106, 0.2)"}),stroke:new I({color:"#8B008B",lineDash:[10,10],width:2}),image:new fe({radius:5,stroke:new I({color:"#8B008B"}),fill:new A({color:"rgba(255, 233, 106, 0.5)"})})})}getDrawStyle(){return new M({fill:new A({color:"rgba(255, 233, 106, 0.3)"}),stroke:new I({color:"#8B008B",width:2}),image:new fe({radius:6,stroke:new I({color:"#8B008B",width:2}),fill:new A({color:"#FFE96A"})})})}createMeasureTooltip(){this.measureTooltipElement&&this.measureTooltipElement.parentNode.removeChild(this.measureTooltipElement),this.measureTooltipElement=document.createElement("div"),this.measureTooltipElement.className="measure-tooltip",this.measureTooltip=new Ee({element:this.measureTooltipElement,offset:[15,0],positioning:"center-left",stopEvent:!1}),this.map.addOverlay(this.measureTooltip)}deactivate(){this.activeInteraction&&(this.map.removeInteraction(this.activeInteraction),this.activeInteraction=null),this.measureTooltip&&(this.map.removeOverlay(this.measureTooltip),this.measureTooltip=null),this.measureTooltipElement&&this.measureTooltipElement.parentNode&&(this.measureTooltipElement.parentNode.removeChild(this.measureTooltipElement),this.measureTooltipElement=null)}startCircleMeasure(){this.deactivate(),this.createMeasureTooltip();const e=new Fe({source:this.measureSource,type:"Circle",style:new M({fill:new A({color:"rgba(255, 233, 106, 0.2)"}),stroke:new I({color:"rgba(139, 0, 139, 0.7)",lineDash:[10,10],width:2}),image:new fe({radius:5,stroke:new I({color:"rgba(139, 0, 139, 0.7)"}),fill:new A({color:"rgba(255, 233, 106, 0.5)"})})})});this.activeInteraction=e,this.map.addInteraction(e);let t;return e.on("drawstart",r=>{t=r.feature.getGeometry().on("change",a=>{const i=a.target;if(i instanceof Kr){const s=i.getRadius(),l=Qa(s),d=`${Ot(s)}
${l}`;this.measureTooltipElement.innerHTML=d,this.measureTooltip.setPosition(i.getLastCoordinate())}})}),e.on("drawend",r=>{const o=r.feature,a=o.getGeometry(),i=a.getCenter(),s=a.getRadius();o.set("_layerType","measure_circle"),o.set("_radius",s),o.set("_center",i);const l=new pe({geometry:new he([i,[i[0]+s,i[1]]])});l.set("_layerType","measure_circle_radius"),this.measureSource.addFeature(l),this.measureTooltipElement.className="measure-tooltip measure-tooltip-static",this.measureTooltip.setOffset([0,-7]),this.measureTooltipElement=null,this.createMeasureTooltip(),zt(t);const c={type:"circle",center:i,radius:s,area:Math.PI*s*s,feature:o};this.onMeasureCompleteCallbacks.forEach(d=>d(c))}),e}startLineMeasure(){this.deactivate(),this.createMeasureTooltip();const e=new Fe({source:this.measureSource,type:"LineString",style:this.getMeasureStyle()});this.activeInteraction=e,this.map.addInteraction(e);let t;return e.on("drawstart",r=>{t=r.feature.getGeometry().on("change",a=>{const i=a.target,s=kt(i),l=Ot(s);this.measureTooltipElement.innerHTML=l,this.measureTooltip.setPosition(i.getLastCoordinate())})}),e.on("drawend",r=>{const o=r.feature,a=o.getGeometry(),i=kt(a);this.measureTooltipElement.className="measure-tooltip measure-tooltip-static",this.measureTooltipElement=null,this.createMeasureTooltip(),zt(t);const s={type:"line",length:i,feature:o};this.onMeasureCompleteCallbacks.forEach(l=>l(s))}),e}startAreaMeasure(){this.deactivate(),this.createMeasureTooltip();const e=new Fe({source:this.measureSource,type:"Polygon",style:this.getMeasureStyle()});this.activeInteraction=e,this.map.addInteraction(e);let t;return e.on("drawstart",r=>{t=r.feature.getGeometry().on("change",a=>{const i=a.target,s=lt(i),l=ct(s);this.measureTooltipElement.innerHTML=l,this.measureTooltip.setPosition(i.getInteriorPoint().getCoordinates())})}),e.on("drawend",r=>{const o=r.feature,a=o.getGeometry(),i=lt(a);o.set("_layerType","measure_area"),o.set("_area",i),this.measureTooltipElement.className="measure-tooltip measure-tooltip-static",this.measureTooltipElement=null,this.createMeasureTooltip(),zt(t);const s={type:"polygon",area:i,feature:o,coordinate:a.getInteriorPoint().getCoordinates()};this.onMeasureCompleteCallbacks.forEach(l=>l(s))}),e}startDrawPoint(){this.deactivate();const e=new Fe({source:this.drawSource,type:"Point",style:this.getDrawStyle()});return this.activeInteraction=e,this.map.addInteraction(e),e.on("drawend",t=>{const r={type:"point",feature:t.feature};this.onDrawCompleteCallbacks.forEach(o=>o(r))}),e}startDrawLine(){this.deactivate();const e=new Fe({source:this.drawSource,type:"LineString",style:this.getDrawStyle()});return this.activeInteraction=e,this.map.addInteraction(e),e.on("drawend",t=>{const r={type:"line",feature:t.feature};this.onDrawCompleteCallbacks.forEach(o=>o(r))}),e}startDrawPolygon(){this.deactivate();const e=new Fe({source:this.drawSource,type:"Polygon",style:this.getDrawStyle()});return this.activeInteraction=e,this.map.addInteraction(e),e.on("drawend",t=>{const r={type:"polygon",feature:t.feature};this.onDrawCompleteCallbacks.forEach(o=>o(r))}),e}clearMeasurements(){this.measureSource.clear(),document.querySelectorAll(".measure-tooltip-static").forEach(t=>t.parentNode.removeChild(t))}clearDrawings(){this.drawSource.clear()}clearAll(){this.clearMeasurements(),this.clearDrawings()}onMeasureComplete(e){this.onMeasureCompleteCallbacks.push(e)}onDrawComplete(e){this.onDrawCompleteCallbacks.push(e)}createControlBar(e={}){e.position;const t=new co({group:!0,className:"map-tools-bar"}),r=new co({toggleOne:!0,group:!0}),o=new xe({html:'',title:"Measure Circle (radius & area)",className:"measure-circle-btn",onToggle:l=>{l?this.startCircleMeasure():this.deactivate()}});r.addControl(o);const a=new xe({html:'📏',title:"Measure Distance",className:"measure-line-btn",onToggle:l=>{l?this.startLineMeasure():this.deactivate()}});r.addControl(a);const i=new xe({html:'',title:"Measure Area",className:"measure-area-btn",onToggle:l=>{l?this.startAreaMeasure():this.deactivate()}});r.addControl(i);const s=new at({html:'🗑️',title:"Clear Measurements",className:"clear-measure-btn",handleClick:()=>{this.clearMeasurements(),o.setActive(!1),a.setActive(!1),i.setActive(!1)}});return r.addControl(s),t.addControl(r),t}getMeasureLayer(){return this.measureLayer}getDrawLayer(){return this.drawLayer}getMeasureSource(){return this.measureSource}getDrawSource(){return this.drawSource}isActive(){return this.activeInteraction!==null}}let Re=null;async function Pi(){if(!("serviceWorker"in navigator))return console.warn("[PWA] Service Workers not supported"),null;try{return Re=await navigator.serviceWorker.register("/sw.js",{scope:"/"}),console.log("[PWA] Service Worker registered:",Re.scope),Re.addEventListener("updatefound",()=>{const n=Re.installing;n.addEventListener("statechange",()=>{n.state==="installed"&&navigator.serviceWorker.controller&&(console.log("[PWA] New version available"),Fi())})}),Re}catch(n){return console.error("[PWA] Service Worker registration failed:",n),null}}let je=null,_e=null;function Mi(n="#install-btn"){if(_e=typeof n=="string"?document.querySelector(n):n,!_e){console.warn("[PWA] Install button not found:",n);return}_e.style.display="none",window.addEventListener("beforeinstallprompt",e=>{e.preventDefault(),je=e,_e.style.display="block",console.log("[PWA] Install prompt ready")}),_e.addEventListener("click",async()=>{if(!je){Ai();return}je.prompt();const{outcome:e}=await je.userChoice;console.log("[PWA] Install prompt outcome:",e),je=null,_e.style.display="none"}),window.addEventListener("appinstalled",()=>{console.log("[PWA] App installed"),je=null,_e.style.display="none"}),window.matchMedia("(display-mode: standalone)").matches&&(_e.style.display="none")}function Ai(){const n=/iPad|iPhone|iPod/.test(navigator.userAgent),e=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);let t=`To install this app: `;n?(t+=`1. Tap the Share button (square with arrow) `,t+='2. Scroll down and tap "Add to Home Screen"'):e?(t+=`1. Click File menu `,t+='2. Click "Add to Dock"'):(t+=`1. Click the menu button (three dots) -`,t+='2. Click "Install" or "Add to Home Screen"'),alert(t)}let go=null;const mo=new Set;function Pi(n="#offline-indicator"){go=typeof n=="string"?document.querySelector(n):n,Xt(!navigator.onLine),window.addEventListener("online",()=>{console.log("[PWA] Back online"),Xt(!1),nn(!1)}),window.addEventListener("offline",()=>{console.log("[PWA] Gone offline"),Xt(!0),nn(!0)})}function Xt(n){go&&(go.style.display=n?"block":"none"),document.body.classList.toggle("is-offline",n)}function ur(n){return mo.add(n),n(!navigator.onLine),()=>mo.delete(n)}function nn(n){for(const e of mo)try{e(n)}catch(t){console.error("[PWA] Offline listener error:",t)}}function X(){return navigator.onLine}function Mi(){confirm("A new version is available. Reload now?")&&Ci()}function Ci(){De?.waiting&&De.waiting.postMessage({type:"SKIP_WAITING"}),window.location.reload()}async function Ai({timeoutMs:n=1e4}={}){if(!("serviceWorker"in navigator))throw new Error("Service Workers not supported in this browser");if(navigator.serviceWorker.controller)return navigator.serviceWorker.controller;const e=navigator.serviceWorker.ready,t=new Promise((a,i)=>setTimeout(()=>i(new Error("Service-worker readiness timeout")),n)),r=await Promise.race([e,t]),o=navigator.serviceWorker.controller||r.active;if(!o)throw new Error("No active service worker available");return o}function Fi(n){if(!("serviceWorker"in navigator))return()=>{};const e=()=>{try{n()}catch(t){console.error("[PWA] controllerchange handler error:",t)}};return navigator.serviceWorker.addEventListener("controllerchange",e),()=>navigator.serviceWorker.removeEventListener("controllerchange",e)}async function Po(n,e,t={},r=5e3,o=1e4){const a=await Ai({timeoutMs:o});return new Promise((i,s)=>{const l=new MessageChannel,c=setTimeout(()=>{l.port1.close(),s(new Error(`Service-worker reply "${e}" timed out`))},r);l.port1.onmessage=d=>{if(d.data?.type===e){clearTimeout(c),l.port1.close();const{type:u,...p}=d.data;i(p)}},a.postMessage({type:n,...t},[l.port2])})}async function Di(){try{return(await Po("GET_TILE_STATS","TILE_STATS")).stats}catch(n){return console.warn("[PWA] getTileCacheStats failed:",n),null}}async function Oi(){try{return await Po("CLEAR_TILE_CACHES","TILE_CACHES_CLEARED"),!0}catch(n){return console.warn("[PWA] clearTileCaches failed:",n),!1}}async function Ri(n){if(!n)return!1;try{return!!(await Po("CLEAR_TILE_CACHE","TILE_CACHE_CLEARED",{cacheName:n})).deleted}catch(e){return console.warn(`[PWA] clearTileCacheForProvider(${n}) failed:`,e),!1}}async function Ni(){if(!navigator.storage?.estimate)return null;try{const{usage:n,quota:e}=await navigator.storage.estimate();return{usage:n||0,quota:e||0}}catch(n){return console.warn("[PWA] getStorageEstimate failed:",n),null}}async function $i(n={}){const{installButton:e="#install-btn",offlineIndicator:t="#offline-indicator",autoRegisterSW:r=!0}=n;r&&await Li(),ki(e),Pi(t),console.log("[PWA] Initialized")}const pr={topo:{url:"https://a.tile.opentopomap.org/{z}/{x}/{y}.png",label:"Topographic",maxZoom:17,cacheKey:"tiles-topo"},osm:{url:"https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",label:"OpenStreetMap",maxZoom:19,cacheKey:"tiles-osm"}},Bi=30*1024,Dt=2*Math.PI*6378137/2;function rn(n,e){const t=n/Dt*180;let r=e/Dt*180;return r=180/Math.PI*(2*Math.atan(Math.exp(r*Math.PI/180))-Math.PI/2),[t,r]}function an(n,e,t){const r=Math.pow(2,t),o=Math.floor((n+180)/360*r),a=e*Math.PI/180,i=Math.floor((1-Math.log(Math.tan(a)+1/Math.cos(a))/Math.PI)/2*r);return{x:o,y:i}}function fr(n,e){const[t,r,o,a]=n,[i,s]=rn(t,r),[l,c]=rn(o,a),d=an(i,c,e),u=an(l,s,e),p=Math.pow(2,e),f=Math.max(0,Math.min(d.x,u.x)),h=Math.min(p-1,Math.max(d.x,u.x)),y=Math.max(0,Math.min(d.y,u.y)),g=Math.min(p-1,Math.max(d.y,u.y));return{z:e,minX:f,maxX:h,minY:y,maxY:g,count:(h-f+1)*(g-y+1)}}function Gi(n,e,t){let r=0;for(let o=e;o<=t;o++)r+=fr(n,o).count;return r}function ji(n,e,t){const r=[];for(let o=e;o<=t;o++){const a=fr(n,o);for(let i=a.minX;i<=a.maxX;i++)for(let s=a.minY;s<=a.maxY;s++)r.push({z:o,x:i,y:s})}return r}function Ui(n,{z:e,x:t,y:r}){return n.replace("{z}",e).replace("{x}",t).replace("{y}",r)}class qi{constructor({baseMap:e,extent3857:t,minZoom:r,maxZoom:o,concurrency:a=2,interBatchDelayMs:i=50,onProgress:s=()=>{}}){const l=pr[e];if(!l)throw new Error(`Unknown base map: ${e}`);o>l.maxZoom&&(console.warn(`[OfflineTiles] ${e}: maxZoom ${o} > supported ${l.maxZoom}; clamping`),o=l.maxZoom),this.baseMap=e,this.template=l.url,this.extent=t,this.minZoom=r,this.maxZoom=o,this.concurrency=Math.max(1,Math.min(a,6)),this.interBatchDelayMs=i,this.onProgress=s,this._abortCtrl=null,this._cancelled=!1}async start(){if(this._abortCtrl)throw new Error("Downloader already started");this._abortCtrl=new AbortController,this._cancelled=!1;const e=ji(this.extent,this.minZoom,this.maxZoom),t=e.length,r=Date.now();let o=0,a=0,i=0,s=0;const l=c=>{const d=Date.now()-r,u=o>0?Math.round(d/o*(t-o)):null;this.onProgress({phase:c,done:o,total:t,ok:a,failed:i,cached:s,elapsedMs:d,etaMs:u})};l("running");for(let c=0;c{if(this._cancelled)return;const p=Ui(this.template,u);try{const f=await fetch(p,{signal:this._abortCtrl.signal,cache:"default"});f.ok?(a++,f.body&&f.body.cancel().catch(()=>{})):(f.status,i++)}catch(f){f.name==="AbortError"||i++}o++})),l("running"),this.interBatchDelayMs>0&&c+this.concurrencysetTimeout(u,this.interBatchDelayMs))}return l(this._cancelled?"cancelled":"done"),{phase:this._cancelled?"cancelled":"done",done:o,total:t,ok:a,failed:i,cached:s,elapsedMs:Date.now()-r}}cancel(){this._cancelled=!0,this._abortCtrl&&this._abortCtrl.abort()}}const zi=(()=>{const n=(r,o)=>{const a=r*Dt/180,i=Math.log(Math.tan((90+o)*Math.PI/360))/(Math.PI/180);return[a,i*Dt/180]},e=n(-3.3,4.5),t=n(1.2,11.2);return[e[0],e[1],t[0],t[1]]})();function Hi(n){return n*Bi}const hr="https://api.lupmis4luspa.org/api/spatial_planning",Vt="1",Wi="1c46538c712e9b5b";function Ki(){try{if(typeof window>"u")return Vt;const n=window.LUPMIS_SESSION;if(!n||typeof n!="object")return Vt;const e=n.district_id;return e==null||String(e).length===0?null:String(e)}catch{}return Vt}const gr={get district_id(){return Ki()},api_token:Wi};function We(){if(typeof window<"u"&&window.LUPMIS_SESSION&&window.LUPMIS_SESSION.user_id)return window.LUPMIS_SESSION;try{const n=localStorage.getItem("dev-session");if(n){const e=JSON.parse(n);if(e&&e.user_id)return e}}catch{}return null}typeof window<"u"&&(window.lupmisDevSession=n=>{n==null?(localStorage.removeItem("dev-session"),console.log("[Dev] Session override cleared. Reload to apply.")):(localStorage.setItem("dev-session",JSON.stringify(n)),console.log("[Dev] Session override saved. Reload to apply:",n))});const Xi=3e4,Vi=5e3;let Fe=null;async function Yi(n=!1){if(Fe!==null&&!n)return Fe;const e=new AbortController,t=setTimeout(()=>e.abort(),Vi);try{Fe=(await fetch(`${hr}/get_layers.php`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(gr),signal:e.signal})).ok}catch{Fe=!1}finally{clearTimeout(t)}return console.log("[RemoteDB] Server reachable:",Fe),Fe}function Se(){return Fe}function Ji(n,e=Xi){const t=new AbortController,r=setTimeout(()=>t.abort(),e);return n.signal&&n.signal.addEventListener("abort",()=>t.abort()),{signal:t.signal,clear:()=>clearTimeout(r)}}async function me(n,e={},t={}){const r=`${hr}/${n}`,o={...gr,...e};console.log("[RemoteDB] POST",r);const a=Ji(t);try{const i=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(o),...t,signal:a.signal});if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);const s=await i.json();return console.log("[RemoteDB] POST response:",n,"→",typeof s=="object"?`${Array.isArray(s)?s.length+" items":"object"}`:s),s}catch(i){throw i.name==="AbortError"?(console.error("[RemoteDB] POST timed out:",n),new Error(`Request timed out: ${n}`)):(console.error("[RemoteDB] POST failed:",n,i),i)}finally{a.clear()}}async function Zi(){return me("get_district_boundary.php")}async function Qi(){return me("get_layers.php")}async function es(){return me("get_all_collector_zone_per_district.php")}async function ts(){return me("get_parcels_per_district.php")}async function os(){return me("get_all_footprint_per_district.php")}async function ns(){return me("get_contours_hillshade.php")}async function rs(){return me("get_osm_roads.php")}async function as(){return me("get_upn_grid_per_district.php")}async function is(n,e){const t={client_uuid:n.client_uuid,name:n.name??null,started_at:n.started_at,ended_at:n.ended_at,point_count:n.point_count??e.length,distance_m:n.distance_m??0,points:(e||[]).map(o=>({seq:o.seq,longitude:o.longitude,latitude:o.latitude,altitude:o.altitude??null,accuracy:o.accuracy??null,altitude_accuracy:o.altitude_accuracy??null,heading:o.heading??null,speed:o.speed??null,satellites:o.satellites??null,recorded_at:o.recorded_at}))},r=await me("save_gps_trail.php",t);return{remoteId:r?.id??r?.remote_id??null}}const ss=63710088e-1,Oe=Math.PI/180;function ls(n,e,t,r){const o=(r-e)*Oe,a=(t-n)*Oe,i=Math.sin(o/2)**2+Math.cos(e*Oe)*Math.cos(r*Oe)*Math.sin(a/2)**2;return 2*ss*Math.asin(Math.min(1,Math.sqrt(i)))}function sn(n,e=5){return n==null||Number.isNaN(n)?"—":n.toFixed(e)}const ln=6378137,cn=1/298.257223563,dn=.9996,te=cn*(2-cn),Yt=te/(1-te);function cs(n,e){if(n==null||e==null||Number.isNaN(n)||Number.isNaN(e))return null;let t=((e+180)%360+360)%360-180;const r=Math.floor((t+180)/6)+1,o=(r-1)*6-180+3,a=n*Oe,i=t*Oe,s=o*Oe,l=Math.sin(a),c=Math.cos(a),d=Math.tan(a),u=ln/Math.sqrt(1-te*l*l),p=d*d,f=Yt*c*c,h=c*(i-s),y=ln*((1-te/4-3*te**2/64-5*te**3/256)*a-(3*te/8+3*te**2/32+45*te**3/1024)*Math.sin(2*a)+(15*te**2/256+45*te**3/1024)*Math.sin(4*a)-35*te**3/3072*Math.sin(6*a));let g=dn*u*(h+(1-p+f)*h**3/6+(5-18*p+p*p+72*f-58*Yt)*h**5/120)+5e5,m=dn*(y+u*d*(h*h/2+(5-p+9*f+4*f*f)*h**4/24+(61-58*p+p*p+600*f-330*Yt)*h**6/720));const b=n>=0?"N":"S";return b==="S"&&(m+=1e7),{zone:r,hemisphere:b,easting:Math.round(g),northing:Math.round(m)}}function ds(n,e){const t=cs(n,e);return t?`${t.zone}${t.hemisphere} ${t.easting}E ${t.northing}N`:"—"}function us(n){return n==null||Number.isNaN(n)?"—":n<1e3?`${Math.round(n)} m`:`${(n/1e3).toFixed(2)} km`}function ps(n){return n==null||Number.isNaN(n)?"—":`±${Math.round(n)} m`}function fs(n){return n==null||Number.isNaN(n)?"none":n<=10?"good":n<=30?"fair":"poor"}const hs={minDistanceM:5,minIntervalMs:1e3,heartbeatMs:2e4,maxAccuracyM:50,enableHighAccuracy:!0,timeoutMs:15e3,maximumAgeMs:0};class ct{constructor(e={}){this.opts={...hs,...e},this.storage=e.storage||null,this.sync=e.sync||null,this._geo=e.geolocation||(typeof navigator<"u"?navigator.geolocation:null),this._state="idle",this._watchId=null,this._live=!1,this._recording=!1,this._activeTrailId=null,this._activeTrailUuid=null,this._lastRecorded=null,this._lastRecordedAt=0,this._distanceM=0,this._pointCount=0,this._lastFix=null,this._listeners=Object.create(null)}on(e,t){return(this._listeners[e]||(this._listeners[e]=new Set)).add(t),()=>this._listeners[e]?.delete(t)}_emit(e,t){const r=this._listeners[e];if(r)for(const o of r)try{o(t)}catch(a){console.error(`[GeoTracker] listener for "${e}" threw`,a)}}get state(){return this._state}get isRecording(){return this._recording}get lastFix(){return this._lastFix}get isSupported(){return!!this._geo}_setState(e){this._state!==e&&(this._state=e,this._emit("statechange",e))}startLive(){if(!this._geo){this._emit("error",new Error("Geolocation not supported"));return}this._live=!0,this._ensureWatch()}stopLive(){this._live=!1,this._recording||this._teardownWatch()}getCurrentPosition(){return new Promise((e,t)=>{if(!this._geo){t(new Error("Geolocation not supported"));return}this._geo.getCurrentPosition(r=>{const o=ct.normalize(r);this._lastFix=o,this._emit("position",o),e(o)},r=>{this._emit("error",r),t(r)},{enableHighAccuracy:this.opts.enableHighAccuracy,timeout:this.opts.timeoutMs,maximumAge:this.opts.maximumAgeMs})})}async startRecording(e={}){if(!this._geo)throw new Error("Geolocation not supported");if(!this.storage)throw new Error("GeoTracker: no storage adapter configured");if(this._recording)return{trailId:this._activeTrailId,uuid:this._activeTrailUuid};const t=ct.uuid(),r=new Date().toISOString(),o={uuid:t,name:e.name||null,startedAt:r,...e},a=await this.storage.createTrail(o);return this._activeTrailId=a,this._activeTrailUuid=t,this._lastRecorded=null,this._lastRecordedAt=0,this._distanceM=0,this._pointCount=0,this._recording=!0,this._ensureWatch(),this._setState("recording"),this._emit("trailstart",{trailId:a,uuid:t,startedAt:r}),{trailId:a,uuid:t}}async stopRecording(){if(!this._recording)return null;const e=this._activeTrailId,r={endedAt:new Date().toISOString(),pointCount:this._pointCount,distanceM:this._distanceM};this._recording=!1,this._live||this._teardownWatch(),this._setState(this._live?"watching":"idle");try{await this.storage.finishTrail(e,r)}catch(a){this._emit("error",a)}this._emit("trailstop",{trailId:e,...r});let o=!1;if(this.sync)try{o=await this._syncTrail(e)}catch(a){this._emit("error",a)}return this._activeTrailId=null,this._activeTrailUuid=null,{trailId:e,pointCount:r.pointCount,distanceM:r.distanceM,synced:o}}async syncPending(){if(!this.sync||!this.storage)return{pushed:0,failed:0};if(this.sync.isOnline&&!this.sync.isOnline())return{pushed:0,failed:0};let e=0,t=0;const r=await this.storage.getUnsyncedTrails();for(const o of r)try{await this._syncTrail(o.id??o.trailId,o)?e++:t++}catch(a){t++,this._emit("error",a)}return this._emit("syncstatus",{pushed:e,failed:t}),{pushed:e,failed:t}}async _syncTrail(e,t){const r=await this.storage.getTrailPoints(e),o=t||{id:e},a=await this.sync.pushTrail(o,r),i=a&&(a.remoteId??a.id??null);return await this.storage.markTrailSynced(e,i),!0}_ensureWatch(){if(this._watchId!=null||!this._geo){this._state==="idle"&&this._live&&this._setState("watching");return}this._watchId=this._geo.watchPosition(e=>this._onFix(e),e=>this._emit("error",e),{enableHighAccuracy:this.opts.enableHighAccuracy,timeout:this.opts.timeoutMs,maximumAge:this.opts.maximumAgeMs}),this._recording||this._setState("watching")}_teardownWatch(){this._watchId!=null&&this._geo&&this._geo.clearWatch(this._watchId),this._watchId=null}async _onFix(e){const t=ct.normalize(e);if(this._lastFix=t,this._emit("position",t),!this._recording)return;const{minIntervalMs:r,minDistanceM:o,heartbeatMs:a,maxAccuracyM:i}=this.opts,s=t.timestamp;if(this._lastRecordedAt&&s-this._lastRecordedAt0&&t.accuracy!=null&&t.accuracy>i&&this._lastRecorded)return;let l=!1,c=0;if(!this._lastRecorded)l=!0;else{c=ls(this._lastRecorded.lon,this._lastRecorded.lat,t.lon,t.lat);const d=s-this._lastRecordedAt;(c>=o||d>=a)&&(l=!0)}if(l){this._lastRecorded&&(this._distanceM+=c),this._pointCount+=1,this._lastRecorded={lon:t.lon,lat:t.lat,timestamp:s},this._lastRecordedAt=s;try{await this.storage.addPoint(this._activeTrailId,{...t,seq:this._pointCount}),this._emit("point",{trailId:this._activeTrailId,seq:this._pointCount,point:t,distanceM:this._distanceM,pointCount:this._pointCount})}catch(d){this._emit("error",d)}}}static normalize(e){const t=e.coords||{},r=o=>o!=null&&!Number.isNaN(o)?o:null;return{lon:t.longitude,lat:t.latitude,accuracy:r(t.accuracy),altitude:r(t.altitude),altitudeAccuracy:r(t.altitudeAccuracy),heading:r(t.heading),speed:r(t.speed),satellites:null,timestamp:e.timestamp||Date.now()}}static uuid(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}}const gs={async createTrail(n){const e=n.districtId??We()?.district_id??null;return Ua({...n,districtId:e!=null?String(e):null})},addPoint:(n,e)=>qa(n,e),finishTrail:(n,e)=>za(n,e),getUnsyncedTrails:()=>Ha(),getTrailPoints:n=>Wa(n),markTrailSynced:(n,e)=>Ka(n,e)},ms={pushTrail:(n,e)=>is(n,e),isOnline:()=>X()},ve=new ct({storage:gs,sync:ms,minDistanceM:5,minIntervalMs:1e3,heartbeatMs:2e4,maxAccuracyM:50,enableHighAccuracy:!0}),ys=new Set(["set:view","set:selected","clear:selected","set:basemap"]);function bs({mapView:n,embedConfig:e}){const t=n.getMap(),r=window.parent&&window.parent!==window?window.parent:null,o=new j,a=new N({source:o,zIndex:9999,style:new M({stroke:new I({color:"#f97316",width:3}),fill:new C({color:"rgba(249,115,22,0.18)"})}),properties:{title:"Permit selection",displayInLayerSwitcher:!1}});t.addLayer(a);let i=null,s=e?.upn?String(e.upn):null,l=!1;function c(g){if(!r){console.warn("[embed-bridge] No parent window — would have sent:",g);return}try{r.postMessage(g,"*")}catch(m){console.warn("[embed-bridge] postMessage failed:",m)}}function d(g,m){c({type:"error",code:g,message:m})}function u(){l||(l=!0,c({type:"ready"}))}function p(g,m,b){const _=g.getProperties();let S=m,T=b;if(S==null||T==null){const v=g.getGeometry()?.getExtent();if(v){const[x,P]=Ae(Hr(v));S=x,T=P}}return{type:"parcel:select",upn:_.upn??null,parcel_id:_.id??null,lon:S??null,lat:T??null,zone_code:_.zone_code??null,zone_name:_.zone_name??null,landuse:_.landuse??null,min_height:_.min_height??null,max_height:_.max_height??null}}function f(g){if(o.clear(),g){const m=g.clone();o.addFeature(m)}}n.onClick((g,m,b,_)=>{let S=null;t.forEachFeatureAtPixel(_.pixel,T=>{if(T.get("_layerType")==="parcel")return S=T,!0}),S?(f(S),c(p(S,g,m))):(f(null),c({type:"parcel:cleared"}))}),window.addEventListener("message",g=>{const m=g.data;if(!(!m||typeof m!="object"||!ys.has(m.type)))try{switch(m.type){case"set:view":{if(typeof m.lon=="number"&&typeof m.lat=="number"){const b=t.getView();b.setCenter(ee([m.lon,m.lat])),typeof m.zoom=="number"&&b.setZoom(m.zoom)}break}case"set:selected":m.upn&&h(String(m.upn));break;case"clear:selected":f(null),s=null;break;case"set:basemap":m.key&&typeof n.setBaseMap=="function"&&n.setBaseMap(m.key);break}}catch(b){d("COMMAND_FAILED",`Failed to handle ${m.type}: ${b.message}`)}});function h(g){if(!i){s=g;return}const b=i.getSource().getFeatures().find(S=>String(S.get("upn")??"")===g);if(!b){s=g;return}s=null,f(b);const _=b.getGeometry()?.getExtent();_&&t.getView().fit(_,{padding:[50,50,50,50],duration:400,maxZoom:17}),c(p(b,null,null))}function y(g){i=g;const m=g.getSource(),b=()=>{queueMicrotask(()=>{s&&h(s),u()})};if(m.getFeatures().length>0)b();else{let _=!1;m.on("addfeature",()=>{_||(_=!0,queueMicrotask(()=>{_=!1,s&&h(s),u()}))})}}if(e?.basemap&&typeof n.setBaseMap=="function"&&n.setBaseMap(e.basemap),typeof e?.lon=="number"&&typeof e?.lat=="number"){const g=t.getView();g.setCenter(ee([e.lon,e.lat])),g.setZoom(typeof e?.zoom=="number"?e.zoom:15)}return{attachParcelsLayer:y,emitError:d}}const ws=[{key:"parcels",label:"Parcels",geometryFamily:"polygon"},{key:"collector_zones",label:"Collector Zones",geometryFamily:"polygon"},{key:"building_footprints",label:"Building Footprints",geometryFamily:"polygon"},{key:"osm_roads",label:"OSM Roads",geometryFamily:"line"},{key:"other",label:"Other (view only)",geometryFamily:"any"}],mr={parcels:["upn","landuse","zone_code","zone_name","sector","block","parcel_no","prop_no","st_name","prop_add","fac_name","min_height","max_height","eff_date","lp_name","locality","mmda","last_update","remarks"],collector_zones:["zone_name"],building_footprints:[],osm_roads:["osm_id","name","highway"],other:[]};function _s(n){if(!n?.features?.length)return"none";let e=0,t=0,r=0;for(const i of n.features){const s=i?.geometry?.type;s&&(s==="Polygon"||s==="MultiPolygon"?e++:s==="LineString"||s==="MultiLineString"?t++:(s==="Point"||s==="MultiPoint")&&r++)}const o=e+t+r;if(o===0)return"none";const a=Math.max(e,t,r);return ae&&(s=s.slice(0,e-1)+"…"),t[a]=s)}}return t}const L={};let yo=null,O=null;function Ls(){L.root||(L.root=document.getElementById("importMappingModal"),L.filename=document.getElementById("import-modal-filename"),L.summary=document.getElementById("import-modal-summary"),L.target=document.getElementById("import-modal-target"),L.targetHint=document.getElementById("import-modal-target-hint"),L.fieldsWrap=document.getElementById("import-modal-fields-wrap"),L.tbody=document.getElementById("import-modal-fields-tbody"),L.btnSave=document.getElementById("import-modal-save"),L.btnSaveUpload=document.getElementById("import-modal-save-upload"),L.btnCancel=document.getElementById("import-modal-cancel"),L.target&&!L.target.dataset.populated&&(L.target.innerHTML=ws.map(n=>``).join(""),L.target.dataset.populated="1"),L.target&&!L.target.dataset.wired&&(L.target.dataset.wired="1",L.target.addEventListener("change",wr)),L.btnSave&&!L.btnSave.dataset.wired&&(L.btnSave.dataset.wired="1",L.btnSave.addEventListener("click",()=>pn("save"))),L.btnSaveUpload&&!L.btnSaveUpload.dataset.wired&&(L.btnSaveUpload.dataset.wired="1",L.btnSaveUpload.addEventListener("click",()=>pn("upload"))),L.root&&!L.root.dataset.wired&&(L.root.dataset.wired="1",L.root.addEventListener("hidden.bs.modal",()=>{O?.onResult&&!O._resolved&&(O._resolved=!0,O.onResult({action:"cancel"})),O=null})))}function ks(){const n=O.targetType,e=mr[n]||[];if(n==="other"||e.length===0){L.fieldsWrap.style.display="none";return}L.fieldsWrap.style.display="";const t=o=>{const a=O.sourceSamples[o];return a?` — [${Tt(a)}]`:" — [(empty)]"},r=[''].concat(O.sourceFields.map(o=>``)).join("");L.tbody.innerHTML=e.map(o=>{const a=O.mapping[o]||"",i=r.replace(`