<!-- SOLID CITY · part 3426 -->
LY AGAIN</button></div>
  </div>
</div>

<script>
/* loader: fetch the game bundle with a real progress bar, then run it (same URL, cached). No inline game code. */
(function () {
  var V = '__V__', SIZE = __SIZE__, SRC = '/city/space/space.min.js?v=' + V;
  var bar = document.getElementById('load-bar'), msg = document.getElementById('load-msg'), jump = document.getElementById('jump');
  var touch = ('ontouchstart' in window) || navigator.maxTouchPoints > 0;
  var from = new URLSearchParams(location.search).get('from'), at = from === 'wormhole' ? 'wormhole' : 'hangar';
  ['load-back', 'h-exit', 'r-city'].forEach(function (id) { document.getElementById(id).href = '/city/?auto&at=' + at; });
  document.getElementById('keys').textContent = touch ? 'Stick steers · hold FIRE · BOOST for 760 km/h' : 'WASD / arrows or mouse aim · Space or click = fire · Shift = boost · M = mouse aim on/off';
  var cs = document.getElementById('callsign'); try { cs.value = localStorage.getItem('space-callsign') || ''; } catch (e) {}
  window.__spaceLoad = function (p, label) { bar.style.width = Math.round(p * 100) + '%'; if (label) msg.textContent = label; if (p >= 1 && !/^Error/.test(label || '')) { msg.textContent = 'Ready for launch'; jump.disabled = false; } };
  jump.addEventListener('click', function () {
    var v = (cs.value || '').toUpperCase().replace(/[^A-Z0-9 ._-]/g, '').trim().slice(0, 16); try { localStorage.setItem('space-callsign', v); } catch (e) {}
    document.getElementById('load').hidden = true; if (window.__spaceStart) window.__spaceStart();
  });
  function run() { var s = document.createElement('script'); s.type = 'module'; s.src = SRC; s.crossOrigin = 'anonymous'; s.onerror = function () { msg.textContent = 'Could not load the game. Check your connection and reload.'; }; document.body.appendChild(s); }
  try {
    fetch(SRC, { credentials: 'same-origin' }).then(function (r) {
      if (!r.body || !r.body.getReader) { window.__spaceLoad(0.5, 'Loading the engine…'); return r.text().then(run); }
      var rd = r.body.getReader(), got = 0;
      function pump() { return rd.read().then(function (x) { if (x.done) { window.__spaceLoad(0.6, 'Starting the engine…'); run(); return; } got += x.value.length; window.__spaceLoad(Math.min(0.58, got / SIZE * 0.58), 'Loading the engine… ' + Math.round(Math.min(1, got / SIZE) * 100) + '%'); return pump(); }); }
      return pump();
    }).catch(run);
  } catch (e) { run(); }
})();
</script>
</body>
</html>


===== FILE: public/city/spaceport-place.js =====
/* Solid City — places the SPATIAL INTELLIGENCE corrections at the Orbital Spaceport
   (public/city/spaceport.js). The Spaceport is the reference environment for the King's
   Spatial Intelligence Directive (2026-10-12): audited circulation, reserved corridors,
   an eye-level arrivals pylon, pads you actually stand on — validated live at build time.
   Lazy: imported after the city is built; any error is caught and the city carries on.
   Nothing existing is moved or removed; every addition is registered + validated. */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var POS = { x: A.PAD.x, z: A.PAD.z };
var M = { state: 'idle', group: null, wait: 5.0, gy: A.CITY_Y, report: null };
function addBox(cx, cz, w, d, rot, y0, y1) {
  var nx = Math.max(1, Math.ceil(w / 2.5)), nz = Math.max(1, Math.ceil(d / 2.5)), cw = w / nx, cd = d / nz, c = Math.cos(rot), s = Math.sin(rot);
  var hx = cw / 2 * Math.abs(c) + cd / 2 * Math.abs(s), hz = cw / 2 * Math.abs(s) + cd / 2 * Math.abs(c);
  for (var i = 0; i < nx; i++) for (var j = 0; j < nz; j++) {
    var ox = -w / 2 + cw * (i + 0.5), oz = -d / 2 + cd * (j + 0.5), lx = cx + ox * c + oz * s, lz = cz - ox * s + oz * c;
    A.solids.push({ x0: POS.x + lx - hx, x1: POS.x + lx + hx, z0: POS.z + lz - hz, z1: POS.z + lz + hz, y0: M.gy + y0, y1: M.gy + y1, spaceport: true });
  }
}
function collide(ud) { (ud.footprint || []).forEach(function (b) { addBox(b[0], b[1], b[2], b[3], b[6] || 0, b[4], b[5]); }); }
/* Directive section 7: run the static spatial checks against the LIVE layout
   (core city solids + every module loaded so far + this module's own footprints). */
function validate() {
  if (M.state !== 'ready' || !M.group) return { pass: false, results: [{ name: 'state', ok: false, detail: 'not built' }] };
  var ud = M.group.userData, kit = ud.spatialKit;
  var spec = ud.validateSpec(POS);
  spec.ownFootprints = (ud.footprint || []).map(function (b) {
    return [POS.x + b[0], POS.z + b[1], b[2], b[3], b[4], b[5], b[6] || 0];
  });
  M.report = kit.validateLayout(A.solids, spec, M.gy);
  return M.report;
}
function load() {
  M.state = 'loading';
  var modP; try { modP = import('/city/spaceport.js?v=20261012b'); } catch (e) { modP = Promise.reject(e); }
  modP.then(function (mod) {
    var make = mod.createSpaceport || mod.default;
    var grp = make({ THREE: A.T, curve: A.curve, labelTex: A.labelTex });
    grp.p