{"version":3,"sources":["jsdelivr-header.js","/npm/@tscircuit/curvy-trace-solver@0.0.11/dist/index.js"],"names":[],"mappings":"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","file":"/npm/@tscircuit/curvy-trace-solver@0.0.11/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@tscircuit/curvy-trace-solver@0.0.11/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod) => function __require() {\n  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\n\n// node_modules/is-buffer/index.js\nvar require_is_buffer = __commonJS({\n  \"node_modules/is-buffer/index.js\"(exports, module) {\n    \"use strict\";\n    module.exports = function(obj) {\n      return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer);\n    };\n    function isBuffer(obj) {\n      return !!obj.constructor && typeof obj.constructor.isBuffer === \"function\" && obj.constructor.isBuffer(obj);\n    }\n    function isSlowBuffer(obj) {\n      return typeof obj.readFloatLE === \"function\" && typeof obj.slice === \"function\" && isBuffer(obj.slice(0, 0));\n    }\n  }\n});\n\n// node_modules/kind-of/index.js\nvar require_kind_of = __commonJS({\n  \"node_modules/kind-of/index.js\"(exports, module) {\n    \"use strict\";\n    var isBuffer = require_is_buffer();\n    var toString = Object.prototype.toString;\n    module.exports = function kindOf(val) {\n      if (typeof val === \"undefined\") {\n        return \"undefined\";\n      }\n      if (val === null) {\n        return \"null\";\n      }\n      if (val === true || val === false || val instanceof Boolean) {\n        return \"boolean\";\n      }\n      if (typeof val === \"string\" || val instanceof String) {\n        return \"string\";\n      }\n      if (typeof val === \"number\" || val instanceof Number) {\n        return \"number\";\n      }\n      if (typeof val === \"function\" || val instanceof Function) {\n        return \"function\";\n      }\n      if (typeof Array.isArray !== \"undefined\" && Array.isArray(val)) {\n        return \"array\";\n      }\n      if (val instanceof RegExp) {\n        return \"regexp\";\n      }\n      if (val instanceof Date) {\n        return \"date\";\n      }\n      var type = toString.call(val);\n      if (type === \"[object RegExp]\") {\n        return \"regexp\";\n      }\n      if (type === \"[object Date]\") {\n        return \"date\";\n      }\n      if (type === \"[object Arguments]\") {\n        return \"arguments\";\n      }\n      if (type === \"[object Error]\") {\n        return \"error\";\n      }\n      if (isBuffer(val)) {\n        return \"buffer\";\n      }\n      if (type === \"[object Set]\") {\n        return \"set\";\n      }\n      if (type === \"[object WeakSet]\") {\n        return \"weakset\";\n      }\n      if (type === \"[object Map]\") {\n        return \"map\";\n      }\n      if (type === \"[object WeakMap]\") {\n        return \"weakmap\";\n      }\n      if (type === \"[object Symbol]\") {\n        return \"symbol\";\n      }\n      if (type === \"[object Int8Array]\") {\n        return \"int8array\";\n      }\n      if (type === \"[object Uint8Array]\") {\n        return \"uint8array\";\n      }\n      if (type === \"[object Uint8ClampedArray]\") {\n        return \"uint8clampedarray\";\n      }\n      if (type === \"[object Int16Array]\") {\n        return \"int16array\";\n      }\n      if (type === \"[object Uint16Array]\") {\n        return \"uint16array\";\n      }\n      if (type === \"[object Int32Array]\") {\n        return \"int32array\";\n      }\n      if (type === \"[object Uint32Array]\") {\n        return \"uint32array\";\n      }\n      if (type === \"[object Float32Array]\") {\n        return \"float32array\";\n      }\n      if (type === \"[object Float64Array]\") {\n        return \"float64array\";\n      }\n      return \"object\";\n    };\n  }\n});\n\n// node_modules/rename-keys/index.js\nvar require_rename_keys = __commonJS({\n  \"node_modules/rename-keys/index.js\"(exports, module) {\n    \"use strict\";\n    (function() {\n      \"use strict\";\n      function rename2(obj, fn) {\n        if (typeof fn !== \"function\") {\n          return obj;\n        }\n        var res = {};\n        for (var key in obj) {\n          if (Object.prototype.hasOwnProperty.call(obj, key)) {\n            res[fn(key, obj[key]) || key] = obj[key];\n          }\n        }\n        return res;\n      }\n      if (typeof module !== \"undefined\" && module.exports) {\n        module.exports = rename2;\n      } else {\n        if (typeof define === \"function\" && define.amd) {\n          define([], function() {\n            return rename2;\n          });\n        } else {\n          window.rename = rename2;\n        }\n      }\n    })();\n  }\n});\n\n// node_modules/deep-rename-keys/index.js\nvar require_deep_rename_keys = __commonJS({\n  \"node_modules/deep-rename-keys/index.js\"(exports, module) {\n    \"use strict\";\n    var typeOf = require_kind_of();\n    var rename2 = require_rename_keys();\n    module.exports = function renameDeep(obj, cb) {\n      var type = typeOf(obj);\n      if (type !== \"object\" && type !== \"array\") {\n        throw new Error(\"expected an object\");\n      }\n      var res = [];\n      if (type === \"object\") {\n        obj = rename2(obj, cb);\n        res = {};\n      }\n      for (var key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          var val = obj[key];\n          if (typeOf(val) === \"object\" || typeOf(val) === \"array\") {\n            res[key] = renameDeep(val, cb);\n          } else {\n            res[key] = val;\n          }\n        }\n      }\n      return res;\n    };\n  }\n});\n\n// node_modules/eventemitter3/index.js\nvar require_eventemitter3 = __commonJS({\n  \"node_modules/eventemitter3/index.js\"(exports, module) {\n    \"use strict\";\n    var has = Object.prototype.hasOwnProperty;\n    var prefix = \"~\";\n    function Events() {\n    }\n    if (Object.create) {\n      Events.prototype = /* @__PURE__ */ Object.create(null);\n      if (!new Events().__proto__) prefix = false;\n    }\n    function EE(fn, context, once) {\n      this.fn = fn;\n      this.context = context;\n      this.once = once || false;\n    }\n    function EventEmitter() {\n      this._events = new Events();\n      this._eventsCount = 0;\n    }\n    EventEmitter.prototype.eventNames = function eventNames() {\n      var names = [], events, name;\n      if (this._eventsCount === 0) return names;\n      for (name in events = this._events) {\n        if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n      }\n      if (Object.getOwnPropertySymbols) {\n        return names.concat(Object.getOwnPropertySymbols(events));\n      }\n      return names;\n    };\n    EventEmitter.prototype.listeners = function listeners(event, exists) {\n      var evt = prefix ? prefix + event : event, available = this._events[evt];\n      if (exists) return !!available;\n      if (!available) return [];\n      if (available.fn) return [available.fn];\n      for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n        ee[i] = available[i].fn;\n      }\n      return ee;\n    };\n    EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n      var evt = prefix ? prefix + event : event;\n      if (!this._events[evt]) return false;\n      var listeners = this._events[evt], len = arguments.length, args, i;\n      if (listeners.fn) {\n        if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);\n        switch (len) {\n          case 1:\n            return listeners.fn.call(listeners.context), true;\n          case 2:\n            return listeners.fn.call(listeners.context, a1), true;\n          case 3:\n            return listeners.fn.call(listeners.context, a1, a2), true;\n          case 4:\n            return listeners.fn.call(listeners.context, a1, a2, a3), true;\n          case 5:\n            return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n          case 6:\n            return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n        }\n        for (i = 1, args = new Array(len - 1); i < len; i++) {\n          args[i - 1] = arguments[i];\n        }\n        listeners.fn.apply(listeners.context, args);\n      } else {\n        var length = listeners.length, j;\n        for (i = 0; i < length; i++) {\n          if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);\n          switch (len) {\n            case 1:\n              listeners[i].fn.call(listeners[i].context);\n              break;\n            case 2:\n              listeners[i].fn.call(listeners[i].context, a1);\n              break;\n            case 3:\n              listeners[i].fn.call(listeners[i].context, a1, a2);\n              break;\n            case 4:\n              listeners[i].fn.call(listeners[i].context, a1, a2, a3);\n              break;\n            default:\n              if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {\n                args[j - 1] = arguments[j];\n              }\n              listeners[i].fn.apply(listeners[i].context, args);\n          }\n        }\n      }\n      return true;\n    };\n    EventEmitter.prototype.on = function on(event, fn, context) {\n      var listener = new EE(fn, context || this), evt = prefix ? prefix + event : event;\n      if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n      else if (!this._events[evt].fn) this._events[evt].push(listener);\n      else this._events[evt] = [this._events[evt], listener];\n      return this;\n    };\n    EventEmitter.prototype.once = function once(event, fn, context) {\n      var listener = new EE(fn, context || this, true), evt = prefix ? prefix + event : event;\n      if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n      else if (!this._events[evt].fn) this._events[evt].push(listener);\n      else this._events[evt] = [this._events[evt], listener];\n      return this;\n    };\n    EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n      var evt = prefix ? prefix + event : event;\n      if (!this._events[evt]) return this;\n      if (!fn) {\n        if (--this._eventsCount === 0) this._events = new Events();\n        else delete this._events[evt];\n        return this;\n      }\n      var listeners = this._events[evt];\n      if (listeners.fn) {\n        if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {\n          if (--this._eventsCount === 0) this._events = new Events();\n          else delete this._events[evt];\n        }\n      } else {\n        for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n          if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {\n            events.push(listeners[i]);\n          }\n        }\n        if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n        else if (--this._eventsCount === 0) this._events = new Events();\n        else delete this._events[evt];\n      }\n      return this;\n    };\n    EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n      var evt;\n      if (event) {\n        evt = prefix ? prefix + event : event;\n        if (this._events[evt]) {\n          if (--this._eventsCount === 0) this._events = new Events();\n          else delete this._events[evt];\n        }\n      } else {\n        this._events = new Events();\n        this._eventsCount = 0;\n      }\n      return this;\n    };\n    EventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n    EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n    EventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n      return this;\n    };\n    EventEmitter.prefixed = prefix;\n    EventEmitter.EventEmitter = EventEmitter;\n    if (\"undefined\" !== typeof module) {\n      module.exports = EventEmitter;\n    }\n  }\n});\n\n// node_modules/xml-lexer/dist/lexer.js\nvar require_lexer = __commonJS({\n  \"node_modules/xml-lexer/dist/lexer.js\"(exports, module) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n      if (key in obj) {\n        Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });\n      } else {\n        obj[key] = value;\n      }\n      return obj;\n    }\n    var EventEmitter = require_eventemitter3();\n    var noop = function noop2() {\n    };\n    var State = {\n      data: \"state-data\",\n      cdata: \"state-cdata\",\n      tagBegin: \"state-tag-begin\",\n      tagName: \"state-tag-name\",\n      tagEnd: \"state-tag-end\",\n      attributeNameStart: \"state-attribute-name-start\",\n      attributeName: \"state-attribute-name\",\n      attributeNameEnd: \"state-attribute-name-end\",\n      attributeValueBegin: \"state-attribute-value-begin\",\n      attributeValue: \"state-attribute-value\"\n    };\n    var Action = {\n      lt: \"action-lt\",\n      gt: \"action-gt\",\n      space: \"action-space\",\n      equal: \"action-equal\",\n      quote: \"action-quote\",\n      slash: \"action-slash\",\n      char: \"action-char\",\n      error: \"action-error\"\n    };\n    var Type = {\n      text: \"text\",\n      openTag: \"open-tag\",\n      closeTag: \"close-tag\",\n      attributeName: \"attribute-name\",\n      attributeValue: \"attribute-value\"\n    };\n    var charToAction = {\n      \" \": Action.space,\n      \"\t\": Action.space,\n      \"\\n\": Action.space,\n      \"\\r\": Action.space,\n      \"<\": Action.lt,\n      \">\": Action.gt,\n      '\"': Action.quote,\n      \"'\": Action.quote,\n      \"=\": Action.equal,\n      \"/\": Action.slash\n    };\n    var getAction = function getAction2(char) {\n      return charToAction[char] || Action.char;\n    };\n    var create = function create2(options) {\n      var _State$data, _State$tagBegin, _State$tagName, _State$tagEnd, _State$attributeNameS, _State$attributeName, _State$attributeNameE, _State$attributeValue, _State$attributeValue2, _lexer$stateMachine;\n      options = Object.assign({ debug: false }, options);\n      var lexer = new EventEmitter();\n      var state = State.data;\n      var data = \"\";\n      var tagName = \"\";\n      var attrName = \"\";\n      var attrValue = \"\";\n      var isClosing = \"\";\n      var openingQuote = \"\";\n      var emit = function emit2(type, value) {\n        if (tagName[0] === \"?\" || tagName[0] === \"!\") {\n          return;\n        }\n        var event = { type, value };\n        if (options.debug) {\n          console.log(\"emit:\", event);\n        }\n        lexer.emit(\"data\", event);\n      };\n      lexer.stateMachine = (_lexer$stateMachine = {}, _defineProperty(_lexer$stateMachine, State.data, (_State$data = {}, _defineProperty(_State$data, Action.lt, function() {\n        if (data.trim()) {\n          emit(Type.text, data);\n        }\n        tagName = \"\";\n        isClosing = false;\n        state = State.tagBegin;\n      }), _defineProperty(_State$data, Action.char, function(char) {\n        data += char;\n      }), _State$data)), _defineProperty(_lexer$stateMachine, State.cdata, _defineProperty({}, Action.char, function(char) {\n        data += char;\n        if (data.substr(-3) === \"]]>\") {\n          emit(Type.text, data.slice(0, -3));\n          data = \"\";\n          state = State.data;\n        }\n      })), _defineProperty(_lexer$stateMachine, State.tagBegin, (_State$tagBegin = {}, _defineProperty(_State$tagBegin, Action.space, noop), _defineProperty(_State$tagBegin, Action.char, function(char) {\n        tagName = char;\n        state = State.tagName;\n      }), _defineProperty(_State$tagBegin, Action.slash, function() {\n        tagName = \"\";\n        isClosing = true;\n      }), _State$tagBegin)), _defineProperty(_lexer$stateMachine, State.tagName, (_State$tagName = {}, _defineProperty(_State$tagName, Action.space, function() {\n        if (isClosing) {\n          state = State.tagEnd;\n        } else {\n          state = State.attributeNameStart;\n          emit(Type.openTag, tagName);\n        }\n      }), _defineProperty(_State$tagName, Action.gt, function() {\n        if (isClosing) {\n          emit(Type.closeTag, tagName);\n        } else {\n          emit(Type.openTag, tagName);\n        }\n        data = \"\";\n        state = State.data;\n      }), _defineProperty(_State$tagName, Action.slash, function() {\n        state = State.tagEnd;\n        emit(Type.openTag, tagName);\n      }), _defineProperty(_State$tagName, Action.char, function(char) {\n        tagName += char;\n        if (tagName === \"![CDATA[\") {\n          state = State.cdata;\n          data = \"\";\n          tagName = \"\";\n        }\n      }), _State$tagName)), _defineProperty(_lexer$stateMachine, State.tagEnd, (_State$tagEnd = {}, _defineProperty(_State$tagEnd, Action.gt, function() {\n        emit(Type.closeTag, tagName);\n        data = \"\";\n        state = State.data;\n      }), _defineProperty(_State$tagEnd, Action.char, noop), _State$tagEnd)), _defineProperty(_lexer$stateMachine, State.attributeNameStart, (_State$attributeNameS = {}, _defineProperty(_State$attributeNameS, Action.char, function(char) {\n        attrName = char;\n        state = State.attributeName;\n      }), _defineProperty(_State$attributeNameS, Action.gt, function() {\n        data = \"\";\n        state = State.data;\n      }), _defineProperty(_State$attributeNameS, Action.space, noop), _defineProperty(_State$attributeNameS, Action.slash, function() {\n        isClosing = true;\n        state = State.tagEnd;\n      }), _State$attributeNameS)), _defineProperty(_lexer$stateMachine, State.attributeName, (_State$attributeName = {}, _defineProperty(_State$attributeName, Action.space, function() {\n        state = State.attributeNameEnd;\n      }), _defineProperty(_State$attributeName, Action.equal, function() {\n        emit(Type.attributeName, attrName);\n        state = State.attributeValueBegin;\n      }), _defineProperty(_State$attributeName, Action.gt, function() {\n        attrValue = \"\";\n        emit(Type.attributeName, attrName);\n        emit(Type.attributeValue, attrValue);\n        data = \"\";\n        state = State.data;\n      }), _defineProperty(_State$attributeName, Action.slash, function() {\n        isClosing = true;\n        attrValue = \"\";\n        emit(Type.attributeName, attrName);\n        emit(Type.attributeValue, attrValue);\n        state = State.tagEnd;\n      }), _defineProperty(_State$attributeName, Action.char, function(char) {\n        attrName += char;\n      }), _State$attributeName)), _defineProperty(_lexer$stateMachine, State.attributeNameEnd, (_State$attributeNameE = {}, _defineProperty(_State$attributeNameE, Action.space, noop), _defineProperty(_State$attributeNameE, Action.equal, function() {\n        emit(Type.attributeName, attrName);\n        state = State.attributeValueBegin;\n      }), _defineProperty(_State$attributeNameE, Action.gt, function() {\n        attrValue = \"\";\n        emit(Type.attributeName, attrName);\n        emit(Type.attributeValue, attrValue);\n        data = \"\";\n        state = State.data;\n      }), _defineProperty(_State$attributeNameE, Action.char, function(char) {\n        attrValue = \"\";\n        emit(Type.attributeName, attrName);\n        emit(Type.attributeValue, attrValue);\n        attrName = char;\n        state = State.attributeName;\n      }), _State$attributeNameE)), _defineProperty(_lexer$stateMachine, State.attributeValueBegin, (_State$attributeValue = {}, _defineProperty(_State$attributeValue, Action.space, noop), _defineProperty(_State$attributeValue, Action.quote, function(char) {\n        openingQuote = char;\n        attrValue = \"\";\n        state = State.attributeValue;\n      }), _defineProperty(_State$attributeValue, Action.gt, function() {\n        attrValue = \"\";\n        emit(Type.attributeValue, attrValue);\n        data = \"\";\n        state = State.data;\n      }), _defineProperty(_State$attributeValue, Action.char, function(char) {\n        openingQuote = \"\";\n        attrValue = char;\n        state = State.attributeValue;\n      }), _State$attributeValue)), _defineProperty(_lexer$stateMachine, State.attributeValue, (_State$attributeValue2 = {}, _defineProperty(_State$attributeValue2, Action.space, function(char) {\n        if (openingQuote) {\n          attrValue += char;\n        } else {\n          emit(Type.attributeValue, attrValue);\n          state = State.attributeNameStart;\n        }\n      }), _defineProperty(_State$attributeValue2, Action.quote, function(char) {\n        if (openingQuote === char) {\n          emit(Type.attributeValue, attrValue);\n          state = State.attributeNameStart;\n        } else {\n          attrValue += char;\n        }\n      }), _defineProperty(_State$attributeValue2, Action.gt, function(char) {\n        if (openingQuote) {\n          attrValue += char;\n        } else {\n          emit(Type.attributeValue, attrValue);\n          data = \"\";\n          state = State.data;\n        }\n      }), _defineProperty(_State$attributeValue2, Action.slash, function(char) {\n        if (openingQuote) {\n          attrValue += char;\n        } else {\n          emit(Type.attributeValue, attrValue);\n          isClosing = true;\n          state = State.tagEnd;\n        }\n      }), _defineProperty(_State$attributeValue2, Action.char, function(char) {\n        attrValue += char;\n      }), _State$attributeValue2)), _lexer$stateMachine);\n      var step = function step2(char) {\n        if (options.debug) {\n          console.log(state, char);\n        }\n        var actions = lexer.stateMachine[state];\n        var action = actions[getAction(char)] || actions[Action.error] || actions[Action.char];\n        action(char);\n      };\n      lexer.write = function(str) {\n        var len = str.length;\n        for (var i = 0; i < len; i++) {\n          step(str[i]);\n        }\n      };\n      return lexer;\n    };\n    module.exports = {\n      State,\n      Action,\n      Type,\n      create\n    };\n  }\n});\n\n// node_modules/xml-reader/dist/reader.js\nvar require_reader = __commonJS({\n  \"node_modules/xml-reader/dist/reader.js\"(exports, module) {\n    \"use strict\";\n    var EventEmitter = require_eventemitter3();\n    var Lexer = require_lexer();\n    var Type = Lexer.Type;\n    var NodeType = {\n      element: \"element\",\n      text: \"text\"\n    };\n    var createNode = function createNode2(params) {\n      return Object.assign({\n        name: \"\",\n        type: NodeType.element,\n        value: \"\",\n        parent: null,\n        attributes: {},\n        children: []\n      }, params);\n    };\n    var create = function create2(options) {\n      options = Object.assign({\n        stream: false,\n        parentNodes: true,\n        doneEvent: \"done\",\n        tagPrefix: \"tag:\",\n        emitTopLevelOnly: false,\n        debug: false\n      }, options);\n      var lexer = void 0, rootNode = void 0, current = void 0, attrName = void 0;\n      var reader = new EventEmitter();\n      var handleLexerData = function handleLexerData2(data) {\n        switch (data.type) {\n          case Type.openTag:\n            if (current === null) {\n              current = rootNode;\n              current.name = data.value;\n            } else {\n              var node = createNode({\n                name: data.value,\n                parent: current\n              });\n              current.children.push(node);\n              current = node;\n            }\n            break;\n          case Type.closeTag:\n            var parent = current.parent;\n            if (!options.parentNodes) {\n              current.parent = null;\n            }\n            if (current.name !== data.value) {\n              break;\n            }\n            if (options.stream && parent === rootNode) {\n              rootNode.children = [];\n              current.parent = null;\n            }\n            if (!options.emitTopLevelOnly || parent === rootNode) {\n              reader.emit(options.tagPrefix + current.name, current);\n              reader.emit(\"tag\", current.name, current);\n            }\n            if (current === rootNode) {\n              lexer.removeAllListeners(\"data\");\n              reader.emit(options.doneEvent, current);\n              rootNode = null;\n            }\n            current = parent;\n            break;\n          case Type.text:\n            if (current) {\n              current.children.push(createNode({\n                type: NodeType.text,\n                value: data.value,\n                parent: options.parentNodes ? current : null\n              }));\n            }\n            break;\n          case Type.attributeName:\n            attrName = data.value;\n            current.attributes[attrName] = \"\";\n            break;\n          case Type.attributeValue:\n            current.attributes[attrName] = data.value;\n            break;\n        }\n      };\n      reader.reset = function() {\n        lexer = Lexer.create({ debug: options.debug });\n        lexer.on(\"data\", handleLexerData);\n        rootNode = createNode();\n        current = null;\n        attrName = \"\";\n        reader.parse = lexer.write;\n      };\n      reader.reset();\n      return reader;\n    };\n    var parseSync2 = function parseSync3(xml, options) {\n      options = Object.assign({}, options, { stream: false, tagPrefix: \":\" });\n      var reader = create(options);\n      var res = void 0;\n      reader.on(\"done\", function(ast) {\n        res = ast;\n      });\n      reader.parse(xml);\n      return res;\n    };\n    module.exports = {\n      parseSync: parseSync2,\n      create,\n      NodeType\n    };\n  }\n});\n\n// node_modules/transformation-matrix/src/rotate.js\nvar { cos, sin, PI } = Math;\n\n// node_modules/transformation-matrix/src/skew.js\nvar { tan } = Math;\n\n// node_modules/svgson/dist/svgson.esm.js\nvar import_deep_rename_keys = __toESM(require_deep_rename_keys());\nvar import_xml_reader = __toESM(require_reader());\n\n// node_modules/@tscircuit/solver-utils/dist/index.js\nvar BaseSolver = class {\n  MAX_ITERATIONS = 1e5;\n  solved = false;\n  failed = false;\n  iterations = 0;\n  progress = 0;\n  error = null;\n  activeSubSolver;\n  failedSubSolvers;\n  timeToSolve;\n  stats = {};\n  _setupDone = false;\n  setup() {\n    if (this._setupDone) return;\n    this._setup();\n    this._setupDone = true;\n  }\n  /** Override this method to perform setup logic */\n  _setup() {\n  }\n  /** DO NOT OVERRIDE! Override _step() instead */\n  step() {\n    if (!this._setupDone) {\n      this.setup();\n    }\n    if (this.solved) return;\n    if (this.failed) return;\n    this.iterations++;\n    try {\n      this._step();\n    } catch (e) {\n      this.error = `${this.constructor.name} error: ${e}`;\n      this.failed = true;\n      throw e;\n    }\n    if (!this.solved && this.iterations >= this.MAX_ITERATIONS) {\n      this.tryFinalAcceptance();\n    }\n    if (!this.solved && this.iterations >= this.MAX_ITERATIONS) {\n      this.error = `${this.constructor.name} ran out of iterations`;\n      this.failed = true;\n    }\n    if (\"computeProgress\" in this) {\n      this.progress = this.computeProgress();\n    }\n  }\n  /** Override this method to implement solver logic */\n  _step() {\n  }\n  getConstructorParams() {\n    throw new Error(\"getConstructorParams not implemented\");\n  }\n  /**\n   * Override this method to return the standardized output of the solver.\n   * This method should only be called after the solver has completed successfully.\n   * Returns null by default - solvers with outputs should override this method.\n   */\n  getOutput() {\n    return null;\n  }\n  solve() {\n    const startTime = Date.now();\n    while (!this.solved && !this.failed) {\n      this.step();\n    }\n    const endTime = Date.now();\n    this.timeToSolve = endTime - startTime;\n  }\n  visualize() {\n    return {\n      lines: [],\n      points: [],\n      rects: [],\n      circles: []\n    };\n  }\n  /**\n   * Called when the solver is about to fail, but we want to see if we have an\n   * \"acceptable\" or \"passable\" solution. Mostly used for optimizers that\n   * have an aggressive early stopping criterion.\n   */\n  tryFinalAcceptance() {\n  }\n  /**\n   * A lightweight version of the visualize method that can be used to stream\n   * progress\n   */\n  preview() {\n    return {\n      lines: [],\n      points: [],\n      rects: [],\n      circles: []\n    };\n  }\n};\n\n// lib/visualization-utils/visualizeCurvyTraceProblem.ts\nvar visualizeCurvyTraceProblem = (problem, outputTraces = []) => {\n  const graphics = {\n    arrows: [],\n    circles: [],\n    lines: [],\n    rects: [],\n    coordinateSystem: \"cartesian\",\n    points: [],\n    texts: [],\n    title: \"Curvy Trace Problem\"\n  };\n  graphics.lines.push({\n    points: [\n      { x: problem.bounds.minX, y: problem.bounds.minY },\n      { x: problem.bounds.maxX, y: problem.bounds.minY },\n      { x: problem.bounds.maxX, y: problem.bounds.maxY },\n      { x: problem.bounds.minX, y: problem.bounds.maxY },\n      { x: problem.bounds.minX, y: problem.bounds.minY }\n    ],\n    strokeColor: \"rgba(0, 0, 0, 0.1)\"\n  });\n  for (const waypointPair of problem.waypointPairs) {\n    graphics.points.push({\n      ...waypointPair.start,\n      label: `start ${waypointPair.networkId ?? \"\"}`,\n      color: getColorForNetworkId(waypointPair.networkId)\n    });\n    graphics.points.push({\n      ...waypointPair.end,\n      label: `end ${waypointPair.networkId ?? \"\"}`,\n      color: getColorForNetworkId(waypointPair.networkId)\n    });\n  }\n  for (const obstacle of problem.obstacles) {\n    graphics.rects.push({\n      center: obstacle.center,\n      width: obstacle.maxX - obstacle.minX,\n      height: obstacle.maxY - obstacle.minY,\n      fill: \"rgba(128, 128, 128, 0.3)\",\n      stroke: \"rgba(128, 128, 128, 0.8)\",\n      label: `netId: ${obstacle.networkId}`\n    });\n  }\n  for (const trace of outputTraces) {\n    graphics.lines.push({\n      points: trace.points,\n      strokeColor: getColorForNetworkId(trace.networkId)\n    });\n  }\n  return graphics;\n};\n\n// lib/visualization-utils/index.ts\nvar hashString = (str) => {\n  let hash = 0;\n  for (let i = 0; i < str.length; i++) {\n    hash = str.charCodeAt(i) * 779 + ((hash << 5) - hash);\n  }\n  return hash;\n};\nvar getColorForNetworkId = (networkId) => {\n  if (!networkId) return \"rgba(0, 0, 0, 0.5)\";\n  return `hsl(${hashString(networkId) % 360}, 100%, 50%)`;\n};\n\n// lib/geometry/getObstacleOuterSegments.ts\nvar getObstacleOuterSegments = (obstacle) => {\n  const segments = [\n    [\n      { x: obstacle.minX, y: obstacle.minY },\n      { x: obstacle.maxX, y: obstacle.minY }\n    ],\n    [\n      { x: obstacle.maxX, y: obstacle.minY },\n      { x: obstacle.maxX, y: obstacle.maxY }\n    ],\n    [\n      { x: obstacle.maxX, y: obstacle.maxY },\n      { x: obstacle.minX, y: obstacle.maxY }\n    ],\n    [\n      { x: obstacle.minX, y: obstacle.maxY },\n      { x: obstacle.minX, y: obstacle.minY }\n    ]\n  ];\n  return segments;\n};\n\n// lib/CurvyTraceSolver.ts\nfunction getPerimeterT(p, bounds) {\n  const { minX, maxX, minY, maxY } = bounds;\n  const W = maxX - minX;\n  const H = maxY - minY;\n  const eps = 1e-6;\n  if (Math.abs(p.y - maxY) < eps) return p.x - minX;\n  if (Math.abs(p.x - maxX) < eps) return W + (maxY - p.y);\n  if (Math.abs(p.y - minY) < eps) return W + H + (maxX - p.x);\n  if (Math.abs(p.x - minX) < eps) return 2 * W + H + (p.y - minY);\n  return 0;\n}\nfunction getInwardPerpendicular(p, bounds) {\n  const { minX, maxX, minY, maxY } = bounds;\n  const eps = 1e-6;\n  const onTop = Math.abs(p.y - maxY) < eps;\n  const onBottom = Math.abs(p.y - minY) < eps;\n  const onRight = Math.abs(p.x - maxX) < eps;\n  const onLeft = Math.abs(p.x - minX) < eps;\n  if (onTop && onRight) return { x: -Math.SQRT1_2, y: -Math.SQRT1_2 };\n  if (onTop && onLeft) return { x: Math.SQRT1_2, y: -Math.SQRT1_2 };\n  if (onBottom && onRight) return { x: -Math.SQRT1_2, y: Math.SQRT1_2 };\n  if (onBottom && onLeft) return { x: Math.SQRT1_2, y: Math.SQRT1_2 };\n  if (onTop) return { x: 0, y: -1 };\n  if (onBottom) return { x: 0, y: 1 };\n  if (onRight) return { x: -1, y: 0 };\n  if (onLeft) return { x: 1, y: 0 };\n  const cx = (minX + maxX) / 2;\n  const cy = (minY + maxY) / 2;\n  const dx = cx - p.x;\n  const dy = cy - p.y;\n  const len = Math.hypot(dx, dy);\n  return len > 0 ? { x: dx / len, y: dy / len } : { x: 0, y: -1 };\n}\nfunction sampleCubicBezierInline(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, points, numSamples) {\n  for (let i = 0; i <= numSamples; i++) {\n    const t = i / numSamples;\n    const mt = 1 - t;\n    const mt2 = mt * mt;\n    const mt3 = mt2 * mt;\n    const t2 = t * t;\n    const t3 = t2 * t;\n    const idx = i * 2;\n    points[idx] = mt3 * p0x + 3 * mt2 * t * p1x + 3 * mt * t2 * p2x + t3 * p3x;\n    points[idx + 1] = mt3 * p0y + 3 * mt2 * t * p1y + 3 * mt * t2 * p2y + t3 * p3y;\n  }\n}\nfunction sampleCubicBezier(p0, p1, p2, p3, numSamples) {\n  const points = [];\n  for (let i = 0; i <= numSamples; i++) {\n    const t = i / numSamples;\n    const mt = 1 - t;\n    const mt2 = mt * mt;\n    const mt3 = mt2 * mt;\n    const t2 = t * t;\n    const t3 = t2 * t;\n    points.push({\n      x: mt3 * p0.x + 3 * mt2 * t * p1.x + 3 * mt * t2 * p2.x + t3 * p3.x,\n      y: mt3 * p0.y + 3 * mt2 * t * p1.y + 3 * mt * t2 * p2.y + t3 * p3.y\n    });\n  }\n  return points;\n}\nfunction ptSegDistSq(px, py, sx, sy, ex, ey) {\n  const dx = ex - sx;\n  const dy = ey - sy;\n  const lenSq = dx * dx + dy * dy;\n  if (lenSq === 0) {\n    const dpx2 = px - sx;\n    const dpy2 = py - sy;\n    return dpx2 * dpx2 + dpy2 * dpy2;\n  }\n  const t = Math.max(0, Math.min(1, ((px - sx) * dx + (py - sy) * dy) / lenSq));\n  const projX = sx + t * dx;\n  const projY = sy + t * dy;\n  const dpx = px - projX;\n  const dpy = py - projY;\n  return dpx * dpx + dpy * dpy;\n}\nfunction segmentDistSq(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n  const d1 = (b2x - b1x) * (a1y - b1y) - (b2y - b1y) * (a1x - b1x);\n  const d2 = (b2x - b1x) * (a2y - b1y) - (b2y - b1y) * (a2x - b1x);\n  const d3 = (a2x - a1x) * (b1y - a1y) - (a2y - a1y) * (b1x - a1x);\n  const d4 = (a2x - a1x) * (b2y - a1y) - (a2y - a1y) * (b2x - a1x);\n  if ((d1 > 0 && d2 < 0 || d1 < 0 && d2 > 0) && (d3 > 0 && d4 < 0 || d3 < 0 && d4 > 0)) {\n    return 0;\n  }\n  return Math.min(\n    ptSegDistSq(a1x, a1y, b1x, b1y, b2x, b2y),\n    ptSegDistSq(a2x, a2y, b1x, b1y, b2x, b2y),\n    ptSegDistSq(b1x, b1y, a1x, a1y, a2x, a2y),\n    ptSegDistSq(b2x, b2y, a1x, a1y, a2x, a2y)\n  );\n}\nfunction segmentsIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n  const d1 = (b2x - b1x) * (a1y - b1y) - (b2y - b1y) * (a1x - b1x);\n  const d2 = (b2x - b1x) * (a2y - b1y) - (b2y - b1y) * (a2x - b1x);\n  const d3 = (a2x - a1x) * (b1y - a1y) - (a2y - a1y) * (b1x - a1x);\n  const d4 = (a2x - a1x) * (b2y - a1y) - (a2y - a1y) * (b2x - a1x);\n  return (d1 > 0 && d2 < 0 || d1 < 0 && d2 > 0) && (d3 > 0 && d4 < 0 || d3 < 0 && d4 > 0);\n}\nfunction chordContains(aT1, aT2, bT1, bT2, perimeter) {\n  const normalize = (t) => (t % perimeter + perimeter) % perimeter;\n  const a1 = normalize(aT1), a2 = normalize(aT2);\n  const b1 = normalize(bT1), b2 = normalize(bT2);\n  const [aMin, aMax] = a1 < a2 ? [a1, a2] : [a2, a1];\n  return b1 > aMin && b1 < aMax && b2 > aMin && b2 < aMax;\n}\nfunction getBoundsCenter(bounds) {\n  return {\n    x: (bounds.minX + bounds.maxX) / 2,\n    y: (bounds.minY + bounds.maxY) / 2\n  };\n}\nfunction computeTraceBounds(points, numPoints) {\n  let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n  for (let i = 0; i < numPoints; i++) {\n    const x = points[i * 2], y = points[i * 2 + 1];\n    if (x < minX) minX = x;\n    if (x > maxX) maxX = x;\n    if (y < minY) minY = y;\n    if (y > maxY) maxY = y;\n  }\n  return { minX, maxX, minY, maxY };\n}\nvar OPT_SAMPLES = 5;\nvar OUTPUT_SAMPLES = 20;\nvar CurvyTraceSolver = class extends BaseSolver {\n  constructor(problem) {\n    super();\n    this.problem = problem;\n    for (const obstacle of this.problem.obstacles) {\n      obstacle.outerSegments = getObstacleOuterSegments(obstacle);\n    }\n    this.precomputeObstacles();\n  }\n  outputTraces = [];\n  traces = [];\n  optimizationStep = 0;\n  maxOptimizationSteps = 100;\n  // Typed arrays for faster sampling\n  sampledPoints = [];\n  traceBounds = [];\n  // Pre-computed obstacle segments as flat arrays\n  obstacleSegments = new Float64Array(0);\n  obstacleNetworkIds = [];\n  numObstacleSegments = 0;\n  // Collision pairs cache - which traces can possibly collide\n  collisionPairs = [];\n  lastCost = Infinity;\n  stagnantSteps = 0;\n  // Relaxation: start with higher spacing and decay towards actual preferred value\n  effectiveTraceToTraceSpacing = 0;\n  getConstructorParams() {\n    return this.problem;\n  }\n  precomputeObstacles() {\n    const { obstacles } = this.problem;\n    let totalSegments = 0;\n    for (const obs of obstacles) {\n      if (obs.outerSegments) totalSegments += obs.outerSegments.length;\n    }\n    this.obstacleSegments = new Float64Array(totalSegments * 4);\n    this.obstacleNetworkIds = [];\n    this.numObstacleSegments = totalSegments;\n    let idx = 0;\n    for (const obs of obstacles) {\n      if (obs.outerSegments) {\n        for (const seg of obs.outerSegments) {\n          this.obstacleSegments[idx++] = seg[0].x;\n          this.obstacleSegments[idx++] = seg[0].y;\n          this.obstacleSegments[idx++] = seg[1].x;\n          this.obstacleSegments[idx++] = seg[1].y;\n          this.obstacleNetworkIds.push(obs.networkId);\n        }\n      }\n    }\n  }\n  initializeTraces() {\n    const { bounds, waypointPairs } = this.problem;\n    const { minX, maxX, minY, maxY } = bounds;\n    const W = maxX - minX;\n    const H = maxY - minY;\n    const perimeter = 2 * W + 2 * H;\n    const center = getBoundsCenter(bounds);\n    const tracesWithT = waypointPairs.map((pair, idx) => ({\n      pair,\n      t1: getPerimeterT(pair.start, bounds),\n      t2: getPerimeterT(pair.end, bounds),\n      idx\n    }));\n    const containedBy = tracesWithT.map(() => []);\n    const contains = tracesWithT.map(() => []);\n    for (const trace of tracesWithT) {\n      for (const other of tracesWithT) {\n        if (trace.idx !== other.idx) {\n          if (trace.pair.networkId && other.pair.networkId && trace.pair.networkId === other.pair.networkId) {\n            continue;\n          }\n          if (chordContains(other.t1, other.t2, trace.t1, trace.t2, perimeter)) {\n            containedBy[trace.idx].push(other.idx);\n            contains[other.idx].push(trace.idx);\n          }\n        }\n      }\n    }\n    const nestingDepth = containedBy.map((arr) => arr.length);\n    const maxDepth = Math.max(...nestingDepth, 1);\n    this.traces = tracesWithT.map(({ pair, t1, t2, idx }) => {\n      const perpDir1 = getInwardPerpendicular(pair.start, bounds);\n      const perpDir2 = getInwardPerpendicular(pair.end, bounds);\n      const chordLength = Math.hypot(\n        pair.end.x - pair.start.x,\n        pair.end.y - pair.start.y\n      );\n      const depth = nestingDepth[idx];\n      const normalizedDepth = depth / maxDepth;\n      const midPoint = {\n        x: (pair.start.x + pair.end.x) / 2,\n        y: (pair.start.y + pair.end.y) / 2\n      };\n      const distToCenter = Math.hypot(\n        midPoint.x - center.x,\n        midPoint.y - center.y\n      );\n      const maxDist = Math.hypot(W / 2, H / 2);\n      const spatialDepth = 1 - distToCenter / maxDist;\n      const baseFactor = 0.25 + spatialDepth * 0.15;\n      const depthAdjustment = 1 - normalizedDepth * 0.3;\n      const initialDist = chordLength * baseFactor * depthAdjustment;\n      const minDist = Math.min(W, H) * 0.05;\n      const d1 = Math.max(minDist, initialDist);\n      const d2 = Math.max(minDist, initialDist);\n      const ctrl1 = {\n        x: pair.start.x + d1 * perpDir1.x,\n        y: pair.start.y + d1 * perpDir1.y\n      };\n      const ctrl2 = {\n        x: pair.end.x + d2 * perpDir2.x,\n        y: pair.end.y + d2 * perpDir2.y\n      };\n      return {\n        waypointPair: pair,\n        ctrl1,\n        ctrl2,\n        networkId: pair.networkId,\n        t1,\n        t2,\n        perpDir1,\n        perpDir2,\n        d1,\n        d2,\n        containedBy: containedBy[idx],\n        contains: contains[idx]\n      };\n    });\n    this.sampledPoints = this.traces.map(\n      () => new Float64Array((OPT_SAMPLES + 1) * 2)\n    );\n    this.traceBounds = this.traces.map(() => ({\n      minX: 0,\n      maxX: 0,\n      minY: 0,\n      maxY: 0\n    }));\n    this.updateSampledTraces();\n    this.updateCollisionPairs();\n  }\n  updateSampledTraces() {\n    for (let i = 0; i < this.traces.length; i++) {\n      const trace = this.traces[i];\n      sampleCubicBezierInline(\n        trace.waypointPair.start.x,\n        trace.waypointPair.start.y,\n        trace.ctrl1.x,\n        trace.ctrl1.y,\n        trace.ctrl2.x,\n        trace.ctrl2.y,\n        trace.waypointPair.end.x,\n        trace.waypointPair.end.y,\n        this.sampledPoints[i],\n        OPT_SAMPLES\n      );\n      this.traceBounds[i] = computeTraceBounds(\n        this.sampledPoints[i],\n        OPT_SAMPLES + 1\n      );\n    }\n  }\n  updateSingleTraceSample(i) {\n    const trace = this.traces[i];\n    sampleCubicBezierInline(\n      trace.waypointPair.start.x,\n      trace.waypointPair.start.y,\n      trace.ctrl1.x,\n      trace.ctrl1.y,\n      trace.ctrl2.x,\n      trace.ctrl2.y,\n      trace.waypointPair.end.x,\n      trace.waypointPair.end.y,\n      this.sampledPoints[i],\n      OPT_SAMPLES\n    );\n    this.traceBounds[i] = computeTraceBounds(\n      this.sampledPoints[i],\n      OPT_SAMPLES + 1\n    );\n  }\n  // Update control points from perpendicular distances\n  // Ensures control points don't go backwards through the edge the waypoint is on\n  updateControlPointsFromDistances(i) {\n    const trace = this.traces[i];\n    const { minX, maxX, minY, maxY } = this.problem.bounds;\n    const eps = 1e-6;\n    let ctrl1x = trace.waypointPair.start.x + trace.d1 * trace.perpDir1.x;\n    let ctrl1y = trace.waypointPair.start.y + trace.d1 * trace.perpDir1.y;\n    let ctrl2x = trace.waypointPair.end.x + trace.d2 * trace.perpDir2.x;\n    let ctrl2y = trace.waypointPair.end.y + trace.d2 * trace.perpDir2.y;\n    const start = trace.waypointPair.start;\n    if (Math.abs(start.x - minX) < eps) ctrl1x = Math.max(ctrl1x, minX);\n    if (Math.abs(start.x - maxX) < eps) ctrl1x = Math.min(ctrl1x, maxX);\n    if (Math.abs(start.y - minY) < eps) ctrl1y = Math.max(ctrl1y, minY);\n    if (Math.abs(start.y - maxY) < eps) ctrl1y = Math.min(ctrl1y, maxY);\n    const end = trace.waypointPair.end;\n    if (Math.abs(end.x - minX) < eps) ctrl2x = Math.max(ctrl2x, minX);\n    if (Math.abs(end.x - maxX) < eps) ctrl2x = Math.min(ctrl2x, maxX);\n    if (Math.abs(end.y - minY) < eps) ctrl2y = Math.max(ctrl2y, minY);\n    if (Math.abs(end.y - maxY) < eps) ctrl2y = Math.min(ctrl2y, maxY);\n    ctrl1x = Math.max(minX, Math.min(maxX, ctrl1x));\n    ctrl1y = Math.max(minY, Math.min(maxY, ctrl1y));\n    ctrl2x = Math.max(minX, Math.min(maxX, ctrl2x));\n    ctrl2y = Math.max(minY, Math.min(maxY, ctrl2y));\n    trace.ctrl1.x = ctrl1x;\n    trace.ctrl1.y = ctrl1y;\n    trace.ctrl2.x = ctrl2x;\n    trace.ctrl2.y = ctrl2y;\n  }\n  // Determine which trace pairs could possibly collide based on bounding boxes\n  updateCollisionPairs() {\n    const effectiveSpacing = this.effectiveTraceToTraceSpacing;\n    this.collisionPairs = [];\n    for (let i = 0; i < this.traces.length; i++) {\n      for (let j = i + 1; j < this.traces.length; j++) {\n        const ti = this.traces[i], tj = this.traces[j];\n        if (ti.networkId && tj.networkId && ti.networkId === tj.networkId)\n          continue;\n        const bi = this.traceBounds[i], bj = this.traceBounds[j];\n        if (bi.maxX + effectiveSpacing >= bj.minX && bj.maxX + effectiveSpacing >= bi.minX && bi.maxY + effectiveSpacing >= bj.minY && bj.maxY + effectiveSpacing >= bi.minY) {\n          this.collisionPairs.push([i, j]);\n        }\n      }\n    }\n  }\n  computeTotalCost() {\n    const { preferredObstacleToTraceSpacing } = this.problem;\n    const effectiveSpacing = this.effectiveTraceToTraceSpacing;\n    const traceSpacingSq = effectiveSpacing ** 2;\n    const obstacleSpacingSq = preferredObstacleToTraceSpacing ** 2;\n    let cost = 0;\n    for (const [i, j] of this.collisionPairs) {\n      const pi = this.sampledPoints[i], pj = this.sampledPoints[j];\n      for (let a = 0; a < OPT_SAMPLES; a++) {\n        const a1x = pi[a * 2], a1y = pi[a * 2 + 1];\n        const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];\n        for (let b = 0; b < OPT_SAMPLES; b++) {\n          const b1x = pj[b * 2], b1y = pj[b * 2 + 1];\n          const b2x = pj[(b + 1) * 2], b2y = pj[(b + 1) * 2 + 1];\n          const distSq = segmentDistSq(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y);\n          if (distSq < traceSpacingSq) {\n            const dist = Math.sqrt(distSq);\n            cost += (effectiveSpacing - dist) ** 2;\n            if (distSq < 1e-18) cost += 20 * traceSpacingSq;\n          }\n        }\n      }\n    }\n    for (let i = 0; i < this.traces.length; i++) {\n      const trace = this.traces[i];\n      const pi = this.sampledPoints[i];\n      const bi = this.traceBounds[i];\n      for (let obsIdx = 0; obsIdx < this.numObstacleSegments; obsIdx++) {\n        if (trace.networkId && this.obstacleNetworkIds[obsIdx] && trace.networkId === this.obstacleNetworkIds[obsIdx])\n          continue;\n        const obsBase = obsIdx * 4;\n        const ox1 = this.obstacleSegments[obsBase];\n        const oy1 = this.obstacleSegments[obsBase + 1];\n        const ox2 = this.obstacleSegments[obsBase + 2];\n        const oy2 = this.obstacleSegments[obsBase + 3];\n        const obsMinX = Math.min(ox1, ox2), obsMaxX = Math.max(ox1, ox2);\n        const obsMinY = Math.min(oy1, oy2), obsMaxY = Math.max(oy1, oy2);\n        if (bi.maxX + preferredObstacleToTraceSpacing < obsMinX || obsMaxX + preferredObstacleToTraceSpacing < bi.minX || bi.maxY + preferredObstacleToTraceSpacing < obsMinY || obsMaxY + preferredObstacleToTraceSpacing < bi.minY)\n          continue;\n        for (let a = 0; a < OPT_SAMPLES; a++) {\n          const a1x = pi[a * 2], a1y = pi[a * 2 + 1];\n          const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];\n          const distSq = segmentDistSq(a1x, a1y, a2x, a2y, ox1, oy1, ox2, oy2);\n          if (distSq < obstacleSpacingSq) {\n            const dist = Math.sqrt(distSq);\n            cost += (preferredObstacleToTraceSpacing - dist) ** 2;\n            if (distSq < 1e-18) cost += 20 * obstacleSpacingSq;\n          }\n        }\n      }\n    }\n    return cost;\n  }\n  computeCostForTrace(traceIdx) {\n    const { preferredObstacleToTraceSpacing } = this.problem;\n    const effectiveSpacing = this.effectiveTraceToTraceSpacing;\n    const traceSpacingSq = effectiveSpacing ** 2;\n    const obstacleSpacingSq = preferredObstacleToTraceSpacing ** 2;\n    const trace = this.traces[traceIdx];\n    const pi = this.sampledPoints[traceIdx];\n    const bi = this.traceBounds[traceIdx];\n    let cost = 0;\n    for (let j = 0; j < this.traces.length; j++) {\n      if (j === traceIdx) continue;\n      const other = this.traces[j];\n      if (trace.networkId && other.networkId && trace.networkId === other.networkId)\n        continue;\n      const bj = this.traceBounds[j];\n      if (bi.maxX + effectiveSpacing < bj.minX || bj.maxX + effectiveSpacing < bi.minX || bi.maxY + effectiveSpacing < bj.minY || bj.maxY + effectiveSpacing < bi.minY)\n        continue;\n      const pj = this.sampledPoints[j];\n      for (let a = 0; a < OPT_SAMPLES; a++) {\n        const a1x = pi[a * 2], a1y = pi[a * 2 + 1];\n        const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];\n        for (let b = 0; b < OPT_SAMPLES; b++) {\n          const b1x = pj[b * 2], b1y = pj[b * 2 + 1];\n          const b2x = pj[(b + 1) * 2], b2y = pj[(b + 1) * 2 + 1];\n          const distSq = segmentDistSq(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y);\n          if (distSq < traceSpacingSq) {\n            const dist = Math.sqrt(distSq);\n            cost += (effectiveSpacing - dist) ** 2;\n            if (distSq < 1e-18) cost += 20 * traceSpacingSq;\n          }\n        }\n      }\n    }\n    for (let obsIdx = 0; obsIdx < this.numObstacleSegments; obsIdx++) {\n      if (trace.networkId && this.obstacleNetworkIds[obsIdx] && trace.networkId === this.obstacleNetworkIds[obsIdx])\n        continue;\n      const obsBase = obsIdx * 4;\n      const ox1 = this.obstacleSegments[obsBase];\n      const oy1 = this.obstacleSegments[obsBase + 1];\n      const ox2 = this.obstacleSegments[obsBase + 2];\n      const oy2 = this.obstacleSegments[obsBase + 3];\n      const obsMinX = Math.min(ox1, ox2), obsMaxX = Math.max(ox1, ox2);\n      const obsMinY = Math.min(oy1, oy2), obsMaxY = Math.max(oy1, oy2);\n      if (bi.maxX + preferredObstacleToTraceSpacing < obsMinX || obsMaxX + preferredObstacleToTraceSpacing < bi.minX || bi.maxY + preferredObstacleToTraceSpacing < obsMinY || obsMaxY + preferredObstacleToTraceSpacing < bi.minY)\n        continue;\n      for (let a = 0; a < OPT_SAMPLES; a++) {\n        const a1x = pi[a * 2], a1y = pi[a * 2 + 1];\n        const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];\n        const distSq = segmentDistSq(a1x, a1y, a2x, a2y, ox1, oy1, ox2, oy2);\n        if (distSq < obstacleSpacingSq) {\n          const dist = Math.sqrt(distSq);\n          cost += (preferredObstacleToTraceSpacing - dist) ** 2;\n          if (distSq < 1e-18) cost += 20 * obstacleSpacingSq;\n        }\n      }\n    }\n    return cost;\n  }\n  // Check if two traces intersect or are very close (potential intersection)\n  // Uses higher resolution sampling for accuracy\n  tracesIntersect(i, j) {\n    const trace1 = this.traces[i];\n    const trace2 = this.traces[j];\n    const INTERSECT_SAMPLES = 15;\n    const p1 = new Float64Array((INTERSECT_SAMPLES + 1) * 2);\n    const p2 = new Float64Array((INTERSECT_SAMPLES + 1) * 2);\n    sampleCubicBezierInline(\n      trace1.waypointPair.start.x,\n      trace1.waypointPair.start.y,\n      trace1.ctrl1.x,\n      trace1.ctrl1.y,\n      trace1.ctrl2.x,\n      trace1.ctrl2.y,\n      trace1.waypointPair.end.x,\n      trace1.waypointPair.end.y,\n      p1,\n      INTERSECT_SAMPLES\n    );\n    sampleCubicBezierInline(\n      trace2.waypointPair.start.x,\n      trace2.waypointPair.start.y,\n      trace2.ctrl1.x,\n      trace2.ctrl1.y,\n      trace2.ctrl2.x,\n      trace2.ctrl2.y,\n      trace2.waypointPair.end.x,\n      trace2.waypointPair.end.y,\n      p2,\n      INTERSECT_SAMPLES\n    );\n    for (let a = 0; a < INTERSECT_SAMPLES; a++) {\n      const a1x = p1[a * 2];\n      const a1y = p1[a * 2 + 1];\n      const a2x = p1[(a + 1) * 2];\n      const a2y = p1[(a + 1) * 2 + 1];\n      for (let b = 0; b < INTERSECT_SAMPLES; b++) {\n        const b1x = p2[b * 2];\n        const b1y = p2[b * 2 + 1];\n        const b2x = p2[(b + 1) * 2];\n        const b2y = p2[(b + 1) * 2 + 1];\n        if (segmentsIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  // Find all pairs of traces that currently intersect\n  findIntersectingPairs() {\n    const intersecting = [];\n    for (let i = 0; i < this.traces.length; i++) {\n      for (let j = i + 1; j < this.traces.length; j++) {\n        const ti = this.traces[i];\n        const tj = this.traces[j];\n        if (ti.networkId && tj.networkId && ti.networkId === tj.networkId) {\n          continue;\n        }\n        const bi = this.traceBounds[i];\n        const bj = this.traceBounds[j];\n        if (bi.maxX < bj.minX || bj.maxX < bi.minX || bi.maxY < bj.minY || bj.maxY < bi.minY) {\n          continue;\n        }\n        if (this.tracesIntersect(i, j)) {\n          intersecting.push([i, j]);\n        }\n      }\n    }\n    return intersecting;\n  }\n  // Resolve intersections by separating traces in depth\n  // Only keeps changes if they improve overall cost\n  resolveIntersections() {\n    const { bounds, preferredTraceToTraceSpacing } = this.problem;\n    const { minX, maxX, minY, maxY } = bounds;\n    const minDim = Math.min(maxX - minX, maxY - minY);\n    const minDist = minDim * 0.02;\n    const maxDist = minDim * 1.5;\n    const intersecting = this.findIntersectingPairs();\n    if (intersecting.length === 0) return 0;\n    let resolved = 0;\n    for (const [i, j] of intersecting) {\n      const ti = this.traces[i];\n      const tj = this.traces[j];\n      if (!this.tracesIntersect(i, j)) continue;\n      let outerIdx;\n      let innerIdx;\n      if (ti.containedBy.includes(j)) {\n        outerIdx = j;\n        innerIdx = i;\n      } else if (tj.containedBy.includes(i)) {\n        outerIdx = i;\n        innerIdx = j;\n      } else {\n        const avgDi = (ti.d1 + ti.d2) / 2;\n        const avgDj = (tj.d1 + tj.d2) / 2;\n        if (avgDi < avgDj) {\n          outerIdx = i;\n          innerIdx = j;\n        } else {\n          outerIdx = j;\n          innerIdx = i;\n        }\n      }\n      const outerTrace = this.traces[outerIdx];\n      const innerTrace = this.traces[innerIdx];\n      const origOuterD1 = outerTrace.d1;\n      const origOuterD2 = outerTrace.d2;\n      const origInnerD1 = innerTrace.d1;\n      const origInnerD2 = innerTrace.d2;\n      const costBeforeThis = this.computeTotalCost();\n      const separation = preferredTraceToTraceSpacing * 2;\n      const strategies = [\n        // Strategy 1: Small increase for inner\n        { innerMult: 1, outerMult: 0 },\n        // Strategy 2: Small decrease for outer\n        { innerMult: 0, outerMult: 1 },\n        // Strategy 3: Both directions\n        { innerMult: 0.5, outerMult: 0.5 },\n        // Strategy 4: Larger increase for inner\n        { innerMult: 2, outerMult: 0 },\n        // Strategy 5: Both larger\n        { innerMult: 1, outerMult: 1 },\n        // More aggressive\n        { innerMult: 3, outerMult: 0 },\n        { innerMult: 2, outerMult: 1 },\n        { innerMult: 4, outerMult: 0 }\n      ];\n      let bestCost = costBeforeThis;\n      let bestStrategy = null;\n      for (const strategy of strategies) {\n        outerTrace.d1 = origOuterD1;\n        outerTrace.d2 = origOuterD2;\n        innerTrace.d1 = origInnerD1;\n        innerTrace.d2 = origInnerD2;\n        innerTrace.d1 = Math.min(\n          maxDist,\n          origInnerD1 + separation * strategy.innerMult\n        );\n        innerTrace.d2 = Math.min(\n          maxDist,\n          origInnerD2 + separation * strategy.innerMult\n        );\n        outerTrace.d1 = Math.max(\n          minDist,\n          origOuterD1 - separation * strategy.outerMult\n        );\n        outerTrace.d2 = Math.max(\n          minDist,\n          origOuterD2 - separation * strategy.outerMult\n        );\n        this.updateControlPointsFromDistances(innerIdx);\n        this.updateControlPointsFromDistances(outerIdx);\n        this.updateSingleTraceSample(innerIdx);\n        this.updateSingleTraceSample(outerIdx);\n        if (!this.tracesIntersect(outerIdx, innerIdx)) {\n          const newCost = this.computeTotalCost();\n          if (bestStrategy === null || newCost < bestCost) {\n            bestCost = newCost;\n            bestStrategy = strategy;\n          }\n        }\n      }\n      if (bestStrategy) {\n        innerTrace.d1 = Math.min(\n          maxDist,\n          origInnerD1 + separation * bestStrategy.innerMult\n        );\n        innerTrace.d2 = Math.min(\n          maxDist,\n          origInnerD2 + separation * bestStrategy.innerMult\n        );\n        outerTrace.d1 = Math.max(\n          minDist,\n          origOuterD1 - separation * bestStrategy.outerMult\n        );\n        outerTrace.d2 = Math.max(\n          minDist,\n          origOuterD2 - separation * bestStrategy.outerMult\n        );\n        this.updateControlPointsFromDistances(innerIdx);\n        this.updateControlPointsFromDistances(outerIdx);\n        this.updateSingleTraceSample(innerIdx);\n        this.updateSingleTraceSample(outerIdx);\n        resolved++;\n      } else {\n        outerTrace.d1 = origOuterD1;\n        outerTrace.d2 = origOuterD2;\n        innerTrace.d1 = origInnerD1;\n        innerTrace.d2 = origInnerD2;\n        this.updateControlPointsFromDistances(outerIdx);\n        this.updateControlPointsFromDistances(innerIdx);\n        this.updateSingleTraceSample(outerIdx);\n        this.updateSingleTraceSample(innerIdx);\n      }\n    }\n    return resolved;\n  }\n  optimizeStep() {\n    const { bounds } = this.problem;\n    const { minX, maxX, minY, maxY } = bounds;\n    const minDim = Math.min(maxX - minX, maxY - minY);\n    const effectiveSpacing = this.effectiveTraceToTraceSpacing;\n    const progress = this.optimizationStep / this.maxOptimizationSteps;\n    const baseStep = 4 * (1 - progress) + 0.5;\n    const minDist = minDim * 0.02;\n    const maxDist = minDim * 1.5;\n    const traceCosts = [];\n    for (let i = 0; i < this.traces.length; i++) {\n      traceCosts.push({ idx: i, cost: this.computeCostForTrace(i) });\n    }\n    traceCosts.sort((a, b) => b.cost - a.cost);\n    for (const { idx: i, cost: currentCost } of traceCosts) {\n      if (currentCost === 0) continue;\n      const trace = this.traces[i];\n      const costMultiplier = currentCost > 100 ? 2 : 1;\n      const steps = [\n        baseStep * costMultiplier,\n        baseStep * 1.5 * costMultiplier,\n        baseStep * 0.5\n      ];\n      for (const step of steps) {\n        const deltas = currentCost > 100 ? [\n          step,\n          -step,\n          step * 2,\n          -step * 2,\n          step * 3,\n          -step * 3,\n          effectiveSpacing * 2,\n          -effectiveSpacing * 2\n        ] : [step, -step, step * 2, -step * 2];\n        let bestCost = this.computeCostForTrace(i);\n        let bestD1 = trace.d1;\n        let bestD2 = trace.d2;\n        const origD1 = trace.d1;\n        const origD2 = trace.d2;\n        for (const delta of deltas) {\n          trace.d1 = Math.max(minDist, Math.min(maxDist, origD1 + delta));\n          this.updateControlPointsFromDistances(i);\n          this.updateSingleTraceSample(i);\n          const cost1 = this.computeCostForTrace(i);\n          if (cost1 < bestCost) {\n            bestCost = cost1;\n            bestD1 = trace.d1;\n            bestD2 = origD2;\n          }\n          trace.d1 = origD1;\n          this.updateControlPointsFromDistances(i);\n          trace.d2 = Math.max(minDist, Math.min(maxDist, origD2 + delta));\n          this.updateControlPointsFromDistances(i);\n          this.updateSingleTraceSample(i);\n          const cost2 = this.computeCostForTrace(i);\n          if (cost2 < bestCost) {\n            bestCost = cost2;\n            bestD1 = origD1;\n            bestD2 = trace.d2;\n          }\n          trace.d2 = origD2;\n          this.updateControlPointsFromDistances(i);\n          trace.d1 = Math.max(minDist, Math.min(maxDist, origD1 + delta));\n          trace.d2 = Math.max(minDist, Math.min(maxDist, origD2 + delta));\n          this.updateControlPointsFromDistances(i);\n          this.updateSingleTraceSample(i);\n          const cost3 = this.computeCostForTrace(i);\n          if (cost3 < bestCost) {\n            bestCost = cost3;\n            bestD1 = trace.d1;\n            bestD2 = trace.d2;\n          }\n          trace.d1 = origD1;\n          trace.d2 = origD2;\n          this.updateControlPointsFromDistances(i);\n          trace.d1 = Math.max(minDist, Math.min(maxDist, origD1 + delta));\n          trace.d2 = Math.max(minDist, Math.min(maxDist, origD2 - delta));\n          this.updateControlPointsFromDistances(i);\n          this.updateSingleTraceSample(i);\n          const cost4 = this.computeCostForTrace(i);\n          if (cost4 < bestCost) {\n            bestCost = cost4;\n            bestD1 = trace.d1;\n            bestD2 = trace.d2;\n          }\n          trace.d1 = origD1;\n          trace.d2 = origD2;\n          this.updateControlPointsFromDistances(i);\n        }\n        trace.d1 = bestD1;\n        trace.d2 = bestD2;\n        this.updateControlPointsFromDistances(i);\n        this.updateSingleTraceSample(i);\n        if (bestCost < currentCost * 0.9) break;\n      }\n    }\n    if (this.optimizationStep % 10 === 0) {\n      this.updateCollisionPairs();\n    }\n  }\n  buildOutputTraces() {\n    this.outputTraces = this.traces.map((trace) => ({\n      waypointPair: trace.waypointPair,\n      points: sampleCubicBezier(\n        trace.waypointPair.start,\n        trace.ctrl1,\n        trace.ctrl2,\n        trace.waypointPair.end,\n        OUTPUT_SAMPLES\n      ),\n      networkId: trace.networkId\n    }));\n  }\n  _step() {\n    if (this.traces.length === 0) {\n      this.effectiveTraceToTraceSpacing = this.problem.preferredTraceToTraceSpacing * 3;\n      this.initializeTraces();\n      this.lastCost = this.computeTotalCost();\n      this.stagnantSteps = 0;\n    }\n    if (this.optimizationStep < this.maxOptimizationSteps) {\n      const progress = this.optimizationStep / this.maxOptimizationSteps;\n      const startMultiplier = 3;\n      const endMultiplier = 1;\n      const currentMultiplier = startMultiplier + (endMultiplier - startMultiplier) * progress;\n      this.effectiveTraceToTraceSpacing = this.problem.preferredTraceToTraceSpacing * currentMultiplier;\n      this.optimizeStep();\n      this.optimizationStep++;\n      if (this.optimizationStep % 10 === 0) {\n        const resolved = this.resolveIntersections();\n        if (resolved > 0) {\n          this.updateCollisionPairs();\n        }\n      }\n      const currentCost = this.computeTotalCost();\n      if (currentCost === 0) {\n        this.optimizationStep = this.maxOptimizationSteps;\n      } else if (currentCost >= this.lastCost * 0.99) {\n        this.stagnantSteps++;\n        if (this.stagnantSteps > 10) {\n          const resolved = this.resolveIntersections();\n          if (resolved > 0) {\n            this.updateCollisionPairs();\n            this.stagnantSteps = 0;\n          } else if (this.stagnantSteps > 15) {\n            this.optimizationStep = this.maxOptimizationSteps;\n          }\n        }\n      } else {\n        this.stagnantSteps = 0;\n      }\n      this.lastCost = currentCost;\n    }\n    if (this.optimizationStep >= this.maxOptimizationSteps) {\n      this.resolveIntersections();\n      this.buildOutputTraces();\n      this.solved = true;\n    }\n  }\n  visualize() {\n    if (this.traces.length > 0) {\n      this.buildOutputTraces();\n    }\n    return visualizeCurvyTraceProblem(this.problem, this.outputTraces);\n  }\n};\n\n// lib/AngledTraceSolver.ts\nfunction getPerimeterT2(p, bounds) {\n  const { minX, maxX, minY, maxY } = bounds;\n  const W = maxX - minX;\n  const H = maxY - minY;\n  const eps = 1e-6;\n  if (Math.abs(p.y - maxY) < eps) return p.x - minX;\n  if (Math.abs(p.x - maxX) < eps) return W + (maxY - p.y);\n  if (Math.abs(p.y - minY) < eps) return W + H + (maxX - p.x);\n  if (Math.abs(p.x - minX) < eps) return 2 * W + H + (p.y - minY);\n  return 0;\n}\nfunction getInwardPerpendicular2(p, bounds) {\n  const { minX, maxX, minY, maxY } = bounds;\n  const eps = 1e-6;\n  const onTop = Math.abs(p.y - maxY) < eps;\n  const onBottom = Math.abs(p.y - minY) < eps;\n  const onRight = Math.abs(p.x - maxX) < eps;\n  const onLeft = Math.abs(p.x - minX) < eps;\n  if (onTop && onRight) return { x: -Math.SQRT1_2, y: -Math.SQRT1_2 };\n  if (onTop && onLeft) return { x: Math.SQRT1_2, y: -Math.SQRT1_2 };\n  if (onBottom && onRight) return { x: -Math.SQRT1_2, y: Math.SQRT1_2 };\n  if (onBottom && onLeft) return { x: Math.SQRT1_2, y: Math.SQRT1_2 };\n  if (onTop) return { x: 0, y: -1 };\n  if (onBottom) return { x: 0, y: 1 };\n  if (onRight) return { x: -1, y: 0 };\n  if (onLeft) return { x: 1, y: 0 };\n  const cx = (minX + maxX) / 2;\n  const cy = (minY + maxY) / 2;\n  const dx = cx - p.x;\n  const dy = cy - p.y;\n  const len = Math.hypot(dx, dy);\n  return len > 0 ? { x: dx / len, y: dy / len } : { x: 0, y: -1 };\n}\nfunction chordContains2(aT1, aT2, bT1, bT2, perimeter) {\n  const normalize = (t) => (t % perimeter + perimeter) % perimeter;\n  const a1 = normalize(aT1), a2 = normalize(aT2);\n  const b1 = normalize(bT1), b2 = normalize(bT2);\n  const [aMin, aMax] = a1 < a2 ? [a1, a2] : [a2, a1];\n  return b1 > aMin && b1 < aMax && b2 > aMin && b2 < aMax;\n}\nfunction getBoundsCenter2(bounds) {\n  return {\n    x: (bounds.minX + bounds.maxX) / 2,\n    y: (bounds.minY + bounds.maxY) / 2\n  };\n}\nfunction segmentDistSq2(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n  const bDx = b2x - b1x;\n  const bDy = b2y - b1y;\n  const aDx = a2x - a1x;\n  const aDy = a2y - a1y;\n  const d1 = bDx * (a1y - b1y) - bDy * (a1x - b1x);\n  const d2 = bDx * (a2y - b1y) - bDy * (a2x - b1x);\n  if (d1 > 0 !== d2 > 0) {\n    const d3 = aDx * (b1y - a1y) - aDy * (b1x - a1x);\n    const d4 = aDx * (b2y - a1y) - aDy * (b2x - a1x);\n    if (d3 > 0 !== d4 > 0) {\n      return 0;\n    }\n  }\n  const bLenSq = bDx * bDx + bDy * bDy;\n  const aLenSq = aDx * aDx + aDy * aDy;\n  let minDistSq = Infinity;\n  let t;\n  let projX;\n  let projY;\n  let dpx;\n  let dpy;\n  let distSq;\n  if (bLenSq > 0) {\n    t = ((a1x - b1x) * bDx + (a1y - b1y) * bDy) / bLenSq;\n    t = t < 0 ? 0 : t > 1 ? 1 : t;\n    projX = b1x + t * bDx;\n    projY = b1y + t * bDy;\n  } else {\n    projX = b1x;\n    projY = b1y;\n  }\n  dpx = a1x - projX;\n  dpy = a1y - projY;\n  distSq = dpx * dpx + dpy * dpy;\n  if (distSq < minDistSq) minDistSq = distSq;\n  if (bLenSq > 0) {\n    t = ((a2x - b1x) * bDx + (a2y - b1y) * bDy) / bLenSq;\n    t = t < 0 ? 0 : t > 1 ? 1 : t;\n    projX = b1x + t * bDx;\n    projY = b1y + t * bDy;\n  } else {\n    projX = b1x;\n    projY = b1y;\n  }\n  dpx = a2x - projX;\n  dpy = a2y - projY;\n  distSq = dpx * dpx + dpy * dpy;\n  if (distSq < minDistSq) minDistSq = distSq;\n  if (aLenSq > 0) {\n    t = ((b1x - a1x) * aDx + (b1y - a1y) * aDy) / aLenSq;\n    t = t < 0 ? 0 : t > 1 ? 1 : t;\n    projX = a1x + t * aDx;\n    projY = a1y + t * aDy;\n  } else {\n    projX = a1x;\n    projY = a1y;\n  }\n  dpx = b1x - projX;\n  dpy = b1y - projY;\n  distSq = dpx * dpx + dpy * dpy;\n  if (distSq < minDistSq) minDistSq = distSq;\n  if (aLenSq > 0) {\n    t = ((b2x - a1x) * aDx + (b2y - a1y) * aDy) / aLenSq;\n    t = t < 0 ? 0 : t > 1 ? 1 : t;\n    projX = a1x + t * aDx;\n    projY = a1y + t * aDy;\n  } else {\n    projX = a1x;\n    projY = a1y;\n  }\n  dpx = b2x - projX;\n  dpy = b2y - projY;\n  distSq = dpx * dpx + dpy * dpy;\n  if (distSq < minDistSq) minDistSq = distSq;\n  return minDistSq;\n}\nfunction segmentsIntersect2(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n  const d1 = (b2x - b1x) * (a1y - b1y) - (b2y - b1y) * (a1x - b1x);\n  const d2 = (b2x - b1x) * (a2y - b1y) - (b2y - b1y) * (a2x - b1x);\n  const d3 = (a2x - a1x) * (b1y - a1y) - (a2y - a1y) * (b1x - a1x);\n  const d4 = (a2x - a1x) * (b2y - a1y) - (a2y - a1y) * (b2x - a1x);\n  return (d1 > 0 && d2 < 0 || d1 < 0 && d2 > 0) && (d3 > 0 && d4 < 0 || d3 < 0 && d4 > 0);\n}\nfunction computeTraceBounds2(points) {\n  let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n  for (const p of points) {\n    if (p.x < minX) minX = p.x;\n    if (p.x > maxX) maxX = p.x;\n    if (p.y < minY) minY = p.y;\n    if (p.y > maxY) maxY = p.y;\n  }\n  return { minX, maxX, minY, maxY };\n}\nfunction getDotProduct(dir1x, dir1y, dir2x, dir2y) {\n  return dir1x * dir2x + dir1y * dir2y;\n}\nfunction computeDirectRoute(start, end, diagonalFirst = true) {\n  const eps = 1e-6;\n  const dx = end.x - start.x;\n  const dy = end.y - start.y;\n  const absDx = Math.abs(dx);\n  const absDy = Math.abs(dy);\n  if (absDx < eps || absDy < eps || Math.abs(absDx - absDy) < eps) {\n    return [start, end];\n  }\n  const diagDist = Math.min(absDx, absDy);\n  const diagX = Math.sign(dx) * diagDist;\n  const diagY = Math.sign(dy) * diagDist;\n  const orthoX = dx - diagX;\n  const orthoY = dy - diagY;\n  if (diagonalFirst) {\n    const mid = {\n      x: start.x + diagX,\n      y: start.y + diagY\n    };\n    return [start, mid, end];\n  } else {\n    const mid = {\n      x: start.x + orthoX,\n      y: start.y + orthoY\n    };\n    return [start, mid, end];\n  }\n}\nfunction computeAngledTracePoints(start, end, perpDir1, perpDir2, d1, d2, bendSign, bounds) {\n  const { minX, maxX, minY, maxY } = bounds;\n  const eps = 1e-6;\n  if (d1 < eps && d2 < eps) {\n    return computeDirectRoute(start, end, bendSign >= 0);\n  }\n  const snapToOrthogonal = (dir) => {\n    if (Math.abs(dir.x) >= Math.abs(dir.y)) {\n      return { x: Math.sign(dir.x) || 1, y: 0 };\n    } else {\n      return { x: 0, y: Math.sign(dir.y) || 1 };\n    }\n  };\n  const orthoDir1 = snapToOrthogonal(perpDir1);\n  const orthoDir2 = snapToOrthogonal(perpDir2);\n  const maxD1 = orthoDir1.x !== 0 ? orthoDir1.x > 0 ? maxX - start.x : start.x - minX : orthoDir1.y > 0 ? maxY - start.y : start.y - minY;\n  const maxD2 = orthoDir2.x !== 0 ? orthoDir2.x > 0 ? maxX - end.x : end.x - minX : orthoDir2.y > 0 ? maxY - end.y : end.y - minY;\n  const safeD1 = Math.min(d1, Math.max(0, maxD1 - 1));\n  const safeD2 = Math.min(d2, Math.max(0, maxD2 - 1));\n  const turn1 = {\n    x: start.x + safeD1 * orthoDir1.x,\n    y: start.y + safeD1 * orthoDir1.y\n  };\n  const turn2 = {\n    x: end.x + safeD2 * orthoDir2.x,\n    y: end.y + safeD2 * orthoDir2.y\n  };\n  const dx = turn2.x - turn1.x;\n  const dy = turn2.y - turn1.y;\n  if (Math.abs(dx) < eps && Math.abs(dy) < eps) {\n    return [start, turn1, end];\n  }\n  const absDx = Math.abs(dx);\n  const absDy = Math.abs(dy);\n  const diagDist = Math.min(absDx, absDy);\n  const diagX = Math.sign(dx) * diagDist;\n  const diagY = Math.sign(dy) * diagDist;\n  const orthoX = dx - diagX;\n  const orthoY = dy - diagY;\n  const hasDiagonal = diagDist > eps;\n  const hasOrthogonal = Math.abs(orthoX) > eps || Math.abs(orthoY) > eps;\n  let diagonalFirst = true;\n  if (hasDiagonal && hasOrthogonal) {\n    const normalizedBend = Math.tanh(bendSign);\n    const diagDirX = diagX / diagDist;\n    const diagDirY = diagY / diagDist;\n    const orthoLen = Math.hypot(orthoX, orthoY);\n    const orthoDirX = orthoX / orthoLen;\n    const orthoDirY = orthoY / orthoLen;\n    const dotDiag1 = getDotProduct(orthoDir1.x, orthoDir1.y, diagDirX, diagDirY);\n    const dotOrtho1 = getDotProduct(\n      orthoDir1.x,\n      orthoDir1.y,\n      orthoDirX,\n      orthoDirY\n    );\n    const dotDiag2 = getDotProduct(\n      -orthoDir2.x,\n      -orthoDir2.y,\n      diagDirX,\n      diagDirY\n    );\n    const dotOrtho2 = getDotProduct(\n      -orthoDir2.x,\n      -orthoDir2.y,\n      orthoDirX,\n      orthoDirY\n    );\n    const scoreDiagFirst = Math.min(dotDiag1, dotOrtho2);\n    const scoreOrthoFirst = Math.min(dotOrtho1, dotDiag2);\n    if (scoreOrthoFirst > scoreDiagFirst + 0.3) {\n      diagonalFirst = false;\n    } else if (scoreDiagFirst > scoreOrthoFirst + 0.3) {\n      diagonalFirst = true;\n    } else {\n      diagonalFirst = normalizedBend >= 0;\n    }\n  }\n  const points = [start, turn1];\n  if (hasDiagonal && hasOrthogonal) {\n    if (diagonalFirst) {\n      const mid = {\n        x: turn1.x + diagX,\n        y: turn1.y + diagY\n      };\n      points.push(mid);\n    } else {\n      const mid = {\n        x: turn1.x + orthoX,\n        y: turn1.y + orthoY\n      };\n      points.push(mid);\n    }\n  }\n  points.push(turn2, end);\n  let filtered = [points[0]];\n  for (let i = 1; i < points.length; i++) {\n    const prev = filtered[filtered.length - 1];\n    const curr = points[i];\n    if (Math.hypot(curr.x - prev.x, curr.y - prev.y) > eps) {\n      filtered.push(curr);\n    }\n  }\n  filtered = chamferSharpCorners(filtered);\n  return filtered;\n}\nfunction chamferSharpCorners(points) {\n  if (points.length < 3) return points;\n  const eps = 1e-6;\n  const result = [points[0]];\n  for (let i = 1; i < points.length - 1; i++) {\n    const before = points[i - 1];\n    const corner = points[i];\n    const after = points[i + 1];\n    const dx1 = corner.x - before.x;\n    const dy1 = corner.y - before.y;\n    const len1 = Math.hypot(dx1, dy1);\n    const dx2 = after.x - corner.x;\n    const dy2 = after.y - corner.y;\n    const len2 = Math.hypot(dx2, dy2);\n    if (len1 < eps || len2 < eps) {\n      result.push(corner);\n      continue;\n    }\n    const dir1x = dx1 / len1;\n    const dir1y = dy1 / len1;\n    const dir2x = dx2 / len2;\n    const dir2y = dy2 / len2;\n    const dot = getDotProduct(dir1x, dir1y, dir2x, dir2y);\n    if (dot >= 0.5) {\n      result.push(corner);\n      continue;\n    }\n    const chamferDist = Math.min(len1, len2) * 0.4;\n    const b1 = {\n      x: corner.x - dir1x * chamferDist,\n      y: corner.y - dir1y * chamferDist\n    };\n    const b2 = {\n      x: corner.x + dir2x * chamferDist,\n      y: corner.y + dir2y * chamferDist\n    };\n    result.push(b1, b2);\n  }\n  result.push(points[points.length - 1]);\n  return result;\n}\nfunction samplePolyline(points, numSamples) {\n  if (points.length < 2) return [...points];\n  let totalLength = 0;\n  const segmentLengths = [];\n  for (let i = 0; i < points.length - 1; i++) {\n    const len = Math.hypot(\n      points[i + 1].x - points[i].x,\n      points[i + 1].y - points[i].y\n    );\n    segmentLengths.push(len);\n    totalLength += len;\n  }\n  if (totalLength < 1e-9) return [points[0], points[points.length - 1]];\n  const sampled = [];\n  for (let s = 0; s <= numSamples; s++) {\n    const targetDist = s / numSamples * totalLength;\n    let accumulated = 0;\n    let found = false;\n    for (let i = 0; i < segmentLengths.length; i++) {\n      if (accumulated + segmentLengths[i] >= targetDist - 1e-9) {\n        const segDist = targetDist - accumulated;\n        const t = segmentLengths[i] > 1e-9 ? segDist / segmentLengths[i] : 0;\n        sampled.push({\n          x: points[i].x + t * (points[i + 1].x - points[i].x),\n          y: points[i].y + t * (points[i + 1].y - points[i].y)\n        });\n        found = true;\n        break;\n      }\n      accumulated += segmentLengths[i];\n    }\n    if (!found) {\n      sampled.push(points[points.length - 1]);\n    }\n  }\n  return sampled;\n}\nvar OPT_SAMPLES2 = 6;\nvar AngledTraceSolver = class extends BaseSolver {\n  constructor(problem) {\n    super();\n    this.problem = problem;\n    for (const obstacle of this.problem.obstacles) {\n      obstacle.outerSegments = getObstacleOuterSegments(obstacle);\n    }\n    this.precomputeObstacles();\n  }\n  outputTraces = [];\n  traces = [];\n  optimizationStep = 0;\n  maxOptimizationSteps = 70;\n  // Balanced for speed and quality\n  // Sampled points for cost computation\n  sampledPoints = [];\n  traceBounds = [];\n  // Pre-computed obstacle segments\n  obstacleSegments = new Float64Array(0);\n  obstacleNetworkIds = [];\n  numObstacleSegments = 0;\n  // Collision pairs cache\n  collisionPairs = [];\n  lastCost = Infinity;\n  stagnantSteps = 0;\n  // Effective spacing that decays during optimization\n  effectiveTraceToTraceSpacing = 0;\n  getConstructorParams() {\n    return this.problem;\n  }\n  /**\n   * Get the current solution weights as Array<[number, number, number]>\n   */\n  getSolutionWeights() {\n    return this.traces.map(\n      (t) => [...t.controlParams]\n    );\n  }\n  /**\n   * Set the solution weights\n   */\n  setSolutionWeights(weights) {\n    if (this.traces.length === 0) {\n      this.initializeTraces();\n    }\n    for (let i = 0; i < Math.min(weights.length, this.traces.length); i++) {\n      this.traces[i].controlParams = [...weights[i]];\n      this.updateTracePoints(i);\n    }\n    this.updateAllSampledTraces();\n    this.updateCollisionPairs();\n  }\n  precomputeObstacles() {\n    const { obstacles } = this.problem;\n    let totalSegments = 0;\n    for (const obs of obstacles) {\n      if (obs.outerSegments) totalSegments += obs.outerSegments.length;\n    }\n    this.obstacleSegments = new Float64Array(totalSegments * 4);\n    this.obstacleNetworkIds = [];\n    this.numObstacleSegments = totalSegments;\n    let idx = 0;\n    for (const obs of obstacles) {\n      if (obs.outerSegments) {\n        for (const seg of obs.outerSegments) {\n          this.obstacleSegments[idx++] = seg[0].x;\n          this.obstacleSegments[idx++] = seg[0].y;\n          this.obstacleSegments[idx++] = seg[1].x;\n          this.obstacleSegments[idx++] = seg[1].y;\n          this.obstacleNetworkIds.push(obs.networkId);\n        }\n      }\n    }\n  }\n  initializeTraces() {\n    const { bounds, waypointPairs } = this.problem;\n    const { minX, maxX, minY, maxY } = bounds;\n    const W = maxX - minX;\n    const H = maxY - minY;\n    const perimeter = 2 * W + 2 * H;\n    const center = getBoundsCenter2(bounds);\n    const tracesWithT = waypointPairs.map((pair, idx) => ({\n      pair,\n      t1: getPerimeterT2(pair.start, bounds),\n      t2: getPerimeterT2(pair.end, bounds),\n      idx\n    }));\n    const containedBy = tracesWithT.map(() => []);\n    const contains = tracesWithT.map(() => []);\n    for (const trace of tracesWithT) {\n      for (const other of tracesWithT) {\n        if (trace.idx !== other.idx) {\n          if (trace.pair.networkId && other.pair.networkId && trace.pair.networkId === other.pair.networkId) {\n            continue;\n          }\n          if (chordContains2(other.t1, other.t2, trace.t1, trace.t2, perimeter)) {\n            containedBy[trace.idx].push(other.idx);\n            contains[other.idx].push(trace.idx);\n          }\n        }\n      }\n    }\n    const nestingDepth = containedBy.map((arr) => arr.length);\n    const maxDepth = Math.max(...nestingDepth, 1);\n    this.traces = tracesWithT.map(({ pair, t1, t2, idx }) => {\n      const perpDir1 = getInwardPerpendicular2(pair.start, bounds);\n      const perpDir2 = getInwardPerpendicular2(pair.end, bounds);\n      const d1 = 0;\n      const d2 = 0;\n      const bendSign = 0;\n      const points = computeAngledTracePoints(\n        pair.start,\n        pair.end,\n        perpDir1,\n        perpDir2,\n        d1,\n        d2,\n        bendSign,\n        bounds\n      );\n      return {\n        waypointPair: pair,\n        networkId: pair.networkId,\n        t1,\n        t2,\n        perpDir1,\n        perpDir2,\n        controlParams: [d1, d2, bendSign],\n        points,\n        containedBy: containedBy[idx],\n        contains: contains[idx]\n      };\n    });\n    this.sampledPoints = this.traces.map(\n      () => new Float64Array((OPT_SAMPLES2 + 1) * 2)\n    );\n    this.traceBounds = this.traces.map(() => ({\n      minX: 0,\n      maxX: 0,\n      minY: 0,\n      maxY: 0\n    }));\n    this.updateAllSampledTraces();\n    this.updateCollisionPairs();\n  }\n  updateTracePoints(i) {\n    const trace = this.traces[i];\n    const [d1, d2, bendSign] = trace.controlParams;\n    trace.points = computeAngledTracePoints(\n      trace.waypointPair.start,\n      trace.waypointPair.end,\n      trace.perpDir1,\n      trace.perpDir2,\n      d1,\n      d2,\n      bendSign,\n      this.problem.bounds\n    );\n  }\n  updateAllSampledTraces() {\n    for (let i = 0; i < this.traces.length; i++) {\n      this.updateSingleTraceSample(i);\n    }\n  }\n  updateSingleTraceSample(i) {\n    const trace = this.traces[i];\n    const sampled = samplePolyline(trace.points, OPT_SAMPLES2);\n    for (let j = 0; j < sampled.length; j++) {\n      this.sampledPoints[i][j * 2] = sampled[j].x;\n      this.sampledPoints[i][j * 2 + 1] = sampled[j].y;\n    }\n    this.traceBounds[i] = computeTraceBounds2(trace.points);\n  }\n  updateCollisionPairs() {\n    const effectiveSpacing = this.effectiveTraceToTraceSpacing;\n    this.collisionPairs = [];\n    for (let i = 0; i < this.traces.length; i++) {\n      for (let j = i + 1; j < this.traces.length; j++) {\n        const ti = this.traces[i], tj = this.traces[j];\n        if (ti.networkId && tj.networkId && ti.networkId === tj.networkId)\n          continue;\n        const bi = this.traceBounds[i], bj = this.traceBounds[j];\n        if (bi.maxX + effectiveSpacing >= bj.minX && bj.maxX + effectiveSpacing >= bi.minX && bi.maxY + effectiveSpacing >= bj.minY && bj.maxY + effectiveSpacing >= bi.minY) {\n          this.collisionPairs.push([i, j]);\n        }\n      }\n    }\n  }\n  computeTotalCost() {\n    const { preferredObstacleToTraceSpacing } = this.problem;\n    const effectiveSpacing = this.effectiveTraceToTraceSpacing;\n    const traceSpacingSq = effectiveSpacing ** 2;\n    const obstacleSpacingSq = preferredObstacleToTraceSpacing ** 2;\n    let cost = 0;\n    for (const [i, j] of this.collisionPairs) {\n      const pi = this.sampledPoints[i], pj = this.sampledPoints[j];\n      for (let a = 0; a < OPT_SAMPLES2; a++) {\n        const a1x = pi[a * 2], a1y = pi[a * 2 + 1];\n        const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];\n        for (let b = 0; b < OPT_SAMPLES2; b++) {\n          const b1x = pj[b * 2], b1y = pj[b * 2 + 1];\n          const b2x = pj[(b + 1) * 2], b2y = pj[(b + 1) * 2 + 1];\n          const distSq = segmentDistSq2(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y);\n          if (distSq < traceSpacingSq) {\n            const dist = Math.sqrt(distSq);\n            cost += (effectiveSpacing - dist) ** 2;\n            if (distSq < 1e-18) cost += 20 * traceSpacingSq;\n          }\n        }\n      }\n    }\n    for (let i = 0; i < this.traces.length; i++) {\n      const trace = this.traces[i];\n      const pi = this.sampledPoints[i];\n      const bi = this.traceBounds[i];\n      for (let obsIdx = 0; obsIdx < this.numObstacleSegments; obsIdx++) {\n        if (trace.networkId && this.obstacleNetworkIds[obsIdx] && trace.networkId === this.obstacleNetworkIds[obsIdx])\n          continue;\n        const obsBase = obsIdx * 4;\n        const ox1 = this.obstacleSegments[obsBase];\n        const oy1 = this.obstacleSegments[obsBase + 1];\n        const ox2 = this.obstacleSegments[obsBase + 2];\n        const oy2 = this.obstacleSegments[obsBase + 3];\n        const obsMinX = Math.min(ox1, ox2), obsMaxX = Math.max(ox1, ox2);\n        const obsMinY = Math.min(oy1, oy2), obsMaxY = Math.max(oy1, oy2);\n        if (bi.maxX + preferredObstacleToTraceSpacing < obsMinX || obsMaxX + preferredObstacleToTraceSpacing < bi.minX || bi.maxY + preferredObstacleToTraceSpacing < obsMinY || obsMaxY + preferredObstacleToTraceSpacing < bi.minY)\n          continue;\n        for (let a = 0; a < OPT_SAMPLES2; a++) {\n          const a1x = pi[a * 2], a1y = pi[a * 2 + 1];\n          const a2x = pi[(a + 1) * 2], a2y = pi[(a + 1) * 2 + 1];\n          const distSq = segmentDistSq2(a1x, a1y, a2x, a2y, ox1, oy1, ox2, oy2);\n          if (distSq < obstacleSpacingSq) {\n            const dist = Math.sqrt(distSq);\n            cost += (preferredObstacleToTraceSpacing - dist) ** 2;\n            if (distSq < 1e-18) cost += 20 * obstacleSpacingSq;\n          }\n        }\n      }\n    }\n    for (let i = 0; i < this.traces.length; i++) {\n      cost += this.computeShapePenalty(i);\n    }\n    return cost;\n  }\n  // Fast cost using actual trace segments (not samples)\n  computeCostForTraceFast(traceIdx) {\n    const { preferredObstacleToTraceSpacing } = this.problem;\n    const effectiveSpacing = this.effectiveTraceToTraceSpacing;\n    const traceSpacingSq = effectiveSpacing ** 2;\n    const obstacleSpacingSq = preferredObstacleToTraceSpacing ** 2;\n    const trace = this.traces[traceIdx];\n    const pts = trace.points;\n    const bi = this.traceBounds[traceIdx];\n    let cost = 0;\n    const INTERSECTION_PENALTY = 1e4;\n    for (let j = 0; j < this.traces.length; j++) {\n      if (j === traceIdx) continue;\n      const other = this.traces[j];\n      if (trace.networkId && other.networkId && trace.networkId === other.networkId)\n        continue;\n      const bj = this.traceBounds[j];\n      if (bi.maxX + effectiveSpacing < bj.minX || bj.maxX + effectiveSpacing < bi.minX || bi.maxY + effectiveSpacing < bj.minY || bj.maxY + effectiveSpacing < bi.minY)\n        continue;\n      const otherPts = other.points;\n      for (let a = 0; a < pts.length - 1; a++) {\n        const a1x = pts[a].x;\n        const a1y = pts[a].y;\n        const a2x = pts[a + 1].x;\n        const a2y = pts[a + 1].y;\n        for (let b = 0; b < otherPts.length - 1; b++) {\n          const b1x = otherPts[b].x;\n          const b1y = otherPts[b].y;\n          const b2x = otherPts[b + 1].x;\n          const b2y = otherPts[b + 1].y;\n          const distSq = segmentDistSq2(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y);\n          if (distSq === 0) {\n            cost += INTERSECTION_PENALTY;\n          } else if (distSq < traceSpacingSq) {\n            const dist = Math.sqrt(distSq);\n            cost += (effectiveSpacing - dist) ** 2;\n          }\n        }\n      }\n    }\n    for (let obsIdx = 0; obsIdx < this.numObstacleSegments; obsIdx++) {\n      if (trace.networkId && this.obstacleNetworkIds[obsIdx] && trace.networkId === this.obstacleNetworkIds[obsIdx])\n        continue;\n      const obsBase = obsIdx * 4;\n      const ox1 = this.obstacleSegments[obsBase];\n      const oy1 = this.obstacleSegments[obsBase + 1];\n      const ox2 = this.obstacleSegments[obsBase + 2];\n      const oy2 = this.obstacleSegments[obsBase + 3];\n      for (let a = 0; a < pts.length - 1; a++) {\n        const distSq = segmentDistSq2(\n          pts[a].x,\n          pts[a].y,\n          pts[a + 1].x,\n          pts[a + 1].y,\n          ox1,\n          oy1,\n          ox2,\n          oy2\n        );\n        if (distSq === 0) {\n          cost += INTERSECTION_PENALTY;\n        } else if (distSq < obstacleSpacingSq) {\n          const dist = Math.sqrt(distSq);\n          cost += (preferredObstacleToTraceSpacing - dist) ** 2;\n        }\n      }\n    }\n    return cost;\n  }\n  /**\n   * Compute penalty for undesirable trace shapes:\n   * - Sharp turns (90 degrees or more)\n   * - 45 degree segments shorter than 5% of trace length\n   *\n   * For 45-degree routing, valid turn angles are:\n   * - 0° (straight): dot product = 1\n   * - 45° (to/from diagonal): dot product ≈ 0.707\n   *\n   * Invalid turns:\n   * - 90° (perpendicular): dot product = 0\n   * - 135° or sharper: dot product < 0\n   */\n  computeShapePenalty(traceIdx) {\n    const trace = this.traces[traceIdx];\n    const points = trace.points;\n    if (points.length < 2) return 0;\n    let penalty = 0;\n    const eps = 1e-6;\n    let totalLength = 0;\n    for (let i = 0; i < points.length - 1; i++) {\n      totalLength += Math.hypot(\n        points[i + 1].x - points[i].x,\n        points[i + 1].y - points[i].y\n      );\n    }\n    if (totalLength < eps) return 0;\n    const minSegmentLength = totalLength * 0.05;\n    for (let i = 0; i < points.length - 1; i++) {\n      const dx = points[i + 1].x - points[i].x;\n      const dy = points[i + 1].y - points[i].y;\n      const segLength = Math.hypot(dx, dy);\n      if (segLength < eps) continue;\n      const absDx = Math.abs(dx);\n      const absDy = Math.abs(dy);\n      const is45Degree = Math.abs(absDx - absDy) < eps * segLength;\n      if (is45Degree && segLength < minSegmentLength) {\n        const shortness = (minSegmentLength - segLength) / minSegmentLength;\n        penalty += shortness * shortness * 100;\n      }\n      if (i < points.length - 2) {\n        const dx2 = points[i + 2].x - points[i + 1].x;\n        const dy2 = points[i + 2].y - points[i + 1].y;\n        const seg2Length = Math.hypot(dx2, dy2);\n        if (seg2Length > eps) {\n          const dir1x = dx / segLength;\n          const dir1y = dy / segLength;\n          const dir2x = dx2 / seg2Length;\n          const dir2y = dy2 / seg2Length;\n          const dot = dir1x * dir2x + dir1y * dir2y;\n          if (dot < 0.6) {\n            const sharpness = 1 - dot;\n            penalty += sharpness * 100;\n          }\n        }\n      }\n    }\n    return penalty;\n  }\n  getTraceLength(i) {\n    const trace = this.traces[i];\n    let length = 0;\n    for (let p = 0; p < trace.points.length - 1; p++) {\n      length += Math.hypot(\n        trace.points[p + 1].x - trace.points[p].x,\n        trace.points[p + 1].y - trace.points[p].y\n      );\n    }\n    return length;\n  }\n  tracesIntersect(i, j) {\n    const trace1 = this.traces[i];\n    const trace2 = this.traces[j];\n    const p1 = trace1.points;\n    const p2 = trace2.points;\n    for (let a = 0; a < p1.length - 1; a++) {\n      for (let b = 0; b < p2.length - 1; b++) {\n        if (segmentsIntersect2(\n          p1[a].x,\n          p1[a].y,\n          p1[a + 1].x,\n          p1[a + 1].y,\n          p2[b].x,\n          p2[b].y,\n          p2[b + 1].x,\n          p2[b + 1].y\n        )) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  findIntersectingPairs() {\n    const intersecting = [];\n    for (let i = 0; i < this.traces.length; i++) {\n      for (let j = i + 1; j < this.traces.length; j++) {\n        const ti = this.traces[i];\n        const tj = this.traces[j];\n        if (ti.networkId && tj.networkId && ti.networkId === tj.networkId)\n          continue;\n        const bi = this.traceBounds[i];\n        const bj = this.traceBounds[j];\n        if (bi.maxX < bj.minX || bj.maxX < bi.minX || bi.maxY < bj.minY || bj.maxY < bi.minY)\n          continue;\n        if (this.tracesIntersect(i, j)) {\n          intersecting.push([i, j]);\n        }\n      }\n    }\n    return intersecting;\n  }\n  resolveIntersections() {\n    const { bounds, preferredTraceToTraceSpacing } = this.problem;\n    const { minX, maxX, minY, maxY } = bounds;\n    const minDim = Math.min(maxX - minX, maxY - minY);\n    const minDist = 0;\n    const maxDist = minDim * 2;\n    const intersecting = this.findIntersectingPairs();\n    if (intersecting.length === 0) return 0;\n    intersecting.sort((a, b) => {\n      const lenA = this.getTraceLength(a[0]) + this.getTraceLength(a[1]);\n      const lenB = this.getTraceLength(b[0]) + this.getTraceLength(b[1]);\n      return lenA - lenB;\n    });\n    let resolved = 0;\n    for (const [i, j] of intersecting) {\n      const ti = this.traces[i];\n      const tj = this.traces[j];\n      if (!this.tracesIntersect(i, j)) continue;\n      let outerIdx;\n      let innerIdx;\n      if (ti.containedBy.includes(j)) {\n        outerIdx = j;\n        innerIdx = i;\n      } else if (tj.containedBy.includes(i)) {\n        outerIdx = i;\n        innerIdx = j;\n      } else {\n        const avgDi = (ti.controlParams[0] + ti.controlParams[1]) / 2;\n        const avgDj = (tj.controlParams[0] + tj.controlParams[1]) / 2;\n        if (avgDi < avgDj) {\n          outerIdx = i;\n          innerIdx = j;\n        } else {\n          outerIdx = j;\n          innerIdx = i;\n        }\n      }\n      const outerTrace = this.traces[outerIdx];\n      const innerTrace = this.traces[innerIdx];\n      const origOuter = [...outerTrace.controlParams];\n      const origInner = [...innerTrace.controlParams];\n      const separation = preferredTraceToTraceSpacing * 2;\n      const strategies = [\n        // Distance adjustments (most common solutions)\n        {\n          target: \"inner\",\n          innerD: separation,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 2,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 3,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"outer\",\n          innerD: 0,\n          outerD: separation,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"outer\",\n          innerD: 0,\n          outerD: separation * 2,\n          innerBend: 0,\n          outerBend: 0\n        },\n        // Bend changes\n        { target: \"inner\", innerD: 0, outerD: 0, innerBend: -1, outerBend: 0 },\n        { target: \"inner\", innerD: 0, outerD: 0, innerBend: 1, outerBend: 0 },\n        { target: \"outer\", innerD: 0, outerD: 0, innerBend: 0, outerBend: -1 },\n        { target: \"outer\", innerD: 0, outerD: 0, innerBend: 0, outerBend: 1 },\n        // Medium distance\n        {\n          target: \"inner\",\n          innerD: separation * 5,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 8,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"outer\",\n          innerD: 0,\n          outerD: separation * 4,\n          innerBend: 0,\n          outerBend: 0\n        },\n        // Combined distance + bend\n        {\n          target: \"inner\",\n          innerD: separation * 2,\n          outerD: 0,\n          innerBend: -1,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 2,\n          outerD: 0,\n          innerBend: 1,\n          outerBend: 0\n        },\n        {\n          target: \"outer\",\n          innerD: 0,\n          outerD: separation * 2,\n          innerBend: 0,\n          outerBend: -1\n        },\n        {\n          target: \"outer\",\n          innerD: 0,\n          outerD: separation * 2,\n          innerBend: 0,\n          outerBend: 1\n        },\n        // Move both traces\n        {\n          target: \"both\",\n          innerD: separation * 2,\n          outerD: separation,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"both\",\n          innerD: separation * 3,\n          outerD: separation * 2,\n          innerBend: 0,\n          outerBend: 0\n        },\n        { target: \"both\", innerD: 0, outerD: 0, innerBend: 1, outerBend: -1 },\n        { target: \"both\", innerD: 0, outerD: 0, innerBend: -1, outerBend: 1 },\n        // Large distance for stubborn cases\n        {\n          target: \"inner\",\n          innerD: separation * 12,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 15,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 20,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 25,\n          outerD: 0,\n          innerBend: 0,\n          outerBend: 0\n        },\n        // Combined large distance + bend\n        {\n          target: \"inner\",\n          innerD: separation * 8,\n          outerD: 0,\n          innerBend: 2,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 8,\n          outerD: 0,\n          innerBend: -2,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 12,\n          outerD: 0,\n          innerBend: 1,\n          outerBend: 0\n        },\n        {\n          target: \"inner\",\n          innerD: separation * 12,\n          outerD: 0,\n          innerBend: -1,\n          outerBend: 0\n        },\n        // Push outer trace\n        {\n          target: \"both\",\n          innerD: separation * 5,\n          outerD: -separation * 2,\n          innerBend: 0,\n          outerBend: 0\n        },\n        {\n          target: \"both\",\n          innerD: separation * 8,\n          outerD: -separation * 3,\n          innerBend: 0,\n          outerBend: 0\n        }\n      ];\n      let foundSolution = false;\n      for (const strategy of strategies) {\n        outerTrace.controlParams = [...origOuter];\n        innerTrace.controlParams = [...origInner];\n        innerTrace.controlParams[0] = Math.min(\n          maxDist,\n          origInner[0] + strategy.innerD\n        );\n        innerTrace.controlParams[1] = Math.min(\n          maxDist,\n          origInner[1] + strategy.innerD\n        );\n        innerTrace.controlParams[2] = origInner[2] + strategy.innerBend;\n        outerTrace.controlParams[0] = Math.max(\n          minDist,\n          origOuter[0] - strategy.outerD\n        );\n        outerTrace.controlParams[1] = Math.max(\n          minDist,\n          origOuter[1] - strategy.outerD\n        );\n        outerTrace.controlParams[2] = origOuter[2] + strategy.outerBend;\n        this.updateTracePoints(innerIdx);\n        this.updateTracePoints(outerIdx);\n        this.updateSingleTraceSample(innerIdx);\n        this.updateSingleTraceSample(outerIdx);\n        if (!this.tracesIntersect(outerIdx, innerIdx)) {\n          resolved++;\n          foundSolution = true;\n          break;\n        }\n      }\n      if (!foundSolution) {\n        const swapStrategies = [\n          { innerD: separation * 2, innerBend: 0 },\n          { innerD: separation * 5, innerBend: 0 },\n          { innerD: separation * 8, innerBend: 0 },\n          { innerD: separation * 12, innerBend: 0 },\n          { innerD: separation * 15, innerBend: 0 },\n          { innerD: 0, innerBend: -1 },\n          { innerD: 0, innerBend: 1 },\n          { innerD: separation * 5, innerBend: -1 },\n          { innerD: separation * 5, innerBend: 1 },\n          { innerD: separation * 10, innerBend: -1 }\n        ];\n        for (const strategy of swapStrategies) {\n          outerTrace.controlParams = [...origOuter];\n          innerTrace.controlParams = [...origInner];\n          outerTrace.controlParams[0] = Math.min(\n            maxDist,\n            origOuter[0] + strategy.innerD\n          );\n          outerTrace.controlParams[1] = Math.min(\n            maxDist,\n            origOuter[1] + strategy.innerD\n          );\n          outerTrace.controlParams[2] = origOuter[2] + strategy.innerBend;\n          this.updateTracePoints(innerIdx);\n          this.updateTracePoints(outerIdx);\n          this.updateSingleTraceSample(innerIdx);\n          this.updateSingleTraceSample(outerIdx);\n          if (!this.tracesIntersect(outerIdx, innerIdx)) {\n            resolved++;\n            foundSolution = true;\n            break;\n          }\n        }\n      }\n      if (!foundSolution) {\n        outerTrace.controlParams = origOuter;\n        innerTrace.controlParams = origInner;\n        this.updateTracePoints(outerIdx);\n        this.updateTracePoints(innerIdx);\n        this.updateSingleTraceSample(outerIdx);\n        this.updateSingleTraceSample(innerIdx);\n      }\n    }\n    return resolved;\n  }\n  optimizeStep() {\n    const { bounds } = this.problem;\n    const { minX, maxX, minY, maxY } = bounds;\n    const minDim = Math.min(maxX - minX, maxY - minY);\n    const progress = this.optimizationStep / this.maxOptimizationSteps;\n    const step = 3 * (1 - progress) + 0.3;\n    const minDist = 0;\n    const maxDist = minDim * 1.5;\n    const deltas = [step, -step, step * 2, -step * 2, step * 0.5, -step * 0.5];\n    for (let i = 0; i < this.traces.length; i++) {\n      const currentCost = this.computeCostForTraceFast(i);\n      if (currentCost === 0) continue;\n      const trace = this.traces[i];\n      const origD1 = trace.controlParams[0];\n      const origD2 = trace.controlParams[1];\n      const origBend = trace.controlParams[2];\n      let bestCost = currentCost;\n      let bestD1 = origD1;\n      let bestD2 = origD2;\n      let bestBend = origBend;\n      for (const delta of deltas) {\n        const newD1 = origD1 + delta;\n        if (newD1 >= minDist && newD1 <= maxDist) {\n          trace.controlParams[0] = newD1;\n          this.updateTracePoints(i);\n          this.traceBounds[i] = computeTraceBounds2(trace.points);\n          const cost = this.computeCostForTraceFast(i);\n          if (cost < bestCost) {\n            bestCost = cost;\n            bestD1 = newD1;\n          }\n        }\n      }\n      trace.controlParams[0] = origD1;\n      for (const delta of deltas) {\n        const newD2 = origD2 + delta;\n        if (newD2 >= minDist && newD2 <= maxDist) {\n          trace.controlParams[1] = newD2;\n          this.updateTracePoints(i);\n          this.traceBounds[i] = computeTraceBounds2(trace.points);\n          const cost = this.computeCostForTraceFast(i);\n          if (cost < bestCost) {\n            bestCost = cost;\n            bestD2 = newD2;\n            bestD1 = origD1;\n          }\n        }\n      }\n      trace.controlParams[1] = origD2;\n      for (const delta of [step, -step, step * 0.5, -step * 0.5]) {\n        const newD1 = origD1 + delta;\n        const newD2 = origD2 + delta;\n        if (newD1 >= minDist && newD1 <= maxDist && newD2 >= minDist && newD2 <= maxDist) {\n          trace.controlParams[0] = newD1;\n          trace.controlParams[1] = newD2;\n          this.updateTracePoints(i);\n          this.traceBounds[i] = computeTraceBounds2(trace.points);\n          const cost = this.computeCostForTraceFast(i);\n          if (cost < bestCost) {\n            bestCost = cost;\n            bestD1 = newD1;\n            bestD2 = newD2;\n          }\n        }\n      }\n      trace.controlParams[0] = origD1;\n      trace.controlParams[1] = origD2;\n      for (const bendDelta of [0.3, -0.3, 0.6, -0.6, 1, -1]) {\n        trace.controlParams[2] = origBend + bendDelta;\n        this.updateTracePoints(i);\n        this.traceBounds[i] = computeTraceBounds2(trace.points);\n        const cost = this.computeCostForTraceFast(i);\n        if (cost < bestCost) {\n          bestCost = cost;\n          bestBend = trace.controlParams[2];\n          bestD1 = origD1;\n          bestD2 = origD2;\n        }\n      }\n      trace.controlParams[0] = bestD1;\n      trace.controlParams[1] = bestD2;\n      trace.controlParams[2] = bestBend;\n      this.updateTracePoints(i);\n      this.updateSingleTraceSample(i);\n    }\n    if (this.optimizationStep % 8 === 0) {\n      this.updateCollisionPairs();\n    }\n  }\n  /**\n   * Final optimization step using sample-based cost that matches scoreOutputCost\n   */\n  optimizeStepForScore() {\n    const { bounds } = this.problem;\n    const { minX, maxX, minY, maxY } = bounds;\n    const minDim = Math.min(maxX - minX, maxY - minY);\n    const step = 1;\n    const minDist = 0;\n    const maxDist = minDim * 1.5;\n    const deltas = [step, -step, step * 2, -step * 2];\n    for (let i = 0; i < this.traces.length; i++) {\n      const currentCost = this.computeScoreAlignedCost(i);\n      if (currentCost === 0) continue;\n      const trace = this.traces[i];\n      const origD1 = trace.controlParams[0];\n      const origD2 = trace.controlParams[1];\n      const origBend = trace.controlParams[2];\n      let bestCost = currentCost;\n      let bestD1 = origD1;\n      let bestD2 = origD2;\n      const bestBend = origBend;\n      for (const delta of deltas) {\n        const newD1 = origD1 + delta;\n        if (newD1 >= minDist && newD1 <= maxDist) {\n          trace.controlParams[0] = newD1;\n          this.updateTracePoints(i);\n          this.updateSingleTraceSample(i);\n          const cost = this.computeScoreAlignedCost(i);\n          if (cost < bestCost) {\n            bestCost = cost;\n            bestD1 = newD1;\n          }\n        }\n      }\n      trace.controlParams[0] = origD1;\n      for (const delta of deltas) {\n        const newD2 = origD2 + delta;\n        if (newD2 >= minDist && newD2 <= maxDist) {\n          trace.controlParams[1] = newD2;\n          this.updateTracePoints(i);\n          this.updateSingleTraceSample(i);\n          const cost = this.computeScoreAlignedCost(i);\n          if (cost < bestCost) {\n            bestCost = cost;\n            bestD2 = newD2;\n            bestD1 = origD1;\n          }\n        }\n      }\n      trace.controlParams[1] = origD2;\n      for (const delta of [step, -step]) {\n        const newD1 = origD1 + delta;\n        const newD2 = origD2 + delta;\n        if (newD1 >= minDist && newD1 <= maxDist && newD2 >= minDist && newD2 <= maxDist) {\n          trace.controlParams[0] = newD1;\n          trace.controlParams[1] = newD2;\n          this.updateTracePoints(i);\n          this.updateSingleTraceSample(i);\n          const cost = this.computeScoreAlignedCost(i);\n          if (cost < bestCost) {\n            bestCost = cost;\n            bestD1 = newD1;\n            bestD2 = newD2;\n          }\n        }\n      }\n      trace.controlParams[0] = origD1;\n      trace.controlParams[1] = origD2;\n      trace.controlParams[0] = bestD1;\n      trace.controlParams[1] = bestD2;\n      trace.controlParams[2] = bestBend;\n      this.updateTracePoints(i);\n      this.updateSingleTraceSample(i);\n    }\n  }\n  /**\n   * Cost function aligned with scoreOutputCost using preferredTraceToTraceSpacing\n   */\n  computeScoreAlignedCost(traceIdx) {\n    const { preferredTraceToTraceSpacing, preferredObstacleToTraceSpacing } = this.problem;\n    const traceSpacingSq = preferredTraceToTraceSpacing ** 2;\n    const obstacleSpacingSq = preferredObstacleToTraceSpacing ** 2;\n    const trace = this.traces[traceIdx];\n    const pi = this.sampledPoints[traceIdx];\n    const bi = this.traceBounds[traceIdx];\n    let cost = 0;\n    for (let j = 0; j < this.traces.length; j++) {\n      if (j === traceIdx) continue;\n      const other = this.traces[j];\n      if (trace.networkId && other.networkId && trace.networkId === other.networkId)\n        continue;\n      const bj = this.traceBounds[j];\n      if (bi.maxX + preferredTraceToTraceSpacing < bj.minX || bj.maxX + preferredTraceToTraceSpacing < bi.minX || bi.maxY + preferredTraceToTraceSpacing < bj.minY || bj.maxY + preferredTraceToTraceSpacing < bi.minY)\n        continue;\n      const pj = this.sampledPoints[j];\n      for (let a = 0; a < OPT_SAMPLES2; a++) {\n        const a1x = pi[a * 2];\n        const a1y = pi[a * 2 + 1];\n        const a2x = pi[(a + 1) * 2];\n        const a2y = pi[(a + 1) * 2 + 1];\n        for (let b = 0; b < OPT_SAMPLES2; b++) {\n          const b1x = pj[b * 2];\n          const b1y = pj[b * 2 + 1];\n          const b2x = pj[(b + 1) * 2];\n          const b2y = pj[(b + 1) * 2 + 1];\n          const distSq = segmentDistSq2(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y);\n          if (distSq < traceSpacingSq) {\n            const dist = Math.sqrt(distSq);\n            cost += (preferredTraceToTraceSpacing - dist) ** 2;\n          }\n        }\n      }\n    }\n    for (let obsIdx = 0; obsIdx < this.numObstacleSegments; obsIdx++) {\n      if (trace.networkId && this.obstacleNetworkIds[obsIdx] && trace.networkId === this.obstacleNetworkIds[obsIdx])\n        continue;\n      const obsBase = obsIdx * 4;\n      const ox1 = this.obstacleSegments[obsBase];\n      const oy1 = this.obstacleSegments[obsBase + 1];\n      const ox2 = this.obstacleSegments[obsBase + 2];\n      const oy2 = this.obstacleSegments[obsBase + 3];\n      for (let a = 0; a < OPT_SAMPLES2; a++) {\n        const a1x = pi[a * 2];\n        const a1y = pi[a * 2 + 1];\n        const a2x = pi[(a + 1) * 2];\n        const a2y = pi[(a + 1) * 2 + 1];\n        const distSq = segmentDistSq2(a1x, a1y, a2x, a2y, ox1, oy1, ox2, oy2);\n        if (distSq < obstacleSpacingSq) {\n          const dist = Math.sqrt(distSq);\n          cost += (preferredObstacleToTraceSpacing - dist) ** 2;\n        }\n      }\n    }\n    return cost;\n  }\n  buildOutputTraces() {\n    this.outputTraces = this.traces.map((trace) => ({\n      waypointPair: trace.waypointPair,\n      points: [...trace.points],\n      // Copy the original points\n      networkId: trace.networkId\n    }));\n  }\n  _step() {\n    if (this.traces.length === 0) {\n      this.effectiveTraceToTraceSpacing = this.problem.preferredTraceToTraceSpacing * 3;\n      this.initializeTraces();\n      for (let pass = 0; pass < 20; pass++) {\n        const resolved = this.resolveIntersections();\n        if (resolved === 0) break;\n        this.updateAllSampledTraces();\n        this.updateCollisionPairs();\n      }\n      this.lastCost = this.computeTotalCost();\n      this.stagnantSteps = 0;\n    }\n    if (this.optimizationStep < this.maxOptimizationSteps) {\n      const progress = this.optimizationStep / this.maxOptimizationSteps;\n      const startMultiplier = 3;\n      const endMultiplier = 1;\n      this.effectiveTraceToTraceSpacing = this.problem.preferredTraceToTraceSpacing * (startMultiplier + (endMultiplier - startMultiplier) * progress);\n      this.optimizeStep();\n      this.optimizationStep++;\n      if (this.optimizationStep % 10 === 0) {\n        const resolved = this.resolveIntersections();\n        if (resolved > 0) {\n          this.updateCollisionPairs();\n        }\n      }\n      const currentCost = this.computeTotalCost();\n      if (currentCost >= this.lastCost * 0.995) {\n        this.stagnantSteps++;\n        if (this.stagnantSteps > 6) {\n          this.resolveIntersections();\n          this.stagnantSteps = 0;\n        }\n        if (this.stagnantSteps > 12) {\n          this.optimizationStep = this.maxOptimizationSteps;\n        }\n      } else {\n        this.stagnantSteps = 0;\n      }\n      this.lastCost = currentCost;\n    }\n    if (this.optimizationStep >= this.maxOptimizationSteps) {\n      this.effectiveTraceToTraceSpacing = this.problem.preferredTraceToTraceSpacing;\n      this.updateAllSampledTraces();\n      this.updateCollisionPairs();\n      for (let pass = 0; pass < 8; pass++) {\n        this.optimizeStepForScore();\n      }\n      for (let i = 0; i < 30; i++) {\n        const resolved = this.resolveIntersections();\n        if (resolved === 0) break;\n        this.updateAllSampledTraces();\n        this.updateCollisionPairs();\n      }\n      this.buildOutputTraces();\n      this.solved = true;\n    }\n  }\n  visualize() {\n    if (this.traces.length > 0) {\n      this.buildOutputTraces();\n    }\n    return visualizeCurvyTraceProblem(this.problem, this.outputTraces);\n  }\n};\nexport {\n  AngledTraceSolver,\n  CurvyTraceSolver\n};\n/*! Bundled license information:\n\nis-buffer/index.js:\n  (*!\n   * Determine if an object is a Buffer\n   *\n   * @author   Feross Aboukhadijeh <https://feross.org>\n   * @license  MIT\n   *)\n\ndeep-rename-keys/index.js:\n  (*!\n   * deep-rename-keys <https://github.com/jonschlinkert/deep-rename-keys>\n   *\n   * Copyright (c) 2015 Jon Schlinkert, contributors.\n   * Licensed under the MIT license.\n   *)\n*/\n"]}