<!-- SOLID CITY · part 3021 -->
g's photographs): a dirt shoulder on
           * both edges — the carriageway's own ground, stood on like
           * the road — and on the DOWNHILL edge a guardrail: posts and
           * a silver rail over the drop. No curb, no gold: those are
           * street furniture, and this is a mountain. */
          out0 = 0.95; lift0 = 0.015;
          var sho = sd < 0 ? shoL : shoR;
          var hA0 = edgePt(A, sd, 0.02, 0.015), hA1 = edgePt(A, sd, 0.95, 0.015);
          var hB0 = edgePt(B, sd, 0.02, 0.015), hB1 = edgePt(B, sd, 0.95, 0.015);
          quad(sho, hA0, hB0, hB1, hA1); standQuad(stand, hA0, hB0, hB1, hA1);
          if (sd === -upSide) {
            var rAl = edgePt(A, sd, 0.62, 0.38), rAh = edgePt(A, sd, 0.62, 0.66);
            var rBl = edgePt(B, sd, 0.62, 0.38), rBh = edgePt(B, sd, 0.62, 0.66);
            quad(rail, rAl, rBl, rBh, rAh, [sd * A.rx, sd * A.rz]);
            quad(rail, rBl, rAl, rAh, rBh, [sd * A.rx, sd * A.rz]);
            var tA0 = edgePt(A, sd, 0.56, 0.66), tA1 = edgePt(A, sd, 0.68, 0.66);
            var tB0 = edgePt(B, sd, 0.56, 0.66), tB1 = edgePt(B, sd, 0.68, 0.66);
            quad(rail, tA0, tB0, tB1, tA1);
            if (i % 2 === 0) {
              var pb = edgePt(A, sd, 0.62, 0.0), py0 = pb[1] - 0.06, py1 = pb[1] + 0.60;
              var pc = function (dx, dz, y) { return [pb[0] + A.rx * dx + A.fx * dz, y, pb[2] + A.rz * dx + A.fz * dz]; };
              var p00 = pc(-0.09, -0.09, py0), p10 = pc(0.09, -0.09, py0), p11 = pc(0.09, 0.09, py0), p01 = pc(-0.09, 0.09, py0);
              var p00t = pc(-0.09, -0.09, py1), p10t = pc(0.09, -0.09, py1), p11t = pc(0.09, 0.09, py1), p01t = pc(-0.09, 0.09, py1);
              quad(posts, p00, p10, p10t, p00t); quad(posts, p10, p11, p11t, p10t);
              quad(posts, p11, p01, p01t, p11t); quad(posts, p01, p00, p00t, p01t);
              quad(posts, p00t, p10t, p11t, p01t);
            }
          }
        } else {
        var cA0 = edgePt(A, sd, 0.02, 0.02), cA1 = edgePt(A, sd, 0.32, 0.15);
        var cB0 = edgePt(B, sd, 0.02, 0.02), cB1 = edgePt(B, sd, 0.32, 0.15);
        quad(curb, cA0, cB0, cB1, cA1); standQuad(stand, cA0, cB0, cB1, cA1);
        var fA = [cA1[0], cA1[1] - 0.19, cA1[2]], fB = [cB1[0], cB1[1] - 0.19, cB1[2]];
        quad(curb, cA1, cB1, fB, fA, [sd * A.rx, sd * A.rz]);
        var gA0 = edgePt(A, sd, 0.05, 0.157), gA1 = edgePt(A, sd, 0.13, 0.157);
        var gB0 = edgePt(B, sd, 0.05, 0.157), gB1 = edgePt(B, sd, 0.13, 0.157);
        quad(gold, gA0, gB0, gB1, gA1);
        /* the sidewalk, on the uphill side: from the curb's outer edge */
        if (walkSide === sd) {
          var wA0 = edgePt(A, sd, 0.32, 0.14), wA1 = edgePt(A, sd, 1.95, 0.14);
          var wB0 = edgePt(B, sd, 0.32, 0.14), wB1 = edgePt(B, sd, 1.95, 0.14);
          quad(walk, wA0, wB0, wB1, wA1); standQuad(stand, wA0, wB0, wB1, wA1);
        }
        if (walkSide === sd) { out0 = 1.95; lift0 = 0.14; }
        } /* end street furniture */
        /* the skirt, and on the falling side THE BANK: from the built
         * edge a face at repose (0.55) marches outward until it meets
         * the land and tucks under it. It does not chase a cliff to
         * the bottom — a bank that meets the face and stops is the
         * bench's own line across the mountain, the line visible in
         * the King's photographs. On the rising side the same march
         * ends at once: the face there is the cut bank, standing at
         * the shoulder. */
        var eA = edgePt(A, sd, out0, lift0), eB = edgePt(B, sd, out0, lift0);
        var sk = sd < 0 ? skirtL : skirtR;
        var dCache = sd < 0 ? drapeCacheL : drapeCacheR;
        if (!dCache[i]) dCache[i] = drapeFrom(eA, A.rx * sd, A.rz * sd);
        if (!dCache[i + 1]) dCache[i + 1] = drapeFrom(eB, B.rx * sd, B.rz * sd);
        var pA = dCache[i].pts, pB = dCache[i + 1].pts;
        for (var dk = 0; dk < pA.length - 1; dk++) {
          quad(sk, pA[dk], pB[dk], pB[dk + 1], pA[dk + 1], [sd * A.rx, sd * A.rz]);
          quad(sk, pB[dk], pA[dk], pA[dk + 1], pB[dk + 1], [sd * A.rx, sd * A.rz]);   // both faces: a bank is read from either side
        }
        var dropA = eA[1] - pA[pA.length - 1][1], riseA = pA[pA.length - 1][1] - eA[1];
        if (sd < 0 && Math.max(dropA, riseA) > stats.maxSkirtL) stats.maxSkirtL = Math.max(dropA, riseA);
        if (sd > 0 && Math.max(dropA, riseA) > stats.maxSkirtR) stats.maxSkirtR = Math.max(dropA, riseA);
        if (sd === upSide) { if (riseA > stats.cutBank) stats.cutBank = riseA; }
        else { if (dropA > stats.bank) stats.bank = dropA; if (!dCache[i].met) stats.bankUnmet++; }
      }
    }
    /* arrival fans at both ends. A fan is not a flat disc dropped on
     * the ramp's end — the first drive-through caught that step
     * (0.9 m at the seam). The fan is the road's own PLANE extended:
     * each rim vertex carries the end grade along the road's axis
     * and the end bank across it, so ribb