{
  "version": 3,
  "sources": ["/cdn/shop/t/25/assets/sen-raumplaner-kern.js?x=26387"],
  "sourcesContent": ["/*\n  Rechenkern des Raumplaners (assets/sen-raumplaner.js): Geometrie, Modelle, Zuordnung und das Pr\u00FCfen eines Links.\n  Kennt keinen Zustand, kein DOM und keine Texte; darum in Node testbar (scripts/raumplaner-tests.mjs, l\u00E4uft in der\n  Action) und im Browser als window.SenRaumplanerKern. Die Section l\u00E4dt diese Datei vor sen-raumplaner.js (defer).\n  Preis, Lieferbarkeit und Adresse der Modelle tr\u00E4gt die Hauptdatei aus den Shop-Daten nach (MODELLE wird erg\u00E4nzt).\n*/\n(function (root, factory) {\n  if (typeof module === 'object' && module.exports) module.exports = factory();\n  else root.SenRaumplanerKern = factory();\n})(typeof self !== 'undefined' ? self : this, function () {\n  'use strict';\n  // Messwerte je Modell. Preis und Lieferbarkeit kommen aus Shopify (Variante), bis zum Metaobjekt\n  // \u201EFakten je Modell\u201C steht der Rest hier. Quelle: marketing\\entwuerfe\\cluster\\daten\\fakten.json.\n  // VORL\u00C4UFIG: Stufenbreiten KL LD unbelegt. praesenz nur, wo das Ger\u00E4t eine eigene Pr\u00E4senzreichweite hat (KL MZ).\n  // ghz: Radarband; Melder im selben Band k\u00F6nnen sich gegenseitig st\u00F6ren.\n  // klima: misst auch das Raumklima; der erste vorgeschlagene Melder soll das k\u00F6nnen (Fernando 21.10.).\n  // helligkeit, sirene: weitere Ausstattung laut fakten.json (alle Modelle); steht auf den Karten und in der Zusammenfassung.\n  // klasse: 'raum' (Basis, KL, KL LD: Anwesenheit im Raum, Entfernungszonen bleiben au\u00DFen vor) oder 'zonen'\n  // (KL MZ: bis zu `zonen` gezeichnete Zonen des Raums). Fernando 21.10. nach Gespr\u00E4ch mit Christian.\n  const MODELLE = {\n    basis: { name: 'Basis', variante: 55697694753093, reichweite: 6, ghz: 24, winkel: 120, stufe: 0.75, stufen: { 0.75: 6, 0.2: 1.8 }, zonen: 3, klasse: 'raum', klima: false, helligkeit: true, sirene: true },\n    kl:    { name: 'KL',    variante: 56360456225093, reichweite: 6, ghz: 24, winkel: 120, stufe: 0.75, stufen: { 0.75: 6, 0.2: 1.8 }, zonen: 3, klasse: 'raum', klima: true, helligkeit: true, sirene: true },\n    kl_ld: { name: 'KL LD', variante: 59644698624325, reichweite: 9.75, ghz: 24, winkel: 150, stufe: 0.75, stufen: { 0.75: 9.75, 0.5: 6.5, 0.2: 2.6 }, zonen: 5, klasse: 'raum', klima: true, helligkeit: true, sirene: true },\n    kl_mz: { name: 'KL MZ', variante: 59330507931973, reichweite: 6, praesenz: 4, ghz: 60, winkel: 120, stufe: null, zonen: 4, personen: 4, klasse: 'zonen', klima: true, helligkeit: true, sirene: true },\n  };\n  // Stufenabstand \u2192 gr\u00F6\u00DFte Reichweite. KL/Basis laut Anleitung (8 Stufen: 6 m bzw. 1,8 m),\n  // KL LD vorl\u00E4ufig 13 Stufen (am Ger\u00E4t 13.10. gemessen), Anleitung nennt keine Anzahl.\n  // Wirksame Werte eines Melders: Stufenabstand und Reichweite h\u00E4ngen an seiner Einstellung.\n  function wm(s) {\n    const M = MODELLE[s.modell];\n    if (!M.stufen) return M;\n    const st = s.stufe && M.stufen[s.stufe] ? s.stufe : M.stufe;\n    return { ...M, stufe: st, reichweite: M.stufen[st] };\n  }\n  // Bis wohin auch Stillsitzen erkannt wird (Entfernung, an der Decke schr\u00E4g): Reichweite minus Rand, beim KL MZ h\u00F6chstens 4 m\n  function praesenzBis(s, M) {\n    const rand = M.stufe ? RAND_M * M.stufe / 0.75 : RAND_M;\n    return Math.max(0, Math.min((s.max || M.reichweite) - rand, M.praesenz || Infinity));\n  }\n  function grundStufe(M) {\n    if (!M.stufen) return null;\n    const k = Object.keys(M.stufen).map(Number);\n    return Math.max(...k);\n  }\n  const ARTEN = ['tuer', 'durchgang', 'fenster'];\n  const BEZUG = 1.5;         // Decke: Kegel und Entfernungen auf dieser H\u00F6he \u00FCber dem Boden (Christian 22.10.: nicht bis zum\n                             // Boden rechnen, h\u00F6chstens bis 1,5 m; vorher 1,0 m und der Winkel am Boden, \u00D8 8,7 m statt 3,5 m)\n  const RAND_WINKEL = 5;       // Grad je Seite, in denen nur Bewegung erkannt wird (Christian, Frage 7)\n  const RAND_M = 1;            // m am Ende der Reichweite, bei 0,75-m-Stufen; k\u00FCrzere Stufen anteilig (Frage 7)\n  // Deckel gegen Tippfehler und fremde Links (Pr\u00FCfung 21.10.: eine Null zu viel erzeugte Millionen Rasterlinien)\n  const MAX_RAUM = 50;        // m, gr\u00F6\u00DFte Raumseite und Koordinate\n  const MAX_MOEBEL = 20;      // m, gr\u00F6\u00DFtes Ma\u00DF eines M\u00F6bels oder einer \u00D6ffnung\n  const MAX_HOEHE = 10;       // m, Raumh\u00F6he\n  const MAX_TEILE = { punkte: 40, moebel: 60, oeffnungen: 30, melder: 12, zonen: 12 };   // je Link; Analyse und Suche wachsen damit\n  const RASTER_JE_M = 20;     // Raster beim Ziehen und Setzen: 20 Schritte je Meter (5 cm)\n  const raster = v => Math.round(v * RASTER_JE_M) / RASTER_JE_M;\n  const rad = g => g * Math.PI / 180;\n  const normWinkel = g => ((g % 360) + 540) % 360 - 180;   // -180 \u2026 180\n  const neueId = p => p + Math.random().toString(36).slice(2, 8);\n  const kreuz = (ax, ay, bx, by) => ax * by - ay * bx;\n  function kanten(poly) {\n    return poly.map((p, i) => { const q = poly[(i + 1) % poly.length]; return [p[0], p[1], q[0], q[1]]; });\n  }\n  function innenWinkelKante(poly, i) {\n    const [x1, y1, x2, y2] = kanten(poly)[i];\n    return Math.atan2(x2 - x1, -(y2 - y1)) * 180 / Math.PI;   // Normale (-dy, dx), zeigt nach innen\n  }\n  function innenWinkelEcke(poly, i) {\n    const n = poly.length;\n    const a = rad(innenWinkelKante(poly, (i - 1 + n) % n)), b = rad(innenWinkelKante(poly, i));\n    return Math.atan2(Math.sin(a) + Math.sin(b), Math.cos(a) + Math.cos(b)) * 180 / Math.PI;\n  }\n  function rechteckKanten(o) {\n    const { x, y, w, h } = o;\n    if (o.rund) {                                     // Kreis als 24-Eck um den Mittelpunkt\n      const cx = x + w / 2, cy = y + h / 2, r = w / 2, n = 24, k = [];\n      for (let i = 0; i < n; i++) {\n        const a = 2 * Math.PI * i / n, b = 2 * Math.PI * (i + 1) / n;\n        k.push([cx + r * Math.cos(a), cy + r * Math.sin(a), cx + r * Math.cos(b), cy + r * Math.sin(b)]);\n      }\n      return k;\n    }\n    return [[x, y, x + w, y], [x + w, y, x + w, y + h], [x + w, y + h, x, y + h], [x, y + h, x, y]];\n  }\n  const innen = (o, p) => !o.rund || Math.hypot(p.x - o.x - o.w / 2, p.y - o.y - o.h / 2) <= o.w / 2;\n  // Umgebendes Rechteck (freie Form kann auch links oder oberhalb von 0 liegen)\n  function huelle(poly) {\n    const xs = poly.map(p => p[0]), ys = poly.map(p => p[1]);\n    return { x0: Math.min(...xs), y0: Math.min(...ys), x1: Math.max(...xs), y1: Math.max(...ys) };\n  }\n  // ---------- Freie Form ----------\n  // Ecken im Uhrzeigersinn (y nach unten, Fl\u00E4che positiv), sonst zeigen die Innennormalen nach au\u00DFen.\n  function flaeche(poly) {\n    let a = 0;\n    poly.forEach((p, i) => { const q = poly[(i + 1) % poly.length]; a += p[0] * q[1] - q[0] * p[1]; });\n    return a / 2;\n  }\n  const ausrichten = poly => flaeche(poly) < 0 ? poly.reverse() : poly;\n  function kreuzen([x1, y1, x2, y2], [x3, y3, x4, y4]) {\n    const d = kreuz(x2 - x1, y2 - y1, x4 - x3, y4 - y3);\n    if (Math.abs(d) < 1e-12) return false;\n    const tt = kreuz(x3 - x1, y3 - y1, x4 - x3, y4 - y3) / d, u = kreuz(x3 - x1, y3 - y1, x2 - x1, y2 - y1) / d;\n    return tt > 1e-9 && tt < 1 - 1e-9 && u > 1e-9 && u < 1 - 1e-9;\n  }\n  const MIN_WAND = 0.2;\n  // G\u00FCltig: jede Wand mindestens 20 cm, keine W\u00E4nde kreuzen sich, Umlaufsinn bleibt\n  function gueltig(poly) {\n    const n = poly.length, k = kanten(poly);\n    if (n < 3 || k.some(([x1, y1, x2, y2]) => Math.hypot(x2 - x1, y2 - y1) < MIN_WAND)) return false;\n    for (let i = 0; i < n; i++) for (let j = i + 2; j < n; j++) {\n      if (i === 0 && j === n - 1) continue;\n      if (kreuzen(k[i], k[j])) return false;\n    }\n    return flaeche(poly) > 0.5;\n  }\n  const rund = v => Math.round(v * 100) / 100;\n  const grad360 = g => (Math.round(g) % 360 + 360) % 360;\n  // Lage einer \u00D6ffnung: n\u00E4chste Wand, Mitte darauf, ganz auf der Wand. t0, t1 = Anteil der Wandl\u00E4nge.\n  function oeffnungLage(o, poly) {\n    let best = null;\n    kanten(poly).forEach(([x1, y1, x2, y2], i) => {\n      const sx = x2 - x1, sy = y2 - y1, len = Math.hypot(sx, sy), b = Math.min(o.b, len - 0.1);\n      if (b < 0.1) return;\n      const h = b / 2 / len;\n      const tt = Math.max(h, Math.min(1 - h, ((o.x - x1) * sx + (o.y - y1) * sy) / (len * len)));\n      const mx = x1 + tt * sx, my = y1 + tt * sy, d = Math.hypot(o.x - mx, o.y - my);\n      if (!best || d < best.d) best = { d, i, len, b, t0: tt - h, t1: tt + h, x1, y1, sx, sy, mx, my, ux: sx / len, uy: sy / len };\n    });\n    if (best) { const g = rad(innenWinkelKante(poly, best.i)); best.nx = Math.cos(g); best.ny = Math.sin(g); }   // n zeigt in den Raum\n    return best;\n  }\n  const wandPunkt = (L, tt, n = 0) => ({ x: L.x1 + tt * L.sx + n * L.nx, y: L.y1 + tt * L.sy + n * L.ny });\n  // 12 Proben \u00FCber die Breite einer \u00D6ffnung, n Meter vor der Wand (negativ = drau\u00DFen)\n  const oeffnungProben = (L, n) => Array.from({ length: 12 }, (_, k) => wandPunkt(L, L.t0 + (L.t1 - L.t0) * (k + 0.5) / 12, n));\n  // T\u00FCr: Angel (an), Gegenseite und das offene Blatt, 90\u00B0 in den Raum geschwenkt, bei auf 'aussen' nach drau\u00DFen\n  // (Fernando 21.10.). seite 'b' = Anschlag gewechselt. sweep: Drehsinn des Bogens im SVG\n  const nachAussen = o => o.auf === 'aussen';\n  function tuerBlatt(L, o) {\n    const a = wandPunkt(L, L.t0), b = wandPunkt(L, L.t1), [an, gegen] = o.seite === 'b' ? [b, a] : [a, b], r = nachAussen(o) ? -1 : 1;\n    return { an, gegen, spitze: { x: an.x + L.nx * L.b * r, y: an.y + L.ny * L.b * r }, sweep: kreuz(L.nx * r, L.ny * r, gegen.x - an.x, gegen.y - an.y) > 0 ? 1 : 0 };\n  }\n  const istDecke = s => s.montage === 'decke';\n  const MAX_ZONEN_ECKEN = 8;   // Firmware des KL MZ: je Zone 3 bis 8 Ecken (product_zone.h, PRODUCT_ZONE_POINTS_MAX)\n  const inRechteck = (p, r) => p.x >= r.x && p.x <= r.x + r.w && p.y >= r.y && p.y <= r.y + r.h;\n  const rechteckPoly = (x, y, w, h) => [[rund(x), rund(y)], [rund(x + w), rund(y)], [rund(x + w), rund(y + h)], [rund(x), rund(y + h)]];\n  // Vier Ecken, Kanten abwechselnd waagerecht und senkrecht: dann zieht eine Ecke die beiden Nachbarn mit, wie bei einem\n  // Rechteck (Fernando 22.10.). Ab der f\u00FCnften Ecke (oder nach dem Entfernen einer) wandert jede Ecke f\u00FCr sich.\n  const istRechteck = p => p.length === 4 && [0, 1].some(k => p.every(([x, y], i) => { const [x2, y2] = p[(i + 1) % 4]; return (i + k) % 2 ? x === x2 : y === y2; }));\n  // Zuordnung Pl\u00E4tze/Zonen \u2192 Melder als Zuordnungsproblem (Kuhn mit Kapazit\u00E4ten): so viele wie m\u00F6glich bekommen einen\n  // Melder; je Platz die besser erfassten Melder zuerst, zuerst die Pl\u00E4tze mit den wenigsten Kandidaten. Ein gieriges\n  // \u201Ebester Anteil zuerst\u201C lie\u00DF eine Zone ohne Melder, obwohl beide zu 100 % gingen (Fernando 21.10.).\n  // kandidaten(g) \u2192 [{ key, wert }], kap(key) \u2192 Zahl; Ergebnis Map g \u2192 key\n  function zuordnen(n, kandidaten, kap) {\n    const belegt = new Map(), von = new Map();\n    const kand = Array.from({ length: n }, (_, g) => kandidaten(g));\n    const versuche = (g, gesehen) => {\n      for (const k of kand[g]) {\n        if (gesehen.has(k.key)) continue;\n        gesehen.add(k.key);\n        const b = belegt.get(k.key) || new Set();\n        if (b.size < kap(k.key)) { b.add(g); belegt.set(k.key, b); von.set(g, k); return true; }\n        for (const g2 of [...b]) if (versuche(g2, gesehen)) { b.delete(g2); b.add(g); von.set(g, k); return true; }\n      }\n      return false;\n    };\n    for (const g of kand.map((l, idx) => idx).sort((a, b) => kand[a].length - kand[b].length)) versuche(g, new Set());\n    return von;\n  }\n  // Decke: Kreis auf BEZUG-H\u00F6he aus dem senkrechten Abstand dh und dem \u00D6ffnungswinkel (2,50 m Decke, 120\u00B0 \u2192 \u00D8 3,5 m),\n  // begrenzt durch die eingestellte Entfernung (schr\u00E4g gemessen)\n  function decke(s, hoehe) {\n    const M = MODELLE[s.modell], H = hoehe || 2.5, dh = Math.max(0.1, H - BEZUG);\n    const rWinkel = dh * Math.tan(rad(M.winkel / 2));\n    const rMax = s.max > dh ? Math.sqrt(s.max * s.max - dh * dh) : 0;\n    return { H, dh, R: Math.min(rWinkel, rMax) };\n  }\n  // Kernbereich: hier erkennt der Melder auch Pr\u00E4senz (still sitzen), im Rand darum nur Bewegung.\n  // Wand: F\u00E4cher mit Pr\u00E4senzreichweite und schmalerem Winkel. Decke: kleinerer Kreis.\n  function kern(s, hoehe) {\n    const M = wm(s), p = praesenzBis(s, M), w = M.winkel - 2 * RAND_WINKEL;\n    if (!istDecke(s)) return { r: p, w };\n    const { dh, R } = decke(s, hoehe);\n    return { R: Math.min(R, dh * Math.tan(rad(w / 2)), p > dh ? Math.sqrt(p * p - dh * dh) : 0) };\n  }\n  function ursprung(s) {\n    if (istDecke(s)) return { x: s.x, y: s.y };\n    return { x: s.x + 0.02 * Math.cos(rad(s.dir)), y: s.y + 0.02 * Math.sin(rad(s.dir)) };\n  }\n  function strahl(o, g, max, segs) {\n    const rx = Math.cos(rad(g)), ry = Math.sin(rad(g));\n    let tt = max;\n    for (const [x1, y1, x2, y2] of segs) {\n      const sx = x2 - x1, sy = y2 - y1;\n      const d = kreuz(rx, ry, sx, sy);\n      if (Math.abs(d) < 1e-12) continue;\n      const px = x1 - o.x, py = y1 - o.y;\n      const t1 = kreuz(px, py, sx, sy) / d, u = kreuz(px, py, rx, ry) / d;\n      if (t1 > 1e-6 && u >= 0 && u <= 1 && t1 < tt) tt = t1;\n    }\n    return tt;\n  }\n  function verdeckt(o, p, segs) {\n    const rx = p.x - o.x, ry = p.y - o.y;\n    for (const [x1, y1, x2, y2] of segs) {\n      const sx = x2 - x1, sy = y2 - y1;\n      const d = kreuz(rx, ry, sx, sy);\n      if (Math.abs(d) < 1e-12) continue;\n      const px = x1 - o.x, py = y1 - o.y;\n      const t1 = kreuz(px, py, sx, sy) / d, u = kreuz(px, py, rx, ry) / d;\n      if (t1 > 1e-6 && t1 < 1 - 1e-6 && u >= 0 && u <= 1) return true;\n    }\n    return false;\n  }\n  function imRaum(p, poly) {\n    let drin = false;\n    for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n      const [xi, yi] = poly[i], [xj, yj] = poly[j];\n      if ((yi > p.y) !== (yj > p.y) && p.x < (xj - xi) * (p.y - yi) / (yj - yi) + xi) drin = !drin;\n    }\n    return drin;\n  }\n  // Ein Link ist eine fremde Eingabe (Pr\u00FCfung 21.10.: Markup in einer \u00D6ffnungsart landete \u00FCber t('art_' + \u2026) im HTML).\n  // Jede Zahl muss endlich sein und im Deckel liegen, jedes Schl\u00FCsselwort aus der festen Liste kommen, Namen sind\n  // kurzer Text, Kennungen nur Buchstaben und Ziffern. Ein unbrauchbares Teil f\u00E4llt weg; ein unbrauchbarer Raum\n  // wirft, dann l\u00E4dt der Beispielraum. Unbekannte Felder (\u00E4ltere Links) werden nicht \u00FCbernommen.\n  function pruefen(d) {\n    const zahlOk = (v, max, min = 0) => typeof v === 'number' && isFinite(v) && v >= min && v <= max;\n    const lage = v => zahlOk(v, MAX_RAUM, -MAX_RAUM);\n    const wort = (v, liste) => liste.includes(v);\n    const text = v => typeof v === 'string' ? v.slice(0, 40) : '';\n    const kennung = (v, p) => typeof v === 'string' && /^[A-Za-z0-9_-]{1,20}$/.test(v) ? v : neueId(p);\n    if (!d || typeof d !== 'object' || !d.raum || typeof d.raum !== 'object') throw new Error('kein Raum');\n    const r = d.raum, raum = { form: wort(r.form, ['rechteck', 'L', 'frei']) ? r.form : 'rechteck' };\n    for (const [k, std] of [['b', 4], ['l', 5], ['ab', 1.5], ['at', 1.5]]) raum[k] = zahlOk(r[k], MAX_RAUM, MIN_WAND) ? r[k] : std;\n    raum.ecke = wort(r.ecke, ['ul', 'ur', 'ol', 'or']) ? r.ecke : 'ul';\n    raum.hoehe = zahlOk(r.hoehe, MAX_HOEHE, 1) ? r.hoehe : 2.5;\n    if (Array.isArray(r.punkte) && r.punkte.length >= 3 && r.punkte.length <= MAX_TEILE.punkte && r.punkte.every(q => Array.isArray(q) && lage(q[0]) && lage(q[1]))) {\n      raum.punkte = ausrichten(r.punkte.map(q => [q[0], q[1]]));\n      if (!gueltig(raum.punkte)) delete raum.punkte;   // kreuzende W\u00E4nde oder H\u00FClle null: sonst leerer Plan (zielAnsicht teilt durch 0)\n    }\n    if (!raum.punkte && raum.form === 'frei') raum.form = 'rechteck';\n    // Glasfront gilt f\u00FCr jede Form: Wandnummern bis zur Zahl der Kanten (Rechteck 4, L 6, frei nach Punkten)\n    const kantenZahl = raum.form === 'frei' ? raum.punkte.length : raum.form === 'L' ? 6 : 4;\n    if (Array.isArray(r.glas)) raum.glas = r.glas.filter(i => Number.isInteger(i) && i >= 0 && i < kantenZahl);\n    const liste = (l, max) => Array.isArray(l) ? l.filter(o => o && typeof o === 'object').slice(0, max) : [];\n    const rechteck = q => q && typeof q === 'object' && lage(q.x) && lage(q.y) && zahlOk(q.w, MAX_RAUM, 0.1) && zahlOk(q.h, MAX_RAUM, 0.1) ? { x: q.x, y: q.y, w: q.w, h: q.h } : null;\n    const moebel = liste(d.moebel, MAX_TEILE.moebel)\n      .filter(o => lage(o.x) && lage(o.y) && zahlOk(o.w, MAX_MOEBEL, 0.05) && zahlOk(o.h, MAX_MOEBEL, 0.05))\n      .map(o => {\n        const m = { id: kennung(o.id, 'm'), name: text(o.name), x: o.x, y: o.y, w: o.w, h: o.h };\n        if (wort(o.stoff, ['hoch', 'metall', 'massiv'])) m.stoff = o.stoff;\n        if (o.niedrig && (m.stoff === 'hoch' || m.stoff === 'metall')) m.niedrig = true;\n        if (o.rund) m.rund = true;\n        if (o.ort) m.ort = true;\n        return m;\n      });\n    const oeffnungen = liste(d.oeffnungen, MAX_TEILE.oeffnungen)\n      .filter(o => wort(o.art, ARTEN) && zahlOk(o.b, MAX_MOEBEL, 0.05) && lage(o.x) && lage(o.y))\n      .map(o => {\n        const n = { id: kennung(o.id, 'o'), art: o.art, b: o.b, x: o.x, y: o.y };\n        if (wort(o.zustand, ['offen', 'zu'])) n.zustand = o.zustand;\n        if (o.vorhang) n.vorhang = true;\n        if (o.seite === 'b') n.seite = 'b';\n        if (o.auf === 'aussen') n.auf = 'aussen';\n        return n;\n      });\n    const melder = liste(d.melder, MAX_TEILE.melder)\n      .filter(s => MODELLE[s.modell] && lage(s.x) && lage(s.y) && zahlOk(s.dir, 360, -360))\n      .map(s => {\n        const M = MODELLE[s.modell], n = { id: kennung(s.id, 's'), modell: s.modell, x: s.x, y: s.y, dir: s.dir };\n        n.montage = s.montage === 'decke' ? 'decke' : 'wand';\n        n.stufe = grundStufe(M);           // Stufe ist nicht w\u00E4hlbar; \u00E4ltere Links trugen an der Decke 0,2 m\n        // Reichweite nur \u00FCbernehmen, wenn der Link dieselbe Stufe hatte; sonst stammt sie vom alten, k\u00FCrzeren Regler\n        n.max = (!M.stufen || s.stufe === n.stufe) && zahlOk(s.max, wm(n).reichweite, 0.5) ? s.max : wm(n).reichweite;\n        n.wand = typeof s.wand === 'string' && /^[ev]\\d{1,2}$/.test(s.wand) ? s.wand : null;\n        if (M.klasse === 'zonen') { const g = rechteck(s.grenze); if (g) n.grenze = g; }\n        return n;\n      });\n    // Zonen: Vieleck p (3 bis MAX_ZONEN_ECKEN Ecken); \u00E4ltere Links tragen ein Rechteck x/y/w/h\n    const zonenL = liste(d.zonen, MAX_TEILE.zonen).map(zr => {\n      let p = Array.isArray(zr.p) && zr.p.length >= 3 && zr.p.length <= MAX_ZONEN_ECKEN && zr.p.every(q => Array.isArray(q) && lage(q[0]) && lage(q[1])) ? zr.p.map(q => [q[0], q[1]]) : null;\n      if (!p) { const q = rechteck(zr); if (q) p = rechteckPoly(q.x, q.y, q.w, q.h); }\n      return p && { id: kennung(zr.id, 'z'), p };\n    }).filter(Boolean);\n    return { v: 1, raum, moebel, oeffnungen, melder, ...(zonenL.length ? { zonen: zonenL } : {}) };   // v: Format des Links, f\u00FCr sp\u00E4tere Umstellungen\n  }\n  return { MODELLE, wm, praesenzBis, grundStufe, ARTEN, BEZUG, RAND_WINKEL, RAND_M, MAX_RAUM, MAX_MOEBEL, MAX_HOEHE, MAX_TEILE, RASTER_JE_M, raster, rad, normWinkel, neueId, kreuz, kanten, innenWinkelKante, innenWinkelEcke, rechteckKanten, innen, huelle, flaeche, ausrichten, kreuzen, MIN_WAND, gueltig, rund, grad360, oeffnungLage, wandPunkt, oeffnungProben, nachAussen, tuerBlatt, istDecke, MAX_ZONEN_ECKEN, inRechteck, rechteckPoly, istRechteck, zuordnen, decke, kern, ursprung, strahl, verdeckt, imRaum, pruefen };\n});\n"],
  "mappings": "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",
  "names": ["liste"]
}
