@tscircuit/eval 0.0.664 → 0.0.666
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blob-url.js +1 -1
- package/dist/webworker/entrypoint.js +2 -2
- package/package.json +3 -3
|
@@ -346,7 +346,7 @@ svg { font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif; }
|
|
|
346
346
|
`),this._line++,this._col=0):c3==`
|
|
347
347
|
`?(this._line++,this._col=0):this._col++,c3}function until(regex){for(var s2="";!regex.test(this.peek());)s2+=this.consume();return s2}function string(){for(var delimiter=this.consume(),str="";;){str+=this.until(SParser.string_or_escaped_or_end);var next2=this.peek();if(next2=="")return this.error("Unterminated string literal");if(next2==delimiter){this.consume();break}if(next2=="\\"){this.consume(),next2=this.peek(),next2=="r"?(this.consume(),str+="\r"):next2=="t"?(this.consume(),str+=" "):next2=="n"?(this.consume(),str+=`
|
|
348
348
|
`):next2=="f"?(this.consume(),str+="\f"):next2=="b"?(this.consume(),str+="\b"):str+=this.consume();continue}str+=this.consume()}return new String(str)}function atom(){if(SParser.string_delimiters.test(this.peek()))return this.string();for(var atom2="";;){atom2+=this.until(SParser.space_quote_paren_escaped_or_end);var next2=this.peek();if(next2=="\\"){this.consume(),atom2+=this.consume();continue}break}return atom2}function quoted(){var q4=this.consume(),quote=SParser.quotes_map[q4];quote=="unquote"&&this.peek()=="@"&&(this.consume(),quote="unquote-splicing",q4=",@"),this.until(SParser.not_whitespace_or_end);var quotedExpr=this.expr();return quotedExpr instanceof Error?quotedExpr:quotedExpr===""?this.error("Unexpected `"+this.peek()+"` after `"+q4+"`"):[quote,quotedExpr]}function expr(){if(this.until(SParser.not_whitespace_or_end),SParser.quotes.test(this.peek()))return this.quoted();var expr2=this.peek()=="("?this.list():this.atom();return this.until(SParser.not_whitespace_or_end),expr2}function list(){if(this.peek()!="(")return this.error("Expected `(` - saw `"+this.peek()+"` instead.");this.consume();var ls3=[],v5=this.expr();if(v5 instanceof Error)return v5;if(v5!=="")for(ls3.push(v5);(v5=this.expr())!=="";){if(v5 instanceof Error)return v5;ls3.push(v5)}return this.peek()!=")"?this.error("Expected `)` - saw: `"+this.peek()+"`"):(this.consume(),ls3)}}});var require_resolve_uri_umd=__commonJS({"node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js"(exports,module){"use strict";(function(global2,factory){typeof exports=="object"&&typeof module<"u"?module.exports=factory():typeof define=="function"&&define.amd?define(factory):(global2=typeof globalThis<"u"?globalThis:global2||self,global2.resolveURI=factory())})(exports,(function(){"use strict";let schemeRegex=/^[\w+.-]+:\/\//,urlRegex=/^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/,fileRegex=/^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;function isAbsoluteUrl(input2){return schemeRegex.test(input2)}function isSchemeRelativeUrl(input2){return input2.startsWith("//")}function isAbsolutePath(input2){return input2.startsWith("/")}function isFileUrl(input2){return input2.startsWith("file:")}function isRelative(input2){return/^[.?#]/.test(input2)}function parseAbsoluteUrl(input2){let match2=urlRegex.exec(input2);return makeUrl(match2[1],match2[2]||"",match2[3],match2[4]||"",match2[5]||"/",match2[6]||"",match2[7]||"")}function parseFileUrl(input2){let match2=fileRegex.exec(input2),path=match2[2];return makeUrl("file:","",match2[1]||"","",isAbsolutePath(path)?path:"/"+path,match2[3]||"",match2[4]||"")}function makeUrl(scheme,user,host,port,path,query,hash){return{scheme,user,host,port,path,query,hash,type:7}}function parseUrl(input2){if(isSchemeRelativeUrl(input2)){let url3=parseAbsoluteUrl("http:"+input2);return url3.scheme="",url3.type=6,url3}if(isAbsolutePath(input2)){let url3=parseAbsoluteUrl("http://foo.com"+input2);return url3.scheme="",url3.host="",url3.type=5,url3}if(isFileUrl(input2))return parseFileUrl(input2);if(isAbsoluteUrl(input2))return parseAbsoluteUrl(input2);let url2=parseAbsoluteUrl("http://foo.com/"+input2);return url2.scheme="",url2.host="",url2.type=input2?input2.startsWith("?")?3:input2.startsWith("#")?2:4:1,url2}function stripPathFilename(path){if(path.endsWith("/.."))return path;let index=path.lastIndexOf("/");return path.slice(0,index+1)}function mergePaths(url2,base){normalizePath(base,base.type),url2.path==="/"?url2.path=base.path:url2.path=stripPathFilename(base.path)+url2.path}function normalizePath(url2,type){let rel=type<=4,pieces=url2.path.split("/"),pointer=1,positive=0,addTrailingSlash=!1;for(let i2=1;i2<pieces.length;i2++){let piece=pieces[i2];if(!piece){addTrailingSlash=!0;continue}if(addTrailingSlash=!1,piece!=="."){if(piece===".."){positive?(addTrailingSlash=!0,positive--,pointer--):rel&&(pieces[pointer++]=piece);continue}pieces[pointer++]=piece,positive++}}let path="";for(let i2=1;i2<pointer;i2++)path+="/"+pieces[i2];(!path||addTrailingSlash&&!path.endsWith("/.."))&&(path+="/"),url2.path=path}function resolve(input2,base){if(!input2&&!base)return"";let url2=parseUrl(input2),inputType=url2.type;if(base&&inputType!==7){let baseUrl=parseUrl(base),baseType=baseUrl.type;switch(inputType){case 1:url2.hash=baseUrl.hash;case 2:url2.query=baseUrl.query;case 3:case 4:mergePaths(url2,baseUrl);case 5:url2.user=baseUrl.user,url2.host=baseUrl.host,url2.port=baseUrl.port;case 6:url2.scheme=baseUrl.scheme}baseType>inputType&&(inputType=baseType)}normalizePath(url2,inputType);let queryHash=url2.query+url2.hash;switch(inputType){case 2:case 3:return queryHash;case 4:{let path=url2.path.slice(1);return path?isRelative(base||input2)&&!isRelative(path)?"./"+path+queryHash:path+queryHash:queryHash||"."}case 5:return url2.path+queryHash;default:return url2.scheme+"//"+url2.user+url2.host+url2.port+url2.path+queryHash}}return resolve}))}});var require_util=__commonJS({"node_modules/ts-interface-checker/dist/util.js"(exports){"use strict";var __extends2=exports&&exports.__extends||(function(){var extendStatics2=function(d3,b3){return extendStatics2=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d4,b4){d4.__proto__=b4}||function(d4,b4){for(var p4 in b4)b4.hasOwnProperty(p4)&&(d4[p4]=b4[p4])},extendStatics2(d3,b3)};return function(d3,b3){extendStatics2(d3,b3);function __(){this.constructor=d3}d3.prototype=b3===null?Object.create(b3):(__.prototype=b3.prototype,new __)}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.DetailContext=exports.NoopContext=exports.VError=void 0;var VError=(function(_super){__extends2(VError2,_super);function VError2(path,message){var _this=_super.call(this,message)||this;return _this.path=path,Object.setPrototypeOf(_this,VError2.prototype),_this}return VError2})(Error);exports.VError=VError;var NoopContext=(function(){function NoopContext2(){}return NoopContext2.prototype.fail=function(relPath,message,score){return!1},NoopContext2.prototype.unionResolver=function(){return this},NoopContext2.prototype.createContext=function(){return this},NoopContext2.prototype.resolveUnion=function(ur4){},NoopContext2})();exports.NoopContext=NoopContext;var DetailContext=(function(){function DetailContext2(){this._propNames=[""],this._messages=[null],this._score=0}return DetailContext2.prototype.fail=function(relPath,message,score){return this._propNames.push(relPath),this._messages.push(message),this._score+=score,!1},DetailContext2.prototype.unionResolver=function(){return new DetailUnionResolver},DetailContext2.prototype.resolveUnion=function(unionResolver){for(var _a360,_b2,u4=unionResolver,best=null,_i3=0,_c3=u4.contexts;_i3<_c3.length;_i3++){var ctx=_c3[_i3];(!best||ctx._score>=best._score)&&(best=ctx)}best&&best._score>0&&((_a360=this._propNames).push.apply(_a360,best._propNames),(_b2=this._messages).push.apply(_b2,best._messages))},DetailContext2.prototype.getError=function(path){for(var msgParts=[],i2=this._propNames.length-1;i2>=0;i2--){var p4=this._propNames[i2];path+=typeof p4=="number"?"["+p4+"]":p4?"."+p4:"";var m3=this._messages[i2];m3&&msgParts.push(path+" "+m3)}return new VError(path,msgParts.join("; "))},DetailContext2.prototype.getErrorDetail=function(path){for(var details=[],i2=this._propNames.length-1;i2>=0;i2--){var p4=this._propNames[i2];path+=typeof p4=="number"?"["+p4+"]":p4?"."+p4:"";var message=this._messages[i2];message&&details.push({path,message})}for(var detail=null,i2=details.length-1;i2>=0;i2--)detail&&(details[i2].nested=[detail]),detail=details[i2];return detail},DetailContext2})();exports.DetailContext=DetailContext;var DetailUnionResolver=(function(){function DetailUnionResolver2(){this.contexts=[]}return DetailUnionResolver2.prototype.createContext=function(){var ctx=new DetailContext;return this.contexts.push(ctx),ctx},DetailUnionResolver2})()}});var require_types=__commonJS({"node_modules/ts-interface-checker/dist/types.js"(exports){"use strict";var __extends2=exports&&exports.__extends||(function(){var extendStatics2=function(d3,b3){return extendStatics2=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d4,b4){d4.__proto__=b4}||function(d4,b4){for(var p4 in b4)b4.hasOwnProperty(p4)&&(d4[p4]=b4[p4])},extendStatics2(d3,b3)};return function(d3,b3){extendStatics2(d3,b3);function __(){this.constructor=d3}d3.prototype=b3===null?Object.create(b3):(__.prototype=b3.prototype,new __)}})();Object.defineProperty(exports,"__esModule",{value:!0});exports.basicTypes=exports.BasicType=exports.TParamList=exports.TParam=exports.param=exports.TFunc=exports.func=exports.TProp=exports.TOptional=exports.opt=exports.TIface=exports.iface=exports.TEnumLiteral=exports.enumlit=exports.TEnumType=exports.enumtype=exports.TIntersection=exports.intersection=exports.TUnion=exports.union=exports.TTuple=exports.tuple=exports.TArray=exports.array=exports.TLiteral=exports.lit=exports.TName=exports.name=exports.TType=void 0;var util_1=require_util(),TType=(function(){function TType2(){}return TType2})();exports.TType=TType;function parseSpec(typeSpec){return typeof typeSpec=="string"?name(typeSpec):typeSpec}function getNamedType(suite,name2){var ttype=suite[name2];if(!ttype)throw new Error("Unknown type "+name2);return ttype}function name(value){return new TName(value)}exports.name=name;var TName=(function(_super){__extends2(TName2,_super);function TName2(name2){var _this=_super.call(this)||this;return _this.name=name2,_this._failMsg="is not a "+name2,_this}return TName2.prototype.getChecker=function(suite,strict,allowedProps){var _this=this,ttype=getNamedType(suite,this.name),checker=ttype.getChecker(suite,strict,allowedProps);return ttype instanceof BasicType||ttype instanceof TName2?checker:function(value,ctx){return checker(value,ctx)?!0:ctx.fail(null,_this._failMsg,0)}},TName2})(TType);exports.TName=TName;function lit2(value){return new TLiteral(value)}exports.lit=lit2;var TLiteral=(function(_super){__extends2(TLiteral2,_super);function TLiteral2(value){var _this=_super.call(this)||this;return _this.value=value,_this.name=JSON.stringify(value),_this._failMsg="is not "+_this.name,_this}return TLiteral2.prototype.getChecker=function(suite,strict){var _this=this;return function(value,ctx){return value===_this.value?!0:ctx.fail(null,_this._failMsg,-1)}},TLiteral2})(TType);exports.TLiteral=TLiteral;function array2(typeSpec){return new TArray(parseSpec(typeSpec))}exports.array=array2;var TArray=(function(_super){__extends2(TArray2,_super);function TArray2(ttype){var _this=_super.call(this)||this;return _this.ttype=ttype,_this}return TArray2.prototype.getChecker=function(suite,strict){var itemChecker=this.ttype.getChecker(suite,strict);return function(value,ctx){if(!Array.isArray(value))return ctx.fail(null,"is not an array",0);for(var i2=0;i2<value.length;i2++){var ok=itemChecker(value[i2],ctx);if(!ok)return ctx.fail(i2,null,1)}return!0}},TArray2})(TType);exports.TArray=TArray;function tuple(){for(var typeSpec=[],_i4=0;_i4<arguments.length;_i4++)typeSpec[_i4]=arguments[_i4];return new TTuple(typeSpec.map(function(t21){return parseSpec(t21)}))}exports.tuple=tuple;var TTuple=(function(_super){__extends2(TTuple2,_super);function TTuple2(ttypes){var _this=_super.call(this)||this;return _this.ttypes=ttypes,_this}return TTuple2.prototype.getChecker=function(suite,strict){var itemCheckers=this.ttypes.map(function(t21){return t21.getChecker(suite,strict)}),checker=function(value,ctx){if(!Array.isArray(value))return ctx.fail(null,"is not an array",0);for(var i2=0;i2<itemCheckers.length;i2++){var ok=itemCheckers[i2](value[i2],ctx);if(!ok)return ctx.fail(i2,null,1)}return!0};return strict?function(value,ctx){return checker(value,ctx)?value.length<=itemCheckers.length?!0:ctx.fail(itemCheckers.length,"is extraneous",2):!1}:checker},TTuple2})(TType);exports.TTuple=TTuple;function union2(){for(var typeSpec=[],_i4=0;_i4<arguments.length;_i4++)typeSpec[_i4]=arguments[_i4];return new TUnion(typeSpec.map(function(t21){return parseSpec(t21)}))}exports.union=union2;var TUnion=(function(_super){__extends2(TUnion2,_super);function TUnion2(ttypes){var _this=_super.call(this)||this;_this.ttypes=ttypes;var names=ttypes.map(function(t21){return t21 instanceof TName||t21 instanceof TLiteral?t21.name:null}).filter(function(n3){return n3}),otherTypes=ttypes.length-names.length;return names.length?(otherTypes>0&&names.push(otherTypes+" more"),_this._failMsg="is none of "+names.join(", ")):_this._failMsg="is none of "+otherTypes+" types",_this}return TUnion2.prototype.getChecker=function(suite,strict){var _this=this,itemCheckers=this.ttypes.map(function(t21){return t21.getChecker(suite,strict)});return function(value,ctx){for(var ur4=ctx.unionResolver(),i2=0;i2<itemCheckers.length;i2++){var ok=itemCheckers[i2](value,ur4.createContext());if(ok)return!0}return ctx.resolveUnion(ur4),ctx.fail(null,_this._failMsg,0)}},TUnion2})(TType);exports.TUnion=TUnion;function intersection(){for(var typeSpec=[],_i4=0;_i4<arguments.length;_i4++)typeSpec[_i4]=arguments[_i4];return new TIntersection(typeSpec.map(function(t21){return parseSpec(t21)}))}exports.intersection=intersection;var TIntersection=(function(_super){__extends2(TIntersection2,_super);function TIntersection2(ttypes){var _this=_super.call(this)||this;return _this.ttypes=ttypes,_this}return TIntersection2.prototype.getChecker=function(suite,strict){var allowedProps=new Set,itemCheckers=this.ttypes.map(function(t21){return t21.getChecker(suite,strict,allowedProps)});return function(value,ctx){var ok=itemCheckers.every(function(checker){return checker(value,ctx)});return ok?!0:ctx.fail(null,null,0)}},TIntersection2})(TType);exports.TIntersection=TIntersection;function enumtype(values){return new TEnumType(values)}exports.enumtype=enumtype;var TEnumType=(function(_super){__extends2(TEnumType2,_super);function TEnumType2(members){var _this=_super.call(this)||this;return _this.members=members,_this.validValues=new Set,_this._failMsg="is not a valid enum value",_this.validValues=new Set(Object.keys(members).map(function(name2){return members[name2]})),_this}return TEnumType2.prototype.getChecker=function(suite,strict){var _this=this;return function(value,ctx){return _this.validValues.has(value)?!0:ctx.fail(null,_this._failMsg,0)}},TEnumType2})(TType);exports.TEnumType=TEnumType;function enumlit(name2,prop){return new TEnumLiteral(name2,prop)}exports.enumlit=enumlit;var TEnumLiteral=(function(_super){__extends2(TEnumLiteral2,_super);function TEnumLiteral2(enumName,prop){var _this=_super.call(this)||this;return _this.enumName=enumName,_this.prop=prop,_this._failMsg="is not "+enumName+"."+prop,_this}return TEnumLiteral2.prototype.getChecker=function(suite,strict){var _this=this,ttype=getNamedType(suite,this.enumName);if(!(ttype instanceof TEnumType))throw new Error("Type "+this.enumName+" used in enumlit is not an enum type");var val=ttype.members[this.prop];if(!ttype.members.hasOwnProperty(this.prop))throw new Error("Unknown value "+this.enumName+"."+this.prop+" used in enumlit");return function(value,ctx){return value===val?!0:ctx.fail(null,_this._failMsg,-1)}},TEnumLiteral2})(TType);exports.TEnumLiteral=TEnumLiteral;function makeIfaceProps(props){return Object.keys(props).map(function(name2){return makeIfaceProp(name2,props[name2])})}function makeIfaceProp(name2,prop){return prop instanceof TOptional?new TProp(name2,prop.ttype,!0):new TProp(name2,parseSpec(prop),!1)}function iface2(bases,props){return new TIface(bases,makeIfaceProps(props))}exports.iface=iface2;var TIface=(function(_super){__extends2(TIface2,_super);function TIface2(bases,props){var _this=_super.call(this)||this;return _this.bases=bases,_this.props=props,_this.propSet=new Set(props.map(function(p4){return p4.name})),_this}return TIface2.prototype.getChecker=function(suite,strict,allowedProps){var _this=this,baseCheckers=this.bases.map(function(b3){return getNamedType(suite,b3).getChecker(suite,strict)}),propCheckers=this.props.map(function(prop){return prop.ttype.getChecker(suite,strict)}),testCtx=new util_1.NoopContext,isPropRequired=this.props.map(function(prop,i2){return!prop.isOpt&&!propCheckers[i2](void 0,testCtx)}),checker=function(value,ctx){if(typeof value!="object"||value===null)return ctx.fail(null,"is not an object",0);for(var i2=0;i2<baseCheckers.length;i2++)if(!baseCheckers[i2](value,ctx))return!1;for(var i2=0;i2<propCheckers.length;i2++){var name_1=_this.props[i2].name,v5=value[name_1];if(v5===void 0){if(isPropRequired[i2])return ctx.fail(name_1,"is missing",1)}else{var ok=propCheckers[i2](v5,ctx);if(!ok)return ctx.fail(name_1,null,1)}}return!0};if(!strict)return checker;var propSet=this.propSet;return allowedProps&&(this.propSet.forEach(function(prop){return allowedProps.add(prop)}),propSet=allowedProps),function(value,ctx){if(!checker(value,ctx))return!1;for(var prop in value)if(!propSet.has(prop))return ctx.fail(prop,"is extraneous",2);return!0}},TIface2})(TType);exports.TIface=TIface;function opt2(typeSpec){return new TOptional(parseSpec(typeSpec))}exports.opt=opt2;var TOptional=(function(_super){__extends2(TOptional2,_super);function TOptional2(ttype){var _this=_super.call(this)||this;return _this.ttype=ttype,_this}return TOptional2.prototype.getChecker=function(suite,strict){var itemChecker=this.ttype.getChecker(suite,strict);return function(value,ctx){return value===void 0||itemChecker(value,ctx)}},TOptional2})(TType);exports.TOptional=TOptional;var TProp=(function(){function TProp2(name2,ttype,isOpt){this.name=name2,this.ttype=ttype,this.isOpt=isOpt}return TProp2})();exports.TProp=TProp;function func(resultSpec){for(var params=[],_i4=1;_i4<arguments.length;_i4++)params[_i4-1]=arguments[_i4];return new TFunc(new TParamList(params),parseSpec(resultSpec))}exports.func=func;var TFunc=(function(_super){__extends2(TFunc2,_super);function TFunc2(paramList,result){var _this=_super.call(this)||this;return _this.paramList=paramList,_this.result=result,_this}return TFunc2.prototype.getChecker=function(suite,strict){return function(value,ctx){return typeof value=="function"?!0:ctx.fail(null,"is not a function",0)}},TFunc2})(TType);exports.TFunc=TFunc;function param(name2,typeSpec,isOpt){return new TParam(name2,parseSpec(typeSpec),!!isOpt)}exports.param=param;var TParam=(function(){function TParam2(name2,ttype,isOpt){this.name=name2,this.ttype=ttype,this.isOpt=isOpt}return TParam2})();exports.TParam=TParam;var TParamList=(function(_super){__extends2(TParamList2,_super);function TParamList2(params){var _this=_super.call(this)||this;return _this.params=params,_this}return TParamList2.prototype.getChecker=function(suite,strict){var _this=this,itemCheckers=this.params.map(function(t21){return t21.ttype.getChecker(suite,strict)}),testCtx=new util_1.NoopContext,isParamRequired=this.params.map(function(param2,i2){return!param2.isOpt&&!itemCheckers[i2](void 0,testCtx)}),checker=function(value,ctx){if(!Array.isArray(value))return ctx.fail(null,"is not an array",0);for(var i2=0;i2<itemCheckers.length;i2++){var p4=_this.params[i2];if(value[i2]===void 0){if(isParamRequired[i2])return ctx.fail(p4.name,"is missing",1)}else{var ok=itemCheckers[i2](value[i2],ctx);if(!ok)return ctx.fail(p4.name,null,1)}}return!0};return strict?function(value,ctx){return checker(value,ctx)?value.length<=itemCheckers.length?!0:ctx.fail(itemCheckers.length,"is extraneous",2):!1}:checker},TParamList2})(TType);exports.TParamList=TParamList;var BasicType=(function(_super){__extends2(BasicType2,_super);function BasicType2(validator,message){var _this=_super.call(this)||this;return _this.validator=validator,_this.message=message,_this}return BasicType2.prototype.getChecker=function(suite,strict){var _this=this;return function(value,ctx){return _this.validator(value)?!0:ctx.fail(null,_this.message,0)}},BasicType2})(TType);exports.BasicType=BasicType;exports.basicTypes={any:new BasicType(function(v5){return!0},"is invalid"),number:new BasicType(function(v5){return typeof v5=="number"},"is not a number"),object:new BasicType(function(v5){return typeof v5=="object"&&v5},"is not an object"),boolean:new BasicType(function(v5){return typeof v5=="boolean"},"is not a boolean"),string:new BasicType(function(v5){return typeof v5=="string"},"is not a string"),symbol:new BasicType(function(v5){return typeof v5=="symbol"},"is not a symbol"),void:new BasicType(function(v5){return v5==null},"is not void"),undefined:new BasicType(function(v5){return v5===void 0},"is not undefined"),null:new BasicType(function(v5){return v5===null},"is not null"),never:new BasicType(function(v5){return!1},"is unexpected"),Date:new BasicType(getIsNativeChecker("[object Date]"),"is not a Date"),RegExp:new BasicType(getIsNativeChecker("[object RegExp]"),"is not a RegExp")};var nativeToString=Object.prototype.toString;function getIsNativeChecker(tag){return function(v5){return typeof v5=="object"&&v5&&nativeToString.call(v5)===tag}}typeof Buffer<"u"&&(exports.basicTypes.Buffer=new BasicType(function(v5){return Buffer.isBuffer(v5)},"is not a Buffer"));var _loop_1=function(array_12){exports.basicTypes[array_12.name]=new BasicType(function(v5){return v5 instanceof array_12},"is not a "+array_12.name)};for(_i3=0,_a360=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,ArrayBuffer];_i3<_a360.length;_i3++)array_1=_a360[_i3],_loop_1(array_1);var array_1,_i3,_a360}});var require_dist=__commonJS({"node_modules/ts-interface-checker/dist/index.js"(exports){"use strict";var __spreadArrays2=exports&&exports.__spreadArrays||function(){for(var s2=0,i2=0,il3=arguments.length;i2<il3;i2++)s2+=arguments[i2].length;for(var r4=Array(s2),k4=0,i2=0;i2<il3;i2++)for(var a2=arguments[i2],j4=0,jl3=a2.length;j4<jl3;j4++,k4++)r4[k4]=a2[j4];return r4};Object.defineProperty(exports,"__esModule",{value:!0});exports.Checker=exports.createCheckers=void 0;var types_1=require_types(),util_1=require_util(),types_2=require_types();Object.defineProperty(exports,"TArray",{enumerable:!0,get:function(){return types_2.TArray}});Object.defineProperty(exports,"TEnumType",{enumerable:!0,get:function(){return types_2.TEnumType}});Object.defineProperty(exports,"TEnumLiteral",{enumerable:!0,get:function(){return types_2.TEnumLiteral}});Object.defineProperty(exports,"TFunc",{enumerable:!0,get:function(){return types_2.TFunc}});Object.defineProperty(exports,"TIface",{enumerable:!0,get:function(){return types_2.TIface}});Object.defineProperty(exports,"TLiteral",{enumerable:!0,get:function(){return types_2.TLiteral}});Object.defineProperty(exports,"TName",{enumerable:!0,get:function(){return types_2.TName}});Object.defineProperty(exports,"TOptional",{enumerable:!0,get:function(){return types_2.TOptional}});Object.defineProperty(exports,"TParam",{enumerable:!0,get:function(){return types_2.TParam}});Object.defineProperty(exports,"TParamList",{enumerable:!0,get:function(){return types_2.TParamList}});Object.defineProperty(exports,"TProp",{enumerable:!0,get:function(){return types_2.TProp}});Object.defineProperty(exports,"TTuple",{enumerable:!0,get:function(){return types_2.TTuple}});Object.defineProperty(exports,"TType",{enumerable:!0,get:function(){return types_2.TType}});Object.defineProperty(exports,"TUnion",{enumerable:!0,get:function(){return types_2.TUnion}});Object.defineProperty(exports,"TIntersection",{enumerable:!0,get:function(){return types_2.TIntersection}});Object.defineProperty(exports,"array",{enumerable:!0,get:function(){return types_2.array}});Object.defineProperty(exports,"enumlit",{enumerable:!0,get:function(){return types_2.enumlit}});Object.defineProperty(exports,"enumtype",{enumerable:!0,get:function(){return types_2.enumtype}});Object.defineProperty(exports,"func",{enumerable:!0,get:function(){return types_2.func}});Object.defineProperty(exports,"iface",{enumerable:!0,get:function(){return types_2.iface}});Object.defineProperty(exports,"lit",{enumerable:!0,get:function(){return types_2.lit}});Object.defineProperty(exports,"name",{enumerable:!0,get:function(){return types_2.name}});Object.defineProperty(exports,"opt",{enumerable:!0,get:function(){return types_2.opt}});Object.defineProperty(exports,"param",{enumerable:!0,get:function(){return types_2.param}});Object.defineProperty(exports,"tuple",{enumerable:!0,get:function(){return types_2.tuple}});Object.defineProperty(exports,"union",{enumerable:!0,get:function(){return types_2.union}});Object.defineProperty(exports,"intersection",{enumerable:!0,get:function(){return types_2.intersection}});Object.defineProperty(exports,"BasicType",{enumerable:!0,get:function(){return types_2.BasicType}});var util_2=require_util();Object.defineProperty(exports,"VError",{enumerable:!0,get:function(){return util_2.VError}});function createCheckers2(){for(var typeSuite=[],_i3=0;_i3<arguments.length;_i3++)typeSuite[_i3]=arguments[_i3];for(var fullSuite=Object.assign.apply(Object,__spreadArrays2([{},types_1.basicTypes],typeSuite)),checkers={},_a360=0,typeSuite_1=typeSuite;_a360<typeSuite_1.length;_a360++)for(var suite_1=typeSuite_1[_a360],_b2=0,_c3=Object.keys(suite_1);_b2<_c3.length;_b2++){var name=_c3[_b2];checkers[name]=new Checker(fullSuite,suite_1[name])}return checkers}exports.createCheckers=createCheckers2;var Checker=(function(){function Checker2(suite,ttype,_path){if(_path===void 0&&(_path="value"),this.suite=suite,this.ttype=ttype,this._path=_path,this.props=new Map,ttype instanceof types_1.TIface)for(var _i3=0,_a360=ttype.props;_i3<_a360.length;_i3++){var p4=_a360[_i3];this.props.set(p4.name,p4.ttype)}this.checkerPlain=this.ttype.getChecker(suite,!1),this.checkerStrict=this.ttype.getChecker(suite,!0)}return Checker2.prototype.setReportedPath=function(path){this._path=path},Checker2.prototype.check=function(value){return this._doCheck(this.checkerPlain,value)},Checker2.prototype.test=function(value){return this.checkerPlain(value,new util_1.NoopContext)},Checker2.prototype.validate=function(value){return this._doValidate(this.checkerPlain,value)},Checker2.prototype.strictCheck=function(value){return this._doCheck(this.checkerStrict,value)},Checker2.prototype.strictTest=function(value){return this.checkerStrict(value,new util_1.NoopContext)},Checker2.prototype.strictValidate=function(value){return this._doValidate(this.checkerStrict,value)},Checker2.prototype.getProp=function(prop){var ttype=this.props.get(prop);if(!ttype)throw new Error("Type has no property "+prop);return new Checker2(this.suite,ttype,this._path+"."+prop)},Checker2.prototype.methodArgs=function(methodName){var tfunc=this._getMethod(methodName);return new Checker2(this.suite,tfunc.paramList)},Checker2.prototype.methodResult=function(methodName){var tfunc=this._getMethod(methodName);return new Checker2(this.suite,tfunc.result)},Checker2.prototype.getArgs=function(){if(!(this.ttype instanceof types_1.TFunc))throw new Error("getArgs() applied to non-function");return new Checker2(this.suite,this.ttype.paramList)},Checker2.prototype.getResult=function(){if(!(this.ttype instanceof types_1.TFunc))throw new Error("getResult() applied to non-function");return new Checker2(this.suite,this.ttype.result)},Checker2.prototype.getType=function(){return this.ttype},Checker2.prototype._doCheck=function(checkerFunc,value){var noopCtx=new util_1.NoopContext;if(!checkerFunc(value,noopCtx)){var detailCtx=new util_1.DetailContext;throw checkerFunc(value,detailCtx),detailCtx.getError(this._path)}},Checker2.prototype._doValidate=function(checkerFunc,value){var noopCtx=new util_1.NoopContext;if(checkerFunc(value,noopCtx))return null;var detailCtx=new util_1.DetailContext;return checkerFunc(value,detailCtx),detailCtx.getErrorDetail(this._path)},Checker2.prototype._getMethod=function(methodName){var ttype=this.props.get(methodName);if(!ttype)throw new Error("Type has no property "+methodName);if(!(ttype instanceof types_1.TFunc))throw new Error("Property "+methodName+" is not a method");return ttype},Checker2})();exports.Checker=Checker}});var require_build=__commonJS({"node_modules/lines-and-columns/build/index.js"(exports){"use strict";exports.__esModule=!0;exports.LinesAndColumns=void 0;var LF=`
|
|
349
|
-
`,CR="\r",LinesAndColumns2=(function(){function LinesAndColumns3(string){this.string=string;for(var offsets=[0],offset=0;offset<string.length;)switch(string[offset]){case LF:offset+=LF.length,offsets.push(offset);break;case CR:offset+=CR.length,string[offset]===LF&&(offset+=LF.length),offsets.push(offset);break;default:offset++;break}this.offsets=offsets}return LinesAndColumns3.prototype.locationForIndex=function(index){if(index<0||index>this.string.length)return null;for(var line2=0,offsets=this.offsets;offsets[line2+1]<=index;)line2++;var column=index-offsets[line2];return{line:line2,column}},LinesAndColumns3.prototype.indexForLocation=function(location){var line2=location.line,column=location.column;return line2<0||line2>=this.offsets.length||column<0||column>this.lengthOfLine(line2)?null:this.offsets[line2]+column},LinesAndColumns3.prototype.lengthOfLine=function(line2){var offset=this.offsets[line2],nextOffset=line2===this.offsets.length-1?this.string.length:this.offsets[line2+1];return nextOffset-offset},LinesAndColumns3})();exports.LinesAndColumns=LinesAndColumns2;exports.default=LinesAndColumns2}});var proxyMarker=Symbol("Comlink.proxy"),createEndpoint=Symbol("Comlink.endpoint"),releaseProxy=Symbol("Comlink.releaseProxy"),finalizer=Symbol("Comlink.finalizer"),throwMarker=Symbol("Comlink.thrown"),isObject=val=>typeof val=="object"&&val!==null||typeof val=="function",proxyTransferHandler={canHandle:val=>isObject(val)&&val[proxyMarker],serialize(obj){let{port1,port2}=new MessageChannel;return expose(obj,port1),[port2,[port2]]},deserialize(port){return port.start(),wrap(port)}},throwTransferHandler={canHandle:value=>isObject(value)&&throwMarker in value,serialize({value}){let serialized;return value instanceof Error?serialized={isError:!0,value:{message:value.message,name:value.name,stack:value.stack}}:serialized={isError:!1,value},[serialized,[]]},deserialize(serialized){throw serialized.isError?Object.assign(new Error(serialized.value.message),serialized.value):serialized.value}},transferHandlers=new Map([["proxy",proxyTransferHandler],["throw",throwTransferHandler]]);function isAllowedOrigin(allowedOrigins,origin){for(let allowedOrigin of allowedOrigins)if(origin===allowedOrigin||allowedOrigin==="*"||allowedOrigin instanceof RegExp&&allowedOrigin.test(origin))return!0;return!1}function expose(obj,ep2=globalThis,allowedOrigins=["*"]){ep2.addEventListener("message",function callback(ev){if(!ev||!ev.data)return;if(!isAllowedOrigin(allowedOrigins,ev.origin)){console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);return}let{id:id2,type,path}=Object.assign({path:[]},ev.data),argumentList=(ev.data.argumentList||[]).map(fromWireValue),returnValue;try{let parent=path.slice(0,-1).reduce((obj2,prop)=>obj2[prop],obj),rawValue=path.reduce((obj2,prop)=>obj2[prop],obj);switch(type){case"GET":returnValue=rawValue;break;case"SET":parent[path.slice(-1)[0]]=fromWireValue(ev.data.value),returnValue=!0;break;case"APPLY":returnValue=rawValue.apply(parent,argumentList);break;case"CONSTRUCT":{let value=new rawValue(...argumentList);returnValue=proxy(value)}break;case"ENDPOINT":{let{port1,port2}=new MessageChannel;expose(obj,port2),returnValue=transfer(port1,[port1])}break;case"RELEASE":returnValue=void 0;break;default:return}}catch(value){returnValue={value,[throwMarker]:0}}Promise.resolve(returnValue).catch(value=>({value,[throwMarker]:0})).then(returnValue2=>{let[wireValue,transferables]=toWireValue(returnValue2);ep2.postMessage(Object.assign(Object.assign({},wireValue),{id:id2}),transferables),type==="RELEASE"&&(ep2.removeEventListener("message",callback),closeEndPoint(ep2),finalizer in obj&&typeof obj[finalizer]=="function"&&obj[finalizer]())}).catch(error=>{let[wireValue,transferables]=toWireValue({value:new TypeError("Unserializable return value"),[throwMarker]:0});ep2.postMessage(Object.assign(Object.assign({},wireValue),{id:id2}),transferables)})}),ep2.start&&ep2.start()}function isMessagePort(endpoint){return endpoint.constructor.name==="MessagePort"}function closeEndPoint(endpoint){isMessagePort(endpoint)&&endpoint.close()}function wrap(ep2,target){let pendingListeners=new Map;return ep2.addEventListener("message",function(ev){let{data}=ev;if(!data||!data.id)return;let resolver=pendingListeners.get(data.id);if(resolver)try{resolver(data)}finally{pendingListeners.delete(data.id)}}),createProxy(ep2,pendingListeners,[],target)}function throwIfProxyReleased(isReleased){if(isReleased)throw new Error("Proxy has been released and is not useable")}function releaseEndpoint(ep2){return requestResponseMessage(ep2,new Map,{type:"RELEASE"}).then(()=>{closeEndPoint(ep2)})}var proxyCounter=new WeakMap,proxyFinalizers="FinalizationRegistry"in globalThis&&new FinalizationRegistry(ep2=>{let newCount=(proxyCounter.get(ep2)||0)-1;proxyCounter.set(ep2,newCount),newCount===0&&releaseEndpoint(ep2)});function registerProxy(proxy2,ep2){let newCount=(proxyCounter.get(ep2)||0)+1;proxyCounter.set(ep2,newCount),proxyFinalizers&&proxyFinalizers.register(proxy2,ep2,proxy2)}function unregisterProxy(proxy2){proxyFinalizers&&proxyFinalizers.unregister(proxy2)}function createProxy(ep2,pendingListeners,path=[],target=function(){}){let isProxyReleased=!1,proxy2=new Proxy(target,{get(_target,prop){if(throwIfProxyReleased(isProxyReleased),prop===releaseProxy)return()=>{unregisterProxy(proxy2),releaseEndpoint(ep2),pendingListeners.clear(),isProxyReleased=!0};if(prop==="then"){if(path.length===0)return{then:()=>proxy2};let r4=requestResponseMessage(ep2,pendingListeners,{type:"GET",path:path.map(p4=>p4.toString())}).then(fromWireValue);return r4.then.bind(r4)}return createProxy(ep2,pendingListeners,[...path,prop])},set(_target,prop,rawValue){throwIfProxyReleased(isProxyReleased);let[value,transferables]=toWireValue(rawValue);return requestResponseMessage(ep2,pendingListeners,{type:"SET",path:[...path,prop].map(p4=>p4.toString()),value},transferables).then(fromWireValue)},apply(_target,_thisArg,rawArgumentList){throwIfProxyReleased(isProxyReleased);let last=path[path.length-1];if(last===createEndpoint)return requestResponseMessage(ep2,pendingListeners,{type:"ENDPOINT"}).then(fromWireValue);if(last==="bind")return createProxy(ep2,pendingListeners,path.slice(0,-1));let[argumentList,transferables]=processArguments(rawArgumentList);return requestResponseMessage(ep2,pendingListeners,{type:"APPLY",path:path.map(p4=>p4.toString()),argumentList},transferables).then(fromWireValue)},construct(_target,rawArgumentList){throwIfProxyReleased(isProxyReleased);let[argumentList,transferables]=processArguments(rawArgumentList);return requestResponseMessage(ep2,pendingListeners,{type:"CONSTRUCT",path:path.map(p4=>p4.toString()),argumentList},transferables).then(fromWireValue)}});return registerProxy(proxy2,ep2),proxy2}function myFlat(arr){return Array.prototype.concat.apply([],arr)}function processArguments(argumentList){let processed=argumentList.map(toWireValue);return[processed.map(v5=>v5[0]),myFlat(processed.map(v5=>v5[1]))]}var transferCache=new WeakMap;function transfer(obj,transfers){return transferCache.set(obj,transfers),obj}function proxy(obj){return Object.assign(obj,{[proxyMarker]:!0})}function toWireValue(value){for(let[name,handler]of transferHandlers)if(handler.canHandle(value)){let[serializedValue,transferables]=handler.serialize(value);return[{type:"HANDLER",name,value:serializedValue},transferables]}return[{type:"RAW",value},transferCache.get(value)||[]]}function fromWireValue(value){switch(value.type){case"HANDLER":return transferHandlers.get(value.name).deserialize(value.value);case"RAW":return value.value}}function requestResponseMessage(ep2,pendingListeners,msg,transfers){return new Promise(resolve=>{let id2=generateUUID();pendingListeners.set(id2,resolve),ep2.start&&ep2.start(),ep2.postMessage(Object.assign({id:id2},msg),transfers)})}function generateUUID(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}var React3=__toESM(require_react(),1);var dist_exports4={};__export(dist_exports4,{AnalogSimulation:()=>AnalogSimulation,Battery:()=>Battery,Board:()=>Board,Breakout:()=>Breakout,BreakoutPoint:()=>BreakoutPoint,CadAssembly:()=>CadAssembly,CadModel:()=>CadModel,Capacitor:()=>Capacitor,Chip:()=>Chip,Circuit:()=>Circuit,Constraint:()=>Constraint3,CopperPour:()=>CopperPour,CopperText:()=>CopperText,CourtyardCircle:()=>CourtyardCircle,CourtyardOutline:()=>CourtyardOutline,CourtyardRect:()=>CourtyardRect,Crystal:()=>Crystal,CurrentSource:()=>CurrentSource,Cutout:()=>Cutout,Diode:()=>Diode,FabricationNoteDimension:()=>FabricationNoteDimension,FabricationNotePath:()=>FabricationNotePath,FabricationNoteRect:()=>FabricationNoteRect,FabricationNoteText:()=>FabricationNoteText,Fiducial:()=>Fiducial,Footprint:()=>Footprint,Fuse:()=>Fuse,Group:()=>Group6,Hole:()=>Hole,Inductor:()=>Inductor,Interconnect:()=>Interconnect,IsolatedCircuit:()=>IsolatedCircuit,Jumper:()=>Jumper,Keepout:()=>Keepout,Led:()=>Led,Mosfet:()=>Mosfet,MountedBoard:()=>MountedBoard,Net:()=>Net,NetLabel:()=>NetLabel,NormalComponent:()=>NormalComponent3,OpAmp:()=>OpAmp,Panel:()=>Panel,PcbNoteDimension:()=>PcbNoteDimension,PcbNoteLine:()=>PcbNoteLine,PcbNotePath:()=>PcbNotePath,PcbNoteRect:()=>PcbNoteRect,PcbNoteText:()=>PcbNoteText,PcbTrace:()=>PcbTrace,PinHeader:()=>PinHeader,Pinout:()=>Pinout,PlatedHole:()=>PlatedHole,Port:()=>Port,Potentiometer:()=>Potentiometer,PowerSource:()=>PowerSource,PrimitiveComponent:()=>PrimitiveComponent2,Project:()=>Project,PushButton:()=>PushButton,Renderable:()=>Renderable,Resistor:()=>Resistor,Resonator:()=>Resonator,RootCircuit:()=>RootCircuit,SOLVERS:()=>SOLVERS,SchematicArc:()=>SchematicArc,SchematicBox:()=>SchematicBox,SchematicCell:()=>SchematicCell,SchematicCircle:()=>SchematicCircle,SchematicLine:()=>SchematicLine,SchematicPath:()=>SchematicPath,SchematicRect:()=>SchematicRect,SchematicRow:()=>SchematicRow,SchematicTable:()=>SchematicTable,SchematicText:()=>SchematicText,SilkscreenCircle:()=>SilkscreenCircle,SilkscreenLine:()=>SilkscreenLine,SilkscreenPath:()=>SilkscreenPath,SilkscreenRect:()=>SilkscreenRect,SilkscreenText:()=>SilkscreenText,SmtPad:()=>SmtPad,SolderJumper:()=>SolderJumper,Subcircuit:()=>Subcircuit,Subpanel:()=>Subpanel,Switch:()=>Switch,Symbol:()=>SymbolComponent,TestPoint:()=>TestPoint,Trace:()=>Trace3,TraceHint:()=>TraceHint,Transistor:()=>Transistor,Via:()=>Via,VoltageProbe:()=>VoltageProbe,VoltageSource:()=>VoltageSource,applyEditEvents:()=>applyEditEvents,applyEditEventsToManualEditsFile:()=>applyEditEventsToManualEditsFile,applyPcbEditEventsToManualEditsFile:()=>applyPcbEditEventsToManualEditsFile,applySchematicEditEventsToManualEditsFile:()=>applySchematicEditEventsToManualEditsFile,createElement:()=>import_react7.createElement,createUseComponent:()=>createUseComponent,getPhaseTimingsFromRenderEvents:()=>getPhaseTimingsFromRenderEvents,getSimpleRouteJsonFromCircuitJson:()=>getSimpleRouteJsonFromCircuitJson,normalizePinLabels:()=>normalizePinLabels,orderedRenderPhases:()=>orderedRenderPhases,renderPhaseIndexMap:()=>renderPhaseIndexMap,resolveStaticFileImport:()=>resolveStaticFileImport,sel:()=>sel,useCapacitor:()=>useCapacitor,useChip:()=>useChip,useDiode:()=>useDiode,useLed:()=>useLed,useRenderedCircuit:()=>useRenderedCircuit,useResistor:()=>useResistor});init_zod();init_zod();var unitToMm={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mm=n3=>{let unit=typeof n3=="number"?"mm":n3.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n3=="number"?n3:Number.parseFloat(n3.split(unit)[0]);if(unit in unitToMm)return val*unitToMm[unit];throw new Error(`Unsupported unit: ${unit}`)};var mm_default=mm;init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();var __defProp2=Object.defineProperty,__export2=(target,all)=>{for(var name in all)__defProp2(target,name,{get:all[name],enumerable:!0})},fn_exports={};__export2(fn_exports,{axial:()=>axial,bga:()=>bga,breakoutheaders:()=>breakoutheaders,cap:()=>cap,dfn:()=>dfn,diode:()=>diode,dip:()=>dip,electrolytic:()=>electrolytic,hc49:()=>hc49,jst:()=>jst,led:()=>led,lqfp:()=>lqfp,m2host:()=>m2host,melf:()=>melf,micromelf:()=>micromelf,minimelf:()=>minimelf,mlp:()=>mlp,ms012:()=>ms012,ms013:()=>ms013,msop:()=>msop,pad:()=>pad,pinrow:()=>pinrow,platedhole:()=>platedhole2,potentiometer:()=>potentiometer,pushbutton:()=>pushbutton,qfn:()=>qfn,qfp:()=>qfp,quad:()=>quad,radial:()=>radial,res:()=>res,sma:()=>sma,smb:()=>smb,smbf:()=>smbf,smc:()=>smc,smf:()=>smf,smtpad:()=>smtpad,sod110:()=>sod110,sod123:()=>sod123,sod123f:()=>sod123f,sod123fl:()=>sod123fl,sod123w:()=>sod123w,sod128:()=>sod128,sod323:()=>sod323,sod323f:()=>sod323f,sod323fl:()=>sod323fl,sod323w:()=>sod323w,sod523:()=>sod523,sod723:()=>sod723,sod80:()=>sod80,sod882:()=>sod882,sod882d:()=>sod882d,sod923:()=>sod923,soic:()=>soic,solderjumper:()=>solderjumper,son:()=>son,sop8:()=>sop8,sot:()=>sot,sot223:()=>sot223,sot23:()=>sot23,sot23w:()=>sot23w,sot25:()=>sot25,sot323:()=>sot323,sot343:()=>sot343,sot363:()=>sot363,sot457:()=>sot457,sot563:()=>sot563,sot723:()=>sot723,sot886:()=>sot886,sot89:()=>sot89,sot963:()=>sot963,ssop:()=>ssop,stampboard:()=>stampboard,stampreceiver:()=>stampreceiver,to220:()=>to220,to92:()=>to92,to92l:()=>to92l,to92s:()=>to92s,tqfp:()=>tqfp,tssop:()=>tssop,vssop:()=>vssop});var silkscreenRef=(x5,y5,font_size)=>({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"silkscreen_text_1",font:"tscircuit2024",font_size,pcb_component_id:"pcb_component_1",text:"{REF}",layer:"top",anchor_position:{x:x5,y:y5},anchor_alignment:"center"}),base_def=external_exports.object({norefdes:external_exports.boolean().optional().describe("disable reference designator label"),invert:external_exports.boolean().optional().describe("hint to invert the orientation of the 3D model"),faceup:external_exports.boolean().optional().describe("The male pin header should face upwards, out of the top layer"),nosilkscreen:external_exports.boolean().optional().describe("omit all silkscreen elements from the footprint")}),platedhole=(pn3,x5,y5,id2,od3)=>({pcb_plated_hole_id:"",type:"pcb_plated_hole",shape:"circle",x:x5,y:y5,hole_diameter:mm(id2),outer_diameter:mm(od3),pcb_port_id:"",layers:["top","bottom"],port_hints:[pn3.toString()]}),platedHoleWithRectPad=(pn3,x5,y5,holeDiameter,rectPadWidth,rectPadHeight,holeOffsetX,holeOffsetY)=>({pcb_plated_hole_id:"",type:"pcb_plated_hole",shape:"circular_hole_with_rect_pad",x:x5,y:y5,hole_diameter:mm(holeDiameter),hole_shape:"circle",pad_shape:"rect",rect_pad_width:mm(rectPadWidth),rect_pad_height:mm(rectPadHeight),pcb_port_id:"",layers:["top","bottom"],port_hints:[pn3.toString()],hole_offset_x:holeOffsetX,hole_offset_y:holeOffsetY}),u_curve=Array.from({length:9},(_5,i2)=>Math.cos(i2/8*Math.PI-Math.PI)).map(x5=>({x:x5,y:-Math.sqrt(1-x5**2)}));function convertMilToMm(value){return typeof value=="string"?value.trim().toLowerCase().endsWith("mil")?parseFloat(value)*.0254:parseFloat(value):Number(value)}var lengthInMm=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>convertMilToMm(val)),extendDipDef=newDefaults=>base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(6),wide:external_exports.boolean().optional(),narrow:external_exports.boolean().optional(),w:lengthInMm.optional(),p:lengthInMm.default(newDefaults.p??"2.54mm"),id:lengthInMm.optional(),od:lengthInMm.optional(),nosquareplating:external_exports.boolean().optional().default(!1).describe("do not use rectangular pad for pin 1")}).transform(v5=>(!v5.id&&!v5.od?Math.abs(v5.p-1.27)<.01?(v5.id=convertMilToMm("0.55mm"),v5.od=convertMilToMm("0.95mm")):(v5.id=convertMilToMm("0.8mm"),v5.od=convertMilToMm("1.6mm")):v5.id?v5.od||(v5.od=v5.id*(1.5/1)):v5.id=v5.od*(1/1.5),v5.w||(v5.wide?v5.w=convertMilToMm("600mil"):v5.narrow?v5.w=convertMilToMm("300mil"):v5.w=convertMilToMm(newDefaults.w??"300mil")),v5)),dip_def=extendDipDef({}),getCcwDipCoords=(pinCount,pn3,w4,p4,nosquareplating)=>{let ph3=pinCount/2,isLeft=pn3<=ph3,leftPinGaps=ph3-1,gs3=p4,h4=gs3*leftPinGaps;return isLeft?{x:-w4/2,y:h4/2-(pn3-1)*gs3}:{x:w4/2,y:-h4/2+(pn3-ph3-1)*gs3}},dip=raw_params=>{let parameters=dip_def.parse(raw_params),platedHoles=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwDipCoords(parameters.num_pins,i2+1,parameters.w,parameters.p??2.54,parameters.nosquareplating);if(i2===0&&!parameters.nosquareplating){platedHoles.push(platedHoleWithRectPad(i2+1,x5,y5,parameters.id??"0.8mm",parameters.od??"1mm",parameters.od??"1mm"));continue}platedHoles.push(platedhole(i2+1,x5,y5,parameters.id??"0.8mm",parameters.od??"1mm"))}let padEdgeHeight=(parameters.num_pins/2-1)*parameters.p+parameters.od,sw=parameters.w-parameters.od-1,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.od+.4,silkscreenBorder={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-sw/2,y:-sh3/2},{x:-sw/2,y:sh3/2},...u_curve.map(({x:x5,y:y5})=>({x:x5*sw/6,y:y5*sw/6+sh3/2})),{x:sw/2,y:sh3/2},{x:sw/2,y:-sh3/2},{x:-sw/2,y:-sh3/2}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPins=[];for(let i2=0;i2<parameters.num_pins;i2++){let isLeft=i2<parameters.num_pins/2,clearance=.6,{y:pinCenterY}=getCcwDipCoords(parameters.num_pins,i2+1,parameters.w,parameters.p??2.54,parameters.nosquareplating),pinLabelX=isLeft?-parameters.w/2-parameters.od/2-clearance:parameters.w/2+parameters.od/2+clearance,pinLabelY=pinCenterY;silkscreenPins.push({type:"pcb_fabrication_note_text",pcb_fabrication_note_text_id:`pin_${i2+1}`,layer:"top",pcb_component_id:`pin_${i2+1}`,text:`{pin${i2+1}}`,anchor_position:{x:pinLabelX,y:pinLabelY},font_size:.3,font:"tscircuit2024",anchor_alignment:"top_left"})}let silkscreenRefText=silkscreenRef(0,sh3/2+.5,.4);return{circuitJson:[...platedHoles,silkscreenBorder,silkscreenRefText,...silkscreenPins],parameters}},rectpad=(pn3,x5,y5,w4,h4)=>({type:"pcb_smtpad",x:x5,y:y5,width:w4,height:h4,layer:"top",shape:"rect",pcb_smtpad_id:"",port_hints:Array.isArray(pn3)?pn3.map(item=>item.toString()):[pn3.toString()]}),footprintSizes=[{imperial:"01005",metric:"0402",p_mm_min:.5,pw_mm_min:.4,ph_mm_min:.3,w_mm_min:.58,h_mm_min:.21},{imperial:"0504",metric:"1310",p_mm_min:1.1,pw_mm_min:.65,ph_mm_min:1.3,w_mm_min:.58,h_mm_min:.21},{imperial:"1812",metric:"4532",p_mm_min:4.275,pw_mm_min:1.125,ph_mm_min:3.4,w_mm_min:5.4,h_mm_min:3.4},{imperial:"0201",metric:"0603",p_mm_min:.66,pw_mm_min:.46,ph_mm_min:.4,w_mm_min:.9,h_mm_min:.3},{imperial:"0402",metric:"1005",p_mm_min:1.02,pw_mm_min:.54,ph_mm_min:.64,w_mm_min:1.56,h_mm_min:.64},{imperial:"0603",metric:"1608",p_mm_min:1.65,pw_mm_min:.8,ph_mm_min:.95,w_mm_min:2.45,h_mm_min:.95},{imperial:"0805",metric:"2012",p_mm_min:1.825,pw_mm_min:1.025,ph_mm_min:1.4,w_mm_min:2.8499999999999996,h_mm_min:1.4},{imperial:"1206",metric:"3216",p_mm_min:2.925,pw_mm_min:1.125,ph_mm_min:1.75,w_mm_min:4.05,h_mm_min:1.75},{imperial:"1210",metric:"3225",p_mm_min:2.925,pw_mm_min:1.125,ph_mm_min:2.65,w_mm_min:4.05,h_mm_min:2.65},{imperial:"2010",metric:"5025",p_mm_min:4.625,pw_mm_min:1.225,ph_mm_min:2.65,w_mm_min:5.85,h_mm_min:2.65},{imperial:"2512",metric:"6332",p_mm_min:5.925,pw_mm_min:1.225,ph_mm_min:3.35,w_mm_min:7.15,h_mm_min:3.35}],metricMap=Object.fromEntries(footprintSizes.map(s2=>[s2.metric,s2])),imperialMap=Object.fromEntries(footprintSizes.map(s2=>[s2.imperial,s2])),passive_def=base_def.extend({tht:external_exports.boolean(),p:length.optional(),pw:length.optional(),ph:length.optional(),metric:distance.optional(),imperial:distance.optional(),w:length.optional(),h:length.optional(),textbottom:external_exports.boolean().optional()}),passive=params=>{let{tht,p:p4,pw,ph:ph3,metric,imperial,w:w4,h:h4,textbottom}=params;if(typeof w4=="string"&&(w4=mm_default(w4)),typeof h4=="string"&&(h4=mm_default(h4)),typeof p4=="string"&&(p4=mm_default(p4)),typeof pw=="string"&&(pw=mm_default(pw)),typeof ph3=="string"&&(ph3=mm_default(ph3)),h4!==void 0&&w4!==void 0&&h4>w4)throw new Error("height cannot be greater than width (rotated footprint not yet implemented)");let sz;if(metric&&(sz=metricMap[metric]),imperial&&(sz=imperialMap[imperial]),sz&&(w4=sz.w_mm_min,h4=sz.h_mm_min,p4=sz.p_mm_min,pw=sz.pw_mm_min,ph3=sz.ph_mm_min),p4===void 0||pw===void 0||ph3===void 0)throw new Error("Could not determine required pad dimensions (p, pw, ph)");let silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:p4/2,y:ph3/2+.4},{x:-p4/2-pw/2-.2,y:ph3/2+.4},{x:-p4/2-pw/2-.2,y:-ph3/2-.4},{x:p4/2,y:-ph3/2-.4}],stroke_width:.1,pcb_silkscreen_path_id:""},textY=textbottom?-ph3/2-.9:ph3/2+.9,silkscreenRefText=silkscreenRef(0,textY,.2);return tht?[platedhole(1,-p4/2,0,pw,pw*1/.8),platedhole(2,p4/2,0,pw,pw*1/.8),silkscreenLine,silkscreenRefText]:[rectpad(["1","left"],-p4/2,0,pw,ph3),rectpad(["2","right"],p4/2,0,pw,ph3),silkscreenLine,silkscreenRefText]},diode=parameters=>({circuitJson:passive(parameters),parameters}),cap=parameters=>({circuitJson:passive(parameters),parameters}),led=parameters=>({circuitJson:passive(parameters),parameters}),chipArray=params=>{let{padSpacing:padSpacing7,padWidth,padHeight,padPitch,numRows,textbottom}=params,yPositions=[],halfRange=(numRows-1)*(padPitch/2);for(let i2=0;i2<numRows;i2++)yPositions.push(halfRange-i2*padPitch);let pads=[];yPositions.forEach((y5,index)=>{pads.push(rectpad(index+1,-padSpacing7/2,y5,padWidth,padHeight))}),yPositions.slice().reverse().forEach((y5,index)=>{pads.push(rectpad(index+numRows+1,padSpacing7/2,y5,padWidth,padHeight))});let top=Math.max(...yPositions)+padHeight/2+.4,bottom=Math.min(...yPositions)-padHeight/2-.4,left=-padSpacing7/2-padWidth/2-.4,right=padSpacing7/2+padWidth/2+.4,silkscreenTop={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:right*.5,y:top},{x:left*.5,y:top}],stroke_width:.12,pcb_silkscreen_path_id:"silkscreen_top"},silkscreenBottom={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:right*.5,y:bottom},{x:left*.5,y:bottom}],stroke_width:.12,pcb_silkscreen_path_id:"silkscreen_bottom"},pin1X=-padSpacing7/2,pin1Y=Math.max(...yPositions),pin1MarkerSize=.2,pin1Left=pin1X-padWidth/2-.1,pin1Top=pin1Y+padHeight/2+.1,pin1Marker={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_marker",route:[{x:pin1Left,y:pin1Top},{x:pin1Left-pin1MarkerSize,y:pin1Top},{x:pin1Left,y:pin1Top+pin1MarkerSize},{x:pin1Left,y:pin1Top}],stroke_width:.1},textY=textbottom?bottom-.9:top+.9,silkscreenRefText=silkscreenRef(0,textY,.2);return[...pads,silkscreenTop,silkscreenBottom,pin1Marker,silkscreenRefText]},res0402Array2_def=base_def.extend({pw:external_exports.string().default("0.5mm"),ph:external_exports.string().default("0.4mm"),p:external_exports.string().default("0.7mm"),textbottom:external_exports.boolean().optional()}),padSpacing=1,res0402Array2=rawParams=>{let params=res0402Array2_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing,padWidth,padHeight,padPitch,numRows:2,textbottom:params.textbottom})},res0402Array4_def=base_def.extend({pw:external_exports.string().default("0.5mm"),ph:external_exports.string().default("0.32mm"),p:external_exports.string().default("0.5mm"),textbottom:external_exports.boolean().optional()}),padSpacing2=1,res0402Array4=rawParams=>{let params=res0402Array4_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing2,padWidth,padHeight,padPitch,numRows:4,textbottom:params.textbottom})},res0603Array2_def=base_def.extend({pw:external_exports.string().default("0.9mm"),ph:external_exports.string().default("0.4mm"),p:external_exports.string().default("0.8mm"),textbottom:external_exports.boolean().optional()}),padSpacing3=1.7,res0603Array2=rawParams=>{let params=res0603Array2_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing3,padWidth,padHeight,padPitch,numRows:2,textbottom:params.textbottom})},res0603Array4_def=base_def.extend({pw:external_exports.string().default("0.9mm"),ph:external_exports.string().default("0.4mm"),p:external_exports.string().default("0.8mm"),textbottom:external_exports.boolean().optional()}),padSpacing4=1.7,res0603Array4=rawParams=>{let params=res0603Array4_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing4,padWidth,padHeight,padPitch,numRows:4,textbottom:params.textbottom})},res0606Array2_def=base_def.extend({pw:external_exports.string().default("0.7mm"),ph:external_exports.string().default("0.64mm"),p:external_exports.string().default("0.94mm"),textbottom:external_exports.boolean().optional()}),padSpacing5=1.4,res0606Array2=rawParams=>{let params=res0606Array2_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing5,padWidth,padHeight,padPitch,numRows:2,textbottom:params.textbottom})},res1206Array4_def=base_def.extend({pw:external_exports.string().default("0.9mm"),ph:external_exports.string().default("0.9mm"),p:external_exports.string().default("1.34mm"),textbottom:external_exports.boolean().optional()}),padSpacing6=3,res1206Array4=rawParams=>{let params=res1206Array4_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing6,padWidth,padHeight,padPitch,numRows:4,textbottom:params.textbottom})},getArrayCount=parameters=>{let arrayValue=parameters.array??parameters.x;if(typeof arrayValue=="number")return Number.isNaN(arrayValue)?void 0:arrayValue;if(typeof arrayValue=="string"){let parsed=Number.parseInt(arrayValue,10);return Number.isNaN(parsed)?void 0:parsed}if(typeof parameters.imperial=="string"){let count=parameters.imperial.match(/(?:array|x)(2|4)$/)?.[1];if(count)return Number.parseInt(count,10)}},getImperialBase=imperial=>imperial?(typeof imperial=="number"?`${imperial}`:imperial).split("_")[0]:void 0,res=rawParameters=>{let arrayCount=getArrayCount(rawParameters),imperialBase=getImperialBase(rawParameters.imperial);return arrayCount===2&&imperialBase==="0402"?{circuitJson:res0402Array2(rawParameters),parameters:rawParameters}:arrayCount===4&&imperialBase==="0402"?{circuitJson:res0402Array4(rawParameters),parameters:rawParameters}:arrayCount===2&&imperialBase==="0603"?{circuitJson:res0603Array2(rawParameters),parameters:rawParameters}:arrayCount===4&&imperialBase==="0603"?{circuitJson:res0603Array4(rawParameters),parameters:rawParameters}:arrayCount===2&&imperialBase==="0606"?{circuitJson:res0606Array2(rawParameters),parameters:rawParameters}:arrayCount===4&&imperialBase==="1206"?{circuitJson:res1206Array4(rawParameters),parameters:rawParameters}:{circuitJson:passive(rawParameters),parameters:rawParameters}},circlepad=(pn3,{x:x5,y:y5,radius})=>({type:"pcb_smtpad",x:x5,y:y5,radius,layer:"top",shape:"circle",pcb_smtpad_id:"",port_hints:Array.isArray(pn3)?pn3.map(item=>item.toString()):[pn3.toString()]}),ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZ",dim2d=external_exports.string().transform(a2=>{let[x5,y5]=a2.split(/[x ]/);return{x:parseFloat(x5),y:parseFloat(y5)}}).pipe(external_exports.object({x:external_exports.number(),y:external_exports.number()})),function_call=external_exports.string().or(external_exports.array(external_exports.any())).transform(a2=>Array.isArray(a2)?a2:(a2.startsWith("(")&&a2.endsWith(")")&&(a2=a2.slice(1,-1)),a2.split(",").map(v5=>{let numVal=Number(v5);return isNaN(numVal)?v5:numVal}))).pipe(external_exports.array(external_exports.string().or(external_exports.number()))),bga_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(64),grid:dim2d.optional(),p:distance.default("0.8mm"),w:length.optional(),h:length.optional(),ball:length.optional().describe("ball diameter"),pad:length.optional().describe("pad width/height"),circularpads:external_exports.boolean().optional().describe("use circular pads"),tlorigin:external_exports.boolean().optional(),blorigin:external_exports.boolean().optional(),trorigin:external_exports.boolean().optional(),brorigin:external_exports.boolean().optional(),missing:function_call.default([])}).transform(a2=>{let origin="tl";if(a2.blorigin&&(origin="bl"),a2.trorigin&&(origin="tr"),a2.brorigin&&(origin="br"),!a2.grid){let largest_square=Math.ceil(Math.sqrt(a2.num_pins));a2.grid={x:largest_square,y:largest_square}}return a2.missing&&(a2.missing=a2.missing.map(s2=>{if(typeof s2=="number")return s2;if(s2==="center")return"center";if(s2==="topleft")return"topleft";let m3=s2.match(/([A-Z]+)(\d+)/);if(!m3)return s2;let Y6=ALPHABET.indexOf(m3[1]),X6=Number.parseInt(m3[2])-1;return Y6*a2.grid.x+X6+1})),{...a2,origin}}),bga=raw_params=>{let parameters=bga_def.parse(raw_params),{num_pins,grid:grid4,p:p4,w:w4,h:h4,ball,pad:pad2,missing}=parameters;ball??(ball=.75/1.27*p4),pad2??(pad2=ball*.8);let pads=[],missing_pin_nums=(missing??[]).filter(a2=>typeof a2=="number"),num_pins_missing=grid4.x*grid4.y-num_pins;if(missing.length===0&&num_pins_missing>0&&(Math.sqrt(num_pins_missing)%1===0?missing.push("center"):num_pins_missing===1&&missing.push("topleft")),missing?.includes("center")){let square_size=Math.floor(Math.sqrt(num_pins_missing)),inner_square_x=Math.floor((grid4.x-square_size)/2),inner_square_y=Math.floor((grid4.y-square_size)/2);for(let y5=inner_square_y;y5<inner_square_y+square_size;y5++)for(let x5=inner_square_x;x5<inner_square_x+square_size;x5++)missing_pin_nums.push(y5*grid4.x+x5+1)}missing?.includes("topleft")&&missing_pin_nums.push(1);let missing_pin_nums_set=new Set(missing_pin_nums),missing_pins_passed=0;for(let y5=0;y5<grid4.y;y5++)for(let x5=0;x5<grid4.x;x5++){let pad_x=(x5-(grid4.x-1)/2)*p4,pad_y=(y5-(grid4.y-1)/2)*p4,pin_x=x5,pin_y=y5;switch(parameters.origin){case"bl":pin_x=x5,pin_y=grid4.y-1-y5;break;case"br":pin_x=grid4.x-1-x5,pin_y=grid4.y-1-y5;break;case"tr":pin_x=grid4.x-1-x5,pin_y=y5;break;default:break}let pin_num=pin_y*grid4.x+pin_x+1;if(missing_pin_nums_set.has(pin_num)){missing_pins_passed++;continue}pin_num-=missing_pins_passed;let portHints2=[pin_num,`${ALPHABET[pin_y]}${pin_x+1}`];pads.push(parameters.circularpads?circlepad(portHints2,{x:pad_x,y:pad_y,radius:pad2/2}):rectpad(portHints2,pad_x,pad_y,pad2,pad2))}let silkscreenRefText=silkscreenRef(0,grid4.y*p4/2,.2),pin1MarkerSize=p4/6,markerRoute,edgeX=grid4.x*p4/2,edgeY=grid4.y*p4/2;switch(parameters.origin){case"bl":markerRoute=[{x:-edgeX,y:-edgeY},{x:-edgeX,y:-edgeY-pin1MarkerSize},{x:-edgeX-pin1MarkerSize,y:-edgeY},{x:-edgeX,y:-edgeY}];break;case"br":markerRoute=[{x:edgeX,y:-edgeY},{x:edgeX,y:-edgeY-pin1MarkerSize},{x:edgeX+pin1MarkerSize,y:-edgeY},{x:edgeX,y:-edgeY}];break;case"tr":markerRoute=[{x:edgeX,y:edgeY},{x:edgeX,y:edgeY+pin1MarkerSize},{x:edgeX+pin1MarkerSize,y:edgeY},{x:edgeX,y:edgeY}];break;default:markerRoute=[{x:-edgeX,y:edgeY},{x:-edgeX,y:edgeY+pin1MarkerSize},{x:-edgeX-pin1MarkerSize,y:edgeY},{x:-edgeX,y:edgeY}];break}let pin1Marker={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_marker",route:markerRoute,stroke_width:.05};return{circuitJson:[...pads,silkscreenRefText,pin1Marker],parameters}},pillpad=(pn3,x5,y5,w4,h4)=>({type:"pcb_smtpad",x:x5,y:y5,width:w4,height:h4,radius:h4/2,layer:"top",shape:"pill",pcb_smtpad_id:"",port_hints:Array.isArray(pn3)?pn3.map(item=>item.toString()):[pn3.toString()]}),extendSoicDef=newDefaults=>base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(8),w:length.default(length.parse(newDefaults.w??"5.3mm")),p:length.default(length.parse(newDefaults.p??"1.27mm")),pw:length.default(length.parse(newDefaults.pw??"0.6mm")),pl:length.default(length.parse(newDefaults.pl??"1.0mm")),legsoutside:external_exports.boolean().optional().default(newDefaults.legsoutside??!1),pillpads:external_exports.boolean().optional().default(newDefaults.pillpads??!1),silkscreen_stroke_width:external_exports.number().optional().default(.1)}).transform(v5=>(!v5.pw&&!v5.pl?(v5.pw=length.parse("0.6mm"),v5.pl=length.parse("1.0mm")):v5.pw?v5.pl||(v5.pl=v5.pw*(1/.6)):v5.pw=v5.pl*(.6/1),v5)),soic_def=extendSoicDef({}),getCcwSoicCoords=parameters=>{parameters.widthincludeslegs!==void 0&&(parameters.legsoutside=!parameters.widthincludeslegs);let{num_pins,pn:pn3,w:w4,p:p4,pl:pl3,legsoutside}=parameters,ph3=num_pins/2,isLeft=pn3<=ph3,leftPinGaps=ph3-1,gs3=p4,h4=gs3*leftPinGaps,legoffset=legsoutside?pl3/2:-pl3/2;return isLeft?{x:-w4/2-legoffset,y:h4/2-(pn3-1)*gs3}:{x:w4/2+legoffset,y:-h4/2+(pn3-ph3-1)*gs3}},soic=raw_params=>{let parameters=soic_def.parse(raw_params);return{circuitJson:soicWithoutParsing(parameters),parameters}},soicWithoutParsing=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSoicCoords({num_pins:parameters.num_pins,pn:i2+1,w:parameters.w,p:parameters.p,pl:parameters.pl,legsoutside:parameters.legsoutside});parameters.pillpads?pads.push(pillpad(i2+1,x5,y5,parameters.pl,parameters.pw)):pads.push(rectpad(i2+1,x5,y5,parameters.pl,parameters.pw))}let m3=Math.min(1,parameters.p/2),sw=parameters.w-(parameters.legsoutside?0:parameters.pl*2)-.2,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw+m3,silkscreenRefText=silkscreenRef(0,sh3/2+.4,sh3/12),silkscreenBorder={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",stroke_width:parameters.silkscreen_stroke_width??.1,route:[{x:-sw/2,y:-sh3/2},{x:-sw/2,y:sh3/2},...u_curve.map(({x:x5,y:y5})=>({x:x5*sw/6,y:y5*sw/6+sh3/2})),{x:sw/2,y:sh3/2},{x:sw/2,y:-sh3/2},{x:-sw/2,y:-sh3/2}]};return[...pads,silkscreenBorder,silkscreenRefText]},pin_order_specifier=external_exports.enum(["leftside","topside","rightside","bottomside","toppin","bottompin","leftpin","rightpin"]),getQuadPinMap=({num_pins,cw:cw2,ccw,startingpin})=>{let pin_map=[],pins_per_side=num_pins/4,current_position_ccw_normal=1,sfp={};for(let specifier of startingpin??[])sfp[specifier]=!0;!sfp.leftside&&!sfp.topside&&!sfp.rightside&&!sfp.bottomside&&(sfp.leftside=!0),!sfp.bottompin&&!sfp.leftpin&&!sfp.rightpin&&!sfp.toppin&&(sfp.leftside?sfp.toppin=!0:sfp.topside?sfp.rightpin=!0:sfp.rightside?sfp.bottompin=!0:sfp.bottomside&&(sfp.leftpin=!0)),sfp.leftside&&sfp.toppin?current_position_ccw_normal=1:sfp.leftside&&sfp.bottompin?current_position_ccw_normal=pins_per_side:sfp.bottomside&&sfp.leftpin?current_position_ccw_normal=pins_per_side+1:sfp.bottomside&&sfp.rightpin?current_position_ccw_normal=pins_per_side*2:sfp.rightside&&sfp.bottompin?current_position_ccw_normal=pins_per_side*2+1:sfp.rightside&&sfp.toppin?current_position_ccw_normal=pins_per_side*3:sfp.topside&&sfp.rightpin?current_position_ccw_normal=pins_per_side*3+1:sfp.topside&&sfp.leftpin&&(current_position_ccw_normal=pins_per_side*4),pin_map.push(-1);for(let i2=0;i2<num_pins;i2++)pin_map[current_position_ccw_normal]=i2+1,ccw||!cw2?(current_position_ccw_normal++,current_position_ccw_normal>num_pins&&(current_position_ccw_normal=1)):(current_position_ccw_normal--,current_position_ccw_normal<1&&(current_position_ccw_normal=num_pins));return pin_map},base_quad_def=base_def.extend({fn:external_exports.string(),cc:external_exports.boolean().default(!0).optional(),ccw:external_exports.boolean().default(!0).optional(),startingpin:external_exports.string().or(external_exports.array(pin_order_specifier)).transform(a2=>typeof a2=="string"?a2.slice(1,-1).split(","):a2).pipe(external_exports.array(pin_order_specifier)).optional(),num_pins:external_exports.number().optional().default(64),w:length.optional(),h:length.optional(),p:length.default(length.parse("0.5mm")),pw:length.optional(),pl:length.optional(),thermalpad:external_exports.union([external_exports.literal(!0),dim2d]).optional(),legsoutside:external_exports.boolean().default(!1)}),quadTransform=v5=>{v5.w&&!v5.h?v5.h=v5.w:!v5.w&&v5.h&&(v5.w=v5.h);let side_pin_count=v5.num_pins/4;if(!v5.p&&!v5.pw&&!v5.pl&&v5.w){let approx_pin_size_of_side=side_pin_count+4;v5.p=v5.w/approx_pin_size_of_side}return!v5.p&&v5.w&&v5.h&&v5.pw&&v5.pl&&(v5.p=(v5.w-v5.pl*2)/(side_pin_count-1)),!v5.w&&!v5.h&&v5.p&&(v5.w=v5.p*(side_pin_count+4),v5.h=v5.w),v5.p&&!v5.pw&&!v5.pl?(v5.pw=v5.p/2,v5.pl=v5.p/2):v5.pw?v5.pl||(v5.pl=v5.pw*(1/.6)):v5.pw=v5.pl*(.6/1),v5},quad_def=base_quad_def.transform(quadTransform),SIDES_CCW=["left","bottom","right","top"],getQuadCoords=params=>{let{pin_count,pn:pn3,w:w4,h:h4,p:p4,pl:pl3,legsoutside}=params,sidePinCount=pin_count/4,side=SIDES_CCW[Math.floor((pn3-1)/sidePinCount)],pos=(pn3-1)%sidePinCount,ibw=p4*(sidePinCount-1),ibh=p4*(sidePinCount-1),pcdfe=legsoutside?pl3/2:-pl3/2;switch(side){case"left":return{x:-w4/2-pcdfe+.1,y:ibh/2-pos*p4,o:"vert"};case"bottom":return{x:-ibw/2+pos*p4,y:-h4/2-pcdfe+.1,o:"horz"};case"right":return{x:w4/2+pcdfe-.1,y:-ibh/2+pos*p4,o:"vert"};case"top":return{x:ibw/2-pos*p4,y:h4/2+pcdfe-.1,o:"horz"};default:throw new Error("Invalid pin number")}},quad=raw_params=>{let parameters=quad_def.parse(raw_params),pads=[],pin_map=getQuadPinMap(parameters),spc=parameters.num_pins/4;for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5,o:orientation4}=getQuadCoords({pin_count:parameters.num_pins,pn:i2+1,w:parameters.w,h:parameters.h,p:parameters.p??.5,pl:parameters.pl,legsoutside:parameters.legsoutside}),pw=parameters.pw,pl3=parameters.pl;orientation4==="vert"&&([pw,pl3]=[pl3,pw]);let pn3=pin_map[i2+1];pads.push(rectpad(pn3,x5,y5,pw,pl3))}if(parameters.thermalpad)if(typeof parameters.thermalpad=="boolean"){let ibw=parameters.p*(spc-1)+parameters.pw,ibh=parameters.p*(spc-1)+parameters.pw;pads.push(rectpad(["thermalpad"],0,0,ibw,ibh))}else pads.push(rectpad(["thermalpad"],0,0,parameters.thermalpad.x,parameters.thermalpad.y));let silkscreen_corners=[];for(let[corner,dx2,dy2]of[["top-left",-1,1],["bottom-left",-1,-1],["bottom-right",1,-1],["top-right",1,1]]){let corner_x=parameters.w/2*dx2,corner_y=parameters.h/2*dy2,arrow="none",arrow_x=corner_x,arrow_y=corner_y,csz=parameters.pw*2;pin_map[1]===1&&corner==="top-left"?arrow="in1":pin_map[spc*4]===1&&corner==="top-left"||pin_map[spc*3+1]===1&&corner==="top-right"?arrow="in2":pin_map[spc*3]===1&&corner==="top-right"||pin_map[spc]===1&&corner==="bottom-left"?arrow="in1":pin_map[spc+1]===1&&corner==="bottom-left"?arrow="in2":pin_map[spc*2]===1&&corner==="bottom-right"?arrow="in1":pin_map[spc*2+1]===1&&corner==="bottom-right"&&(arrow="in2");let rotate_arrow=arrow==="in1"?1:-1;if(parameters.legsoutside){let arrow_dx=arrow==="in1"?parameters.pl/2:parameters.pw/2,arrow_dy=arrow==="in1"?parameters.pw/2:parameters.pl/2;arrow_x+=arrow_dx*dx2*rotate_arrow,arrow_y-=arrow_dy*dy2*rotate_arrow}(arrow==="none"||parameters.legsoutside)&&silkscreen_corners.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}`,route:[{x:corner_x-csz*dx2,y:corner_y},{x:corner_x,y:corner_y},{x:corner_x,y:corner_y-csz*dy2}],type:"pcb_silkscreen_path",stroke_width:.1}),(arrow==="in1"||arrow==="in2")&&!parameters.legsoutside&&silkscreen_corners.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}_1`,route:[{x:corner_x-csz*dx2,y:corner_y},{x:corner_x-csz*dx2/2,y:corner_y}],type:"pcb_silkscreen_path",stroke_width:0},{layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}_2`,route:[{x:corner_x,y:corner_y-csz*dy2/2},{x:corner_x,y:corner_y-csz*dy2}],type:"pcb_silkscreen_path",stroke_width:.1}),(arrow==="in1"||arrow==="in2")&&silkscreen_corners.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}_3`,route:[{x:arrow_x-.2*-dx2,y:arrow_y+.2*rotate_arrow},{x:arrow_x,y:arrow_y},{x:arrow_x+.2*rotate_arrow*-dx2,y:arrow_y+.2},{x:arrow_x-.2*-dx2,y:arrow_y+.2*rotate_arrow}],type:"pcb_silkscreen_path",stroke_width:.1})}let silkscreenRefText=silkscreenRef(0,parameters.h/2+(parameters.legsoutside?parameters.pl*1.2:.5),.3);return{circuitJson:[...pads,...silkscreen_corners,silkscreenRefText],parameters}},qfn_def=base_quad_def.extend({}).transform(quadTransform),qfn=parameters=>(parameters.legsoutside=!1,parameters.pl||(parameters.pl=.875),parameters.pw||(parameters.pw=.25),quad(parameters)),tqfp=raw_params=>{if(raw_params.legsoutside=!0,!raw_params.p)switch(raw_params.num_pins){case 32:raw_params.p=.8;break;case 44:case 48:raw_params.p=.5;break;case 64:case 80:case 100:raw_params.p=.5;break;case 144:raw_params.p=.5;break}if(!raw_params.pl)switch(raw_params.num_pins){case 32:case 44:case 48:case 64:case 80:case 100:raw_params.pl=1.475;break;case 144:raw_params.pl=1.6;break}if(!raw_params.pw)switch(raw_params.num_pins){case 32:raw_params.pw=.55;break;case 44:case 48:case 64:case 80:case 100:raw_params.pw=.3;break;case 144:raw_params.pw=.25;break}return quad(raw_params)},qfp=raw_params=>{raw_params.legsoutside=!0;let quad_defaults=quad_def.parse(raw_params);if(!raw_params.p)switch(raw_params.num_pins){case 44:case 64:raw_params.p=.8;break;case 52:raw_params.w===14?raw_params.p=1:raw_params.p=.65;break;case 208:raw_params.p=.5;break}if(!raw_params.pl)switch(raw_params.num_pins){case 44:case 52:case 64:raw_params.pl=2.25;break;case 208:raw_params.pl=1.65;break;default:raw_params.pl=quad_defaults.pl*4;break}if(!raw_params.pw)switch(raw_params.num_pins){case 44:case 64:raw_params.pw=.5;break;case 52:raw_params.w===14?raw_params.pw=.45:raw_params.pw=.55;break;case 208:raw_params.pw=.3;break;default:raw_params.pw=quad_defaults.pw;break}return quad(raw_params)},mlp_def=base_quad_def.extend({}).transform(quadTransform),mlp=parameters=>(parameters.legsoutside=!1,parameters.thermalpad===void 0&&(parameters.thermalpad=!0),quad(parameters)),ssop_def=extendSoicDef({w:"3.9mm",p:"1.27mm"}),ssop=raw_params=>{let parameters=ssop_def.parse(raw_params);return{circuitJson:soicWithoutParsing(parameters),parameters}},tssop_def=extendSoicDef({w:"7.1mm",p:"0.65mm",pl:"1.35mm",pw:"0.40mm",legsoutside:!0}),tssop=raw_params=>{let parameters=tssop_def.parse(raw_params);return{circuitJson:soicWithoutParsing(parameters),parameters}},sot363_def=extendSoicDef({}),sot363=raw_params=>{let parameters=sot363_def.parse({fn:"sot363",num_pins:6,w:2.56,p:.65,pw:.4,pl:.65,legoutside:!0});return{circuitJson:soicWithoutParsing(parameters),parameters}},sot886_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),w:external_exports.string().default("1.01mm"),h:external_exports.string().default("1.45mm"),p:external_exports.string().default("0.5mm"),pl:external_exports.string().default("0.33mm"),pw:external_exports.string().default("0.27mm"),string:external_exports.string().optional()}),sot886=raw_params=>{let parameters=sot886_def.parse({fn:"sot886",...raw_params}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),pads=[];for(let i2=0;i2<6;i2++){let{x:x5,y:y5}=getSot886PadCoord(i2+1,w4,p4,pl3);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:h4/2},{x:w4/2,y:h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSot886PadCoord(1,w4,p4,pl3),pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1Position.x-pl3/2-.3,y:pin1Position.y},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y+.15},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y-.15},{x:pin1Position.x-pl3/2-.3,y:pin1Position.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,h4/2+.4,.25);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSot886PadCoord=(pn3,w4,p4,pl3)=>{let padCenterOffset=w4/2-pl3/2;return pn3<=3?{x:-padCenterOffset,y:p4-(pn3-1)*p4}:{x:padCenterOffset,y:-p4+(pn3-4)*p4}},sot23_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),w:external_exports.string().default("1.92mm"),h:external_exports.string().default("2.74mm"),pl:external_exports.string().default("1.32mm"),pw:external_exports.string().default("0.6mm"),p:external_exports.string().default("0.95mm"),string:external_exports.string().optional()}),sot23_6_or_8_def=extendSoicDef({p:"0.95mm",w:"1.6mm",legsoutside:!0}),sot23=raw_params=>{let match2=raw_params.string?.match(/^sot23_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3;if(numPins===6||numPins===8){let parameters2=sot23_6_or_8_def.parse({...raw_params,num_pins:numPins});return{circuitJson:soicWithoutParsing(parameters2),parameters:parameters2}}let parameters=sot23_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot23_3(parameters),parameters};if(parameters.num_pins===5)return{circuitJson:sot23_5(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot23Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-1.155,y:p4}:pn3===2?{x:-1.155,y:-p4}:{x:1.15,y:0}},sot23_3=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot23Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let silkscreenRefText=silkscreenRef(0,Number.parseInt(parameters.h),.3);return[...pads,silkscreenRefText]},getCcwSot235Coords=parameters=>{let{p:p4,h:h4,pn:pn3}=parameters;if(pn3===1)return{x:-h4/2-.5,y:p4};if(pn3===2)return{x:-h4/2-.5,y:0};if(pn3===3)return{x:-h4/2-.5,y:-p4};if(pn3===4)return{x:h4/2+.5,y:-p4};if(pn3===5)return{x:h4/2+.5,y:p4};throw new Error("Invalid pin number")},sot23_5=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot235Coords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:i2});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let width=(parameters.num_pins+1)/2*Number.parseFloat(parameters.p),height=Number.parseFloat(parameters.h),silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width/3,y:height/2+Number.parseFloat(parameters.p)/1.3},{x:width/3,y:height/2+Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3},{x:width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenRefText=silkscreenRef(0,height+.3,.3),pin1Position=getCcwSot235Coords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:1});pin1Position.x=pin1Position.x-Number.parseFloat(parameters.pw)*1.5;let triangleHeight=.3,triangleWidth=.4,pin1Indicator={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_indicator",route:[{x:pin1Position.x+triangleHeight/2,y:pin1Position.y},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y+triangleWidth/2},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y-triangleWidth/2},{x:pin1Position.x+triangleHeight/2,y:pin1Position.y}],stroke_width:.05};return[...pads,silkscreenRefText,silkscreenPath1,silkscreenPath2,pin1Indicator]},sot25_def=sot23_def.extend({}),sot25=raw_params=>{let parameters=sot25_def.parse({...raw_params,num_pins:5});return{circuitJson:sot23_5(parameters),parameters}},CORNERS=[{name:"top-left",dx:-1,dy:1},{name:"top-right",dx:1,dy:1},{name:"bottom-left",dx:-1,dy:-1},{name:"bottom-right",dx:1,dy:-1}],dfn_def=extendSoicDef({}),dfn=raw_params=>{let parameters=dfn_def.parse(raw_params),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSoicCoords({num_pins:parameters.num_pins,pn:i2+1,w:parameters.w,p:parameters.p??1.27,pl:parameters.pl,widthincludeslegs:!0});pads.push(rectpad(i2+1,x5,y5,parameters.pl??"1mm",parameters.pw??"0.6mm"))}let m3=Math.min(1,parameters.p/2),sw=parameters.w+m3,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw+m3,silkscreenPaths=[];for(let corner of CORNERS){let{dx:dx2,dy:dy2}=corner;silkscreenPaths.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",route:[{x:dx2*sw/2-dx2*parameters.p,y:dy2*sh3/2},{x:dx2*sw/2,y:dy2*sh3/2},{x:dx2*sw/2,y:dy2*sh3/2-dy2*parameters.p}],type:"pcb_silkscreen_path",stroke_width:.1})}let as3=parameters.p/4,atx=-sw/2-as3/2,aty=sh3/2-parameters.p/2;silkscreenPaths.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",type:"pcb_silkscreen_path",route:[{x:atx,y:aty},{x:atx-as3,y:aty+as3},{x:atx-as3,y:aty-as3},{x:atx,y:aty}],stroke_width:.1});let silkscreenRefText=silkscreenRef(0,sh3/2+.4,sh3/12);return{circuitJson:[...pads,silkscreenRefText,...silkscreenPaths],parameters}},silkscreenPin=({fs:fs3,pn:pn3,anchor_x,anchor_y,textalign="center",orthogonal=!1,verticallyinverted=!1,layer="top"})=>{let ccw_rotation=0;orthogonal&&verticallyinverted?ccw_rotation=270:verticallyinverted?ccw_rotation=180:orthogonal?ccw_rotation=90:ccw_rotation=0;let anchor_alignment="center";return textalign==="left"&&(verticallyinverted?anchor_alignment="center_right":anchor_alignment="center_left"),textalign==="right"&&(verticallyinverted?anchor_alignment="center_left":anchor_alignment="center_right"),layer==="bottom"&&(anchor_alignment==="center_left"?anchor_alignment="center_right":anchor_alignment==="center_right"&&(anchor_alignment="center_left")),{type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"silkscreen_text_1",font:"tscircuit2024",font_size:fs3,pcb_component_id:"pcb_component_1",text:`{PIN${pn3}}`,layer,anchor_position:{x:anchor_x,y:anchor_y},anchor_alignment,ccw_rotation}};function determinePinlabelAnchorSide({pinlabeltextalignleft,pinlabeltextalignright,pinlabelorthogonal}){let pinlabelAnchorSide="top";return pinlabelorthogonal?pinlabelAnchorSide="left":pinlabelAnchorSide="top",pinlabeltextalignleft&&(pinlabelorthogonal?pinlabelAnchorSide="bottom":pinlabelAnchorSide="right"),pinlabeltextalignright&&(pinlabelorthogonal?pinlabelAnchorSide="top":pinlabelAnchorSide="left"),pinlabelAnchorSide}var pinrow_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(6),rows:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>Number(val)).optional().default(1).describe("number of rows"),p:length.default("0.1in").describe("pitch"),id:length.default("1.0mm").describe("inner diameter"),od:length.default("1.5mm").describe("outer diameter"),male:external_exports.boolean().optional().describe("for male pin headers"),female:external_exports.boolean().optional().describe("for female pin headers"),smd:external_exports.boolean().optional().describe("surface mount device"),surfacemount:external_exports.boolean().optional().describe("surface mount device (verbose)"),rightangle:external_exports.boolean().optional().describe("right angle"),pw:length.optional().default("1.0mm").describe("pad width for SMD"),pl:length.optional().default("2.0mm").describe("pad length for SMD"),pinlabeltextalignleft:external_exports.boolean().optional().default(!1),pinlabeltextaligncenter:external_exports.boolean().optional().default(!1),pinlabeltextalignright:external_exports.boolean().optional().default(!1),pinlabelverticallyinverted:external_exports.boolean().optional().default(!1),pinlabelorthogonal:external_exports.boolean().optional().default(!1),nosquareplating:external_exports.boolean().optional().default(!1).describe("do not use rectangular pad for pin 1"),nopinlabels:external_exports.boolean().optional().default(!1).describe("omit silkscreen pin labels"),doublesidedpinlabel:external_exports.boolean().optional().default(!1).describe("add silkscreen pins in top and bottom layers"),bottomsidepinlabel:external_exports.boolean().optional().default(!1).describe("place the silkscreen reference text on the bottom layer instead of top")}).transform(data=>{let pinlabelAnchorSide=determinePinlabelAnchorSide(data);return{...data,pinlabelAnchorSide,male:data.male??!data.female,female:data.female??!1,smd:data.smd??data.surfacemount??!1,rightangle:data.rightangle??!1}}).superRefine((data,ctx)=>{data.male&&data.female&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"'male' and 'female' cannot both be true; it should be male or female.",path:["male","female"]})}),pinrow=raw_params=>{let parameters=pinrow_def.parse(raw_params),{p:p4,id:id2,od:od3,rows,num_pins,pinlabelAnchorSide,pinlabelverticallyinverted,pinlabelorthogonal,pinlabeltextalignleft,pinlabeltextalignright,nopinlabels,doublesidedpinlabel,bottomsidepinlabel}=parameters,pinlabelTextAlign="center";pinlabeltextalignleft?pinlabelTextAlign="left":pinlabeltextalignright&&(pinlabelTextAlign="right");let holes=[],numPinsPerRow=Math.ceil(num_pins/rows),ySpacing=-p4,calculateAnchorPosition2=({xoff,yoff,od:od22,anchorSide,smd,pw,pl:pl3})=>{let dx2=0,dy2=0;if(smd){let offset=od22/5;switch(anchorSide){case"right":dx2=pw/2+offset;break;case"top":dy2=pl3/2+offset;break;case"bottom":dy2=-(pl3/2+offset);break;case"left":dx2=-(pw/2+offset);break}}else{let offset=od22*.75;switch(anchorSide){case"right":dx2=offset;break;case"top":dy2=offset;break;case"bottom":dy2=-offset;break;case"left":dx2=-offset;break}}return{anchor_x:xoff+dx2,anchor_y:yoff+dy2}},addPin=(pinNumber,xoff,yoff)=>{parameters.smd?holes.push(rectpad(pinNumber,xoff,yoff,parameters.pw,parameters.pl)):pinNumber===1&&!parameters.nosquareplating?holes.push(platedHoleWithRectPad(pinNumber,xoff,yoff,id2,od3,od3,0,0)):holes.push(platedhole(pinNumber,xoff,yoff,id2,od3));let{anchor_x,anchor_y}=calculateAnchorPosition2({xoff,yoff,od:od3,anchorSide:pinlabelAnchorSide,smd:parameters.smd,pw:parameters.pw,pl:parameters.pl});nopinlabels||(bottomsidepinlabel?holes.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"bottom"})):holes.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"top"})),doublesidedpinlabel&&holes.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"bottom"})))},usedPositions=new Set,useBGAStyle=rows>2&&numPinsPerRow>2;if(rows===1){let xStart=-((num_pins-1)/2)*p4;for(let i2=0;i2<num_pins;i2++){let pinNumber=i2+1,xoff=xStart+i2*p4,posKey=`${xoff},0`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(pinNumber,xoff,0)}}else if(useBGAStyle){let xStart=-((numPinsPerRow-1)/2)*p4,currentPin=1;for(let row=0;row<rows&¤tPin<=num_pins;row++)for(let col=0;col<numPinsPerRow&¤tPin<=num_pins;col++){let xoff=xStart+col*p4,yoff=row*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}}else{let xStart=-((numPinsPerRow-1)/2)*p4,currentPin=1,top=0,bottom=rows-1,left=0,right=numPinsPerRow-1;for(;currentPin<=num_pins&&top<=bottom&&left<=right;){for(let row=top;row<=bottom&¤tPin<=num_pins;row++){let xoff=xStart+left*p4,yoff=row*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}left++;for(let col=left;col<=right&¤tPin<=num_pins;col++){let xoff=xStart+col*p4,yoff=bottom*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}if(bottom--,left<=right){for(let row=bottom;row>=top&¤tPin<=num_pins;row--){let xoff=xStart+right*p4,yoff=row*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}right--}if(top<=bottom){for(let col=right;col>=left&¤tPin<=num_pins;col--){let xoff=xStart+col*p4,yoff=top*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}top++}}if(currentPin-1<num_pins)throw new Error(`Missing pins: assigned ${currentPin-1}, expected ${num_pins}`)}let refText=silkscreenRef(0,p4,.5);return{circuitJson:[...holes,refText],parameters}},sot563_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),w:external_exports.string().default("2.1mm"),h:external_exports.string().default("2.45mm"),p:external_exports.string().default("0.5mm"),pl:external_exports.string().default("0.675mm"),pw:external_exports.string().default("0.35mm"),string:external_exports.string().optional()}),sot563=raw_params=>{let parameters=sot563_def.parse({...raw_params,fn:"sot563"}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),pads=[];for(let i2=0;i2<6;i2++){let{x:x5,y:y5}=getSot563PadCoord(i2+1,w4,p4,pl3);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:h4/2},{x:w4/2,y:h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSot563PadCoord(1,w4,p4,pl3),pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1Position.x-pl3/2-.3,y:pin1Position.y},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y+.15},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y-.15},{x:pin1Position.x-pl3/2-.3,y:pin1Position.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,h4/2+.4,.25);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSot563PadCoord=(pn3,w4,p4,pl3)=>{let padCenterOffset=w4/2-pl3/2;return pn3<=3?{x:-padCenterOffset,y:p4-(pn3-1)*p4}:{x:padCenterOffset,y:-p4+(pn3-4)*p4}},ms012_def=extendSoicDef({p:"1.27mm",w:"3.9mm",legsoutside:!0}),ms012=raw_params=>{let parameters=ms012_def.parse({...raw_params,num_pins:8});return{circuitJson:soicWithoutParsing(parameters),parameters}},ms013_def=extendSoicDef({p:"1.27mm",w:"7.5mm",legsoutside:!0}),ms013=raw_params=>{let parameters=ms013_def.parse({...raw_params,num_pins:16});return{circuitJson:soicWithoutParsing(parameters),parameters}},sot723_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(3).default(3),w:external_exports.string().default("1.2mm"),h:external_exports.string().default("1.2mm"),pw:external_exports.string().default("0.40mm"),pl:external_exports.string().default("0.45mm"),p:external_exports.string().default("0.575mm")}),sot723=raw_params=>{let parameters=sot723_def.parse(raw_params),pad2=sot723WithoutParsing(parameters),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.2);return{circuitJson:[...pad2,silkscreenRefText],parameters}},getCcwSot723Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:p4,y:0}:pn3===2?{x:-p4,y:-.4}:{x:-p4,y:.4}},sot723WithoutParsing=parameters=>{let pads=[];for(let i2=0;i2<3;i2++){let{x:x5,y:y5}=getCcwSot723Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("2.36mm"),h:external_exports.string().default("1.22mm"),pl:external_exports.string().default("0.9mm"),pw:external_exports.string().default("1.2mm"),p:external_exports.string().default("3.30mm")}),sod123=raw_params=>{let parameters=sod_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/4+.4,.3);return{circuitJson:sodWithoutParsing(parameters).concat(silkscreenRefText),parameters}},getSodCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},axial_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("2.54mm"),id:length.optional().default("0.7mm"),od:length.optional().default("1.4mm")}),axial=raw_params=>{let parameters=axial_def.parse(raw_params),{p:p4,id:id2,od:od3}=parameters,plated_holes=[platedhole(1,-p4/2,0,id2,od3),platedhole(2,p4/2,0,id2,od3)],silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-p4/2+od3+id2/2,y:0},{x:p4/2-od3-id2/2,y:0}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,1.5,.5);return{circuitJson:[...plated_holes,silkscreenLine,silkscreenRefText],parameters}},generateCircleArcs=(centerX,centerY,radius,cut,cutHeight,segmentLength=.1)=>{let topArc=[],bottomArc=[],segments=Math.max(1,Math.ceil(Math.PI*radius/segmentLength)),thetaStep=Math.PI/segments;for(let i2=0;i2<=segments;i2++){let theta=i2*thetaStep,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||topArc.push({x:x5,y:y5})}for(let i2=0;i2<=segments;i2++){let theta=Math.PI+i2*thetaStep,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||bottomArc.push({x:x5,y:y5})}return{topArc,bottomArc}},radial_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("5mm"),id:length.optional().default("0.8mm"),od:length.optional().default("1.6mm"),ceramic:external_exports.boolean().optional(),electrolytic:external_exports.boolean().optional(),polarized:external_exports.boolean().optional()}),radial=raw_params=>{let parameters=radial_def.parse(raw_params),{p:p4,id:id2,od:od3}=parameters;id2===.8&&od3===1.6&&(parameters.id=p4===5?.8:p4*.25,parameters.od=p4===5?1.6:p4*.5);let plated_holes=[platedhole(1,-p4/2,0,parameters.id,parameters.od),platedhole(2,p4/2,0,parameters.id,parameters.od)],bodyR=p4+.1,{topArc,bottomArc}=generateCircleArcs(0,0,bodyR,parameters.od/2,parameters.od),strokeWidth=.02*p4,silkscreenBodyTop={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:topArc,stroke_width:strokeWidth,pcb_silkscreen_path_id:""},silkscreenBodyBottom={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:bottomArc,stroke_width:strokeWidth,pcb_silkscreen_path_id:""},silkscreenCenterLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:0,y:bodyR},{x:0,y:-bodyR}],stroke_width:strokeWidth,pcb_silkscreen_path_id:""},plusSize=.1*p4,plusX=-(p4+plusSize+.04*p4),plusY=bodyR-plusSize-.08*p4,plusHoriz={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:plusX-plusSize,y:plusY},{x:plusX+plusSize,y:plusY}],stroke_width:strokeWidth,pcb_silkscreen_path_id:""},plusVert={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:plusX,y:plusY-plusSize},{x:plusX,y:plusY+plusSize}],stroke_width:strokeWidth,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,bodyR+.12*p4,.1*p4),circuitJson=[...plated_holes,silkscreenBodyTop,silkscreenBodyBottom,silkscreenCenterLine,silkscreenRefText];return(parameters.electrolytic===!0||parameters.polarized===!0)&&circuitJson.push(plusHoriz,plusVert),{circuitJson,parameters}},silkscreenpath=(route,options={})=>({type:"pcb_silkscreen_path",layer:options.layer||"top",pcb_component_id:options.pcb_component_id||"",pcb_silkscreen_path_id:options.pcb_silkscreen_path_id||"",route,stroke_width:options.stroke_width||.1}),pushbutton_def=base_def.extend({fn:external_exports.literal("pushbutton"),w:length.default(4.5),h:length.default(6.5),id:length.default(1),od:length.default(1.2)}),pushbutton=raw_params=>{let parameters=pushbutton_def.parse(raw_params),width=parameters.w,height=parameters.h,holeDiameter=parameters.id,holes=[platedhole(1,-width/2,height/2,holeDiameter,holeDiameter*1.5),platedhole(2,-width/2,-height/2,holeDiameter,holeDiameter*1.5),platedhole(3,width/2,-height/2,holeDiameter,holeDiameter*1.5),platedhole(4,width/2,height/2,holeDiameter,holeDiameter*1.5)],silkscreenLines=[silkscreenpath([{x:-width/2,y:-height/2},{x:-width/2,y:height/2}]),silkscreenpath([{x:width/2,y:-height/2},{x:width/2,y:height/2}]),silkscreenpath([{x:-width/2,y:0},{x:-width/5,y:0},{x:width/5*1/Math.sqrt(2),y:height/8}]),silkscreenpath([{x:width/2,y:0},{x:width/5,y:0}])],silkscreenRefText=silkscreenRef(0,height/2+.4,.5);return{circuitJson:[...holes,...silkscreenLines,silkscreenRefText],parameters}},stampboard_def=base_def.extend({fn:external_exports.string(),w:length.default("22.58mm"),h:length.optional(),left:length.optional().default(20),right:length.optional().default(20),top:length.optional().default(2),bottom:length.optional().default(2),p:length.default(length.parse("2.54mm")),pw:length.default(length.parse("1.6mm")),pl:length.default(length.parse("2.4mm")),innerhole:external_exports.boolean().default(!1),innerholeedgedistance:length.default(length.parse("1.61mm")),silkscreenlabels:external_exports.boolean().default(!1),silkscreenlabelmargin:length.default(length.parse("0.1mm"))}),getHeight=parameters=>{let params=stampboard_def.parse(parameters);return params.left&¶ms.right?Math.max(params.left,params.right)*params.p:params.left?params.left*params.p:params.right?params.right*params.p:51},getTriangleDir=(x5,y5,side)=>{let routes=[];return side==="right"&&(routes=[{x:x5+1/2,y:y5},{x:x5-1/2,y:y5+.6/2},{x:x5-1/2,y:y5-.6/2},{x:x5+1/2,y:y5}]),side==="left"&&(routes=[{x:x5-1/2,y:y5},{x:x5+1/2,y:y5+.6/2},{x:x5+1/2,y:y5-.6/2},{x:x5-1/2,y:y5}]),side==="top"&&(routes=[{x:x5,y:y5+1/2},{x:x5-.6/2,y:y5-1/2},{x:x5+.6/2,y:y5-1/2},{x:x5,y:y5+1/2}]),side==="bottom"&&(routes=[{x:x5,y:y5-1/2},{x:x5-.6/2,y:y5+1/2},{x:x5+.6/2,y:y5+1/2},{x:x5,y:y5-1/2}]),routes},stampboard=raw_params=>{let params=stampboard_def.parse(raw_params),height=params.h??getHeight(params),rectpads=[],holes=[],pinLabels=[],routes=[],innerDiameter=1,outerDiameter=innerDiameter,totalPadsNumber=params.left+params.right+(params.bottom??0)+(params.top??0),textHalf=`pin${totalPadsNumber}`.length*.7/2;if(params.right){let yoff=-((params.right-1)/2)*params.p;for(let i2=0;i2<params.right;i2++){if(i2===0&&!params.left&&!params.bottom&&!params.silkscreenlabels&&(routes=getTriangleDir(params.w/2-params.pl*1.4,yoff+i2*params.p,"right")),rectpads.push(rectpad(i2+1+params.left+(params.bottom??0),params.w/2-params.pl/2,yoff+i2*params.p,params.pl,params.pw)),params.silkscreenlabels){let padIndex=i2+1+params.left+(params.bottom??0),label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:params.w/2-params.pl-(textHalf+params.silkscreenlabelmargin),y:yoff+i2*params.p},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"})}params.innerhole&&(holes.push(platedhole(i2+1+params.left+(params.bottom??0)+totalPadsNumber,params.w/2,yoff+i2*params.p,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+params.left+(params.bottom??0)+totalPadsNumber*2,params.w/2-params.innerholeedgedistance,yoff+i2*params.p,innerDiameter,outerDiameter)))}}if(params.left){let yoff=(params.left-1)/2*params.p;for(let i2=0;i2<params.left;i2++){if(i2===0&&!params.silkscreenlabels&&(routes=getTriangleDir(-params.w/2+params.pl*1.4,yoff-i2*params.p,"left")),rectpads.push(rectpad(i2+1,-params.w/2+params.pl/2,yoff-i2*params.p,params.pl,params.pw)),params.silkscreenlabels){let padIndex=i2+1,label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:-params.w/2+params.pl+(textHalf+params.silkscreenlabelmargin),y:yoff-i2*params.p},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"})}params.innerhole&&(holes.push(platedhole(i2+1+totalPadsNumber,-params.w/2,yoff-i2*params.p,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+totalPadsNumber*2,-params.w/2+params.innerholeedgedistance,yoff-i2*params.p,innerDiameter,outerDiameter)))}}if(params.top){let xoff=(params.top-1)/2*params.p;for(let i2=0;i2<params.top;i2++){if(i2===0&&!params.left&&!params.bottom&&!params.right&&!params.silkscreenlabels&&(routes=getTriangleDir(xoff-i2*params.p,height/2-params.pl*1.4,"top")),rectpads.push(rectpad(i2+1+params.left+params.right+(params.bottom??0),xoff-i2*params.p,height/2-params.pl/2,params.pw,params.pl)),params.silkscreenlabels){let padIndex=i2+1+params.left+params.right+(params.bottom??0),label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff-i2*params.p,y:height/2-params.pl-(textHalf+params.silkscreenlabelmargin)},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center",ccw_rotation:270})}params.innerhole&&(holes.push(platedhole(i2+1+params.left+params.right+(params.bottom??0)+totalPadsNumber,xoff-i2*params.p,height/2,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+params.left+params.right+(params.bottom??0)+totalPadsNumber*2,xoff-i2*params.p,height/2-params.innerholeedgedistance,innerDiameter,outerDiameter)))}}if(params.bottom){let xoff=-((params.bottom-1)/2)*params.p;for(let i2=0;i2<params.bottom;i2++){if(i2===0&&!params.left&&!params.silkscreenlabels&&(routes=getTriangleDir(xoff+i2*params.p,-height/2+params.pl*1.4,"bottom")),rectpads.push(rectpad(i2+1+params.left,xoff+i2*params.p,-height/2+params.pl/2,params.pw,params.pl)),params.silkscreenlabels){let padIndex=i2+1+params.left,label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff+i2*params.p,y:-height/2+params.pl+(textHalf+params.silkscreenlabelmargin)},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center",ccw_rotation:90})}params.innerhole&&(holes.push(platedhole(i2+1+params.left+totalPadsNumber,xoff+i2*params.p,-height/2,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+params.left+totalPadsNumber*2,xoff+i2*params.p,-height/2+params.innerholeedgedistance,innerDiameter,outerDiameter)))}}let silkscreenTriangle={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_triangle_1",pcb_component_id:"2",route:routes,stroke_width:.1,layer:"top"},silkscreenPath={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_path_1",pcb_component_id:"1",route:[{x:-params.w/2,y:height/2},{x:params.w/2,y:height/2},{x:params.w/2,y:-height/2},{x:-params.w/2,y:-height/2},{x:-params.w/2,y:height/2}],stroke_width:.1,layer:"top"},silkscreenRefText=silkscreenRef(0,height/1.8,height/25);return{circuitJson:[...rectpads,...holes,...pinLabels,silkscreenPath,...params.silkscreenlabels?[]:[silkscreenTriangle],silkscreenRefText],parameters:params}},stampreceiver_def=base_def.extend({fn:external_exports.string(),w:length.default("22.58mm"),h:length.optional(),left:length.optional().default(20),right:length.optional().default(20),top:length.optional().default(2),bottom:length.optional().default(2),p:length.default(length.parse("2.54mm")),pw:length.default(length.parse("1.6mm")),pl:length.default(length.parse("3.2mm")),innerhole:external_exports.boolean().default(!1),innerholeedgedistance:length.default(length.parse("1.61mm"))}),getHeight2=parameters=>{let params=stampreceiver_def.parse(parameters);return params.left&¶ms.right?Math.max(params.left,params.right)*params.p:params.left?params.left*params.p:params.right?params.right*params.p:51},getTriangleDir2=(x5,y5,side,triangleHeight=1,triangleWidth=.6)=>{let halfHeight=triangleHeight/2,halfWidth=triangleWidth/2;return{left:[{x:x5+halfHeight,y:y5},{x:x5-halfHeight,y:y5+halfWidth},{x:x5-halfHeight,y:y5-halfWidth},{x:x5+halfHeight,y:y5}],right:[{x:x5-halfHeight,y:y5},{x:x5+halfHeight,y:y5+halfWidth},{x:x5+halfHeight,y:y5-halfWidth},{x:x5-halfHeight,y:y5}],top:[{x:x5,y:y5-halfHeight},{x:x5-halfWidth,y:y5+halfHeight},{x:x5+halfWidth,y:y5+halfHeight},{x:x5,y:y5-halfHeight}],bottom:[{x:x5,y:y5+halfHeight},{x:x5-halfWidth,y:y5-halfHeight},{x:x5+halfWidth,y:y5-halfHeight},{x:x5,y:y5+halfHeight}]}[side]},stampreceiver=raw_params=>{let params=stampreceiver_def.parse(raw_params),height=params.h??getHeight2(params),rectpads=[],pinLabels=[],holes=[],innerDiameter=1,outerDiameter=1.2,totalPadsNumber=params.left+params.right+(params.bottom??0)+(params.top??0),routes=[],padIndex=1;if(params.left){let yoff=(params.left-1)/2*params.p;for(let i2=0;i2<params.left;i2++)i2===0&&(routes=getTriangleDir2(-params.w/2-params.pl/2,yoff-i2*params.p,"left")),rectpads.push(rectpad(padIndex,-params.w/2+params.pl/2,yoff-i2*params.p,params.pl,params.pw)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:-params.w/2+params.pl/2-4.5,y:yoff-i2*params.p},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,-params.w/2+params.innerholeedgedistance,yoff-i2*params.p,innerDiameter,outerDiameter))}if(params.bottom){let xoff=(params.bottom-1)/2*params.p;for(let i2=params.bottom-1;i2>=0;i2--)rectpads.push(rectpad(padIndex,xoff-i2*params.p,-height/2+params.pl/2,params.pw,params.pl)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff-i2*params.p,y:-height/2+params.pl/2-3.2},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,xoff-i2*params.p,-height/2+params.innerholeedgedistance,innerDiameter,outerDiameter))}if(params.right){let yoff=-((params.right-1)/2)*params.p;for(let i2=0;i2<params.right;i2++)rectpads.push(rectpad(padIndex,params.w/2-params.pl/2,yoff+i2*params.p,params.pl,params.pw)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:params.w/2-params.pl/2+3.7,y:yoff+i2*params.p},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,params.w/2-params.innerholeedgedistance,yoff+i2*params.p,innerDiameter,outerDiameter))}if(params.top){let xoff=-((params.top-1)/2)*params.p;for(let i2=params.top-1;i2>=0;i2--)rectpads.push(rectpad(padIndex,xoff+i2*params.p,height/2-params.pl/2,params.pw,params.pl)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff+i2*params.p,y:height/2-params.pl/2+3.2},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,xoff+i2*params.p,height/2-params.innerholeedgedistance,innerDiameter,outerDiameter))}let silkscreenTriangle={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"1",pcb_component_id:"1",layer:"top",route:routes,stroke_width:.1},silkscreenPath={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_path_1",pcb_component_id:"1",route:[{x:-params.w/2-params.pl/3,y:height/2+params.pl/3},{x:params.w/2+params.pl/3,y:height/2+params.pl/3},{x:params.w/2+params.pl/3,y:-height/2-params.pl/3},{x:-params.w/2-params.pl/3,y:-height/2-params.pl/3},{x:-params.w/2-params.pl/3,y:height/2+params.pl/3}],stroke_width:.1,layer:"top"},silkscreenRefText=silkscreenRef(0,height/1.8,height/25);return{circuitJson:[...holes,...rectpads,...pinLabels,silkscreenPath,silkscreenTriangle,silkscreenRefText],parameters:params}},lqfp=parameters=>(parameters.legsoutside=!0,parameters.pl||(parameters.pl=1.5),parameters.pw||(parameters.pw=.3),quad(parameters)),breakoutheaders_def=base_def.extend({fn:external_exports.string(),w:length.default("10mm"),h:length.optional(),left:length.optional().default(20),right:length.optional().default(20),top:length.optional().default(0),bottom:length.optional().default(0),p:length.default(length.parse("2.54mm")),id:length.optional().default(length.parse("1mm")),od:length.optional().default(length.parse("1.5mm"))}),getHeight3=parameters=>{let params=breakoutheaders_def.parse(parameters);return params.left&¶ms.right?Math.max(params.left,params.right)*params.p:params.left?params.left*params.p:params.right?params.right*params.p:51},getTrianglePath=(x5,y5,side,triangleHeight=1,triangleWidth=.6)=>{let halfHeight=triangleHeight/2,halfWidth=triangleWidth/2;return{left:[{x:x5+halfHeight,y:y5},{x:x5-halfHeight,y:y5+halfWidth},{x:x5-halfHeight,y:y5-halfWidth},{x:x5+halfHeight,y:y5}],right:[{x:x5-halfHeight,y:y5},{x:x5+halfHeight,y:y5+halfWidth},{x:x5+halfHeight,y:y5-halfWidth},{x:x5-halfHeight,y:y5}],top:[{x:x5,y:y5-halfHeight},{x:x5-halfWidth,y:y5+halfHeight},{x:x5+halfWidth,y:y5+halfHeight},{x:x5,y:y5-halfHeight}],bottom:[{x:x5,y:y5+halfHeight},{x:x5-halfWidth,y:y5-halfHeight},{x:x5+halfWidth,y:y5-halfHeight},{x:x5,y:y5+halfHeight}]}[side]},breakoutheaders=raw_params=>{let params=breakoutheaders_def.parse(raw_params),height=params.h??getHeight3(params),holes=[],innerDiameter=params.id,outerDiameter=params.od,silkscreenTriangleRoutes=[];if(params.right){let yoff=-((params.right-1)/2)*params.p;for(let i2=0;i2<params.right;i2++)i2===0&&!params.left&&!params.bottom&&(silkscreenTriangleRoutes=getTrianglePath(params.w/2+outerDiameter*1.4,yoff+i2*params.p,"right")),holes.push(platedhole(i2+1+params.left+(params.bottom??0),params.w/2,yoff+i2*params.p,innerDiameter,outerDiameter))}if(params.left){let yoff=-((params.left-1)/2)*params.p;for(let i2=0;i2<params.left;i2++)i2===params.left-1&&(silkscreenTriangleRoutes=getTrianglePath(-params.w/2-outerDiameter*1.4,yoff+i2*params.p,"left")),holes.push(platedhole(i2+1,-params.w/2,yoff+i2*params.p,innerDiameter,outerDiameter))}if(params.top){let xoff=-((params.top-1)/2)*params.p;for(let i2=0;i2<params.top;i2++)i2===params.top-1&&!params.left&&!params.bottom&&!params.right&&(silkscreenTriangleRoutes=getTrianglePath(xoff+i2*params.p,height/2+outerDiameter*1.4,"top")),holes.push(platedhole(i2+1+params.right+(params.bottom??0)+params.left,xoff+i2*params.p,height/2,innerDiameter,outerDiameter))}if(params.bottom){let xoff=-((params.bottom-1)/2)*params.p;for(let i2=0;i2<params.bottom;i2++)i2===0&&!params.left&&(silkscreenTriangleRoutes=getTrianglePath(xoff+i2*params.p,-height/2-outerDiameter*1.4,"bottom")),holes.push(platedhole(i2+1+params.left,xoff+i2*params.p,-height/2,innerDiameter,outerDiameter))}let silkscreenTriangle={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"1",pcb_component_id:"1",layer:"top",route:silkscreenTriangleRoutes,stroke_width:.1},silkscreenPath={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_path_1",pcb_component_id:"1",route:[{x:-params.w/2-outerDiameter,y:height/2+outerDiameter},{x:params.w/2+outerDiameter,y:height/2+outerDiameter},{x:params.w/2+outerDiameter,y:-height/2-outerDiameter},{x:-params.w/2-outerDiameter,y:-height/2-outerDiameter},{x:-params.w/2-outerDiameter,y:height/2+outerDiameter}],stroke_width:.1,layer:"top"},silkscreenRefText=silkscreenRef(0,height/1.7,height/25);return{circuitJson:[...holes,silkscreenPath,silkscreenRefText,silkscreenTriangle],parameters:params}},generate_u_curve=(centerX,centerY,radius,direction2)=>Array.from({length:25},(_5,i2)=>{let theta=i2/24*Math.PI-Math.PI/2;return{x:centerX+(direction2==="right"?1:-1)*Math.cos(theta)*radius,y:centerY+Math.sin(theta)*radius}}),hc49_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("4.88mm"),id:length.optional().default("0.8mm"),od:length.optional().default("1.5mm"),w:length.optional().default("5.6mm"),h:length.optional().default("3.5mm")}),hc49=raw_params=>{let parameters=hc49_def.parse(raw_params),{p:p4,id:id2,od:od3,w:w4,h:h4}=parameters,radius=h4/2,plated_holes=[platedhole(1,-p4/2,0,id2,od3),platedhole(2,p4/2,0,id2,od3)],leftCurve=generate_u_curve(-w4/2,0,radius,"left"),rightCurve=generate_u_curve(w4/2,0,radius,"right"),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[...leftCurve,...leftCurve.slice(1).reverse(),{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2},...rightCurve,{x:w4/2,y:h4/2},{x:-w4/2,y:h4/2}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,p4/4,.5);return{circuitJson:[...plated_holes,silkscreenBody,silkscreenRefText],parameters}},pad_def=base_def.extend({w:length,h:length}),pad=params=>{let{w:w4,h:h4}=params,width=mm(w4),height=mm(h4);return{circuitJson:[rectpad(1,0,0,width,height),silkscreenRef(0,height/2+.5,.2)],parameters:params}},platedHolePill=(pn3,x5,y5,holeDiameter,outerWidth,outerHeight)=>({pcb_plated_hole_id:"",type:"pcb_plated_hole",shape:"pill",x:x5,y:y5,outer_width:mm(outerWidth),outer_height:mm(outerHeight),hole_width:mm(holeDiameter),hole_height:mm(holeDiameter),pcb_port_id:"",layers:["top","bottom"],port_hints:[pn3.toString()],ccw_rotation:0}),to92_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(2)]).default(3),p:external_exports.string().default("1.27mm"),id:external_exports.string().default("0.72mm"),od:external_exports.string().default("0.95mm"),w:external_exports.string().default("4.5mm"),h:external_exports.string().default("4.5mm"),inline:external_exports.boolean().default(!1),string:external_exports.string().optional()}),generateSemicircle=(centerX,centerY,radius)=>Array.from({length:25},(_5,i2)=>{let theta=i2/24*Math.PI;return{x:centerX+Math.cos(theta)*radius,y:centerY+Math.sin(theta)*radius}}),to92=raw_params=>{let match2=raw_params.string?.match(/^to92_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=to92_def.parse({...raw_params,num_pins:numPins}),{p:p4,id:id2,od:od3,w:w4,h:h4,inline}=parameters,holeY=Number.parseFloat(h4)/2,padSpacing7=Number.parseFloat(p4),holeDia=Number.parseFloat(id2),padDia=Number.parseFloat(od3),padWidth=padDia,padHeight=padDia*(1.5/1.05),platedHoles=[];if(parameters.num_pins===3)inline?platedHoles=[platedHoleWithRectPad(1,-padSpacing7,holeY-padSpacing7,holeDia,padDia,padHeight,0,0),platedHolePill(2,0,holeY-padSpacing7,holeDia,padWidth,padHeight),platedHolePill(3,padSpacing7,holeY-padSpacing7,holeDia,padWidth,padHeight)]:platedHoles=[platedHoleWithRectPad(1,-padSpacing7,holeY-padSpacing7,holeDia,padDia,padDia,0,0),platedhole(2,0,holeY,holeDia,padDia),platedhole(3,padSpacing7,holeY-padSpacing7,holeDia,padDia)];else if(parameters.num_pins===2)platedHoles=[platedHoleWithRectPad(1,-padSpacing7,holeY-padSpacing7,holeDia,padWidth,padHeight,0,0),platedHolePill(2,padSpacing7,holeY-padSpacing7,holeDia,padWidth,padHeight)];else throw new Error("Invalid number of pins for TO-92");let radius=Number.parseFloat(w4)/2,semicircle=generateSemicircle(0,holeY,radius),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[...semicircle,{x:-radius,y:0},{x:radius,y:0},semicircle[0]],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,holeY+1,.5);return{circuitJson:[...platedHoles,silkscreenBody,silkscreenRefText],parameters}},sod_def2=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("2.15mm"),h:external_exports.string().default("1.20mm"),pl:external_exports.string().default("0.5mm"),pw:external_exports.string().default("0.6mm"),p:external_exports.string().default("1.4mm")}),sod523=raw_params=>{let parameters=sod_def2.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing2(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords2=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing2=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords2({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sop8_def=extendSoicDef({}),sop8=raw_params=>{let parameters=sop8_def.parse(raw_params),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSoicCoords({num_pins:parameters.num_pins,pn:i2+1,w:parameters.w,p:parameters.p??1.27,pl:parameters.pl,widthincludeslegs:!0});pads.push(rectpad(i2+1,x5,y5,parameters.pl??"1.5mm",parameters.pw??"0.6mm"))}let sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw,silkscreenRefText=silkscreenRef(0,sh3/2-.5,sh3/12),silkscreenLine={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",type:"pcb_silkscreen_path",route:[{x:-parameters.w/3,y:sh3/2+.2},{x:parameters.w/3,y:sh3/2+.2}],stroke_width:.1};return{circuitJson:[...pads,silkscreenRefText,silkscreenLine],parameters}},sod80_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("5.0mm"),h:external_exports.string().default("2.30mm"),pl:external_exports.string().default("1.25mm"),pw:external_exports.string().default("2mm"),p:external_exports.string().default("3.75mm")}),sod80=raw_params=>{let parameters=sod80_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+1,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.5,y:length.parse(parameters.h)/2+.5},{x:-length.parse(parameters.w)/2-.5,y:length.parse(parameters.h)/2+.5},{x:-length.parse(parameters.w)/2-.5,y:-length.parse(parameters.h)/2-.5},{x:length.parse(parameters.p)/2+.5,y:-length.parse(parameters.h)/2-.5}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sod80WithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getsod80Coords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sod80WithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getsod80Coords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def3=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.4mm"),h:external_exports.string().default("2.1mm"),pl:external_exports.string().default("1.2mm"),pw:external_exports.string().default("1.2mm"),p:external_exports.string().default("2.9mm")}),sod123w=raw_params=>{let parameters=sod_def3.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing3(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords3=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing3=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords3({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def4=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.30mm"),h:external_exports.string().default("1.80mm"),pl:external_exports.string().default("0.60mm"),pw:external_exports.string().default("0.45mm"),p:external_exports.string().default("2.1mm")}),sod323=raw_params=>{let parameters=sod_def4.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing4(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords4=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing4=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords4({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def5=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.4mm"),h:external_exports.string().default("0.9mm"),pl:external_exports.string().default("0.36mm"),pw:external_exports.string().default("0.25mm"),p:external_exports.string().default("0.85mm")}),sod923=raw_params=>{let parameters=sod_def5.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.15,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.15,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.15,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2+.15,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing5(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords5=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing5=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords5({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def6=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.3mm"),h:external_exports.string().default("0.9mm"),pl:external_exports.string().default("0.4mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("0.7mm")}),sod882=raw_params=>{let parameters=sod_def6.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)+.1,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.2,y:length.parse(parameters.h)/2+.2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2+.2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2-.2},{x:length.parse(parameters.p)/2+.2,y:-length.parse(parameters.h)/2-.2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing6(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords6=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing6=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords6({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def7=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3,05mm"),h:external_exports.string().default("1.65mm"),pl:external_exports.string().default("0.6mm"),pw:external_exports.string().default("0.6mm"),pad_spacing:external_exports.string().default("2.2mm")}),sod323f=raw_params=>{let parameters=sod_def7.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.pad_spacing)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.pad_spacing)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing7(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords7=parameters=>{let{pn:pn3,pad_spacing}=parameters;return pn3===1?{x:-pad_spacing/2,y:0}:{x:pad_spacing/2,y:0}},sodWithoutParsing7=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords7({pn:i2,pad_spacing:Number.parseFloat(parameters.pad_spacing)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def8=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.4mm"),h:external_exports.string().default("2.1mm"),pl:external_exports.string().default("1.2mm"),pw:external_exports.string().default("1.2mm"),p:external_exports.string().default("2.9mm")}),sod123f=raw_params=>{let parameters=sod_def8.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing8(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords8=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing8=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords8({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod123FL_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.4mm"),h:external_exports.string().default("2.1mm"),pl:external_exports.string().default("0.91mm"),pw:external_exports.string().default("1.22mm"),p:external_exports.string().default("3.146mm")}),sod123fl=raw_params=>{let parameters=sod123FL_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing9(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords9=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing9=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords9({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def9=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.80mm"),h:external_exports.string().default("1.00mm"),pl:external_exports.string().default("0.66mm"),pw:external_exports.string().default("0.5mm"),p:external_exports.string().default("0.8mm")}),sod723=raw_params=>{let parameters=sod_def9.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing10(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords10=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing10=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords10({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def10=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("6.2mm"),h:external_exports.string().default("3.4mm"),pl:external_exports.string().default("1.4mm"),pw:external_exports.string().default("2.1mm"),p:external_exports.string().default("4.4mm")}),sod128=raw_params=>{let parameters=sod_def10.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.4,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing11(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords11=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing11=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords11({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sot89_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(5)]).default(3),w:external_exports.string().default("4.20mm"),h:external_exports.string().default("4.80mm"),pl:external_exports.string().default("1.3mm"),pw:external_exports.string().default("0.9mm"),p:external_exports.string().default("1.5mm"),string:external_exports.string().optional()}),sot89_3=parameters=>{let pads=[],padGap=Number.parseFloat(parameters.p),padWidth=Number.parseFloat(parameters.pw),length51=Number.parseFloat(parameters.w),padHeight=Number.parseFloat(parameters.pl),centerExtra=.175,outerPadXShift=(padHeight-(padHeight+centerExtra))/2;pads.push(rectpad(1,-length51/2+outerPadXShift,padGap,padHeight,padWidth),rectpad(2,-length51/2,0,padHeight+centerExtra,padWidth),rectpad(3,-length51/2+outerPadXShift,-padGap,padHeight,padWidth));let silkscreenRefText=silkscreenRef(0,0,.3),width=Number.parseFloat(parameters.w)/2-1,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot89_5=parameters=>{let pads=[],padGap=Number.parseFloat(parameters.p),padWidth=Number.parseFloat(parameters.pw),length51=Number.parseFloat(parameters.w);pads.push(rectpad(1,-1.85,-1.5,1.5,.7),rectpad(2,-1.85,1.5,1.5,.7),rectpad(3,0,0,.8,2),rectpad(4,1.85,-1.5,1.5,.7),rectpad(5,1.85,1.5,1.5,.7));let silkscreenRefText=silkscreenRef(0,Number.parseFloat(parameters.h)/2+.5,.3),width=Number.parseFloat(parameters.w)/2-1,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot89=raw_params=>{let match2=raw_params.string?.match(/^sot89_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=sot89_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot89_3(parameters),parameters};if(parameters.num_pins===5)return{circuitJson:sot89_5(parameters),parameters};throw new Error("Invalid number of pins for SOT89")},to220_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("5.0mm"),id:length.optional().default("1.0mm"),od:length.optional().default("1.9mm"),w:length.optional().default("13mm"),h:length.optional().default("7mm"),num_pins:external_exports.number().optional(),string:external_exports.string().optional()}),to220=raw_params=>{let parameters=to220_def.parse(raw_params),{fn:fn3,id:id2,od:od3,w:w4,h:h4,string:string3}=parameters,numPins=Number.parseInt(string3?.split("_")[1]??"3"),holeY=-1,halfWidth=w4/2,halfHeight=h4/2,minPitch=2.5,maxHoleWidth=w4*.4,computedPitch=Math.max(minPitch,maxHoleWidth/(numPins-1)),plated_holes=Array.from({length:numPins},(_5,i2)=>{let x5=numPins%2===0?(i2-numPins/2+.5)*computedPitch:(i2-Math.floor(numPins/2))*computedPitch;return platedhole(i2+1,x5,holeY,id2,od3)}),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-halfWidth,y:-halfHeight},{x:halfWidth,y:-halfHeight},{x:halfWidth,y:halfHeight},{x:-halfWidth,y:halfHeight},{x:-halfWidth,y:-halfHeight}],stroke_width:.1,pcb_silkscreen_path_id:""},yLine=-halfHeight+2*h4/3,horizontalLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-halfWidth,y:yLine},{x:halfWidth,y:yLine}],stroke_width:.1,pcb_silkscreen_path_id:""},verticalLines=[{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/6,y:yLine},{x:-w4/6,y:halfHeight}],stroke_width:.1,pcb_silkscreen_path_id:""},{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:w4/6,y:yLine},{x:w4/6,y:halfHeight}],stroke_width:.1,pcb_silkscreen_path_id:""}],silkscreenRefText=silkscreenRef(0,h4/2+.6,.5);return{circuitJson:[...plated_holes,silkscreenBody,horizontalLine,...verticalLines,silkscreenRefText],parameters:{...parameters,p:computedPitch}}},minimelf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("5.40mm"),h:external_exports.string().default("2.30mm"),pl:external_exports.string().default("1.30mm"),pw:external_exports.string().default("1.70mm"),p:external_exports.string().default("3.5mm")}),minimelf=raw_params=>{let parameters=minimelf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.4,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:miniMelfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getMiniMelfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},miniMelfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getMiniMelfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def11=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.90mm"),h:external_exports.string().default("1.33mm"),pl:external_exports.string().default("0.5mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("0.8mm")}),sod882d=raw_params=>{let parameters=sod_def11.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)+.1,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2+.1,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing12(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords12=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing12=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords12({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},melf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("7.0mm"),h:external_exports.string().default("3.35mm"),pl:external_exports.string().default("1.50mm"),pw:external_exports.string().default("2.70mm"),p:external_exports.string().default("4.8mm")}),melf=raw_params=>{let parameters=melf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:melfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getMelfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},melfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getMelfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},micromelf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.0mm"),h:external_exports.string().default("1.80mm"),pl:external_exports.string().default("0.80mm"),pw:external_exports.string().default("1.20mm"),p:external_exports.string().default("1.6mm")}),micromelf=raw_params=>{let parameters=micromelf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:microMelfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getMicroMelfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},microMelfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getMicroMelfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sma_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("7.10mm"),h:external_exports.string().default("3.40mm"),pl:external_exports.string().default("2.45mm"),pw:external_exports.string().default("1.80mm"),p:external_exports.string().default("4.05mm")}),sma=raw_params=>{let parameters=sma_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.5,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.5,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smaWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmaCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smaWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmaCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},smf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.80mm"),h:external_exports.string().default("2.10mm"),pl:external_exports.string().default("1.30mm"),pw:external_exports.string().default("1.40mm"),p:external_exports.string().default("2.9mm")}),smf=raw_params=>{let parameters=smf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},smb_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("7.30mm"),h:external_exports.string().default("4.40mm"),pl:external_exports.string().default("2.50mm"),pw:external_exports.string().default("2.30mm"),p:external_exports.string().default("4.30mm")}),smb=raw_params=>{let parameters=smb_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smbWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmbCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smbWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmbCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},smc_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("10.70mm"),h:external_exports.string().default("6.60mm"),pl:external_exports.string().default("3.30mm"),pw:external_exports.string().default("2.50mm"),p:external_exports.string().default("6.80mm")}),smc=raw_params=>{let parameters=smc_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,3,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2-.8},{x:-length.parse(parameters.w)/2-.8,y:length.parse(parameters.h)/2-.8},{x:-length.parse(parameters.w)/2-.8,y:-length.parse(parameters.h)/2+.8},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2+.8}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smcWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmcCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smcWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmcCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sot223_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(4),w:external_exports.string().default("8.50mm"),h:external_exports.string().default("6.90mm"),pl:external_exports.string().default("2mm"),pw:external_exports.string().default("1.5mm"),p:external_exports.string().default("2.30mm"),string:external_exports.string().optional()}),sot223=raw_params=>{let match2=raw_params.string?.match(/^sot223_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):4;if(numPins===8){let parameters2=sot223_8_def.parse({...raw_params,num_pins:numPins});return{circuitJson:soicWithoutParsing(parameters2),parameters:parameters2}}let parameters=sot223_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===4)return{circuitJson:sot223_4(parameters),parameters};if(parameters.num_pins===5)return{circuitJson:sot223_5(parameters),parameters};if(parameters.num_pins===6)return{circuitJson:sot223_6(parameters),parameters};throw new Error("Invalid number of pins")},get2CcwSot223Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-w4/2+1.1,y:p4}:pn3===2?{x:-w4/2+1.1,y:0}:pn3===3?{x:-w4/2+1.1,y:-p4}:{x:w4/2-1.1,y:0}},sot223_4=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=get2CcwSot223Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)}),pinWidth=i2===3?3.8:Number.parseFloat(parameters.pw);pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),pinWidth))}let silkscreenRefText=silkscreenRef(0,0,.3),width=Number.parseFloat(parameters.w)/2-2.4,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot223_8_def=extendSoicDef({p:"0.90mm",w:"2.8mm",legsoutside:!0}),get2CcwSot2235Coords=parameters=>{let{p:p4,h:h4,pn:pn3,w:w4}=parameters;if(pn3===1)return{x:-w4/2+1.2,y:p4/2+p4};if(pn3===2)return{x:-w4/2+1.2,y:p4/2};if(pn3===3)return{x:-w4/2+1.2,y:-p4/2};if(pn3===4)return{x:-w4/2+1.2,y:-p4/2-p4};if(pn3===5)return{x:w4/2-1,y:0};throw new Error("Invalid pin number")},sot223_5=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=get2CcwSot2235Coords({h:Number.parseFloat(parameters.h),p:1.5,pn:i2,w:Number.parseFloat(parameters.w)}),pinWidth=Number.parseFloat(parameters.pw),pinLength=Number.parseFloat(parameters.pl);i2===5?(pinWidth=3.4,pinLength=1.8):(pinWidth=1,pinLength=2.2),pads.push(rectpad(i2,x5,y5,pinLength,pinWidth))}let width=Number.parseFloat(parameters.w)/2-2.4,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenRefText=silkscreenRef(0,0,.3);return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},get2CcwSot2236Coords=parameters=>{let{p:p4,h:h4,pn:pn3,w:w4}=parameters;if(pn3===1)return{x:-w4/2+1.2,y:2*p4};if(pn3===2)return{x:-w4/2+1.2,y:p4};if(pn3===3)return{x:-w4/2+1.2,y:0};if(pn3===4)return{x:-w4/2+1.2,y:-p4};if(pn3===5)return{x:-w4/2+1.2,y:-2*p4};if(pn3===6)return{x:w4/2-1.175,y:0};throw new Error("Invalid pin number")},sot223_6=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=get2CcwSot2236Coords({h:Number.parseFloat(parameters.h),p:1.3,pn:i2,w:8.7}),pinWidth=Number.parseFloat(parameters.pw),pinLength=Number.parseFloat(parameters.pl);i2===6?(pinWidth=3.4,pinLength=2.15):(pinWidth=.6,pinLength=2.2),pads.push(rectpad(i2,x5,y5,pinLength,pinWidth))}let width=Number.parseFloat(parameters.w)/2-2.4,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenRefText=silkscreenRef(0,0,.3);return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot23w_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),w:external_exports.string().default("3.40mm"),h:external_exports.string().default("3.30mm"),pl:external_exports.string().default("1mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("1.2mm"),string:external_exports.string().optional()}),sot23w=raw_params=>{let match2=raw_params.string?.match(/^sot23w_(\d+)/),numPins=match2?Number.parseInt(match2[1],3):3,parameters=sot23w_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot23w_3(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot23wCoords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-p4,y:.95}:pn3===2?{x:-p4,y:-.95}:{x:p4,y:0}},sot23w_3=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot23wCoords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let silkscreenRefText=silkscreenRef(0,Number.parseInt(parameters.h)/2+1,.3),width=Number.parseFloat(parameters.w)/2-1,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width+.3,y:height},{x:width+.3,y:height/2}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width+.3,y:-height},{x:width+.3,y:-height/2}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},to92s_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(2)]).default(3),p:external_exports.string().default("1.27mm"),id:external_exports.string().default("0.72mm"),od:external_exports.string().default("0.95mm"),w:external_exports.string().default("2.5mm"),h:external_exports.string().default("4.2mm"),string:external_exports.string().optional()}),to92s_3=parameters=>{let{p:p4,id:id2,od:od3,w:w4,h:h4}=parameters,holeY=Number.parseFloat(h4)/2,padSpacing7=Number.parseFloat(p4);return[platedhole(1,-padSpacing7,holeY-padSpacing7,id2,od3),platedhole(2,0,holeY-padSpacing7,id2,od3),platedhole(3,padSpacing7,holeY-padSpacing7,id2,od3)]},to92s_2=parameters=>{let{p:p4,id:id2,od:od3,h:h4}=parameters,holeY=Number.parseFloat(h4)/2,padSpacing7=Number.parseFloat(p4);return[platedhole(1,-padSpacing7,holeY-padSpacing7,id2,od3),platedhole(2,padSpacing7,holeY-padSpacing7,id2,od3)]},to92s=raw_params=>{let match2=raw_params.string?.match(/^to92s_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=to92s_def.parse({...raw_params,num_pins:numPins}),platedHoles=[];if(parameters.num_pins===3)platedHoles=to92s_3(parameters);else if(parameters.num_pins===2)platedHoles=to92s_2(parameters);else throw new Error("Invalid number of pins for TO-92");let holeY=Number.parseFloat(parameters.h)/2,padSpacing7=Number.parseFloat(parameters.p),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-holeY,y:holeY-padSpacing7},{x:-1.9,y:0},{x:1.9,y:0},{x:holeY,y:holeY-padSpacing7},{x:1.5,y:Number.parseFloat(parameters.h)/2+.5},{x:-1.5,y:Number.parseFloat(parameters.h)/2+.5},{x:-holeY,y:holeY-padSpacing7}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,holeY+1,.5);return{circuitJson:[...platedHoles,silkscreenBody,silkscreenRefText],parameters}},jst_def=base_def.extend({fn:external_exports.string(),p:length.optional(),id:length.optional(),pw:length.optional(),pl:length.optional(),w:length.optional(),h:length.optional(),sh:external_exports.union([external_exports.boolean(),external_exports.string(),external_exports.number()]).optional().transform(v5=>{if(typeof v5=="string"){let n3=Number(v5);return Number.isNaN(n3)?!0:n3}return v5}).describe('JST SH (Surface-mount) connector family. SH stands for "Super High-density".'),ph:external_exports.boolean().optional().describe('JST PH (Through-hole) connector family. PH stands for "Pin Header".'),string:external_exports.string().optional()}),variantDefaults={ph:{p:length.parse("2.2mm"),id:length.parse("0.70mm"),pw:length.parse("1.20mm"),pl:length.parse("1.20mm"),w:length.parse("6mm"),h:length.parse("5mm")},sh:{p:length.parse("1mm"),pw:length.parse("0.6mm"),pl:length.parse("1.55mm"),w:length.parse("5.8mm"),h:length.parse("7.8mm")}};function getVariant(params){return params.sh?"sh":(params.ph,"ph")}function generatePads(variant,numPins,p4,id2,pw,pl3){let pads=[];if(variant==="ph"){let half_p=p4/2;pads.push(platedHoleWithRectPad(1,-half_p,2,id2,pw,pl3)),pads.push(platedHoleWithRectPad(2,half_p,2,id2,pw,pl3))}else{let startX=-((numPins-1)/2)*p4;for(let i2=0;i2<numPins;i2++){let x5=startX+i2*p4;console.log("x si",x5),pads.push(rectpad(i2+1,x5,-1.325,pw,pl3))}let sideOffset=(numPins-1)/2*p4+1.3;console.log("offset",sideOffset),pads.push(rectpad(numPins+1,-sideOffset,1.22,1.2,1.8)),pads.push(rectpad(numPins+2,sideOffset,1.22,1.2,1.8))}return pads}function generateSilkscreenBody(variant,w4,h4){return variant==="ph"?{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-3,y:3},{x:3,y:3},{x:3,y:-2},{x:-3,y:-2},{x:-3,y:3}],stroke_width:.1,pcb_silkscreen_path_id:""}:{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[],stroke_width:.1,pcb_silkscreen_path_id:""}}var jst=raw_params=>{let params=jst_def.parse(raw_params),variant=getVariant(params),defaults=variantDefaults[variant],p4=params.p??defaults.p,id2=params.id??defaults.id,pw=params.pw??defaults.pw,pl3=params.pl??defaults.pl,w4=params.w??defaults.w,h4=params.h??defaults.h,numPins=variant==="sh"?4:2;if(variant==="sh"){let match2=(typeof raw_params.string=="string"?raw_params.string:"").match(/sh(\d+)/);if(match2&&match2[1]){let parsed=parseInt(match2[1],10);Number.isNaN(parsed)||(numPins=parsed)}else typeof params.sh=="number"&&(numPins=params.sh)}let pads=generatePads(variant,numPins,p4,id2,pw,pl3),silkscreenBody=generateSilkscreenBody(variant,w4,h4),silkscreenRefText=silkscreenRef(0,h4/2+1,.5);return{circuitJson:[...pads,silkscreenBody,silkscreenRefText],parameters:{...params,p:p4,id:id2,pw,pl:pl3,w:w4,h:h4,num_pins:numPins,sh:variant==="sh",ph:variant==="ph"}}},sod_def12=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.30mm"),h:external_exports.string().default("1.70mm"),pl:external_exports.string().default("0.80mm"),pw:external_exports.string().default("1mm"),p:external_exports.string().default("1.90mm")}),sod110=raw_params=>{let parameters=sod_def12.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing13(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords13=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing13=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords13({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},getDefaultValues=num_pins=>{switch(num_pins){case 8:return{w:"3.06mm",h:"3.14mm",p:"0.65mm",pl:"1.6mm",pw:"0.5mm"};case 10:return{w:"3.10mm",h:"3.33mm",p:"0.5mm",pl:"1.45mm",pw:"0.3mm"};default:return{w:"3.06mm",h:"3.14mm",p:"0.65mm",pl:"1.6mm",pw:"0.5mm"}}},vssop_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(8),external_exports.literal(10)]).default(8),w:external_exports.string().optional(),h:external_exports.string().optional(),p:external_exports.string().optional(),pl:external_exports.string().optional(),pw:external_exports.string().optional(),string:external_exports.string().optional()}),vssop=raw_params=>{let parameters=vssop_def.parse(raw_params),defaults=getDefaultValues(parameters.num_pins),w4=length.parse(parameters.w||defaults.w),h4=length.parse(parameters.h||defaults.h),p4=length.parse(parameters.p||defaults.p),pl3=length.parse(parameters.pl||defaults.pl),pw=length.parse(parameters.pw||defaults.pw),pads=[],half=parameters.num_pins/2;for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getVssopPadCoord(parameters.num_pins,i2+1,w4,p4),logical_pn=i2<half?i2+1:parameters.num_pins-(i2-half);pads.push(rectpad(logical_pn,x5,y5,pl3,pw))}let silkscreenBoxWidth=w4,silkscreenBoxHeight=h4,silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getVssopPadCoord(parameters.num_pins,1,silkscreenBoxWidth,p4),pin1MarkerPosition={x:pin1Position.x-.8,y:pin1Position.y},pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,silkscreenBoxHeight/2+.5,.3);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getVssopPadCoord=(pinCount,pn3,w4,p4)=>{let half=pinCount/2,rowIndex=(pn3-1)%half,col=pn3<=half?-1:1,row=(half-1)/2-rowIndex;return{x:col*length.parse(pinCount===8?"1.8mm":"2.2mm"),y:row*p4}},getDefaultValues2=num_pins=>{switch(num_pins){case 10:return{w:"3.10mm",h:"3.32mm",p:"0.5mm",pl:"1.63mm",pw:"0.33mm"};case 12:return{w:"3mm",h:"4mm",p:"0.65mm",pl:"0.88mm",pw:"0.4mm"};case 16:return{w:"3.10mm",h:"4mm",p:"0.5mm",pl:"0.88mm",pw:"0.3mm"};default:return{w:"3.10mm",h:"3.32mm",p:"0.65mm",pl:"1.63mm",pw:"0.4mm"}}},msop_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(8),external_exports.literal(10),external_exports.literal(12),external_exports.literal(16)]).default(8),w:external_exports.string().optional(),h:external_exports.string().optional(),p:external_exports.string().optional(),pl:external_exports.string().optional(),pw:external_exports.string().optional(),string:external_exports.string().optional()}),getMsopCoords=(pinCount,pn3,w4,p4)=>{let half=pinCount/2,rowIndex=(pn3-1)%half,col=pn3<=half?-1:1,row=(half-1)/2-rowIndex;return{x:col*length.parse("2mm"),y:row*p4}},msop=raw_params=>{let parameters=msop_def.parse(raw_params),defaults=getDefaultValues2(parameters.num_pins),w4=length.parse(parameters.w||defaults.w),h4=length.parse(parameters.h||defaults.h),p4=length.parse(parameters.p||defaults.p),pl3=length.parse(parameters.pl||defaults.pl),pw=length.parse(parameters.pw||defaults.pw),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getMsopCoords(parameters.num_pins,i2+1,w4,p4);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenBoxWidth=w4,silkscreenBoxHeight=h4,silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getMsopCoords(parameters.num_pins,1,silkscreenBoxWidth,p4),pin1MarkerPosition={x:pin1Position.x-.8,y:pin1Position.y},pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,silkscreenBoxHeight/2+.5,.3);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},sod323w_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.8mm"),h:external_exports.string().default("1.65mm"),pl:external_exports.string().default("1.2mm"),pw:external_exports.string().default("1.2mm"),pad_spacing:external_exports.string().default("2.6mm")}),sod323w=raw_params=>{let parameters=sod323w_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.pad_spacing)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.pad_spacing)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing14(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords14=parameters=>{let{pn:pn3,pad_spacing}=parameters;return pn3===1?{x:-pad_spacing/2,y:0}:{x:pad_spacing/2,y:0}},sodWithoutParsing14=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords14({pn:i2,pad_spacing:Number.parseFloat(parameters.pad_spacing)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod323FL_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.20mm"),h:external_exports.string().default("1.65mm"),pl:external_exports.string().default("0.8mm"),pw:external_exports.string().default("0.9mm"),pad_spacing:external_exports.string().default("2.1mm")}),sod323fl=raw_params=>{let parameters=sod323FL_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.pad_spacing)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.pad_spacing)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing15(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords15=parameters=>{let{pn:pn3,pad_spacing}=parameters;return pn3===1?{x:-pad_spacing/2,y:0}:{x:pad_spacing/2,y:0}},sodWithoutParsing15=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords15({pn:i2,pad_spacing:Number.parseFloat(parameters.pad_spacing)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},son_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(6),external_exports.literal(8)]).default(8),w:external_exports.string().default("3mm"),h:external_exports.string().default("3mm"),p:external_exports.string().default("0.5mm"),pl:external_exports.string().default("0.52mm"),pw:external_exports.string().default("0.35mm"),epw:external_exports.string().default("1.40mm"),eph:external_exports.string().default("1.60mm"),string:external_exports.string().optional(),ep:external_exports.boolean().default(!1)}),son=raw_params=>{raw_params.string&&raw_params.string.includes("_ep")&&(raw_params.ep=!0);let match2=raw_params.string?.match(/^son_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):raw_params.num_pins||8,parameters=son_def.parse({...raw_params,num_pins:numPins}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),epw=length.parse(parameters.epw),eph=length.parse(parameters.eph),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getSonPadCoord(parameters.num_pins,i2+1,w4,p4);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}parameters.ep&&pads.push(rectpad(parameters.num_pins+1,0,0,epw,eph));let silkscreenBoxWidth=w4,silkscreenBoxHeight=h4,silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSonPadCoord(parameters.num_pins,1,silkscreenBoxWidth,p4),pin1MarkerPosition={x:pin1Position.x-.4,y:pin1Position.y},pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,silkscreenBoxHeight/2+.5,.3);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSonPadCoord=(num_pins,pn3,w4,p4)=>{let half=num_pins/2,rowIndex=(pn3-1)%half,col=pn3<=half?-1:1,row=(half-1)/2-rowIndex;return{x:col*length.parse("1.4mm"),y:row*p4}},solderjumper=params=>{let{num_pins,bridged,p:p4=2.54,pw=1.5,ph:ph3=1.5}=params,padSpacing7=length.parse(p4),padWidth=length.parse(pw),padHeight=length.parse(ph3),traceWidth=Math.min(padHeight/4,.5),pads=[];for(let i2=0;i2<num_pins;i2++)pads.push(rectpad(i2+1,i2*padSpacing7,0,padWidth,padHeight));let traces=[];if(bridged){let pins=bridged.split("").map(Number);if(pins.length>1)for(let i2=0;i2<pins.length-1;i2++){let from=pins[i2],to3=pins[i2+1];if(typeof from=="number"&&typeof to3=="number"&&!isNaN(from)&&!isNaN(to3)){let xCenterFrom=(from-1)*padSpacing7,xCenterTo=(to3-1)*padSpacing7,directionMult=Math.sign(xCenterTo-xCenterFrom),x12=xCenterFrom+directionMult*(padWidth/2),x22=xCenterTo-directionMult*(padWidth/2);traces.push({type:"pcb_trace",pcb_trace_id:"",route:[{start_pcb_port_id:`{PIN${from}}`,x:x12,y:0,width:traceWidth,layer:"top",route_type:"wire"},{end_pcb_port_id:`{PIN${to3}}`,x:x22,y:0,width:traceWidth,layer:"top",route_type:"wire"}]})}}}let outlineWidth=(num_pins-1)*padSpacing7+padWidth+.7,outlineHeight=padHeight+1,outlineCenterX=(num_pins-1)*padSpacing7/2,outlineCenterY=0,silkscreenRect={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"outline",route:[{x:outlineCenterX-outlineWidth/2,y:outlineCenterY-outlineHeight/2},{x:outlineCenterX+outlineWidth/2,y:outlineCenterY-outlineHeight/2},{x:outlineCenterX+outlineWidth/2,y:outlineCenterY+outlineHeight/2},{x:outlineCenterX-outlineWidth/2,y:outlineCenterY+outlineHeight/2},{x:outlineCenterX-outlineWidth/2,y:outlineCenterY-outlineHeight/2}],stroke_width:.15},refY=outlineCenterY+outlineHeight/2+.6,silk=silkscreenRef(outlineCenterX,refY,.4);return{circuitJson:[...pads,...traces,silkscreenRect,silk],parameters:params}},commonSchema={fn:external_exports.literal("sot457"),num_pins:external_exports.literal(6).default(6),pillh:external_exports.string().default("0.45mm"),pillw:external_exports.string().default("1.45mm"),pl:external_exports.string(),pw:external_exports.string(),p:external_exports.string(),wave:external_exports.boolean().optional(),reflow:external_exports.boolean().optional()},sot457DefSchema=base_def.extend({...commonSchema,h:external_exports.string().default("2.5mm"),w:external_exports.string().default("2.7mm"),pl:external_exports.string().default("0.8mm"),pw:external_exports.string().default("0.55mm"),p:external_exports.string().default("0.95mm")}),sot457WaveSchema=base_def.extend({...commonSchema,h:external_exports.string().default("3mm"),w:external_exports.string().default("4mm"),pillr:external_exports.string().default("0.225mm"),pl:external_exports.string().default("1.45mm"),pw:external_exports.string().default("1.5mm"),p:external_exports.string().default("1.475mm")}).transform(data=>({...data,wave:data.wave??(data.reflow===void 0?!0:!data.reflow),reflow:data.reflow??(data.wave===void 0?!1:!data.wave)})),parseDimension=value=>Number.parseFloat(value.replace("mm","")),getCcwSot457Coords=({pitch,width,pinNumber})=>{let coord={1:{x:-width/2-.1,y:pitch},2:{x:-width/2-.1,y:0},3:{x:-width/2-.1,y:-pitch},4:{x:width/2+.1,y:-pitch},5:{x:width/2+.1,y:0},6:{x:width/2+.1,y:pitch}}[pinNumber];if(!coord)throw new Error(`Invalid pin number: ${pinNumber}`);return coord},generateSot457Elements=params=>{let pads=[],pitch=parseDimension(params.p),padLength=parseDimension(params.pl),padWidth=parseDimension(params.pw),width=parseDimension(params.w),height=parseDimension(params.h);if(params.wave){let pinConfigs={1:({padWidth:padWidth2,padHeight})=>rectpad(1,-pitch,pitch,padHeight,padWidth2),2:({padWidth:padWidth2,padHeight})=>rectpad(2,-pitch,-pitch,padHeight,padWidth2),3:({padWidth:padWidth2,padHeight})=>pillpad(3,-pitch,0,parseDimension(params.pillw),parseDimension(params.pillh)),4:({padWidth:padWidth2,padHeight})=>pillpad(4,pitch,0,parseDimension(params.pillw),parseDimension(params.pillh)),5:({padWidth:padWidth2,padHeight})=>rectpad(5,pitch,pitch,padHeight,padWidth2),6:({padWidth:padWidth2,padHeight})=>rectpad(6,pitch,-pitch,padHeight,padWidth2)};for(let i2=1;i2<=params.num_pins;i2++){let config=pinConfigs[i2];config&&pads.push(config({padWidth:padLength,padHeight:padWidth}))}}else for(let i2=1;i2<=params.num_pins;i2++){let{x:x5,y:y5}=getCcwSot457Coords({pitch,width,pinNumber:i2});pads.push(rectpad(i2,x5,y5,padLength,padWidth))}let silkscreenPath1={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width/3,y:height/2+pitch/1.3},{x:width/3,y:height/2+pitch/1.3}],stroke_width:.05},silkscreenPath2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width/3,y:-height/2-pitch/1.3},{x:width/3,y:-height/2-pitch/1.3}],stroke_width:.05},silkscreenRefText=silkscreenRef(0,height+.5,.3),pin1Position=getCcwSot457Coords({pitch,width,pinNumber:1}),triangleHeight=params.wave?1:.5,triangleWidth=params.wave?.7:.3;pin1Position.x-=params.wave?padWidth:padWidth*1.7;let pin1Indicator={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_indicator",route:[{x:pin1Position.x+triangleHeight/2,y:pin1Position.y},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y+triangleWidth/2},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y-triangleWidth/2},{x:pin1Position.x+triangleHeight/2,y:pin1Position.y}],stroke_width:.05};return[silkscreenRefText,silkscreenPath1,silkscreenPath2,pin1Indicator,...pads]},sot457=rawParams=>{if(rawParams.wave){let parameters2=sot457WaveSchema.parse({...rawParams,fn:"sot457"});return{circuitJson:generateSot457Elements(parameters2),parameters:parameters2}}let parameters=sot457DefSchema.parse(rawParams);return{circuitJson:generateSot457Elements(parameters),parameters}},sot963_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),w:external_exports.string().default("1.1mm"),h:external_exports.string().default("1.45mm"),p:external_exports.string().default("0.35mm"),pl:external_exports.string().default("0.2mm"),pw:external_exports.string().default("0.2mm"),string:external_exports.string().optional()}),sot963=raw_params=>{let parameters=sot963_def.parse({...raw_params,fn:"sot963"}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),pads=[];for(let i2=0;i2<6;i2++){let{x:x5,y:y5}=getSot963PadCoord(i2+1,w4,p4,pl3);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:h4/2},{x:w4/2,y:h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSot963PadCoord(1,w4,p4,pl3),pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1Position.x-pl3/2-.3,y:pin1Position.y},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y+.15},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y-.15},{x:pin1Position.x-pl3/2-.3,y:pin1Position.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,h4/2+.4,.25);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSot963PadCoord=(pn3,w4,p4,pl3)=>{let padCenterOffset=w4/2-pl3/2;return pn3<=3?{x:-padCenterOffset,y:p4-(pn3-1)*p4}:{x:padCenterOffset,y:-p4+(pn3-4)*p4}},potentiometer_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(2)]).default(3),p:external_exports.string().default("3.8mm"),id:external_exports.string().default("1.25mm"),od:external_exports.string().default("2.35mm"),ca:external_exports.string().default("14mm").describe("Caliper axis (width or diameter of the potentiometer body or adjustment knob)"),w:external_exports.string().default("5.35mm"),h:external_exports.string().default("4mm"),string:external_exports.string().optional()}),potentiometer_acp=parameters=>{let{p:p4,id:id2,od:od3,h:h4,ca:ca3}=parameters,y5=Number.parseFloat(h4),caliper=Number.parseFloat(ca3);return[platedhole(1,0,caliper/4+.3,id2,od3),platedhole(2,y5,0,id2,od3),platedhole(3,0,-caliper/4-.3,id2,od3)]},potentiometer=raw_params=>{let match2=raw_params.string?.match(/^potentiometer_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=potentiometer_def.parse({...raw_params,num_pins:numPins}),platedHoles=[];parameters.num_pins===3&&(platedHoles=potentiometer_acp(parameters));let y5=Number.parseFloat(parameters.ca)/2+.15,x5=Number.parseFloat(parameters.w),od3=Number.parseFloat(parameters.od)/2+.35,silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:0,y:y5-1.75},{x:0,y:y5},{x:x5,y:y5},{x:x5,y:od3}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenBody2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:x5,y:-od3},{x:x5,y:-y5},{x:0,y:-y5},{x:0,y:-y5+1.75}],stroke_width:.1,pcb_silkscreen_path_id:""},W5=Number.parseFloat(parameters.w)/2,silkscreenRefText=silkscreenRef(W5,y5+1,.5);return{circuitJson:[...platedHoles,silkscreenBody,silkscreenBody2,silkscreenRefText],parameters}},electrolytic_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("7.5mm"),id:length.optional().default("1mm"),od:length.optional().default("2mm"),d:length.optional().default("10.5mm")}),generate_circle_arcs=(centerX,centerY,radius,cut,cutHeight)=>{let topArc=[],bottomArc=[];for(let i2=0;i2<=50;i2++){let theta=i2/50*Math.PI,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||topArc.push({x:x5,y:y5})}for(let i2=0;i2<=50;i2++){let theta=Math.PI+i2/50*Math.PI,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||bottomArc.push({x:x5,y:y5})}return{topArc,bottomArc}},electrolytic=raw_params=>{let parameters=electrolytic_def.parse(raw_params),{p:p4,id:id2,od:od3,d:d3}=parameters,plated_holes=[platedhole(1,-p4/2,0,id2,od3),platedhole(2,p4/2,0,id2,od3)],{topArc,bottomArc}=generate_circle_arcs(0,0,d3/2+.1,od3/2,od3),silkscreenBody2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:topArc,stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenBody3={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:bottomArc,stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:0,y:d3/2+.1},{x:0,y:-(d3/2+.1)}],stroke_width:.1,pcb_silkscreen_path_id:""},X6=-(d3/2+.5),plusY=od3/2+1.5,Size=.5,silkscreenpath2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:X6-Size,y:plusY},{x:X6+Size,y:plusY}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenline={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:X6,y:plusY-Size},{x:X6,y:plusY+Size}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,d3/2+1,.5);return{circuitJson:[...plated_holes,silkscreenBody2,silkscreenBody3,silkscreenBody,silkscreenpath2,silkscreenline,silkscreenRefText],parameters}},smbf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("6.5mm"),h:external_exports.string().default("3mm"),pl:external_exports.string().default("1.75mm"),pw:external_exports.string().default("2.40mm"),p:external_exports.string().default("4.75mm")}),smbf=raw_params=>{let parameters=smbf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.3,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.3,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smbfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmbfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smbfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmbfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sot323_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),w:external_exports.string().default("2.45mm"),h:external_exports.string().default("2.40mm"),pl:external_exports.string().default("1.225mm"),pw:external_exports.string().default("0.5mm"),p:external_exports.string().default("0.95mm"),string:external_exports.string().optional()}),sot323=raw_params=>{let match2=raw_params.string?.match(/^sot323_(\d+)/),numPins=match2?Number.parseInt(match2[1],3):3,parameters=sot323_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot323_3(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot323Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-p4,y:.65}:pn3===2?{x:-p4,y:-.65}:{x:p4,y:0}},sot323_3=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot323Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let silkscreenRefText=silkscreenRef(0,Number.parseInt(parameters.h)/2+1,.3),width=Number.parseFloat(parameters.w)/2-Number.parseFloat(parameters.pl),height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height+.3},{x:width,y:height+.3},{x:width,y:height/2}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height-.3},{x:width,y:-height-.3},{x:width,y:-height/2}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},smtpad_def=base_def.extend({fn:external_exports.string(),circle:external_exports.boolean().optional(),rect:external_exports.boolean().optional(),square:external_exports.boolean().optional(),pill:external_exports.boolean().optional(),d:length.optional(),pd:length.optional(),diameter:length.optional(),r:length.optional(),pr:length.optional(),radius:length.optional(),w:length.optional(),pw:length.optional(),width:length.optional(),h:length.optional(),ph:length.optional(),height:length.optional(),s:length.optional(),size:length.optional(),string:external_exports.string().optional()}).transform(v5=>{let shape="rect";v5.circle&&(shape="circle"),v5.square&&(shape="square"),v5.rect&&(shape="rect"),v5.pill&&(shape="pill");let radius,width,height;return shape==="circle"?v5.r!==void 0?radius=mm(v5.r):v5.pr!==void 0?radius=mm(v5.pr):v5.radius!==void 0?radius=mm(v5.radius):v5.d!==void 0?radius=mm(v5.d)/2:v5.pd!==void 0?radius=mm(v5.pd)/2:v5.diameter!==void 0?radius=mm(v5.diameter)/2:radius=mm("1mm")/2:(v5.w!==void 0?width=mm(v5.w):v5.pw!==void 0?width=mm(v5.pw):v5.width!==void 0?width=mm(v5.width):v5.s!==void 0?width=mm(v5.s):v5.size!==void 0?width=mm(v5.size):width=mm("1mm"),v5.h!==void 0?height=mm(v5.h):v5.ph!==void 0?height=mm(v5.ph):v5.height!==void 0?height=mm(v5.height):shape==="square"||shape==="rect"?height=width:height=mm("1mm")),{fn:v5.fn,shape,radius,width,height}}),smtpad=raw_params=>{let params=smtpad_def.parse(raw_params),{shape,radius,width,height}=params,pad2,silkscreenOffset;return shape==="circle"?(pad2=circlepad(1,{x:0,y:0,radius}),silkscreenOffset=radius+.5):shape==="pill"?(pad2=pillpad(1,0,0,width,height),silkscreenOffset=Math.max(width,height)/2+.5):(pad2=rectpad(1,0,0,width,height),silkscreenOffset=height/2+.5),{circuitJson:[pad2,silkscreenRef(0,silkscreenOffset,.2)],parameters:params}},platedhole_def=base_def.extend({fn:external_exports.string(),d:length.optional(),hd:length.optional(),r:length.optional(),hr:length.optional(),pd:length.optional(),pr:length.optional(),squarepad:external_exports.boolean().optional().default(!1)}).transform(v5=>{let holeD;v5.d!==void 0?holeD=mm(v5.d):v5.hd!==void 0?holeD=mm(v5.hd):v5.r!==void 0?holeD=mm(v5.r)*2:v5.hr!==void 0?holeD=mm(v5.hr)*2:holeD=mm("1mm");let padD;return v5.pd!==void 0?padD=mm(v5.pd):v5.pr!==void 0?padD=mm(v5.pr)*2:padD=holeD*(1.5/1),{fn:v5.fn,d:holeD,pd:padD,squarepad:v5.squarepad??!1}}),platedhole2=raw_params=>{let params=platedhole_def.parse(raw_params),{d:d3,pd:pd2,squarepad}=params;return{circuitJson:[squarepad?platedHoleWithRectPad(1,0,0,d3,pd2,pd2):platedhole(1,0,0,d3,pd2),silkscreenRef(0,pd2/2+.5,.2)],parameters:params}},sot_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),h:external_exports.string().default("1.6mm"),pl:external_exports.string().default("1mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("0.95mm")}),sot=raw_params=>{let parameters=sot_def.parse(raw_params);return{circuitJson:sotWithoutParsing(parameters),parameters}},getCcwSotCoords=parameters=>{let{p:p4,h:h4,pn:pn3}=parameters;if(pn3===1)return{x:-h4/2-.5,y:p4};if(pn3===2)return{x:-h4/2-.5,y:0};if(pn3===3)return{x:-h4/2-.5,y:-p4};if(pn3===4)return{x:h4/2+.5,y:-p4};if(pn3===5)return{x:h4/2+.5,y:0};if(pn3===6)return{x:h4/2+.5,y:p4};throw new Error("Invalid pin number")},sotWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSotCoords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:i2});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let width=parameters.num_pins/2*Number.parseFloat(parameters.p),height=Number.parseFloat(parameters.h),silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width/3,y:height/2+Number.parseFloat(parameters.p)/1.3},{x:width/3,y:height/2+Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3},{x:width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenRefText=silkscreenRef(0,height+.3,.3),pin1Position=getCcwSotCoords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:1});pin1Position.x=pin1Position.x-Number.parseFloat(parameters.pw)*1.5;let triangleHeight=.7,triangleWidth=.3,pin1Indicator={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_indicator",route:[{x:pin1Position.x+triangleHeight/2,y:pin1Position.y},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y+triangleWidth/2},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y-triangleWidth/2},{x:pin1Position.x+triangleHeight/2,y:pin1Position.y}],stroke_width:.05};return[...pads,silkscreenRefText,silkscreenPath1,silkscreenPath2,pin1Indicator]},sot343_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(4),w:external_exports.string().default("3.2mm"),h:external_exports.string().default("2.6mm"),pl:external_exports.string().default("1.35mm"),pw:external_exports.string().default("0.50mm"),p:external_exports.string().default("0.6mm"),string:external_exports.string().optional()}),sot343=raw_params=>{let match2=raw_params.string?.match(/^sot343_(\d+)/),numPins=match2?Number.parseInt(match2[1],4):4,parameters=sot343_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===4)return{circuitJson:sot343_4(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot343Coords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4*1.92,y:-.65}:pn3===2?{x:-p4*1.92,y:.65}:pn3===3?{x:p4,y:.65}:pn3===4?{x:p4,y:-.65}:{x:0,y:0}},sot343_4=parameters=>{let pads=[],w4=Number.parseFloat(parameters.w),h4=Number.parseFloat(parameters.h),pl3=Number.parseFloat(parameters.pl),pw=Number.parseFloat(parameters.pw),p4=Number.parseFloat(parameters.p),minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot343Coords({num_pins:parameters.num_pins,pn:i2+1,w:w4,h:h4,pl:pl3,p:p4});pads.push(rectpad(i2+1,x5,y5,pl3,pw)),x5<minX&&(minX=x5),x5>maxX&&(maxX=x5),y5<minY&&(minY=y5),y5>maxY&&(maxY=y5)}let silkscreenXOffset=(minX+maxX)/2,padVerticalDistance=maxY-minY,silkscreenMargin=h4*.3,offsetY=padVerticalDistance/2+silkscreenMargin,silkscreenLineLength=w4*.8;h4<=2.6&&(silkscreenLineLength/=2);let silkscreenRefText=silkscreenRef(silkscreenXOffset,offsetY+.5,.3),silkscreenPathTop={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_top",route:[{x:silkscreenXOffset-silkscreenLineLength/2,y:offsetY},{x:silkscreenXOffset+silkscreenLineLength/2,y:offsetY}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPathBottom={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_bottom",route:[{x:silkscreenXOffset-silkscreenLineLength/2,y:-offsetY},{x:silkscreenXOffset+silkscreenLineLength/2,y:-offsetY}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPathTop,silkscreenPathBottom,silkscreenRefText]},m2host_def=base_def.extend({fn:external_exports.string()}),m2host=raw_params=>{let parameters=m2host_def.parse(raw_params),pads=[],padWidth=.5-.15,padLength=1.5,pitch=.5,halfPitch=pitch/2,rowOffset=.5,numPads=75,startY=-((numPads-1)*pitch)/2;for(let i2=0;i2<numPads;i2++){let pn3=i2+1;if(pn3>=24&&pn3<=31)continue;let y5=startY-i2*halfPitch,isBottomLayer=pn3%2===0,padLengthWithOffset=padLength+(isBottomLayer?.25:0),x5=.5-padLengthWithOffset/2,pad2=rectpad(pn3,x5,y5,padLengthWithOffset,padWidth);pad2.layer=isBottomLayer?"bottom":"top",pads.push(pad2)}let cutoutWidth=46*.0254,cutoutDepth=137*.0254,cutoutOffsetFromPin1=261*.0254,cutout={type:"pcb_cutout",pcb_cutout_id:"",shape:"rect",center:{x:-cutoutDepth/2+padLength/2,y:startY-cutoutOffsetFromPin1},width:cutoutDepth,height:cutoutWidth},pin1MarkerPosition={x:-.5,y:startY},pin1Marker={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,updateBounds=(x5,y5,w4=0,h4=0)=>{minX=Math.min(minX,x5-w4/2),maxX=Math.max(maxX,x5+w4/2),minY=Math.min(minY,y5-h4/2),maxY=Math.max(maxY,y5+h4/2)};for(let pad2 of pads)updateBounds(pad2.x,pad2.y,pad2.width,pad2.height);updateBounds(cutout.center.x,cutout.center.y,cutout.width,cutout.height);for(let point6 of pin1Marker.route)updateBounds(point6.x,point6.y);let centerX=(minX+maxX)/2,centerY=(minY+maxY)/2,translate4=el3=>{typeof el3.x=="number"&&(el3.x-=centerX),typeof el3.y=="number"&&(el3.y-=centerY),el3.center&&(el3.center.x-=centerX,el3.center.y-=centerY),Array.isArray(el3.route)&&(el3.route=el3.route.map(p4=>({x:p4.x-centerX,y:p4.y-centerY})))};for(let pad2 of pads)translate4(pad2);return translate4(cutout),translate4(pin1Marker),{circuitJson:[...pads,cutout,pin1Marker],parameters}},to92l_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),inline:external_exports.boolean().default(!1),p:external_exports.string().default("1.27mm"),id:external_exports.string().default("0.75mm"),od:external_exports.string().default("1.3mm"),w:external_exports.string().default("4.8mm"),h:external_exports.string().default("4.0mm")}),to92l=raw_params=>{let parameters=to92l_def.parse(raw_params),p4=Number.parseFloat(parameters.p),w4=Number.parseFloat(parameters.w),h4=Number.parseFloat(parameters.h),od3=parameters.inline?1.05:Number.parseFloat(parameters.od),padH=parameters.inline?1.5:od3,holes=[platedHoleWithRectPad(1,0,0,parameters.id,od3,padH,0,0),parameters.inline?platedHolePill(2,p4,0,parameters.id,od3,padH):platedhole(2,p4,p4,parameters.id,od3),parameters.inline?platedHolePill(3,p4*2,0,parameters.id,od3,padH):platedhole(3,p4*2,0,parameters.id,od3)],radius=w4/2,cx2=parameters.inline?p4-.09:p4,cy2=.2,y_bottom=cy2+radius-h4,semicircle=Array.from({length:32},(_5,i2)=>{let angle=Math.PI*i2/31;return{x:cx2+radius*Math.cos(angle),y:cy2+radius*Math.sin(angle)}}),silkBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",stroke_width:.12,route:[...semicircle,{x:cx2-radius,y:y_bottom},{x:cx2+radius,y:y_bottom},semicircle[0]]},silkscreenRefText=silkscreenRef(cx2,cy2+radius+1,.5);return{circuitJson:[...holes,silkBody,silkscreenRefText],parameters}};function isNotNull(value){return value!=null}var applyOrigin=(elements,origin)=>{if(!origin)return elements;let pads=elements.filter(el3=>el3.type==="pcb_smtpad"||el3.type==="pcb_plated_hole"||el3.type==="pcb_thtpad");if(pads.length===0)return elements;let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,updateBounds=(x5,y5,w4=0,h4=0)=>{let left=x5-w4/2,right=x5+w4/2,bottom=y5-h4/2,top=y5+h4/2;minX=Math.min(minX,left),maxX=Math.max(maxX,right),minY=Math.min(minY,bottom),maxY=Math.max(maxY,top)};for(let pad2 of pads)if(pad2.type==="pcb_smtpad"){let w4=pad2.shape==="circle"?pad2.radius*2:pad2.width,h4=pad2.shape==="circle"?pad2.radius*2:pad2.height;updateBounds(pad2.x,pad2.y,w4,h4)}else if(pad2.type==="pcb_plated_hole"){let d3=pad2.outer_diameter??pad2.hole_diameter;updateBounds(pad2.x,pad2.y,d3,d3)}else if(pad2.type==="pcb_thtpad"){let d3=pad2.diameter;updateBounds(pad2.x,pad2.y,d3,d3)}let dx2=0,dy2=0;switch(origin){case"center":dx2=(minX+maxX)/2,dy2=(minY+maxY)/2;break;case"bottomleft":dx2=minX,dy2=minY;break;case"bottomcenter":case"centerbottom":dx2=(minX+maxX)/2,dy2=minY;break;case"topcenter":case"centertop":dx2=(minX+maxX)/2,dy2=maxY;break;case"leftcenter":case"centerleft":dx2=minX,dy2=(minY+maxY)/2;break;case"rightcenter":case"centerright":dx2=maxX,dy2=(minY+maxY)/2;break;case"pin1":let pin1=pads.find(p4=>p4.port_hints?.[0]==="1")||pads[0];dx2=pin1.x,dy2=pin1.y;break}if(dx2===0&&dy2===0)return elements;for(let el3 of elements){if(typeof el3.x=="number"&&(el3.x-=dx2),typeof el3.y=="number"&&(el3.y-=dy2),el3.center&&typeof el3.center.x=="number"&&(el3.center.x-=dx2,el3.center.y-=dy2),el3.type==="pcb_silkscreen_path")for(let pt4 of el3.route)pt4.x-=dx2,pt4.y-=dy2;el3.type==="pcb_silkscreen_text"&&el3.anchor_position&&(el3.anchor_position.x-=dx2,el3.anchor_position.y-=dy2)}return elements},applyNoRefDes=(elements,parameters)=>{let refs=elements.filter(el3=>el3.type==="pcb_silkscreen_text");if(refs.length===0)return elements;for(let ref of refs)parameters.norefdes&&(ref.text="");return elements},applyNoSilkscreen=(elements,parameters)=>parameters.nosilkscreen?elements.filter(element=>element.type!=="pcb_silkscreen_path"&&element.type!=="pcb_silkscreen_text"):elements,string2=def=>{let fp2=footprinter(),def_parts=def.replace(/^((?:\d{4}|\d{5}))(?=$|_)/,"res$1").split(/_(?!metric)/).map(s2=>{let m3=s2.match(/([a-zA-Z]+)([\(\d\.\+\?].*)?/);if(!m3)return null;let[,rawFn,v5]=m3;if(!rawFn)return null;let fn3=rawFn.toLowerCase();return v5?.includes("?")?null:{fn:fn3,v:v5}}).filter(isNotNull);for(let{fn:fn3,v:v5}of def_parts)fp2=fp2[fn3](v5);return fp2.setString(def),fp2},getFootprintNames=()=>Object.keys(fn_exports);var footprinter=()=>{let proxy2=new Proxy({},{get:(target,prop)=>{if(prop==="soup"||prop==="circuitJson"){if("fn"in target&&fn_exports[target.fn])return()=>{let{circuitJson}=fn_exports[target.fn](target),circuitWithoutSilkscreen=applyNoSilkscreen(circuitJson,target),circuitWithoutRefDes=applyNoRefDes(circuitWithoutSilkscreen,target);return applyOrigin(circuitWithoutRefDes,target.origin)};if(!fn_exports[target.fn])throw new Error(`Invalid footprint function, got "${target.fn}"${target.string?`, from string "${target.string}"`:""}`);return()=>{throw new Error(`No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got "${prop}"`)}}if(prop==="json"){if(!fn_exports[target.fn])throw new Error(`Invalid footprint function, got "${target.fn}"${target.string?`, from string "${target.string}"`:""}`);return()=>fn_exports[target.fn](target).parameters}return prop==="getFootprintNames"?()=>Object.keys(fn_exports):prop==="params"?()=>target:prop==="setString"?v5=>(target.string=v5,proxy2):v5=>(Object.keys(target).length===0?`${prop}${v5}`in fn_exports?(target[`${prop}${v5}`]=!0,target.fn=`${prop}${v5}`):(target[prop]=!0,target.fn=prop,prop==="res"||prop==="cap"?v5&&(typeof v5=="string"&&v5.includes("_metric")?target.metric=v5.split("_metric")[0]:target.imperial=v5):target.num_pins=Number.isNaN(Number.parseFloat(v5))?void 0:Number.parseFloat(v5)):!v5&&["w","h","p"].includes(prop)||(target[prop]=v5??!0),proxy2)}});return proxy2};footprinter.string=string2;footprinter.getFootprintNames=getFootprintNames;var fp=footprinter;var dist_exports2={};__export(dist_exports2,{areBoundsCompletelyInsidePolygon:()=>areBoundsCompletelyInsidePolygon,areBoundsOverlappingPolygon:()=>areBoundsOverlappingPolygon,boundsAreaOverlap:()=>boundsAreaOverlap,boundsDistance:()=>boundsDistance,boundsIntersection:()=>boundsIntersection,clamp:()=>clamp,computeDistanceBetweenBoxes:()=>computeDistanceBetweenBoxes,computeGapBetweenBoxes:()=>computeGapBetweenBoxes,computeManhattanDistanceBetweenBoxes:()=>computeManhattanDistanceBetweenBoxes,distSq:()=>distSq,distance:()=>distance2,doBoundsOverlap:()=>doBoundsOverlap,doSegmentsIntersect:()=>doSegmentsIntersect,doesLineIntersectLine:()=>doesLineIntersectLine,doesSegmentIntersectRect:()=>doesSegmentIntersectRect,findNearestPointsBetweenBoxSets:()=>findNearestPointsBetweenBoxSets,getBoundingBox:()=>getBoundingBox,getBoundsFromPoints:()=>getBoundsFromPoints,getSegmentIntersection:()=>getSegmentIntersection,getUnitVectorFromDirection:()=>getUnitVectorFromDirection,getUnitVectorFromPointAToB:()=>getUnitVectorFromPointAToB,grid:()=>grid,isPointInsidePolygon:()=>isPointInsidePolygon,isRectCompletelyInsidePolygon:()=>isRectCompletelyInsidePolygon,isRectOverlappingPolygon:()=>isRectOverlappingPolygon,midpoint:()=>midpoint,normalizeDegrees:()=>normalizeDegrees,onSegment:()=>onSegment,orientation:()=>orientation,pointToBoundsDistance:()=>pointToBoundsDistance,pointToBoxDistance:()=>pointToBoxDistance,pointToSegmentClosestPoint:()=>pointToSegmentClosestPoint,pointToSegmentDistance:()=>pointToSegmentDistance,range:()=>range,segmentToBoundsMinDistance:()=>segmentToBoundsMinDistance,segmentToBoxMinDistance:()=>segmentToBoxMinDistance,segmentToCircleMinDistance:()=>segmentToCircleMinDistance,segmentToSegmentMinDistance:()=>segmentToSegmentMinDistance});function getBoundingBox(box2){let halfWidth=box2.width/2,halfHeight=box2.height/2;return{minX:box2.center.x-halfWidth,maxX:box2.center.x+halfWidth,minY:box2.center.y-halfHeight,maxY:box2.center.y+halfHeight}}function computeManhattanDistanceBetweenBoxes(boxA,boxB){let a2=getBoundingBox(boxA),b3=getBoundingBox(boxB),dx2=Math.max(a2.minX-b3.maxX,b3.minX-a2.maxX,0),dy2=Math.max(a2.minY-b3.maxY,b3.minY-a2.maxY,0),pointA={x:0,y:0},pointB={x:0,y:0};return dx2===0&&dy2===0?{distance:0,pointA:boxA.center,pointB:boxB.center}:(pointA.x=clamp(boxA.center.x,b3.minX,b3.maxX),pointA.y=clamp(boxA.center.y,b3.minY,b3.maxY),pointB.x=clamp(boxB.center.x,a2.minX,a2.maxX),pointB.y=clamp(boxB.center.y,a2.minY,a2.maxY),{distance:Math.hypot(pointA.x-pointB.x,pointA.y-pointB.y),pointA,pointB})}function computeDistanceBetweenBoxes(boxA,boxB){return computeManhattanDistanceBetweenBoxes(boxA,boxB)}function computeGapBetweenBoxes(boxA,boxB){let a2=getBoundingBox(boxA),b3=getBoundingBox(boxB),dx2=Math.max(a2.minX-b3.maxX,b3.minX-a2.maxX,0),dy2=Math.max(a2.minY-b3.maxY,b3.minY-a2.maxY,0);return Math.hypot(dx2,dy2)}function clamp(value,min,max){return Math.max(min,Math.min(max,value))}function findNearestPointsBetweenBoxSets(boxSetA,boxSetB){let minDistance=Number.POSITIVE_INFINITY,nearestPointA={x:0,y:0},nearestPointB={x:0,y:0};for(let boxA of boxSetA)for(let boxB of boxSetB){let{distance:distance8,pointA,pointB}=computeManhattanDistanceBetweenBoxes(boxA,boxB);distance8<minDistance&&(minDistance=distance8,nearestPointA=pointA,nearestPointB=pointB)}return{pointA:nearestPointA,pointB:nearestPointB,distance:minDistance}}function doesLineIntersectLine([a12,a2],[b12,b22],{lineThickness=0}={}){return lineThickness===0?doSegmentsIntersect(a12,a2,b12,b22):segmentsDistance(a12,a2,b12,b22)<=lineThickness}function doSegmentsIntersect(p12,q12,p22,q22){let o12=orientation(p12,q12,p22),o22=orientation(p12,q12,q22),o3=orientation(p22,q22,p12),o4=orientation(p22,q22,q12);return!!(o12!==o22&&o3!==o4||o12===0&&onSegment(p12,p22,q12)||o22===0&&onSegment(p12,q22,q12)||o3===0&&onSegment(p22,p12,q22)||o4===0&&onSegment(p22,q12,q22))}function orientation(p4,q4,r4){let val=(q4.y-p4.y)*(r4.x-q4.x)-(q4.x-p4.x)*(r4.y-q4.y);return val===0?0:val>0?1:2}function onSegment(p4,q4,r4){return q4.x<=Math.max(p4.x,r4.x)&&q4.x>=Math.min(p4.x,r4.x)&&q4.y<=Math.max(p4.y,r4.y)&&q4.y>=Math.min(p4.y,r4.y)}function segmentsDistance(a12,a2,b12,b22){if(a12.x===a2.x&&a12.y===a2.y)return pointToSegmentDistance(a12,b12,b22);if(b12.x===b22.x&&b12.y===b22.y)return pointToSegmentDistance(b12,a12,a2);if(doSegmentsIntersect(a12,a2,b12,b22))return 0;let distances=[pointToSegmentDistance(a12,b12,b22),pointToSegmentDistance(a2,b12,b22),pointToSegmentDistance(b12,a12,a2),pointToSegmentDistance(b22,a12,a2)];return Math.min(...distances)}function pointToSegmentDistance(p4,v5,w4){let l22=(w4.x-v5.x)**2+(w4.y-v5.y)**2;if(l22===0)return distance2(p4,v5);let t21=((p4.x-v5.x)*(w4.x-v5.x)+(p4.y-v5.y)*(w4.y-v5.y))/l22;t21=Math.max(0,Math.min(1,t21));let projection={x:v5.x+t21*(w4.x-v5.x),y:v5.y+t21*(w4.y-v5.y)};return distance2(p4,projection)}function distance2(p12,p22){let dx2=p12.x-p22.x,dy2=p12.y-p22.y;return Math.sqrt(dx2*dx2+dy2*dy2)}function getSegmentIntersection(a2,b3,u4,v5){let dx1=b3.x-a2.x,dy1=b3.y-a2.y,dx2=v5.x-u4.x,dy2=v5.y-u4.y,dx3=a2.x-u4.x,dy3=a2.y-u4.y,denominator=dx1*dy2-dy1*dx2;if(Math.abs(denominator)<1e-10)return null;let t21=(dy3*dx2-dx3*dy2)/denominator,s2=(dx1*dy3-dy1*dx3)/denominator,epsilon=1e-9;if(t21>=-epsilon&&t21<=1+epsilon&&s2>=-epsilon&&s2<=1+epsilon){let intersectionX=a2.x+t21*dx1,intersectionY=a2.y+t21*dy1;return{x:intersectionX,y:intersectionY}}return null}function doesSegmentIntersectRect(a2,b3,rect){let pointInside=p4=>p4.x>=rect.minX&&p4.x<=rect.maxX&&p4.y>=rect.minY&&p4.y<=rect.maxY;if(pointInside(a2)||pointInside(b3))return!0;let topLeft={x:rect.minX,y:rect.minY},topRight={x:rect.maxX,y:rect.minY},bottomLeft={x:rect.minX,y:rect.maxY},bottomRight={x:rect.maxX,y:rect.maxY};return doSegmentsIntersect(a2,b3,topLeft,topRight)||doSegmentsIntersect(a2,b3,topRight,bottomRight)||doSegmentsIntersect(a2,b3,bottomRight,bottomLeft)||doSegmentsIntersect(a2,b3,bottomLeft,topLeft)}function segmentToSegmentMinDistance(a2,b3,u4,v5){if(a2.x===b3.x&&a2.y===b3.y)return pointToSegmentDistance(a2,u4,v5);if(u4.x===v5.x&&u4.y===v5.y)return pointToSegmentDistance(u4,a2,b3);if(doSegmentsIntersect(a2,b3,u4,v5))return 0;let distances=[pointToSegmentDistance(a2,u4,v5),pointToSegmentDistance(b3,u4,v5),pointToSegmentDistance(u4,a2,b3),pointToSegmentDistance(v5,a2,b3)];return Math.min(...distances)}function segmentToBoundsMinDistance(a2,b3,bounds){let topLeft={x:bounds.minX,y:bounds.minY},topRight={x:bounds.maxX,y:bounds.minY},bottomLeft={x:bounds.minX,y:bounds.maxY},bottomRight={x:bounds.maxX,y:bounds.maxY};if(doSegmentsIntersect(a2,b3,topLeft,topRight)||doSegmentsIntersect(a2,b3,topRight,bottomRight)||doSegmentsIntersect(a2,b3,bottomRight,bottomLeft)||doSegmentsIntersect(a2,b3,bottomLeft,topLeft)||a2.x>=bounds.minX&&a2.x<=bounds.maxX&&a2.y>=bounds.minY&&a2.y<=bounds.maxY&&b3.x>=bounds.minX&&b3.x<=bounds.maxX&&b3.y>=bounds.minY&&b3.y<=bounds.maxY)return 0;let distances=[pointToSegmentDistance(topLeft,a2,b3),pointToSegmentDistance(topRight,a2,b3),pointToSegmentDistance(bottomLeft,a2,b3),pointToSegmentDistance(bottomRight,a2,b3)];if(a2.x>=bounds.minX&&a2.x<=bounds.maxX&&a2.y>=bounds.minY&&a2.y<=bounds.maxY||b3.x>=bounds.minX&&b3.x<=bounds.maxX&&b3.y>=bounds.minY&&b3.y<=bounds.maxY)return 0;if(a2.x<bounds.minX||a2.x>bounds.maxX||a2.y<bounds.minY||a2.y>bounds.maxY){let closestX=clamp(a2.x,bounds.minX,bounds.maxX),closestY=clamp(a2.y,bounds.minY,bounds.maxY);distances.push(distance2(a2,{x:closestX,y:closestY}))}if(b3.x<bounds.minX||b3.x>bounds.maxX||b3.y<bounds.minY||b3.y>bounds.maxY){let closestX=clamp(b3.x,bounds.minX,bounds.maxX),closestY=clamp(b3.y,bounds.minY,bounds.maxY);distances.push(distance2(b3,{x:closestX,y:closestY}))}return Math.min(...distances)}function segmentToBoxMinDistance(a2,b3,box2){let halfWidth=box2.width/2,halfHeight=box2.height/2,bounds={minX:box2.center.x-halfWidth,maxX:box2.center.x+halfWidth,minY:box2.center.y-halfHeight,maxY:box2.center.y+halfHeight};return segmentToBoundsMinDistance(a2,b3,bounds)}function segmentToCircleMinDistance(a2,b3,circle2){let circleCenter={x:circle2.x,y:circle2.y};if(a2.x===b3.x&&a2.y===b3.y)return Math.max(0,distance2(a2,circleCenter)-circle2.radius);let ab={x:b3.x-a2.x,y:b3.y-a2.y},ac3={x:circleCenter.x-a2.x,y:circleCenter.y-a2.y},abLengthSq=ab.x*ab.x+ab.y*ab.y,t21=Math.max(0,Math.min(1,(ab.x*ac3.x+ab.y*ac3.y)/abLengthSq)),closestPoint={x:a2.x+t21*ab.x,y:a2.y+t21*ab.y},distToCenter=distance2(closestPoint,circleCenter);return Math.max(0,distToCenter-circle2.radius)}function pointToSegmentClosestPoint(p4,a2,b3){let dx_ab=b3.x-a2.x,dy_ab=b3.y-a2.y,l22=dx_ab*dx_ab+dy_ab*dy_ab;if(l22===0)return{x:a2.x,y:a2.y};let t21=((p4.x-a2.x)*dx_ab+(p4.y-a2.y)*dy_ab)/l22;return t21=Math.max(0,Math.min(1,t21)),{x:a2.x+t21*dx_ab,y:a2.y+t21*dy_ab}}function normalizeDegrees(angle){return(angle%360+360)%360}function pointToBoxDistance(p4,box2){let halfWidth=box2.width/2,halfHeight=box2.height/2,minX=box2.center.x-halfWidth,maxX=box2.center.x+halfWidth,minY=box2.center.y-halfHeight,maxY=box2.center.y+halfHeight;if(p4.x>=minX&&p4.x<=maxX&&p4.y>=minY&&p4.y<=maxY)return 0;let closestX=clamp(p4.x,minX,maxX),closestY=clamp(p4.y,minY,maxY);return distance2(p4,{x:closestX,y:closestY})}function pointToBoundsDistance(p4,bounds){if(p4.x>=bounds.minX&&p4.x<=bounds.maxX&&p4.y>=bounds.minY&&p4.y<=bounds.maxY)return 0;let closestX=clamp(p4.x,bounds.minX,bounds.maxX),closestY=clamp(p4.y,bounds.minY,bounds.maxY);return distance2(p4,{x:closestX,y:closestY})}function midpoint(p12,p22){return{x:(p12.x+p22.x)/2,y:(p12.y+p22.y)/2}}function distSq(p12,p22){let dx2=p12.x-p22.x,dy2=p12.y-p22.y;return dx2*dx2+dy2*dy2}var universalRectToBounds=rect=>{if("minX"in rect)return rect;let halfWidth=rect.width/2,halfHeight=rect.height/2;return{minX:rect.center.x-halfWidth,minY:rect.center.y-halfHeight,maxX:rect.center.x+halfWidth,maxY:rect.center.y+halfHeight}},getBoundsCorners=bounds=>[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}],getPolygonEdges=polygon2=>{let edges=[];for(let i2=0;i2<polygon2.length;i2++){let start=polygon2[i2],end=polygon2[(i2+1)%polygon2.length];edges.push([start,end])}return edges},isPointOnSegment=(point6,start,end)=>{let cross3=(point6.y-start.y)*(end.x-start.x)-(point6.x-start.x)*(end.y-start.y);if(Math.abs(cross3)>1e-9)return!1;let dot=(point6.x-start.x)*(end.x-start.x)+(point6.y-start.y)*(end.y-start.y);if(dot<0)return!1;let squaredLength=(end.x-start.x)**2+(end.y-start.y)**2;return!(dot>squaredLength)},isPointInsideBounds=(point6,bounds)=>point6.x>=bounds.minX&&point6.x<=bounds.maxX&&point6.y>=bounds.minY&&point6.y<=bounds.maxY,isPointInsidePolygon=(point6,polygon2)=>{if(polygon2.length<3)return!1;let edges=getPolygonEdges(polygon2);for(let[start,end]of edges)if(isPointOnSegment(point6,start,end))return!0;let inside2=!1;for(let i2=0,j4=polygon2.length-1;i2<polygon2.length;j4=i2++){let xi3=polygon2[i2].x,yi3=polygon2[i2].y,xj=polygon2[j4].x,yj=polygon2[j4].y;yi3>point6.y!=yj>point6.y&&point6.x<(xj-xi3)*(point6.y-yi3)/(yj-yi3)+xi3&&(inside2=!inside2)}return inside2},doesPolygonIntersectBounds=(bounds,polygon2)=>{let boundsCorners=getBoundsCorners(bounds),boundsEdges=[[boundsCorners[0],boundsCorners[1]],[boundsCorners[1],boundsCorners[2]],[boundsCorners[2],boundsCorners[3]],[boundsCorners[3],boundsCorners[0]]],polygonEdges=getPolygonEdges(polygon2);for(let[start,end]of polygonEdges)for(let[rectStart,rectEnd]of boundsEdges)if(doSegmentsIntersect(start,end,rectStart,rectEnd))return!0;return!1},areBoundsOverlappingPolygon=(bounds,polygon2)=>polygon2.length<3?!1:polygon2.some(point6=>isPointInsideBounds(point6,bounds))||getBoundsCorners(bounds).some(corner=>isPointInsidePolygon(corner,polygon2))?!0:doesPolygonIntersectBounds(bounds,polygon2),areBoundsCompletelyInsidePolygon=(bounds,polygon2)=>polygon2.length<3||!getBoundsCorners(bounds).every(corner=>isPointInsidePolygon(corner,polygon2))?!1:!doesPolygonIntersectBounds(bounds,polygon2),isRectOverlappingPolygon=(rect,polygon2)=>areBoundsOverlappingPolygon(universalRectToBounds(rect),polygon2),isRectCompletelyInsidePolygon=(rect,polygon2)=>areBoundsCompletelyInsidePolygon(universalRectToBounds(rect),polygon2);function range(start,end,step=1){if(step===0)throw new Error("step cannot be 0");let _start,_end;end===void 0?(_start=0,_end=start):(_start=start,_end=end);let result=[];if(step>0)for(let i2=_start;i2<_end;i2+=step)result.push(i2);else for(let i2=_start;i2>_end;i2+=step)result.push(i2);return result}var boundsAreaOverlap=(bounds1,bounds2)=>{let overlapX=Math.max(0,Math.min(bounds1.maxX,bounds2.maxX)-Math.max(bounds1.minX,bounds2.minX)),overlapY=Math.max(0,Math.min(bounds1.maxY,bounds2.maxY)-Math.max(bounds1.minY,bounds2.minY));return overlapX*overlapY};var boundsDistance=(bounds1,bounds2)=>{let dx2=bounds1.maxX<bounds2.minX?bounds2.minX-bounds1.maxX:bounds2.maxX<bounds1.minX?bounds1.minX-bounds2.maxX:0,dy2=bounds1.maxY<bounds2.minY?bounds2.minY-bounds1.maxY:bounds2.maxY<bounds1.minY?bounds1.minY-bounds2.maxY:0;return Math.sqrt(dx2*dx2+dy2*dy2)};var boundsIntersection=(bounds1,bounds2)=>{let minX=Math.max(bounds1.minX,bounds2.minX),minY=Math.max(bounds1.minY,bounds2.minY),maxX=Math.min(bounds1.maxX,bounds2.maxX),maxY=Math.min(bounds1.maxY,bounds2.maxY);return minX>maxX||minY>maxY?null:{minX,minY,maxX,maxY}};var doBoundsOverlap=(bounds1,bounds2)=>!(bounds1.maxX<bounds2.minX||bounds2.maxX<bounds1.minX||bounds1.maxY<bounds2.minY||bounds2.maxY<bounds1.minY);var getBoundsFromPoints=points=>{if(points.length===0)return null;let minX=points[0].x,minY=points[0].y,maxX=points[0].x,maxY=points[0].y;for(let i2=1;i2<points.length;i2++){let point6=points[i2];point6.x<minX&&(minX=point6.x),point6.y<minY&&(minY=point6.y),point6.x>maxX&&(maxX=point6.x),point6.y>maxY&&(maxY=point6.y)}return{minX,minY,maxX,maxY}};var getUnitVectorFromPointAToB=(a2,b3)=>{let delta={x:b3.x-a2.x,y:b3.y-a2.y},magnitude=Math.sqrt(delta.x**2+delta.y**2);return{x:delta.x/magnitude,y:delta.y/magnitude}},getUnitVectorFromDirection=direction2=>{switch(direction2){case"up":return{x:0,y:1};case"down":return{x:0,y:-1};case"left":return{x:-1,y:0};case"right":return{x:1,y:0}}};function grid({rows,cols,xSpacing,ySpacing,width,height,offsetX=0,offsetY=0,yDirection="cartesian",centered=!0}){let effectiveXSpacing=xSpacing??1,effectiveYSpacing=ySpacing??1,totalWidth=width??cols*effectiveXSpacing,totalHeight=height??rows*effectiveYSpacing,centeringOffsetX=centered?-totalWidth/2:0,centeringOffsetY=centered?-totalHeight/2:0,cellWidth=width?width/cols:effectiveXSpacing,cellHeight=height?height/rows:effectiveYSpacing,cells=[];for(let row=0;row<rows;row++)for(let col=0;col<cols;col++){let index=row*cols+col,centerX=offsetX+centeringOffsetX+col*cellWidth+cellWidth/2,rawCenterY=offsetY+row*cellHeight+cellHeight/2,centerY=yDirection==="cartesian"?offsetY+centeringOffsetY+(rows-1-row)*cellHeight+cellHeight/2:offsetY+centeringOffsetY+row*cellHeight+cellHeight/2;cells.push({index,center:{x:centerX,y:centerY},topLeft:{x:centerX-cellWidth/2,y:centerY+cellHeight/2},bottomRight:{x:centerX+cellWidth/2,y:centerY-cellHeight/2},row,col})}return cells}init_dist();var import_debug6=__toESM(require_browser(),1);var import_debug=__toESM(require_browser(),1);init_dist();var import_debug2=__toESM(require_browser(),1),import_debug3=__toESM(require_browser(),1);init_dist();init_src();init_parsel();var su=(soup,options={})=>{let internalStore=soup._internal_store;if(!internalStore){internalStore={counts:{}},soup._internal_store=internalStore;for(let elm of soup){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop());Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}}return new Proxy({},{get:(proxy_target,component_type)=>component_type==="toArray"?()=>soup:{get:id2=>soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===id2),getUsing:using=>{let keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id",""),joiner=soup.find(e4=>e4.type===join_type&&e4[join_key]===using[join_key]);return joiner?soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return soup.find(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return soup.filter(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},insert:elm=>{var _a360;(_a360=internalStore.counts)[component_type]??(_a360[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};return options.validateInserts&&(dist_exports[component_type]??any_soup_element).parse(newElm),soup.push(newElm),newElm},delete:id2=>{let elm=soup.find(e4=>e4[`${component_type}_id`]===id2);elm&&soup.splice(soup.indexOf(elm),1)},update:(id2,newProps)=>{let elm=soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===id2);if(elm)return Object.assign(elm,newProps),elm},select:selector=>{if(component_type==="source_component")return soup.find(e4=>e4.type==="source_component"&&e4.name===selector.replace(/\./g,""));if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=soup.find(e4=>e4.type==="source_component"&&e4.name===component_name);if(!source_component)return null;let source_port2=soup.find(e4=>e4.type==="source_port"&&e4.source_component_id===source_component.source_component_id&&(e4.name===port_selector||(e4.port_hints??[]).includes(port_selector)));if(!source_port2)return null;if(component_type==="source_port")return source_port2;if(component_type==="pcb_port")return soup.find(e4=>e4.type==="pcb_port"&&e4.source_port_id===source_port2.source_port_id);if(component_type==="schematic_port")return soup.find(e4=>e4.type==="schematic_port"&&e4.source_port_id===source_port2.source_port_id)}}}})};su.unparsed=su;var su_default=su;var import_performance_now=__toESM(require_performance_now(),1);init_dist3();init_dist3();init_dist3();var urlAlphabet="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var nanoid=(size2=21)=>{let id2="",bytes=crypto.getRandomValues(new Uint8Array(size2|=0));for(;size2--;)id2+=urlAlphabet[bytes[size2]&63];return id2};init_dist3();var manDist=(a2,b3)=>Math.abs(a2.x-b3.x)+Math.abs(a2.y-b3.y),dirFromAToB=(a2,b3)=>{let dx2=b3.x-a2.x,dy2=b3.y-a2.y;return Math.abs(dx2)>Math.abs(dy2)?{dx:Math.sign(dx2),dy:0}:{dx:0,dy:Math.sign(dy2)}},distAlongDir=(A4,B5,dir)=>Math.abs(A4.x-B5.x)*Math.abs(dir.dx)+Math.abs(A4.y-B5.y)*Math.abs(dir.dy),nodeName=(node,GRID_STEP=.1)=>`${Math.round(node.x/GRID_STEP)},${Math.round(node.y/GRID_STEP)}`,isCloseTo=(a2,b3)=>Math.abs(a2-b3)<1e-4,getObstaclesFromRoute=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i2=0;i2<route.length-1;i2++){let[start,end]=[route[i2],route[i2+1]],prev=i2-1>=0?route[i2-1]:null,isHorz=isCloseTo(start.y,end.y),isVert=isCloseTo(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles},ObstacleList=class{constructor(obstacles){__publicField(this,"obstacles");__publicField(this,"GRID_STEP",.1);this.obstacles=obstacles.map(obstacle=>({...obstacle,left:obstacle.center.x-obstacle.width/2,right:obstacle.center.x+obstacle.width/2,top:obstacle.center.y+obstacle.height/2,bottom:obstacle.center.y-obstacle.height/2}))}getObstacleAt(x5,y5,m3){m3??(m3=this.GRID_STEP);for(let obstacle of this.obstacles){let halfWidth=obstacle.width/2+m3,halfHeight=obstacle.height/2+m3;if(x5>=obstacle.center.x-halfWidth&&x5<=obstacle.center.x+halfWidth&&y5>=obstacle.center.y-halfHeight&&y5<=obstacle.center.y+halfHeight)return obstacle}return null}isObstacleAt(x5,y5,m3){return this.getObstacleAt(x5,y5,m3)!==null}getDirectionDistancesToNearestObstacle(x5,y5){let{GRID_STEP}=this,result={left:1/0,top:1/0,bottom:1/0,right:1/0};for(let obstacle of this.obstacles)if(obstacle.type==="rect"){let left=obstacle.center.x-obstacle.width/2-GRID_STEP,right=obstacle.center.x+obstacle.width/2+GRID_STEP,top=obstacle.center.y+obstacle.height/2+GRID_STEP,bottom=obstacle.center.y-obstacle.height/2-GRID_STEP;y5>=bottom&&y5<=top&&x5>left&&(result.left=Math.min(result.left,x5-right)),y5>=bottom&&y5<=top&&x5<right&&(result.right=Math.min(result.right,left-x5)),x5>=left&&x5<=right&&y5<top&&(result.top=Math.min(result.top,bottom-y5)),x5>=left&&x5<=right&&y5>bottom&&(result.bottom=Math.min(result.bottom,y5-top))}return result}getOrthoDirectionCollisionInfo(point6,dir,{margin=0}={}){let{x:x5,y:y5}=point6,{dx:dx2,dy:dy2}=dir,minDistance=1/0,collisionObstacle=null;for(let obstacle of this.obstacles){let leftMargin=obstacle.left-margin,rightMargin=obstacle.right+margin,topMargin=obstacle.top+margin,bottomMargin=obstacle.bottom-margin,distance8=null;dx2===1&&dy2===0?y5>bottomMargin&&y5<topMargin&&x5<obstacle.left&&(distance8=obstacle.left-x5):dx2===-1&&dy2===0?y5>bottomMargin&&y5<topMargin&&x5>obstacle.right&&(distance8=x5-obstacle.right):dx2===0&&dy2===1?x5>leftMargin&&x5<rightMargin&&y5<obstacle.bottom&&(distance8=obstacle.bottom-y5):dx2===0&&dy2===-1&&x5>leftMargin&&x5<rightMargin&&y5>obstacle.top&&(distance8=y5-obstacle.top),distance8!==null&&distance8<minDistance&&(minDistance=distance8,collisionObstacle=obstacle)}return{dx:dx2,dy:dy2,wallDistance:minDistance,obstacle:collisionObstacle}}getObstaclesOverlappingRegion(region){let obstacles=[];for(let obstacle of this.obstacles){let{left,right,top,bottom}=obstacle;left<=region.maxX&&right>=region.minX&&top<=region.maxY&&bottom>=region.minY&&obstacles.push(obstacle)}return obstacles}};function removePathLoops(path){if(path.length<4)return path;let result=[{...path[0]}],currentLayer=path[0].layer;for(let i2=1;i2<path.length;i2++){let currentSegment={start:path[i2-1],end:path[i2]},isVia=path[i2].route_type==="via"||path[i2-1].route_type==="via";if(path[i2].layer!==currentLayer||isVia){result.push({...path[i2]}),currentLayer=path[i2].layer;continue}let intersectionFound=!1,intersectionPoint=null,intersectionIndex=-1;for(let j4=0;j4<result.length-1;j4++){let previousSegment={start:result[j4],end:result[j4+1]};if(previousSegment.start.layer===currentSegment.start.layer&&previousSegment.start.layer===currentSegment.start.layer){let intersection=findIntersection(previousSegment,currentSegment);if(intersection){intersectionFound=!0,intersectionPoint={...intersection,layer:currentLayer},intersectionIndex=j4;break}}}intersectionFound&&intersectionPoint&&(result.splice(intersectionIndex+1),result.push(intersectionPoint));let lastPoint=result[result.length-1];(lastPoint.x!==path[i2].x||lastPoint.y!==path[i2].y)&&result.push(path[i2])}return result}function findIntersection(segment1,segment2){if(segment1.start.x===segment1.end.x&&segment2.start.x===segment2.end.x||segment1.start.y===segment1.end.y&&segment2.start.y===segment2.end.y)return null;let intersectionPoint;if(segment1.start.x===segment1.end.x){let x5=segment1.start.x,y5=segment2.start.y;intersectionPoint={...segment1.start,x:x5,y:y5}}else{let x5=segment2.start.x,y5=segment1.start.y;intersectionPoint={...segment1.start,x:x5,y:y5}}return isPointInSegment(intersectionPoint,segment1)&&isPointInSegment(intersectionPoint,segment2)?intersectionPoint:null}function isPointInSegment(point6,segment2){return point6.x>=Math.min(segment2.start.x,segment2.end.x)&&point6.x<=Math.max(segment2.start.x,segment2.end.x)&&point6.y>=Math.min(segment2.start.y,segment2.end.y)&&point6.y<=Math.max(segment2.start.y,segment2.end.y)}function addViasWhenLayerChanges(route){let newRoute=[route[0]];for(let i2=1;i2<route.length-1;i2++){let[prev,current2,next2]=[route[i2-1],route[i2],route[i2+1]];newRoute.push(current2),!(current2.route_type!=="wire"||prev.route_type!=="wire"||next2.route_type!=="wire")&&prev.layer===current2.layer&¤t2.layer!==next2.layer&&newRoute.push({route_type:"via",from_layer:current2.layer,to_layer:next2.layer,x:current2.x,y:current2.y})}return newRoute.push(route[route.length-1]),newRoute}var debug=(0,import_debug2.default)("autorouter:shortenPathWithShortcuts");function shortenPathWithShortcuts(route,checkIfObstacleBetweenPoints){if(route.length<=2)return route;let shortened=[route[0]];for(let i2=1;i2<route.length;i2++){let currentSegment={start:shortened[shortened.length-1],end:route[i2]},skipToIndex=-1,currentSegmentIsVertical=currentSegment.start.x===currentSegment.end.x,currentSegmentIsHorizontal=currentSegment.start.y===currentSegment.end.y;for(let j4=i2+1;j4<route.length;j4++){if(j4<=skipToIndex)continue;let futureSegment={start:route[j4],end:route[j4+1]};if(!futureSegment.end)continue;let futureSegmentIsVertical=futureSegment.start.x===futureSegment.end.x,futureSegmentIsHorizontal=futureSegment.start.y===futureSegment.end.y,bothVertical=currentSegmentIsVertical&&futureSegmentIsVertical,bothHorizontal=currentSegmentIsHorizontal&&futureSegmentIsHorizontal;if(bothHorizontal&&bothVertical||!(bothVertical||bothHorizontal))continue;let overlapping=!1,currentMinX=Math.min(currentSegment.start.x,currentSegment.end.x),currentMaxX=Math.max(currentSegment.start.x,currentSegment.end.x),futureMinX=Math.min(futureSegment.start.x,futureSegment.end.x),futureMaxX=Math.max(futureSegment.start.x,futureSegment.end.x),currentMinY=Math.min(currentSegment.start.y,currentSegment.end.y),currentMaxY=Math.max(currentSegment.start.y,currentSegment.end.y),futureMinY=Math.min(futureSegment.start.y,futureSegment.end.y),futureMaxY=Math.max(futureSegment.start.y,futureSegment.end.y);if(bothHorizontal?overlapping=currentMinX<=futureMaxX&¤tMaxX>=futureMinX:bothVertical&&(overlapping=currentMinY<=futureMaxY&¤tMaxY>=futureMinY),!overlapping)continue;let candidateShortcuts=[],pointBeforeShortcut=shortened[shortened.length-1],pointAfterShortcut=route[j4+2];if(!pointAfterShortcut)continue;bothHorizontal&&futureMinX<currentMaxX&&pointAfterShortcut.x===futureMinX&&candidateShortcuts.push({x:futureMinX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothHorizontal&&futureMaxX>currentMinX&&pointAfterShortcut.x===futureMaxX&&candidateShortcuts.push({x:futureMaxX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothVertical&&futureMinY<currentMaxY&&pointAfterShortcut.y===futureMinY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMinY,layer:currentSegment.start.layer}),bothVertical&&futureMaxY>currentMinY&&pointAfterShortcut.y===futureMaxY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMaxY,layer:currentSegment.start.layer});let shortcutPoint=null;for(let candidateShortcut of candidateShortcuts)if(!(checkIfObstacleBetweenPoints(pointBeforeShortcut,candidateShortcut)||checkIfObstacleBetweenPoints(pointAfterShortcut,candidateShortcut))){shortcutPoint=candidateShortcut;break}if(shortcutPoint){shortened.push(shortcutPoint),i2=j4+1,skipToIndex=j4+1;break}}skipToIndex===-1&&shortened.push(route[i2])}return shortened[shortened.length-1]!==route[route.length-1]&&shortened.push(route[route.length-1]),shortened}var debug2=(0,import_debug.default)("autorouting-dataset:astar"),GeneralizedAstarAutorouter=class{constructor(opts){__publicField(this,"openSet",[]);__publicField(this,"closedSet",new Set);__publicField(this,"debug",!1);__publicField(this,"debugSolutions");__publicField(this,"debugMessage",null);__publicField(this,"debugTraceCount",0);__publicField(this,"input");__publicField(this,"obstacles");__publicField(this,"allObstacles");__publicField(this,"startNode");__publicField(this,"goalPoint");__publicField(this,"GRID_STEP");__publicField(this,"OBSTACLE_MARGIN");__publicField(this,"MAX_ITERATIONS");__publicField(this,"isRemovePathLoopsEnabled");__publicField(this,"isShortenPathWithShortcutsEnabled");__publicField(this,"GREEDY_MULTIPLIER",1.1);__publicField(this,"iterations",-1);this.input=opts.input,this.allObstacles=opts.input.obstacles,this.startNode=opts.startNode,this.goalPoint=opts.goalPoint?{l:0,...opts.goalPoint}:void 0,this.GRID_STEP=opts.GRID_STEP??.1,this.OBSTACLE_MARGIN=opts.OBSTACLE_MARGIN??.15,this.MAX_ITERATIONS=opts.MAX_ITERATIONS??100,this.debug=opts.debug??debug2.enabled,this.isRemovePathLoopsEnabled=opts.isRemovePathLoopsEnabled??!1,this.isShortenPathWithShortcutsEnabled=opts.isShortenPathWithShortcutsEnabled??!1,this.debug&&(debug2.enabled=!0),debug2.enabled&&(this.debugSolutions={},this.debugMessage="")}getNeighbors(node){return[]}isSameNode(a2,b3){return manDist(a2,b3)<this.GRID_STEP}computeG(current2,neighbor){return current2.g+manDist(current2,neighbor)}computeH(node){return manDist(node,this.goalPoint)}getNodeName(node){return nodeName(node,this.GRID_STEP)}solveOneStep(){this.iterations+=1;let{openSet,closedSet,GRID_STEP,goalPoint}=this;openSet.sort((a2,b3)=>a2.f-b3.f);let current2=openSet.shift();if(this.computeH(current2)<=GRID_STEP*2)return{solved:!0,current:current2,newNeighbors:[]};this.closedSet.add(this.getNodeName(current2));let newNeighbors=[];for(let neighbor of this.getNeighbors(current2)){if(closedSet.has(this.getNodeName(neighbor)))continue;let tentativeG=this.computeG(current2,neighbor),existingNeighbor=this.openSet.find(n3=>this.isSameNode(n3,neighbor));if(!existingNeighbor||tentativeG<existingNeighbor.g){let h4=this.computeH(neighbor),f2=tentativeG+h4*this.GREEDY_MULTIPLIER,neighborNode={...neighbor,g:tentativeG,h:h4,f:f2,obstacleHit:neighbor.obstacleHit??void 0,manDistFromParent:manDist(current2,neighbor),nodesInPath:current2.nodesInPath+1,parent:current2,enterMarginCost:neighbor.enterMarginCost,travelMarginCostFactor:neighbor.travelMarginCostFactor};openSet.push(neighborNode),newNeighbors.push(neighborNode)}}return debug2.enabled&&(openSet.sort((a2,b3)=>a2.f-b3.f),this.drawDebugSolution({current:current2,newNeighbors})),{solved:!1,current:current2,newNeighbors}}getStartNode(connection){return{x:connection.pointsToConnect[0].x,y:connection.pointsToConnect[0].y,manDistFromParent:0,f:0,g:0,h:0,nodesInPath:0,parent:null}}layerToIndex(layer){return 0}indexToLayer(index){return"top"}preprocessConnectionBeforeSolving(connection){return connection}solveConnection(connection){if(connection.pointsToConnect.length>2)throw new Error("GeneralizedAstarAutorouter doesn't currently support 2+ points in a connection");connection=this.preprocessConnectionBeforeSolving(connection);let{pointsToConnect}=connection;for(this.iterations=0,this.closedSet=new Set,this.startNode=this.getStartNode(connection),this.goalPoint={...pointsToConnect[pointsToConnect.length-1],l:this.layerToIndex(pointsToConnect[pointsToConnect.length-1].layer)},this.openSet=[this.startNode];this.iterations<this.MAX_ITERATIONS;){let{solved,current:current2}=this.solveOneStep();if(solved){let route=[],node=current2;for(;node;){let l3=node.l;route.unshift({x:node.x,y:node.y,layer:l3!==void 0?this.indexToLayer(l3):pointsToConnect[0].layer}),node=node.parent}return debug2.enabled&&(this.debugMessage+=`t${this.debugTraceCount}: ${this.iterations} iterations
|
|
349
|
+
`,CR="\r",LinesAndColumns2=(function(){function LinesAndColumns3(string){this.string=string;for(var offsets=[0],offset=0;offset<string.length;)switch(string[offset]){case LF:offset+=LF.length,offsets.push(offset);break;case CR:offset+=CR.length,string[offset]===LF&&(offset+=LF.length),offsets.push(offset);break;default:offset++;break}this.offsets=offsets}return LinesAndColumns3.prototype.locationForIndex=function(index){if(index<0||index>this.string.length)return null;for(var line2=0,offsets=this.offsets;offsets[line2+1]<=index;)line2++;var column=index-offsets[line2];return{line:line2,column}},LinesAndColumns3.prototype.indexForLocation=function(location){var line2=location.line,column=location.column;return line2<0||line2>=this.offsets.length||column<0||column>this.lengthOfLine(line2)?null:this.offsets[line2]+column},LinesAndColumns3.prototype.lengthOfLine=function(line2){var offset=this.offsets[line2],nextOffset=line2===this.offsets.length-1?this.string.length:this.offsets[line2+1];return nextOffset-offset},LinesAndColumns3})();exports.LinesAndColumns=LinesAndColumns2;exports.default=LinesAndColumns2}});var proxyMarker=Symbol("Comlink.proxy"),createEndpoint=Symbol("Comlink.endpoint"),releaseProxy=Symbol("Comlink.releaseProxy"),finalizer=Symbol("Comlink.finalizer"),throwMarker=Symbol("Comlink.thrown"),isObject=val=>typeof val=="object"&&val!==null||typeof val=="function",proxyTransferHandler={canHandle:val=>isObject(val)&&val[proxyMarker],serialize(obj){let{port1,port2}=new MessageChannel;return expose(obj,port1),[port2,[port2]]},deserialize(port){return port.start(),wrap(port)}},throwTransferHandler={canHandle:value=>isObject(value)&&throwMarker in value,serialize({value}){let serialized;return value instanceof Error?serialized={isError:!0,value:{message:value.message,name:value.name,stack:value.stack}}:serialized={isError:!1,value},[serialized,[]]},deserialize(serialized){throw serialized.isError?Object.assign(new Error(serialized.value.message),serialized.value):serialized.value}},transferHandlers=new Map([["proxy",proxyTransferHandler],["throw",throwTransferHandler]]);function isAllowedOrigin(allowedOrigins,origin){for(let allowedOrigin of allowedOrigins)if(origin===allowedOrigin||allowedOrigin==="*"||allowedOrigin instanceof RegExp&&allowedOrigin.test(origin))return!0;return!1}function expose(obj,ep2=globalThis,allowedOrigins=["*"]){ep2.addEventListener("message",function callback(ev){if(!ev||!ev.data)return;if(!isAllowedOrigin(allowedOrigins,ev.origin)){console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);return}let{id:id2,type,path}=Object.assign({path:[]},ev.data),argumentList=(ev.data.argumentList||[]).map(fromWireValue),returnValue;try{let parent=path.slice(0,-1).reduce((obj2,prop)=>obj2[prop],obj),rawValue=path.reduce((obj2,prop)=>obj2[prop],obj);switch(type){case"GET":returnValue=rawValue;break;case"SET":parent[path.slice(-1)[0]]=fromWireValue(ev.data.value),returnValue=!0;break;case"APPLY":returnValue=rawValue.apply(parent,argumentList);break;case"CONSTRUCT":{let value=new rawValue(...argumentList);returnValue=proxy(value)}break;case"ENDPOINT":{let{port1,port2}=new MessageChannel;expose(obj,port2),returnValue=transfer(port1,[port1])}break;case"RELEASE":returnValue=void 0;break;default:return}}catch(value){returnValue={value,[throwMarker]:0}}Promise.resolve(returnValue).catch(value=>({value,[throwMarker]:0})).then(returnValue2=>{let[wireValue,transferables]=toWireValue(returnValue2);ep2.postMessage(Object.assign(Object.assign({},wireValue),{id:id2}),transferables),type==="RELEASE"&&(ep2.removeEventListener("message",callback),closeEndPoint(ep2),finalizer in obj&&typeof obj[finalizer]=="function"&&obj[finalizer]())}).catch(error=>{let[wireValue,transferables]=toWireValue({value:new TypeError("Unserializable return value"),[throwMarker]:0});ep2.postMessage(Object.assign(Object.assign({},wireValue),{id:id2}),transferables)})}),ep2.start&&ep2.start()}function isMessagePort(endpoint){return endpoint.constructor.name==="MessagePort"}function closeEndPoint(endpoint){isMessagePort(endpoint)&&endpoint.close()}function wrap(ep2,target){let pendingListeners=new Map;return ep2.addEventListener("message",function(ev){let{data}=ev;if(!data||!data.id)return;let resolver=pendingListeners.get(data.id);if(resolver)try{resolver(data)}finally{pendingListeners.delete(data.id)}}),createProxy(ep2,pendingListeners,[],target)}function throwIfProxyReleased(isReleased){if(isReleased)throw new Error("Proxy has been released and is not useable")}function releaseEndpoint(ep2){return requestResponseMessage(ep2,new Map,{type:"RELEASE"}).then(()=>{closeEndPoint(ep2)})}var proxyCounter=new WeakMap,proxyFinalizers="FinalizationRegistry"in globalThis&&new FinalizationRegistry(ep2=>{let newCount=(proxyCounter.get(ep2)||0)-1;proxyCounter.set(ep2,newCount),newCount===0&&releaseEndpoint(ep2)});function registerProxy(proxy2,ep2){let newCount=(proxyCounter.get(ep2)||0)+1;proxyCounter.set(ep2,newCount),proxyFinalizers&&proxyFinalizers.register(proxy2,ep2,proxy2)}function unregisterProxy(proxy2){proxyFinalizers&&proxyFinalizers.unregister(proxy2)}function createProxy(ep2,pendingListeners,path=[],target=function(){}){let isProxyReleased=!1,proxy2=new Proxy(target,{get(_target,prop){if(throwIfProxyReleased(isProxyReleased),prop===releaseProxy)return()=>{unregisterProxy(proxy2),releaseEndpoint(ep2),pendingListeners.clear(),isProxyReleased=!0};if(prop==="then"){if(path.length===0)return{then:()=>proxy2};let r4=requestResponseMessage(ep2,pendingListeners,{type:"GET",path:path.map(p4=>p4.toString())}).then(fromWireValue);return r4.then.bind(r4)}return createProxy(ep2,pendingListeners,[...path,prop])},set(_target,prop,rawValue){throwIfProxyReleased(isProxyReleased);let[value,transferables]=toWireValue(rawValue);return requestResponseMessage(ep2,pendingListeners,{type:"SET",path:[...path,prop].map(p4=>p4.toString()),value},transferables).then(fromWireValue)},apply(_target,_thisArg,rawArgumentList){throwIfProxyReleased(isProxyReleased);let last=path[path.length-1];if(last===createEndpoint)return requestResponseMessage(ep2,pendingListeners,{type:"ENDPOINT"}).then(fromWireValue);if(last==="bind")return createProxy(ep2,pendingListeners,path.slice(0,-1));let[argumentList,transferables]=processArguments(rawArgumentList);return requestResponseMessage(ep2,pendingListeners,{type:"APPLY",path:path.map(p4=>p4.toString()),argumentList},transferables).then(fromWireValue)},construct(_target,rawArgumentList){throwIfProxyReleased(isProxyReleased);let[argumentList,transferables]=processArguments(rawArgumentList);return requestResponseMessage(ep2,pendingListeners,{type:"CONSTRUCT",path:path.map(p4=>p4.toString()),argumentList},transferables).then(fromWireValue)}});return registerProxy(proxy2,ep2),proxy2}function myFlat(arr){return Array.prototype.concat.apply([],arr)}function processArguments(argumentList){let processed=argumentList.map(toWireValue);return[processed.map(v5=>v5[0]),myFlat(processed.map(v5=>v5[1]))]}var transferCache=new WeakMap;function transfer(obj,transfers){return transferCache.set(obj,transfers),obj}function proxy(obj){return Object.assign(obj,{[proxyMarker]:!0})}function toWireValue(value){for(let[name,handler]of transferHandlers)if(handler.canHandle(value)){let[serializedValue,transferables]=handler.serialize(value);return[{type:"HANDLER",name,value:serializedValue},transferables]}return[{type:"RAW",value},transferCache.get(value)||[]]}function fromWireValue(value){switch(value.type){case"HANDLER":return transferHandlers.get(value.name).deserialize(value.value);case"RAW":return value.value}}function requestResponseMessage(ep2,pendingListeners,msg,transfers){return new Promise(resolve=>{let id2=generateUUID();pendingListeners.set(id2,resolve),ep2.start&&ep2.start(),ep2.postMessage(Object.assign({id:id2},msg),transfers)})}function generateUUID(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}var React3=__toESM(require_react(),1);var dist_exports4={};__export(dist_exports4,{AnalogSimulation:()=>AnalogSimulation,Battery:()=>Battery,Board:()=>Board,Breakout:()=>Breakout,BreakoutPoint:()=>BreakoutPoint,CadAssembly:()=>CadAssembly,CadModel:()=>CadModel,Capacitor:()=>Capacitor,Chip:()=>Chip,Circuit:()=>Circuit,Constraint:()=>Constraint3,CopperPour:()=>CopperPour,CopperText:()=>CopperText,CourtyardCircle:()=>CourtyardCircle,CourtyardOutline:()=>CourtyardOutline,CourtyardRect:()=>CourtyardRect,Crystal:()=>Crystal,CurrentSource:()=>CurrentSource,Cutout:()=>Cutout,Diode:()=>Diode,FabricationNoteDimension:()=>FabricationNoteDimension,FabricationNotePath:()=>FabricationNotePath,FabricationNoteRect:()=>FabricationNoteRect,FabricationNoteText:()=>FabricationNoteText,Fiducial:()=>Fiducial,Footprint:()=>Footprint,Fuse:()=>Fuse,Group:()=>Group6,Hole:()=>Hole,Inductor:()=>Inductor,Interconnect:()=>Interconnect,IsolatedCircuit:()=>IsolatedCircuit,Jumper:()=>Jumper,Keepout:()=>Keepout,Led:()=>Led,Mosfet:()=>Mosfet,MountedBoard:()=>MountedBoard,Net:()=>Net,NetLabel:()=>NetLabel,NormalComponent:()=>NormalComponent3,OpAmp:()=>OpAmp,Panel:()=>Panel,PcbNoteDimension:()=>PcbNoteDimension,PcbNoteLine:()=>PcbNoteLine,PcbNotePath:()=>PcbNotePath,PcbNoteRect:()=>PcbNoteRect,PcbNoteText:()=>PcbNoteText,PcbTrace:()=>PcbTrace,PinHeader:()=>PinHeader,Pinout:()=>Pinout,PlatedHole:()=>PlatedHole,Port:()=>Port,Potentiometer:()=>Potentiometer,PowerSource:()=>PowerSource,PrimitiveComponent:()=>PrimitiveComponent2,Project:()=>Project,PushButton:()=>PushButton,Renderable:()=>Renderable,Resistor:()=>Resistor,Resonator:()=>Resonator,RootCircuit:()=>RootCircuit,SOLVERS:()=>SOLVERS,SchematicArc:()=>SchematicArc,SchematicBox:()=>SchematicBox,SchematicCell:()=>SchematicCell,SchematicCircle:()=>SchematicCircle,SchematicLine:()=>SchematicLine,SchematicPath:()=>SchematicPath,SchematicRect:()=>SchematicRect,SchematicRow:()=>SchematicRow,SchematicTable:()=>SchematicTable,SchematicText:()=>SchematicText,SilkscreenCircle:()=>SilkscreenCircle,SilkscreenLine:()=>SilkscreenLine,SilkscreenPath:()=>SilkscreenPath,SilkscreenRect:()=>SilkscreenRect,SilkscreenText:()=>SilkscreenText,SmtPad:()=>SmtPad,SolderJumper:()=>SolderJumper,Subcircuit:()=>Subcircuit,Subpanel:()=>Subpanel,Switch:()=>Switch,Symbol:()=>SymbolComponent,TestPoint:()=>TestPoint,Trace:()=>Trace3,TraceHint:()=>TraceHint,Transistor:()=>Transistor,Via:()=>Via,VoltageProbe:()=>VoltageProbe,VoltageSource:()=>VoltageSource,applyEditEvents:()=>applyEditEvents,applyEditEventsToManualEditsFile:()=>applyEditEventsToManualEditsFile,applyPcbEditEventsToManualEditsFile:()=>applyPcbEditEventsToManualEditsFile,applySchematicEditEventsToManualEditsFile:()=>applySchematicEditEventsToManualEditsFile,createElement:()=>import_react7.createElement,createUseComponent:()=>createUseComponent,getPhaseTimingsFromRenderEvents:()=>getPhaseTimingsFromRenderEvents,getSimpleRouteJsonFromCircuitJson:()=>getSimpleRouteJsonFromCircuitJson,normalizePinLabels:()=>normalizePinLabels,orderedRenderPhases:()=>orderedRenderPhases,renderPhaseIndexMap:()=>renderPhaseIndexMap,resolveStaticFileImport:()=>resolveStaticFileImport,sel:()=>sel,useCapacitor:()=>useCapacitor,useChip:()=>useChip,useDiode:()=>useDiode,useLed:()=>useLed,useRenderedCircuit:()=>useRenderedCircuit,useResistor:()=>useResistor});init_zod();init_zod();var unitToMm={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mm=n3=>{let unit=typeof n3=="number"?"mm":n3.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n3=="number"?n3:Number.parseFloat(n3.split(unit)[0]);if(unit in unitToMm)return val*unitToMm[unit];throw new Error(`Unsupported unit: ${unit}`)};var mm_default=mm;init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();var __defProp2=Object.defineProperty,__export2=(target,all)=>{for(var name in all)__defProp2(target,name,{get:all[name],enumerable:!0})},fn_exports={};__export2(fn_exports,{axial:()=>axial,bga:()=>bga,breakoutheaders:()=>breakoutheaders,cap:()=>cap,dfn:()=>dfn,diode:()=>diode,dip:()=>dip,electrolytic:()=>electrolytic,hc49:()=>hc49,jst:()=>jst,led:()=>led,lqfp:()=>lqfp,m2host:()=>m2host,melf:()=>melf,micromelf:()=>micromelf,minimelf:()=>minimelf,mlp:()=>mlp,mountedpcbmodule:()=>mountedpcbmodule,ms012:()=>ms012,ms013:()=>ms013,msop:()=>msop,pad:()=>pad,pinrow:()=>pinrow,platedhole:()=>platedhole2,potentiometer:()=>potentiometer,pushbutton:()=>pushbutton,qfn:()=>qfn,qfp:()=>qfp,quad:()=>quad,radial:()=>radial,res:()=>res,sma:()=>sma,smb:()=>smb,smbf:()=>smbf,smc:()=>smc,smf:()=>smf,smtpad:()=>smtpad,sod110:()=>sod110,sod123:()=>sod123,sod123f:()=>sod123f,sod123fl:()=>sod123fl,sod123w:()=>sod123w,sod128:()=>sod128,sod323:()=>sod323,sod323f:()=>sod323f,sod323fl:()=>sod323fl,sod323w:()=>sod323w,sod523:()=>sod523,sod723:()=>sod723,sod80:()=>sod80,sod882:()=>sod882,sod882d:()=>sod882d,sod923:()=>sod923,soic:()=>soic,solderjumper:()=>solderjumper,son:()=>son,sop8:()=>sop8,sot:()=>sot,sot223:()=>sot223,sot23:()=>sot23,sot23w:()=>sot23w,sot25:()=>sot25,sot323:()=>sot323,sot343:()=>sot343,sot363:()=>sot363,sot457:()=>sot457,sot563:()=>sot563,sot723:()=>sot723,sot886:()=>sot886,sot89:()=>sot89,sot963:()=>sot963,ssop:()=>ssop,stampboard:()=>stampboard,stampreceiver:()=>stampreceiver,to220:()=>to220,to92:()=>to92,to92l:()=>to92l,to92s:()=>to92s,tqfp:()=>tqfp,tssop:()=>tssop,vson:()=>vson,vssop:()=>vssop});var silkscreenRef=(x5,y5,font_size)=>({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"silkscreen_text_1",font:"tscircuit2024",font_size,pcb_component_id:"pcb_component_1",text:"{REF}",layer:"top",anchor_position:{x:x5,y:y5},anchor_alignment:"center"}),base_def=external_exports.object({norefdes:external_exports.boolean().optional().describe("disable reference designator label"),invert:external_exports.boolean().optional().describe("hint to invert the orientation of the 3D model"),faceup:external_exports.boolean().optional().describe("The male pin header should face upwards, out of the top layer"),nosilkscreen:external_exports.boolean().optional().describe("omit all silkscreen elements from the footprint")}),platedhole=(pn3,x5,y5,id2,od3)=>({pcb_plated_hole_id:"",type:"pcb_plated_hole",shape:"circle",x:x5,y:y5,hole_diameter:mm(id2),outer_diameter:mm(od3),pcb_port_id:"",layers:["top","bottom"],port_hints:[pn3.toString()]}),platedHoleWithRectPad=options=>{let{pn:pn3,x:x5,y:y5,holeDiameter,rectPadWidth,rectPadHeight,holeOffsetX=0,holeOffsetY=0}=options;return{pcb_plated_hole_id:"",type:"pcb_plated_hole",shape:"circular_hole_with_rect_pad",x:x5,y:y5,hole_diameter:mm(holeDiameter),hole_shape:"circle",pad_shape:"rect",rect_pad_width:mm(rectPadWidth),rect_pad_height:mm(rectPadHeight),pcb_port_id:"",layers:["top","bottom"],port_hints:[pn3.toString()],hole_offset_x:holeOffsetX,hole_offset_y:holeOffsetY}},u_curve=Array.from({length:9},(_5,i2)=>Math.cos(i2/8*Math.PI-Math.PI)).map(x5=>({x:x5,y:-Math.sqrt(1-x5**2)}));function convertMilToMm(value){return typeof value=="string"?value.trim().toLowerCase().endsWith("mil")?parseFloat(value)*.0254:parseFloat(value):Number(value)}var lengthInMm=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>convertMilToMm(val)),extendDipDef=newDefaults=>base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(6),wide:external_exports.boolean().optional(),narrow:external_exports.boolean().optional(),w:lengthInMm.optional(),p:lengthInMm.default(newDefaults.p??"2.54mm"),id:lengthInMm.optional(),od:lengthInMm.optional(),nosquareplating:external_exports.boolean().optional().default(!1).describe("do not use rectangular pad for pin 1")}).transform(v5=>(!v5.id&&!v5.od?Math.abs(v5.p-1.27)<.01?(v5.id=convertMilToMm("0.55mm"),v5.od=convertMilToMm("0.95mm")):(v5.id=convertMilToMm("0.8mm"),v5.od=convertMilToMm("1.6mm")):v5.id?v5.od||(v5.od=v5.id*(1.5/1)):v5.id=v5.od*(1/1.5),v5.w||(v5.wide?v5.w=convertMilToMm("600mil"):v5.narrow?v5.w=convertMilToMm("300mil"):v5.w=convertMilToMm(newDefaults.w??"300mil")),v5)),dip_def=extendDipDef({}),getCcwDipCoords=(pinCount,pn3,w4,p4,nosquareplating)=>{let ph3=pinCount/2,isLeft=pn3<=ph3,leftPinGaps=ph3-1,gs3=p4,h4=gs3*leftPinGaps;return isLeft?{x:-w4/2,y:h4/2-(pn3-1)*gs3}:{x:w4/2,y:-h4/2+(pn3-ph3-1)*gs3}},dip=raw_params=>{let parameters=dip_def.parse(raw_params),platedHoles=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwDipCoords(parameters.num_pins,i2+1,parameters.w,parameters.p??2.54,parameters.nosquareplating);if(i2===0&&!parameters.nosquareplating){platedHoles.push(platedHoleWithRectPad({pn:i2+1,x:x5,y:y5,holeDiameter:parameters.id??"0.8mm",rectPadWidth:parameters.od??"1mm",rectPadHeight:parameters.od??"1mm"}));continue}platedHoles.push(platedhole(i2+1,x5,y5,parameters.id??"0.8mm",parameters.od??"1mm"))}let padEdgeHeight=(parameters.num_pins/2-1)*parameters.p+parameters.od,sw=parameters.w-parameters.od-1,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.od+.4,silkscreenBorder={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-sw/2,y:-sh3/2},{x:-sw/2,y:sh3/2},...u_curve.map(({x:x5,y:y5})=>({x:x5*sw/6,y:y5*sw/6+sh3/2})),{x:sw/2,y:sh3/2},{x:sw/2,y:-sh3/2},{x:-sw/2,y:-sh3/2}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPins=[];for(let i2=0;i2<parameters.num_pins;i2++){let isLeft=i2<parameters.num_pins/2,clearance=.6,{y:pinCenterY}=getCcwDipCoords(parameters.num_pins,i2+1,parameters.w,parameters.p??2.54,parameters.nosquareplating),pinLabelX=isLeft?-parameters.w/2-parameters.od/2-clearance:parameters.w/2+parameters.od/2+clearance,pinLabelY=pinCenterY;silkscreenPins.push({type:"pcb_fabrication_note_text",pcb_fabrication_note_text_id:`pin_${i2+1}`,layer:"top",pcb_component_id:`pin_${i2+1}`,text:`{pin${i2+1}}`,anchor_position:{x:pinLabelX,y:pinLabelY},font_size:.3,font:"tscircuit2024",anchor_alignment:"top_left"})}let silkscreenRefText=silkscreenRef(0,sh3/2+.5,.4);return{circuitJson:[...platedHoles,silkscreenBorder,silkscreenRefText,...silkscreenPins],parameters}},rectpad=(pn3,x5,y5,w4,h4)=>({type:"pcb_smtpad",x:x5,y:y5,width:w4,height:h4,layer:"top",shape:"rect",pcb_smtpad_id:"",port_hints:Array.isArray(pn3)?pn3.map(item=>item.toString()):[pn3.toString()]}),footprintSizes=[{imperial:"01005",metric:"0402",p_mm_min:.5,pw_mm_min:.4,ph_mm_min:.3,w_mm_min:.58,h_mm_min:.21},{imperial:"0504",metric:"1310",p_mm_min:1.1,pw_mm_min:.65,ph_mm_min:1.3,w_mm_min:.58,h_mm_min:.21},{imperial:"1812",metric:"4532",p_mm_min:4.275,pw_mm_min:1.125,ph_mm_min:3.4,w_mm_min:5.4,h_mm_min:3.4},{imperial:"0201",metric:"0603",p_mm_min:.66,pw_mm_min:.46,ph_mm_min:.4,w_mm_min:.9,h_mm_min:.3},{imperial:"0402",metric:"1005",p_mm_min:1.02,pw_mm_min:.54,ph_mm_min:.64,w_mm_min:1.56,h_mm_min:.64},{imperial:"0603",metric:"1608",p_mm_min:1.65,pw_mm_min:.8,ph_mm_min:.95,w_mm_min:2.45,h_mm_min:.95},{imperial:"0805",metric:"2012",p_mm_min:1.825,pw_mm_min:1.025,ph_mm_min:1.4,w_mm_min:2.8499999999999996,h_mm_min:1.4},{imperial:"1206",metric:"3216",p_mm_min:2.925,pw_mm_min:1.125,ph_mm_min:1.75,w_mm_min:4.05,h_mm_min:1.75},{imperial:"1210",metric:"3225",p_mm_min:2.925,pw_mm_min:1.125,ph_mm_min:2.65,w_mm_min:4.05,h_mm_min:2.65},{imperial:"2010",metric:"5025",p_mm_min:4.625,pw_mm_min:1.225,ph_mm_min:2.65,w_mm_min:5.85,h_mm_min:2.65},{imperial:"2512",metric:"6332",p_mm_min:5.925,pw_mm_min:1.225,ph_mm_min:3.35,w_mm_min:7.15,h_mm_min:3.35}],metricMap=Object.fromEntries(footprintSizes.map(s2=>[s2.metric,s2])),imperialMap=Object.fromEntries(footprintSizes.map(s2=>[s2.imperial,s2])),passive_def=base_def.extend({tht:external_exports.boolean(),p:length.optional(),pw:length.optional(),ph:length.optional(),metric:distance.optional(),imperial:distance.optional(),w:length.optional(),h:length.optional(),textbottom:external_exports.boolean().optional()}),passive=params=>{let{tht,p:p4,pw,ph:ph3,metric,imperial,w:w4,h:h4,textbottom}=params;if(typeof w4=="string"&&(w4=mm_default(w4)),typeof h4=="string"&&(h4=mm_default(h4)),typeof p4=="string"&&(p4=mm_default(p4)),typeof pw=="string"&&(pw=mm_default(pw)),typeof ph3=="string"&&(ph3=mm_default(ph3)),h4!==void 0&&w4!==void 0&&h4>w4)throw new Error("height cannot be greater than width (rotated footprint not yet implemented)");let sz;if(metric&&(sz=metricMap[metric]),imperial&&(sz=imperialMap[imperial]),sz&&(w4=sz.w_mm_min,h4=sz.h_mm_min,p4=sz.p_mm_min,pw=sz.pw_mm_min,ph3=sz.ph_mm_min),p4===void 0||pw===void 0||ph3===void 0)throw new Error("Could not determine required pad dimensions (p, pw, ph)");let silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:p4/2,y:ph3/2+.4},{x:-p4/2-pw/2-.2,y:ph3/2+.4},{x:-p4/2-pw/2-.2,y:-ph3/2-.4},{x:p4/2,y:-ph3/2-.4}],stroke_width:.1,pcb_silkscreen_path_id:""},textY=textbottom?-ph3/2-.9:ph3/2+.9,silkscreenRefText=silkscreenRef(0,textY,.2);return tht?[platedhole(1,-p4/2,0,pw,pw*1/.8),platedhole(2,p4/2,0,pw,pw*1/.8),silkscreenLine,silkscreenRefText]:[rectpad(["1","left"],-p4/2,0,pw,ph3),rectpad(["2","right"],p4/2,0,pw,ph3),silkscreenLine,silkscreenRefText]},diode=parameters=>({circuitJson:passive(parameters),parameters}),cap=parameters=>({circuitJson:passive(parameters),parameters}),led=parameters=>({circuitJson:passive(parameters),parameters}),chipArray=params=>{let{padSpacing:padSpacing7,padWidth,padHeight,padPitch,numRows,textbottom}=params,yPositions=[],halfRange=(numRows-1)*(padPitch/2);for(let i2=0;i2<numRows;i2++)yPositions.push(halfRange-i2*padPitch);let pads=[];yPositions.forEach((y5,index)=>{pads.push(rectpad(index+1,-padSpacing7/2,y5,padWidth,padHeight))}),yPositions.slice().reverse().forEach((y5,index)=>{pads.push(rectpad(index+numRows+1,padSpacing7/2,y5,padWidth,padHeight))});let top=Math.max(...yPositions)+padHeight/2+.4,bottom=Math.min(...yPositions)-padHeight/2-.4,left=-padSpacing7/2-padWidth/2-.4,right=padSpacing7/2+padWidth/2+.4,silkscreenTop={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:right*.5,y:top},{x:left*.5,y:top}],stroke_width:.12,pcb_silkscreen_path_id:"silkscreen_top"},silkscreenBottom={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:right*.5,y:bottom},{x:left*.5,y:bottom}],stroke_width:.12,pcb_silkscreen_path_id:"silkscreen_bottom"},pin1X=-padSpacing7/2,pin1Y=Math.max(...yPositions),pin1MarkerSize=.2,pin1Left=pin1X-padWidth/2-.1,pin1Top=pin1Y+padHeight/2+.1,pin1Marker={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_marker",route:[{x:pin1Left,y:pin1Top},{x:pin1Left-pin1MarkerSize,y:pin1Top},{x:pin1Left,y:pin1Top+pin1MarkerSize},{x:pin1Left,y:pin1Top}],stroke_width:.1},textY=textbottom?bottom-.9:top+.9,silkscreenRefText=silkscreenRef(0,textY,.2);return[...pads,silkscreenTop,silkscreenBottom,pin1Marker,silkscreenRefText]},res0402Array2_def=base_def.extend({pw:length.default("0.5mm"),ph:length.default("0.4mm"),p:length.default("0.7mm"),textbottom:external_exports.boolean().optional(),convex:external_exports.boolean().optional(),concave:external_exports.boolean().optional()}),padSpacing=1,res0402Array2=rawParams=>{let params=res0402Array2_def.parse(rawParams);if(params.concave===!0)return[];let padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing,padWidth,padHeight,padPitch,numRows:2,textbottom:params.textbottom,convex:params.convex,concave:params.concave})},res0402Array4_def=base_def.extend({pw:length.default("0.5mm"),ph:length.default("0.32mm"),p:length.default("0.5mm"),textbottom:external_exports.boolean().optional(),convex:external_exports.boolean().optional(),concave:external_exports.boolean().optional()}),padSpacing2=1,res0402Array4=rawParams=>{let params=res0402Array4_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing2,padWidth,padHeight,padPitch,numRows:4,textbottom:params.textbottom,convex:params.convex,concave:params.concave})},res0603Array2_def=base_def.extend({pw:length.default("0.9mm"),ph:length.default("0.4mm"),p:length.default("0.8mm"),textbottom:external_exports.boolean().optional(),convex:external_exports.boolean().optional(),concave:external_exports.boolean().optional()}),padSpacing3=1.7,res0603Array2=rawParams=>{let params=res0603Array2_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing3,padWidth,padHeight,padPitch,numRows:2,textbottom:params.textbottom,convex:params.convex,concave:params.concave})},res0603Array4_def=base_def.extend({pw:length.default("0.9mm"),ph:length.default("0.4mm"),p:length.default("0.8mm"),textbottom:external_exports.boolean().optional(),convex:external_exports.boolean().optional(),concave:external_exports.boolean().optional()}),padSpacing4=1.7,res0603Array4=rawParams=>{let params=res0603Array4_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing4,padWidth,padHeight,padPitch,numRows:4,textbottom:params.textbottom,convex:params.convex,concave:params.concave})},res0606Array2_def=base_def.extend({pw:length.default("0.7mm"),ph:length.default("0.64mm"),p:length.default("0.94mm"),textbottom:external_exports.boolean().optional(),convex:external_exports.boolean().optional(),concave:external_exports.boolean().optional()}),padSpacing5=1.4,res0606Array2=rawParams=>{let params=res0606Array2_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing5,padWidth,padHeight,padPitch,numRows:2,textbottom:params.textbottom,convex:params.convex,concave:params.concave})},res1206Array4_def=base_def.extend({pw:length.default("0.9mm"),ph:length.default("0.9mm"),p:length.default("1.34mm"),textbottom:external_exports.boolean().optional(),convex:external_exports.boolean().optional(),concave:external_exports.boolean().optional()}),padSpacing6=3,res1206Array4=rawParams=>{let params=res1206Array4_def.parse(rawParams),padWidth=mm_default(params.pw),padHeight=mm_default(params.ph),padPitch=mm_default(params.p);return chipArray({padSpacing:padSpacing6,padWidth,padHeight,padPitch,numRows:4,textbottom:params.textbottom,convex:params.convex,concave:params.concave})},getArrayCount=parameters=>{let arrayValue=parameters.array??parameters.x;if(typeof arrayValue=="number")return Number.isNaN(arrayValue)?void 0:arrayValue;if(typeof arrayValue=="string"){let parsed=Number.parseInt(arrayValue,10);return Number.isNaN(parsed)?void 0:parsed}if(typeof parameters.imperial=="string"){let count=parameters.imperial.match(/x(2|4)$/)?.[1];if(count)return Number.parseInt(count,10)}},getImperialBase=imperial=>imperial?(typeof imperial=="number"?`${imperial}`:imperial).split(/[_x]/)[0]:void 0,res=rawParameters=>{let arrayCount=getArrayCount(rawParameters),imperialBase=getImperialBase(rawParameters.imperial);return arrayCount===2&&imperialBase==="0402"?{circuitJson:res0402Array2(rawParameters),parameters:rawParameters}:arrayCount===4&&imperialBase==="0402"?{circuitJson:res0402Array4(rawParameters),parameters:rawParameters}:arrayCount===2&&imperialBase==="0603"?{circuitJson:res0603Array2(rawParameters),parameters:rawParameters}:arrayCount===4&&imperialBase==="0603"?{circuitJson:res0603Array4(rawParameters),parameters:rawParameters}:arrayCount===2&&imperialBase==="0606"?{circuitJson:res0606Array2(rawParameters),parameters:rawParameters}:arrayCount===4&&imperialBase==="1206"?{circuitJson:res1206Array4(rawParameters),parameters:rawParameters}:{circuitJson:passive(rawParameters),parameters:rawParameters}},circlepad=(pn3,{x:x5,y:y5,radius})=>({type:"pcb_smtpad",x:x5,y:y5,radius,layer:"top",shape:"circle",pcb_smtpad_id:"",port_hints:Array.isArray(pn3)?pn3.map(item=>item.toString()):[pn3.toString()]}),ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZ",dim2d=external_exports.string().transform(a2=>{let[x5,y5]=a2.split(/[x ]/);return{x:parseFloat(x5??""),y:parseFloat(y5??"")}}).pipe(external_exports.object({x:external_exports.number(),y:external_exports.number()})),function_call=external_exports.string().or(external_exports.array(external_exports.any())).transform(a2=>Array.isArray(a2)?a2:(a2.startsWith("(")&&a2.endsWith(")")&&(a2=a2.slice(1,-1)),a2.split(",").map(v5=>{let numVal=Number(v5);return isNaN(numVal)?v5:numVal}))).pipe(external_exports.array(external_exports.string().or(external_exports.number()))),bga_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(64),grid:dim2d.optional(),p:distance.default("0.8mm"),w:length.optional(),h:length.optional(),ball:length.optional().describe("ball diameter"),pad:length.optional().describe("pad width/height"),circularpads:external_exports.boolean().optional().describe("use circular pads"),tlorigin:external_exports.boolean().optional(),blorigin:external_exports.boolean().optional(),trorigin:external_exports.boolean().optional(),brorigin:external_exports.boolean().optional(),missing:function_call.default([])}).transform(a2=>{let origin="tl";if(a2.blorigin&&(origin="bl"),a2.trorigin&&(origin="tr"),a2.brorigin&&(origin="br"),!a2.grid){let largest_square=Math.ceil(Math.sqrt(a2.num_pins));a2.grid={x:largest_square,y:largest_square}}return a2.missing&&(a2.missing=a2.missing.map(s2=>{if(typeof s2=="number")return s2;if(s2==="center")return"center";if(s2==="topleft")return"topleft";let m3=s2.match(/([A-Z]+)(\d+)/);if(!m3)return s2;let Y6=ALPHABET.indexOf(m3[1]),X6=Number.parseInt(m3[2])-1;return Y6*a2.grid.x+X6+1})),{...a2,origin}}),bga=raw_params=>{let parameters=bga_def.parse(raw_params),{num_pins,grid:grid4,p:p4,w:w4,h:h4,ball,pad:pad2,missing}=parameters;ball??(ball=.75/1.27*p4),pad2??(pad2=ball*.8);let pads=[],missing_pin_nums=(missing??[]).filter(a2=>typeof a2=="number"),num_pins_missing=grid4.x*grid4.y-num_pins;if(missing.length===0&&num_pins_missing>0&&(Math.sqrt(num_pins_missing)%1===0?missing.push("center"):num_pins_missing===1&&missing.push("topleft")),missing?.includes("center")){let square_size=Math.floor(Math.sqrt(num_pins_missing)),inner_square_x=Math.floor((grid4.x-square_size)/2),inner_square_y=Math.floor((grid4.y-square_size)/2);for(let y5=inner_square_y;y5<inner_square_y+square_size;y5++)for(let x5=inner_square_x;x5<inner_square_x+square_size;x5++)missing_pin_nums.push(y5*grid4.x+x5+1)}missing?.includes("topleft")&&missing_pin_nums.push(1);let missing_pin_nums_set=new Set(missing_pin_nums),missing_pins_passed=0;for(let y5=0;y5<grid4.y;y5++)for(let x5=0;x5<grid4.x;x5++){let pad_x=(x5-(grid4.x-1)/2)*p4,pad_y=(y5-(grid4.y-1)/2)*p4,pin_x=x5,pin_y=y5;switch(parameters.origin){case"bl":pin_x=x5,pin_y=grid4.y-1-y5;break;case"br":pin_x=grid4.x-1-x5,pin_y=grid4.y-1-y5;break;case"tr":pin_x=grid4.x-1-x5,pin_y=y5;break;default:break}let pin_num=pin_y*grid4.x+pin_x+1;if(missing_pin_nums_set.has(pin_num)){missing_pins_passed++;continue}pin_num-=missing_pins_passed;let portHints2=[pin_num,`${ALPHABET[pin_y]}${pin_x+1}`];pads.push(parameters.circularpads?circlepad(portHints2,{x:pad_x,y:pad_y,radius:pad2/2}):rectpad(portHints2,pad_x,pad_y,pad2,pad2))}let silkscreenRefText=silkscreenRef(0,grid4.y*p4/2,.2),pin1MarkerSize=p4/6,markerRoute,edgeX=grid4.x*p4/2,edgeY=grid4.y*p4/2;switch(parameters.origin){case"bl":markerRoute=[{x:-edgeX,y:-edgeY},{x:-edgeX,y:-edgeY-pin1MarkerSize},{x:-edgeX-pin1MarkerSize,y:-edgeY},{x:-edgeX,y:-edgeY}];break;case"br":markerRoute=[{x:edgeX,y:-edgeY},{x:edgeX,y:-edgeY-pin1MarkerSize},{x:edgeX+pin1MarkerSize,y:-edgeY},{x:edgeX,y:-edgeY}];break;case"tr":markerRoute=[{x:edgeX,y:edgeY},{x:edgeX,y:edgeY+pin1MarkerSize},{x:edgeX+pin1MarkerSize,y:edgeY},{x:edgeX,y:edgeY}];break;default:markerRoute=[{x:-edgeX,y:edgeY},{x:-edgeX,y:edgeY+pin1MarkerSize},{x:-edgeX-pin1MarkerSize,y:edgeY},{x:-edgeX,y:edgeY}];break}let pin1Marker={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_marker",route:markerRoute,stroke_width:.05};return{circuitJson:[...pads,silkscreenRefText,pin1Marker],parameters}},pillpad=(pn3,x5,y5,w4,h4)=>({type:"pcb_smtpad",x:x5,y:y5,width:w4,height:h4,radius:h4/2,layer:"top",shape:"pill",pcb_smtpad_id:"",port_hints:Array.isArray(pn3)?pn3.map(item=>item.toString()):[pn3.toString()]}),extendSoicDef=newDefaults=>base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(8),w:length.default(length.parse(newDefaults.w??"5.3mm")),p:length.default(length.parse(newDefaults.p??"1.27mm")),pw:length.default(length.parse(newDefaults.pw??"0.6mm")),pl:length.default(length.parse(newDefaults.pl??"1.0mm")),legsoutside:external_exports.boolean().optional().default(newDefaults.legsoutside??!1),pillpads:external_exports.boolean().optional().default(newDefaults.pillpads??!1),silkscreen_stroke_width:external_exports.number().optional().default(.1)}).transform(v5=>(!v5.pw&&!v5.pl?(v5.pw=length.parse("0.6mm"),v5.pl=length.parse("1.0mm")):v5.pw?v5.pl||(v5.pl=v5.pw*(1/.6)):v5.pw=v5.pl*(.6/1),v5)),soic_def=extendSoicDef({}),getCcwSoicCoords=parameters=>{parameters.widthincludeslegs!==void 0&&(parameters.legsoutside=!parameters.widthincludeslegs);let{num_pins,pn:pn3,w:w4,p:p4,pl:pl3,legsoutside}=parameters,ph3=num_pins/2,isLeft=pn3<=ph3,leftPinGaps=ph3-1,gs3=p4,h4=gs3*leftPinGaps,legoffset=legsoutside?pl3/2:-pl3/2;return isLeft?{x:-w4/2-legoffset,y:h4/2-(pn3-1)*gs3}:{x:w4/2+legoffset,y:-h4/2+(pn3-ph3-1)*gs3}},soic=raw_params=>{let parameters=soic_def.parse(raw_params);return{circuitJson:soicWithoutParsing(parameters),parameters}},soicWithoutParsing=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSoicCoords({num_pins:parameters.num_pins,pn:i2+1,w:parameters.w,p:parameters.p,pl:parameters.pl,legsoutside:parameters.legsoutside});parameters.pillpads?pads.push(pillpad(i2+1,x5,y5,parameters.pl,parameters.pw)):pads.push(rectpad(i2+1,x5,y5,parameters.pl,parameters.pw))}let m3=Math.min(1,parameters.p/2),sw=parameters.w-(parameters.legsoutside?0:parameters.pl*2)-.2,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw+m3,silkscreenRefText=silkscreenRef(0,sh3/2+.4,sh3/12),silkscreenBorder={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",stroke_width:parameters.silkscreen_stroke_width??.1,route:[{x:-sw/2,y:-sh3/2},{x:-sw/2,y:sh3/2},...u_curve.map(({x:x5,y:y5})=>({x:x5*sw/6,y:y5*sw/6+sh3/2})),{x:sw/2,y:sh3/2},{x:sw/2,y:-sh3/2},{x:-sw/2,y:-sh3/2}]};return[...pads,silkscreenBorder,silkscreenRefText]},pin_order_specifier=external_exports.enum(["leftside","topside","rightside","bottomside","toppin","bottompin","leftpin","rightpin"]),getQuadPinMap=({num_pins,cw:cw2,ccw,startingpin})=>{let pin_map=[],pins_per_side=num_pins/4,current_position_ccw_normal=1,sfp={};for(let specifier of startingpin??[])sfp[specifier]=!0;!sfp.leftside&&!sfp.topside&&!sfp.rightside&&!sfp.bottomside&&(sfp.leftside=!0),!sfp.bottompin&&!sfp.leftpin&&!sfp.rightpin&&!sfp.toppin&&(sfp.leftside?sfp.toppin=!0:sfp.topside?sfp.rightpin=!0:sfp.rightside?sfp.bottompin=!0:sfp.bottomside&&(sfp.leftpin=!0)),sfp.leftside&&sfp.toppin?current_position_ccw_normal=1:sfp.leftside&&sfp.bottompin?current_position_ccw_normal=pins_per_side:sfp.bottomside&&sfp.leftpin?current_position_ccw_normal=pins_per_side+1:sfp.bottomside&&sfp.rightpin?current_position_ccw_normal=pins_per_side*2:sfp.rightside&&sfp.bottompin?current_position_ccw_normal=pins_per_side*2+1:sfp.rightside&&sfp.toppin?current_position_ccw_normal=pins_per_side*3:sfp.topside&&sfp.rightpin?current_position_ccw_normal=pins_per_side*3+1:sfp.topside&&sfp.leftpin&&(current_position_ccw_normal=pins_per_side*4),pin_map.push(-1);for(let i2=0;i2<num_pins;i2++)pin_map[current_position_ccw_normal]=i2+1,ccw||!cw2?(current_position_ccw_normal++,current_position_ccw_normal>num_pins&&(current_position_ccw_normal=1)):(current_position_ccw_normal--,current_position_ccw_normal<1&&(current_position_ccw_normal=num_pins));return pin_map},base_quad_def=base_def.extend({fn:external_exports.string(),cc:external_exports.boolean().default(!0).optional(),ccw:external_exports.boolean().default(!0).optional(),startingpin:external_exports.string().or(external_exports.array(pin_order_specifier)).transform(a2=>typeof a2=="string"?a2.slice(1,-1).split(","):a2).pipe(external_exports.array(pin_order_specifier)).optional(),num_pins:external_exports.number().optional().default(64),w:length.optional(),h:length.optional(),p:length.default(length.parse("0.5mm")),pw:length.optional(),pl:length.optional(),thermalpad:external_exports.union([external_exports.literal(!0),dim2d]).optional(),legsoutside:external_exports.boolean().default(!1)}),quadTransform=v5=>{v5.w&&!v5.h?v5.h=v5.w:!v5.w&&v5.h&&(v5.w=v5.h);let side_pin_count=v5.num_pins/4;if(!v5.p&&!v5.pw&&!v5.pl&&v5.w){let approx_pin_size_of_side=side_pin_count+4;v5.p=v5.w/approx_pin_size_of_side}return!v5.p&&v5.w&&v5.h&&v5.pw&&v5.pl&&(v5.p=(v5.w-v5.pl*2)/(side_pin_count-1)),!v5.w&&!v5.h&&v5.p&&(v5.w=v5.p*(side_pin_count+4),v5.h=v5.w),v5.p&&!v5.pw&&!v5.pl?(v5.pw=v5.p/2,v5.pl=v5.p/2):v5.pw?v5.pl||(v5.pl=v5.pw*(1/.6)):v5.pw=v5.pl*(.6/1),v5},quad_def=base_quad_def.transform(quadTransform),SIDES_CCW=["left","bottom","right","top"],getQuadCoords=params=>{let{pin_count,pn:pn3,w:w4,h:h4,p:p4,pl:pl3,legsoutside}=params,sidePinCount=pin_count/4,side=SIDES_CCW[Math.floor((pn3-1)/sidePinCount)],pos=(pn3-1)%sidePinCount,ibw=p4*(sidePinCount-1),ibh=p4*(sidePinCount-1),pcdfe=legsoutside?pl3/2:-pl3/2;switch(side){case"left":return{x:-w4/2-pcdfe+.1,y:ibh/2-pos*p4,o:"vert"};case"bottom":return{x:-ibw/2+pos*p4,y:-h4/2-pcdfe+.1,o:"horz"};case"right":return{x:w4/2+pcdfe-.1,y:-ibh/2+pos*p4,o:"vert"};case"top":return{x:ibw/2-pos*p4,y:h4/2+pcdfe-.1,o:"horz"};default:throw new Error("Invalid pin number")}},quad=raw_params=>{let parameters=quad_def.parse(raw_params),pads=[],pin_map=getQuadPinMap(parameters),spc=parameters.num_pins/4;for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5,o:orientation4}=getQuadCoords({pin_count:parameters.num_pins,pn:i2+1,w:parameters.w,h:parameters.h,p:parameters.p??.5,pl:parameters.pl,legsoutside:parameters.legsoutside}),pw=parameters.pw,pl3=parameters.pl;orientation4==="vert"&&([pw,pl3]=[pl3,pw]);let pn3=pin_map[i2+1];pads.push(rectpad(pn3,x5,y5,pw,pl3))}if(parameters.thermalpad)if(typeof parameters.thermalpad=="boolean"){let ibw=parameters.p*(spc-1)+parameters.pw,ibh=parameters.p*(spc-1)+parameters.pw;pads.push(rectpad(["thermalpad"],0,0,ibw,ibh))}else pads.push(rectpad(["thermalpad"],0,0,parameters.thermalpad.x,parameters.thermalpad.y));let silkscreen_corners=[];for(let[corner,dx2,dy2]of[["top-left",-1,1],["bottom-left",-1,-1],["bottom-right",1,-1],["top-right",1,1]]){let corner_x=parameters.w/2*dx2,corner_y=parameters.h/2*dy2,arrow="none",arrow_x=corner_x,arrow_y=corner_y,csz=parameters.pw*2;pin_map[1]===1&&corner==="top-left"?arrow="in1":pin_map[spc*4]===1&&corner==="top-left"||pin_map[spc*3+1]===1&&corner==="top-right"?arrow="in2":pin_map[spc*3]===1&&corner==="top-right"||pin_map[spc]===1&&corner==="bottom-left"?arrow="in1":pin_map[spc+1]===1&&corner==="bottom-left"?arrow="in2":pin_map[spc*2]===1&&corner==="bottom-right"?arrow="in1":pin_map[spc*2+1]===1&&corner==="bottom-right"&&(arrow="in2");let rotate_arrow=arrow==="in1"?1:-1;if(parameters.legsoutside){let arrow_dx=arrow==="in1"?parameters.pl/2:parameters.pw/2,arrow_dy=arrow==="in1"?parameters.pw/2:parameters.pl/2;arrow_x+=arrow_dx*dx2*rotate_arrow,arrow_y-=arrow_dy*dy2*rotate_arrow}(arrow==="none"||parameters.legsoutside)&&silkscreen_corners.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}`,route:[{x:corner_x-csz*dx2,y:corner_y},{x:corner_x,y:corner_y},{x:corner_x,y:corner_y-csz*dy2}],type:"pcb_silkscreen_path",stroke_width:.1}),(arrow==="in1"||arrow==="in2")&&!parameters.legsoutside&&silkscreen_corners.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}_1`,route:[{x:corner_x-csz*dx2,y:corner_y},{x:corner_x-csz*dx2/2,y:corner_y}],type:"pcb_silkscreen_path",stroke_width:0},{layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}_2`,route:[{x:corner_x,y:corner_y-csz*dy2/2},{x:corner_x,y:corner_y-csz*dy2}],type:"pcb_silkscreen_path",stroke_width:.1}),(arrow==="in1"||arrow==="in2")&&silkscreen_corners.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:`pcb_silkscreen_path_${corner}_3`,route:[{x:arrow_x-.2*-dx2,y:arrow_y+.2*rotate_arrow},{x:arrow_x,y:arrow_y},{x:arrow_x+.2*rotate_arrow*-dx2,y:arrow_y+.2},{x:arrow_x-.2*-dx2,y:arrow_y+.2*rotate_arrow}],type:"pcb_silkscreen_path",stroke_width:.1})}let silkscreenRefText=silkscreenRef(0,parameters.h/2+(parameters.legsoutside?parameters.pl*1.2:.5),.3);return{circuitJson:[...pads,...silkscreen_corners,silkscreenRefText],parameters}},qfn_def=base_quad_def.extend({}).transform(quadTransform),qfn=parameters=>(parameters.legsoutside=!1,parameters.pl||(parameters.pl=.875),parameters.pw||(parameters.pw=.25),quad(parameters)),tqfp=raw_params=>{if(raw_params.legsoutside=!0,!raw_params.p)switch(raw_params.num_pins){case 32:raw_params.p=.8;break;case 44:case 48:raw_params.p=.5;break;case 64:case 80:case 100:raw_params.p=.5;break;case 144:raw_params.p=.5;break}if(!raw_params.pl)switch(raw_params.num_pins){case 32:case 44:case 48:case 64:case 80:case 100:raw_params.pl=1.475;break;case 144:raw_params.pl=1.6;break}if(!raw_params.pw)switch(raw_params.num_pins){case 32:raw_params.pw=.55;break;case 44:case 48:case 64:case 80:case 100:raw_params.pw=.3;break;case 144:raw_params.pw=.25;break}return quad(raw_params)},qfp=raw_params=>{raw_params.legsoutside=!0;let quad_defaults=quad_def.parse(raw_params);if(!raw_params.p)switch(raw_params.num_pins){case 44:case 64:raw_params.p=.8;break;case 52:raw_params.w===14?raw_params.p=1:raw_params.p=.65;break;case 208:raw_params.p=.5;break}if(!raw_params.pl)switch(raw_params.num_pins){case 44:case 52:case 64:raw_params.pl=2.25;break;case 208:raw_params.pl=1.65;break;default:raw_params.pl=quad_defaults.pl*4;break}if(!raw_params.pw)switch(raw_params.num_pins){case 44:case 64:raw_params.pw=.5;break;case 52:raw_params.w===14?raw_params.pw=.45:raw_params.pw=.55;break;case 208:raw_params.pw=.3;break;default:raw_params.pw=quad_defaults.pw;break}return quad(raw_params)},mlp_def=base_quad_def.extend({}).transform(quadTransform),mlp=parameters=>(parameters.legsoutside=!1,parameters.thermalpad===void 0&&(parameters.thermalpad=!0),quad(parameters)),ssop_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(8),w:length.default(length.parse("3.9mm")),p:length.default(length.parse("1.27mm")),pw:length.optional(),pl:length.optional(),legsoutside:external_exports.boolean().optional().default(!1),silkscreen_stroke_width:external_exports.number().optional().default(.1)}).transform(v5=>(v5.pw==null&&v5.pl==null?(v5.pw=length.parse("0.51mm"),v5.pl=length.parse("1.1mm")):v5.pw==null?v5.pw=v5.pl*(.51/1.1):v5.pl==null&&(v5.pl=v5.pw*(1.1/.51)),v5)),getSsopCoords=parameters=>{let{num_pins,pn:pn3,w:w4,p:p4}=parameters,ph3=num_pins/2,isLeft=pn3<=ph3,leftPinGaps=ph3-1,gs3=p4,h4=gs3*leftPinGaps,padRowSpan=w4+length.parse("0.2mm"),x5=(isLeft?-1:1)*(padRowSpan/2);return isLeft?{x:x5,y:h4/2-(pn3-1)*gs3}:{x:x5,y:-h4/2+(pn3-ph3-1)*gs3}},ssop=raw_params=>{let parameters=ssop_def.parse(raw_params),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getSsopCoords({num_pins:parameters.num_pins,pn:i2+1,w:parameters.w,p:parameters.p,pl:parameters.pl,legsoutside:parameters.legsoutside});pads.push(rectpad(i2+1,x5,y5,parameters.pl,parameters.pw))}let m3=Math.min(1,parameters.p/2),sw=parameters.w-(parameters.legsoutside?0:parameters.pl)-.2,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw+m3,silkscreenRefText=silkscreenRef(0,sh3/2+.4,sh3/12),silkscreenBorder={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",stroke_width:parameters.silkscreen_stroke_width??.1,route:[{x:-sw/2,y:-sh3/2},{x:-sw/2,y:sh3/2},...u_curve.map(({x:x5,y:y5})=>({x:x5*sw/6,y:y5*sw/6+sh3/2})),{x:sw/2,y:sh3/2},{x:sw/2,y:-sh3/2},{x:-sw/2,y:-sh3/2}]};return{circuitJson:[...pads,silkscreenBorder,silkscreenRefText],parameters}},tssop_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(8),w:length.default(length.parse("3.0mm")),p:length.default(length.parse("0.5mm")),pw:length.default(length.parse("0.30mm")),pl:length.default(length.parse("1.45mm")),legsoutside:external_exports.boolean().optional().default(!0),silkscreen_stroke_width:external_exports.number().optional().default(.1)}),getTssopCoords=parameters=>{let{num_pins,pn:pn3,w:w4,p:p4,pl:pl3,legsoutside}=parameters,ph3=num_pins/2,isLeft=pn3<=ph3,leftPinGaps=ph3-1,h4=p4*leftPinGaps,legoffset=legsoutside?pl3/2:-pl3/2;return isLeft?{x:-w4/2-legoffset,y:h4/2-(pn3-1)*p4}:{x:w4/2+legoffset,y:-h4/2+(pn3-ph3-1)*p4}},tssop=raw_params=>{let params={...raw_params},pRaw=params.p,pValue=typeof pRaw=="string"||typeof pRaw=="number"?length.parse(pRaw):void 0,isFinePitch=pValue!=null&&pValue<=length.parse("0.5mm"),parameters=tssop_def.parse(params),pads=[],wForPads=isFinePitch?parameters.w-length.parse("0.15mm"):parameters.w;for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getTssopCoords({num_pins:parameters.num_pins,pn:i2+1,w:wForPads,p:parameters.p,pl:parameters.pl,legsoutside:parameters.legsoutside});pads.push(rectpad(i2+1,x5,y5,parameters.pl,parameters.pw))}let m3=Math.min(1,parameters.p/2),sw=parameters.w-(parameters.legsoutside?0:parameters.pl*2)-.2,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw+m3,silkscreenRefText=silkscreenRef(0,sh3/2+.4,sh3/12),silkscreenBorder={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",stroke_width:parameters.silkscreen_stroke_width??.1,route:[{x:-sw/2,y:-sh3/2},{x:-sw/2,y:sh3/2},...u_curve.map(({x:x5,y:y5})=>({x:x5*sw/6,y:y5*sw/6+sh3/2})),{x:sw/2,y:sh3/2},{x:sw/2,y:-sh3/2},{x:-sw/2,y:-sh3/2}]};return{circuitJson:[...pads,silkscreenBorder,silkscreenRefText],parameters}},sot363_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),w:external_exports.string().default("3.1mm"),h:external_exports.string().default("2.0mm"),p:external_exports.string().default("0.65mm"),pl:external_exports.string().default("1.03mm"),pw:external_exports.string().default("0.35mm"),string:external_exports.string().optional()}),sot363=raw_params=>{let parameters=sot363_def.parse({...raw_params,fn:"sot363"}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),pads=[];for(let i2=0;i2<6;i2++){let{x:x5,y:y5}=getSot363PadCoord(i2+1,w4,p4,pl3);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/4,y:h4/2+.1},{x:w4/4,y:h4/2+.1}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/4,y:-h4/2-.1},{x:w4/4,y:-h4/2-.1}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSot363PadCoord(1,w4,p4,pl3),pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1Position.x-pl3/2-.3,y:pin1Position.y},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y+.15},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y-.15},{x:pin1Position.x-pl3/2-.3,y:pin1Position.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,h4/2+.4,.25);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSot363PadCoord=(pn3,w4,p4,pl3)=>{let padCenterOffset=w4/2-pl3/2;return pn3<=3?{x:-.84,y:p4-(pn3-1)*p4}:{x:.84,y:-p4+(pn3-4)*p4}},sot886_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),w:external_exports.string().default("1.01mm"),h:external_exports.string().default("1.45mm"),p:external_exports.string().default("0.5mm"),pl:external_exports.string().default("0.33mm"),pw:external_exports.string().default("0.27mm"),string:external_exports.string().optional()}),sot886=raw_params=>{let parameters=sot886_def.parse({...raw_params,fn:"sot886"}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),pads=[];for(let i2=0;i2<6;i2++){let{x:x5,y:y5}=getSot886PadCoord(i2+1,w4,p4,pl3);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:h4/2},{x:w4/2,y:h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSot886PadCoord(1,w4,p4,pl3),pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1Position.x-pl3/2-.3,y:pin1Position.y},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y+.15},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y-.15},{x:pin1Position.x-pl3/2-.3,y:pin1Position.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,h4/2+.4,.25);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSot886PadCoord=(pn3,w4,p4,pl3)=>{let padCenterOffset=w4/2-pl3/2;return pn3<=3?{x:-padCenterOffset,y:p4-(pn3-1)*p4}:{x:padCenterOffset,y:-p4+(pn3-4)*p4}},sot23_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),w:external_exports.string().default("1.92mm"),h:external_exports.string().default("2.74mm"),pl:external_exports.string().default("1.32mm"),pw:external_exports.string().default("0.6mm"),p:external_exports.string().default("0.95mm"),string:external_exports.string().optional()}),sot23_6_or_8_def=extendSoicDef({p:"0.95mm",w:"1.6mm",legsoutside:!0}),sot23=raw_params=>{let match2=raw_params.string?.match(/^sot23_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3;if(numPins===6||numPins===8){let parameters2=sot23_6_or_8_def.parse({...raw_params,num_pins:numPins});return{circuitJson:soicWithoutParsing(parameters2),parameters:parameters2}}let parameters=sot23_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot23_3(parameters),parameters};if(parameters.num_pins===5)return{circuitJson:sot23_5(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot23Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-1.155,y:p4}:pn3===2?{x:-1.155,y:-p4}:{x:1.15,y:0}},sot23_3=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot23Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let silkscreenRefText=silkscreenRef(0,Number.parseInt(parameters.h),.3);return[...pads,silkscreenRefText]},getCcwSot235Coords=parameters=>{let{p:p4,h:h4,pn:pn3}=parameters;if(pn3===1)return{x:-h4/2-.5,y:p4};if(pn3===2)return{x:-h4/2-.5,y:0};if(pn3===3)return{x:-h4/2-.5,y:-p4};if(pn3===4)return{x:h4/2+.5,y:-p4};if(pn3===5)return{x:h4/2+.5,y:p4};throw new Error("Invalid pin number")},sot23_5=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot235Coords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:i2});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let width=(parameters.num_pins+1)/2*Number.parseFloat(parameters.p),height=Number.parseFloat(parameters.h),silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width/3,y:height/2+Number.parseFloat(parameters.p)/1.3},{x:width/3,y:height/2+Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3},{x:width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenRefText=silkscreenRef(0,height+.3,.3),pin1Position=getCcwSot235Coords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:1});pin1Position.x=pin1Position.x-Number.parseFloat(parameters.pw)*1.5;let triangleHeight=.3,triangleWidth=.4,pin1Indicator={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_indicator",route:[{x:pin1Position.x+triangleHeight/2,y:pin1Position.y},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y+triangleWidth/2},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y-triangleWidth/2},{x:pin1Position.x+triangleHeight/2,y:pin1Position.y}],stroke_width:.05};return[...pads,silkscreenRefText,silkscreenPath1,silkscreenPath2,pin1Indicator]},sot25_def=sot23_def.extend({}),sot25=raw_params=>{let parameters=sot25_def.parse({...raw_params,num_pins:5});return{circuitJson:sot23_5(parameters),parameters}},CORNERS=[{name:"top-left",dx:-1,dy:1},{name:"top-right",dx:1,dy:1},{name:"bottom-left",dx:-1,dy:-1},{name:"bottom-right",dx:1,dy:-1}],dfn_def=extendSoicDef({}),dfn=raw_params=>{let parameters=dfn_def.parse(raw_params),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSoicCoords({num_pins:parameters.num_pins,pn:i2+1,w:parameters.w,p:parameters.p??1.27,pl:parameters.pl,widthincludeslegs:!0});pads.push(rectpad(i2+1,x5,y5,parameters.pl??"1mm",parameters.pw??"0.6mm"))}let m3=Math.min(1,parameters.p/2),sw=parameters.w+m3,sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw+m3,silkscreenPaths=[];for(let corner of CORNERS){let{dx:dx2,dy:dy2}=corner;silkscreenPaths.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",route:[{x:dx2*sw/2-dx2*parameters.p,y:dy2*sh3/2},{x:dx2*sw/2,y:dy2*sh3/2},{x:dx2*sw/2,y:dy2*sh3/2-dy2*parameters.p}],type:"pcb_silkscreen_path",stroke_width:.1})}let as3=parameters.p/4,atx=-sw/2-as3/2,aty=sh3/2-parameters.p/2;silkscreenPaths.push({layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",type:"pcb_silkscreen_path",route:[{x:atx,y:aty},{x:atx-as3,y:aty+as3},{x:atx-as3,y:aty-as3},{x:atx,y:aty}],stroke_width:.1});let silkscreenRefText=silkscreenRef(0,sh3/2+.4,sh3/12);return{circuitJson:[...pads,silkscreenRefText,...silkscreenPaths],parameters}},silkscreenPin=({fs:fs3,pn:pn3,anchor_x,anchor_y,textalign="center",orthogonal=!1,verticallyinverted=!1,layer="top"})=>{let ccw_rotation=0;orthogonal&&verticallyinverted?ccw_rotation=270:verticallyinverted?ccw_rotation=180:orthogonal?ccw_rotation=90:ccw_rotation=0;let anchor_alignment="center";return textalign==="left"&&(verticallyinverted?anchor_alignment="center_right":anchor_alignment="center_left"),textalign==="right"&&(verticallyinverted?anchor_alignment="center_left":anchor_alignment="center_right"),layer==="bottom"&&(anchor_alignment==="center_left"?anchor_alignment="center_right":anchor_alignment==="center_right"&&(anchor_alignment="center_left")),{type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"silkscreen_text_1",font:"tscircuit2024",font_size:fs3,pcb_component_id:"pcb_component_1",text:`{PIN${pn3}}`,layer,anchor_position:{x:anchor_x,y:anchor_y},anchor_alignment,ccw_rotation}};function determinePinlabelAnchorSide({pinlabeltextalignleft,pinlabeltextalignright,pinlabelorthogonal}){let pinlabelAnchorSide="top";return pinlabelorthogonal?pinlabelAnchorSide="left":pinlabelAnchorSide="top",pinlabeltextalignleft&&(pinlabelorthogonal?pinlabelAnchorSide="bottom":pinlabelAnchorSide="right"),pinlabeltextalignright&&(pinlabelorthogonal?pinlabelAnchorSide="top":pinlabelAnchorSide="left"),pinlabelAnchorSide}var pinrow_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(6),rows:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>Number(val)).optional().default(1).describe("number of rows"),p:length.default("0.1in").describe("pitch"),id:length.default("1.0mm").describe("inner diameter"),od:length.default("1.5mm").describe("outer diameter"),male:external_exports.boolean().optional().describe("for male pin headers"),female:external_exports.boolean().optional().describe("for female pin headers"),smd:external_exports.boolean().optional().describe("surface mount device"),surfacemount:external_exports.boolean().optional().describe("surface mount device (verbose)"),rightangle:external_exports.boolean().optional().describe("right angle"),pw:length.optional().default("1.0mm").describe("pad width for SMD"),pl:length.optional().default("2.0mm").describe("pad length for SMD"),pinlabeltextalignleft:external_exports.boolean().optional().default(!1),pinlabeltextaligncenter:external_exports.boolean().optional().default(!1),pinlabeltextalignright:external_exports.boolean().optional().default(!1),pinlabelverticallyinverted:external_exports.boolean().optional().default(!1),pinlabelorthogonal:external_exports.boolean().optional().default(!1),nosquareplating:external_exports.boolean().optional().default(!1).describe("do not use rectangular pad for pin 1"),nopinlabels:external_exports.boolean().optional().default(!1).describe("omit silkscreen pin labels"),doublesidedpinlabel:external_exports.boolean().optional().default(!1).describe("add silkscreen pins in top and bottom layers"),bottomsidepinlabel:external_exports.boolean().optional().default(!1).describe("place the silkscreen reference text on the bottom layer instead of top")}).transform(data=>{let pinlabelAnchorSide=determinePinlabelAnchorSide(data);return{...data,pinlabelAnchorSide,male:data.male??!data.female,female:data.female??!1,smd:data.smd??data.surfacemount??!1,rightangle:data.rightangle??!1}}).superRefine((data,ctx)=>{data.male&&data.female&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"'male' and 'female' cannot both be true; it should be male or female.",path:["male","female"]})}),pinrow=raw_params=>{let parameters=pinrow_def.parse(raw_params),{p:p4,id:id2,od:od3,rows,num_pins,pinlabelAnchorSide,pinlabelverticallyinverted,pinlabelorthogonal,pinlabeltextalignleft,pinlabeltextalignright,nopinlabels,doublesidedpinlabel,bottomsidepinlabel}=parameters,pinlabelTextAlign="center";pinlabeltextalignleft?pinlabelTextAlign="left":pinlabeltextalignright&&(pinlabelTextAlign="right");let holes=[],numPinsPerRow=Math.ceil(num_pins/rows),ySpacing=-p4,calculateAnchorPosition2=({xoff,yoff,od:od22,anchorSide,smd,pw,pl:pl3})=>{let dx2=0,dy2=0;if(smd){let offset=od22/5;switch(anchorSide){case"right":dx2=pw/2+offset;break;case"top":dy2=pl3/2+offset;break;case"bottom":dy2=-(pl3/2+offset);break;case"left":dx2=-(pw/2+offset);break}}else{let offset=od22*.75;switch(anchorSide){case"right":dx2=offset;break;case"top":dy2=offset;break;case"bottom":dy2=-offset;break;case"left":dx2=-offset;break}}return{anchor_x:xoff+dx2,anchor_y:yoff+dy2}},addPin=(pinNumber,xoff,yoff)=>{parameters.smd?holes.push(rectpad(pinNumber,xoff,yoff,parameters.pw,parameters.pl)):pinNumber===1&&!parameters.nosquareplating?holes.push(platedHoleWithRectPad({pn:pinNumber,x:xoff,y:yoff,holeDiameter:id2,rectPadWidth:od3,rectPadHeight:od3})):holes.push(platedhole(pinNumber,xoff,yoff,id2,od3));let{anchor_x,anchor_y}=calculateAnchorPosition2({xoff,yoff,od:od3,anchorSide:pinlabelAnchorSide,smd:parameters.smd,pw:parameters.pw,pl:parameters.pl});nopinlabels||(bottomsidepinlabel?holes.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"bottom"})):holes.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"top"})),doublesidedpinlabel&&holes.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"bottom"})))},usedPositions=new Set,useBGAStyle=rows>2&&numPinsPerRow>2;if(rows===1){let xStart=-((num_pins-1)/2)*p4;for(let i2=0;i2<num_pins;i2++){let pinNumber=i2+1,xoff=xStart+i2*p4,posKey=`${xoff},0`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(pinNumber,xoff,0)}}else if(useBGAStyle){let xStart=-((numPinsPerRow-1)/2)*p4,currentPin=1;for(let row=0;row<rows&¤tPin<=num_pins;row++)for(let col=0;col<numPinsPerRow&¤tPin<=num_pins;col++){let xoff=xStart+col*p4,yoff=row*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}}else{let xStart=-((numPinsPerRow-1)/2)*p4,currentPin=1,top=0,bottom=rows-1,left=0,right=numPinsPerRow-1;for(;currentPin<=num_pins&&top<=bottom&&left<=right;){for(let row=top;row<=bottom&¤tPin<=num_pins;row++){let xoff=xStart+left*p4,yoff=row*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}left++;for(let col=left;col<=right&¤tPin<=num_pins;col++){let xoff=xStart+col*p4,yoff=bottom*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}if(bottom--,left<=right){for(let row=bottom;row>=top&¤tPin<=num_pins;row--){let xoff=xStart+right*p4,yoff=row*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}right--}if(top<=bottom){for(let col=right;col>=left&¤tPin<=num_pins;col--){let xoff=xStart+col*p4,yoff=top*ySpacing,posKey=`${xoff},${yoff}`;if(usedPositions.has(posKey))throw new Error(`Overlap at ${posKey}`);usedPositions.add(posKey),addPin(currentPin++,xoff,yoff)}top++}}if(currentPin-1<num_pins)throw new Error(`Missing pins: assigned ${currentPin-1}, expected ${num_pins}`)}let refText=silkscreenRef(0,p4,.5);return{circuitJson:[...holes,refText],parameters}},sot563_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),w:external_exports.string().default("2.1mm"),h:external_exports.string().default("2.45mm"),p:external_exports.string().default("0.5mm"),pl:external_exports.string().default("0.675mm"),pw:external_exports.string().default("0.35mm"),string:external_exports.string().optional()}),sot563=raw_params=>{let parameters=sot563_def.parse({...raw_params,fn:"sot563"}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),pads=[];for(let i2=0;i2<6;i2++){let{x:x5,y:y5}=getSot563PadCoord(i2+1,w4,p4,pl3);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:h4/2},{x:w4/2,y:h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSot563PadCoord(1,w4,p4,pl3),pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1Position.x-pl3/2-.3,y:pin1Position.y},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y+.15},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y-.15},{x:pin1Position.x-pl3/2-.3,y:pin1Position.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,h4/2+.4,.25);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSot563PadCoord=(pn3,w4,p4,pl3)=>{let padCenterOffset=w4/2-pl3/2;return pn3<=3?{x:-padCenterOffset,y:p4-(pn3-1)*p4}:{x:padCenterOffset,y:-p4+(pn3-4)*p4}},ms012_def=extendSoicDef({p:"1.27mm",w:"3.9mm",legsoutside:!0}),ms012=raw_params=>{let parameters=ms012_def.parse({...raw_params,num_pins:8});return{circuitJson:soicWithoutParsing(parameters),parameters}},ms013_def=extendSoicDef({p:"1.27mm",w:"7.5mm",legsoutside:!0}),ms013=raw_params=>{let parameters=ms013_def.parse({...raw_params,num_pins:16});return{circuitJson:soicWithoutParsing(parameters),parameters}},sot723_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(3).default(3),w:external_exports.string().default("1.2mm"),h:external_exports.string().default("1.2mm"),pw:external_exports.string().default("0.40mm"),pl:external_exports.string().default("0.45mm"),p:external_exports.string().default("0.575mm")}),sot723=raw_params=>{let parameters=sot723_def.parse(raw_params),pad2=sot723WithoutParsing(parameters),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.2);return{circuitJson:[...pad2,silkscreenRefText],parameters}},getCcwSot723Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:p4,y:0}:pn3===2?{x:-p4,y:-.4}:{x:-p4,y:.4}},sot723WithoutParsing=parameters=>{let pads=[];for(let i2=0;i2<3;i2++){let{x:x5,y:y5}=getCcwSot723Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("2.36mm"),h:external_exports.string().default("1.22mm"),pl:external_exports.string().default("0.9mm"),pw:external_exports.string().default("1.2mm"),p:external_exports.string().default("3.30mm")}),sod123=raw_params=>{let parameters=sod_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/4+.4,.3);return{circuitJson:sodWithoutParsing(parameters).concat(silkscreenRefText),parameters}},getSodCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},axial_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("2.54mm"),id:length.optional().default("0.7mm"),od:length.optional().default("1.4mm")}),axial=raw_params=>{let parameters=axial_def.parse(raw_params),{p:p4,id:id2,od:od3}=parameters,plated_holes=[platedhole(1,-p4/2,0,id2,od3),platedhole(2,p4/2,0,id2,od3)],silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-p4/2+od3+id2/2,y:0},{x:p4/2-od3-id2/2,y:0}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,1.5,.5);return{circuitJson:[...plated_holes,silkscreenLine,silkscreenRefText],parameters}},generateCircleArcs=(centerX,centerY,radius,cut,cutHeight,segmentLength=.1)=>{let topArc=[],bottomArc=[],segments=Math.max(1,Math.ceil(Math.PI*radius/segmentLength)),thetaStep=Math.PI/segments;for(let i2=0;i2<=segments;i2++){let theta=i2*thetaStep,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||topArc.push({x:x5,y:y5})}for(let i2=0;i2<=segments;i2++){let theta=Math.PI+i2*thetaStep,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||bottomArc.push({x:x5,y:y5})}return{topArc,bottomArc}},radial_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("5mm"),id:length.optional().default("0.8mm"),od:length.optional().default("1.6mm"),ceramic:external_exports.boolean().optional(),electrolytic:external_exports.boolean().optional(),polarized:external_exports.boolean().optional()}),radial=raw_params=>{let parameters=radial_def.parse(raw_params),{p:p4,id:id2,od:od3}=parameters;id2===.8&&od3===1.6&&(parameters.id=p4===5?.8:p4*.25,parameters.od=p4===5?1.6:p4*.5);let plated_holes=[platedhole(1,-p4/2,0,parameters.id,parameters.od),platedhole(2,p4/2,0,parameters.id,parameters.od)],bodyR=p4+.1,{topArc,bottomArc}=generateCircleArcs(0,0,bodyR,parameters.od/2,parameters.od),strokeWidth=.02*p4,silkscreenBodyTop={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:topArc,stroke_width:strokeWidth,pcb_silkscreen_path_id:""},silkscreenBodyBottom={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:bottomArc,stroke_width:strokeWidth,pcb_silkscreen_path_id:""},silkscreenCenterLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:0,y:bodyR},{x:0,y:-bodyR}],stroke_width:strokeWidth,pcb_silkscreen_path_id:""},plusSize=.1*p4,plusX=-(p4+plusSize+.04*p4),plusY=bodyR-plusSize-.08*p4,plusHoriz={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:plusX-plusSize,y:plusY},{x:plusX+plusSize,y:plusY}],stroke_width:strokeWidth,pcb_silkscreen_path_id:""},plusVert={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:plusX,y:plusY-plusSize},{x:plusX,y:plusY+plusSize}],stroke_width:strokeWidth,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,bodyR+.12*p4,.1*p4),circuitJson=[...plated_holes,silkscreenBodyTop,silkscreenBodyBottom,silkscreenCenterLine,silkscreenRefText];return(parameters.electrolytic===!0||parameters.polarized===!0)&&circuitJson.push(plusHoriz,plusVert),{circuitJson,parameters}},silkscreenpath=(route,options={})=>({type:"pcb_silkscreen_path",layer:options.layer||"top",pcb_component_id:options.pcb_component_id||"",pcb_silkscreen_path_id:options.pcb_silkscreen_path_id||"",route,stroke_width:options.stroke_width||.1}),pushbutton_def=base_def.extend({fn:external_exports.literal("pushbutton"),w:length.default(4.5),h:length.default(6.5),id:length.default(1),od:length.default(1.2)}),pushbutton=raw_params=>{let parameters=pushbutton_def.parse(raw_params),width=parameters.w,height=parameters.h,holeDiameter=parameters.id,holes=[platedhole(1,-width/2,height/2,holeDiameter,holeDiameter*1.5),platedhole(2,-width/2,-height/2,holeDiameter,holeDiameter*1.5),platedhole(3,width/2,-height/2,holeDiameter,holeDiameter*1.5),platedhole(4,width/2,height/2,holeDiameter,holeDiameter*1.5)],silkscreenLines=[silkscreenpath([{x:-width/2,y:-height/2},{x:-width/2,y:height/2}]),silkscreenpath([{x:width/2,y:-height/2},{x:width/2,y:height/2}]),silkscreenpath([{x:-width/2,y:0},{x:-width/5,y:0},{x:width/5*1/Math.sqrt(2),y:height/8}]),silkscreenpath([{x:width/2,y:0},{x:width/5,y:0}])],silkscreenRefText=silkscreenRef(0,height/2+.4,.5);return{circuitJson:[...holes,...silkscreenLines,silkscreenRefText],parameters}},stampboard_def=base_def.extend({fn:external_exports.string(),w:length.default("22.58mm"),h:length.optional(),left:length.optional().default(20),right:length.optional().default(20),top:length.optional().default(2),bottom:length.optional().default(2),p:length.default(length.parse("2.54mm")),pw:length.default(length.parse("1.6mm")),pl:length.default(length.parse("2.4mm")),innerhole:external_exports.boolean().default(!1),innerholeedgedistance:length.default(length.parse("1.61mm")),silkscreenlabels:external_exports.boolean().default(!1),silkscreenlabelmargin:length.default(length.parse("0.1mm"))}),getHeight=parameters=>{let params=stampboard_def.parse(parameters);return params.left&¶ms.right?Math.max(params.left,params.right)*params.p:params.left?params.left*params.p:params.right?params.right*params.p:51},getTriangleDir=(x5,y5,side)=>{let routes=[];return side==="right"&&(routes=[{x:x5+1/2,y:y5},{x:x5-1/2,y:y5+.6/2},{x:x5-1/2,y:y5-.6/2},{x:x5+1/2,y:y5}]),side==="left"&&(routes=[{x:x5-1/2,y:y5},{x:x5+1/2,y:y5+.6/2},{x:x5+1/2,y:y5-.6/2},{x:x5-1/2,y:y5}]),side==="top"&&(routes=[{x:x5,y:y5+1/2},{x:x5-.6/2,y:y5-1/2},{x:x5+.6/2,y:y5-1/2},{x:x5,y:y5+1/2}]),side==="bottom"&&(routes=[{x:x5,y:y5-1/2},{x:x5-.6/2,y:y5+1/2},{x:x5+.6/2,y:y5+1/2},{x:x5,y:y5-1/2}]),routes},stampboard=raw_params=>{let params=stampboard_def.parse(raw_params),height=params.h??getHeight(params),rectpads=[],holes=[],pinLabels=[],routes=[],innerDiameter=1,outerDiameter=innerDiameter,totalPadsNumber=params.left+params.right+(params.bottom??0)+(params.top??0),textHalf=`pin${totalPadsNumber}`.length*.7/2;if(params.right){let yoff=-((params.right-1)/2)*params.p;for(let i2=0;i2<params.right;i2++){if(i2===0&&!params.left&&!params.bottom&&!params.silkscreenlabels&&(routes=getTriangleDir(params.w/2-params.pl*1.4,yoff+i2*params.p,"right")),rectpads.push(rectpad(i2+1+params.left+(params.bottom??0),params.w/2-params.pl/2,yoff+i2*params.p,params.pl,params.pw)),params.silkscreenlabels){let padIndex=i2+1+params.left+(params.bottom??0),label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:params.w/2-params.pl-(textHalf+params.silkscreenlabelmargin),y:yoff+i2*params.p},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"})}params.innerhole&&(holes.push(platedhole(i2+1+params.left+(params.bottom??0)+totalPadsNumber,params.w/2,yoff+i2*params.p,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+params.left+(params.bottom??0)+totalPadsNumber*2,params.w/2-params.innerholeedgedistance,yoff+i2*params.p,innerDiameter,outerDiameter)))}}if(params.left){let yoff=(params.left-1)/2*params.p;for(let i2=0;i2<params.left;i2++){if(i2===0&&!params.silkscreenlabels&&(routes=getTriangleDir(-params.w/2+params.pl*1.4,yoff-i2*params.p,"left")),rectpads.push(rectpad(i2+1,-params.w/2+params.pl/2,yoff-i2*params.p,params.pl,params.pw)),params.silkscreenlabels){let padIndex=i2+1,label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:-params.w/2+params.pl+(textHalf+params.silkscreenlabelmargin),y:yoff-i2*params.p},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"})}params.innerhole&&(holes.push(platedhole(i2+1+totalPadsNumber,-params.w/2,yoff-i2*params.p,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+totalPadsNumber*2,-params.w/2+params.innerholeedgedistance,yoff-i2*params.p,innerDiameter,outerDiameter)))}}if(params.top){let xoff=(params.top-1)/2*params.p;for(let i2=0;i2<params.top;i2++){if(i2===0&&!params.left&&!params.bottom&&!params.right&&!params.silkscreenlabels&&(routes=getTriangleDir(xoff-i2*params.p,height/2-params.pl*1.4,"top")),rectpads.push(rectpad(i2+1+params.left+params.right+(params.bottom??0),xoff-i2*params.p,height/2-params.pl/2,params.pw,params.pl)),params.silkscreenlabels){let padIndex=i2+1+params.left+params.right+(params.bottom??0),label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff-i2*params.p,y:height/2-params.pl-(textHalf+params.silkscreenlabelmargin)},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center",ccw_rotation:270})}params.innerhole&&(holes.push(platedhole(i2+1+params.left+params.right+(params.bottom??0)+totalPadsNumber,xoff-i2*params.p,height/2,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+params.left+params.right+(params.bottom??0)+totalPadsNumber*2,xoff-i2*params.p,height/2-params.innerholeedgedistance,innerDiameter,outerDiameter)))}}if(params.bottom){let xoff=-((params.bottom-1)/2)*params.p;for(let i2=0;i2<params.bottom;i2++){if(i2===0&&!params.left&&!params.silkscreenlabels&&(routes=getTriangleDir(xoff+i2*params.p,-height/2+params.pl*1.4,"bottom")),rectpads.push(rectpad(i2+1+params.left,xoff+i2*params.p,-height/2+params.pl/2,params.pw,params.pl)),params.silkscreenlabels){let padIndex=i2+1+params.left,label=`pin${padIndex}`;pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff+i2*params.p,y:-height/2+params.pl+(textHalf+params.silkscreenlabelmargin)},text:label,font_size:.7,font:"tscircuit2024",anchor_alignment:"center",ccw_rotation:90})}params.innerhole&&(holes.push(platedhole(i2+1+params.left+totalPadsNumber,xoff+i2*params.p,-height/2,innerDiameter,outerDiameter)),holes.push(platedhole(i2+1+params.left+totalPadsNumber*2,xoff+i2*params.p,-height/2+params.innerholeedgedistance,innerDiameter,outerDiameter)))}}let silkscreenTriangle={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_triangle_1",pcb_component_id:"2",route:routes,stroke_width:.1,layer:"top"},silkscreenPath={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_path_1",pcb_component_id:"1",route:[{x:-params.w/2,y:height/2},{x:params.w/2,y:height/2},{x:params.w/2,y:-height/2},{x:-params.w/2,y:-height/2},{x:-params.w/2,y:height/2}],stroke_width:.1,layer:"top"},silkscreenRefText=silkscreenRef(0,height/1.8,height/25);return{circuitJson:[...rectpads,...holes,...pinLabels,silkscreenPath,...params.silkscreenlabels?[]:[silkscreenTriangle],silkscreenRefText],parameters:params}},stampreceiver_def=base_def.extend({fn:external_exports.string(),w:length.default("22.58mm"),h:length.optional(),left:length.optional().default(20),right:length.optional().default(20),top:length.optional().default(2),bottom:length.optional().default(2),p:length.default(length.parse("2.54mm")),pw:length.default(length.parse("1.6mm")),pl:length.default(length.parse("3.2mm")),innerhole:external_exports.boolean().default(!1),innerholeedgedistance:length.default(length.parse("1.61mm"))}),getHeight2=parameters=>{let params=stampreceiver_def.parse(parameters);return params.left&¶ms.right?Math.max(params.left,params.right)*params.p:params.left?params.left*params.p:params.right?params.right*params.p:51},getTriangleDir2=(x5,y5,side,triangleHeight=1,triangleWidth=.6)=>{let halfHeight=triangleHeight/2,halfWidth=triangleWidth/2;return{left:[{x:x5+halfHeight,y:y5},{x:x5-halfHeight,y:y5+halfWidth},{x:x5-halfHeight,y:y5-halfWidth},{x:x5+halfHeight,y:y5}],right:[{x:x5-halfHeight,y:y5},{x:x5+halfHeight,y:y5+halfWidth},{x:x5+halfHeight,y:y5-halfWidth},{x:x5-halfHeight,y:y5}],top:[{x:x5,y:y5-halfHeight},{x:x5-halfWidth,y:y5+halfHeight},{x:x5+halfWidth,y:y5+halfHeight},{x:x5,y:y5-halfHeight}],bottom:[{x:x5,y:y5+halfHeight},{x:x5-halfWidth,y:y5-halfHeight},{x:x5+halfWidth,y:y5-halfHeight},{x:x5,y:y5+halfHeight}]}[side]},stampreceiver=raw_params=>{let params=stampreceiver_def.parse(raw_params),height=params.h??getHeight2(params),rectpads=[],pinLabels=[],holes=[],innerDiameter=1,outerDiameter=1.2,totalPadsNumber=params.left+params.right+(params.bottom??0)+(params.top??0),routes=[],padIndex=1;if(params.left){let yoff=(params.left-1)/2*params.p;for(let i2=0;i2<params.left;i2++)i2===0&&(routes=getTriangleDir2(-params.w/2-params.pl/2,yoff-i2*params.p,"left")),rectpads.push(rectpad(padIndex,-params.w/2+params.pl/2,yoff-i2*params.p,params.pl,params.pw)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:-params.w/2+params.pl/2-4.5,y:yoff-i2*params.p},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,-params.w/2+params.innerholeedgedistance,yoff-i2*params.p,innerDiameter,outerDiameter))}if(params.bottom){let xoff=(params.bottom-1)/2*params.p;for(let i2=params.bottom-1;i2>=0;i2--)rectpads.push(rectpad(padIndex,xoff-i2*params.p,-height/2+params.pl/2,params.pw,params.pl)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff-i2*params.p,y:-height/2+params.pl/2-3.2},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,xoff-i2*params.p,-height/2+params.innerholeedgedistance,innerDiameter,outerDiameter))}if(params.right){let yoff=-((params.right-1)/2)*params.p;for(let i2=0;i2<params.right;i2++)rectpads.push(rectpad(padIndex,params.w/2-params.pl/2,yoff+i2*params.p,params.pl,params.pw)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:params.w/2-params.pl/2+3.7,y:yoff+i2*params.p},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,params.w/2-params.innerholeedgedistance,yoff+i2*params.p,innerDiameter,outerDiameter))}if(params.top){let xoff=-((params.top-1)/2)*params.p;for(let i2=params.top-1;i2>=0;i2--)rectpads.push(rectpad(padIndex,xoff+i2*params.p,height/2-params.pl/2,params.pw,params.pl)),pinLabels.push({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pin_${padIndex}`,pcb_component_id:"1",layer:"top",anchor_position:{x:xoff+i2*params.p,y:height/2-params.pl/2+3.2},text:`pin${padIndex}`,font_size:.7,font:"tscircuit2024",anchor_alignment:"center"}),padIndex++,params.innerhole&&holes.push(platedhole(padIndex+totalPadsNumber,xoff+i2*params.p,height/2-params.innerholeedgedistance,innerDiameter,outerDiameter))}let silkscreenTriangle={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"1",pcb_component_id:"1",layer:"top",route:routes,stroke_width:.1},silkscreenPath={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_path_1",pcb_component_id:"1",route:[{x:-params.w/2-params.pl/3,y:height/2+params.pl/3},{x:params.w/2+params.pl/3,y:height/2+params.pl/3},{x:params.w/2+params.pl/3,y:-height/2-params.pl/3},{x:-params.w/2-params.pl/3,y:-height/2-params.pl/3},{x:-params.w/2-params.pl/3,y:height/2+params.pl/3}],stroke_width:.1,layer:"top"},silkscreenRefText=silkscreenRef(0,height/1.8,height/25);return{circuitJson:[...holes,...rectpads,...pinLabels,silkscreenPath,silkscreenTriangle,silkscreenRefText],parameters:params}},lqfp=parameters=>(parameters.legsoutside=!0,parameters.pl||(parameters.pl=1.5),parameters.pw||(parameters.pw=.3),quad(parameters)),breakoutheaders_def=base_def.extend({fn:external_exports.string(),w:length.default("10mm"),h:length.optional(),left:length.optional().default(20),right:length.optional().default(20),top:length.optional().default(0),bottom:length.optional().default(0),p:length.default(length.parse("2.54mm")),id:length.optional().default(length.parse("1mm")),od:length.optional().default(length.parse("1.5mm"))}),getHeight3=parameters=>{let params=breakoutheaders_def.parse(parameters);return params.left&¶ms.right?Math.max(params.left,params.right)*params.p:params.left?params.left*params.p:params.right?params.right*params.p:51},getTrianglePath=(x5,y5,side,triangleHeight=1,triangleWidth=.6)=>{let halfHeight=triangleHeight/2,halfWidth=triangleWidth/2;return{left:[{x:x5+halfHeight,y:y5},{x:x5-halfHeight,y:y5+halfWidth},{x:x5-halfHeight,y:y5-halfWidth},{x:x5+halfHeight,y:y5}],right:[{x:x5-halfHeight,y:y5},{x:x5+halfHeight,y:y5+halfWidth},{x:x5+halfHeight,y:y5-halfWidth},{x:x5-halfHeight,y:y5}],top:[{x:x5,y:y5-halfHeight},{x:x5-halfWidth,y:y5+halfHeight},{x:x5+halfWidth,y:y5+halfHeight},{x:x5,y:y5-halfHeight}],bottom:[{x:x5,y:y5+halfHeight},{x:x5-halfWidth,y:y5-halfHeight},{x:x5+halfWidth,y:y5-halfHeight},{x:x5,y:y5+halfHeight}]}[side]},breakoutheaders=raw_params=>{let params=breakoutheaders_def.parse(raw_params),height=params.h??getHeight3(params),holes=[],innerDiameter=params.id,outerDiameter=params.od,silkscreenTriangleRoutes=[];if(params.right){let yoff=-((params.right-1)/2)*params.p;for(let i2=0;i2<params.right;i2++)i2===0&&!params.left&&!params.bottom&&(silkscreenTriangleRoutes=getTrianglePath(params.w/2+outerDiameter*1.4,yoff+i2*params.p,"right")),holes.push(platedhole(i2+1+params.left+(params.bottom??0),params.w/2,yoff+i2*params.p,innerDiameter,outerDiameter))}if(params.left){let yoff=-((params.left-1)/2)*params.p;for(let i2=0;i2<params.left;i2++)i2===params.left-1&&(silkscreenTriangleRoutes=getTrianglePath(-params.w/2-outerDiameter*1.4,yoff+i2*params.p,"left")),holes.push(platedhole(i2+1,-params.w/2,yoff+i2*params.p,innerDiameter,outerDiameter))}if(params.top){let xoff=-((params.top-1)/2)*params.p;for(let i2=0;i2<params.top;i2++)i2===params.top-1&&!params.left&&!params.bottom&&!params.right&&(silkscreenTriangleRoutes=getTrianglePath(xoff+i2*params.p,height/2+outerDiameter*1.4,"top")),holes.push(platedhole(i2+1+params.right+(params.bottom??0)+params.left,xoff+i2*params.p,height/2,innerDiameter,outerDiameter))}if(params.bottom){let xoff=-((params.bottom-1)/2)*params.p;for(let i2=0;i2<params.bottom;i2++)i2===0&&!params.left&&(silkscreenTriangleRoutes=getTrianglePath(xoff+i2*params.p,-height/2-outerDiameter*1.4,"bottom")),holes.push(platedhole(i2+1+params.left,xoff+i2*params.p,-height/2,innerDiameter,outerDiameter))}let silkscreenTriangle={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"1",pcb_component_id:"1",layer:"top",route:silkscreenTriangleRoutes,stroke_width:.1},silkscreenPath={type:"pcb_silkscreen_path",pcb_silkscreen_path_id:"pcb_silkscreen_path_1",pcb_component_id:"1",route:[{x:-params.w/2-outerDiameter,y:height/2+outerDiameter},{x:params.w/2+outerDiameter,y:height/2+outerDiameter},{x:params.w/2+outerDiameter,y:-height/2-outerDiameter},{x:-params.w/2-outerDiameter,y:-height/2-outerDiameter},{x:-params.w/2-outerDiameter,y:height/2+outerDiameter}],stroke_width:.1,layer:"top"},silkscreenRefText=silkscreenRef(0,height/1.7,height/25);return{circuitJson:[...holes,silkscreenPath,silkscreenRefText,silkscreenTriangle],parameters:params}},generate_u_curve=(centerX,centerY,radius,direction2)=>Array.from({length:25},(_5,i2)=>{let theta=i2/24*Math.PI-Math.PI/2;return{x:centerX+(direction2==="right"?1:-1)*Math.cos(theta)*radius,y:centerY+Math.sin(theta)*radius}}),hc49_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("4.88mm"),id:length.optional().default("0.8mm"),od:length.optional().default("1.5mm"),w:length.optional().default("5.6mm"),h:length.optional().default("3.5mm")}),hc49=raw_params=>{let parameters=hc49_def.parse(raw_params),{p:p4,id:id2,od:od3,w:w4,h:h4}=parameters,radius=h4/2,plated_holes=[platedhole(1,-p4/2,0,id2,od3),platedhole(2,p4/2,0,id2,od3)],leftCurve=generate_u_curve(-w4/2,0,radius,"left"),rightCurve=generate_u_curve(w4/2,0,radius,"right"),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[...leftCurve,...leftCurve.slice(1).reverse(),{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2},...rightCurve,{x:w4/2,y:h4/2},{x:-w4/2,y:h4/2}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,p4/4,.5);return{circuitJson:[...plated_holes,silkscreenBody,silkscreenRefText],parameters}},pad_def=base_def.extend({w:length,h:length}),pad=params=>{let{w:w4,h:h4}=params,width=mm(w4),height=mm(h4);return{circuitJson:[rectpad(1,0,0,width,height),silkscreenRef(0,height/2+.5,.2)],parameters:params}},platedHolePill=(pn3,x5,y5,holeDiameter,outerWidth,outerHeight)=>({pcb_plated_hole_id:"",type:"pcb_plated_hole",shape:"pill",x:x5,y:y5,outer_width:mm(outerWidth),outer_height:mm(outerHeight),hole_width:mm(holeDiameter),hole_height:mm(holeDiameter),pcb_port_id:"",layers:["top","bottom"],port_hints:[pn3.toString()],ccw_rotation:0}),to92_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(2)]).default(3),p:external_exports.string().default("1.27mm"),id:external_exports.string().default("0.72mm"),od:external_exports.string().default("0.95mm"),w:external_exports.string().default("4.5mm"),h:external_exports.string().default("4.5mm"),inline:external_exports.boolean().default(!1),string:external_exports.string().optional()}),generateSemicircle=(centerX,centerY,radius)=>Array.from({length:25},(_5,i2)=>{let theta=i2/24*Math.PI;return{x:centerX+Math.cos(theta)*radius,y:centerY+Math.sin(theta)*radius}}),to92=raw_params=>{let match2=raw_params.string?.match(/^to92_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=to92_def.parse({...raw_params,num_pins:numPins}),{p:p4,id:id2,od:od3,w:w4,h:h4,inline}=parameters,holeY=Number.parseFloat(h4)/2,padSpacing7=Number.parseFloat(p4),holeDia=Number.parseFloat(id2),padDia=Number.parseFloat(od3),padWidth=padDia,padHeight=padDia*(1.5/1.05),platedHoles=[];if(parameters.num_pins===3)inline?platedHoles=[platedHoleWithRectPad({pn:1,x:-padSpacing7,y:holeY-padSpacing7,holeDiameter:holeDia,rectPadWidth:padDia,rectPadHeight:padHeight}),platedHolePill(2,0,holeY-padSpacing7,holeDia,padWidth,padHeight),platedHolePill(3,padSpacing7,holeY-padSpacing7,holeDia,padWidth,padHeight)]:platedHoles=[platedHoleWithRectPad({pn:1,x:-padSpacing7,y:holeY-padSpacing7,holeDiameter:holeDia,rectPadWidth:padDia,rectPadHeight:padDia}),platedhole(2,0,holeY,holeDia,padDia),platedhole(3,padSpacing7,holeY-padSpacing7,holeDia,padDia)];else if(parameters.num_pins===2)platedHoles=[platedHoleWithRectPad({pn:1,x:-padSpacing7,y:holeY-padSpacing7,holeDiameter:holeDia,rectPadWidth:padWidth,rectPadHeight:padHeight}),platedHolePill(2,padSpacing7,holeY-padSpacing7,holeDia,padWidth,padHeight)];else throw new Error("Invalid number of pins for TO-92");let radius=Number.parseFloat(w4)/2,semicircle=generateSemicircle(0,holeY,radius),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[...semicircle,{x:-radius,y:0},{x:radius,y:0},semicircle[0]],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,holeY+1,.5);return{circuitJson:[...platedHoles,silkscreenBody,silkscreenRefText],parameters}},sod_def2=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("2.15mm"),h:external_exports.string().default("1.20mm"),pl:external_exports.string().default("0.5mm"),pw:external_exports.string().default("0.6mm"),p:external_exports.string().default("1.4mm")}),sod523=raw_params=>{let parameters=sod_def2.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing2(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords2=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing2=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords2({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sop8_def=extendSoicDef({w:"7.05mm",p:"1.27mm",pw:"0.65mm",pl:"1.975mm"}),sop8=raw_params=>{let parameters=sop8_def.parse(raw_params),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSoicCoords({num_pins:parameters.num_pins,pn:i2+1,w:parameters.w,p:parameters.p??1.27,pl:parameters.pl,widthincludeslegs:!0});pads.push(rectpad(i2+1,x5,y5,parameters.pl??"1.5mm",parameters.pw??"0.6mm"))}let sh3=(parameters.num_pins/2-1)*parameters.p+parameters.pw,silkscreenRefText=silkscreenRef(0,sh3/2+1,sh3/12),silkscreenLine={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",type:"pcb_silkscreen_path",route:[{x:-parameters.w/3,y:sh3/2+.4},{x:parameters.w/3,y:sh3/2+.4}],stroke_width:.1};return{circuitJson:[...pads,silkscreenRefText,silkscreenLine],parameters}},sod80_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("5.0mm"),h:external_exports.string().default("2.30mm"),pl:external_exports.string().default("1.25mm"),pw:external_exports.string().default("2mm"),p:external_exports.string().default("3.75mm")}),sod80=raw_params=>{let parameters=sod80_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+1,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.5,y:length.parse(parameters.h)/2+.5},{x:-length.parse(parameters.w)/2-.5,y:length.parse(parameters.h)/2+.5},{x:-length.parse(parameters.w)/2-.5,y:-length.parse(parameters.h)/2-.5},{x:length.parse(parameters.p)/2+.5,y:-length.parse(parameters.h)/2-.5}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sod80WithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getsod80Coords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sod80WithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getsod80Coords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def3=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.4mm"),h:external_exports.string().default("2.1mm"),pl:external_exports.string().default("1.2mm"),pw:external_exports.string().default("1.2mm"),p:external_exports.string().default("2.9mm")}),sod123w=raw_params=>{let parameters=sod_def3.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing3(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords3=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing3=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords3({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def4=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.30mm"),h:external_exports.string().default("1.80mm"),pl:external_exports.string().default("0.60mm"),pw:external_exports.string().default("0.45mm"),p:external_exports.string().default("2.1mm")}),sod323=raw_params=>{let parameters=sod_def4.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing4(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords4=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing4=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords4({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def5=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.4mm"),h:external_exports.string().default("0.9mm"),pl:external_exports.string().default("0.36mm"),pw:external_exports.string().default("0.25mm"),p:external_exports.string().default("0.85mm")}),sod923=raw_params=>{let parameters=sod_def5.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.15,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.15,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.15,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2+.15,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing5(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords5=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing5=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords5({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def6=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.3mm"),h:external_exports.string().default("0.9mm"),pl:external_exports.string().default("0.4mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("0.7mm")}),sod882=raw_params=>{let parameters=sod_def6.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)+.1,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.2,y:length.parse(parameters.h)/2+.2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2+.2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2-.2},{x:length.parse(parameters.p)/2+.2,y:-length.parse(parameters.h)/2-.2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing6(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords6=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing6=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords6({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def7=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3,05mm"),h:external_exports.string().default("1.65mm"),pl:external_exports.string().default("0.6mm"),pw:external_exports.string().default("0.6mm"),pad_spacing:external_exports.string().default("2.2mm")}),sod323f=raw_params=>{let parameters=sod_def7.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.pad_spacing)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.pad_spacing)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing7(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords7=parameters=>{let{pn:pn3,pad_spacing}=parameters;return pn3===1?{x:-pad_spacing/2,y:0}:{x:pad_spacing/2,y:0}},sodWithoutParsing7=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords7({pn:i2,pad_spacing:Number.parseFloat(parameters.pad_spacing)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def8=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.4mm"),h:external_exports.string().default("2.1mm"),pl:external_exports.string().default("1.10mm"),pw:external_exports.string().default("1.10mm"),p:external_exports.string().default("2.8mm")}),sod123f=raw_params=>{let parameters=sod_def8.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing8(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords8=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing8=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords8({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod123FL_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.4mm"),h:external_exports.string().default("2.1mm"),pl:external_exports.string().default("0.91mm"),pw:external_exports.string().default("1.22mm"),p:external_exports.string().default("3.146mm")}),sod123fl=raw_params=>{let parameters=sod123FL_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing9(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords9=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing9=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords9({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def9=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.80mm"),h:external_exports.string().default("1.00mm"),pl:external_exports.string().default("0.66mm"),pw:external_exports.string().default("0.5mm"),p:external_exports.string().default("0.8mm")}),sod723=raw_params=>{let parameters=sod_def9.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing10(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords10=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing10=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords10({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def10=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("6.2mm"),h:external_exports.string().default("3.4mm"),pl:external_exports.string().default("1.4mm"),pw:external_exports.string().default("2.1mm"),p:external_exports.string().default("4.4mm")}),sod128=raw_params=>{let parameters=sod_def10.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.4,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing11(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords11=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing11=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords11({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sot89_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(5)]).default(3),w:external_exports.string().default("4.20mm"),h:external_exports.string().default("4.80mm"),pl:external_exports.string().default("1.3mm"),pw:external_exports.string().default("0.9mm"),p:external_exports.string().default("1.5mm"),string:external_exports.string().optional()}),sot89_3=parameters=>{let pads=[],padGap=Number.parseFloat(parameters.p),padWidth=Number.parseFloat(parameters.pw),length62=Number.parseFloat(parameters.w),padHeight=Number.parseFloat(parameters.pl),centerExtra=.175,outerPadXShift=(padHeight-(padHeight+centerExtra))/2;pads.push(rectpad(1,-length62/2+outerPadXShift,padGap,padHeight,padWidth),rectpad(2,-length62/2,0,padHeight+centerExtra,padWidth),rectpad(3,-length62/2+outerPadXShift,-padGap,padHeight,padWidth));let silkscreenRefText=silkscreenRef(0,0,.3),width=Number.parseFloat(parameters.w)/2-1,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot89_5=parameters=>{let pads=[],padGap=Number.parseFloat(parameters.p),padWidth=Number.parseFloat(parameters.pw),length62=Number.parseFloat(parameters.w);pads.push(rectpad(1,-1.85,-1.5,1.5,.7),rectpad(2,-1.85,1.5,1.5,.7),rectpad(3,0,0,.8,2),rectpad(4,1.85,-1.5,1.5,.7),rectpad(5,1.85,1.5,1.5,.7));let silkscreenRefText=silkscreenRef(0,Number.parseFloat(parameters.h)/2+.5,.3),width=Number.parseFloat(parameters.w)/2-1,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot89=raw_params=>{let match2=raw_params.string?.match(/^sot89_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=sot89_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot89_3(parameters),parameters};if(parameters.num_pins===5)return{circuitJson:sot89_5(parameters),parameters};throw new Error("Invalid number of pins for SOT89")},to220_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("5.0mm"),id:length.optional().default("1.0mm"),od:length.optional().default("1.9mm"),w:length.optional().default("13mm"),h:length.optional().default("7mm"),num_pins:external_exports.number().optional(),string:external_exports.string().optional()}),to220=raw_params=>{let parameters=to220_def.parse(raw_params),{fn:fn3,id:id2,od:od3,w:w4,h:h4,string:string3}=parameters,numPins=Number.parseInt(string3?.split("_")[1]??"3"),holeY=-1,halfWidth=w4/2,halfHeight=h4/2,minPitch=2.5,maxHoleWidth=w4*.4,computedPitch=Math.max(minPitch,maxHoleWidth/(numPins-1)),plated_holes=Array.from({length:numPins},(_5,i2)=>{let x5=numPins%2===0?(i2-numPins/2+.5)*computedPitch:(i2-Math.floor(numPins/2))*computedPitch;return platedhole(i2+1,x5,holeY,id2,od3)}),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-halfWidth,y:-halfHeight},{x:halfWidth,y:-halfHeight},{x:halfWidth,y:halfHeight},{x:-halfWidth,y:halfHeight},{x:-halfWidth,y:-halfHeight}],stroke_width:.1,pcb_silkscreen_path_id:""},yLine=-halfHeight+2*h4/3,horizontalLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-halfWidth,y:yLine},{x:halfWidth,y:yLine}],stroke_width:.1,pcb_silkscreen_path_id:""},verticalLines=[{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/6,y:yLine},{x:-w4/6,y:halfHeight}],stroke_width:.1,pcb_silkscreen_path_id:""},{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:w4/6,y:yLine},{x:w4/6,y:halfHeight}],stroke_width:.1,pcb_silkscreen_path_id:""}],silkscreenRefText=silkscreenRef(0,h4/2+.6,.5);return{circuitJson:[...plated_holes,silkscreenBody,horizontalLine,...verticalLines,silkscreenRefText],parameters:{...parameters,p:computedPitch}}},minimelf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("5.40mm"),h:external_exports.string().default("2.30mm"),pl:external_exports.string().default("1.30mm"),pw:external_exports.string().default("1.70mm"),p:external_exports.string().default("3.5mm")}),minimelf=raw_params=>{let parameters=minimelf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.4,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:miniMelfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getMiniMelfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},miniMelfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getMiniMelfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod_def11=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("1.90mm"),h:external_exports.string().default("1.33mm"),pl:external_exports.string().default("0.5mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("0.8mm")}),sod882d=raw_params=>{let parameters=sod_def11.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)+.1,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2+.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2+.1,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing12(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords12=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing12=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords12({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},melf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("7.0mm"),h:external_exports.string().default("3.35mm"),pl:external_exports.string().default("1.50mm"),pw:external_exports.string().default("2.70mm"),p:external_exports.string().default("4.8mm")}),melf=raw_params=>{let parameters=melf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:melfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getMelfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},melfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getMelfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},micromelf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.0mm"),h:external_exports.string().default("1.80mm"),pl:external_exports.string().default("0.80mm"),pw:external_exports.string().default("1.20mm"),p:external_exports.string().default("1.6mm")}),micromelf=raw_params=>{let parameters=micromelf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:microMelfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getMicroMelfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},microMelfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getMicroMelfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sma_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("7.10mm"),h:external_exports.string().default("3.40mm"),pl:external_exports.string().default("2.45mm"),pw:external_exports.string().default("1.80mm"),p:external_exports.string().default("4.05mm")}),sma=raw_params=>{let parameters=sma_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.5,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.5,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smaWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmaCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smaWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmaCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},smf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("4.80mm"),h:external_exports.string().default("2.10mm"),pl:external_exports.string().default("1.30mm"),pw:external_exports.string().default("1.40mm"),p:external_exports.string().default("2.9mm")}),smf=raw_params=>{let parameters=smf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},smb_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("7.30mm"),h:external_exports.string().default("4.40mm"),pl:external_exports.string().default("2.50mm"),pw:external_exports.string().default("2.30mm"),p:external_exports.string().default("4.30mm")}),smb=raw_params=>{let parameters=smb_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.1,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smbWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmbCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smbWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmbCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},smc_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("10.70mm"),h:external_exports.string().default("6.60mm"),pl:external_exports.string().default("3.30mm"),pw:external_exports.string().default("2.50mm"),p:external_exports.string().default("6.80mm")}),smc=raw_params=>{let parameters=smc_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,3,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2-.8},{x:-length.parse(parameters.w)/2-.8,y:length.parse(parameters.h)/2-.8},{x:-length.parse(parameters.w)/2-.8,y:-length.parse(parameters.h)/2+.8},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2+.8}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smcWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmcCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smcWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmcCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sot223_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(4),w:external_exports.string().default("8.50mm"),h:external_exports.string().default("6.90mm"),pl:external_exports.string().default("2mm"),pw:external_exports.string().default("1.5mm"),p:external_exports.string().default("2.30mm"),string:external_exports.string().optional()}),sot223=raw_params=>{let match2=raw_params.string?.match(/^sot223_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):4;if(numPins===8){let parameters2=sot223_8_def.parse({...raw_params,num_pins:numPins});return{circuitJson:soicWithoutParsing(parameters2),parameters:parameters2}}let parameters=sot223_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===4)return{circuitJson:sot223_4(parameters),parameters};if(parameters.num_pins===5)return{circuitJson:sot223_5(parameters),parameters};if(parameters.num_pins===6)return{circuitJson:sot223_6(parameters),parameters};throw new Error("Invalid number of pins")},get2CcwSot223Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-w4/2+1.1,y:p4}:pn3===2?{x:-w4/2+1.1,y:0}:pn3===3?{x:-w4/2+1.1,y:-p4}:{x:w4/2-1.1,y:0}},sot223_4=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=get2CcwSot223Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)}),pinWidth=i2===3?3.8:Number.parseFloat(parameters.pw);pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),pinWidth))}let silkscreenRefText=silkscreenRef(0,0,.3),width=Number.parseFloat(parameters.w)/2-2.4,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot223_8_def=extendSoicDef({p:"0.90mm",w:"2.8mm",legsoutside:!0}),get2CcwSot2235Coords=parameters=>{let{p:p4,h:h4,pn:pn3,w:w4}=parameters;if(pn3===1)return{x:-w4/2+1.2,y:p4/2+p4};if(pn3===2)return{x:-w4/2+1.2,y:p4/2};if(pn3===3)return{x:-w4/2+1.2,y:-p4/2};if(pn3===4)return{x:-w4/2+1.2,y:-p4/2-p4};if(pn3===5)return{x:w4/2-1,y:0};throw new Error("Invalid pin number")},sot223_5=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=get2CcwSot2235Coords({h:Number.parseFloat(parameters.h),p:1.5,pn:i2,w:Number.parseFloat(parameters.w)}),pinWidth=Number.parseFloat(parameters.pw),pinLength=Number.parseFloat(parameters.pl);i2===5?(pinWidth=3.4,pinLength=1.8):(pinWidth=1,pinLength=2.2),pads.push(rectpad(i2,x5,y5,pinLength,pinWidth))}let width=Number.parseFloat(parameters.w)/2-2.4,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenRefText=silkscreenRef(0,0,.3);return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},get2CcwSot2236Coords=parameters=>{let{p:p4,h:h4,pn:pn3,w:w4}=parameters;if(pn3===1)return{x:-w4/2+1.2,y:2*p4};if(pn3===2)return{x:-w4/2+1.2,y:p4};if(pn3===3)return{x:-w4/2+1.2,y:0};if(pn3===4)return{x:-w4/2+1.2,y:-p4};if(pn3===5)return{x:-w4/2+1.2,y:-2*p4};if(pn3===6)return{x:w4/2-1.175,y:0};throw new Error("Invalid pin number")},sot223_6=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=get2CcwSot2236Coords({h:Number.parseFloat(parameters.h),p:1.3,pn:i2,w:8.7}),pinWidth=Number.parseFloat(parameters.pw),pinLength=Number.parseFloat(parameters.pl);i2===6?(pinWidth=3.4,pinLength=2.15):(pinWidth=.6,pinLength=2.2),pads.push(rectpad(i2,x5,y5,pinLength,pinWidth))}let width=Number.parseFloat(parameters.w)/2-2.4,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width,y:height},{x:width,y:height/2+.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width,y:-height},{x:width,y:-height/2-.5}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenRefText=silkscreenRef(0,0,.3);return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},sot23w_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),w:external_exports.string().default("3.40mm"),h:external_exports.string().default("3.30mm"),pl:external_exports.string().default("1mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("1.2mm"),string:external_exports.string().optional()}),sot23w=raw_params=>{let match2=raw_params.string?.match(/^sot23w_(\d+)/),numPins=match2?Number.parseInt(match2[1],3):3,parameters=sot23w_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot23w_3(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot23wCoords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-p4,y:.95}:pn3===2?{x:-p4,y:-.95}:{x:p4,y:0}},sot23w_3=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot23wCoords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let silkscreenRefText=silkscreenRef(0,Number.parseInt(parameters.h)/2+1,.3),width=Number.parseFloat(parameters.w)/2-1,height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height},{x:width+.3,y:height},{x:width+.3,y:height/2}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height},{x:width+.3,y:-height},{x:width+.3,y:-height/2}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},to92s_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(2)]).default(3),p:external_exports.string().default("1.27mm"),id:external_exports.string().default("0.72mm"),od:external_exports.string().default("0.95mm"),w:external_exports.string().default("2.5mm"),h:external_exports.string().default("4.2mm"),string:external_exports.string().optional()}),to92s_3=parameters=>{let{p:p4,id:id2,od:od3,w:w4,h:h4}=parameters,holeY=Number.parseFloat(h4)/2,padSpacing7=Number.parseFloat(p4);return[platedhole(1,-padSpacing7,holeY-padSpacing7,id2,od3),platedhole(2,0,holeY-padSpacing7,id2,od3),platedhole(3,padSpacing7,holeY-padSpacing7,id2,od3)]},to92s_2=parameters=>{let{p:p4,id:id2,od:od3,h:h4}=parameters,holeY=Number.parseFloat(h4)/2,padSpacing7=Number.parseFloat(p4);return[platedhole(1,-padSpacing7,holeY-padSpacing7,id2,od3),platedhole(2,padSpacing7,holeY-padSpacing7,id2,od3)]},to92s=raw_params=>{let match2=raw_params.string?.match(/^to92s_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=to92s_def.parse({...raw_params,num_pins:numPins}),platedHoles=[];if(parameters.num_pins===3)platedHoles=to92s_3(parameters);else if(parameters.num_pins===2)platedHoles=to92s_2(parameters);else throw new Error("Invalid number of pins for TO-92");let holeY=Number.parseFloat(parameters.h)/2,padSpacing7=Number.parseFloat(parameters.p),silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-holeY,y:holeY-padSpacing7},{x:-1.9,y:0},{x:1.9,y:0},{x:holeY,y:holeY-padSpacing7},{x:1.5,y:Number.parseFloat(parameters.h)/2+.5},{x:-1.5,y:Number.parseFloat(parameters.h)/2+.5},{x:-holeY,y:holeY-padSpacing7}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,holeY+1,.5);return{circuitJson:[...platedHoles,silkscreenBody,silkscreenRefText],parameters}},jst_def=base_def.extend({fn:external_exports.string(),p:length.optional(),id:length.optional(),pw:length.optional(),pl:length.optional(),w:length.optional(),h:length.optional(),sh:external_exports.boolean().optional().describe('JST SH (Surface-mount) connector family. SH stands for "Super High-density".'),ph:external_exports.boolean().optional().describe('JST PH (Through-hole) connector family. PH stands for "Pin Header".'),string:external_exports.string().optional()}),variantDefaults={ph:{p:length.parse("2.2mm"),id:length.parse("0.70mm"),pw:length.parse("1.20mm"),pl:length.parse("1.20mm"),w:length.parse("6mm"),h:length.parse("5mm")},sh:{p:length.parse("1mm"),pw:length.parse("0.6mm"),pl:length.parse("1.55mm"),w:length.parse("5.8mm"),h:length.parse("7.8mm")}};function getVariant(params){return params.sh?"sh":(params.ph,"ph")}function generatePads(variant,numPins,p4,id2,pw,pl3){let pads=[];if(variant==="ph"){let startX=-((numPins-1)/2)*p4;for(let i2=0;i2<numPins;i2++){let x5=startX+i2*p4;pads.push(platedHoleWithRectPad({pn:i2+1,x:x5,y:2,holeDiameter:id2,rectPadWidth:pw,rectPadHeight:pl3}))}}else{let startX=-((numPins-1)/2)*p4;for(let i2=0;i2<numPins;i2++){let x5=startX+i2*p4;pads.push(rectpad(i2+1,x5,-1.325,pw,pl3))}let sideOffset=(numPins-1)/2*p4+1.3;pads.push(rectpad(numPins+1,-sideOffset,1.22,1.2,1.8)),pads.push(rectpad(numPins+2,sideOffset,1.22,1.2,1.8))}return pads}function generateSilkscreenBody(variant,w4,h4){return variant==="ph"?{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-3,y:3},{x:3,y:3},{x:3,y:-2},{x:-3,y:-2},{x:-3,y:3}],stroke_width:.1,pcb_silkscreen_path_id:""}:{type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[],stroke_width:.1,pcb_silkscreen_path_id:""}}var jst=raw_params=>{let params=jst_def.parse(raw_params),variant=getVariant(params),defaults=variantDefaults[variant],p4=params.p??defaults.p,id2=params.id??defaults.id,pw=params.pw??defaults.pw,pl3=params.pl??defaults.pl,w4=params.w??defaults.w,h4=params.h??defaults.h,numPins,explicitNumPins=raw_params.num_pins;typeof explicitNumPins=="number"&&(numPins=explicitNumPins);let match2=(typeof raw_params.string=="string"?raw_params.string:"").match(/(?:^|_)jst(\d+)(?:_|$)/);if(match2&&match2[1]){let parsed=parseInt(match2[1],10);Number.isNaN(parsed)||(numPins=parsed)}if(typeof numPins!="number")throw new Error(`JST requires an explicit pin count (e.g. jst6_sh or .jst(6))${params.string?`, from string "${params.string}"`:""}`);let pads=generatePads(variant,numPins,p4,id2,pw,pl3),silkscreenBody=generateSilkscreenBody(variant,w4,h4),silkscreenRefText=silkscreenRef(0,h4/2+1,.5);return{circuitJson:[...pads,silkscreenBody,silkscreenRefText],parameters:{...params,p:p4,id:id2,pw,pl:pl3,w:w4,h:h4,num_pins:numPins,sh:variant==="sh",ph:variant==="ph"}}},sod_def12=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.30mm"),h:external_exports.string().default("1.70mm"),pl:external_exports.string().default("0.80mm"),pw:external_exports.string().default("1mm"),p:external_exports.string().default("1.90mm")}),sod110=raw_params=>{let parameters=sod_def12.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)/2+.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing13(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords13=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},sodWithoutParsing13=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords13({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},getDefaultValues=num_pins=>{switch(num_pins){case 8:return{w:"3.06mm",h:"3.14mm",p:"0.65mm",pl:"1.6mm",pw:"0.5mm"};case 10:return{w:"3.10mm",h:"3.33mm",p:"0.5mm",pl:"1.45mm",pw:"0.3mm"};default:return{w:"3.06mm",h:"3.14mm",p:"0.65mm",pl:"1.6mm",pw:"0.5mm"}}},vssop_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(8),external_exports.literal(10)]).default(8),w:external_exports.string().optional(),h:external_exports.string().optional(),p:external_exports.string().optional(),pl:external_exports.string().optional(),pw:external_exports.string().optional(),string:external_exports.string().optional()}),vssop=raw_params=>{let parameters=vssop_def.parse(raw_params),defaults=getDefaultValues(parameters.num_pins),w4=length.parse(parameters.w||defaults.w),h4=length.parse(parameters.h||defaults.h),p4=length.parse(parameters.p||defaults.p),pl3=length.parse(parameters.pl||defaults.pl),pw=length.parse(parameters.pw||defaults.pw),pads=[],half=parameters.num_pins/2;for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getVssopPadCoord(parameters.num_pins,i2+1,w4,p4),logical_pn=i2<half?i2+1:parameters.num_pins-(i2-half);pads.push(rectpad(logical_pn,x5,y5,pl3,pw))}let silkscreenBoxWidth=w4,silkscreenBoxHeight=h4,silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getVssopPadCoord(parameters.num_pins,1,silkscreenBoxWidth,p4),pin1MarkerPosition={x:pin1Position.x-.8,y:pin1Position.y},pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,silkscreenBoxHeight/2+.5,.3);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getVssopPadCoord=(pinCount,pn3,w4,p4)=>{let half=pinCount/2,rowIndex=(pn3-1)%half,col=pn3<=half?-1:1,row=(half-1)/2-rowIndex;return{x:col*length.parse(pinCount===8?"1.8mm":"2.2mm"),y:row*p4}},getDefaultValues2=num_pins=>{switch(num_pins){case 10:return{w:"3.10mm",h:"3.32mm",p:"0.5mm",pl:"1.63mm",pw:"0.33mm"};case 12:return{w:"3mm",h:"4mm",p:"0.65mm",pl:"0.88mm",pw:"0.4mm"};case 16:return{w:"3.10mm",h:"4mm",p:"0.5mm",pl:"0.88mm",pw:"0.3mm"};default:return{w:"3.10mm",h:"3.32mm",p:"0.65mm",pl:"1.63mm",pw:"0.4mm"}}},msop_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(8),external_exports.literal(10),external_exports.literal(12),external_exports.literal(16)]).default(8),w:external_exports.string().optional(),h:external_exports.string().optional(),p:external_exports.string().optional(),pl:external_exports.string().optional(),pw:external_exports.string().optional(),string:external_exports.string().optional()}),getMsopCoords=(pinCount,pn3,w4,p4)=>{let half=pinCount/2,rowIndex=(pn3-1)%half,col=pn3<=half?-1:1,row=(half-1)/2-rowIndex;return{x:col*length.parse("2mm"),y:row*p4}},msop=raw_params=>{let parameters=msop_def.parse(raw_params),defaults=getDefaultValues2(parameters.num_pins),w4=length.parse(parameters.w||defaults.w),h4=length.parse(parameters.h||defaults.h),p4=length.parse(parameters.p||defaults.p),pl3=length.parse(parameters.pl||defaults.pl),pw=length.parse(parameters.pw||defaults.pw),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getMsopCoords(parameters.num_pins,i2+1,w4,p4);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenBoxWidth=w4,silkscreenBoxHeight=h4,silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getMsopCoords(parameters.num_pins,1,silkscreenBoxWidth,p4),pin1MarkerPosition={x:pin1Position.x-.8,y:pin1Position.y},pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,silkscreenBoxHeight/2+.5,.3);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},sod323w_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.8mm"),h:external_exports.string().default("1.65mm"),pl:external_exports.string().default("1.2mm"),pw:external_exports.string().default("1.2mm"),pad_spacing:external_exports.string().default("2.6mm")}),sod323w=raw_params=>{let parameters=sod323w_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.pad_spacing)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.pad_spacing)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing14(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords14=parameters=>{let{pn:pn3,pad_spacing}=parameters;return pn3===1?{x:-pad_spacing/2,y:0}:{x:pad_spacing/2,y:0}},sodWithoutParsing14=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords14({pn:i2,pad_spacing:Number.parseFloat(parameters.pad_spacing)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sod323FL_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("3.20mm"),h:external_exports.string().default("1.65mm"),pl:external_exports.string().default("0.8mm"),pw:external_exports.string().default("0.9mm"),pad_spacing:external_exports.string().default("2.1mm")}),sod323fl=raw_params=>{let parameters=sod323FL_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h),.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.pad_spacing)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.2,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.pad_spacing)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:sodWithoutParsing15(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSodCoords15=parameters=>{let{pn:pn3,pad_spacing}=parameters;return pn3===1?{x:-pad_spacing/2,y:0}:{x:pad_spacing/2,y:0}},sodWithoutParsing15=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSodCoords15({pn:i2,pad_spacing:Number.parseFloat(parameters.pad_spacing)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},son_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(6),external_exports.literal(8)]).default(8),w:external_exports.string().default("3mm"),h:external_exports.string().default("3mm"),p:external_exports.string().default("0.5mm"),pl:external_exports.string().default("0.52mm"),pw:external_exports.string().default("0.35mm"),epw:external_exports.string().default("1.40mm"),eph:external_exports.string().default("1.60mm"),string:external_exports.string().optional(),ep:external_exports.boolean().default(!1)}),son=raw_params=>{raw_params.string&&raw_params.string.includes("_ep")&&(raw_params.ep=!0);let match2=raw_params.string?.match(/^son_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):raw_params.num_pins||8,parameters=son_def.parse({...raw_params,num_pins:numPins}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),epw=length.parse(parameters.epw),eph=length.parse(parameters.eph),pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getSonPadCoord(parameters.num_pins,i2+1,w4,p4);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}parameters.ep&&pads.push(rectpad(parameters.num_pins+1,0,0,epw,eph));let silkscreenBoxWidth=w4,silkscreenBoxHeight=h4,silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2},{x:silkscreenBoxWidth/2,y:-silkscreenBoxHeight/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSonPadCoord(parameters.num_pins,1,silkscreenBoxWidth,p4),pin1MarkerPosition={x:pin1Position.x-.4,y:pin1Position.y},pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,silkscreenBoxHeight/2+.5,.3);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSonPadCoord=(num_pins,pn3,w4,p4)=>{let half=num_pins/2,rowIndex=(pn3-1)%half,col=pn3<=half?-1:1,row=(half-1)/2-rowIndex;return{x:col*length.parse("1.4mm"),y:row*p4}},vson_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().optional().default(8),p:distance.describe("pitch (distance between center of each pin)"),w:length.describe("width between vertical rows of pins"),grid:dim2d.describe("width and height of the border of the footprint"),ep:dim2d.default("0x0mm").describe("width and height of the central exposed thermal pad"),epx:length.default("0mm").describe("x offset of the center of the central exposed thermal pad"),pinw:length.describe("width of the pin pads"),pinh:length.describe("height of the pin pads")}),vson=raw_params=>{let parameters=vson_def.parse(raw_params),{num_pins,p:p4,w:w4,grid:grid4,ep:ep2,epx,pinw,pinh}=parameters;if(num_pins%2!==0)throw new Error("invalid number of pins");let pads=[];for(let i2=0;i2<num_pins;i2++){let{pinX,pinY}=getCcwVsonCoords({pinCount:num_pins,pinIndex:i2,width:w4,pitch:p4});pads.push(rectpad(i2+1,pinX,pinY,pinw,pinh))}ep2.x>0&&ep2.y>0&&pads.push(rectpad(parameters.num_pins+1,epx,0,ep2.x,ep2.y));let silkscreenPaths=getSilkscreenPaths(grid4),silkscreenRefText=silkscreenRef(0,grid4.y/2+p4,grid4.y/6);return{circuitJson:[...pads,...silkscreenPaths,silkscreenRefText],parameters}},getCcwVsonCoords=params=>{let pinY=0,pinX=0,centerY=(params.pinCount/2-1)*params.pitch/2,pinHalf=params.pinCount/2;return params.pinIndex+1<=pinHalf?(pinY=params.pitch*params.pinIndex-centerY,pinX=0-params.width/2):(pinY=params.pitch*(params.pinCount-params.pinIndex-1)-centerY,pinX=params.width/2),{pinX,pinY}},getSilkscreenPaths=grid4=>{let cornerLine=grid4.y/30;return[{layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",type:"pcb_silkscreen_path",route:[{x:-grid4.x/2-.1,y:grid4.y/2+.1-cornerLine},{x:-grid4.x/2-.1,y:grid4.y/2+.1},{x:grid4.x/2+.1,y:grid4.y/2+.1},{x:grid4.x/2+.1,y:grid4.y/2+.1-cornerLine}],stroke_width:grid4.y/30},{layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",type:"pcb_silkscreen_path",route:[{x:-grid4.x/2-.1,y:-grid4.y/2-.1+cornerLine},{x:-grid4.x/2-.1,y:-grid4.y/2-.1},{x:grid4.x/2+.1,y:-grid4.y/2-.1},{x:grid4.x/2+.1,y:-grid4.y/2-.1+cornerLine}],stroke_width:grid4.y/30}]},solderjumper=params=>{let{num_pins,bridged,p:p4=2.54,pw=1.5,ph:ph3=1.5}=params,padSpacing7=length.parse(p4),padWidth=length.parse(pw),padHeight=length.parse(ph3),traceWidth=Math.min(padHeight/4,.5),pads=[];for(let i2=0;i2<num_pins;i2++)pads.push(rectpad(i2+1,i2*padSpacing7,0,padWidth,padHeight));let traces=[];if(bridged){let pins=bridged.split("").map(Number);if(pins.length>1)for(let i2=0;i2<pins.length-1;i2++){let from=pins[i2],to3=pins[i2+1];if(typeof from=="number"&&typeof to3=="number"&&!isNaN(from)&&!isNaN(to3)){let xCenterFrom=(from-1)*padSpacing7,xCenterTo=(to3-1)*padSpacing7,directionMult=Math.sign(xCenterTo-xCenterFrom),x12=xCenterFrom+directionMult*(padWidth/2),x22=xCenterTo-directionMult*(padWidth/2);traces.push({type:"pcb_trace",pcb_trace_id:"",route:[{start_pcb_port_id:`{PIN${from}}`,x:x12,y:0,width:traceWidth,layer:"top",route_type:"wire"},{end_pcb_port_id:`{PIN${to3}}`,x:x22,y:0,width:traceWidth,layer:"top",route_type:"wire"}]})}}}let outlineWidth=(num_pins-1)*padSpacing7+padWidth+.7,outlineHeight=padHeight+1,outlineCenterX=(num_pins-1)*padSpacing7/2,outlineCenterY=0,silkscreenRect={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"outline",route:[{x:outlineCenterX-outlineWidth/2,y:outlineCenterY-outlineHeight/2},{x:outlineCenterX+outlineWidth/2,y:outlineCenterY-outlineHeight/2},{x:outlineCenterX+outlineWidth/2,y:outlineCenterY+outlineHeight/2},{x:outlineCenterX-outlineWidth/2,y:outlineCenterY+outlineHeight/2},{x:outlineCenterX-outlineWidth/2,y:outlineCenterY-outlineHeight/2}],stroke_width:.15},refY=outlineCenterY+outlineHeight/2+.6,silk=silkscreenRef(outlineCenterX,refY,.4);return{circuitJson:[...pads,...traces,silkscreenRect,silk],parameters:params}},commonSchema={fn:external_exports.literal("sot457"),num_pins:external_exports.literal(6).default(6),pillh:external_exports.string().default("0.45mm"),pillw:external_exports.string().default("1.45mm"),pl:external_exports.string(),pw:external_exports.string(),p:external_exports.string(),wave:external_exports.boolean().optional(),reflow:external_exports.boolean().optional()},sot457DefSchema=base_def.extend({...commonSchema,h:external_exports.string().default("2.5mm"),w:external_exports.string().default("2.7mm"),pl:external_exports.string().default("0.8mm"),pw:external_exports.string().default("0.55mm"),p:external_exports.string().default("0.95mm")}),sot457WaveSchema=base_def.extend({...commonSchema,h:external_exports.string().default("3mm"),w:external_exports.string().default("4mm"),pillr:external_exports.string().default("0.225mm"),pl:external_exports.string().default("1.45mm"),pw:external_exports.string().default("1.5mm"),p:external_exports.string().default("1.475mm")}).transform(data=>({...data,wave:data.wave??(data.reflow===void 0?!0:!data.reflow),reflow:data.reflow??(data.wave===void 0?!1:!data.wave)})),parseDimension=value=>Number.parseFloat(value.replace("mm","")),getCcwSot457Coords=({pitch,width,pinNumber})=>{let coord={1:{x:-width/2-.1,y:pitch},2:{x:-width/2-.1,y:0},3:{x:-width/2-.1,y:-pitch},4:{x:width/2+.1,y:-pitch},5:{x:width/2+.1,y:0},6:{x:width/2+.1,y:pitch}}[pinNumber];if(!coord)throw new Error(`Invalid pin number: ${pinNumber}`);return coord},generateSot457Elements=params=>{let pads=[],pitch=parseDimension(params.p),padLength=parseDimension(params.pl),padWidth=parseDimension(params.pw),width=parseDimension(params.w),height=parseDimension(params.h);if(params.wave){let pinConfigs={1:({padWidth:padWidth2,padHeight})=>rectpad(1,-pitch,pitch,padHeight,padWidth2),2:({padWidth:padWidth2,padHeight})=>rectpad(2,-pitch,-pitch,padHeight,padWidth2),3:({padWidth:padWidth2,padHeight})=>pillpad(3,-pitch,0,parseDimension(params.pillw),parseDimension(params.pillh)),4:({padWidth:padWidth2,padHeight})=>pillpad(4,pitch,0,parseDimension(params.pillw),parseDimension(params.pillh)),5:({padWidth:padWidth2,padHeight})=>rectpad(5,pitch,pitch,padHeight,padWidth2),6:({padWidth:padWidth2,padHeight})=>rectpad(6,pitch,-pitch,padHeight,padWidth2)};for(let i2=1;i2<=params.num_pins;i2++){let config=pinConfigs[i2];config&&pads.push(config({padWidth:padLength,padHeight:padWidth}))}}else for(let i2=1;i2<=params.num_pins;i2++){let{x:x5,y:y5}=getCcwSot457Coords({pitch,width,pinNumber:i2});pads.push(rectpad(i2,x5,y5,padLength,padWidth))}let silkscreenPath1={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width/3,y:height/2+pitch/1.3},{x:width/3,y:height/2+pitch/1.3}],stroke_width:.05},silkscreenPath2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width/3,y:-height/2-pitch/1.3},{x:width/3,y:-height/2-pitch/1.3}],stroke_width:.05},silkscreenRefText=silkscreenRef(0,height+.5,.3),pin1Position=getCcwSot457Coords({pitch,width,pinNumber:1}),triangleHeight=params.wave?1:.5,triangleWidth=params.wave?.7:.3;pin1Position.x-=params.wave?padWidth:padWidth*1.7;let pin1Indicator={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_indicator",route:[{x:pin1Position.x+triangleHeight/2,y:pin1Position.y},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y+triangleWidth/2},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y-triangleWidth/2},{x:pin1Position.x+triangleHeight/2,y:pin1Position.y}],stroke_width:.05};return[silkscreenRefText,silkscreenPath1,silkscreenPath2,pin1Indicator,...pads]},sot457=rawParams=>{if(rawParams.wave){let parameters2=sot457WaveSchema.parse({...rawParams,fn:"sot457"});return{circuitJson:generateSot457Elements(parameters2),parameters:parameters2}}let parameters=sot457DefSchema.parse(rawParams);return{circuitJson:generateSot457Elements(parameters),parameters}},sot963_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),w:external_exports.string().default("1.1mm"),h:external_exports.string().default("1.45mm"),p:external_exports.string().default("0.35mm"),pl:external_exports.string().default("0.2mm"),pw:external_exports.string().default("0.2mm"),string:external_exports.string().optional()}),sot963=raw_params=>{let parameters=sot963_def.parse({...raw_params,fn:"sot963"}),w4=length.parse(parameters.w),h4=length.parse(parameters.h),p4=length.parse(parameters.p),pl3=length.parse(parameters.pl),pw=length.parse(parameters.pw),pads=[];for(let i2=0;i2<6;i2++){let{x:x5,y:y5}=getSot963PadCoord(i2+1,w4,p4,pl3);pads.push(rectpad(i2+1,x5,y5,pl3,pw))}let silkscreenTopLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:h4/2},{x:w4/2,y:h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},silkscreenBottomLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:-w4/2,y:-h4/2},{x:w4/2,y:-h4/2}],stroke_width:.05,pcb_silkscreen_path_id:""},pin1Position=getSot963PadCoord(1,w4,p4,pl3),pin1Marking={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1Position.x-pl3/2-.3,y:pin1Position.y},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y+.15},{x:pin1Position.x-pl3/2-.45,y:pin1Position.y-.15},{x:pin1Position.x-pl3/2-.3,y:pin1Position.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},silkscreenRefText=silkscreenRef(0,h4/2+.4,.25);return{circuitJson:[...pads,silkscreenTopLine,silkscreenBottomLine,silkscreenRefText,pin1Marking],parameters}},getSot963PadCoord=(pn3,w4,p4,pl3)=>{let padCenterOffset=w4/2-pl3/2;return pn3<=3?{x:-padCenterOffset,y:p4-(pn3-1)*p4}:{x:padCenterOffset,y:-p4+(pn3-4)*p4}},potentiometer_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.union([external_exports.literal(3),external_exports.literal(2)]).default(3),p:external_exports.string().default("3.8mm"),id:external_exports.string().default("1.25mm"),od:external_exports.string().default("2.35mm"),ca:external_exports.string().default("14mm").describe("Caliper axis (width or diameter of the potentiometer body or adjustment knob)"),w:external_exports.string().default("5.35mm"),h:external_exports.string().default("4mm"),string:external_exports.string().optional()}),potentiometer_acp=parameters=>{let{p:p4,id:id2,od:od3,h:h4,ca:ca3}=parameters,y5=Number.parseFloat(h4),caliper=Number.parseFloat(ca3);return[platedhole(1,0,caliper/4+.3,id2,od3),platedhole(2,y5,0,id2,od3),platedhole(3,0,-caliper/4-.3,id2,od3)]},potentiometer=raw_params=>{let match2=raw_params.string?.match(/^potentiometer_(\d+)/),numPins=match2?Number.parseInt(match2[1],10):3,parameters=potentiometer_def.parse({...raw_params,num_pins:numPins}),platedHoles=[];parameters.num_pins===3&&(platedHoles=potentiometer_acp(parameters));let y5=Number.parseFloat(parameters.ca)/2+.15,x5=Number.parseFloat(parameters.w),od3=Number.parseFloat(parameters.od)/2+.35,silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:0,y:y5-1.75},{x:0,y:y5},{x:x5,y:y5},{x:x5,y:od3}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenBody2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:x5,y:-od3},{x:x5,y:-y5},{x:0,y:-y5},{x:0,y:-y5+1.75}],stroke_width:.1,pcb_silkscreen_path_id:""},W5=Number.parseFloat(parameters.w)/2,silkscreenRefText=silkscreenRef(W5,y5+1,.5);return{circuitJson:[...platedHoles,silkscreenBody,silkscreenBody2,silkscreenRefText],parameters}},electrolytic_def=base_def.extend({fn:external_exports.string(),p:length.optional().default("7.5mm"),id:length.optional().default("1mm"),od:length.optional().default("2mm"),d:length.optional().default("10.5mm")}),generate_circle_arcs=(centerX,centerY,radius,cut,cutHeight)=>{let topArc=[],bottomArc=[];for(let i2=0;i2<=50;i2++){let theta=i2/50*Math.PI,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||topArc.push({x:x5,y:y5})}for(let i2=0;i2<=50;i2++){let theta=Math.PI+i2/50*Math.PI,x5=centerX+Math.cos(theta)*radius,y5=centerY+Math.sin(theta)*radius;x5<centerX-cut&&y5>=centerY-cutHeight/2&&y5<=centerY+cutHeight/2||bottomArc.push({x:x5,y:y5})}return{topArc,bottomArc}},electrolytic=raw_params=>{let parameters=electrolytic_def.parse(raw_params),{p:p4,id:id2,od:od3,d:d3}=parameters,plated_holes=[platedhole(1,-p4/2,0,id2,od3),platedhole(2,p4/2,0,id2,od3)],{topArc,bottomArc}=generate_circle_arcs(0,0,d3/2+.1,od3/2,od3),silkscreenBody2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:topArc,stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenBody3={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:bottomArc,stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:0,y:d3/2+.1},{x:0,y:-(d3/2+.1)}],stroke_width:.1,pcb_silkscreen_path_id:""},X6=-(d3/2+.5),plusY=od3/2+1.5,Size=.5,silkscreenpath2={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:X6-Size,y:plusY},{x:X6+Size,y:plusY}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenline={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:X6,y:plusY-Size},{x:X6,y:plusY+Size}],stroke_width:.1,pcb_silkscreen_path_id:""},silkscreenRefText=silkscreenRef(0,d3/2+1,.5);return{circuitJson:[...plated_holes,silkscreenBody2,silkscreenBody3,silkscreenBody,silkscreenpath2,silkscreenline,silkscreenRefText],parameters}},smbf_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(2).default(2),w:external_exports.string().default("6.5mm"),h:external_exports.string().default("3mm"),pl:external_exports.string().default("1.75mm"),pw:external_exports.string().default("2.40mm"),p:external_exports.string().default("4.75mm")}),smbf=raw_params=>{let parameters=smbf_def.parse(raw_params),silkscreenRefText=silkscreenRef(0,length.parse(parameters.h)-.5,.3),silkscreenLine={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",route:[{x:length.parse(parameters.p)/2,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.3,y:length.parse(parameters.h)/2},{x:-length.parse(parameters.w)/2-.3,y:-length.parse(parameters.h)/2},{x:length.parse(parameters.p)/2,y:-length.parse(parameters.h)/2}],stroke_width:.1,pcb_silkscreen_path_id:""};return{circuitJson:smbfWithoutParsing(parameters).concat(silkscreenLine,silkscreenRefText),parameters}},getSmbfCoords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4/2,y:0}:{x:p4/2,y:0}},smbfWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getSmbfCoords({pn:i2,p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}return pads},sot323_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),w:external_exports.string().default("2.45mm"),h:external_exports.string().default("2.40mm"),pl:external_exports.string().default("0.92mm"),pw:external_exports.string().default("0.45mm"),p:external_exports.string().default("0.891mm"),string:external_exports.string().optional()}),sot323=raw_params=>{let match2=raw_params.string?.match(/^sot323_(\d+)/),numPins=match2?Number.parseInt(match2[1],3):3,parameters=sot323_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===3)return{circuitJson:sot323_3(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot323Coords=parameters=>{let{pn:pn3,w:w4,h:h4,pl:pl3,p:p4}=parameters;return pn3===1?{x:-p4,y:.65}:pn3===2?{x:-p4,y:-.65}:{x:p4,y:0}},sot323_3=parameters=>{let pads=[];for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot323Coords({num_pins:parameters.num_pins,pn:i2+1,w:Number.parseFloat(parameters.w),h:Number.parseFloat(parameters.h),pl:Number.parseFloat(parameters.pl),p:Number.parseFloat(parameters.p)});pads.push(rectpad(i2+1,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let silkscreenRefText=silkscreenRef(0,Number.parseInt(parameters.h)/2+1,.3),width=Number.parseFloat(parameters.w)/2-Number.parseFloat(parameters.pl),height=Number.parseFloat(parameters.h)/2,silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width,y:height+.3},{x:width,y:height+.3},{x:width,y:height/2}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width,y:-height-.3},{x:width,y:-height-.3},{x:width,y:-height/2}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPath1,silkscreenPath2,silkscreenRefText]},smtpad_def=base_def.extend({fn:external_exports.string(),circle:external_exports.boolean().optional(),rect:external_exports.boolean().optional(),square:external_exports.boolean().optional(),pill:external_exports.boolean().optional(),d:length.optional(),pd:length.optional(),diameter:length.optional(),r:length.optional(),pr:length.optional(),radius:length.optional(),w:length.optional(),pw:length.optional(),width:length.optional(),h:length.optional(),ph:length.optional(),height:length.optional(),s:length.optional(),size:length.optional(),string:external_exports.string().optional()}).transform(v5=>{let shape="rect";v5.circle&&(shape="circle"),v5.square&&(shape="square"),v5.rect&&(shape="rect"),v5.pill&&(shape="pill");let radius,width,height;return shape==="circle"?v5.r!==void 0?radius=mm(v5.r):v5.pr!==void 0?radius=mm(v5.pr):v5.radius!==void 0?radius=mm(v5.radius):v5.d!==void 0?radius=mm(v5.d)/2:v5.pd!==void 0?radius=mm(v5.pd)/2:v5.diameter!==void 0?radius=mm(v5.diameter)/2:radius=mm("1mm")/2:(v5.w!==void 0?width=mm(v5.w):v5.pw!==void 0?width=mm(v5.pw):v5.width!==void 0?width=mm(v5.width):v5.s!==void 0?width=mm(v5.s):v5.size!==void 0?width=mm(v5.size):width=mm("1mm"),v5.h!==void 0?height=mm(v5.h):v5.ph!==void 0?height=mm(v5.ph):v5.height!==void 0?height=mm(v5.height):shape==="square"||shape==="rect"?height=width:height=mm("1mm")),{fn:v5.fn,shape,radius,width,height}}),smtpad=raw_params=>{let params=smtpad_def.parse(raw_params),{shape,radius,width,height}=params,pad2,silkscreenOffset;return shape==="circle"?(pad2=circlepad(1,{x:0,y:0,radius}),silkscreenOffset=radius+.5):shape==="pill"?(pad2=pillpad(1,0,0,width,height),silkscreenOffset=Math.max(width,height)/2+.5):(pad2=rectpad(1,0,0,width,height),silkscreenOffset=height/2+.5),{circuitJson:[pad2,silkscreenRef(0,silkscreenOffset,.2)],parameters:params}},platedhole_def=base_def.extend({fn:external_exports.string(),d:length.optional(),hd:length.optional(),r:length.optional(),hr:length.optional(),pd:length.optional(),pr:length.optional(),squarepad:external_exports.boolean().optional().default(!1)}).transform(v5=>{let holeD;v5.d!==void 0?holeD=mm(v5.d):v5.hd!==void 0?holeD=mm(v5.hd):v5.r!==void 0?holeD=mm(v5.r)*2:v5.hr!==void 0?holeD=mm(v5.hr)*2:holeD=mm("1mm");let padD;return v5.pd!==void 0?padD=mm(v5.pd):v5.pr!==void 0?padD=mm(v5.pr)*2:padD=holeD*(1.5/1),{fn:v5.fn,d:holeD,pd:padD,squarepad:v5.squarepad??!1}}),platedhole2=raw_params=>{let params=platedhole_def.parse(raw_params),{d:d3,pd:pd2,squarepad}=params;return{circuitJson:[squarepad?platedHoleWithRectPad({pn:1,x:0,y:0,holeDiameter:d3,rectPadWidth:pd2,rectPadHeight:pd2}):platedhole(1,0,0,d3,pd2),silkscreenRef(0,pd2/2+.5,.2)],parameters:params}},sot_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.literal(6).default(6),h:external_exports.string().default("1.6mm"),pl:external_exports.string().default("1mm"),pw:external_exports.string().default("0.7mm"),p:external_exports.string().default("0.95mm")}),sot=raw_params=>{let parameters=sot_def.parse(raw_params);return{circuitJson:sotWithoutParsing(parameters),parameters}},getCcwSotCoords=parameters=>{let{p:p4,h:h4,pn:pn3}=parameters;if(pn3===1)return{x:-h4/2-.5,y:p4};if(pn3===2)return{x:-h4/2-.5,y:0};if(pn3===3)return{x:-h4/2-.5,y:-p4};if(pn3===4)return{x:h4/2+.5,y:-p4};if(pn3===5)return{x:h4/2+.5,y:0};if(pn3===6)return{x:h4/2+.5,y:p4};throw new Error("Invalid pin number")},sotWithoutParsing=parameters=>{let pads=[];for(let i2=1;i2<=parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSotCoords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:i2});pads.push(rectpad(i2,x5,y5,Number.parseFloat(parameters.pl),Number.parseFloat(parameters.pw)))}let width=parameters.num_pins/2*Number.parseFloat(parameters.p),height=Number.parseFloat(parameters.h),silkscreenPath1={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_1",route:[{x:-width/3,y:height/2+Number.parseFloat(parameters.p)/1.3},{x:width/3,y:height/2+Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenPath2={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_2",route:[{x:-width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3},{x:width/3,y:-height/2-Number.parseFloat(parameters.p)/1.3}],type:"pcb_silkscreen_path",stroke_width:.05},silkscreenRefText=silkscreenRef(0,height+.3,.3),pin1Position=getCcwSotCoords({h:Number.parseFloat(parameters.h),p:Number.parseFloat(parameters.p),pn:1});pin1Position.x=pin1Position.x-Number.parseFloat(parameters.pw)*1.5;let triangleHeight=.7,triangleWidth=.3,pin1Indicator={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"pin1_indicator",route:[{x:pin1Position.x+triangleHeight/2,y:pin1Position.y},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y+triangleWidth/2},{x:pin1Position.x-triangleHeight/2,y:pin1Position.y-triangleWidth/2},{x:pin1Position.x+triangleHeight/2,y:pin1Position.y}],stroke_width:.05};return[...pads,silkscreenRefText,silkscreenPath1,silkscreenPath2,pin1Indicator]},sot343_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(4),w:external_exports.string().default("3.2mm"),h:external_exports.string().default("2.6mm"),pl:external_exports.string().default("1.05mm"),pw:external_exports.string().default("0.45mm"),p:external_exports.string().default("0.55mm"),string:external_exports.string().optional()}),sot343=raw_params=>{let match2=raw_params.string?.match(/^sot343_(\d+)/),numPins=match2?Number.parseInt(match2[1],4):4,parameters=sot343_def.parse({...raw_params,num_pins:numPins});if(parameters.num_pins===4)return{circuitJson:sot343_4(parameters),parameters};throw new Error("Invalid number of pins")},getCcwSot343Coords=parameters=>{let{pn:pn3,p:p4}=parameters;return pn3===1?{x:-p4*1.92,y:-.65}:pn3===2?{x:-p4*1.92,y:.65}:pn3===3?{x:p4,y:.65}:pn3===4?{x:p4,y:-.65}:{x:0,y:0}},sot343_4=parameters=>{let pads=[],w4=Number.parseFloat(parameters.w),h4=Number.parseFloat(parameters.h),pl3=Number.parseFloat(parameters.pl),pw=Number.parseFloat(parameters.pw),p4=Number.parseFloat(parameters.p),minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let i2=0;i2<parameters.num_pins;i2++){let{x:x5,y:y5}=getCcwSot343Coords({num_pins:parameters.num_pins,pn:i2+1,w:w4,h:h4,pl:pl3,p:p4});pads.push(rectpad(i2+1,x5,y5,pl3,pw)),x5<minX&&(minX=x5),x5>maxX&&(maxX=x5),y5<minY&&(minY=y5),y5>maxY&&(maxY=y5)}let silkscreenXOffset=(minX+maxX)/2,padVerticalDistance=maxY-minY,silkscreenMargin=h4*.3,offsetY=padVerticalDistance/2+silkscreenMargin,silkscreenLineLength=w4*.8;h4<=2.6&&(silkscreenLineLength/=2);let silkscreenRefText=silkscreenRef(silkscreenXOffset,offsetY+.5,.3),silkscreenPathTop={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_top",route:[{x:silkscreenXOffset-silkscreenLineLength/2,y:offsetY},{x:silkscreenXOffset+silkscreenLineLength/2,y:offsetY}],type:"pcb_silkscreen_path",stroke_width:.1},silkscreenPathBottom={layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"silkscreen_path_bottom",route:[{x:silkscreenXOffset-silkscreenLineLength/2,y:-offsetY},{x:silkscreenXOffset+silkscreenLineLength/2,y:-offsetY}],type:"pcb_silkscreen_path",stroke_width:.1};return[...pads,silkscreenPathTop,silkscreenPathBottom,silkscreenRefText]},m2host_def=base_def.extend({fn:external_exports.string()}),m2host=raw_params=>{let parameters=m2host_def.parse(raw_params),pads=[],padWidth=.5-.15,padLength=1.5,pitch=.5,halfPitch=pitch/2,rowOffset=.5,numPads=75,startY=-((numPads-1)*pitch)/2;for(let i2=0;i2<numPads;i2++){let pn3=i2+1;if(pn3>=24&&pn3<=31)continue;let y5=startY-i2*halfPitch,isBottomLayer=pn3%2===0,padLengthWithOffset=padLength+(isBottomLayer?.25:0),x5=.5-padLengthWithOffset/2,pad2=rectpad(pn3,x5,y5,padLengthWithOffset,padWidth);pad2.layer=isBottomLayer?"bottom":"top",pads.push(pad2)}let cutoutWidth=46*.0254,cutoutDepth=137*.0254,cutoutOffsetFromPin1=261*.0254,cutout={type:"pcb_cutout",pcb_cutout_id:"",shape:"rect",center:{x:-cutoutDepth/2+padLength/2,y:startY-cutoutOffsetFromPin1},width:cutoutDepth,height:cutoutWidth},pin1MarkerPosition={x:-.5,y:startY},pin1Marker={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"pin_marker_1",route:[{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y+.3},{x:pin1MarkerPosition.x-.7,y:pin1MarkerPosition.y-.3},{x:pin1MarkerPosition.x-.4,y:pin1MarkerPosition.y}],stroke_width:.05,pcb_silkscreen_path_id:"pin_marker_1"},minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,updateBounds=(x5,y5,w4=0,h4=0)=>{minX=Math.min(minX,x5-w4/2),maxX=Math.max(maxX,x5+w4/2),minY=Math.min(minY,y5-h4/2),maxY=Math.max(maxY,y5+h4/2)};for(let pad2 of pads){let rectPad=pad2;updateBounds(rectPad.x,rectPad.y,rectPad.width,rectPad.height)}updateBounds(cutout.center.x,cutout.center.y,cutout.width,cutout.height);for(let point6 of pin1Marker.route)updateBounds(point6.x,point6.y);let centerX=(minX+maxX)/2,centerY=(minY+maxY)/2,translate4=el3=>{typeof el3.x=="number"&&(el3.x-=centerX),typeof el3.y=="number"&&(el3.y-=centerY),el3.center&&(el3.center.x-=centerX,el3.center.y-=centerY),Array.isArray(el3.route)&&(el3.route=el3.route.map(p4=>({x:p4.x-centerX,y:p4.y-centerY})))};for(let pad2 of pads)translate4(pad2);return translate4(cutout),translate4(pin1Marker),{circuitJson:[...pads,cutout,pin1Marker],parameters}},mountedpcbmodule_def=base_def.extend({fn:external_exports.string(),numPins:external_exports.number().optional().default(0),rows:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>Number(val)).optional().default(1).describe("number of rows"),p:length.default("2.54mm").describe("pitch"),id:length.default("1.0mm").describe("inner diameter"),od:length.default("1.5mm").describe("outer diameter"),male:external_exports.boolean().optional().describe("the module uses male headers"),nopin:external_exports.boolean().optional().default(!1).describe("omit pins rendering"),female:external_exports.boolean().optional().describe("the module uses female headers"),smd:external_exports.boolean().optional().describe("surface mount device"),pinlabeltextalignleft:external_exports.boolean().optional().default(!1),pinlabeltextaligncenter:external_exports.boolean().optional().default(!1),pinlabeltextalignright:external_exports.boolean().optional().default(!1),pinlabelverticallyinverted:external_exports.boolean().optional().default(!1),pinlabelorthogonal:external_exports.boolean().optional().default(!1),nopinlabels:external_exports.boolean().optional().default(!1).describe("omit silkscreen pin labels"),doublesidedpinlabel:external_exports.boolean().optional().default(!1).describe("add silkscreen pins in top and bottom layers"),bottomsidepinlabel:external_exports.boolean().optional().default(!1).describe("place the silkscreen reference text on the bottom layer instead of top"),pinRowSide:external_exports.enum(["left","right","top","bottom"]).optional().default("left"),pinrowleft:external_exports.boolean().optional().default(!1),pinrowright:external_exports.boolean().optional().default(!1),pinrowtop:external_exports.boolean().optional().default(!1),pinrowbottom:external_exports.boolean().optional().default(!1),pinrowleftpins:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>Number(val)).optional(),pinrowrightpins:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>Number(val)).optional(),pinrowtoppins:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>Number(val)).optional(),pinrowbottompins:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>Number(val)).optional(),width:length.optional(),height:length.optional(),pinRowHoleEdgeToEdgeDist:length.default("2mm"),holes:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())]).optional().transform(val=>!val||Array.isArray(val)?val:val.startsWith("(")&&val.endsWith(")")?val.slice(1,-1).split(",").map(s2=>s2.trim()):[val]),holeXDist:length.optional(),holeYDist:length.optional(),holeInset:length.default("1mm"),pinrow:external_exports.union([external_exports.string(),external_exports.number()]).optional(),usbposition:external_exports.enum(["left","right","top","bottom"]).optional().default("left"),usbleft:external_exports.boolean().optional().default(!1),usbtop:external_exports.boolean().optional().default(!1),usbright:external_exports.boolean().optional().default(!1),usbbottom:external_exports.boolean().optional().default(!1),usbtype:external_exports.enum(["micro","c"]).optional(),usbmicro:external_exports.boolean().optional().default(!1),usbc:external_exports.boolean().optional().default(!1),screen:external_exports.boolean().optional().default(!1).describe("add silkscreen outline for screen/display area"),screenwidth:length.optional(),screenheight:length.optional(),screencenteroffsetx:length.optional(),screencenteroffsety:length.optional()}).transform(data=>{let pinlabelAnchorSide=determinePinlabelAnchorSide(data),pinRowSide=data.pinRowSide;data.pinrowleft&&(pinRowSide="left"),data.pinrowright&&(pinRowSide="right"),data.pinrowtop&&(pinRowSide="top"),data.pinrowbottom&&(pinRowSide="bottom");let usbposition=data.usbposition;data.usbleft&&(usbposition="left"),data.usbtop&&(usbposition="top"),data.usbright&&(usbposition="right"),data.usbbottom&&(usbposition="bottom");let usbtype=data.usbtype;data.usbmicro&&(usbtype="micro"),data.usbc&&(usbtype="c"),data.pinrow!==void 0&&(data.numPins=Number(data.pinrow));let sidePinCounts={left:data.pinrowleftpins,right:data.pinrowrightpins,top:data.pinrowtoppins,bottom:data.pinrowbottompins},hasSidePins=Object.values(sidePinCounts).some(value=>value!==void 0&&value>0),leftRightBoth=(sidePinCounts.left??0)>0&&(sidePinCounts.right??0)>0,topBottomBoth=(sidePinCounts.top??0)>0&&(sidePinCounts.bottom??0)>0;hasSidePins&&((sidePinCounts.left??0)>0?pinRowSide="left":(sidePinCounts.right??0)>0?pinRowSide="right":(sidePinCounts.top??0)>0?pinRowSide="top":(sidePinCounts.bottom??0)>0&&(pinRowSide="bottom"),data.numPins=(sidePinCounts.left??0)+(sidePinCounts.right??0)+(sidePinCounts.top??0)+(sidePinCounts.bottom??0));let numPinsPerRow=Math.ceil(data.numPins/data.rows),verticalPins=Math.max(sidePinCounts.left??0,sidePinCounts.right??0),horizontalPins=Math.max(sidePinCounts.top??0,sidePinCounts.bottom??0),calculatedWidth,calculatedHeight;if(hasSidePins){let widthGap=leftRightBoth?data.p:0,heightGap=topBottomBoth?data.p:0;calculatedWidth=(horizontalPins>0?(horizontalPins-1)*data.p:0)+2*data.pinRowHoleEdgeToEdgeDist+widthGap,calculatedHeight=(verticalPins>0?(verticalPins-1)*data.p:0)+2*data.pinRowHoleEdgeToEdgeDist+heightGap}else pinRowSide==="left"||pinRowSide==="right"?(calculatedWidth=(data.rows-1)*data.p+2*data.pinRowHoleEdgeToEdgeDist,calculatedHeight=(numPinsPerRow-1)*data.p+2*data.pinRowHoleEdgeToEdgeDist):(calculatedHeight=(data.rows-1)*data.p+2*data.pinRowHoleEdgeToEdgeDist,calculatedWidth=(numPinsPerRow-1)*data.p+2*data.pinRowHoleEdgeToEdgeDist);data.numPins===0&&(calculatedWidth=10,calculatedHeight=10);let finalWidth=data.width??calculatedWidth,finalHeight=data.height??calculatedHeight,screenWidth=data.screenwidth??finalWidth*.95,screenHeight=data.screenheight??finalHeight*.95,screenCenterOffsetX=data.screencenteroffsetx??0,screenCenterOffsetY=data.screencenteroffsety??0;return{...data,pinlabelAnchorSide,pinRowSide,usbposition,usbtype,male:data.male??!data.female,female:data.female??!1,width:finalWidth,height:finalHeight,screenwidth:screenWidth,screenheight:screenHeight,screencenteroffsetx:screenCenterOffsetX,screencenteroffsety:screenCenterOffsetY,pinrowleftpins:sidePinCounts.left,pinrowrightpins:sidePinCounts.right,pinrowtoppins:sidePinCounts.top,pinrowbottompins:sidePinCounts.bottom}}).superRefine((data,ctx)=>{data.male&&data.female&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"'male' and 'female' cannot both be true; it should be male or female.",path:["male","female"]})}),mountedpcbmodule=raw_params=>{let parameters=mountedpcbmodule_def.parse(raw_params),{p:p4,id:id2,od:od3,rows,numPins,pinlabelAnchorSide,pinlabelverticallyinverted,pinlabelorthogonal,pinlabeltextalignleft,pinlabeltextalignright,nopinlabels,doublesidedpinlabel,bottomsidepinlabel,pinRowSide,width,height,pinRowHoleEdgeToEdgeDist,holes,holeXDist,holeYDist,holeInset,pinrowleftpins,pinrowrightpins,pinrowtoppins,pinrowbottompins,usbposition,usbtype,screen,screenwidth,screenheight,screencenteroffsetx,screencenteroffsety}=parameters,pinlabelTextAlign="center";pinlabeltextalignleft?pinlabelTextAlign="left":pinlabeltextalignright&&(pinlabelTextAlign="right");let elements=[],sidePinCounts={left:pinrowleftpins,right:pinrowrightpins,top:pinrowtoppins,bottom:pinrowbottompins},hasSidePins=Object.values(sidePinCounts).some(value=>value!==void 0&&value>0),addPin=(pinNumber,xoff,yoff,anchorSide)=>{if(parameters.smd?elements.push(rectpad(pinNumber,xoff,yoff,parameters.od,parameters.od)):pinNumber===1?elements.push(platedHoleWithRectPad({pn:pinNumber,x:xoff,y:yoff,holeDiameter:id2,rectPadWidth:od3,rectPadHeight:od3})):elements.push(platedhole(pinNumber,xoff,yoff,id2,od3)),!nopinlabels){let anchor_x=xoff+(anchorSide==="left"?-od3:anchorSide==="right"?od3:0),anchor_y=yoff+(anchorSide==="top"?od3:anchorSide==="bottom"?-od3:0);bottomsidepinlabel||elements.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:anchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"top"})),(doublesidedpinlabel||bottomsidepinlabel)&&elements.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:anchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"bottom"}))}};if(hasSidePins){let pinSpacing=p4,pinNumber=1,leftCount=sidePinCounts.left??0,rightCount=sidePinCounts.right??0,topCount=sidePinCounts.top??0,bottomCount=sidePinCounts.bottom??0,addSidePins=(side,count)=>{if(!(count<=0))if(side==="left"||side==="right"){let xoff=side==="left"?-width/2+pinRowHoleEdgeToEdgeDist:width/2-pinRowHoleEdgeToEdgeDist,startY=(count-1)/2*pinSpacing;for(let i2=0;i2<count;i2++)addPin(pinNumber,xoff,startY-i2*pinSpacing,side),pinNumber++}else{let yoff=side==="top"?height/2-pinRowHoleEdgeToEdgeDist:-height/2+pinRowHoleEdgeToEdgeDist,startX=-((count-1)/2)*pinSpacing;for(let i2=0;i2<count;i2++)addPin(pinNumber,startX+i2*pinSpacing,yoff,side),pinNumber++}};addSidePins("left",leftCount),addSidePins("right",rightCount),addSidePins("top",topCount),addSidePins("bottom",bottomCount)}else{let pinSpacing=p4,pinStartX=0,pinStartY=0,pinDirectionX=0,pinDirectionY=0,rowDirectionX=0,rowDirectionY=0,numPinsPerRow=Math.ceil(numPins/rows);pinRowSide==="left"||pinRowSide==="right"?(pinStartX=pinRowSide==="left"?-width/2+pinRowHoleEdgeToEdgeDist:width/2-pinRowHoleEdgeToEdgeDist,pinStartY=(numPinsPerRow-1)/2*pinSpacing,pinDirectionX=0,pinDirectionY=-pinSpacing,rowDirectionX=pinRowSide==="left"?pinSpacing:-pinSpacing,rowDirectionY=0):(pinStartX=-(numPinsPerRow-1)/2*pinSpacing,pinStartY=pinRowSide==="top"?height/2-pinRowHoleEdgeToEdgeDist:-height/2+pinRowHoleEdgeToEdgeDist,pinDirectionX=pinSpacing,pinDirectionY=0,rowDirectionX=0,rowDirectionY=pinRowSide==="top"?-pinSpacing:pinSpacing);let pinNumber=1;for(let row=0;row<rows&&pinNumber<=numPins;row++)for(let col=0;col<numPinsPerRow&&pinNumber<=numPins;col++){let xoff=pinStartX+col*pinDirectionX+row*rowDirectionX,yoff=pinStartY+col*pinDirectionY+row*rowDirectionY;if(parameters.smd?elements.push(rectpad(pinNumber,xoff,yoff,parameters.od,parameters.od)):pinNumber===1?elements.push(platedHoleWithRectPad({pn:pinNumber,x:xoff,y:yoff,holeDiameter:id2,rectPadWidth:od3,rectPadHeight:od3})):elements.push(platedhole(pinNumber,xoff,yoff,id2,od3)),!nopinlabels){let anchor_x=xoff+(pinRowSide==="left"?-od3:pinRowSide==="right"?od3:0),anchor_y=yoff+(pinRowSide==="top"?od3:pinRowSide==="bottom"?-od3:0);bottomsidepinlabel||elements.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"top"})),(doublesidedpinlabel||bottomsidepinlabel)&&elements.push(silkscreenPin({fs:od3/5,pn:pinNumber,anchor_x,anchor_y,anchorplacement:pinlabelAnchorSide,textalign:pinlabelTextAlign,orthogonal:pinlabelorthogonal,verticallyinverted:pinlabelverticallyinverted,layer:"bottom"}))}pinNumber++}}if(holes)for(let pos of holes){let hx2=0,hy2=0;pos==="topleft"?(hx2=-width/2+holeInset,hy2=height/2-holeInset):pos==="topright"?(hx2=width/2-holeInset,hy2=height/2-holeInset):pos==="bottomleft"?(hx2=-width/2+holeInset,hy2=-height/2+holeInset):pos==="bottomright"?(hx2=width/2-holeInset,hy2=-height/2+holeInset):pos==="center"&&(hx2=0,hy2=0),holeXDist!==void 0&&(hx2+=holeXDist),holeYDist!==void 0&&(hy2+=holeYDist),elements.push(platedhole(numPins+holes.indexOf(pos)+1,hx2,hy2,id2,od3))}if(!parameters.nosilkscreen){let outline=[{x:-width/2,y:-height/2},{x:width/2,y:-height/2},{x:width/2,y:height/2},{x:-width/2,y:height/2},{x:-width/2,y:-height/2}];elements.push(silkscreenpath(outline,{stroke_width:.1,layer:"top"}))}let refText=silkscreenRef(0,height/2+1,.5);if(elements.push(refText),usbposition&&usbtype){let usbRectWidth,usbRectHeight;if(usbtype==="c")usbRectWidth=8,usbRectHeight=3;else if(usbtype==="micro")usbRectWidth=6,usbRectHeight=2;else return{circuitJson:elements,parameters};let usbRect;if(usbposition==="left")usbRect=[{x:-width/2,y:-usbRectWidth/2},{x:-width/2+usbRectHeight,y:-usbRectWidth/2},{x:-width/2+usbRectHeight,y:usbRectWidth/2},{x:-width/2,y:usbRectWidth/2},{x:-width/2,y:-usbRectWidth/2}];else if(usbposition==="right")usbRect=[{x:width/2-usbRectHeight,y:-usbRectWidth/2},{x:width/2,y:-usbRectWidth/2},{x:width/2,y:usbRectWidth/2},{x:width/2-usbRectHeight,y:usbRectWidth/2},{x:width/2-usbRectHeight,y:-usbRectWidth/2}];else if(usbposition==="top")usbRect=[{x:-usbRectWidth/2,y:height/2-usbRectHeight},{x:usbRectWidth/2,y:height/2-usbRectHeight},{x:usbRectWidth/2,y:height/2},{x:-usbRectWidth/2,y:height/2},{x:-usbRectWidth/2,y:height/2-usbRectHeight}];else if(usbposition==="bottom")usbRect=[{x:-usbRectWidth/2,y:-height/2},{x:usbRectWidth/2,y:-height/2},{x:usbRectWidth/2,y:-height/2+usbRectHeight},{x:-usbRectWidth/2,y:-height/2+usbRectHeight},{x:-usbRectWidth/2,y:-height/2}];else return{circuitJson:elements,parameters};elements.push(silkscreenpath(usbRect,{stroke_width:.1,layer:"top"}))}if(screen){let halfScreenWidth=screenwidth/2,halfScreenHeight=screenheight/2,centerX=screencenteroffsetx,centerY=screencenteroffsety,screenOutline=[{x:-halfScreenWidth+centerX,y:-halfScreenHeight+centerY},{x:halfScreenWidth+centerX,y:-halfScreenHeight+centerY},{x:halfScreenWidth+centerX,y:halfScreenHeight+centerY},{x:-halfScreenWidth+centerX,y:halfScreenHeight+centerY},{x:-halfScreenWidth+centerX,y:-halfScreenHeight+centerY}];elements.push(silkscreenpath(screenOutline,{stroke_width:.05,layer:"top"}))}return{circuitJson:elements,parameters}},to92l_def=base_def.extend({fn:external_exports.string(),num_pins:external_exports.number().default(3),inline:external_exports.boolean().default(!1),p:external_exports.string().default("1.27mm"),id:external_exports.string().default("0.75mm"),od:external_exports.string().default("1.3mm"),w:external_exports.string().default("4.8mm"),h:external_exports.string().default("4.0mm")}),to92l=raw_params=>{let parameters=to92l_def.parse(raw_params),p4=Number.parseFloat(parameters.p),w4=Number.parseFloat(parameters.w),h4=Number.parseFloat(parameters.h),od3=parameters.inline?1.05:Number.parseFloat(parameters.od),padH=parameters.inline?1.5:od3,holes=[platedHoleWithRectPad({pn:1,x:0,y:0,holeDiameter:parameters.id,rectPadWidth:od3,rectPadHeight:padH}),parameters.inline?platedHolePill(2,p4,0,Number.parseFloat(parameters.id),od3,padH):platedhole(2,p4,p4,parameters.id,od3),parameters.inline?platedHolePill(3,p4*2,0,Number.parseFloat(parameters.id),od3,padH):platedhole(3,p4*2,0,parameters.id,od3)],radius=w4/2,cx2=parameters.inline?p4-.09:p4,cy2=.2,y_bottom=cy2+radius-h4,semicircle=Array.from({length:32},(_5,i2)=>{let angle=Math.PI*i2/31;return{x:cx2+radius*Math.cos(angle),y:cy2+radius*Math.sin(angle)}}),silkBody={type:"pcb_silkscreen_path",layer:"top",pcb_component_id:"",pcb_silkscreen_path_id:"",stroke_width:.12,route:[...semicircle,{x:cx2-radius,y:y_bottom},{x:cx2+radius,y:y_bottom},semicircle[0]]},silkscreenRefText=silkscreenRef(cx2,cy2+radius+1,.5);return{circuitJson:[...holes,silkBody,silkscreenRefText],parameters}};function isNotNull(value){return value!=null}var applyOrigin=(elements,origin)=>{if(!origin)return elements;let pads=elements.filter(el3=>el3.type==="pcb_smtpad"||el3.type==="pcb_plated_hole"||el3.type==="pcb_thtpad");if(pads.length===0)return elements;let minX=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,minY=Number.POSITIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY,updateBounds=(x5,y5,w4=0,h4=0)=>{let left=x5-w4/2,right=x5+w4/2,bottom=y5-h4/2,top=y5+h4/2;minX=Math.min(minX,left),maxX=Math.max(maxX,right),minY=Math.min(minY,bottom),maxY=Math.max(maxY,top)};for(let pad2 of pads)if(pad2.type==="pcb_smtpad"){let w4=pad2.shape==="circle"?pad2.radius*2:pad2.width,h4=pad2.shape==="circle"?pad2.radius*2:pad2.height;updateBounds(pad2.x,pad2.y,w4,h4)}else if(pad2.type==="pcb_plated_hole"){let d3=pad2.outer_diameter??pad2.hole_diameter;updateBounds(pad2.x,pad2.y,d3,d3)}else if(pad2.type==="pcb_thtpad"){let d3=pad2.diameter;updateBounds(pad2.x,pad2.y,d3,d3)}let dx2=0,dy2=0;switch(origin){case"center":dx2=(minX+maxX)/2,dy2=(minY+maxY)/2;break;case"bottomleft":dx2=minX,dy2=minY;break;case"bottomcenter":case"centerbottom":dx2=(minX+maxX)/2,dy2=minY;break;case"topcenter":case"centertop":dx2=(minX+maxX)/2,dy2=maxY;break;case"leftcenter":case"centerleft":dx2=minX,dy2=(minY+maxY)/2;break;case"rightcenter":case"centerright":dx2=maxX,dy2=(minY+maxY)/2;break;case"pin1":{let pin1=pads.find(p4=>p4.port_hints?.[0]==="1")||pads[0];dx2=pin1.x,dy2=pin1.y;break}}if(dx2===0&&dy2===0)return elements;for(let el3 of elements){if(typeof el3.x=="number"&&(el3.x-=dx2),typeof el3.y=="number"&&(el3.y-=dy2),el3.center&&typeof el3.center.x=="number"&&(el3.center.x-=dx2,el3.center.y-=dy2),el3.type==="pcb_silkscreen_path")for(let pt4 of el3.route)pt4.x-=dx2,pt4.y-=dy2;el3.type==="pcb_silkscreen_text"&&el3.anchor_position&&(el3.anchor_position.x-=dx2,el3.anchor_position.y-=dy2)}return elements},applyNoRefDes=(elements,parameters)=>{let refs=elements.filter(el3=>el3.type==="pcb_silkscreen_text");if(refs.length===0)return elements;for(let ref of refs)parameters.norefdes&&(ref.text="");return elements},applyNoSilkscreen=(elements,parameters)=>parameters.nosilkscreen?elements.filter(element=>element.type!=="pcb_silkscreen_path"&&element.type!=="pcb_silkscreen_text"):elements,string2=def=>{let fp2=footprinter(),def_parts=def.replace(/^((?:\d{4}|\d{5}))(?=$|_|x)/,"res$1").split(/_(?!metric)/).map(s2=>{let m3=s2.match(/([a-zA-Z]+)([\(\d\.\+\?].*)?/);if(!m3)return null;let[,rawFn,v5]=m3;if(!rawFn)return null;let fn3=rawFn.toLowerCase();return v5?.includes("?")?null:{fn:fn3,v:v5}}).filter(isNotNull);for(let{fn:fn3,v:v5}of def_parts)fp2=fp2[fn3](v5);return fp2.setString(def),fp2},getFootprintNames=()=>Object.keys(fn_exports);var footprinter=()=>{let proxy2=new Proxy({},{get:(target,prop)=>{if(prop==="soup"||prop==="circuitJson"){if("fn"in target&&fn_exports[target.fn])return()=>{let{circuitJson}=fn_exports[target.fn](target),circuitWithoutSilkscreen=applyNoSilkscreen(circuitJson,target),circuitWithoutRefDes=applyNoRefDes(circuitWithoutSilkscreen,target);return applyOrigin(circuitWithoutRefDes,target.origin)};if(!fn_exports[target.fn])throw new Error(`Invalid footprint function, got "${target.fn}"${target.string?`, from string "${target.string}"`:""}`);return()=>{throw new Error(`No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got "${prop}"`)}}if(prop==="json"){if(!fn_exports[target.fn])throw new Error(`Invalid footprint function, got "${target.fn}"${target.string?`, from string "${target.string}"`:""}`);return()=>fn_exports[target.fn](target).parameters}return prop==="getFootprintNames"?()=>Object.keys(fn_exports):prop==="params"?()=>target:prop==="setString"?v5=>(target.string=v5,proxy2):v5=>(Object.keys(target).length===0?`${prop}${v5}`in fn_exports?(target[`${prop}${v5}`]=!0,target.fn=`${prop}${v5}`):(target[prop]=!0,target.fn=prop,prop==="res"||prop==="cap"?v5&&(typeof v5=="string"&&v5.includes("_metric")?target.metric=v5.split("_metric")[0]:target.imperial=v5):target.num_pins=Number.isNaN(Number.parseFloat(v5))?void 0:Number.parseFloat(v5)):!v5&&["w","h","p"].includes(prop)||(target[prop]=v5??!0),proxy2)}});return proxy2};footprinter.string=string2;footprinter.getFootprintNames=getFootprintNames;var fp=footprinter;var dist_exports2={};__export(dist_exports2,{areBoundsCompletelyInsidePolygon:()=>areBoundsCompletelyInsidePolygon,areBoundsOverlappingPolygon:()=>areBoundsOverlappingPolygon,boundsAreaOverlap:()=>boundsAreaOverlap,boundsDistance:()=>boundsDistance,boundsIntersection:()=>boundsIntersection,clamp:()=>clamp,computeDistanceBetweenBoxes:()=>computeDistanceBetweenBoxes,computeGapBetweenBoxes:()=>computeGapBetweenBoxes,computeManhattanDistanceBetweenBoxes:()=>computeManhattanDistanceBetweenBoxes,distSq:()=>distSq,distance:()=>distance2,doBoundsOverlap:()=>doBoundsOverlap,doSegmentsIntersect:()=>doSegmentsIntersect,doesLineIntersectLine:()=>doesLineIntersectLine,doesSegmentIntersectRect:()=>doesSegmentIntersectRect,findNearestPointsBetweenBoxSets:()=>findNearestPointsBetweenBoxSets,getBoundingBox:()=>getBoundingBox,getBoundsFromPoints:()=>getBoundsFromPoints,getSegmentIntersection:()=>getSegmentIntersection,getUnitVectorFromDirection:()=>getUnitVectorFromDirection,getUnitVectorFromPointAToB:()=>getUnitVectorFromPointAToB,grid:()=>grid,isPointInsidePolygon:()=>isPointInsidePolygon,isRectCompletelyInsidePolygon:()=>isRectCompletelyInsidePolygon,isRectOverlappingPolygon:()=>isRectOverlappingPolygon,midpoint:()=>midpoint,normalizeDegrees:()=>normalizeDegrees,onSegment:()=>onSegment,orientation:()=>orientation,pointToBoundsDistance:()=>pointToBoundsDistance,pointToBoxDistance:()=>pointToBoxDistance,pointToSegmentClosestPoint:()=>pointToSegmentClosestPoint,pointToSegmentDistance:()=>pointToSegmentDistance,range:()=>range,segmentToBoundsMinDistance:()=>segmentToBoundsMinDistance,segmentToBoxMinDistance:()=>segmentToBoxMinDistance,segmentToCircleMinDistance:()=>segmentToCircleMinDistance,segmentToSegmentMinDistance:()=>segmentToSegmentMinDistance});function getBoundingBox(box2){let halfWidth=box2.width/2,halfHeight=box2.height/2;return{minX:box2.center.x-halfWidth,maxX:box2.center.x+halfWidth,minY:box2.center.y-halfHeight,maxY:box2.center.y+halfHeight}}function computeManhattanDistanceBetweenBoxes(boxA,boxB){let a2=getBoundingBox(boxA),b3=getBoundingBox(boxB),dx2=Math.max(a2.minX-b3.maxX,b3.minX-a2.maxX,0),dy2=Math.max(a2.minY-b3.maxY,b3.minY-a2.maxY,0),pointA={x:0,y:0},pointB={x:0,y:0};return dx2===0&&dy2===0?{distance:0,pointA:boxA.center,pointB:boxB.center}:(pointA.x=clamp(boxA.center.x,b3.minX,b3.maxX),pointA.y=clamp(boxA.center.y,b3.minY,b3.maxY),pointB.x=clamp(boxB.center.x,a2.minX,a2.maxX),pointB.y=clamp(boxB.center.y,a2.minY,a2.maxY),{distance:Math.hypot(pointA.x-pointB.x,pointA.y-pointB.y),pointA,pointB})}function computeDistanceBetweenBoxes(boxA,boxB){return computeManhattanDistanceBetweenBoxes(boxA,boxB)}function computeGapBetweenBoxes(boxA,boxB){let a2=getBoundingBox(boxA),b3=getBoundingBox(boxB),dx2=Math.max(a2.minX-b3.maxX,b3.minX-a2.maxX,0),dy2=Math.max(a2.minY-b3.maxY,b3.minY-a2.maxY,0);return Math.hypot(dx2,dy2)}function clamp(value,min,max){return Math.max(min,Math.min(max,value))}function findNearestPointsBetweenBoxSets(boxSetA,boxSetB){let minDistance=Number.POSITIVE_INFINITY,nearestPointA={x:0,y:0},nearestPointB={x:0,y:0};for(let boxA of boxSetA)for(let boxB of boxSetB){let{distance:distance8,pointA,pointB}=computeManhattanDistanceBetweenBoxes(boxA,boxB);distance8<minDistance&&(minDistance=distance8,nearestPointA=pointA,nearestPointB=pointB)}return{pointA:nearestPointA,pointB:nearestPointB,distance:minDistance}}function doesLineIntersectLine([a12,a2],[b12,b22],{lineThickness=0}={}){return lineThickness===0?doSegmentsIntersect(a12,a2,b12,b22):segmentsDistance(a12,a2,b12,b22)<=lineThickness}function doSegmentsIntersect(p12,q12,p22,q22){let o12=orientation(p12,q12,p22),o22=orientation(p12,q12,q22),o3=orientation(p22,q22,p12),o4=orientation(p22,q22,q12);return!!(o12!==o22&&o3!==o4||o12===0&&onSegment(p12,p22,q12)||o22===0&&onSegment(p12,q22,q12)||o3===0&&onSegment(p22,p12,q22)||o4===0&&onSegment(p22,q12,q22))}function orientation(p4,q4,r4){let val=(q4.y-p4.y)*(r4.x-q4.x)-(q4.x-p4.x)*(r4.y-q4.y);return val===0?0:val>0?1:2}function onSegment(p4,q4,r4){return q4.x<=Math.max(p4.x,r4.x)&&q4.x>=Math.min(p4.x,r4.x)&&q4.y<=Math.max(p4.y,r4.y)&&q4.y>=Math.min(p4.y,r4.y)}function segmentsDistance(a12,a2,b12,b22){if(a12.x===a2.x&&a12.y===a2.y)return pointToSegmentDistance(a12,b12,b22);if(b12.x===b22.x&&b12.y===b22.y)return pointToSegmentDistance(b12,a12,a2);if(doSegmentsIntersect(a12,a2,b12,b22))return 0;let distances=[pointToSegmentDistance(a12,b12,b22),pointToSegmentDistance(a2,b12,b22),pointToSegmentDistance(b12,a12,a2),pointToSegmentDistance(b22,a12,a2)];return Math.min(...distances)}function pointToSegmentDistance(p4,v5,w4){let l22=(w4.x-v5.x)**2+(w4.y-v5.y)**2;if(l22===0)return distance2(p4,v5);let t21=((p4.x-v5.x)*(w4.x-v5.x)+(p4.y-v5.y)*(w4.y-v5.y))/l22;t21=Math.max(0,Math.min(1,t21));let projection={x:v5.x+t21*(w4.x-v5.x),y:v5.y+t21*(w4.y-v5.y)};return distance2(p4,projection)}function distance2(p12,p22){let dx2=p12.x-p22.x,dy2=p12.y-p22.y;return Math.sqrt(dx2*dx2+dy2*dy2)}function getSegmentIntersection(a2,b3,u4,v5){let dx1=b3.x-a2.x,dy1=b3.y-a2.y,dx2=v5.x-u4.x,dy2=v5.y-u4.y,dx3=a2.x-u4.x,dy3=a2.y-u4.y,denominator=dx1*dy2-dy1*dx2;if(Math.abs(denominator)<1e-10)return null;let t21=(dy3*dx2-dx3*dy2)/denominator,s2=(dx1*dy3-dy1*dx3)/denominator,epsilon=1e-9;if(t21>=-epsilon&&t21<=1+epsilon&&s2>=-epsilon&&s2<=1+epsilon){let intersectionX=a2.x+t21*dx1,intersectionY=a2.y+t21*dy1;return{x:intersectionX,y:intersectionY}}return null}function doesSegmentIntersectRect(a2,b3,rect){let pointInside=p4=>p4.x>=rect.minX&&p4.x<=rect.maxX&&p4.y>=rect.minY&&p4.y<=rect.maxY;if(pointInside(a2)||pointInside(b3))return!0;let topLeft={x:rect.minX,y:rect.minY},topRight={x:rect.maxX,y:rect.minY},bottomLeft={x:rect.minX,y:rect.maxY},bottomRight={x:rect.maxX,y:rect.maxY};return doSegmentsIntersect(a2,b3,topLeft,topRight)||doSegmentsIntersect(a2,b3,topRight,bottomRight)||doSegmentsIntersect(a2,b3,bottomRight,bottomLeft)||doSegmentsIntersect(a2,b3,bottomLeft,topLeft)}function segmentToSegmentMinDistance(a2,b3,u4,v5){if(a2.x===b3.x&&a2.y===b3.y)return pointToSegmentDistance(a2,u4,v5);if(u4.x===v5.x&&u4.y===v5.y)return pointToSegmentDistance(u4,a2,b3);if(doSegmentsIntersect(a2,b3,u4,v5))return 0;let distances=[pointToSegmentDistance(a2,u4,v5),pointToSegmentDistance(b3,u4,v5),pointToSegmentDistance(u4,a2,b3),pointToSegmentDistance(v5,a2,b3)];return Math.min(...distances)}function segmentToBoundsMinDistance(a2,b3,bounds){let topLeft={x:bounds.minX,y:bounds.minY},topRight={x:bounds.maxX,y:bounds.minY},bottomLeft={x:bounds.minX,y:bounds.maxY},bottomRight={x:bounds.maxX,y:bounds.maxY};if(doSegmentsIntersect(a2,b3,topLeft,topRight)||doSegmentsIntersect(a2,b3,topRight,bottomRight)||doSegmentsIntersect(a2,b3,bottomRight,bottomLeft)||doSegmentsIntersect(a2,b3,bottomLeft,topLeft)||a2.x>=bounds.minX&&a2.x<=bounds.maxX&&a2.y>=bounds.minY&&a2.y<=bounds.maxY&&b3.x>=bounds.minX&&b3.x<=bounds.maxX&&b3.y>=bounds.minY&&b3.y<=bounds.maxY)return 0;let distances=[pointToSegmentDistance(topLeft,a2,b3),pointToSegmentDistance(topRight,a2,b3),pointToSegmentDistance(bottomLeft,a2,b3),pointToSegmentDistance(bottomRight,a2,b3)];if(a2.x>=bounds.minX&&a2.x<=bounds.maxX&&a2.y>=bounds.minY&&a2.y<=bounds.maxY||b3.x>=bounds.minX&&b3.x<=bounds.maxX&&b3.y>=bounds.minY&&b3.y<=bounds.maxY)return 0;if(a2.x<bounds.minX||a2.x>bounds.maxX||a2.y<bounds.minY||a2.y>bounds.maxY){let closestX=clamp(a2.x,bounds.minX,bounds.maxX),closestY=clamp(a2.y,bounds.minY,bounds.maxY);distances.push(distance2(a2,{x:closestX,y:closestY}))}if(b3.x<bounds.minX||b3.x>bounds.maxX||b3.y<bounds.minY||b3.y>bounds.maxY){let closestX=clamp(b3.x,bounds.minX,bounds.maxX),closestY=clamp(b3.y,bounds.minY,bounds.maxY);distances.push(distance2(b3,{x:closestX,y:closestY}))}return Math.min(...distances)}function segmentToBoxMinDistance(a2,b3,box2){let halfWidth=box2.width/2,halfHeight=box2.height/2,bounds={minX:box2.center.x-halfWidth,maxX:box2.center.x+halfWidth,minY:box2.center.y-halfHeight,maxY:box2.center.y+halfHeight};return segmentToBoundsMinDistance(a2,b3,bounds)}function segmentToCircleMinDistance(a2,b3,circle2){let circleCenter={x:circle2.x,y:circle2.y};if(a2.x===b3.x&&a2.y===b3.y)return Math.max(0,distance2(a2,circleCenter)-circle2.radius);let ab={x:b3.x-a2.x,y:b3.y-a2.y},ac3={x:circleCenter.x-a2.x,y:circleCenter.y-a2.y},abLengthSq=ab.x*ab.x+ab.y*ab.y,t21=Math.max(0,Math.min(1,(ab.x*ac3.x+ab.y*ac3.y)/abLengthSq)),closestPoint={x:a2.x+t21*ab.x,y:a2.y+t21*ab.y},distToCenter=distance2(closestPoint,circleCenter);return Math.max(0,distToCenter-circle2.radius)}function pointToSegmentClosestPoint(p4,a2,b3){let dx_ab=b3.x-a2.x,dy_ab=b3.y-a2.y,l22=dx_ab*dx_ab+dy_ab*dy_ab;if(l22===0)return{x:a2.x,y:a2.y};let t21=((p4.x-a2.x)*dx_ab+(p4.y-a2.y)*dy_ab)/l22;return t21=Math.max(0,Math.min(1,t21)),{x:a2.x+t21*dx_ab,y:a2.y+t21*dy_ab}}function normalizeDegrees(angle){return(angle%360+360)%360}function pointToBoxDistance(p4,box2){let halfWidth=box2.width/2,halfHeight=box2.height/2,minX=box2.center.x-halfWidth,maxX=box2.center.x+halfWidth,minY=box2.center.y-halfHeight,maxY=box2.center.y+halfHeight;if(p4.x>=minX&&p4.x<=maxX&&p4.y>=minY&&p4.y<=maxY)return 0;let closestX=clamp(p4.x,minX,maxX),closestY=clamp(p4.y,minY,maxY);return distance2(p4,{x:closestX,y:closestY})}function pointToBoundsDistance(p4,bounds){if(p4.x>=bounds.minX&&p4.x<=bounds.maxX&&p4.y>=bounds.minY&&p4.y<=bounds.maxY)return 0;let closestX=clamp(p4.x,bounds.minX,bounds.maxX),closestY=clamp(p4.y,bounds.minY,bounds.maxY);return distance2(p4,{x:closestX,y:closestY})}function midpoint(p12,p22){return{x:(p12.x+p22.x)/2,y:(p12.y+p22.y)/2}}function distSq(p12,p22){let dx2=p12.x-p22.x,dy2=p12.y-p22.y;return dx2*dx2+dy2*dy2}var universalRectToBounds=rect=>{if("minX"in rect)return rect;let halfWidth=rect.width/2,halfHeight=rect.height/2;return{minX:rect.center.x-halfWidth,minY:rect.center.y-halfHeight,maxX:rect.center.x+halfWidth,maxY:rect.center.y+halfHeight}},getBoundsCorners=bounds=>[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}],getPolygonEdges=polygon2=>{let edges=[];for(let i2=0;i2<polygon2.length;i2++){let start=polygon2[i2],end=polygon2[(i2+1)%polygon2.length];edges.push([start,end])}return edges},isPointOnSegment=(point6,start,end)=>{let cross3=(point6.y-start.y)*(end.x-start.x)-(point6.x-start.x)*(end.y-start.y);if(Math.abs(cross3)>1e-9)return!1;let dot=(point6.x-start.x)*(end.x-start.x)+(point6.y-start.y)*(end.y-start.y);if(dot<0)return!1;let squaredLength=(end.x-start.x)**2+(end.y-start.y)**2;return!(dot>squaredLength)},isPointInsideBounds=(point6,bounds)=>point6.x>=bounds.minX&&point6.x<=bounds.maxX&&point6.y>=bounds.minY&&point6.y<=bounds.maxY,isPointInsidePolygon=(point6,polygon2)=>{if(polygon2.length<3)return!1;let edges=getPolygonEdges(polygon2);for(let[start,end]of edges)if(isPointOnSegment(point6,start,end))return!0;let inside2=!1;for(let i2=0,j4=polygon2.length-1;i2<polygon2.length;j4=i2++){let xi3=polygon2[i2].x,yi3=polygon2[i2].y,xj=polygon2[j4].x,yj=polygon2[j4].y;yi3>point6.y!=yj>point6.y&&point6.x<(xj-xi3)*(point6.y-yi3)/(yj-yi3)+xi3&&(inside2=!inside2)}return inside2},doesPolygonIntersectBounds=(bounds,polygon2)=>{let boundsCorners=getBoundsCorners(bounds),boundsEdges=[[boundsCorners[0],boundsCorners[1]],[boundsCorners[1],boundsCorners[2]],[boundsCorners[2],boundsCorners[3]],[boundsCorners[3],boundsCorners[0]]],polygonEdges=getPolygonEdges(polygon2);for(let[start,end]of polygonEdges)for(let[rectStart,rectEnd]of boundsEdges)if(doSegmentsIntersect(start,end,rectStart,rectEnd))return!0;return!1},areBoundsOverlappingPolygon=(bounds,polygon2)=>polygon2.length<3?!1:polygon2.some(point6=>isPointInsideBounds(point6,bounds))||getBoundsCorners(bounds).some(corner=>isPointInsidePolygon(corner,polygon2))?!0:doesPolygonIntersectBounds(bounds,polygon2),areBoundsCompletelyInsidePolygon=(bounds,polygon2)=>polygon2.length<3||!getBoundsCorners(bounds).every(corner=>isPointInsidePolygon(corner,polygon2))?!1:!doesPolygonIntersectBounds(bounds,polygon2),isRectOverlappingPolygon=(rect,polygon2)=>areBoundsOverlappingPolygon(universalRectToBounds(rect),polygon2),isRectCompletelyInsidePolygon=(rect,polygon2)=>areBoundsCompletelyInsidePolygon(universalRectToBounds(rect),polygon2);function range(start,end,step=1){if(step===0)throw new Error("step cannot be 0");let _start,_end;end===void 0?(_start=0,_end=start):(_start=start,_end=end);let result=[];if(step>0)for(let i2=_start;i2<_end;i2+=step)result.push(i2);else for(let i2=_start;i2>_end;i2+=step)result.push(i2);return result}var boundsAreaOverlap=(bounds1,bounds2)=>{let overlapX=Math.max(0,Math.min(bounds1.maxX,bounds2.maxX)-Math.max(bounds1.minX,bounds2.minX)),overlapY=Math.max(0,Math.min(bounds1.maxY,bounds2.maxY)-Math.max(bounds1.minY,bounds2.minY));return overlapX*overlapY};var boundsDistance=(bounds1,bounds2)=>{let dx2=bounds1.maxX<bounds2.minX?bounds2.minX-bounds1.maxX:bounds2.maxX<bounds1.minX?bounds1.minX-bounds2.maxX:0,dy2=bounds1.maxY<bounds2.minY?bounds2.minY-bounds1.maxY:bounds2.maxY<bounds1.minY?bounds1.minY-bounds2.maxY:0;return Math.sqrt(dx2*dx2+dy2*dy2)};var boundsIntersection=(bounds1,bounds2)=>{let minX=Math.max(bounds1.minX,bounds2.minX),minY=Math.max(bounds1.minY,bounds2.minY),maxX=Math.min(bounds1.maxX,bounds2.maxX),maxY=Math.min(bounds1.maxY,bounds2.maxY);return minX>maxX||minY>maxY?null:{minX,minY,maxX,maxY}};var doBoundsOverlap=(bounds1,bounds2)=>!(bounds1.maxX<bounds2.minX||bounds2.maxX<bounds1.minX||bounds1.maxY<bounds2.minY||bounds2.maxY<bounds1.minY);var getBoundsFromPoints=points=>{if(points.length===0)return null;let minX=points[0].x,minY=points[0].y,maxX=points[0].x,maxY=points[0].y;for(let i2=1;i2<points.length;i2++){let point6=points[i2];point6.x<minX&&(minX=point6.x),point6.y<minY&&(minY=point6.y),point6.x>maxX&&(maxX=point6.x),point6.y>maxY&&(maxY=point6.y)}return{minX,minY,maxX,maxY}};var getUnitVectorFromPointAToB=(a2,b3)=>{let delta={x:b3.x-a2.x,y:b3.y-a2.y},magnitude=Math.sqrt(delta.x**2+delta.y**2);return{x:delta.x/magnitude,y:delta.y/magnitude}},getUnitVectorFromDirection=direction2=>{switch(direction2){case"up":return{x:0,y:1};case"down":return{x:0,y:-1};case"left":return{x:-1,y:0};case"right":return{x:1,y:0}}};function grid({rows,cols,xSpacing,ySpacing,width,height,offsetX=0,offsetY=0,yDirection="cartesian",centered=!0}){let effectiveXSpacing=xSpacing??1,effectiveYSpacing=ySpacing??1,totalWidth=width??cols*effectiveXSpacing,totalHeight=height??rows*effectiveYSpacing,centeringOffsetX=centered?-totalWidth/2:0,centeringOffsetY=centered?-totalHeight/2:0,cellWidth=width?width/cols:effectiveXSpacing,cellHeight=height?height/rows:effectiveYSpacing,cells=[];for(let row=0;row<rows;row++)for(let col=0;col<cols;col++){let index=row*cols+col,centerX=offsetX+centeringOffsetX+col*cellWidth+cellWidth/2,rawCenterY=offsetY+row*cellHeight+cellHeight/2,centerY=yDirection==="cartesian"?offsetY+centeringOffsetY+(rows-1-row)*cellHeight+cellHeight/2:offsetY+centeringOffsetY+row*cellHeight+cellHeight/2;cells.push({index,center:{x:centerX,y:centerY},topLeft:{x:centerX-cellWidth/2,y:centerY+cellHeight/2},bottomRight:{x:centerX+cellWidth/2,y:centerY-cellHeight/2},row,col})}return cells}init_dist();var import_debug6=__toESM(require_browser(),1);var import_debug=__toESM(require_browser(),1);init_dist();var import_debug2=__toESM(require_browser(),1),import_debug3=__toESM(require_browser(),1);init_dist();init_src();init_parsel();var su=(soup,options={})=>{let internalStore=soup._internal_store;if(!internalStore){internalStore={counts:{}},soup._internal_store=internalStore;for(let elm of soup){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop());Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}}return new Proxy({},{get:(proxy_target,component_type)=>component_type==="toArray"?()=>soup:{get:id2=>soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===id2),getUsing:using=>{let keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id",""),joiner=soup.find(e4=>e4.type===join_type&&e4[join_key]===using[join_key]);return joiner?soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return soup.find(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return soup.filter(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},insert:elm=>{var _a360;(_a360=internalStore.counts)[component_type]??(_a360[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};return options.validateInserts&&(dist_exports[component_type]??any_soup_element).parse(newElm),soup.push(newElm),newElm},delete:id2=>{let elm=soup.find(e4=>e4[`${component_type}_id`]===id2);elm&&soup.splice(soup.indexOf(elm),1)},update:(id2,newProps)=>{let elm=soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===id2);if(elm)return Object.assign(elm,newProps),elm},select:selector=>{if(component_type==="source_component")return soup.find(e4=>e4.type==="source_component"&&e4.name===selector.replace(/\./g,""));if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=soup.find(e4=>e4.type==="source_component"&&e4.name===component_name);if(!source_component)return null;let source_port2=soup.find(e4=>e4.type==="source_port"&&e4.source_component_id===source_component.source_component_id&&(e4.name===port_selector||(e4.port_hints??[]).includes(port_selector)));if(!source_port2)return null;if(component_type==="source_port")return source_port2;if(component_type==="pcb_port")return soup.find(e4=>e4.type==="pcb_port"&&e4.source_port_id===source_port2.source_port_id);if(component_type==="schematic_port")return soup.find(e4=>e4.type==="schematic_port"&&e4.source_port_id===source_port2.source_port_id)}}}})};su.unparsed=su;var su_default=su;var import_performance_now=__toESM(require_performance_now(),1);init_dist3();init_dist3();init_dist3();var urlAlphabet="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var nanoid=(size2=21)=>{let id2="",bytes=crypto.getRandomValues(new Uint8Array(size2|=0));for(;size2--;)id2+=urlAlphabet[bytes[size2]&63];return id2};init_dist3();var manDist=(a2,b3)=>Math.abs(a2.x-b3.x)+Math.abs(a2.y-b3.y),dirFromAToB=(a2,b3)=>{let dx2=b3.x-a2.x,dy2=b3.y-a2.y;return Math.abs(dx2)>Math.abs(dy2)?{dx:Math.sign(dx2),dy:0}:{dx:0,dy:Math.sign(dy2)}},distAlongDir=(A4,B5,dir)=>Math.abs(A4.x-B5.x)*Math.abs(dir.dx)+Math.abs(A4.y-B5.y)*Math.abs(dir.dy),nodeName=(node,GRID_STEP=.1)=>`${Math.round(node.x/GRID_STEP)},${Math.round(node.y/GRID_STEP)}`,isCloseTo=(a2,b3)=>Math.abs(a2-b3)<1e-4,getObstaclesFromRoute=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i2=0;i2<route.length-1;i2++){let[start,end]=[route[i2],route[i2+1]],prev=i2-1>=0?route[i2-1]:null,isHorz=isCloseTo(start.y,end.y),isVert=isCloseTo(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles},ObstacleList=class{constructor(obstacles){__publicField(this,"obstacles");__publicField(this,"GRID_STEP",.1);this.obstacles=obstacles.map(obstacle=>({...obstacle,left:obstacle.center.x-obstacle.width/2,right:obstacle.center.x+obstacle.width/2,top:obstacle.center.y+obstacle.height/2,bottom:obstacle.center.y-obstacle.height/2}))}getObstacleAt(x5,y5,m3){m3??(m3=this.GRID_STEP);for(let obstacle of this.obstacles){let halfWidth=obstacle.width/2+m3,halfHeight=obstacle.height/2+m3;if(x5>=obstacle.center.x-halfWidth&&x5<=obstacle.center.x+halfWidth&&y5>=obstacle.center.y-halfHeight&&y5<=obstacle.center.y+halfHeight)return obstacle}return null}isObstacleAt(x5,y5,m3){return this.getObstacleAt(x5,y5,m3)!==null}getDirectionDistancesToNearestObstacle(x5,y5){let{GRID_STEP}=this,result={left:1/0,top:1/0,bottom:1/0,right:1/0};for(let obstacle of this.obstacles)if(obstacle.type==="rect"){let left=obstacle.center.x-obstacle.width/2-GRID_STEP,right=obstacle.center.x+obstacle.width/2+GRID_STEP,top=obstacle.center.y+obstacle.height/2+GRID_STEP,bottom=obstacle.center.y-obstacle.height/2-GRID_STEP;y5>=bottom&&y5<=top&&x5>left&&(result.left=Math.min(result.left,x5-right)),y5>=bottom&&y5<=top&&x5<right&&(result.right=Math.min(result.right,left-x5)),x5>=left&&x5<=right&&y5<top&&(result.top=Math.min(result.top,bottom-y5)),x5>=left&&x5<=right&&y5>bottom&&(result.bottom=Math.min(result.bottom,y5-top))}return result}getOrthoDirectionCollisionInfo(point6,dir,{margin=0}={}){let{x:x5,y:y5}=point6,{dx:dx2,dy:dy2}=dir,minDistance=1/0,collisionObstacle=null;for(let obstacle of this.obstacles){let leftMargin=obstacle.left-margin,rightMargin=obstacle.right+margin,topMargin=obstacle.top+margin,bottomMargin=obstacle.bottom-margin,distance8=null;dx2===1&&dy2===0?y5>bottomMargin&&y5<topMargin&&x5<obstacle.left&&(distance8=obstacle.left-x5):dx2===-1&&dy2===0?y5>bottomMargin&&y5<topMargin&&x5>obstacle.right&&(distance8=x5-obstacle.right):dx2===0&&dy2===1?x5>leftMargin&&x5<rightMargin&&y5<obstacle.bottom&&(distance8=obstacle.bottom-y5):dx2===0&&dy2===-1&&x5>leftMargin&&x5<rightMargin&&y5>obstacle.top&&(distance8=y5-obstacle.top),distance8!==null&&distance8<minDistance&&(minDistance=distance8,collisionObstacle=obstacle)}return{dx:dx2,dy:dy2,wallDistance:minDistance,obstacle:collisionObstacle}}getObstaclesOverlappingRegion(region){let obstacles=[];for(let obstacle of this.obstacles){let{left,right,top,bottom}=obstacle;left<=region.maxX&&right>=region.minX&&top<=region.maxY&&bottom>=region.minY&&obstacles.push(obstacle)}return obstacles}};function removePathLoops(path){if(path.length<4)return path;let result=[{...path[0]}],currentLayer=path[0].layer;for(let i2=1;i2<path.length;i2++){let currentSegment={start:path[i2-1],end:path[i2]},isVia=path[i2].route_type==="via"||path[i2-1].route_type==="via";if(path[i2].layer!==currentLayer||isVia){result.push({...path[i2]}),currentLayer=path[i2].layer;continue}let intersectionFound=!1,intersectionPoint=null,intersectionIndex=-1;for(let j4=0;j4<result.length-1;j4++){let previousSegment={start:result[j4],end:result[j4+1]};if(previousSegment.start.layer===currentSegment.start.layer&&previousSegment.start.layer===currentSegment.start.layer){let intersection=findIntersection(previousSegment,currentSegment);if(intersection){intersectionFound=!0,intersectionPoint={...intersection,layer:currentLayer},intersectionIndex=j4;break}}}intersectionFound&&intersectionPoint&&(result.splice(intersectionIndex+1),result.push(intersectionPoint));let lastPoint=result[result.length-1];(lastPoint.x!==path[i2].x||lastPoint.y!==path[i2].y)&&result.push(path[i2])}return result}function findIntersection(segment1,segment2){if(segment1.start.x===segment1.end.x&&segment2.start.x===segment2.end.x||segment1.start.y===segment1.end.y&&segment2.start.y===segment2.end.y)return null;let intersectionPoint;if(segment1.start.x===segment1.end.x){let x5=segment1.start.x,y5=segment2.start.y;intersectionPoint={...segment1.start,x:x5,y:y5}}else{let x5=segment2.start.x,y5=segment1.start.y;intersectionPoint={...segment1.start,x:x5,y:y5}}return isPointInSegment(intersectionPoint,segment1)&&isPointInSegment(intersectionPoint,segment2)?intersectionPoint:null}function isPointInSegment(point6,segment2){return point6.x>=Math.min(segment2.start.x,segment2.end.x)&&point6.x<=Math.max(segment2.start.x,segment2.end.x)&&point6.y>=Math.min(segment2.start.y,segment2.end.y)&&point6.y<=Math.max(segment2.start.y,segment2.end.y)}function addViasWhenLayerChanges(route){let newRoute=[route[0]];for(let i2=1;i2<route.length-1;i2++){let[prev,current2,next2]=[route[i2-1],route[i2],route[i2+1]];newRoute.push(current2),!(current2.route_type!=="wire"||prev.route_type!=="wire"||next2.route_type!=="wire")&&prev.layer===current2.layer&¤t2.layer!==next2.layer&&newRoute.push({route_type:"via",from_layer:current2.layer,to_layer:next2.layer,x:current2.x,y:current2.y})}return newRoute.push(route[route.length-1]),newRoute}var debug=(0,import_debug2.default)("autorouter:shortenPathWithShortcuts");function shortenPathWithShortcuts(route,checkIfObstacleBetweenPoints){if(route.length<=2)return route;let shortened=[route[0]];for(let i2=1;i2<route.length;i2++){let currentSegment={start:shortened[shortened.length-1],end:route[i2]},skipToIndex=-1,currentSegmentIsVertical=currentSegment.start.x===currentSegment.end.x,currentSegmentIsHorizontal=currentSegment.start.y===currentSegment.end.y;for(let j4=i2+1;j4<route.length;j4++){if(j4<=skipToIndex)continue;let futureSegment={start:route[j4],end:route[j4+1]};if(!futureSegment.end)continue;let futureSegmentIsVertical=futureSegment.start.x===futureSegment.end.x,futureSegmentIsHorizontal=futureSegment.start.y===futureSegment.end.y,bothVertical=currentSegmentIsVertical&&futureSegmentIsVertical,bothHorizontal=currentSegmentIsHorizontal&&futureSegmentIsHorizontal;if(bothHorizontal&&bothVertical||!(bothVertical||bothHorizontal))continue;let overlapping=!1,currentMinX=Math.min(currentSegment.start.x,currentSegment.end.x),currentMaxX=Math.max(currentSegment.start.x,currentSegment.end.x),futureMinX=Math.min(futureSegment.start.x,futureSegment.end.x),futureMaxX=Math.max(futureSegment.start.x,futureSegment.end.x),currentMinY=Math.min(currentSegment.start.y,currentSegment.end.y),currentMaxY=Math.max(currentSegment.start.y,currentSegment.end.y),futureMinY=Math.min(futureSegment.start.y,futureSegment.end.y),futureMaxY=Math.max(futureSegment.start.y,futureSegment.end.y);if(bothHorizontal?overlapping=currentMinX<=futureMaxX&¤tMaxX>=futureMinX:bothVertical&&(overlapping=currentMinY<=futureMaxY&¤tMaxY>=futureMinY),!overlapping)continue;let candidateShortcuts=[],pointBeforeShortcut=shortened[shortened.length-1],pointAfterShortcut=route[j4+2];if(!pointAfterShortcut)continue;bothHorizontal&&futureMinX<currentMaxX&&pointAfterShortcut.x===futureMinX&&candidateShortcuts.push({x:futureMinX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothHorizontal&&futureMaxX>currentMinX&&pointAfterShortcut.x===futureMaxX&&candidateShortcuts.push({x:futureMaxX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothVertical&&futureMinY<currentMaxY&&pointAfterShortcut.y===futureMinY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMinY,layer:currentSegment.start.layer}),bothVertical&&futureMaxY>currentMinY&&pointAfterShortcut.y===futureMaxY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMaxY,layer:currentSegment.start.layer});let shortcutPoint=null;for(let candidateShortcut of candidateShortcuts)if(!(checkIfObstacleBetweenPoints(pointBeforeShortcut,candidateShortcut)||checkIfObstacleBetweenPoints(pointAfterShortcut,candidateShortcut))){shortcutPoint=candidateShortcut;break}if(shortcutPoint){shortened.push(shortcutPoint),i2=j4+1,skipToIndex=j4+1;break}}skipToIndex===-1&&shortened.push(route[i2])}return shortened[shortened.length-1]!==route[route.length-1]&&shortened.push(route[route.length-1]),shortened}var debug2=(0,import_debug.default)("autorouting-dataset:astar"),GeneralizedAstarAutorouter=class{constructor(opts){__publicField(this,"openSet",[]);__publicField(this,"closedSet",new Set);__publicField(this,"debug",!1);__publicField(this,"debugSolutions");__publicField(this,"debugMessage",null);__publicField(this,"debugTraceCount",0);__publicField(this,"input");__publicField(this,"obstacles");__publicField(this,"allObstacles");__publicField(this,"startNode");__publicField(this,"goalPoint");__publicField(this,"GRID_STEP");__publicField(this,"OBSTACLE_MARGIN");__publicField(this,"MAX_ITERATIONS");__publicField(this,"isRemovePathLoopsEnabled");__publicField(this,"isShortenPathWithShortcutsEnabled");__publicField(this,"GREEDY_MULTIPLIER",1.1);__publicField(this,"iterations",-1);this.input=opts.input,this.allObstacles=opts.input.obstacles,this.startNode=opts.startNode,this.goalPoint=opts.goalPoint?{l:0,...opts.goalPoint}:void 0,this.GRID_STEP=opts.GRID_STEP??.1,this.OBSTACLE_MARGIN=opts.OBSTACLE_MARGIN??.15,this.MAX_ITERATIONS=opts.MAX_ITERATIONS??100,this.debug=opts.debug??debug2.enabled,this.isRemovePathLoopsEnabled=opts.isRemovePathLoopsEnabled??!1,this.isShortenPathWithShortcutsEnabled=opts.isShortenPathWithShortcutsEnabled??!1,this.debug&&(debug2.enabled=!0),debug2.enabled&&(this.debugSolutions={},this.debugMessage="")}getNeighbors(node){return[]}isSameNode(a2,b3){return manDist(a2,b3)<this.GRID_STEP}computeG(current2,neighbor){return current2.g+manDist(current2,neighbor)}computeH(node){return manDist(node,this.goalPoint)}getNodeName(node){return nodeName(node,this.GRID_STEP)}solveOneStep(){this.iterations+=1;let{openSet,closedSet,GRID_STEP,goalPoint}=this;openSet.sort((a2,b3)=>a2.f-b3.f);let current2=openSet.shift();if(this.computeH(current2)<=GRID_STEP*2)return{solved:!0,current:current2,newNeighbors:[]};this.closedSet.add(this.getNodeName(current2));let newNeighbors=[];for(let neighbor of this.getNeighbors(current2)){if(closedSet.has(this.getNodeName(neighbor)))continue;let tentativeG=this.computeG(current2,neighbor),existingNeighbor=this.openSet.find(n3=>this.isSameNode(n3,neighbor));if(!existingNeighbor||tentativeG<existingNeighbor.g){let h4=this.computeH(neighbor),f2=tentativeG+h4*this.GREEDY_MULTIPLIER,neighborNode={...neighbor,g:tentativeG,h:h4,f:f2,obstacleHit:neighbor.obstacleHit??void 0,manDistFromParent:manDist(current2,neighbor),nodesInPath:current2.nodesInPath+1,parent:current2,enterMarginCost:neighbor.enterMarginCost,travelMarginCostFactor:neighbor.travelMarginCostFactor};openSet.push(neighborNode),newNeighbors.push(neighborNode)}}return debug2.enabled&&(openSet.sort((a2,b3)=>a2.f-b3.f),this.drawDebugSolution({current:current2,newNeighbors})),{solved:!1,current:current2,newNeighbors}}getStartNode(connection){return{x:connection.pointsToConnect[0].x,y:connection.pointsToConnect[0].y,manDistFromParent:0,f:0,g:0,h:0,nodesInPath:0,parent:null}}layerToIndex(layer){return 0}indexToLayer(index){return"top"}preprocessConnectionBeforeSolving(connection){return connection}solveConnection(connection){if(connection.pointsToConnect.length>2)throw new Error("GeneralizedAstarAutorouter doesn't currently support 2+ points in a connection");connection=this.preprocessConnectionBeforeSolving(connection);let{pointsToConnect}=connection;for(this.iterations=0,this.closedSet=new Set,this.startNode=this.getStartNode(connection),this.goalPoint={...pointsToConnect[pointsToConnect.length-1],l:this.layerToIndex(pointsToConnect[pointsToConnect.length-1].layer)},this.openSet=[this.startNode];this.iterations<this.MAX_ITERATIONS;){let{solved,current:current2}=this.solveOneStep();if(solved){let route=[],node=current2;for(;node;){let l3=node.l;route.unshift({x:node.x,y:node.y,layer:l3!==void 0?this.indexToLayer(l3):pointsToConnect[0].layer}),node=node.parent}return debug2.enabled&&(this.debugMessage+=`t${this.debugTraceCount}: ${this.iterations} iterations
|
|
350
350
|
`),this.isRemovePathLoopsEnabled&&(route=removePathLoops(route)),this.isShortenPathWithShortcutsEnabled&&(route=shortenPathWithShortcuts(route,(A4,B5)=>{if(A4.x===B5.x&&A4.y===B5.y)return!1;let collision=this.obstacles.getOrthoDirectionCollisionInfo({x:A4.x,y:A4.y,l:this.layerToIndex(A4.layer)??0},{dx:Math.sign(B5.x-A4.x),dy:Math.sign(B5.y-A4.y),dl:0},{margin:.05}),dist3=Math.sqrt((A4.x-B5.x)**2+(A4.y-B5.y)**2);return collision.wallDistance<dist3})),{solved:!0,route,connectionName:connection.name}}if(this.openSet.length===0)break}return debug2.enabled&&(this.debugMessage+=`t${this.debugTraceCount}: ${this.iterations} iterations (failed)
|
|
351
351
|
`),{solved:!1,connectionName:connection.name}}createObstacleList({dominantLayer,connection,obstaclesFromTraces}){return new ObstacleList(this.allObstacles.filter(obstacle=>!obstacle.connectedTo.includes(connection.name)).filter(obstacle=>obstacle.layers.includes(dominantLayer)).concat(obstaclesFromTraces??[]))}postprocessConnectionSolveResult(connection,result){return result}solve(){let solutions=[],obstaclesFromTraces=[];this.debugTraceCount=0;for(let connection of this.input.connections){let dominantLayer=connection.pointsToConnect[0].layer??"top";this.debugTraceCount+=1,this.obstacles=this.createObstacleList({dominantLayer,connection,obstaclesFromTraces});let result=this.solveConnection(connection);result=this.postprocessConnectionSolveResult(connection,result),solutions.push(result),debug2.enabled&&this.drawDebugTraceObstacles(obstaclesFromTraces),result.solved&&obstaclesFromTraces.push(...getObstaclesFromRoute(result.route.map(p4=>({x:p4.x,y:p4.y,layer:p4.layer??dominantLayer})),connection.name))}return solutions}solveAndMapToTraces(){return this.solve().flatMap(solution=>solution.solved?[{type:"pcb_trace",pcb_trace_id:`pcb_trace_for_${solution.connectionName}`,route:addViasWhenLayerChanges(solution.route.map(point6=>({route_type:"wire",x:point6.x,y:point6.y,width:this.input.minTraceWidth,layer:point6.layer})))}]:[])}getDebugGroup(){let dgn=`t${this.debugTraceCount}_iter[${this.iterations-1}]`;return this.iterations<30||this.iterations<100&&this.iterations%10===0||this.iterations<1e3&&this.iterations%100===0||!this.debugSolutions?dgn:null}drawDebugTraceObstacles(obstacles){let{debugTraceCount,debugSolutions}=this;for(let key in debugSolutions)key.startsWith(`t${debugTraceCount}_`)&&debugSolutions[key].push(...obstacles.map((obstacle,i2)=>({type:"pcb_smtpad",pcb_component_id:"",layer:obstacle.layers[0],width:obstacle.width,shape:"rect",x:obstacle.center.x,y:obstacle.center.y,pcb_smtpad_id:`trace_obstacle_${i2}`,height:obstacle.height})))}drawDebugSolution({current:current2,newNeighbors}){let debugGroup=this.getDebugGroup();if(!debugGroup)return;let{openSet,debugTraceCount,debugSolutions}=this;debugSolutions[debugGroup]??(debugSolutions[debugGroup]=[]);let debugSolution=debugSolutions[debugGroup];debugSolution.push({type:"pcb_fabrication_note_text",pcb_fabrication_note_text_id:`debug_note_${current2.x}_${current2.y}`,font:"tscircuit2024",font_size:.25,text:"X"+(current2.l!==void 0?current2.l:""),pcb_component_id:"",layer:"top",anchor_position:{x:current2.x,y:current2.y},anchor_alignment:"center"});for(let i2=0;i2<openSet.length;i2++){let node=openSet[i2];debugSolution.push({type:"pcb_fabrication_note_path",pcb_component_id:"",pcb_fabrication_note_path_id:`note_path_${node.x}_${node.y}`,layer:"top",route:[[0,.05],[.05,0],[0,-.05],[-.05,0],[0,.05]].map(([dx2,dy2])=>({x:node.x+dx2,y:node.y+dy2})),stroke_width:.01}),debugSolution.push({type:"pcb_fabrication_note_text",pcb_fabrication_note_text_id:`debug_note_${node.x}_${node.y}`,font:"tscircuit2024",font_size:.03,text:i2.toString(),pcb_component_id:"",layer:"top",anchor_position:{x:node.x,y:node.y},anchor_alignment:"center"})}if(current2.parent){let path=[],p4=current2;for(;p4;)path.unshift(p4),p4=p4.parent;debugSolution.push({type:"pcb_fabrication_note_path",pcb_component_id:"",pcb_fabrication_note_path_id:`note_path_${current2.x}_${current2.y}`,layer:"top",route:path,stroke_width:.01})}}},debug3=(0,import_debug3.default)("autorouting-dataset:infinite-grid-ijump-astar:get-distance-to-overcome-obstacle");function getDistanceToOvercomeObstacle({node,travelDir,wallDir,obstacle,obstacles,obstaclesInRow=0,OBSTACLE_MARGIN=.15,SHOULD_DETECT_CONJOINED_OBSTACLES=!1,MAX_CONJOINED_OBSTACLES=20}){let distToOvercomeObstacle;if(travelDir.dx===0?travelDir.dy>0?distToOvercomeObstacle=obstacle.center.y+obstacle.height/2-node.y:distToOvercomeObstacle=node.y-(obstacle.center.y-obstacle.height/2):travelDir.dx>0?distToOvercomeObstacle=obstacle.center.x+obstacle.width/2-node.x:distToOvercomeObstacle=node.x-(obstacle.center.x-obstacle.width/2),distToOvercomeObstacle+=OBSTACLE_MARGIN,SHOULD_DETECT_CONJOINED_OBSTACLES&&obstaclesInRow<MAX_CONJOINED_OBSTACLES){let obstacleAtEnd=obstacles.getObstacleAt(node.x+travelDir.dx*distToOvercomeObstacle+wallDir.dx*(wallDir.wallDistance+.001),node.y+travelDir.dy*distToOvercomeObstacle+wallDir.dy*(wallDir.wallDistance+.001));if(obstacleAtEnd===obstacle)return distToOvercomeObstacle;if(obstacleAtEnd&&obstacleAtEnd.type==="rect"){let extendingAlongXAxis=travelDir.dy===0,o1OrthoDim=extendingAlongXAxis?obstacle.height:obstacle.width;if((extendingAlongXAxis?obstacleAtEnd.height:obstacleAtEnd.width)>o1OrthoDim)return debug3("next obstacle on path is bigger, not trying to overcome it"),distToOvercomeObstacle;let endObstacleDistToOvercome=getDistanceToOvercomeObstacle({node:{x:node.x+travelDir.dx*distToOvercomeObstacle,y:node.y+travelDir.dy*distToOvercomeObstacle},travelDir,wallDir,obstacle:obstacleAtEnd,obstacles,obstaclesInRow:obstaclesInRow+1,SHOULD_DETECT_CONJOINED_OBSTACLES,MAX_CONJOINED_OBSTACLES,OBSTACLE_MARGIN});distToOvercomeObstacle+=endObstacleDistToOvercome}}return distToOvercomeObstacle}var IJumpAutorouter=class extends GeneralizedAstarAutorouter{constructor(){super(...arguments);__publicField(this,"MAX_ITERATIONS",200)}getNeighbors(node){let obstacles=this.obstacles,goalPoint=this.goalPoint,forwardDir;node.parent?forwardDir=dirFromAToB(node.parent,node):forwardDir=dirFromAToB(node,goalPoint);let travelDirs1=[{dx:0,dy:1},{dx:1,dy:0},{dx:0,dy:-1},{dx:-1,dy:0}].filter(dir=>dir.dx===forwardDir.dx*-1&&dir.dy===forwardDir.dy*-1?!1:!(dir.dx===forwardDir.dx&&dir.dy===forwardDir.dy&&node.parent?.obstacleHit)).map(dir=>obstacles.getOrthoDirectionCollisionInfo(node,dir,{margin:this.OBSTACLE_MARGIN})).filter(dir=>dir.wallDistance>=this.OBSTACLE_MARGIN),travelDirs2=[];for(let travelDir of travelDirs1){let overcomeDistance=null;node?.obstacleHit&&(overcomeDistance=getDistanceToOvercomeObstacle({node,travelDir,wallDir:{...forwardDir,wallDistance:this.OBSTACLE_MARGIN},obstacle:node.obstacleHit,obstacles,OBSTACLE_MARGIN:this.OBSTACLE_MARGIN,SHOULD_DETECT_CONJOINED_OBSTACLES:!0}));let goalDistAlongTravelDir=distAlongDir(node,goalPoint,travelDir),isGoalInTravelDir=(travelDir.dx===0||Math.sign(goalPoint.x-node.x)===travelDir.dx)&&(travelDir.dy===0||Math.sign(goalPoint.y-node.y)===travelDir.dy);goalDistAlongTravelDir<travelDir.wallDistance&&goalDistAlongTravelDir>0&&isGoalInTravelDir?travelDirs2.push({...travelDir,travelDistance:goalDistAlongTravelDir}):overcomeDistance!==null&&overcomeDistance<travelDir.wallDistance?travelDirs2.push({...travelDir,travelDistance:overcomeDistance}):travelDir.wallDistance!==1/0&&travelDirs2.push({...travelDir,travelDistance:travelDir.wallDistance-this.OBSTACLE_MARGIN})}return travelDirs2.filter(dir=>!obstacles.isObstacleAt(node.x+dir.dx*dir.travelDistance,node.y+dir.dy*dir.travelDistance)).map(dir=>({x:node.x+dir.dx*dir.travelDistance,y:node.y+dir.dy*dir.travelDistance,obstacleHit:dir.obstacle}))}};function generateApproximatingRects(rotatedRect,numRects=4){let{center:center2,width,height,rotation:rotation4}=rotatedRect,rects=[],angleRad=rotation4*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),normalizedRotation=(rotation4%360+360)%360;if(height<=width?normalizedRotation>=45&&normalizedRotation<135||normalizedRotation>=225&&normalizedRotation<315:normalizedRotation>=135&&normalizedRotation<225||normalizedRotation>=315||normalizedRotation<45){let sliceWidth=width/numRects;for(let i2=0;i2<numRects;i2++){let x5=(i2-numRects/2+.5)*sliceWidth,rotatedX=-x5*cosAngle,rotatedY=-x5*sinAngle,coverageWidth=sliceWidth*1.1,coverageHeight=Math.abs(height*cosAngle)+Math.abs(sliceWidth*sinAngle);rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}else{let sliceHeight=height/numRects;for(let i2=0;i2<numRects;i2++){let y5=(i2-numRects/2+.5)*sliceHeight,rotatedX=-y5*sinAngle,rotatedY=y5*cosAngle,coverageWidth=Math.abs(width*cosAngle)+Math.abs(sliceHeight*sinAngle),coverageHeight=sliceHeight*1.1;rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}return rects}var EVERY_LAYER=["top","inner1","inner2","bottom"],getObstaclesFromCircuitJson=(soup,connMap)=>{let withNetId=idList=>connMap?idList.concat(idList.map(id2=>connMap?.getNetConnectedToId(id2)).filter(Boolean)):idList,obstacles=[];for(let element of soup)if(element.type==="pcb_smtpad"){if(element.shape==="circle")obstacles.push({type:"oval",layers:[element.layer],center:{x:element.x,y:element.y},width:element.radius*2,height:element.radius*2,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rect")obstacles.push({type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rotated_rect"){let rotatedRect={center:{x:element.x,y:element.y},width:element.width,height:element.height,rotation:element.ccw_rotation},approximatingRects=generateApproximatingRects(rotatedRect);for(let rect of approximatingRects)obstacles.push({type:"rect",layers:[element.layer],center:rect.center,width:rect.width,height:rect.height,connectedTo:withNetId([element.pcb_smtpad_id])})}}else if(element.type==="pcb_keepout")element.shape==="circle"?obstacles.push({type:"oval",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.radius*2,height:element.radius*2,connectedTo:[]}):element.shape==="rect"&&obstacles.push({type:"rect",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.type==="pcb_hole")element.hole_shape==="oval"?obstacles.push({type:"oval",center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="square"?obstacles.push({type:"rect",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]}):(element.hole_shape==="round"||element.hole_shape==="circle")&&obstacles.push({type:"rect",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]});else if(element.type==="pcb_plated_hole")element.shape==="circle"?obstacles.push({type:"oval",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.outer_diameter,height:element.outer_diameter,connectedTo:withNetId([element.pcb_plated_hole_id])}):(element.shape==="oval"||element.shape==="pill")&&obstacles.push({type:"oval",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.type==="pcb_trace"){let traceObstacles=getObstaclesFromRoute(element.route.map(rp2=>({x:rp2.x,y:rp2.y,layer:"layer"in rp2?rp2.layer:rp2.from_layer})),element.source_trace_id);obstacles.push(...traceObstacles)}else element.type==="pcb_via"&&obstacles.push({type:"rect",layers:element.layers,center:{x:element.x,y:element.y},connectedTo:[],width:element.outer_diameter,height:element.outer_diameter});return obstacles};function getAlternativeGoalBoxes(params){let{pcbConnMap,goalElementId}=params;if(!goalElementId.startsWith("pcb_port_"))throw new Error(`Currently alternative goal boxes must have a goal id with prefix "pcb_port_" (got ${goalElementId})`);let goalTraces=pcbConnMap.getAllTracesConnectedToPort(goalElementId);return getObstaclesFromCircuitJson(goalTraces).map(obs=>({...obs,connectedTo:[goalElementId]}))}var getConnectionWithAlternativeGoalBoxes=params=>{let{connection,pcbConnMap}=params;if(connection.pointsToConnect.length!==2)throw new Error(`Connection must have exactly 2 points for alternative goal boxes (got ${connection.pointsToConnect.length})`);let[a2,b3]=connection.pointsToConnect;if(!a2.pcb_port_id||!b3.pcb_port_id)throw new Error(`Connection points must have pcb_port_id for alternative goal box calculation (got ${a2.pcb_port_id} and ${b3.pcb_port_id})`);let goalBoxesA=getAlternativeGoalBoxes({goalElementId:a2.pcb_port_id,pcbConnMap}).concat([{center:a2,width:.01,height:.01,connectedTo:[a2.pcb_port_id],layers:[a2.layer],type:"rect"}]),goalBoxesB=getAlternativeGoalBoxes({goalElementId:b3.pcb_port_id,pcbConnMap}).concat([{center:b3,width:.01,height:.01,connectedTo:[b3.pcb_port_id],layers:[b3.layer],type:"rect"}]);if(goalBoxesA.length<=1&&goalBoxesB.length<=1)return{...connection,startPoint:a2,endPoint:b3,goalBoxes:[]};let nearestPoints=findNearestPointsBetweenBoxSets(goalBoxesA,goalBoxesB),startPoint,endPoint,goalBoxes;return goalBoxesA.length>=goalBoxesB.length?(startPoint={...b3,...nearestPoints.pointB},endPoint={...a2,...nearestPoints.pointA},goalBoxes=goalBoxesA):(startPoint={...a2,...nearestPoints.pointA},endPoint={...b3,...nearestPoints.pointB},goalBoxes=goalBoxesB),{startPoint,endPoint,goalBoxes,name:connection.name,pointsToConnect:[startPoint,endPoint]}},getSimpleRouteJson=(circuitJson,opts={})=>{let routeJson={minTraceWidth:.1};routeJson.layerCount=opts.layerCount??1,routeJson.obstacles=getObstaclesFromCircuitJson(circuitJson,opts.connMap),routeJson.connections=[];for(let element of circuitJson)if(element.type==="source_trace"){if(circuitJson.some(e4=>e4.type==="pcb_trace"&&e4.source_trace_id===element.source_trace_id))continue;let connection={name:element.source_trace_id,pointsToConnect:element.connected_source_port_ids.map(portId=>{let pcb_port2=su_default(circuitJson).pcb_port.getWhere({source_port_id:portId});if(!pcb_port2)throw new Error(`Could not find pcb_port for source_port_id "${portId}"`);return{x:pcb_port2.x,y:pcb_port2.y,layer:pcb_port2.layers?.[0]??"top",pcb_port_id:pcb_port2.pcb_port_id}})};if(opts.optimizeWithGoalBoxes){let pcbConnMap=new PcbConnectivityMap(circuitJson);connection=getConnectionWithAlternativeGoalBoxes({connection,pcbConnMap})}routeJson.connections.push(connection),markObstaclesAsConnected(routeJson.obstacles,connection.pointsToConnect,connection.name)}let bounds={minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0};for(let obstacle of routeJson.obstacles)bounds.minX=Math.min(bounds.minX,obstacle.center.x-obstacle.width/2),bounds.maxX=Math.max(bounds.maxX,obstacle.center.x+obstacle.width/2),bounds.minY=Math.min(bounds.minY,obstacle.center.y-obstacle.height/2),bounds.maxY=Math.max(bounds.maxY,obstacle.center.y+obstacle.height/2);for(let connection of routeJson.connections)for(let point6 of connection.pointsToConnect)bounds.minX=Math.min(bounds.minX,point6.x),bounds.maxX=Math.max(bounds.maxX,point6.x),bounds.minY=Math.min(bounds.minY,point6.y),bounds.maxY=Math.max(bounds.maxY,point6.y);return routeJson.bounds=bounds,routeJson},markObstaclesAsConnected=(obstacles,pointsToConnect,connectionName)=>{for(let point6 of pointsToConnect)for(let obstacle of obstacles)isPointInsideObstacle(point6,obstacle)&&obstacle.connectedTo.push(connectionName)};function isPointInsideObstacle(point6,obstacle){let halfWidth=obstacle.width/2,halfHeight=obstacle.height/2;if(obstacle.type==="rect")return point6.x>=obstacle.center.x-halfWidth&&point6.x<=obstacle.center.x+halfWidth&&point6.y>=obstacle.center.y-halfHeight&&point6.y<=obstacle.center.y+halfHeight;if(obstacle.type==="oval"){let normalizedX=(point6.x-obstacle.center.x)/halfWidth,normalizedY=(point6.y-obstacle.center.y)/halfHeight;return normalizedX*normalizedX+normalizedY*normalizedY<=1}return!1}function dirFromAToB2(nodeA,nodeB){let dx2=nodeB.x>nodeA.x?1:nodeB.x<nodeA.x?-1:0,dy2=nodeB.y>nodeA.y?1:nodeB.y<nodeA.y?-1:0,dl3=nodeB.l>nodeA.l?1:nodeB.l<nodeA.l?-1:0;return{dx:dx2,dy:dy2,dl:dl3}}var LAYER_COUNT_INDEX_MAP={1:["top"],2:["top","bottom"],4:["top","inner1","inner2","bottom"]},getLayerNamesForLayerCount=layerCount=>LAYER_COUNT_INDEX_MAP[layerCount];function getLayerIndex(layerCount,layer){let index=LAYER_COUNT_INDEX_MAP[layerCount].indexOf(layer);if(index===-1)throw new Error(`Invalid layer for getLayerIndex (for layerCount === ${layerCount}): "${layer}"`);return index}function indexToLayer(layerCount,index){let layer=LAYER_COUNT_INDEX_MAP[layerCount][index];if(!layer)throw new Error(`Invalid index for indexToLayer (for layerCount === ${layerCount}): "${index}"`);return layer}var ObstacleList3d=class extends ObstacleList{constructor(layerCount,obstacles){super([]);__publicField(this,"obstacles");__publicField(this,"GRID_STEP",.1);__publicField(this,"layerCount");this.layerCount=layerCount;let availableLayers=getLayerNamesForLayerCount(layerCount);this.obstacles=obstacles.flatMap(obstacle=>obstacle.layers.filter(layer=>availableLayers.includes(layer)).map(layer=>({...obstacle,left:obstacle.center.x-obstacle.width/2,right:obstacle.center.x+obstacle.width/2,top:obstacle.center.y+obstacle.height/2,bottom:obstacle.center.y-obstacle.height/2,l:getLayerIndex(layerCount,layer)})))}getObstacleAt(x5,y5,l3,m3){m3??(m3=this.GRID_STEP);for(let obstacle of this.obstacles){if(obstacle.l!==l3)continue;let halfWidth=obstacle.width/2+m3,halfHeight=obstacle.height/2+m3;if(x5>=obstacle.center.x-halfWidth&&x5<=obstacle.center.x+halfWidth&&y5>=obstacle.center.y-halfHeight&&y5<=obstacle.center.y+halfHeight)return obstacle}return null}isObstacleAt(x5,y5,l3,m3){return this.getObstacleAt(x5,y5,l3,m3)!==null}getDirectionDistancesToNearestObstacle3d(x5,y5,l3){let{GRID_STEP}=this,result={left:1/0,top:1/0,bottom:1/0,right:1/0};for(let obstacle of this.obstacles)if(obstacle.l===l3&&obstacle.type==="rect"){let left=obstacle.center.x-obstacle.width/2-GRID_STEP,right=obstacle.center.x+obstacle.width/2+GRID_STEP,top=obstacle.center.y+obstacle.height/2+GRID_STEP,bottom=obstacle.center.y-obstacle.height/2-GRID_STEP;y5>=bottom&&y5<=top&&x5>left&&(result.left=Math.min(result.left,x5-right)),y5>=bottom&&y5<=top&&x5<right&&(result.right=Math.min(result.right,left-x5)),x5>=left&&x5<=right&&y5<top&&(result.top=Math.min(result.top,bottom-y5)),x5>=left&&x5<=right&&y5>bottom&&(result.bottom=Math.min(result.bottom,y5-top))}return result}getOrthoDirectionCollisionInfo(point6,dir,{margin=0}={}){let{x:x5,y:y5,l:l3}=point6,{dx:dx2,dy:dy2,dl:dl3}=dir,minDistance=1/0,collisionObstacle=null;if(dl3!==0){let newLayer=l3+dl3;return this.isObstacleAt(x5,y5,newLayer,margin)?(minDistance=1,collisionObstacle=this.getObstacleAt(x5,y5,newLayer,margin)):minDistance=1,{dx:dx2,dy:dy2,dl:dl3,wallDistance:minDistance,obstacle:collisionObstacle}}else{for(let obstacle of this.obstacles){if(obstacle.l!==l3)continue;let leftMargin=obstacle.left-margin,rightMargin=obstacle.right+margin,topMargin=obstacle.top+margin,bottomMargin=obstacle.bottom-margin,distance8=null;dx2===1&&dy2===0?y5>bottomMargin&&y5<topMargin&&x5<obstacle.left&&(distance8=obstacle.left-x5):dx2===-1&&dy2===0?y5>bottomMargin&&y5<topMargin&&x5>obstacle.right&&(distance8=x5-obstacle.right):dx2===0&&dy2===1?x5>leftMargin&&x5<rightMargin&&y5<obstacle.bottom&&(distance8=obstacle.bottom-y5):dx2===0&&dy2===-1&&x5>leftMargin&&x5<rightMargin&&y5>obstacle.top&&(distance8=y5-obstacle.top),distance8!==null&&distance8<minDistance&&(minDistance=distance8,collisionObstacle=obstacle)}return{dx:dx2,dy:dy2,dl:0,wallDistance:minDistance,obstacle:collisionObstacle}}}getObstaclesOverlappingRegion(region){let obstacles=[];for(let obstacle of this.obstacles){if(obstacle.l!==region.l)continue;let{left,right,top,bottom}=obstacle;left<=region.maxX&&right>=region.minX&&top>=region.minY&&bottom<=region.maxY&&obstacles.push(obstacle)}return obstacles}},MultilayerIjump=class extends GeneralizedAstarAutorouter{constructor(opts){super(opts);__publicField(this,"MAX_ITERATIONS",500);__publicField(this,"VIA_COST",4);__publicField(this,"VIA_DIAMETER",.5);__publicField(this,"allowLayerChange",!0);__publicField(this,"layerCount");__publicField(this,"obstacles");__publicField(this,"optimizeWithGoalBoxes");__publicField(this,"connMap");__publicField(this,"pcbConnMap");__publicField(this,"GOAL_RUSH_FACTOR",1.1);__publicField(this,"defaultGoalViaMargin",.5);__publicField(this,"marginsWithCosts");this.layerCount=opts.input.layerCount??2,this.MAX_ITERATIONS=opts.MAX_ITERATIONS??this.MAX_ITERATIONS,this.VIA_COST=opts.VIA_COST??this.VIA_COST,this.connMap=opts.connMap,this.pcbConnMap=opts.pcbConnMap??new PcbConnectivityMap,this.optimizeWithGoalBoxes=opts.optimizeWithGoalBoxes??!1,this.obstacles=null,this.marginsWithCosts=opts.marginsWithCosts??[{margin:1,enterCost:0,travelCostFactor:1},{margin:this.OBSTACLE_MARGIN,enterCost:10,travelCostFactor:2}]}get largestMargin(){return this.marginsWithCosts[0].margin}preprocessConnectionBeforeSolving(connection){return this.optimizeWithGoalBoxes?getConnectionWithAlternativeGoalBoxes({connection,pcbConnMap:this.pcbConnMap}):connection}postprocessConnectionSolveResult(connection,result){if(!result.solved)return result;if(this.optimizeWithGoalBoxes){let traceRoute=result.route.map(rp2=>({x:rp2.x,y:rp2.y,route_type:"wire",layer:rp2.layer,width:this.input.minTraceWidth}));traceRoute[0].start_pcb_port_id=connection.pointsToConnect[0].pcb_port_id,traceRoute[traceRoute.length-1].end_pcb_port_id=connection.pointsToConnect[1].pcb_port_id,this.pcbConnMap.addTrace({type:"pcb_trace",pcb_trace_id:`postprocess_trace_${nanoid(8)}`,route:traceRoute})}return result}createObstacleList({dominantLayer,connection,obstaclesFromTraces}){let bestConnectionId=this.connMap?this.connMap.getNetConnectedToId(connection.name):connection.name;if(!bestConnectionId)throw new Error(`The connection.name "${connection.name}" wasn't present in the full connectivity map`);return new ObstacleList3d(this.layerCount,this.allObstacles.filter(obstacle=>!obstacle.connectedTo.includes(bestConnectionId)).concat(obstaclesFromTraces??[]))}computeG(current2,neighbor){let cost=current2.g+manDist(current2,neighbor)*(current2.travelMarginCostFactor??1)+(neighbor.enterMarginCost??0);return(neighbor.l??current2.l!==-1??-1)&&(cost+=this.VIA_COST),cost}computeH(node){let dx2=Math.abs(node.x-this.goalPoint.x),dy2=Math.abs(node.y-this.goalPoint.y),dl3=Math.abs(node.l-this.goalPoint.l);return(dx2+dy2)**this.GOAL_RUSH_FACTOR+dl3*this.VIA_COST}getStartNode(connection){return{...super.getStartNode(connection),l:this.layerToIndex(connection.pointsToConnect[0].layer)}}layerToIndex(layer){return getLayerIndex(this.layerCount,layer)}indexToLayer(index){return indexToLayer(this.layerCount,index)}getNodeName(node){return`${nodeName(node,this.GRID_STEP)}-${node.l??0}`}hasSpaceForVia(layers,point6){return layers.every(l3=>this.obstacles.getObstaclesOverlappingRegion({minX:point6.x-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,minY:point6.y-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,maxX:point6.x+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,maxY:point6.y+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,l:l3}).length===0)}getNeighborsSurroundingGoal(node){let obstacles=this.obstacles,goalPoint=this.goalPoint,neighbors=[],travelDirs=[{dx:1,dy:0,dl:0},{dx:-1,dy:0,dl:0},{dx:0,dy:1,dl:0},{dx:0,dy:-1,dl:0}],travelDistance=this.VIA_DIAMETER+this.OBSTACLE_MARGIN+this.defaultGoalViaMargin;for(let dir of travelDirs){let candidateNeighbor={x:node.x+dir.dx*travelDistance,y:node.y+dir.dy*travelDistance,l:node.l+dir.dl,obstacleHit:null};this.hasSpaceForVia([node.l,goalPoint.l],candidateNeighbor)&&neighbors.push(candidateNeighbor)}return neighbors}getNeighbors(node){let obstacles=this.obstacles,goalPoint=this.goalPoint,goalDistIgnoringLayer=manDist(node,goalPoint);if(goalDistIgnoringLayer<=this.OBSTACLE_MARGIN)return this.getNeighborsSurroundingGoal(node);let forwardDir;node.parent?forwardDir=dirFromAToB2(node.parent,node):forwardDir=dirFromAToB2(node,goalPoint);let travelDirs1=[{dx:0,dy:1,dl:0},{dx:1,dy:0,dl:0},{dx:0,dy:-1,dl:0},{dx:-1,dy:0,dl:0}],isFarEnoughFromGoalToChangeLayer=goalDistIgnoringLayer>this.VIA_DIAMETER+this.OBSTACLE_MARGIN,isFarEnoughFromStartToChangeLayer=manDist(node,this.startNode)>this.VIA_DIAMETER+this.OBSTACLE_MARGIN;this.allowLayerChange&&isFarEnoughFromGoalToChangeLayer&&isFarEnoughFromStartToChangeLayer&&(node.l<this.layerCount-1&&travelDirs1.push({dx:0,dy:0,dl:1}),node.l>0&&travelDirs1.push({dx:0,dy:0,dl:-1}));let travelDirs2=travelDirs1.filter(dir=>dir.dx===forwardDir.dx*-1&&dir.dy===forwardDir.dy*-1&&dir.dl===forwardDir.dl*-1?!1:!(dir.dx===forwardDir.dx&&dir.dy===forwardDir.dy&&dir.dl===forwardDir.dl&&node.parent?.obstacleHit)).map(dir=>obstacles.getOrthoDirectionCollisionInfo(node,dir,{margin:this.OBSTACLE_MARGIN})).filter(dir=>!(dir.wallDistance<this.OBSTACLE_MARGIN)),travelDirs3=[];for(let travelDir of travelDirs2){let isDownVia=travelDir.dx===0&&travelDir.dy===0&&travelDir.dl===1,isUpVia=travelDir.dx===0&&travelDir.dy===0&&travelDir.dl===-1;if((isDownVia||isUpVia)&&![node.l,node.l+travelDir.dl].every(l3=>obstacles.getObstaclesOverlappingRegion({minX:node.x-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,minY:node.y-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,maxX:node.x+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,maxY:node.y+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,l:l3}).length===0))continue;if(isDownVia){node.l<this.layerCount-1&&travelDirs3.push({...travelDir,travelDistance:0,enterMarginCost:0,travelMarginCostFactor:1});continue}if(isUpVia){node.l>0&&travelDirs3.push({...travelDir,travelDistance:0,enterMarginCost:0,travelMarginCostFactor:1});continue}let overcomeDistance=null;node?.obstacleHit&&(overcomeDistance=getDistanceToOvercomeObstacle({node,travelDir,wallDir:{...forwardDir,wallDistance:this.OBSTACLE_MARGIN},obstacle:node.obstacleHit,obstacles,OBSTACLE_MARGIN:this.OBSTACLE_MARGIN,SHOULD_DETECT_CONJOINED_OBSTACLES:!0}));let goalDistAlongTravelDir=distAlongDir(node,goalPoint,travelDir),isGoalInTravelDir=(travelDir.dx===0||Math.sign(goalPoint.x-node.x)===travelDir.dx)&&(travelDir.dy===0||Math.sign(goalPoint.y-node.y)===travelDir.dy);if(goalDistAlongTravelDir<travelDir.wallDistance&&goalDistAlongTravelDir>0&&isGoalInTravelDir){let isGoalOnSameLayer=node.l===goalPoint.l,stopShortDistance=0;!isGoalOnSameLayer&&Math.abs(goalDistAlongTravelDir-goalDistIgnoringLayer)<this.GRID_STEP&&(stopShortDistance=this.VIA_DIAMETER+this.OBSTACLE_MARGIN+this.defaultGoalViaMargin),travelDirs3.push({...travelDir,travelDistance:goalDistAlongTravelDir-stopShortDistance,enterMarginCost:0,travelMarginCostFactor:1})}else if(overcomeDistance!==null&&overcomeDistance<travelDir.wallDistance){for(let{margin,enterCost,travelCostFactor}of this.marginsWithCosts)overcomeDistance-this.OBSTACLE_MARGIN+margin*2<travelDir.wallDistance&&travelDirs3.push({...travelDir,travelDistance:overcomeDistance-this.OBSTACLE_MARGIN+margin,enterMarginCost:enterCost,travelMarginCostFactor:travelCostFactor});if(travelDir.wallDistance===1/0)travelDirs3.push({...travelDir,travelDistance:goalDistAlongTravelDir,enterMarginCost:0,travelMarginCostFactor:1});else if(travelDir.wallDistance>this.largestMargin)for(let{margin,enterCost,travelCostFactor}of this.marginsWithCosts)travelDir.wallDistance>this.largestMargin+margin&&travelDirs3.push({...travelDir,travelDistance:travelDir.wallDistance-margin,enterMarginCost:enterCost,travelMarginCostFactor:travelCostFactor})}else if(travelDir.wallDistance!==1/0)for(let{margin,enterCost,travelCostFactor}of this.marginsWithCosts)travelDir.wallDistance>margin&&travelDirs3.push({...travelDir,travelDistance:travelDir.wallDistance-margin,enterMarginCost:enterCost,travelMarginCostFactor:travelCostFactor})}return travelDirs3.map(dir=>({x:node.x+dir.dx*dir.travelDistance,y:node.y+dir.dy*dir.travelDistance,l:node.l+dir.dl,obstacleHit:dir.obstacle,travelMarginCostFactor:dir.travelMarginCostFactor,enterMarginCost:dir.enterMarginCost}))}};function autoroute2(soup){let input2=getSimpleRouteJson(soup),autorouter=new IJumpAutorouter({input:input2});return{solution:autorouter.solveAndMapToTraces(),debugSolutions:autorouter.debugSolutions,debugMessage:autorouter.debugMessage}}init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_dist();init_dist();init_zod();init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();var expectTypesMatch2=shouldBe=>{};expectTypesMatch2("extra props b");expectTypesMatch2("missing props b");expectTypesMatch2(!0);expectTypesMatch2("property a has mismatched types");var direction=external_exports.enum(["up","down","left","right"]),directionAlongEdge=external_exports.enum(["top-to-bottom","left-to-right","bottom-to-top","right-to-left"]);expectTypesMatch2(!0);expectTypesMatch2(!0);var portHints=external_exports.array(external_exports.string().or(external_exports.number()));expectTypesMatch2(!0);var calcString=external_exports.string().regex(/^calc\(.*\)$/),distance4=distance,pcbCoordinate=calcString.or(distance),point32=external_exports.object({x:distance,y:distance,z:distance}),url=external_exports.preprocess(value=>value&&typeof value=="object"&&"default"in value?value.default:value,external_exports.string()),rotationPoint3=external_exports.object({x:external_exports.union([external_exports.number(),external_exports.string()]),y:external_exports.union([external_exports.number(),external_exports.string()]),z:external_exports.union([external_exports.number(),external_exports.string()])}),cadModelBase=external_exports.object({rotationOffset:external_exports.number().or(rotationPoint3).optional(),positionOffset:point32.optional(),size:point32.optional(),modelUnitToMmScale:distance4.optional(),zOffsetFromSurface:distance4.optional(),showAsTranslucentModel:external_exports.boolean().optional()});expectTypesMatch2(!0);var cadModelStl=cadModelBase.extend({stlUrl:url}),cadModelObj=cadModelBase.extend({objUrl:url,mtlUrl:url.optional()}),cadModelGltf=cadModelBase.extend({gltfUrl:url}),cadModelGlb=cadModelBase.extend({glbUrl:url}),cadModelStep=cadModelBase.extend({stepUrl:url}),cadModelWrl=cadModelBase.extend({wrlUrl:url}),cadModelJscad=cadModelBase.extend({jscad:external_exports.record(external_exports.any())}),cadModelProp=external_exports.union([external_exports.null(),url,external_exports.custom(v5=>v5&&typeof v5=="object"&&"type"in v5&&"props"in v5),cadModelStl,cadModelObj,cadModelGltf,cadModelGlb,cadModelStep,cadModelWrl,cadModelJscad]);expectTypesMatch2(!0);var footprintProp=external_exports.custom(v5=>!0),point2=external_exports.object({x:distance,y:distance}),kicadAt2=point2.extend({rotation:rotation.optional()});expectTypesMatch2(!0);var kicadFont2=external_exports.object({size:point2.optional(),thickness:distance.optional()});expectTypesMatch2(!0);var kicadEffects2=external_exports.object({font:kicadFont2.optional()});expectTypesMatch2(!0);var kicadProperty2=external_exports.object({value:external_exports.string(),at:kicadAt2.optional(),layer:external_exports.string().optional(),uuid:external_exports.string().optional(),hide:external_exports.boolean().optional(),effects:kicadEffects2.optional()});expectTypesMatch2(!0);var kicadFootprintProperties2=external_exports.object({Reference:kicadProperty2.optional(),Value:kicadProperty2.optional(),Datasheet:kicadProperty2.optional(),Description:kicadProperty2.optional()});expectTypesMatch2(!0);var kicadFootprintAttributes2=external_exports.object({through_hole:external_exports.boolean().optional(),smd:external_exports.boolean().optional(),exclude_from_pos_files:external_exports.boolean().optional(),exclude_from_bom:external_exports.boolean().optional()});expectTypesMatch2(!0);var kicadFootprintPad2=external_exports.object({name:external_exports.string(),type:external_exports.string(),shape:external_exports.string().optional(),at:kicadAt2.optional(),size:point2.optional(),drill:distance.optional(),layers:external_exports.array(external_exports.string()).optional(),removeUnusedLayers:external_exports.boolean().optional(),uuid:external_exports.string().optional()});expectTypesMatch2(!0);var kicadFootprintModel2=external_exports.object({path:external_exports.string(),offset:point32.optional(),scale:point32.optional(),rotate:point32.optional()});expectTypesMatch2(!0);var kicadFootprintMetadata2=external_exports.object({footprintName:external_exports.string().optional(),version:external_exports.union([external_exports.number(),external_exports.string()]).optional(),generator:external_exports.string().optional(),generatorVersion:external_exports.union([external_exports.number(),external_exports.string()]).optional(),layer:external_exports.string().optional(),properties:kicadFootprintProperties2.optional(),attributes:kicadFootprintAttributes2.optional(),pads:external_exports.array(kicadFootprintPad2).optional(),embeddedFonts:external_exports.boolean().optional(),model:kicadFootprintModel2.optional()});expectTypesMatch2(!0);var kicadSymbolPinNumbers2=external_exports.object({hide:external_exports.boolean().optional()});expectTypesMatch2(!0);var kicadSymbolPinNames2=external_exports.object({offset:distance.optional(),hide:external_exports.boolean().optional()});expectTypesMatch2(!0);var kicadSymbolEffects2=external_exports.object({font:kicadFont2.optional(),justify:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())]).optional(),hide:external_exports.boolean().optional()});expectTypesMatch2(!0);var kicadSymbolProperty2=external_exports.object({value:external_exports.string(),id:external_exports.union([external_exports.number(),external_exports.string()]).optional(),at:kicadAt2.optional(),effects:kicadSymbolEffects2.optional()});expectTypesMatch2(!0);var kicadSymbolProperties2=external_exports.object({Reference:kicadSymbolProperty2.optional(),Value:kicadSymbolProperty2.optional(),Footprint:kicadSymbolProperty2.optional(),Datasheet:kicadSymbolProperty2.optional(),Description:kicadSymbolProperty2.optional(),ki_keywords:kicadSymbolProperty2.optional(),ki_fp_filters:kicadSymbolProperty2.optional()});expectTypesMatch2(!0);var kicadSymbolMetadata2=external_exports.object({symbolName:external_exports.string().optional(),extends:external_exports.string().optional(),pinNumbers:kicadSymbolPinNumbers2.optional(),pinNames:kicadSymbolPinNames2.optional(),excludeFromSim:external_exports.boolean().optional(),inBom:external_exports.boolean().optional(),onBoard:external_exports.boolean().optional(),properties:kicadSymbolProperties2.optional(),embeddedFonts:external_exports.boolean().optional()});expectTypesMatch2(!0);var pcbStyle=external_exports.object({silkscreenFontSize:distance.optional(),viaPadDiameter:distance.optional(),viaHoleDiameter:distance.optional(),silkscreenTextPosition:external_exports.union([external_exports.enum(["centered","outside","none"]),external_exports.object({offsetX:external_exports.number(),offsetY:external_exports.number()})]).optional(),silkscreenTextVisibility:external_exports.enum(["hidden","visible","inherit"]).optional()});expectTypesMatch2(!0);var pcbSxValue=external_exports.object({fontSize:length.optional(),pcbX:pcbCoordinate.optional(),pcbY:pcbCoordinate.optional()}),pcbSx=external_exports.record(external_exports.string(),pcbSxValue);expectTypesMatch2(!0);var schStyle=external_exports.object({defaultPassiveSize:external_exports.union([external_exports.enum(["xs","sm","md"]),distance]).optional(),defaultCapacitorOrientation:external_exports.enum(["vertical","none"]).optional()});expectTypesMatch2(!0);var symbolProp=external_exports.custom(v5=>!0),pcbLayoutProps=external_exports.object({pcbX:pcbCoordinate.optional(),pcbY:pcbCoordinate.optional(),pcbLeftEdgeX:pcbCoordinate.optional(),pcbRightEdgeX:pcbCoordinate.optional(),pcbTopEdgeY:pcbCoordinate.optional(),pcbBottomEdgeY:pcbCoordinate.optional(),pcbOffsetX:distance.optional(),pcbOffsetY:distance.optional(),pcbRotation:rotation.optional(),pcbPositionAnchor:external_exports.string().optional(),pcbPositionMode:external_exports.enum(["relative_to_group_anchor","auto","relative_to_board_anchor","relative_to_component_anchor"]).optional(),shouldBeOnEdgeOfBoard:external_exports.boolean().optional(),layer:layer_ref.optional(),pcbMarginTop:distance.optional(),pcbMarginRight:distance.optional(),pcbMarginBottom:distance.optional(),pcbMarginLeft:distance.optional(),pcbMarginX:distance.optional(),pcbMarginY:distance.optional(),pcbStyle:pcbStyle.optional(),pcbSx:pcbSx.optional(),pcbRelative:external_exports.boolean().optional(),relative:external_exports.boolean().optional()});expectTypesMatch2(!0);var commonLayoutProps=external_exports.object({pcbX:pcbCoordinate.optional(),pcbY:pcbCoordinate.optional(),pcbLeftEdgeX:pcbCoordinate.optional(),pcbRightEdgeX:pcbCoordinate.optional(),pcbTopEdgeY:pcbCoordinate.optional(),pcbBottomEdgeY:pcbCoordinate.optional(),pcbOffsetX:distance.optional(),pcbOffsetY:distance.optional(),pcbRotation:rotation.optional(),pcbPositionAnchor:external_exports.string().optional(),pcbPositionMode:external_exports.enum(["relative_to_group_anchor","auto","relative_to_board_anchor","relative_to_component_anchor"]).optional(),shouldBeOnEdgeOfBoard:external_exports.boolean().optional(),pcbMarginTop:distance.optional(),pcbMarginRight:distance.optional(),pcbMarginBottom:distance.optional(),pcbMarginLeft:distance.optional(),pcbMarginX:distance.optional(),pcbMarginY:distance.optional(),pcbStyle:pcbStyle.optional(),pcbSx:pcbSx.optional(),schMarginTop:distance.optional(),schMarginRight:distance.optional(),schMarginBottom:distance.optional(),schMarginLeft:distance.optional(),schMarginX:distance.optional(),schMarginY:distance.optional(),schX:distance.optional(),schY:distance.optional(),schRotation:rotation.optional(),layer:layer_ref.optional(),footprint:footprintProp.optional(),symbol:symbolProp.optional(),schStyle:schStyle.optional(),relative:external_exports.boolean().optional(),schRelative:external_exports.boolean().optional(),pcbRelative:external_exports.boolean().optional()});expectTypesMatch2(!0);var supplierProps=external_exports.object({supplierPartNumbers:external_exports.record(supplier_name,external_exports.array(external_exports.string())).optional()});expectTypesMatch2(!0);var pinAttributeMap=external_exports.object({capabilities:external_exports.array(external_exports.enum(["i2c_sda","i2c_scl","spi_cs","spi_sck","spi_mosi","spi_miso","uart_tx","uart_rx"])).optional(),activeCapabilities:external_exports.array(external_exports.enum(["i2c_sda","i2c_scl","spi_cs","spi_sck","spi_mosi","spi_miso","uart_tx","uart_rx"])).optional(),activeCapability:external_exports.enum(["i2c_sda","i2c_scl","spi_cs","spi_sck","spi_mosi","spi_miso","uart_tx","uart_rx"]).optional(),providesPower:external_exports.boolean().optional(),requiresPower:external_exports.boolean().optional(),providesGround:external_exports.boolean().optional(),requiresGround:external_exports.boolean().optional(),providesVoltage:external_exports.union([external_exports.string(),external_exports.number()]).optional(),requiresVoltage:external_exports.union([external_exports.string(),external_exports.number()]).optional(),doNotConnect:external_exports.boolean().optional(),includeInBoardPinout:external_exports.boolean().optional(),highlightColor:external_exports.string().optional(),mustBeConnected:external_exports.boolean().optional(),canUseInternalPullup:external_exports.boolean().optional(),isUsingInternalPullup:external_exports.boolean().optional(),needsExternalPullup:external_exports.boolean().optional(),canUseInternalPulldown:external_exports.boolean().optional(),isUsingInternalPulldown:external_exports.boolean().optional(),needsExternalPulldown:external_exports.boolean().optional(),canUseOpenDrain:external_exports.boolean().optional(),isUsingOpenDrain:external_exports.boolean().optional(),canUsePushPull:external_exports.boolean().optional(),isUsingPushPull:external_exports.boolean().optional(),shouldHaveDecouplingCapacitor:external_exports.boolean().optional(),recommendedDecouplingCapacitorCapacitance:external_exports.union([external_exports.string(),external_exports.number()]).optional()});expectTypesMatch2(!0);var commonComponentProps=commonLayoutProps.merge(supplierProps).extend({key:external_exports.any().optional(),name:external_exports.string(),displayName:external_exports.string().optional(),datasheetUrl:url.optional(),cadModel:cadModelProp.optional(),kicadFootprintMetadata:kicadFootprintMetadata2.optional(),kicadSymbolMetadata:kicadSymbolMetadata2.optional(),children:external_exports.any().optional(),symbolName:external_exports.string().optional(),doNotPlace:external_exports.boolean().optional(),allowOffBoard:external_exports.boolean().optional().describe("Allows the PCB component to hang off the board (e.g. for USB ports or displays)"),obstructsWithinBounds:external_exports.boolean().optional().describe("Does this component take up all the space within its bounds on a layer. This is generally true except for when separated pin headers are being represented by a single component (in which case, chips can be placed between the pin headers) or for tall modules where chips fit underneath"),showAsTranslucentModel:external_exports.boolean().optional().describe("Whether to show this component's CAD model as translucent in the 3D viewer."),pinAttributes:external_exports.record(external_exports.string(),pinAttributeMap).optional(),mfn:external_exports.string().describe("Manufacturer Part Number").optional(),manufacturerPartNumber:external_exports.string().optional()});expectTypesMatch2(!0);var lrPins=["pin1","left","pin2","right"],lrPolarPins=["pin1","left","anode","pos","pin2","right","cathode","neg"],distanceOrMultiplier=distance.or(external_exports.enum(["2x","3x","4x"]));var schematicOrientation=external_exports.enum(["vertical","horizontal","pos_top","pos_bottom","pos_left","pos_right","neg_top","neg_bottom","neg_left","neg_right"]).describe("horizontal means pins go 1->2 rightward and vertical means pins go 1->2 downward (generally, positive on top)");expectTypesMatch2(!0);var explicitPinSideDefinition=external_exports.object({pins:external_exports.array(external_exports.union([external_exports.number(),external_exports.string()])),direction:external_exports.union([external_exports.literal("top-to-bottom"),external_exports.literal("left-to-right"),external_exports.literal("bottom-to-top"),external_exports.literal("right-to-left")])}),pinSideDefinitionInput=external_exports.array(external_exports.union([external_exports.number(),external_exports.string()])),pinSideDefinitionWithDefaultDirection=direction2=>external_exports.union([explicitPinSideDefinition,pinSideDefinitionInput]).transform(value=>Array.isArray(value)?{pins:value,direction:direction2}:value),schematicPortArrangement=external_exports.object({leftSize:external_exports.number().optional().describe("@deprecated, use leftPinCount"),topSize:external_exports.number().optional().describe("@deprecated, use topPinCount"),rightSize:external_exports.number().optional().describe("@deprecated, use rightPinCount"),bottomSize:external_exports.number().optional().describe("@deprecated, use bottomPinCount"),leftPinCount:external_exports.number().optional(),rightPinCount:external_exports.number().optional(),topPinCount:external_exports.number().optional(),bottomPinCount:external_exports.number().optional(),leftSide:pinSideDefinitionWithDefaultDirection("top-to-bottom").optional(),rightSide:pinSideDefinitionWithDefaultDirection("top-to-bottom").optional(),topSide:pinSideDefinitionWithDefaultDirection("left-to-right").optional(),bottomSide:pinSideDefinitionWithDefaultDirection("left-to-right").optional()}),schematicPinArrangement=schematicPortArrangement;expectTypesMatch2(!0);var schematicPinStyle=external_exports.record(external_exports.object({marginLeft:distance.optional(),marginRight:distance.optional(),marginTop:distance.optional(),marginBottom:distance.optional(),leftMargin:distance.optional(),rightMargin:distance.optional(),topMargin:distance.optional(),bottomMargin:distance.optional()}));expectTypesMatch2(!0);var schematicPinLabel=external_exports.string().regex(/^[A-Za-z0-9_]+$/),schematicSymbolSize=distance.or(external_exports.enum(["xs","sm","default","md"])).describe("distance between pin1 and pin2 of the schematic symbol"),kicadPinElectricalType=external_exports.enum(["input","output","bidirectional","tri_state","passive","free","unspecified","power_in","power_out","open_collector","open_emitter","no_connect"]),kicadPinGraphicStyle=external_exports.enum(["line","inverted","clock","inverted_clock","input_low","clock_low","output_low","falling_edge_clock","nonlogic"]),kicadPinMetadata=external_exports.object({electricalType:kicadPinElectricalType.optional(),graphicStyle:kicadPinGraphicStyle.optional(),pinLength:distance4.optional(),nameTextSize:distance4.optional(),numberTextSize:distance4.optional()});expectTypesMatch2(!0);var ninePointAnchor2=external_exports.enum(["top_left","top_center","top_right","center_left","center","center_right","bottom_left","bottom_center","bottom_right"]),base_manual_edit_event=external_exports.object({edit_event_id:external_exports.string(),in_progress:external_exports.boolean().optional(),created_at:external_exports.number()});expectTypesMatch2(!0);var edit_pcb_component_location_event=base_manual_edit_event.extend({pcb_edit_event_type:external_exports.literal("edit_component_location").describe("deprecated"),edit_event_type:external_exports.literal("edit_pcb_component_location"),pcb_component_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var edit_trace_hint_event=base_manual_edit_event.extend({pcb_edit_event_type:external_exports.literal("edit_trace_hint").describe("deprecated"),edit_event_type:external_exports.literal("edit_pcb_trace_hint").optional(),pcb_port_id:external_exports.string(),pcb_trace_hint_id:external_exports.string().optional(),route:external_exports.array(external_exports.object({x:external_exports.number(),y:external_exports.number(),via:external_exports.boolean().optional()}))});expectTypesMatch2(!0);var edit_schematic_component_location_event=base_manual_edit_event.extend({edit_event_type:external_exports.literal("edit_schematic_component_location"),schematic_component_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var edit_pcb_group_location_event=base_manual_edit_event.extend({edit_event_type:external_exports.literal("edit_pcb_group_location"),pcb_group_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var edit_schematic_group_location_event=base_manual_edit_event.extend({edit_event_type:external_exports.literal("edit_schematic_group_location"),schematic_group_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var manual_edit_event=external_exports.union([edit_pcb_component_location_event,edit_trace_hint_event,edit_schematic_component_location_event]);expectTypesMatch2(!0);var manual_pcb_placement=external_exports.object({selector:external_exports.string(),relative_to:external_exports.string().optional().default("group_center").describe("Can be a selector or 'group_center'"),center:point});expectTypesMatch2(!0);var manual_trace_hint=external_exports.object({pcb_port_selector:external_exports.string(),offsets:external_exports.array(route_hint_point)});expectTypesMatch2(!0);var manual_schematic_placement=external_exports.object({selector:external_exports.string(),relative_to:external_exports.string().optional().default("group_center").describe("Can be a selector or 'group_center'"),center:point});expectTypesMatch2(!0);var manual_edits_file=external_exports.object({pcb_placements:external_exports.array(manual_pcb_placement).optional(),manual_trace_hints:external_exports.array(manual_trace_hint).optional(),schematic_placements:external_exports.array(manual_schematic_placement).optional()});expectTypesMatch2(!0);var connectionTarget=external_exports.string().or(external_exports.array(external_exports.string()).readonly()).or(external_exports.array(external_exports.string())),createConnectionsProp=labels=>external_exports.record(external_exports.enum(labels),connectionTarget),layoutConfig=external_exports.object({layoutMode:external_exports.enum(["grid","flex","match-adapt","relative","none"]).optional(),position:external_exports.enum(["absolute","relative"]).optional(),grid:external_exports.boolean().optional(),gridCols:external_exports.number().or(external_exports.string()).optional(),gridRows:external_exports.number().or(external_exports.string()).optional(),gridTemplateRows:external_exports.string().optional(),gridTemplateColumns:external_exports.string().optional(),gridTemplate:external_exports.string().optional(),gridGap:external_exports.number().or(external_exports.string()).optional(),gridRowGap:external_exports.number().or(external_exports.string()).optional(),gridColumnGap:external_exports.number().or(external_exports.string()).optional(),flex:external_exports.boolean().or(external_exports.string()).optional(),flexDirection:external_exports.enum(["row","column"]).optional(),alignItems:external_exports.enum(["start","center","end","stretch"]).optional(),justifyContent:external_exports.enum(["start","center","end","stretch","space-between","space-around","space-evenly"]).optional(),flexRow:external_exports.boolean().optional(),flexColumn:external_exports.boolean().optional(),gap:external_exports.number().or(external_exports.string()).optional(),pack:external_exports.boolean().optional().describe("Pack the contents of this group using a packing strategy"),packOrderStrategy:external_exports.enum(["largest_to_smallest","first_to_last","highest_to_lowest_pin_count"]).optional(),packPlacementStrategy:external_exports.enum(["shortest_connection_along_outline"]).optional(),padding:length.optional(),paddingLeft:length.optional(),paddingRight:length.optional(),paddingTop:length.optional(),paddingBottom:length.optional(),paddingX:length.optional(),paddingY:length.optional(),width:length.optional(),height:length.optional(),matchAdapt:external_exports.boolean().optional(),matchAdaptTemplate:external_exports.any().optional()});expectTypesMatch2(!0);var border=external_exports.object({strokeWidth:length.optional(),dashed:external_exports.boolean().optional(),solid:external_exports.boolean().optional()}),pcbAnchorAlignmentAutocomplete=external_exports.custom(value=>typeof value=="string"),autorouterConfig=external_exports.object({serverUrl:url.optional(),inputFormat:external_exports.enum(["simplified","circuit-json"]).optional(),serverMode:external_exports.enum(["job","solve-endpoint"]).optional(),serverCacheEnabled:external_exports.boolean().optional(),cache:external_exports.custom(v5=>!0).optional(),traceClearance:length.optional(),availableJumperTypes:external_exports.array(external_exports.enum(["1206x4","0603"])).optional(),groupMode:external_exports.enum(["sequential_trace","subcircuit","sequential-trace"]).optional(),algorithmFn:external_exports.custom(v5=>typeof v5=="function"||v5===void 0).optional(),preset:external_exports.enum(["sequential_trace","subcircuit","auto","auto_local","auto_cloud","auto_jumper","tscircuit_beta","freerouting","laser_prefab","auto-jumper","sequential-trace","auto-local","auto-cloud"]).optional(),local:external_exports.boolean().optional()}),autorouterPreset=external_exports.union([external_exports.literal("sequential_trace"),external_exports.literal("subcircuit"),external_exports.literal("auto"),external_exports.literal("auto_local"),external_exports.literal("auto_cloud"),external_exports.literal("auto_jumper"),external_exports.literal("tscircuit_beta"),external_exports.literal("freerouting"),external_exports.literal("laser_prefab"),external_exports.literal("auto-jumper"),external_exports.literal("sequential-trace"),external_exports.literal("auto-local"),external_exports.literal("auto-cloud")]),autorouterString=external_exports.string(),autorouterProp=external_exports.union([autorouterConfig,autorouterPreset,autorouterString]),autorouterEffortLevel=external_exports.enum(["1x","2x","5x","10x","100x"]),baseGroupProps=commonLayoutProps.extend({name:external_exports.string().optional(),children:external_exports.any().optional(),schTitle:external_exports.string().optional(),key:external_exports.any().optional(),showAsSchematicBox:external_exports.boolean().optional(),connections:external_exports.record(external_exports.string(),connectionTarget.optional()).optional(),schPinArrangement:schematicPinArrangement.optional(),schPinSpacing:length.optional(),schPinStyle:schematicPinStyle.optional(),...layoutConfig.shape,grid:layoutConfig.shape.grid.describe("@deprecated use pcbGrid"),flex:layoutConfig.shape.flex.describe("@deprecated use pcbFlex"),pcbGrid:external_exports.boolean().optional(),pcbGridCols:external_exports.number().or(external_exports.string()).optional(),pcbGridRows:external_exports.number().or(external_exports.string()).optional(),pcbGridTemplateRows:external_exports.string().optional(),pcbGridTemplateColumns:external_exports.string().optional(),pcbGridTemplate:external_exports.string().optional(),pcbGridGap:external_exports.number().or(external_exports.string()).optional(),pcbGridRowGap:external_exports.number().or(external_exports.string()).optional(),pcbGridColumnGap:external_exports.number().or(external_exports.string()).optional(),pcbFlex:external_exports.boolean().or(external_exports.string()).optional(),pcbFlexGap:external_exports.number().or(external_exports.string()).optional(),pcbFlexDirection:external_exports.enum(["row","column"]).optional(),pcbAlignItems:external_exports.enum(["start","center","end","stretch"]).optional(),pcbJustifyContent:external_exports.enum(["start","center","end","stretch","space-between","space-around","space-evenly"]).optional(),pcbFlexRow:external_exports.boolean().optional(),pcbFlexColumn:external_exports.boolean().optional(),pcbGap:external_exports.number().or(external_exports.string()).optional(),pcbPack:external_exports.boolean().optional(),pcbPackGap:external_exports.number().or(external_exports.string()).optional(),schGrid:external_exports.boolean().optional(),schGridCols:external_exports.number().or(external_exports.string()).optional(),schGridRows:external_exports.number().or(external_exports.string()).optional(),schGridTemplateRows:external_exports.string().optional(),schGridTemplateColumns:external_exports.string().optional(),schGridTemplate:external_exports.string().optional(),schGridGap:external_exports.number().or(external_exports.string()).optional(),schGridRowGap:external_exports.number().or(external_exports.string()).optional(),schGridColumnGap:external_exports.number().or(external_exports.string()).optional(),schFlex:external_exports.boolean().or(external_exports.string()).optional(),schFlexGap:external_exports.number().or(external_exports.string()).optional(),schFlexDirection:external_exports.enum(["row","column"]).optional(),schAlignItems:external_exports.enum(["start","center","end","stretch"]).optional(),schJustifyContent:external_exports.enum(["start","center","end","stretch","space-between","space-around","space-evenly"]).optional(),schFlexRow:external_exports.boolean().optional(),schFlexColumn:external_exports.boolean().optional(),schGap:external_exports.number().or(external_exports.string()).optional(),schPack:external_exports.boolean().optional(),schMatchAdapt:external_exports.boolean().optional(),pcbWidth:length.optional(),pcbHeight:length.optional(),minTraceWidth:length.optional(),nominalTraceWidth:length.optional(),schWidth:length.optional(),schHeight:length.optional(),pcbLayout:layoutConfig.optional(),schLayout:layoutConfig.optional(),cellBorder:border.nullable().optional(),border:border.nullable().optional(),schPadding:length.optional(),schPaddingLeft:length.optional(),schPaddingRight:length.optional(),schPaddingTop:length.optional(),schPaddingBottom:length.optional(),pcbPadding:length.optional(),pcbPaddingLeft:length.optional(),pcbPaddingRight:length.optional(),pcbPaddingTop:length.optional(),pcbPaddingBottom:length.optional(),pcbAnchorAlignment:pcbAnchorAlignmentAutocomplete.optional()}),partsEngine=external_exports.custom(v5=>"findPart"in v5),subcircuitGroupProps=baseGroupProps.extend({manualEdits:manual_edits_file.optional(),schAutoLayoutEnabled:external_exports.boolean().optional(),schTraceAutoLabelEnabled:external_exports.boolean().optional(),schMaxTraceDistance:distance.optional(),routingDisabled:external_exports.boolean().optional(),bomDisabled:external_exports.boolean().optional(),defaultTraceWidth:length.optional(),minTraceWidth:length.optional(),nominalTraceWidth:length.optional(),partsEngine:partsEngine.optional(),_subcircuitCachingEnabled:external_exports.boolean().optional(),pcbRouteCache:external_exports.custom(v5=>!0).optional(),autorouter:autorouterProp.optional(),autorouterEffortLevel:autorouterEffortLevel.optional(),autorouterVersion:external_exports.enum(["v1","v2","latest"]).optional(),square:external_exports.boolean().optional(),emptyArea:external_exports.string().optional(),filledArea:external_exports.string().optional(),width:distance.optional(),height:distance.optional(),outline:external_exports.array(point2).optional(),outlineOffsetX:distance.optional(),outlineOffsetY:distance.optional(),circuitJson:external_exports.array(external_exports.any()).optional()}),subcircuitGroupPropsWithBool=subcircuitGroupProps.extend({subcircuit:external_exports.literal(!0)}),groupProps=external_exports.discriminatedUnion("subcircuit",[baseGroupProps.extend({subcircuit:external_exports.literal(!1).optional()}),subcircuitGroupPropsWithBool]);expectTypesMatch2(!0);expectTypesMatch2(!0);expectTypesMatch2(!0);expectTypesMatch2(!0);var boardColor=external_exports.custom(value=>typeof value=="string"),boardProps=subcircuitGroupProps.omit({connections:!0}).extend({material:external_exports.enum(["fr4","fr1"]).default("fr4"),layers:external_exports.union([external_exports.literal(1),external_exports.literal(2),external_exports.literal(4),external_exports.literal(6),external_exports.literal(8)]).default(2),borderRadius:distance4.optional(),thickness:distance4.optional(),boardAnchorPosition:point2.optional(),anchorAlignment:ninePointAnchor2.optional(),boardAnchorAlignment:ninePointAnchor2.optional().describe("Prefer using anchorAlignment when possible"),title:external_exports.string().optional(),solderMaskColor:boardColor.optional(),topSolderMaskColor:boardColor.optional(),bottomSolderMaskColor:boardColor.optional(),silkscreenColor:boardColor.optional(),topSilkscreenColor:boardColor.optional(),bottomSilkscreenColor:boardColor.optional(),doubleSidedAssembly:external_exports.boolean().optional().default(!1),schematicDisabled:external_exports.boolean().optional()});expectTypesMatch2(!0);var panelProps=baseGroupProps.omit({width:!0,height:!0,layoutMode:!0,children:!0}).extend({width:distance4.optional(),height:distance4.optional(),children:external_exports.any().optional(),anchorAlignment:ninePointAnchor2.optional(),noSolderMask:external_exports.boolean().optional(),panelizationMethod:external_exports.enum(["tab-routing","none"]).optional(),boardGap:distance4.optional(),layoutMode:external_exports.enum(["grid","pack","none"]).optional(),row:external_exports.number().optional(),col:external_exports.number().optional(),cellWidth:distance4.optional(),cellHeight:distance4.optional(),tabWidth:distance4.optional(),tabLength:distance4.optional(),mouseBites:external_exports.boolean().optional(),edgePadding:distance4.optional(),edgePaddingLeft:distance4.optional(),edgePaddingRight:distance4.optional(),edgePaddingTop:distance4.optional(),edgePaddingBottom:distance4.optional(),_subcircuitCachingEnabled:external_exports.boolean().optional()});expectTypesMatch2(!0);var subpanelProps=panelProps;expectTypesMatch2(!0);var breakoutProps=subcircuitGroupProps.extend({padding:distance.optional(),paddingLeft:distance.optional(),paddingRight:distance.optional(),paddingTop:distance.optional(),paddingBottom:distance.optional()});expectTypesMatch2(!0);var connectionTarget2=external_exports.string().or(external_exports.array(external_exports.string()).readonly()).or(external_exports.array(external_exports.string())),connectionsProp=external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget2)),pinLabelsProp=external_exports.record(schematicPinLabel,schematicPinLabel.or(external_exports.array(schematicPinLabel).readonly()).or(external_exports.array(schematicPinLabel)));expectTypesMatch2(!0);var pinCompatibleVariant=external_exports.object({manufacturerPartNumber:external_exports.string().optional(),supplierPartNumber:external_exports.record(supplier_name,external_exports.array(external_exports.string())).optional()}),chipProps=commonComponentProps.extend({manufacturerPartNumber:external_exports.string().optional(),pinLabels:pinLabelsProp.optional(),showPinAliases:external_exports.boolean().optional(),pcbPinLabels:external_exports.record(external_exports.string(),external_exports.string()).optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional(),externallyConnectedPins:external_exports.array(external_exports.array(external_exports.string())).optional(),schPinArrangement:schematicPortArrangement.optional(),schPortArrangement:schematicPortArrangement.optional(),pinCompatibleVariants:external_exports.array(pinCompatibleVariant).optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional(),noSchematicRepresentation:external_exports.boolean().optional(),connections:connectionsProp.optional()});expectTypesMatch2(!0);var pinoutProps=chipProps;expectTypesMatch2(!0);var jumperProps=commonComponentProps.extend({manufacturerPartNumber:external_exports.string().optional(),pinLabels:external_exports.record(external_exports.number().or(schematicPinLabel),schematicPinLabel.or(external_exports.array(schematicPinLabel))).optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional(),schDirection:external_exports.enum(["left","right"]).optional(),schPinArrangement:schematicPinArrangement.optional(),schPortArrangement:schematicPortArrangement.optional(),pcbPinLabels:external_exports.record(external_exports.string(),external_exports.string()).optional(),pinCount:external_exports.union([external_exports.literal(2),external_exports.literal(3)]).optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional(),connections:external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget)).optional()});expectTypesMatch2(!0);var solderjumperProps=jumperProps.extend({bridgedPins:external_exports.array(external_exports.array(external_exports.string())).optional(),bridged:external_exports.boolean().optional()});expectTypesMatch2(!0);var connectorProps=commonComponentProps.extend({manufacturerPartNumber:external_exports.string().optional(),pinLabels:external_exports.record(external_exports.number().or(schematicPinLabel),schematicPinLabel.or(external_exports.array(schematicPinLabel))).optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional(),schDirection:external_exports.enum(["left","right"]).optional(),schPortArrangement:schematicPortArrangement.optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional(),standard:external_exports.enum(["usb_c","m2"]).optional()});expectTypesMatch2(!0);var interconnectProps=commonComponentProps.extend({standard:external_exports.enum(["TSC0001_36P_XALT_2025_11","0805","0603","1206"]).optional(),pinLabels:external_exports.record(external_exports.number().or(schematicPinLabel),schematicPinLabel.or(external_exports.array(schematicPinLabel))).optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional()});expectTypesMatch2(!0);var fuseProps=commonComponentProps.extend({currentRating:external_exports.union([external_exports.number(),external_exports.string()]),voltageRating:external_exports.union([external_exports.number(),external_exports.string()]).optional(),schShowRatings:external_exports.boolean().optional(),schOrientation:schematicOrientation.optional(),connections:external_exports.record(external_exports.string(),external_exports.union([external_exports.string(),external_exports.array(external_exports.string()).readonly(),external_exports.array(external_exports.string())])).optional()}),distanceHiddenUndefined=external_exports.custom().transform(a2=>{if(a2!==void 0)return distance.parse(a2)}),platedHoleProps=external_exports.discriminatedUnion("shape",[pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("circle"),holeDiameter:distance,outerDiameter:distance,padDiameter:distance.optional().describe("Diameter of the copper pad"),portHints:portHints.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("oval"),outerWidth:distance,outerHeight:distance,holeWidth:distanceHiddenUndefined,holeHeight:distanceHiddenUndefined,innerWidth:distance.optional().describe("DEPRECATED use holeWidth"),innerHeight:distance.optional().describe("DEPRECATED use holeHeight"),portHints:portHints.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("pill"),rectPad:external_exports.boolean().optional(),outerWidth:distance,outerHeight:distance,holeWidth:distanceHiddenUndefined,holeHeight:distanceHiddenUndefined,innerWidth:distance.optional().describe("DEPRECATED use holeWidth"),innerHeight:distance.optional().describe("DEPRECATED use holeHeight"),portHints:portHints.optional(),holeOffsetX:distance.optional(),holeOffsetY:distance.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("circular_hole_with_rect_pad"),holeDiameter:distance,rectPadWidth:distance,rectPadHeight:distance,rectBorderRadius:distance.optional(),holeShape:external_exports.literal("circle").optional(),padShape:external_exports.literal("rect").optional(),portHints:portHints.optional(),holeOffsetX:distance.optional(),holeOffsetY:distance.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("pill_hole_with_rect_pad"),holeShape:external_exports.literal("pill").optional(),padShape:external_exports.literal("rect").optional(),holeWidth:distance,holeHeight:distance,rectPadWidth:distance,rectPadHeight:distance,portHints:portHints.optional(),holeOffsetX:distance.optional(),holeOffsetY:distance.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("hole_with_polygon_pad"),holeShape:external_exports.enum(["circle","oval","pill","rotated_pill"]),holeDiameter:distance.optional(),holeWidth:distance.optional(),holeHeight:distance.optional(),padOutline:external_exports.array(point2),holeOffsetX:distance,holeOffsetY:distance,portHints:portHints.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()})]).refine(a2=>("innerWidth"in a2&&a2.innerWidth!==void 0&&(a2.holeWidth??(a2.holeWidth=a2.innerWidth)),"innerHeight"in a2&&a2.innerHeight!==void 0&&(a2.holeHeight??(a2.holeHeight=a2.innerHeight)),a2));expectTypesMatch2(!0);var resistorPinLabels=["pin1","pin2","pos","neg"],resistorProps=commonComponentProps.extend({resistance,tolerance:external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Tolerance must be non-negative").max(1,"Tolerance cannot be greater than 100%")).optional(),pullupFor:external_exports.string().optional(),pullupTo:external_exports.string().optional(),pulldownFor:external_exports.string().optional(),pulldownTo:external_exports.string().optional(),schOrientation:schematicOrientation.optional(),schSize:schematicSymbolSize.optional(),connections:createConnectionsProp(resistorPinLabels).optional()}),resistorPins=lrPins;expectTypesMatch2(!0);var potentiometerPinLabels=["pin1","pin2","pin3"],potentiometerProps=commonComponentProps.extend({maxResistance:resistance,pinVariant:external_exports.enum(["two_pin","three_pin"]).optional(),connections:createConnectionsProp(potentiometerPinLabels).optional()});expectTypesMatch2(!0);var crystalPins=lrPins,crystalProps=commonComponentProps.extend({frequency,loadCapacitance:capacitance,manufacturerPartNumber:external_exports.string().optional(),mpn:external_exports.string().optional(),pinVariant:external_exports.enum(["two_pin","four_pin"]).optional(),schOrientation:schematicOrientation.optional(),connections:createConnectionsProp(crystalPins).optional()});expectTypesMatch2(!0);var resonatorProps=commonComponentProps.extend({frequency,loadCapacitance:capacitance,pinVariant:external_exports.enum(["no_ground","ground_pin","two_ground_pins"]).optional()});expectTypesMatch2(!0);var stampboardProps=boardProps.extend({leftPinCount:external_exports.number().optional(),rightPinCount:external_exports.number().optional(),topPinCount:external_exports.number().optional(),bottomPinCount:external_exports.number().optional(),leftPins:external_exports.array(external_exports.string()).optional(),rightPins:external_exports.array(external_exports.string()).optional(),topPins:external_exports.array(external_exports.string()).optional(),bottomPins:external_exports.array(external_exports.string()).optional(),pinPitch:distance.optional(),innerHoles:external_exports.boolean().optional()});expectTypesMatch2(!0);var capacitorPinLabels=["pin1","pin2","pos","neg","anode","cathode"],capacitorProps=commonComponentProps.extend({capacitance,maxVoltageRating:voltage.optional(),schShowRatings:external_exports.boolean().optional().default(!1),polarized:external_exports.boolean().optional().default(!1),decouplingFor:external_exports.string().optional(),decouplingTo:external_exports.string().optional(),bypassFor:external_exports.string().optional(),bypassTo:external_exports.string().optional(),maxDecouplingTraceLength:external_exports.number().optional(),schOrientation:schematicOrientation.optional(),schSize:schematicSymbolSize.optional(),connections:createConnectionsProp(capacitorPinLabels).optional()}),capacitorPins=lrPolarPins;expectTypesMatch2(!0);var netProps=external_exports.object({name:external_exports.string(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),highlightColor:external_exports.string().optional(),isPowerNet:external_exports.boolean().optional(),isGroundNet:external_exports.boolean().optional()});expectTypesMatch2(!0);var fiducialProps=commonComponentProps.extend({soldermaskPullback:distance4.optional(),padDiameter:distance4.optional()});expectTypesMatch2(!0);var constrainedLayoutProps=external_exports.object({name:external_exports.string().optional(),pcbOnly:external_exports.boolean().optional(),schOnly:external_exports.boolean().optional()});expectTypesMatch2(!0);var pcbXDistConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),xDist:distance4,left:external_exports.string(),right:external_exports.string(),edgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var pcbYDistConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),yDist:distance4,top:external_exports.string(),bottom:external_exports.string(),edgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var pcbSameYConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),sameY:external_exports.literal(!0).optional(),for:external_exports.array(external_exports.string())});expectTypesMatch2(!0);var pcbSameXConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),sameX:external_exports.literal(!0).optional(),for:external_exports.array(external_exports.string())});expectTypesMatch2(!0);var constraintProps=external_exports.union([pcbXDistConstraintProps,pcbYDistConstraintProps,pcbSameYConstraintProps,pcbSameXConstraintProps]);expectTypesMatch2(!0);var rectCutoutProps=pcbLayoutProps.omit({layer:!0,pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("rect"),width:distance4,height:distance4});expectTypesMatch2(!0);var circleCutoutProps=pcbLayoutProps.omit({layer:!0,pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("circle"),radius:distance4});expectTypesMatch2(!0);var polygonCutoutProps=pcbLayoutProps.omit({layer:!0,pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("polygon"),points:external_exports.array(point2)});expectTypesMatch2(!0);var cutoutProps=external_exports.discriminatedUnion("shape",[rectCutoutProps,circleCutoutProps,polygonCutoutProps]),rectSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("rect"),width:distance4,height:distance4,rectBorderRadius:distance4.optional(),cornerRadius:distance4.optional(),portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance4.optional(),solderMaskMarginLeft:distance4.optional(),solderMaskMarginRight:distance4.optional(),solderMaskMarginTop:distance4.optional(),solderMaskMarginBottom:distance4.optional()});expectTypesMatch2(!0);var rotatedRectSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("rotated_rect"),width:distance4,height:distance4,ccwRotation:external_exports.number(),cornerRadius:distance4.optional(),portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance4.optional(),solderMaskMarginLeft:distance4.optional(),solderMaskMarginRight:distance4.optional(),solderMaskMarginTop:distance4.optional(),solderMaskMarginBottom:distance4.optional()});expectTypesMatch2(!0);var circleSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("circle"),radius:distance4,portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance4.optional()});expectTypesMatch2(!0);var pillSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("pill"),width:distance4,height:distance4,radius:distance4,portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance4.optional()});expectTypesMatch2(!0);var polygonSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("polygon"),points:external_exports.array(point2),portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance4.optional()});expectTypesMatch2(!0);var smtPadProps=external_exports.discriminatedUnion("shape",[circleSmtPadProps,rectSmtPadProps,rotatedRectSmtPadProps,pillSmtPadProps,polygonSmtPadProps]);expectTypesMatch2(!0);var rectSolderPasteProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({shape:external_exports.literal("rect"),width:distance4,height:distance4});expectTypesMatch2(!0);var circleSolderPasteProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({shape:external_exports.literal("circle"),radius:distance4});expectTypesMatch2(!0);var solderPasteProps=external_exports.union([circleSolderPasteProps,rectSolderPasteProps]);expectTypesMatch2(!0);var circleHoleProps=pcbLayoutProps.extend({name:external_exports.string().optional(),shape:external_exports.literal("circle").optional(),diameter:distance4.optional(),radius:distance4.optional(),solderMaskMargin:distance4.optional(),coveredWithSolderMask:external_exports.boolean().optional()}).transform(d3=>({...d3,diameter:d3.diameter??2*d3.radius,radius:d3.radius??d3.diameter/2})),pillHoleProps=pcbLayoutProps.extend({name:external_exports.string().optional(),shape:external_exports.literal("pill"),width:distance4,height:distance4,solderMaskMargin:distance4.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),rectHoleProps=pcbLayoutProps.extend({name:external_exports.string().optional(),shape:external_exports.literal("rect"),width:distance4,height:distance4,solderMaskMargin:distance4.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),holeProps=external_exports.union([circleHoleProps,pillHoleProps,rectHoleProps]);expectTypesMatch2(!0);var portRef=external_exports.union([external_exports.string(),external_exports.custom(v5=>!!v5.getPortSelector)]),pcbPathPoint=point2.extend({via:external_exports.boolean().optional(),fromLayer:layer_ref.optional(),toLayer:layer_ref.optional()}).superRefine((value,ctx)=>{value.via?value.toLayer||ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"toLayer is required when via is true",path:["toLayer"]}):(value.fromLayer||value.toLayer)&&ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"fromLayer/toLayer are only allowed when via is true",path:["via"]})}),pcbPath=external_exports.array(external_exports.union([pcbPathPoint,external_exports.string()])),baseTraceProps=external_exports.object({key:external_exports.string().optional(),thickness:distance.optional(),width:distance.optional().describe("Alias for trace thickness"),schematicRouteHints:external_exports.array(point2).optional(),pcbRouteHints:external_exports.array(route_hint_point).optional(),pcbPathRelativeTo:external_exports.string().optional(),pcbPath:pcbPath.optional(),pcbPaths:external_exports.array(pcbPath).optional(),pcbStraightLine:external_exports.boolean().optional().describe("Draw a straight pcb trace between the connected points"),schDisplayLabel:external_exports.string().optional(),schStroke:external_exports.string().optional(),highlightColor:external_exports.string().optional(),maxLength:distance.optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional()}),traceProps=external_exports.union([baseTraceProps.extend({path:external_exports.array(portRef)}),baseTraceProps.extend({from:portRef,to:portRef})]),footprintProps=external_exports.object({children:external_exports.any().optional(),originalLayer:layer_ref.default("top").optional(),circuitJson:external_exports.array(external_exports.any()).optional(),src:footprintProp.describe("Can be a footprint or kicad string").optional()});expectTypesMatch2(!0);var symbolProps=external_exports.object({originalFacingDirection:external_exports.enum(["up","down","left","right"]).default("right").optional(),width:distance4.optional(),height:distance4.optional(),name:external_exports.string().optional()});expectTypesMatch2(!0);var capacity=external_exports.number().or(external_exports.string().endsWith("mAh")).transform(v5=>{if(typeof v5=="string"){let valString=v5.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v5}).describe("Battery capacity in mAh"),batteryProps=commonComponentProps.extend({capacity:capacity.optional(),voltage:voltage.optional(),standard:external_exports.enum(["AA","AAA","9V","CR2032","18650","C"]).optional(),schOrientation:schematicOrientation.optional()});expectTypesMatch2(!0);var mountedboardProps=subcircuitGroupProps.extend({manufacturerPartNumber:chipProps.shape.manufacturerPartNumber,pinLabels:chipProps.shape.pinLabels,showPinAliases:chipProps.shape.showPinAliases,pcbPinLabels:chipProps.shape.pcbPinLabels,schPortArrangement:chipProps.shape.schPortArrangement,pinCompatibleVariants:chipProps.shape.pinCompatibleVariants,noSchematicRepresentation:chipProps.shape.noSchematicRepresentation,internallyConnectedPins:chipProps.shape.internallyConnectedPins,externallyConnectedPins:chipProps.shape.externallyConnectedPins,boardToBoardDistance:distance4.optional(),mountOrientation:external_exports.enum(["faceDown","faceUp"]).optional()});expectTypesMatch2(!0);var pcbOrientation=external_exports.enum(["vertical","horizontal"]).describe("vertical means pins go 1->2 downward and horizontal means pins go 1->2 rightward");expectTypesMatch2(!0);var pinHeaderProps=commonComponentProps.extend({pinCount:external_exports.number(),pitch:distance.optional(),schFacingDirection:external_exports.enum(["up","down","left","right"]).optional(),gender:external_exports.enum(["male","female","unpopulated"]).optional().default("male"),showSilkscreenPinLabels:external_exports.boolean().optional(),pcbPinLabels:external_exports.record(external_exports.string(),external_exports.string()).optional(),doubleRow:external_exports.boolean().optional(),rightAngle:external_exports.boolean().optional(),pcbOrientation:pcbOrientation.optional(),holeDiameter:distance.optional(),platedDiameter:distance.optional(),pinLabels:external_exports.record(external_exports.string(),schematicPinLabel).or(external_exports.array(schematicPinLabel)).optional(),connections:external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget)).optional(),facingDirection:external_exports.enum(["left","right"]).optional(),schPinArrangement:schematicPinArrangement.optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional()});expectTypesMatch2(!0);var netAliasProps=external_exports.object({net:external_exports.string().optional(),connection:external_exports.string().optional(),schX:distance4.optional(),schY:distance4.optional(),schRotation:rotation.optional(),anchorSide:external_exports.enum(["left","top","right","bottom"]).optional()});expectTypesMatch2(!0);var netLabelProps=external_exports.object({net:external_exports.string().optional(),connection:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),schX:distance4.optional(),schY:distance4.optional(),schRotation:rotation.optional(),anchorSide:external_exports.enum(["left","top","right","bottom"]).optional()});expectTypesMatch2(!0);var pushButtonProps=chipProps.extend({});expectTypesMatch2(!0);expectTypesMatch2(!0);var spiceEngine=external_exports.custom(value=>typeof value=="string"),analogSimulationProps=external_exports.object({simulationType:external_exports.literal("spice_transient_analysis").default("spice_transient_analysis"),duration:ms.optional(),timePerStep:ms.optional(),spiceEngine:spiceEngine.optional()});expectTypesMatch2(!0);var transistorPinsLabels=["pin1","pin2","pin3","emitter","collector","base","gate","source","drain"],transistorProps=commonComponentProps.extend({type:external_exports.enum(["npn","pnp","bjt","jfet","mosfet","igbt"]),connections:createConnectionsProp(transistorPinsLabels).optional()});expectTypesMatch2(!0);var mosfetProps=commonComponentProps.extend({channelType:external_exports.enum(["n","p"]),mosfetMode:external_exports.enum(["enhancement","depletion"])});expectTypesMatch2(!0);var opampPinLabels=["inverting_input","non_inverting_input","output","positive_supply","negative_supply"],opampProps=commonComponentProps.extend({connections:createConnectionsProp(opampPinLabels).optional()});expectTypesMatch2(!0);var inductorPins=lrPins,inductorProps=commonComponentProps.extend({inductance,maxCurrentRating:external_exports.union([external_exports.string(),external_exports.number()]).optional(),schOrientation:schematicOrientation.optional(),connections:createConnectionsProp(inductorPins).optional()});expectTypesMatch2(!0);var diodeConnectionKeys=external_exports.enum(["anode","cathode","pin1","pin2","pos","neg"]),connectionTarget3=external_exports.string().or(external_exports.array(external_exports.string()).readonly()).or(external_exports.array(external_exports.string())),connectionsProp2=external_exports.record(diodeConnectionKeys,connectionTarget3),diodeVariant=external_exports.enum(["standard","schottky","zener","avalanche","photo","tvs"]),diodeProps=commonComponentProps.extend({connections:connectionsProp2.optional(),variant:diodeVariant.optional().default("standard"),standard:external_exports.boolean().optional(),schottky:external_exports.boolean().optional(),zener:external_exports.boolean().optional(),avalanche:external_exports.boolean().optional(),photo:external_exports.boolean().optional(),tvs:external_exports.boolean().optional(),schOrientation:schematicOrientation.optional()}).superRefine((data,ctx)=>{if([data.standard,data.schottky,data.zener,data.avalanche,data.photo,data.tvs].filter(Boolean).length>1)return ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Exactly one diode variant must be enabled",path:[]}),external_exports.INVALID}).transform(data=>{let result={...data,standard:!1,schottky:!1,zener:!1,avalanche:!1,photo:!1,tvs:!1};if(data.standard)result.standard=!0;else if(data.schottky)result.schottky=!0;else if(data.zener)result.zener=!0;else if(data.photo)result.photo=!0;else if(data.tvs)result.tvs=!0;else switch(data.variant){case"standard":result.standard=!0;break;case"schottky":result.schottky=!0;break;case"zener":result.zener=!0;break;case"avalanche":result.avalanche=!0;break;case"photo":result.photo=!0;break;case"tvs":result.tvs=!0;break;default:result.standard=!0}return result}),diodePins=lrPolarPins;expectTypesMatch2(!0);var ledProps=commonComponentProps.extend({color:external_exports.string().optional(),wavelength:external_exports.string().optional(),schDisplayValue:external_exports.string().optional(),schOrientation:schematicOrientation.optional(),connections:createConnectionsProp(lrPolarPins).optional(),laser:external_exports.boolean().optional()}),ledPins=lrPolarPins,switchProps=commonComponentProps.extend({type:external_exports.enum(["spst","spdt","dpst","dpdt"]).optional(),isNormallyClosed:external_exports.boolean().optional().default(!1),spst:external_exports.boolean().optional(),spdt:external_exports.boolean().optional(),dpst:external_exports.boolean().optional(),dpdt:external_exports.boolean().optional(),simSwitchFrequency:frequency.optional(),simCloseAt:ms.optional(),simOpenAt:ms.optional(),simStartClosed:external_exports.boolean().optional(),simStartOpen:external_exports.boolean().optional(),connections:external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget)).optional()}).transform(props=>{let updatedProps={...props};switch(updatedProps.dpdt?updatedProps.type="dpdt":updatedProps.spst?updatedProps.type="spst":updatedProps.spdt?updatedProps.type="spdt":updatedProps.dpst&&(updatedProps.type="dpst"),updatedProps.type){case"spdt":updatedProps.spdt=!0;break;case"spst":updatedProps.spst=!0;break;case"dpst":updatedProps.dpst=!0;break;case"dpdt":updatedProps.dpdt=!0;break}return updatedProps});expectTypesMatch2(!0);var fabricationNoteTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var fabricationNoteRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({width:distance,height:distance,strokeWidth:distance.optional(),isFilled:external_exports.boolean().optional(),hasStroke:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional(),cornerRadius:distance.optional()}),fabricationNotePathProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({route:external_exports.array(route_hint_point),strokeWidth:length.optional(),color:external_exports.string().optional()}),dimensionTarget=external_exports.union([external_exports.string(),point2]),fabricationNoteDimensionProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({from:dimensionTarget,to:dimensionTarget,text:external_exports.string().optional(),offset:distance.optional(),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional(),arrowSize:distance.optional(),units:external_exports.enum(["in","mm"]).optional(),outerEdgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional(),innerEdgeToEdge:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var pcbTraceProps=external_exports.object({layer:external_exports.string().optional(),thickness:distance.optional(),route:external_exports.array(route_hint_point)}),viaProps=commonLayoutProps.extend({name:external_exports.string().optional(),fromLayer:layer_ref,toLayer:layer_ref,holeDiameter:distance.optional(),outerDiameter:distance.optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),netIsAssignable:external_exports.boolean().optional()});expectTypesMatch2(!0);var testpointConnectionsProp=external_exports.object({pin1:connectionTarget}).strict(),testpointProps=commonComponentProps.extend({connections:testpointConnectionsProp.optional(),footprintVariant:external_exports.enum(["pad","through_hole"]).optional(),padShape:external_exports.enum(["rect","circle"]).optional().default("circle"),padDiameter:distance.optional(),holeDiameter:distance.optional(),width:distance.optional(),height:distance.optional()}).refine(props=>props.footprintVariant!=="through_hole"||props.holeDiameter!==void 0,{message:"holeDiameter is required for through_hole testpoints"});expectTypesMatch2(!0);var breakoutPointProps=pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({connection:external_exports.string()});expectTypesMatch2(!0);var pcbKeepoutProps=external_exports.union([pcbLayoutProps.omit({pcbRotation:!0}).extend({shape:external_exports.literal("circle"),radius:distance}),pcbLayoutProps.extend({shape:external_exports.literal("rect"),width:distance,height:distance})]),courtyardRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({width:distance,height:distance,strokeWidth:distance.optional(),isFilled:external_exports.boolean().optional(),hasStroke:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional()}),courtyardOutlineProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({outline:external_exports.array(point2),strokeWidth:length.optional(),isClosed:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional()}),courtyardCircleProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({radius:distance}),courtyardPillProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({width:distance,height:distance,radius:distance}),copperPourProps=external_exports.object({name:external_exports.string().optional(),layer:layer_ref,connectsTo:external_exports.string(),padMargin:distance4.optional(),traceMargin:distance4.optional(),clearance:distance4.optional(),boardEdgeMargin:distance4.optional(),cutoutMargin:distance4.optional(),outline:external_exports.array(point2).optional(),coveredWithSolderMask:external_exports.boolean().optional().default(!0)});expectTypesMatch2(!0);var cadassemblyProps=external_exports.object({originalLayer:layer_ref.default("top").optional(),children:external_exports.any().optional()});expectTypesMatch2(!0);var pcbPosition=external_exports.object({pcbX:pcbCoordinate.optional(),pcbY:pcbCoordinate.optional(),pcbLeftEdgeX:pcbCoordinate.optional(),pcbRightEdgeX:pcbCoordinate.optional(),pcbTopEdgeY:pcbCoordinate.optional(),pcbBottomEdgeY:pcbCoordinate.optional(),pcbOffsetX:distance4.optional(),pcbOffsetY:distance4.optional(),pcbZ:distance4.optional()}),cadModelBaseWithUrl=cadModelBase.extend({modelUrl:url,stepUrl:url.optional()}),cadModelObject=cadModelBaseWithUrl.merge(pcbPosition);expectTypesMatch2(!0);var cadmodelProps=external_exports.union([external_exports.null(),url,cadModelObject]),powerSourceProps=commonComponentProps.extend({voltage}),voltageSourcePinLabels=["pin1","pin2","pos","neg"],percentage3=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),voltageSourceProps=commonComponentProps.extend({voltage:voltage.optional(),frequency:frequency.optional(),peakToPeakVoltage:voltage.optional(),waveShape:external_exports.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation.optional(),dutyCycle:percentage3.optional(),connections:createConnectionsProp(voltageSourcePinLabels).optional()});expectTypesMatch2(!0);var currentSourcePinLabels=["pin1","pin2","pos","neg"],percentage22=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),currentSourceProps=commonComponentProps.extend({current:current.optional(),frequency:frequency.optional(),peakToPeakCurrent:current.optional(),waveShape:external_exports.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation.optional(),dutyCycle:percentage22.optional(),connections:createConnectionsProp(currentSourcePinLabels).optional()});expectTypesMatch2(!0);var voltageProbeProps=commonComponentProps.omit({name:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string(),referenceTo:external_exports.string().optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var schematicArcProps=external_exports.object({center:point,radius:distance,startAngleDegrees:rotation,endAngleDegrees:rotation,direction:external_exports.enum(["clockwise","counterclockwise"]).default("counterclockwise"),strokeWidth:distance.optional(),color:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1)});expectTypesMatch2(!0);var toolingrailProps=external_exports.object({children:external_exports.any().optional()});expectTypesMatch2(!0);var schematicBoxProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),width:distance.optional(),height:distance.optional(),overlay:external_exports.array(external_exports.string()).optional(),padding:distance.optional(),paddingLeft:distance.optional(),paddingRight:distance.optional(),paddingTop:distance.optional(),paddingBottom:distance.optional(),title:external_exports.string().optional(),titleAlignment:ninePointAnchor2.default("top_left"),titleColor:external_exports.string().optional(),titleFontSize:distance.optional(),titleInside:external_exports.boolean().default(!1),strokeStyle:external_exports.enum(["solid","dashed"]).default("solid")}).refine(elm=>elm.width!==void 0&&elm.height!==void 0||Array.isArray(elm.overlay)&&elm.overlay.length>0,{message:"Must provide either both `width` and `height`, or a non-empty `overlay` array."}).refine(elm=>!(elm.width!==void 0&&elm.height!==void 0&&Array.isArray(elm.overlay)&&elm.overlay.length>0),{message:"Cannot provide both `width`/`height` and `overlay` at the same time."});expectTypesMatch2(!0);var schematicCircleProps=external_exports.object({center:point,radius:distance,strokeWidth:distance.optional(),color:external_exports.string().optional(),isFilled:external_exports.boolean().optional().default(!1),fillColor:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1)});expectTypesMatch2(!0);var schematicRectProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),width:distance,height:distance,rotation:rotation.default(0),strokeWidth:distance.optional(),color:external_exports.string().optional(),isFilled:external_exports.boolean().optional().default(!1),fillColor:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1),cornerRadius:distance.optional()});expectTypesMatch2(!0);var schematicLineProps=external_exports.object({x1:distance,y1:distance,x2:distance,y2:distance,strokeWidth:distance.optional(),color:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1)});expectTypesMatch2(!0);var fivePointAnchor2=external_exports.enum(["center","left","right","top","bottom"]),schematicTextProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),text:external_exports.string(),fontSize:external_exports.number().default(1),anchor:external_exports.union([fivePointAnchor2.describe("legacy"),ninePointAnchor2]).default("center"),color:external_exports.string().default("#000000"),schRotation:rotation.default(0)});expectTypesMatch2(!0);var schematicPathProps=external_exports.object({points:external_exports.array(point).optional(),svgPath:external_exports.string().optional(),strokeWidth:distance.optional(),strokeColor:external_exports.string().optional(),isFilled:external_exports.boolean().optional().default(!1),fillColor:external_exports.string().optional()});expectTypesMatch2(!0);var schematicTableProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),children:external_exports.any().optional(),cellPadding:distance.optional(),borderWidth:distance.optional(),anchor:ninePointAnchor2.optional(),fontSize:distance.optional()});expectTypesMatch2(!0);var schematicRowProps=external_exports.object({children:external_exports.any().optional(),height:distance.optional()});expectTypesMatch2(!0);var schematicCellProps=external_exports.object({children:external_exports.string().optional(),horizontalAlign:external_exports.enum(["left","center","right"]).optional(),verticalAlign:external_exports.enum(["top","middle","bottom"]).optional(),fontSize:distance.optional(),rowSpan:external_exports.number().optional(),colSpan:external_exports.number().optional(),width:distance.optional(),text:external_exports.string().optional()});expectTypesMatch2(!0);var copperTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:ninePointAnchor2.default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),layers:external_exports.array(layer_ref).optional(),knockout:external_exports.boolean().optional(),mirrored:external_exports.boolean().optional()}),silkscreenTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:ninePointAnchor2.default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),isKnockout:external_exports.boolean().optional(),knockoutPadding:length.optional(),knockoutPaddingLeft:length.optional(),knockoutPaddingRight:length.optional(),knockoutPaddingTop:length.optional(),knockoutPaddingBottom:length.optional(),layers:external_exports.array(layer_ref).optional()}),silkscreenPathProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({route:external_exports.array(route_hint_point),strokeWidth:length.optional()}),silkscreenLineProps=pcbLayoutProps.omit({pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({strokeWidth:distance,x1:distance,y1:distance,x2:distance,y2:distance}),silkscreenRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({filled:external_exports.boolean().default(!0).optional(),stroke:external_exports.enum(["dashed","solid","none"]).optional(),strokeWidth:distance.optional(),width:distance,height:distance,cornerRadius:distance.optional()}),silkscreenCircleProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({isFilled:external_exports.boolean().optional(),isOutline:external_exports.boolean().optional(),strokeWidth:distance.optional(),radius:distance}),routeHintPointProps=external_exports.object({x:distance,y:distance,via:external_exports.boolean().optional(),toLayer:layer_ref.optional()}),traceHintProps=external_exports.object({for:external_exports.string().optional().describe("Selector for the port you're targeting, not required if you're inside a trace"),order:external_exports.number().optional(),offset:route_hint_point.or(routeHintPointProps).optional(),offsets:external_exports.array(route_hint_point).or(external_exports.array(routeHintPointProps)).optional(),traceWidth:external_exports.number().optional()}),portProps=commonLayoutProps.extend({name:external_exports.string(),pinNumber:external_exports.number().optional(),schStemLength:external_exports.number().optional(),aliases:external_exports.array(external_exports.string()).optional(),layer:external_exports.string().optional(),layers:external_exports.array(external_exports.string()).optional(),schX:external_exports.number().optional(),schY:external_exports.number().optional(),direction,connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),kicadPinMetadata:kicadPinMetadata.optional(),hasInversionCircle:external_exports.boolean().optional()}),pcbNoteTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var pcbNoteRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({width:distance,height:distance,strokeWidth:distance.optional(),isFilled:external_exports.boolean().optional(),hasStroke:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional(),cornerRadius:distance.optional()});expectTypesMatch2(!0);var pcbNotePathProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({route:external_exports.array(route_hint_point),strokeWidth:length.optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var pcbNoteLineProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({x1:distance,y1:distance,x2:distance,y2:distance,strokeWidth:distance.optional(),color:external_exports.string().optional(),isDashed:external_exports.boolean().optional()});expectTypesMatch2(!0);var dimensionTarget2=external_exports.union([external_exports.string(),point2]),pcbNoteDimensionProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({from:dimensionTarget2,to:dimensionTarget2,text:external_exports.string().optional(),offset:distance.optional(),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional(),arrowSize:distance.optional(),units:external_exports.enum(["in","mm"]).optional(),outerEdgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional(),innerEdgeToEdge:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var unvalidatedCircuitJson=external_exports.array(external_exports.any()).describe("Circuit JSON"),footprintLibraryResult=external_exports.object({footprintCircuitJson:external_exports.array(external_exports.any()),cadModel:cadModelProp.optional()}),pathToCircuitJsonFn=external_exports.function().args(external_exports.string()).returns(external_exports.promise(footprintLibraryResult)).or(external_exports.function().args(external_exports.string(),external_exports.object({resolvedPcbStyle:pcbStyle.optional()}).optional()).returns(external_exports.promise(footprintLibraryResult))).describe("A function that takes a path and returns Circuit JSON"),footprintFileParserEntry=external_exports.object({loadFromUrl:external_exports.function().args(external_exports.string()).returns(external_exports.promise(footprintLibraryResult)).describe("A function that takes a footprint file URL and returns Circuit JSON")}),spiceEngineSimulationResult=external_exports.object({engineVersionString:external_exports.string().optional(),simulationResultCircuitJson:unvalidatedCircuitJson}),spiceEngineZod=external_exports.object({simulate:external_exports.function().args(external_exports.string()).returns(external_exports.promise(spiceEngineSimulationResult)).describe("A function that takes a SPICE string and returns a simulation result")}),defaultSpiceEngine=external_exports.custom(value=>typeof value=="string"),autorouterInstance=external_exports.object({run:external_exports.function().args().returns(external_exports.promise(external_exports.unknown())).describe("Run the autorouter"),getOutputSimpleRouteJson:external_exports.function().args().returns(external_exports.promise(external_exports.any())).describe("Get the resulting SimpleRouteJson")}),autorouterDefinition=external_exports.object({createAutorouter:external_exports.function().args(external_exports.any(),external_exports.any().optional()).returns(external_exports.union([autorouterInstance,external_exports.promise(autorouterInstance)])).describe("Create an autorouter instance")}),platformFetch=external_exports.custom(value=>typeof value=="function").describe("A fetch-like function to use for platform requests"),platformConfig=external_exports.object({partsEngine:partsEngine.optional(),autorouter:autorouterProp.optional(),autorouterMap:external_exports.record(external_exports.string(),autorouterDefinition).optional(),registryApiUrl:url.optional(),cloudAutorouterUrl:url.optional(),projectName:external_exports.string().optional(),projectBaseUrl:url.optional(),version:external_exports.string().optional(),url:url.optional(),printBoardInformationToSilkscreen:external_exports.boolean().optional(),includeBoardFiles:external_exports.array(external_exports.string()).describe('The board files to automatically build with "tsci build", defaults to ["**/*.circuit.tsx"]. Can be an array of files or globs').optional(),snapshotsDir:external_exports.string().describe('The directory where snapshots are stored for "tsci snapshot", defaults to "tests/__snapshots__"').optional(),defaultSpiceEngine:defaultSpiceEngine.optional(),localCacheEngine:external_exports.any().optional(),pcbDisabled:external_exports.boolean().optional(),schematicDisabled:external_exports.boolean().optional(),partsEngineDisabled:external_exports.boolean().optional(),spiceEngineMap:external_exports.record(external_exports.string(),spiceEngineZod).optional(),footprintLibraryMap:external_exports.record(external_exports.string(),external_exports.union([pathToCircuitJsonFn,external_exports.record(external_exports.string(),external_exports.union([unvalidatedCircuitJson,pathToCircuitJsonFn]))])).optional(),footprintFileParserMap:external_exports.record(external_exports.string(),footprintFileParserEntry).optional(),resolveProjectStaticFileImportUrl:external_exports.function().args(external_exports.string()).returns(external_exports.promise(external_exports.string())).describe("A function that returns a string URL for static files for the project").optional(),platformFetch:platformFetch.optional()});expectTypesMatch2(!0);var platformConfigObject=platformConfig,projectConfig=platformConfigObject.pick({projectName:!0,projectBaseUrl:!0,version:!0,url:!0,printBoardInformationToSilkscreen:!0,includeBoardFiles:!0,snapshotsDir:!0,defaultSpiceEngine:!0});expectTypesMatch2(!0);init_dist();init_dist3();var esm_exports2={};__export(esm_exports2,{DocumentPosition:()=>DocumentPosition,append:()=>append,appendChild:()=>appendChild,compareDocumentPosition:()=>compareDocumentPosition,existsOne:()=>existsOne,filter:()=>filter,find:()=>find,findAll:()=>findAll,findOne:()=>findOne,findOneChild:()=>findOneChild,getAttributeValue:()=>getAttributeValue,getChildren:()=>getChildren,getElementById:()=>getElementById,getElements:()=>getElements,getElementsByClassName:()=>getElementsByClassName,getElementsByTagName:()=>getElementsByTagName,getElementsByTagType:()=>getElementsByTagType,getFeed:()=>getFeed,getInnerHTML:()=>getInnerHTML,getName:()=>getName,getOuterHTML:()=>getOuterHTML,getParent:()=>getParent,getSiblings:()=>getSiblings,getText:()=>getText,hasAttrib:()=>hasAttrib,hasChildren:()=>hasChildren,innerText:()=>innerText,isCDATA:()=>isCDATA,isComment:()=>isComment,isDocument:()=>isDocument,isTag:()=>isTag2,isText:()=>isText,nextElementSibling:()=>nextElementSibling,prepend:()=>prepend,prependChild:()=>prependChild,prevElementSibling:()=>prevElementSibling,removeElement:()=>removeElement,removeSubsets:()=>removeSubsets,replaceElement:()=>replaceElement,testElement:()=>testElement,textContent:()=>textContent,uniqueSort:()=>uniqueSort});var ElementType;(function(ElementType2){ElementType2.Root="root",ElementType2.Text="text",ElementType2.Directive="directive",ElementType2.Comment="comment",ElementType2.Script="script",ElementType2.Style="style",ElementType2.Tag="tag",ElementType2.CDATA="cdata",ElementType2.Doctype="doctype"})(ElementType||(ElementType={}));function isTag(elem){return elem.type===ElementType.Tag||elem.type===ElementType.Script||elem.type===ElementType.Style}var Root=ElementType.Root,Text=ElementType.Text,Directive=ElementType.Directive,Comment=ElementType.Comment,Script=ElementType.Script,Style=ElementType.Style,Tag=ElementType.Tag,CDATA=ElementType.CDATA,Doctype=ElementType.Doctype;function isTag2(node){return isTag(node)}function isCDATA(node){return node.type===ElementType.CDATA}function isText(node){return node.type===ElementType.Text}function isComment(node){return node.type===ElementType.Comment}function isDocument(node){return node.type===ElementType.Root}function hasChildren(node){return Object.prototype.hasOwnProperty.call(node,"children")}var decode_data_html_default=new Uint16Array('\u1D41<\xD5\u0131\u028A\u049D\u057B\u05D0\u0675\u06DE\u07A2\u07D6\u080F\u0A4A\u0A91\u0DA1\u0E6D\u0F09\u0F26\u10CA\u1228\u12E1\u1415\u149D\u14C3\u14DF\u1525\0\0\0\0\0\0\u156B\u16CD\u198D\u1C12\u1DDD\u1F7E\u2060\u21B0\u228D\u23C0\u23FB\u2442\u2824\u2912\u2D08\u2E48\u2FCE\u3016\u32BA\u3639\u37AC\u38FE\u3A28\u3A71\u3AE0\u3B2E\u0800EMabcfglmnoprstu\\bfms\x7F\x84\x8B\x90\x95\x98\xA6\xB3\xB9\xC8\xCFlig\u803B\xC6\u40C6P\u803B&\u4026cute\u803B\xC1\u40C1reve;\u4102\u0100iyx}rc\u803B\xC2\u40C2;\u4410r;\uC000\u{1D504}rave\u803B\xC0\u40C0pha;\u4391acr;\u4100d;\u6A53\u0100gp\x9D\xA1on;\u4104f;\uC000\u{1D538}plyFunction;\u6061ing\u803B\xC5\u40C5\u0100cs\xBE\xC3r;\uC000\u{1D49C}ign;\u6254ilde\u803B\xC3\u40C3ml\u803B\xC4\u40C4\u0400aceforsu\xE5\xFB\xFE\u0117\u011C\u0122\u0127\u012A\u0100cr\xEA\xF2kslash;\u6216\u0176\xF6\xF8;\u6AE7ed;\u6306y;\u4411\u0180crt\u0105\u010B\u0114ause;\u6235noullis;\u612Ca;\u4392r;\uC000\u{1D505}pf;\uC000\u{1D539}eve;\u42D8c\xF2\u0113mpeq;\u624E\u0700HOacdefhilorsu\u014D\u0151\u0156\u0180\u019E\u01A2\u01B5\u01B7\u01BA\u01DC\u0215\u0273\u0278\u027Ecy;\u4427PY\u803B\xA9\u40A9\u0180cpy\u015D\u0162\u017Aute;\u4106\u0100;i\u0167\u0168\u62D2talDifferentialD;\u6145leys;\u612D\u0200aeio\u0189\u018E\u0194\u0198ron;\u410Cdil\u803B\xC7\u40C7rc;\u4108nint;\u6230ot;\u410A\u0100dn\u01A7\u01ADilla;\u40B8terDot;\u40B7\xF2\u017Fi;\u43A7rcle\u0200DMPT\u01C7\u01CB\u01D1\u01D6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01E2\u01F8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020FoubleQuote;\u601Duote;\u6019\u0200lnpu\u021E\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6A74\u0180git\u022F\u0236\u023Aruent;\u6261nt;\u622FourIntegral;\u622E\u0100fr\u024C\u024E;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6A2Fcr;\uC000\u{1D49E}p\u0100;C\u0284\u0285\u62D3ap;\u624D\u0580DJSZacefios\u02A0\u02AC\u02B0\u02B4\u02B8\u02CB\u02D7\u02E1\u02E6\u0333\u048D\u0100;o\u0179\u02A5trahd;\u6911cy;\u4402cy;\u4405cy;\u440F\u0180grs\u02BF\u02C4\u02C7ger;\u6021r;\u61A1hv;\u6AE4\u0100ay\u02D0\u02D5ron;\u410E;\u4414l\u0100;t\u02DD\u02DE\u6207a;\u4394r;\uC000\u{1D507}\u0100af\u02EB\u0327\u0100cm\u02F0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031Ccute;\u40B4o\u0174\u030B\u030D;\u42D9bleAcute;\u42DDrave;\u4060ilde;\u42DCond;\u62C4ferentialD;\u6146\u0470\u033D\0\0\0\u0342\u0354\0\u0405f;\uC000\u{1D53B}\u0180;DE\u0348\u0349\u034D\u40A8ot;\u60DCqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03CF\u03E2\u03F8ontourIntegra\xEC\u0239o\u0274\u0379\0\0\u037B\xBB\u0349nArrow;\u61D3\u0100eo\u0387\u03A4ft\u0180ART\u0390\u0396\u03A1rrow;\u61D0ightArrow;\u61D4e\xE5\u02CAng\u0100LR\u03AB\u03C4eft\u0100AR\u03B3\u03B9rrow;\u67F8ightArrow;\u67FAightArrow;\u67F9ight\u0100AT\u03D8\u03DErrow;\u61D2ee;\u62A8p\u0241\u03E9\0\0\u03EFrrow;\u61D1ownArrow;\u61D5erticalBar;\u6225n\u0300ABLRTa\u0412\u042A\u0430\u045E\u047F\u037Crrow\u0180;BU\u041D\u041E\u0422\u6193ar;\u6913pArrow;\u61F5reve;\u4311eft\u02D2\u043A\0\u0446\0\u0450ightVector;\u6950eeVector;\u695Eector\u0100;B\u0459\u045A\u61BDar;\u6956ight\u01D4\u0467\0\u0471eeVector;\u695Fector\u0100;B\u047A\u047B\u61C1ar;\u6957ee\u0100;A\u0486\u0487\u62A4rrow;\u61A7\u0100ct\u0492\u0497r;\uC000\u{1D49F}rok;\u4110\u0800NTacdfglmopqstux\u04BD\u04C0\u04C4\u04CB\u04DE\u04E2\u04E7\u04EE\u04F5\u0521\u052F\u0536\u0552\u055D\u0560\u0565G;\u414AH\u803B\xD0\u40D0cute\u803B\xC9\u40C9\u0180aiy\u04D2\u04D7\u04DCron;\u411Arc\u803B\xCA\u40CA;\u442Dot;\u4116r;\uC000\u{1D508}rave\u803B\xC8\u40C8ement;\u6208\u0100ap\u04FA\u04FEcr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65FBerySmallSquare;\u65AB\u0100gp\u0526\u052Aon;\u4118f;\uC000\u{1D53C}silon;\u4395u\u0100ai\u053C\u0549l\u0100;T\u0542\u0543\u6A75ilde;\u6242librium;\u61CC\u0100ci\u0557\u055Ar;\u6130m;\u6A73a;\u4397ml\u803B\xCB\u40CB\u0100ip\u056A\u056Fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058D\u05B2\u05CCy;\u4424r;\uC000\u{1D509}lled\u0253\u0597\0\0\u05A3mallSquare;\u65FCerySmallSquare;\u65AA\u0370\u05BA\0\u05BF\0\0\u05C4f;\uC000\u{1D53D}All;\u6200riertrf;\u6131c\xF2\u05CB\u0600JTabcdfgorst\u05E8\u05EC\u05EF\u05FA\u0600\u0612\u0616\u061B\u061D\u0623\u066C\u0672cy;\u4403\u803B>\u403Emma\u0100;d\u05F7\u05F8\u4393;\u43DCreve;\u411E\u0180eiy\u0607\u060C\u0610dil;\u4122rc;\u411C;\u4413ot;\u4120r;\uC000\u{1D50A};\u62D9pf;\uC000\u{1D53E}eater\u0300EFGLST\u0635\u0644\u064E\u0656\u065B\u0666qual\u0100;L\u063E\u063F\u6265ess;\u62DBullEqual;\u6267reater;\u6AA2ess;\u6277lantEqual;\u6A7Eilde;\u6273cr;\uC000\u{1D4A2};\u626B\u0400Aacfiosu\u0685\u068B\u0696\u069B\u069E\u06AA\u06BE\u06CARDcy;\u442A\u0100ct\u0690\u0694ek;\u42C7;\u405Eirc;\u4124r;\u610ClbertSpace;\u610B\u01F0\u06AF\0\u06B2f;\u610DizontalLine;\u6500\u0100ct\u06C3\u06C5\xF2\u06A9rok;\u4126mp\u0144\u06D0\u06D8ownHum\xF0\u012Fqual;\u624F\u0700EJOacdfgmnostu\u06FA\u06FE\u0703\u0707\u070E\u071A\u071E\u0721\u0728\u0744\u0778\u078B\u078F\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803B\xCD\u40CD\u0100iy\u0713\u0718rc\u803B\xCE\u40CE;\u4418ot;\u4130r;\u6111rave\u803B\xCC\u40CC\u0180;ap\u0720\u072F\u073F\u0100cg\u0734\u0737r;\u412AinaryI;\u6148lie\xF3\u03DD\u01F4\u0749\0\u0762\u0100;e\u074D\u074E\u622C\u0100gr\u0753\u0758ral;\u622Bsection;\u62C2isible\u0100CT\u076C\u0772omma;\u6063imes;\u6062\u0180gpt\u077F\u0783\u0788on;\u412Ef;\uC000\u{1D540}a;\u4399cr;\u6110ilde;\u4128\u01EB\u079A\0\u079Ecy;\u4406l\u803B\xCF\u40CF\u0280cfosu\u07AC\u07B7\u07BC\u07C2\u07D0\u0100iy\u07B1\u07B5rc;\u4134;\u4419r;\uC000\u{1D50D}pf;\uC000\u{1D541}\u01E3\u07C7\0\u07CCr;\uC000\u{1D4A5}rcy;\u4408kcy;\u4404\u0380HJacfos\u07E4\u07E8\u07EC\u07F1\u07FD\u0802\u0808cy;\u4425cy;\u440Cppa;\u439A\u0100ey\u07F6\u07FBdil;\u4136;\u441Ar;\uC000\u{1D50E}pf;\uC000\u{1D542}cr;\uC000\u{1D4A6}\u0580JTaceflmost\u0825\u0829\u082C\u0850\u0863\u09B3\u09B8\u09C7\u09CD\u0A37\u0A47cy;\u4409\u803B<\u403C\u0280cmnpr\u0837\u083C\u0841\u0844\u084Dute;\u4139bda;\u439Bg;\u67EAlacetrf;\u6112r;\u619E\u0180aey\u0857\u085C\u0861ron;\u413Ddil;\u413B;\u441B\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087E\u08A9\u08B1\u08E0\u08E6\u08FC\u092F\u095B\u0390\u096A\u0100nr\u0883\u088FgleBracket;\u67E8row\u0180;BR\u0899\u089A\u089E\u6190ar;\u61E4ightArrow;\u61C6eiling;\u6308o\u01F5\u08B7\0\u08C3bleBracket;\u67E6n\u01D4\u08C8\0\u08D2eeVector;\u6961ector\u0100;B\u08DB\u08DC\u61C3ar;\u6959loor;\u630Aight\u0100AV\u08EF\u08F5rrow;\u6194ector;\u694E\u0100er\u0901\u0917e\u0180;AV\u0909\u090A\u0910\u62A3rrow;\u61A4ector;\u695Aiangle\u0180;BE\u0924\u0925\u0929\u62B2ar;\u69CFqual;\u62B4p\u0180DTV\u0937\u0942\u094CownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61BFar;\u6958ector\u0100;B\u0965\u0966\u61BCar;\u6952ight\xE1\u039Cs\u0300EFGLST\u097E\u098B\u0995\u099D\u09A2\u09ADqualGreater;\u62DAullEqual;\u6266reater;\u6276ess;\u6AA1lantEqual;\u6A7Dilde;\u6272r;\uC000\u{1D50F}\u0100;e\u09BD\u09BE\u62D8ftarrow;\u61DAidot;\u413F\u0180npw\u09D4\u0A16\u0A1Bg\u0200LRlr\u09DE\u09F7\u0A02\u0A10eft\u0100AR\u09E6\u09ECrrow;\u67F5ightArrow;\u67F7ightArrow;\u67F6eft\u0100ar\u03B3\u0A0Aight\xE1\u03BFight\xE1\u03CAf;\uC000\u{1D543}er\u0100LR\u0A22\u0A2CeftArrow;\u6199ightArrow;\u6198\u0180cht\u0A3E\u0A40\u0A42\xF2\u084C;\u61B0rok;\u4141;\u626A\u0400acefiosu\u0A5A\u0A5D\u0A60\u0A77\u0A7C\u0A85\u0A8B\u0A8Ep;\u6905y;\u441C\u0100dl\u0A65\u0A6FiumSpace;\u605Flintrf;\u6133r;\uC000\u{1D510}nusPlus;\u6213pf;\uC000\u{1D544}c\xF2\u0A76;\u439C\u0480Jacefostu\u0AA3\u0AA7\u0AAD\u0AC0\u0B14\u0B19\u0D91\u0D97\u0D9Ecy;\u440Acute;\u4143\u0180aey\u0AB4\u0AB9\u0ABEron;\u4147dil;\u4145;\u441D\u0180gsw\u0AC7\u0AF0\u0B0Eative\u0180MTV\u0AD3\u0ADF\u0AE8ediumSpace;\u600Bhi\u0100cn\u0AE6\u0AD8\xEB\u0AD9eryThi\xEE\u0AD9ted\u0100GL\u0AF8\u0B06reaterGreate\xF2\u0673essLes\xF3\u0A48Line;\u400Ar;\uC000\u{1D511}\u0200Bnpt\u0B22\u0B28\u0B37\u0B3Areak;\u6060BreakingSpace;\u40A0f;\u6115\u0680;CDEGHLNPRSTV\u0B55\u0B56\u0B6A\u0B7C\u0BA1\u0BEB\u0C04\u0C5E\u0C84\u0CA6\u0CD8\u0D61\u0D85\u6AEC\u0100ou\u0B5B\u0B64ngruent;\u6262pCap;\u626DoubleVerticalBar;\u6226\u0180lqx\u0B83\u0B8A\u0B9Bement;\u6209ual\u0100;T\u0B92\u0B93\u6260ilde;\uC000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0BB6\u0BB7\u0BBD\u0BC9\u0BD3\u0BD8\u0BE5\u626Fqual;\u6271ullEqual;\uC000\u2267\u0338reater;\uC000\u226B\u0338ess;\u6279lantEqual;\uC000\u2A7E\u0338ilde;\u6275ump\u0144\u0BF2\u0BFDownHump;\uC000\u224E\u0338qual;\uC000\u224F\u0338e\u0100fs\u0C0A\u0C27tTriangle\u0180;BE\u0C1A\u0C1B\u0C21\u62EAar;\uC000\u29CF\u0338qual;\u62ECs\u0300;EGLST\u0C35\u0C36\u0C3C\u0C44\u0C4B\u0C58\u626Equal;\u6270reater;\u6278ess;\uC000\u226A\u0338lantEqual;\uC000\u2A7D\u0338ilde;\u6274ested\u0100GL\u0C68\u0C79reaterGreater;\uC000\u2AA2\u0338essLess;\uC000\u2AA1\u0338recedes\u0180;ES\u0C92\u0C93\u0C9B\u6280qual;\uC000\u2AAF\u0338lantEqual;\u62E0\u0100ei\u0CAB\u0CB9verseElement;\u620CghtTriangle\u0180;BE\u0CCB\u0CCC\u0CD2\u62EBar;\uC000\u29D0\u0338qual;\u62ED\u0100qu\u0CDD\u0D0CuareSu\u0100bp\u0CE8\u0CF9set\u0100;E\u0CF0\u0CF3\uC000\u228F\u0338qual;\u62E2erset\u0100;E\u0D03\u0D06\uC000\u2290\u0338qual;\u62E3\u0180bcp\u0D13\u0D24\u0D4Eset\u0100;E\u0D1B\u0D1E\uC000\u2282\u20D2qual;\u6288ceeds\u0200;EST\u0D32\u0D33\u0D3B\u0D46\u6281qual;\uC000\u2AB0\u0338lantEqual;\u62E1ilde;\uC000\u227F\u0338erset\u0100;E\u0D58\u0D5B\uC000\u2283\u20D2qual;\u6289ilde\u0200;EFT\u0D6E\u0D6F\u0D75\u0D7F\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uC000\u{1D4A9}ilde\u803B\xD1\u40D1;\u439D\u0700Eacdfgmoprstuv\u0DBD\u0DC2\u0DC9\u0DD5\u0DDB\u0DE0\u0DE7\u0DFC\u0E02\u0E20\u0E22\u0E32\u0E3F\u0E44lig;\u4152cute\u803B\xD3\u40D3\u0100iy\u0DCE\u0DD3rc\u803B\xD4\u40D4;\u441Eblac;\u4150r;\uC000\u{1D512}rave\u803B\xD2\u40D2\u0180aei\u0DEE\u0DF2\u0DF6cr;\u414Cga;\u43A9cron;\u439Fpf;\uC000\u{1D546}enCurly\u0100DQ\u0E0E\u0E1AoubleQuote;\u601Cuote;\u6018;\u6A54\u0100cl\u0E27\u0E2Cr;\uC000\u{1D4AA}ash\u803B\xD8\u40D8i\u016C\u0E37\u0E3Cde\u803B\xD5\u40D5es;\u6A37ml\u803B\xD6\u40D6er\u0100BP\u0E4B\u0E60\u0100ar\u0E50\u0E53r;\u603Eac\u0100ek\u0E5A\u0E5C;\u63DEet;\u63B4arenthesis;\u63DC\u0480acfhilors\u0E7F\u0E87\u0E8A\u0E8F\u0E92\u0E94\u0E9D\u0EB0\u0EFCrtialD;\u6202y;\u441Fr;\uC000\u{1D513}i;\u43A6;\u43A0usMinus;\u40B1\u0100ip\u0EA2\u0EADncareplan\xE5\u069Df;\u6119\u0200;eio\u0EB9\u0EBA\u0EE0\u0EE4\u6ABBcedes\u0200;EST\u0EC8\u0EC9\u0ECF\u0EDA\u627Aqual;\u6AAFlantEqual;\u627Cilde;\u627Eme;\u6033\u0100dp\u0EE9\u0EEEuct;\u620Fortion\u0100;a\u0225\u0EF9l;\u621D\u0100ci\u0F01\u0F06r;\uC000\u{1D4AB};\u43A8\u0200Ufos\u0F11\u0F16\u0F1B\u0F1FOT\u803B"\u4022r;\uC000\u{1D514}pf;\u611Acr;\uC000\u{1D4AC}\u0600BEacefhiorsu\u0F3E\u0F43\u0F47\u0F60\u0F73\u0FA7\u0FAA\u0FAD\u1096\u10A9\u10B4\u10BEarr;\u6910G\u803B\xAE\u40AE\u0180cnr\u0F4E\u0F53\u0F56ute;\u4154g;\u67EBr\u0100;t\u0F5C\u0F5D\u61A0l;\u6916\u0180aey\u0F67\u0F6C\u0F71ron;\u4158dil;\u4156;\u4420\u0100;v\u0F78\u0F79\u611Cerse\u0100EU\u0F82\u0F99\u0100lq\u0F87\u0F8Eement;\u620Builibrium;\u61CBpEquilibrium;\u696Fr\xBB\u0F79o;\u43A1ght\u0400ACDFTUVa\u0FC1\u0FEB\u0FF3\u1022\u1028\u105B\u1087\u03D8\u0100nr\u0FC6\u0FD2gleBracket;\u67E9row\u0180;BL\u0FDC\u0FDD\u0FE1\u6192ar;\u61E5eftArrow;\u61C4eiling;\u6309o\u01F5\u0FF9\0\u1005bleBracket;\u67E7n\u01D4\u100A\0\u1014eeVector;\u695Dector\u0100;B\u101D\u101E\u61C2ar;\u6955loor;\u630B\u0100er\u102D\u1043e\u0180;AV\u1035\u1036\u103C\u62A2rrow;\u61A6ector;\u695Biangle\u0180;BE\u1050\u1051\u1055\u62B3ar;\u69D0qual;\u62B5p\u0180DTV\u1063\u106E\u1078ownVector;\u694FeeVector;\u695Cector\u0100;B\u1082\u1083\u61BEar;\u6954ector\u0100;B\u1091\u1092\u61C0ar;\u6953\u0100pu\u109B\u109Ef;\u611DndImplies;\u6970ightarrow;\u61DB\u0100ch\u10B9\u10BCr;\u611B;\u61B1leDelayed;\u69F4\u0680HOacfhimoqstu\u10E4\u10F1\u10F7\u10FD\u1119\u111E\u1151\u1156\u1161\u1167\u11B5\u11BB\u11BF\u0100Cc\u10E9\u10EEHcy;\u4429y;\u4428FTcy;\u442Ccute;\u415A\u0280;aeiy\u1108\u1109\u110E\u1113\u1117\u6ABCron;\u4160dil;\u415Erc;\u415C;\u4421r;\uC000\u{1D516}ort\u0200DLRU\u112A\u1134\u113E\u1149ownArrow\xBB\u041EeftArrow\xBB\u089AightArrow\xBB\u0FDDpArrow;\u6191gma;\u43A3allCircle;\u6218pf;\uC000\u{1D54A}\u0272\u116D\0\0\u1170t;\u621Aare\u0200;ISU\u117B\u117C\u1189\u11AF\u65A1ntersection;\u6293u\u0100bp\u118F\u119Eset\u0100;E\u1197\u1198\u628Fqual;\u6291erset\u0100;E\u11A8\u11A9\u6290qual;\u6292nion;\u6294cr;\uC000\u{1D4AE}ar;\u62C6\u0200bcmp\u11C8\u11DB\u1209\u120B\u0100;s\u11CD\u11CE\u62D0et\u0100;E\u11CD\u11D5qual;\u6286\u0100ch\u11E0\u1205eeds\u0200;EST\u11ED\u11EE\u11F4\u11FF\u627Bqual;\u6AB0lantEqual;\u627Dilde;\u627FTh\xE1\u0F8C;\u6211\u0180;es\u1212\u1213\u1223\u62D1rset\u0100;E\u121C\u121D\u6283qual;\u6287et\xBB\u1213\u0580HRSacfhiors\u123E\u1244\u1249\u1255\u125E\u1271\u1276\u129F\u12C2\u12C8\u12D1ORN\u803B\xDE\u40DEADE;\u6122\u0100Hc\u124E\u1252cy;\u440By;\u4426\u0100bu\u125A\u125C;\u4009;\u43A4\u0180aey\u1265\u126A\u126Fron;\u4164dil;\u4162;\u4422r;\uC000\u{1D517}\u0100ei\u127B\u1289\u01F2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128E\u1298kSpace;\uC000\u205F\u200ASpace;\u6009lde\u0200;EFT\u12AB\u12AC\u12B2\u12BC\u623Cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uC000\u{1D54B}ipleDot;\u60DB\u0100ct\u12D6\u12DBr;\uC000\u{1D4AF}rok;\u4166\u0AE1\u12F7\u130E\u131A\u1326\0\u132C\u1331\0\0\0\0\0\u1338\u133D\u1377\u1385\0\u13FF\u1404\u140A\u1410\u0100cr\u12FB\u1301ute\u803B\xDA\u40DAr\u0100;o\u1307\u1308\u619Fcir;\u6949r\u01E3\u1313\0\u1316y;\u440Eve;\u416C\u0100iy\u131E\u1323rc\u803B\xDB\u40DB;\u4423blac;\u4170r;\uC000\u{1D518}rave\u803B\xD9\u40D9acr;\u416A\u0100di\u1341\u1369er\u0100BP\u1348\u135D\u0100ar\u134D\u1350r;\u405Fac\u0100ek\u1357\u1359;\u63DFet;\u63B5arenthesis;\u63DDon\u0100;P\u1370\u1371\u62C3lus;\u628E\u0100gp\u137B\u137Fon;\u4172f;\uC000\u{1D54C}\u0400ADETadps\u1395\u13AE\u13B8\u13C4\u03E8\u13D2\u13D7\u13F3rrow\u0180;BD\u1150\u13A0\u13A4ar;\u6912ownArrow;\u61C5ownArrow;\u6195quilibrium;\u696Eee\u0100;A\u13CB\u13CC\u62A5rrow;\u61A5own\xE1\u03F3er\u0100LR\u13DE\u13E8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13F9\u13FA\u43D2on;\u43A5ing;\u416Ecr;\uC000\u{1D4B0}ilde;\u4168ml\u803B\xDC\u40DC\u0480Dbcdefosv\u1427\u142C\u1430\u1433\u143E\u1485\u148A\u1490\u1496ash;\u62ABar;\u6AEBy;\u4412ash\u0100;l\u143B\u143C\u62A9;\u6AE6\u0100er\u1443\u1445;\u62C1\u0180bty\u144C\u1450\u147Aar;\u6016\u0100;i\u144F\u1455cal\u0200BLST\u1461\u1465\u146A\u1474ar;\u6223ine;\u407Ceparator;\u6758ilde;\u6240ThinSpace;\u600Ar;\uC000\u{1D519}pf;\uC000\u{1D54D}cr;\uC000\u{1D4B1}dash;\u62AA\u0280cefos\u14A7\u14AC\u14B1\u14B6\u14BCirc;\u4174dge;\u62C0r;\uC000\u{1D51A}pf;\uC000\u{1D54E}cr;\uC000\u{1D4B2}\u0200fios\u14CB\u14D0\u14D2\u14D8r;\uC000\u{1D51B};\u439Epf;\uC000\u{1D54F}cr;\uC000\u{1D4B3}\u0480AIUacfosu\u14F1\u14F5\u14F9\u14FD\u1504\u150F\u1514\u151A\u1520cy;\u442Fcy;\u4407cy;\u442Ecute\u803B\xDD\u40DD\u0100iy\u1509\u150Drc;\u4176;\u442Br;\uC000\u{1D51C}pf;\uC000\u{1D550}cr;\uC000\u{1D4B4}ml;\u4178\u0400Hacdefos\u1535\u1539\u153F\u154B\u154F\u155D\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417D;\u4417ot;\u417B\u01F2\u1554\0\u155BoWidt\xE8\u0AD9a;\u4396r;\u6128pf;\u6124cr;\uC000\u{1D4B5}\u0BE1\u1583\u158A\u1590\0\u15B0\u15B6\u15BF\0\0\0\0\u15C6\u15DB\u15EB\u165F\u166D\0\u1695\u169B\u16B2\u16B9\0\u16BEcute\u803B\xE1\u40E1reve;\u4103\u0300;Ediuy\u159C\u159D\u15A1\u15A3\u15A8\u15AD\u623E;\uC000\u223E\u0333;\u623Frc\u803B\xE2\u40E2te\u80BB\xB4\u0306;\u4430lig\u803B\xE6\u40E6\u0100;r\xB2\u15BA;\uC000\u{1D51E}rave\u803B\xE0\u40E0\u0100ep\u15CA\u15D6\u0100fp\u15CF\u15D4sym;\u6135\xE8\u15D3ha;\u43B1\u0100ap\u15DFc\u0100cl\u15E4\u15E7r;\u4101g;\u6A3F\u0264\u15F0\0\0\u160A\u0280;adsv\u15FA\u15FB\u15FF\u1601\u1607\u6227nd;\u6A55;\u6A5Clope;\u6A58;\u6A5A\u0380;elmrsz\u1618\u1619\u161B\u161E\u163F\u164F\u1659\u6220;\u69A4e\xBB\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163A\u163C\u163E;\u69A8;\u69A9;\u69AA;\u69AB;\u69AC;\u69AD;\u69AE;\u69AFt\u0100;v\u1645\u1646\u621Fb\u0100;d\u164C\u164D\u62BE;\u699D\u0100pt\u1654\u1657h;\u6222\xBB\xB9arr;\u637C\u0100gp\u1663\u1667on;\u4105f;\uC000\u{1D552}\u0380;Eaeiop\u12C1\u167B\u167D\u1682\u1684\u1687\u168A;\u6A70cir;\u6A6F;\u624Ad;\u624Bs;\u4027rox\u0100;e\u12C1\u1692\xF1\u1683ing\u803B\xE5\u40E5\u0180cty\u16A1\u16A6\u16A8r;\uC000\u{1D4B6};\u402Amp\u0100;e\u12C1\u16AF\xF1\u0288ilde\u803B\xE3\u40E3ml\u803B\xE4\u40E4\u0100ci\u16C2\u16C8onin\xF4\u0272nt;\u6A11\u0800Nabcdefiklnoprsu\u16ED\u16F1\u1730\u173C\u1743\u1748\u1778\u177D\u17E0\u17E6\u1839\u1850\u170D\u193D\u1948\u1970ot;\u6AED\u0100cr\u16F6\u171Ek\u0200ceps\u1700\u1705\u170D\u1713ong;\u624Cpsilon;\u43F6rime;\u6035im\u0100;e\u171A\u171B\u623Dq;\u62CD\u0176\u1722\u1726ee;\u62BDed\u0100;g\u172C\u172D\u6305e\xBB\u172Drk\u0100;t\u135C\u1737brk;\u63B6\u0100oy\u1701\u1741;\u4431quo;\u601E\u0280cmprt\u1753\u175B\u1761\u1764\u1768aus\u0100;e\u010A\u0109ptyv;\u69B0s\xE9\u170Cno\xF5\u0113\u0180ahw\u176F\u1771\u1773;\u43B2;\u6136een;\u626Cr;\uC000\u{1D51F}g\u0380costuvw\u178D\u179D\u17B3\u17C1\u17D5\u17DB\u17DE\u0180aiu\u1794\u1796\u179A\xF0\u0760rc;\u65EFp\xBB\u1371\u0180dpt\u17A4\u17A8\u17ADot;\u6A00lus;\u6A01imes;\u6A02\u0271\u17B9\0\0\u17BEcup;\u6A06ar;\u6605riangle\u0100du\u17CD\u17D2own;\u65BDp;\u65B3plus;\u6A04e\xE5\u1444\xE5\u14ADarow;\u690D\u0180ako\u17ED\u1826\u1835\u0100cn\u17F2\u1823k\u0180lst\u17FA\u05AB\u1802ozenge;\u69EBriangle\u0200;dlr\u1812\u1813\u1818\u181D\u65B4own;\u65BEeft;\u65C2ight;\u65B8k;\u6423\u01B1\u182B\0\u1833\u01B2\u182F\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183E\u184D\u0100;q\u1843\u1846\uC000=\u20E5uiv;\uC000\u2261\u20E5t;\u6310\u0200ptwx\u1859\u185E\u1867\u186Cf;\uC000\u{1D553}\u0100;t\u13CB\u1863om\xBB\u13CCtie;\u62C8\u0600DHUVbdhmptuv\u1885\u1896\u18AA\u18BB\u18D7\u18DB\u18EC\u18FF\u1905\u190A\u1910\u1921\u0200LRlr\u188E\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18A1\u18A2\u18A4\u18A6\u18A8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18B3\u18B5\u18B7\u18B9;\u655D;\u655A;\u655C;\u6559\u0380;HLRhlr\u18CA\u18CB\u18CD\u18CF\u18D1\u18D3\u18D5\u6551;\u656C;\u6563;\u6560;\u656B;\u6562;\u655Fox;\u69C9\u0200LRlr\u18E4\u18E6\u18E8\u18EA;\u6555;\u6552;\u6510;\u650C\u0280;DUdu\u06BD\u18F7\u18F9\u18FB\u18FD;\u6565;\u6568;\u652C;\u6534inus;\u629Flus;\u629Eimes;\u62A0\u0200LRlr\u1919\u191B\u191D\u191F;\u655B;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193B\u6502;\u656A;\u6561;\u655E;\u653C;\u6524;\u651C\u0100ev\u0123\u1942bar\u803B\xA6\u40A6\u0200ceio\u1951\u1956\u195A\u1960r;\uC000\u{1D4B7}mi;\u604Fm\u0100;e\u171A\u171Cl\u0180;bh\u1968\u1969\u196B\u405C;\u69C5sub;\u67C8\u016C\u1974\u197El\u0100;e\u1979\u197A\u6022t\xBB\u197Ap\u0180;Ee\u012F\u1985\u1987;\u6AAE\u0100;q\u06DC\u06DB\u0CE1\u19A7\0\u19E8\u1A11\u1A15\u1A32\0\u1A37\u1A50\0\0\u1AB4\0\0\u1AC1\0\0\u1B21\u1B2E\u1B4D\u1B52\0\u1BFD\0\u1C0C\u0180cpr\u19AD\u19B2\u19DDute;\u4107\u0300;abcds\u19BF\u19C0\u19C4\u19CA\u19D5\u19D9\u6229nd;\u6A44rcup;\u6A49\u0100au\u19CF\u19D2p;\u6A4Bp;\u6A47ot;\u6A40;\uC000\u2229\uFE00\u0100eo\u19E2\u19E5t;\u6041\xEE\u0693\u0200aeiu\u19F0\u19FB\u1A01\u1A05\u01F0\u19F5\0\u19F8s;\u6A4Don;\u410Ddil\u803B\xE7\u40E7rc;\u4109ps\u0100;s\u1A0C\u1A0D\u6A4Cm;\u6A50ot;\u410B\u0180dmn\u1A1B\u1A20\u1A26il\u80BB\xB8\u01ADptyv;\u69B2t\u8100\xA2;e\u1A2D\u1A2E\u40A2r\xE4\u01B2r;\uC000\u{1D520}\u0180cei\u1A3D\u1A40\u1A4Dy;\u4447ck\u0100;m\u1A47\u1A48\u6713ark\xBB\u1A48;\u43C7r\u0380;Ecefms\u1A5F\u1A60\u1A62\u1A6B\u1AA4\u1AAA\u1AAE\u65CB;\u69C3\u0180;el\u1A69\u1A6A\u1A6D\u42C6q;\u6257e\u0261\u1A74\0\0\u1A88rrow\u0100lr\u1A7C\u1A81eft;\u61BAight;\u61BB\u0280RSacd\u1A92\u1A94\u1A96\u1A9A\u1A9F\xBB\u0F47;\u64C8st;\u629Birc;\u629Aash;\u629Dnint;\u6A10id;\u6AEFcir;\u69C2ubs\u0100;u\u1ABB\u1ABC\u6663it\xBB\u1ABC\u02EC\u1AC7\u1AD4\u1AFA\0\u1B0Aon\u0100;e\u1ACD\u1ACE\u403A\u0100;q\xC7\xC6\u026D\u1AD9\0\0\u1AE2a\u0100;t\u1ADE\u1ADF\u402C;\u4040\u0180;fl\u1AE8\u1AE9\u1AEB\u6201\xEE\u1160e\u0100mx\u1AF1\u1AF6ent\xBB\u1AE9e\xF3\u024D\u01E7\u1AFE\0\u1B07\u0100;d\u12BB\u1B02ot;\u6A6Dn\xF4\u0246\u0180fry\u1B10\u1B14\u1B17;\uC000\u{1D554}o\xE4\u0254\u8100\xA9;s\u0155\u1B1Dr;\u6117\u0100ao\u1B25\u1B29rr;\u61B5ss;\u6717\u0100cu\u1B32\u1B37r;\uC000\u{1D4B8}\u0100bp\u1B3C\u1B44\u0100;e\u1B41\u1B42\u6ACF;\u6AD1\u0100;e\u1B49\u1B4A\u6AD0;\u6AD2dot;\u62EF\u0380delprvw\u1B60\u1B6C\u1B77\u1B82\u1BAC\u1BD4\u1BF9arr\u0100lr\u1B68\u1B6A;\u6938;\u6935\u0270\u1B72\0\0\u1B75r;\u62DEc;\u62DFarr\u0100;p\u1B7F\u1B80\u61B6;\u693D\u0300;bcdos\u1B8F\u1B90\u1B96\u1BA1\u1BA5\u1BA8\u622Arcap;\u6A48\u0100au\u1B9B\u1B9Ep;\u6A46p;\u6A4Aot;\u628Dr;\u6A45;\uC000\u222A\uFE00\u0200alrv\u1BB5\u1BBF\u1BDE\u1BE3rr\u0100;m\u1BBC\u1BBD\u61B7;\u693Cy\u0180evw\u1BC7\u1BD4\u1BD8q\u0270\u1BCE\0\0\u1BD2re\xE3\u1B73u\xE3\u1B75ee;\u62CEedge;\u62CFen\u803B\xA4\u40A4earrow\u0100lr\u1BEE\u1BF3eft\xBB\u1B80ight\xBB\u1BBDe\xE4\u1BDD\u0100ci\u1C01\u1C07onin\xF4\u01F7nt;\u6231lcty;\u632D\u0980AHabcdefhijlorstuwz\u1C38\u1C3B\u1C3F\u1C5D\u1C69\u1C75\u1C8A\u1C9E\u1CAC\u1CB7\u1CFB\u1CFF\u1D0D\u1D7B\u1D91\u1DAB\u1DBB\u1DC6\u1DCDr\xF2\u0381ar;\u6965\u0200glrs\u1C48\u1C4D\u1C52\u1C54ger;\u6020eth;\u6138\xF2\u1133h\u0100;v\u1C5A\u1C5B\u6010\xBB\u090A\u016B\u1C61\u1C67arow;\u690Fa\xE3\u0315\u0100ay\u1C6E\u1C73ron;\u410F;\u4434\u0180;ao\u0332\u1C7C\u1C84\u0100gr\u02BF\u1C81r;\u61CAtseq;\u6A77\u0180glm\u1C91\u1C94\u1C98\u803B\xB0\u40B0ta;\u43B4ptyv;\u69B1\u0100ir\u1CA3\u1CA8sht;\u697F;\uC000\u{1D521}ar\u0100lr\u1CB3\u1CB5\xBB\u08DC\xBB\u101E\u0280aegsv\u1CC2\u0378\u1CD6\u1CDC\u1CE0m\u0180;os\u0326\u1CCA\u1CD4nd\u0100;s\u0326\u1CD1uit;\u6666amma;\u43DDin;\u62F2\u0180;io\u1CE7\u1CE8\u1CF8\u40F7de\u8100\xF7;o\u1CE7\u1CF0ntimes;\u62C7n\xF8\u1CF7cy;\u4452c\u026F\u1D06\0\0\u1D0Arn;\u631Eop;\u630D\u0280lptuw\u1D18\u1D1D\u1D22\u1D49\u1D55lar;\u4024f;\uC000\u{1D555}\u0280;emps\u030B\u1D2D\u1D37\u1D3D\u1D42q\u0100;d\u0352\u1D33ot;\u6251inus;\u6238lus;\u6214quare;\u62A1blebarwedg\xE5\xFAn\u0180adh\u112E\u1D5D\u1D67ownarrow\xF3\u1C83arpoon\u0100lr\u1D72\u1D76ef\xF4\u1CB4igh\xF4\u1CB6\u0162\u1D7F\u1D85karo\xF7\u0F42\u026F\u1D8A\0\0\u1D8Ern;\u631Fop;\u630C\u0180cot\u1D98\u1DA3\u1DA6\u0100ry\u1D9D\u1DA1;\uC000\u{1D4B9};\u4455l;\u69F6rok;\u4111\u0100dr\u1DB0\u1DB4ot;\u62F1i\u0100;f\u1DBA\u1816\u65BF\u0100ah\u1DC0\u1DC3r\xF2\u0429a\xF2\u0FA6angle;\u69A6\u0100ci\u1DD2\u1DD5y;\u445Fgrarr;\u67FF\u0900Dacdefglmnopqrstux\u1E01\u1E09\u1E19\u1E38\u0578\u1E3C\u1E49\u1E61\u1E7E\u1EA5\u1EAF\u1EBD\u1EE1\u1F2A\u1F37\u1F44\u1F4E\u1F5A\u0100Do\u1E06\u1D34o\xF4\u1C89\u0100cs\u1E0E\u1E14ute\u803B\xE9\u40E9ter;\u6A6E\u0200aioy\u1E22\u1E27\u1E31\u1E36ron;\u411Br\u0100;c\u1E2D\u1E2E\u6256\u803B\xEA\u40EAlon;\u6255;\u444Dot;\u4117\u0100Dr\u1E41\u1E45ot;\u6252;\uC000\u{1D522}\u0180;rs\u1E50\u1E51\u1E57\u6A9Aave\u803B\xE8\u40E8\u0100;d\u1E5C\u1E5D\u6A96ot;\u6A98\u0200;ils\u1E6A\u1E6B\u1E72\u1E74\u6A99nters;\u63E7;\u6113\u0100;d\u1E79\u1E7A\u6A95ot;\u6A97\u0180aps\u1E85\u1E89\u1E97cr;\u4113ty\u0180;sv\u1E92\u1E93\u1E95\u6205et\xBB\u1E93p\u01001;\u1E9D\u1EA4\u0133\u1EA1\u1EA3;\u6004;\u6005\u6003\u0100gs\u1EAA\u1EAC;\u414Bp;\u6002\u0100gp\u1EB4\u1EB8on;\u4119f;\uC000\u{1D556}\u0180als\u1EC4\u1ECE\u1ED2r\u0100;s\u1ECA\u1ECB\u62D5l;\u69E3us;\u6A71i\u0180;lv\u1EDA\u1EDB\u1EDF\u43B5on\xBB\u1EDB;\u43F5\u0200csuv\u1EEA\u1EF3\u1F0B\u1F23\u0100io\u1EEF\u1E31rc\xBB\u1E2E\u0269\u1EF9\0\0\u1EFB\xED\u0548ant\u0100gl\u1F02\u1F06tr\xBB\u1E5Dess\xBB\u1E7A\u0180aei\u1F12\u1F16\u1F1Als;\u403Dst;\u625Fv\u0100;D\u0235\u1F20D;\u6A78parsl;\u69E5\u0100Da\u1F2F\u1F33ot;\u6253rr;\u6971\u0180cdi\u1F3E\u1F41\u1EF8r;\u612Fo\xF4\u0352\u0100ah\u1F49\u1F4B;\u43B7\u803B\xF0\u40F0\u0100mr\u1F53\u1F57l\u803B\xEB\u40EBo;\u60AC\u0180cip\u1F61\u1F64\u1F67l;\u4021s\xF4\u056E\u0100eo\u1F6C\u1F74ctatio\xEE\u0559nential\xE5\u0579\u09E1\u1F92\0\u1F9E\0\u1FA1\u1FA7\0\0\u1FC6\u1FCC\0\u1FD3\0\u1FE6\u1FEA\u2000\0\u2008\u205Allingdotse\xF1\u1E44y;\u4444male;\u6640\u0180ilr\u1FAD\u1FB3\u1FC1lig;\u8000\uFB03\u0269\u1FB9\0\0\u1FBDg;\u8000\uFB00ig;\u8000\uFB04;\uC000\u{1D523}lig;\u8000\uFB01lig;\uC000fj\u0180alt\u1FD9\u1FDC\u1FE1t;\u666Dig;\u8000\uFB02ns;\u65B1of;\u4192\u01F0\u1FEE\0\u1FF3f;\uC000\u{1D557}\u0100ak\u05BF\u1FF7\u0100;v\u1FFC\u1FFD\u62D4;\u6AD9artint;\u6A0D\u0100ao\u200C\u2055\u0100cs\u2011\u2052\u03B1\u201A\u2030\u2038\u2045\u2048\0\u2050\u03B2\u2022\u2025\u2027\u202A\u202C\0\u202E\u803B\xBD\u40BD;\u6153\u803B\xBC\u40BC;\u6155;\u6159;\u615B\u01B3\u2034\0\u2036;\u6154;\u6156\u02B4\u203E\u2041\0\0\u2043\u803B\xBE\u40BE;\u6157;\u615C5;\u6158\u01B6\u204C\0\u204E;\u615A;\u615D8;\u615El;\u6044wn;\u6322cr;\uC000\u{1D4BB}\u0880Eabcdefgijlnorstv\u2082\u2089\u209F\u20A5\u20B0\u20B4\u20F0\u20F5\u20FA\u20FF\u2103\u2112\u2138\u0317\u213E\u2152\u219E\u0100;l\u064D\u2087;\u6A8C\u0180cmp\u2090\u2095\u209Dute;\u41F5ma\u0100;d\u209C\u1CDA\u43B3;\u6A86reve;\u411F\u0100iy\u20AA\u20AErc;\u411D;\u4433ot;\u4121\u0200;lqs\u063E\u0642\u20BD\u20C9\u0180;qs\u063E\u064C\u20C4lan\xF4\u0665\u0200;cdl\u0665\u20D2\u20D5\u20E5c;\u6AA9ot\u0100;o\u20DC\u20DD\u6A80\u0100;l\u20E2\u20E3\u6A82;\u6A84\u0100;e\u20EA\u20ED\uC000\u22DB\uFE00s;\u6A94r;\uC000\u{1D524}\u0100;g\u0673\u061Bmel;\u6137cy;\u4453\u0200;Eaj\u065A\u210C\u210E\u2110;\u6A92;\u6AA5;\u6AA4\u0200Eaes\u211B\u211D\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6A8Arox\xBB\u2124\u0100;q\u212E\u212F\u6A88\u0100;q\u212E\u211Bim;\u62E7pf;\uC000\u{1D558}\u0100ci\u2143\u2146r;\u610Am\u0180;el\u066B\u214E\u2150;\u6A8E;\u6A90\u8300>;cdlqr\u05EE\u2160\u216A\u216E\u2173\u2179\u0100ci\u2165\u2167;\u6AA7r;\u6A7Aot;\u62D7Par;\u6995uest;\u6A7C\u0280adels\u2184\u216A\u2190\u0656\u219B\u01F0\u2189\0\u218Epro\xF8\u209Er;\u6978q\u0100lq\u063F\u2196les\xF3\u2088i\xED\u066B\u0100en\u21A3\u21ADrtneqq;\uC000\u2269\uFE00\xC5\u21AA\u0500Aabcefkosy\u21C4\u21C7\u21F1\u21F5\u21FA\u2218\u221D\u222F\u2268\u227Dr\xF2\u03A0\u0200ilmr\u21D0\u21D4\u21D7\u21DBrs\xF0\u1484f\xBB\u2024il\xF4\u06A9\u0100dr\u21E0\u21E4cy;\u444A\u0180;cw\u08F4\u21EB\u21EFir;\u6948;\u61ADar;\u610Firc;\u4125\u0180alr\u2201\u220E\u2213rts\u0100;u\u2209\u220A\u6665it\xBB\u220Alip;\u6026con;\u62B9r;\uC000\u{1D525}s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223A\u223E\u2243\u225E\u2263rr;\u61FFtht;\u623Bk\u0100lr\u2249\u2253eftarrow;\u61A9ightarrow;\u61AAf;\uC000\u{1D559}bar;\u6015\u0180clt\u226F\u2274\u2278r;\uC000\u{1D4BD}as\xE8\u21F4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xBB\u1C5B\u0AE1\u22A3\0\u22AA\0\u22B8\u22C5\u22CE\0\u22D5\u22F3\0\0\u22F8\u2322\u2367\u2362\u237F\0\u2386\u23AA\u23B4cute\u803B\xED\u40ED\u0180;iy\u0771\u22B0\u22B5rc\u803B\xEE\u40EE;\u4438\u0100cx\u22BC\u22BFy;\u4435cl\u803B\xA1\u40A1\u0100fr\u039F\u22C9;\uC000\u{1D526}rave\u803B\xEC\u40EC\u0200;ino\u073E\u22DD\u22E9\u22EE\u0100in\u22E2\u22E6nt;\u6A0Ct;\u622Dfin;\u69DCta;\u6129lig;\u4133\u0180aop\u22FE\u231A\u231D\u0180cgt\u2305\u2308\u2317r;\u412B\u0180elp\u071F\u230F\u2313in\xE5\u078Ear\xF4\u0720h;\u4131f;\u62B7ed;\u41B5\u0280;cfot\u04F4\u232C\u2331\u233D\u2341are;\u6105in\u0100;t\u2338\u2339\u621Eie;\u69DDdo\xF4\u2319\u0280;celp\u0757\u234C\u2350\u235B\u2361al;\u62BA\u0100gr\u2355\u2359er\xF3\u1563\xE3\u234Darhk;\u6A17rod;\u6A3C\u0200cgpt\u236F\u2372\u2376\u237By;\u4451on;\u412Ff;\uC000\u{1D55A}a;\u43B9uest\u803B\xBF\u40BF\u0100ci\u238A\u238Fr;\uC000\u{1D4BE}n\u0280;Edsv\u04F4\u239B\u239D\u23A1\u04F3;\u62F9ot;\u62F5\u0100;v\u23A6\u23A7\u62F4;\u62F3\u0100;i\u0777\u23AElde;\u4129\u01EB\u23B8\0\u23BCcy;\u4456l\u803B\xEF\u40EF\u0300cfmosu\u23CC\u23D7\u23DC\u23E1\u23E7\u23F5\u0100iy\u23D1\u23D5rc;\u4135;\u4439r;\uC000\u{1D527}ath;\u4237pf;\uC000\u{1D55B}\u01E3\u23EC\0\u23F1r;\uC000\u{1D4BF}rcy;\u4458kcy;\u4454\u0400acfghjos\u240B\u2416\u2422\u2427\u242D\u2431\u2435\u243Bppa\u0100;v\u2413\u2414\u43BA;\u43F0\u0100ey\u241B\u2420dil;\u4137;\u443Ar;\uC000\u{1D528}reen;\u4138cy;\u4445cy;\u445Cpf;\uC000\u{1D55C}cr;\uC000\u{1D4C0}\u0B80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248D\u2491\u250E\u253D\u255A\u2580\u264E\u265E\u2665\u2679\u267D\u269A\u26B2\u26D8\u275D\u2768\u278B\u27C0\u2801\u2812\u0180art\u2477\u247A\u247Cr\xF2\u09C6\xF2\u0395ail;\u691Barr;\u690E\u0100;g\u0994\u248B;\u6A8Bar;\u6962\u0963\u24A5\0\u24AA\0\u24B1\0\0\0\0\0\u24B5\u24BA\0\u24C6\u24C8\u24CD\0\u24F9ute;\u413Amptyv;\u69B4ra\xEE\u084Cbda;\u43BBg\u0180;dl\u088E\u24C1\u24C3;\u6991\xE5\u088E;\u6A85uo\u803B\xAB\u40ABr\u0400;bfhlpst\u0899\u24DE\u24E6\u24E9\u24EB\u24EE\u24F1\u24F5\u0100;f\u089D\u24E3s;\u691Fs;\u691D\xEB\u2252p;\u61ABl;\u6939im;\u6973l;\u61A2\u0180;ae\u24FF\u2500\u2504\u6AABil;\u6919\u0100;s\u2509\u250A\u6AAD;\uC000\u2AAD\uFE00\u0180abr\u2515\u2519\u251Drr;\u690Crk;\u6772\u0100ak\u2522\u252Cc\u0100ek\u2528\u252A;\u407B;\u405B\u0100es\u2531\u2533;\u698Bl\u0100du\u2539\u253B;\u698F;\u698D\u0200aeuy\u2546\u254B\u2556\u2558ron;\u413E\u0100di\u2550\u2554il;\u413C\xEC\u08B0\xE2\u2529;\u443B\u0200cqrs\u2563\u2566\u256D\u257Da;\u6936uo\u0100;r\u0E19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694Bh;\u61B2\u0280;fgqs\u258B\u258C\u0989\u25F3\u25FF\u6264t\u0280ahlrt\u2598\u25A4\u25B7\u25C2\u25E8rrow\u0100;t\u0899\u25A1a\xE9\u24F6arpoon\u0100du\u25AF\u25B4own\xBB\u045Ap\xBB\u0966eftarrows;\u61C7ight\u0180ahs\u25CD\u25D6\u25DErrow\u0100;s\u08F4\u08A7arpoon\xF3\u0F98quigarro\xF7\u21F0hreetimes;\u62CB\u0180;qs\u258B\u0993\u25FAlan\xF4\u09AC\u0280;cdgs\u09AC\u260A\u260D\u261D\u2628c;\u6AA8ot\u0100;o\u2614\u2615\u6A7F\u0100;r\u261A\u261B\u6A81;\u6A83\u0100;e\u2622\u2625\uC000\u22DA\uFE00s;\u6A93\u0280adegs\u2633\u2639\u263D\u2649\u264Bppro\xF8\u24C6ot;\u62D6q\u0100gq\u2643\u2645\xF4\u0989gt\xF2\u248C\xF4\u099Bi\xED\u09B2\u0180ilr\u2655\u08E1\u265Asht;\u697C;\uC000\u{1D529}\u0100;E\u099C\u2663;\u6A91\u0161\u2669\u2676r\u0100du\u25B2\u266E\u0100;l\u0965\u2673;\u696Alk;\u6584cy;\u4459\u0280;acht\u0A48\u2688\u268B\u2691\u2696r\xF2\u25C1orne\xF2\u1D08ard;\u696Bri;\u65FA\u0100io\u269F\u26A4dot;\u4140ust\u0100;a\u26AC\u26AD\u63B0che\xBB\u26AD\u0200Eaes\u26BB\u26BD\u26C9\u26D4;\u6268p\u0100;p\u26C3\u26C4\u6A89rox\xBB\u26C4\u0100;q\u26CE\u26CF\u6A87\u0100;q\u26CE\u26BBim;\u62E6\u0400abnoptwz\u26E9\u26F4\u26F7\u271A\u272F\u2741\u2747\u2750\u0100nr\u26EE\u26F1g;\u67ECr;\u61FDr\xEB\u08C1g\u0180lmr\u26FF\u270D\u2714eft\u0100ar\u09E6\u2707ight\xE1\u09F2apsto;\u67FCight\xE1\u09FDparrow\u0100lr\u2725\u2729ef\xF4\u24EDight;\u61AC\u0180afl\u2736\u2739\u273Dr;\u6985;\uC000\u{1D55D}us;\u6A2Dimes;\u6A34\u0161\u274B\u274Fst;\u6217\xE1\u134E\u0180;ef\u2757\u2758\u1800\u65CAnge\xBB\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277C\u2785\u2787r\xF2\u08A8orne\xF2\u1D8Car\u0100;d\u0F98\u2783;\u696D;\u600Eri;\u62BF\u0300achiqt\u2798\u279D\u0A40\u27A2\u27AE\u27BBquo;\u6039r;\uC000\u{1D4C1}m\u0180;eg\u09B2\u27AA\u27AC;\u6A8D;\u6A8F\u0100bu\u252A\u27B3o\u0100;r\u0E1F\u27B9;\u601Arok;\u4142\u8400<;cdhilqr\u082B\u27D2\u2639\u27DC\u27E0\u27E5\u27EA\u27F0\u0100ci\u27D7\u27D9;\u6AA6r;\u6A79re\xE5\u25F2mes;\u62C9arr;\u6976uest;\u6A7B\u0100Pi\u27F5\u27F9ar;\u6996\u0180;ef\u2800\u092D\u181B\u65C3r\u0100du\u2807\u280Dshar;\u694Ahar;\u6966\u0100en\u2817\u2821rtneqq;\uC000\u2268\uFE00\xC5\u281E\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288E\u2893\u28A0\u28A5\u28A8\u28DA\u28E2\u28E4\u0A83\u28F3\u2902Dot;\u623A\u0200clpr\u284E\u2852\u2863\u287Dr\u803B\xAF\u40AF\u0100et\u2857\u2859;\u6642\u0100;e\u285E\u285F\u6720se\xBB\u285F\u0100;s\u103B\u2868to\u0200;dlu\u103B\u2873\u2877\u287Bow\xEE\u048Cef\xF4\u090F\xF0\u13D1ker;\u65AE\u0100oy\u2887\u288Cmma;\u6A29;\u443Cash;\u6014asuredangle\xBB\u1626r;\uC000\u{1D52A}o;\u6127\u0180cdn\u28AF\u28B4\u28C9ro\u803B\xB5\u40B5\u0200;acd\u1464\u28BD\u28C0\u28C4s\xF4\u16A7ir;\u6AF0ot\u80BB\xB7\u01B5us\u0180;bd\u28D2\u1903\u28D3\u6212\u0100;u\u1D3C\u28D8;\u6A2A\u0163\u28DE\u28E1p;\u6ADB\xF2\u2212\xF0\u0A81\u0100dp\u28E9\u28EEels;\u62A7f;\uC000\u{1D55E}\u0100ct\u28F8\u28FDr;\uC000\u{1D4C2}pos\xBB\u159D\u0180;lm\u2909\u290A\u290D\u43BCtimap;\u62B8\u0C00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297E\u2989\u2998\u29DA\u29E9\u2A15\u2A1A\u2A58\u2A5D\u2A83\u2A95\u2AA4\u2AA8\u2B04\u2B07\u2B44\u2B7F\u2BAE\u2C34\u2C67\u2C7C\u2CE9\u0100gt\u2947\u294B;\uC000\u22D9\u0338\u0100;v\u2950\u0BCF\uC000\u226B\u20D2\u0180elt\u295A\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61CDightarrow;\u61CE;\uC000\u22D8\u0338\u0100;v\u297B\u0C47\uC000\u226A\u20D2ightarrow;\u61CF\u0100Dd\u298E\u2993ash;\u62AFash;\u62AE\u0280bcnpt\u29A3\u29A7\u29AC\u29B1\u29CCla\xBB\u02DEute;\u4144g;\uC000\u2220\u20D2\u0280;Eiop\u0D84\u29BC\u29C0\u29C5\u29C8;\uC000\u2A70\u0338d;\uC000\u224B\u0338s;\u4149ro\xF8\u0D84ur\u0100;a\u29D3\u29D4\u666El\u0100;s\u29D3\u0B38\u01F3\u29DF\0\u29E3p\u80BB\xA0\u0B37mp\u0100;e\u0BF9\u0C00\u0280aeouy\u29F4\u29FE\u2A03\u2A10\u2A13\u01F0\u29F9\0\u29FB;\u6A43on;\u4148dil;\u4146ng\u0100;d\u0D7E\u2A0Aot;\uC000\u2A6D\u0338p;\u6A42;\u443Dash;\u6013\u0380;Aadqsx\u0B92\u2A29\u2A2D\u2A3B\u2A41\u2A45\u2A50rr;\u61D7r\u0100hr\u2A33\u2A36k;\u6924\u0100;o\u13F2\u13F0ot;\uC000\u2250\u0338ui\xF6\u0B63\u0100ei\u2A4A\u2A4Ear;\u6928\xED\u0B98ist\u0100;s\u0BA0\u0B9Fr;\uC000\u{1D52B}\u0200Eest\u0BC5\u2A66\u2A79\u2A7C\u0180;qs\u0BBC\u2A6D\u0BE1\u0180;qs\u0BBC\u0BC5\u2A74lan\xF4\u0BE2i\xED\u0BEA\u0100;r\u0BB6\u2A81\xBB\u0BB7\u0180Aap\u2A8A\u2A8D\u2A91r\xF2\u2971rr;\u61AEar;\u6AF2\u0180;sv\u0F8D\u2A9C\u0F8C\u0100;d\u2AA1\u2AA2\u62FC;\u62FAcy;\u445A\u0380AEadest\u2AB7\u2ABA\u2ABE\u2AC2\u2AC5\u2AF6\u2AF9r\xF2\u2966;\uC000\u2266\u0338rr;\u619Ar;\u6025\u0200;fqs\u0C3B\u2ACE\u2AE3\u2AEFt\u0100ar\u2AD4\u2AD9rro\xF7\u2AC1ightarro\xF7\u2A90\u0180;qs\u0C3B\u2ABA\u2AEAlan\xF4\u0C55\u0100;s\u0C55\u2AF4\xBB\u0C36i\xED\u0C5D\u0100;r\u0C35\u2AFEi\u0100;e\u0C1A\u0C25i\xE4\u0D90\u0100pt\u2B0C\u2B11f;\uC000\u{1D55F}\u8180\xAC;in\u2B19\u2B1A\u2B36\u40ACn\u0200;Edv\u0B89\u2B24\u2B28\u2B2E;\uC000\u22F9\u0338ot;\uC000\u22F5\u0338\u01E1\u0B89\u2B33\u2B35;\u62F7;\u62F6i\u0100;v\u0CB8\u2B3C\u01E1\u0CB8\u2B41\u2B43;\u62FE;\u62FD\u0180aor\u2B4B\u2B63\u2B69r\u0200;ast\u0B7B\u2B55\u2B5A\u2B5Flle\xEC\u0B7Bl;\uC000\u2AFD\u20E5;\uC000\u2202\u0338lint;\u6A14\u0180;ce\u0C92\u2B70\u2B73u\xE5\u0CA5\u0100;c\u0C98\u2B78\u0100;e\u0C92\u2B7D\xF1\u0C98\u0200Aait\u2B88\u2B8B\u2B9D\u2BA7r\xF2\u2988rr\u0180;cw\u2B94\u2B95\u2B99\u619B;\uC000\u2933\u0338;\uC000\u219D\u0338ghtarrow\xBB\u2B95ri\u0100;e\u0CCB\u0CD6\u0380chimpqu\u2BBD\u2BCD\u2BD9\u2B04\u0B78\u2BE4\u2BEF\u0200;cer\u0D32\u2BC6\u0D37\u2BC9u\xE5\u0D45;\uC000\u{1D4C3}ort\u026D\u2B05\0\0\u2BD6ar\xE1\u2B56m\u0100;e\u0D6E\u2BDF\u0100;q\u0D74\u0D73su\u0100bp\u2BEB\u2BED\xE5\u0CF8\xE5\u0D0B\u0180bcp\u2BF6\u2C11\u2C19\u0200;Ees\u2BFF\u2C00\u0D22\u2C04\u6284;\uC000\u2AC5\u0338et\u0100;e\u0D1B\u2C0Bq\u0100;q\u0D23\u2C00c\u0100;e\u0D32\u2C17\xF1\u0D38\u0200;Ees\u2C22\u2C23\u0D5F\u2C27\u6285;\uC000\u2AC6\u0338et\u0100;e\u0D58\u2C2Eq\u0100;q\u0D60\u2C23\u0200gilr\u2C3D\u2C3F\u2C45\u2C47\xEC\u0BD7lde\u803B\xF1\u40F1\xE7\u0C43iangle\u0100lr\u2C52\u2C5Ceft\u0100;e\u0C1A\u2C5A\xF1\u0C26ight\u0100;e\u0CCB\u2C65\xF1\u0CD7\u0100;m\u2C6C\u2C6D\u43BD\u0180;es\u2C74\u2C75\u2C79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2C8F\u2C94\u2C99\u2C9E\u2CA3\u2CB0\u2CB6\u2CD3\u2CE3ash;\u62ADarr;\u6904p;\uC000\u224D\u20D2ash;\u62AC\u0100et\u2CA8\u2CAC;\uC000\u2265\u20D2;\uC000>\u20D2nfin;\u69DE\u0180Aet\u2CBD\u2CC1\u2CC5rr;\u6902;\uC000\u2264\u20D2\u0100;r\u2CCA\u2CCD\uC000<\u20D2ie;\uC000\u22B4\u20D2\u0100At\u2CD8\u2CDCrr;\u6903rie;\uC000\u22B5\u20D2im;\uC000\u223C\u20D2\u0180Aan\u2CF0\u2CF4\u2D02rr;\u61D6r\u0100hr\u2CFA\u2CFDk;\u6923\u0100;o\u13E7\u13E5ear;\u6927\u1253\u1A95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2D2D\0\u2D38\u2D48\u2D60\u2D65\u2D72\u2D84\u1B07\0\0\u2D8D\u2DAB\0\u2DC8\u2DCE\0\u2DDC\u2E19\u2E2B\u2E3E\u2E43\u0100cs\u2D31\u1A97ute\u803B\xF3\u40F3\u0100iy\u2D3C\u2D45r\u0100;c\u1A9E\u2D42\u803B\xF4\u40F4;\u443E\u0280abios\u1AA0\u2D52\u2D57\u01C8\u2D5Alac;\u4151v;\u6A38old;\u69BClig;\u4153\u0100cr\u2D69\u2D6Dir;\u69BF;\uC000\u{1D52C}\u036F\u2D79\0\0\u2D7C\0\u2D82n;\u42DBave\u803B\xF2\u40F2;\u69C1\u0100bm\u2D88\u0DF4ar;\u69B5\u0200acit\u2D95\u2D98\u2DA5\u2DA8r\xF2\u1A80\u0100ir\u2D9D\u2DA0r;\u69BEoss;\u69BBn\xE5\u0E52;\u69C0\u0180aei\u2DB1\u2DB5\u2DB9cr;\u414Dga;\u43C9\u0180cdn\u2DC0\u2DC5\u01CDron;\u43BF;\u69B6pf;\uC000\u{1D560}\u0180ael\u2DD4\u2DD7\u01D2r;\u69B7rp;\u69B9\u0380;adiosv\u2DEA\u2DEB\u2DEE\u2E08\u2E0D\u2E10\u2E16\u6228r\xF2\u1A86\u0200;efm\u2DF7\u2DF8\u2E02\u2E05\u6A5Dr\u0100;o\u2DFE\u2DFF\u6134f\xBB\u2DFF\u803B\xAA\u40AA\u803B\xBA\u40BAgof;\u62B6r;\u6A56lope;\u6A57;\u6A5B\u0180clo\u2E1F\u2E21\u2E27\xF2\u2E01ash\u803B\xF8\u40F8l;\u6298i\u016C\u2E2F\u2E34de\u803B\xF5\u40F5es\u0100;a\u01DB\u2E3As;\u6A36ml\u803B\xF6\u40F6bar;\u633D\u0AE1\u2E5E\0\u2E7D\0\u2E80\u2E9D\0\u2EA2\u2EB9\0\0\u2ECB\u0E9C\0\u2F13\0\0\u2F2B\u2FBC\0\u2FC8r\u0200;ast\u0403\u2E67\u2E72\u0E85\u8100\xB6;l\u2E6D\u2E6E\u40B6le\xEC\u0403\u0269\u2E78\0\0\u2E7Bm;\u6AF3;\u6AFDy;\u443Fr\u0280cimpt\u2E8B\u2E8F\u2E93\u1865\u2E97nt;\u4025od;\u402Eil;\u6030enk;\u6031r;\uC000\u{1D52D}\u0180imo\u2EA8\u2EB0\u2EB4\u0100;v\u2EAD\u2EAE\u43C6;\u43D5ma\xF4\u0A76ne;\u660E\u0180;tv\u2EBF\u2EC0\u2EC8\u43C0chfork\xBB\u1FFD;\u43D6\u0100au\u2ECF\u2EDFn\u0100ck\u2ED5\u2EDDk\u0100;h\u21F4\u2EDB;\u610E\xF6\u21F4s\u0480;abcdemst\u2EF3\u2EF4\u1908\u2EF9\u2EFD\u2F04\u2F06\u2F0A\u2F0E\u402Bcir;\u6A23ir;\u6A22\u0100ou\u1D40\u2F02;\u6A25;\u6A72n\u80BB\xB1\u0E9Dim;\u6A26wo;\u6A27\u0180ipu\u2F19\u2F20\u2F25ntint;\u6A15f;\uC000\u{1D561}nd\u803B\xA3\u40A3\u0500;Eaceinosu\u0EC8\u2F3F\u2F41\u2F44\u2F47\u2F81\u2F89\u2F92\u2F7E\u2FB6;\u6AB3p;\u6AB7u\xE5\u0ED9\u0100;c\u0ECE\u2F4C\u0300;acens\u0EC8\u2F59\u2F5F\u2F66\u2F68\u2F7Eppro\xF8\u2F43urlye\xF1\u0ED9\xF1\u0ECE\u0180aes\u2F6F\u2F76\u2F7Approx;\u6AB9qq;\u6AB5im;\u62E8i\xED\u0EDFme\u0100;s\u2F88\u0EAE\u6032\u0180Eas\u2F78\u2F90\u2F7A\xF0\u2F75\u0180dfp\u0EEC\u2F99\u2FAF\u0180als\u2FA0\u2FA5\u2FAAlar;\u632Eine;\u6312urf;\u6313\u0100;t\u0EFB\u2FB4\xEF\u0EFBrel;\u62B0\u0100ci\u2FC0\u2FC5r;\uC000\u{1D4C5};\u43C8ncsp;\u6008\u0300fiopsu\u2FDA\u22E2\u2FDF\u2FE5\u2FEB\u2FF1r;\uC000\u{1D52E}pf;\uC000\u{1D562}rime;\u6057cr;\uC000\u{1D4C6}\u0180aeo\u2FF8\u3009\u3013t\u0100ei\u2FFE\u3005rnion\xF3\u06B0nt;\u6A16st\u0100;e\u3010\u3011\u403F\xF1\u1F19\xF4\u0F14\u0A80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30E0\u310E\u312B\u3147\u3162\u3172\u318E\u3206\u3215\u3224\u3229\u3258\u326E\u3272\u3290\u32B0\u32B7\u0180art\u3047\u304A\u304Cr\xF2\u10B3\xF2\u03DDail;\u691Car\xF2\u1C65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307F\u308F\u3094\u30CC\u0100eu\u306D\u3071;\uC000\u223D\u0331te;\u4155i\xE3\u116Emptyv;\u69B3g\u0200;del\u0FD1\u3089\u308B\u308D;\u6992;\u69A5\xE5\u0FD1uo\u803B\xBB\u40BBr\u0580;abcfhlpstw\u0FDC\u30AC\u30AF\u30B7\u30B9\u30BC\u30BE\u30C0\u30C3\u30C7\u30CAp;\u6975\u0100;f\u0FE0\u30B4s;\u6920;\u6933s;\u691E\xEB\u225D\xF0\u272El;\u6945im;\u6974l;\u61A3;\u619D\u0100ai\u30D1\u30D5il;\u691Ao\u0100;n\u30DB\u30DC\u6236al\xF3\u0F1E\u0180abr\u30E7\u30EA\u30EEr\xF2\u17E5rk;\u6773\u0100ak\u30F3\u30FDc\u0100ek\u30F9\u30FB;\u407D;\u405D\u0100es\u3102\u3104;\u698Cl\u0100du\u310A\u310C;\u698E;\u6990\u0200aeuy\u3117\u311C\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xEC\u0FF2\xE2\u30FA;\u4440\u0200clqs\u3134\u3137\u313D\u3144a;\u6937dhar;\u6969uo\u0100;r\u020E\u020Dh;\u61B3\u0180acg\u314E\u315F\u0F44l\u0200;ips\u0F78\u3158\u315B\u109Cn\xE5\u10BBar\xF4\u0FA9t;\u65AD\u0180ilr\u3169\u1023\u316Esht;\u697D;\uC000\u{1D52F}\u0100ao\u3177\u3186r\u0100du\u317D\u317F\xBB\u047B\u0100;l\u1091\u3184;\u696C\u0100;v\u318B\u318C\u43C1;\u43F1\u0180gns\u3195\u31F9\u31FCht\u0300ahlrst\u31A4\u31B0\u31C2\u31D8\u31E4\u31EErrow\u0100;t\u0FDC\u31ADa\xE9\u30C8arpoon\u0100du\u31BB\u31BFow\xEE\u317Ep\xBB\u1092eft\u0100ah\u31CA\u31D0rrow\xF3\u0FEAarpoon\xF3\u0551ightarrows;\u61C9quigarro\xF7\u30CBhreetimes;\u62CCg;\u42DAingdotse\xF1\u1F32\u0180ahm\u320D\u3210\u3213r\xF2\u0FEAa\xF2\u0551;\u600Foust\u0100;a\u321E\u321F\u63B1che\xBB\u321Fmid;\u6AEE\u0200abpt\u3232\u323D\u3240\u3252\u0100nr\u3237\u323Ag;\u67EDr;\u61FEr\xEB\u1003\u0180afl\u3247\u324A\u324Er;\u6986;\uC000\u{1D563}us;\u6A2Eimes;\u6A35\u0100ap\u325D\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6A12ar\xF2\u31E3\u0200achq\u327B\u3280\u10BC\u3285quo;\u603Ar;\uC000\u{1D4C7}\u0100bu\u30FB\u328Ao\u0100;r\u0214\u0213\u0180hir\u3297\u329B\u32A0re\xE5\u31F8mes;\u62CAi\u0200;efl\u32AA\u1059\u1821\u32AB\u65B9tri;\u69CEluhar;\u6968;\u611E\u0D61\u32D5\u32DB\u32DF\u332C\u3338\u3371\0\u337A\u33A4\0\0\u33EC\u33F0\0\u3428\u3448\u345A\u34AD\u34B1\u34CA\u34F1\0\u3616\0\0\u3633cute;\u415Bqu\xEF\u27BA\u0500;Eaceinpsy\u11ED\u32F3\u32F5\u32FF\u3302\u330B\u330F\u331F\u3326\u3329;\u6AB4\u01F0\u32FA\0\u32FC;\u6AB8on;\u4161u\xE5\u11FE\u0100;d\u11F3\u3307il;\u415Frc;\u415D\u0180Eas\u3316\u3318\u331B;\u6AB6p;\u6ABAim;\u62E9olint;\u6A13i\xED\u1204;\u4441ot\u0180;be\u3334\u1D47\u3335\u62C5;\u6A66\u0380Aacmstx\u3346\u334A\u3357\u335B\u335E\u3363\u336Drr;\u61D8r\u0100hr\u3350\u3352\xEB\u2228\u0100;o\u0A36\u0A34t\u803B\xA7\u40A7i;\u403Bwar;\u6929m\u0100in\u3369\xF0nu\xF3\xF1t;\u6736r\u0100;o\u3376\u2055\uC000\u{1D530}\u0200acoy\u3382\u3386\u3391\u33A0rp;\u666F\u0100hy\u338B\u338Fcy;\u4449;\u4448rt\u026D\u3399\0\0\u339Ci\xE4\u1464ara\xEC\u2E6F\u803B\xAD\u40AD\u0100gm\u33A8\u33B4ma\u0180;fv\u33B1\u33B2\u33B2\u43C3;\u43C2\u0400;deglnpr\u12AB\u33C5\u33C9\u33CE\u33D6\u33DE\u33E1\u33E6ot;\u6A6A\u0100;q\u12B1\u12B0\u0100;E\u33D3\u33D4\u6A9E;\u6AA0\u0100;E\u33DB\u33DC\u6A9D;\u6A9Fe;\u6246lus;\u6A24arr;\u6972ar\xF2\u113D\u0200aeit\u33F8\u3408\u340F\u3417\u0100ls\u33FD\u3404lsetm\xE9\u336Ahp;\u6A33parsl;\u69E4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341C\u341D\u6AAA\u0100;s\u3422\u3423\u6AAC;\uC000\u2AAC\uFE00\u0180flp\u342E\u3433\u3442tcy;\u444C\u0100;b\u3438\u3439\u402F\u0100;a\u343E\u343F\u69C4r;\u633Ff;\uC000\u{1D564}a\u0100dr\u344D\u0402es\u0100;u\u3454\u3455\u6660it\xBB\u3455\u0180csu\u3460\u3479\u349F\u0100au\u3465\u346Fp\u0100;s\u1188\u346B;\uC000\u2293\uFE00p\u0100;s\u11B4\u3475;\uC000\u2294\uFE00u\u0100bp\u347F\u348F\u0180;es\u1197\u119C\u3486et\u0100;e\u1197\u348D\xF1\u119D\u0180;es\u11A8\u11AD\u3496et\u0100;e\u11A8\u349D\xF1\u11AE\u0180;af\u117B\u34A6\u05B0r\u0165\u34AB\u05B1\xBB\u117Car\xF2\u1148\u0200cemt\u34B9\u34BE\u34C2\u34C5r;\uC000\u{1D4C8}tm\xEE\xF1i\xEC\u3415ar\xE6\u11BE\u0100ar\u34CE\u34D5r\u0100;f\u34D4\u17BF\u6606\u0100an\u34DA\u34EDight\u0100ep\u34E3\u34EApsilo\xEE\u1EE0h\xE9\u2EAFs\xBB\u2852\u0280bcmnp\u34FB\u355E\u1209\u358B\u358E\u0480;Edemnprs\u350E\u350F\u3511\u3515\u351E\u3523\u352C\u3531\u3536\u6282;\u6AC5ot;\u6ABD\u0100;d\u11DA\u351Aot;\u6AC3ult;\u6AC1\u0100Ee\u3528\u352A;\u6ACB;\u628Alus;\u6ABFarr;\u6979\u0180eiu\u353D\u3552\u3555t\u0180;en\u350E\u3545\u354Bq\u0100;q\u11DA\u350Feq\u0100;q\u352B\u3528m;\u6AC7\u0100bp\u355A\u355C;\u6AD5;\u6AD3c\u0300;acens\u11ED\u356C\u3572\u3579\u357B\u3326ppro\xF8\u32FAurlye\xF1\u11FE\xF1\u11F3\u0180aes\u3582\u3588\u331Bppro\xF8\u331Aq\xF1\u3317g;\u666A\u0680123;Edehlmnps\u35A9\u35AC\u35AF\u121C\u35B2\u35B4\u35C0\u35C9\u35D5\u35DA\u35DF\u35E8\u35ED\u803B\xB9\u40B9\u803B\xB2\u40B2\u803B\xB3\u40B3;\u6AC6\u0100os\u35B9\u35BCt;\u6ABEub;\u6AD8\u0100;d\u1222\u35C5ot;\u6AC4s\u0100ou\u35CF\u35D2l;\u67C9b;\u6AD7arr;\u697Bult;\u6AC2\u0100Ee\u35E4\u35E6;\u6ACC;\u628Blus;\u6AC0\u0180eiu\u35F4\u3609\u360Ct\u0180;en\u121C\u35FC\u3602q\u0100;q\u1222\u35B2eq\u0100;q\u35E7\u35E4m;\u6AC8\u0100bp\u3611\u3613;\u6AD4;\u6AD6\u0180Aan\u361C\u3620\u362Drr;\u61D9r\u0100hr\u3626\u3628\xEB\u222E\u0100;o\u0A2B\u0A29war;\u692Alig\u803B\xDF\u40DF\u0BE1\u3651\u365D\u3660\u12CE\u3673\u3679\0\u367E\u36C2\0\0\0\0\0\u36DB\u3703\0\u3709\u376C\0\0\0\u3787\u0272\u3656\0\0\u365Bget;\u6316;\u43C4r\xEB\u0E5F\u0180aey\u3666\u366B\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uC000\u{1D531}\u0200eiko\u3686\u369D\u36B5\u36BC\u01F2\u368B\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369B\u43B8ym;\u43D1\u0100cn\u36A2\u36B2k\u0100as\u36A8\u36AEppro\xF8\u12C1im\xBB\u12ACs\xF0\u129E\u0100as\u36BA\u36AE\xF0\u12C1rn\u803B\xFE\u40FE\u01EC\u031F\u36C6\u22E7es\u8180\xD7;bd\u36CF\u36D0\u36D8\u40D7\u0100;a\u190F\u36D5r;\u6A31;\u6A30\u0180eps\u36E1\u36E3\u3700\xE1\u2A4D\u0200;bcf\u0486\u36EC\u36F0\u36F4ot;\u6336ir;\u6AF1\u0100;o\u36F9\u36FC\uC000\u{1D565}rk;\u6ADA\xE1\u3362rime;\u6034\u0180aip\u370F\u3712\u3764d\xE5\u1248\u0380adempst\u3721\u374D\u3740\u3751\u3757\u375C\u375Fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65B5own\xBB\u1DBBeft\u0100;e\u2800\u373E\xF1\u092E;\u625Cight\u0100;e\u32AA\u374B\xF1\u105Aot;\u65ECinus;\u6A3Alus;\u6A39b;\u69CDime;\u6A3Bezium;\u63E2\u0180cht\u3772\u377D\u3781\u0100ry\u3777\u377B;\uC000\u{1D4C9};\u4446cy;\u445Brok;\u4167\u0100io\u378B\u378Ex\xF4\u1777head\u0100lr\u3797\u37A0eftarro\xF7\u084Fightarrow\xBB\u0F5D\u0900AHabcdfghlmoprstuw\u37D0\u37D3\u37D7\u37E4\u37F0\u37FC\u380E\u381C\u3823\u3834\u3851\u385D\u386B\u38A9\u38CC\u38D2\u38EA\u38F6r\xF2\u03EDar;\u6963\u0100cr\u37DC\u37E2ute\u803B\xFA\u40FA\xF2\u1150r\u01E3\u37EA\0\u37EDy;\u445Eve;\u416D\u0100iy\u37F5\u37FArc\u803B\xFB\u40FB;\u4443\u0180abh\u3803\u3806\u380Br\xF2\u13ADlac;\u4171a\xF2\u13C3\u0100ir\u3813\u3818sht;\u697E;\uC000\u{1D532}rave\u803B\xF9\u40F9\u0161\u3827\u3831r\u0100lr\u382C\u382E\xBB\u0957\xBB\u1083lk;\u6580\u0100ct\u3839\u384D\u026F\u383F\0\0\u384Arn\u0100;e\u3845\u3846\u631Cr\xBB\u3846op;\u630Fri;\u65F8\u0100al\u3856\u385Acr;\u416B\u80BB\xA8\u0349\u0100gp\u3862\u3866on;\u4173f;\uC000\u{1D566}\u0300adhlsu\u114B\u3878\u387D\u1372\u3891\u38A0own\xE1\u13B3arpoon\u0100lr\u3888\u388Cef\xF4\u382Digh\xF4\u382Fi\u0180;hl\u3899\u389A\u389C\u43C5\xBB\u13FAon\xBB\u389Aparrows;\u61C8\u0180cit\u38B0\u38C4\u38C8\u026F\u38B6\0\0\u38C1rn\u0100;e\u38BC\u38BD\u631Dr\xBB\u38BDop;\u630Eng;\u416Fri;\u65F9cr;\uC000\u{1D4CA}\u0180dir\u38D9\u38DD\u38E2ot;\u62F0lde;\u4169i\u0100;f\u3730\u38E8\xBB\u1813\u0100am\u38EF\u38F2r\xF2\u38A8l\u803B\xFC\u40FCangle;\u69A7\u0780ABDacdeflnoprsz\u391C\u391F\u3929\u392D\u39B5\u39B8\u39BD\u39DF\u39E4\u39E8\u39F3\u39F9\u39FD\u3A01\u3A20r\xF2\u03F7ar\u0100;v\u3926\u3927\u6AE8;\u6AE9as\xE8\u03E1\u0100nr\u3932\u3937grt;\u699C\u0380eknprst\u34E3\u3946\u394B\u3952\u395D\u3964\u3996app\xE1\u2415othin\xE7\u1E96\u0180hir\u34EB\u2EC8\u3959op\xF4\u2FB5\u0100;h\u13B7\u3962\xEF\u318D\u0100iu\u3969\u396Dgm\xE1\u33B3\u0100bp\u3972\u3984setneq\u0100;q\u397D\u3980\uC000\u228A\uFE00;\uC000\u2ACB\uFE00setneq\u0100;q\u398F\u3992\uC000\u228B\uFE00;\uC000\u2ACC\uFE00\u0100hr\u399B\u399Fet\xE1\u369Ciangle\u0100lr\u39AA\u39AFeft\xBB\u0925ight\xBB\u1051y;\u4432ash\xBB\u1036\u0180elr\u39C4\u39D2\u39D7\u0180;be\u2DEA\u39CB\u39CFar;\u62BBq;\u625Alip;\u62EE\u0100bt\u39DC\u1468a\xF2\u1469r;\uC000\u{1D533}tr\xE9\u39AEsu\u0100bp\u39EF\u39F1\xBB\u0D1C\xBB\u0D59pf;\uC000\u{1D567}ro\xF0\u0EFBtr\xE9\u39B4\u0100cu\u3A06\u3A0Br;\uC000\u{1D4CB}\u0100bp\u3A10\u3A18n\u0100Ee\u3980\u3A16\xBB\u397En\u0100Ee\u3992\u3A1E\xBB\u3990igzag;\u699A\u0380cefoprs\u3A36\u3A3B\u3A56\u3A5B\u3A54\u3A61\u3A6Airc;\u4175\u0100di\u3A40\u3A51\u0100bg\u3A45\u3A49ar;\u6A5Fe\u0100;q\u15FA\u3A4F;\u6259erp;\u6118r;\uC000\u{1D534}pf;\uC000\u{1D568}\u0100;e\u1479\u3A66at\xE8\u1479cr;\uC000\u{1D4CC}\u0AE3\u178E\u3A87\0\u3A8B\0\u3A90\u3A9B\0\0\u3A9D\u3AA8\u3AAB\u3AAF\0\0\u3AC3\u3ACE\0\u3AD8\u17DC\u17DFtr\xE9\u17D1r;\uC000\u{1D535}\u0100Aa\u3A94\u3A97r\xF2\u03C3r\xF2\u09F6;\u43BE\u0100Aa\u3AA1\u3AA4r\xF2\u03B8r\xF2\u09EBa\xF0\u2713is;\u62FB\u0180dpt\u17A4\u3AB5\u3ABE\u0100fl\u3ABA\u17A9;\uC000\u{1D569}im\xE5\u17B2\u0100Aa\u3AC7\u3ACAr\xF2\u03CEr\xF2\u0A01\u0100cq\u3AD2\u17B8r;\uC000\u{1D4CD}\u0100pt\u17D6\u3ADCr\xE9\u17D4\u0400acefiosu\u3AF0\u3AFD\u3B08\u3B0C\u3B11\u3B15\u3B1B\u3B21c\u0100uy\u3AF6\u3AFBte\u803B\xFD\u40FD;\u444F\u0100iy\u3B02\u3B06rc;\u4177;\u444Bn\u803B\xA5\u40A5r;\uC000\u{1D536}cy;\u4457pf;\uC000\u{1D56A}cr;\uC000\u{1D4CE}\u0100cm\u3B26\u3B29y;\u444El\u803B\xFF\u40FF\u0500acdefhiosw\u3B42\u3B48\u3B54\u3B58\u3B64\u3B69\u3B6D\u3B74\u3B7A\u3B80cute;\u417A\u0100ay\u3B4D\u3B52ron;\u417E;\u4437ot;\u417C\u0100et\u3B5D\u3B61tr\xE6\u155Fa;\u43B6r;\uC000\u{1D537}cy;\u4436grarr;\u61DDpf;\uC000\u{1D56B}cr;\uC000\u{1D4CF}\u0100jn\u3B85\u3B87;\u600Dj;\u600C'.split("").map(c3=>c3.charCodeAt(0)));var decode_data_xml_default=new Uint16Array("\u0200aglq \x1B\u026D\0\0p;\u4026os;\u4027t;\u403Et;\u403Cuot;\u4022".split("").map(c3=>c3.charCodeAt(0)));var _a,decodeMap=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),fromCodePoint=(_a=String.fromCodePoint)!==null&&_a!==void 0?_a:function(codePoint){let output="";return codePoint>65535&&(codePoint-=65536,output+=String.fromCharCode(codePoint>>>10&1023|55296),codePoint=56320|codePoint&1023),output+=String.fromCharCode(codePoint),output};function replaceCodePoint(codePoint){var _a360;return codePoint>=55296&&codePoint<=57343||codePoint>1114111?65533:(_a360=decodeMap.get(codePoint))!==null&&_a360!==void 0?_a360:codePoint}var CharCodes;(function(CharCodes2){CharCodes2[CharCodes2.NUM=35]="NUM",CharCodes2[CharCodes2.SEMI=59]="SEMI",CharCodes2[CharCodes2.EQUALS=61]="EQUALS",CharCodes2[CharCodes2.ZERO=48]="ZERO",CharCodes2[CharCodes2.NINE=57]="NINE",CharCodes2[CharCodes2.LOWER_A=97]="LOWER_A",CharCodes2[CharCodes2.LOWER_F=102]="LOWER_F",CharCodes2[CharCodes2.LOWER_X=120]="LOWER_X",CharCodes2[CharCodes2.LOWER_Z=122]="LOWER_Z",CharCodes2[CharCodes2.UPPER_A=65]="UPPER_A",CharCodes2[CharCodes2.UPPER_F=70]="UPPER_F",CharCodes2[CharCodes2.UPPER_Z=90]="UPPER_Z"})(CharCodes||(CharCodes={}));var TO_LOWER_BIT=32,BinTrieFlags;(function(BinTrieFlags2){BinTrieFlags2[BinTrieFlags2.VALUE_LENGTH=49152]="VALUE_LENGTH",BinTrieFlags2[BinTrieFlags2.BRANCH_LENGTH=16256]="BRANCH_LENGTH",BinTrieFlags2[BinTrieFlags2.JUMP_TABLE=127]="JUMP_TABLE"})(BinTrieFlags||(BinTrieFlags={}));function isNumber(code){return code>=CharCodes.ZERO&&code<=CharCodes.NINE}function isHexadecimalCharacter(code){return code>=CharCodes.UPPER_A&&code<=CharCodes.UPPER_F||code>=CharCodes.LOWER_A&&code<=CharCodes.LOWER_F}function isAsciiAlphaNumeric(code){return code>=CharCodes.UPPER_A&&code<=CharCodes.UPPER_Z||code>=CharCodes.LOWER_A&&code<=CharCodes.LOWER_Z||isNumber(code)}function isEntityInAttributeInvalidEnd(code){return code===CharCodes.EQUALS||isAsciiAlphaNumeric(code)}var EntityDecoderState;(function(EntityDecoderState2){EntityDecoderState2[EntityDecoderState2.EntityStart=0]="EntityStart",EntityDecoderState2[EntityDecoderState2.NumericStart=1]="NumericStart",EntityDecoderState2[EntityDecoderState2.NumericDecimal=2]="NumericDecimal",EntityDecoderState2[EntityDecoderState2.NumericHex=3]="NumericHex",EntityDecoderState2[EntityDecoderState2.NamedEntity=4]="NamedEntity"})(EntityDecoderState||(EntityDecoderState={}));var DecodingMode;(function(DecodingMode2){DecodingMode2[DecodingMode2.Legacy=0]="Legacy",DecodingMode2[DecodingMode2.Strict=1]="Strict",DecodingMode2[DecodingMode2.Attribute=2]="Attribute"})(DecodingMode||(DecodingMode={}));var EntityDecoder=class{constructor(decodeTree,emitCodePoint,errors){this.decodeTree=decodeTree,this.emitCodePoint=emitCodePoint,this.errors=errors,this.state=EntityDecoderState.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=DecodingMode.Strict}startEntity(decodeMode){this.decodeMode=decodeMode,this.state=EntityDecoderState.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(str,offset){switch(this.state){case EntityDecoderState.EntityStart:return str.charCodeAt(offset)===CharCodes.NUM?(this.state=EntityDecoderState.NumericStart,this.consumed+=1,this.stateNumericStart(str,offset+1)):(this.state=EntityDecoderState.NamedEntity,this.stateNamedEntity(str,offset));case EntityDecoderState.NumericStart:return this.stateNumericStart(str,offset);case EntityDecoderState.NumericDecimal:return this.stateNumericDecimal(str,offset);case EntityDecoderState.NumericHex:return this.stateNumericHex(str,offset);case EntityDecoderState.NamedEntity:return this.stateNamedEntity(str,offset)}}stateNumericStart(str,offset){return offset>=str.length?-1:(str.charCodeAt(offset)|TO_LOWER_BIT)===CharCodes.LOWER_X?(this.state=EntityDecoderState.NumericHex,this.consumed+=1,this.stateNumericHex(str,offset+1)):(this.state=EntityDecoderState.NumericDecimal,this.stateNumericDecimal(str,offset))}addToNumericResult(str,start,end,base){if(start!==end){let digitCount=end-start;this.result=this.result*Math.pow(base,digitCount)+parseInt(str.substr(start,digitCount),base),this.consumed+=digitCount}}stateNumericHex(str,offset){let startIdx=offset;for(;offset<str.length;){let char=str.charCodeAt(offset);if(isNumber(char)||isHexadecimalCharacter(char))offset+=1;else return this.addToNumericResult(str,startIdx,offset,16),this.emitNumericEntity(char,3)}return this.addToNumericResult(str,startIdx,offset,16),-1}stateNumericDecimal(str,offset){let startIdx=offset;for(;offset<str.length;){let char=str.charCodeAt(offset);if(isNumber(char))offset+=1;else return this.addToNumericResult(str,startIdx,offset,10),this.emitNumericEntity(char,2)}return this.addToNumericResult(str,startIdx,offset,10),-1}emitNumericEntity(lastCp,expectedLength){var _a360;if(this.consumed<=expectedLength)return(_a360=this.errors)===null||_a360===void 0||_a360.absenceOfDigitsInNumericCharacterReference(this.consumed),0;if(lastCp===CharCodes.SEMI)this.consumed+=1;else if(this.decodeMode===DecodingMode.Strict)return 0;return this.emitCodePoint(replaceCodePoint(this.result),this.consumed),this.errors&&(lastCp!==CharCodes.SEMI&&this.errors.missingSemicolonAfterCharacterReference(),this.errors.validateNumericCharacterReference(this.result)),this.consumed}stateNamedEntity(str,offset){let{decodeTree}=this,current2=decodeTree[this.treeIndex],valueLength=(current2&BinTrieFlags.VALUE_LENGTH)>>14;for(;offset<str.length;offset++,this.excess++){let char=str.charCodeAt(offset);if(this.treeIndex=determineBranch(decodeTree,current2,this.treeIndex+Math.max(1,valueLength),char),this.treeIndex<0)return this.result===0||this.decodeMode===DecodingMode.Attribute&&(valueLength===0||isEntityInAttributeInvalidEnd(char))?0:this.emitNotTerminatedNamedEntity();if(current2=decodeTree[this.treeIndex],valueLength=(current2&BinTrieFlags.VALUE_LENGTH)>>14,valueLength!==0){if(char===CharCodes.SEMI)return this.emitNamedEntityData(this.treeIndex,valueLength,this.consumed+this.excess);this.decodeMode!==DecodingMode.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var _a360;let{result,decodeTree}=this,valueLength=(decodeTree[result]&BinTrieFlags.VALUE_LENGTH)>>14;return this.emitNamedEntityData(result,valueLength,this.consumed),(_a360=this.errors)===null||_a360===void 0||_a360.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(result,valueLength,consumed){let{decodeTree}=this;return this.emitCodePoint(valueLength===1?decodeTree[result]&~BinTrieFlags.VALUE_LENGTH:decodeTree[result+1],consumed),valueLength===3&&this.emitCodePoint(decodeTree[result+2],consumed),consumed}end(){var _a360;switch(this.state){case EntityDecoderState.NamedEntity:return this.result!==0&&(this.decodeMode!==DecodingMode.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case EntityDecoderState.NumericDecimal:return this.emitNumericEntity(0,2);case EntityDecoderState.NumericHex:return this.emitNumericEntity(0,3);case EntityDecoderState.NumericStart:return(_a360=this.errors)===null||_a360===void 0||_a360.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case EntityDecoderState.EntityStart:return 0}}};function getDecoder(decodeTree){let ret="",decoder=new EntityDecoder(decodeTree,str=>ret+=fromCodePoint(str));return function(str,decodeMode){let lastIndex=0,offset=0;for(;(offset=str.indexOf("&",offset))>=0;){ret+=str.slice(lastIndex,offset),decoder.startEntity(decodeMode);let len=decoder.write(str,offset+1);if(len<0){lastIndex=offset+decoder.end();break}lastIndex=offset+len,offset=len===0?lastIndex+1:lastIndex}let result=ret+str.slice(lastIndex);return ret="",result}}function determineBranch(decodeTree,current2,nodeIdx,char){let branchCount=(current2&BinTrieFlags.BRANCH_LENGTH)>>7,jumpOffset=current2&BinTrieFlags.JUMP_TABLE;if(branchCount===0)return jumpOffset!==0&&char===jumpOffset?nodeIdx:-1;if(jumpOffset){let value=char-jumpOffset;return value<0||value>=branchCount?-1:decodeTree[nodeIdx+value]-1}let lo3=nodeIdx,hi3=lo3+branchCount-1;for(;lo3<=hi3;){let mid=lo3+hi3>>>1,midVal=decodeTree[mid];if(midVal<char)lo3=mid+1;else if(midVal>char)hi3=mid-1;else return decodeTree[mid+branchCount]}return-1}var htmlDecoder=getDecoder(decode_data_html_default),xmlDecoder=getDecoder(decode_data_xml_default);function restoreDiff(arr){for(let i2=1;i2<arr.length;i2++)arr[i2][0]+=arr[i2-1][0]+1;return arr}var encode_html_default=new Map(restoreDiff([[9,"	"],[0,"
"],[22,"!"],[0,"""],[0,"#"],[0,"$"],[0,"%"],[0,"&"],[0,"'"],[0,"("],[0,")"],[0,"*"],[0,"+"],[0,","],[1,"."],[0,"/"],[10,":"],[0,";"],[0,{v:"<",n:8402,o:"<⃒"}],[0,{v:"=",n:8421,o:"=⃥"}],[0,{v:">",n:8402,o:">⃒"}],[0,"?"],[0,"@"],[26,"["],[0,"\"],[0,"]"],[0,"^"],[0,"_"],[0,"`"],[5,{n:106,o:"fj"}],[20,"{"],[0,"|"],[0,"}"],[34," "],[0,"¡"],[0,"¢"],[0,"£"],[0,"¤"],[0,"¥"],[0,"¦"],[0,"§"],[0,"¨"],[0,"©"],[0,"ª"],[0,"«"],[0,"¬"],[0,"­"],[0,"®"],[0,"¯"],[0,"°"],[0,"±"],[0,"²"],[0,"³"],[0,"´"],[0,"µ"],[0,"¶"],[0,"·"],[0,"¸"],[0,"¹"],[0,"º"],[0,"»"],[0,"¼"],[0,"½"],[0,"¾"],[0,"¿"],[0,"À"],[0,"Á"],[0,"Â"],[0,"Ã"],[0,"Ä"],[0,"Å"],[0,"Æ"],[0,"Ç"],[0,"È"],[0,"É"],[0,"Ê"],[0,"Ë"],[0,"Ì"],[0,"Í"],[0,"Î"],[0,"Ï"],[0,"Ð"],[0,"Ñ"],[0,"Ò"],[0,"Ó"],[0,"Ô"],[0,"Õ"],[0,"Ö"],[0,"×"],[0,"Ø"],[0,"Ù"],[0,"Ú"],[0,"Û"],[0,"Ü"],[0,"Ý"],[0,"Þ"],[0,"ß"],[0,"à"],[0,"á"],[0,"â"],[0,"ã"],[0,"ä"],[0,"å"],[0,"æ"],[0,"ç"],[0,"è"],[0,"é"],[0,"ê"],[0,"ë"],[0,"ì"],[0,"í"],[0,"î"],[0,"ï"],[0,"ð"],[0,"ñ"],[0,"ò"],[0,"ó"],[0,"ô"],[0,"õ"],[0,"ö"],[0,"÷"],[0,"ø"],[0,"ù"],[0,"ú"],[0,"û"],[0,"ü"],[0,"ý"],[0,"þ"],[0,"ÿ"],[0,"Ā"],[0,"ā"],[0,"Ă"],[0,"ă"],[0,"Ą"],[0,"ą"],[0,"Ć"],[0,"ć"],[0,"Ĉ"],[0,"ĉ"],[0,"Ċ"],[0,"ċ"],[0,"Č"],[0,"č"],[0,"Ď"],[0,"ď"],[0,"Đ"],[0,"đ"],[0,"Ē"],[0,"ē"],[2,"Ė"],[0,"ė"],[0,"Ę"],[0,"ę"],[0,"Ě"],[0,"ě"],[0,"Ĝ"],[0,"ĝ"],[0,"Ğ"],[0,"ğ"],[0,"Ġ"],[0,"ġ"],[0,"Ģ"],[1,"Ĥ"],[0,"ĥ"],[0,"Ħ"],[0,"ħ"],[0,"Ĩ"],[0,"ĩ"],[0,"Ī"],[0,"ī"],[2,"Į"],[0,"į"],[0,"İ"],[0,"ı"],[0,"IJ"],[0,"ij"],[0,"Ĵ"],[0,"ĵ"],[0,"Ķ"],[0,"ķ"],[0,"ĸ"],[0,"Ĺ"],[0,"ĺ"],[0,"Ļ"],[0,"ļ"],[0,"Ľ"],[0,"ľ"],[0,"Ŀ"],[0,"ŀ"],[0,"Ł"],[0,"ł"],[0,"Ń"],[0,"ń"],[0,"Ņ"],[0,"ņ"],[0,"Ň"],[0,"ň"],[0,"ʼn"],[0,"Ŋ"],[0,"ŋ"],[0,"Ō"],[0,"ō"],[2,"Ő"],[0,"ő"],[0,"Œ"],[0,"œ"],[0,"Ŕ"],[0,"ŕ"],[0,"Ŗ"],[0,"ŗ"],[0,"Ř"],[0,"ř"],[0,"Ś"],[0,"ś"],[0,"Ŝ"],[0,"ŝ"],[0,"Ş"],[0,"ş"],[0,"Š"],[0,"š"],[0,"Ţ"],[0,"ţ"],[0,"Ť"],[0,"ť"],[0,"Ŧ"],[0,"ŧ"],[0,"Ũ"],[0,"ũ"],[0,"Ū"],[0,"ū"],[0,"Ŭ"],[0,"ŭ"],[0,"Ů"],[0,"ů"],[0,"Ű"],[0,"ű"],[0,"Ų"],[0,"ų"],[0,"Ŵ"],[0,"ŵ"],[0,"Ŷ"],[0,"ŷ"],[0,"Ÿ"],[0,"Ź"],[0,"ź"],[0,"Ż"],[0,"ż"],[0,"Ž"],[0,"ž"],[19,"ƒ"],[34,"Ƶ"],[63,"ǵ"],[65,"ȷ"],[142,"ˆ"],[0,"ˇ"],[16,"˘"],[0,"˙"],[0,"˚"],[0,"˛"],[0,"˜"],[0,"˝"],[51,"̑"],[127,"Α"],[0,"Β"],[0,"Γ"],[0,"Δ"],[0,"Ε"],[0,"Ζ"],[0,"Η"],[0,"Θ"],[0,"Ι"],[0,"Κ"],[0,"Λ"],[0,"Μ"],[0,"Ν"],[0,"Ξ"],[0,"Ο"],[0,"Π"],[0,"Ρ"],[1,"Σ"],[0,"Τ"],[0,"Υ"],[0,"Φ"],[0,"Χ"],[0,"Ψ"],[0,"Ω"],[7,"α"],[0,"β"],[0,"γ"],[0,"δ"],[0,"ε"],[0,"ζ"],[0,"η"],[0,"θ"],[0,"ι"],[0,"κ"],[0,"λ"],[0,"μ"],[0,"ν"],[0,"ξ"],[0,"ο"],[0,"π"],[0,"ρ"],[0,"ς"],[0,"σ"],[0,"τ"],[0,"υ"],[0,"φ"],[0,"χ"],[0,"ψ"],[0,"ω"],[7,"ϑ"],[0,"ϒ"],[2,"ϕ"],[0,"ϖ"],[5,"Ϝ"],[0,"ϝ"],[18,"ϰ"],[0,"ϱ"],[3,"ϵ"],[0,"϶"],[10,"Ё"],[0,"Ђ"],[0,"Ѓ"],[0,"Є"],[0,"Ѕ"],[0,"І"],[0,"Ї"],[0,"Ј"],[0,"Љ"],[0,"Њ"],[0,"Ћ"],[0,"Ќ"],[1,"Ў"],[0,"Џ"],[0,"А"],[0,"Б"],[0,"В"],[0,"Г"],[0,"Д"],[0,"Е"],[0,"Ж"],[0,"З"],[0,"И"],[0,"Й"],[0,"К"],[0,"Л"],[0,"М"],[0,"Н"],[0,"О"],[0,"П"],[0,"Р"],[0,"С"],[0,"Т"],[0,"У"],[0,"Ф"],[0,"Х"],[0,"Ц"],[0,"Ч"],[0,"Ш"],[0,"Щ"],[0,"Ъ"],[0,"Ы"],[0,"Ь"],[0,"Э"],[0,"Ю"],[0,"Я"],[0,"а"],[0,"б"],[0,"в"],[0,"г"],[0,"д"],[0,"е"],[0,"ж"],[0,"з"],[0,"и"],[0,"й"],[0,"к"],[0,"л"],[0,"м"],[0,"н"],[0,"о"],[0,"п"],[0,"р"],[0,"с"],[0,"т"],[0,"у"],[0,"ф"],[0,"х"],[0,"ц"],[0,"ч"],[0,"ш"],[0,"щ"],[0,"ъ"],[0,"ы"],[0,"ь"],[0,"э"],[0,"ю"],[0,"я"],[1,"ё"],[0,"ђ"],[0,"ѓ"],[0,"є"],[0,"ѕ"],[0,"і"],[0,"ї"],[0,"ј"],[0,"љ"],[0,"њ"],[0,"ћ"],[0,"ќ"],[1,"ў"],[0,"џ"],[7074," "],[0," "],[0," "],[0," "],[1," "],[0," "],[0," "],[0," "],[0,"​"],[0,"‌"],[0,"‍"],[0,"‎"],[0,"‏"],[0,"‐"],[2,"–"],[0,"—"],[0,"―"],[0,"‖"],[1,"‘"],[0,"’"],[0,"‚"],[1,"“"],[0,"”"],[0,"„"],[1,"†"],[0,"‡"],[0,"•"],[2,"‥"],[0,"…"],[9,"‰"],[0,"‱"],[0,"′"],[0,"″"],[0,"‴"],[0,"‵"],[3,"‹"],[0,"›"],[3,"‾"],[2,"⁁"],[1,"⁃"],[0,"⁄"],[10,"⁏"],[7,"⁗"],[7,{v:" ",n:8202,o:"  "}],[0,"⁠"],[0,"⁡"],[0,"⁢"],[0,"⁣"],[72,"€"],[46,"⃛"],[0,"⃜"],[37,"ℂ"],[2,"℅"],[4,"ℊ"],[0,"ℋ"],[0,"ℌ"],[0,"ℍ"],[0,"ℎ"],[0,"ℏ"],[0,"ℐ"],[0,"ℑ"],[0,"ℒ"],[0,"ℓ"],[1,"ℕ"],[0,"№"],[0,"℗"],[0,"℘"],[0,"ℙ"],[0,"ℚ"],[0,"ℛ"],[0,"ℜ"],[0,"ℝ"],[0,"℞"],[3,"™"],[1,"ℤ"],[2,"℧"],[0,"ℨ"],[0,"℩"],[2,"ℬ"],[0,"ℭ"],[1,"ℯ"],[0,"ℰ"],[0,"ℱ"],[1,"ℳ"],[0,"ℴ"],[0,"ℵ"],[0,"ℶ"],[0,"ℷ"],[0,"ℸ"],[12,"ⅅ"],[0,"ⅆ"],[0,"ⅇ"],[0,"ⅈ"],[10,"⅓"],[0,"⅔"],[0,"⅕"],[0,"⅖"],[0,"⅗"],[0,"⅘"],[0,"⅙"],[0,"⅚"],[0,"⅛"],[0,"⅜"],[0,"⅝"],[0,"⅞"],[49,"←"],[0,"↑"],[0,"→"],[0,"↓"],[0,"↔"],[0,"↕"],[0,"↖"],[0,"↗"],[0,"↘"],[0,"↙"],[0,"↚"],[0,"↛"],[1,{v:"↝",n:824,o:"↝̸"}],[0,"↞"],[0,"↟"],[0,"↠"],[0,"↡"],[0,"↢"],[0,"↣"],[0,"↤"],[0,"↥"],[0,"↦"],[0,"↧"],[1,"↩"],[0,"↪"],[0,"↫"],[0,"↬"],[0,"↭"],[0,"↮"],[1,"↰"],[0,"↱"],[0,"↲"],[0,"↳"],[1,"↵"],[0,"↶"],[0,"↷"],[2,"↺"],[0,"↻"],[0,"↼"],[0,"↽"],[0,"↾"],[0,"↿"],[0,"⇀"],[0,"⇁"],[0,"⇂"],[0,"⇃"],[0,"⇄"],[0,"⇅"],[0,"⇆"],[0,"⇇"],[0,"⇈"],[0,"⇉"],[0,"⇊"],[0,"⇋"],[0,"⇌"],[0,"⇍"],[0,"⇎"],[0,"⇏"],[0,"⇐"],[0,"⇑"],[0,"⇒"],[0,"⇓"],[0,"⇔"],[0,"⇕"],[0,"⇖"],[0,"⇗"],[0,"⇘"],[0,"⇙"],[0,"⇚"],[0,"⇛"],[1,"⇝"],[6,"⇤"],[0,"⇥"],[15,"⇵"],[7,"⇽"],[0,"⇾"],[0,"⇿"],[0,"∀"],[0,"∁"],[0,{v:"∂",n:824,o:"∂̸"}],[0,"∃"],[0,"∄"],[0,"∅"],[1,"∇"],[0,"∈"],[0,"∉"],[1,"∋"],[0,"∌"],[2,"∏"],[0,"∐"],[0,"∑"],[0,"−"],[0,"∓"],[0,"∔"],[1,"∖"],[0,"∗"],[0,"∘"],[1,"√"],[2,"∝"],[0,"∞"],[0,"∟"],[0,{v:"∠",n:8402,o:"∠⃒"}],[0,"∡"],[0,"∢"],[0,"∣"],[0,"∤"],[0,"∥"],[0,"∦"],[0,"∧"],[0,"∨"],[0,{v:"∩",n:65024,o:"∩︀"}],[0,{v:"∪",n:65024,o:"∪︀"}],[0,"∫"],[0,"∬"],[0,"∭"],[0,"∮"],[0,"∯"],[0,"∰"],[0,"∱"],[0,"∲"],[0,"∳"],[0,"∴"],[0,"∵"],[0,"∶"],[0,"∷"],[0,"∸"],[1,"∺"],[0,"∻"],[0,{v:"∼",n:8402,o:"∼⃒"}],[0,{v:"∽",n:817,o:"∽̱"}],[0,{v:"∾",n:819,o:"∾̳"}],[0,"∿"],[0,"≀"],[0,"≁"],[0,{v:"≂",n:824,o:"≂̸"}],[0,"≃"],[0,"≄"],[0,"≅"],[0,"≆"],[0,"≇"],[0,"≈"],[0,"≉"],[0,"≊"],[0,{v:"≋",n:824,o:"≋̸"}],[0,"≌"],[0,{v:"≍",n:8402,o:"≍⃒"}],[0,{v:"≎",n:824,o:"≎̸"}],[0,{v:"≏",n:824,o:"≏̸"}],[0,{v:"≐",n:824,o:"≐̸"}],[0,"≑"],[0,"≒"],[0,"≓"],[0,"≔"],[0,"≕"],[0,"≖"],[0,"≗"],[1,"≙"],[0,"≚"],[1,"≜"],[2,"≟"],[0,"≠"],[0,{v:"≡",n:8421,o:"≡⃥"}],[0,"≢"],[1,{v:"≤",n:8402,o:"≤⃒"}],[0,{v:"≥",n:8402,o:"≥⃒"}],[0,{v:"≦",n:824,o:"≦̸"}],[0,{v:"≧",n:824,o:"≧̸"}],[0,{v:"≨",n:65024,o:"≨︀"}],[0,{v:"≩",n:65024,o:"≩︀"}],[0,{v:"≪",n:new Map(restoreDiff([[824,"≪̸"],[7577,"≪⃒"]]))}],[0,{v:"≫",n:new Map(restoreDiff([[824,"≫̸"],[7577,"≫⃒"]]))}],[0,"≬"],[0,"≭"],[0,"≮"],[0,"≯"],[0,"≰"],[0,"≱"],[0,"≲"],[0,"≳"],[0,"≴"],[0,"≵"],[0,"≶"],[0,"≷"],[0,"≸"],[0,"≹"],[0,"≺"],[0,"≻"],[0,"≼"],[0,"≽"],[0,"≾"],[0,{v:"≿",n:824,o:"≿̸"}],[0,"⊀"],[0,"⊁"],[0,{v:"⊂",n:8402,o:"⊂⃒"}],[0,{v:"⊃",n:8402,o:"⊃⃒"}],[0,"⊄"],[0,"⊅"],[0,"⊆"],[0,"⊇"],[0,"⊈"],[0,"⊉"],[0,{v:"⊊",n:65024,o:"⊊︀"}],[0,{v:"⊋",n:65024,o:"⊋︀"}],[1,"⊍"],[0,"⊎"],[0,{v:"⊏",n:824,o:"⊏̸"}],[0,{v:"⊐",n:824,o:"⊐̸"}],[0,"⊑"],[0,"⊒"],[0,{v:"⊓",n:65024,o:"⊓︀"}],[0,{v:"⊔",n:65024,o:"⊔︀"}],[0,"⊕"],[0,"⊖"],[0,"⊗"],[0,"⊘"],[0,"⊙"],[0,"⊚"],[0,"⊛"],[1,"⊝"],[0,"⊞"],[0,"⊟"],[0,"⊠"],[0,"⊡"],[0,"⊢"],[0,"⊣"],[0,"⊤"],[0,"⊥"],[1,"⊧"],[0,"⊨"],[0,"⊩"],[0,"⊪"],[0,"⊫"],[0,"⊬"],[0,"⊭"],[0,"⊮"],[0,"⊯"],[0,"⊰"],[1,"⊲"],[0,"⊳"],[0,{v:"⊴",n:8402,o:"⊴⃒"}],[0,{v:"⊵",n:8402,o:"⊵⃒"}],[0,"⊶"],[0,"⊷"],[0,"⊸"],[0,"⊹"],[0,"⊺"],[0,"⊻"],[1,"⊽"],[0,"⊾"],[0,"⊿"],[0,"⋀"],[0,"⋁"],[0,"⋂"],[0,"⋃"],[0,"⋄"],[0,"⋅"],[0,"⋆"],[0,"⋇"],[0,"⋈"],[0,"⋉"],[0,"⋊"],[0,"⋋"],[0,"⋌"],[0,"⋍"],[0,"⋎"],[0,"⋏"],[0,"⋐"],[0,"⋑"],[0,"⋒"],[0,"⋓"],[0,"⋔"],[0,"⋕"],[0,"⋖"],[0,"⋗"],[0,{v:"⋘",n:824,o:"⋘̸"}],[0,{v:"⋙",n:824,o:"⋙̸"}],[0,{v:"⋚",n:65024,o:"⋚︀"}],[0,{v:"⋛",n:65024,o:"⋛︀"}],[2,"⋞"],[0,"⋟"],[0,"⋠"],[0,"⋡"],[0,"⋢"],[0,"⋣"],[2,"⋦"],[0,"⋧"],[0,"⋨"],[0,"⋩"],[0,"⋪"],[0,"⋫"],[0,"⋬"],[0,"⋭"],[0,"⋮"],[0,"⋯"],[0,"⋰"],[0,"⋱"],[0,"⋲"],[0,"⋳"],[0,"⋴"],[0,{v:"⋵",n:824,o:"⋵̸"}],[0,"⋶"],[0,"⋷"],[1,{v:"⋹",n:824,o:"⋹̸"}],[0,"⋺"],[0,"⋻"],[0,"⋼"],[0,"⋽"],[0,"⋾"],[6,"⌅"],[0,"⌆"],[1,"⌈"],[0,"⌉"],[0,"⌊"],[0,"⌋"],[0,"⌌"],[0,"⌍"],[0,"⌎"],[0,"⌏"],[0,"⌐"],[1,"⌒"],[0,"⌓"],[1,"⌕"],[0,"⌖"],[5,"⌜"],[0,"⌝"],[0,"⌞"],[0,"⌟"],[2,"⌢"],[0,"⌣"],[9,"⌭"],[0,"⌮"],[7,"⌶"],[6,"⌽"],[1,"⌿"],[60,"⍼"],[51,"⎰"],[0,"⎱"],[2,"⎴"],[0,"⎵"],[0,"⎶"],[37,"⏜"],[0,"⏝"],[0,"⏞"],[0,"⏟"],[2,"⏢"],[4,"⏧"],[59,"␣"],[164,"Ⓢ"],[55,"─"],[1,"│"],[9,"┌"],[3,"┐"],[3,"└"],[3,"┘"],[3,"├"],[7,"┤"],[7,"┬"],[7,"┴"],[7,"┼"],[19,"═"],[0,"║"],[0,"╒"],[0,"╓"],[0,"╔"],[0,"╕"],[0,"╖"],[0,"╗"],[0,"╘"],[0,"╙"],[0,"╚"],[0,"╛"],[0,"╜"],[0,"╝"],[0,"╞"],[0,"╟"],[0,"╠"],[0,"╡"],[0,"╢"],[0,"╣"],[0,"╤"],[0,"╥"],[0,"╦"],[0,"╧"],[0,"╨"],[0,"╩"],[0,"╪"],[0,"╫"],[0,"╬"],[19,"▀"],[3,"▄"],[3,"█"],[8,"░"],[0,"▒"],[0,"▓"],[13,"□"],[8,"▪"],[0,"▫"],[1,"▭"],[0,"▮"],[2,"▱"],[1,"△"],[0,"▴"],[0,"▵"],[2,"▸"],[0,"▹"],[3,"▽"],[0,"▾"],[0,"▿"],[2,"◂"],[0,"◃"],[6,"◊"],[0,"○"],[32,"◬"],[2,"◯"],[8,"◸"],[0,"◹"],[0,"◺"],[0,"◻"],[0,"◼"],[8,"★"],[0,"☆"],[7,"☎"],[49,"♀"],[1,"♂"],[29,"♠"],[2,"♣"],[1,"♥"],[0,"♦"],[3,"♪"],[2,"♭"],[0,"♮"],[0,"♯"],[163,"✓"],[3,"✗"],[8,"✠"],[21,"✶"],[33,"❘"],[25,"❲"],[0,"❳"],[84,"⟈"],[0,"⟉"],[28,"⟦"],[0,"⟧"],[0,"⟨"],[0,"⟩"],[0,"⟪"],[0,"⟫"],[0,"⟬"],[0,"⟭"],[7,"⟵"],[0,"⟶"],[0,"⟷"],[0,"⟸"],[0,"⟹"],[0,"⟺"],[1,"⟼"],[2,"⟿"],[258,"⤂"],[0,"⤃"],[0,"⤄"],[0,"⤅"],[6,"⤌"],[0,"⤍"],[0,"⤎"],[0,"⤏"],[0,"⤐"],[0,"⤑"],[0,"⤒"],[0,"⤓"],[2,"⤖"],[2,"⤙"],[0,"⤚"],[0,"⤛"],[0,"⤜"],[0,"⤝"],[0,"⤞"],[0,"⤟"],[0,"⤠"],[2,"⤣"],[0,"⤤"],[0,"⤥"],[0,"⤦"],[0,"⤧"],[0,"⤨"],[0,"⤩"],[0,"⤪"],[8,{v:"⤳",n:824,o:"⤳̸"}],[1,"⤵"],[0,"⤶"],[0,"⤷"],[0,"⤸"],[0,"⤹"],[2,"⤼"],[0,"⤽"],[7,"⥅"],[2,"⥈"],[0,"⥉"],[0,"⥊"],[0,"⥋"],[2,"⥎"],[0,"⥏"],[0,"⥐"],[0,"⥑"],[0,"⥒"],[0,"⥓"],[0,"⥔"],[0,"⥕"],[0,"⥖"],[0,"⥗"],[0,"⥘"],[0,"⥙"],[0,"⥚"],[0,"⥛"],[0,"⥜"],[0,"⥝"],[0,"⥞"],[0,"⥟"],[0,"⥠"],[0,"⥡"],[0,"⥢"],[0,"⥣"],[0,"⥤"],[0,"⥥"],[0,"⥦"],[0,"⥧"],[0,"⥨"],[0,"⥩"],[0,"⥪"],[0,"⥫"],[0,"⥬"],[0,"⥭"],[0,"⥮"],[0,"⥯"],[0,"⥰"],[0,"⥱"],[0,"⥲"],[0,"⥳"],[0,"⥴"],[0,"⥵"],[0,"⥶"],[1,"⥸"],[0,"⥹"],[1,"⥻"],[0,"⥼"],[0,"⥽"],[0,"⥾"],[0,"⥿"],[5,"⦅"],[0,"⦆"],[4,"⦋"],[0,"⦌"],[0,"⦍"],[0,"⦎"],[0,"⦏"],[0,"⦐"],[0,"⦑"],[0,"⦒"],[0,"⦓"],[0,"⦔"],[0,"⦕"],[0,"⦖"],[3,"⦚"],[1,"⦜"],[0,"⦝"],[6,"⦤"],[0,"⦥"],[0,"⦦"],[0,"⦧"],[0,"⦨"],[0,"⦩"],[0,"⦪"],[0,"⦫"],[0,"⦬"],[0,"⦭"],[0,"⦮"],[0,"⦯"],[0,"⦰"],[0,"⦱"],[0,"⦲"],[0,"⦳"],[0,"⦴"],[0,"⦵"],[0,"⦶"],[0,"⦷"],[1,"⦹"],[1,"⦻"],[0,"⦼"],[1,"⦾"],[0,"⦿"],[0,"⧀"],[0,"⧁"],[0,"⧂"],[0,"⧃"],[0,"⧄"],[0,"⧅"],[3,"⧉"],[3,"⧍"],[0,"⧎"],[0,{v:"⧏",n:824,o:"⧏̸"}],[0,{v:"⧐",n:824,o:"⧐̸"}],[11,"⧜"],[0,"⧝"],[0,"⧞"],[4,"⧣"],[0,"⧤"],[0,"⧥"],[5,"⧫"],[8,"⧴"],[1,"⧶"],[9,"⨀"],[0,"⨁"],[0,"⨂"],[1,"⨄"],[1,"⨆"],[5,"⨌"],[0,"⨍"],[2,"⨐"],[0,"⨑"],[0,"⨒"],[0,"⨓"],[0,"⨔"],[0,"⨕"],[0,"⨖"],[0,"⨗"],[10,"⨢"],[0,"⨣"],[0,"⨤"],[0,"⨥"],[0,"⨦"],[0,"⨧"],[1,"⨩"],[0,"⨪"],[2,"⨭"],[0,"⨮"],[0,"⨯"],[0,"⨰"],[0,"⨱"],[1,"⨳"],[0,"⨴"],[0,"⨵"],[0,"⨶"],[0,"⨷"],[0,"⨸"],[0,"⨹"],[0,"⨺"],[0,"⨻"],[0,"⨼"],[2,"⨿"],[0,"⩀"],[1,"⩂"],[0,"⩃"],[0,"⩄"],[0,"⩅"],[0,"⩆"],[0,"⩇"],[0,"⩈"],[0,"⩉"],[0,"⩊"],[0,"⩋"],[0,"⩌"],[0,"⩍"],[2,"⩐"],[2,"⩓"],[0,"⩔"],[0,"⩕"],[0,"⩖"],[0,"⩗"],[0,"⩘"],[1,"⩚"],[0,"⩛"],[0,"⩜"],[0,"⩝"],[1,"⩟"],[6,"⩦"],[3,"⩪"],[2,{v:"⩭",n:824,o:"⩭̸"}],[0,"⩮"],[0,"⩯"],[0,{v:"⩰",n:824,o:"⩰̸"}],[0,"⩱"],[0,"⩲"],[0,"⩳"],[0,"⩴"],[0,"⩵"],[1,"⩷"],[0,"⩸"],[0,"⩹"],[0,"⩺"],[0,"⩻"],[0,"⩼"],[0,{v:"⩽",n:824,o:"⩽̸"}],[0,{v:"⩾",n:824,o:"⩾̸"}],[0,"⩿"],[0,"⪀"],[0,"⪁"],[0,"⪂"],[0,"⪃"],[0,"⪄"],[0,"⪅"],[0,"⪆"],[0,"⪇"],[0,"⪈"],[0,"⪉"],[0,"⪊"],[0,"⪋"],[0,"⪌"],[0,"⪍"],[0,"⪎"],[0,"⪏"],[0,"⪐"],[0,"⪑"],[0,"⪒"],[0,"⪓"],[0,"⪔"],[0,"⪕"],[0,"⪖"],[0,"⪗"],[0,"⪘"],[0,"⪙"],[0,"⪚"],[2,"⪝"],[0,"⪞"],[0,"⪟"],[0,"⪠"],[0,{v:"⪡",n:824,o:"⪡̸"}],[0,{v:"⪢",n:824,o:"⪢̸"}],[1,"⪤"],[0,"⪥"],[0,"⪦"],[0,"⪧"],[0,"⪨"],[0,"⪩"],[0,"⪪"],[0,"⪫"],[0,{v:"⪬",n:65024,o:"⪬︀"}],[0,{v:"⪭",n:65024,o:"⪭︀"}],[0,"⪮"],[0,{v:"⪯",n:824,o:"⪯̸"}],[0,{v:"⪰",n:824,o:"⪰̸"}],[2,"⪳"],[0,"⪴"],[0,"⪵"],[0,"⪶"],[0,"⪷"],[0,"⪸"],[0,"⪹"],[0,"⪺"],[0,"⪻"],[0,"⪼"],[0,"⪽"],[0,"⪾"],[0,"⪿"],[0,"⫀"],[0,"⫁"],[0,"⫂"],[0,"⫃"],[0,"⫄"],[0,{v:"⫅",n:824,o:"⫅̸"}],[0,{v:"⫆",n:824,o:"⫆̸"}],[0,"⫇"],[0,"⫈"],[2,{v:"⫋",n:65024,o:"⫋︀"}],[0,{v:"⫌",n:65024,o:"⫌︀"}],[2,"⫏"],[0,"⫐"],[0,"⫑"],[0,"⫒"],[0,"⫓"],[0,"⫔"],[0,"⫕"],[0,"⫖"],[0,"⫗"],[0,"⫘"],[0,"⫙"],[0,"⫚"],[0,"⫛"],[8,"⫤"],[1,"⫦"],[0,"⫧"],[0,"⫨"],[0,"⫩"],[1,"⫫"],[0,"⫬"],[0,"⫭"],[0,"⫮"],[0,"⫯"],[0,"⫰"],[0,"⫱"],[0,"⫲"],[0,"⫳"],[9,{v:"⫽",n:8421,o:"⫽⃥"}],[44343,{n:new Map(restoreDiff([[56476,"𝒜"],[1,"𝒞"],[0,"𝒟"],[2,"𝒢"],[2,"𝒥"],[0,"𝒦"],[2,"𝒩"],[0,"𝒪"],[0,"𝒫"],[0,"𝒬"],[1,"𝒮"],[0,"𝒯"],[0,"𝒰"],[0,"𝒱"],[0,"𝒲"],[0,"𝒳"],[0,"𝒴"],[0,"𝒵"],[0,"𝒶"],[0,"𝒷"],[0,"𝒸"],[0,"𝒹"],[1,"𝒻"],[1,"𝒽"],[0,"𝒾"],[0,"𝒿"],[0,"𝓀"],[0,"𝓁"],[0,"𝓂"],[0,"𝓃"],[1,"𝓅"],[0,"𝓆"],[0,"𝓇"],[0,"𝓈"],[0,"𝓉"],[0,"𝓊"],[0,"𝓋"],[0,"𝓌"],[0,"𝓍"],[0,"𝓎"],[0,"𝓏"],[52,"𝔄"],[0,"𝔅"],[1,"𝔇"],[0,"𝔈"],[0,"𝔉"],[0,"𝔊"],[2,"𝔍"],[0,"𝔎"],[0,"𝔏"],[0,"𝔐"],[0,"𝔑"],[0,"𝔒"],[0,"𝔓"],[0,"𝔔"],[1,"𝔖"],[0,"𝔗"],[0,"𝔘"],[0,"𝔙"],[0,"𝔚"],[0,"𝔛"],[0,"𝔜"],[1,"𝔞"],[0,"𝔟"],[0,"𝔠"],[0,"𝔡"],[0,"𝔢"],[0,"𝔣"],[0,"𝔤"],[0,"𝔥"],[0,"𝔦"],[0,"𝔧"],[0,"𝔨"],[0,"𝔩"],[0,"𝔪"],[0,"𝔫"],[0,"𝔬"],[0,"𝔭"],[0,"𝔮"],[0,"𝔯"],[0,"𝔰"],[0,"𝔱"],[0,"𝔲"],[0,"𝔳"],[0,"𝔴"],[0,"𝔵"],[0,"𝔶"],[0,"𝔷"],[0,"𝔸"],[0,"𝔹"],[1,"𝔻"],[0,"𝔼"],[0,"𝔽"],[0,"𝔾"],[1,"𝕀"],[0,"𝕁"],[0,"𝕂"],[0,"𝕃"],[0,"𝕄"],[1,"𝕆"],[3,"𝕊"],[0,"𝕋"],[0,"𝕌"],[0,"𝕍"],[0,"𝕎"],[0,"𝕏"],[0,"𝕐"],[1,"𝕒"],[0,"𝕓"],[0,"𝕔"],[0,"𝕕"],[0,"𝕖"],[0,"𝕗"],[0,"𝕘"],[0,"𝕙"],[0,"𝕚"],[0,"𝕛"],[0,"𝕜"],[0,"𝕝"],[0,"𝕞"],[0,"𝕟"],[0,"𝕠"],[0,"𝕡"],[0,"𝕢"],[0,"𝕣"],[0,"𝕤"],[0,"𝕥"],[0,"𝕦"],[0,"𝕧"],[0,"𝕨"],[0,"𝕩"],[0,"𝕪"],[0,"𝕫"]]))}],[8906,"ff"],[0,"fi"],[0,"fl"],[0,"ffi"],[0,"ffl"]]));var xmlReplacer=/["&'<>$\x80-\uFFFF]/g,xmlCodeMap=new Map([[34,"""],[38,"&"],[39,"'"],[60,"<"],[62,">"]]),getCodePoint=String.prototype.codePointAt!=null?(str,index)=>str.codePointAt(index):(c3,index)=>(c3.charCodeAt(index)&64512)===55296?(c3.charCodeAt(index)-55296)*1024+c3.charCodeAt(index+1)-56320+65536:c3.charCodeAt(index);function encodeXML(str){let ret="",lastIdx=0,match2;for(;(match2=xmlReplacer.exec(str))!==null;){let i2=match2.index,char=str.charCodeAt(i2),next2=xmlCodeMap.get(char);next2!==void 0?(ret+=str.substring(lastIdx,i2)+next2,lastIdx=i2+1):(ret+=`${str.substring(lastIdx,i2)}&#x${getCodePoint(str,i2).toString(16)};`,lastIdx=xmlReplacer.lastIndex+=+((char&64512)===55296))}return ret+str.substr(lastIdx)}function getEscaper(regex,map){return function(data){let match2,lastIdx=0,result="";for(;match2=regex.exec(data);)lastIdx!==match2.index&&(result+=data.substring(lastIdx,match2.index)),result+=map.get(match2[0].charCodeAt(0)),lastIdx=match2.index+1;return result+data.substring(lastIdx)}}var escapeUTF8=getEscaper(/[&<>'"]/g,xmlCodeMap),escapeAttribute=getEscaper(/["&\u00A0]/g,new Map([[34,"""],[38,"&"],[160," "]])),escapeText=getEscaper(/[&<>\u00A0]/g,new Map([[38,"&"],[60,"<"],[62,">"],[160," "]]));var EntityLevel;(function(EntityLevel2){EntityLevel2[EntityLevel2.XML=0]="XML",EntityLevel2[EntityLevel2.HTML=1]="HTML"})(EntityLevel||(EntityLevel={}));var EncodingMode;(function(EncodingMode2){EncodingMode2[EncodingMode2.UTF8=0]="UTF8",EncodingMode2[EncodingMode2.ASCII=1]="ASCII",EncodingMode2[EncodingMode2.Extensive=2]="Extensive",EncodingMode2[EncodingMode2.Attribute=3]="Attribute",EncodingMode2[EncodingMode2.Text=4]="Text"})(EncodingMode||(EncodingMode={}));var elementNames=new Map(["altGlyph","altGlyphDef","altGlyphItem","animateColor","animateMotion","animateTransform","clipPath","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","foreignObject","glyphRef","linearGradient","radialGradient","textPath"].map(val=>[val.toLowerCase(),val])),attributeNames=new Map(["definitionURL","attributeName","attributeType","baseFrequency","baseProfile","calcMode","clipPathUnits","diffuseConstant","edgeMode","filterUnits","glyphRef","gradientTransform","gradientUnits","kernelMatrix","kernelUnitLength","keyPoints","keySplines","keyTimes","lengthAdjust","limitingConeAngle","markerHeight","markerUnits","markerWidth","maskContentUnits","maskUnits","numOctaves","pathLength","patternContentUnits","patternTransform","patternUnits","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","refX","refY","repeatCount","repeatDur","requiredExtensions","requiredFeatures","specularConstant","specularExponent","spreadMethod","startOffset","stdDeviation","stitchTiles","surfaceScale","systemLanguage","tableValues","targetX","targetY","textLength","viewBox","viewTarget","xChannelSelector","yChannelSelector","zoomAndPan"].map(val=>[val.toLowerCase(),val]));var unencodedElements=new Set(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]);function replaceQuotes(value){return value.replace(/"/g,""")}function formatAttributes(attributes2,opts){var _a360;if(!attributes2)return;let encode2=((_a360=opts.encodeEntities)!==null&&_a360!==void 0?_a360:opts.decodeEntities)===!1?replaceQuotes:opts.xmlMode||opts.encodeEntities!=="utf8"?encodeXML:escapeAttribute;return Object.keys(attributes2).map(key=>{var _a361,_b2;let value=(_a361=attributes2[key])!==null&&_a361!==void 0?_a361:"";return opts.xmlMode==="foreign"&&(key=(_b2=attributeNames.get(key))!==null&&_b2!==void 0?_b2:key),!opts.emptyAttrs&&!opts.xmlMode&&value===""?key:`${key}="${encode2(value)}"`}).join(" ")}var singleTag=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]);function render(node,options={}){let nodes="length"in node?node:[node],output="";for(let i2=0;i2<nodes.length;i2++)output+=renderNode(nodes[i2],options);return output}var esm_default=render;function renderNode(node,options){switch(node.type){case Root:return render(node.children,options);case Doctype:case Directive:return renderDirective(node);case Comment:return renderComment(node);case CDATA:return renderCdata(node);case Script:case Style:case Tag:return renderTag(node,options);case Text:return renderText(node,options)}}var foreignModeIntegrationPoints=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),foreignElements=new Set(["svg","math"]);function renderTag(elem,opts){var _a360;opts.xmlMode==="foreign"&&(elem.name=(_a360=elementNames.get(elem.name))!==null&&_a360!==void 0?_a360:elem.name,elem.parent&&foreignModeIntegrationPoints.has(elem.parent.name)&&(opts={...opts,xmlMode:!1})),!opts.xmlMode&&foreignElements.has(elem.name)&&(opts={...opts,xmlMode:"foreign"});let tag=`<${elem.name}`,attribs=formatAttributes(elem.attribs,opts);return attribs&&(tag+=` ${attribs}`),elem.children.length===0&&(opts.xmlMode?opts.selfClosingTags!==!1:opts.selfClosingTags&&singleTag.has(elem.name))?(opts.xmlMode||(tag+=" "),tag+="/>"):(tag+=">",elem.children.length>0&&(tag+=render(elem.children,opts)),(opts.xmlMode||!singleTag.has(elem.name))&&(tag+=`</${elem.name}>`)),tag}function renderDirective(elem){return`<${elem.data}>`}function renderText(elem,opts){var _a360;let data=elem.data||"";return((_a360=opts.encodeEntities)!==null&&_a360!==void 0?_a360:opts.decodeEntities)!==!1&&!(!opts.xmlMode&&elem.parent&&unencodedElements.has(elem.parent.name))&&(data=opts.xmlMode||opts.encodeEntities!=="utf8"?encodeXML(data):escapeText(data)),data}function renderCdata(elem){return`<![CDATA[${elem.children[0].data}]]>`}function renderComment(elem){return`<!--${elem.data}-->`}function getOuterHTML(node,options){return esm_default(node,options)}function getInnerHTML(node,options){return hasChildren(node)?node.children.map(node2=>getOuterHTML(node2,options)).join(""):""}function getText(node){return Array.isArray(node)?node.map(getText).join(""):isTag2(node)?node.name==="br"?`
|
|
352
352
|
`:getText(node.children):isCDATA(node)?getText(node.children):isText(node)?node.data:""}function textContent(node){return Array.isArray(node)?node.map(textContent).join(""):hasChildren(node)&&!isComment(node)?textContent(node.children):isText(node)?node.data:""}function innerText(node){return Array.isArray(node)?node.map(innerText).join(""):hasChildren(node)&&(node.type===ElementType.Tag||isCDATA(node))?innerText(node.children):isText(node)?node.data:""}function getChildren(elem){return hasChildren(elem)?elem.children:[]}function getParent(elem){return elem.parent||null}function getSiblings(elem){let parent=getParent(elem);if(parent!=null)return getChildren(parent);let siblings=[elem],{prev,next:next2}=elem;for(;prev!=null;)siblings.unshift(prev),{prev}=prev;for(;next2!=null;)siblings.push(next2),{next:next2}=next2;return siblings}function getAttributeValue(elem,name){var _a360;return(_a360=elem.attribs)===null||_a360===void 0?void 0:_a360[name]}function hasAttrib(elem,name){return elem.attribs!=null&&Object.prototype.hasOwnProperty.call(elem.attribs,name)&&elem.attribs[name]!=null}function getName(elem){return elem.name}function nextElementSibling(elem){let{next:next2}=elem;for(;next2!==null&&!isTag2(next2);)({next:next2}=next2);return next2}function prevElementSibling(elem){let{prev}=elem;for(;prev!==null&&!isTag2(prev);)({prev}=prev);return prev}function removeElement(elem){if(elem.prev&&(elem.prev.next=elem.next),elem.next&&(elem.next.prev=elem.prev),elem.parent){let childs=elem.parent.children,childsIndex=childs.lastIndexOf(elem);childsIndex>=0&&childs.splice(childsIndex,1)}elem.next=null,elem.prev=null,elem.parent=null}function replaceElement(elem,replacement){let prev=replacement.prev=elem.prev;prev&&(prev.next=replacement);let next2=replacement.next=elem.next;next2&&(next2.prev=replacement);let parent=replacement.parent=elem.parent;if(parent){let childs=parent.children;childs[childs.lastIndexOf(elem)]=replacement,elem.parent=null}}function appendChild(parent,child){if(removeElement(child),child.next=null,child.parent=parent,parent.children.push(child)>1){let sibling=parent.children[parent.children.length-2];sibling.next=child,child.prev=sibling}else child.prev=null}function append(elem,next2){removeElement(next2);let{parent}=elem,currNext=elem.next;if(next2.next=currNext,next2.prev=elem,elem.next=next2,next2.parent=parent,currNext){if(currNext.prev=next2,parent){let childs=parent.children;childs.splice(childs.lastIndexOf(currNext),0,next2)}}else parent&&parent.children.push(next2)}function prependChild(parent,child){if(removeElement(child),child.parent=parent,child.prev=null,parent.children.unshift(child)!==1){let sibling=parent.children[1];sibling.prev=child,child.next=sibling}else child.next=null}function prepend(elem,prev){removeElement(prev);let{parent}=elem;if(parent){let childs=parent.children;childs.splice(childs.indexOf(elem),0,prev)}elem.prev&&(elem.prev.next=prev),prev.parent=parent,prev.prev=elem.prev,prev.next=elem,elem.prev=prev}function filter(test,node,recurse=!0,limit=1/0){return find(test,Array.isArray(node)?node:[node],recurse,limit)}function find(test,nodes,recurse,limit){let result=[],nodeStack=[Array.isArray(nodes)?nodes:[nodes]],indexStack=[0];for(;;){if(indexStack[0]>=nodeStack[0].length){if(indexStack.length===1)return result;nodeStack.shift(),indexStack.shift();continue}let elem=nodeStack[0][indexStack[0]++];if(test(elem)&&(result.push(elem),--limit<=0))return result;recurse&&hasChildren(elem)&&elem.children.length>0&&(indexStack.unshift(0),nodeStack.unshift(elem.children))}}function findOneChild(test,nodes){return nodes.find(test)}function findOne(test,nodes,recurse=!0){let searchedNodes=Array.isArray(nodes)?nodes:[nodes];for(let i2=0;i2<searchedNodes.length;i2++){let node=searchedNodes[i2];if(isTag2(node)&&test(node))return node;if(recurse&&hasChildren(node)&&node.children.length>0){let found=findOne(test,node.children,!0);if(found)return found}}return null}function existsOne(test,nodes){return(Array.isArray(nodes)?nodes:[nodes]).some(node=>isTag2(node)&&test(node)||hasChildren(node)&&existsOne(test,node.children))}function findAll(test,nodes){let result=[],nodeStack=[Array.isArray(nodes)?nodes:[nodes]],indexStack=[0];for(;;){if(indexStack[0]>=nodeStack[0].length){if(nodeStack.length===1)return result;nodeStack.shift(),indexStack.shift();continue}let elem=nodeStack[0][indexStack[0]++];isTag2(elem)&&test(elem)&&result.push(elem),hasChildren(elem)&&elem.children.length>0&&(indexStack.unshift(0),nodeStack.unshift(elem.children))}}var Checks={tag_name(name){return typeof name=="function"?elem=>isTag2(elem)&&name(elem.name):name==="*"?isTag2:elem=>isTag2(elem)&&elem.name===name},tag_type(type){return typeof type=="function"?elem=>type(elem.type):elem=>elem.type===type},tag_contains(data){return typeof data=="function"?elem=>isText(elem)&&data(elem.data):elem=>isText(elem)&&elem.data===data}};function getAttribCheck(attrib,value){return typeof value=="function"?elem=>isTag2(elem)&&value(elem.attribs[attrib]):elem=>isTag2(elem)&&elem.attribs[attrib]===value}function combineFuncs(a2,b3){return elem=>a2(elem)||b3(elem)}function compileTest(options){let funcs=Object.keys(options).map(key=>{let value=options[key];return Object.prototype.hasOwnProperty.call(Checks,key)?Checks[key](value):getAttribCheck(key,value)});return funcs.length===0?null:funcs.reduce(combineFuncs)}function testElement(options,node){let test=compileTest(options);return test?test(node):!0}function getElements(options,nodes,recurse,limit=1/0){let test=compileTest(options);return test?filter(test,nodes,recurse,limit):[]}function getElementById(id2,nodes,recurse=!0){return Array.isArray(nodes)||(nodes=[nodes]),findOne(getAttribCheck("id",id2),nodes,recurse)}function getElementsByTagName(tagName,nodes,recurse=!0,limit=1/0){return filter(Checks.tag_name(tagName),nodes,recurse,limit)}function getElementsByClassName(className,nodes,recurse=!0,limit=1/0){return filter(getAttribCheck("class",className),nodes,recurse,limit)}function getElementsByTagType(type,nodes,recurse=!0,limit=1/0){return filter(Checks.tag_type(type),nodes,recurse,limit)}function removeSubsets(nodes){let idx=nodes.length;for(;--idx>=0;){let node=nodes[idx];if(idx>0&&nodes.lastIndexOf(node,idx-1)>=0){nodes.splice(idx,1);continue}for(let ancestor=node.parent;ancestor;ancestor=ancestor.parent)if(nodes.includes(ancestor)){nodes.splice(idx,1);break}}return nodes}var DocumentPosition;(function(DocumentPosition2){DocumentPosition2[DocumentPosition2.DISCONNECTED=1]="DISCONNECTED",DocumentPosition2[DocumentPosition2.PRECEDING=2]="PRECEDING",DocumentPosition2[DocumentPosition2.FOLLOWING=4]="FOLLOWING",DocumentPosition2[DocumentPosition2.CONTAINS=8]="CONTAINS",DocumentPosition2[DocumentPosition2.CONTAINED_BY=16]="CONTAINED_BY"})(DocumentPosition||(DocumentPosition={}));function compareDocumentPosition(nodeA,nodeB){let aParents=[],bParents=[];if(nodeA===nodeB)return 0;let current2=hasChildren(nodeA)?nodeA:nodeA.parent;for(;current2;)aParents.unshift(current2),current2=current2.parent;for(current2=hasChildren(nodeB)?nodeB:nodeB.parent;current2;)bParents.unshift(current2),current2=current2.parent;let maxIdx=Math.min(aParents.length,bParents.length),idx=0;for(;idx<maxIdx&&aParents[idx]===bParents[idx];)idx++;if(idx===0)return DocumentPosition.DISCONNECTED;let sharedParent=aParents[idx-1],siblings=sharedParent.children,aSibling=aParents[idx],bSibling=bParents[idx];return siblings.indexOf(aSibling)>siblings.indexOf(bSibling)?sharedParent===nodeB?DocumentPosition.FOLLOWING|DocumentPosition.CONTAINED_BY:DocumentPosition.FOLLOWING:sharedParent===nodeA?DocumentPosition.PRECEDING|DocumentPosition.CONTAINS:DocumentPosition.PRECEDING}function uniqueSort(nodes){return nodes=nodes.filter((node,i2,arr)=>!arr.includes(node,i2+1)),nodes.sort((a2,b3)=>{let relative=compareDocumentPosition(a2,b3);return relative&DocumentPosition.PRECEDING?-1:relative&DocumentPosition.FOLLOWING?1:0}),nodes}function getFeed(doc){let feedRoot=getOneElement(isValidFeed,doc);return feedRoot?feedRoot.name==="feed"?getAtomFeed(feedRoot):getRssFeed(feedRoot):null}function getAtomFeed(feedRoot){var _a360;let childs=feedRoot.children,feed={type:"atom",items:getElementsByTagName("entry",childs).map(item=>{var _a361;let{children}=item,entry={media:getMediaElements(children)};addConditionally(entry,"id","id",children),addConditionally(entry,"title","title",children);let href2=(_a361=getOneElement("link",children))===null||_a361===void 0?void 0:_a361.attribs.href;href2&&(entry.link=href2);let description=fetch2("summary",children)||fetch2("content",children);description&&(entry.description=description);let pubDate=fetch2("updated",children);return pubDate&&(entry.pubDate=new Date(pubDate)),entry})};addConditionally(feed,"id","id",childs),addConditionally(feed,"title","title",childs);let href=(_a360=getOneElement("link",childs))===null||_a360===void 0?void 0:_a360.attribs.href;href&&(feed.link=href),addConditionally(feed,"description","subtitle",childs);let updated=fetch2("updated",childs);return updated&&(feed.updated=new Date(updated)),addConditionally(feed,"author","email",childs,!0),feed}function getRssFeed(feedRoot){var _a360,_b2;let childs=(_b2=(_a360=getOneElement("channel",feedRoot.children))===null||_a360===void 0?void 0:_a360.children)!==null&&_b2!==void 0?_b2:[],feed={type:feedRoot.name.substr(0,3),id:"",items:getElementsByTagName("item",feedRoot.children).map(item=>{let{children}=item,entry={media:getMediaElements(children)};addConditionally(entry,"id","guid",children),addConditionally(entry,"title","title",children),addConditionally(entry,"link","link",children),addConditionally(entry,"description","description",children);let pubDate=fetch2("pubDate",children)||fetch2("dc:date",children);return pubDate&&(entry.pubDate=new Date(pubDate)),entry})};addConditionally(feed,"title","title",childs),addConditionally(feed,"link","link",childs),addConditionally(feed,"description","description",childs);let updated=fetch2("lastBuildDate",childs);return updated&&(feed.updated=new Date(updated)),addConditionally(feed,"author","managingEditor",childs,!0),feed}var MEDIA_KEYS_STRING=["url","type","lang"],MEDIA_KEYS_INT=["fileSize","bitrate","framerate","samplingrate","channels","duration","height","width"];function getMediaElements(where){return getElementsByTagName("media:content",where).map(elem=>{let{attribs}=elem,media={medium:attribs.medium,isDefault:!!attribs.isDefault};for(let attrib of MEDIA_KEYS_STRING)attribs[attrib]&&(media[attrib]=attribs[attrib]);for(let attrib of MEDIA_KEYS_INT)attribs[attrib]&&(media[attrib]=parseInt(attribs[attrib],10));return attribs.expression&&(media.expression=attribs.expression),media})}function getOneElement(tagName,node){return getElementsByTagName(tagName,node,!0,1)[0]}function fetch2(tagName,where,recurse=!1){return textContent(getElementsByTagName(tagName,where,recurse,1)).trim()}function addConditionally(obj,prop,tagName,where,recurse=!1){let val=fetch2(tagName,where,recurse);val&&(obj[prop]=val)}function isValidFeed(value){return value==="rss"||value==="feed"||value==="rdf:RDF"}var import_boolbase6=__toESM(require_boolbase(),1);var SelectorType;(function(SelectorType2){SelectorType2.Attribute="attribute",SelectorType2.Pseudo="pseudo",SelectorType2.PseudoElement="pseudo-element",SelectorType2.Tag="tag",SelectorType2.Universal="universal",SelectorType2.Adjacent="adjacent",SelectorType2.Child="child",SelectorType2.Descendant="descendant",SelectorType2.Parent="parent",SelectorType2.Sibling="sibling",SelectorType2.ColumnCombinator="column-combinator"})(SelectorType||(SelectorType={}));var AttributeAction;(function(AttributeAction2){AttributeAction2.Any="any",AttributeAction2.Element="element",AttributeAction2.End="end",AttributeAction2.Equals="equals",AttributeAction2.Exists="exists",AttributeAction2.Hyphen="hyphen",AttributeAction2.Not="not",AttributeAction2.Start="start"})(AttributeAction||(AttributeAction={}));var reName=/^[^\\#]?(?:\\(?:[\da-f]{1,6}\s?|.)|[\w\-\u00b0-\uFFFF])+/,reEscape=/\\([\da-f]{1,6}\s?|(\s)|.)/gi,actionTypes=new Map([[126,AttributeAction.Element],[94,AttributeAction.Start],[36,AttributeAction.End],[42,AttributeAction.Any],[33,AttributeAction.Not],[124,AttributeAction.Hyphen]]),unpackPseudos=new Set(["has","not","matches","is","where","host","host-context"]);function isTraversal(selector){switch(selector.type){case SelectorType.Adjacent:case SelectorType.Child:case SelectorType.Descendant:case SelectorType.Parent:case SelectorType.Sibling:case SelectorType.ColumnCombinator:return!0;default:return!1}}var stripQuotesFromPseudos=new Set(["contains","icontains"]);function funescape(_5,escaped,escapedWhitespace){let high=parseInt(escaped,16)-65536;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+65536):String.fromCharCode(high>>10|55296,high&1023|56320)}function unescapeCSS(str){return str.replace(reEscape,funescape)}function isQuote(c3){return c3===39||c3===34}function isWhitespace(c3){return c3===32||c3===9||c3===10||c3===12||c3===13}function parse2(selector){let subselects2=[],endIndex=parseSelector(subselects2,`${selector}`,0);if(endIndex<selector.length)throw new Error(`Unmatched selector: ${selector.slice(endIndex)}`);return subselects2}function parseSelector(subselects2,selector,selectorIndex){let tokens=[];function getName2(offset){let match2=selector.slice(selectorIndex+offset).match(reName);if(!match2)throw new Error(`Expected name, found ${selector.slice(selectorIndex)}`);let[name]=match2;return selectorIndex+=offset+name.length,unescapeCSS(name)}function stripWhitespace(offset){for(selectorIndex+=offset;selectorIndex<selector.length&&isWhitespace(selector.charCodeAt(selectorIndex));)selectorIndex++}function readValueWithParenthesis(){selectorIndex+=1;let start=selectorIndex,counter=1;for(;counter>0&&selectorIndex<selector.length;selectorIndex++)selector.charCodeAt(selectorIndex)===40&&!isEscaped(selectorIndex)?counter++:selector.charCodeAt(selectorIndex)===41&&!isEscaped(selectorIndex)&&counter--;if(counter)throw new Error("Parenthesis not matched");return unescapeCSS(selector.slice(start,selectorIndex-1))}function isEscaped(pos){let slashCount=0;for(;selector.charCodeAt(--pos)===92;)slashCount++;return(slashCount&1)===1}function ensureNotTraversal(){if(tokens.length>0&&isTraversal(tokens[tokens.length-1]))throw new Error("Did not expect successive traversals.")}function addTraversal(type){if(tokens.length>0&&tokens[tokens.length-1].type===SelectorType.Descendant){tokens[tokens.length-1].type=type;return}ensureNotTraversal(),tokens.push({type})}function addSpecialAttribute(name,action){tokens.push({type:SelectorType.Attribute,name,action,value:getName2(1),namespace:null,ignoreCase:"quirks"})}function finalizeSubselector(){if(tokens.length&&tokens[tokens.length-1].type===SelectorType.Descendant&&tokens.pop(),tokens.length===0)throw new Error("Empty sub-selector");subselects2.push(tokens)}if(stripWhitespace(0),selector.length===selectorIndex)return selectorIndex;loop:for(;selectorIndex<selector.length;){let firstChar=selector.charCodeAt(selectorIndex);switch(firstChar){case 32:case 9:case 10:case 12:case 13:{(tokens.length===0||tokens[0].type!==SelectorType.Descendant)&&(ensureNotTraversal(),tokens.push({type:SelectorType.Descendant})),stripWhitespace(1);break}case 62:{addTraversal(SelectorType.Child),stripWhitespace(1);break}case 60:{addTraversal(SelectorType.Parent),stripWhitespace(1);break}case 126:{addTraversal(SelectorType.Sibling),stripWhitespace(1);break}case 43:{addTraversal(SelectorType.Adjacent),stripWhitespace(1);break}case 46:{addSpecialAttribute("class",AttributeAction.Element);break}case 35:{addSpecialAttribute("id",AttributeAction.Equals);break}case 91:{stripWhitespace(1);let name,namespace=null;selector.charCodeAt(selectorIndex)===124?name=getName2(1):selector.startsWith("*|",selectorIndex)?(namespace="*",name=getName2(2)):(name=getName2(0),selector.charCodeAt(selectorIndex)===124&&selector.charCodeAt(selectorIndex+1)!==61&&(namespace=name,name=getName2(1))),stripWhitespace(0);let action=AttributeAction.Exists,possibleAction=actionTypes.get(selector.charCodeAt(selectorIndex));if(possibleAction){if(action=possibleAction,selector.charCodeAt(selectorIndex+1)!==61)throw new Error("Expected `=`");stripWhitespace(2)}else selector.charCodeAt(selectorIndex)===61&&(action=AttributeAction.Equals,stripWhitespace(1));let value="",ignoreCase=null;if(action!=="exists"){if(isQuote(selector.charCodeAt(selectorIndex))){let quote=selector.charCodeAt(selectorIndex),sectionEnd=selectorIndex+1;for(;sectionEnd<selector.length&&(selector.charCodeAt(sectionEnd)!==quote||isEscaped(sectionEnd));)sectionEnd+=1;if(selector.charCodeAt(sectionEnd)!==quote)throw new Error("Attribute value didn't end");value=unescapeCSS(selector.slice(selectorIndex+1,sectionEnd)),selectorIndex=sectionEnd+1}else{let valueStart=selectorIndex;for(;selectorIndex<selector.length&&(!isWhitespace(selector.charCodeAt(selectorIndex))&&selector.charCodeAt(selectorIndex)!==93||isEscaped(selectorIndex));)selectorIndex+=1;value=unescapeCSS(selector.slice(valueStart,selectorIndex))}stripWhitespace(0);let forceIgnore=selector.charCodeAt(selectorIndex)|32;forceIgnore===115?(ignoreCase=!1,stripWhitespace(1)):forceIgnore===105&&(ignoreCase=!0,stripWhitespace(1))}if(selector.charCodeAt(selectorIndex)!==93)throw new Error("Attribute selector didn't terminate");selectorIndex+=1;let attributeSelector={type:SelectorType.Attribute,name,action,value,namespace,ignoreCase};tokens.push(attributeSelector);break}case 58:{if(selector.charCodeAt(selectorIndex+1)===58){tokens.push({type:SelectorType.PseudoElement,name:getName2(2).toLowerCase(),data:selector.charCodeAt(selectorIndex)===40?readValueWithParenthesis():null});continue}let name=getName2(1).toLowerCase(),data=null;if(selector.charCodeAt(selectorIndex)===40)if(unpackPseudos.has(name)){if(isQuote(selector.charCodeAt(selectorIndex+1)))throw new Error(`Pseudo-selector ${name} cannot be quoted`);if(data=[],selectorIndex=parseSelector(data,selector,selectorIndex+1),selector.charCodeAt(selectorIndex)!==41)throw new Error(`Missing closing parenthesis in :${name} (${selector})`);selectorIndex+=1}else{if(data=readValueWithParenthesis(),stripQuotesFromPseudos.has(name)){let quot=data.charCodeAt(0);quot===data.charCodeAt(data.length-1)&&isQuote(quot)&&(data=data.slice(1,-1))}data=unescapeCSS(data)}tokens.push({type:SelectorType.Pseudo,name,data});break}case 44:{finalizeSubselector(),tokens=[],stripWhitespace(1);break}default:{if(selector.startsWith("/*",selectorIndex)){let endIndex=selector.indexOf("*/",selectorIndex+2);if(endIndex<0)throw new Error("Comment was not terminated");selectorIndex=endIndex+2,tokens.length===0&&stripWhitespace(0);break}let namespace=null,name;if(firstChar===42)selectorIndex+=1,name="*";else if(firstChar===124){if(name="",selector.charCodeAt(selectorIndex+1)===124){addTraversal(SelectorType.ColumnCombinator),stripWhitespace(2);break}}else if(reName.test(selector.slice(selectorIndex)))name=getName2(0);else break loop;selector.charCodeAt(selectorIndex)===124&&selector.charCodeAt(selectorIndex+1)!==124&&(namespace=name,selector.charCodeAt(selectorIndex+1)===42?(name="*",selectorIndex+=2):name=getName2(1)),tokens.push(name==="*"?{type:SelectorType.Universal,namespace}:{type:SelectorType.Tag,name,namespace})}}}return finalizeSubselector(),selectorIndex}var import_boolbase5=__toESM(require_boolbase(),1);var procedure=new Map([[SelectorType.Universal,50],[SelectorType.Tag,30],[SelectorType.Attribute,1],[SelectorType.Pseudo,0]]);function isTraversal2(token){return!procedure.has(token.type)}var attributes=new Map([[AttributeAction.Exists,10],[AttributeAction.Equals,8],[AttributeAction.Not,7],[AttributeAction.Start,6],[AttributeAction.End,6],[AttributeAction.Any,5]]);function sortByProcedure(arr){let procs=arr.map(getProcedure);for(let i2=1;i2<arr.length;i2++){let procNew=procs[i2];if(!(procNew<0))for(let j4=i2-1;j4>=0&&procNew<procs[j4];j4--){let token=arr[j4+1];arr[j4+1]=arr[j4],arr[j4]=token,procs[j4+1]=procs[j4],procs[j4]=procNew}}}function getProcedure(token){var _a360,_b2;let proc=(_a360=procedure.get(token.type))!==null&&_a360!==void 0?_a360:-1;return token.type===SelectorType.Attribute?(proc=(_b2=attributes.get(token.action))!==null&&_b2!==void 0?_b2:4,token.action===AttributeAction.Equals&&token.name==="id"&&(proc=9),token.ignoreCase&&(proc>>=1)):token.type===SelectorType.Pseudo&&(token.data?token.name==="has"||token.name==="contains"?proc=0:Array.isArray(token.data)?(proc=Math.min(...token.data.map(d3=>Math.min(...d3.map(getProcedure)))),proc<0&&(proc=0)):proc=2:proc=3),proc}var import_boolbase=__toESM(require_boolbase(),1),reChars=/[-[\]{}()*+?.,\\^$|#\s]/g;function escapeRegex(value){return value.replace(reChars,"\\$&")}var caseInsensitiveAttributes=new Set(["accept","accept-charset","align","alink","axis","bgcolor","charset","checked","clear","codetype","color","compact","declare","defer","dir","direction","disabled","enctype","face","frame","hreflang","http-equiv","lang","language","link","media","method","multiple","nohref","noresize","noshade","nowrap","readonly","rel","rev","rules","scope","scrolling","selected","shape","target","text","type","valign","valuetype","vlink"]);function shouldIgnoreCase(selector,options){return typeof selector.ignoreCase=="boolean"?selector.ignoreCase:selector.ignoreCase==="quirks"?!!options.quirksMode:!options.xmlMode&&caseInsensitiveAttributes.has(selector.name)}var attributeRules={equals(next2,data,options){let{adapter}=options,{name}=data,{value}=data;return shouldIgnoreCase(data,options)?(value=value.toLowerCase(),elem=>{let attr=adapter.getAttributeValue(elem,name);return attr!=null&&attr.length===value.length&&attr.toLowerCase()===value&&next2(elem)}):elem=>adapter.getAttributeValue(elem,name)===value&&next2(elem)},hyphen(next2,data,options){let{adapter}=options,{name}=data,{value}=data,len=value.length;return shouldIgnoreCase(data,options)?(value=value.toLowerCase(),function(elem){let attr=adapter.getAttributeValue(elem,name);return attr!=null&&(attr.length===len||attr.charAt(len)==="-")&&attr.substr(0,len).toLowerCase()===value&&next2(elem)}):function(elem){let attr=adapter.getAttributeValue(elem,name);return attr!=null&&(attr.length===len||attr.charAt(len)==="-")&&attr.substr(0,len)===value&&next2(elem)}},element(next2,data,options){let{adapter}=options,{name,value}=data;if(/\s/.test(value))return import_boolbase.default.falseFunc;let regex=new RegExp(`(?:^|\\s)${escapeRegex(value)}(?:$|\\s)`,shouldIgnoreCase(data,options)?"i":"");return function(elem){let attr=adapter.getAttributeValue(elem,name);return attr!=null&&attr.length>=value.length&®ex.test(attr)&&next2(elem)}},exists(next2,{name},{adapter}){return elem=>adapter.hasAttrib(elem,name)&&next2(elem)},start(next2,data,options){let{adapter}=options,{name}=data,{value}=data,len=value.length;return len===0?import_boolbase.default.falseFunc:shouldIgnoreCase(data,options)?(value=value.toLowerCase(),elem=>{let attr=adapter.getAttributeValue(elem,name);return attr!=null&&attr.length>=len&&attr.substr(0,len).toLowerCase()===value&&next2(elem)}):elem=>{var _a360;return!!(!((_a360=adapter.getAttributeValue(elem,name))===null||_a360===void 0)&&_a360.startsWith(value))&&next2(elem)}},end(next2,data,options){let{adapter}=options,{name}=data,{value}=data,len=-value.length;return len===0?import_boolbase.default.falseFunc:shouldIgnoreCase(data,options)?(value=value.toLowerCase(),elem=>{var _a360;return((_a360=adapter.getAttributeValue(elem,name))===null||_a360===void 0?void 0:_a360.substr(len).toLowerCase())===value&&next2(elem)}):elem=>{var _a360;return!!(!((_a360=adapter.getAttributeValue(elem,name))===null||_a360===void 0)&&_a360.endsWith(value))&&next2(elem)}},any(next2,data,options){let{adapter}=options,{name,value}=data;if(value==="")return import_boolbase.default.falseFunc;if(shouldIgnoreCase(data,options)){let regex=new RegExp(escapeRegex(value),"i");return function(elem){let attr=adapter.getAttributeValue(elem,name);return attr!=null&&attr.length>=value.length&®ex.test(attr)&&next2(elem)}}return elem=>{var _a360;return!!(!((_a360=adapter.getAttributeValue(elem,name))===null||_a360===void 0)&&_a360.includes(value))&&next2(elem)}},not(next2,data,options){let{adapter}=options,{name}=data,{value}=data;return value===""?elem=>!!adapter.getAttributeValue(elem,name)&&next2(elem):shouldIgnoreCase(data,options)?(value=value.toLowerCase(),elem=>{let attr=adapter.getAttributeValue(elem,name);return(attr==null||attr.length!==value.length||attr.toLowerCase()!==value)&&next2(elem)}):elem=>adapter.getAttributeValue(elem,name)!==value&&next2(elem)}};var whitespace=new Set([9,10,12,13,32]),ZERO=48,NINE=57;function parse3(formula){if(formula=formula.trim().toLowerCase(),formula==="even")return[2,0];if(formula==="odd")return[2,1];let idx=0,a2=0,sign=readSign(),number=readNumber2();if(idx<formula.length&&formula.charAt(idx)==="n"&&(idx++,a2=sign*(number??1),skipWhitespace(),idx<formula.length?(sign=readSign(),skipWhitespace(),number=readNumber2()):sign=number=0),number===null||idx<formula.length)throw new Error(`n-th rule couldn't be parsed ('${formula}')`);return[a2,sign*number];function readSign(){return formula.charAt(idx)==="-"?(idx++,-1):(formula.charAt(idx)==="+"&&idx++,1)}function readNumber2(){let start=idx,value=0;for(;idx<formula.length&&formula.charCodeAt(idx)>=ZERO&&formula.charCodeAt(idx)<=NINE;)value=value*10+(formula.charCodeAt(idx)-ZERO),idx++;return idx===start?null:value}function skipWhitespace(){for(;idx<formula.length&&whitespace.has(formula.charCodeAt(idx));)idx++}}var import_boolbase2=__toESM(require_boolbase(),1);function compile(parsed){let a2=parsed[0],b3=parsed[1]-1;if(b3<0&&a2<=0)return import_boolbase2.default.falseFunc;if(a2===-1)return index=>index<=b3;if(a2===0)return index=>index===b3;if(a2===1)return b3<0?import_boolbase2.default.trueFunc:index=>index>=b3;let absA=Math.abs(a2),bMod=(b3%absA+absA)%absA;return a2>1?index=>index>=b3&&index%absA===bMod:index=>index<=b3&&index%absA===bMod}function nthCheck(formula){return compile(parse3(formula))}var import_boolbase3=__toESM(require_boolbase(),1);function getChildFunc(next2,adapter){return elem=>{let parent=adapter.getParent(elem);return parent!=null&&adapter.isTag(parent)&&next2(elem)}}var filters={contains(next2,text,{adapter}){return function(elem){return next2(elem)&&adapter.getText(elem).includes(text)}},icontains(next2,text,{adapter}){let itext=text.toLowerCase();return function(elem){return next2(elem)&&adapter.getText(elem).toLowerCase().includes(itext)}},"nth-child"(next2,rule,{adapter,equals}){let func=nthCheck(rule);return func===import_boolbase3.default.falseFunc?import_boolbase3.default.falseFunc:func===import_boolbase3.default.trueFunc?getChildFunc(next2,adapter):function(elem){let siblings=adapter.getSiblings(elem),pos=0;for(let i2=0;i2<siblings.length&&!equals(elem,siblings[i2]);i2++)adapter.isTag(siblings[i2])&&pos++;return func(pos)&&next2(elem)}},"nth-last-child"(next2,rule,{adapter,equals}){let func=nthCheck(rule);return func===import_boolbase3.default.falseFunc?import_boolbase3.default.falseFunc:func===import_boolbase3.default.trueFunc?getChildFunc(next2,adapter):function(elem){let siblings=adapter.getSiblings(elem),pos=0;for(let i2=siblings.length-1;i2>=0&&!equals(elem,siblings[i2]);i2--)adapter.isTag(siblings[i2])&&pos++;return func(pos)&&next2(elem)}},"nth-of-type"(next2,rule,{adapter,equals}){let func=nthCheck(rule);return func===import_boolbase3.default.falseFunc?import_boolbase3.default.falseFunc:func===import_boolbase3.default.trueFunc?getChildFunc(next2,adapter):function(elem){let siblings=adapter.getSiblings(elem),pos=0;for(let i2=0;i2<siblings.length;i2++){let currentSibling=siblings[i2];if(equals(elem,currentSibling))break;adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===adapter.getName(elem)&&pos++}return func(pos)&&next2(elem)}},"nth-last-of-type"(next2,rule,{adapter,equals}){let func=nthCheck(rule);return func===import_boolbase3.default.falseFunc?import_boolbase3.default.falseFunc:func===import_boolbase3.default.trueFunc?getChildFunc(next2,adapter):function(elem){let siblings=adapter.getSiblings(elem),pos=0;for(let i2=siblings.length-1;i2>=0;i2--){let currentSibling=siblings[i2];if(equals(elem,currentSibling))break;adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===adapter.getName(elem)&&pos++}return func(pos)&&next2(elem)}},root(next2,_rule,{adapter}){return elem=>{let parent=adapter.getParent(elem);return(parent==null||!adapter.isTag(parent))&&next2(elem)}},scope(next2,rule,options,context){let{equals}=options;return!context||context.length===0?filters.root(next2,rule,options):context.length===1?elem=>equals(context[0],elem)&&next2(elem):elem=>context.includes(elem)&&next2(elem)},hover:dynamicStatePseudo("isHovered"),visited:dynamicStatePseudo("isVisited"),active:dynamicStatePseudo("isActive")};function dynamicStatePseudo(name){return function(next2,_rule,{adapter}){let func=adapter[name];return typeof func!="function"?import_boolbase3.default.falseFunc:function(elem){return func(elem)&&next2(elem)}}}var pseudos={empty(elem,{adapter}){return!adapter.getChildren(elem).some(elem2=>adapter.isTag(elem2)||adapter.getText(elem2)!=="")},"first-child"(elem,{adapter,equals}){if(adapter.prevElementSibling)return adapter.prevElementSibling(elem)==null;let firstChild=adapter.getSiblings(elem).find(elem2=>adapter.isTag(elem2));return firstChild!=null&&equals(elem,firstChild)},"last-child"(elem,{adapter,equals}){let siblings=adapter.getSiblings(elem);for(let i2=siblings.length-1;i2>=0;i2--){if(equals(elem,siblings[i2]))return!0;if(adapter.isTag(siblings[i2]))break}return!1},"first-of-type"(elem,{adapter,equals}){let siblings=adapter.getSiblings(elem),elemName=adapter.getName(elem);for(let i2=0;i2<siblings.length;i2++){let currentSibling=siblings[i2];if(equals(elem,currentSibling))return!0;if(adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===elemName)break}return!1},"last-of-type"(elem,{adapter,equals}){let siblings=adapter.getSiblings(elem),elemName=adapter.getName(elem);for(let i2=siblings.length-1;i2>=0;i2--){let currentSibling=siblings[i2];if(equals(elem,currentSibling))return!0;if(adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===elemName)break}return!1},"only-of-type"(elem,{adapter,equals}){let elemName=adapter.getName(elem);return adapter.getSiblings(elem).every(sibling=>equals(elem,sibling)||!adapter.isTag(sibling)||adapter.getName(sibling)!==elemName)},"only-child"(elem,{adapter,equals}){return adapter.getSiblings(elem).every(sibling=>equals(elem,sibling)||!adapter.isTag(sibling))}};function verifyPseudoArgs(func,name,subselect,argIndex){if(subselect===null){if(func.length>argIndex)throw new Error(`Pseudo-class :${name} requires an argument`)}else if(func.length===argIndex)throw new Error(`Pseudo-class :${name} doesn't have any arguments`)}var aliases={"any-link":":is(a, area, link)[href]",link:":any-link:not(:visited)",disabled:`:is(
|
|
@@ -650,7 +650,7 @@ ${err.message}`):err}}let nNodes=ckt.nodes.count()-1;for(let i2=0;i2<ckt.V.lengt
|
|
|
650
650
|
${error.stack}`),asyncEffect.complete=!0;let root2=this._getRootCircuit();root2&&root2.emit("asyncEffect:end",{asyncEffectId,effectName,componentDisplayName:this.getString(),phase:asyncEffect.phase,error:error.toString()})})}_emitRenderLifecycleEvent(phase,startOrEnd){debug6(`${phase}:${startOrEnd} ${this.getString()}`);let granular_event_type=`renderable:renderLifecycle:${phase}:${startOrEnd}`,eventPayload={renderId:this._renderId,componentDisplayName:this.getString(),type:granular_event_type},root=this._getRootCircuit();root&&(root.emit(granular_event_type,eventPayload),root.emit("renderable:renderLifecycle:anyEvent",{...eventPayload,type:granular_event_type}))}getString(){return this.constructor.name}_hasIncompleteAsyncEffects(){return this._asyncEffects.some(effect=>!effect.complete)?!0:this.children.some(child=>typeof child._hasIncompleteAsyncEffects=="function"?child._hasIncompleteAsyncEffects():!1)}_hasIncompleteAsyncEffectsInSubtreeForPhase(phase){for(let e4 of this._asyncEffects)if(!e4.complete&&e4.phase===phase)return!0;for(let child of this.children)if(child._hasIncompleteAsyncEffectsInSubtreeForPhase(phase))return!0;return!1}_hasIncompleteAsyncEffectsForPhase(phase){let root=this._getRootCircuit();return root?._hasIncompleteAsyncEffectsForPhase?root._hasIncompleteAsyncEffectsForPhase(phase):this._hasIncompleteAsyncEffectsInSubtreeForPhase(phase)}getCurrentRenderPhase(){return this._currentRenderPhase}getRenderGraph(){return{id:this._renderId,currentPhase:this._currentRenderPhase,renderPhaseStates:this.renderPhaseStates,shouldBeRemoved:this.shouldBeRemoved,children:this.children.map(child=>child.getRenderGraph())}}getTopLevelRenderable(){let current2=this;for(;current2.parent&¤t2.parent instanceof _Renderable;)current2=current2.parent;return current2}runRenderCycle(){for(let renderPhase of orderedRenderPhases)this.runRenderPhaseForChildren(renderPhase),this.runRenderPhase(renderPhase)}runRenderPhase(phase){this._currentRenderPhase=phase;let phaseState=this.renderPhaseStates[phase],isInitialized=phaseState.initialized,isDirty2=phaseState.dirty;if(!isInitialized&&this.shouldBeRemoved)return;if(this.shouldBeRemoved&&isInitialized){this._emitRenderLifecycleEvent(phase,"start"),this?.[`remove${phase}`]?.(),phaseState.initialized=!1,phaseState.dirty=!1,this._emitRenderLifecycleEvent(phase,"end");return}let prevPhaseIndex=renderPhaseIndexMap.get(phase)-1;if(prevPhaseIndex>=0){let prevPhase=orderedRenderPhases[prevPhaseIndex];if(this._asyncEffects.filter(e4=>e4.phase===prevPhase).some(e4=>!e4.complete))return}let deps=asyncPhaseDependencies[phase]||[];if(deps.length>0){for(let depPhase of deps)if(this._hasIncompleteAsyncEffectsForPhase(depPhase))return}if(this._emitRenderLifecycleEvent(phase,"start"),isInitialized){isDirty2&&(this?.[`update${phase}`]?.(),phaseState.dirty=!1),this._emitRenderLifecycleEvent(phase,"end");return}phaseState.dirty=!1,this?.[`doInitial${phase}`]?.(),phaseState.initialized=!0,this._emitRenderLifecycleEvent(phase,"end")}runRenderPhaseForChildren(phase){for(let child of this.children)"_isIsolatedSubcircuit"in this&&this._isIsolatedSubcircuit&&"doInitialRenderIsolatedSubcircuits"in this&&phase==="RenderIsolatedSubcircuits"||(child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase))}_getRootCircuit(){return"root"in this?this.root??null:null}renderError(message){throw typeof message=="string"?new Error(message):new Error(JSON.stringify(message,null,2))}},InvalidProps=class extends Error{constructor(componentName,originalProps,formattedError){let message,propsWithError=Object.keys(formattedError).filter(k4=>k4!=="_errors"),invalidPinLabelMessages=[],pinLabels=originalProps.pinLabels;if(pinLabels)for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels:[labelOrLabels];for(let label of labels)typeof label=="string"&&(label.startsWith(" ")||label.endsWith(" "))&&invalidPinLabelMessages.push(`pinLabels.${pin} ("${label}" has leading or trailing spaces)`)}let propMessage=propsWithError.map(k4=>k4==="pinLabels"&&invalidPinLabelMessages.length>0?invalidPinLabelMessages.join(", "):formattedError[k4]._errors[0]?`${k4} (${formattedError[k4]._errors[0]})`:`${k4} (${JSON.stringify(formattedError[k4])})`).join(", ");"name"in originalProps?message=`Invalid props for ${componentName} "${originalProps.name}": ${propMessage}`:"footprint"in originalProps&&typeof originalProps.footprint=="string"?message=`Invalid props for ${componentName} (unnamed ${originalProps.footprint} component): ${propMessage}`:message=`Invalid props for ${componentName} (unnamed): ${propMessage}`,super(message),this.componentName=componentName,this.originalProps=originalProps,this.formattedError=formattedError}},defaultUnits={mm:1};function evaluateCalcString(input2,options){let{knownVariables,units:userUnits}=options,units={...defaultUnits,...userUnits??{}},expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2)),tokens=tokenize2(expr,units);return parseExpression(tokens,knownVariables)}function extractCalcIdentifiers(input2){let expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2));return tokenize2(expr,defaultUnits).filter(token=>token.type==="identifier").map(token=>token.value)}function normalizeLegacyBoundsIdentifierCase(expr){let legacyBoundNameToCamelCase={minx:"minX",maxx:"maxX",miny:"minY",maxy:"maxY"};return expr.replace(/\.(minx|maxx|miny|maxy)\b/gi,(match2,boundName)=>`.${legacyBoundNameToCamelCase[String(boundName).toLowerCase()]??match2.slice(1)}`)}function extractExpression(raw){let trimmed=raw.trim();if(!trimmed.toLowerCase().startsWith("calc"))return trimmed;let match2=trimmed.match(/^calc\s*\((.*)\)$/is);if(!match2)throw new Error(`Invalid calc() expression: "${raw}"`);return match2[1].trim()}function tokenize2(expr,units){let tokens=[],i2=0,isDigit=ch3=>ch3>="0"&&ch3<="9",isIdentStart=ch3=>ch3>="A"&&ch3<="Z"||ch3>="a"&&ch3<="z"||ch3==="_",isIdentChar=ch3=>isIdentStart(ch3)||isDigit(ch3)||ch3===".";for(;i2<expr.length;){let ch3=expr[i2];if(ch3===" "||ch3===" "||ch3===`
|
|
651
651
|
`||ch3==="\r"){i2++;continue}if(isDigit(ch3)||ch3==="."&&i2+1<expr.length&&isDigit(expr[i2+1])){let start=i2;for(i2++;i2<expr.length;){let c3=expr[i2];if(isDigit(c3)||c3===".")i2++;else break}let numberText=expr.slice(start,i2),num=Number(numberText);if(Number.isNaN(num))throw new Error(`Invalid number: "${numberText}"`);let unitStart=i2;for(;i2<expr.length&&/[A-Za-z]/.test(expr[i2]);)i2++;if(i2>unitStart){let unitText=expr.slice(unitStart,i2),factor=units[unitText];if(factor==null)throw new Error(`Unknown unit: "${unitText}"`);num*=factor}tokens.push({type:"number",value:num});continue}if(isIdentStart(ch3)){let start=i2;for(i2++;i2<expr.length&&isIdentChar(expr[i2]);)i2++;let ident=expr.slice(start,i2);tokens.push({type:"identifier",value:ident});continue}if(ch3==="("||ch3===")"){tokens.push({type:"paren",value:ch3}),i2++;continue}if(ch3==="+"||ch3==="-"||ch3==="*"||ch3==="/"){tokens.push({type:"operator",value:ch3}),i2++;continue}throw new Error(`Unexpected character "${ch3}" in expression "${expr}"`)}return tokens}function parseExpression(tokens,vars){let index=0,peek=()=>tokens[index],consume=()=>tokens[index++],parsePrimary=()=>{let token=peek();if(!token)throw new Error("Unexpected end of expression");if(token.type==="number")return consume(),token.value;if(token.type==="identifier"){consume();let value=vars[token.value];if(value==null)throw new Error(`Unknown variable: "${token.value}"`);return value}if(token.type==="paren"&&token.value==="("){consume();let value=parseExpr(),next2=peek();if(!next2||next2.type!=="paren"||next2.value!==")")throw new Error('Expected ")"');return consume(),value}throw new Error(`Unexpected token "${token.value}"`)},parseFactor=()=>{let token=peek();if(token&&token.type==="operator"&&(token.value==="+"||token.value==="-")){consume();let value=parseFactor();return token.value==="+"?value:-value}return parsePrimary()},parseTerm=()=>{let value=parseFactor();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="*"&&token.value!=="/")break;consume();let rhs=parseFactor();token.value==="*"?value*=rhs:value/=rhs}return value},parseExpr=()=>{let value=parseTerm();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="+"&&token.value!=="-")break;consume();let rhs=parseTerm();token.value==="+"?value+=rhs:value-=rhs}return value},result=parseExpr();if(index<tokens.length){let leftover=tokens.slice(index).map(t21=>"value"in t21?t21.value:"?").join(" ");throw new Error(`Unexpected tokens at end of expression: ${leftover}`)}return result}function convertPcbStyleToPcbSx(pcbStyle2){if(!pcbStyle2)return;let sx2={};if(pcbStyle2.silkscreenFontSize!==void 0&&(sx2["& silkscreentext"]={fontSize:pcbStyle2.silkscreenFontSize}),Object.keys(sx2).length!==0)return sx2}function getResolvedPcbSx({parentResolvedPcbSx,pcbStyle:pcbStyle2,ownPcbSx}){let styleSx=convertPcbStyleToPcbSx(pcbStyle2),result={},allKeys=new Set;if(parentResolvedPcbSx)for(let k4 of Object.keys(parentResolvedPcbSx))allKeys.add(k4);if(styleSx)for(let k4 of Object.keys(styleSx))allKeys.add(k4);if(ownPcbSx)for(let k4 of Object.keys(ownPcbSx))allKeys.add(k4);for(let key of allKeys)result[key]={...parentResolvedPcbSx?.[key],...styleSx?.[key],...ownPcbSx?.[key]};return result}function isMatchingSelector(component,selector){let idMatch=selector.match(/^#(\w+)/);if(idMatch)return component.props.id===idMatch[1];let classMatch=selector.match(/^\.(\w+)/);if(classMatch)return component.isMatchingNameOrAlias(classMatch[1]);let[type,...conditions]=selector.split(/(?=[#.[])/);return type==="pin"&&(type="port"),type&&type!=="*"&&component.lowercaseComponentName!==type.toLowerCase()?!1:conditions.every(condition=>{if(condition.startsWith("#"))return component.props.id===condition.slice(1);if(condition.startsWith("."))return component.isMatchingNameOrAlias(condition.slice(1));let match2=condition.match(/\[(\w+)=['"]?(.+?)['"]?\]/);if(!match2)return!0;let[,prop,value]=match2;return component.props[prop].toString()===value})}var cssSelectPrimitiveComponentAdapter={isTag:node=>!0,getParent:node=>node.parent,getChildren:node=>node.children,getName:node=>node.lowercaseComponentName,getAttributeValue:(node,name)=>{if(name==="class"&&"getNameAndAliases"in node)return node.getNameAndAliases().join(" ");if(name==="name"&&node._parsedProps?.name)return node._parsedProps.name;if(node._parsedProps&&name in node._parsedProps){let value=node._parsedProps[name];return typeof value=="string"?value:value!=null?String(value):null}if(name in node){let value=node[name];return typeof value=="string"?value:value!=null?String(value):null}let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node){let value=node[camelCaseName];return typeof value=="string"?value:value!=null?String(value):null}}return null},hasAttrib:(node,name)=>{if(name==="class")return!!node._parsedProps?.name;if(node._parsedProps&&name in node._parsedProps||name in node)return!0;let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node)return!0}return!1},getSiblings:node=>node.parent?node.parent.children:[],prevElementSibling:node=>{if(!node.parent)return null;let siblings=node.parent.children,idx=siblings.indexOf(node);return idx>0?siblings[idx-1]:null},getText:()=>"",removeSubsets:nodes=>nodes.filter((node,i2)=>!nodes.some((other,j4)=>i2!==j4&&other!==node&&other.getDescendants().includes(node))),existsOne:(test,nodes)=>nodes.some(test),findAll:(test,nodes)=>{let result=[],recurse=node=>{test(node)&&result.push(node);for(let child of node.children)recurse(child)};for(let node of nodes)recurse(node);return result},findOne:(test,nodes)=>{for(let node of nodes){if(test(node))return node;let children=node.children;if(children.length>0){let result=cssSelectPrimitiveComponentAdapter.findOne(test,children);if(result)return result}}return null},equals:(a2,b3)=>a2._renderId===b3._renderId,isHovered:elem=>!1,isVisited:elem=>!1,isActive:elem=>!1},cssSelectPrimitiveComponentAdapterWithoutSubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c3=>!c3.isSubcircuit)},cssSelectPrimitiveComponentAdapterOnlySubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c3=>c3.isSubcircuit)},buildPlusMinusNetErrorMessage=(selector,component)=>{let netName=selector.split("net.")[1]?.split(/[ >]/)[0]??selector;return`Net names cannot contain "+" or "-" (component "${component?.componentName??"Unknown component"}" received "${netName}" via "${selector}"). Try using underscores instead, e.g. VCC_P`},preprocessSelector=(selector,component)=>{if(/net\.[^\s>]*\./.test(selector))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(selector))throw new Error(buildPlusMinusNetErrorMessage(selector,component));if(/net\.[0-9]/.test(selector)){let match2=selector.match(/net\.([^ >]+)/),netName=match2?match2[1]:"";throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}return selector.replace(/ pin(?=[\d.])/g," port").replace(/ subcircuit\./g," group[isSubcircuit=true]").replace(/([^ ])\>([^ ])/g,"$1 > $2").replace(/(^|[ >])(?!pin\.)(?!port\.)(?!net\.)([A-Z][A-Za-z0-9_-]*)\.([A-Za-z0-9_-]+)/g,(_5,sep,name,pin)=>{let pinPart=/^\d+$/.test(pin)?`pin${pin}`:pin;return`${sep}.${name} > .${pinPart}`}).trim()},cssSelectOptionsInsideSubcircuit={adapter:cssSelectPrimitiveComponentAdapterWithoutSubcircuits,cacheResults:!0},PrimitiveComponent2=class extends Renderable{constructor(props){super(props);__publicField(this,"parent",null);__publicField(this,"children");__publicField(this,"childrenPendingRemoval");__publicField(this,"props");__publicField(this,"_parsedProps");__publicField(this,"externallyAddedAliases");__publicField(this,"isPrimitiveContainer",!1);__publicField(this,"canHaveTextChildren",!1);__publicField(this,"source_group_id",null);__publicField(this,"source_component_id",null);__publicField(this,"schematic_component_id",null);__publicField(this,"pcb_component_id",null);__publicField(this,"cad_component_id",null);__publicField(this,"fallbackUnassignedName");__publicField(this,"_cachedSelectAllQueries",new Map);__publicField(this,"_cachedSelectOneQueries",new Map);this.children=[],this.childrenPendingRemoval=[],this.props=props??{},this.externallyAddedAliases=[];let parsePropsResult=("partial"in this.config.zodProps?this.config.zodProps.partial({name:!0}):this.config.zodProps).safeParse(props??{});if(parsePropsResult.success)this._parsedProps=parsePropsResult.data;else throw new InvalidProps(this.lowercaseComponentName,this.props,parsePropsResult.error.format())}get config(){return{componentName:"",zodProps:external_exports.object({}).passthrough()}}get componentName(){return this.config.componentName}getInheritedProperty(propertyName){let current2=this;for(;current2;){if(current2._parsedProps&&propertyName in current2._parsedProps)return current2._parsedProps[propertyName];current2=current2.parent}if(this.root?.platform&&propertyName in this.root.platform)return this.root.platform[propertyName]}getInheritedMergedProperty(propertyName){let parentPropertyObject=this.parent?.getInheritedMergedProperty?.(propertyName),myPropertyObject=this._parsedProps?.[propertyName];return{...parentPropertyObject,...myPropertyObject}}getResolvedPcbSx(){return getResolvedPcbSx({parentResolvedPcbSx:this.parent?.getResolvedPcbSx?.(),pcbStyle:this._parsedProps?.pcbStyle,ownPcbSx:this._parsedProps?.pcbSx})}get lowercaseComponentName(){return this.componentName.toLowerCase()}get isSubcircuit(){return!!this.props.subcircuit||this.lowercaseComponentName==="group"&&this?.parent?.isRootCircuit}get isGroup(){return this.lowercaseComponentName==="group"}get name(){return this._parsedProps.name??this.fallbackUnassignedName}setProps(props){let newProps=this.config.zodProps.parse({...this.props,...props}),oldProps=this.props;this.props=newProps,this._parsedProps=this.config.zodProps.parse(props),this.onPropsChange({oldProps,newProps,changedProps:Object.keys(props)}),this.parent?.onChildChanged?.(this)}_getPcbRotationBeforeLayout(){let{pcbRotation}=this.props;return typeof pcbRotation=="string"?parseFloat(pcbRotation):pcbRotation??null}getResolvedPcbPositionProp(){return{pcbX:this._resolvePcbCoordinate(this._parsedProps.pcbX,"pcbX"),pcbY:this._resolvePcbCoordinate(this._parsedProps.pcbY,"pcbY")}}_resolvePcbCoordinate(rawValue,axis,options={}){if(rawValue==null)return 0;if(typeof rawValue=="number")return rawValue;if(typeof rawValue!="string")throw new Error(`Invalid ${axis} value for ${this.componentName}: ${String(rawValue)}`);let allowBoardVariables=options.allowBoardVariables??this._isNormalComponent===!0,allowComponentVariables=options.allowComponentVariables??!1,includesBoardVariable=rawValue.includes("board."),knownVariables={};if(allowBoardVariables){let board=this._getBoard(),boardVariables=board?._getBoardCalcVariables()??{};if(includesBoardVariable&&!board)throw new Error(`Cannot resolve ${axis} for ${this.componentName}: no board found for board.* variables`);if(includesBoardVariable&&board&&Object.keys(boardVariables).length===0)throw new Error("Cannot do calculations based on board size when the board is auto-sized");Object.assign(knownVariables,boardVariables)}allowComponentVariables&&Object.assign(knownVariables,options.componentVariables??{});try{return extractCalcIdentifiers(rawValue).some(identifier=>!identifier.startsWith("board."))&&!allowComponentVariables?0:evaluateCalcString(rawValue,{knownVariables})}catch(error){let message=error instanceof Error?error.message:String(error);throw new Error(`Invalid ${axis} value for ${this.componentName}: ${message}`)}}resolvePcbCoordinate(rawValue,axis,options={}){return this._resolvePcbCoordinate(rawValue,axis,options)}computePcbPropsTransform(){let rotation4=this._getPcbRotationBeforeLayout()??0,{pcbX,pcbY}=this.getResolvedPcbPositionProp();return compose2(translate2(pcbX,pcbY),rotate2(rotation4*Math.PI/180))}_computePcbGlobalTransformBeforeLayout(){let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if(manualPlacement&&this.props.pcbX===void 0&&this.props.pcbY===void 0){let rotation4=this._getPcbRotationBeforeLayout()??0;return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),compose2(translate2(manualPlacement.x,manualPlacement.y),rotate2(rotation4*Math.PI/180)))}if(this.isPcbPrimitive){let primitiveContainer=this.getPrimitiveContainer();if(primitiveContainer&&primitiveContainer._parsedProps.layer==="bottom")return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),flipY(),this.computePcbPropsTransform())}return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),this.computePcbPropsTransform())}getPrimitiveContainer(){return this.isPrimitiveContainer?this:this.parent?.getPrimitiveContainer?.()??null}_getSymbolAncestor(){let container=this.getPrimitiveContainer();return container?.componentName==="Symbol"?container:null}getParentNormalComponent(){let current2=this.parent;for(;current2;){if(current2.isPrimitiveContainer&¤t2.doInitialPcbComponentRender)return current2;current2=current2.parent}return null}emitSolderMaskMarginWarning(isCoveredWithSolderMask,solderMaskMargin){if(isCoveredWithSolderMask&&solderMaskMargin!==void 0){let parentNormalComponent=this.getParentNormalComponent();parentNormalComponent?.source_component_id&&this.root.db.source_property_ignored_warning.insert({source_component_id:parentNormalComponent.source_component_id,property_name:"solderMaskMargin",message:"solderMaskMargin is set but coveredWithSolderMask is true. When a component is fully covered with solder mask, a margin doesn't apply.",error_type:"source_property_ignored_warning"})}}_getPcbCircuitJsonBounds(){return{center:{x:0,y:0},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getPcbPrimitiveFlippedHelpers(){let container=this.getPrimitiveContainer(),isFlipped=container?container._parsedProps.layer==="bottom":!1;return{isFlipped,maybeFlipLayer:layer=>isFlipped?layer==="top"?"bottom":"top":layer}}_setPositionFromLayout(newCenter){throw new Error(`_setPositionFromLayout not implemented for ${this.componentName}`)}computeSchematicPropsTransform(){let{_parsedProps:props}=this;return compose2(translate2(props.schX??0,props.schY??0))}computeSchematicGlobalTransform(){let manualPlacementTransform=this._getSchematicGlobalManualPlacementTransform(this);return manualPlacementTransform||compose2(this.parent?.computeSchematicGlobalTransform?.()??identity(),this.computeSchematicPropsTransform())}_getSchematicSymbolName(){let{_parsedProps:props}=this,base_symbol_name=this.config.schematicSymbolName,orientationRotationMap={horizontal:0,pos_left:0,neg_right:0,pos_right:180,neg_left:180,pos_top:270,neg_bottom:90,vertical:270,pos_bottom:90,neg_top:90},normalizedRotation=props.schOrientation!==void 0?orientationRotationMap[props.schOrientation]:props.schRotation;if(normalizedRotation===void 0&&(normalizedRotation=0),normalizedRotation=normalizedRotation%360,normalizedRotation<0&&(normalizedRotation+=360),props.schRotation!==void 0&&normalizedRotation%90!==0)throw new Error(`Schematic rotation ${props.schRotation} is not supported for ${this.componentName}`);let symbol_name_horz=`${base_symbol_name}_horz`,symbol_name_vert=`${base_symbol_name}_vert`,symbol_name_up=`${base_symbol_name}_up`,symbol_name_down=`${base_symbol_name}_down`,symbol_name_left=`${base_symbol_name}_left`,symbol_name_right=`${base_symbol_name}_right`;if(symbol_name_right in Vf&&normalizedRotation===0)return symbol_name_right;if(symbol_name_up in Vf&&normalizedRotation===90)return symbol_name_up;if(symbol_name_left in Vf&&normalizedRotation===180)return symbol_name_left;if(symbol_name_down in Vf&&normalizedRotation===270)return symbol_name_down;if(symbol_name_horz in Vf&&(normalizedRotation===0||normalizedRotation===180))return symbol_name_horz;if(symbol_name_vert in Vf&&(normalizedRotation===90||normalizedRotation===270))return symbol_name_vert;if(base_symbol_name in Vf)return base_symbol_name}_getSchematicSymbolNameOrThrow(){let symbol_name=this._getSchematicSymbolName();if(!symbol_name)throw new Error(`No schematic symbol found (given: "${this.config.schematicSymbolName}")`);return symbol_name}getSchematicSymbol(){let symbol_name=this._getSchematicSymbolName();return symbol_name?Vf[symbol_name]??null:null}_getPcbManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits?.pcb_placements;if(!placementConfigPositions)return null;for(let position2 of placementConfigPositions)if(isMatchingSelector(component,position2.selector)||component.props.name===position2.selector)return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),position2.center);return null}_getSchematicManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits.schematic_placements;if(!placementConfigPositions)return null;for(let position2 of placementConfigPositions)if(isMatchingSelector(component,position2.selector)||component.props.name===position2.selector)return applyToPoint2(this.computeSchematicGlobalTransform(),position2.center);return null}_getSchematicGlobalManualPlacementTransform(component){let manualEdits=this.getSubcircuit()?._parsedProps.manualEdits;if(!manualEdits)return null;for(let position2 of manualEdits.schematic_placements??[])if((isMatchingSelector(component,position2.selector)||component.props.name===position2.selector)&&position2.relative_to==="group_center")return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),translate2(position2.center.x,position2.center.y));return null}_getGlobalPcbPositionBeforeLayout(){return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),{x:0,y:0})}_getGlobalSchematicPositionBeforeLayout(){return applyToPoint2(this.computeSchematicGlobalTransform(),{x:0,y:0})}_getBoard(){let current2=this;for(;current2;){let maybePrimitive=current2,componentName=maybePrimitive.componentName;if(componentName==="Board"||componentName==="MountedBoard")return maybePrimitive;current2=current2.parent??null}return this.root?._getBoard()}get root(){return this.parent?.root??null}onAddToParent(parent){this.parent=parent}onPropsChange(params){}onChildChanged(child){this.parent?.onChildChanged?.(child)}add(component){let textContent2=component.__text;if(typeof textContent2=="string"){if(this.canHaveTextChildren||textContent2.trim()==="")return;throw new Error(`Invalid JSX Element: Expected a React component but received text "${textContent2}"`)}if(Object.keys(component).length!==0){if(component.lowercaseComponentName==="panel")throw new Error("<panel> must be a root-level element");if(!component.onAddToParent)throw new Error(`Invalid JSX Element: Expected a React component but received "${JSON.stringify(component)}"`);component.onAddToParent(this),component.parent=this,this.children.push(component)}}addAll(components){for(let component of components)this.add(component)}remove(component){this.children=this.children.filter(c3=>c3!==component),this.childrenPendingRemoval.push(component),component.shouldBeRemoved=!0}getSubcircuitSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName;return!this.parent||this.parent.isSubcircuit?endPart:`${this.parent.getSubcircuitSelector()} > ${endPart}`}getFullPathSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName,parentSelector=this.parent?.getFullPathSelector?.();return parentSelector?`${parentSelector} > ${endPart}`:endPart}getNameAndAliases(){return[this.name,...this._parsedProps.portHints??[]].filter(Boolean)}isMatchingNameOrAlias(name){return this.getNameAndAliases().includes(name)}isMatchingAnyOf(aliases2){return this.getNameAndAliases().some(a2=>aliases2.map(a22=>a22.toString()).includes(a2))}getPcbSize(){throw new Error(`getPcbSize not implemented for ${this.componentName}`)}doesSelectorMatch(selector){let myTypeNames=[this.componentName,this.lowercaseComponentName],myClassNames=[this.name].filter(Boolean),parts=selector.trim().split(/\> /)[0],firstPart=parts[0];return parts.length>1?!1:!!(selector==="*"||selector[0]==="#"&&selector.slice(1)===this.props.id||selector[0]==="."&&myClassNames.includes(selector.slice(1))||/^[a-zA-Z0-9_]/.test(firstPart)&&myTypeNames.includes(firstPart))}getSubcircuit(){if(this.isSubcircuit)return this;let group=this.parent?.getSubcircuit?.();if(!group)throw new Error("Component is not inside an opaque group (no board?)");return group}getGroup(){return this.isGroup?this:this.parent?.getGroup?.()??null}doInitialAssignNameToUnnamedComponents(){this._parsedProps.name||(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialOptimizeSelectorCache(){if(!this.isSubcircuit)return;let ports=this.selectAll("port");for(let port of ports){let parentAliases=(port.getParentNormalComponent?.()??port.parent)?.getNameAndAliases(),portAliases=port.getNameAndAliases();if(parentAliases)for(let parentAlias of parentAliases)for(let portAlias of portAliases){let selectors=[`.${parentAlias} > .${portAlias}`,`.${parentAlias} .${portAlias}`];for(let selector of selectors){let ar4=this._cachedSelectAllQueries.get(selector);ar4?ar4.push(port):this._cachedSelectAllQueries.set(selector,[port])}}}for(let[selector,ports2]of this._cachedSelectAllQueries.entries())ports2.length===1&&this._cachedSelectOneQueries.set(selector,ports2[0])}selectAll(selectorRaw){if(this._cachedSelectAllQueries.has(selectorRaw))return this._cachedSelectAllQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this),result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit);if(result.length>0)return this._cachedSelectAllQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});if(!subcircuit)return[];let result2=subcircuit.selectAll(rest.join(" "));return this._cachedSelectAllQueries.set(selectorRaw,result2),result2}selectOne(selectorRaw,options){if(this._cachedSelectOneQueries.has(selectorRaw))return this._cachedSelectOneQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this);options?.port&&(options.type="port");let result=null;if(options?.type&&(result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit).find(n3=>n3.lowercaseComponentName===options.type)),result??(result=selectOne(selector,this,cssSelectOptionsInsideSubcircuit)),result)return this._cachedSelectOneQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});return subcircuit?(result=subcircuit.selectOne(rest.join(" "),options),this._cachedSelectOneQueries.set(selectorRaw,result),result):null}getAvailablePcbLayers(){if(this.isPcbPrimitive){let{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers();return"layer"in this._parsedProps||this.componentName==="SmtPad"?[maybeFlipLayer(this._parsedProps.layer??"top")]:"layers"in this._parsedProps?this._parsedProps.layers:this.componentName==="PlatedHole"?[...this.root?._getBoard()?.allLayers??["top","bottom"]]:[]}return[]}getDescendants(){let descendants=[];for(let child of this.children)descendants.push(child),descendants.push(...child.getDescendants());return descendants}getSelectableDescendants(){let descendants=[];for(let child of this.children)child.isSubcircuit?descendants.push(child):(descendants.push(child),descendants.push(...child.getSelectableDescendants()));return descendants}_getPinCount(){return 0}_getSchematicBoxDimensions(){return null}_getSchematicBoxComponentDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this;return{schWidth:props.schWidth,schHeight:props.schHeight}}renderError(message){if(typeof message=="string")return super.renderError(message);switch(message.type){case"pcb_placement_error":this.root?.db.pcb_placement_error.insert(message);break;case"pcb_via_clearance_error":this.root?.db.pcb_via_clearance_error.insert(message);break;case"pcb_trace_error":this.root?.db.pcb_trace_error.insert(message);break;case"pcb_manual_edit_conflict_warning":this.root?.db.pcb_manual_edit_conflict_warning.insert(message);break;default:this.root?.db.pcb_placement_error.insert(message)}}getString(){let{lowercaseComponentName:cname,_parsedProps:props,parent}=this;return props?.pinNumber!==void 0&&parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(pin:${props.pinNumber} .${parent?.props.name}>.${props.name}) />`:parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(.${parent?.props.name}>.${props?.name}) />`:props?.from&&props?.to?`<${cname}#${this._renderId}(from:${props.from} to:${props?.to}) />`:props?.name?`<${cname}#${this._renderId} name=".${props?.name}" />`:props?.portHints?`<${cname}#${this._renderId}(${props.portHints.map(ph3=>`.${ph3}`).join(", ")}) />`:`<${cname}#${this._renderId} />`}get[Symbol.toStringTag](){return this.getString()}[Symbol.for("nodejs.util.inspect.custom")](){return this.getString()}};function pairs2(arr){let result=[];for(let i2=0;i2<arr.length-1;i2++)result.push([arr[i2],arr[i2+1]]);return result}var netProps2=external_exports.object({name:external_exports.string().refine(val=>!/[+-]/.test(val),val=>({message:`Net names cannot contain "+" or "-" (component "Net" received "${val}"). Try using underscores instead, e.g. VCC_P`}))}),Net=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_id");__publicField(this,"subcircuit_connectivity_map_key",null)}get config(){return{componentName:"Net",zodProps:netProps2}}getPortSelector(){return`net.${this.props.name}`}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,isGround=props.name.startsWith("GND"),isPositiveVoltageSource=props.name.startsWith("V"),net=db.source_net.insert({name:props.name,member_source_group_ids:[],is_ground:isGround,is_power:isPositiveVoltageSource,is_positive_voltage_source:isPositiveVoltageSource});this.source_net_id=net.source_net_id}doInitialSourceParentAttachment(){let subcircuit=this.getSubcircuit();if(!subcircuit)return;let{db}=this.root;db.source_net.update(this.source_net_id,{subcircuit_id:subcircuit.subcircuit_id})}getAllConnectedPorts(){let allPorts=this.getSubcircuit().selectAll("port"),connectedPorts=[];for(let port of allPorts){let traces=port._getDirectlyConnectedTraces();for(let trace of traces)if(trace._isExplicitlyConnectedToNet(this)){connectedPorts.push(port);break}}return connectedPorts}_getAllDirectlyConnectedTraces(){let allTraces=this.getSubcircuit().selectAll("trace"),connectedTraces=[];for(let trace of allTraces)trace._isExplicitlyConnectedToNet(this)&&connectedTraces.push(trace);return connectedTraces}doInitialPcbRouteNetIslands(){if(this.root?.pcbDisabled||this.getSubcircuit()._parsedProps.routingDisabled||this.getSubcircuit()._isInflatedFromCircuitJson||this.getSubcircuit()._getAutorouterConfig().groupMode!=="sequential-trace")return;let{db}=this.root,{_parsedProps:props}=this,traces=this._getAllDirectlyConnectedTraces().filter(trace=>(trace._portsRoutedOnPcb?.length??0)>0),islands=[];for(let trace of traces){let tracePorts=trace._portsRoutedOnPcb,traceIsland=islands.find(island=>tracePorts.some(port=>island.ports.includes(port)));if(!traceIsland){islands.push({ports:[...tracePorts],traces:[trace]});continue}traceIsland.traces.push(trace),traceIsland.ports.push(...tracePorts)}if(islands.length===0)return;let islandPairs=pairs2(islands);for(let[A4,B5]of islandPairs){let Apositions=A4.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),Bpositions=B5.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),closestDist=1/0,closestPair=[-1,-1];for(let i2=0;i2<Apositions.length;i2++){let Apos=Apositions[i2];for(let j4=0;j4<Bpositions.length;j4++){let Bpos=Bpositions[j4],dist=Math.sqrt((Apos.x-Bpos.x)**2+(Apos.y-Bpos.y)**2);dist<closestDist&&(closestDist=dist,closestPair=[i2,j4])}}let Aport=A4.ports[closestPair[0]],Bport=B5.ports[closestPair[1]],pcbElements=db.toArray().filter(elm=>elm.type==="pcb_smtpad"||elm.type==="pcb_trace"||elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="source_port"||elm.type==="pcb_port"),{solution}=autoroute2(pcbElements.concat([{type:"source_trace",source_trace_id:"__net_trace_tmp",connected_source_port_ids:[Aport.source_port_id,Bport.source_port_id]}])),trace=solution[0];if(!trace){this.renderError({pcb_trace_error_id:"",pcb_trace_id:"__net_trace_tmp",pcb_component_ids:[Aport.pcb_component_id,Bport.pcb_component_id].filter(Boolean),pcb_port_ids:[Aport.pcb_port_id,Bport.pcb_port_id].filter(Boolean),type:"pcb_trace_error",error_type:"pcb_trace_error",message:`Failed to route net islands for "${this.getString()}"`,source_trace_id:"__net_trace_tmp"});return}db.pcb_trace.insert(trace)}}renderError(message){if(typeof message=="string")return super.renderError(message);this.root?.db.pcb_trace_error.insert(message)}},createNetsFromProps=(component,props)=>{for(let prop of props)if(typeof prop=="string"&&prop.startsWith("net.")){if(/net\.[^\s>]*\./.test(prop))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(prop)){let netName=prop.split("net.")[1],message=`Net names cannot contain "+" or "-" (component "${component.componentName}" received "${netName}" via "${prop}"). Try using underscores instead, e.g. VCC_P`;throw new Error(message)}if(/net\.[0-9]/.test(prop)){let netName=prop.split("net.")[1];throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}let subcircuit=component.getSubcircuit();if(!subcircuit.selectOne(prop)){let net=new Net({name:prop.split("net.")[1]});subcircuit.add(net)}}},getDistance=(a2,b3)=>{let aPos="_getGlobalPcbPositionBeforeLayout"in a2?a2._getGlobalPcbPositionBeforeLayout():a2,bPos="_getGlobalPcbPositionBeforeLayout"in b3?b3._getGlobalPcbPositionBeforeLayout():b3;return Math.sqrt((aPos.x-bPos.x)**2+(aPos.y-bPos.y)**2)};function getClosest(point6,candidates){if(candidates.length===0)throw new Error("No candidates given to getClosest method");let closest=candidates[0],closestDist=1/0;for(let candidate of candidates){let dist=getDistance(point6,candidate);dist<closestDist&&(closest=candidate,closestDist=dist)}return closest}var countComplexElements=(junctions,edges)=>{let count=0;count+=junctions.length??0,count+=edges.filter(edge=>edge.is_crossing).length;for(let i2=1;i2<edges.length;i2++){let prev=edges[i2-1],curr=edges[i2],prevVertical=Math.abs(prev.from.x-prev.to.x)<.01,currVertical=Math.abs(curr.from.x-curr.to.x)<.01;prevVertical!==currVertical&&count++}return count},getEnteringEdgeFromDirection=direction2=>({up:"bottom",down:"top",left:"right",right:"left"})[direction2]??null,getStubEdges=({firstEdge,firstEdgePort,firstDominantDirection,lastEdge,lastEdgePort,lastDominantDirection})=>{if(firstEdge&&firstEdgePort)return getStubEdges({lastEdge:{from:firstEdge.to,to:firstEdge.from},lastEdgePort:firstEdgePort,lastDominantDirection:firstDominantDirection}).reverse().map(e4=>({from:e4.to,to:e4.from}));let edges=[];if(lastEdge&&lastEdgePort){let intermediatePoint={x:lastEdge.to.x,y:lastEdge.to.y};lastDominantDirection==="left"||lastDominantDirection==="right"?(intermediatePoint.x=lastEdgePort.position.x,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}})):(intermediatePoint.y=lastEdgePort.position.y,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}}))}return edges=edges.filter(e4=>distance2(e4.from,e4.to)>.01),edges};function tryNow(fn3){try{return[fn3(),null]}catch(e4){return[null,e4]}}var getMaxLengthFromConnectedCapacitors=(ports,{db})=>{let capacitorMaxLengths=ports.map(port=>{let sourcePort=db.source_port.get(port.source_port_id);if(!sourcePort?.source_component_id)return null;let sourceComponent=db.source_component.get(sourcePort.source_component_id);return sourceComponent?.ftype==="simple_capacitor"?sourceComponent.max_decoupling_trace_length:null}).filter(length7=>length7!==null);if(capacitorMaxLengths.length!==0)return Math.min(...capacitorMaxLengths)};function getTraceDisplayName({ports,nets}){if(ports.length>=2)return`${ports[0]?.selector} to ${ports[1]?.selector}`;if(ports.length===1&&nets.length===1)return`${ports[0]?.selector} to net.${nets[0]._parsedProps.name}`}var getPcbBoardOutlinePolygon=pcbBoard=>pcbBoard.outline&&pcbBoard.outline.length>0?new Polygon$1(pcbBoard.outline.map(p4=>point4(p4.x,p4.y))):new Polygon$1(new Box(pcbBoard.center.x-pcbBoard.width/2,pcbBoard.center.y-pcbBoard.height/2,pcbBoard.center.x+pcbBoard.width/2,pcbBoard.center.y+pcbBoard.height/2).toPoints()),isRouteOutsideBoard=({mergedRoute,db,pcbBoardId})=>{let pcbBoard=db.pcb_board.get(pcbBoardId);if(!pcbBoard)return!1;let boardOutlinePolygon=getPcbBoardOutlinePolygon(pcbBoard);return!mergedRoute.flat().every(routePoint=>boardOutlinePolygon.contains(point4(routePoint.x,routePoint.y)))},isCloseTo2=(a2,b3)=>Math.abs(a2-b3)<1e-4,getObstaclesFromRoute2=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i2=0;i2<route.length-1;i2++){let[start,end]=[route[i2],route[i2+1]],prev=i2-1>=0?route[i2-1]:null,isHorz=isCloseTo2(start.y,end.y),isVert=isCloseTo2(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles};function generateApproximatingRects2(rotatedRect,numRects=2){let{center:center2,width,height,rotation:rotation4}=rotatedRect,rects=[],angleRad=rotation4*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),normalizedRotation=(rotation4%360+360)%360;if(height<=width?normalizedRotation>=45&&normalizedRotation<135||normalizedRotation>=225&&normalizedRotation<315:normalizedRotation>=135&&normalizedRotation<225||normalizedRotation>=315||normalizedRotation<45){let sliceWidth=width/numRects;for(let i2=0;i2<numRects;i2++){let x5=(i2-numRects/2+.5)*sliceWidth,rotatedX=-x5*cosAngle,rotatedY=-x5*sinAngle,coverageWidth=sliceWidth*1.1,coverageHeight=Math.abs(height*cosAngle)+Math.abs(sliceWidth*sinAngle);rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}else{let sliceHeight=height/numRects;for(let i2=0;i2<numRects;i2++){let y5=(i2-numRects/2+.5)*sliceHeight,rotatedX=-y5*sinAngle,rotatedY=y5*cosAngle,coverageWidth=Math.abs(width*cosAngle)+Math.abs(sliceHeight*sinAngle),coverageHeight=sliceHeight*1.1;rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}return rects}function fillPolygonWithRects(polygon2,options={}){if(polygon2.length<3)return[];let{rectHeight=.1}=options,rects=[],yCoords=polygon2.map(p4=>p4.y),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);for(let y5=minY;y5<maxY;y5+=rectHeight){let scanlineY=y5+rectHeight/2,intersections=[];for(let i2=0;i2<polygon2.length;i2++){let p12=polygon2[i2],p22=polygon2[(i2+1)%polygon2.length];if(p12.y<=scanlineY&&p22.y>scanlineY||p22.y<=scanlineY&&p12.y>scanlineY){let x5=(scanlineY-p12.y)*(p22.x-p12.x)/(p22.y-p12.y)+p12.x;intersections.push(x5)}}intersections.sort((a2,b3)=>a2-b3);for(let i2=0;i2<intersections.length;i2+=2)if(i2+1<intersections.length){let x12=intersections[i2],width=intersections[i2+1]-x12;width>1e-6&&rects.push({center:{x:x12+width/2,y:scanlineY},width,height:rectHeight})}}return rects}function fillCircleWithRects(circle2,options={}){let{center:center2,radius}=circle2,{rectHeight=.1}=options,rects=[],numSlices=Math.ceil(radius*2/rectHeight);for(let i2=0;i2<numSlices;i2++){let y5=center2.y-radius+(i2+.5)*rectHeight,dy2=y5-center2.y,halfWidth=Math.sqrt(radius*radius-dy2*dy2);halfWidth>0&&rects.push({center:{x:center2.x,y:y5},width:halfWidth*2,height:rectHeight})}return rects}var EVERY_LAYER2=["top","inner1","inner2","bottom"],getObstaclesFromCircuitJson2=(soup,connMap)=>{let withNetId=idList=>connMap?idList.concat(idList.map(id2=>connMap?.getNetConnectedToId(id2)).filter(Boolean)):idList,obstacles=[];for(let element of soup)if(element.type==="pcb_smtpad"){if(element.shape==="circle")obstacles.push({type:"oval",layers:[element.layer],center:{x:element.x,y:element.y},width:element.radius*2,height:element.radius*2,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rect")obstacles.push({type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rotated_rect"){let rotatedRect={center:{x:element.x,y:element.y},width:element.width,height:element.height,rotation:element.ccw_rotation},approximatingRects=generateApproximatingRects2(rotatedRect);for(let rect of approximatingRects)obstacles.push({type:"rect",layers:[element.layer],center:rect.center,width:rect.width,height:rect.height,connectedTo:withNetId([element.pcb_smtpad_id])})}}else if(element.type==="pcb_keepout")element.shape==="circle"?obstacles.push({type:"oval",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.radius*2,height:element.radius*2,connectedTo:[]}):element.shape==="rect"&&obstacles.push({type:"rect",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.type==="pcb_cutout"){if(element.shape==="rect")obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.shape==="circle"){let approximatingRects=fillCircleWithRects({center:element.center,radius:element.radius},{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}else if(element.shape==="polygon"){let approximatingRects=fillPolygonWithRects(element.points,{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}}else if(element.type==="pcb_hole")element.hole_shape==="oval"?obstacles.push({type:"oval",center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="rect"?obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="square"?obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]}):(element.hole_shape==="round"||element.hole_shape==="circle")&&obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]});else if(element.type==="pcb_plated_hole"){if(element.shape==="circle")obstacles.push({type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_diameter,height:element.outer_diameter,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="circular_hole_with_rect_pad")obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.rect_pad_width,height:element.rect_pad_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="oval"||element.shape==="pill")obstacles.push({type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="hole_with_polygon_pad"&&"pad_outline"in element&&element.pad_outline&&element.pad_outline.length>0){let xs3=element.pad_outline.map(p4=>element.x+p4.x),ys3=element.pad_outline.map(p4=>element.y+p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),centerX=(minX+maxX)/2,centerY=(minY+maxY)/2;obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:centerX,y:centerY},width:maxX-minX,height:maxY-minY,connectedTo:withNetId([element.pcb_plated_hole_id])})}}else if(element.type==="pcb_trace"){let traceObstacles=getObstaclesFromRoute2(element.route.map(rp2=>({x:rp2.x,y:rp2.y,layer:"layer"in rp2?rp2.layer:rp2.from_layer})),element.source_trace_id);obstacles.push(...traceObstacles)}else if(element.type==="pcb_via"){let netIsAssignable=!!(element.net_is_assignable??element.netIsAssignable);obstacles.push({type:"rect",layers:element.layers,center:{x:element.x,y:element.y},connectedTo:[],width:element.outer_diameter,height:element.outer_diameter,netIsAssignable:netIsAssignable||void 0})}return obstacles},computeSchematicNetLabelCenter=({anchor_position,anchor_side,text,font_size=.18})=>{let charWidth=.1*(font_size/.18),width=text.length*charWidth,height=font_size,center2={...anchor_position};switch(anchor_side){case"right":center2.x-=width/2;break;case"left":center2.x+=width/2;break;case"top":center2.y-=height/2;break;case"bottom":center2.y+=height/2;break}return center2},getOtherSchematicTraces=({db,source_trace_id,sameNetOnly,differentNetOnly})=>{!sameNetOnly&&!differentNetOnly&&(differentNetOnly=!0);let mySourceTrace=db.source_trace.get(source_trace_id),traces=[];for(let otherSchematicTrace of db.schematic_trace.list()){if(otherSchematicTrace.source_trace_id===source_trace_id)continue;let isSameNet=db.source_trace.get(otherSchematicTrace.source_trace_id)?.subcircuit_connectivity_map_key===mySourceTrace.subcircuit_connectivity_map_key;differentNetOnly&&isSameNet||sameNetOnly&&!isSameNet||traces.push(otherSchematicTrace)}return traces},createSchematicTraceCrossingSegments=({edges:inputEdges,otherEdges})=>{let edges=[...inputEdges];for(let i2=0;i2<edges.length;i2++){if(i2>2e3)throw new Error("Over 2000 iterations spent inside createSchematicTraceCrossingSegments, you have triggered an infinite loop, please report this!");let edge=edges[i2],edgeOrientation=Math.abs(edge.from.x-edge.to.x)<.01?"vertical":edge.from.y===edge.to.y?"horizontal":"not-orthogonal";if(edgeOrientation==="not-orthogonal")continue;let otherEdgesIntersections=[];for(let otherEdge of otherEdges){let otherOrientation=otherEdge.from.x===otherEdge.to.x?"vertical":otherEdge.from.y===otherEdge.to.y?"horizontal":"not-orthogonal";if(otherOrientation==="not-orthogonal"||edgeOrientation===otherOrientation)continue;if(doesLineIntersectLine([edge.from,edge.to],[otherEdge.from,otherEdge.to],{lineThickness:.01})){let intersectX=edgeOrientation==="vertical"?edge.from.x:otherEdge.from.x,intersectY=edgeOrientation==="vertical"?otherEdge.from.y:edge.from.y,crossingPoint2={x:intersectX,y:intersectY};otherEdgesIntersections.push({otherEdge,crossingPoint:crossingPoint2,distanceFromEdgeFrom:distance2(edge.from,crossingPoint2)})}}if(otherEdgesIntersections.length===0)continue;let closestIntersection=otherEdgesIntersections[0];for(let intersection of otherEdgesIntersections)intersection.distanceFromEdgeFrom<closestIntersection.distanceFromEdgeFrom&&(closestIntersection=intersection);let crossingPoint=closestIntersection.crossingPoint,crossingSegmentLength=.075;if(crossingPoint.x===edge.from.x&&crossingPoint.y===edge.from.y)continue;let crossingUnitVec=getUnitVectorFromPointAToB(edge.from,crossingPoint),beforeCrossing={x:crossingPoint.x-crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y-crossingUnitVec.y*crossingSegmentLength/2},afterCrossing={x:crossingPoint.x+crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y+crossingUnitVec.y*crossingSegmentLength/2},overshot=distance2(afterCrossing,edge.to)<crossingSegmentLength,newEdges=[{from:edge.from,to:beforeCrossing},{from:beforeCrossing,to:afterCrossing,is_crossing:!0},{from:afterCrossing,to:edge.to}];edges.splice(i2,1,...newEdges),i2+=newEdges.length-2,overshot&&i2++}return edges},TOLERANCE=.001,isPointWithinEdge=(point6,edge)=>{let minX=Math.min(edge.from.x,edge.to.x),maxX=Math.max(edge.from.x,edge.to.x),minY=Math.min(edge.from.y,edge.to.y),maxY=Math.max(edge.from.y,edge.to.y);return point6.x>=minX&&point6.x<=maxX&&point6.y>=minY&&point6.y<=maxY},getEdgeOrientation=edge=>{let isVertical3=Math.abs(edge.from.x-edge.to.x)<TOLERANCE,isHorizontal2=Math.abs(edge.from.y-edge.to.y)<TOLERANCE;return isVertical3?"vertical":isHorizontal2?"horizontal":"diagonal"},getIntersectionPoint=(edge1,edge2)=>{let orientation1=getEdgeOrientation(edge1),orientation22=getEdgeOrientation(edge2);if(orientation1===orientation22)return null;if(orientation1==="vertical"&&orientation22==="horizontal"||orientation1==="horizontal"&&orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,horizontalEdge=orientation1==="horizontal"?edge1:edge2,x22=verticalEdge.from.x,y22=horizontalEdge.from.y,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}if(orientation1==="vertical"||orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,diagonalEdge=orientation1==="vertical"?edge2:edge1,x22=verticalEdge.from.x,m3=(diagonalEdge.to.y-diagonalEdge.from.y)/(diagonalEdge.to.x-diagonalEdge.from.x),b3=diagonalEdge.from.y-m3*diagonalEdge.from.x,y22=m3*x22+b3,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}let m12=(edge1.to.y-edge1.from.y)/(edge1.to.x-edge1.from.x),b12=edge1.from.y-m12*edge1.from.x,m22=(edge2.to.y-edge2.from.y)/(edge2.to.x-edge2.from.x),b22=edge2.from.y-m22*edge2.from.x;if(Math.abs(m12-m22)<TOLERANCE)return null;let x5=(b22-b12)/(m12-m22),y5=m12*x5+b12,intersection={x:x5,y:y5};return isPointWithinEdge(intersection,edge1)&&isPointWithinEdge(intersection,edge2)?intersection:null},createSchematicTraceJunctions=({edges:myEdges,db,source_trace_id})=>{let otherEdges=getOtherSchematicTraces({db,source_trace_id,sameNetOnly:!0}).flatMap(t21=>t21.edges),junctions=new Map;for(let myEdge of myEdges)for(let otherEdge of otherEdges){let intersection=getIntersectionPoint(myEdge,otherEdge);if(intersection){let key=`${intersection.x.toFixed(6)},${intersection.y.toFixed(6)}`;junctions.has(key)||junctions.set(key,intersection)}}return Array.from(junctions.values())};function normalizeAngle(angle){let normalized=angle%360;return normalized<0?normalized+360:normalized}function isAngleBetween(angle,start,end,direction2){return direction2==="counterclockwise"?end>=start?angle>=start&&angle<=end:angle>=start||angle<=end:end<=start?angle<=start&&angle>=end:angle<=start||angle>=end}function getArcBounds(elm){let center2=elm.center,radius=elm.radius,startAngle=elm.start_angle_degrees,endAngle=elm.end_angle_degrees,direction2=elm.direction??"counterclockwise";if(!center2||typeof center2.x!="number"||typeof center2.y!="number"||typeof radius!="number"||typeof startAngle!="number"||typeof endAngle!="number")return null;let start=normalizeAngle(startAngle),end=normalizeAngle(endAngle),consideredAngles=new Set([start,end]),cardinalAngles=[0,90,180,270];for(let cardinal of cardinalAngles)isAngleBetween(cardinal,start,end,direction2)&&consideredAngles.add(cardinal);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let angle of consideredAngles){let radians=angle*Math.PI/180,x5=center2.x+radius*Math.cos(radians),y5=center2.y+radius*Math.sin(radians);minX=Math.min(minX,x5),maxX=Math.max(maxX,x5),minY=Math.min(minY,y5),maxY=Math.max(maxY,y5)}return!Number.isFinite(minX)||!Number.isFinite(minY)?null:{minX,maxX,minY,maxY}}function getBoundsForSchematic(db){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let elm of db){let cx2,cy2,w4,h4;if(elm.type==="schematic_component")cx2=elm.center?.x,cy2=elm.center?.y,w4=elm.size?.width,h4=elm.size?.height;else if(elm.type==="schematic_box")cx2=elm.x,cy2=elm.y,w4=elm.width,h4=elm.height;else if(elm.type==="schematic_port")cx2=elm.center?.x,cy2=elm.center?.y,w4=.2,h4=.2;else if(elm.type==="schematic_text")cx2=elm.position?.x,cy2=elm.position?.y,w4=(elm.text?.length??0)*.1,h4=.2;else if(elm.type==="schematic_line"){let x12=elm.x1??0,y12=elm.y1??0,x22=elm.x2??0,y22=elm.y2??0;cx2=(x12+x22)/2,cy2=(y12+y22)/2,w4=Math.abs(x22-x12),h4=Math.abs(y22-y12)}else if(elm.type==="schematic_rect")cx2=elm.center?.x,cy2=elm.center?.y,w4=elm.width,h4=elm.height;else if(elm.type==="schematic_circle"){cx2=elm.center?.x,cy2=elm.center?.y;let radius=elm.radius;typeof radius=="number"&&(w4=radius*2,h4=radius*2)}else if(elm.type==="schematic_arc"){let bounds=getArcBounds(elm);bounds&&(minX=Math.min(minX,bounds.minX),maxX=Math.max(maxX,bounds.maxX),minY=Math.min(minY,bounds.minY),maxY=Math.max(maxY,bounds.maxY));continue}else if(elm.type==="schematic_path"){let points=elm.points;if(Array.isArray(points))for(let point6 of points)typeof point6.x=="number"&&typeof point6.y=="number"&&(minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y));continue}typeof cx2=="number"&&typeof cy2=="number"&&typeof w4=="number"&&typeof h4=="number"&&(minX=Math.min(minX,cx2-w4/2),maxX=Math.max(maxX,cx2+w4/2),minY=Math.min(minY,cy2-h4/2),maxY=Math.max(maxY,cy2+h4/2))}return{minX,maxX,minY,maxY}}function getObstaclesFromBounds(bounds,opts={}){let{minX,maxX,minY,maxY}=bounds,PADDING=opts.padding??1;if(!isFinite(minX)||!isFinite(maxX)||!isFinite(minY)||!isFinite(maxY))return[];let left=minX-PADDING,right=maxX+PADDING,top=maxY+PADDING,bottom=minY-PADDING,thickness=.01;return[{type:"rect",layers:["top"],center:{x:(left+right)/2,y:top},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:(left+right)/2,y:bottom},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:left,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]},{type:"rect",layers:["top"],center:{x:right,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]}]}var getSchematicObstaclesForTrace=trace=>{let db=trace.root.db,connectedPorts=trace._findConnectedPorts().ports??[],connectedPortIds=new Set(connectedPorts.map(p4=>p4.schematic_port_id)),obstacles=[];for(let elm of db.toArray()){if(elm.type==="schematic_component"){let isSymbol3=!!elm.symbol_name,dominateAxis=elm.size.width>elm.size.height?"horz":"vert";obstacles.push({type:"rect",layers:["top"],center:elm.center,width:elm.size.width+(isSymbol3&&dominateAxis==="horz"?-.5:0),height:elm.size.height+(isSymbol3&&dominateAxis==="vert"?-.5:0),connectedTo:[]})}if(elm.type==="schematic_port"){if(connectedPortIds.has(elm.schematic_port_id))continue;let dirVec=elm.facing_direction?getUnitVectorFromDirection(elm.facing_direction):{x:0,y:0};obstacles.push({type:"rect",layers:["top"],center:{x:elm.center.x-dirVec.x*.1,y:elm.center.y-dirVec.y*.1},width:.1+Math.abs(dirVec.x)*.3,height:.1+Math.abs(dirVec.y)*.3,connectedTo:[]})}elm.type==="schematic_text"&&obstacles.push({type:"rect",layers:["top"],center:elm.position,width:(elm.text?.length??0)*.1,height:.2,connectedTo:[]}),elm.type==="schematic_box"&&obstacles.push({type:"rect",layers:["top"],center:{x:elm.x,y:elm.y},width:elm.width,height:elm.height,connectedTo:[]})}let bounds=getBoundsForSchematic(db.toArray());return obstacles.push(...getObstaclesFromBounds(bounds,{padding:1})),obstacles},pushEdgesOfSchematicTraceToPreventOverlap=({edges,db,source_trace_id})=>{let mySourceTrace=db.source_trace.get(source_trace_id),otherEdges=getOtherSchematicTraces({db,source_trace_id,differentNetOnly:!0}).flatMap(t21=>t21.edges),edgeOrientation=edge=>{let{from,to:to3}=edge;return from.x===to3.x?"vertical":"horizontal"};for(let mySegment of edges){let mySegmentOrientation=edgeOrientation(mySegment),findOverlappingParallelSegment=()=>otherEdges.find(otherEdge=>edgeOrientation(otherEdge)===mySegmentOrientation&&doesLineIntersectLine([mySegment.from,mySegment.to],[otherEdge.from,otherEdge.to],{lineThickness:.05})),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment();for(;overlappingParallelSegmentFromOtherTrace;)mySegmentOrientation==="horizontal"?(mySegment.from.y+=.1,mySegment.to.y+=.1):(mySegment.from.x+=.1,mySegment.to.x+=.1),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment()}},convertFacingDirectionToElbowDirection=facingDirection=>{switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:}},autorouterVersion=package_default.version??"unknown",AutorouterError=class extends Error{constructor(message){super(`${message} (capacity-autorouter@${autorouterVersion})`),this.name="AutorouterError"}},TraceConnectionError=class extends Error{constructor(errorData){super(errorData.message),this.errorData=errorData,this.name="TraceConnectionError"}},Trace_doInitialSchematicTraceRender=trace=>{if(trace.root?._featureMspSchematicTraceRouting||trace._couldNotFindPort||trace.root?.schematicDisabled)return;let{db}=trace.root,{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let allPortsFound,connectedPorts;try{let result=trace._findConnectedPorts();allPortsFound=result.allPortsFound,connectedPorts=result.portsWithSelectors??[]}catch(error){if(error instanceof TraceConnectionError){db.source_trace_not_connected_error.insert({...error.errorData,error_type:"source_trace_not_connected_error"});return}throw error}let{netsWithSelectors}=trace._findConnectedNets();if(!allPortsFound)return;let portPairKey=connectedPorts.map(p4=>p4.port.schematic_port_id).sort().join(","),board=trace.root?._getBoard();if(board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.has(portPairKey))return;let connection={name:trace.source_trace_id,pointsToConnect:[]},obstacles=getSchematicObstaclesForTrace(trace),portsWithPosition=connectedPorts.filter(({port})=>port.schematic_port_id!==null).map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id??void 0,facingDirection:port.facingDirection}));if(portsWithPosition.length===1&&netsWithSelectors.length===1){let net=netsWithSelectors[0].net,{port,position:anchorPos}=portsWithPosition[0],connectedNetLabel=trace.getSubcircuit().selectAll("netlabel").find(nl3=>{let conn=nl3._parsedProps.connection??nl3._parsedProps.connectsTo;return conn?Array.isArray(conn)?conn.some(selector=>trace.getSubcircuit().selectOne(selector,{port:!0})===port):trace.getSubcircuit().selectOne(conn,{port:!0})===port:!1});if(!connectedNetLabel){let dbNetLabel=db.schematic_net_label.getWhere({source_trace_id:trace.source_trace_id});dbNetLabel&&(connectedNetLabel=dbNetLabel)}if(connectedNetLabel){let labelPos="_getGlobalSchematicPositionBeforeLayout"in connectedNetLabel?connectedNetLabel._getGlobalSchematicPositionBeforeLayout():connectedNetLabel.anchor_position,edges2=[];anchorPos.x===labelPos.x||anchorPos.y===labelPos.y?edges2.push({from:anchorPos,to:labelPos}):(edges2.push({from:anchorPos,to:{x:labelPos.x,y:anchorPos.y}}),edges2.push({from:{x:labelPos.x,y:anchorPos.y},to:labelPos}));let dbTrace2=db.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges:edges2,junctions:[],subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0});trace.schematic_trace_id=dbTrace2.schematic_trace_id;return}if(trace.props.schDisplayLabel){let side2=getEnteringEdgeFromDirection(port.facingDirection)??"bottom";db.schematic_net_label.insert({text:trace.props.schDisplayLabel,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side2,text:trace.props.schDisplayLabel}),anchor_side:side2});return}let side=getEnteringEdgeFromDirection(port.facingDirection)??"bottom",netLabel=db.schematic_net_label.insert({text:net._parsedProps.name,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side,text:net._parsedProps.name}),anchor_side:side});return}if(trace.props.schDisplayLabel&&("from"in trace.props&&"to"in trace.props||"path"in trace.props)){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}if(portsWithPosition.length<2)return;let edges=(()=>{let elbowEdges=[];for(let i2=0;i2<portsWithPosition.length-1;i2++){let start=portsWithPosition[i2],end=portsWithPosition[i2+1],path=calculateElbow({x:start.position.x,y:start.position.y,facingDirection:convertFacingDirectionToElbowDirection(start.facingDirection)},{x:end.position.x,y:end.position.y,facingDirection:convertFacingDirectionToElbowDirection(end.facingDirection)});for(let j4=0;j4<path.length-1;j4++)elbowEdges.push({from:path[j4],to:path[j4+1]})}let doesSegmentIntersectRect2=(edge,rect)=>{let halfW=rect.width/2,halfH=rect.height/2,left=rect.center.x-halfW,right=rect.center.x+halfW,top=rect.center.y-halfH,bottom=rect.center.y+halfH,inRect=p4=>p4.x>=left&&p4.x<=right&&p4.y>=top&&p4.y<=bottom;return inRect(edge.from)||inRect(edge.to)?!0:[[{x:left,y:top},{x:right,y:top}],[{x:right,y:top},{x:right,y:bottom}],[{x:right,y:bottom},{x:left,y:bottom}],[{x:left,y:bottom},{x:left,y:top}]].some(r4=>doesLineIntersectLine([edge.from,edge.to],r4,{lineThickness:0}))};for(let edge of elbowEdges)for(let obstacle of obstacles)if(doesSegmentIntersectRect2(edge,obstacle))return null;return elbowEdges})();edges&&edges.length===0&&(edges=null),connection.pointsToConnect=portsWithPosition.map(({position:position2})=>({...position2,layer:"top"}));let bounds=computeObstacleBounds(obstacles),BOUNDS_MARGIN=2,simpleRouteJsonInput={minTraceWidth:.1,obstacles,connections:[connection],bounds:{minX:bounds.minX-BOUNDS_MARGIN,maxX:bounds.maxX+BOUNDS_MARGIN,minY:bounds.minY-BOUNDS_MARGIN,maxY:bounds.maxY+BOUNDS_MARGIN},layerCount:1},Autorouter=MultilayerIjump,skipOtherTraceInteraction=!1;if(trace.getSubcircuit().props._schDirectLineRoutingEnabled&&(Autorouter=DirectLineRouter,skipOtherTraceInteraction=!0),!edges){let results=new Autorouter({input:simpleRouteJsonInput,MAX_ITERATIONS:100,OBSTACLE_MARGIN:.1,isRemovePathLoopsEnabled:!0,isShortenPathWithShortcutsEnabled:!0,marginsWithCosts:[{margin:1,enterCost:0,travelCostFactor:1},{margin:.3,enterCost:0,travelCostFactor:1},{margin:.2,enterCost:0,travelCostFactor:2},{margin:.1,enterCost:0,travelCostFactor:3}]}).solveAndMapToTraces();if(results.length===0){if(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection()){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}results=new DirectLineRouter({input:simpleRouteJsonInput}).solveAndMapToTraces(),skipOtherTraceInteraction=!0}let[{route}]=results;edges=[];let wireAndViaRoutes=route.filter(r4=>r4.route_type==="wire"||r4.route_type==="via");for(let i2=0;i2<wireAndViaRoutes.length-1;i2++)edges.push({from:wireAndViaRoutes[i2],to:wireAndViaRoutes[i2+1]})}let source_trace_id=trace.source_trace_id,junctions=[];if(!skipOtherTraceInteraction){pushEdgesOfSchematicTraceToPreventOverlap({edges,db,source_trace_id});let otherEdges=getOtherSchematicTraces({db,source_trace_id,differentNetOnly:!0}).flatMap(t21=>t21.edges);edges=createSchematicTraceCrossingSegments({edges,otherEdges}),junctions=createSchematicTraceJunctions({edges,db,source_trace_id:trace.source_trace_id})}if(!edges||edges.length===0)return;let lastEdge=edges[edges.length-1],lastEdgePort=portsWithPosition[portsWithPosition.length-1],lastDominantDirection=getDominantDirection(lastEdge);edges.push(...getStubEdges({lastEdge,lastEdgePort,lastDominantDirection}));let firstEdge=edges[0],firstEdgePort=portsWithPosition[0],firstDominantDirection=getDominantDirection(firstEdge);if(edges.unshift(...getStubEdges({firstEdge,firstEdgePort,firstDominantDirection})),!trace.source_trace_id)throw new Error("Missing source_trace_id for schematic trace insertion.");if(trace.getSubcircuit()._parsedProps.schTraceAutoLabelEnabled&&countComplexElements(junctions,edges)>=5&&(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection())){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}let dbTrace=db.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges,junctions,subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0});trace.schematic_trace_id=dbTrace.schematic_trace_id;for(let{port}of connectedPorts)port.schematic_port_id&&db.schematic_port.update(port.schematic_port_id,{is_connected:!0});board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.add(portPairKey)};function getTraceLength(route){let totalLength=0;for(let i2=0;i2<route.length;i2++){let point6=route[i2];if(point6.route_type==="wire"){let nextPoint=route[i2+1];if(nextPoint){let dx2=nextPoint.x-point6.x,dy2=nextPoint.y-point6.y;totalLength+=Math.sqrt(dx2*dx2+dy2*dy2)}}else point6.route_type==="via"&&(totalLength+=1.6)}return totalLength}var DEFAULT_VIA_HOLE_DIAMETER=.2,DEFAULT_VIA_PAD_DIAMETER=.3,parseDistance=(value,fallback)=>{if(value===void 0)return fallback;if(typeof value=="number")return value;let parsed=parseFloat(value);return Number.isFinite(parsed)?parsed:fallback},getViaDiameterDefaults=pcbStyle2=>({holeDiameter:parseDistance(pcbStyle2?.viaHoleDiameter,DEFAULT_VIA_HOLE_DIAMETER),padDiameter:parseDistance(pcbStyle2?.viaPadDiameter,DEFAULT_VIA_PAD_DIAMETER)}),getViaDiameterDefaultsWithOverrides=(overrides,pcbStyle2)=>{let defaults=getViaDiameterDefaults(pcbStyle2);return{holeDiameter:overrides.holeDiameter??defaults.holeDiameter,padDiameter:overrides.padDiameter??defaults.padDiameter}},portToObjective=port=>({...port._getGlobalPcbPositionAfterLayout(),layers:port.getAvailablePcbLayers()}),SHOULD_USE_SINGLE_LAYER_ROUTING=!1;function Trace_doInitialPcbTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db}=trace.root,{_parsedProps:props,parent}=trace,subcircuit=trace.getSubcircuit();if(!parent)throw new Error("Trace has no parent");if(subcircuit._parsedProps.routingDisabled||subcircuit._isInflatedFromCircuitJson)return;let cachedRoute=subcircuit._parsedProps.pcbRouteCache?.pcbTraces;if(cachedRoute){let pcb_trace22=db.pcb_trace.insert({route:cachedRoute.flatMap(trace2=>trace2.route),source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0});trace.pcb_trace_id=pcb_trace22.pcb_trace_id;return}if(props.pcbPath&&props.pcbPath.length>0||props.pcbStraightLine||!subcircuit._shouldUseTraceByTraceRouting())return;let{allPortsFound,ports}=trace._findConnectedPorts(),portsConnectedOnPcbViaNet=[];if(!allPortsFound)return;let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p4=>p4.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let nets=trace._findConnectedNets().netsWithSelectors;if(ports.length===0&&nets.length===2){trace.renderError("Trace connects two nets, we haven't implemented a way to route this yet");return}else if(ports.length===1&&nets.length===1){let port=ports[0],otherPortsInNet=nets[0].net.getAllConnectedPorts().filter(p4=>p4!==port);if(otherPortsInNet.length===0){console.log("Nothing to connect this port to, the net is empty. TODO should emit a warning!");return}let closestPortInNet=getClosest(port,otherPortsInNet);portsConnectedOnPcbViaNet.push(closestPortInNet),ports.push(closestPortInNet)}else if(ports.length>1&&nets.length>=1){trace.renderError("Trace has more than one port and one or more nets, we don't currently support this type of complex trace routing");return}let hints=ports.flatMap(port=>port.matchedComponents.filter(c3=>c3.componentName==="TraceHint")),pcbRouteHints=(trace._parsedProps.pcbRouteHints??[]).concat(hints.flatMap(h4=>h4.getPcbRouteHints()));if(ports.length>2){trace.renderError(`Trace has more than two ports (${ports.map(p4=>p4.getString()).join(", ")}), routing between more than two ports for a single trace is not implemented`);return}if(trace.getSubcircuit().selectAll("trace").filter(trace2=>trace2.renderPhaseStates.PcbTraceRender.initialized).some(trace2=>trace2._portsRoutedOnPcb.length===ports.length&&trace2._portsRoutedOnPcb.every(portRoutedByOtherTrace=>ports.includes(portRoutedByOtherTrace))))return;let orderedRouteObjectives=[];pcbRouteHints.length===0?orderedRouteObjectives=[portToObjective(ports[0]),portToObjective(ports[1])]:orderedRouteObjectives=[portToObjective(ports[0]),...pcbRouteHints,portToObjective(ports[1])];let candidateLayerCombinations=findPossibleTraceLayerCombinations(orderedRouteObjectives);if(SHOULD_USE_SINGLE_LAYER_ROUTING&&candidateLayerCombinations.length===0){trace.renderError(`Could not find a common layer (using hints) for trace ${trace.getString()}`);return}let connMap=getFullConnectivityMapFromCircuitJson(trace.root.db.toArray()),[obstacles,errGettingObstacles]=tryNow(()=>getObstaclesFromCircuitJson2(trace.root.db.toArray()));if(errGettingObstacles){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Error getting obstacles for autorouting: ${errGettingObstacles.message}`,source_trace_id:trace.source_trace_id,center:{x:0,y:0},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[]});return}for(let obstacle of obstacles)if(obstacle.connectedTo.length>0){let netId=connMap.getNetConnectedToId(obstacle.connectedTo[0]);netId&&obstacle.connectedTo.push(netId)}let orderedRoutePoints=[];if(candidateLayerCombinations.length===0)orderedRoutePoints=orderedRouteObjectives;else{let candidateLayerSelections=candidateLayerCombinations[0].layer_path;orderedRoutePoints=orderedRouteObjectives.map((t21,idx)=>t21.via?{...t21,via_to_layer:candidateLayerSelections[idx]}:{...t21,layers:[candidateLayerSelections[idx]]})}orderedRoutePoints[0].pcb_port_id=ports[0].pcb_port_id,orderedRoutePoints[orderedRoutePoints.length-1].pcb_port_id=ports[1].pcb_port_id;let routes=[];for(let[a2,b3]of pairs2(orderedRoutePoints)){let dominantLayer="via_to_layer"in a2?a2.via_to_layer:null,BOUNDS_MARGIN=2,aLayer="layers"in a2&&a2.layers.length===1?a2.layers[0]:dominantLayer??"top",bLayer="layers"in b3&&b3.layers.length===1?b3.layers[0]:dominantLayer??"top",pcbPortA="pcb_port_id"in a2?a2.pcb_port_id:null,pcbPortB="pcb_port_id"in b3?b3.pcb_port_id:null,minTraceWidth=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??.16,ijump=new MultilayerIjump({OBSTACLE_MARGIN:minTraceWidth*2,isRemovePathLoopsEnabled:!0,optimizeWithGoalBoxes:!!(pcbPortA&&pcbPortB),connMap,input:{obstacles,minTraceWidth,connections:[{name:trace.source_trace_id,pointsToConnect:[{...a2,layer:aLayer,pcb_port_id:pcbPortA},{...b3,layer:bLayer,pcb_port_id:pcbPortB}]}],layerCount:trace.getSubcircuit()._getSubcircuitLayerCount(),bounds:{minX:Math.min(a2.x,b3.x)-BOUNDS_MARGIN,maxX:Math.max(a2.x,b3.x)+BOUNDS_MARGIN,minY:Math.min(a2.y,b3.y)-BOUNDS_MARGIN,maxY:Math.max(a2.y,b3.y)+BOUNDS_MARGIN}}}),traces=null;try{traces=ijump.solveAndMapToTraces()}catch(e4){trace.renderError({type:"pcb_trace_error",pcb_trace_error_id:trace.source_trace_id,error_type:"pcb_trace_error",message:`error solving route: ${e4.message}`,source_trace_id:trace.pcb_trace_id,center:{x:(a2.x+b3.x)/2,y:(a2.y+b3.y)/2},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p4=>p4.pcb_component_id)})}if(!traces)return;if(traces.length===0){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Could not find a route for ${trace}`,source_trace_id:trace.source_trace_id,center:{x:(a2.x+b3.x)/2,y:(a2.y+b3.y)/2},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p4=>p4.pcb_component_id)});return}let[autoroutedTrace]=traces;dominantLayer&&(autoroutedTrace.route=autoroutedTrace.route.map(p4=>(p4.route_type==="wire"&&!p4.layer&&(p4.layer=dominantLayer),p4))),pcbPortA&&autoroutedTrace.route[0].route_type==="wire"&&(autoroutedTrace.route[0].start_pcb_port_id=pcbPortA);let lastRoutePoint=autoroutedTrace.route[autoroutedTrace.route.length-1];pcbPortB&&lastRoutePoint.route_type==="wire"&&(lastRoutePoint.end_pcb_port_id=pcbPortB),routes.push(autoroutedTrace.route)}let mergedRoute=mergeRoutes(routes),traceLength=getTraceLength(mergedRoute),pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),pcb_trace2=db.pcb_trace.insert({route:mergedRoute,source_trace_id:trace.source_trace_id,subcircuit_id:trace.getSubcircuit()?.subcircuit_id,trace_length:traceLength});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace2.pcb_trace_id;for(let point6 of mergedRoute)point6.route_type==="via"&&db.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer});trace._insertErrorIfTraceIsOutsideBoard(mergedRoute,ports)}function computeLineRectIntersection(params){let{lineStart,lineEnd,rectCenter,rectWidth,rectHeight}=params,left=rectCenter.x-rectWidth/2,right=rectCenter.x+rectWidth/2,top=rectCenter.y+rectHeight/2,bottom=rectCenter.y-rectHeight/2,dx2=lineEnd.x-lineStart.x,dy2=lineEnd.y-lineStart.y,intersections=[];if(dx2!==0){let t21=(left-lineStart.x)/dx2;if(t21>=0&&t21<=1){let y5=lineStart.y+t21*dy2;y5>=bottom&&y5<=top&&intersections.push({x:left,y:y5,t:t21})}}if(dx2!==0){let t21=(right-lineStart.x)/dx2;if(t21>=0&&t21<=1){let y5=lineStart.y+t21*dy2;y5>=bottom&&y5<=top&&intersections.push({x:right,y:y5,t:t21})}}if(dy2!==0){let t21=(bottom-lineStart.y)/dy2;if(t21>=0&&t21<=1){let x5=lineStart.x+t21*dx2;x5>=left&&x5<=right&&intersections.push({x:x5,y:bottom,t:t21})}}if(dy2!==0){let t21=(top-lineStart.y)/dy2;if(t21>=0&&t21<=1){let x5=lineStart.x+t21*dx2;x5>=left&&x5<=right&&intersections.push({x:x5,y:top,t:t21})}}return intersections.length===0?null:(intersections.sort((a2,b3)=>a2.t-b3.t),{x:intersections[0].x,y:intersections[0].y})}function computeLineCircleIntersection(params){let{lineStart,lineEnd,circleCenter,circleRadius}=params,x12=lineStart.x-circleCenter.x,y12=lineStart.y-circleCenter.y,x22=lineEnd.x-circleCenter.x,y22=lineEnd.y-circleCenter.y,dx2=x22-x12,dy2=y22-y12,a2=dx2*dx2+dy2*dy2,b3=2*(x12*dx2+y12*dy2),c3=x12*x12+y12*y12-circleRadius*circleRadius,discriminant=b3*b3-4*a2*c3;if(discriminant<0)return null;let sqrtDisc=Math.sqrt(discriminant),t110=(-b3-sqrtDisc)/(2*a2),t22=(-b3+sqrtDisc)/(2*a2),t21=null;return t110>=0&&t110<=1?t21=t110:t22>=0&&t22<=1&&(t21=t22),t21===null?null:{x:lineStart.x+t21*dx2,y:lineStart.y+t21*dy2}}function clipTraceEndAtPad(params){let{traceStart,traceEnd,traceWidth,port}=params,pcbPrimitive=port.matchedComponents.find(c3=>c3.isPcbPrimitive);if(!pcbPrimitive)return traceEnd;let padBounds=pcbPrimitive._getPcbCircuitJsonBounds(),padWidth=padBounds.width,padHeight=padBounds.height,padCenter=padBounds.center,smallestPadDimension=Math.min(padWidth,padHeight);if(traceWidth<=smallestPadDimension/2)return traceEnd;let clippedPoint=null;if(pcbPrimitive.componentName==="SmtPad"){let smtPad=pcbPrimitive,padShape=smtPad._parsedProps.shape;if(padShape==="circle"){let radius=smtPad._parsedProps.radius;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:radius})}else(padShape==="rect"||padShape==="rotated_rect"||padShape==="pill"||padShape==="polygon")&&(clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight}))}else if(pcbPrimitive.componentName==="PlatedHole"){let platedHole=pcbPrimitive;if(platedHole._parsedProps.shape==="circle"){let outerDiameter=platedHole._parsedProps.outerDiameter;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:outerDiameter/2})}else clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight})}return clippedPoint??traceEnd}function Trace_doInitialPcbManualTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db}=trace.root,{_parsedProps:props}=trace,subcircuit=trace.getSubcircuit(),hasPcbPath=props.pcbPath!==void 0,wantsStraightLine=!!props.pcbStraightLine;if(!hasPcbPath&&!wantsStraightLine)return;let{allPortsFound,ports,portsWithSelectors}=trace._findConnectedPorts();if(!allPortsFound)return;let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p4=>p4.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let width=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??.16;if(wantsStraightLine&&!hasPcbPath){if(!ports||ports.length<2){trace.renderError("pcbStraightLine requires exactly two connected ports");return}let[startPort,endPort]=ports,startLayers=startPort.getAvailablePcbLayers(),endLayers=endPort.getAvailablePcbLayers(),layer2=startLayers.find(layer3=>endLayers.includes(layer3))??startLayers[0]??endLayers[0]??"top",startPos=startPort._getGlobalPcbPositionAfterLayout(),endPos=endPort._getGlobalPcbPositionAfterLayout(),clippedStartPos=clipTraceEndAtPad({traceStart:endPos,traceEnd:startPos,traceWidth:width,port:startPort}),clippedEndPos=clipTraceEndAtPad({traceStart:startPos,traceEnd:endPos,traceWidth:width,port:endPort}),route2=[{route_type:"wire",x:clippedStartPos.x,y:clippedStartPos.y,width,layer:layer2,start_pcb_port_id:startPort.pcb_port_id},{route_type:"wire",x:clippedEndPos.x,y:clippedEndPos.y,width,layer:layer2,end_pcb_port_id:endPort.pcb_port_id}],traceLength2=getTraceLength(route2),pcb_trace22=db.pcb_trace.insert({route:route2,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength2});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace22.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route2,ports);return}if(!props.pcbPath)return;let anchorPort;props.pcbPathRelativeTo&&(anchorPort=portsWithSelectors.find(p4=>p4.selector===props.pcbPathRelativeTo)?.port,anchorPort||(anchorPort=trace.getSubcircuit().selectOne(props.pcbPathRelativeTo))),anchorPort||(anchorPort=ports[0]);let otherPort=ports.find(p4=>p4!==anchorPort)??ports[1],currentLayer=anchorPort.getAvailablePcbLayers()[0]||"top",anchorPos=anchorPort._getGlobalPcbPositionAfterLayout(),otherPos=otherPort._getGlobalPcbPositionAfterLayout(),route=[];route.push({route_type:"wire",x:anchorPos.x,y:anchorPos.y,width,layer:currentLayer,start_pcb_port_id:anchorPort.pcb_port_id});let transform5=subcircuit._isInflatedFromCircuitJson?trace._computePcbGlobalTransformBeforeLayout():anchorPort?._computePcbGlobalTransformBeforeLayout?.()||identity(),pcbPath2=props.pcbPath;for(let pt4 of pcbPath2){let coordinates,isGlobalPosition=!1,isViaPoint=typeof pt4!="string"&&pt4.via,viaFromLayer,viaToLayer;if(typeof pt4=="string"){let resolvedPort=trace.getSubcircuit().selectOne(pt4,{type:"port"});if(!resolvedPort){db.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Could not resolve pcbPath selector "${pt4}" for ${trace}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:[]});continue}let portPos=resolvedPort._getGlobalPcbPositionAfterLayout();coordinates={x:portPos.x,y:portPos.y},isGlobalPosition=!0}else coordinates={x:pt4.x,y:pt4.y},isGlobalPosition=!1,pt4.via&&(viaFromLayer=pt4.fromLayer??currentLayer,viaToLayer=pt4.toLayer);let finalCoordinates=isGlobalPosition?coordinates:applyToPoint2(transform5,coordinates);isViaPoint?(route.push({route_type:"via",x:finalCoordinates.x,y:finalCoordinates.y,from_layer:viaFromLayer??currentLayer,to_layer:viaToLayer??currentLayer}),currentLayer=viaToLayer??currentLayer):route.push({route_type:"wire",x:finalCoordinates.x,y:finalCoordinates.y,width,layer:currentLayer})}route.push({route_type:"wire",x:otherPos.x,y:otherPos.y,width,layer:currentLayer,end_pcb_port_id:otherPort.pcb_port_id});let traceLength=getTraceLength(route),pcb_trace2=db.pcb_trace.insert({route,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength}),pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);for(let point6 of route)point6.route_type==="via"&&db.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace2.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route,ports)}function Trace__doInitialSchematicTraceRenderWithDisplayLabel(trace){if(trace.root?.schematicDisabled)return;let{db}=trace.root,{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let{allPortsFound,portsWithSelectors:connectedPorts}=trace._findConnectedPorts();if(!allPortsFound)return;let portsWithPosition=connectedPorts.map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id,facingDirection:port.facingDirection}));if(portsWithPosition.length<2)throw new Error("Expected at least two ports in portsWithPosition.");let fromPortName,toPortName,fromAnchorPos=portsWithPosition[0].position,fromPort=portsWithPosition[0].port;if("path"in trace.props){if(trace.props.path.length!==2)throw new Error("Invalid 'path': Must contain exactly two elements.");[fromPortName,toPortName]=trace.props.path}else{if(!("from"in trace.props&&"to"in trace.props))throw new Error("Missing 'from' or 'to' properties in props.");fromPortName=trace.props.from,toPortName=trace.props.to}if(!fromPort.source_port_id)throw new Error(`Missing source_port_id for the 'from' port (${fromPortName}).`);let toAnchorPos=portsWithPosition[1].position,toPort=portsWithPosition[1].port;if(!toPort.source_port_id)throw new Error(`Missing source_port_id for the 'to' port (${toPortName}).`);let existingFromNetLabel=db.schematic_net_label.list().find(label=>label.source_net_id===fromPort.source_port_id),existingToNetLabel=db.schematic_net_label.list().find(label=>label.source_net_id===toPort.source_port_id),[firstPort,secondPort]=connectedPorts.map(({port})=>port),pinFullName=firstPort.parent?.config.shouldRenderAsSchematicBox?`${firstPort?.parent?.props.name}_${firstPort?.props.name}`:`${secondPort?.parent?.props.name}_${secondPort?.props.name}`,netLabelText=trace.props.schDisplayLabel??pinFullName;if(existingFromNetLabel&&existingFromNetLabel.text!==netLabelText&&(existingFromNetLabel.text=`${netLabelText} / ${existingFromNetLabel.text}`),existingToNetLabel&&existingToNetLabel?.text!==netLabelText&&(existingToNetLabel.text=`${netLabelText} / ${existingToNetLabel.text}`),!existingToNetLabel){let toSide=getEnteringEdgeFromDirection(toPort.facingDirection)??"bottom";db.schematic_net_label.insert({text:trace.props.schDisplayLabel??pinFullName,source_net_id:toPort.source_port_id,anchor_position:toAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:toAnchorPos,anchor_side:toSide,text:trace.props.schDisplayLabel??pinFullName}),anchor_side:toSide})}if(!existingFromNetLabel){let fromSide=getEnteringEdgeFromDirection(fromPort.facingDirection)??"bottom";db.schematic_net_label.insert({text:trace.props.schDisplayLabel??pinFullName,source_net_id:fromPort.source_port_id,anchor_position:fromAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:fromAnchorPos,anchor_side:fromSide,text:trace.props.schDisplayLabel??pinFullName}),anchor_side:fromSide})}}function Trace__findConnectedPorts(trace){let{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let portsWithSelectors=trace.getTracePortPathSelectors().map(selector=>({selector,port:trace.getSubcircuit().selectOne(selector,{type:"port"})??null}));for(let{selector,port}of portsWithSelectors)if(!port){let parentSelector,portToken,dotIndex=selector.lastIndexOf(".");if(dotIndex!==-1&&dotIndex>selector.lastIndexOf(" "))parentSelector=selector.slice(0,dotIndex),portToken=selector.slice(dotIndex+1);else{let match2=selector.match(/^(.*[ >])?([^ >]+)$/);parentSelector=match2?.[1]?.trim()??"",portToken=match2?.[2]??selector}let targetComponent=parentSelector?trace.getSubcircuit().selectOne(parentSelector):null;if(!targetComponent&&parentSelector&&!/[.#\[]/.test(parentSelector)&&(targetComponent=trace.getSubcircuit().selectOne(`.${parentSelector}`)),!targetComponent){let errorMessage2=parentSelector?`Could not find port for selector "${selector}". Component "${parentSelector}" not found`:`Could not find port for selector "${selector}"`,subcircuit2=trace.getSubcircuit(),sourceGroup2=subcircuit2.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage2,subcircuit_id:subcircuit2.subcircuit_id??void 0,source_group_id:sourceGroup2?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}let ports=targetComponent.children.filter(c3=>c3.componentName==="Port"),portLabel=portToken.includes(".")?portToken.split(".").pop()??"":portToken,portNames=ports.flatMap(c3=>c3.getNameAndAliases()),hasCustomLabels=portNames.some(n3=>!/^(pin\d+|\d+)$/.test(n3)),labelList=Array.from(new Set(portNames)).join(", "),detail;ports.length===0?detail="It has no ports":hasCustomLabels?detail=`It has [${labelList}]`:detail=`It has ${ports.length} pins and no pinLabels (consider adding pinLabels)`;let errorMessage=`Could not find port for selector "${selector}". Component "${targetComponent.props.name??parentSelector}" found, but does not have pin "${portLabel}". ${detail}`,subcircuit=trace.getSubcircuit(),sourceGroup=subcircuit.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage,subcircuit_id:subcircuit.subcircuit_id??void 0,source_group_id:sourceGroup?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}return portsWithSelectors.some(p4=>!p4.port)?{allPortsFound:!1}:{allPortsFound:!0,portsWithSelectors,ports:portsWithSelectors.map(({port})=>port)}}var Trace3=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"source_trace_id",null);__publicField(this,"pcb_trace_id",null);__publicField(this,"schematic_trace_id",null);__publicField(this,"_portsRoutedOnPcb");__publicField(this,"subcircuit_connectivity_map_key",null);__publicField(this,"_traceConnectionHash",null);__publicField(this,"_couldNotFindPort");this._portsRoutedOnPcb=[]}_getExplicitTraceThickness(){return this._parsedProps.thickness??this._parsedProps.width}get config(){return{zodProps:traceProps,componentName:"Trace"}}_getTracePortOrNetSelectorListFromProps(){return"from"in this.props&&"to"in this.props?[typeof this.props.from=="string"?this.props.from:this.props.from.getPortSelector(),typeof this.props.to=="string"?this.props.to:this.props.to.getPortSelector()]:"path"in this.props?this.props.path.map(p4=>typeof p4=="string"?p4:p4.getPortSelector()):[]}getTracePortPathSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>!selector.includes("net."))}getTracePathNetSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>selector.includes("net."))}_findConnectedPorts(){return Trace__findConnectedPorts(this)}_resolveNet(selector){let direct=this.getSubcircuit().selectOne(selector,{type:"net"});if(direct)return direct;let match2=selector.match(/^net\.(.+)$/),netName=match2?match2[1]:null;if(!netName)return null;let board=this.root?._getBoard();return board?board.getDescendants().find(d3=>d3.componentName==="Net"&&d3._parsedProps.name===netName)||null:(this.renderError(`Could not find a <board> ancestor for ${this}, so net "${selector}" cannot be resolved`),null)}_findConnectedNets(){let netsWithSelectors=this.getTracePathNetSelectors().map(selector=>({selector,net:this._resolveNet(selector)})),undefinedNets=netsWithSelectors.filter(n3=>!n3.net);return undefinedNets.length>0&&this.renderError(`Could not find net for selector "${undefinedNets[0].selector}" inside ${this}`),{netsWithSelectors,nets:netsWithSelectors.map(n3=>n3.net)}}_getAllTracesConnectedToSameNet(){let traces=this.getSubcircuit().selectAll("trace"),myNets=this._findConnectedNets().nets,myPorts=this._findConnectedPorts().ports??[];return traces.filter(t21=>{if(t21===this)return!1;let tNets=t21._findConnectedNets().nets,tPorts=t21._findConnectedPorts().ports??[];return tNets.some(n3=>myNets.includes(n3))||tPorts.some(p4=>myPorts.includes(p4))})}_isExplicitlyConnectedToPort(port){let{allPortsFound,portsWithSelectors:portsWithMetadata}=this._findConnectedPorts();return allPortsFound?portsWithMetadata.map(p4=>p4.port).includes(port):!1}_isExplicitlyConnectedToNet(net){return this._findConnectedNets().nets.includes(net)}doInitialCreateNetsFromProps(){createNetsFromProps(this,this.getTracePathNetSelectors())}_computeTraceConnectionHash(){let{allPortsFound,ports}=this._findConnectedPorts();return!allPortsFound||!ports?null:[...ports].sort((a2,b3)=>(a2.pcb_port_id||"").localeCompare(b3.pcb_port_id||"")).map(p4=>p4.pcb_port_id).join(",")}doInitialSourceTraceRender(){let{db}=this.root,{_parsedProps:props,parent}=this;if(!parent){this.renderError("Trace has no parent");return}let allPortsFound,ports;try{let result=this._findConnectedPorts();allPortsFound=result.allPortsFound,ports=result.portsWithSelectors??[]}catch(error){if(error instanceof TraceConnectionError){db.source_trace_not_connected_error.insert({...error.errorData,error_type:"source_trace_not_connected_error"}),this._couldNotFindPort=!0;return}throw error}if(!allPortsFound)return;this._traceConnectionHash=this._computeTraceConnectionHash();let existingTrace=db.source_trace.list().find(t21=>t21.subcircuit_connectivity_map_key===this.subcircuit_connectivity_map_key&&t21.connected_source_port_ids.sort().join(",")===this._traceConnectionHash);if(existingTrace){this.source_trace_id=existingTrace.source_trace_id;return}let nets=this._findConnectedNets().nets,displayName=getTraceDisplayName({ports,nets}),trace=db.source_trace.insert({connected_source_port_ids:ports.map(p4=>p4.port.source_port_id),connected_source_net_ids:nets.map(n3=>n3.source_net_id),subcircuit_id:this.getSubcircuit()?.subcircuit_id,max_length:getMaxLengthFromConnectedCapacitors(ports.map(p4=>p4.port),{db})??props.maxLength,display_name:displayName,min_trace_thickness:this._getExplicitTraceThickness()});this.source_trace_id=trace.source_trace_id}_insertErrorIfTraceIsOutsideBoard(mergedRoute,ports){let{db}=this.root,board=this._getBoard();if(!board)return;let pcbBoardId=board.pcb_board_id;if(!pcbBoardId)return;isRouteOutsideBoard({mergedRoute,db,pcbBoardId})&&db.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:this.source_trace_id,message:`Trace ${this.getString()} routed outside the board boundaries.`,pcb_trace_id:this.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p4=>p4.pcb_port_id)})}doInitialPcbManualTraceRender(){Trace_doInitialPcbManualTraceRender(this)}doInitialPcbTraceRender(){Trace_doInitialPcbTraceRender(this)}_doInitialSchematicTraceRenderWithDisplayLabel(){Trace__doInitialSchematicTraceRenderWithDisplayLabel(this)}_isSymbolToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&!isPort2Chip||!isPort1Chip&&isPort2Chip}_isSymbolToSymbolConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Symbol=!port1.parent.config.shouldRenderAsSchematicBox,isPort2Symbol=!port2.parent.config.shouldRenderAsSchematicBox;return isPort1Symbol&&isPort2Symbol}_isChipToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&isPort2Chip}doInitialSchematicTraceRender(){Trace_doInitialSchematicTraceRender(this)}},catalogue={},extendCatalogue=objects=>{let altKeys=Object.fromEntries(Object.entries(objects).map(([key,v5])=>[key.toLowerCase(),v5]));Object.assign(catalogue,objects),Object.assign(catalogue,altKeys)},ErrorPlaceholderComponent=class extends PrimitiveComponent2{constructor(props,error){super(props);let resolveCoordinate=(value,axis)=>{if(typeof value=="number")return value;if(typeof value=="string")try{return this._resolvePcbCoordinate(value,axis,{allowBoardVariables:!1})}catch{return 0}return 0};this._parsedProps={...props,error,type:props.type||"unknown",component_name:props.name,error_type:"source_failed_to_create_component_error",message:error instanceof Error?error.message:String(error),pcbX:resolveCoordinate(props.pcbX,"pcbX"),pcbY:resolveCoordinate(props.pcbY,"pcbY"),schX:props.schX,schY:props.schY}}formatErrorDetails(){let selectorValue=this._parsedProps.selector??this._parsedProps.selectors??this._parsedProps.in??this._parsedProps.within,selectorText=selectorValue===void 0?void 0:typeof selectorValue=="string"?selectorValue:this.safeStringify(selectorValue),propsText=this.safeStringify(this._parsedProps);return{selectorText,propsText}}safeStringify(value){let seen=new WeakSet,json=JSON.stringify(value,(_key,item)=>{if(typeof item=="bigint")return item.toString();if(typeof item=="function")return`[Function ${item.name||"anonymous"}]`;if(typeof item=="symbol")return item.toString();if(typeof item=="object"&&item!==null){if(seen.has(item))return"[Circular]";seen.add(item)}return item},2);return json?json.length>2e3?`${json.slice(0,2e3)}\u2026`:json:"undefined"}get config(){return{componentName:"ErrorPlaceholder",zodProps:external_exports.object({}).passthrough()}}doInitialSourceRender(){if(this.root?.db){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout(),{selectorText,propsText}=this.formatErrorDetails(),messageDetails=[selectorText?`Within selector: ${selectorText}`:null,`Props: ${propsText}`].filter(Boolean).join(" "),baseMessage=`Could not create ${this._parsedProps.componentType??"component"}${this._parsedProps.name?` "${this._parsedProps.name}"`:""}. ${this._parsedProps.error?.formattedError?._errors?.join("; ")||this._parsedProps.message}`;this.root.db.source_failed_to_create_component_error.insert({component_name:this._parsedProps.component_name,error_type:"source_failed_to_create_component_error",message:`${baseMessage}${messageDetails?` Details: ${messageDetails}`:""}`,pcb_center:pcbPosition2,schematic_center:schematicPosition})}}};function createErrorPlaceholderComponent(props,error){return new ErrorPlaceholderComponent(props,error)}function prepare(object,state2){let instance=object;return instance.__tsci={...state2},object}var hostConfig={supportsMutation:!0,createInstance(type,props){let target=catalogue[type];if(!target)throw Object.keys(catalogue).length===0?new Error("No components registered in catalogue, did you forget to import lib/register-catalogue in your test file?"):new Error(`Unsupported component type "${type}". No element with this name is registered in the @tscircuit/core catalogue. Check for typos or see https://docs.tscircuit.com/category/built-in-elements for a list of valid components. To add your own component, see docs/CREATING_NEW_COMPONENTS.md`);try{return prepare(new target(props),{})}catch(error){return createErrorPlaceholderComponent({...props,componentType:type},error)}},createTextInstance(text){return{__text:text}},appendInitialChild(parentInstance,child){parentInstance.add(child)},appendChild(parentInstance,child){parentInstance.add(child)},appendChildToContainer(container,child){container.add(child)},finalizeInitialChildren(){return!1},prepareUpdate(){return null},shouldSetTextContent(){return!1},getRootHostContext(){return{}},getChildHostContext(){return{}},prepareForCommit(){return null},resetAfterCommit(){},commitMount(){},commitUpdate(){},removeChild(){},clearContainer(){},supportsPersistence:!1,getPublicInstance(instance){return instance},preparePortalMount(containerInfo){throw new Error("Function not implemented.")},scheduleTimeout(fn3,delay){throw new Error("Function not implemented.")},cancelTimeout(id2){throw new Error("Function not implemented.")},noTimeout:void 0,isPrimaryRenderer:!1,getInstanceFromNode(node){throw new Error("Function not implemented.")},beforeActiveInstanceBlur(){throw new Error("Function not implemented.")},afterActiveInstanceBlur(){throw new Error("Function not implemented.")},prepareScopeUpdate:(scopeInstance,instance)=>{throw new Error("Function not implemented.")},getInstanceFromScope:scopeInstance=>{throw new Error("Function not implemented.")},detachDeletedInstance:node=>{throw new Error("Function not implemented.")},getCurrentEventPriority:()=>import_constants.DefaultEventPriority,getCurrentUpdatePriority:()=>import_constants.DefaultEventPriority,resolveUpdatePriority:()=>import_constants.DefaultEventPriority,setCurrentUpdatePriority:()=>{},maySuspendCommit:()=>!1,supportsHydration:!1},reconciler=(0,import_react_reconciler.default)(hostConfig),createInstanceFromReactElement=reactElm=>{let rootContainer={children:[],props:{name:"$root"},add(instance){instance.parent=this,this.children.push(instance)},computePcbGlobalTransform(){return identity()}},containerErrors=[],container=reconciler.createContainer(rootContainer,0,null,!1,null,"tsci",error=>{console.log("Error in createContainer"),console.error(error),containerErrors.push(error)},null);if(reconciler.updateContainerSync(reactElm,container,null,()=>{}),reconciler.flushSyncWork(),containerErrors.length>0)throw containerErrors[0];let rootInstance=reconciler.getPublicRootInstance(container);return rootInstance||rootContainer.children[0]},parsePinNumberFromLabelsOrThrow=(pinNumberOrLabel,pinLabels)=>{if(typeof pinNumberOrLabel=="number")return pinNumberOrLabel;if(pinNumberOrLabel.startsWith("pin"))return Number(pinNumberOrLabel.slice(3));if(!pinLabels)throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`);for(let pinNumberKey in pinLabels)if((Array.isArray(pinLabels[pinNumberKey])?pinLabels[pinNumberKey]:[pinLabels[pinNumberKey]]).includes(pinNumberOrLabel))return Number(pinNumberKey.replace("pin",""));throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`)},underscorifyPinStyles=(pinStyles,pinLabels)=>{if(!pinStyles)return;let underscorePinStyles={},mergedStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels);mergedStyles[pinNumber]={...mergedStyles[pinNumber],...pinStyle}}for(let[pinNumber,pinStyle]of Object.entries(mergedStyles)){let pinKey=`pin${pinNumber}`;underscorePinStyles[pinKey]={bottom_margin:pinStyle.bottomMargin,left_margin:pinStyle.leftMargin,right_margin:pinStyle.rightMargin,top_margin:pinStyle.topMargin}}return underscorePinStyles},underscorifyPortArrangement=portArrangement=>{if(portArrangement){if("leftSide"in portArrangement||"rightSide"in portArrangement||"topSide"in portArrangement||"bottomSide"in portArrangement)return{left_side:portArrangement.leftSide,right_side:portArrangement.rightSide,top_side:portArrangement.topSide,bottom_side:portArrangement.bottomSide};if("leftPinCount"in portArrangement||"rightPinCount"in portArrangement||"topPinCount"in portArrangement||"bottomPinCount"in portArrangement)return{left_size:portArrangement.leftPinCount,right_size:portArrangement.rightPinCount,top_size:portArrangement.topPinCount,bottom_size:portArrangement.bottomPinCount};if("leftSize"in portArrangement||"rightSize"in portArrangement||"topSize"in portArrangement||"bottomSize"in portArrangement)return{left_size:portArrangement.leftSize,right_size:portArrangement.rightSize,top_size:portArrangement.topSize,bottom_size:portArrangement.bottomSize}}},Cutout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_cutout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Cutout",zodProps:cutoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),pcb_group_id=this.getGroup()?.pcb_group_id??void 0,globalPosition=this._getGlobalPcbPositionBeforeLayout(),parentRotation=this.getPrimitiveContainer()?._parsedProps.pcbRotation??0,inserted_pcb_cutout;if(props.shape==="rect"){let rotationDeg=typeof parentRotation=="string"?parseInt(parentRotation.replace("deg",""),10):parentRotation,isRotated90=Math.abs(rotationDeg%180)===90,rectData={shape:"rect",center:globalPosition,width:isRotated90?props.height:props.width,height:isRotated90?props.width:props.height,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db.pcb_cutout.insert(rectData)}else if(props.shape==="circle"){let circleData={shape:"circle",center:globalPosition,radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db.pcb_cutout.insert(circleData)}else if(props.shape==="polygon"){let transform5=this._computePcbGlobalTransformBeforeLayout(),polygonData={shape:"polygon",points:props.points.map(p4=>applyToPoint2(transform5,p4)),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db.pcb_cutout.insert(polygonData)}inserted_pcb_cutout&&(this.pcb_cutout_id=inserted_pcb_cutout.pcb_cutout_id)}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="polygon"){if(props.points.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.points)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{width:maxX-minX,height:maxY-minY}}return{width:0,height:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_cutout_id)return super._getPcbCircuitJsonBounds();let{db}=this.root,cutout=db.pcb_cutout.get(this.pcb_cutout_id);if(!cutout)return super._getPcbCircuitJsonBounds();if(cutout.shape==="rect")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.width/2,top:cutout.center.y+cutout.height/2,right:cutout.center.x+cutout.width/2,bottom:cutout.center.y-cutout.height/2},width:cutout.width,height:cutout.height};if(cutout.shape==="circle")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.radius,top:cutout.center.y+cutout.radius,right:cutout.center.x+cutout.radius,bottom:cutout.center.y-cutout.radius},width:cutout.radius*2,height:cutout.radius*2};if(cutout.shape==="polygon"){if(cutout.points.length===0)return super._getPcbCircuitJsonBounds();let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of cutout.points)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}return super._getPcbCircuitJsonBounds()}_setPositionFromLayout(newCenter){if(!this.pcb_cutout_id)return;let{db}=this.root,cutout=db.pcb_cutout.get(this.pcb_cutout_id);if(cutout){if(cutout.shape==="rect"||cutout.shape==="circle")db.pcb_cutout.update(this.pcb_cutout_id,{...cutout,center:newCenter});else if(cutout.shape==="polygon"){let oldCenter=this._getPcbCircuitJsonBounds().center,dx2=newCenter.x-oldCenter.x,dy2=newCenter.y-oldCenter.y,newPoints=cutout.points.map(p4=>({x:p4.x+dx2,y:p4.y+dy2}));db.pcb_cutout.update(this.pcb_cutout_id,{...cutout,points:newPoints})}}}_moveCircuitJsonElements({deltaX,deltaY}){if(!this.pcb_cutout_id)return;let{db}=this.root,cutout=db.pcb_cutout.get(this.pcb_cutout_id);cutout&&(cutout.shape==="rect"||cutout.shape==="circle"?db.pcb_cutout.update(this.pcb_cutout_id,{center:{x:cutout.center.x+deltaX,y:cutout.center.y+deltaY}}):cutout.shape==="polygon"&&db.pcb_cutout.update(this.pcb_cutout_id,{points:cutout.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))}))}},FabricationNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNotePath",zodProps:fabricationNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,subcircuit=this.getSubcircuit(),{_parsedProps:props}=this,layer=props.layer??"top";if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform5=this._computePcbGlobalTransformBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,fabrication_note_path=db.pcb_fabrication_note_path.insert({pcb_component_id,layer,color:props.color,route:props.route.map(p4=>{let transformedPosition=applyToPoint2(transform5,{x:p4.x,y:p4.y});return{...p4,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0});this.fabrication_note_path_id=fabrication_note_path.pcb_fabrication_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point6=>typeof point6.x=="string"?parseFloat(point6.x):point6.x),ys3=props.route.map(point6=>typeof point6.y=="string"?parseFloat(point6.y):point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.fabrication_note_path_id)return;let path=db.pcb_fabrication_note_path.get(this.fabrication_note_path_id);path&&db.pcb_fabrication_note_path.update(this.fabrication_note_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}},FabricationNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteRect",zodProps:fabricationNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteRect. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),hasStroke=props.hasStroke??(props.strokeWidth!==void 0&&props.strokeWidth!==null),fabrication_note_rect=db.pcb_fabrication_note_rect.insert({pcb_component_id,layer,color:props.color,center:{x:position2.x,y:position2.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??1,is_filled:props.isFilled??!1,has_stroke:hasStroke,is_stroke_dashed:props.isStrokeDashed??!1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,corner_radius:props.cornerRadius??void 0});this.fabrication_note_rect_id=fabrication_note_rect.pcb_fabrication_note_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.fabrication_note_rect_id)return;let rect=db.pcb_fabrication_note_rect.get(this.fabrication_note_rect_id);rect&&db.pcb_fabrication_note_rect.update(this.fabrication_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}};function normalizeTextForCircuitJson(text){return text.replace(/\\n/g,`
|
|
652
652
|
`)}var FabricationNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_fabrication_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteText",zodProps:fabricationNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit(),pcb_fabrication_note_text2=db.pcb_fabrication_note_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:props.font??"tscircuit2024",font_size:props.fontSize??1,layer:"top",color:props.color,text:normalizeTextForCircuitJson(props.text??""),pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_fabrication_note_text_id=pcb_fabrication_note_text2.pcb_fabrication_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:(props.text??"").length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(this.pcb_fabrication_note_text_id){let text=db.pcb_fabrication_note_text.get(this.pcb_fabrication_note_text_id);text&&db.pcb_fabrication_note_text.update(this.pcb_fabrication_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},Hole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_hole_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Hole",zodProps:holeProps}}getPcbSize(){let{_parsedProps:props}=this,isPill=props.shape==="pill",isRect=props.shape==="rect";return isPill?{width:props.width,height:props.height}:isRect?{width:props.width,height:props.height}:{width:props.diameter,height:props.diameter}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin),props.shape==="pill")if(props.pcbRotation&&props.pcbRotation!==0){let inserted_hole=db.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rotated_pill",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,ccw_rotation:props.pcbRotation,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"pill",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else if(props.shape==="rect"){let inserted_hole=db.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rect",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"circle",hole_diameter:props.diameter,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}}_getPcbCircuitJsonBounds(){let{db}=this.root,hole=db.pcb_hole.get(this.pcb_hole_id),size2=this.getPcbSize();return{center:{x:hole.x,y:hole.y},bounds:{left:hole.x-size2.width/2,top:hole.y-size2.height/2,right:hole.x+size2.width/2,bottom:hole.y+size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db}=this.root;db.pcb_hole.update(this.pcb_hole_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_hole_id)return;let hole=db.pcb_hole.get(this.pcb_hole_id);hole&&db.pcb_hole.update(this.pcb_hole_id,{x:hole.x+deltaX,y:hole.y+deltaY})}},Keepout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_keepout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Keepout",zodProps:pcbKeepoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let subcircuit=this.getSubcircuit(),{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),decomposedMat=decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()),isRotated90=Math.abs(decomposedMat.rotation.angle*(180/Math.PI)-90)%180<.01,pcb_keepout2=null;props.shape==="circle"?pcb_keepout2=db.pcb_keepout.insert({layers:["top"],shape:"circle",radius:props.radius,center:{x:position2.x,y:position2.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0}):props.shape==="rect"&&(pcb_keepout2=db.pcb_keepout.insert({layers:["top"],shape:"rect",...isRotated90?{width:props.height,height:props.width}:{width:props.width,height:props.height},center:{x:position2.x,y:position2.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0})),pcb_keepout2&&(this.pcb_keepout_id=pcb_keepout2.pcb_keepout_id)}getPcbSize(){let{_parsedProps:props}=this;return props.shape==="circle"?{width:props.radius*2,height:props.radius*2}:props.shape==="rect"?{width:props.width,height:props.height}:{width:0,height:0}}},PcbNoteLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteLine",zodProps:pcbNoteLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),group=this.getGroup(),transform5=this._computePcbGlobalTransformBeforeLayout(),start=applyToPoint2(transform5,{x:props.x1,y:props.y1}),end=applyToPoint2(transform5,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_line2=db.pcb_note_line.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,x1:start.x,y1:start.y,x2:end.x,y2:end.y,stroke_width:props.strokeWidth??.1,color:props.color,is_dashed:props.isDashed});this.pcb_note_line_id=pcb_note_line2.pcb_note_line_id}getPcbSize(){let{_parsedProps:props}=this;return{width:Math.abs(props.x2-props.x1),height:Math.abs(props.y2-props.y1)}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_note_line_id)return;let line2=db.pcb_note_line.get(this.pcb_note_line_id);line2&&db.pcb_note_line.update(this.pcb_note_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},PcbNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNotePath",zodProps:pcbNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,transformedRoute=props.route.map(point6=>{let{x:x5,y:y5,...rest}=point6,numericX=typeof x5=="string"?parseFloat(x5):x5,numericY=typeof y5=="string"?parseFloat(y5):y5,transformed=applyToPoint2(transform5,{x:numericX,y:numericY});return{...rest,x:transformed.x,y:transformed.y}}),pcb_note_path2=db.pcb_note_path.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,route:transformedRoute,stroke_width:props.strokeWidth??.1,color:props.color});this.pcb_note_path_id=pcb_note_path2.pcb_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point6=>typeof point6.x=="string"?parseFloat(point6.x):point6.x),ys3=props.route.map(point6=>typeof point6.y=="string"?parseFloat(point6.y):point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_note_path_id)return;let path=db.pcb_note_path.get(this.pcb_note_path_id);path&&db.pcb_note_path.update(this.pcb_note_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}},PcbNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteRect",zodProps:pcbNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),center2=applyToPoint2(transform5,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_rect2=db.pcb_note_rect.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,center:center2,width:props.width,height:props.height,stroke_width:props.strokeWidth??.1,is_filled:props.isFilled??!1,has_stroke:props.hasStroke??!0,is_stroke_dashed:props.isStrokeDashed??!1,color:props.color,corner_radius:props.cornerRadius??void 0});this.pcb_note_rect_id=pcb_note_rect2.pcb_note_rect_id}getPcbSize(){let{_parsedProps:props}=this,width=typeof props.width=="string"?parseFloat(props.width):props.width,height=typeof props.height=="string"?parseFloat(props.height):props.height;return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_note_rect_id)return;let rect=db.pcb_note_rect.get(this.pcb_note_rect_id);rect&&db.pcb_note_rect.update(this.pcb_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},PcbNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteText",zodProps:pcbNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),anchorPosition=applyToPoint2(transform5,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_text2=db.pcb_note_text.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,font:props.font??"tscircuit2024",font_size:props.fontSize??1,text:normalizeTextForCircuitJson(props.text),anchor_position:anchorPosition,anchor_alignment:props.anchorAlignment??"center",color:props.color});this.pcb_note_text_id=pcb_note_text2.pcb_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:props.text.length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_note_text_id)return;let text=db.pcb_note_text.get(this.pcb_note_text_id);text&&db.pcb_note_text.update(this.pcb_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},pcbTraceProps2=external_exports.object({route:external_exports.array(pcb_trace_route_point),source_trace_id:external_exports.string().optional()}),PcbTrace=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_trace_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbTrace",zodProps:pcbTraceProps2}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),parentTransform=this._computePcbGlobalTransformBeforeLayout(),transformedRoute=props.route.map(point6=>{let{x:x5,y:y5,...restOfPoint}=point6,transformedPoint=applyToPoint2(parentTransform,{x:x5,y:y5});return point6.route_type==="wire"&&point6.layer?{...transformedPoint,...restOfPoint,layer:maybeFlipLayer(point6.layer)}:{...transformedPoint,...restOfPoint}}),pcb_trace2=db.pcb_trace.insert({pcb_component_id:container.pcb_component_id,source_trace_id:props.source_trace_id,route:transformedRoute,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_trace_id=pcb_trace2.pcb_trace_id}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y),point6.route_type==="wire"&&(minX=Math.min(minX,point6.x-point6.width/2),maxX=Math.max(maxX,point6.x+point6.width/2),minY=Math.min(minY,point6.y-point6.width/2),maxY=Math.max(maxY,point6.y+point6.width/2));return minX===1/0||maxX===-1/0||minY===1/0||maxY===-1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}},PlatedHole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_plated_hole_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PlatedHole",zodProps:platedHoleProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.outerDiameter,height:props.outerDiameter};if(props.shape==="oval"||props.shape==="pill")return{width:props.outerWidth,height:props.outerHeight};if(props.shape==="circular_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="pill_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="hole_with_polygon_pad"){if(!props.padOutline||props.padOutline.length===0)throw new Error("padOutline is required for hole_with_polygon_pad shape");let xs3=props.padOutline.map(p4=>typeof p4.x=="number"?p4.x:parseFloat(String(p4.x))),ys3=props.padOutline.map(p4=>typeof p4.y=="number"?p4.y:parseFloat(String(p4.y))),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}_getPcbCircuitJsonBounds(){let{db}=this.root,platedHole=db.pcb_plated_hole.get(this.pcb_plated_hole_id),size2=this.getPcbSize();return{center:{x:platedHole.x,y:platedHole.y},bounds:{left:platedHole.x-size2.width/2,top:platedHole.y+size2.height/2,right:platedHole.x+size2.width/2,bottom:platedHole.y-size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db}=this.root;db.pcb_plated_hole.update(this.pcb_plated_hole_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(this.props.portHints){for(let port of parentPorts)if(port.isMatchingAnyOf(this.props.portHints)){this.matchedPort=port,port.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let finalRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360;if(props.shape==="circle"){let pcb_plated_hole2=db.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_diameter:props.outerDiameter,hole_diameter:props.holeDiameter,shape:"circle",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id,db.pcb_solder_paste.insert({layer:"top",shape:"circle",radius:props.outerDiameter/2,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db.pcb_solder_paste.insert({layer:"bottom",shape:"circle",radius:props.outerDiameter/2,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="pill"&&props.rectPad){let pcb_plated_hole2=db.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",port_hints:this.getNameAndAliases(),pcb_plated_hole_id:this.pcb_plated_hole_id,x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:props.pcbRotation??0,rect_ccw_rotation:props.pcbRotation??0,rect_pad_width:props.outerWidth,rect_pad_height:props.outerHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="pill"||props.shape==="oval"){let pcb_plated_hole2=db.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:props.shape,port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,ccw_rotation:props.pcbRotation??0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id,db.pcb_solder_paste.insert({layer:"top",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db.pcb_solder_paste.insert({layer:"bottom",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="circular_hole_with_rect_pad"){let pcb_plated_hole2=db.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_diameter:props.holeDiameter,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,shape:"circular_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,rect_border_radius:props.rectBorderRadius??0,rect_ccw_rotation:finalRotationDegrees});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="pill_hole_with_rect_pad"){let pcb_plated_hole2=db.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:props.holeWidth,hole_height:props.holeHeight,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,shape:"pill_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="hole_with_polygon_pad"){let padOutline=(props.padOutline||[]).map(point6=>{let x5=typeof point6.x=="number"?point6.x:parseFloat(String(point6.x)),y5=typeof point6.y=="number"?point6.y:parseFloat(String(point6.y));return{x:x5,y:y5}}),pcb_plated_hole2=db.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,shape:"hole_with_polygon_pad",hole_shape:props.holeShape||"circle",hole_diameter:props.holeDiameter,hole_width:props.holeWidth,hole_height:props.holeHeight,pad_outline:padOutline,hole_offset_x:typeof props.holeOffsetX=="number"?props.holeOffsetX:parseFloat(String(props.holeOffsetX||0)),hole_offset_y:typeof props.holeOffsetY=="number"?props.holeOffsetY:parseFloat(String(props.holeOffsetY||0)),port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db}=this.root;db.pcb_plated_hole.update(this.pcb_plated_hole_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_plated_hole_id)return;let hole=db.pcb_plated_hole.get(this.pcb_plated_hole_id);if(hole){let newCenter={x:hole.x+deltaX,y:hole.y+deltaY};this._setPositionFromLayout(newCenter)}}},SilkscreenCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenCircle",zodProps:silkscreenCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_circle2=db.pcb_silkscreen_circle.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1});this.pcb_silkscreen_circle_id=pcb_silkscreen_circle2.pcb_silkscreen_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_silkscreen_circle_id)return;let circle2=db.pcb_silkscreen_circle.get(this.pcb_silkscreen_circle_id);circle2&&db.pcb_silkscreen_circle.update(this.pcb_silkscreen_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},SilkscreenLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenLine",zodProps:silkscreenLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenLine. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),transform5=this._computePcbGlobalTransformBeforeLayout(),p12=applyToPoint2(transform5,{x:props.x1,y:props.y1}),p22=applyToPoint2(transform5,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_line2=db.pcb_silkscreen_line.insert({pcb_component_id,layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y,stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_line_id=pcb_silkscreen_line2.pcb_silkscreen_line_id}getPcbSize(){let{_parsedProps:props}=this,width=Math.abs(props.x2-props.x1),height=Math.abs(props.y2-props.y1);return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_silkscreen_line_id)return;let line2=db.pcb_silkscreen_line.get(this.pcb_silkscreen_line_id);line2&&db.pcb_silkscreen_line.update(this.pcb_silkscreen_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},SilkscreenPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenPath",zodProps:silkscreenPathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_path2=db.pcb_silkscreen_path.insert({pcb_component_id,layer,route:props.route.map(p4=>{let transformedPosition=applyToPoint2(transform5,{x:p4.x,y:p4.y});return{...p4,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_id=pcb_silkscreen_path2.pcb_silkscreen_path_id}_setPositionFromLayout(newCenter){let{db}=this.root,{_parsedProps:props}=this,currentPath=db.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);if(!currentPath)return;let currentCenterX=0,currentCenterY=0;for(let point6 of currentPath.route)currentCenterX+=point6.x,currentCenterY+=point6.y;currentCenterX/=currentPath.route.length,currentCenterY/=currentPath.route.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newRoute=currentPath.route.map(point6=>({...point6,x:point6.x+offsetX,y:point6.y+offsetY}));db.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:newRoute})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_silkscreen_path_id)return;let path=db.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);path&&db.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{width:maxX-minX,height:maxY-minY}}},SilkscreenRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenRect",zodProps:silkscreenRectProps}}_isRotated90Degrees(){let globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(globalTransform).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01;return Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),isRotated90Degrees=this._isRotated90Degrees(),finalWidth=isRotated90Degrees?props.height:props.width,finalHeight=isRotated90Degrees?props.width:props.height,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_rect2=db.pcb_silkscreen_rect.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},width:finalWidth,height:finalHeight,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this?.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1,is_filled:props.filled??!1,corner_radius:props.cornerRadius??void 0});this.pcb_silkscreen_rect_id=pcb_silkscreen_rect2.pcb_silkscreen_rect_id}getPcbSize(){let{_parsedProps:props}=this;return this._isRotated90Degrees()?{width:props.height,height:props.width}:{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_silkscreen_rect_id)return;let rect=db.pcb_silkscreen_rect.get(this.pcb_silkscreen_rect_id);rect&&db.pcb_silkscreen_rect.update(this.pcb_silkscreen_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}};function parseSegment(seg){let bracketIdx=seg.indexOf("[");if(bracketIdx===-1)return{tag:seg};let tag=seg.slice(0,bracketIdx),m3=seg.slice(bracketIdx+1,seg.lastIndexOf("]")).match(/^(\w+)(\^=|\$=|=)['"]?(.*?)['"]?$/);return m3?{tag,attrName:m3[1],attrOp:m3[2],attrValue:m3[3]}:{tag}}function componentMatchesSegment(component,seg){if(component.lowercaseComponentName!==seg.tag)return!1;if(!seg.attrName)return!0;let attrVal=component.props?.[seg.attrName];if(attrVal===void 0)return!1;let valStr=String(attrVal);switch(seg.attrOp){case"^=":return valStr.startsWith(seg.attrValue);case"$=":return valStr.endsWith(seg.attrValue);case"=":return valStr===seg.attrValue;default:return!1}}function matchesCompoundSelector(component,segments){if(!componentMatchesSegment(component,segments[segments.length-1]))return!1;let segIdx=segments.length-2,current2=component.parent;for(;segIdx>=0&¤t2;)componentMatchesSegment(current2,segments[segIdx])&&segIdx--,current2=current2.parent;return segIdx<0}function resolvePcbProperty({propertyName,resolvedPcbSx,pathFromAmpersand,component}){if(!resolvedPcbSx)return;let result,bestSpecificity=0;for(let[key,entry]of Object.entries(resolvedPcbSx)){if(!entry||!(propertyName in entry))continue;let selectorBody=key.startsWith("& ")?key.slice(2):key;if(selectorBody===pathFromAmpersand){1>bestSpecificity&&(bestSpecificity=1,result=entry[propertyName]);continue}if(!component)continue;let segments=selectorBody.split(/\s+/).map(parseSegment);if(!(segments.length<2)&&matchesCompoundSelector(component,segments)){let specificity=segments.length;specificity>bestSpecificity&&(bestSpecificity=specificity,result=entry[propertyName])}}return result}var SilkscreenText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_text_ids",[]);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"_footprinterFontSize")}get config(){return{componentName:"SilkscreenText",zodProps:silkscreenTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),subcircuit=this.getSubcircuit(),rotation4=0;if(props.pcbRotation!==void 0&&props.pcbRotation!==0)rotation4=props.pcbRotation;else{let globalTransform=this._computePcbGlobalTransformBeforeLayout();rotation4=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI}isFlipped&&(rotation4=(rotation4+180)%360);let uniqueLayers=new Set(props.layers);props.layer&&uniqueLayers.add(props.layer);let targetLayers=uniqueLayers.size>0?Array.from(uniqueLayers):["top"],resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbX=resolvePcbProperty({propertyName:"pcbX",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbY=resolvePcbProperty({propertyName:"pcbY",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,position2=(resolvedPcbSxPcbX!==void 0||resolvedPcbSxPcbY!==void 0)&&this._footprinterFontSize!==void 0?applyToPoint2(compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),isFlipped?flipY():identity()),{x:this.resolvePcbCoordinate(resolvedPcbSxPcbX??props.pcbX??0,"pcbX"),y:this.resolvePcbCoordinate(resolvedPcbSxPcbY??props.pcbY??0,"pcbY")}):this._getGlobalPcbPositionBeforeLayout(),uniformPadding=props.knockoutPadding??0,knockoutPadding=props.knockoutPadding!==void 0||props.knockoutPaddingLeft!==void 0||props.knockoutPaddingRight!==void 0||props.knockoutPaddingTop!==void 0||props.knockoutPaddingBottom!==void 0?{left:props.knockoutPaddingLeft??uniformPadding,right:props.knockoutPaddingRight??uniformPadding,top:props.knockoutPaddingTop??uniformPadding,bottom:props.knockoutPaddingBottom??uniformPadding}:void 0;for(let layer of targetLayers){let pcb_silkscreen_text2=db.pcb_silkscreen_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:props.font??"tscircuit2024",font_size:fontSize,layer:maybeFlipLayer(layer),text:normalizeTextForCircuitJson(props.text??""),ccw_rotation:rotation4,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,is_knockout:props.isKnockout,knockout_padding:knockoutPadding});this.pcb_silkscreen_text_ids.push(pcb_silkscreen_text2.pcb_silkscreen_text_id)}}getPcbSize(){let{_parsedProps:props}=this,resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,textWidth=(props.text??"").length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;for(let id2 of this.pcb_silkscreen_text_ids){let text=db.pcb_silkscreen_text.get(id2);text&&db.pcb_silkscreen_text.update(id2,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},SmtPad=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SmtPad",zodProps:smtPadProps}}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="rotated_rect"){let angleRad=(props.ccwRotation??0)*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),width=Math.abs(props.width*cosAngle)+Math.abs(props.height*sinAngle),height=Math.abs(props.width*sinAngle)+Math.abs(props.height*cosAngle);return{width,height}}if(props.shape==="polygon"){let points=props.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}if(props.shape==="pill")return{width:props.width,height:props.height};throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(this.props.portHints){for(let port of parentPorts)if(port.isMatchingAnyOf(this.props.portHints)){this.matchedPort=port,port.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,shouldCreateSolderPaste=!isCoveredWithSolderMask,soldermaskMargin=props.solderMaskMargin;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01,isAxisAligned=Math.abs(normalizedRotationDegrees)<rotationTolerance||Math.abs(normalizedRotationDegrees-180)<rotationTolerance||Math.abs(normalizedRotationDegrees-360)<rotationTolerance,isRotated90Degrees=Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance,finalRotationDegrees=Math.abs(normalizedRotationDegrees-360)<rotationTolerance?0:normalizedRotationDegrees,transformRotationBeforeFlip=finalRotationDegrees,{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers();isFlipped&&(finalRotationDegrees=(360-finalRotationDegrees+360)%360);let portHints2=props.portHints?.map(ph3=>ph3.toString())??[],pcb_smtpad2=null,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(props.shape==="circle")pcb_smtpad2=db.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"circle",radius:props.radius,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0}),shouldCreateSolderPaste&&db.pcb_solder_paste.insert({layer:pcb_smtpad2.layer,shape:"circle",radius:pcb_smtpad2.radius*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});else if(props.shape==="rect")!isAxisAligned&&!isRotated90Degrees?pcb_smtpad2=db.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position2.x,y:position2.y,ccw_rotation:finalRotationDegrees,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad2=db.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:isRotated90Degrees?props.height:props.width,height:isRotated90Degrees?props.width:props.height,corner_radius:props.cornerRadius??void 0,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&(pcb_smtpad2.shape==="rect"?db.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad2.shape==="rotated_rect"&&db.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,ccw_rotation:pcb_smtpad2.ccw_rotation,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));else if(props.shape==="rotated_rect"){let baseRotation=props.ccwRotation??0,combinedRotationBeforeFlip=(transformRotationBeforeFlip+baseRotation+360)%360,padRotation=isFlipped?(360-combinedRotationBeforeFlip+360)%360:combinedRotationBeforeFlip;pcb_smtpad2=db.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position2.x,y:position2.y,ccw_rotation:padRotation,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&db.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:position2.x,y:position2.y,ccw_rotation:padRotation,pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="polygon"){let transformedPoints=props.points.map(point6=>{let transformed=applyToPoint2(globalTransform,{x:distance.parse(point6.x),y:distance.parse(point6.y)});return{x:transformed.x,y:transformed.y}});pcb_smtpad2=db.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"polygon",points:transformedPoints,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else props.shape==="pill"&&(pcb_smtpad2=db.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"pill",x:position2.x,y:position2.y,radius:props.radius,height:props.height,width:props.width,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));pcb_smtpad2&&(this.pcb_smtpad_id=pcb_smtpad2.pcb_smtpad_id)}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db}=this.root;db.pcb_smtpad.update(this.pcb_smtpad_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_getPcbCircuitJsonBounds(){let{db}=this.root,smtpad2=db.pcb_smtpad.get(this.pcb_smtpad_id);if(smtpad2.shape==="rect")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.width/2,top:smtpad2.y+smtpad2.height/2,right:smtpad2.x+smtpad2.width/2,bottom:smtpad2.y-smtpad2.height/2},width:smtpad2.width,height:smtpad2.height};if(smtpad2.shape==="rotated_rect"){let angleRad=smtpad2.ccw_rotation*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),w22=smtpad2.width/2,h22=smtpad2.height/2,xExtent=Math.abs(w22*cosAngle)+Math.abs(h22*sinAngle),yExtent=Math.abs(w22*sinAngle)+Math.abs(h22*cosAngle);return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-xExtent,right:smtpad2.x+xExtent,top:smtpad2.y-yExtent,bottom:smtpad2.y+yExtent},width:xExtent*2,height:yExtent*2}}if(smtpad2.shape==="circle")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.radius,top:smtpad2.y-smtpad2.radius,right:smtpad2.x+smtpad2.radius,bottom:smtpad2.y+smtpad2.radius},width:smtpad2.radius*2,height:smtpad2.radius*2};if(smtpad2.shape==="polygon"){let points=smtpad2.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}if(smtpad2.shape==="pill"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-halfWidth,top:smtpad2.y-halfHeight,right:smtpad2.x+halfWidth,bottom:smtpad2.y+halfHeight},width:smtpad2.width,height:smtpad2.height}}throw new Error(`circuitJson bounds calculation not implemented for shape "${smtpad2.shape}"`)}_setPositionFromLayout(newCenter){let{db}=this.root;db.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y});let solderPaste=db.pcb_solder_paste.list().find(elm=>elm.pcb_smtpad_id===this.pcb_smtpad_id);solderPaste&&db.pcb_solder_paste.update(solderPaste.pcb_solder_paste_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db.pcb_smtpad.get(this.pcb_smtpad_id);if(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill")this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY});else if(pad2.shape==="polygon"){db.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))});let newCenter={x:this._getPcbCircuitJsonBounds().center.x+deltaX/2,y:this._getPcbCircuitJsonBounds().center.y+deltaY/2};this.matchedPort?._setPositionFromLayout(newCenter)}}},createPinrowSilkscreenText=({elm,pinLabels,layer,readableRotation,anchorAlignment})=>{let pinNum=elm.text.replace(/[{}]/g,"").toLowerCase(),label=pinNum;if(Array.isArray(pinLabels)){let index=parseInt(pinNum.replace(/[^\d]/g,""),10)-1;label=String(pinLabels[index]??pinNum)}else typeof pinLabels=="object"&&(label=String(pinLabels[pinNum]??pinNum));let silkscreenText=new SilkscreenText({anchorAlignment:anchorAlignment||"center",text:label??pinNum,layer:layer||"top",pcbX:isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:readableRotation??0});return silkscreenText._footprinterFontSize=elm.font_size+.2,silkscreenText},calculateCcwRotation=(componentRotationStr,elementCcwRotation)=>{let componentAngle=parseInt(componentRotationStr||"0",10),totalRotation;return elementCcwRotation!=null?totalRotation=elementCcwRotation-componentAngle:totalRotation=componentAngle,(totalRotation%360+360)%360},createComponentsFromCircuitJson=({componentName,componentRotation,footprinterString,pinLabels,pcbPinLabels},circuitJson)=>{let components=[];for(let elm of circuitJson)if(elm.type==="pcb_smtpad"&&elm.shape==="rect")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"rect",height:elm.height,width:elm.width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius}));else if(elm.type==="pcb_smtpad"&&elm.shape==="circle")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"circle",radius:elm.radius,portHints:elm.port_hints}));else if(elm.type==="pcb_smtpad"&&elm.shape==="pill")components.push(new SmtPad({shape:"pill",height:elm.height,width:elm.width,radius:elm.radius,portHints:elm.port_hints,pcbX:elm.x,pcbY:elm.y,layer:elm.layer}));else if(elm.type==="pcb_silkscreen_path")components.push(new SilkscreenPath({layer:elm.layer,route:elm.route,strokeWidth:elm.stroke_width}));else if(elm.type==="pcb_plated_hole")elm.shape==="circle"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circle",holeDiameter:elm.hole_diameter,outerDiameter:elm.outer_diameter,portHints:elm.port_hints})):elm.shape==="circular_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circular_hole_with_rect_pad",holeDiameter:elm.hole_diameter,rectPadHeight:elm.rect_pad_height,rectPadWidth:elm.rect_pad_width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="pill"||elm.shape==="oval"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:elm.shape,holeWidth:elm.hole_width,holeHeight:elm.hole_height,outerWidth:elm.outer_width,outerHeight:elm.outer_height,portHints:elm.port_hints})):elm.shape==="pill_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:elm.hole_width,holeHeight:elm.hole_height,rectPadWidth:elm.rect_pad_width,rectPadHeight:elm.rect_pad_height,portHints:elm.port_hints,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="hole_with_polygon_pad"&&components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"hole_with_polygon_pad",holeShape:elm.hole_shape||"circle",holeDiameter:elm.hole_diameter,holeWidth:elm.hole_width,holeHeight:elm.hole_height,padOutline:elm.pad_outline||[],holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y,portHints:elm.port_hints}));else if(elm.type==="pcb_keepout"&&elm.shape==="circle")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius}));else if(elm.type==="pcb_keepout"&&elm.shape==="rect")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="circle")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,diameter:elm.hole_diameter}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rect")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"rect",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rotated_pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height,pcbRotation:elm.ccw_rotation}));else if(elm.type==="pcb_cutout")elm.shape==="rect"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height})):elm.shape==="circle"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius})):elm.shape==="polygon"&&components.push(new Cutout({shape:"polygon",points:elm.points}));else if(elm.type==="pcb_silkscreen_text"){let ccwRotation=calculateCcwRotation(componentRotation,elm.ccw_rotation);if(footprinterString?.includes("pinrow")&&elm.text.includes("PIN"))components.push(createPinrowSilkscreenText({elm,pinLabels:pcbPinLabels??pinLabels??{},layer:elm.layer,readableRotation:ccwRotation,anchorAlignment:elm.anchor_alignment}));else{let silkscreenText=new SilkscreenText({anchorAlignment:elm.anchor_alignment||"center",text:componentName||elm.text,pcbX:Number.isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:ccwRotation??0});silkscreenText._footprinterFontSize=elm.font_size+.2,components.push(silkscreenText)}}else elm.type==="pcb_trace"?components.push(new PcbTrace({route:elm.route})):elm.type==="pcb_silkscreen_rect"?components.push(new SilkscreenRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer,strokeWidth:elm.stroke_width,filled:elm.is_filled,cornerRadius:elm.corner_radius})):elm.type==="pcb_silkscreen_circle"?components.push(new SilkscreenCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_silkscreen_line"?components.push(new SilkscreenLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_fabrication_note_text"?components.push(new FabricationNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text,fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_fabrication_note_path"?components.push(new FabricationNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color,layer:elm.layer})):elm.type==="pcb_fabrication_note_rect"?components.push(new FabricationNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,layer:elm.layer,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_text"?components.push(new PcbNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text??"",fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_note_rect"?components.push(new PcbNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_path"?components.push(new PcbNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color})):elm.type==="pcb_note_line"&&components.push(new PcbNoteLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,strokeWidth:elm.stroke_width,color:elm.color,isDashed:elm.is_dashed}));return components};function filterPinLabels(pinLabels){if(!pinLabels)return{validPinLabels:pinLabels,invalidPinLabelsMessages:[]};let validPinLabels={},invalidPinLabelsMessages=[];for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels.slice():[labelOrLabels],validLabels=[];for(let label of labels)isValidPinLabel(pin,label)?validLabels.push(label):invalidPinLabelsMessages.push(`Invalid pin label: ${pin} = '${label}' - excluding from component. Please use a valid pin label.`);validLabels.length>0&&(validPinLabels[pin]=Array.isArray(labelOrLabels)?validLabels:validLabels[0])}return{validPinLabels:Object.keys(validPinLabels).length>0?validPinLabels:void 0,invalidPinLabelsMessages}}function isValidPinLabel(pin,label){try{let testProps={name:"test",footprint:"test",pinLabels:{[pin]:label}};return chipProps.safeParse(testProps).success}catch{return!1}}function getBoundsOfPcbComponents(components){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,hasValidComponents=!1;for(let child of components)if(child.isPcbPrimitive&&!child.componentName.startsWith("Silkscreen")&&!child.componentName.startsWith("PcbNote")){let{x:x5,y:y5}=child._getGlobalPcbPositionBeforeLayout(),{width:width2,height:height2}=child.getPcbSize();minX=Math.min(minX,x5-width2/2),minY=Math.min(minY,y5-height2/2),maxX=Math.max(maxX,x5+width2/2),maxY=Math.max(maxY,y5+height2/2),hasValidComponents=!0}else if(child.children.length>0){let childBounds=getBoundsOfPcbComponents(child.children);(childBounds.width>0||childBounds.height>0)&&(minX=Math.min(minX,childBounds.minX),minY=Math.min(minY,childBounds.minY),maxX=Math.max(maxX,childBounds.maxX),maxY=Math.max(maxY,childBounds.maxY),hasValidComponents=!0)}if(!hasValidComponents)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};let width=maxX-minX,height=maxY-minY;return width<0&&(width=0),height<0&&(height=0),{minX,minY,maxX,maxY,width,height}}function getRelativeDirection(pointA,pointB){let dx2=pointB.x-pointA.x,dy2=pointB.y-pointA.y;return Math.abs(dx2)>Math.abs(dy2)?dx2>=0?"right":"left":dy2>=0?"up":"down"}var stringProxy=new Proxy({},{get:(target,prop)=>prop}),FTYPE=stringProxy,SCHEMATIC_COMPONENT_OUTLINE_COLOR="rgba(132, 0, 0)",SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH=.12,areAllPcbPrimitivesOverlapping=pcbPrimitives=>{if(pcbPrimitives.length<=1)return!0;let bounds=pcbPrimitives.map(p4=>{let circuitBounds=p4._getPcbCircuitJsonBounds();return{left:circuitBounds.bounds.left,right:circuitBounds.bounds.right,top:circuitBounds.bounds.top,bottom:circuitBounds.bounds.bottom}}),overlaps=Array(bounds.length).fill(!1).map(()=>Array(bounds.length).fill(!1));for(let i2=0;i2<bounds.length;i2++)for(let j4=i2+1;j4<bounds.length;j4++){let a2=bounds[i2],b3=bounds[j4];overlaps[i2][j4]=overlaps[j4][i2]=!(a2.right<b3.left||a2.left>b3.right||a2.bottom>b3.top||a2.top<b3.bottom)}let visited=new Set,dfs=node=>{visited.add(node);for(let i2=0;i2<bounds.length;i2++)overlaps[node][i2]&&!visited.has(i2)&&dfs(i2)};return dfs(0),visited.size===bounds.length},getCenterOfPcbPrimitives=pcbPrimitives=>{if(pcbPrimitives.length===0)throw new Error("Cannot get center of empty PCB primitives array");let positions=pcbPrimitives.map(p4=>p4._getPcbCircuitJsonBounds().center).filter(Boolean),sumX=positions.reduce((sum,pos)=>sum+pos.x,0),sumY=positions.reduce((sum,pos)=>sum+pos.y,0);return{x:sumX/positions.length,y:sumY/positions.length}},portProps2=external_exports.object({name:external_exports.string().optional(),pinNumber:external_exports.number().optional(),schStemLength:external_exports.number().optional(),aliases:external_exports.array(external_exports.string()).optional(),layer:external_exports.string().optional(),layers:external_exports.array(external_exports.string()).optional(),schX:external_exports.number().optional(),schY:external_exports.number().optional(),direction:external_exports.enum(["up","down","left","right"]).optional(),connectsTo:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())]).optional()}),Port=class extends PrimitiveComponent2{constructor(props,opts={}){if(!props.name&&props.pinNumber!==void 0&&(props.name=`pin${props.pinNumber}`),!props.name)throw new Error("Port must have a name or a pinNumber");super(props);__publicField(this,"source_port_id",null);__publicField(this,"pcb_port_id",null);__publicField(this,"schematic_port_id",null);__publicField(this,"schematic_stem_line_id",null);__publicField(this,"schematicSymbolPortDef",null);__publicField(this,"matchedComponents");__publicField(this,"facingDirection",null);__publicField(this,"originDescription",null);opts.originDescription&&(this.originDescription=opts.originDescription),this.matchedComponents=[]}get config(){return{componentName:"Port",zodProps:portProps2}}isGroupPort(){return this.parent?.componentName==="Group"}isComponentPort(){return!this.isGroupPort()}_getConnectedPortsFromConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo;if(!connectsTo)return[];let connectedPorts=[],connectsToArray=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let connection of connectsToArray){let port=this.getSubcircuit().selectOne(connection,{type:"port"});port&&connectedPorts.push(port)}return connectedPorts}_isBoardPinoutFromAttributes(){let parent=this.parent;if(parent?._parsedProps?.pinAttributes){let pinAttributes=parent._parsedProps.pinAttributes;for(let alias of this.getNameAndAliases())if(pinAttributes[alias]?.includeInBoardPinout)return!0}}_getGlobalPcbPositionBeforeLayout(){let matchedPcbElm=this.matchedComponents.find(c3=>c3.isPcbPrimitive),parentComponent=this.parent;if(parentComponent&&!parentComponent.props.footprint)throw new Error(`${parentComponent.componentName} "${parentComponent.props.name}" does not have a footprint. Add a footprint prop, e.g. <${parentComponent.componentName.toLowerCase()} footprint="..." />`);if(!matchedPcbElm)throw new Error(`Port ${this} has no matching PCB primitives. This often means the footprint's pads lack matching port hints.`);return matchedPcbElm?._getGlobalPcbPositionBeforeLayout()??{x:0,y:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_port_id)return super._getPcbCircuitJsonBounds();let{db}=this.root,pcb_port2=db.pcb_port.get(this.pcb_port_id);return{center:{x:pcb_port2.x,y:pcb_port2.y},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getGlobalPcbPositionAfterLayout(){return this._getPcbCircuitJsonBounds().center}_getPortsInternallyConnectedToThisPort(){let parent=this.parent;if(!parent||!parent._getInternallyConnectedPins)return[];let internallyConnectedPorts=parent._getInternallyConnectedPins();for(let ports of internallyConnectedPorts)if(ports.some(port=>port===this))return ports;return[]}_hasSchematicPort(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return!0;let parentNormalComponent=this.getParentNormalComponent();if(parentNormalComponent?.getSchematicSymbol())return!!(this.schematicSymbolPortDef||this._getPortsInternallyConnectedToThisPort().some(p4=>p4.schematicSymbolPortDef));let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();return!!(parentBoxDim&&this.props.pinNumber!==void 0&&parentBoxDim.getPortPositionByPinNumber(this.props.pinNumber))}_getGlobalSchematicPositionBeforeLayout(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return{x:schX,y:schY};let parentNormalComponent=this.getParentNormalComponent(),symbol=parentNormalComponent?.getSchematicSymbol();if(symbol){let schematicSymbolPortDef=this.schematicSymbolPortDef;if(!schematicSymbolPortDef&&(schematicSymbolPortDef=this._getPortsInternallyConnectedToThisPort().find(p4=>p4.schematicSymbolPortDef)?.schematicSymbolPortDef??null,!schematicSymbolPortDef))throw new Error(`Couldn't find schematicSymbolPortDef for port ${this.getString()}, searched internally connected ports and none had a schematicSymbolPortDef. Why are we trying to get the schematic position of this port?`);let transform5=compose2(parentNormalComponent.computeSchematicGlobalTransform(),translate2(-symbol.center.x,-symbol.center.y));return applyToPoint2(transform5,schematicSymbolPortDef)}let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();if(parentBoxDim&&this.props.pinNumber!==void 0){let localPortPosition=parentBoxDim.getPortPositionByPinNumber(this.props.pinNumber);if(!localPortPosition)throw new Error(`Couldn't find position for schematic_port for port ${this.getString()} inside of the schematic box`);return applyToPoint2(parentNormalComponent.computeSchematicGlobalTransform(),localPortPosition)}throw new Error(`Couldn't find position for schematic_port for port ${this.getString()}`)}_getGlobalSchematicPositionAfterLayout(){let{db}=this.root;if(!this.schematic_port_id)throw new Error(`Can't get schematic port position after layout for "${this.getString()}", no schematic_port_id`);let schematic_port2=db.schematic_port.get(this.schematic_port_id);if(!schematic_port2)throw new Error(`Schematic port not found when trying to get post-layout position: ${this.schematic_port_id}`);return schematic_port2.center}registerMatch(component){this.matchedComponents.push(component)}getNameAndAliases(){let{_parsedProps:props}=this;return Array.from(new Set([...props.name?[props.name]:[],...props.aliases??[],...typeof props.pinNumber=="number"?[`pin${props.pinNumber}`,props.pinNumber.toString()]:[],...this.externallyAddedAliases??[]]))}_getMatchingPinAttributes(){let pinAttributes=this.parent?._parsedProps?.pinAttributes;if(!pinAttributes)return[];let matches=[];for(let alias of this.getNameAndAliases()){let attributes2=pinAttributes[alias];attributes2&&matches.push(attributes2)}return matches}_shouldIncludeInBoardPinout(){return this._getMatchingPinAttributes().some(attributes2=>attributes2.includeInBoardPinout===!0)}isMatchingPort(port){return this.isMatchingAnyOf(port.getNameAndAliases())}getPortSelector(){return`.${(this.getParentNormalComponent()??this.parent)?.props.name} > port.${this.props.name}`}getAvailablePcbLayers(){let{layer,layers}=this._parsedProps;return layers||(layer?[layer]:Array.from(new Set(this.matchedComponents.flatMap(c3=>c3.getAvailablePcbLayers()))))}_getDirectlyConnectedTraces(){return this.getSubcircuit().selectAll("trace").filter(trace=>!trace._couldNotFindPort).filter(trace=>trace._isExplicitlyConnectedToPort(this))}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,port_hints=this.getNameAndAliases(),parentNormalComponent=this.getParentNormalComponent(),source_component_id=(this.parent?.source_component_id?this.parent:parentNormalComponent)?.source_component_id??null,pinAttributes=this._getMatchingPinAttributes(),portAttributesFromParent={};for(let attributes2 of pinAttributes)attributes2.mustBeConnected!==void 0&&(portAttributesFromParent.must_be_connected=attributes2.mustBeConnected);let source_port2=db.source_port.insert({name:props.name,pin_number:props.pinNumber,port_hints,source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,...portAttributesFromParent});this.source_port_id=source_port2.source_port_id}doInitialSourceParentAttachment(){let{db}=this.root,parentNormalComponent=this.getParentNormalComponent(),parentWithSourceId=this.parent?.source_component_id?this.parent:parentNormalComponent;if(this.isGroupPort()){db.source_port.update(this.source_port_id,{source_component_id:null,subcircuit_id:this.getSubcircuit()?.subcircuit_id});return}if(!parentWithSourceId?.source_component_id)throw new Error(`${this.getString()} has no parent source component (parent: ${this.parent?.getString()})`);db.source_port.update(this.source_port_id,{source_component_id:parentWithSourceId.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id}),this.source_component_id=parentWithSourceId.source_component_id}doInitialPcbPortRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{matchedComponents}=this;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit=this.getSubcircuit(),pcb_port2=db.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port2.pcb_port_id;return}let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent;if(!parentWithPcbComponentId?.pcb_component_id)throw new Error(`${this.getString()} has no parent pcb component, cannot render pcb_port (parent: ${this.parent?.getString()}, parentNormalComponent: ${parentNormalComponent?.getString()})`);let pcbMatches=matchedComponents.filter(c3=>c3.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1){if(!areAllPcbPrimitivesOverlapping(pcbMatches))throw new Error(`${this.getString()} has multiple non-overlapping pcb matches, unclear how to place pcb_port: ${pcbMatches.map(c3=>c3.getString()).join(", ")}. (Note: tscircuit core does not currently allow you to specify internally connected pcb primitives with the same port hints, try giving them different port hints and specifying they are connected externally- or file an issue)`);matchCenter=getCenterOfPcbPrimitives(pcbMatches)}if(matchCenter){let subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port2=db.pcb_port.insert({pcb_component_id:parentWithPcbComponentId.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port2.pcb_port_id}else{let pcbMatch=pcbMatches[0];throw new Error(`${pcbMatch.getString()} does not have a center or _getGlobalPcbPositionBeforeLayout method (needed for pcb_port placement)`)}}updatePcbPortRender(){if(this.root?.pcbDisabled)return;let{db}=this.root;if(this.pcb_port_id)return;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit2=this.getSubcircuit(),pcb_port22=db.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit2?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port22.pcb_port_id;return}let pcbMatches=this.matchedComponents.filter(c3=>c3.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1)try{areAllPcbPrimitivesOverlapping(pcbMatches)&&(matchCenter=getCenterOfPcbPrimitives(pcbMatches))}catch{}if(!matchCenter)return;let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent,subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port2=db.pcb_port.insert({pcb_component_id:parentWithPcbComponentId?.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port2.pcb_port_id}_getBestDisplayPinLabel(){let{db}=this.root,sourcePort=db.source_port.get(this.source_port_id),labelHints=[];for(let portHint of sourcePort?.port_hints??[])portHint.match(/^(pin)?\d+$/)||portHint.match(/^(left|right)/)&&!sourcePort?.name.match(/^(left|right)/)||labelHints.push(portHint);if(this.getParentNormalComponent()?.props?.showPinAliases&&labelHints.length>0)return labelHints.join("/");if(labelHints.length>0)return labelHints[0]}doInitialSchematicPortRender(){let{db}=this.root,{_parsedProps:props}=this,{schX,schY}=props,container=schX!==void 0&&schY!==void 0?this.getParentNormalComponent():this.getPrimitiveContainer();if(!container||!this._hasSchematicPort())return;let containerCenter=container._getGlobalSchematicPositionBeforeLayout(),portCenter=this._getGlobalSchematicPositionBeforeLayout(),localPortInfo=null,containerDims=container._getSchematicBoxDimensions();containerDims&&props.pinNumber!==void 0&&(localPortInfo=containerDims.getPortPositionByPinNumber(props.pinNumber)),this.getSubcircuit().props._schDebugObjectsEnabled&&db.schematic_debug_object.insert({shape:"rect",center:portCenter,size:{width:.1,height:.1},label:"obstacle"}),localPortInfo?.side?this.facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[localPortInfo.side]:this.facingDirection=getRelativeDirection(containerCenter,portCenter);let bestDisplayPinLabel=this._getBestDisplayPinLabel(),parentNormalComponent=this.getParentNormalComponent(),sideOfComponent=localPortInfo?.side??(props.direction==="up"?"top":props.direction==="down"?"bottom":props.direction),schematicPortInsertProps={type:"schematic_port",schematic_component_id:parentNormalComponent?.schematic_component_id,center:portCenter,source_port_id:this.source_port_id,facing_direction:this.facingDirection,distance_from_component_edge:props.schStemLength??.4,side_of_component:sideOfComponent,pin_number:props.pinNumber,true_ccw_index:localPortInfo?.trueIndex,display_pin_label:bestDisplayPinLabel,is_connected:!1};for(let attributes2 of this._getMatchingPinAttributes())attributes2.requiresPower&&(schematicPortInsertProps.has_input_arrow=!0),attributes2.providesPower&&(schematicPortInsertProps.has_output_arrow=!0);let schematic_port2=db.schematic_port.insert(schematicPortInsertProps);if(this.schematic_port_id=schematic_port2.schematic_port_id,props.schStemLength!==void 0&&props.schStemLength!==0){let{schStemLength,direction:direction2}=props,x22=portCenter.x,y22=portCenter.y;direction2==="right"?x22-=schStemLength:direction2==="left"?x22+=schStemLength:direction2==="up"?y22-=schStemLength:direction2==="down"&&(y22+=schStemLength);let stemLine=db.schematic_line.insert({schematic_component_id:parentNormalComponent?.schematic_component_id,x1:portCenter.x,y1:portCenter.y,x2:x22,y2:y22,stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1});this.schematic_stem_line_id=stemLine.schematic_line_id}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_port_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db}=this.root,schPort=db.schematic_port.get(this.schematic_port_id);if(schPort){let newCenter=applyToPoint2(transform5,schPort.center);if(db.schematic_port.update(this.schematic_port_id,{center:newCenter}),this.schematic_stem_line_id){let line2=db.schematic_line.get(this.schematic_stem_line_id);if(line2){let p12=applyToPoint2(transform5,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform5,{x:line2.x2,y:line2.y2});db.schematic_line.update(this.schematic_stem_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y});let scaledStemLength=Math.sqrt((p12.x-p22.x)**2+(p12.y-p22.y)**2);db.schematic_port.update(this.schematic_port_id,{distance_from_component_edge:scaledStemLength})}}}}_getSubcircuitConnectivityKey(){return this.root?.db.source_port.get(this.source_port_id)?.subcircuit_connectivity_map_key}_setPositionFromLayout(newCenter){let{db}=this.root;this.pcb_port_id&&db.pcb_port.update(this.pcb_port_id,{x:newCenter.x,y:newCenter.y})}_hasMatchedPcbPrimitive(){return this.matchedComponents.some(c3=>c3.isPcbPrimitive)}_getNetLabelText(){return`${this.parent?.props.name}_${this.props.name}`}},getPinNumberFromLabels=labels=>{let pinNumber=labels.find(p4=>/^(pin)?\d+$/.test(p4));return pinNumber?Number.parseInt(pinNumber.replace(/^pin/,"")):null};function getPortFromHints(hints,opts){let pinNumber=getPinNumberFromLabels(hints);if(!pinNumber)return null;let aliases2=[...hints.filter(p4=>p4.toString()!==pinNumber.toString()&&p4!==`pin${pinNumber}`&&p4.trim()!==""),...opts?.additionalAliases?.[`pin${pinNumber}`]??[]];return new Port({pinNumber,aliases:aliases2})}function getPinsFromSideDefinition(sideDefinition){return sideDefinition?Array.isArray(sideDefinition)?sideDefinition:sideDefinition.pins??[]:[]}var hasExplicitPinMapping=pa3=>{for(let side of["leftSide","rightSide","topSide","bottomSide"])if(side in pa3&&typeof pa3[side]=="number")throw new Error(`A number was specified for "${side}", you probably meant to use "size" not "side"`);return"leftSide"in pa3||"rightSide"in pa3||"topSide"in pa3||"bottomSide"in pa3},getSizeOfSidesFromPortArrangement=pa3=>{if(hasExplicitPinMapping(pa3))return{leftSize:getPinsFromSideDefinition(pa3.leftSide).length,rightSize:getPinsFromSideDefinition(pa3.rightSide).length,topSize:getPinsFromSideDefinition(pa3.topSide).length,bottomSize:getPinsFromSideDefinition(pa3.bottomSide).length};let{leftSize=0,rightSize=0,topSize=0,bottomSize=0}=pa3;return{leftSize,rightSize,topSize,bottomSize}},DEFAULT_SCHEMATIC_BOX_PADDING_MM=.4;function isExplicitPinMappingArrangement(arrangement){let a2=arrangement;return a2.leftSide!==void 0||a2.rightSide!==void 0||a2.topSide!==void 0||a2.bottomSide!==void 0}var getAllDimensionsForSchematicBox=params=>{let portDistanceFromEdge=params.portDistanceFromEdge??.4,sidePinCounts=params.schPortArrangement?getSizeOfSidesFromPortArrangement(params.schPortArrangement):null,sideLengths={left:0,right:0,top:0,bottom:0},pinCount=params.pinCount??null;if(pinCount===null)if(sidePinCounts)pinCount=sidePinCounts.leftSize+sidePinCounts.rightSize+sidePinCounts.topSize;else throw new Error("Could not determine pin count for the schematic box");if(pinCount&&!sidePinCounts){let rightSize=Math.floor(pinCount/2);sidePinCounts={leftSize:pinCount-rightSize,rightSize,topSize:0,bottomSize:0}}sidePinCounts||(sidePinCounts={leftSize:0,rightSize:0,topSize:0,bottomSize:0});let getPinNumberUsingSideIndex=({side,sideIndex,truePinIndex:truePinIndex2})=>{if(!params.schPortArrangement||!isExplicitPinMappingArrangement(params.schPortArrangement))return truePinIndex2+1;let normalCcwDirection={left:"top-to-bottom",bottom:"left-to-right",right:"bottom-to-top",top:"right-to-left"}[side],directionAlongSide=params.schPortArrangement?.[`${side}Side`]?.direction??normalCcwDirection,pinsDefinitionForSide=params.schPortArrangement?.[`${side}Side`]?.pins,sideIndexWithDirectionCorrection=sideIndex;return directionAlongSide!==normalCcwDirection&&(sideIndexWithDirectionCorrection=pinsDefinitionForSide.length-sideIndex-1),parsePinNumberFromLabelsOrThrow(pinsDefinitionForSide[sideIndexWithDirectionCorrection],params.pinLabels)},orderedTruePorts=[],currentDistanceFromEdge=0,truePinIndex=0;for(let sideIndex=0;sideIndex<sidePinCounts.leftSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"left",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"left",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),sideIndex===sidePinCounts.leftSize-1?sideLengths.left=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.bottomSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"bottom",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"bottom",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),sideIndex===sidePinCounts.bottomSize-1?sideLengths.bottom=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.rightSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"right",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"right",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),sideIndex===sidePinCounts.rightSize-1?sideLengths.right=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.topSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"top",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"top",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),sideIndex===sidePinCounts.topSize-1?sideLengths.top=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}let resolvedSchWidth=params.schWidth;if(resolvedSchWidth===void 0){resolvedSchWidth=Math.max(sideLengths.top+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.bottom+DEFAULT_SCHEMATIC_BOX_PADDING_MM),params.pinLabels&&orderedTruePorts.filter(p4=>p4.side==="left"||p4.side==="right").some(p4=>params.pinLabels?.[`pin${p4.pinNumber}`]||params.pinLabels?.[p4.pinNumber])&&(resolvedSchWidth=Math.max(resolvedSchWidth,.5));let labelWidth=params.pinLabels?Math.max(...Object.values(params.pinLabels).map(label=>label.length*.1)):0,LABEL_PADDING=labelWidth>0?1.1:0;resolvedSchWidth=Math.max(resolvedSchWidth,labelWidth+LABEL_PADDING)}let schHeight=params.schHeight;schHeight||(schHeight=Math.max(sideLengths.left+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.right+DEFAULT_SCHEMATIC_BOX_PADDING_MM));let trueEdgePositions={left:{x:-resolvedSchWidth/2-portDistanceFromEdge,y:sideLengths.left/2},bottom:{x:-sideLengths.bottom/2,y:-schHeight/2-portDistanceFromEdge},right:{x:resolvedSchWidth/2+portDistanceFromEdge,y:-sideLengths.right/2},top:{x:sideLengths.top/2,y:schHeight/2+portDistanceFromEdge}},trueEdgeTraversalDirections={left:{x:0,y:-1},right:{x:0,y:1},top:{x:-1,y:0},bottom:{x:1,y:0}},truePortsWithPositions=orderedTruePorts.map(p4=>{let{distanceFromOrthogonalEdge,side}=p4,edgePos=trueEdgePositions[side],edgeDir=trueEdgeTraversalDirections[side];return{x:edgePos.x+distanceFromOrthogonalEdge*edgeDir.x,y:edgePos.y+distanceFromOrthogonalEdge*edgeDir.y,...p4}});return{getPortPositionByPinNumber(pinNumber){let port=truePortsWithPositions.find(p4=>p4.pinNumber.toString()===pinNumber.toString());return port||null},getSize(){return{width:resolvedSchWidth,height:schHeight}},getSizeIncludingPins(){return{width:resolvedSchWidth+(sidePinCounts.leftSize||sidePinCounts.rightSize?.4:0),height:schHeight+(sidePinCounts.topSize||sidePinCounts.bottomSize?.4:0)}},pinCount}},getNumericSchPinStyle=(pinStyles,pinLabels)=>{if(!pinStyles)return;let numericPinStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels),pinStyleWithSideFirst={leftMargin:pinStyle.marginLeft??pinStyle.leftMargin,rightMargin:pinStyle.marginRight??pinStyle.rightMargin,topMargin:pinStyle.marginTop??pinStyle.topMargin,bottomMargin:pinStyle.marginBottom??pinStyle.bottomMargin};numericPinStyles[`pin${pinNumber}`]={...numericPinStyles[`pin${pinNumber}`],...pinStyleWithSideFirst}}return numericPinStyles},CadAssembly=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"CadAssembly",zodProps:cadassemblyProps}}},getFileExtension=filename=>{if(!filename)return null;let fragmentMatch=filename.match(/#ext=(\w+)$/);if(fragmentMatch)return fragmentMatch[1].toLowerCase();let sanitized=filename.split("?")[0].split("#")[0],lastSegment=sanitized.split("/").pop()??sanitized;return lastSegment.includes(".")?lastSegment.split(".").pop()?.toLowerCase()??null:null},joinUrlPath=(base,path)=>{let trimmedBase=base.replace(/\/+$/,""),trimmedPath=path.replace(/^\/+/,"");return`${trimmedBase}/${trimmedPath}`},constructAssetUrl=(targetUrl,baseUrl)=>{if(!baseUrl||!targetUrl.startsWith("/"))return targetUrl;try{let baseUrlObj=new URL(baseUrl);return baseUrlObj.pathname!=="/"&&targetUrl.startsWith(baseUrlObj.pathname)?new URL(targetUrl,baseUrlObj.origin).toString():joinUrlPath(baseUrl,targetUrl)}catch{return targetUrl}},rotation2=external_exports.union([external_exports.number(),external_exports.string()]),rotation3=external_exports.object({x:rotation2,y:rotation2,z:rotation2}),CadModel=class extends PrimitiveComponent2{get config(){return{componentName:"CadModel",zodProps:cadmodelProps}}doInitialCadModelRender(){let parent=this._findParentWithPcbComponent();if(!parent||!parent.pcb_component_id)return;let{db}=this.root,{boardThickness=0}=this.root?._getBoard()??{},bounds=parent._getPcbCircuitJsonBounds(),pcb_component2=db.pcb_component.get(parent.pcb_component_id),props=this._parsedProps;if(!props||typeof props.modelUrl!="string"&&typeof props.stepUrl!="string")return;let parentTransform=parent._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(parentTransform).rotation.angle*180/Math.PI,rotationOffset=rotation3.parse({x:0,y:0,z:0});if(typeof props.rotationOffset=="number")rotationOffset.z=Number(props.rotationOffset);else if(typeof props.rotationOffset=="object"){let parsed=rotation3.parse(props.rotationOffset);rotationOffset.x=Number(parsed.x),rotationOffset.y=Number(parsed.y),rotationOffset.z=Number(parsed.z)}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),positionOffset=point32.parse({x:pcbX,y:pcbY,z:props.pcbZ??0,...typeof props.positionOffset=="object"?props.positionOffset:{}}),zOffsetFromSurface=props.zOffsetFromSurface!==void 0?distance.parse(props.zOffsetFromSurface):0,layer=parent.props.layer==="bottom"?"bottom":"top",ext=props.modelUrl?getFileExtension(props.modelUrl):void 0,modelUrlWithoutExtFragment=props.modelUrl?.replace(/#ext=\w+$/,""),urlProps={};if(ext==="stl"?urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="obj"?urlProps.model_obj_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="gltf"?urlProps.model_gltf_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="glb"?urlProps.model_glb_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="step"||ext==="stp"?urlProps.model_step_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="wrl"||ext==="vrml"?urlProps.model_wrl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment),props.stepUrl){let transformed=this._addCachebustToModelUrl(props.stepUrl);transformed&&(urlProps.model_step_url=transformed)}let cad=db.cad_component.insert({position:{x:bounds.center.x+Number(positionOffset.x),y:bounds.center.y+Number(positionOffset.y),z:(layer==="bottom"?-boardThickness/2:boardThickness/2)+(layer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+Number(positionOffset.z)},rotation:{x:Number(rotationOffset.x),y:(layer==="top"?0:180)+Number(rotationOffset.y),z:layer==="bottom"?-(accumulatedRotation+Number(rotationOffset.z))+180:accumulatedRotation+Number(rotationOffset.z)},pcb_component_id:parent.pcb_component_id,source_component_id:parent.source_component_id,model_unit_to_mm_scale_factor:typeof props.modelUnitToMmScale=="number"?props.modelUnitToMmScale:void 0,show_as_translucent_model:props.showAsTranslucentModel??parent._parsedProps.showAsTranslucentModel,...urlProps});this.cad_component_id=cad.cad_component_id}_findParentWithPcbComponent(){let p4=this.parent;for(;p4&&!p4.pcb_component_id;)p4=p4.parent;return p4}_addCachebustToModelUrl(url2){if(!url2)return url2;let baseUrl=this.root?.platform?.projectBaseUrl,transformedUrl=constructAssetUrl(url2,baseUrl);if(!transformedUrl.includes("modelcdn.tscircuit.com"))return transformedUrl;let origin=this.root?.getClientOrigin()??"";return`${transformedUrl}${transformedUrl.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}},debug22=(0,import_debug9.default)("tscircuit:core:footprint"),Footprint=class extends PrimitiveComponent2{get config(){return{componentName:"Footprint",zodProps:footprintProps}}doInitialPcbFootprintLayout(){if(this.root?.pcbDisabled)return;let constraints=this.children.filter(child=>child.componentName==="Constraint");if(constraints.length===0)return;let{isFlipped}=this._getPcbPrimitiveFlippedHelpers(),maybeFlipLeftRight=props=>isFlipped&&"left"in props&&"right"in props?{...props,left:props.right,right:props.left}:props,involvedComponents=constraints.flatMap(constraint=>constraint._getAllReferencedComponents().componentsWithSelectors).map(({component,selector,componentSelector,edge})=>({component,selector,componentSelector,edge,bounds:component._getPcbCircuitJsonBounds()}));if(involvedComponents.some(c3=>c3.edge))throw new Error("edge constraints not implemented yet for footprint layout, contributions welcome!");function getComponentDetails(selector){return involvedComponents.find(({selector:s2})=>s2===selector)}let solver=new Solver,kVars={};function getKVar(name){return name in kVars||(kVars[name]=new Variable(name),solver.addEditVariable(kVars[name],Strength.weak)),kVars[name]}for(let{selector,bounds:bounds2}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);solver.suggestValue(kvx,bounds2.center.x),solver.suggestValue(kvy,bounds2.center.y)}for(let constraint of constraints){let props=constraint._parsedProps;if("xDist"in props){let{xDist,left,right,edgeToEdge,centerToCenter}=maybeFlipLeftRight(props),leftVar=getKVar(`${left}_x`),rightVar=getKVar(`${right}_x`),leftBounds=getComponentDetails(left)?.bounds,rightBounds=getComponentDetails(right)?.bounds;if(centerToCenter){let expr=new Expression(rightVar,[-1,leftVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(rightVar,-rightBounds.width/2,[-1,leftVar],-leftBounds.width/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}}else if("yDist"in props){let{yDist,top,bottom,edgeToEdge,centerToCenter}=props,topVar=getKVar(`${top}_y`),bottomVar=getKVar(`${bottom}_y`),topBounds=getComponentDetails(top)?.bounds,bottomBounds=getComponentDetails(bottom)?.bounds;if(centerToCenter){let expr=new Expression(topVar,[-1,bottomVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(topVar,topBounds.height/2,[-1,bottomVar],-bottomBounds.height/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}}else if("sameY"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_y`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}else if("sameX"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_x`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}}solver.updateVariables(),debug22.enabled&&(console.log("Solution to layout constraints:"),console.table(Object.entries(kVars).map(([key,kvar])=>({var:key,val:kvar.value()}))));let bounds={left:1/0,right:-1/0,top:-1/0,bottom:1/0};for(let{selector,bounds:{width,height}}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`),newLeft=kvx.value()-width/2,newRight=kvx.value()+width/2,newTop=kvy.value()+height/2,newBottom=kvy.value()-height/2;bounds.left=Math.min(bounds.left,newLeft),bounds.right=Math.max(bounds.right,newRight),bounds.top=Math.max(bounds.top,newTop),bounds.bottom=Math.min(bounds.bottom,newBottom)}let globalOffset={x:-(bounds.right+bounds.left)/2,y:-(bounds.top+bounds.bottom)/2},containerPos=this.getPrimitiveContainer()._getGlobalPcbPositionBeforeLayout();globalOffset.x+=containerPos.x,globalOffset.y+=containerPos.y;for(let{component,selector}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);component._setPositionFromLayout({x:kvx.value()+globalOffset.x,y:kvy.value()+globalOffset.y})}}},NormalComponent__getMinimumFlexContainerSize=component=>{let{db}=component.root;if(component.pcb_component_id){let pcbComponent=db.pcb_component.get(component.pcb_component_id);return pcbComponent?{width:pcbComponent.width,height:pcbComponent.height}:null}if(component.pcb_group_id){let pcbGroup=db.pcb_group.get(component.pcb_group_id);if(!pcbGroup)return null;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:null}return{width:pcbGroup.width??0,height:pcbGroup.height??0}}return null},NormalComponent__repositionOnPcb=(component,position2)=>{let{db}=component.root,allCircuitJson=db.toArray();if(component.pcb_component_id){repositionPcbComponentTo(allCircuitJson,component.pcb_component_id,position2);return}if(component.source_group_id){repositionPcbGroupTo(allCircuitJson,component.source_group_id,position2);return}throw new Error(`Cannot reposition component ${component.getString()}: no pcb_component_id or source_group_id`)};function NormalComponent_doInitialPcbComponentAnchorAlignment(component){if(component.root?.pcbDisabled||!component.pcb_component_id)return;let{pcbX,pcbY}=component._parsedProps,pcbPositionAnchor=component.props?.pcbPositionAnchor;if(!pcbPositionAnchor||pcbX===void 0&&pcbY===void 0)return;let bounds=getBoundsOfPcbComponents(component.children);if(bounds.width===0||bounds.height===0)return;let currentCenter={...{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor)){let b3={left:bounds.minX,right:bounds.maxX,top:bounds.minY,bottom:bounds.maxY};switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:b3.left,y:b3.top};break;case"top_center":anchorPos={x:currentCenter.x,y:b3.top};break;case"top_right":anchorPos={x:b3.right,y:b3.top};break;case"center_left":anchorPos={x:b3.left,y:currentCenter.y};break;case"center_right":anchorPos={x:b3.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:b3.left,y:b3.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:b3.bottom};break;case"bottom_right":anchorPos={x:b3.right,y:b3.bottom};break}}else try{let port=component.portMap[pcbPositionAnchor];port&&(anchorPos=port._getGlobalPcbPositionBeforeLayout())}catch{}if(!anchorPos)return;let newCenter={...currentCenter};pcbX!==void 0&&(newCenter.x+=pcbX-anchorPos.x),pcbY!==void 0&&(newCenter.y+=pcbY-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&component._repositionOnPcb(newCenter)}var isHttpUrl=s2=>s2.startsWith("http://")||s2.startsWith("https://"),parseLibraryFootprintRef=s2=>{if(isHttpUrl(s2))return null;let idx=s2.indexOf(":");if(idx<=0)return null;let footprintLib=s2.slice(0,idx),footprintName=s2.slice(idx+1);return!footprintLib||!footprintName?null:{footprintLib,footprintName}},isStaticAssetPath=s2=>s2.startsWith("/")||s2.startsWith("./"),resolveStaticFileImportDebug=(0,import_debug10.default)("tscircuit:core:resolveStaticFileImport");async function resolveStaticFileImport(path,platform){if(!path)return path;let normalizedPath=path.startsWith("./")?path.slice(1):path,resolver=platform?.resolveProjectStaticFileImportUrl;if(resolver&&(path.startsWith("/")||path.startsWith("./")))try{let resolved=await resolver(normalizedPath);if(resolved)return resolved}catch(error){resolveStaticFileImportDebug("failed to resolve static file via platform resolver",error)}return constructAssetUrl(normalizedPath,platform?.projectBaseUrl)}function NormalComponent_doInitialPcbFootprintStringRender(component,queueAsyncEffect){let{footprint}=component.props;if(footprint??(footprint=component._getImpliedFootprintString?.()),!footprint)return;let{pcbRotation,pinLabels,pcbPinLabels}=component.props,fileExtension=getFileExtension(String(footprint)),footprintParser=fileExtension?component.root?.platform?.footprintFileParserMap?.[fileExtension]:null;if(typeof footprint=="string"&&(isHttpUrl(footprint)||isStaticAssetPath(footprint))&&footprintParser){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0,queueAsyncEffect("load-footprint-from-platform-file-parser",async()=>{let footprintUrl=isHttpUrl(footprint)?footprint:await resolveStaticFileImport(footprint,component.root?.platform);try{let result=await footprintParser.loadFromUrl(footprintUrl),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprintUrl,pinLabels,pcbPinLabels},result.footprintCircuitJson);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db=component.root?.db;if(db&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load footprint "${footprintUrl}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprintUrl});db.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"&&isHttpUrl(footprint)){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let url2=footprint;queueAsyncEffect("load-footprint-url",async()=>{try{let res2=await fetch(url2);if(!res2.ok)throw new Error(`Failed to fetch footprint: ${res2.status}`);let soup=await res2.json(),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:url2,pinLabels,pcbPinLabels},soup);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db=component.root?.db;if(db&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${url2}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:url2});db.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"){let libRef=parseLibraryFootprintRef(footprint);if(!libRef||component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let libMap=component.root?.platform?.footprintLibraryMap?.[libRef.footprintLib],resolverFn;if(typeof libMap=="function"&&(resolverFn=libMap),!resolverFn)return;queueAsyncEffect("load-lib-footprint",async()=>{try{let result=await resolverFn(libRef.footprintName),circuitJson=null;if(Array.isArray(result)?circuitJson=result:Array.isArray(result.footprintCircuitJson)&&(circuitJson=result.footprintCircuitJson),!circuitJson)return;let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},circuitJson),fpWrapper=new Footprint({src:footprint});for(let c3 of fpComponents)fpWrapper.add(c3);component.add(fpWrapper),!Array.isArray(result)&&result.cadModel&&(component._asyncFootprintCadModel=result.cadModel);for(let child of component.children)child.componentName==="Port"&&child._markDirty?.("PcbPortRender");component._markDirty("InitializePortsFromChildren")}catch(err){let db=component.root?.db;if(db&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${footprint}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprint});db.external_footprint_load_error.insert(errorObj)}throw err}});return}if(!(0,import_react3.isValidElement)(footprint)&&footprint.componentName==="Footprint"&&component.add(footprint),Array.isArray(footprint)&&!(0,import_react3.isValidElement)(footprint)&&footprint.length>0){try{let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:"",pinLabels,pcbPinLabels},footprint);component.addAll(fpComponents)}catch(err){let db=component.root?.db;if(db&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load json footprint: `+(err instanceof Error?err.message:String(err)),errorObj=circuit_json_footprint_load_error.parse({type:"circuit_json_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0});db.circuit_json_footprint_load_error.insert(errorObj)}throw err}return}}function getPcbTextBounds(text){let fontSize=text.font_size,textWidth=text.text.length*fontSize*.6,textHeight=fontSize,anchorAlignment=text.anchor_alignment||"center",centerX=text.anchor_position.x,centerY=text.anchor_position.y;switch(anchorAlignment){case"top_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"top_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y+textHeight/2;break;case"top_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"center_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y;break;case"center":centerX=text.anchor_position.x,centerY=text.anchor_position.y;break;case"center_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y;break;case"bottom_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;default:centerX=text.anchor_position.x,centerY=text.anchor_position.y;break}return{x:centerX-textWidth/2,y:centerY-textHeight/2,width:textWidth,height:textHeight}}function NormalComponent_doInitialSilkscreenOverlapAdjustment(component){if(!component._adjustSilkscreenTextAutomatically||component.root?.pcbDisabled||!component.pcb_component_id)return;let{db}=component.root,componentCenter=component._getPcbCircuitJsonBounds().center,silkscreenTexts=db.pcb_silkscreen_text.list({pcb_component_id:component.pcb_component_id}).filter(text=>text.text===component.name);if(silkscreenTexts.length===0)return;let obstacleBounds=component.getSubcircuit().selectAll("[_isNormalComponent=true]").filter(comp=>comp!==component&&comp.pcb_component_id).map(comp=>{let bounds=comp._getPcbCircuitJsonBounds(),box2={center:bounds.center,width:bounds.width,height:bounds.height};return getBoundingBox(box2)});for(let silkscreenText of silkscreenTexts){let currentPosition=silkscreenText.anchor_position,textBounds=getPcbTextBounds(silkscreenText),textBox={center:{x:textBounds.x+textBounds.width/2,y:textBounds.y+textBounds.height/2},width:textBounds.width,height:textBounds.height},textBoundsBox=getBoundingBox(textBox);if(!obstacleBounds.some(obstacle=>doBoundsOverlap(textBoundsBox,obstacle)))continue;let flippedX=2*componentCenter.x-currentPosition.x,flippedY=2*componentCenter.y-currentPosition.y,flippedTextBox={center:{x:flippedX,y:flippedY},width:textBounds.width,height:textBounds.height},flippedTextBounds=getBoundingBox(flippedTextBox);obstacleBounds.some(obstacle=>doBoundsOverlap(flippedTextBounds,obstacle))||db.pcb_silkscreen_text.update(silkscreenText.pcb_silkscreen_text_id,{anchor_position:{x:flippedX,y:flippedY}})}}var NormalComponent_doInitialSourceDesignRuleChecks=component=>{let{db}=component.root;if(!component.source_component_id)return;let ports=component.selectAll("port"),traces=db.source_trace.list(),connected=new Set;for(let trace of traces)for(let id2 of trace.connected_source_port_ids)connected.add(id2);let internalGroups=component._getInternallyConnectedPins();for(let group of internalGroups)if(group.some(p4=>p4.source_port_id&&connected.has(p4.source_port_id)))for(let p4 of group)p4.source_port_id&&connected.add(p4.source_port_id);for(let port of ports)port.source_port_id&&shouldCheckPortForMissingTrace(component,port)&&(connected.has(port.source_port_id)||db.source_pin_missing_trace_warning.insert({message:`Port ${port.getNameAndAliases()[0]} on ${component.props.name} is missing a trace`,source_component_id:component.source_component_id,source_port_id:port.source_port_id,subcircuit_id:component.getSubcircuit().subcircuit_id??void 0,warning_type:"source_pin_missing_trace_warning"}))},shouldCheckPortForMissingTrace=(component,port)=>{if(component.config.componentName==="Interconnect")return!1;if(component.config.componentName==="Chip"){let pinAttributes=component.props.pinAttributes;if(!pinAttributes)return!1;for(let alias of port.getNameAndAliases()){let attrs=pinAttributes[alias];if(attrs?.requiresPower||attrs?.requiresGround||attrs?.requiresVoltage!==void 0)return!0}return!1}return!0},debug32=(0,import_debug6.default)("tscircuit:core"),rotation32=external_exports.object({x:rotation,y:rotation,z:rotation}),NormalComponent3=class extends PrimitiveComponent2{constructor(props){let filteredProps={...props},invalidPinLabelsMessages=[];if(filteredProps.pinLabels&&!Array.isArray(filteredProps.pinLabels)){let{validPinLabels,invalidPinLabelsMessages:messages}=filterPinLabels(filteredProps.pinLabels);filteredProps.pinLabels=validPinLabels,invalidPinLabelsMessages=messages}super(filteredProps);__publicField(this,"reactSubtrees",[]);__publicField(this,"_impliedFootprint");__publicField(this,"_resolvedPcbCalcOffsetX");__publicField(this,"_resolvedPcbCalcOffsetY");__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"_isNormalComponent",!0);__publicField(this,"_attributeLowerToCamelNameMap",{_isnormalcomponent:"_isNormalComponent"});__publicField(this,"_asyncSupplierPartNumbers");__publicField(this,"_asyncFootprintCadModel");__publicField(this,"_isCadModelChild");__publicField(this,"pcb_missing_footprint_error_id");__publicField(this,"_hasStartedFootprintUrlLoad",!1);__publicField(this,"_invalidPinLabelMessages",[]);__publicField(this,"_adjustSilkscreenTextAutomatically",!1);this._invalidPinLabelMessages=invalidPinLabelsMessages,this._addChildrenFromStringFootprint(),this.initPorts()}get defaultInternallyConnectedPinNames(){return[]}get internallyConnectedPinNames(){return(this._parsedProps.internallyConnectedPins??this.defaultInternallyConnectedPinNames).map(pinGroup=>pinGroup.map(pin=>typeof pin=="number"?`pin${pin}`:pin))}doInitialSourceNameDuplicateComponentRemoval(){if(!this.name)return;let root=this.root;if((this.getSubcircuit().getNormalComponentNameMap?.()?.get(this.props.name)??[]).filter(component=>component!==this&&component.renderPhaseStates.SourceNameDuplicateComponentRemoval.initialized).length>0){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout();root.db.source_failed_to_create_component_error.insert({component_name:this.name,error_type:"source_failed_to_create_component_error",message:`Cannot create component "${this.name}": A component with the same name already exists`,pcb_center:pcbPosition2,schematic_center:schematicPosition}),this.shouldBeRemoved=!0;let childrenToRemove=[...this.children];for(let child of childrenToRemove)this.remove(child)}}initPorts(opts={}){if(this.root?.schematicDisabled)return;let{config}=this,portsToCreate=[],schPortArrangement=this._getSchematicPortArrangement();if(schPortArrangement&&!this._parsedProps.pinLabels){for(let side in schPortArrangement){let pins=schPortArrangement[side].pins;if(Array.isArray(pins))for(let pinNumberOrLabel of pins){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNumberOrLabel,this._parsedProps.pinLabels);portsToCreate.push(new Port({pinNumber,aliases:opts.additionalAliases?.[`pin${pinNumber}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let sides=["left","right","top","bottom"],pinNum=1;for(let side of sides){let size2=schPortArrangement[`${side}Size`];for(let i2=0;i2<size2;i2++)portsToCreate.push(new Port({pinNumber:pinNum++,aliases:opts.additionalAliases?.[`pin${pinNum}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let pinLabels=this._parsedProps.pinLabels;if(pinLabels)for(let[pinNumber,label]of Object.entries(pinLabels)){pinNumber=pinNumber.replace("pin","");let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===Number(pinNumber)),primaryLabel=Array.isArray(label)?label[0]:label,otherLabels=Array.isArray(label)?label.slice(1):[];existingPort?(existingPort.externallyAddedAliases.push(primaryLabel,...otherLabels),existingPort.props.name=primaryLabel):(existingPort=new Port({pinNumber:parseInt(pinNumber),name:primaryLabel,aliases:[...otherLabels,...opts.additionalAliases?.[`pin${parseInt(pinNumber)}`]??[]]},{originDescription:`pinLabels:pin${pinNumber}`}),portsToCreate.push(existingPort))}if(config.schematicSymbolName&&!opts.ignoreSymbolPorts){let sym=Vf[this._getSchematicSymbolNameOrThrow()];if(!sym)return;for(let symPort of sym.ports){let pinNumber=getPinNumberFromLabels(symPort.labels);if(!pinNumber)continue;let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===Number(pinNumber));if(existingPort)existingPort.schematicSymbolPortDef=symPort;else{let port=getPortFromHints(symPort.labels.concat(opts.additionalAliases?.[`pin${pinNumber}`]??[]));port&&(port.originDescription=`schematicSymbol:labels[0]:${symPort.labels[0]}`,port.schematicSymbolPortDef=symPort,portsToCreate.push(port))}}this.addAll(portsToCreate)}if(!this._getSchematicPortArrangement()){let portsFromFootprint=this.getPortsFromFootprint(opts);for(let port of portsFromFootprint)portsToCreate.some(p4=>p4.isMatchingAnyOf(port.getNameAndAliases()))||portsToCreate.push(port)}let requiredPinCount=opts.pinCount??this._getPinCount()??0;for(let pn3=1;pn3<=requiredPinCount;pn3++){if(portsToCreate.find(p4=>p4._parsedProps.pinNumber===pn3))continue;if(!schPortArrangement){portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]}));continue}let explicitlyListedPinNumbersInSchPortArrangement=[...getPinsFromSideDefinition(schPortArrangement.leftSide),...getPinsFromSideDefinition(schPortArrangement.rightSide),...getPinsFromSideDefinition(schPortArrangement.topSide),...getPinsFromSideDefinition(schPortArrangement.bottomSide)].map(pn22=>parsePinNumberFromLabelsOrThrow(pn22,this._parsedProps.pinLabels));["leftSize","rightSize","topSize","bottomSize","leftPinCount","rightPinCount","topPinCount","bottomPinCount"].some(key=>key in schPortArrangement)&&(explicitlyListedPinNumbersInSchPortArrangement=Array.from({length:this._getPinCount()},(_5,i2)=>i2+1)),explicitlyListedPinNumbersInSchPortArrangement.includes(pn3)&&portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]},{originDescription:`notOtherwiseAddedButDeducedFromPinCount:${pn3}`}))}portsToCreate.length>0&&this.addAll(portsToCreate)}_getImpliedFootprintString(){return null}_addChildrenFromStringFootprint(){let{pcbRotation,pinLabels,pcbPinLabels}=this.props,{footprint}=this.props;if(footprint??(footprint=this._getImpliedFootprintString?.()),!!footprint&&typeof footprint=="string"){if(isHttpUrl(footprint)||isStaticAssetPath(footprint)||parseLibraryFootprintRef(footprint))return;let fpSoup=fp.string(footprint).soup(),fpComponents=createComponentsFromCircuitJson({componentName:this.name??this.componentName,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},fpSoup);this.addAll(fpComponents)}}get portMap(){return new Proxy({},{get:(target,prop)=>{let port=this.children.find(c3=>c3.componentName==="Port"&&c3.isMatchingNameOrAlias(prop));if(!port)throw new Error(`There was an issue finding the port "${prop.toString()}" inside of a ${this.componentName} component with name: "${this.props.name}". This is a bug in @tscircuit/core`);return port}})}getInstanceForReactElement(element){for(let subtree of this.reactSubtrees)if(subtree.element===element)return subtree.component;return null}doInitialSourceRender(){let ftype=this.config.sourceFtype;if(!ftype)return;let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype,name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db}=this.root,internallyConnectedPorts=this._getInternallyConnectedPins();for(let ports of internallyConnectedPorts){let sourcePortIds=ports.map(port=>port.source_port_id).filter(id2=>id2!==null);sourcePortIds.length>=2&&db.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db}=this.root;if(this._invalidPinLabelMessages?.length&&this.root?.db)for(let message of this._invalidPinLabelMessages){let property_name="pinLabels",match2=message.match(/^Invalid pin label:\s*([^=]+)=\s*'([^']+)'/);match2&&(property_name=`pinLabels['${match2[2]}']`),this.root.db.source_property_ignored_warning.insert({source_component_id:this.source_component_id,property_name,message,error_type:"source_property_ignored_warning"})}let{schematicSymbolName}=this.config,{_parsedProps:props}=this;props.symbol&&(0,import_react2.isValidElement)(props.symbol)?this._doInitialSchematicComponentRenderWithReactSymbol(props.symbol):schematicSymbolName?this._doInitialSchematicComponentRenderWithSymbol():this._getSchematicBoxDimensions()&&this._doInitialSchematicComponentRenderWithSchematicBoxDimensions();let manualPlacement=this.getSubcircuit()?._getSchematicManualPlacementForComponent(this);if(this.schematic_component_id&&(this.props.schX!==void 0||this.props.schY!==void 0)&&manualPlacement){if(!this.schematic_component_id)return;let warning=schematic_manual_edit_conflict_warning.parse({type:"schematic_manual_edit_conflict_warning",schematic_manual_edit_conflict_warning_id:`schematic_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. schX and schY will be used. Remove schX/schY or clear the manual placement.`,schematic_component_id:this.schematic_component_id,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db.schematic_manual_edit_conflict_warning.insert(warning)}}_getSchematicSymbolDisplayValue(){}_getInternallyConnectedPins(){if(this.internallyConnectedPinNames.length===0)return[];let internallyConnectedPorts=[];for(let netPortNames of this.internallyConnectedPinNames){let ports=[];for(let portName of netPortNames)ports.push(this.portMap[portName]);internallyConnectedPorts.push(ports)}return internallyConnectedPorts}_doInitialSchematicComponentRenderWithSymbol(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,symbol_name=this._getSchematicSymbolNameOrThrow(),symbol=Vf[symbol_name],center2=this._getGlobalSchematicPositionBeforeLayout();if(symbol){let schematic_component2=db.schematic_component.insert({center:center2,size:{...symbol.size},source_component_id:this.source_component_id,is_box_with_pins:!0,symbol_name,symbol_display_value:this._getSchematicSymbolDisplayValue()});this.schematic_component_id=schematic_component2.schematic_component_id}}_doInitialSchematicComponentRenderWithReactSymbol(symbolElement){if(this.root?.schematicDisabled)return;let{db}=this.root,center2=this._getGlobalSchematicPositionBeforeLayout(),schematic_component2=db.schematic_component.insert({center:center2,size:{width:0,height:0},source_component_id:this.source_component_id,symbol_display_value:this._getSchematicSymbolDisplayValue(),is_box_with_pins:!1});this.schematic_component_id=schematic_component2.schematic_component_id}_doInitialSchematicComponentRenderWithSchematicBoxDimensions(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,dimensions=this._getSchematicBoxDimensions(),primaryPortLabels={};if(Array.isArray(props.pinLabels))props.pinLabels.forEach((label,index)=>{primaryPortLabels[String(index+1)]=label});else for(let[port,label]of Object.entries(props.pinLabels??{}))primaryPortLabels[port]=Array.isArray(label)?label[0]:label;let center2=this._getGlobalSchematicPositionBeforeLayout(),schPortArrangement=this._getSchematicPortArrangement(),schematic_component2=db.schematic_component.insert({center:center2,rotation:props.schRotation??0,size:dimensions.getSize(),port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:props.schPinSpacing??.2,pin_styles:underscorifyPinStyles(props.schPinStyle,props.pinLabels),port_labels:primaryPortLabels,source_component_id:this.source_component_id}),hasTopOrBottomPins=schPortArrangement?.topSide!==void 0||schPortArrangement?.bottomSide!==void 0,schematic_box_width=dimensions?.getSize().width,schematic_box_height=dimensions?.getSize().height,manufacturer_part_number_schematic_text=db.schematic_text.insert({text:props.manufacturerPartNumber??"",schematic_component_id:schematic_component2.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.35:center2.y-(schematic_box_height??0)/2-.13},color:"#006464",font_size:.18}),component_name_text=db.schematic_text.insert({text:props.displayName??props.name??"",schematic_component_id:schematic_component2.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.55:center2.y+(schematic_box_height??0)/2+.13},color:"#006464",font_size:.18});this.schematic_component_id=schematic_component2.schematic_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let error=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db.pcb_component_invalid_layer_error.insert(error)}let globalTransform=this._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,pcb_component2=db.pcb_component.insert({center:this._getGlobalPcbPositionBeforeLayout(),width:0,height:0,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??accumulatedRotation,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0}),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c3=>c3.componentName==="Footprint");if(!footprint&&!hasFootprintChild&&!this.isGroup){let footprint_error=db.pcb_missing_footprint_error.insert({message:`No footprint found for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}this.pcb_component_id=pcb_component2.pcb_component_id;let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if((this.props.pcbX!==void 0||this.props.pcbY!==void 0)&&manualPlacement){let warning=pcb_manual_edit_conflict_warning.parse({type:"pcb_manual_edit_conflict_warning",pcb_manual_edit_conflict_warning_id:`pcb_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. pcbX and pcbY will be used. Remove pcbX/pcbY or clear the manual placement.`,pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0});db.pcb_manual_edit_conflict_warning.insert(warning)}}doInitialPcbComponentSizeCalculation(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db}=this.root,{_parsedProps:props}=this,bounds=getBoundsOfPcbComponents(this.children);if(bounds.width===0||bounds.height===0)return;let center2={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2};db.pcb_component.update(this.pcb_component_id,{center:center2,width:bounds.width,height:bounds.height})}updatePcbComponentSizeCalculation(){this.doInitialPcbComponentSizeCalculation()}doInitialSchematicComponentSizeCalculation(){if(this.root?.schematicDisabled||!this.schematic_component_id)return;let{db}=this.root;if(!db.schematic_component.get(this.schematic_component_id))return;let schematicElements=[],collectSchematicPrimitives=children=>{for(let child of children){if(child.isSchematicPrimitive&&child.componentName==="SchematicLine"){let line2=db.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicRect"){let rect=db.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}if(child.isSchematicPrimitive&&child.componentName==="SchematicCircle"){let circle2=db.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicArc"){let arc2=db.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicText"){let text=db.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}child.children&&child.children.length>0&&collectSchematicPrimitives(child.children)}};if(collectSchematicPrimitives(this.children),schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements),width=Math.abs(bounds.maxX-bounds.minX),height=Math.abs(bounds.maxY-bounds.minY);if(width===0&&height===0)return;let centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;db.schematic_component.update(this.schematic_component_id,{center:{x:centerX,y:centerY},size:{width,height}})}updateSchematicComponentSizeCalculation(){this.doInitialSchematicComponentSizeCalculation()}doInitialPcbComponentAnchorAlignment(){NormalComponent_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}_renderReactSubtree(element){let component=createInstanceFromReactElement(element);return{element,component}}doInitialInitializePortsFromChildren(){this.initPorts()}doInitialReactSubtreesRender(){let fpElm=this.props.footprint;(0,import_react2.isValidElement)(fpElm)&&(this.children.some(c3=>c3.componentName==="Footprint")||this.add(fpElm));let symElm=this.props.symbol;(0,import_react2.isValidElement)(symElm)&&(this.children.some(c3=>c3.componentName==="Symbol")||this.add(symElm));let cmElm=this.props.cadModel;if((0,import_react2.isValidElement)(cmElm)){this._isCadModelChild=!0;let hasCadAssemblyChild=this.children.some(c3=>c3.componentName==="CadAssembly"),hasCadModelChild=this.children.some(c3=>c3.componentName==="CadModel");!hasCadAssemblyChild&&!hasCadModelChild&&this.add(cmElm)}}doInitialPcbFootprintStringRender(){NormalComponent_doInitialPcbFootprintStringRender(this,(name,effect)=>this._queueAsyncEffect(name,effect))}_hasExistingPortExactly(port1){return this.children.filter(c3=>c3.componentName==="Port").some(port2=>{let aliases1=port1.getNameAndAliases(),aliases2=port2.getNameAndAliases();return aliases1.length===aliases2.length&&aliases1.every(alias=>aliases2.includes(alias))})}add(componentOrElm){let component;if((0,import_react2.isValidElement)(componentOrElm)){let subtree=this._renderReactSubtree(componentOrElm);this.reactSubtrees.push(subtree),component=subtree.component}else component=componentOrElm;if(component.componentName==="Port"){if(this._hasExistingPortExactly(component))return;let conflictingPort=this.children.filter(c3=>c3.componentName==="Port").find(p4=>p4.isMatchingAnyOf(component.getNameAndAliases()));conflictingPort&&debug32(`Similar ports added. Port 1: ${conflictingPort}, Port 2: ${component}`)}super.add(component)}getPortsFromFootprint(opts){let{footprint}=this.props;if((!footprint||(0,import_react2.isValidElement)(footprint))&&(footprint=this.children.find(c3=>c3.componentName==="Footprint")),typeof footprint=="string"){if(isHttpUrl(footprint))return[];if(isStaticAssetPath(footprint))return[];if(parseLibraryFootprintRef(footprint))return[];let fpSoup=fp.string(footprint).soup(),newPorts2=[];for(let elm of fpSoup)if("port_hints"in elm&&elm.port_hints){let newPort=getPortFromHints(elm.port_hints,opts);if(!newPort)continue;newPort.originDescription=`footprint:string:${footprint}:port_hints[0]:${elm.port_hints[0]}`,newPorts2.push(newPort)}return newPorts2}if(!(0,import_react2.isValidElement)(footprint)&&footprint&&footprint.componentName==="Footprint"){let fp2=footprint,pinNumber=1,newPorts2=[];for(let fpChild of fp2.children){if(!fpChild.props.portHints)continue;let filteredPortHints=fpChild.props.portHints.filter(hint=>hint&&hint.trim()!=="");if(filteredPortHints.length===0)continue;let portHintsList=filteredPortHints;portHintsList.some(hint=>hint.startsWith("pin"))||(portHintsList=[...portHintsList,`pin${pinNumber}`]),pinNumber++;let newPort=getPortFromHints(portHintsList);newPort&&(newPort.originDescription=`footprint:${footprint}`,newPorts2.push(newPort))}return newPorts2}let newPorts=[];if(!footprint){for(let child of this.children)if(child.props.portHints&&child.isPcbPrimitive){let port=getPortFromHints(child.props.portHints);port&&newPorts.push(port)}}return newPorts}getPortsFromSchematicSymbol(){if(this.root?.schematicDisabled)return[];let{config}=this;if(!config.schematicSymbolName)return[];let symbol=Vf[config.schematicSymbolName];if(!symbol)return[];let newPorts=[];for(let symbolPort of symbol.ports){let port=getPortFromHints(symbolPort.labels);port&&(port.schematicSymbolPortDef=symbolPort,newPorts.push(port))}return newPorts}doInitialCreateNetsFromProps(){this._createNetsFromProps(this._getNetsFromConnectionsProp())}_getNetsFromConnectionsProp(){let{_parsedProps:props}=this,propsWithConnections=[];if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)propsWithConnections.push(String(targetPath))}return propsWithConnections}_createNetsFromProps(propsWithConnections){createNetsFromProps(this,propsWithConnections)}_getPcbCircuitJsonBounds(){let{db}=this.root;if(!this.pcb_component_id)return super._getPcbCircuitJsonBounds();let pcb_component2=db.pcb_component.get(this.pcb_component_id);return{center:{x:pcb_component2.center.x,y:pcb_component2.center.y},bounds:{left:pcb_component2.center.x-pcb_component2.width/2,top:pcb_component2.center.y-pcb_component2.height/2,right:pcb_component2.center.x+pcb_component2.width/2,bottom:pcb_component2.center.y+pcb_component2.height/2},width:pcb_component2.width,height:pcb_component2.height}}_getPinCountFromSchematicPortArrangement(){let schPortArrangement=this._getSchematicPortArrangement();if(!schPortArrangement)return 0;if(!isExplicitPinMappingArrangement(schPortArrangement))return(schPortArrangement.leftSize??schPortArrangement.leftPinCount??0)+(schPortArrangement.rightSize??schPortArrangement.rightPinCount??0)+(schPortArrangement.topSize??schPortArrangement.topPinCount??0)+(schPortArrangement.bottomSize??schPortArrangement.bottomPinCount??0);let{leftSide,rightSide,topSide,bottomSide}=schPortArrangement;return Math.max(...leftSide?.pins??[],...rightSide?.pins??[],...topSide?.pins??[],...bottomSide?.pins??[])}_getPinCount(){if(this._getSchematicPortArrangement())return this._getPinCountFromSchematicPortArrangement();let portsFromFootprint=this.getPortsFromFootprint();if(portsFromFootprint.length>0)return portsFromFootprint.length;let{pinLabels}=this._parsedProps;if(pinLabels){if(Array.isArray(pinLabels))return pinLabels.length;let pinNumbers=Object.keys(pinLabels).map(k4=>k4.startsWith("pin")?parseInt(k4.slice(3)):parseInt(k4)).filter(n3=>!Number.isNaN(n3));return pinNumbers.length>0?Math.max(...pinNumbers):Object.keys(pinLabels).length}return 0}_getSchematicPortArrangement(){return this._parsedProps.schPinArrangement??this._parsedProps.schPortArrangement}_getPinLabelsFromPorts(){let ports=this.selectAll("port"),pinLabels={};for(let port of ports){let pinNumber=port.props.pinNumber;if(pinNumber!==void 0){let bestLabel=port._getBestDisplayPinLabel();bestLabel&&(pinLabels[`pin${pinNumber}`]=bestLabel)}}return pinLabels}_getSchematicBoxDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this,pinCount=this._getPinCount(),pinSpacing=props.schPinSpacing??.2,allPinLabels={...this._getPinLabelsFromPorts(),...props.pinLabels};return getAllDimensionsForSchematicBox({schWidth:props.schWidth,schHeight:props.schHeight,schPinSpacing:pinSpacing,numericSchPinStyle:getNumericSchPinStyle(props.schPinStyle,allPinLabels),pinCount,schPortArrangement:this._getSchematicPortArrangement(),pinLabels:allPinLabels})}getFootprinterString(){return typeof this._parsedProps.footprint=="string"?this._parsedProps.footprint:null}doInitialCadModelRender(){if(this._isCadModelChild||this.props.doNotPlace)return;let{db}=this.root,{boardThickness=0}=this.root?._getBoard()??{},cadModelProp2=this._parsedProps.cadModel,cadModel=cadModelProp2===void 0?this._asyncFootprintCadModel:cadModelProp2,footprint=this.getFootprinterString()??this._getImpliedFootprintString();if(!this.pcb_component_id||!cadModel&&!footprint||cadModel===null)return;let bounds=this._getPcbCircuitJsonBounds();if(typeof cadModel=="string")throw new Error("String cadModel not yet implemented");let rotationOffset=rotation32.parse({x:0,y:0,z:typeof cadModel?.rotationOffset=="number"?cadModel.rotationOffset:0,...typeof cadModel?.rotationOffset=="object"?cadModel.rotationOffset??{}:{}}),positionOffset=point3.parse({x:0,y:0,z:0,...typeof cadModel?.positionOffset=="object"?cadModel.positionOffset:{}}),zOffsetFromSurface=cadModel&&typeof cadModel=="object"&&"zOffsetFromSurface"in cadModel&&cadModel.zOffsetFromSurface!==void 0?distance.parse(cadModel.zOffsetFromSurface):0,computedLayer=this.props.layer==="bottom"?"bottom":"top",globalTransform=this._computePcbGlobalTransformBeforeLayout(),totalRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,isBottomLayer=computedLayer==="bottom",rotationWithOffset=totalRotation+(rotationOffset.z??0),cadRotationZ=normalizeDegrees(rotationWithOffset),cad_model=db.cad_component.insert({position:{x:bounds.center.x+positionOffset.x,y:bounds.center.y+positionOffset.y,z:(computedLayer==="bottom"?-boardThickness/2:boardThickness/2)+(computedLayer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+positionOffset.z},rotation:{x:rotationOffset.x,y:rotationOffset.y+(isBottomLayer?180:0),z:normalizeDegrees(isBottomLayer?-cadRotationZ:cadRotationZ)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_stl_url:"stlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stlUrl):void 0,model_obj_url:"objUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.objUrl):void 0,model_mtl_url:"mtlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.mtlUrl):void 0,model_gltf_url:"gltfUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.gltfUrl):void 0,model_glb_url:"glbUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.glbUrl):void 0,model_step_url:"stepUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stepUrl):void 0,model_wrl_url:"wrlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.wrlUrl):void 0,model_jscad:"jscad"in(cadModel??{})?cadModel.jscad:void 0,model_unit_to_mm_scale_factor:typeof cadModel?.modelUnitToMmScale=="number"?cadModel.modelUnitToMmScale:void 0,footprinter_string:typeof footprint=="string"&&!cadModel?footprint:void 0,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=cad_model.cad_component_id}_addCachebustToModelUrl(url2){if(!url2||!url2.includes("modelcdn.tscircuit.com"))return url2;let origin=this.root?.getClientOrigin()??"";return`${url2}${url2.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}_getPartsEngineCacheKey(source_component,footprinterString){return JSON.stringify({ftype:source_component.ftype,name:source_component.name,manufacturer_part_number:source_component.manufacturer_part_number,footprinterString})}async _getSupplierPartNumbers(partsEngine2,source_component,footprinterString){if(this.props.doNotPlace)return{};let cacheEngine=this.root?.platform?.localCacheEngine,cacheKey=this._getPartsEngineCacheKey(source_component,footprinterString);if(cacheEngine){let cached=await cacheEngine.getItem(cacheKey);if(cached)try{return JSON.parse(cached)}catch{}}let result=await Promise.resolve(partsEngine2.findPart({sourceComponent:source_component,footprinterString}));if(typeof result=="string"){if(result.includes("<!DOCTYPE")||result.includes("<html"))throw new Error(`Failed to fetch supplier part numbers: Received HTML response instead of JSON. Response starts with: ${result.substring(0,100)}`);if(result==="Not found")return{};throw new Error(`Invalid supplier part numbers format: Expected object but got string: "${result}"`)}if(!result||Array.isArray(result)||typeof result!="object"){let actualType=result===null?"null":Array.isArray(result)?"array":typeof result;throw new Error(`Invalid supplier part numbers format: Expected object but got ${actualType}`)}let supplierPartNumbers=result;if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(supplierPartNumbers))}catch{}return supplierPartNumbers}doInitialPartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let partsEngine2=this.getInheritedProperty("partsEngine");if(!partsEngine2)return;let{db}=this.root,source_component=db.source_component.get(this.source_component_id);if(!source_component||source_component.supplier_part_numbers)return;let footprinterString;this.props.footprint&&typeof this.props.footprint=="string"&&(footprinterString=this.props.footprint);let supplierPartNumbersMaybePromise=this._getSupplierPartNumbers(partsEngine2,source_component,footprinterString);if(!(supplierPartNumbersMaybePromise instanceof Promise)){db.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbersMaybePromise});return}this._queueAsyncEffect("get-supplier-part-numbers",async()=>{await supplierPartNumbersMaybePromise.then(supplierPartNumbers=>{this._asyncSupplierPartNumbers=supplierPartNumbers,this._markDirty("PartsEngineRender")}).catch(error=>{this._asyncSupplierPartNumbers={};let errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier part numbers for ${this.getString()}: ${error.message}`,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db.unknown_error_finding_part.insert(errorObj),this._markDirty("PartsEngineRender")})})}updatePartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let{db}=this.root,source_component=db.source_component.get(this.source_component_id);if(source_component&&!source_component.supplier_part_numbers&&this._asyncSupplierPartNumbers){db.source_component.update(this.source_component_id,{supplier_part_numbers:this._asyncSupplierPartNumbers});return}}doInitialAssignFallbackProps(){let{_parsedProps:props}=this;props.connections&&!this.name&&(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}_createTracesFromConnectionsProp(){let{_parsedProps:props}=this;if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)this.add(new Trace3({from:`.${this.name} > .${pinName}`,to:String(targetPath)}))}}doInitialSourceDesignRuleChecks(){NormalComponent_doInitialSourceDesignRuleChecks(this)}doInitialPcbLayout(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db}=this.root,props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;if(!(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0))return;if(pcbLeftEdgeX!==void 0&&pcbRightEdgeX!==void 0)throw new Error(`${this.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(pcbTopEdgeY!==void 0&&pcbBottomEdgeY!==void 0)throw new Error(`${this.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let pcbComponent=db.pcb_component.get(this.pcb_component_id),componentWidth=pcbComponent?.width??0,componentHeight=pcbComponent?.height??0,positionedRelativeToGroupId=this.getGroup()?.pcb_group_id??void 0,positionedRelativeToBoardId=positionedRelativeToGroupId?void 0:this._getBoard()?.pcb_board_id??void 0,resolvedPcbX=this._resolvedPcbCalcOffsetX??(props.pcbX!==void 0?this._resolvePcbCoordinate(props.pcbX,"pcbX"):pcbLeftEdgeX!==void 0?this._resolvePcbCoordinate(pcbLeftEdgeX,"pcbX")+componentWidth/2:pcbRightEdgeX!==void 0?this._resolvePcbCoordinate(pcbRightEdgeX,"pcbX")-componentWidth/2:void 0),resolvedPcbY=this._resolvedPcbCalcOffsetY??(props.pcbY!==void 0?this._resolvePcbCoordinate(props.pcbY,"pcbY"):pcbTopEdgeY!==void 0?this._resolvePcbCoordinate(pcbTopEdgeY,"pcbY")-componentHeight/2:pcbBottomEdgeY!==void 0?this._resolvePcbCoordinate(pcbBottomEdgeY,"pcbY")+componentHeight/2:void 0);db.pcb_component.update(this.pcb_component_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:positionedRelativeToGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:resolvedPcbX,display_offset_y:resolvedPcbY})}_getMinimumFlexContainerSize(){return NormalComponent__getMinimumFlexContainerSize(this)}_repositionOnPcb(position2){return NormalComponent__repositionOnPcb(this,position2)}doInitialSilkscreenOverlapAdjustment(){return NormalComponent_doInitialSilkscreenOverlapAdjustment(this)}isRelativelyPositioned(){let rawProps=this.props;return this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0||this._parsedProps.pcbLeftEdgeX!==void 0||this._parsedProps.pcbRightEdgeX!==void 0||this._parsedProps.pcbTopEdgeY!==void 0||this._parsedProps.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0}},getBoardCenterFromAnchor=({boardAnchorPosition,boardAnchorAlignment,width,height})=>{let{x:ax2,y:ay2}=boardAnchorPosition,cx2=ax2,cy2=ay2;switch(boardAnchorAlignment){case"top_left":cx2=ax2+width/2,cy2=ay2-height/2;break;case"top_right":cx2=ax2-width/2,cy2=ay2-height/2;break;case"bottom_left":cx2=ax2+width/2,cy2=ay2+height/2;break;case"bottom_right":cx2=ax2-width/2,cy2=ay2+height/2;break;case"top":cx2=ax2,cy2=ay2-height/2;break;case"bottom":cx2=ax2,cy2=ay2+height/2;break;case"left":cx2=ax2+width/2,cy2=ay2;break;case"right":cx2=ax2-width/2,cy2=ay2;break;default:break}return{x:cx2,y:cy2}},SOLVERS={PackSolver2,AutoroutingPipelineSolver:pi2,AssignableAutoroutingPipeline2:Or2,AssignableAutoroutingPipeline3:lu,AutoroutingPipeline1_OriginalUnravel:ir2,CopperPourPipelineSolver},TscircuitAutorouter=class{constructor(input2,options={}){__publicField(this,"input");__publicField(this,"isRouting",!1);__publicField(this,"solver");__publicField(this,"eventHandlers",{complete:[],error:[],progress:[]});__publicField(this,"cycleCount",0);__publicField(this,"stepDelay");__publicField(this,"timeoutId");this.input=input2;let{capacityDepth,targetMinCapacity,stepDelay=0,useAssignableSolver=!1,useAutoJumperSolver=!1,autorouterVersion:autorouterVersion2,effort,onSolverStarted}=options,solverName;autorouterVersion2==="v1"?solverName="AutoroutingPipeline1_OriginalUnravel":useAutoJumperSolver?solverName="AssignableAutoroutingPipeline3":useAssignableSolver?solverName="AssignableAutoroutingPipeline2":solverName="AutoroutingPipelineSolver";let SolverClass=SOLVERS[solverName];this.solver=new SolverClass(input2,{capacityDepth,targetMinCapacity,cacheProvider:null,effort}),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:null,effort}}}),this.stepDelay=stepDelay}start(){this.isRouting||(this.isRouting=!0,this.cycleCount=0,this.runCycleAndQueueNextCycle())}runCycleAndQueueNextCycle(){if(this.isRouting)try{if(this.solver.solved||this.solver.failed){this.solver.failed?this.emitEvent({type:"error",error:new AutorouterError(this.solver.error||"Routing failed")}):this.emitEvent({type:"complete",traces:this.solver.getOutputSimpleRouteJson().traces||[]}),this.isRouting=!1;return}let startTime=Date.now(),startIterations=this.solver.iterations;for(;Date.now()-startTime<250&&!this.solver.failed&&!this.solver.solved;)this.solver.step();let iterationsPerSecond=(this.solver.iterations-startIterations)/(Date.now()-startTime)*1e3;this.cycleCount++;let debugGraphics=this.solver?.preview()||void 0,progress=this.solver.progress;this.emitEvent({type:"progress",steps:this.cycleCount,iterationsPerSecond,progress,phase:this.solver.getCurrentPhase(),debugGraphics}),this.stepDelay>0?this.timeoutId=setTimeout(()=>this.runCycleAndQueueNextCycle(),this.stepDelay):this.timeoutId=setTimeout(()=>this.runCycleAndQueueNextCycle(),0)}catch(error){this.emitEvent({type:"error",error:error instanceof Error?new AutorouterError(error.message):new AutorouterError(String(error))}),this.isRouting=!1}}stop(){this.isRouting&&(this.isRouting=!1,this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0))}on(event,callback){event==="complete"?this.eventHandlers.complete.push(callback):event==="error"?this.eventHandlers.error.push(callback):event==="progress"&&this.eventHandlers.progress.push(callback)}emitEvent(event){if(event.type==="complete")for(let handler of this.eventHandlers.complete)handler(event);else if(event.type==="error")for(let handler of this.eventHandlers.error)handler(event);else if(event.type==="progress")for(let handler of this.eventHandlers.progress)handler(event)}solveSync(){if(this.solver.solve(),this.solver.failed)throw new AutorouterError(this.solver.error||"Routing failed");return this.solver.getOutputSimpleRouteJson().traces||[]}getConnectedOffboardObstacles(){return"getConnectedOffboardObstacles"in this.solver?this.solver.getConnectedOffboardObstacles():{}}},createSourceTracesFromOffboardConnections=({db,connectedOffboardObstacles,simpleRouteJson,subcircuit_id})=>{if(Object.keys(connectedOffboardObstacles).length===0)return;let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}let obstacleById=new Map;for(let obstacle of simpleRouteJson.obstacles)obstacle.obstacleId&&obstacleById.set(obstacle.obstacleId,obstacle);let connectionGroups=new Map;for(let[obstacleId,rootConnectionName]of Object.entries(connectedOffboardObstacles))connectionGroups.has(rootConnectionName)||connectionGroups.set(rootConnectionName,[]),connectionGroups.get(rootConnectionName).push(obstacleId);for(let[rootConnectionName,obstacleIds]of connectionGroups){let sourcePortIds=new Set;for(let obstacleId of obstacleIds){let obstacle=obstacleById.get(obstacleId);if(obstacle)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);sourcePortId&&sourcePortIds.add(sourcePortId)}}if(sourcePortIds.size<2)continue;let sourcePortIdArray=Array.from(sourcePortIds);db.source_trace.list().some(trace=>{let tracePortIds=new Set(trace.connected_source_port_ids);return sourcePortIdArray.every(id2=>tracePortIds.has(id2))})||db.source_trace.insert({connected_source_port_ids:sourcePortIdArray,connected_source_net_ids:[],subcircuit_id:subcircuit_id??void 0,display_name:`offboard_${rootConnectionName}`})}};function getPresetAutoroutingConfig(autorouterConfig2){let defaults={serverUrl:"https://registry-api.tscircuit.com",serverMode:"job",serverCacheEnabled:!0};if(typeof autorouterConfig2=="object"&&!autorouterConfig2.preset)return{local:!(autorouterConfig2.serverUrl||autorouterConfig2.serverMode||autorouterConfig2.serverCacheEnabled),...defaults,...autorouterConfig2};let preset=typeof autorouterConfig2=="object"?autorouterConfig2.preset:autorouterConfig2,providedConfig=typeof autorouterConfig2=="object"?autorouterConfig2:{};switch(typeof preset=="string"?preset.replace(/_/g,"-"):preset){case"auto-local":return{local:!0,groupMode:"subcircuit"};case"sequential-trace":return{local:!0,groupMode:"sequential-trace"};case"subcircuit":return{local:!0,groupMode:"subcircuit"};case"auto-cloud":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!1,groupMode:"subcircuit",...defaults,...rest}}case"laser-prefab":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"laser_prefab",...rest}}case"auto-jumper":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"auto_jumper",...rest}}default:return{local:!0,groupMode:"subcircuit"}}}var applyPcbEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,pcb_placements:[...manualEditsFile.pcb_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let{pcb_component_id,new_center}=editEvent,pcb_component2=su2(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component2)continue;let source_component=su2(circuitJson).source_component.get(pcb_component2.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.pcb_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.pcb_placements.push(newPlacement)}return updatedManualEditsFile},applySchematicEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,schematic_placements:[...manualEditsFile.schematic_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_schematic_component_location"){let{schematic_component_id,new_center}=editEvent,schematic_component2=su2(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component2||!schematic_component2.source_component_id)continue;let source_component=su2(circuitJson).source_component.get(schematic_component2.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.schematic_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.schematic_placements.push(newPlacement)}return updatedManualEditsFile},applyEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let schematicEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_schematic_component_location"),pcbEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_pcb_component_location"),updatedManualEditsFile=manualEditsFile;return schematicEditEvents.length>0&&(updatedManualEditsFile=applySchematicEditEventsToManualEditsFile({circuitJson,editEvents:schematicEditEvents,manualEditsFile:updatedManualEditsFile})),pcbEditEvents.length>0&&(updatedManualEditsFile=applyPcbEditEventsToManualEditsFile({circuitJson,editEvents:pcbEditEvents,manualEditsFile:updatedManualEditsFile})),updatedManualEditsFile},applyTraceHintEditEvent=(circuitJson,edit_event)=>{if(su2(circuitJson).pcb_trace_hint.get(edit_event.pcb_trace_hint_id))circuitJson=circuitJson.map(e4=>e4.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e4,route:edit_event.route}:e4);else{let pcbPort=su2(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e4=>!(e4.type==="pcb_trace_hint"&&e4.pcb_port_id===edit_event.pcb_port_id)).concat([{type:"pcb_trace_hint",pcb_trace_hint_id:edit_event.pcb_trace_hint_id,route:edit_event.route,pcb_port_id:edit_event.pcb_port_id,pcb_component_id:pcbPort?.pcb_component_id}])}return circuitJson},applyEditEvents=({circuitJson,editEvents})=>{circuitJson=JSON.parse(JSON.stringify(circuitJson));for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let component=circuitJson.find(e4=>e4.type==="pcb_component"&&e4.pcb_component_id===editEvent.pcb_component_id);if((!component||component.center.x!==editEvent.new_center.x||component.center.y!==editEvent.new_center.y)&&editEvent.original_center){let mat=translate2(editEvent.new_center.x-editEvent.original_center.x,editEvent.new_center.y-editEvent.original_center.y);circuitJson=circuitJson.map(e4=>e4.pcb_component_id!==editEvent.pcb_component_id?e4:transformPCBElement(e4,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e4=>e4.type==="schematic_component"&&e4.schematic_component_id===editEvent.schematic_component_id?{...e4,center:editEvent.new_center}:e4):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},getDescendantSubcircuitIds=(db,root_subcircuit_id)=>{let groups=db.source_group.list(),result=[],findDescendants=parentId=>{let children=groups.filter(group=>group.parent_subcircuit_id===parentId);for(let child of children)child.subcircuit_id&&(result.push(child.subcircuit_id),findDescendants(child.subcircuit_id))};return findDescendants(root_subcircuit_id),result},getSimpleRouteJsonFromCircuitJson=({db,circuitJson,subcircuit_id,minTraceWidth=.1,nominalTraceWidth})=>{if(!db&&circuitJson&&(db=su2(circuitJson)),!db)throw new Error("db or circuitJson is required");let traceHints=db.pcb_trace_hint.list(),relevantSubcircuitIds=subcircuit_id?new Set([subcircuit_id]):null;if(subcircuit_id){let descendantSubcircuitIds=getDescendantSubcircuitIds(db,subcircuit_id);for(let id2 of descendantSubcircuitIds)relevantSubcircuitIds.add(id2)}let subcircuitElements=(circuitJson??db.toArray()).filter(e4=>!subcircuit_id||"subcircuit_id"in e4&&relevantSubcircuitIds.has(e4.subcircuit_id)),board=null;if(subcircuit_id){let source_group_id=subcircuit_id.replace(/^subcircuit_/,""),source_board2=db.source_board.getWhere({source_group_id});source_board2&&(board=db.pcb_board.getWhere({source_board_id:source_board2.source_board_id}))}board||(board=db.pcb_board.list()[0]),db=su2(subcircuitElements);let connMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),obstacles=getObstaclesFromCircuitJson2([...db.pcb_component.list(),...db.pcb_smtpad.list(),...db.pcb_plated_hole.list(),...db.pcb_hole.list(),...db.pcb_via.list(),...db.pcb_cutout.list()].filter(e4=>!subcircuit_id||relevantSubcircuitIds?.has(e4.subcircuit_id)),connMap);for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id2=>connMap.getIdsConnectedToNet(id2));obstacle.connectedTo.push(...additionalIds)}let internalConnections=db.source_component_internal_connection.list(),sourcePortIdToInternalConnectionId=new Map;for(let ic3 of internalConnections)for(let sourcePortId of ic3.source_port_ids)sourcePortIdToInternalConnectionId.set(sourcePortId,ic3.source_component_internal_connection_id);let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}for(let obstacle of obstacles)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);if(sourcePortId){let internalConnectionId=sourcePortIdToInternalConnectionId.get(sourcePortId);if(internalConnectionId){obstacle.offBoardConnectsTo=[internalConnectionId],obstacle.netIsAssignable=!0;break}}}let allPoints=obstacles.flatMap(o3=>[{x:o3.center.x-o3.width/2,y:o3.center.y-o3.height/2},{x:o3.center.x+o3.width/2,y:o3.center.y+o3.height/2}]).concat(board?.outline??[]),bounds;if(board&&!board.outline?bounds={minX:board.center.x-board.width/2,maxX:board.center.x+board.width/2,minY:board.center.y-board.height/2,maxY:board.center.y+board.height/2}:bounds={minX:Math.min(...allPoints.map(p4=>p4.x))-1,maxX:Math.max(...allPoints.map(p4=>p4.x))+1,minY:Math.min(...allPoints.map(p4=>p4.y))-1,maxY:Math.max(...allPoints.map(p4=>p4.y))+1},subcircuit_id){let group=db.pcb_group.getWhere({subcircuit_id});if(group?.width&&group.height){let groupBounds={minX:group.center.x-group.width/2,maxX:group.center.x+group.width/2,minY:group.center.y-group.height/2,maxY:group.center.y+group.height/2};bounds={minX:Math.min(bounds.minX,groupBounds.minX),maxX:Math.max(bounds.maxX,groupBounds.maxX),minY:Math.min(bounds.minY,groupBounds.minY),maxY:Math.max(bounds.maxY,groupBounds.maxY)}}}let routedTraceIds=new Set(db.pcb_trace.list().map(t21=>t21.source_trace_id).filter(id2=>!!id2)),directTraceConnections=db.source_trace.list().filter(trace=>!routedTraceIds.has(trace.source_trace_id)).map(trace=>{let connectedPorts=trace.connected_source_port_ids.map(id2=>{let source_port2=db.source_port.get(id2),pcb_port2=db.pcb_port.getWhere({source_port_id:id2});return{...source_port2,...pcb_port2}});if(connectedPorts.length<2)return null;let[portA,portB]=connectedPorts;if(portA.x===void 0||portA.y===void 0)return console.error(`(source_port_id: ${portA.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;if(portB.x===void 0||portB.y===void 0)return console.error(`(source_port_id: ${portB.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let layerA=portA.layers?.[0]??"top",layerB=portB.layers?.[0]??"top",matchingHints=traceHints.filter(hint=>hint.pcb_port_id===portA.pcb_port_id||hint.pcb_port_id===portB.pcb_port_id),hintPoints=[];for(let hint of matchingHints){let layer=db.pcb_port.get(hint.pcb_port_id)?.layers?.[0]??"top";for(let pt4 of hint.route)hintPoints.push({x:pt4.x,y:pt4.y,layer})}return{name:trace.source_trace_id??connMap.getNetConnectedToId(trace.source_trace_id)??"",source_trace_id:trace.source_trace_id,width:trace.min_trace_thickness,pointsToConnect:[{x:portA.x,y:portA.y,layer:layerA,pointId:portA.pcb_port_id,pcb_port_id:portA.pcb_port_id},...hintPoints,{x:portB.x,y:portB.y,layer:layerB,pointId:portB.pcb_port_id,pcb_port_id:portB.pcb_port_id}]}}).filter(c3=>c3!==null),directTraceConnectionsById=new Map(directTraceConnections.map(c3=>[c3.source_trace_id,c3])),source_nets=db.source_net.list().filter(e4=>!subcircuit_id||relevantSubcircuitIds?.has(e4.subcircuit_id)),connectionsFromNets=[];for(let net of source_nets){let connectedSourceTraces=db.source_trace.list().filter(st4=>st4.connected_source_net_ids?.includes(net.source_net_id));connectionsFromNets.push({name:net.source_net_id??connMap.getNetConnectedToId(net.source_net_id),pointsToConnect:connectedSourceTraces.flatMap(st4=>db.pcb_port.list().filter(p4=>st4.connected_source_port_ids.includes(p4.source_port_id)).map(p4=>({x:p4.x,y:p4.y,layer:p4.layers?.[0]??"top",pointId:p4.pcb_port_id,pcb_port_id:p4.pcb_port_id})))})}let breakoutPoints=db.pcb_breakout_point.list().filter(bp2=>!subcircuit_id||relevantSubcircuitIds?.has(bp2.subcircuit_id)),connectionsFromBreakoutPoints=[],breakoutTraceConnectionsById=new Map;for(let bp2 of breakoutPoints){let pt4={x:bp2.x,y:bp2.y,layer:"top"};if(bp2.source_trace_id){let conn=directTraceConnectionsById.get(bp2.source_trace_id)??breakoutTraceConnectionsById.get(bp2.source_trace_id);if(conn)conn.pointsToConnect.push(pt4);else{let newConn={name:bp2.source_trace_id,source_trace_id:bp2.source_trace_id,pointsToConnect:[pt4]};connectionsFromBreakoutPoints.push(newConn),breakoutTraceConnectionsById.set(bp2.source_trace_id,newConn)}}else if(bp2.source_net_id){let conn=connectionsFromNets.find(c3=>c3.name===bp2.source_net_id);conn?conn.pointsToConnect.push(pt4):connectionsFromBreakoutPoints.push({name:bp2.source_net_id,pointsToConnect:[pt4]})}else if(bp2.source_port_id){let pcb_port2=db.pcb_port.getWhere({source_port_id:bp2.source_port_id});pcb_port2&&connectionsFromBreakoutPoints.push({name:bp2.source_port_id,source_trace_id:void 0,pointsToConnect:[{x:pcb_port2.x,y:pcb_port2.y,layer:pcb_port2.layers?.[0]??"top",pointId:pcb_port2.pcb_port_id,pcb_port_id:pcb_port2.pcb_port_id},pt4]})}}let allConns=[...directTraceConnections,...connectionsFromNets,...connectionsFromBreakoutPoints],pointIdToConn=new Map;for(let conn of allConns)for(let pt4 of conn.pointsToConnect)pt4.pointId&&pointIdToConn.set(pt4.pointId,conn);let existingTraces=db.pcb_trace.list().filter(t21=>!subcircuit_id||relevantSubcircuitIds?.has(t21.subcircuit_id));for(let tr4 of existingTraces){let tracePortIds=new Set;for(let seg of tr4.route)seg.start_pcb_port_id&&tracePortIds.add(seg.start_pcb_port_id),seg.end_pcb_port_id&&tracePortIds.add(seg.end_pcb_port_id);if(tracePortIds.size<2)continue;let firstId=tracePortIds.values().next().value;if(!firstId)continue;let conn=pointIdToConn.get(firstId);conn&&[...tracePortIds].every(pid=>pointIdToConn.get(pid)===conn)&&(conn.externallyConnectedPointIds??(conn.externallyConnectedPointIds=[]),conn.externallyConnectedPointIds.push([...tracePortIds]))}return{simpleRouteJson:{bounds,obstacles,connections:allConns,layerCount:board?.num_layers??2,minTraceWidth,nominalTraceWidth,outline:board?.outline?.map(point6=>({...point6}))},connMap}},getPhaseTimingsFromRenderEvents=renderEvents=>{let phaseTimings={};if(!renderEvents)return phaseTimings;for(let renderPhase of orderedRenderPhases)phaseTimings[renderPhase]=0;let startEvents=new Map;for(let event of renderEvents){let[,,phase,eventType]=event.type.split(":");if(eventType==="start"){startEvents.set(`${phase}:${event.renderId}`,event);continue}if(eventType==="end"){let startEvent=startEvents.get(`${phase}:${event.renderId}`);if(startEvent){let duration=event.createdAt-startEvent.createdAt;phaseTimings[phase]=(phaseTimings[phase]||0)+duration}}}return phaseTimings},normalizePinLabels=inputPinLabels=>{let unqInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=unqInputPinLabels.map(()=>[]),desiredNumbers=unqInputPinLabels.map(()=>null);for(let i2=0;i2<unqInputPinLabels.length;i2++)for(let label of unqInputPinLabels[i2])if(/^\d+$/.test(label)){desiredNumbers[i2]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i2=0;i2<desiredNumbers.length;i2++){let desiredNumber=desiredNumbers[i2];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i2].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i2])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i2].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i2=0;i2<result.length;i2++)result[i2][0]?.includes("_alt")&&(highestPinNumber++,result[i2].unshift(`pin${highestPinNumber}`));for(let i2=0;i2<result.length;i2++)result[i2].length===0&&(highestPinNumber++,result[i2].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of unqInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i2=0;i2<unqInputPinLabels.length;i2++){let inputLabels=unqInputPinLabels[i2];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i2].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i2].push(`${label}${incrementalLabelCounts[label]}`)))}return result},TraceHint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"matchedPort",null)}get config(){return{componentName:"TraceHint",zodProps:traceHintProps}}doInitialPortMatching(){let{db}=this.root,{_parsedProps:props,parent}=this;if(!parent)return;if(parent.componentName==="Trace"){this.renderError(`Port inference inside trace is not yet supported (${this})`);return}if(!parent)throw new Error("TraceHint has no parent");if(!props.for){this.renderError(`TraceHint has no for property (${this})`);return}let port=parent.selectOne(props.for,{type:"port"});port||this.renderError(`${this} could not find port for selector "${props.for}"`),this.matchedPort=port,port.registerMatch(this)}getPcbRouteHints(){let{_parsedProps:props}=this,offsets=props.offset?[props.offset]:props.offsets;if(!offsets)return[];let globalTransform=this._computePcbGlobalTransformBeforeLayout();return offsets.map(offset=>({...applyToPoint2(globalTransform,offset),via:offset.via,to_layer:offset.to_layer,trace_width:offset.trace_width}))}doInitialPcbTraceHintRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this;db.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}},SUPPORTED_COMPONENT_FIELDS=new Set(["x","y","minx","maxx","miny","maxy","width","height"]);function Group_doInitialPcbCalcPlacementResolution(group){if(group.root?.pcbDisabled||!group.isSubcircuit)return;let{db}=group.root,normalComponentNameMap=group.getNormalComponentNameMap?.()??new Map,allNormalComponents=collectNormalComponentsInSubcircuit(group),namedComponentVars={};for(let component of allNormalComponents)updateVarsForNamedComponent(component,namedComponentVars);let candidatesByName=new Map,inDegree=new Map,dependents=new Map;for(let component of allNormalComponents){if(!shouldResolvePlacementInCalcPhase(component))continue;let refs=getComponentRefsForCalcPlacement(component);if(!component.name)throw new Error(`Invalid pcb position expression for ${component.getString()}: component-relative calc requires the component to have a name`);candidatesByName.set(component.name,{component,refs}),inDegree.set(component.name,0)}for(let[candidateName,candidate]of candidatesByName.entries()){let referencedCandidateNames=new Set;for(let token of candidate.refs){let{referencePath,field}=parseComponentReferenceToken(token);if(!SUPPORTED_COMPONENT_FIELDS.has(field))throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unsupported component field "${field}" in "${token}"`);let referencedComponentName=resolveReferencedComponentName({token,referencePath,candidate,normalComponentNameMap});candidatesByName.has(referencedComponentName)&&referencedComponentName!==candidateName&&referencedCandidateNames.add(referencedComponentName)}for(let referencedComponentName of referencedCandidateNames)inDegree.set(candidateName,(inDegree.get(candidateName)??0)+1),dependents.has(referencedComponentName)||dependents.set(referencedComponentName,new Set),dependents.get(referencedComponentName).add(candidateName)}let queue=[...inDegree.entries()].filter(([,degree])=>degree===0).map(([name])=>name),resolvedCount=0;for(;queue.length>0;){let name=queue.shift(),candidate=candidatesByName.get(name);if(candidate){resolveCandidatePlacement(candidate.component,namedComponentVars),resolvedCount++;for(let dependentName of dependents.get(name)??[]){let nextDegree=(inDegree.get(dependentName)??0)-1;inDegree.set(dependentName,nextDegree),nextDegree===0&&queue.push(dependentName)}}}if(resolvedCount<candidatesByName.size){let unresolvedNames=[...candidatesByName.keys()].filter(name=>(inDegree.get(name)??0)>0);throw new Error(`Circular pcb position calc references detected among: ${unresolvedNames.join(", ")}`)}function resolveCandidatePlacement(component,componentVars){if(!component.pcb_component_id)return;let pcbComponent=db.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY;if(rawPcbLeftEdgeX!==void 0&&rawPcbRightEdgeX!==void 0)throw new Error(`${component.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(rawPcbTopEdgeY!==void 0&&rawPcbBottomEdgeY!==void 0)throw new Error(`${component.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let componentWidth=pcbComponent.width??0,componentHeight=pcbComponent.height??0,nextCenter={x:pcbComponent.center.x,y:pcbComponent.center.y};if(rawPcbX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate(rawPcbX,"pcbX",{allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbLeftEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate(rawPcbLeftEdgeX,"pcbX",{allowComponentVariables:!0,componentVariables:componentVars})+componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbRightEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate(rawPcbRightEdgeX,"pcbX",{allowComponentVariables:!0,componentVariables:componentVars})-componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}if(rawPcbY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate(rawPcbY,"pcbY",{allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbTopEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate(rawPcbTopEdgeY,"pcbY",{allowComponentVariables:!0,componentVariables:componentVars})-componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbBottomEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate(rawPcbBottomEdgeY,"pcbY",{allowComponentVariables:!0,componentVariables:componentVars})+componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}component._repositionOnPcb(nextCenter),updateVarsForNamedComponent(component,componentVars)}}function shouldResolvePlacementInCalcPhase(component){let parsedProps=component._parsedProps,rawProps=component.props,pcbX=parsedProps.pcbX,pcbY=parsedProps.pcbY,pcbLeftEdgeX=parsedProps.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=parsedProps.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=parsedProps.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=parsedProps.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;return pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0?!0:typeof pcbX=="string"||typeof pcbY=="string"}function collectNormalComponentsInSubcircuit(group){let components=[],walk=node=>{node._isNormalComponent&&components.push(node);for(let child of node.children)child.isSubcircuit||walk(child)};for(let child of group.children)child.isSubcircuit||walk(child);return components}function getComponentRefsForCalcPlacement(component){let refs=new Set,rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY,addRefs=rawValue=>{if(typeof rawValue!="string")return;let identifiers=extractCalcIdentifiers(rawValue);for(let identifier of identifiers)identifier.startsWith("board.")||refs.add(identifier)};return addRefs(rawPcbX),addRefs(rawPcbY),addRefs(rawPcbLeftEdgeX),addRefs(rawPcbRightEdgeX),addRefs(rawPcbTopEdgeY),addRefs(rawPcbBottomEdgeY),refs}function parseComponentReferenceToken(token){let dotIndex=token.lastIndexOf(".");if(dotIndex<=0||dotIndex===token.length-1)throw new Error(`Invalid component reference token: "${token}"`);return{referencePath:token.slice(0,dotIndex),field:token.slice(dotIndex+1).toLowerCase()}}function resolveReferencedComponentName(params){let{token,referencePath,candidate,normalComponentNameMap}=params,directComponents=normalComponentNameMap.get(referencePath);if(directComponents&&directComponents.length>0){if(directComponents.length>1)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: ambiguous component reference "${referencePath}" in "${token}"`);return referencePath}let bestMatch=null;for(let componentName of normalComponentNameMap.keys())referencePath.startsWith(`${componentName}.`)&&(!bestMatch||componentName.length>bestMatch.length)&&(bestMatch=componentName);if(!bestMatch)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unknown component reference "${referencePath}" in "${token}"`);return bestMatch}function updateVarsForNamedComponent(component,vars){if(!component.name||!component.pcb_component_id||!component.root)return;let pcbComponent=component.root.db.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let width=pcbComponent.width??0,height=pcbComponent.height??0,x5=pcbComponent.center.x,y5=pcbComponent.center.y;vars[`${component.name}.x`]=x5,vars[`${component.name}.y`]=y5,vars[`${component.name}.width`]=width,vars[`${component.name}.height`]=height,vars[`${component.name}.minX`]=x5-width/2,vars[`${component.name}.maxX`]=x5+width/2,vars[`${component.name}.minY`]=y5-height/2,vars[`${component.name}.maxY`]=y5+height/2;let padElementsByReference=collectPadElementsByReference(component);for(let[referencePath,elements]of padElementsByReference.entries()){let bounds=getBoundsOfPcbElements(elements),minX=bounds.minX,maxX=bounds.maxX,minY=bounds.minY,maxY=bounds.maxY;vars[`${referencePath}.x`]=(minX+maxX)/2,vars[`${referencePath}.y`]=(minY+maxY)/2,vars[`${referencePath}.width`]=maxX-minX,vars[`${referencePath}.height`]=maxY-minY,vars[`${referencePath}.minX`]=minX,vars[`${referencePath}.maxX`]=maxX,vars[`${referencePath}.minY`]=minY,vars[`${referencePath}.maxY`]=maxY}}function collectPadElementsByReference(component){let refsToElements=new Map;if(!component.name||!component.pcb_component_id||!component.root)return refsToElements;let{db}=component.root,padElements=[...db.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})];for(let pad2 of padElements){let aliases2=new Set;for(let hint of pad2.port_hints??[])typeof hint=="string"&&hint.length>0&&aliases2.add(hint);let pcbPortId=pad2.pcb_port_id;if(pcbPortId){let pcbPort=db.pcb_port.get(pcbPortId),sourcePort=pcbPort?.source_port_id?db.source_port.get(pcbPort.source_port_id):null;sourcePort?.name&&aliases2.add(sourcePort.name),sourcePort?.pin_number!=null&&aliases2.add(`pin${sourcePort.pin_number}`)}for(let alias of aliases2){let referencePath=`${component.name}.${alias}`;refsToElements.has(referencePath)||refsToElements.set(referencePath,[]),refsToElements.get(referencePath).push(pad2)}}return refsToElements}function Group_doInitialPcbComponentAnchorAlignment(group){if(group.root?.pcbDisabled||!group.pcb_group_id)return;let pcbPositionAnchor=group._parsedProps?.pcbPositionAnchor;if(!pcbPositionAnchor)return;let targetPosition=group._getGlobalPcbPositionBeforeLayout(),{pcbX,pcbY}=group._parsedProps;if(pcbX===void 0&&pcbY===void 0)return;let{db}=group.root,pcbGroup=db.pcb_group.get(group.pcb_group_id);if(!pcbGroup)return;let width=pcbGroup.width,height=pcbGroup.height,{center:center2}=pcbGroup;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds2=getBoundsFromPoints(pcbGroup.outline);bounds2&&(width=bounds2.maxX-bounds2.minX,height=bounds2.maxY-bounds2.minY)}if(!width||!height)return;let bounds={left:center2.x-width/2,right:center2.x+width/2,top:center2.y+height/2,bottom:center2.y-height/2},currentCenter={...center2},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor))switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:bounds.left,y:bounds.top};break;case"top_center":anchorPos={x:currentCenter.x,y:bounds.top};break;case"top_right":anchorPos={x:bounds.right,y:bounds.top};break;case"center_left":anchorPos={x:bounds.left,y:currentCenter.y};break;case"center_right":anchorPos={x:bounds.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:bounds.left,y:bounds.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:bounds.bottom};break;case"bottom_right":anchorPos={x:bounds.right,y:bounds.bottom};break}if(!anchorPos)return;let newCenter={...currentCenter};targetPosition.x!==void 0&&(newCenter.x+=targetPosition.x-anchorPos.x),targetPosition.y!==void 0&&(newCenter.y+=targetPosition.y-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&(group._repositionOnPcb(newCenter),db.pcb_group.update(group.pcb_group_id,{center:newCenter})),db.pcb_group.update(group.pcb_group_id,{anchor_position:targetPosition,anchor_alignment:pcbPositionAnchor,display_offset_x:pcbX,display_offset_y:pcbY})}var Group_doInitialPcbLayoutFlex=group=>{let{db}=group.root,{_parsedProps:props}=group,pcbChildren=group.children.filter(c3=>c3.pcb_component_id||c3.pcb_group_id);if(pcbChildren.some(child=>{let childProps=child._parsedProps;return childProps?.pcbX!==void 0||childProps?.pcbY!==void 0}))return;let rawJustify=props.pcbJustifyContent??props.justifyContent,rawAlign=props.pcbAlignItems??props.alignItems,rawGap=props.pcbFlexGap??props.pcbGap??props.gap,direction2=props.pcbFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.pcbWidth??void 0,height=props.height??props.pcbHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(pcbChildren.map(child=>child._getMinimumFlexContainerSize()).filter(size2=>size2!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of pcbChildren){let size2=child._getMinimumFlexContainerSize();flexBox.addChild({metadata:child,width:size2?.width??0,height:size2?.height??0,flexBasis:size2?direction2==="row"?size2.width:size2.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let groupCenter=group._getGlobalPcbPositionBeforeLayout(),offset={x:groupCenter.x-(bounds.maxX+bounds.minX)/2,y:groupCenter.y-(bounds.maxY+bounds.minY)/2};for(let child of flexBox.children)child.metadata._repositionOnPcb({x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y});db.pcb_group.update(group.pcb_group_id,{width:bounds.width,height:bounds.height,center:groupCenter})},MIN_GAP=1;function Group_doInitialPcbLayoutGrid(group){let{db}=group.root,props=group._parsedProps,pcbChildren=getPcbChildren(group);if(pcbChildren.length===0)return;let childDimensions=calculateChildDimensions({db,pcbChildren}),gridConfig=parseGridConfiguration(props),gridLayout=createGridLayout({props,pcbChildren,childDimensions,gridConfig}),cssGrid=createCssGrid({pcbChildren,childDimensions,gridLayout,gridConfig}),{itemCoordinates}=cssGrid.layout();positionChildren({db,group,pcbChildren,itemCoordinates,gridLayout}),updateGroupDimensions({db,group,props,gridLayout})}function getPcbChildren(group){return group.children.filter(child=>child.pcb_component_id||child.pcb_group_id)}function calculateChildDimensions(params){let{db,pcbChildren}=params,maxWidth=0,maxHeight=0;for(let child of pcbChildren){let width=0,height=0;if(child.pcb_group_id){let pcbGroup=db.pcb_group.get(child.pcb_group_id);width=pcbGroup?.width??0,height=pcbGroup?.height??0}else if(child.pcb_component_id){let pcbComp=db.pcb_component.get(child.pcb_component_id);width=pcbComp?.width??0,height=pcbComp?.height??0}maxWidth=Math.max(maxWidth,width),maxHeight=Math.max(maxHeight,height)}return{width:maxWidth,height:maxHeight}}function parseGridConfiguration(props){let cols=props.pcbGridCols??props.gridCols??props.pcbLayout?.grid?.cols,rows=props.pcbGridRows??props.pcbLayout?.grid?.rows,templateColumns=props.pcbGridTemplateColumns,templateRows=props.pcbGridTemplateRows,parseGap=gapValue=>gapValue===void 0?MIN_GAP:typeof gapValue=="number"?gapValue:length.parse(gapValue),gridGapOption=props.pcbGridGap??props.gridGap??props.pcbLayout?.gridGap,rowGapOption=props.pcbGridRowGap??props.gridRowGap??props.pcbLayout?.gridRowGap,colGapOption=props.pcbGridColumnGap??props.gridColumnGap??props.pcbLayout?.gridColumnGap,gapX=MIN_GAP,gapY=MIN_GAP;if(rowGapOption!==void 0||colGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"?gridGapOption?.x:gridGapOption,fallbackY=typeof gridGapOption=="object"?gridGapOption?.y:gridGapOption;gapX=parseGap(colGapOption??fallbackX),gapY=parseGap(rowGapOption??fallbackY)}else if(typeof gridGapOption=="object"&&gridGapOption!==null)gapX=parseGap(gridGapOption.x),gapY=parseGap(gridGapOption.y);else{let gap=parseGap(gridGapOption);gapX=gap,gapY=gap}return{cols,rows,gapX,gapY,templateColumns,templateRows}}function createGridLayout(params){let{props,pcbChildren,childDimensions,gridConfig}=params;return props.pcbGridTemplateColumns||props.pcbGridTemplateRows?createTemplateBasedLayout({props,gridConfig,pcbChildren,childDimensions}):createDefaultLayout({gridConfig,pcbChildren,childDimensions})}function createTemplateBasedLayout(params){let{props,gridConfig,pcbChildren,childDimensions}=params,gridTemplateColumns=props.pcbGridTemplateColumns??"",gridTemplateRows=props.pcbGridTemplateRows??"",extractRepeatCount=template=>{let match2=template.match(/repeat\((\d+),/);return match2?parseInt(match2[1]):Math.ceil(Math.sqrt(pcbChildren.length))},numCols=props.pcbGridTemplateColumns?extractRepeatCount(gridTemplateColumns):Math.ceil(Math.sqrt(pcbChildren.length)),numRows=props.pcbGridTemplateRows?extractRepeatCount(gridTemplateRows):Math.ceil(pcbChildren.length/numCols),containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createDefaultLayout(params){let{gridConfig,pcbChildren,childDimensions}=params,numCols,numRows;gridConfig.cols!==void 0&&gridConfig.rows!==void 0?(numCols=gridConfig.cols,numRows=gridConfig.rows):gridConfig.cols!==void 0?(numCols=gridConfig.cols,numRows=Math.ceil(pcbChildren.length/numCols)):gridConfig.rows!==void 0?(numRows=gridConfig.rows,numCols=Math.ceil(pcbChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(pcbChildren.length)),numRows=Math.ceil(pcbChildren.length/numCols)),numCols=Math.max(1,numCols),numRows=Math.max(1,numRows);let containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY,gridTemplateColumns=`repeat(${numCols}, ${childDimensions.width}px)`,gridTemplateRows=`repeat(${numRows}, ${childDimensions.height}px)`;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createCssGrid(params){let{pcbChildren,childDimensions,gridLayout,gridConfig}=params,gridChildren=pcbChildren.map((child,index)=>({key:child.getString()||`child-${index}`,contentWidth:childDimensions.width,contentHeight:childDimensions.height}));return new CssGrid({containerWidth:gridLayout.containerWidth,containerHeight:gridLayout.containerHeight,gridTemplateColumns:gridLayout.gridTemplateColumns,gridTemplateRows:gridLayout.gridTemplateRows,gap:[gridConfig.gapY,gridConfig.gapX],children:gridChildren})}function positionChildren(params){let{db,group,pcbChildren,itemCoordinates,gridLayout}=params,groupCenter=group._getGlobalPcbPositionBeforeLayout(),allCircuitJson=db.toArray();for(let i2=0;i2<pcbChildren.length;i2++){let child=pcbChildren[i2],childKey=child.getString()||`child-${i2}`,coordinates=itemCoordinates[childKey];if(!coordinates){console.warn(`PCB grid layout: No coordinates found for child ${childKey}`);continue}let targetX=groupCenter.x-gridLayout.containerWidth/2+coordinates.x+coordinates.width/2,targetY=groupCenter.y+gridLayout.containerHeight/2-coordinates.y-coordinates.height/2;if(child.pcb_component_id)repositionPcbComponentTo(allCircuitJson,child.pcb_component_id,{x:targetX,y:targetY});else{let groupChild=child;groupChild.pcb_group_id&&groupChild.source_group_id&&repositionPcbGroupTo(allCircuitJson,groupChild.source_group_id,{x:targetX,y:targetY})}}}function updateGroupDimensions(params){let{db,group,props,gridLayout}=params;if(group.pcb_group_id){let groupCenter=group._getGlobalPcbPositionBeforeLayout();db.pcb_group.update(group.pcb_group_id,{width:props.width??gridLayout.containerWidth,height:props.height??gridLayout.containerHeight,center:groupCenter})}}var applyComponentConstraintClusters=(group,packInput)=>{let constraints=group.children.filter(c3=>c3.componentName==="Constraint"&&c3._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x5=>(parent[x5]!==x5&&(parent[x5]=find2(parent[x5])),parent[x5]),union2=(a2,b3)=>{let ra3=find2(a2),rb=find2(b3);ra3!==rb&&(parent[rb]=ra3)},makeSet=x5=>{x5 in parent||(parent[x5]=x5)},getIdFromSelector=sel2=>{let name=sel2.startsWith(".")?sel2.slice(1):sel2;return group.children.find(c3=>c3.name===name)?.pcb_component_id??void 0};for(let constraint of constraints){let props=constraint._parsedProps;if("left"in props&&"right"in props){let a2=getIdFromSelector(props.left),b3=getIdFromSelector(props.right);a2&&b3&&(makeSet(a2),makeSet(b3),union2(a2,b3))}else if("top"in props&&"bottom"in props){let a2=getIdFromSelector(props.top),b3=getIdFromSelector(props.bottom);a2&&b3&&(makeSet(a2),makeSet(b3),union2(a2,b3))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);for(let id2 of ids)makeSet(id2);for(let i2=1;i2<ids.length;i2++)union2(ids[0],ids[i2])}}for(let id2 of Object.keys(parent)){let rootId=find2(id2);clusterByRoot.has(rootId)||clusterByRoot.set(rootId,{componentIds:[],constraints:[]}),clusterByRoot.get(rootId).componentIds.push(id2)}for(let constraint of constraints){let props=constraint._parsedProps,compId;if("left"in props?compId=getIdFromSelector(props.left):"top"in props?compId=getIdFromSelector(props.top):"for"in props&&(compId=getIdFromSelector(props.for[0])),!compId)continue;let root=find2(compId);clusterByRoot.get(root)?.constraints.push(constraint)}let clusterMap={},packCompById=Object.fromEntries(packInput.components.map(c3=>[c3.componentId,c3]));for(let[rootId,info]of clusterByRoot.entries()){if(info.componentIds.length<=1)continue;let solver=new Solver,kVars={},getVar=(id2,axis)=>{let key=`${id2}_${axis}`;return kVars[key]||(kVars[key]=new Variable(key)),kVars[key]},anchor=info.componentIds[0];solver.addConstraint(new Constraint(getVar(anchor,"x"),Operator.Eq,0,Strength.required)),solver.addConstraint(new Constraint(getVar(anchor,"y"),Operator.Eq,0,Strength.required));for(let constraint of info.constraints){let props=constraint._parsedProps;if("xDist"in props){let left=getIdFromSelector(props.left),right=getIdFromSelector(props.right);left&&right&&solver.addConstraint(new Constraint(new Expression(getVar(right,"x"),[-1,getVar(left,"x")]),Operator.Eq,props.xDist,Strength.required))}else if("yDist"in props){let top=getIdFromSelector(props.top),bottom=getIdFromSelector(props.bottom);top&&bottom&&solver.addConstraint(new Constraint(new Expression(getVar(top,"y"),[-1,getVar(bottom,"y")]),Operator.Eq,props.yDist,Strength.required))}else if("sameX"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);if(ids.length>1){let base=getVar(ids[0],"x");for(let i2=1;i2<ids.length;i2++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i2],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);if(ids.length>1){let base=getVar(ids[0],"y");for(let i2=1;i2<ids.length;i2++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i2],"y"),[-1,base]),Operator.Eq,0,Strength.required))}}}solver.updateVariables();let positions={};for(let id2 of info.componentIds)positions[id2]={x:getVar(id2,"x").value(),y:getVar(id2,"y").value()};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp)for(let pad2 of comp.pads){let ax2=pos.x+pad2.offset.x,ay2=pos.y+pad2.offset.y;minX=Math.min(minX,ax2-pad2.size.x/2),maxX=Math.max(maxX,ax2+pad2.size.x/2),minY=Math.min(minY,ay2-pad2.size.y/2),maxY=Math.max(maxY,ay2+pad2.size.y/2)}}let clusterCenter={x:(minX+maxX)/2,y:(minY+maxY)/2},mergedPads=[],relCenters={};for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp){relCenters[id2]={x:pos.x-clusterCenter.x,y:pos.y-clusterCenter.y};for(let pad2 of comp.pads)mergedPads.push({padId:pad2.padId,networkId:pad2.networkId,type:pad2.type,size:pad2.size,offset:{x:pos.x+pad2.offset.x-clusterCenter.x,y:pos.y+pad2.offset.y-clusterCenter.y}})}}packInput.components=packInput.components.filter(c3=>!info.componentIds.includes(c3.componentId)),packInput.components.push({componentId:info.componentIds[0],pads:mergedPads,availableRotationDegrees:[0]}),info.relativeCenters=relCenters,clusterMap[info.componentIds[0]]=info}return clusterMap},updateCadRotation=({db,pcbComponentId,rotationDegrees,layer})=>{if(rotationDegrees==null||!db?.cad_component?.list)return;let cadComponent=db.cad_component.getWhere({pcb_component_id:pcbComponentId});if(!cadComponent)return;let delta=layer?.toLowerCase?.()==="bottom"?-rotationDegrees:rotationDegrees,currentRotationZ=cadComponent.rotation?.z??0,nextRotation={...cadComponent.rotation??{x:0,y:0,z:0},z:normalizeDegrees(currentRotationZ+delta)};db.cad_component.update(cadComponent.cad_component_id,{rotation:nextRotation}),cadComponent.rotation=nextRotation},isDescendantGroup=(db,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group=db.source_group.get(groupId);return!group||!group.parent_source_group_id?!1:isDescendantGroup(db,group.parent_source_group_id,ancestorId)},applyPackOutput=(group,packOutput,clusterMap)=>{let{db}=group.root;for(let packedComponent of packOutput.components){let{center:center2,componentId,ccwRotationOffset,ccwRotationDegrees}=packedComponent,cluster=clusterMap[componentId];if(cluster){let rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,angleRad=rotationDegrees2*Math.PI/180;for(let memberId of cluster.componentIds){let rel=cluster.relativeCenters[memberId];if(!rel)continue;db.pcb_component.update(memberId,{position_mode:"packed"});let rotatedRel={x:rel.x*Math.cos(angleRad)-rel.y*Math.sin(angleRad),y:rel.x*Math.sin(angleRad)+rel.y*Math.cos(angleRad)},member=db.pcb_component.get(memberId);if(!member)continue;let originalCenter2=member.center,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x+rotatedRel.x,center2.y+rotatedRel.y),rotate2(angleRad),translate2(-originalCenter2.x,-originalCenter2.y)),related=db.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===memberId);transformPCBElements(related,transformMatrix2),updateCadRotation({db,pcbComponentId:memberId,rotationDegrees:rotationDegrees2,layer:member.layer})}continue}let pcbComponent=db.pcb_component.get(componentId);if(pcbComponent){db.pcb_component.update(componentId,{position_mode:"packed"});let currentGroupId=group.source_group_id,componentGroupId=db.source_component.get(pcbComponent.source_component_id)?.source_group_id;if(componentGroupId!==void 0&&!isDescendantGroup(db,componentGroupId,currentGroupId))continue;let originalCenter2=pcbComponent.center,rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees2*Math.PI/180),translate2(-originalCenter2.x,-originalCenter2.y)),related=db.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===componentId);transformPCBElements(related,transformMatrix2),updateCadRotation({db,pcbComponentId:componentId,rotationDegrees:rotationDegrees2,layer:pcbComponent.layer});continue}let pcbGroup=db.pcb_group.list().find(g7=>g7.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=pcbGroup.center,rotationDegrees=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees*Math.PI/180),translate2(-originalCenter.x,-originalCenter.y)),relatedElements=db.toArray().filter(elm=>{if("source_group_id"in elm&&elm.source_group_id&&(elm.source_group_id===componentId||isDescendantGroup(db,elm.source_group_id,componentId)))return!0;if("source_component_id"in elm&&elm.source_component_id){let sourceComponent=db.source_component.get(elm.source_component_id);if(sourceComponent?.source_group_id&&(sourceComponent.source_group_id===componentId||isDescendantGroup(db,sourceComponent.source_group_id,componentId)))return!0}if("pcb_component_id"in elm&&elm.pcb_component_id){let pcbComp=db.pcb_component.get(elm.pcb_component_id);if(pcbComp?.source_component_id){let sourceComp=db.source_component.get(pcbComp.source_component_id);if(sourceComp?.source_group_id&&(sourceComp.source_group_id===componentId||isDescendantGroup(db,sourceComp.source_group_id,componentId)))return!0}}return!1});for(let elm of relatedElements)elm.type==="pcb_component"&&db.pcb_component.update(elm.pcb_component_id,{position_mode:"packed"});transformPCBElements(relatedElements,transformMatrix),db.pcb_group.update(pcbGroup.pcb_group_id,{center:center2})}},DEFAULT_MIN_GAP="1mm",debug42=(0,import_debug12.default)("Group_doInitialPcbLayoutPack"),Group_doInitialPcbLayoutPack=group=>{let{db}=group.root,{_parsedProps:props}=group;group.root?.emit("packing:start",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()});let{packOrderStrategy,packPlacementStrategy,gap:gapProp,pcbGap,pcbPackGap}=props,gap=pcbPackGap??pcbGap??gapProp,gapMm=length.parse(gap??DEFAULT_MIN_GAP),chipMarginsMap={},staticPcbComponentIds=new Set,collectMargins=comp=>{if(comp?.pcb_component_id&&comp?._parsedProps){let props2=comp._parsedProps,left=length.parse(props2.pcbMarginLeft??props2.pcbMarginX??0),right=length.parse(props2.pcbMarginRight??props2.pcbMarginX??0),top=length.parse(props2.pcbMarginTop??props2.pcbMarginY??0),bottom=length.parse(props2.pcbMarginBottom??props2.pcbMarginY??0);(left||right||top||bottom)&&(chipMarginsMap[comp.pcb_component_id]={left,right,top,bottom})}comp?.children&&comp.children.forEach(collectMargins)};collectMargins(group);let excludedPcbGroupIds=new Set;for(let child of group.children){let childIsGroupOrNormalComponent=child;childIsGroupOrNormalComponent._isNormalComponent&&childIsGroupOrNormalComponent.isRelativelyPositioned?.()&&(childIsGroupOrNormalComponent.pcb_component_id&&staticPcbComponentIds.add(childIsGroupOrNormalComponent.pcb_component_id),childIsGroupOrNormalComponent.pcb_group_id&&excludedPcbGroupIds.add(childIsGroupOrNormalComponent.pcb_group_id))}let isDescendantGroup2=(db2,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group2=db2.source_group.get(groupId);return!group2||!group2.parent_source_group_id?!1:isDescendantGroup2(db2,group2.parent_source_group_id,ancestorId)};if(excludedPcbGroupIds.size>0)for(let element of db.toArray()){if(element.type!=="pcb_component")continue;let sourceComponent=db.source_component.get(element.source_component_id);if(sourceComponent?.source_group_id)for(let groupId of excludedPcbGroupIds)isDescendantGroup2(db,sourceComponent.source_group_id,groupId)&&staticPcbComponentIds.add(element.pcb_component_id)}let filteredCircuitJson=db.toArray(),bounds;if(props.width!==void 0&&props.height!==void 0){let widthMm=length.parse(props.width),heightMm=length.parse(props.height);bounds={minX:-widthMm/2,maxX:widthMm/2,minY:-heightMm/2,maxY:heightMm/2}}let packInput={...convertPackOutputToPackInput(convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)})),orderStrategy:packOrderStrategy??"largest_to_smallest",placementStrategy:packPlacementStrategy??"minimum_sum_squared_distance_to_network",minGap:gapMm,bounds},clusterMap=applyComponentConstraintClusters(group,packInput);debug42.enabled&&(group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${group.name}`,content:JSON.stringify(db.toArray())}),group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${group.name}`,content:packInput}));let packOutput;try{let solver=new PackSolver2(packInput);group.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams:solver.getConstructorParams(),componentName:group.getString()}),solver.solve(),packOutput={...packInput,components:solver.packedComponents}}catch(error){throw group.root?.emit("packing:error",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString(),error:{message:error instanceof Error?error.message:String(error)}}),error}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group,packOutput,clusterMap),group.root?.emit("packing:end",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()})},getSizeOfTreeNodeChild=(db,child)=>{let{sourceComponent,sourceGroup}=child;if(child.nodeType==="component"){let schComponent=db.schematic_component.getWhere({source_component_id:sourceComponent?.source_component_id});return schComponent?.size?{width:schComponent.size.width,height:schComponent.size.height}:null}if(child.nodeType==="group"){let schGroup=db.schematic_group.getWhere({source_group_id:sourceGroup?.source_group_id});if(schGroup?.width&&schGroup?.height)return{width:schGroup.width,height:schGroup.height};let groupComponents=db.schematic_component.list({schematic_group_id:schGroup?.schematic_group_id}),minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let comp of groupComponents)if(comp.center&&comp.size){let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let groupWidth=maxX-minX,groupHeight=maxY-minY;return{width:groupWidth,height:groupHeight}}return null},Group_doInitialSchematicLayoutFlex=group=>{let{db}=group.root,props=group._parsedProps,tree=getCircuitJsonTree(db.toArray(),{source_group_id:group.source_group_id}),rawJustify=props.schJustifyContent??props.justifyContent,rawAlign=props.schAlignItems??props.alignItems,rawGap=props.schFlexGap??props.schGap??props.gap,direction2=props.schFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.schWidth??void 0,height=props.height??props.schHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(tree.childNodes.map(child=>getSizeOfTreeNodeChild(db,child)).filter(size2=>size2!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of tree.childNodes){let size2=getSizeOfTreeNodeChild(db,child);flexBox.addChild({metadata:child,width:size2?.width??0,height:size2?.height??0,flexBasis:size2?direction2==="row"?size2.width:size2.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let offset={x:-(bounds.maxX+bounds.minX)/2,y:-(bounds.maxY+bounds.minY)/2},allCircuitJson=db.toArray();for(let child of flexBox.children){let{sourceComponent,sourceGroup}=child.metadata;if(sourceComponent){let schComponent=db.schematic_component.getWhere({source_component_id:sourceComponent.source_component_id});if(!schComponent)continue;repositionSchematicComponentTo(allCircuitJson,schComponent.schematic_component_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}if(sourceGroup){if(!db.schematic_group.getWhere({source_group_id:sourceGroup.source_group_id}))continue;repositionSchematicGroupTo(allCircuitJson,sourceGroup.source_group_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}}group.schematic_group_id&&db.schematic_group.update(group.schematic_group_id,{width:bounds.width,height:bounds.height})};function updateSchematicPrimitivesForLayoutShift({db,schematicComponentId,deltaX,deltaY}){let rects=db.schematic_rect.list({schematic_component_id:schematicComponentId});for(let rect of rects)rect.center.x+=deltaX,rect.center.y+=deltaY;let lines=db.schematic_line.list({schematic_component_id:schematicComponentId});for(let line2 of lines)line2.x1+=deltaX,line2.y1+=deltaY,line2.x2+=deltaX,line2.y2+=deltaY;let circles=db.schematic_circle.list({schematic_component_id:schematicComponentId});for(let circle2 of circles)circle2.center.x+=deltaX,circle2.center.y+=deltaY;let arcs=db.schematic_arc.list({schematic_component_id:schematicComponentId});for(let arc2 of arcs)arc2.center.x+=deltaX,arc2.center.y+=deltaY}function Group_doInitialSchematicLayoutGrid(group){let{db}=group.root,props=group._parsedProps,schematicChildren=group.children.filter(child=>{let isExplicitlyPositioned=child._parsedProps?.schX!==void 0||child._parsedProps?.schY!==void 0;return child.schematic_component_id&&!isExplicitlyPositioned});if(schematicChildren.length===0)return;let maxCellWidth=0,maxCellHeight=0;for(let child of schematicChildren){let schComp=db.schematic_component.get(child.schematic_component_id);schComp?.size&&(maxCellWidth=Math.max(maxCellWidth,schComp.size.width),maxCellHeight=Math.max(maxCellHeight,schComp.size.height))}maxCellWidth===0&&schematicChildren.length>0&&(maxCellWidth=1),maxCellHeight===0&&schematicChildren.length>0&&(maxCellHeight=1);let gridColsOption=props.gridCols,gridRowsOption,gridGapOption=props.gridGap,gridRowGapOption=props.gridRowGap,gridColumnGapOption=props.gridColumnGap;props.schLayout?.grid&&(gridColsOption=props.schLayout.grid.cols??gridColsOption,gridRowsOption=props.schLayout.grid.rows,gridGapOption=props.schLayout.gridGap??gridGapOption,gridRowGapOption=props.schLayout.gridRowGap??gridRowGapOption,gridColumnGapOption=props.schLayout.gridColumnGap??gridColumnGapOption);let numCols,numRows;gridColsOption!==void 0&&gridRowsOption!==void 0?(numCols=gridColsOption,numRows=gridRowsOption):gridColsOption!==void 0?(numCols=gridColsOption,numRows=Math.ceil(schematicChildren.length/numCols)):gridRowsOption!==void 0?(numRows=gridRowsOption,numCols=Math.ceil(schematicChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(schematicChildren.length)),numRows=Math.ceil(schematicChildren.length/numCols)),numCols===0&&schematicChildren.length>0&&(numCols=1),numRows===0&&schematicChildren.length>0&&(numRows=schematicChildren.length);let gridGapX,gridGapY,parseGap=val=>{if(val!==void 0)return typeof val=="number"?val:length.parse(val)};if(gridRowGapOption!==void 0||gridColumnGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.x:gridGapOption,fallbackY=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.y:gridGapOption;gridGapX=parseGap(gridColumnGapOption??fallbackX)??1,gridGapY=parseGap(gridRowGapOption??fallbackY)??1}else if(typeof gridGapOption=="number")gridGapX=gridGapOption,gridGapY=gridGapOption;else if(typeof gridGapOption=="string"){let parsed=length.parse(gridGapOption);gridGapX=parsed,gridGapY=parsed}else if(typeof gridGapOption=="object"&&gridGapOption!==null){let xRaw=gridGapOption.x,yRaw=gridGapOption.y;gridGapX=typeof xRaw=="number"?xRaw:length.parse(xRaw??"0mm"),gridGapY=typeof yRaw=="number"?yRaw:length.parse(yRaw??"0mm")}else gridGapX=1,gridGapY=1;let totalGridWidth=numCols*maxCellWidth+Math.max(0,numCols-1)*gridGapX,totalGridHeight=numRows*maxCellHeight+Math.max(0,numRows-1)*gridGapY,groupCenter=group._getGlobalSchematicPositionBeforeLayout(),firstCellCenterX=groupCenter.x-totalGridWidth/2+maxCellWidth/2,firstCellCenterY=groupCenter.y+totalGridHeight/2-maxCellHeight/2;for(let i2=0;i2<schematicChildren.length;i2++){let child=schematicChildren[i2];if(!child.schematic_component_id)continue;let row=Math.floor(i2/numCols),col=i2%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i2} (row ${row}, col ${col}) exceeds specified grid dimensions (${numRows}x${numCols}). Skipping placement.`);continue}let targetCellCenterX=firstCellCenterX+col*(maxCellWidth+gridGapX),targetCellCenterY=firstCellCenterY-row*(maxCellHeight+gridGapY),schComp=db.schematic_component.get(child.schematic_component_id);if(schComp){let oldChildCenter=schComp.center,newChildCenter={x:targetCellCenterX,y:targetCellCenterY};db.schematic_component.update(child.schematic_component_id,{center:newChildCenter});let deltaX=newChildCenter.x-oldChildCenter.x,deltaY=newChildCenter.y-oldChildCenter.y,schPorts=db.schematic_port.list({schematic_component_id:child.schematic_component_id});for(let port of schPorts)db.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});let schTexts=db.schematic_text.list({schematic_component_id:child.schematic_component_id});for(let text of schTexts)db.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db,schematicComponentId:child.schematic_component_id,deltaX,deltaY})}}group.schematic_group_id&&db.schematic_group.update(group.schematic_group_id,{width:totalGridWidth,height:totalGridHeight,center:groupCenter})}var debug52=(0,import_debug13.default)("Group_doInitialSchematicLayoutMatchAdapt");function Group_doInitialSchematicLayoutMatchAdapt(group){let{db}=group.root,subtreeCircuitJson=buildSubtree(db.toArray(),{source_group_id:group.source_group_id}),bpcGraphBeforeGeneratedNetLabels=convertCircuitJsonToBpc(subtreeCircuitJson);debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(bpcGraphBeforeGeneratedNetLabels,{title:`floatingBpcGraph-${group.name}`}));let floatingGraph=convertCircuitJsonToBpc(subtreeCircuitJson),floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p4=>({...p4,color:p4.color.replace("not_connected","normal")}))},{result:laidOutBpcGraph}=layoutSchematicGraphVariants([{variantName:"default",floatingGraph},{variantName:"noNotConnected",floatingGraph:floatingGraphNoNotConnected}],{singletonKeys:["vcc/2","gnd/2"],centerPinColors:["netlabel_center","component_center"],floatingBoxIdsWithMutablePinOffsets:new Set(floatingGraph.boxes.filter(box2=>floatingGraph.pins.filter(p4=>p4.boxId===box2.boxId).filter(bp2=>!bp2.color.includes("center")).length<=2).map(b3=>b3.boxId)),corpus:{}});debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(laidOutBpcGraph,{title:`laidOutBpcGraph-${group.name}`}));let groupOffset=group._getGlobalSchematicPositionBeforeLayout();for(let box2 of laidOutBpcGraph.boxes){if(!box2.center)continue;let schematic_component2=db.schematic_component.get(box2.boxId);if(schematic_component2){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db.schematic_port.list({schematic_component_id:schematic_component2.schematic_component_id}),texts=db.schematic_text.list({schematic_component_id:schematic_component2.schematic_component_id}),positionDelta={x:newCenter.x-schematic_component2.center.x,y:newCenter.y-schematic_component2.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;updateSchematicPrimitivesForLayoutShift({db,schematicComponentId:schematic_component2.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component2.center=newCenter;continue}let schematic_net_label2=db.schematic_net_label.get(box2.boxId);if(schematic_net_label2){let pin=laidOutBpcGraph.pins.find(p4=>p4.boxId===box2.boxId&&p4.color==="netlabel_center");if(!pin)throw new Error(`No pin found for net label: ${box2.boxId}`);let finalCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y};schematic_net_label2.center=finalCenter,schematic_net_label2.anchor_position={x:finalCenter.x+pin.offset.x,y:finalCenter.y+pin.offset.y};continue}console.error(`No schematic element found for box: ${box2.boxId}. This is a bug in the matchAdapt binding with @tscircuit/core`)}}var debug62=(0,import_debug14.default)("Group_doInitialSchematicLayoutMatchpack");function facingDirectionToSide(facingDirection){switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:return"y+"}}function rotateDirection2(direction2,degrees){let directions=["right","up","left","down"],currentIndex=directions.indexOf(direction2);if(currentIndex===-1)return direction2;let steps=Math.round(degrees/90),newIndex=(currentIndex+steps)%4;return directions[newIndex<0?newIndex+4:newIndex]}function isTreeChildExplicitlyPositioned(treeChild,group){if(treeChild.nodeType==="component"&&treeChild.sourceComponent){let component=group.children.find(groupChild=>groupChild.source_component_id===treeChild.sourceComponent?.source_component_id);return component?._parsedProps?.schX!==void 0||component?._parsedProps?.schY!==void 0}if(treeChild.nodeType==="group"&&treeChild.sourceGroup){let nestedGroup=group.children.find(groupChild=>groupChild.source_group_id===treeChild.sourceGroup?.source_group_id);return nestedGroup?._parsedProps?.schX!==void 0||nestedGroup?._parsedProps?.schY!==void 0}return!1}function convertTreeToInputProblem(tree,db,group){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2};debug62(`[${group.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index)=>{if(isTreeChildExplicitlyPositioned(child,group)){debug62(`[${group.name}] Skipping explicitly positioned child ${index} from matchpack`);return}if(debug62(`[${group.name}] Processing child ${index}: nodeType=${child.nodeType}`),child.nodeType==="component"?debug62(`[${group.name}] - Component: ${child.sourceComponent?.name}`):child.nodeType==="group"&&debug62(`[${group.name}] - Group: ${child.sourceGroup?.name}`),child.nodeType==="component"&&child.sourceComponent){let chipId=child.sourceComponent.name||`chip_${index}`,schematicComponent=db.schematic_component.getWhere({source_component_id:child.sourceComponent.source_component_id});if(!schematicComponent)return;let component=group.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),availableRotations=[0,90,180,270];component?._parsedProps?.schOrientation&&(availableRotations=[0]),component?._parsedProps?.schRotation!==void 0&&(availableRotations=[0]),component?._parsedProps?.facingDirection&&(availableRotations=[0]),component?._parsedProps?.schFacingDirection&&(availableRotations=[0]),component?.componentName==="Chip"&&(availableRotations=[0]);let marginLeft=component?._parsedProps?.schMarginLeft??component?._parsedProps?.schMarginX??0,marginRight=component?._parsedProps?.schMarginRight??component?._parsedProps?.schMarginX??0,marginTop=component?._parsedProps?.schMarginTop??component?._parsedProps?.schMarginY??0,marginBottom=component?._parsedProps?.schMarginBottom??component?._parsedProps?.schMarginY??0;component?.config.shouldRenderAsSchematicBox&&(marginTop+=.4,marginBottom+=.4);let marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2;problem.chipMap[chipId]={chipId,pins:[],size:{x:(schematicComponent.size?.width||1)+marginLeft+marginRight,y:(schematicComponent.size?.height||1)+marginTop+marginBottom},availableRotations};let ports=db.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let port of ports){let sourcePort=db.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${chipId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;problem.chipMap[chipId].pins.push(pinId);let side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-(schematicComponent.center.x||0)+marginXShift,y:(port.center?.y||0)-(schematicComponent.center.y||0)+marginYShift},side}}}else if(child.nodeType==="group"&&child.sourceGroup){let groupId=child.sourceGroup.name||`group_${index}`;debug62(`[${group.name}] Processing nested group: ${groupId}`);let schematicGroup=db.schematic_group?.getWhere?.({source_group_id:child.sourceGroup.source_group_id}),groupInstance=group.children.find(groupChild=>groupChild.source_group_id===child.sourceGroup?.source_group_id);if(debug62(`[${group.name}] Found schematic_group for ${groupId}:`,schematicGroup),schematicGroup){debug62(`[${group.name}] Treating group ${groupId} as composite chip`);let groupComponents=db.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`[${group.name}] Group ${groupId} has ${groupComponents.length} components:`,groupComponents.map(c3=>c3.source_component_id));let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let comp of groupComponents)if(comp.center&&comp.size){hasValidBounds=!0;let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let marginLeft=groupInstance?._parsedProps?.schMarginLeft??groupInstance?._parsedProps?.schMarginX??0,marginRight=groupInstance?._parsedProps?.schMarginRight??groupInstance?._parsedProps?.schMarginX??0,marginTop=groupInstance?._parsedProps?.schMarginTop??groupInstance?._parsedProps?.schMarginY??0,marginBottom=groupInstance?._parsedProps?.schMarginBottom??groupInstance?._parsedProps?.schMarginY??0,marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2,groupWidth=(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,groupHeight=(hasValidBounds?maxY-minY:2)+marginTop+marginBottom;debug62(`[${group.name}] Group ${groupId} computed size: ${groupWidth} x ${groupHeight}`);let groupPins=[];for(let comp of groupComponents){let ports=db.schematic_port.list({schematic_component_id:comp.schematic_component_id});for(let port of ports){let sourcePort=db.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${groupId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;groupPins.push(pinId);let groupCenter=schematicGroup.center||{x:0,y:0},side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-groupCenter.x+marginXShift,y:(port.center?.y||0)-groupCenter.y+marginYShift},side}}}debug62(`[${group.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:{x:groupWidth,y:groupHeight}},debug62(`[${group.name}] Added group ${groupId} to chipMap`)}else debug62(`[${group.name}] Warning: No schematic_group found for group ${groupId}`)}}),debug62(`[${group.name}] Creating connections using connectivity keys`);let connectivityGroups=new Map;for(let[chipId,chip]of Object.entries(problem.chipMap))for(let pinId of chip.pins){let pinNumber=pinId.split(".").pop(),treeNode=tree.childNodes.find(child=>child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name===chipId:child.nodeType==="group"&&child.sourceGroup?`group_${tree.childNodes.indexOf(child)}`===chipId:!1);if(treeNode?.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){let groupComponents=db.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});for(let comp of groupComponents){let sourcePorts=db.source_port.list({source_component_id:comp.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber))if(sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] \u2713 Pin ${pinId} has connectivity key: ${connectivityKey}`)}else debug62(`[${group.name}] Pin ${pinId} has no connectivity key`)}}}}else if(treeNode?.nodeType==="component"&&treeNode.sourceComponent){let sourcePorts=db.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber)&&sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] Pin ${pinId} has connectivity key: ${connectivityKey}`)}}}}debug62(`[${group.name}] Found ${connectivityGroups.size} connectivity groups:`,Array.from(connectivityGroups.entries()).map(([key,pins])=>({key,pins})));for(let[connectivityKey,pins]of connectivityGroups)if(pins.length>=2){let tracesWithThisKey=db.source_trace.list().filter(trace=>trace.subcircuit_connectivity_map_key===connectivityKey),hasNetConnections=tracesWithThisKey.some(trace=>trace.connected_source_net_ids&&trace.connected_source_net_ids.length>0),hasDirectConnections=tracesWithThisKey.some(trace=>trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2);if(debug62(`[${group.name}] Connectivity ${connectivityKey}: hasNetConnections=${hasNetConnections}, hasDirectConnections=${hasDirectConnections}`),hasDirectConnections){for(let trace of tracesWithThisKey)if(trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2){let directlyConnectedPins=[];for(let portId of trace.connected_source_port_ids)for(let pinId of pins){let pinNumber=pinId.split(".").pop(),sourcePort=db.source_port.get(portId);if(sourcePort&&String(sourcePort.pin_number||sourcePort.name)===String(pinNumber)){let chipId=pinId.split(".")[0],treeNode=tree.childNodes.find(child=>child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name===chipId:child.nodeType==="group"&&child.sourceGroup?`group_${tree.childNodes.indexOf(child)}`===chipId:!1);treeNode?.nodeType==="component"&&treeNode.sourceComponent&&db.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p4=>p4.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i2=0;i2<directlyConnectedPins.length;i2++)for(let j4=i2+1;j4<directlyConnectedPins.length;j4++){let pin1=directlyConnectedPins[i2],pin2=directlyConnectedPins[j4];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net2=db.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey}),isGround=source_net2?.is_ground??!1,isPositiveVoltageSource=source_net2?.is_power??!1;problem.netMap[connectivityKey]={netId:connectivityKey,isGround,isPositiveVoltageSource};for(let pinId of pins)problem.netConnMap[`${pinId}-${connectivityKey}`]=!0;debug62(`[${group.name}] Created net ${connectivityKey} with ${pins.length} pins:`,pins)}}return problem}function Group_doInitialSchematicLayoutMatchPack(group){let{db}=group.root,tree=getCircuitJsonTree(db.toArray(),{source_group_id:group.source_group_id});if(debug62(`[${group.name}] Starting matchpack layout with ${tree.childNodes.length} children`),debug62(`[${group.name}] Tree structure:`,JSON.stringify(tree,null,2)),tree.childNodes.length<=1){debug62(`[${group.name}] Only ${tree.childNodes.length} children, skipping layout`);return}debug62("Converting circuit tree to InputProblem...");let inputProblem=convertTreeToInputProblem(tree,db,group);debug62.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${group.name}`,content:JSON.stringify(inputProblem,null,2)});let solver=new LayoutPipelineSolver(inputProblem);if(debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group.name}`})}if(solver.solve(),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed)throw debug62(`Solver failed with error: ${solver.error}`),new Error(`Matchpack layout solver failed: ${solver.error}`);let outputLayout=solver.getOutputLayout();if(debug62("OutputLayout:",JSON.stringify(outputLayout,null,2)),debug62("Solver completed successfully:",!solver.failed),debug62.enabled&&global?.debugGraphics){let finalViz=solver.visualize();global.debugGraphics.push({...finalViz,title:`matchpack-final-${group.name}`})}let overlaps=solver.checkForOverlaps(outputLayout);if(overlaps.length>0){debug62(`Warning: Found ${overlaps.length} overlapping components:`);for(let overlap of overlaps)debug62(` ${overlap.chip1} overlaps ${overlap.chip2} (area: ${overlap.overlapArea})`)}let groupOffset=group._getGlobalSchematicPositionBeforeLayout();debug62(`Group offset: x=${groupOffset.x}, y=${groupOffset.y}`),debug62(`Applying layout results for ${Object.keys(outputLayout.chipPlacements).length} chip placements`);for(let[chipId,placement]of Object.entries(outputLayout.chipPlacements)){debug62(`Processing placement for chip: ${chipId} at (${placement.x}, ${placement.y})`);let treeNode=tree.childNodes.find(child=>{if(child.nodeType==="component"&&child.sourceComponent){let matches=child.sourceComponent.name===chipId;return debug62(` Checking component ${child.sourceComponent.name}: matches=${matches}`),matches}if(child.nodeType==="group"&&child.sourceGroup){let groupName=child.sourceGroup.name,expectedChipId=`group_${tree.childNodes.indexOf(child)}`,matches=expectedChipId===chipId;return debug62(` Checking group ${groupName} (expected chipId: ${expectedChipId}): matches=${matches}`),matches}return!1});if(!treeNode){debug62(`Warning: No tree node found for chip: ${chipId}`),debug62("Available tree nodes:",tree.childNodes.map((child,idx)=>({type:child.nodeType,name:child.nodeType==="component"?child.sourceComponent?.name:child.sourceGroup?.name,expectedChipId:child.nodeType==="group"?`group_${idx}`:child.sourceComponent?.name})));continue}let newCenter={x:placement.x+groupOffset.x,y:placement.y+groupOffset.y};if(treeNode.nodeType==="component"&&treeNode.sourceComponent){let schematicComponent=db.schematic_component.getWhere({source_component_id:treeNode.sourceComponent.source_component_id});if(schematicComponent){debug62(`Moving component ${chipId} to (${newCenter.x}, ${newCenter.y})`);let ports=db.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),texts=db.schematic_text.list({schematic_component_id:schematicComponent.schematic_component_id}),positionDelta={x:newCenter.x-schematicComponent.center.x,y:newCenter.y-schematicComponent.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;if(updateSchematicPrimitivesForLayoutShift({db,schematicComponentId:schematicComponent.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematicComponent.center=newCenter,placement.ccwRotationDegrees!==0){debug62(`Component ${chipId} has rotation: ${placement.ccwRotationDegrees}\xB0`);let normalizedRotation=(Math.round(placement.ccwRotationDegrees)%360+360)%360;if((normalizedRotation===90||normalizedRotation===270)&&schematicComponent.size){let prevWidth=schematicComponent.size.width;schematicComponent.size.width=schematicComponent.size.height,schematicComponent.size.height=prevWidth}let angleRad=placement.ccwRotationDegrees*Math.PI/180,cos5=Math.cos(angleRad),sin5=Math.sin(angleRad);for(let port of ports){let dx2=port.center.x-newCenter.x,dy2=port.center.y-newCenter.y,rotatedDx=dx2*cos5-dy2*sin5,rotatedDy=dx2*sin5+dy2*cos5;port.center.x=newCenter.x+rotatedDx,port.center.y=newCenter.y+rotatedDy;let originalDirection=port.facing_direction||"right";port.facing_direction=rotateDirection2(originalDirection,placement.ccwRotationDegrees),port.side_of_component=(port.facing_direction==="up"?"top":port.facing_direction==="down"?"bottom":port.facing_direction)||port.side_of_component}for(let text of texts){let dx2=text.position.x-newCenter.x,dy2=text.position.y-newCenter.y,rotatedDx=dx2*cos5-dy2*sin5,rotatedDy=dx2*sin5+dy2*cos5;text.position.x=newCenter.x+rotatedDx,text.position.y=newCenter.y+rotatedDy}if(schematicComponent.symbol_name){let schematicSymbolDirection=schematicComponent.symbol_name.match(/_(right|left|up|down)$/);schematicSymbolDirection&&(schematicComponent.symbol_name=schematicComponent.symbol_name.replace(schematicSymbolDirection[0],`_${rotateDirection2(schematicSymbolDirection[1],placement.ccwRotationDegrees)}`))}}}}else if(treeNode.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){debug62(`Moving group ${chipId} to (${newCenter.x}, ${newCenter.y}) from (${schematicGroup.center?.x}, ${schematicGroup.center?.y})`);let groupComponents=db.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`Group ${chipId} has ${groupComponents.length} components to move`);let oldCenter=schematicGroup.center||{x:0,y:0},positionDelta={x:newCenter.x-oldCenter.x,y:newCenter.y-oldCenter.y};debug62(`Position delta for group ${chipId}: (${positionDelta.x}, ${positionDelta.y})`);for(let component of groupComponents)if(component.center){let oldComponentCenter={...component.center};component.center.x+=positionDelta.x,component.center.y+=positionDelta.y,debug62(`Moved component ${component.source_component_id} from (${oldComponentCenter.x}, ${oldComponentCenter.y}) to (${component.center.x}, ${component.center.y})`);let ports=db.schematic_port.list({schematic_component_id:component.schematic_component_id}),texts=db.schematic_text.list({schematic_component_id:component.schematic_component_id});for(let port of ports)port.center&&(port.center.x+=positionDelta.x,port.center.y+=positionDelta.y);for(let text of texts)text.position&&(text.position.x+=positionDelta.x,text.position.y+=positionDelta.y)}schematicGroup.center=newCenter,debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}function createSchematicTraceSolverInputProblem(group){let{db}=group.root,sckToSourceNet=new Map,sckToUserNetId=new Map,allScks=new Set,displayLabelTraces=group.selectAll("trace").filter(t21=>t21._parsedProps?.schDisplayLabel),childGroups=group.selectAll("group"),allSchematicGroupIds=[group.schematic_group_id,...childGroups.map(a2=>a2.schematic_group_id)],schematicComponents=db.schematic_component.list().filter(a2=>allSchematicGroupIds.includes(a2.schematic_group_id)),chips=[],pinIdToSchematicPortId=new Map,schematicPortIdToPinId=new Map;for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,pins=[],sourceComponent=db.source_component.getWhere({source_component_id:schematicComponent.source_component_id}),schematicPorts=db.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let schematicPort of schematicPorts){let pinId=`${sourceComponent?.name??schematicComponent.schematic_component_id}.${schematicPort.pin_number}`;pinIdToSchematicPortId.set(pinId,schematicPort.schematic_port_id),schematicPortIdToPinId.set(schematicPort.schematic_port_id,pinId)}for(let schematicPort of schematicPorts){let pinId=schematicPortIdToPinId.get(schematicPort.schematic_port_id);pins.push({pinId,x:schematicPort.center.x,y:schematicPort.center.y})}chips.push({chipId,center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height,pins})}let allSourceAndSchematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToSck=new Map;for(let sc2 of schematicComponents){let ports=db.schematic_port.list({schematic_component_id:sc2.schematic_component_id});for(let sp2 of ports)allSourceAndSchematicPortIdsInScope.add(sp2.schematic_port_id),sp2.source_port_id&&(schPortIdToSourcePortId.set(sp2.schematic_port_id,sp2.source_port_id),sourcePortIdToSchPortId.set(sp2.source_port_id,sp2.schematic_port_id))}let allowedSubcircuitIds=new Set;group.subcircuit_id&&allowedSubcircuitIds.add(group.subcircuit_id);for(let cg2 of childGroups)cg2.subcircuit_id&&allowedSubcircuitIds.add(cg2.subcircuit_id);let externalNetIds=db.source_trace.list().filter(st4=>{if(st4.subcircuit_id===group.subcircuit_id)return!0;for(let source_port_id of st4.connected_source_port_ids)if(sourcePortIdToSchPortId.has(source_port_id))return!0;return!1}).flatMap(st4=>st4.connected_source_net_ids);for(let netId of externalNetIds){let net=db.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}let directConnections=[],pairKeyToSourceTraceId=new Map;for(let st4 of db.source_trace.list()){if(st4.subcircuit_id&&!allowedSubcircuitIds.has(st4.subcircuit_id))continue;let connected=(st4.connected_source_port_ids??[]).map(srcId=>sourcePortIdToSchPortId.get(srcId)).filter(sourcePortId=>!!sourcePortId&&allSourceAndSchematicPortIdsInScope.has(sourcePortId));if(connected.length>=2){let[a2,b3]=connected.slice(0,2),pairKey=[a2,b3].sort().join("::");if(!pairKeyToSourceTraceId.has(pairKey)){pairKeyToSourceTraceId.set(pairKey,st4.source_trace_id);let userNetId=st4.display_name??st4.source_trace_id;st4.subcircuit_connectivity_map_key&&(allScks.add(st4.subcircuit_connectivity_map_key),userNetIdToSck.set(userNetId,st4.subcircuit_connectivity_map_key),sckToUserNetId.set(st4.subcircuit_connectivity_map_key,userNetId)),directConnections.push({pinIds:[a2,b3].map(id2=>schematicPortIdToPinId.get(id2)),netId:userNetId})}}}let netConnections=[];for(let net of db.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.subcircuit_connectivity_map_key&&(allScks.add(net.subcircuit_connectivity_map_key),sckToSourceNet.set(net.subcircuit_connectivity_map_key,net));let sckToPinIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){let sp2=db.source_port.get(srcPortId);if(!sp2?.subcircuit_connectivity_map_key)continue;let sck=sp2.subcircuit_connectivity_map_key;allScks.add(sck),sckToPinIds.has(sck)||sckToPinIds.set(sck,[]),sckToPinIds.get(sck).push(schId)}for(let[subcircuitConnectivityKey,schematicPortIds]of sckToPinIds){let sourceNet=sckToSourceNet.get(subcircuitConnectivityKey);if(sourceNet&&schematicPortIds.length>=2){let userNetId=String(sourceNet.name||sourceNet.source_net_id||subcircuitConnectivityKey);userNetIdToSck.set(userNetId,subcircuitConnectivityKey),sckToUserNetId.set(subcircuitConnectivityKey,userNetId);let charWidth=.1*(.18/.18),netLabelWidth=Number((String(userNetId).length*charWidth).toFixed(2));netConnections.push({netId:userNetId,pinIds:schematicPortIds.map(portId=>schematicPortIdToPinId.get(portId)),netLabelWidth})}}let availableNetLabelOrientations=(()=>{let netToAllowedOrientations={},presentNetIds=new Set(netConnections.map(nc3=>nc3.netId));for(let net of db.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.name&&presentNetIds.has(net.name)&&(net.is_ground||net.name.toLowerCase().startsWith("gnd")?netToAllowedOrientations[net.name]=["y-"]:net.is_power||net.name.toLowerCase().startsWith("v")?netToAllowedOrientations[net.name]=["y+"]:netToAllowedOrientations[net.name]=["x-","x+"]);return netToAllowedOrientations})();return{inputProblem:{chips,directConnections,netConnections,availableNetLabelOrientations,maxMspPairDistance:group._parsedProps.schMaxTraceDistance??2.4},pinIdToSchematicPortId,pairKeyToSourceTraceId,sckToSourceNet,sckToUserNetId,userNetIdToSck,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,displayLabelTraces,allScks}}var TOL=1e-6;function isHorizontalEdge(edge){let dx2=Math.abs(edge.to.x-edge.from.x),dy2=Math.abs(edge.to.y-edge.from.y);return dx2>=dy2}function length6(a2,b3){return Math.hypot(b3.x-a2.x,b3.y-a2.y)}function pointAt(a2,b3,t21){return{x:a2.x+(b3.x-a2.x)*t21,y:a2.y+(b3.y-a2.y)*t21}}function paramAlong(a2,b3,p4){let L4=length6(a2,b3);if(L4<TOL)return 0;let t21=((p4.x-a2.x)*(b3.x-a2.x)+(p4.y-a2.y)*(b3.y-a2.y))/((b3.x-a2.x)*(b3.x-a2.x)+(b3.y-a2.y)*(b3.y-a2.y));return Math.max(0,Math.min(1,t21))*L4}function cross2(ax2,ay2,bx2,by2){return ax2*by2-ay2*bx2}function segmentIntersection(p12,p22,q12,q22){let r4={x:p22.x-p12.x,y:p22.y-p12.y},s2={x:q22.x-q12.x,y:q22.y-q12.y},rxs=cross2(r4.x,r4.y,s2.x,s2.y),q_p={x:q12.x-p12.x,y:q12.y-p12.y},q_pxr=cross2(q_p.x,q_p.y,r4.x,r4.y);if(Math.abs(rxs)<TOL&&Math.abs(q_pxr)<TOL||Math.abs(rxs)<TOL&&Math.abs(q_pxr)>=TOL)return null;let t21=cross2(q_p.x,q_p.y,s2.x,s2.y)/rxs,u4=cross2(q_p.x,q_p.y,r4.x,r4.y)/rxs;return t21<-TOL||t21>1+TOL||u4<-TOL||u4>1+TOL?null:{x:p12.x+t21*r4.x,y:p12.y+t21*r4.y}}function mergeIntervals(intervals,tol=TOL){if(intervals.length===0)return intervals;intervals.sort((a2,b3)=>a2.start-b3.start);let merged=[],cur={...intervals[0]};for(let i2=1;i2<intervals.length;i2++){let nxt=intervals[i2];nxt.start<=cur.end+tol?cur.end=Math.max(cur.end,nxt.end):(merged.push(cur),cur={...nxt})}return merged.push(cur),merged}function splitEdgeByCrossings(edge,crossingDistances,crossLen){let L4=length6(edge.from,edge.to);if(L4<TOL||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d3=>({start:Math.max(0,d3-half),end:Math.min(L4,d3+half)})).filter(iv=>iv.end-iv.start>TOL),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d02,d12,isCrossing)=>{if(d12-d02<=TOL)return;let t02=d02/L4,t110=d12/L4;result.push({from:pointAt(edge.from,edge.to,t02),to:pointAt(edge.from,edge.to,t110),...isCrossing?{is_crossing:!0}:{}})};for(let iv of intervals)iv.start-cursor>TOL&&addSeg(cursor,iv.start,!1),addSeg(iv.start,iv.end,!0),cursor=iv.end;return L4-cursor>TOL&&addSeg(cursor,L4,!1),result.length>0?result:[edge]}function computeCrossings(traces,opts={}){let crossLen=opts.crossSegmentLength??.075,tol=opts.tolerance??TOL,crossingsByEdge=new Map,keyOf=ref=>`${ref.traceIdx}:${ref.edgeIdx}`,getEdge=ref=>traces[ref.traceIdx].edges[ref.edgeIdx];for(let ti3=0;ti3<traces.length;ti3++){let A4=traces[ti3];for(let ei3=0;ei3<A4.edges.length;ei3++){let eA=A4.edges[ei3];for(let tj=ti3;tj<traces.length;tj++){let B5=traces[tj];for(let ej=tj===ti3?ei3+1:0;ej<B5.edges.length;ej++){let eB=B5.edges[ej],P5=segmentIntersection(eA.from,eA.to,eB.from,eB.to);if(!P5)continue;let LA=length6(eA.from,eA.to),LB=length6(eB.from,eB.to);if(LA<tol||LB<tol)continue;let dA=paramAlong(eA.from,eA.to,P5),dB=paramAlong(eB.from,eB.to,P5),nearEndpointA=dA<=tol||Math.abs(LA-dA)<=tol||Number.isNaN(dA),nearEndpointB=dB<=tol||Math.abs(LB-dB)<=tol||Number.isNaN(dB);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA),bIsHorizontal=isHorizontalEdge(eB),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax2=Math.abs(eA.to.x-eA.from.x),ay2=Math.abs(eA.to.y-eA.from.y),bx2=Math.abs(eB.to.x-eB.from.x),by2=Math.abs(eB.to.y-eB.from.y),aScore=ax2-ay2,bScore=bx2-by2;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj,edgeIdx:assignToA?ei3:ej}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA:dB),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t21=>({source_trace_id:t21.source_trace_id,edges:[]}));for(let ti3=0;ti3<traces.length;ti3++){let trace=traces[ti3];for(let ei3=0;ei3<trace.edges.length;ei3++){let eRefKey=keyOf({traceIdx:ti3,edgeIdx:ei3}),splittingDistances=crossingsByEdge.get(eRefKey)??[];if(splittingDistances.length===0){out[ti3].edges.push(trace.edges[ei3]);continue}let uniqueSorted=Array.from(new Set(splittingDistances.map(d3=>Number(d3.toFixed(6))))).sort((a2,b3)=>a2-b3),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted,crossLen);out[ti3].edges.push(...split)}}return out}var TOL2=1e-6;function nearlyEqual(a2,b3,tol=TOL2){return Math.abs(a2-b3)<=tol}function pointEq(a2,b3,tol=TOL2){return nearlyEqual(a2.x,b3.x,tol)&&nearlyEqual(a2.y,b3.y,tol)}function onSegment4(p4,a2,b3,tol=TOL2){let minX=Math.min(a2.x,b3.x)-tol,maxX=Math.max(a2.x,b3.x)+tol,minY=Math.min(a2.y,b3.y)-tol,maxY=Math.max(a2.y,b3.y)+tol;return p4.x<minX||p4.x>maxX||p4.y<minY||p4.y>maxY?!1:Math.abs((b3.x-a2.x)*(p4.y-a2.y)-(b3.y-a2.y)*(p4.x-a2.x))<=tol}function dedupePoints(points,tol=TOL2){let map=new Map;for(let p4 of points){let key=`${p4.x.toFixed(6)},${p4.y.toFixed(6)}`;map.has(key)||map.set(key,p4)}return Array.from(map.values())}function edgeVec(e4){return{x:e4.to.x-e4.from.x,y:e4.to.y-e4.from.y}}function isParallel(e12,e22,tol=TOL2){let v12=edgeVec(e12),v22=edgeVec(e22),L12=Math.hypot(v12.x,v12.y),L22=Math.hypot(v22.x,v22.y);if(L12<tol||L22<tol)return!0;let cross22=v12.x*v22.y-v12.y*v22.x;return Math.abs(cross22)<=tol*L12*L22}function incidentEdgesAtPoint(trace,p4,tol=TOL2){return trace.edges.filter(e4=>pointEq(e4.from,p4,tol)||pointEq(e4.to,p4,tol))}function nearestEndpointOnTrace(trace,p4,tol=TOL2){for(let e4 of trace.edges){if(pointEq(e4.from,p4,tol))return e4.from;if(pointEq(e4.to,p4,tol))return e4.to}return null}function edgeDirectionFromPoint(e4,p4,tol=TOL2){let other=pointEq(e4.from,p4,tol)||nearlyEqual(e4.from.x,p4.x,tol)&&nearlyEqual(e4.from.y,p4.y,tol)?e4.to:e4.from,dx2=other.x-p4.x,dy2=other.y-p4.y;return Math.abs(dx2)<tol&&Math.abs(dy2)<tol?null:Math.abs(dx2)>=Math.abs(dy2)?dx2>=0?"right":"left":dy2>=0?"up":"down"}function getCornerOrientationAtPoint(trace,p4,tol=TOL2){let incident=incidentEdgesAtPoint(trace,p4,tol);if(incident.length<2)return null;let dirs=incident.map(e4=>edgeDirectionFromPoint(e4,p4,tol)),hasUp=dirs.includes("up"),hasDown=dirs.includes("down"),hasLeft=dirs.includes("left"),hasRight=dirs.includes("right"),vertical=hasUp?"up":hasDown?"down":null,horizontal=hasRight?"right":hasLeft?"left":null;return vertical&&horizontal?`${vertical}-${horizontal}`:null}function computeJunctions(traces,opts={}){let tol=opts.tolerance??TOL2,result={};for(let t21 of traces)result[t21.source_trace_id]=[];let endpointsByTrace=traces.map(t21=>{let pts=[];for(let e4 of t21.edges)pts.push(e4.from,e4.to);return dedupePoints(pts,tol)});for(let i2=0;i2<traces.length;i2++){let A4=traces[i2],AEnds=endpointsByTrace[i2];for(let j4=i2+1;j4<traces.length;j4++){let B5=traces[j4],BEnds=endpointsByTrace[j4];for(let pa3 of AEnds)for(let pb of BEnds)if(pointEq(pa3,pb,tol)){let aEdgesAtP=incidentEdgesAtPoint(A4,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B5,pb,tol),hasCorner=aEdgesAtP.some(eA=>bEdgesAtP.some(eB=>!isParallel(eA,eB,tol))),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bCorner=getCornerOrientationAtPoint(B5,pb,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pb))}for(let pa3 of AEnds)for(let eB of B5.edges)if(onSegment4(pa3,eB.from,eB.to,tol)){let hasCorner=incidentEdgesAtPoint(A4,pa3,tol).some(eA=>!isParallel(eA,eB,tol)),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B5,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B5,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pa3))}for(let pb of BEnds)for(let eA of A4.edges)if(onSegment4(pb,eA.from,eA.to,tol)){let hasCorner=incidentEdgesAtPoint(B5,pb,tol).some(eB=>!isParallel(eA,eB,tol)),bCorner=getCornerOrientationAtPoint(B5,pb,tol),aEndpointNearPb=nearestEndpointOnTrace(A4,pb,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A4,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B5.source_trace_id].push(pb),A4.source_trace_id!==B5.source_trace_id&&result[A4.source_trace_id].push(pb))}}}for(let id2 of Object.keys(result))result[id2]=dedupePoints(result[id2],tol);return result}var debug7=(0,import_debug16.default)("Group_doInitialSchematicTraceRender");function applyTracesFromSolverOutput(args){let{group,solver,pinIdToSchematicPortId,userNetIdToSck}=args,{db}=group.root,traces=solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug7(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug7(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let edges=[];for(let i2=0;i2<points.length-1;i2++)edges.push({from:{x:points[i2].x,y:points[i2].y},to:{x:points[i2+1].x,y:points[i2+1].y}});let source_trace_id=null,subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let pA=pinIdToSchematicPortId.get(solvedTracePath.pins[0]?.pinId),pB=pinIdToSchematicPortId.get(solvedTracePath.pins[1]?.pinId);if(pA&&pB){for(let schPid of[pA,pB])db.schematic_port.get(schPid)&&db.schematic_port.update(schPid,{is_connected:!0});subcircuit_connectivity_map_key=userNetIdToSck.get(String(solvedTracePath.userNetId))}}source_trace_id||(source_trace_id=`solver_${solvedTracePath?.mspPairId}`,subcircuit_connectivity_map_key=userNetIdToSck.get(String(solvedTracePath.userNetId))),pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key})}debug7(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t21=>({source_trace_id:t21.source_trace_id,edges:t21.edges}))),junctionsById=computeJunctions(withCrossings);for(let t21 of withCrossings)db.schematic_trace.insert({source_trace_id:t21.source_trace_id,edges:t21.edges,junctions:junctionsById[t21.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTraces.find(p4=>p4.source_trace_id===t21.source_trace_id)?.subcircuit_connectivity_map_key})}var oppositeSide2=input2=>{switch(input2){case"x+":return"left";case"x-":return"right";case"y+":return"bottom";case"y-":return"top";case"left":return"right";case"top":return"bottom";case"right":return"left";case"bottom":return"top"}},getNetNameFromPorts=ports=>{for(let port of ports){let traces=port._getDirectlyConnectedTraces();for(let trace of traces){let displayLabel=trace._parsedProps.schDisplayLabel;if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0}}}return{name:ports.map(p4=>p4._getNetLabelText()).join("/"),wasAssignedDisplayLabel:!1}},debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender");function applyNetLabelPlacements(args){let{group,solver,sckToSourceNet,allScks,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,userNetIdToSck,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}=args,{db}=group.root,netLabelPlacements=solver.netLabelPlacementSolver?.netLabelPlacements??solver.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],globalConnMap=solver.mspConnectionPairSolver.globalConnMap;for(let placement of netLabelPlacements){debug8(`processing placement: ${placement.netId}`);let placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id2=>userNetIdToSck.get(id2)),placementSck=userNetIdToSck.get(placementUserNetId),anchor_position=placement.anchorPoint,orientation4=placement.orientation,anchor_side=oppositeSide2(orientation4),sourceNet=placementSck?sckToSourceNet.get(placementSck):void 0,schPortIds=placement.pinIds.map(pinId=>pinIdToSchematicPortId.get(pinId));if(schPortIds.some(schPortId=>schematicPortIdsWithPreExistingNetLabels.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has pre-existing net label`);continue}if(sourceNet){let text2=sourceNet.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text2});db.schematic_net_label.insert({text:text2,anchor_position,center:center22,anchor_side,...sourceNet?.source_net_id?{source_net_id:sourceNet.source_net_id}:{}});continue}let ports=group.selectAll("port").filter(p4=>p4._getSubcircuitConnectivityKey()===placementSck),{name:text,wasAssignedDisplayLabel}=getNetNameFromPorts(ports);if(!wasAssignedDisplayLabel&&schPortIds.some(schPortId=>schematicPortIdsWithRoutedTraces.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed traces and no display label`);continue}let center2=computeSchematicNetLabelCenter({anchor_position,anchor_side,text});db.schematic_net_label.insert({text,anchor_position,center:center2,anchor_side})}}var insertNetLabelsForPortsMissingTrace=({allSourceAndSchematicPortIdsInScope,group,schPortIdToSourcePortId,sckToSourceNet:connKeyToNet,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels})=>{let{db}=group.root;for(let schOrSrcPortId of Array.from(allSourceAndSchematicPortIdsInScope)){let schPort=db.schematic_port.get(schOrSrcPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schOrSrcPortId);if(!srcPortId)continue;let key=db.source_port.get(srcPortId)?.subcircuit_connectivity_map_key;if(!key)continue;let sourceNet=connKeyToNet.get(key);if(!sourceNet||db.schematic_net_label.list().some(nl3=>Math.abs(nl3.anchor_position.x-schPort.center.x)<.1&&Math.abs(nl3.anchor_position.y-schPort.center.y)<.1?sourceNet.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.text===(sourceNet.name||key):!1))continue;let text=sourceNet.name||sourceNet.source_net_id||key,side=getEnteringEdgeFromDirection(schPort.facing_direction||"right")||"right",center2=computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side:side,text});db.schematic_net_label.insert({text,anchor_position:schPort.center,center:center2,anchor_side:side,...sourceNet.source_net_id?{source_net_id:sourceNet.source_net_id}:{}})}},getSchematicPortIdsWithAssignedNetLabels=group=>{let schematicPortIdsWithNetLabels=new Set,netLabels=group.selectAll("netlabel");for(let netLabel of netLabels){let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(port.schematic_port_id)}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver,pinIdToSchematicPortId})=>{let solvedTraces=solver.schematicTraceLinesSolver.solvedTracePaths,schematicPortIdsWithRoutedTraces=new Set;for(let solvedTrace of solvedTraces)for(let pinId of solvedTrace.pinIds){let schPortId=pinIdToSchematicPortId.get(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}return schematicPortIdsWithRoutedTraces},debug9=(0,import_debug15.default)("Group_doInitialSchematicTraceRender"),Group_doInitialSchematicTraceRender=group=>{if(!group.root?._featureMspSchematicTraceRouting||!group.isSubcircuit||group.root?.schematicDisabled)return;let{inputProblem,pinIdToSchematicPortId,pairKeyToSourceTraceId,sckToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,displayLabelTraces,allScks,userNetIdToSck}=createSchematicTraceSolverInputProblem(group),schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(group);debug9.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(inputProblem,null,2)});let solver=new SchematicTracePipelineSolver(inputProblem);solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver,pinIdToSchematicPortId});applyTracesFromSolverOutput({group,solver,pinIdToSchematicPortId,userNetIdToSck}),applyNetLabelPlacements({group,solver,sckToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,pinIdToSchematicPortId,allScks,userNetIdToSck,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}),insertNetLabelsForPortsMissingTrace({group,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,sckToSourceNet,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels})},getSpiceyEngine=()=>({async simulate(spiceString){let simulation_experiment_id="spice-experiment-1",{circuit:parsedCircuit,tran}=simulate(spiceString);return{simulationResultCircuitJson:spiceyTranToVGraphs(tran,parsedCircuit,simulation_experiment_id)}}}),SIMULATION_COLOR_PALETTE=["rgb(132, 0, 0)","rgb(194, 194, 0)","rgb(194, 0, 194)","rgb(194, 0, 0)","rgb(0, 132, 132)","rgb(0, 132, 0)","rgb(0, 0, 132)","rgb(132, 132, 132)","rgb(132, 0, 132)","rgb(194, 194, 194)","rgb(132, 0, 132)","rgb(132, 0, 0)","rgb(132, 132, 0)","rgb(194, 194, 194)","rgb(0, 0, 132)","rgb(0, 132, 0)"],idToColorMap=new Map,colorIndex=0;function getSimulationColorForId(id2){if(idToColorMap.has(id2))return idToColorMap.get(id2);let color=SIMULATION_COLOR_PALETTE[colorIndex];return colorIndex=(colorIndex+1)%SIMULATION_COLOR_PALETTE.length,idToColorMap.set(id2,color),color}function resetSimulationColorState(){idToColorMap.clear(),colorIndex=0}var debug10=(0,import_debug18.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender");function Group_doInitialSimulationSpiceEngineRender(group){if(!group.isSubcircuit)return;let{root}=group;if(!root)return;let analogSims=group.selectAll("analogsimulation");if(analogSims.length===0)return;let voltageProbes=group.selectAll("voltageprobe");resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());let circuitJson=root.db.toArray(),spiceString,spiceNetlist;try{spiceNetlist=circuitJsonToSpice(circuitJson),spiceString=spiceNetlist.toSpiceString(),debug10(`Generated SPICE string:
|
|
653
|
-
${spiceString}`)}catch(error){debug10(`Failed to convert circuit JSON to SPICE: ${error}`);return}for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k4=>k4!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug10(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug10(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug10(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug10("No simulation experiment found, skipping result insertion");return}for(let element of result.simulationResultCircuitJson){if(element.type==="simulation_transient_voltage_graph"){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbes.find(p4=>p4.finalProbeName===element.name);probeMatch&&(element.color=probeMatch.color)}let elementType=element.type;elementType&&root.db[elementType]?(root.db[elementType].insert(element),debug10(`Inserted ${elementType} into database`)):(debug10(`Warning: Unknown element type ${elementType}, adding to raw db`),root.db._addElement(element))}group._markDirty("SimulationSpiceEngineRender")}catch(error){debug10(`Simulation failed for engine ${engineName}: ${error}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error instanceof Error?error.message:String(error)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t21=>{let source_trace2=db.source_trace.get(t21.source_trace_id);return source_trace2?[source_trace2.source_trace_id,...source_trace2.connected_source_port_ids,...source_trace2.connected_source_net_ids]:null}).filter(c3=>c3!==null));let sourceNets=db.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`,db.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db.source_trace.get(trace.source_trace_id);if(source_trace2)for(let id2 of source_trace2.connected_source_port_ids)allSourcePortIds.add(id2)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db.source_trace.get(trace.source_trace_id);if(source_trace2)for(let source_net_id of source_trace2.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n3=>n3.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getJumperPadInfos(db){let padInfos=[],jumperSmtpads=db.pcb_smtpad.list().filter(pad2=>{let component=db.pcb_component.get(pad2.pcb_component_id);return component?db.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x5,y5,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x5)<tolerance&&Math.abs(pad2.y-y5)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x5,y5){for(let pad2 of padInfos)if(x5>=pad2.minX&&x5<=pad2.maxX&&y5>=pad2.minY&&y5<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i2=0;i2<route.length;i2++){let point6=route[i2];if(currentSegment.push(point6),point6.route_type==="wire"&&i2>0&&i2<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point6.x,point6.y);if(padInfo){point6.end_pcb_port_id||(point6.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point6};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db){let padInfos=getJumperPadInfos(db);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g7=>g7.length>=2)}function insertAutoplacedJumpers(params){let{db,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation4=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation4,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p4=>Math.abs(p4.pad.center.x-groupPad.center.x)<.01&&Math.abs(p4.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p4=>p4.route_type==="jumper"),wireAndViaRoutes=route.filter(p4=>p4.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i2=0;i2<wireAndViaRoutes.length;i2++){let p4=wireAndViaRoutes[i2];if(p4.route_type!=="wire")continue;let distToStart=Math.hypot(p4.x-jumperStart.x,p4.y-jumperStart.y),distToEnd=Math.hypot(p4.x-jumperEnd.x,p4.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i2),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i2)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a2,b3)=>a2.startIdx-b3.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return console.log("width or height is not a number"),anchorPosition;let ax2=anchorPosition.x,ay2=anchorPosition.y;switch(alignment){case"top_left":return{x:ax2+width/2,y:ay2-height/2};case"top_center":return{x:ax2,y:ay2-height/2};case"top_right":return{x:ax2-width/2,y:ay2-height/2};case"center_left":return{x:ax2+width/2,y:ay2};case"center_right":return{x:ax2-width/2,y:ay2};case"bottom_left":return{x:ax2+width/2,y:ay2+height/2};case"bottom_center":return{x:ax2,y:ay2+height/2};case"bottom_right":return{x:ax2-width/2,y:ay2+height/2};default:return anchorPosition}}var Group6=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}doInitialSourceGroupRender(){let{db}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group2=db.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group2.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group2.source_group_id}`,db.source_group.update(source_group2.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db}=this.root;for(let child of this.children)db.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group2=db.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group2.pcb_group_id;for(let child of this.children)db.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group2.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let center2=hasExplicitPositioning?db.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};db.pcb_group.update(this.pcb_group_id,{width:Number(props.width??width),height:Number(props.height??height),center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a360,_b2;return(_a360=this.unnamedElementCounter)[_b2=elm.lowercaseComponentName]??(_a360[_b2]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this.selectAll("group").filter(g7=>g7.isSubcircuit);for(let subcircuitChild of subcircuitChildren)if(subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_hasTracesToRoute(){let debug112=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),traces=this.selectAll("trace");return debug112(`[${this.getString()}] has ${traces.length} traces to route`),traces.length>0}async _runEffectMakeHttpAutoroutingRequest(){let{db}=this.root,debug112=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug112("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err.message}),err}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db}=this.root,props=this._parsedProps,debug112=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug112(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id});if(isAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,autorouterConfig2.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=autorouterConfig2.availableJumperTypes)),debug112.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug112.enabled){let graphicsObject=Rn2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(autorouterConfig2.algorithmFn)autorouter=await autorouterConfig2.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:this.props.autorouter?.capacityDepth,targetMinCapacity:this.props.autorouter?.targetMinCapacity,useAssignableSolver:isLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:isAutoJumperPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug112(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug112(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise;if(autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let outputJumpers=[],solver=autorouter.solver;solver?.getOutputJumpers&&(outputJumpers=solver.getOutputJumpers()||[]),this._asyncAutoroutingResult={output_pcb_traces:traces,output_jumpers:outputJumpers},this._markDirty("PcbTraceRender")}catch(error){let{db:db2}=this.root;throw db2.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error instanceof Error?error.message:String(error)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error instanceof Error?error.message:String(error)},simpleRouteJson}),error}finally{autorouter.stop()}}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!this.getInheritedProperty("routingDisabled")&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug112(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug112(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug112(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug112(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug112(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug112(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let pcb_trace2=db.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:routedTrace.route})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db,output_jumpers,subcircuit_id:this.subcircuit_id});for(let pcb_trace2 of output_pcb_traces){if(pcb_trace2.type!=="pcb_trace")continue;if(pcb_trace2.subcircuit_id=this.subcircuit_id,pcb_trace2.connection_name){let sourceTraceId=pcb_trace2.connection_name;pcb_trace2.source_trace_id=sourceTraceId}let segments=splitPcbTracesOnJumperSegments(pcb_trace2.route);segments===null&&(segments=[pcb_trace2.route]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db);for(let segment2 of processedSegments)segment2.length>0&&db.pcb_trace.insert({...pcb_trace2,route:segment2})}for(let pcb_trace2 of output_pcb_traces)if(pcb_trace2.type!=="pcb_via"&&pcb_trace2.type==="pcb_trace")for(let point6 of pcb_trace2.route)point6.route_type==="via"&&db.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer})}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,schematic_group2=db.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id});this.schematic_group_id=schematic_group2.schematic_group_id;for(let child of this.children)child.schematic_component_id&&db.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group2.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx2=port.center.x-component.center.x,dy2=port.center.y-component.center.y;return Math.abs(dx2)>Math.abs(dy2)?dx2>0?"right":"left":dy2>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled"))return;let{db}=this.root;if(this.isSubcircuit){let subcircuitComponentsByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=subcircuitComponentsByName.get(child._parsedProps.name)||[];components.push(child),subcircuitComponentsByName.set(child._parsedProps.name,components)}for(let[name,components]of subcircuitComponentsByName.entries())components.length>1&&db.pcb_trace_error.insert({error_type:"pcb_trace_error",message:`Multiple components found with name "${name}" in subcircuit "${this.name||"unnamed"}". Component names must be unique within a subcircuit.`,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c3=>c3.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db}=this.root,subtree=db;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&/^gnd/i.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&/^v/i.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position2){return super._repositionOnPcb(position2)}};function inflatePcbBoard(pcbBoard,inflatorContext){let{subcircuit}=inflatorContext;if(subcircuit.lowercaseComponentName==="board"||subcircuit.lowercaseComponentName==="mountedboard"||subcircuit.parent?.lowercaseComponentName==="board")return;let boardProps2={name:"inflated_board"};pcbBoard.width&&(boardProps2.width=pcbBoard.width),pcbBoard.height&&(boardProps2.height=pcbBoard.height),pcbBoard.center&&(boardProps2.pcbX=pcbBoard.center.x,boardProps2.pcbY=pcbBoard.center.y),pcbBoard.outline&&(boardProps2.outline=pcbBoard.outline),pcbBoard.thickness&&(boardProps2.thickness=pcbBoard.thickness),pcbBoard.material&&(boardProps2.material=pcbBoard.material);let board=new Board(boardProps2);return board.pcb_board_id=pcbBoard.pcb_board_id,subcircuit.add(board),board}var Capacitor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Capacitor",schematicSymbolName:this.props.polarized?"capacitor_polarized":this.props.symbolName??"capacitor",zodProps:capacitorProps,sourceFtype:FTYPE.simple_capacitor}}initPorts(){typeof this.props.footprint=="string"?super.initPorts({additionalAliases:{pin1:["anode","pos"],pin2:["cathode","neg"]}}):super.initPorts()}_getSchematicSymbolDisplayValue(){let inputCapacitance=this.props.capacitance,capacitanceDisplay=typeof inputCapacitance=="string"?inputCapacitance:`${formatSiUnit(this._parsedProps.capacitance)}F`;return this._parsedProps.schShowRatings&&this._parsedProps.maxVoltageRating?`${capacitanceDisplay}/${formatSiUnit(this._parsedProps.maxVoltageRating)}V`:capacitanceDisplay}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.decouplingFor,this.props.decouplingTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.decouplingFor&&this.props.decouplingTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.decouplingFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.decouplingTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_capacitor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,capacitance:props.capacitance,max_voltage_rating:props.maxVoltageRating,max_decoupling_trace_length:props.maxDecouplingTraceLength,display_capacitance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!props.polarized,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},extractPcbPrimitivesFromCircuitJson=({pcbComponent,db,componentName})=>{let componentCenter=pcbComponent.center||{x:0,y:0},componentRotation=pcbComponent.rotation||0,absoluteToComponentRelativeTransform=inverse2(compose2(translate2(componentCenter.x,componentCenter.y),rotate2(componentRotation*Math.PI/180))),relativeElements=db.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===pcbComponent.pcb_component_id),clonedRelativeElements=structuredClone(relativeElements);return transformPCBElements(clonedRelativeElements,absoluteToComponentRelativeTransform),createComponentsFromCircuitJson({componentName,componentRotation:"0deg"},clonedRelativeElements)},inflateFootprintComponent=(pcbElm,inflatorContext)=>{let{injectionDb,normalComponent}=inflatorContext;if(!normalComponent)return null;let primitives=extractPcbPrimitivesFromCircuitJson({pcbComponent:pcbElm,db:injectionDb,componentName:normalComponent.name});if(primitives.length===0)return null;let footprint=new Footprint({});return footprint.addAll(primitives),footprint};function inflateSourceCapacitor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),capacitor=new Capacitor({name:sourceElm.name,capacitance:sourceElm.capacitance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:capacitor});footprint&&capacitor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(capacitor):subcircuit.add(capacitor)}var Chip=class extends NormalComponent3{constructor(props){super(props);__publicField(this,"schematicBoxDimensions",null)}get config(){return{componentName:"Chip",zodProps:chipProps,shouldRenderAsSchematicBox:!0}}initPorts(opts={}){super.initPorts(opts);let{_parsedProps:props}=this;if(props.externallyConnectedPins){let requiredPorts=new Set;for(let[pin1,pin2]of props.externallyConnectedPins)requiredPorts.add(pin1),requiredPorts.add(pin2);for(let pinIdentifier of requiredPorts)if(!this.children.find(child=>child instanceof Port&&child.isMatchingAnyOf([pinIdentifier]))){let pinMatch=pinIdentifier.match(/^pin(\d+)$/);if(pinMatch){let pinNumber=parseInt(pinMatch[1]);this.add(new Port({pinNumber,aliases:[pinIdentifier]}))}else this.add(new Port({name:pinIdentifier,aliases:[pinIdentifier]}))}}}doInitialSchematicComponentRender(){let{_parsedProps:props}=this;props?.noSchematicRepresentation!==!0&&super.doInitialSchematicComponentRender()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let subcircuit=this.getSubcircuit(),error=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db.pcb_component_invalid_layer_error.insert(error)}let pcb_component2=db.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,is_allowed_to_be_off_board:props.allowOffBoard??!1,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialCreateTracesFromProps(){let{_parsedProps:props}=this;if(props.externallyConnectedPins)for(let[pin1,pin2]of props.externallyConnectedPins)this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.${pin1}`,to:`${this.getSubcircuitSelector()} > port.${pin2}`}));this._createTracesFromConnectionsProp()}doInitialSimulationRender(){let{db}=this.root,{pinAttributes}=this.props;if(!pinAttributes)return;let powerPort=null,groundPort=null,voltage2,ports=this.selectAll("port");for(let port of ports)for(let alias of port.getNameAndAliases())if(pinAttributes[alias]){let attributes2=pinAttributes[alias];attributes2.providesPower&&(powerPort=port,voltage2=attributes2.providesVoltage),attributes2.providesGround&&(groundPort=port)}if(!powerPort||!groundPort||voltage2===void 0)return;let powerSourcePort=db.source_port.get(powerPort.source_port_id);if(!powerSourcePort?.subcircuit_connectivity_map_key)return;let groundSourcePort=db.source_port.get(groundPort.source_port_id);if(!groundSourcePort?.subcircuit_connectivity_map_key)return;let powerNet=db.source_net.getWhere({subcircuit_connectivity_map_key:powerSourcePort.subcircuit_connectivity_map_key}),groundNet=db.source_net.getWhere({subcircuit_connectivity_map_key:groundSourcePort.subcircuit_connectivity_map_key});!powerNet||!groundNet||db.simulation_voltage_source.insert({type:"simulation_voltage_source",positive_source_port_id:powerPort.source_port_id,positive_source_net_id:powerNet.source_net_id,negative_source_port_id:groundPort.source_port_id,negative_source_net_id:groundNet.source_net_id,voltage:voltage2})}},mapInternallyConnectedSourcePortIdsToPinLabels=(sourcePortIds,inflatorContext)=>{if(!sourcePortIds||sourcePortIds.length===0)return;let{injectionDb}=inflatorContext,mapped=sourcePortIds.map(group=>group.map(sourcePortId=>{let port=injectionDb.source_port.get(sourcePortId);return port?port.pin_number!==void 0&&port.pin_number!==null?`pin${port.pin_number}`:port.name:null}).filter(value=>value!==null)).filter(group=>group.length>0);return mapped.length>0?mapped:void 0},inflateSourceChip=(sourceElm,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),schematicElm=injectionDb.schematic_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),internallyConnectedPins=mapInternallyConnectedSourcePortIdsToPinLabels(sourceElm.internally_connected_source_port_ids,inflatorContext),footprinterString=cadElm?.footprinter_string??null,chip=new Chip({name:sourceElm.name,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,pinLabels:schematicElm?.port_labels??void 0,schWidth:schematicElm?.size?.width,schHeight:schematicElm?.size?.height,schPinSpacing:schematicElm?.pin_spacing,schX:schematicElm?.center?.x,schY:schematicElm?.center?.y,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds,internallyConnectedPins});if(footprinterString&&(Object.assign(chip.props,{footprint:footprinterString}),Object.assign(chip._parsedProps,{footprint:footprinterString})),pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:chip});footprint&&chip.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(chip):subcircuit.add(chip)},Diode=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={schottky:"schottky_diode",avalanche:"avalanche_diode",zener:"zener_diode",photodiode:"photodiode"},variantSymbol=this.props.schottky?"schottky":this.props.avalanche?"avalanche":this.props.zener?"zener":this.props.photo?"photodiode":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"diode",componentName:"Diode",zodProps:diodeProps,sourceFtype:"simple_diode"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_diode",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceDiode(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),diode2=new Diode({name:sourceElm.name,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:diode2});footprint&&diode2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(diode2):subcircuit.add(diode2)}function inflateSourceGroup(sourceGroup,inflatorContext){let{subcircuit,groupsMap}=inflatorContext,group=new Group6({name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`});return group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),inductor=new Inductor({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db}=root,pcb_port2=db.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port2.pcb_port_id}}var Resistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),resistor=new Resistor({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point6=>{let isSameAsFirst=point6.x===firstPoint.x&&point6.y===firstPoint.y,isSameAsLast=point6.x===lastPoint.x&&point6.y===lastPoint.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>point6.route_type==="via"?{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer}:{x:point6.x,y:point6.y})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&¤tGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTrace=injectionDb.pcb_trace.getWhere({source_trace_id:sourceTrace.source_trace_id}),pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt4=>pt4.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:pcbTrace&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line"],standalonePrimitives=injectionDb.toArray().filter(elm=>standalonePrimitiveTypes.includes(elm.type)&&"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0));if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g7=>!g7.parent_source_group_id||renderedGroupIds.has(g7.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g7=>g7.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},EXCLUDED_PROPS=new Set(["name","key","pcbX","pcbY","schX","schY","pcbLeftEdgeX","pcbRightEdgeX","pcbTopEdgeY","pcbBottomEdgeY","pcbRotation","schRotation"]);function safeSerialize(value,seen=new WeakSet){if(value===null)return"null";if(value===void 0)return"undefined";let type=typeof value;if(type==="string")return`"${value}"`;if(type==="number"||type==="boolean")return String(value);if(type==="function")return"[function]";if(type==="symbol")return"[symbol]";if(type==="object"){if(seen.has(value))return"[circular]";if(seen.add(value),value.$$typeof!==void 0){let elementType=typeof value.type=="string"?value.type:value.type?.name||"[component]",propsStr=value.props?safeSerialize(value.props,seen):"{}";return`ReactElement(${elementType},${propsStr})`}return Array.isArray(value)?`[${value.map(v5=>safeSerialize(v5,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k4=>`${k4}:${safeSerialize(value[k4],seen)}`).join(",")}}`}return String(value)}function getHashableProps(props){let result={},keys=Object.keys(props).sort();for(let key of keys)!EXCLUDED_PROPS.has(key)&&props[key]!==void 0&&(result[key]=props[key]);return result}function getChildrenHashData(children){return children.map(child=>({componentName:child.componentName,props:getHashableProps(child.props??{}),children:getChildrenHashData(child.children)}))}function fnv1aHash(str){let hash=2166136261;for(let i2=0;i2<str.length;i2++)hash^=str.charCodeAt(i2),hash=Math.imul(hash,16777619);return hash>>>0}function computeHash(data){let serialized=safeSerialize(data),hash1=fnv1aHash(serialized),hash2=fnv1aHash(serialized+hash1.toString());return hash1.toString(16).padStart(8,"0")+hash2.toString(16).padStart(8,"0")}function Subcircuit_getSubcircuitPropHash(subcircuit){let hashableData={props:getHashableProps(subcircuit.props??{}),children:getChildrenHashData(subcircuit.children)};return computeHash(hashableData)}var package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1062",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node index.ts --format esm --dts",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.18","@tscircuit/capacity-autorouter":"^0.0.299","@tscircuit/checks":"^0.0.91","@tscircuit/circuit-json-util":"^0.0.77","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.20","@tscircuit/footprinter":"^0.0.288","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.29","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.8","@tscircuit/props":"^0.0.484","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^v0.0.45","@tscircuit/solver-utils":"^0.0.3","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.384","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.73","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.34","circuit-to-svg":"^0.0.331",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.60",howfat:"^0.3.8","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.208",spicey:"^0.0.14","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-packing":"0.0.68","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react4.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform}}_getBoard(){let directBoard=this.children.find(c3=>c3.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group6({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist8(),dist_exports3)).catch(e4=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
653
|
+
${spiceString}`)}catch(error){debug10(`Failed to convert circuit JSON to SPICE: ${error}`);return}for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k4=>k4!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug10(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug10(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug10(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug10("No simulation experiment found, skipping result insertion");return}for(let element of result.simulationResultCircuitJson){if(element.type==="simulation_transient_voltage_graph"){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbes.find(p4=>p4.finalProbeName===element.name);probeMatch&&(element.color=probeMatch.color)}let elementType=element.type;elementType&&root.db[elementType]?(root.db[elementType].insert(element),debug10(`Inserted ${elementType} into database`)):(debug10(`Warning: Unknown element type ${elementType}, adding to raw db`),root.db._addElement(element))}group._markDirty("SimulationSpiceEngineRender")}catch(error){debug10(`Simulation failed for engine ${engineName}: ${error}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error instanceof Error?error.message:String(error)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t21=>{let source_trace2=db.source_trace.get(t21.source_trace_id);return source_trace2?[source_trace2.source_trace_id,...source_trace2.connected_source_port_ids,...source_trace2.connected_source_net_ids]:null}).filter(c3=>c3!==null));let sourceNets=db.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`,db.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db.source_trace.get(trace.source_trace_id);if(source_trace2)for(let id2 of source_trace2.connected_source_port_ids)allSourcePortIds.add(id2)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db.source_trace.get(trace.source_trace_id);if(source_trace2)for(let source_net_id of source_trace2.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n3=>n3.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getJumperPadInfos(db){let padInfos=[],jumperSmtpads=db.pcb_smtpad.list().filter(pad2=>{let component=db.pcb_component.get(pad2.pcb_component_id);return component?db.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x5,y5,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x5)<tolerance&&Math.abs(pad2.y-y5)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x5,y5){for(let pad2 of padInfos)if(x5>=pad2.minX&&x5<=pad2.maxX&&y5>=pad2.minY&&y5<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i2=0;i2<route.length;i2++){let point6=route[i2];if(currentSegment.push(point6),point6.route_type==="wire"&&i2>0&&i2<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point6.x,point6.y);if(padInfo){point6.end_pcb_port_id||(point6.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point6};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db){let padInfos=getJumperPadInfos(db);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g7=>g7.length>=2)}function insertAutoplacedJumpers(params){let{db,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation4=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation4,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p4=>Math.abs(p4.pad.center.x-groupPad.center.x)<.01&&Math.abs(p4.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p4=>p4.route_type==="jumper"),wireAndViaRoutes=route.filter(p4=>p4.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i2=0;i2<wireAndViaRoutes.length;i2++){let p4=wireAndViaRoutes[i2];if(p4.route_type!=="wire")continue;let distToStart=Math.hypot(p4.x-jumperStart.x,p4.y-jumperStart.y),distToEnd=Math.hypot(p4.x-jumperEnd.x,p4.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i2),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i2)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a2,b3)=>a2.startIdx-b3.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return console.log("width or height is not a number"),anchorPosition;let ax2=anchorPosition.x,ay2=anchorPosition.y;switch(alignment){case"top_left":return{x:ax2+width/2,y:ay2-height/2};case"top_center":return{x:ax2,y:ay2-height/2};case"top_right":return{x:ax2-width/2,y:ay2-height/2};case"center_left":return{x:ax2+width/2,y:ay2};case"center_right":return{x:ax2-width/2,y:ay2};case"bottom_left":return{x:ax2+width/2,y:ay2+height/2};case"bottom_center":return{x:ax2,y:ay2+height/2};case"bottom_right":return{x:ax2-width/2,y:ay2+height/2};default:return anchorPosition}}var Group6=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}doInitialSourceGroupRender(){let{db}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group2=db.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group2.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group2.source_group_id}`,db.source_group.update(source_group2.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db}=this.root;for(let child of this.children)db.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group2=db.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group2.pcb_group_id;for(let child of this.children)db.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group2.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let center2=hasExplicitPositioning?db.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};db.pcb_group.update(this.pcb_group_id,{width:Number(props.width??width),height:Number(props.height??height),center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a360,_b2;return(_a360=this.unnamedElementCounter)[_b2=elm.lowercaseComponentName]??(_a360[_b2]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this.selectAll("group").filter(g7=>g7.isSubcircuit);for(let subcircuitChild of subcircuitChildren)if(subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_hasTracesToRoute(){let debug112=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),traces=this.selectAll("trace");return debug112(`[${this.getString()}] has ${traces.length} traces to route`),traces.length>0}async _runEffectMakeHttpAutoroutingRequest(){let{db}=this.root,debug112=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug112("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err.message}),err}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db}=this.root,props=this._parsedProps,debug112=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug112(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id});if(isAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,autorouterConfig2.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=autorouterConfig2.availableJumperTypes)),debug112.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug112.enabled){let graphicsObject=Rn2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(autorouterConfig2.algorithmFn)autorouter=await autorouterConfig2.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:this.props.autorouter?.capacityDepth,targetMinCapacity:this.props.autorouter?.targetMinCapacity,useAssignableSolver:isLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:isAutoJumperPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug112(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug112(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise;if(autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let outputJumpers=[],solver=autorouter.solver;solver?.getOutputJumpers&&(outputJumpers=solver.getOutputJumpers()||[]),this._asyncAutoroutingResult={output_pcb_traces:traces,output_jumpers:outputJumpers},this._markDirty("PcbTraceRender")}catch(error){let{db:db2}=this.root;throw db2.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error instanceof Error?error.message:String(error)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error instanceof Error?error.message:String(error)},simpleRouteJson}),error}finally{autorouter.stop()}}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!this.getInheritedProperty("routingDisabled")&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug112(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug112(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug112(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug112(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug112(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug112(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let pcb_trace2=db.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:routedTrace.route})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db,output_jumpers,subcircuit_id:this.subcircuit_id});for(let pcb_trace2 of output_pcb_traces){if(pcb_trace2.type!=="pcb_trace")continue;if(pcb_trace2.subcircuit_id=this.subcircuit_id,pcb_trace2.connection_name){let sourceTraceId=pcb_trace2.connection_name;pcb_trace2.source_trace_id=sourceTraceId}let segments=splitPcbTracesOnJumperSegments(pcb_trace2.route);segments===null&&(segments=[pcb_trace2.route]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db);for(let segment2 of processedSegments)segment2.length>0&&db.pcb_trace.insert({...pcb_trace2,route:segment2})}for(let pcb_trace2 of output_pcb_traces)if(pcb_trace2.type!=="pcb_via"&&pcb_trace2.type==="pcb_trace")for(let point6 of pcb_trace2.route)point6.route_type==="via"&&db.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer})}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,schematic_group2=db.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id});this.schematic_group_id=schematic_group2.schematic_group_id;for(let child of this.children)child.schematic_component_id&&db.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group2.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx2=port.center.x-component.center.x,dy2=port.center.y-component.center.y;return Math.abs(dx2)>Math.abs(dy2)?dx2>0?"right":"left":dy2>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled"))return;let{db}=this.root;if(this.isSubcircuit){let subcircuitComponentsByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=subcircuitComponentsByName.get(child._parsedProps.name)||[];components.push(child),subcircuitComponentsByName.set(child._parsedProps.name,components)}for(let[name,components]of subcircuitComponentsByName.entries())components.length>1&&db.pcb_trace_error.insert({error_type:"pcb_trace_error",message:`Multiple components found with name "${name}" in subcircuit "${this.name||"unnamed"}". Component names must be unique within a subcircuit.`,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c3=>c3.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db}=this.root,subtree=db;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&/^gnd/i.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&/^v/i.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position2){return super._repositionOnPcb(position2)}};function inflatePcbBoard(pcbBoard,inflatorContext){let{subcircuit}=inflatorContext;if(subcircuit.lowercaseComponentName==="board"||subcircuit.lowercaseComponentName==="mountedboard"||subcircuit.parent?.lowercaseComponentName==="board")return;let boardProps2={name:"inflated_board"};pcbBoard.width&&(boardProps2.width=pcbBoard.width),pcbBoard.height&&(boardProps2.height=pcbBoard.height),pcbBoard.center&&(boardProps2.pcbX=pcbBoard.center.x,boardProps2.pcbY=pcbBoard.center.y),pcbBoard.outline&&(boardProps2.outline=pcbBoard.outline),pcbBoard.thickness&&(boardProps2.thickness=pcbBoard.thickness),pcbBoard.material&&(boardProps2.material=pcbBoard.material);let board=new Board(boardProps2);return board.pcb_board_id=pcbBoard.pcb_board_id,subcircuit.add(board),board}var Capacitor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Capacitor",schematicSymbolName:this.props.polarized?"capacitor_polarized":this.props.symbolName??"capacitor",zodProps:capacitorProps,sourceFtype:FTYPE.simple_capacitor}}initPorts(){typeof this.props.footprint=="string"?super.initPorts({additionalAliases:{pin1:["anode","pos"],pin2:["cathode","neg"]}}):super.initPorts()}_getSchematicSymbolDisplayValue(){let inputCapacitance=this.props.capacitance,capacitanceDisplay=typeof inputCapacitance=="string"?inputCapacitance:`${formatSiUnit(this._parsedProps.capacitance)}F`;return this._parsedProps.schShowRatings&&this._parsedProps.maxVoltageRating?`${capacitanceDisplay}/${formatSiUnit(this._parsedProps.maxVoltageRating)}V`:capacitanceDisplay}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.decouplingFor,this.props.decouplingTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.decouplingFor&&this.props.decouplingTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.decouplingFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.decouplingTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_capacitor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,capacitance:props.capacitance,max_voltage_rating:props.maxVoltageRating,max_decoupling_trace_length:props.maxDecouplingTraceLength,display_capacitance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!props.polarized,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},extractPcbPrimitivesFromCircuitJson=({pcbComponent,db,componentName})=>{let componentCenter=pcbComponent.center||{x:0,y:0},componentRotation=pcbComponent.rotation||0,absoluteToComponentRelativeTransform=inverse2(compose2(translate2(componentCenter.x,componentCenter.y),rotate2(componentRotation*Math.PI/180))),relativeElements=db.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===pcbComponent.pcb_component_id),clonedRelativeElements=structuredClone(relativeElements);return transformPCBElements(clonedRelativeElements,absoluteToComponentRelativeTransform),createComponentsFromCircuitJson({componentName,componentRotation:"0deg"},clonedRelativeElements)},inflateFootprintComponent=(pcbElm,inflatorContext)=>{let{injectionDb,normalComponent}=inflatorContext;if(!normalComponent)return null;let primitives=extractPcbPrimitivesFromCircuitJson({pcbComponent:pcbElm,db:injectionDb,componentName:normalComponent.name});if(primitives.length===0)return null;let footprint=new Footprint({});return footprint.addAll(primitives),footprint};function inflateSourceCapacitor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),capacitor=new Capacitor({name:sourceElm.name,capacitance:sourceElm.capacitance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:capacitor});footprint&&capacitor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(capacitor):subcircuit.add(capacitor)}var Chip=class extends NormalComponent3{constructor(props){super(props);__publicField(this,"schematicBoxDimensions",null)}get config(){return{componentName:"Chip",zodProps:chipProps,shouldRenderAsSchematicBox:!0}}initPorts(opts={}){super.initPorts(opts);let{_parsedProps:props}=this;if(props.externallyConnectedPins){let requiredPorts=new Set;for(let[pin1,pin2]of props.externallyConnectedPins)requiredPorts.add(pin1),requiredPorts.add(pin2);for(let pinIdentifier of requiredPorts)if(!this.children.find(child=>child instanceof Port&&child.isMatchingAnyOf([pinIdentifier]))){let pinMatch=pinIdentifier.match(/^pin(\d+)$/);if(pinMatch){let pinNumber=parseInt(pinMatch[1]);this.add(new Port({pinNumber,aliases:[pinIdentifier]}))}else this.add(new Port({name:pinIdentifier,aliases:[pinIdentifier]}))}}}doInitialSchematicComponentRender(){let{_parsedProps:props}=this;props?.noSchematicRepresentation!==!0&&super.doInitialSchematicComponentRender()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let subcircuit=this.getSubcircuit(),error=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db.pcb_component_invalid_layer_error.insert(error)}let pcb_component2=db.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,is_allowed_to_be_off_board:props.allowOffBoard??!1,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialCreateTracesFromProps(){let{_parsedProps:props}=this;if(props.externallyConnectedPins)for(let[pin1,pin2]of props.externallyConnectedPins)this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.${pin1}`,to:`${this.getSubcircuitSelector()} > port.${pin2}`}));this._createTracesFromConnectionsProp()}doInitialSimulationRender(){let{db}=this.root,{pinAttributes}=this.props;if(!pinAttributes)return;let powerPort=null,groundPort=null,voltage2,ports=this.selectAll("port");for(let port of ports)for(let alias of port.getNameAndAliases())if(pinAttributes[alias]){let attributes2=pinAttributes[alias];attributes2.providesPower&&(powerPort=port,voltage2=attributes2.providesVoltage),attributes2.providesGround&&(groundPort=port)}if(!powerPort||!groundPort||voltage2===void 0)return;let powerSourcePort=db.source_port.get(powerPort.source_port_id);if(!powerSourcePort?.subcircuit_connectivity_map_key)return;let groundSourcePort=db.source_port.get(groundPort.source_port_id);if(!groundSourcePort?.subcircuit_connectivity_map_key)return;let powerNet=db.source_net.getWhere({subcircuit_connectivity_map_key:powerSourcePort.subcircuit_connectivity_map_key}),groundNet=db.source_net.getWhere({subcircuit_connectivity_map_key:groundSourcePort.subcircuit_connectivity_map_key});!powerNet||!groundNet||db.simulation_voltage_source.insert({type:"simulation_voltage_source",positive_source_port_id:powerPort.source_port_id,positive_source_net_id:powerNet.source_net_id,negative_source_port_id:groundPort.source_port_id,negative_source_net_id:groundNet.source_net_id,voltage:voltage2})}},mapInternallyConnectedSourcePortIdsToPinLabels=(sourcePortIds,inflatorContext)=>{if(!sourcePortIds||sourcePortIds.length===0)return;let{injectionDb}=inflatorContext,mapped=sourcePortIds.map(group=>group.map(sourcePortId=>{let port=injectionDb.source_port.get(sourcePortId);return port?port.pin_number!==void 0&&port.pin_number!==null?`pin${port.pin_number}`:port.name:null}).filter(value=>value!==null)).filter(group=>group.length>0);return mapped.length>0?mapped:void 0},inflateSourceChip=(sourceElm,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),schematicElm=injectionDb.schematic_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),internallyConnectedPins=mapInternallyConnectedSourcePortIdsToPinLabels(sourceElm.internally_connected_source_port_ids,inflatorContext),footprinterString=cadElm?.footprinter_string??null,chip=new Chip({name:sourceElm.name,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,pinLabels:schematicElm?.port_labels??void 0,schWidth:schematicElm?.size?.width,schHeight:schematicElm?.size?.height,schPinSpacing:schematicElm?.pin_spacing,schX:schematicElm?.center?.x,schY:schematicElm?.center?.y,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds,internallyConnectedPins});if(footprinterString&&(Object.assign(chip.props,{footprint:footprinterString}),Object.assign(chip._parsedProps,{footprint:footprinterString})),pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:chip});footprint&&chip.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(chip):subcircuit.add(chip)},Diode=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={schottky:"schottky_diode",avalanche:"avalanche_diode",zener:"zener_diode",photodiode:"photodiode"},variantSymbol=this.props.schottky?"schottky":this.props.avalanche?"avalanche":this.props.zener?"zener":this.props.photo?"photodiode":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"diode",componentName:"Diode",zodProps:diodeProps,sourceFtype:"simple_diode"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_diode",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceDiode(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),diode2=new Diode({name:sourceElm.name,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:diode2});footprint&&diode2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(diode2):subcircuit.add(diode2)}function inflateSourceGroup(sourceGroup,inflatorContext){let{subcircuit,groupsMap}=inflatorContext,group=new Group6({name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`});return group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),inductor=new Inductor({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db}=root,pcb_port2=db.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port2.pcb_port_id}}var Resistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),resistor=new Resistor({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point6=>{let isSameAsFirst=point6.x===firstPoint.x&&point6.y===firstPoint.y,isSameAsLast=point6.x===lastPoint.x&&point6.y===lastPoint.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>point6.route_type==="via"?{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer}:{x:point6.x,y:point6.y})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&¤tGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTrace=injectionDb.pcb_trace.getWhere({source_trace_id:sourceTrace.source_trace_id}),pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt4=>pt4.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:pcbTrace&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line"],standalonePrimitives=injectionDb.toArray().filter(elm=>standalonePrimitiveTypes.includes(elm.type)&&"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0));if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g7=>!g7.parent_source_group_id||renderedGroupIds.has(g7.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g7=>g7.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},EXCLUDED_PROPS=new Set(["name","key","pcbX","pcbY","schX","schY","pcbLeftEdgeX","pcbRightEdgeX","pcbTopEdgeY","pcbBottomEdgeY","pcbRotation","schRotation"]);function safeSerialize(value,seen=new WeakSet){if(value===null)return"null";if(value===void 0)return"undefined";let type=typeof value;if(type==="string")return`"${value}"`;if(type==="number"||type==="boolean")return String(value);if(type==="function")return"[function]";if(type==="symbol")return"[symbol]";if(type==="object"){if(seen.has(value))return"[circular]";if(seen.add(value),value.$$typeof!==void 0){let elementType=typeof value.type=="string"?value.type:value.type?.name||"[component]",propsStr=value.props?safeSerialize(value.props,seen):"{}";return`ReactElement(${elementType},${propsStr})`}return Array.isArray(value)?`[${value.map(v5=>safeSerialize(v5,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k4=>`${k4}:${safeSerialize(value[k4],seen)}`).join(",")}}`}return String(value)}function getHashableProps(props){let result={},keys=Object.keys(props).sort();for(let key of keys)!EXCLUDED_PROPS.has(key)&&props[key]!==void 0&&(result[key]=props[key]);return result}function getChildrenHashData(children){return children.map(child=>({componentName:child.componentName,props:getHashableProps(child.props??{}),children:getChildrenHashData(child.children)}))}function fnv1aHash(str){let hash=2166136261;for(let i2=0;i2<str.length;i2++)hash^=str.charCodeAt(i2),hash=Math.imul(hash,16777619);return hash>>>0}function computeHash(data){let serialized=safeSerialize(data),hash1=fnv1aHash(serialized),hash2=fnv1aHash(serialized+hash1.toString());return hash1.toString(16).padStart(8,"0")+hash2.toString(16).padStart(8,"0")}function Subcircuit_getSubcircuitPropHash(subcircuit){let hashableData={props:getHashableProps(subcircuit.props??{}),children:getChildrenHashData(subcircuit.children)};return computeHash(hashableData)}var package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1064",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node index.ts --format esm --dts",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.18","@tscircuit/capacity-autorouter":"^0.0.299","@tscircuit/checks":"^0.0.91","@tscircuit/circuit-json-util":"^0.0.77","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.20","@tscircuit/footprinter":"^0.0.316","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.29","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.8","@tscircuit/props":"^0.0.484","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^v0.0.45","@tscircuit/solver-utils":"^0.0.3","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.384","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.73","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.34","circuit-to-svg":"^0.0.331",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.60",howfat:"^0.3.8","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.208",spicey:"^0.0.14","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-packing":"0.0.68","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react4.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform}}_getBoard(){let directBoard=this.children.find(c3=>c3.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group6({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist8(),dist_exports3)).catch(e4=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
654
654
|
|
|
655
655
|
"${e4.message}"`)});if(options.view==="pcb")return circuitToSvg.convertCircuitJsonToPcbSvg(this.getCircuitJson());if(options.view==="schematic")return circuitToSvg.convertCircuitJsonToSchematicSvg(this.getCircuitJson());throw new Error(`Invalid view: ${options.view}`)}getCoreVersion(){let[major,minor,patch]=package_default3.version.split(".").map(Number);return`${major}.${minor}.${patch+1}`}async preview(previewNameOrOpts){let previewOpts=typeof previewNameOrOpts=="object"?previewNameOrOpts:{previewName:previewNameOrOpts};throw new Error("project.preview is not yet implemented")}computeSchematicGlobalTransform(){return identity()}_computePcbGlobalTransformBeforeLayout(){return identity()}selectAll(selector){return this._guessRootComponent(),this.firstChild?.selectAll(selector)??[]}selectOne(selector,opts){return this._guessRootComponent(),this.firstChild?.selectOne(selector,opts)??null}emit(event,...args){if(event==="asyncEffect:start"?this._registerAsyncEffectStart(args[0]):event==="asyncEffect:end"&&this._registerAsyncEffectEnd(args[0]),!!this._eventListeners[event])for(let listener of this._eventListeners[event])listener(...args)}on(event,listener){this._eventListeners[event]||(this._eventListeners[event]=[]),this._eventListeners[event].push(listener)}removeListener(event,listener){this._eventListeners[event]&&(this._eventListeners[event]=this._eventListeners[event].filter(l3=>l3!==listener))}enableDebug(debug112){typeof debug112=="string"?import_debug19.default.enable(debug112):(debug112===null||debug112===!1)&&import_debug19.default.disable()}getClientOrigin(){return typeof window<"u"&&window.location?window.location.origin:typeof self<"u"&&self.location?self.location.origin:""}_registerAsyncEffectStart(payload){if(!payload?.asyncEffectId||!payload.phase)return;let{asyncEffectId,phase}=payload,existingPhase=this._asyncEffectPhaseById.get(asyncEffectId);existingPhase&&existingPhase!==phase&&this._asyncEffectIdsByPhase.get(existingPhase)?.delete(asyncEffectId),this._asyncEffectIdsByPhase.has(phase)||this._asyncEffectIdsByPhase.set(phase,new Set),this._asyncEffectIdsByPhase.get(phase).add(asyncEffectId),this._asyncEffectPhaseById.set(asyncEffectId,phase)}_registerAsyncEffectEnd(payload){if(!payload?.asyncEffectId)return;let{asyncEffectId}=payload,phase=this._asyncEffectPhaseById.get(asyncEffectId)??payload.phase;if(phase){let phaseSet=this._asyncEffectIdsByPhase.get(phase);phaseSet?.delete(asyncEffectId),phaseSet&&phaseSet.size===0&&this._asyncEffectIdsByPhase.delete(phase)}this._asyncEffectPhaseById.delete(asyncEffectId)}};function Subcircuit_doInitialRenderIsolatedSubcircuits(subcircuit){if(!subcircuit._isIsolatedSubcircuit||subcircuit._isolatedCircuitJson||!subcircuit.getSubcircuitPropHash)return;let propHash=subcircuit.getSubcircuitPropHash(),cachedSubcircuits=subcircuit.root?.cachedSubcircuits,pendingSubcircuitRenders=subcircuit.root?.pendingSubcircuitRenders,cached=cachedSubcircuits?.get(propHash);if(cached){subcircuit._isolatedCircuitJson=cached,subcircuit.children=[],subcircuit._normalComponentNameMap=null;return}let childrenToRender=[...subcircuit.children];subcircuit.children=[],subcircuit._normalComponentNameMap=null;let parentRoot=subcircuit.root;subcircuit._queueAsyncEffect("render-isolated-subcircuit",async()=>{let cachedResult=cachedSubcircuits?.get(propHash);if(cachedResult){subcircuit._isolatedCircuitJson=cachedResult;return}let pendingRenderPromise=pendingSubcircuitRenders?.get(propHash);if(pendingRenderPromise){subcircuit._isolatedCircuitJson=await pendingRenderPromise;return}let resolveRender,rejectRender,renderPromise=new Promise((resolve,reject)=>{resolveRender=resolve,rejectRender=reject});pendingSubcircuitRenders?.set(propHash,renderPromise);try{let isolatedCircuit=new IsolatedCircuit({platform:{...parentRoot.platform,pcbDisabled:parentRoot.pcbDisabled,schematicDisabled:parentRoot.schematicDisabled},cachedSubcircuits,pendingSubcircuitRenders});for(let child of childrenToRender)isolatedCircuit.add(child);await isolatedCircuit.renderUntilSettled();let circuitJson=isolatedCircuit.getCircuitJson();cachedSubcircuits?.set(propHash,circuitJson),subcircuit._isolatedCircuitJson=circuitJson,resolveRender(circuitJson)}catch(error){throw rejectRender(error instanceof Error?error:new Error(String(error))),error}finally{pendingSubcircuitRenders?.delete(propHash)}})}var MIN_EFFECTIVE_BORDER_RADIUS_MM=.01,getRoundedRectOutline=(width,height,radius)=>{let w22=width/2,h22=height/2,r4=Math.min(radius,w22,h22);if(r4<MIN_EFFECTIVE_BORDER_RADIUS_MM)return[{x:-w22,y:-h22},{x:w22,y:-h22},{x:w22,y:h22},{x:-w22,y:h22}];let segments=Math.max(1,Math.ceil(Math.PI/2*r4/.1)),step=Math.PI/2/segments,outline=[];outline.push({x:-w22+r4,y:-h22}),outline.push({x:w22-r4,y:-h22});for(let i2=1;i2<=segments;i2++){let theta=-Math.PI/2+i2*step;outline.push({x:w22-r4+r4*Math.cos(theta),y:-h22+r4+r4*Math.sin(theta)})}outline.push({x:w22,y:h22-r4});for(let i2=1;i2<=segments;i2++){let theta=0+i2*step;outline.push({x:w22-r4+r4*Math.cos(theta),y:h22-r4+r4*Math.sin(theta)})}outline.push({x:-w22+r4,y:h22});for(let i2=1;i2<=segments;i2++){let theta=Math.PI/2+i2*step;outline.push({x:-w22+r4+r4*Math.cos(theta),y:h22-r4+r4*Math.sin(theta)})}outline.push({x:-w22,y:-h22+r4});for(let i2=1;i2<=segments;i2++){let theta=Math.PI+i2*step;outline.push({x:-w22+r4+r4*Math.cos(theta),y:-h22+r4+r4*Math.sin(theta)})}return outline},Board=class extends Group6{constructor(){super(...arguments);__publicField(this,"pcb_board_id",null);__publicField(this,"source_board_id",null);__publicField(this,"_drcChecksComplete",!1);__publicField(this,"_connectedSchematicPortPairs",new Set);__publicField(this,"_panelPositionOffset",null)}get isSubcircuit(){return!0}get isGroup(){return!0}get config(){return{componentName:"Board",zodProps:boardProps}}get boardThickness(){return this._parsedProps.thickness??1.4}get allLayers(){let layerCount=this._parsedProps.layers??2;return layerCount===1?["top"]:layerCount===4?["top","bottom","inner1","inner2"]:["top","bottom"]}_getSubcircuitLayerCount(){return this._parsedProps.layers??2}_computePcbGlobalTransformBeforeLayout(){if(this._panelPositionOffset){let parentTransform=this.parent?._computePcbGlobalTransformBeforeLayout?.()??{a:1,b:0,c:0,d:1,e:0,f:0};return compose2(parentTransform,translate2(this._panelPositionOffset.x,this._panelPositionOffset.y))}return super._computePcbGlobalTransformBeforeLayout()}_getBoardCalcVariables(){let{_parsedProps:props}=this;if((props.width==null||props.height==null)&&!props.outline)return{};let dbBoard=this.pcb_board_id?this.root?.db.pcb_board.get(this.pcb_board_id):null,width=dbBoard?.width??props.width,height=dbBoard?.height??props.height;if((width==null||height==null)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),center2=dbBoard?.center??{x:pcbX+(props.outlineOffsetX??0),y:pcbY+(props.outlineOffsetY??0)},resolvedWidth=width??0,resolvedHeight=height??0;return{"board.minX":center2.x-resolvedWidth/2,"board.maxX":center2.x+resolvedWidth/2,"board.minY":center2.y-resolvedHeight/2,"board.maxY":center2.y+resolvedHeight/2}}doInitialPcbBoardAutoSize(){if(this.root?.pcbDisabled||!this.pcb_board_id)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcbBoard=db.pcb_board.get(this.pcb_board_id);if(pcbBoard?.width&&pcbBoard?.height||pcbBoard?.outline&&pcbBoard.outline.length>0)return;let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,descendantIds=getDescendantSubcircuitIds(db,this.subcircuit_id),allowedSubcircuitIds=new Set([this.subcircuit_id,...descendantIds]),allPcbComponents=db.pcb_component.list().filter(c3=>c3.subcircuit_id&&allowedSubcircuitIds.has(c3.subcircuit_id)),allPcbGroups=db.pcb_group.list().filter(g7=>g7.subcircuit_id&&allowedSubcircuitIds.has(g7.subcircuit_id)),hasComponents=!1,updateBounds=(center22,width,height)=>{width===0||height===0||(hasComponents=!0,minX=Math.min(minX,center22.x-width/2),minY=Math.min(minY,center22.y-height/2),maxX=Math.max(maxX,center22.x+width/2),maxY=Math.max(maxY,center22.y+height/2))};for(let pcbComponent of allPcbComponents)updateBounds(pcbComponent.center,pcbComponent.width,pcbComponent.height);for(let pcbGroup of allPcbGroups){let width=pcbGroup.width??0,height=pcbGroup.height??0;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);bounds&&(width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY)}updateBounds(pcbGroup.center,width,height)}if(props.boardAnchorPosition){let{x:x5,y:y5}=props.boardAnchorPosition;minX=Math.min(minX,x5),minY=Math.min(minY,y5),maxX=Math.max(maxX,x5),maxY=Math.max(maxY,y5)}let padding=2,computedWidth=hasComponents?maxX-minX+padding*2:0,computedHeight=hasComponents?maxY-minY+padding*2:0,center2={x:hasComponents?(minX+maxX)/2+(props.outlineOffsetX??0):(props.outlineOffsetX??0)+globalPos.x,y:hasComponents?(minY+maxY)/2+(props.outlineOffsetY??0):(props.outlineOffsetY??0)+globalPos.y},finalWidth=props.width??computedWidth,finalHeight=props.height??computedHeight,outline=props.outline;!outline&&props.borderRadius!=null&&finalWidth>0&&finalHeight>0&&(outline=getRoundedRectOutline(finalWidth,finalHeight,props.borderRadius));let update={width:finalWidth,height:finalHeight,center:center2};outline&&(update.outline=outline.map(point6=>({x:point6.x+(props.outlineOffsetX??0),y:point6.y+(props.outlineOffsetY??0)}))),db.pcb_board.update(this.pcb_board_id,update)}updatePcbBoardAutoSize(){this.doInitialPcbBoardAutoSize()}_addBoardInformationToSilkscreen(){let platform=this.root?.platform;if(!platform?.printBoardInformationToSilkscreen)return;let pcbBoard=this.root.db.pcb_board.get(this.pcb_board_id);if(!pcbBoard)return;let boardInformation=[];if(platform.projectName&&boardInformation.push(platform.projectName),platform.version&&boardInformation.push(`v${platform.version}`),platform.url&&boardInformation.push(platform.url),boardInformation.length===0)return;let text=boardInformation.join(`
|
|
656
656
|
`),position2={x:pcbBoard.center.x+pcbBoard.width/2-.25,y:pcbBoard.center.y-pcbBoard.height/2+1};this.root.db.pcb_silkscreen_text.insert({pcb_component_id:this.pcb_board_id,layer:"top",font:"tscircuit2024",font_size:.45,text,ccw_rotation:0,anchor_alignment:"bottom_right",anchor_position:position2})}doInitialSourceRender(){let nestedBoard=this.getDescendants().find(d3=>d3.lowercaseComponentName==="board");if(nestedBoard)throw new Error(`Nested boards are not supported: found board "${nestedBoard.name}" inside board "${this.name}"`);super.doInitialSourceRender();let{db}=this.root,source_board2=db.source_board.insert({source_group_id:this.source_group_id,title:this.props.title||this.props.name});this.source_board_id=source_board2.source_board_id}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,pcbBoardFromCircuitJson=props.circuitJson?.find(elm=>elm.type==="pcb_board"),computedWidth=props.width??pcbBoardFromCircuitJson?.width??0,computedHeight=props.height??pcbBoardFromCircuitJson?.height??0,globalPos=this._getGlobalPcbPositionBeforeLayout(),center2={x:globalPos.x+(props.outlineOffsetX??0),y:globalPos.y+(props.outlineOffsetY??0)},{boardAnchorPosition,boardAnchorAlignment}=props;if(boardAnchorPosition&&(center2=getBoardCenterFromAnchor({boardAnchorPosition,boardAnchorAlignment:boardAnchorAlignment??"center",width:computedWidth,height:computedHeight})),props.outline){let xValues=props.outline.map(point6=>point6.x),yValues=props.outline.map(point6=>point6.y),minX=Math.min(...xValues),maxX=Math.max(...xValues),minY=Math.min(...yValues),maxY=Math.max(...yValues);computedWidth=maxX-minX,computedHeight=maxY-minY}let outline=props.outline;!outline&&props.borderRadius!=null&&computedWidth>0&&computedHeight>0&&(outline=getRoundedRectOutline(computedWidth,computedHeight,props.borderRadius));let outlineTranslation={x:0,y:0};if(outline&&outline.length>0&&(this.parent?.lowercaseComponentName==="panel"||this.parent?.lowercaseComponentName==="subpanel")){let outlineBounds=getBoundsFromPoints(outline);if(outlineBounds){let outlineCenterX=(outlineBounds.minX+outlineBounds.maxX)/2,outlineCenterY=(outlineBounds.minY+outlineBounds.maxY)/2;outlineTranslation={x:center2.x-outlineCenterX,y:center2.y-outlineCenterY}}}let pcb_board2=db.pcb_board.insert({source_board_id:this.source_board_id,center:center2,thickness:this.boardThickness,num_layers:this.allLayers.length,width:computedWidth,height:computedHeight,outline:outline?.map(point6=>({x:point6.x+(props.outlineOffsetX??0)+outlineTranslation.x,y:point6.y+(props.outlineOffsetY??0)+outlineTranslation.y})),material:props.material});this.pcb_board_id=pcb_board2.pcb_board_id,this._addBoardInformationToSilkscreen()}removePcbComponentRender(){let{db}=this.root;this.pcb_board_id&&(db.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled")||super.doInitialPcbDesignRuleChecks()}updatePcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled"))return;let{db}=this.root;if(!this._areChildSubcircuitsRouted()||this._drcChecksComplete)return;let runDrcChecks=circuitJson=>{let pcbTraceOverlappingErrors=checkEachPcbTraceNonOverlapping(circuitJson);for(let error of pcbTraceOverlappingErrors)db.pcb_trace_error.insert(error);let pcbPortNotConnectedErrors=checkEachPcbPortConnectedToPcbTraces(circuitJson);for(let error of pcbPortNotConnectedErrors)db.pcb_port_not_connected_error.insert(error);let pcbComponentOutsideErrors=checkPcbComponentsOutOfBoard(circuitJson);for(let error of pcbComponentOutsideErrors)db.pcb_component_outside_board_error.insert(error);let pcbTracesOutOfBoardErrors=checkPcbTracesOutOfBoard(circuitJson);for(let error of pcbTracesOutOfBoardErrors)db.pcb_trace_error.insert(error);let differentNetViaErrors=checkDifferentNetViaSpacing(circuitJson);for(let error of differentNetViaErrors)db.pcb_via_clearance_error.insert(error);let sameNetViaErrors=checkSameNetViaSpacing(circuitJson);for(let error of sameNetViaErrors)db.pcb_via_clearance_error.insert(error);let pcbComponentOverlapErrors=checkPcbComponentOverlap(circuitJson);for(let error of pcbComponentOverlapErrors)db.pcb_footprint_overlap_error.insert(error);let sourcePinMustBeConnectedErrors=checkPinMustBeConnected(circuitJson);for(let error of sourcePinMustBeConnectedErrors)db.source_pin_must_be_connected_error.insert(error)},subcircuitCircuitJson=db.subtree({subcircuit_id:this.subcircuit_id}).toArray();runDrcChecks(subcircuitCircuitJson),this._drcChecksComplete=!0}_emitRenderLifecycleEvent(phase,startOrEnd){super._emitRenderLifecycleEvent(phase,startOrEnd),startOrEnd==="start"&&this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase})}_repositionOnPcb(position2){let{db}=this.root,pcbBoard=this.pcb_board_id?db.pcb_board.get(this.pcb_board_id):null,oldPos=pcbBoard?.center;if(!oldPos){this.pcb_board_id&&db.pcb_board.update(this.pcb_board_id,{center:position2});return}let deltaX=position2.x-oldPos.x,deltaY=position2.y-oldPos.y;if(!(Math.abs(deltaX)<1e-6&&Math.abs(deltaY)<1e-6)&&this.pcb_board_id&&(db.pcb_board.update(this.pcb_board_id,{center:position2}),pcbBoard?.outline)){let outlineBounds=getBoundsFromPoints(pcbBoard.outline);if(outlineBounds){let oldOutlineCenter={x:(outlineBounds.minX+outlineBounds.maxX)/2,y:(outlineBounds.minY+outlineBounds.maxY)/2},outlineDeltaX=position2.x-oldOutlineCenter.x,outlineDeltaY=position2.y-oldOutlineCenter.y,newOutline=pcbBoard.outline.map(p4=>({x:p4.x+outlineDeltaX,y:p4.y+outlineDeltaY}));db.pcb_board.update(this.pcb_board_id,{outline:newOutline})}}}},Subcircuit=class extends Group6{constructor(props){super({...props,subcircuit:!0})}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}},MountedBoard=class extends Subcircuit{constructor(props){super(props);__publicField(this,"pcb_board_id",null)}get config(){return{componentName:"MountedBoard",zodProps:mountedboardProps}}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcb_board2=db.pcb_board.insert({center:{x:globalPos.x,y:globalPos.y},width:props.width??0,height:props.height??0,is_mounted_to_carrier_board:!0});this.pcb_board_id=pcb_board2.pcb_board_id}doInitialPcbBoardAutoSize(){if(!this.pcb_board_id||!this.root)return;let carrierBoardId=this._findCarrierBoardId();carrierBoardId&&this.root.db.pcb_board.update(this.pcb_board_id,{carrier_pcb_board_id:carrierBoardId})}_findCarrierBoardId(){let current2=this.parent;for(;current2;){if(current2 instanceof Board)return current2.pcb_board_id;current2=current2.parent}return null}},DEFAULT_TAB_LENGTH=5,DEFAULT_TAB_WIDTH=2,generateCutoutsAndMousebitesForOutline=(outline,options)=>{let{gapLength,cutoutWidth,mouseBites,mouseBiteHoleDiameter,mouseBiteHoleSpacing}=options,tabCutouts=[],mouseBiteHoles=[];if(outline.length<2)return{tabCutouts,mouseBiteHoles};let outlinePolygon=new Polygon$1(outline.map(p4=>point4(p4.x,p4.y))),is_ccw;if(outline.length>2){let p02=point4(outline[0].x,outline[0].y),p12=point4(outline[1].x,outline[1].y),segmentDir=vector$1(p02,p12).normalize(),normalToLeft=segmentDir.rotate(Math.PI/2),testPoint=p02.translate(segmentDir.multiply(segment(p02,p12).length/2)).translate(normalToLeft.multiply(.01));is_ccw=outlinePolygon.contains(testPoint)}else is_ccw=outlinePolygon.area()>0;for(let i2=0;i2<outline.length;i2++){let p1_=outline[i2],p2_=outline[(i2+1)%outline.length];if(!p1_||!p2_)continue;let p12=point4(p1_.x,p1_.y),p22=point4(p2_.x,p2_.y),segment2=segment(p12,p22),segmentLength=segment2.length;if(segmentLength<1e-6)continue;let segmentVec=vector$1(p12,p22),segmentDir=segmentVec.normalize(),normalVec=segmentDir.rotate(Math.PI/2),testPoint=segment2.middle().translate(normalVec.multiply(.01));outlinePolygon.contains(testPoint)&&(normalVec=normalVec.multiply(-1));let numBitesInGap=2,totalBitesLength=numBitesInGap*mouseBiteHoleDiameter+(numBitesInGap-1)*mouseBiteHoleSpacing,effectiveGapLength;mouseBites?effectiveGapLength=totalBitesLength:effectiveGapLength=gapLength,effectiveGapLength=Math.min(effectiveGapLength,segmentLength*.9);let gapStartDist=(segmentLength-effectiveGapLength)/2,gapEndDist=gapStartDist+effectiveGapLength;if(mouseBites){let holeAndSpacing=mouseBiteHoleDiameter+mouseBiteHoleSpacing;if(effectiveGapLength>=totalBitesLength&&holeAndSpacing>0){let firstBiteCenterOffsetInGap=(effectiveGapLength-totalBitesLength)/2+mouseBiteHoleDiameter/2,firstBiteDistFromP1=gapStartDist+firstBiteCenterOffsetInGap;for(let k4=0;k4<numBitesInGap;k4++){let biteDist=firstBiteDistFromP1+k4*holeAndSpacing,pos=p12.translate(segmentDir.multiply(biteDist));mouseBiteHoles.push({x:pos.x,y:pos.y})}}}let p_prev_=outline[(i2-1+outline.length)%outline.length],p_next_=outline[(i2+2)%outline.length],start_ext=0,end_ext=0;if(p_prev_&&p_next_){let vec_in_p1=vector$1(point4(p_prev_.x,p_prev_.y),p12),p1_cross=vec_in_p1.cross(segmentVec),is_p1_convex=is_ccw?p1_cross>1e-9:p1_cross<-1e-9,vec_out_p2=vector$1(p22,point4(p_next_.x,p_next_.y)),p2_cross=segmentVec.cross(vec_out_p2),is_p2_convex=is_ccw?p2_cross>1e-9:p2_cross<-1e-9;if(is_p1_convex){let angle=vec_in_p1.angleTo(segmentVec);angle>Math.PI&&(angle=2*Math.PI-angle),start_ext=cutoutWidth*Math.tan(angle/2)}else start_ext=0;if(is_p2_convex){let angle=segmentVec.angleTo(vec_out_p2);angle>Math.PI&&(angle=2*Math.PI-angle),end_ext=cutoutWidth*Math.tan(angle/2)}else end_ext=0}let cutoutParts=[{start:0-start_ext,end:gapStartDist},{start:gapEndDist,end:segmentLength+end_ext}],extrusion=normalVec.multiply(cutoutWidth);for(let part of cutoutParts){let partLength=part.end-part.start;if(partLength<1e-6)continue;let center2=p12.translate(segmentDir.multiply(part.start+partLength/2)).translate(extrusion.multiply(.5)),width=partLength,height=cutoutWidth,rotationDeg=segmentDir.slope*180/Math.PI;tabCutouts.push({type:"pcb_cutout",shape:"rect",center:{x:center2.x,y:center2.y},width,height,rotation:rotationDeg,corner_radius:cutoutWidth/2})}}return{tabCutouts,mouseBiteHoles}};function generatePanelTabsAndMouseBites(boards,options){let finalTabCutouts=[],allMouseBites=[],{tabWidth,tabLength,mouseBites:useMouseBites}=options,boardDimensions=[];for(let board of boards)if(board.width&&board.height)boardDimensions.push(Math.min(board.width,board.height));else if(board.outline&&board.outline.length>0){let outlinePolygon=new Polygon$1(board.outline.map(p4=>point4(p4.x,p4.y))),area=Math.abs(outlinePolygon.area());area>0&&boardDimensions.push(Math.sqrt(area))}if(boardDimensions.length>0){let scaleFactor=Math.min(...boardDimensions)/20;tabWidth=Math.min(tabWidth,DEFAULT_TAB_WIDTH*Math.max(scaleFactor,.3)),tabLength=Math.min(tabLength,DEFAULT_TAB_LENGTH*Math.max(scaleFactor,.3))}let processedBoards=boards.map(board=>{if((!board.outline||board.outline.length===0)&&board.width&&board.height){let w22=board.width/2,h22=board.height/2;return{...board,outline:[{x:board.center.x-w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y+h22},{x:board.center.x-w22,y:board.center.y+h22}]}}return board});for(let board of processedBoards)if(board.outline&&board.outline.length>0){let mouseBiteDiameter2=tabWidth*.45,mouseBiteSpacing=mouseBiteDiameter2*.1,generated=generateCutoutsAndMousebitesForOutline(board.outline,{gapLength:tabLength,cutoutWidth:tabWidth,mouseBites:useMouseBites,mouseBiteHoleDiameter:mouseBiteDiameter2,mouseBiteHoleSpacing:mouseBiteSpacing});finalTabCutouts.push(...generated.tabCutouts),allMouseBites.push(...generated.mouseBiteHoles)}let tabCutouts=finalTabCutouts.map((tab,index)=>({...tab,pcb_cutout_id:`panel_tab_${index}`})),mouseBiteDiameter=tabWidth*.45,mouseBiteHoles=allMouseBites.map((bite,index)=>({type:"pcb_hole",pcb_hole_id:`panel_mouse_bite_${index}`,hole_shape:"circle",hole_diameter:mouseBiteDiameter,x:bite.x,y:bite.y}));return{tabCutouts,mouseBiteHoles}}var getBoardDimensionsFromProps=board=>{let props=board._parsedProps,width=props.width!=null?distance.parse(props.width):void 0,height=props.height!=null?distance.parse(props.height):void 0;if((width===void 0||height===void 0)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}if((width===void 0||height===void 0)&&props.circuitJson?.length){let pcbBoardFromJson=props.circuitJson.find(elm=>elm.type==="pcb_board");pcbBoardFromJson&&(width??(width=pcbBoardFromJson.width),height??(height=pcbBoardFromJson.height))}return{width:width??0,height:height??0}};function calculateOptimalGrid({boardsWithDims,availableWidth,availableHeight,boardGap,minCellWidth,minCellHeight}){let boardCount=boardsWithDims.length;if(boardCount===0)return{rows:0,cols:0};let maxBoardWidth=Math.max(...boardsWithDims.map(b3=>b3.width),minCellWidth),maxBoardHeight=Math.max(...boardsWithDims.map(b3=>b3.height),minCellHeight),maxCols=Math.max(1,Math.floor((availableWidth+boardGap)/(maxBoardWidth+boardGap))),maxRows=Math.max(1,Math.floor((availableHeight+boardGap)/(maxBoardHeight+boardGap))),bestCols=maxCols,bestRows=Math.ceil(boardCount/bestCols);return bestRows>maxRows&&(bestRows=maxRows,bestCols=Math.ceil(boardCount/bestRows),bestCols>maxCols&&(bestCols=maxCols,bestRows=Math.ceil(boardCount/bestCols))),{rows:Math.max(1,bestRows),cols:Math.max(1,bestCols)}}var packBoardsIntoGrid=({boards,db,row,col,cellWidth,cellHeight,boardGap,availablePanelWidth,availablePanelHeight})=>{let boardsWithDims=boards.map(board=>{let width,height;if(db&&board.pcb_board_id){let pcbBoard=db.pcb_board.get(board.pcb_board_id);pcbBoard?.width!==void 0&&pcbBoard?.height!==void 0&&(width=pcbBoard.width,height=pcbBoard.height)}if(width===void 0||height===void 0){let propsDims=getBoardDimensionsFromProps(board);width=propsDims.width,height=propsDims.height}return width===0&&height===0?null:{board,width,height}}).filter(b3=>b3!==null);if(boardsWithDims.length===0)return{positions:[],gridWidth:0,gridHeight:0};let explicitRow=row,explicitCol=col,cols,rows;if(explicitCol!==void 0)cols=explicitCol,rows=explicitRow??Math.ceil(boardsWithDims.length/cols);else if(explicitRow!==void 0)rows=explicitRow,cols=Math.ceil(boardsWithDims.length/rows);else if(availablePanelWidth!==void 0&&availablePanelHeight!==void 0){let result=calculateOptimalGrid({boardsWithDims,availableWidth:availablePanelWidth,availableHeight:availablePanelHeight,boardGap,minCellWidth:cellWidth?distance.parse(cellWidth):0,minCellHeight:cellHeight?distance.parse(cellHeight):0});cols=result.cols,rows=result.rows}else cols=Math.ceil(Math.sqrt(boardsWithDims.length)),rows=Math.ceil(boardsWithDims.length/cols);let colWidths=Array(cols).fill(0),rowHeights=Array(rows).fill(0);boardsWithDims.forEach((b3,i2)=>{let colIdx=i2%cols,rowIdx=Math.floor(i2/cols);rowIdx<rowHeights.length&&b3.height>rowHeights[rowIdx]&&(rowHeights[rowIdx]=b3.height),colIdx<colWidths.length&&b3.width>colWidths[colIdx]&&(colWidths[colIdx]=b3.width)});let minCellWidth=cellWidth?distance.parse(cellWidth):0,minCellHeight=cellHeight?distance.parse(cellHeight):0;for(let i2=0;i2<colWidths.length;i2++)colWidths[i2]=Math.max(colWidths[i2],minCellWidth);for(let i2=0;i2<rowHeights.length;i2++)rowHeights[i2]=Math.max(rowHeights[i2],minCellHeight);let totalGridWidth=colWidths.reduce((a2,b3)=>a2+b3,0)+(cols>1?(cols-1)*boardGap:0),totalGridHeight=rowHeights.reduce((a2,b3)=>a2+b3,0)+(rows>1?(rows-1)*boardGap:0),startX=-totalGridWidth/2,rowYOffsets=[-totalGridHeight/2];for(let i2=1;i2<rows;i2++)rowYOffsets.push(rowYOffsets[i2-1]+rowHeights[i2-1]+boardGap);let colXOffsets=[startX];for(let i2=1;i2<cols;i2++)colXOffsets.push(colXOffsets[i2-1]+colWidths[i2-1]+boardGap);let positions=[];return boardsWithDims.forEach((b3,i2)=>{let colIdx=i2%cols,rowIdx=Math.floor(i2/cols);if(rowIdx>=rowYOffsets.length||colIdx>=colXOffsets.length)return;let cellX=colXOffsets[colIdx],cellY=rowYOffsets[rowIdx],currentCellWidth=colWidths[colIdx],currentCellHeight=rowHeights[rowIdx],boardX=cellX+currentCellWidth/2,boardY=cellY+currentCellHeight/2;positions.push({board:b3.board,pos:{x:boardX,y:boardY}})}),{positions,gridWidth:totalGridWidth,gridHeight:totalGridHeight}},Subpanel=class _Subpanel extends Group6{constructor(){super(...arguments);__publicField(this,"pcb_panel_id",null);__publicField(this,"_tabsAndMouseBitesGenerated",!1);__publicField(this,"_cachedGridWidth",0);__publicField(this,"_cachedGridHeight",0)}get config(){return{componentName:"Subpanel",zodProps:subpanelProps}}get _errorComponentName(){return this.componentName.toLowerCase()}get isGroup(){return!0}get isSubcircuit(){return!0}add(component){if(component.lowercaseComponentName!=="board"&&component.lowercaseComponentName!=="subpanel")throw new Error(`<${this._errorComponentName}> can only contain <board> or <subpanel> elements`);super.add(component)}_getAllBoardInstances(){let boards=[];for(let child of this.children)child instanceof Board?boards.push(child):child instanceof _Subpanel&&boards.push(...child._getAllBoardInstances());return boards}_containsBoards(){for(let child of this.children)if(child.componentName==="Board"||child.componentName==="Subpanel"&&"_containsBoards"in child&&child._containsBoards())return!0;return!1}_getDirectBoardChildren(){return this.children.filter(c3=>c3 instanceof Board)}doInitialPanelBoardLayout(){if(this.root?.pcbDisabled)return;let layoutMode=this._parsedProps.layoutMode??"none",childBoardInstances=this._getDirectBoardChildren();if(layoutMode!=="none")for(let board of childBoardInstances){let hasPcbX=board._parsedProps.pcbX!==void 0,hasPcbY=board._parsedProps.pcbY!==void 0;if(hasPcbX||hasPcbY){let properties=[];hasPcbX&&properties.push("pcbX"),hasPcbY&&properties.push("pcbY");let propertyNames=properties.join(" and ");this.root.db.source_property_ignored_warning.insert({source_component_id:board.source_component_id,property_name:propertyNames,message:`Board has manual positioning (${propertyNames}) but ${this._errorComponentName} layout mode is "${layoutMode}". Manual positioning will be ignored.`,error_type:"source_property_ignored_warning"})}}if(layoutMode==="none"&&childBoardInstances.length>1&&childBoardInstances.filter(board=>{let hasPcbX=board._parsedProps.pcbX!==void 0,hasPcbY=board._parsedProps.pcbY!==void 0;return!hasPcbX&&!hasPcbY}).length>1&&this.root.db.pcb_placement_error.insert({error_type:"pcb_placement_error",message:`Multiple boards in ${this._errorComponentName} without pcbX/pcbY positions. When layoutMode="none", each board must have explicit pcbX and pcbY coordinates to avoid overlapping. Either set pcbX/pcbY on each board, or use layoutMode="grid" for automatic positioning.`}),layoutMode!=="grid")return;let tabWidth=this._parsedProps.tabWidth??DEFAULT_TAB_WIDTH,boardGap=this._parsedProps.boardGap??tabWidth,availablePanelWidth,availablePanelHeight,hasExplicitRowOrCol=this._parsedProps.row!==void 0||this._parsedProps.col!==void 0,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0;if(!hasExplicitRowOrCol&&hasExplicitWidth&&hasExplicitHeight){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding),panelWidth=distance.parse(this._parsedProps.width),panelHeight=distance.parse(this._parsedProps.height);availablePanelWidth=panelWidth-edgePaddingLeft-edgePaddingRight,availablePanelHeight=panelHeight-edgePaddingTop-edgePaddingBottom}let{positions,gridWidth,gridHeight}=packBoardsIntoGrid({boards:childBoardInstances,row:this._parsedProps.row,col:this._parsedProps.col,cellWidth:this._parsedProps.cellWidth,cellHeight:this._parsedProps.cellHeight,boardGap,availablePanelHeight,availablePanelWidth});this._cachedGridWidth=gridWidth,this._cachedGridHeight=gridHeight;for(let{board,pos}of positions)board._panelPositionOffset=pos}doInitialPanelLayout(){if(this.root?.pcbDisabled)return;let{db}=this.root,childBoardInstances=this._getDirectBoardChildren();if((this._parsedProps.layoutMode??"none")==="grid"){for(let board of childBoardInstances)!board.pcb_board_id||!board._panelPositionOffset||db.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${board._panelPositionOffset.x}mm`,display_offset_y:`${board._panelPositionOffset.y}mm`});this._updatePanelDimensions()}else{let panelGlobalPos=this._getGlobalPcbPositionBeforeLayout();for(let board of childBoardInstances){let boardDb=db.pcb_board.get(board.pcb_board_id);if(!boardDb)continue;let relativeX=boardDb.center.x-panelGlobalPos.x,relativeY=boardDb.center.y-panelGlobalPos.y;db.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${relativeX}mm`,display_offset_y:`${relativeY}mm`})}}this._generateTabsAndMouseBites()}_updatePanelDimensions(){let{db}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_group_id){if(hasExplicitWidth&&hasExplicitHeight)db.pcb_group.update(this.pcb_group_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db.pcb_group.update(this.pcb_group_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}_generateTabsAndMouseBites(){if(this._tabsAndMouseBitesGenerated)return;let{db}=this.root,props=this._parsedProps,panelizationMethod=props.panelizationMethod??"none",childBoardInstances=this._getDirectBoardChildren();if(panelizationMethod!=="none"){let childBoardIds=childBoardInstances.map(c3=>c3.pcb_board_id).filter(id2=>!!id2),boardsInPanel=db.pcb_board.list().filter(b3=>childBoardIds.includes(b3.pcb_board_id));if(boardsInPanel.length===0)return;let tabWidth=props.tabWidth??DEFAULT_TAB_WIDTH,boardGap=props.boardGap??tabWidth,{tabCutouts,mouseBiteHoles}=generatePanelTabsAndMouseBites(boardsInPanel,{boardGap,tabWidth,tabLength:props.tabLength??DEFAULT_TAB_LENGTH,mouseBites:props.mouseBites??!0});for(let tabCutout of tabCutouts)db.pcb_cutout.insert(tabCutout);for(let mouseBiteHole of mouseBiteHoles)db.pcb_hole.insert(mouseBiteHole)}this._tabsAndMouseBitesGenerated=!0}doInitialPcbComponentRender(){if(!this.root?.pcbDisabled){if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);super.doInitialPcbComponentRender()}}},Panel=class extends Subpanel{get config(){return{componentName:"Panel",zodProps:panelProps}}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);let{db}=this.root,props=this._parsedProps,inserted=db.pcb_panel.insert({width:props.width!==void 0?distance.parse(props.width):0,height:props.height!==void 0?distance.parse(props.height):0,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)});this.pcb_panel_id=inserted.pcb_panel_id}_updatePanelDimensions(){let{db}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_panel_id){if(hasExplicitWidth&&hasExplicitHeight)db.pcb_panel.update(this.pcb_panel_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db.pcb_panel.update(this.pcb_panel_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}updatePcbComponentRender(){if(this.root?.pcbDisabled||!this.pcb_panel_id)return;let{db}=this.root,props=this._parsedProps,currentPanel=db.pcb_panel.get(this.pcb_panel_id);db.pcb_panel.update(this.pcb_panel_id,{width:props.width!==void 0?distance.parse(props.width):currentPanel?.width,height:props.height!==void 0?distance.parse(props.height):currentPanel?.height,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)})}removePcbComponentRender(){this.pcb_panel_id&&(this.root?.db.pcb_panel.delete(this.pcb_panel_id),this.pcb_panel_id=null)}},Pinout=class extends Chip{constructor(props){super(props)}get config(){return{...super.config,componentName:"Pinout",zodProps:pinoutProps}}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_pinout",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Fuse=class extends NormalComponent3{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:fuseProps,sourceFtype:FTYPE.simple_fuse}}_getSchematicSymbolDisplayValue(){let rawCurrent=this._parsedProps.currentRating,rawVoltage=this._parsedProps.voltageRating,current2=typeof rawCurrent=="string"?parseFloat(rawCurrent):rawCurrent,voltage2=typeof rawVoltage=="string"?parseFloat(rawVoltage):rawVoltage;return`${formatSiUnit(current2)}A / ${formatSiUnit(voltage2)}V`}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,currentRating=typeof props.currentRating=="string"?parseFloat(props.currentRating):props.currentRating,voltageRating=typeof props.voltageRating=="string"?parseFloat(props.voltageRating):props.voltageRating,source_component=db.source_component.insert({name:this.name,ftype:FTYPE.simple_fuse,current_rating_amps:currentRating,voltage_rating_volts:voltageRating,display_current_rating:`${formatSiUnit(currentRating)}A`,display_voltage_rating:`${formatSiUnit(voltageRating)}V`,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Jumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}get config(){return{schematicSymbolName:void 0,componentName:"Jumper",zodProps:jumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length),direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),pcb_component2=db.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialPcbTraceRender(){let{db}=this.root,pcb_ports=db.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i2=0;i2<pcb_ports.length;i2++){let port=pcb_ports[i2],sourcePort=db.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h4=>/^(pin)?\d+$/.test(h4));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},INTERCONNECT_STANDARD_FOOTPRINTS={"0402":"0402","0603":"0603","0805":"0805",1206:"1206"},Interconnect=class extends NormalComponent3{get config(){return{componentName:"Interconnect",zodProps:interconnectProps,shouldRenderAsSchematicBox:!0,sourceFtype:"interconnect"}}get defaultInternallyConnectedPinNames(){let{standard}=this._parsedProps;return standard&&INTERCONNECT_STANDARD_FOOTPRINTS[standard]?[["pin1","pin2"]]:[]}_getImpliedFootprintString(){let{standard}=this._parsedProps;return standard?INTERCONNECT_STANDARD_FOOTPRINTS[standard]??null:null}doInitialSourceRender(){let{db}=this.root,source_component=db.source_component.insert({ftype:"interconnect",name:this.name,are_pins_interchangeable:!0,display_name:this._parsedProps.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db}=this.root,internallyConnectedPorts=this._getInternallyConnectedPins();for(let ports of internallyConnectedPorts){let sourcePortIds=ports.map(port=>port.source_port_id).filter(id2=>id2!==null);sourcePortIds.length>=2&&db.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}}},SolderJumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}_getPinNumberFromBridgedPinName(pinName){return this.selectOne(`port.${pinName}`,{type:"port"})?._parsedProps.pinNumber??null}get defaultInternallyConnectedPinNames(){if(this._parsedProps.bridged){let pins=this.children.filter(c3=>c3.componentName==="Port").map(p4=>p4.name);return pins.length>0?[pins]:[]}return this._parsedProps.bridgedPins??[]}get config(){let props=this._parsedProps??this.props,resolvedPinCount=props.pinCount;if(props.pinCount==null&&!props.footprint&&(resolvedPinCount=2),props.pinCount==null){let nums=(props.bridgedPins??[]).flat().map(p_str=>this._getPinNumberFromBridgedPinName(p_str)).filter(n3=>n3!==null),maxPinFromBridged=nums.length>0?Math.max(...nums):0,pinCountFromLabels=props.pinLabels?Object.keys(props.pinLabels).length:0,finalPinCount=Math.max(maxPinFromBridged,pinCountFromLabels);(finalPinCount===2||finalPinCount===3)&&(resolvedPinCount=finalPinCount),resolvedPinCount==null&&props.footprint&&[2,3].includes(this.getPortsFromFootprint().length)&&(resolvedPinCount=this.getPortsFromFootprint().length)}let symbolName="";resolvedPinCount?symbolName+=`solderjumper${resolvedPinCount}`:symbolName="solderjumper";let bridgedPinNumbers=[];return Array.isArray(props.bridgedPins)&&props.bridgedPins.length>0?bridgedPinNumbers=Array.from(new Set(props.bridgedPins.flat().map(pinName=>this._getPinNumberFromBridgedPinName(pinName)).filter(n3=>n3!==null))).sort((a2,b3)=>a2-b3):props.bridged&&resolvedPinCount&&(bridgedPinNumbers=Array.from({length:resolvedPinCount},(_5,i2)=>i2+1)),bridgedPinNumbers.length>0&&(symbolName+=`_bridged${bridgedPinNumbers.join("")}`),{schematicSymbolName:props.symbolName??symbolName,componentName:"SolderJumper",zodProps:solderjumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length);pinCount==null&&!this._parsedProps.footprint&&(pinCount=2);let direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),pcb_component2=db.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialPcbTraceRender(){let{db}=this.root,pcb_ports=db.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i2=0;i2<pcb_ports.length;i2++){let port=pcb_ports[i2],sourcePort=db.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h4=>/^(pin)?\d+$/.test(h4));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},Led=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return this._parsedProps.schDisplayValue||this._parsedProps.color||void 0}getFootprinterString(){let baseFootprint=super.getFootprinterString();return baseFootprint&&this.props.color?`${baseFootprint}_color(${this.props.color})`:baseFootprint}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_led",name:this.name,wave_length:props.wavelength,color:props.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},PowerSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"positive",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"negative",this.portMap.pin2)}get config(){return{schematicSymbolName:this.props.symbolName??"power_factor_meter_horz",componentName:"PowerSource",zodProps:powerSourceProps,sourceFtype:"simple_power_source"}}initPorts(){this.add(new Port({name:"pin1",pinNumber:1,aliases:["positive","pos"]})),this.add(new Port({name:"pin2",pinNumber:2,aliases:["negative","neg"]}))}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:props.voltage,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},VoltageSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"terminal1",this.portMap.terminal1);__publicField(this,"terminal2",this.portMap.terminal2)}get config(){return{componentName:"VoltageSource",schematicSymbolName:this.props.waveShape==="square"?"square_wave":"ac_voltmeter",zodProps:voltageSourceProps,sourceFtype:"simple_voltage_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){}initPorts(){super.initPorts({additionalAliases:{pin1:["terminal1"],pin2:["terminal2"]}})}_getSchematicSymbolDisplayValue(){let{voltage:voltage2,frequency:frequency2}=this._parsedProps,parts=[];return voltage2!==void 0&&parts.push(`${formatSiUnit(voltage2)}V`),frequency2!==void 0&&parts.push(`${formatSiUnit(frequency2)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_voltage_source",name:this.name,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db}=this.root,{_parsedProps:props}=this,terminal1Port=this.portMap.terminal1,terminal2Port=this.portMap.terminal2;db.simulation_voltage_source.insert({type:"simulation_voltage_source",is_dc_source:!1,terminal1_source_port_id:terminal1Port.source_port_id,terminal2_source_port_id:terminal2Port.source_port_id,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle})}},CurrentSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pos);__publicField(this,"neg",this.portMap.neg)}get config(){return{componentName:"CurrentSource",schematicSymbolName:"current_source",zodProps:currentSourceProps,sourceFtype:"simple_current_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){}initPorts(){super.initPorts({additionalAliases:{pin1:["pos"],pin2:["neg"]}})}_getSchematicSymbolDisplayValue(){let{current:current2,frequency:frequency2,peakToPeakCurrent}=this._parsedProps,parts=[];return current2!==void 0&&parts.push(`${formatSiUnit(current2)}A`),peakToPeakCurrent!==void 0&&parts.push(`${formatSiUnit(peakToPeakCurrent)}A p-p`),frequency2!==void 0&&parts.push(`${formatSiUnit(frequency2)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_current_source",name:this.name,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db}=this.root,{_parsedProps:props}=this,isAc=props.frequency!==void 0||props.peakToPeakCurrent!==void 0||props.waveShape!==void 0,posPort=this.portMap.pos,negPort=this.portMap.neg;if(isAc)db.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!1,terminal1_source_port_id:posPort.source_port_id,terminal2_source_port_id:negPort.source_port_id,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle});else{if(props.current===void 0)return;db.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!0,positive_source_port_id:posPort.source_port_id,negative_source_port_id:negPort.source_port_id,current:props.current})}}},edgeSpecifiers=["leftedge","rightedge","topedge","bottomedge","center"],Constraint3=class extends PrimitiveComponent2{get config(){return{componentName:"Constraint",zodProps:constraintProps}}constructor(props){if(super(props),("xdist"in props||"ydist"in props)&&!("edgeToEdge"in props)&&!("centerToCenter"in props))throw new Error(`edgeToEdge, centerToCenter must be set for xDist or yDist for ${this}`);if("for"in props&&props.for.length<2)throw new Error(`"for" must have at least two selectors for ${this}`)}_getAllReferencedComponents(){let componentsWithSelectors=[],container=this.getPrimitiveContainer();function addComponentFromSelector(selector){let maybeEdge=selector.split(" ").pop(),edge=edgeSpecifiers.includes(maybeEdge)?maybeEdge:void 0,componentSelector=edge?selector.replace(` ${edge}`,""):selector,component=container.selectOne(componentSelector,{pcbPrimitive:!0});component&&componentsWithSelectors.push({selector,component,componentSelector,edge})}for(let key of["left","right","top","bottom"])key in this._parsedProps&&addComponentFromSelector(this._parsedProps[key]);if("for"in this._parsedProps)for(let selector of this._parsedProps.for)addComponentFromSelector(selector);return{componentsWithSelectors}}},FabricationNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteDimension",zodProps:fabricationNoteDimensionProps}}_resolvePoint(input2,transform5){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(input2);return target?target._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${input2}"`),applyToPoint2(transform5,{x:0,y:0}))}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform5,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform5),to3=this._resolvePoint(props.to,transform5),subcircuit=this.getSubcircuit(),group=this.getGroup(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteDimension. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),fabrication_note_dimension=db.pcb_fabrication_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,layer,from,to:to3,text,offset:props.offset,font:props.font??"tscircuit2024",font_size:props.fontSize??1,color:props.color,arrow_size:props.arrowSize??1});this.fabrication_note_dimension_id=fabrication_note_dimension.pcb_fabrication_note_dimension_id}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.fabrication_note_dimension_id)return;let dimension=db.pcb_fabrication_note_dimension.get(this.fabrication_note_dimension_id);dimension&&db.pcb_fabrication_note_dimension.update(this.fabrication_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}getPcbSize(){let transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform5),to3=this._resolvePoint(this._parsedProps.to,transform5);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx2=to3.x-from.x,dy2=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx2*dx2+dy2*dy2),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}},PcbNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteDimension",zodProps:pcbNoteDimensionProps}}_resolvePoint(input2,transform5){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(`.${input2}`);if(!target)return this.renderError(`PcbNoteDimension could not find selector "${input2}"`),applyToPoint2(transform5,{x:0,y:0});let targetPcbComponentId=target.pcb_component_id,root=this.root;if(targetPcbComponentId&&root){let pcbComponent=root.db.pcb_component.get(targetPcbComponentId);if(pcbComponent?.center)return{x:pcbComponent.center.x,y:pcbComponent.center.y}}return target._getGlobalPcbPositionBeforeLayout()}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform5,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform5),to3=this._resolvePoint(props.to,transform5),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),pcb_note_dimension2=db.pcb_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,from,to:to3,text,font:props.font??"tscircuit2024",font_size:props.fontSize??1,color:props.color,arrow_size:props.arrowSize??1});this.pcb_note_dimension_id=pcb_note_dimension2.pcb_note_dimension_id}doInitialPcbLayout(){let root=this.root;if(!root||root.pcbDisabled||!this.pcb_note_dimension_id)return;let{db}=root,transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform5),to3=this._resolvePoint(this._parsedProps.to,transform5);db.pcb_note_dimension.update(this.pcb_note_dimension_id,{from,to:to3})}getPcbSize(){let transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform5),to3=this._resolvePoint(this._parsedProps.to,transform5);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx2=to3.x-from.x,dy2=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx2*dx2+dy2*dy2),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_note_dimension_id)return;let dimension=db.pcb_note_dimension.get(this.pcb_note_dimension_id);dimension&&db.pcb_note_dimension.update(this.pcb_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}},Breakout=class extends Group6{constructor(props){super({...props,subcircuit:!0})}doInitialPcbPrimitiveRender(){if(super.doInitialPcbPrimitiveRender(),this.root?.pcbDisabled)return;let{db}=this.root,props=this._parsedProps;if(!this.pcb_group_id)return;let pcb_group2=db.pcb_group.get(this.pcb_group_id),padLeft=props.paddingLeft??props.padding??0,padRight=props.paddingRight??props.padding??0,padTop=props.paddingTop??props.padding??0,padBottom=props.paddingBottom??props.padding??0;db.pcb_group.update(this.pcb_group_id,{width:(pcb_group2.width??0)+padLeft+padRight,height:(pcb_group2.height??0)+padTop+padBottom,center:{x:pcb_group2.center.x+(padRight-padLeft)/2,y:pcb_group2.center.y+(padTop-padBottom)/2}})}},BreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){let{connection}=this._parsedProps,subcircuit=this.getSubcircuit();subcircuit&&(this.matchedPort=subcircuit.selectOne(connection,{type:"port"}),this.matchedPort||(this.matchedNet=subcircuit.selectOne(connection,{type:"net"})),!this.matchedPort&&!this.matchedNet&&this.renderError(`Could not find connection target "${connection}"`))}_getSourceTraceIdForPort(port){let{db}=this.root;return db.source_trace.list().find(st4=>st4.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db}=this.root;return db.source_trace.list().find(st4=>st4.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root;this._matchConnection();let position2=this._getGlobalPcbPositionBeforeLayout(),group=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group||!group.pcb_group_id)return;let pcb_breakout_point2=db.pcb_breakout_point.insert({pcb_group_id:group.pcb_group_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,source_port_id:this.matchedPort?.source_port_id??void 0,source_trace_id:this.matchedPort?this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,x:position2.x,y:position2.y});this.pcb_breakout_point_id=pcb_breakout_point2.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let position2=this._getGlobalPcbPositionBeforeLayout();return{center:{x:position2.x,y:position2.y},bounds:{left:position2.x,top:position2.y,right:position2.x,bottom:position2.y},width:0,height:0}}_setPositionFromLayout(newCenter){let{db}=this.root;this.pcb_breakout_point_id&&db.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_breakout_point_id)return;let point6=db.pcb_breakout_point.get(this.pcb_breakout_point_id);point6&&db.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point6.x+deltaX,y:point6.y+deltaY})}getPcbSize(){return{width:0,height:0}}},NetLabel=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_label_id")}get config(){return{componentName:"NetLabel",zodProps:netLabelProps}}_getAnchorSide(){let{_parsedProps:props}=this;if(props.anchorSide)return props.anchorSide;if(!this._resolveConnectsTo())return"right";let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),connectedPorts=this._getConnectedPorts();if(connectedPorts.length===0)return"right";let connectedPortPosition=connectedPorts[0]._getGlobalSchematicPositionBeforeLayout(),dx2=connectedPortPosition.x-anchorPos.x,dy2=connectedPortPosition.y-anchorPos.y;if(Math.abs(dx2)>Math.abs(dy2)){if(dx2>0)return"right";if(dx2<0)return"left"}else{if(dy2>0)return"top";if(dy2<0)return"bottom"}return"right"}_getConnectedPorts(){let connectsTo=this._resolveConnectsTo();if(!connectsTo)return[];let connectedPorts=[];for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection);port&&connectedPorts.push(port)}return connectedPorts}computeSchematicPropsTransform(){let{_parsedProps:props}=this;if(props.schX===void 0&&props.schY===void 0){let connectedPorts=this._getConnectedPorts();if(connectedPorts.length>0){let portPos=connectedPorts[0]._getGlobalSchematicPositionBeforeLayout(),parentCenter=applyToPoint2(this.parent?.computeSchematicGlobalTransform?.()??identity(),{x:0,y:0});return translate2(portPos.x-parentCenter.x,portPos.y-parentCenter.y)}}return super.computeSchematicPropsTransform()}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,anchorPos=this._getGlobalSchematicPositionBeforeLayout(),net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),anchorSide=props.anchorSide??"right",center2=computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:anchorSide,text:props.net}),netLabel=db.schematic_net_label.insert({text:props.net,source_net_id:net.source_net_id,anchor_position:anchorPos,center:center2,anchor_side:this._getAnchorSide()});this.source_net_label_id=netLabel.source_net_id}_resolveConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo??props.connection;if(Array.isArray(connectsTo))return connectsTo;if(typeof connectsTo=="string")return[connectsTo]}_getNetName(){let{_parsedProps:props}=this;return props.net}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;props.net&&createNetsFromProps(this,[`net.${props.net}`])}doInitialCreateTracesFromNetLabels(){if(this.root?.schematicDisabled)return;let connectsTo=this._resolveConnectsTo();if(connectsTo)for(let connection of connectsTo)this.add(new Trace3({from:connection,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled)return;let{db}=this.root,connectsTo=this._resolveConnectsTo();if(!connectsTo||connectsTo.length===0)return;let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),anchorSide=this._getAnchorSide(),anchorFacing={left:"x-",right:"x+",top:"y+",bottom:"y-"}[anchorSide],net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`);for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection,{type:"port"});if(!port||!port.schematic_port_id)continue;let existingTraceForThisConnection=!1;if(net?.source_net_id){let candidateSourceTrace=db.source_trace.list().find(st4=>st4.connected_source_net_ids?.includes(net.source_net_id)&&st4.connected_source_port_ids?.includes(port.source_port_id??""));if(candidateSourceTrace&&(existingTraceForThisConnection=db.schematic_trace.list().some(t21=>t21.source_trace_id===candidateSourceTrace.source_trace_id)),existingTraceForThisConnection)continue}let portPos=port._getGlobalSchematicPositionAfterLayout(),portFacing=convertFacingDirectionToElbowDirection(port.facingDirection??"right")??"x+",path=calculateElbow({x:portPos.x,y:portPos.y,facingDirection:portFacing},{x:anchorPos.x,y:anchorPos.y,facingDirection:anchorFacing});if(!Array.isArray(path)||path.length<2)continue;let edges=[];for(let i2=0;i2<path.length-1;i2++)edges.push({from:{x:path[i2].x,y:path[i2].y},to:{x:path[i2+1].x,y:path[i2+1].y}});let source_trace_id,subcircuit_connectivity_map_key;if(net?.source_net_id&&port.source_port_id){let st4=db.source_trace.list().find(s2=>s2.connected_source_net_ids?.includes(net.source_net_id)&&s2.connected_source_port_ids?.includes(port.source_port_id));source_trace_id=st4?.source_trace_id,subcircuit_connectivity_map_key=st4?.subcircuit_connectivity_map_key||db.source_net.get(net.source_net_id)?.subcircuit_connectivity_map_key}db.schematic_trace.insert({source_trace_id,edges,junctions:[],subcircuit_connectivity_map_key}),db.schematic_port.update(port.schematic_port_id,{is_connected:!0})}}},CourtyardCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardCircle",zodProps:courtyardCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_circle2=db.pcb_courtyard_circle.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_circle_id=pcb_courtyard_circle2.pcb_courtyard_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_courtyard_circle_id)return;let circle2=db.pcb_courtyard_circle.get(this.pcb_courtyard_circle_id);circle2&&db.pcb_courtyard_circle.update(this.pcb_courtyard_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},CourtyardOutline=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_outline_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardOutline",zodProps:courtyardOutlineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardOutline. Must be "top" or "bottom".`);let transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_outline2=db.pcb_courtyard_outline.insert({pcb_component_id,layer,outline:props.outline.map(p4=>{let transformedPosition=applyToPoint2(transform5,{x:p4.x,y:p4.y});return{x:transformedPosition.x,y:transformedPosition.y}}),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_outline_id=pcb_courtyard_outline2.pcb_courtyard_outline_id}_setPositionFromLayout(newCenter){let{db}=this.root,currentOutline=db.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);if(!currentOutline)return;let currentCenterX=0,currentCenterY=0;for(let point6 of currentOutline.outline)currentCenterX+=point6.x,currentCenterY+=point6.y;currentCenterX/=currentOutline.outline.length,currentCenterY/=currentOutline.outline.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newOutline=currentOutline.outline.map(point6=>({x:point6.x+offsetX,y:point6.y+offsetY}));db.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:newOutline})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_courtyard_outline_id)return;let outline=db.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);outline&&db.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:outline.outline.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.outline||props.outline.length===0)return{width:0,height:0};let bounds=getBoundsFromPoints(props.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:{width:0,height:0}}},CourtyardRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardRect",zodProps:courtyardRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_rect2=db.pcb_courtyard_rect.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},width:props.width,height:props.height,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_rect_id=pcb_courtyard_rect2.pcb_courtyard_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_courtyard_rect_id)return;let rect=db.pcb_courtyard_rect.get(this.pcb_courtyard_rect_id);rect&&db.pcb_courtyard_rect.update(this.pcb_courtyard_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},Fiducial=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Fiducial",zodProps:fiducialProps,sourceFtype:"simple_fiducial"}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_smtpad2=db.pcb_smtpad.insert({pcb_component_id,layer:maybeFlipLayer(props.layer||"top"),shape:"circle",x:position2.x,y:position2.y,radius:distance.parse(props.padDiameter)/2,soldermask_margin:props.soldermaskPullback?distance.parse(props.soldermaskPullback):distance.parse(props.padDiameter)/2,is_covered_with_solder_mask:!0});this.pcb_smtpad_id=pcb_smtpad2.pcb_smtpad_id}getPcbSize(){let{_parsedProps:props}=this,d3=distance.parse(props.padDiameter);return{width:d3,height:d3}}_setPositionFromLayout(newCenter){if(!this.pcb_smtpad_id)return;let{db}=this.root;db.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db.pcb_smtpad.get(this.pcb_smtpad_id);pad2&&(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill"?this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY}):pad2.shape==="polygon"&&db.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))}))}},Via=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"pcb_via_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"source_manually_placed_via_id",null);__publicField(this,"subcircuit_connectivity_map_key",null);let layers=this._getLayers();this._parsedProps.layers=layers,this.initPorts()}get config(){return{componentName:"Via",zodProps:viaProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}_getResolvedViaDiameters(pcbStyle2){return getViaDiameterDefaultsWithOverrides({holeDiameter:this._parsedProps.holeDiameter,padDiameter:this._parsedProps.outerDiameter},pcbStyle2)}getPcbSize(){let pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2);return{width:padDiameter,height:padDiameter}}_getPcbCircuitJsonBounds(){let{db}=this.root,via=db.pcb_via.get(this.pcb_via_id),size2=this.getPcbSize();return{center:{x:via.x,y:via.y},bounds:{left:via.x-size2.width/2,top:via.y-size2.height/2,right:via.x+size2.width/2,bottom:via.y+size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db}=this.root;db.pcb_via.update(this.pcb_via_id,{x:newCenter.x,y:newCenter.y})}_getLayers(){let{fromLayer="top",toLayer="bottom"}=this._parsedProps;return fromLayer===toLayer?[fromLayer]:[fromLayer,toLayer]}initPorts(){let layers=this._parsedProps.layers;for(let layer of layers){let port2=new Port({name:layer,layer});port2.registerMatch(this),this.add(port2)}let port=new Port({name:"pin1"});port.registerMatch(this),this.add(port)}_getConnectedNetOrTrace(){let connectsTo=this._parsedProps.connectsTo;if(!connectsTo)return null;let subcircuit=this.getSubcircuit(),selectors=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let selector of selectors)if(selector.startsWith("net.")){let net=subcircuit.selectOne(selector,{type:"net"});if(net)return net}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position2=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component2=db.pcb_component.insert({center:position2,width:padDiameter,height:padDiameter,layer:this._parsedProps.fromLayer??"top",rotation:0,source_component_id:this.source_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,obstructs_within_bounds:!0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,group=this.getGroup(),subcircuit=this.getSubcircuit(),source_via=db.source_manually_placed_via.insert({source_group_id:group?.source_group_id,source_net_id:props.net??"",subcircuit_id:subcircuit?.subcircuit_id??void 0});this.source_component_id=source_via.source_manually_placed_via_id}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position2=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_via2=db.pcb_via.insert({x:position2.x,y:position2.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:["bottom","top"],from_layer:this._parsedProps.fromLayer||"bottom",to_layer:this._parsedProps.toLayer||"top",subcircuit_id:subcircuit?.subcircuit_id??void 0,subcircuit_connectivity_map_key:this.subcircuit_connectivity_map_key??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:this._parsedProps.netIsAssignable??void 0});this.pcb_via_id=pcb_via2.pcb_via_id;let connected=this._getConnectedNetOrTrace();connected&&"source_net_id"in connected&&connected.source_net_id&&db.pcb_via.update(this.pcb_via_id,{pcb_trace_id:connected.source_net_id})}},CopperPour=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CopperPour",zodProps:copperPourProps}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;createNetsFromProps(this,[props.connectsTo])}doInitialPcbCopperPourRender(){this.root?.pcbDisabled||this._queueAsyncEffect("PcbCopperPourRender",async()=>{let{db}=this.root,{_parsedProps:props}=this,net=this.getSubcircuit().selectOne(props.connectsTo);if(!net||!net.source_net_id){this.renderError(`Net "${props.connectsTo}" not found for copper pour`);return}let subcircuit=this.getSubcircuit(),circuitJson=db.toArray(),sourceNet=circuitJson.find(elm=>elm.type==="source_net"&&elm.name===net.name),connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson),connectedNetId=sourceNet?.source_net_id??net.source_net_id,pourConnectivityKey=(connectedNetId?connectivityMap.getNetConnectedToId(connectedNetId):void 0)||sourceNet?.subcircuit_connectivity_map_key||"",clearance=props.clearance??.2,inputProblem=convertCircuitJsonToInputProblem(circuitJson,{layer:props.layer,pour_connectivity_key:pourConnectivityKey,pad_margin:props.padMargin??clearance,trace_margin:props.traceMargin??clearance,board_edge_margin:props.boardEdgeMargin??clearance,cutout_margin:props.cutoutMargin??clearance,outline:props.outline}),solver=new CopperPourPipelineSolver(inputProblem);this.root.emit("solver:started",{solverName:"CopperPourPipelineSolver",solverParams:inputProblem,componentName:this.props.name});let{brep_shapes}=solver.getOutput(),coveredWithSolderMask=props.coveredWithSolderMask??!1;for(let brep_shape2 of brep_shapes)db.pcb_copper_pour.insert({shape:"brep",layer:props.layer,brep_shape:brep_shape2,source_net_id:net.source_net_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,covered_with_solder_mask:coveredWithSolderMask})})}},CopperText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"pcb_copper_text_id",null)}get config(){return{componentName:"CopperText",zodProps:copperTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),position2=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_copper_text2=db.pcb_copper_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:"tscircuit2024",font_size:props.fontSize,layer:props.layer??"top",text:normalizeTextForCircuitJson(props.text),ccw_rotation:props.pcbRotation,is_mirrored:props.mirrored,is_knockout:props.knockout,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_copper_text_id=pcb_copper_text2.pcb_copper_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=props.fontSize??1,textWidth=(props.text??"").length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db}=this.root;if(!this.pcb_copper_text_id)return;let text=db.pcb_copper_text.get(this.pcb_copper_text_id);text&&db.pcb_copper_text.update(this.pcb_copper_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},Battery=class extends NormalComponent3{get config(){return{componentName:"Battery",schematicSymbolName:this.props.symbolName??"battery",zodProps:batteryProps,sourceFtype:"simple_power_source"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:props.capacity,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},PinHeader=class extends NormalComponent3{_getPcbRotationBeforeLayout(){let orientationRotation=this.props.pcbOrientation==="vertical"?-90:0;return(super._getPcbRotationBeforeLayout()??0)+orientationRotation}get config(){return{componentName:"PinHeader",zodProps:pinHeaderProps,shouldRenderAsSchematicBox:!0}}_getImpliedFootprintString(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:0),holeDiameter=this._parsedProps.holeDiameter,platedDiameter=this._parsedProps.platedDiameter,pitch=this._parsedProps.pitch,showSilkscreenPinLabels=this._parsedProps.showSilkscreenPinLabels,rows=this._parsedProps.doubleRow?2:1;if(pinCount>0){let footprintString;if(pitch)!holeDiameter&&!platedDiameter?footprintString=`pinrow${pinCount}_p${pitch}`:footprintString=`pinrow${pinCount}_p${pitch}_id${holeDiameter}_od${platedDiameter}`;else if(!holeDiameter&&!platedDiameter)footprintString=`pinrow${pinCount}`;else return null;return showSilkscreenPinLabels!==!0&&(footprintString+="_nopinlabels"),rows>1&&(footprintString+=`_rows${rows}`),footprintString}return null}initPorts(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:1);for(let i2=1;i2<=pinCount;i2++){let rawLabel=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[i2-1]:this._parsedProps.pinLabels?.[`pin${i2}`];if(rawLabel){let primaryLabel=Array.isArray(rawLabel)?rawLabel[0]:rawLabel,otherLabels=Array.isArray(rawLabel)?rawLabel.slice(1):[];this.add(new Port({pinNumber:i2,name:primaryLabel,aliases:[`pin${i2}`,...otherLabels]}))}else this.add(new Port({pinNumber:i2,name:`pin${i2}`}))}}_getSchematicPortArrangement(){let pinCount=this._parsedProps.pinCount??1,facingDirection=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",schPinArrangement=this._parsedProps.schPinArrangement;return facingDirection==="left"?{leftSide:{direction:schPinArrangement?.leftSide?.direction??"top-to-bottom",pins:schPinArrangement?.leftSide?.pins??Array.from({length:pinCount},(_5,i2)=>`pin${i2+1}`)}}:{rightSide:{direction:schPinArrangement?.rightSide?.direction??"top-to-bottom",pins:schPinArrangement?.rightSide?.pins??Array.from({length:pinCount},(_5,i2)=>`pin${i2+1}`)}}}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:props.supplierPartNumbers,pin_count:props.pinCount,gender:props.gender,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function getResonatorSymbolName(variant){switch(variant){case"two_ground_pins":return"crystal_4pin";case"ground_pin":return"resonator";case"no_ground":return"crystal";default:return"crystal"}}var Resonator=class extends NormalComponent3{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??getResonatorSymbolName(this.props.pinVariant),zodProps:resonatorProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"no_ground",source_component=db.source_component.insert({ftype:"simple_resonator",name:this.name,frequency:props.frequency,load_capacitance:props.loadCapacitance,supplier_part_numbers:props.supplierPartNumbers,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="no_ground"||pinVariant==="ground_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}};function getPotentiometerSymbolName(variant){switch(variant){case"three_pin":return"potentiometer3";case"two_pin":return"potentiometer2";default:return"potentiometer2"}}var Potentiometer=class extends NormalComponent3{get config(){return{componentName:"Potentiometer",schematicSymbolName:this.props.symbolName??getPotentiometerSymbolName(this.props.pinVariant),zodProps:potentiometerProps,shouldRenderAsSchematicBox:!1}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.maxResistance)}\u03A9`}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"two_pin",source_component=db.source_component.insert({ftype:"simple_potentiometer",name:this.name,max_resistance:props.maxResistance,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="two_pin",display_name:props.displayName,display_max_resistance:this._getSchematicSymbolDisplayValue()});this.source_component_id=source_component.source_component_id}},PushButton=class extends NormalComponent3{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:pushButtonProps,sourceFtype:FTYPE.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let symbol=Vf[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p4=>p4.labels.includes("1")),symPort2=symbol.ports.find(p4=>p4.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p4=>p4.props.pinNumber===1),pin2Port=ports.find(p4=>p4.props.pinNumber===2),pin3Port=ports.find(p4=>p4.props.pinNumber===3),pin4Port=ports.find(p4=>p4.props.pinNumber===4),{internallyConnectedPins}=this._parsedProps;pin1Port.schematicSymbolPortDef=symPort1,(!internallyConnectedPins||internallyConnectedPins.length===0)&&(pin2Port.schematicSymbolPortDef=symPort2);for(let[pn3,port]of[[2,pin2Port],[3,pin3Port],[4,pin4Port]]){let internallyConnectedRow=internallyConnectedPins?.find(([pin1,pin2])=>pin1===`pin${pn3}`||pin2===`pin${pn3}`);if(!internallyConnectedRow){port.schematicSymbolPortDef=symPort2;break}(internallyConnectedRow?.[0]===`pin${pn3}`?internallyConnectedRow[1]:internallyConnectedRow?.[0])!=="pin1"&&(port.schematicSymbolPortDef=symPort2)}}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Crystal=class extends NormalComponent3{get config(){return{schematicSymbolName:this.props.symbolName??(this.props.pinVariant==="four_pin"?"crystal_4pin":"crystal"),componentName:"Crystal",zodProps:crystalProps,sourceFtype:"simple_crystal"}}initPorts(){let additionalAliases=this.props.pinVariant==="four_pin"?{pin1:["left1","1"],pin2:["top1","2","gnd1"],pin3:["right1","3"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left"],pin2:["neg","right"]};super.initPorts({additionalAliases})}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({name:this.name,ftype:"simple_crystal",frequency:props.frequency,load_capacitance:props.loadCapacitance,pin_variant:props.pinVariant||"two_pin",are_pins_interchangeable:(props.pinVariant||"two_pin")==="two_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Mosfet=class extends NormalComponent3{get config(){let mosfetMode=this.props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${this.props.channelType}_channel_${mosfetMode}_mosfet_transistor`;return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_mosfet",name:this.name,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},OpAmp=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"inverting_input",this.portMap.inverting_input);__publicField(this,"non_inverting_input",this.portMap.non_inverting_input);__publicField(this,"output",this.portMap.output);__publicField(this,"positive_supply",this.portMap.positive_supply);__publicField(this,"negative_supply",this.portMap.negative_supply)}get config(){let hasPowerConnections=this.props.connections?.positive_supply||this.props.connections?.negative_supply;return{componentName:"OpAmp",schematicSymbolName:this.props.symbolName?this.props.symbolName:hasPowerConnections?"opamp_with_power":"opamp_no_power",zodProps:opampProps,sourceFtype:"simple_op_amp"}}initPorts(){super.initPorts({pinCount:5,additionalAliases:{pin1:["non_inverting_input"],pin2:["inverting_input"],pin3:["output"],pin4:["positive_supply","vcc","vdd"],pin5:["negative_supply","vee","vss","gnd"]}})}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,source_component=db.source_component.insert({ftype:"simple_op_amp",name:this.name,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db}=this.root,invertingInputPort=this.portMap.inverting_input,nonInvertingInputPort=this.portMap.non_inverting_input,outputPort=this.portMap.output,positiveSupplyPort=this.portMap.positive_supply,negativeSupplyPort=this.portMap.negative_supply;!invertingInputPort?.source_port_id||!nonInvertingInputPort?.source_port_id||!outputPort?.source_port_id||!positiveSupplyPort?.source_port_id||!negativeSupplyPort?.source_port_id||db.simulation_op_amp.insert({type:"simulation_op_amp",source_component_id:this.source_component_id,inverting_input_source_port_id:invertingInputPort.source_port_id,non_inverting_input_source_port_id:nonInvertingInputPort.source_port_id,output_source_port_id:outputPort.source_port_id,positive_supply_source_port_id:positiveSupplyPort.source_port_id,negative_supply_source_port_id:negativeSupplyPort.source_port_id})}};function hasSimProps(props){return props.simSwitchFrequency!==void 0||props.simCloseAt!==void 0||props.simOpenAt!==void 0||props.simStartClosed!==void 0||props.simStartOpen!==void 0}var Switch=class extends NormalComponent3{_getSwitchType(){let props=this._parsedProps;return props?props.dpdt?"dpdt":props.spst?"spst":props.spdt?"spdt":props.dpst?"dpst":props.type??"spst":"spst"}get config(){let switchType=this._getSwitchType(),isNormallyClosed=this._parsedProps?.isNormallyClosed??!1,symbolMap={spst:isNormallyClosed?"spst_normally_closed_switch":"spst_switch",spdt:isNormallyClosed?"spdt_normally_closed_switch":"spdt_switch",dpst:isNormallyClosed?"dpst_normally_closed_switch":"dpst_switch",dpdt:isNormallyClosed?"dpdt_normally_closed_switch":"dpdt_switch"};return{componentName:"Switch",schematicSymbolName:this.props.symbolName??symbolMap[switchType],zodProps:switchProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db}=this.root,props=this._parsedProps??{},source_component=db.source_component.insert({ftype:"simple_switch",name:this.name,are_pins_interchangeable:this._getSwitchType()==="spst",display_name:props?.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{_parsedProps:props}=this;if(!hasSimProps(props))return;let{db}=this.root,simulationSwitch={type:"simulation_switch",source_component_id:this.source_component_id||""};props.simSwitchFrequency!==void 0&&(simulationSwitch.switching_frequency=frequency.parse(props.simSwitchFrequency)),props.simCloseAt!==void 0&&(simulationSwitch.closes_at=ms.parse(props.simCloseAt)),props.simOpenAt!==void 0&&(simulationSwitch.opens_at=ms.parse(props.simOpenAt)),props.simStartOpen!==void 0&&(simulationSwitch.starts_closed=!props.simStartOpen),props.simStartClosed!==void 0&&(simulationSwitch.starts_closed=props.simStartClosed),db.simulation_switch.insert(simulationSwitch)}},TESTPOINT_DEFAULTS={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},TestPoint=class extends NormalComponent3{get config(){return{componentName:"TestPoint",schematicSymbolName:this.props.symbolName??"testpoint",zodProps:testpointProps,sourceFtype:FTYPE.simple_test_point}}_getPropsWithDefaults(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._parsedProps;return!footprintVariant&&holeDiameter&&(footprintVariant="through_hole"),footprintVariant??(footprintVariant="through_hole"),padShape??(padShape="circle"),footprintVariant==="pad"?padShape==="circle"?padDiameter??(padDiameter=TESTPOINT_DEFAULTS.SMT_CIRCLE_DIAMETER):padShape==="rect"&&(width??(width=TESTPOINT_DEFAULTS.SMT_RECT_SIZE),height??(height=width)):footprintVariant==="through_hole"&&(holeDiameter??(holeDiameter=TESTPOINT_DEFAULTS.HOLE_DIAMETER)),{padShape,holeDiameter,footprintVariant,padDiameter,width,height}}_getImpliedFootprintString(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults();if(footprintVariant==="through_hole")return`platedhole_d${holeDiameter}`;if(footprintVariant==="pad"){if(padShape==="circle")return`smtpad_circle_d${padDiameter}`;if(padShape==="rect")return`smtpad_rect_w${width}_h${height}`}throw new Error(`Footprint variant "${footprintVariant}" with pad shape "${padShape}" not implemented`)}doInitialSourceRender(){let{db}=this.root,{_parsedProps:props}=this,{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults(),source_component=db.source_component.insert({ftype:FTYPE.simple_test_point,name:this.name,supplier_part_numbers:props.supplierPartNumbers,footprint_variant:footprintVariant,pad_shape:padShape,pad_diameter:padDiameter,hole_diameter:holeDiameter,width,height,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},SchematicText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_text_id")}get config(){return{componentName:"SchematicText",zodProps:schematicTextProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_text2=db.schematic_text.insert({schematic_symbol_id,anchor:props.anchor??"center",text:normalizeTextForCircuitJson(props.text),font_size:props.fontSize,color:props.color||"#000000",position:{x:globalPos.x,y:globalPos.y},rotation:props.schRotation??0});this.schematic_text_id=schematic_text2.schematic_text_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_text_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db}=this.root,text=db.schematic_text.get(this.schematic_text_id);if(!text)return;let newPosition=applyToPoint2(transform5,text.position);db.schematic_text.update(this.schematic_text_id,{position:{x:newPosition.x,y:newPosition.y}})}},SchematicLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_line_id")}get config(){return{componentName:"SchematicLine",zodProps:schematicLineProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_line2=db.schematic_line.insert({schematic_component_id,schematic_symbol_id,x1:props.x1+globalPos.x,y1:props.y1+globalPos.y,x2:props.x2+globalPos.x,y2:props.y2+globalPos.y,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_line_id=schematic_line2.schematic_line_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_line_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db}=this.root,line2=db.schematic_line.get(this.schematic_line_id);if(!line2)return;let p12=applyToPoint2(transform5,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform5,{x:line2.x2,y:line2.y2});db.schematic_line.update(this.schematic_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}},SchematicRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_rect_id")}get config(){return{componentName:"SchematicRect",zodProps:schematicRectProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_rect2=db.schematic_rect.insert({schematic_symbol_id,center:{x:globalPos.x,y:globalPos.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,schematic_component_id,is_dashed:props.isDashed,rotation:props.rotation??0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_rect_id=schematic_rect2.schematic_rect_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_rect_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db}=this.root,rect=db.schematic_rect.get(this.schematic_rect_id);if(!rect)return;let topLeft=applyToPoint2(transform5,{x:rect.center.x-rect.width/2,y:rect.center.y+rect.height/2}),bottomRight=applyToPoint2(transform5,{x:rect.center.x+rect.width/2,y:rect.center.y-rect.height/2}),newWidth=Math.abs(bottomRight.x-topLeft.x),newHeight=Math.abs(topLeft.y-bottomRight.y),newCenter={x:(topLeft.x+bottomRight.x)/2,y:(topLeft.y+bottomRight.y)/2};db.schematic_rect.update(this.schematic_rect_id,{center:newCenter,width:newWidth,height:newHeight})}},SchematicArc=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_arc_id")}get config(){return{componentName:"SchematicArc",zodProps:schematicArcProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_arc2=db.schematic_arc.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,start_angle_degrees:props.startAngleDegrees,end_angle_degrees:props.endAngleDegrees,direction:props.direction,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_arc_id=schematic_arc2.schematic_arc_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_arc_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db}=this.root,arc2=db.schematic_arc.get(this.schematic_arc_id);if(!arc2)return;let newCenter=applyToPoint2(transform5,arc2.center),edgePoint=applyToPoint2(transform5,{x:arc2.center.x+arc2.radius,y:arc2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db.schematic_arc.update(this.schematic_arc_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}},SchematicCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_circle_id")}get config(){return{componentName:"SchematicCircle",zodProps:schematicCircleProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_circle2=db.schematic_circle.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,fill_color:props.fillColor,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_circle_id=schematic_circle2.schematic_circle_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_circle_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db}=this.root,circle2=db.schematic_circle.get(this.schematic_circle_id);if(!circle2)return;let newCenter=applyToPoint2(transform5,circle2.center),edgePoint=applyToPoint2(transform5,{x:circle2.center.x+circle2.radius,y:circle2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db.schematic_circle.update(this.schematic_circle_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}};function sampleCurveSegment(segmentPath,samplesPerUnit){let commander=new Ci3(segmentPath),length7=commander.getTotalLength(),numSamples=Math.max(2,Math.ceil(length7*samplesPerUnit)),points=[];for(let i2=1;i2<=numSamples;i2++){let t21=i2/numSamples*length7,point6=commander.getPointAtLength(t21);points.push({x:point6.x,y:point6.y})}return points}function svgPathToPoints(svgPath,samplesPerUnit=10){let pathCommander=new Ci3(svgPath);pathCommander.toAbsolute();let segments=pathCommander.segments,result=[],currentPoints=[],currentX=0,currentY=0,subpathStartX=0,subpathStartY=0;for(let segment2 of segments)switch(segment2[0]){case"M":{currentPoints.length>0&&result.push(currentPoints),currentX=segment2[1],currentY=segment2[2],subpathStartX=currentX,subpathStartY=currentY,currentPoints=[{x:currentX,y:currentY}];break}case"L":{currentX=segment2[1],currentY=segment2[2],currentPoints.push({x:currentX,y:currentY});break}case"H":{currentX=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"V":{currentY=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"Z":{(currentX!==subpathStartX||currentY!==subpathStartY)&¤tPoints.push({x:subpathStartX,y:subpathStartY}),currentX=subpathStartX,currentY=subpathStartY;break}case"C":{let endX=segment2[5],endY=segment2[6],segmentPath=`M ${currentX} ${currentY} C ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"S":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} S ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"Q":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} Q ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"T":{let endX=segment2[1],endY=segment2[2],segmentPath=`M ${currentX} ${currentY} T ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"A":{let endX=segment2[6],endY=segment2[7],segmentPath=`M ${currentX} ${currentY} A ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${segment2[5]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}}return currentPoints.length>0&&result.push(currentPoints),result.map(points=>{let deduped=[];for(let point6 of points)(deduped.length===0||Math.abs(deduped[deduped.length-1].x-point6.x)>1e-9||Math.abs(deduped[deduped.length-1].y-point6.y)>1e-9)&&deduped.push(point6);return deduped})}var SchematicPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_path_ids",[])}get config(){return{componentName:"SchematicPath",zodProps:schematicPathProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,subcircuit_id=this.getSubcircuit().subcircuit_id??void 0;if(this.schematic_path_ids=[],props.svgPath){let subpaths=svgPathToPoints(props.svgPath);for(let subpathPoints of subpaths){let schematic_path2=db.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:subpathPoints.map(point6=>({x:point6.x+globalPos.x,y:point6.y+globalPos.y})),is_filled:props.isFilled,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,subcircuit_id});this.schematic_path_ids.push(schematic_path2.schematic_path_id)}}else if(props.points&&props.points.length>0){let schematic_path2=db.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:props.points.map(point6=>({x:point6.x+globalPos.x,y:point6.y+globalPos.y})),is_filled:props.isFilled,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,subcircuit_id});this.schematic_path_ids.push(schematic_path2.schematic_path_id)}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||this.schematic_path_ids.length===0)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db}=this.root;for(let pathId of this.schematic_path_ids){let path=db.schematic_path.get(pathId);if(!path)continue;let newPoints=path.points.map(point6=>{let transformed=applyToPoint2(transform5,point6);return{x:transformed.x,y:transformed.y}});db.schematic_path.update(pathId,{points:newPoints})}}};function getTitleAnchorAndPosition({anchor,x:x5,y:y5,width,height,isInside}){switch(anchor){case"top_left":return{x:x5,y:y5+height,textAnchor:isInside?"top_left":"bottom_left"};case"top_center":return{x:x5+width/2,y:y5+height,textAnchor:isInside?"top_center":"bottom_center"};case"top_right":return{x:x5+width,y:y5+height,textAnchor:isInside?"top_right":"bottom_right"};case"center_left":return{x:x5,y:y5+height/2,textAnchor:isInside?"center_left":"center_right"};case"center":return{x:x5+width/2,y:y5+height/2,textAnchor:"center"};case"center_right":return{x:x5+width,y:y5+height/2,textAnchor:isInside?"center_right":"center_left"};case"bottom_left":return{x:x5,y:y5,textAnchor:isInside?"bottom_left":"top_left"};case"bottom_center":return{x:x5+width/2,y:y5,textAnchor:isInside?"bottom_center":"top_center"};case"bottom_right":return{x:x5+width,y:y5,textAnchor:isInside?"bottom_right":"top_right"};default:return{x:x5+width/2,y:y5+height,textAnchor:"center"}}}var SchematicBox=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:schematicBoxProps,shouldRenderAsSchematicBox:!0}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,basePadding=.6,generalPadding=typeof props.padding=="number"?props.padding:0,paddingTop=typeof props.paddingTop=="number"?props.paddingTop:generalPadding,paddingBottom=typeof props.paddingBottom=="number"?props.paddingBottom:generalPadding,paddingLeft=typeof props.paddingLeft=="number"?props.paddingLeft:generalPadding,paddingRight=typeof props.paddingRight=="number"?props.paddingRight:generalPadding,hasOverlay=props.overlay&&props.overlay.length>0,hasFixedSize=typeof props.width=="number"&&typeof props.height=="number",width,height,x5,y5,centerX,centerY;if(hasOverlay){let portsWithPosition=props.overlay.map(selector=>({selector,port:this.getSubcircuit().selectOne(selector,{type:"port"})})).filter(({port})=>port!=null).map(({port})=>({position:port._getGlobalSchematicPositionAfterLayout()}));if(portsWithPosition.length===0)return;let xs3=portsWithPosition.map(p4=>p4.position.x),ys3=portsWithPosition.map(p4=>p4.position.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),rawWidth=maxX-minX,rawHeight=maxY-minY,defaultHorizontalPadding=rawWidth===0?basePadding:0,defaultVerticalPadding=rawHeight===0?basePadding:0,finalPaddingLeft=paddingLeft+defaultHorizontalPadding/2,finalPaddingRight=paddingRight+defaultHorizontalPadding/2,finalPaddingTop=paddingTop+defaultVerticalPadding/2,finalPaddingBottom=paddingBottom+defaultVerticalPadding/2,left=minX-finalPaddingLeft,right=maxX+finalPaddingRight,top=minY-finalPaddingBottom,bottom=maxY+finalPaddingTop;width=right-left,height=bottom-top,x5=left+(props.schX??0),y5=top+(props.schY??0),centerX=x5+width/2,centerY=y5+height/2}else if(hasFixedSize){width=props.width,height=props.height;let center2=this._getGlobalSchematicPositionBeforeLayout();centerX=center2.x,centerY=center2.y,x5=centerX-width/2,y5=centerY-height/2}else return;if(db.schematic_box.insert({height,width,x:x5,y:y5,is_dashed:props.strokeStyle==="dashed"}),props.title){let isInside=props.titleInside,TITLE_PADDING=.1,anchor=props.titleAlignment,anchorPos=getTitleAnchorAndPosition({anchor,x:x5,y:y5,width,height,isInside}),titleOffsetY,titleOffsetX,textAnchor=anchorPos.textAnchor;isInside?(titleOffsetY=anchor.includes("top")?-TITLE_PADDING:anchor.includes("bottom")?TITLE_PADDING:0,titleOffsetX=anchor.includes("left")?TITLE_PADDING:anchor.includes("right")?-TITLE_PADDING:0):(titleOffsetY=anchor.includes("top")?TITLE_PADDING:anchor.includes("bottom")?-TITLE_PADDING:0,titleOffsetX=anchor.includes("center_left")?-TITLE_PADDING:anchor.includes("center_right")?TITLE_PADDING:0);let titleX=anchorPos.x+titleOffsetX,titleY=anchorPos.y+titleOffsetY;db.schematic_text.insert({anchor:textAnchor,text:props.title,font_size:props.titleFontSize??.18,color:props.titleColor??"#000000",position:{x:titleX,y:titleY},rotation:0})}}},SchematicTable=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_table_id",null)}get config(){return{componentName:"SchematicTable",zodProps:schematicTableProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,rows=this.children.filter(c3=>c3.componentName==="SchematicRow");if(rows.length===0)return;let grid4=[],maxCols=0;for(let row of rows){let cells=row.children.filter(c3=>c3.componentName==="SchematicCell");maxCols=Math.max(maxCols,cells.length)}for(let i2=0;i2<rows.length;i2++)grid4[i2]=[];for(let i2=0;i2<rows.length;i2++){let cells=rows[i2].children.filter(c3=>c3.componentName==="SchematicCell"),k4=0;for(let j4=0;j4<cells.length;j4++){for(;grid4[i2][k4];)k4++;let cell=cells[j4],colSpan=cell._parsedProps.colSpan??1,rowSpan=cell._parsedProps.rowSpan??1;for(let r4=0;r4<rowSpan;r4++)for(let c3=0;c3<colSpan;c3++)grid4[i2+r4]||(grid4[i2+r4]=[]),grid4[i2+r4][k4+c3]=cell;k4+=colSpan}}maxCols=Math.max(0,...grid4.map(r4=>r4.length));let rowHeights=rows.map((row,i2)=>row._parsedProps.height??1),colWidths=Array.from({length:maxCols},(_5,j4)=>{let maxWidth=0;for(let i2=0;i2<rows.length;i2++){let cell=grid4[i2]?.[j4];if(cell){let text=cell._parsedProps.text??cell._parsedProps.children,cellWidth=cell._parsedProps.width??(text?.length??2)*.5;cellWidth>maxWidth&&(maxWidth=cellWidth)}}return maxWidth||10}),anchorPos=this._getGlobalSchematicPositionBeforeLayout(),table=db.schematic_table.insert({anchor_position:anchorPos,column_widths:colWidths,row_heights:rowHeights,cell_padding:props.cellPadding,border_width:props.borderWidth,anchor:props.anchor,subcircuit_id:this.getSubcircuit()?.subcircuit_id||"",schematic_component_id:this.parent?.schematic_component_id||""});this.schematic_table_id=table.schematic_table_id;let processedCells=new Set,yOffset=0;for(let i2=0;i2<rows.length;i2++){let xOffset=0;for(let j4=0;j4<maxCols;j4++){let cell=grid4[i2]?.[j4];if(cell&&!processedCells.has(cell)){processedCells.add(cell);let cellProps=cell._parsedProps,rowSpan=cellProps.rowSpan??1,colSpan=cellProps.colSpan??1,cellWidth=0;for(let c3=0;c3<colSpan;c3++)cellWidth+=colWidths[j4+c3];let cellHeight=0;for(let r4=0;r4<rowSpan;r4++)cellHeight+=rowHeights[i2+r4];db.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:i2,end_row_index:i2+rowSpan-1,start_column_index:j4,end_column_index:j4+colSpan-1,text:cellProps.text??cellProps.children,center:{x:anchorPos.x+xOffset+cellWidth/2,y:anchorPos.y-yOffset-cellHeight/2},width:cellWidth,height:cellHeight,horizontal_align:cellProps.horizontalAlign,vertical_align:cellProps.verticalAlign,font_size:cellProps.fontSize??props.fontSize,subcircuit_id:this.getSubcircuit()?.subcircuit_id||""})}colWidths[j4]&&(xOffset+=colWidths[j4])}yOffset+=rowHeights[i2]}}},SchematicRow=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicRow",zodProps:schematicRowProps}}},SchematicCell=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"canHaveTextChildren",!0)}get config(){return{componentName:"SchematicCell",zodProps:schematicCellProps}}},SymbolComponent=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"schematic_symbol_id");__publicField(this,"userCoordinateToResizedSymbolTransformMat");__publicField(this,"schematicSymbolBoundsInUserCoordinates")}get config(){return{componentName:"Symbol",zodProps:symbolProps}}hasExplicitSize(){let{_parsedProps:props}=this;return props.width!==void 0||props.height!==void 0}doInitialSymbolContainerRender(){if(this.root?.schematicDisabled)return;let{db}=this.root,{_parsedProps:props}=this,kicadSymbolMetadata3=this.getParentNormalComponent()?._parsedProps?.kicadSymbolMetadata,schematic_symbol2=db.schematic_symbol.insert({name:props.name,metadata:kicadSymbolMetadata3?{kicad_symbol:kicadSymbolMetadata3}:void 0});this.schematic_symbol_id=schematic_symbol2.schematic_symbol_id}getSchematicSymbolBounds(){return this.schematicSymbolBoundsInUserCoordinates?this.schematicSymbolBoundsInUserCoordinates:(this._computeSchematicSymbolBounds(),this.schematicSymbolBoundsInUserCoordinates??null)}getUserCoordinateToResizedSymbolTransform(){return this.hasExplicitSize()?this.userCoordinateToResizedSymbolTransformMat?this.userCoordinateToResizedSymbolTransformMat:(this._computeUserCoordinateToResizedSymbolTransform(),this.userCoordinateToResizedSymbolTransformMat??null):null}_computeSchematicSymbolBounds(){if(this.root?.schematicDisabled)return;let{db}=this.root,schematicElements=[];for(let child of this.children){if(child.componentName==="Port"){let portId=child.schematic_port_id;if(portId){let port=db.schematic_port.get(portId);port&&schematicElements.push(port)}continue}if(child.isSchematicPrimitive){if(child.componentName==="SchematicLine"){let line2=db.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}else if(child.componentName==="SchematicRect"){let rect=db.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}else if(child.componentName==="SchematicCircle"){let circle2=db.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}else if(child.componentName==="SchematicArc"){let arc2=db.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}else if(child.componentName==="SchematicText"){let text=db.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}else if(child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db.schematic_path.get(pathId);path&&schematicElements.push(path)}}}}if(schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements);this.schematicSymbolBoundsInUserCoordinates=bounds}_computeUserCoordinateToResizedSymbolTransform(){let bounds=this.getSchematicSymbolBounds();if(!bounds)return;let{_parsedProps:props}=this,targetWidth=props.width,targetHeight=props.height;if(targetWidth===void 0&&targetHeight===void 0)return;let currentWidth=bounds.maxX-bounds.minX,currentHeight=bounds.maxY-bounds.minY;if(currentWidth===0&¤tHeight===0)return;let currentCenterX=(bounds.minX+bounds.maxX)/2,currentCenterY=(bounds.minY+bounds.maxY)/2,scaleX=targetWidth!==void 0&¤tWidth>0?targetWidth/currentWidth:1,scaleY=targetHeight!==void 0&¤tHeight>0?targetHeight/currentHeight:1,globalPos=this._getGlobalSchematicPositionBeforeLayout();this.userCoordinateToResizedSymbolTransformMat=compose2(translate2(globalPos.x,globalPos.y),scale2(scaleX,scaleY),translate2(-currentCenterX,-currentCenterY))}},AnalogSimulation=class extends PrimitiveComponent2{get config(){return{componentName:"AnalogSimulation",zodProps:analogSimulationProps}}doInitialSimulationRender(){let{db}=this.root,{duration,timePerStep}=this._parsedProps,durationMs=duration||10,timePerStepMs=timePerStep||.01;db.simulation_experiment.insert({name:"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:durationMs,time_per_step:timePerStepMs})}};function getLabelBounds(probePosition,labelText,alignment,labelOffset=.3){let labelWidth=Math.max(labelText.length*.1,.3),labelHeightWithPadding=.25+.2,anchorX=probePosition.x,anchorY=probePosition.y,offsetMultiplier=labelOffset+labelWidth/2;alignment.includes("top")?anchorY+=offsetMultiplier:alignment.includes("bottom")&&(anchorY-=offsetMultiplier),alignment.includes("right")?anchorX+=offsetMultiplier:alignment.includes("left")&&(anchorX-=offsetMultiplier);let minX,maxX,minY,maxY;return alignment.includes("left")?(minX=anchorX,maxX=anchorX+labelWidth):alignment.includes("right")?(minX=anchorX-labelWidth,maxX=anchorX):(minX=anchorX-labelWidth/2,maxX=anchorX+labelWidth/2),alignment.includes("top")?(minY=anchorY-labelHeightWithPadding,maxY=anchorY):alignment.includes("bottom")?(minY=anchorY,maxY=anchorY+labelHeightWithPadding):(minY=anchorY-labelHeightWithPadding/2,maxY=anchorY+labelHeightWithPadding/2),{minX,maxX,minY,maxY}}function getElementBounds(elm){let cx2,cy2,w4,h4;if(elm.type==="schematic_component")cx2=elm.center?.x,cy2=elm.center?.y,w4=elm.size?.width,h4=elm.size?.height;else if(elm.type==="schematic_text")cx2=elm.position?.x,cy2=elm.position?.y,w4=(elm.text?.length??0)*.1,h4=.2;else return null;return typeof cx2=="number"&&typeof cy2=="number"&&typeof w4=="number"&&typeof h4=="number"?{minX:cx2-w4/2,maxX:cx2+w4/2,minY:cy2-h4/2,maxY:cy2+h4/2}:null}function getOverlapArea(a2,b3){if(!doBoundsOverlap(a2,b3))return 0;let overlapWidth=Math.min(a2.maxX,b3.maxX)-Math.max(a2.minX,b3.minX),overlapHeight=Math.min(a2.maxY,b3.maxY)-Math.max(a2.minY,b3.minY);return overlapWidth*overlapHeight}function selectBestLabelAlignment({probePosition,labelText,schematicElements,defaultAlignment="top_right"}){let orderedAlignments=[defaultAlignment,...["top_right","top_left","bottom_right","bottom_left","top_center","bottom_center","center_right","center_left"].filter(a2=>a2!==defaultAlignment)],bestAlignment=defaultAlignment,minOverlapArea=1/0;for(let alignment of orderedAlignments){let labelBounds=getLabelBounds(probePosition,labelText,alignment),totalOverlapArea=0;for(let element of schematicElements){let elementBounds=getElementBounds(element);elementBounds&&(totalOverlapArea+=getOverlapArea(labelBounds,elementBounds))}if(totalOverlapArea===0)return alignment;totalOverlapArea<minOverlapArea&&(minOverlapArea=totalOverlapArea,bestAlignment=alignment)}return bestAlignment}var VoltageProbe=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_voltage_probe_id",null);__publicField(this,"schematic_voltage_probe_id",null);__publicField(this,"finalProbeName",null);__publicField(this,"color",null)}get config(){return{componentName:"VoltageProbe",zodProps:voltageProbeProps}}doInitialSimulationRender(){let{db}=this.root,{connectsTo,name,referenceTo,color}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit){this.renderError("VoltageProbe must be inside a subcircuit");return}let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1){this.renderError("VoltageProbe must connect to exactly one port or net");return}let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"}),net=port?null:subcircuit.selectOne(targetSelector,{type:"net"});if(net&&net.componentName!=="Net"){this.renderError(`VoltageProbe connection target "${targetSelector}" resolved to a non-net component "${net.componentName}".`);return}if(!port&&!net){this.renderError(`VoltageProbe could not find connection target "${targetSelector}"`);return}let connectedId=port?.source_port_id??net?.source_net_id;if(!connectedId){this.renderError("Could not identify connected source for VoltageProbe");return}let referencePort=null,referenceNet=null;if(referenceTo){let referenceTargets=Array.isArray(referenceTo)?referenceTo:[referenceTo];if(referenceTargets.length!==1){this.renderError("VoltageProbe must reference exactly one port or net");return}let referenceSelector=referenceTargets[0];if(referencePort=subcircuit.selectOne(referenceSelector,{type:"port"}),referenceNet=referencePort?null:subcircuit.selectOne(referenceSelector,{type:"net"}),referenceNet&&referenceNet.componentName!=="Net"){this.renderError(`VoltageProbe reference target "${referenceSelector}" resolved to a non-net component "${referenceNet.componentName}".`);return}if(!referencePort&&!referenceNet){this.renderError(`VoltageProbe could not find reference target "${referenceSelector}"`);return}}this.color=color??getSimulationColorForId(connectedId);let finalName=name;finalName||(finalName=targets[0].split(" > ").map(s2=>s2.replace(/^\./,"")).join(".")),this.finalProbeName=finalName??null;let{simulation_voltage_probe_id}=db.simulation_voltage_probe.insert({name:finalName,signal_input_source_port_id:port?.source_port_id??void 0,signal_input_source_net_id:net?.source_net_id??void 0,reference_input_source_port_id:referencePort?.source_port_id??void 0,reference_input_source_net_id:referenceNet?.source_net_id??void 0,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color});this.simulation_voltage_probe_id=simulation_voltage_probe_id}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled)return;let{db}=this.root,{connectsTo,name}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit)return;let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1)return;let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"});if(!port||!port.schematic_port_id)return;let position2=port._getGlobalSchematicPositionAfterLayout(),targetTraceId=null;for(let trace of db.schematic_trace.list()){for(let edge of trace.edges)if(Math.abs(edge.from.x-position2.x)<1e-6&&Math.abs(edge.from.y-position2.y)<1e-6||Math.abs(edge.to.x-position2.x)<1e-6&&Math.abs(edge.to.y-position2.y)<1e-6){targetTraceId=trace.schematic_trace_id;break}if(targetTraceId)break}if(!targetTraceId)return;let probeName=this.finalProbeName,labelAlignment=selectBestLabelAlignment({probePosition:position2,labelText:probeName,schematicElements:[...db.schematic_component.list(),...db.schematic_text.list()],defaultAlignment:"top_right"}),schematic_voltage_probe2=db.schematic_voltage_probe.insert({name:probeName,position:position2,schematic_trace_id:targetTraceId,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color??void 0,label_alignment:labelAlignment});this.schematic_voltage_probe_id=schematic_voltage_probe2.schematic_voltage_probe_id}},RootCircuit=class extends IsolatedCircuit{constructor({platform,projectUrl}={}){super({platform,projectUrl,cachedSubcircuits:new Map,pendingSubcircuitRenders:new Map});__publicField(this,"isRootCircuit",!0);this.root=this}},Project=RootCircuit,Circuit=RootCircuit,useRenderedCircuit=reactElements=>{let[isLoading,setIsLoading]=import_react5.default.useState(!0),[error,setError]=import_react5.default.useState(null),[circuit,setCircuit]=import_react5.default.useState(),[circuitJson,setCircuitJson]=import_react5.default.useState();return import_react5.default.useEffect(()=>{setIsLoading(!0),setError(null),reactElements&&setTimeout(()=>{try{let circuit2=new RootCircuit;circuit2.add(reactElements),setCircuit(circuit2),setCircuitJson(circuit2.toJson())}catch(error2){setError(error2)}setIsLoading(!1)},1)},[reactElements]),{isLoading,error,circuit,circuitJson}},createUseComponent=(Component2,pins)=>(name,props)=>{let pinLabelsFlatArray=[];Array.isArray(pins)?pinLabelsFlatArray.push(...pins.flat()):typeof pins=="object"&&pinLabelsFlatArray.push(...Object.values(pins).flat(),...Object.keys(pins));let R5=props2=>{if(props2?.name&&props2.name!==name)throw new Error(`Component name mismatch. Hook name: ${name}, Component prop name: ${props2.name}`);let combinedProps={...props,...props2,name},tracesToCreate=[];for(let portLabel of pinLabelsFlatArray)if(combinedProps[portLabel]){let from=`.${name} > .${portLabel}`,to3=combinedProps[portLabel];tracesToCreate.push({from,to:to3}),delete combinedProps[portLabel]}return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Component2,{...combinedProps}),tracesToCreate.map((trace,i2)=>(0,import_jsx_runtime.jsx)("trace",{...trace},i2))]})};for(let port of pinLabelsFlatArray)R5[port]=`.${name} > .${port}`;return R5},useCapacitor=createUseComponent(props=>(0,import_jsx_runtime2.jsx)("capacitor",{...props}),capacitorPins),useChip=pinLabels=>createUseComponent(props=>(0,import_jsx_runtime3.jsx)("chip",{pinLabels,...props}),pinLabels),useDiode=createUseComponent(props=>(0,import_jsx_runtime4.jsx)("diode",{...props}),diodePins),useLed=createUseComponent(props=>(0,import_jsx_runtime5.jsx)("led",{...props}),ledPins),useResistor=createUseComponent(props=>(0,import_jsx_runtime6.jsx)("resistor",{...props}),resistorPins),sel=new Proxy(refdes=>new Proxy({},{get:(_5,pin)=>`.${refdes} > .${pin}`}),{get:(_5,prop1)=>{let fn3=(...args)=>{let chipFnOrPinType=args[0];return new Proxy({},{get:(_22,pinName)=>`.${prop1} > .${pinName}`})};return new Proxy(fn3,{get:(_22,prop2)=>prop1==="net"?`net.${prop2}`:prop1==="subcircuit"?new Proxy({},{get:(_32,prop3)=>new Proxy({},{get:(_42,prop4)=>`subcircuit.${prop2} > .${prop3} > .${prop4}`})}):`.${prop1} > .${prop2}`,apply:(target,_22,args)=>prop1==="net"?new Proxy({},{get:(_32,netName)=>`net.${netName}`}):new Proxy({},{get:(_32,pinOrSubComponentName)=>{let pinResult=`.${prop1} > .${pinOrSubComponentName}`;return["U","J","CN"].some(p4=>prop1.startsWith(p4))?pinResult:new Proxy(new String(pinResult),{get:(_42,nestedProp)=>typeof nestedProp=="symbol"||nestedProp==="toString"?()=>pinResult:`.${prop1} > .${pinOrSubComponentName} > .${nestedProp}`})}})})}});extendCatalogue(components_exports);extendCatalogue({Bug:Chip});var React=__toESM(require_react(),1),ReactJsxRuntime=__toESM(require_jsx_runtime(),1);var getFootprinterStringFromKicad=kicadFootprint=>{let match2=kicadFootprint.match(/:[RC]_(\d{4})_/);if(match2||(match2=kicadFootprint.match(/:(SOIC-\d+|SOT-\d+|SOD-\d+|SSOP-\d+|TSSOP-\d+|QFP-\d+|QFN-\d+)/),match2))return match2[1]};var getJlcPackageFromFootprinterString=footprinterString=>footprinterString.includes("cap")?footprinterString.replace(/cap/g,""):footprinterString;var getJlcpcbPackageName=footprint=>{if(footprint){if(footprint.startsWith("kicad:")){let footprinterString=getFootprinterStringFromKicad(footprint);return footprinterString?getJlcPackageFromFootprinterString(footprinterString):footprint}return getJlcPackageFromFootprinterString(footprint)}};var cache=new Map,getJlcPartsCached=async(name,params)=>{let paramString=new URLSearchParams({...params,json:"true"}).toString();if(cache.has(paramString))return cache.get(paramString);let responseJson=await(await fetch(`https://jlcsearch.tscircuit.com/${name}/list?${paramString}`)).json();return cache.set(paramString,responseJson),responseJson},withBasicPartPreference=parts=>parts?[...parts].sort((a2,b3)=>Number(b3.is_basic??!1)-Number(a2.is_basic??!1)):[],jlcPartsEngine={findPart:async({sourceComponent,footprinterString})=>{let jlcpcbPackage=getJlcpcbPackageName(footprinterString);if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resistor"){let{resistors}=await getJlcPartsCached("resistors",{resistance:sourceComponent.resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resistors).map(r4=>`C${r4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_capacitor"){let{capacitors}=await getJlcPartsCached("capacitors",{capacitance:sourceComponent.capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(capacitors).map(c3=>`C${c3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_pin_header"){let pitch;footprinterString?.includes("_p")&&(pitch=Number(footprinterString.split("_p")[1]));let{headers}=await getJlcPartsCached("headers",pitch?{pitch,num_pins:sourceComponent.pin_count,gender:sourceComponent.gender}:{num_pins:sourceComponent.pin_count,gender:sourceComponent.gender});return{jlcpcb:withBasicPartPreference(headers).map(h4=>`C${h4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_potentiometer"){let{potentiometers}=await getJlcPartsCached("potentiometers",{resistance:sourceComponent.max_resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(potentiometers).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_diode"){let{diodes}=await getJlcPartsCached("diodes",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(diodes).map(d3=>`C${d3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_chip"){if(!jlcpcbPackage||!footprinterString)return{};let{chips}=await getJlcPartsCached("chips",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(chips).map(c3=>`C${c3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_transistor"){let{transistors}=await getJlcPartsCached("transistors",{package:jlcpcbPackage,transistor_type:sourceComponent.transistor_type});return{jlcpcb:withBasicPartPreference(transistors).map(t21=>`C${t21.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_power_source"){let{power_sources}=await getJlcPartsCached("power_sources",{voltage:sourceComponent.voltage,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(power_sources).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_inductor"){let{inductors}=await getJlcPartsCached("inductors",{inductance:sourceComponent.inductance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(inductors).map(i2=>`C${i2.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_crystal"){let{crystals}=await getJlcPartsCached("crystals",{frequency:sourceComponent.frequency,load_capacitance:sourceComponent.load_capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(crystals).map(c3=>`C${c3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_mosfet"){let{mosfets}=await getJlcPartsCached("mosfets",{package:jlcpcbPackage,mosfet_mode:sourceComponent.mosfet_mode,channel_type:sourceComponent.channel_type});return{jlcpcb:withBasicPartPreference(mosfets).map(m3=>`C${m3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resonator"){let{resonators}=await getJlcPartsCached("resonators",{frequency:sourceComponent.frequency,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resonators).map(r4=>`C${r4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_switch"){let{switches}=await getJlcPartsCached("switches",{switch_type:sourceComponent.type,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(switches).map(s2=>`C${s2.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_led"){let{leds}=await getJlcPartsCached("leds",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(leds).map(l3=>`C${l3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_fuse"){let{fuses}=await getJlcPartsCached("fuses",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(fuses).map(l3=>`C${l3.lcsc}`).slice(0,3)}}return{}}};var import_s_expression=__toESM(require_s_expression(),1);init_zod();var import_debug20=__toESM(require_browser(),1),import_debug21=__toESM(require_browser(),1),point22=external_exports.tuple([external_exports.coerce.number(),external_exports.coerce.number()]),point33=external_exports.tuple([external_exports.number(),external_exports.number(),external_exports.number()]),point5=external_exports.union([point22,point33]),fp_poly_arc_segment_def=external_exports.object({kind:external_exports.literal("arc"),start:point22,mid:point22,end:point22}),fp_poly_point_def=external_exports.union([point22,fp_poly_arc_segment_def]),attributes_def=external_exports.object({at:point5,size:point22,layer:external_exports.string(),layers:external_exports.array(external_exports.string()),roundrect_rratio:external_exports.number(),uuid:external_exports.string()}).partial(),property_def=external_exports.object({key:external_exports.string(),val:external_exports.string(),attributes:attributes_def}),drill_def=external_exports.object({oval:external_exports.boolean().default(!1),width:external_exports.number().optional(),height:external_exports.number().optional(),offset:point22.optional()}),hole_def=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point5,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a2=>typeof a2=="number"?{oval:!1,width:a2,height:a2}:"oval"in a2?a2:a2.length===2?{oval:!1,width:Number.parseFloat(a2[0]),height:Number.parseFloat(a2[0]),offset:point22.parse(a2[1].slice(1))}:a2.length===3||a2.length===4?{oval:a2[0]==="oval",width:Number.parseFloat(a2[1]),height:Number.parseFloat(a2[2]),offset:a2[3]?point22.parse(a2[3].slice(1)):void 0}:a2).pipe(drill_def),size:external_exports.union([external_exports.array(external_exports.number()).length(2).transform(([w4,h4])=>({width:w4,height:h4})),external_exports.object({width:external_exports.number(),height:external_exports.number()})]),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),uuid:external_exports.string().optional()}),pad_def2=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point5,size:point22,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a2=>typeof a2=="number"?{oval:!1,width:a2,height:a2}:"oval"in a2?a2:a2.length===2?{oval:!1,width:Number.parseFloat(a2[0]),height:Number.parseFloat(a2[0]),offset:point22.parse(a2[1].slice(1))}:a2.length===3||a2.length===4?{oval:a2[0]==="oval",width:Number.parseFloat(a2[1]),height:Number.parseFloat(a2[2]),offset:a2[3]?point22.parse(a2[3].slice(1)):void 0}:a2).pipe(drill_def).optional(),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),chamfer_ratio:external_exports.number().optional(),solder_paste_margin:external_exports.number().optional(),solder_paste_margin_ratio:external_exports.number().optional(),clearance:external_exports.number().optional(),zone_connection:external_exports.union([external_exports.literal(0).describe("Pad is not connect to zone"),external_exports.literal(1).describe("Pad is connected to zone using thermal relief"),external_exports.literal(2).describe("Pad is connected to zone using solid fill")]).optional(),thermal_width:external_exports.number().optional(),thermal_gap:external_exports.number().optional(),uuid:external_exports.string().optional()}),effects_def=external_exports.object({font:external_exports.object({size:point22,thickness:external_exports.number().optional()})}).partial(),fp_text_def=external_exports.object({fp_text_type:external_exports.literal("user"),text:external_exports.string(),at:point5,layer:external_exports.string(),uuid:external_exports.string().optional(),effects:effects_def.partial()}),fp_arc_def=external_exports.object({start:point22,mid:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_circle_def=external_exports.object({center:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),fill:external_exports.string().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_poly_def=external_exports.object({pts:external_exports.array(fp_poly_point_def),stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional(),fill:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),fp_line=external_exports.object({start:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),kicad_mod_json_def=external_exports.object({footprint_name:external_exports.string(),version:external_exports.string().optional(),generator:external_exports.string().optional(),generator_version:external_exports.string().optional(),layer:external_exports.string(),descr:external_exports.string().default(""),tags:external_exports.array(external_exports.string()).optional(),properties:external_exports.array(property_def),fp_lines:external_exports.array(fp_line),fp_texts:external_exports.array(fp_text_def),fp_arcs:external_exports.array(fp_arc_def),fp_circles:external_exports.array(fp_circle_def).optional(),fp_polys:external_exports.array(fp_poly_def).optional(),pads:external_exports.array(pad_def2),holes:external_exports.array(hole_def).optional()}),formatAttr=(val,attrKey)=>{if(attrKey==="effects"&&Array.isArray(val)){let effectsObj={};for(let elm of val)if(elm[0]==="font"){let fontObj={};for(let fontElm of elm.slice(1))fontElm.length===2?fontObj[fontElm[0].valueOf()]=Number.parseFloat(fontElm[1].valueOf()):fontObj[fontElm[0].valueOf()]=fontElm.slice(1).map(n3=>Number.parseFloat(n3.valueOf()));effectsObj.font=fontObj}return effects_def.parse(effectsObj)}if(attrKey==="pts")return val.map(segment2=>{let segmentType=segment2[0]?.valueOf?.()??segment2[0];if(segmentType==="xy")return segment2.slice(1).map(n3=>Number.parseFloat(n3.valueOf()));if(segmentType==="arc"){let arcObj={kind:"arc"};for(let arcAttr of segment2.slice(1)){let key=arcAttr[0].valueOf();arcObj[key]=arcAttr.slice(1).map(n3=>Number.parseFloat(n3.valueOf()))}return arcObj}return segment2});if(attrKey==="stroke"){let strokeObj={};for(let strokeElm of val){let strokePropKey=strokeElm[0].valueOf();strokeObj[strokePropKey]=formatAttr(strokeElm.slice(1),strokePropKey)}return strokeObj}return attrKey==="at"||attrKey==="size"||attrKey==="start"||attrKey==="mid"||attrKey==="end"?(Array.isArray(val)?val:[val]).map(n3=>n3?.valueOf?.()??n3).filter(v5=>typeof v5=="number"||typeof v5=="string"&&/^[-+]?\d*\.?\d+(e[-+]?\d+)?$/i.test(v5)).map(v5=>typeof v5=="number"?v5:Number.parseFloat(v5)):attrKey==="tags"?val.map(n3=>n3.valueOf()):attrKey==="generator_version"||attrKey==="version"?val[0].valueOf():val.length===2?val.valueOf():attrKey==="uuid"?Array.isArray(val)?val[0].valueOf():val.valueOf():/^[\d\.]+$/.test(val)&&!Number.isNaN(Number.parseFloat(val))?Number.parseFloat(val):Array.isArray(val)&&val.length===1?val[0].valueOf():Array.isArray(val)?val.map(s2=>s2.valueOf()):val},getAttr=(s2,key)=>{for(let elm of s2)if(Array.isArray(elm)&&elm[0]===key)return formatAttr(elm.slice(1),key)},debug11=(0,import_debug20.default)("kicad-mod-converter"),parseKicadModToKicadJson=fileContent=>{let kicadSExpr=(0,import_s_expression.default)(fileContent),footprintName=kicadSExpr[1].valueOf(),topLevelAttributes={},simpleTopLevelAttributes=Object.entries(kicad_mod_json_def.shape).filter(([attributeKey,def])=>def._def.typeName==="ZodString"||attributeKey==="tags").map(([attributeKey])=>attributeKey);for(let kicadSExprRow of kicadSExpr.slice(2)){if(!simpleTopLevelAttributes.includes(kicadSExprRow[0]))continue;let key=kicadSExprRow[0].valueOf(),val=formatAttr(kicadSExprRow.slice(1),key);topLevelAttributes[key]=val}let properties=kicadSExpr.slice(2).filter(row=>row[0]==="property").map(row=>{let key=row[1].valueOf(),val=row[2].valueOf(),attributes2=attributes_def.parse(row.slice(3).reduce((acc,attrAr)=>{let attrKey=attrAr[0].valueOf();return acc[attrKey]=formatAttr(attrAr.slice(1),attrKey),acc},{}));return{key,val,attributes:attributes2}}),padRows=kicadSExpr.slice(2).filter(row=>row[0]==="pad"),pads=[];for(let row of padRows){let at4=getAttr(row,"at"),size2=getAttr(row,"size"),drill=getAttr(row,"drill"),layers=getAttr(row,"layers");if(Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]),!layers.includes("F.Cu")){debug11(`Skipping pad without F.Cu layer: layers=${layers.join(", ")}`);continue}let roundrect_rratio=getAttr(row,"roundrect_rratio"),uuid=getAttr(row,"uuid"),padRaw={name:row[1].valueOf(),pad_type:row[2].valueOf(),pad_shape:row[3].valueOf(),at:at4,drill,size:size2,layers,roundrect_rratio,uuid};debug11(`attempting to parse pad: ${JSON.stringify(padRaw,null," ")}`),pads.push(pad_def2.parse(padRaw))}let fp_texts_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_text"),fp_texts=[];for(let fp_text_row of fp_texts_rows){let text=fp_text_row[2].valueOf(),at4=getAttr(fp_text_row,"at"),layer=getAttr(fp_text_row,"layer"),uuid=getAttr(fp_text_row,"uuid"),effects=getAttr(fp_text_row,"effects");fp_texts.push({fp_text_type:"user",text,at:at4,layer,uuid,effects})}let fp_lines=[],fp_lines_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_line");for(let fp_line_row of fp_lines_rows){let start=getAttr(fp_line_row,"start"),end=getAttr(fp_line_row,"end"),stroke=getAttr(fp_line_row,"stroke"),layer=getAttr(fp_line_row,"layer"),uuid=getAttr(fp_line_row,"uuid");fp_lines.push({start,end,stroke,layer,uuid})}let fp_arcs=[],fp_arcs_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_arc");for(let fp_arc_row of fp_arcs_rows){let start=getAttr(fp_arc_row,"start"),mid=getAttr(fp_arc_row,"mid"),end=getAttr(fp_arc_row,"end"),stroke=getAttr(fp_arc_row,"stroke"),layer=getAttr(fp_arc_row,"layer"),uuid=getAttr(fp_arc_row,"uuid");!start||!end||!mid||!stroke||!layer||fp_arcs.push({start,mid,end,stroke,layer,uuid})}let fp_circles=[],fp_circles_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_circle");for(let fp_circle_row of fp_circles_rows){let center2=getAttr(fp_circle_row,"center"),end=getAttr(fp_circle_row,"end"),stroke=getAttr(fp_circle_row,"stroke"),fill=getAttr(fp_circle_row,"fill"),layer=getAttr(fp_circle_row,"layer"),uuid=getAttr(fp_circle_row,"uuid");!center2||!end||!stroke||!layer||fp_circles.push({center:center2,end,stroke,fill,layer,uuid})}let fp_polys=[],fp_polys_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_poly");for(let fp_poly_row of fp_polys_rows){let pts=getAttr(fp_poly_row,"pts"),stroke=getAttr(fp_poly_row,"stroke"),width=getAttr(fp_poly_row,"width"),layer=getAttr(fp_poly_row,"layer"),uuid=getAttr(fp_poly_row,"uuid"),fill=getAttr(fp_poly_row,"fill"),normalizedStroke=stroke;!normalizedStroke&&typeof width=="number"?normalizedStroke={width,type:"solid"}:normalizedStroke&&typeof normalizedStroke=="object"&&typeof width=="number"&&normalizedStroke.width===void 0&&(normalizedStroke={...normalizedStroke,width}),fp_polys.push({pts,stroke:normalizedStroke,layer,uuid,fill})}let holes=[];for(let row of kicadSExpr.slice(2)){if(row[0]!=="pad"||row[2]?.valueOf?.()!=="thru_hole")continue;let name=row[1]?.valueOf?.(),pad_type=row[2]?.valueOf?.(),pad_shape=row[3]?.valueOf?.(),at4=getAttr(row,"at"),drill=getAttr(row,"drill"),size2=getAttr(row,"size");Array.isArray(size2)&&(size2[0]==="size"&&(size2=size2.slice(1)),size2={width:Number(size2[0]),height:Number(size2[1])});let uuid=getAttr(row,"uuid"),roundrect_rratio=getAttr(row,"roundrect_rratio"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let holeRaw={name,pad_type,pad_shape,at:at4,drill,size:size2,layers,roundrect_rratio,uuid};debug11(`attempting to parse holes: ${JSON.stringify(holeRaw,null,2)}`),holes.push(hole_def.parse(holeRaw))}return kicad_mod_json_def.parse({footprint_name:footprintName,...topLevelAttributes,properties,fp_lines,fp_texts,fp_arcs,fp_circles,pads,holes,fp_polys})},TWO_PI=Math.PI*2,normalizeAngle2=angle=>{let result=angle%TWO_PI;return result<0&&(result+=TWO_PI),result},directedAngleCCW=(start,target)=>{let startNorm=normalizeAngle2(start),delta=normalizeAngle2(target)-startNorm;return delta<0&&(delta+=TWO_PI),delta};function calculateCenter(start,mid,end){let mid1={x:(start.x+mid.x)/2,y:(start.y+mid.y)/2},mid2={x:(mid.x+end.x)/2,y:(mid.y+end.y)/2},slope1=-(start.x-mid.x)/(start.y-mid.y),slope2=-(mid.x-end.x)/(mid.y-end.y),centerX=(mid1.y-mid2.y+slope2*mid2.x-slope1*mid1.x)/(slope2-slope1),centerY=mid1.y+slope1*(centerX-mid1.x);return{x:centerX,y:centerY}}function calculateRadius(center2,point42){return Math.sqrt((center2.x-point42.x)**2+(center2.y-point42.y)**2)}function calculateAngle(center2,point42){return Math.atan2(point42.y-center2.y,point42.x-center2.x)}var getArcLength=(start,mid,end)=>{let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;return ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI),Math.abs(radius*angleDelta)};function generateArcPath(start,mid,end,numPoints){let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI);let path=[];for(let i2=0;i2<=numPoints;i2++){let angle=angleStart+i2/numPoints*angleDelta,x5=center2.x+radius*Math.cos(angle),y5=center2.y+radius*Math.sin(angle);path.push({x:x5,y:y5})}return path}var makePoint=p4=>Array.isArray(p4)?{x:p4[0],y:p4[1]}:p4,pointsEqual=(p12,p22,tolerance=1e-4)=>Math.abs(p12.x-p22.x)<tolerance&&Math.abs(p12.y-p22.y)<tolerance,findClosedPolygons=segments=>{let polygons=[],used=new Set;for(let i2=0;i2<segments.length;i2++){if(used.has(i2))continue;let polygon2=[segments[i2]];used.add(i2);let currentEnd=segments[i2].end,foundNext=!0;for(;foundNext;){if(foundNext=!1,polygon2.length>1&&pointsEqual(currentEnd,polygon2[0].start)){polygons.push(polygon2);break}for(let j4=0;j4<segments.length;j4++)if(!used.has(j4)){if(pointsEqual(currentEnd,segments[j4].start)){polygon2.push(segments[j4]),used.add(j4),currentEnd=segments[j4].end,foundNext=!0;break}else if(pointsEqual(currentEnd,segments[j4].end)){segments[j4].type==="arc"?polygon2.push({...segments[j4],reversed:!0}):polygon2.push({...segments[j4],start:segments[j4].end,end:segments[j4].start}),used.add(j4),currentEnd=segments[j4].start,foundNext=!0;break}}if(!foundNext){for(let k4=polygon2.length-1;k4>=0;k4--){let idx=segments.indexOf(polygon2[k4]);idx!==-1&&used.delete(idx)}break}}}return polygons},polygonToPoints=polygon2=>{let points=[];for(let segment2 of polygon2)if(segment2.type==="line")points.push(segment2.start);else if(segment2.type==="arc"&&segment2.mid){let arcLength=getArcLength(segment2.start,segment2.mid,segment2.end),numPoints=Math.max(3,Math.ceil(arcLength)),arcPoints=generateArcPath(segment2.start,segment2.mid,segment2.end,numPoints);segment2.reversed&&(arcPoints=arcPoints.reverse()),points.push(...arcPoints.slice(0,-1))}return points};function getSilkscreenFontSizeFromFpTexts(fp_texts){if(!Array.isArray(fp_texts))return null;let refText=fp_texts.find(t21=>t21.layer?.toLowerCase()==="f.silks"&&(t21.text?.includes("${REFERENCE}")||t21.fp_text_type?.toLowerCase()==="reference"||t21.text?.match(/^R\d+|C\d+|U\d+/))),fallbackText=refText||fp_texts.find(t21=>t21.layer?.toLowerCase()==="f.fab"&&(t21.text?.includes("${REFERENCE}")||t21.fp_text_type?.toLowerCase()==="reference")),target=refText||fallbackText;if(!target?.effects?.font?.size)return null;let[width,height]=target.effects.font.size;return height??width??1}var degToRad=deg=>deg*Math.PI/180,rotatePoint3=(x5,y5,deg)=>{let r4=degToRad(deg),cos5=Math.cos(r4),sin5=Math.sin(r4);return{x:x5*cos5-y5*sin5,y:x5*sin5+y5*cos5}},getAxisAlignedRectFromPoints=points=>{let uniquePoints=[...new Map(points.map(p4=>[`${p4.x},${p4.y}`,p4])).values()];if(uniquePoints.length!==4)return null;let xs3=uniquePoints.map(p4=>p4.x),ys3=uniquePoints.map(p4=>p4.y),uniqueXs=[...new Set(xs3)],uniqueYs=[...new Set(ys3)];if(uniqueXs.length!==2||uniqueYs.length!==2)return null;let[minX,maxX]=uniqueXs.sort((a2,b3)=>a2-b3),[minY,maxY]=uniqueYs.sort((a2,b3)=>a2-b3);return minX===void 0||maxX===void 0||minY===void 0||maxY===void 0?null:{x:(minX+maxX)/2,y:(minY+maxY)/2,width:maxX-minX,height:maxY-minY}},fpPolyHasFill=fill=>{if(!fill)return!1;let normalized=fill.toLowerCase();return normalized!=="no"&&normalized!=="none"&&normalized!=="outline"},getRotationDeg=at4=>at4&&Array.isArray(at4)&&at4.length>=3&&typeof at4[2]=="number"?at4[2]:0,isNinetyLike=deg=>{let n3=(deg%360+360)%360;return n3===90||n3===270},normalizePortName=name=>{if(name!=null)return`${name}`},getPinNumber=name=>{let normalized=normalizePortName(name),parsed=normalized!==void 0?Number(normalized):NaN;return Number.isFinite(parsed)?parsed:void 0},debug23=(0,import_debug21.default)("kicad-mod-converter"),convertKicadLayerToTscircuitLayer=kicadLayer=>{switch(kicadLayer.toLowerCase()){case"f.cu":case"f.fab":case"f.silks":case"edge.cuts":return"top";case"b.cu":case"b.fab":case"b.silks":return"bottom"}},convertKicadJsonToTsCircuitSoup=async kicadJson=>{let{fp_lines,fp_texts,fp_arcs,fp_circles,pads,properties,holes,fp_polys}=kicadJson,circuitJson=[];circuitJson.push({type:"source_component",source_component_id:"source_component_0",supplier_part_numbers:{}}),circuitJson.push({type:"schematic_component",schematic_component_id:"schematic_component_0",source_component_id:"source_component_0",center:{x:0,y:0},rotation:0,size:{width:0,height:0}});let portNames=new Set,portNameToPinNumber=new Map;for(let pad2 of pads){let portName=normalizePortName(pad2.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(pad2.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(hole.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}let sourcePortId=0,portNameToSourcePortId=new Map;for(let portName of portNames){let source_port_id=`source_port_${sourcePortId++}`;portNameToSourcePortId.set(portName,source_port_id);let pinNumber=portNameToPinNumber.get(portName);circuitJson.push({type:"source_port",source_port_id,source_component_id:"source_component_0",name:portName,port_hints:[portName],pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0}),circuitJson.push({type:"schematic_port",schematic_port_id:`schematic_port_${sourcePortId++}`,source_port_id,schematic_component_id:"schematic_component_0",center:{x:0,y:0}})}let minX=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,minY=Number.POSITIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY;for(let pad2 of pads){let x5=pad2.at[0],y5=-pad2.at[1],w4=pad2.size[0],h4=pad2.size[1];minX=Math.min(minX,x5-w4/2),maxX=Math.max(maxX,x5+w4/2),minY=Math.min(minY,y5-h4/2),maxY=Math.max(maxY,y5+h4/2)}let pcb_component_id="pcb_component_0";circuitJson.push({type:"pcb_component",source_component_id:"source_component_0",pcb_component_id,layer:"top",center:{x:0,y:0},rotation:0,width:Number.isFinite(minX)?maxX-minX:0,height:Number.isFinite(minY)?maxY-minY:0});let pcbPortId=0,portNameToPcbPortId=new Map;for(let portName of portNames){let pcb_port_id=`pcb_port_${pcbPortId++}`,source_port_id=portNameToSourcePortId.get(portName);portNameToPcbPortId.set(portName,pcb_port_id);let x5=0,y5=0,layers=["top","bottom"],pad2=pads.find(p4=>normalizePortName(p4.name)===portName);if(pad2)x5=pad2.at[0],y5=-pad2.at[1],layers=pad2.layers?pad2.layers.map(l3=>convertKicadLayerToTscircuitLayer(l3)).filter(Boolean):["top","bottom"];else if(holes){let hole=holes.find(h4=>normalizePortName(h4.name)===portName);hole&&(x5=hole.at[0],y5=-hole.at[1],layers=hole.layers?hole.layers.map(l3=>convertKicadLayerToTscircuitLayer(l3)).filter(Boolean):["top","bottom"])}circuitJson.push({type:"pcb_port",pcb_port_id,source_port_id,pcb_component_id,x:x5,y:y5,layers})}let smtpadId=0,platedHoleId=0,holeId=0;for(let pad2 of pads){let portName=normalizePortName(pad2.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0;if(pad2.pad_type==="smd"){let rotation4=getRotationDeg(pad2.at),width=isNinetyLike(rotation4)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation4)?pad2.size[0]:pad2.size[1],pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:pad2.at[0],y:-pad2.at[1],width,height,layer:convertKicadLayerToTscircuitLayer(pad2.layers?.[0]??"F.Cu"),pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_type==="thru_hole"){if(pad2.pad_shape==="rect"){let rotation4=getRotationDeg(pad2.at),width=isNinetyLike(rotation4)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation4)?pad2.size[0]:pad2.size[1],offX=pad2.drill?.offset?.[0]??0,offY=pad2.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation4),pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:pad2.at[0],y:-pad2.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:pad2.drill?.width,rect_pad_width:width,rect_pad_height:height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="circle"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:pad2.at[0],y:-pad2.at[1],outer_diameter:pad2.size[0],hole_diameter:pad2.drill?.width,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:pad2.at[0],y:-pad2.at[1],outer_width:pad2.size[0],outer_height:pad2.size[1],hole_width:pad2.drill?.width,hole_height:pad2.drill?.height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}}else pad2.pad_type==="np_thru_hole"&&circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:pad2.at[0],y:-pad2.at[1],hole_diameter:pad2.drill?.width,pcb_component_id})}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0,hasCuLayer=hole.layers?.some(l3=>l3.endsWith(".Cu")||l3==="*.Cu"),rotation4=getRotationDeg(hole.at),offX=hole.drill?.offset?.[0]??0,offY=hole.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation4),x5=hole.at[0]+rotOff.x,y5=-(hole.at[1]+rotOff.y),holeDiameter=hole.drill?.width??0,outerDiameter=hole.size?.width??holeDiameter,rr4=hole.roundrect_rratio??0,rectBorderRadius=rr4>0?Math.min(isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter)/2*rr4:0;if(hasCuLayer)if(hole.pad_shape==="rect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:hole.at[0],y:-hole.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:holeDiameter,rect_pad_width:isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,rect_pad_height:isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:x5,y:y5,outer_width:isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,outer_height:isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,hole_width:isNinetyLike(rotation4)?hole.drill?.height??holeDiameter:hole.drill?.width??holeDiameter,hole_height:isNinetyLike(rotation4)?hole.drill?.width??holeDiameter:hole.drill?.height??holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="roundrect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,offX2=hole.drill?.offset?.[0]??0,offY2=hole.drill?.offset?.[1]??0,rotOff2=rotatePoint3(offX2,offY2,rotation4),width=isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,height=isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:x5,y:y5,hole_offset_x:-rotOff2.x,hole_offset_y:rotOff2.y,hole_diameter:holeDiameter,rect_pad_width:width,rect_pad_height:height,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else{let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:x5,y:y5,outer_diameter:outerDiameter,hole_diameter:holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:x5,y:y5,hole_diameter:outerDiameter,hole_shape:"circle",pcb_component_id})}let edgeCutSegments=[];for(let fp_line2 of fp_lines)fp_line2.layer.toLowerCase()==="edge.cuts"&&edgeCutSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width});for(let fp_arc of fp_arcs)fp_arc.layer.toLowerCase()==="edge.cuts"&&edgeCutSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width});let closedPolygons=findClosedPolygons(edgeCutSegments),cutoutId=0;for(let polygon2 of closedPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${cutoutId++}`,shape:"polygon",points:points.map(p4=>({x:p4.x,y:-p4.y})),pcb_component_id})}let traceId=0,silkPathId=0,fabPathId=0,noteLineId=0;for(let fp_line2 of fp_lines){let route=[{x:fp_line2.start[0],y:-fp_line2.start[1]},{x:fp_line2.end[0],y:-fp_line2.end[1]}],lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="f.cu"?circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_line2.layer),route,thickness:fp_line2.stroke.width}):lowerLayer==="f.silks"?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width}):lowerLayer==="edge.cuts"?debug23("Skipping Edge.Cuts fp_line (converted to pcb_cutout)",fp_line2.layer):lowerLayer==="f.fab"?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width,port_hints:[]}):lowerLayer.startsWith("user.")?circuitJson.push({type:"pcb_note_line",pcb_note_line_id:`pcb_note_line_${noteLineId++}`,pcb_component_id,x1:fp_line2.start[0],y1:-fp_line2.start[1],x2:fp_line2.end[0],y2:-fp_line2.end[1],stroke_width:fp_line2.stroke.width}):debug23("Unhandled layer for fp_line",fp_line2.layer)}if(fp_polys)for(let fp_poly of fp_polys){let route=[],pushRoutePoint=point42=>{!Number.isFinite(point42.x)||!Number.isFinite(point42.y)||route.push(point42)};for(let segment2 of fp_poly.pts){if(Array.isArray(segment2)){pushRoutePoint({x:segment2[0],y:-segment2[1]});continue}if(segment2&&typeof segment2=="object"&&"kind"in segment2){if(segment2.kind==="arc"){let start=makePoint(segment2.start),mid=makePoint(segment2.mid),end=makePoint(segment2.end),arcLength=getArcLength(start,mid,end),numPoints=Math.max(8,Math.ceil(arcLength)),adjustedNumPoints=Math.max(2,Math.ceil(arcLength/.1)),arcPoints=generateArcPath(start,mid,end,adjustedNumPoints).map(p4=>({x:p4.x,y:-p4.y}));for(let point42 of arcPoints)pushRoutePoint(point42)}continue}}let routePoints=route,polygonPoints=routePoints.length>2&&routePoints[0].x===routePoints[routePoints.length-1].x&&routePoints[0].y===routePoints[routePoints.length-1].y?routePoints.slice(0,-1):routePoints;if(routePoints.length===0)continue;let strokeWidth=fp_poly.stroke?.width??0;if(fp_poly.layer.endsWith(".Cu")){let rect=getAxisAlignedRectFromPoints(polygonPoints);rect?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:rect.x,y:rect.y,width:rect.width,height:rect.height,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):fpPolyHasFill(fp_poly.fill)?polygonPoints.length>=3?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"polygon",points:polygonPoints,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth})}else fp_poly.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:routePoints,stroke_width:strokeWidth}):fp_poly.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,stroke_width:strokeWidth,port_hints:[]}):debug23("Unhandled layer for fp_poly",fp_poly.layer)}let notePathId=0;for(let fp_arc of fp_arcs){let lowerLayer=fp_arc.layer.toLowerCase();if(lowerLayer==="edge.cuts"){debug23("Skipping Edge.Cuts fp_arc (converted to pcb_cutout)",fp_arc.layer);continue}let start=makePoint(fp_arc.start),mid=makePoint(fp_arc.mid),end=makePoint(fp_arc.end),arcLength=getArcLength(start,mid,end),arcPoints=generateArcPath(start,mid,end,Math.ceil(arcLength));if(lowerLayer.startsWith("user.")){circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width});continue}let tscircuitLayer=convertKicadLayerToTscircuitLayer(fp_arc.layer);if(!tscircuitLayer){debug23("Unable to convert layer for fp_arc",fp_arc.layer);continue}circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,layer:tscircuitLayer,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width})}if(fp_circles)for(let fp_circle of fp_circles){let lowerLayer=fp_circle.layer.toLowerCase(),center2=makePoint(fp_circle.center),endPoint=makePoint(fp_circle.end),radius=Math.sqrt((endPoint.x-center2.x)**2+(endPoint.y-center2.y)**2),numPoints=Math.max(16,Math.ceil(2*Math.PI*radius)),circlePoints=[];for(let i2=0;i2<=numPoints;i2++){let angle=i2/numPoints*2*Math.PI;circlePoints.push({x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)})}lowerLayer.startsWith("user.")&&circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:circlePoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_circle.stroke.width})}for(let fp_text of fp_texts){let layerRef=convertKicadLayerToTscircuitLayer(fp_text.layer);fp_text.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):fp_text.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):debug23("Unhandled layer for fp_text",fp_text.layer)}let refProp=properties.find(prop=>prop.key==="Reference"),valProp=properties.find(prop=>prop.key==="Value"),propFabTexts=[refProp,valProp].filter(p4=>p4&&!!p4.val);for(let propFab of propFabTexts){let at4=propFab.attributes.at;if(!at4)continue;let isFabLayer=propFab.attributes.layer?.toLowerCase()?.endsWith(".fab"),font_size=getSilkscreenFontSizeFromFpTexts(fp_texts);circuitJson.push({type:isFabLayer?"pcb_fabrication_note_text":"pcb_silkscreen_text",layer:"top",font:"tscircuit2024",font_size,pcb_component_id,anchor_position:{x:at4[0],y:-at4[1]},anchor_alignment:"center",text:propFab.val})}return circuitJson},parseKicadModToCircuitJson=async kicadMod=>{let kicadJson=parseKicadModToKicadJson(kicadMod);return await convertKicadJsonToTsCircuitSoup(kicadJson)};var transformJsDelivrImports=code=>code.replace(/from\s*["']\/npm\//g,'from "https://cdn.jsdelivr.net/npm/').replace(/import\s*\(\s*["']\/npm\//g,'import("https://cdn.jsdelivr.net/npm/'),dynamicallyLoadDependencyWithCdnBackup=async packageName=>{try{return(await import(packageName)).default}catch{console.log(`Failed to load ${packageName} locally, trying CDN fallback...`);try{let res2=await fetch(`https://cdn.jsdelivr.net/npm/${packageName}/+esm`);if(!res2.ok)throw new Error(`Failed to fetch ${packageName} from CDN: ${res2.statusText}`);let code=await res2.text();code=transformJsDelivrImports(code);let blob=new Blob([code],{type:"application/javascript"}),url2=URL.createObjectURL(blob);try{let{default:loadedModule}=await import(url2);return loadedModule}finally{URL.revokeObjectURL(url2)}}catch(cdnError){throw console.error(`CDN fallback for ${packageName} also failed:`,cdnError),cdnError}}};var KICAD_FOOTPRINT_CACHE_URL="https://kicad-mod-cache.tscircuit.com",ngspiceEngineCache=null,getPlatformConfig=(overrides={})=>({localCacheEngine:overrides.localCacheEngine,partsEngine:jlcPartsEngine,spiceEngineMap:{ngspice:{simulate:async spice=>{if(!ngspiceEngineCache){let createNgspiceSpiceEngine=await dynamicallyLoadDependencyWithCdnBackup("@tscircuit/ngspice-spice-engine").catch(error=>{throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.",{cause:error})});createNgspiceSpiceEngine&&(ngspiceEngineCache=await createNgspiceSpiceEngine())}if(!ngspiceEngineCache)throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.");return ngspiceEngineCache.simulate(spice)}}},footprintLibraryMap:{kicad:async footprintName=>{let baseUrl=`${KICAD_FOOTPRINT_CACHE_URL}/${footprintName}`,circuitJsonUrl=`${baseUrl}.circuit.json`,res2=await fetch(circuitJsonUrl);if(!res2.ok){let bodyPreview=(await res2.text()).slice(0,200);throw new Error(`Failed to load KiCad footprint "${footprintName}" from ${circuitJsonUrl} (HTTP ${res2.status}). ${bodyPreview}`)}let raw;try{raw=await res2.json()}catch{throw new Error(`Failed to parse KiCad footprint JSON for "${footprintName}" from ${circuitJsonUrl}`)}let filtered=Array.isArray(raw)?raw.filter(el3=>el3?.type==="pcb_silkscreen_text"?el3?.text==="REF**":!0):[raw],wrlUrl=`${baseUrl}.wrl`,stepUrl=`${baseUrl}.step`;return{footprintCircuitJson:filtered,cadModel:{wrlUrl,stepUrl,modelUnitToMmScale:2.54}}}},footprintFileParserMap:{kicad_mod:{loadFromUrl:async url2=>{let kicadContent=await fetch(url2).then(res2=>res2.text()),kicadJson=await parseKicadModToCircuitJson(kicadContent);return{footprintCircuitJson:Array.isArray(kicadJson)?kicadJson:[kicadJson]}}}}});var tslib_es6_exports={};__export(tslib_es6_exports,{__addDisposableResource:()=>__addDisposableResource,__assign:()=>__assign,__asyncDelegator:()=>__asyncDelegator,__asyncGenerator:()=>__asyncGenerator,__asyncValues:()=>__asyncValues,__await:()=>__await,__awaiter:()=>__awaiter,__classPrivateFieldGet:()=>__classPrivateFieldGet,__classPrivateFieldIn:()=>__classPrivateFieldIn,__classPrivateFieldSet:()=>__classPrivateFieldSet,__createBinding:()=>__createBinding,__decorate:()=>__decorate,__disposeResources:()=>__disposeResources,__esDecorate:()=>__esDecorate,__exportStar:()=>__exportStar,__extends:()=>__extends,__generator:()=>__generator,__importDefault:()=>__importDefault,__importStar:()=>__importStar,__makeTemplateObject:()=>__makeTemplateObject,__metadata:()=>__metadata,__param:()=>__param,__propKey:()=>__propKey,__read:()=>__read,__rest:()=>__rest,__rewriteRelativeImportExtension:()=>__rewriteRelativeImportExtension,__runInitializers:()=>__runInitializers,__setFunctionName:()=>__setFunctionName,__spread:()=>__spread,__spreadArray:()=>__spreadArray,__spreadArrays:()=>__spreadArrays,__values:()=>__values,default:()=>tslib_es6_default});var extendStatics=function(d3,b3){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d4,b4){d4.__proto__=b4}||function(d4,b4){for(var p4 in b4)Object.prototype.hasOwnProperty.call(b4,p4)&&(d4[p4]=b4[p4])},extendStatics(d3,b3)};function __extends(d3,b3){if(typeof b3!="function"&&b3!==null)throw new TypeError("Class extends value "+String(b3)+" is not a constructor or null");extendStatics(d3,b3);function __(){this.constructor=d3}d3.prototype=b3===null?Object.create(b3):(__.prototype=b3.prototype,new __)}var __assign=function(){return __assign=Object.assign||function(t21){for(var s2,i2=1,n3=arguments.length;i2<n3;i2++){s2=arguments[i2];for(var p4 in s2)Object.prototype.hasOwnProperty.call(s2,p4)&&(t21[p4]=s2[p4])}return t21},__assign.apply(this,arguments)};function __rest(s2,e4){var t21={};for(var p4 in s2)Object.prototype.hasOwnProperty.call(s2,p4)&&e4.indexOf(p4)<0&&(t21[p4]=s2[p4]);if(s2!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i2=0,p4=Object.getOwnPropertySymbols(s2);i2<p4.length;i2++)e4.indexOf(p4[i2])<0&&Object.prototype.propertyIsEnumerable.call(s2,p4[i2])&&(t21[p4[i2]]=s2[p4[i2]]);return t21}function __decorate(decorators,target,key,desc){var c3=arguments.length,r4=c3<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d3;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r4=Reflect.decorate(decorators,target,key,desc);else for(var i2=decorators.length-1;i2>=0;i2--)(d3=decorators[i2])&&(r4=(c3<3?d3(r4):c3>3?d3(target,key,r4):d3(target,key))||r4);return c3>3&&r4&&Object.defineProperty(target,key,r4),r4}function __param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function __esDecorate(ctor,descriptorIn,decorators,contextIn,initializers,extraInitializers){function accept(f2){if(f2!==void 0&&typeof f2!="function")throw new TypeError("Function expected");return f2}for(var kind=contextIn.kind,key=kind==="getter"?"get":kind==="setter"?"set":"value",target=!descriptorIn&&ctor?contextIn.static?ctor:ctor.prototype:null,descriptor=descriptorIn||(target?Object.getOwnPropertyDescriptor(target,contextIn.name):{}),_5,done=!1,i2=decorators.length-1;i2>=0;i2--){var context={};for(var p4 in contextIn)context[p4]=p4==="access"?{}:contextIn[p4];for(var p4 in contextIn.access)context.access[p4]=contextIn.access[p4];context.addInitializer=function(f2){if(done)throw new TypeError("Cannot add initializers after decoration has completed");extraInitializers.push(accept(f2||null))};var result=(0,decorators[i2])(kind==="accessor"?{get:descriptor.get,set:descriptor.set}:descriptor[key],context);if(kind==="accessor"){if(result===void 0)continue;if(result===null||typeof result!="object")throw new TypeError("Object expected");(_5=accept(result.get))&&(descriptor.get=_5),(_5=accept(result.set))&&(descriptor.set=_5),(_5=accept(result.init))&&initializers.unshift(_5)}else(_5=accept(result))&&(kind==="field"?initializers.unshift(_5):descriptor[key]=_5)}target&&Object.defineProperty(target,contextIn.name,descriptor),done=!0}function __runInitializers(thisArg,initializers,value){for(var useValue=arguments.length>2,i2=0;i2<initializers.length;i2++)value=useValue?initializers[i2].call(thisArg,value):initializers[i2].call(thisArg);return useValue?value:void 0}function __propKey(x5){return typeof x5=="symbol"?x5:"".concat(x5)}function __setFunctionName(f2,name,prefix){return typeof name=="symbol"&&(name=name.description?"[".concat(name.description,"]"):""),Object.defineProperty(f2,"name",{configurable:!0,value:prefix?"".concat(prefix," ",name):name})}function __metadata(metadataKey,metadataValue){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(metadataKey,metadataValue)}function __awaiter(thisArg,_arguments,P5,generator){function adopt(value){return value instanceof P5?value:new P5(function(resolve){resolve(value)})}return new(P5||(P5=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e4){reject(e4)}}function rejected(value){try{step(generator.throw(value))}catch(e4){reject(e4)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}function __generator(thisArg,body){var _5={label:0,sent:function(){if(t21[0]&1)throw t21[1];return t21[1]},trys:[],ops:[]},f2,y5,t21,g7=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return g7.next=verb(0),g7.throw=verb(1),g7.return=verb(2),typeof Symbol=="function"&&(g7[Symbol.iterator]=function(){return this}),g7;function verb(n3){return function(v5){return step([n3,v5])}}function step(op2){if(f2)throw new TypeError("Generator is already executing.");for(;g7&&(g7=0,op2[0]&&(_5=0)),_5;)try{if(f2=1,y5&&(t21=op2[0]&2?y5.return:op2[0]?y5.throw||((t21=y5.return)&&t21.call(y5),0):y5.next)&&!(t21=t21.call(y5,op2[1])).done)return t21;switch(y5=0,t21&&(op2=[op2[0]&2,t21.value]),op2[0]){case 0:case 1:t21=op2;break;case 4:return _5.label++,{value:op2[1],done:!1};case 5:_5.label++,y5=op2[1],op2=[0];continue;case 7:op2=_5.ops.pop(),_5.trys.pop();continue;default:if(t21=_5.trys,!(t21=t21.length>0&&t21[t21.length-1])&&(op2[0]===6||op2[0]===2)){_5=0;continue}if(op2[0]===3&&(!t21||op2[1]>t21[0]&&op2[1]<t21[3])){_5.label=op2[1];break}if(op2[0]===6&&_5.label<t21[1]){_5.label=t21[1],t21=op2;break}if(t21&&_5.label<t21[2]){_5.label=t21[2],_5.ops.push(op2);break}t21[2]&&_5.ops.pop(),_5.trys.pop();continue}op2=body.call(thisArg,_5)}catch(e4){op2=[6,e4],y5=0}finally{f2=t21=0}if(op2[0]&5)throw op2[1];return{value:op2[0]?op2[1]:void 0,done:!0}}}var __createBinding=Object.create?(function(o3,m3,k4,k22){k22===void 0&&(k22=k4);var desc=Object.getOwnPropertyDescriptor(m3,k4);(!desc||("get"in desc?!m3.__esModule:desc.writable||desc.configurable))&&(desc={enumerable:!0,get:function(){return m3[k4]}}),Object.defineProperty(o3,k22,desc)}):(function(o3,m3,k4,k22){k22===void 0&&(k22=k4),o3[k22]=m3[k4]});function __exportStar(m3,o3){for(var p4 in m3)p4!=="default"&&!Object.prototype.hasOwnProperty.call(o3,p4)&&__createBinding(o3,m3,p4)}function __values(o3){var s2=typeof Symbol=="function"&&Symbol.iterator,m3=s2&&o3[s2],i2=0;if(m3)return m3.call(o3);if(o3&&typeof o3.length=="number")return{next:function(){return o3&&i2>=o3.length&&(o3=void 0),{value:o3&&o3[i2++],done:!o3}}};throw new TypeError(s2?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(o3,n3){var m3=typeof Symbol=="function"&&o3[Symbol.iterator];if(!m3)return o3;var i2=m3.call(o3),r4,ar4=[],e4;try{for(;(n3===void 0||n3-- >0)&&!(r4=i2.next()).done;)ar4.push(r4.value)}catch(error){e4={error}}finally{try{r4&&!r4.done&&(m3=i2.return)&&m3.call(i2)}finally{if(e4)throw e4.error}}return ar4}function __spread(){for(var ar4=[],i2=0;i2<arguments.length;i2++)ar4=ar4.concat(__read(arguments[i2]));return ar4}function __spreadArrays(){for(var s2=0,i2=0,il3=arguments.length;i2<il3;i2++)s2+=arguments[i2].length;for(var r4=Array(s2),k4=0,i2=0;i2<il3;i2++)for(var a2=arguments[i2],j4=0,jl3=a2.length;j4<jl3;j4++,k4++)r4[k4]=a2[j4];return r4}function __spreadArray(to3,from,pack2){if(pack2||arguments.length===2)for(var i2=0,l3=from.length,ar4;i2<l3;i2++)(ar4||!(i2 in from))&&(ar4||(ar4=Array.prototype.slice.call(from,0,i2)),ar4[i2]=from[i2]);return to3.concat(ar4||Array.prototype.slice.call(from))}function __await(v5){return this instanceof __await?(this.v=v5,this):new __await(v5)}function __asyncGenerator(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g7=generator.apply(thisArg,_arguments||[]),i2,q4=[];return i2=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i2[Symbol.asyncIterator]=function(){return this},i2;function awaitReturn(f2){return function(v5){return Promise.resolve(v5).then(f2,reject)}}function verb(n3,f2){g7[n3]&&(i2[n3]=function(v5){return new Promise(function(a2,b3){q4.push([n3,v5,a2,b3])>1||resume(n3,v5)})},f2&&(i2[n3]=f2(i2[n3])))}function resume(n3,v5){try{step(g7[n3](v5))}catch(e4){settle(q4[0][3],e4)}}function step(r4){r4.value instanceof __await?Promise.resolve(r4.value.v).then(fulfill,reject):settle(q4[0][2],r4)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f2,v5){f2(v5),q4.shift(),q4.length&&resume(q4[0][0],q4[0][1])}}function __asyncDelegator(o3){var i2,p4;return i2={},verb("next"),verb("throw",function(e4){throw e4}),verb("return"),i2[Symbol.iterator]=function(){return this},i2;function verb(n3,f2){i2[n3]=o3[n3]?function(v5){return(p4=!p4)?{value:__await(o3[n3](v5)),done:!1}:f2?f2(v5):v5}:f2}}function __asyncValues(o3){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m3=o3[Symbol.asyncIterator],i2;return m3?m3.call(o3):(o3=typeof __values=="function"?__values(o3):o3[Symbol.iterator](),i2={},verb("next"),verb("throw"),verb("return"),i2[Symbol.asyncIterator]=function(){return this},i2);function verb(n3){i2[n3]=o3[n3]&&function(v5){return new Promise(function(resolve,reject){v5=o3[n3](v5),settle(resolve,reject,v5.done,v5.value)})}}function settle(resolve,reject,d3,v5){Promise.resolve(v5).then(function(v7){resolve({value:v7,done:d3})},reject)}}function __makeTemplateObject(cooked,raw){return Object.defineProperty?Object.defineProperty(cooked,"raw",{value:raw}):cooked.raw=raw,cooked}var __setModuleDefault=Object.create?(function(o3,v5){Object.defineProperty(o3,"default",{enumerable:!0,value:v5})}):function(o3,v5){o3.default=v5},ownKeys=function(o3){return ownKeys=Object.getOwnPropertyNames||function(o4){var ar4=[];for(var k4 in o4)Object.prototype.hasOwnProperty.call(o4,k4)&&(ar4[ar4.length]=k4);return ar4},ownKeys(o3)};function __importStar(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k4=ownKeys(mod),i2=0;i2<k4.length;i2++)k4[i2]!=="default"&&__createBinding(result,mod,k4[i2]);return __setModuleDefault(result,mod),result}function __importDefault(mod){return mod&&mod.__esModule?mod:{default:mod}}function __classPrivateFieldGet(receiver,state2,kind,f2){if(kind==="a"&&!f2)throw new TypeError("Private accessor was defined without a getter");if(typeof state2=="function"?receiver!==state2||!f2:!state2.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f2:kind==="a"?f2.call(receiver):f2?f2.value:state2.get(receiver)}function __classPrivateFieldSet(receiver,state2,value,kind,f2){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f2)throw new TypeError("Private accessor was defined without a setter");if(typeof state2=="function"?receiver!==state2||!f2:!state2.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f2.call(receiver,value):f2?f2.value=value:state2.set(receiver,value),value}function __classPrivateFieldIn(state2,receiver){if(receiver===null||typeof receiver!="object"&&typeof receiver!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof state2=="function"?receiver===state2:state2.has(receiver)}function __addDisposableResource(env,value,async){if(value!=null){if(typeof value!="object"&&typeof value!="function")throw new TypeError("Object expected.");var dispose,inner;if(async){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");dispose=value[Symbol.asyncDispose]}if(dispose===void 0){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");dispose=value[Symbol.dispose],async&&(inner=dispose)}if(typeof dispose!="function")throw new TypeError("Object not disposable.");inner&&(dispose=function(){try{inner.call(this)}catch(e4){return Promise.reject(e4)}}),env.stack.push({value,dispose,async})}else async&&env.stack.push({async:!0});return value}var _SuppressedError=typeof SuppressedError=="function"?SuppressedError:function(error,suppressed,message){var e4=new Error(message);return e4.name="SuppressedError",e4.error=error,e4.suppressed=suppressed,e4};function __disposeResources(env){function fail(e4){env.error=env.hasError?new _SuppressedError(e4,env.error,"An error was suppressed during disposal."):e4,env.hasError=!0}var r4,s2=0;function next2(){for(;r4=env.stack.pop();)try{if(!r4.async&&s2===1)return s2=0,env.stack.push(r4),Promise.resolve().then(next2);if(r4.dispose){var result=r4.dispose.call(r4.value);if(r4.async)return s2|=2,Promise.resolve(result).then(next2,function(e4){return fail(e4),next2()})}else s2|=1}catch(e4){fail(e4)}if(s2===1)return env.hasError?Promise.reject(env.error):Promise.resolve();if(env.hasError)throw env.error}return next2()}function __rewriteRelativeImportExtension(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m3,tsx,d3,ext,cm2){return tsx?preserveJsx?".jsx":".js":d3&&(!ext||!cm2)?m3:d3+ext+"."+cm2.toLowerCase()+"js"}):path}var tslib_es6_default={__extends,__assign,__rest,__decorate,__param,__esDecorate,__runInitializers,__propKey,__setFunctionName,__metadata,__awaiter,__generator,__createBinding,__exportStar,__values,__read,__spread,__spreadArrays,__spreadArray,__await,__asyncGenerator,__asyncDelegator,__asyncValues,__makeTemplateObject,__importStar,__importDefault,__classPrivateFieldGet,__classPrivateFieldSet,__classPrivateFieldIn,__addDisposableResource,__disposeResources,__rewriteRelativeImportExtension};var import_debug22=__toESM(require_browser(),1),debug12=(0,import_debug22.default)("tsci:eval:execution-context");function createExecutionContext(webWorkerConfiguration,opts={}){globalThis.React=React;let basePlatform=opts.platform||getPlatformConfig(),platform=opts.projectConfig?{...basePlatform,...opts.projectConfig}:basePlatform;platform.partsEngineDisabled&&(platform.partsEngine=void 0);let circuit=new RootCircuit({platform});opts.name&&(circuit.name=opts.name),opts.debugNamespace&&circuit.enableDebug(opts.debugNamespace);let logs=[];return{fsMap:{},entrypoint:"",logger:{info:message=>{logs.push({msg:message})},getLogs:()=>logs,stringifyLogs:()=>logs.map(log=>log.msg).join(`
|