<!-- SOLID CITY · part 2989 -->
   }
        if (end > a3) {
          var pA2 = prof[a3], pB2 = prof[end], outw2 = [sdSign * st[a3].rx, sdSign * st[a3].rz];
          for (var dk2 = 0; dk2 < 2; dk2++) {
            var sf2 = stepSurf(pA2, pB2, dk2, surf);
            quad(sf2, pA2[dk2], pB2[dk2], pB2[dk2 + 1], pA2[dk2 + 1], outw2);
            quad(sf2, pB2[dk2], pA2[dk2], pA2[dk2 + 1], pB2[dk2 + 1], outw2);
          }
          a3 = end;
        } else { stitch(a3, a3 + 1); a3++; }
      }
    }
    browSlabs(drapeCacheL, -1, skirtL); browSlabs(drapeCacheR, 1, skirtR);
    function bankSkin(cache, sdSign) {
      var prof = [], brow = [], foot = [], mid = [], low = [], faceDev = [];
      for (var i2 = 0; i2 < N; i2++) {
        var dc = cache[i2];
        if (dc && dc.pts.length - 1 > 2) {
          prof[i2] = dc.pts; brow[i2] = dc.pts[2]; foot[i2] = dc.pts[dc.pts.length - 1]; mid[i2] = dc.pts[Math.min(3, dc.pts.length - 1)]; low[i2] = dc.pts[Math.min(5, dc.pts.length - 1)];
          /* the face's own straightness: how far the drape's
           * intermediate lines bow from the brow-to-foot chord.
           * A benched or cliffed face is kinked by design and a
           * slab may never iron it flat. */
          var pa = dc.pts[2], pb = dc.pts[dc.pts.length - 1], fd = 0;
          for (var fk = 3; fk < dc.pts.length - 1; fk++) { var dv = dev3(dc.pts[fk], pa, pb); if (dv > fd) fd = dv; }
          faceDev[i2] = fd;
        }
        else { prof[i2] = null; brow[i2] = null; foot[i2] = null; mid[i2] = null; low[i2] = null; faceDev[i2] = 99; }
      }
      function dev3(p, a, b) {
        var abx = b[0] - a[0], aby = b[1] - a[1], abz = b[2] - a[2];
        var t = ((p[0] - a[0]) * abx + (p[1] - a[1]) * aby + (p[2] - a[2]) * abz) / (abx * abx + aby * aby + abz * abz || 1);
        t = Math.max(0, Math.min(1, t));
        var dx = p[0] - (a[0] + abx * t), dy = p[1] - (a[1] + aby * t), dz = p[2] - (a[2] + abz * t);
        return Math.sqrt(dx * dx + dy * dy + dz * dz);
      }
      function skinQuad(iA, iB) {
        var pA = prof[iA], pB = prof[iB];
        var outw = [sdSign * st[iA].rx, sdSign * st[iA].rz];
        var nSeg = Math.min(pA.length, pB.length) - 1;
        for (var dk = 2; dk < nSeg; dk++) {
          var sf3 = stepSurf(pA, pB, dk, bankGrass);
          quad(sf3, pA[dk], pB[dk], pB[dk + 1], pA[dk + 1], outw);
          quad(sf3, pB[dk], pA[dk], pA[dk + 1], pB[dk + 1], outw);
        }
      }
      var a3 = 0;
      while (a3 < N - 1) {
        if (!prof[a3]) { a3++; continue; }
        var tame = a3;
        /* THE SLAB MEASURE (the King's word, 2026-10-13 ~23:45):
         * the tame run now reaches 40 stations — a fifty-metre
         * slab where the hillside runs true — and FOUR surveyed
         * lines guard it: brow, mid-slope, NEAR-FOOT, and foot
         * must each hold within 0.45 m of straight, so a long slab
         * can never bridge a hollow the stitch would have tucked
         * into. (The near-foot line was added after the study's
         * probe audit: the unguarded foot half of the face was
         * where the last metre-scale bows lived.) */
        /* THE DARK GREEN PAVING (the King's word, 2026-10-14
         * ~00:47): the tame run is capped at ONE station pair.
         * The bank is paved from bottom to top, every segment
         * following the drape's own line — the folded blanket
         * at the B2 summit (his photograph, ALT 208) was a long
         * slab's work, and long slabs are finished. The guards
         * below stand as the record of the slab era. */
        while (tame < N - 1 && tame - a3 < 1) {
          var nx = tame + 1;
          if (!prof[nx]) break;
          var bad = false;
          for (var m = a3 + 1; m < nx; m++) {
            if (!prof[m]) { bad = true; break; }
            if (dev3(brow[m], brow[a3], brow[nx]) > 0.45 || dev3(foot[m], foot[a3], foot[nx]) > 0.45 || dev3(mid[m], mid[a3], mid[nx]) > 0.45 || dev3(low[m], low[a3], low[nx]) > 0.45) { bad = true; break; }
          }
          if (!bad && (faceDev[a3] > 0.45 || faceDev[nx] > 0.45)) bad = true;
          if (!bad) for (var m2 = a3 + 1; m2 < nx; m2++) if (faceDev[m2] > 0.6) { bad = true; break; }
          if (bad) break;
          tame = nx;
        }
        if (tame > a3 + 1) {
          var outw3 = [sdSign * st[a3].rx, sdSign * st[a3].rz];
          /* a tame face that RISES as one wall (a uniform cliff)
           * pours as stone, not grass */
          var sfT = bankGrass;
          var runA = Math.hypot(foot[a3][0] - brow[a3][0], foot[a3][2] - brow[a3][2]), runB = Math.hypot(foot[tame][0] - brow[tame][0], foot[tame][2] - brow[tame][2]);
          if (((foot[a3][1] - brow[a3][1]) / Math.max(runA, 0.01)) >= 1.2 || ((foot[tame][1] - brow[tame][1]) / Math.max(runB, 0.01)) >= 1.2) sfT = cliffW;
          quad(sfT, brow[a3], brow[tame], foot[tame], foot[a3], outw3);
          quad(sfT, brow[tame], brow[a3], foot[a3], foot[tame], outw3);
          a3 = tame;
        }