@tscircuit/eval 0.0.799 → 0.0.800
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/eval/index.js +163 -24
- package/dist/lib/index.js +163 -24
- package/dist/platform-config/getPlatformConfig.js +163 -24
- package/dist/webworker/entrypoint.js +1 -1
- package/package.json +2 -2
|
@@ -670,7 +670,7 @@ ${spiceString}`)}catch(error2){debug10(`Failed to convert circuit JSON to SPICE:
|
|
|
670
670
|
`+filler+` |
|
|
671
671
|
`+offset_s.line+" | "+line2+`
|
|
672
672
|
`+filler+" | "+peg$padEnd3("",s3.column-1," ")+peg$padEnd3("",hatLen,"^")}else str+=`
|
|
673
|
-
at `+loc}return str};peg$SyntaxError3.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch3){return ch3.charCodeAt(0).toString(16).toUpperCase()}function literalEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function classEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i3,j4;if(descriptions.sort(),descriptions.length>0){for(i3=1,j4=1;i3<descriptions.length;i3++)descriptions[i3-1]!==descriptions[i3]&&(descriptions[j4]=descriptions[i3],j4++);descriptions.length=j4}switch(descriptions.length){case 1:return descriptions[0];case 2:return descriptions[0]+" or "+descriptions[1];default:return descriptions.slice(0,-1).join(", ")+", or "+descriptions[descriptions.length-1]}}function describeFound(found2){return found2?'"'+literalEscape(found2)+'"':"end of input"}return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found."};function decomposeTSR3(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose4(matrix2,scale4(-1,-1)):matrix2=compose4(matrix2,scale4(1,-1)):flipY2&&(matrix2=compose4(matrix2,scale4(-1,1)));let a3=matrix2.a,b3=matrix2.b,c4=matrix2.c,d4=matrix2.d,scaleX,scaleY,rotation22;if(a3!==0||c4!==0){let hypotAc=Math.hypot(a3,c4);scaleX=hypotAc,scaleY=(a3*d4-b3*c4)/hypotAc;let acos=Math.acos(a3/hypotAc);rotation22=c4>0?-acos:acos}else if(b3!==0||d4!==0){let hypotBd=Math.hypot(b3,d4);scaleX=(a3*d4-b3*c4)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b3/hypotBd);rotation22=Math.PI/2+(d4>0?-acos:acos)}else scaleX=0,scaleY=0,rotation22=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation22}}}function connect2(map,a3,b3){if(!a3||!b3)return;let setA=map.get(a3);setA||(setA=new Set,map.set(a3,setA)),setA.add(b3);let setB=map.get(b3);setB||(setB=new Set,map.set(b3,setB)),setB.add(a3)}function buildSubtree2(soup,opts){if(!opts.subcircuit_id&&!opts.source_group_id)return[...soup];let effectiveOpts=opts;if(opts.subcircuit_id){let subcircuitIds=new Set([opts.subcircuit_id]),groupChildren=new Map,groupSubcircuit=new Map;for(let elm of soup)if(elm.type==="source_group"){let groupId=elm.source_group_id,subcircuitId=elm.subcircuit_id;subcircuitId&&groupSubcircuit.set(groupId,subcircuitId);let parentId=elm.parent_source_group_id;parentId&&(groupChildren.has(parentId)||groupChildren.set(parentId,[]),groupChildren.get(parentId).push(groupId))}let rootGroupId;for(let[groupId,subcircuitId]of groupSubcircuit)if(subcircuitId===opts.subcircuit_id){rootGroupId=groupId;break}if(rootGroupId){let collectChildSubcircuits=groupId=>{let children=groupChildren.get(groupId)||[];for(let childId of children){let childSubcircuit=groupSubcircuit.get(childId);childSubcircuit&&subcircuitIds.add(childSubcircuit),collectChildSubcircuits(childId)}};collectChildSubcircuits(rootGroupId),effectiveOpts={...opts,subcircuit_ids:Array.from(subcircuitIds)}}}let idMap=new Map;for(let elm of soup){let idKey=`${elm.type}_id`,idVal=elm[idKey];typeof idVal=="string"&&idMap.set(idVal,elm)}let adj=new Map;for(let elm of soup){let entries=Object.entries(elm);for(let[key,val]of entries)if(key!=="parent_source_group_id"){if(key.endsWith("_id")&&typeof val=="string"){let other=idMap.get(val);connect2(adj,elm,other)}else if(key.endsWith("_ids")&&Array.isArray(val)){for(let v4 of val)if(typeof v4=="string"){let other=idMap.get(v4);connect2(adj,elm,other)}}}}let queue=[],included=new Set;for(let elm of soup){let shouldInclude=!1;(effectiveOpts.subcircuit_id&&"subcircuit_id"in elm&&elm.subcircuit_id===effectiveOpts.subcircuit_id||effectiveOpts.subcircuit_ids&&"subcircuit_id"in elm&&elm.subcircuit_id&&effectiveOpts.subcircuit_ids.includes(elm.subcircuit_id)||effectiveOpts.source_group_id&&"source_group_id"in elm&&elm.source_group_id===effectiveOpts.source_group_id||effectiveOpts.source_group_id&&"member_source_group_ids"in elm&&Array.isArray(elm.member_source_group_ids)&&elm.member_source_group_ids.includes(effectiveOpts.source_group_id))&&(shouldInclude=!0),shouldInclude&&(queue.push(elm),included.add(elm))}for(;queue.length>0;){let elm=queue.shift(),neighbors=adj.get(elm);if(neighbors)for(let n4 of neighbors)included.has(n4)||(included.add(n4),queue.push(n4))}return soup.filter(e5=>included.has(e5))}var cju2=(circuitJsonInput,options={})=>{let circuitJson=circuitJsonInput,internalStore=circuitJson._internal_store;if(!internalStore){internalStore={counts:{},editCount:0},circuitJson._internal_store=internalStore;for(let elm of circuitJson){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))}}let su22=new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(circuitJson.editCount=internalStore.editCount,circuitJson);if(prop==="editCount")return internalStore.editCount;if(prop==="subtree")return opts=>cju2(buildSubtree2(circuitJson,opts),options);if(prop==="insert")return elm=>{var _a362;let component_type2=elm.type;if(!component_type2)throw new Error("insert requires an element with a type");(_a362=internalStore.counts)[component_type2]??(_a362[component_type2]=-1),internalStore.counts[component_type2]++;let index=internalStore.counts[component_type2],newElm={...elm,type:component_type2,[`${component_type2}_id`]:`${component_type2}_${index}`};return options.validateInserts&&(dist_exports6[component_type2]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm};if(prop==="insertAll")return elms=>elms.map(elm=>su22.insert(elm));let component_type=prop;return{get:id2=>circuitJson.find(e5=>e5.type===component_type&&e5[`${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=circuitJson.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner?circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return circuitJson.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return circuitJson.filter(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},insert:elm=>{var _a362;(_a362=internalStore.counts)[component_type]??(_a362[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_exports6[component_type]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm},delete:id2=>{let elm=circuitJson.find(e5=>e5[`${component_type}_id`]===id2);elm&&(circuitJson.splice(circuitJson.indexOf(elm),1),internalStore.editCount++)},update:(id2,newProps)=>{let elm=circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2);return elm?(Object.assign(elm,newProps),internalStore.editCount++,elm):null},select:selector=>{if(component_type==="source_component")return circuitJson.find(e5=>e5.type==="source_component"&&e5.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=circuitJson.find(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=circuitJson.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return circuitJson.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id);if(component_type==="schematic_port")return circuitJson.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)}}}}});return su22};cju2.unparsed=cju2;function createIdKey2(element){let type=element.type;return`${type}:${element[`${type}_id`]}`}var cjuIndexed2=(soup,options={})=>{let internalStore=soup._internal_store_indexed;if(!internalStore){internalStore={counts:{},editCount:0,indexes:{}};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))}let indexConfig=options.indexConfig||{},indexes=internalStore.indexes;if(indexConfig.byId&&(indexes.byId=new Map),indexConfig.byType&&(indexes.byType=new Map),indexConfig.byRelation&&(indexes.byRelation=new Map),indexConfig.bySubcircuit&&(indexes.bySubcircuit=new Map),indexConfig.byCustomField&&indexConfig.byCustomField.length>0){indexes.byCustomField=new Map;for(let field of indexConfig.byCustomField)indexes.byCustomField.set(field,new Map)}for(let element of soup){if(indexConfig.byId){let idKey=createIdKey2(element);indexes.byId.set(idKey,element)}if(indexConfig.byType){let elementsOfType=indexes.byType.get(element.type)||[];elementsOfType.push(element),indexes.byType.set(element.type,elementsOfType)}if(indexConfig.byRelation){let elementEntries=Object.entries(element);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${element.type}_id`&&typeof value=="string"){let relationTypeMap=indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(element),relationTypeMap.set(value,relatedElements),indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&"subcircuit_id"in element){let subcircuitId=element.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(element),indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in element){let fieldValue=element[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(element),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}}soup._internal_store_indexed=internalStore}return new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(soup.editCount=internalStore.editCount,soup);if(prop==="editCount")return internalStore.editCount;let component_type=prop;return{get:id2=>{let indexConfig=options.indexConfig||{};return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${id2}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2)||null},getUsing:using=>{let indexConfig=options.indexConfig||{},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","");if(indexConfig.byRelation&&internalStore.indexes.byRelation){let relationMap=internalStore.indexes.byRelation.get(join_key);if(relationMap){let joiner2=(relationMap.get(using[join_key])||[]).find(e5=>e5.type===join_type);if(!joiner2)return null;let joinerId=joiner2[`${component_type}_id`];return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${joinerId}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===joinerId)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joinerId)||null}}let joiner=soup.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner&&soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`])||null},getWhere:where=>{let indexConfig=options.indexConfig||{},keys=Object.keys(where);if(keys.length===1&&indexConfig.byCustomField&&internalStore.indexes.byCustomField){let field=keys[0],fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let fieldValue=String(where[field]);return(fieldMap.get(fieldValue)||[]).find(e5=>e5.type===component_type)||null}}if("subcircuit_id"in where&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null}return indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>keys.every(key=>e5[key]===where[key]))||null:soup.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null},list:where=>{let indexConfig=options.indexConfig||{},keys=where?Object.keys(where):[];if(keys.length===0&&indexConfig.byType&&internalStore.indexes.byType)return internalStore.indexes.byType.get(component_type)||[];if(keys.length===1&&keys[0]==="subcircuit_id"&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5.type===component_type)}let elementsToFilter;return indexConfig.byType&&internalStore.indexes.byType?elementsToFilter=internalStore.indexes.byType.get(component_type)||[]:elementsToFilter=soup.filter(e5=>e5.type===component_type),keys.length>0?elementsToFilter.filter(e5=>keys.every(key=>e5[key]===where[key])):elementsToFilter},insert:elm=>{var _a362;(_a362=internalStore.counts)[component_type]??(_a362[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};options.validateInserts&&(dist_exports6[component_type]??any_soup_element2).parse(newElm),soup.push(newElm),internalStore.editCount++;let indexConfig=options.indexConfig||{};if(indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(newElm);internalStore.indexes.byId.set(idKey,newElm)}if(indexConfig.byType&&internalStore.indexes.byType){let elementsOfType=internalStore.indexes.byType.get(component_type)||[];elementsOfType.push(newElm),internalStore.indexes.byType.set(component_type,elementsOfType)}if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(newElm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${newElm.type}_id`&&typeof value=="string"){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(newElm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in newElm){let subcircuitId=newElm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(newElm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in newElm){let fieldValue=newElm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(newElm),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}return newElm},delete:id2=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5[`${component_type}_id`]===id2),!elm)return;let elmIndex=soup.indexOf(elm);if(elmIndex>=0&&(soup.splice(elmIndex,1),internalStore.editCount++),indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(elm);internalStore.indexes.byId.delete(idKey)}if(indexConfig.byType&&internalStore.indexes.byType){let filteredElements=(internalStore.indexes.byType.get(component_type)||[]).filter(e5=>e5[`${component_type}_id`]!==id2);internalStore.indexes.byType.set(component_type,filteredElements)}if(indexConfig.byRelation&&internalStore.indexes.byRelation)for(let[relationKey,relationMap]of internalStore.indexes.byRelation.entries())for(let[relationValue,elements]of relationMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?relationMap.delete(relationValue):relationMap.set(relationValue,updatedElements)}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm){let subcircuitId=elm.subcircuit_id;if(subcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(subcircuitId):internalStore.indexes.bySubcircuit.set(subcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField)for(let fieldMap of internalStore.indexes.byCustomField.values())for(let[fieldValue,elements]of fieldMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(fieldValue):fieldMap.set(fieldValue,updatedElements)}},update:(id2,newProps)=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2),!elm)return null;if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps&&newProps[key]!==value){let relationTypeMap=internalStore.indexes.byRelation.get(key);if(relationTypeMap){let updatedElements=(relationTypeMap.get(value)||[]).filter(e5=>e5!==elm);updatedElements.length===0?relationTypeMap.delete(value):relationTypeMap.set(value,updatedElements)}}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let oldSubcircuitId=elm.subcircuit_id,newSubcircuitId=newProps.subcircuit_id;if(oldSubcircuitId!==newSubcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(oldSubcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(oldSubcircuitId):internalStore.indexes.bySubcircuit.set(oldSubcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps&&elm[field]!==newProps[field]){let fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let oldValue=String(elm[field]),updatedElements=(fieldMap.get(oldValue)||[]).filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(oldValue):fieldMap.set(oldValue,updatedElements)}}}if(Object.assign(elm,newProps),internalStore.editCount++,indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.includes(elm)||(relatedElements.push(elm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap))}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let subcircuitId=elm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.includes(elm)||(subcircuitElements.push(elm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements))}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps){let fieldValue=elm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.includes(elm)||(elementsWithFieldValue.push(elm),fieldMap.set(fieldValueStr,elementsWithFieldValue))}}}return elm},select:selector=>{if(component_type==="source_component")return soup.find(e5=>e5.type==="source_component"&&e5.name===selector.replace(/\./g,""))||null;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(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=soup.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return soup.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id)||null;if(component_type==="schematic_port")return soup.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)||null}return null}}}})};cjuIndexed2.unparsed=cjuIndexed2;var transformPCBElement2=(elm,matrix2)=>{let tsr=decomposeTSR3(matrix2),flipPadWidthHeight=Math.round(tsr.rotation.angle/(Math.PI/2))%2===1;if(elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="pcb_via"||elm.type==="pcb_smtpad"||elm.type==="pcb_port"){let{x:x4,y:y4}=applyToPoint4(matrix2,{x:Number(elm.x),y:Number(elm.y)});elm.x=x4,elm.y=y4,elm.type==="pcb_smtpad"&&elm.shape==="polygon"&&Array.isArray(elm.points)&&(elm.points=elm.points.map(point23=>{let tp3=applyToPoint4(matrix2,{x:point23.x,y:point23.y});return{x:tp3.x,y:tp3.y}}))}else if(elm.type==="pcb_keepout"||elm.type==="pcb_board")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_silkscreen_text"||elm.type==="pcb_fabrication_note_text"||elm.type==="pcb_note_text")elm.anchor_position=applyToPoint4(matrix2,elm.anchor_position);else if(elm.type==="pcb_silkscreen_circle"||elm.type==="pcb_silkscreen_rect"||elm.type==="pcb_note_rect"||elm.type==="pcb_courtyard_rect"||elm.type==="pcb_courtyard_circle")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_component")elm.center=applyToPoint4(matrix2,elm.center),elm.rotation=elm.rotation+tsr.rotation.angle/Math.PI*180,elm.rotation=elm.rotation%360,flipPadWidthHeight&&([elm.width,elm.height]=[elm.height,elm.width]);else if(elm.type==="pcb_courtyard_outline")elm.outline=elm.outline.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_courtyard_polygon")elm.points=elm.points.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_silkscreen_path"||elm.type==="pcb_trace"||elm.type==="pcb_fabrication_note_path"||elm.type==="pcb_note_path")elm.route=elm.route.map(rp3=>{let tp3=applyToPoint4(matrix2,rp3);return rp3.x=tp3.x,rp3.y=tp3.y,rp3});else if(elm.type==="pcb_silkscreen_line"||elm.type==="pcb_note_line"){let p12={x:elm.x1,y:elm.y1},p22={x:elm.x2,y:elm.y2},p1t=applyToPoint4(matrix2,p12),p2t=applyToPoint4(matrix2,p22);elm.x1=p1t.x,elm.y1=p1t.y,elm.x2=p2t.x,elm.y2=p2t.y}else if(elm.type==="cad_component"){let newPos=applyToPoint4(matrix2,{x:elm.position.x,y:elm.position.y});elm.position.x=newPos.x,elm.position.y=newPos.y}return elm},transformPCBElements2=(elms,matrix2)=>{let tsr=decomposeTSR3(matrix2),quarterTurns=Math.round(tsr.rotation.angle/(Math.PI/2)),flipPadWidthHeight=Math.abs(quarterTurns)%2===1,transformedElms=elms.map(elm=>transformPCBElement2(elm,matrix2));return flipPadWidthHeight&&(transformedElms=transformedElms.map(elm=>(elm.type==="pcb_smtpad"&&elm.shape==="rect"&&([elm.width,elm.height]=[elm.height,elm.width]),elm))),transformedElms};function stringHash3(str){let hash=0;if(str.length==0)return hash;for(var i3=0;i3<str.length;i3++){var char=str.charCodeAt(i3);hash=(hash<<5)-hash+char,hash=hash&hash}return Math.abs(hash)}var nice_color_palettes2=[["#69d2e7","#a7dbd8","#e0e4cc","#f38630","#fa6900"],["#fe4365","#fc9d9a","#f9cdad","#c8c8a9","#83af9b"],["#ecd078","#d95b43","#c02942","#542437","#53777a"],["#556270","#4ecdc4","#c7f464","#ff6b6b","#c44d58"],["#774f38","#e08e79","#f1d4af","#ece5ce","#c5e0dc"],["#e8ddcb","#cdb380","#036564","#033649","#031634"],["#490a3d","#bd1550","#e97f02","#f8ca00","#8a9b0f"],["#594f4f","#547980","#45ada8","#9de0ad","#e5fcc2"],["#00a0b0","#6a4a3c","#cc333f","#eb6841","#edc951"],["#e94e77","#d68189","#c6a49a","#c6e5d9","#f4ead5"],["#3fb8af","#7fc7af","#dad8a7","#ff9e9d","#ff3d7f"],["#d9ceb2","#948c75","#d5ded9","#7a6a53","#99b2b7"],["#ffffff","#cbe86b","#f2e9e1","#1c140d","#cbe86b"],["#efffcd","#dce9be","#555152","#2e2633","#99173c"],["#343838","#005f6b","#008c9e","#00b4cc","#00dffc"],["#413e4a","#73626e","#b38184","#f0b49e","#f7e4be"],["#ff4e50","#fc913a","#f9d423","#ede574","#e1f5c4"],["#99b898","#fecea8","#ff847c","#e84a5f","#2a363b"],["#655643","#80bca3","#f6f7bd","#e6ac27","#bf4d28"],["#00a8c6","#40c0cb","#f9f2e7","#aee239","#8fbe00"],["#351330","#424254","#64908a","#e8caa4","#cc2a41"],["#554236","#f77825","#d3ce3d","#f1efa5","#60b99a"],["#5d4157","#838689","#a8caba","#cad7b2","#ebe3aa"],["#8c2318","#5e8c6a","#88a65e","#bfb35a","#f2c45a"],["#fad089","#ff9c5b","#f5634a","#ed303c","#3b8183"],["#ff4242","#f4fad2","#d4ee5e","#e1edb9","#f0f2eb"],["#f8b195","#f67280","#c06c84","#6c5b7b","#355c7d"],["#d1e751","#ffffff","#000000","#4dbce9","#26ade4"],["#1b676b","#519548","#88c425","#bef202","#eafde6"],["#5e412f","#fcebb6","#78c0a8","#f07818","#f0a830"],["#bcbdac","#cfbe27","#f27435","#f02475","#3b2d38"],["#452632","#91204d","#e4844a","#e8bf56","#e2f7ce"],["#eee6ab","#c5bc8e","#696758","#45484b","#36393b"],["#f0d8a8","#3d1c00","#86b8b1","#f2d694","#fa2a00"],["#2a044a","#0b2e59","#0d6759","#7ab317","#a0c55f"],["#f04155","#ff823a","#f2f26f","#fff7bd","#95cfb7"],["#b9d7d9","#668284","#2a2829","#493736","#7b3b3b"],["#bbbb88","#ccc68d","#eedd99","#eec290","#eeaa88"],["#b3cc57","#ecf081","#ffbe40","#ef746f","#ab3e5b"],["#a3a948","#edb92e","#f85931","#ce1836","#009989"],["#300030","#480048","#601848","#c04848","#f07241"],["#67917a","#170409","#b8af03","#ccbf82","#e33258"],["#aab3ab","#c4cbb7","#ebefc9","#eee0b7","#e8caaf"],["#e8d5b7","#0e2430","#fc3a51","#f5b349","#e8d5b9"],["#ab526b","#bca297","#c5ceae","#f0e2a4","#f4ebc3"],["#607848","#789048","#c0d860","#f0f0d8","#604848"],["#b6d8c0","#c8d9bf","#dadabd","#ecdbbc","#fedcba"],["#a8e6ce","#dcedc2","#ffd3b5","#ffaaa6","#ff8c94"],["#3e4147","#fffedf","#dfba69","#5a2e2e","#2a2c31"],["#fc354c","#29221f","#13747d","#0abfbc","#fcf7c5"],["#cc0c39","#e6781e","#c8cf02","#f8fcc1","#1693a7"],["#1c2130","#028f76","#b3e099","#ffeaad","#d14334"],["#a7c5bd","#e5ddcb","#eb7b59","#cf4647","#524656"],["#dad6ca","#1bb0ce","#4f8699","#6a5e72","#563444"],["#5c323e","#a82743","#e15e32","#c0d23e","#e5f04c"],["#edebe6","#d6e1c7","#94c7b6","#403b33","#d3643b"],["#fdf1cc","#c6d6b8","#987f69","#e3ad40","#fcd036"],["#230f2b","#f21d41","#ebebbc","#bce3c5","#82b3ae"],["#b9d3b0","#81bda4","#b28774","#f88f79","#f6aa93"],["#3a111c","#574951","#83988e","#bcdea5","#e6f9bc"],["#5e3929","#cd8c52","#b7d1a3","#dee8be","#fcf7d3"],["#1c0113","#6b0103","#a30006","#c21a01","#f03c02"],["#000000","#9f111b","#b11623","#292c37","#cccccc"],["#382f32","#ffeaf2","#fcd9e5","#fbc5d8","#f1396d"],["#e3dfba","#c8d6bf","#93ccc6","#6cbdb5","#1a1f1e"],["#f6f6f6","#e8e8e8","#333333","#990100","#b90504"],["#1b325f","#9cc4e4","#e9f2f9","#3a89c9","#f26c4f"],["#a1dbb2","#fee5ad","#faca66","#f7a541","#f45d4c"],["#c1b398","#605951","#fbeec2","#61a6ab","#accec0"],["#5e9fa3","#dcd1b4","#fab87f","#f87e7b","#b05574"],["#951f2b","#f5f4d7","#e0dfb1","#a5a36c","#535233"],["#8dccad","#988864","#fea6a2","#f9d6ac","#ffe9af"],["#2d2d29","#215a6d","#3ca2a2","#92c7a3","#dfece6"],["#413d3d","#040004","#c8ff00","#fa023c","#4b000f"],["#eff3cd","#b2d5ba","#61ada0","#248f8d","#605063"],["#ffefd3","#fffee4","#d0ecea","#9fd6d2","#8b7a5e"],["#cfffdd","#b4dec1","#5c5863","#a85163","#ff1f4c"],["#9dc9ac","#fffec7","#f56218","#ff9d2e","#919167"],["#4e395d","#827085","#8ebe94","#ccfc8e","#dc5b3e"],["#a8a7a7","#cc527a","#e8175d","#474747","#363636"],["#f8edd1","#d88a8a","#474843","#9d9d93","#c5cfc6"],["#046d8b","#309292","#2fb8ac","#93a42a","#ecbe13"],["#f38a8a","#55443d","#a0cab5","#cde9ca","#f1edd0"],["#a70267","#f10c49","#fb6b41","#f6d86b","#339194"],["#ff003c","#ff8a00","#fabe28","#88c100","#00c176"],["#ffedbf","#f7803c","#f54828","#2e0d23","#f8e4c1"],["#4e4d4a","#353432","#94ba65","#2790b0","#2b4e72"],["#0ca5b0","#4e3f30","#fefeeb","#f8f4e4","#a5b3aa"],["#4d3b3b","#de6262","#ffb88c","#ffd0b3","#f5e0d3"],["#fffbb7","#a6f6af","#66b6ab","#5b7c8d","#4f2958"],["#edf6ee","#d1c089","#b3204d","#412e28","#151101"],["#9d7e79","#ccac95","#9a947c","#748b83","#5b756c"],["#fcfef5","#e9ffe1","#cdcfb7","#d6e6c3","#fafbe3"],["#9cddc8","#bfd8ad","#ddd9ab","#f7af63","#633d2e"],["#30261c","#403831","#36544f","#1f5f61","#0b8185"],["#aaff00","#ffaa00","#ff00aa","#aa00ff","#00aaff"],["#d1313d","#e5625c","#f9bf76","#8eb2c5","#615375"],["#ffe181","#eee9e5","#fad3b2","#ffba7f","#ff9c97"],["#73c8a9","#dee1b6","#e1b866","#bd5532","#373b44"],["#805841","#dcf7f3","#fffcdd","#ffd8d8","#f5a2a2"]],getDebugLayoutObject2=lo3=>{let{x:x4,y:y4,width,height}={...lo3,...lo3.size,...lo3.center,...lo3.position};if(lo3.x1!==void 0&&lo3.x2!==void 0&&lo3.y1!==void 0&&lo3.y2!==void 0&&(x4=(lo3.x1+lo3.x2)/2,y4=(lo3.y1+lo3.y2)/2,width=Math.abs(lo3.x1-lo3.x2),height=Math.abs(lo3.y1-lo3.y2)),lo3.points&&Array.isArray(lo3.points)&&lo3.points.length>0){let xCoords=lo3.points.map(point23=>point23.x),yCoords=lo3.points.map(point23=>point23.y),minX=Math.min(...xCoords),maxX=Math.max(...xCoords),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);x4=(minX+maxX)/2,y4=(minY+maxY)/2,width=maxX-minX,height=maxY-minY}let title=lo3.text||lo3.name||lo3.source?.text||lo3.source?.name||"?",content=lo3;return x4===void 0||y4===void 0?null:(width===void 0&&"outer_diameter"in lo3&&(width=lo3.outer_diameter,height=lo3.outer_diameter),(width===void 0||height===void 0)&&(width=.1,height=.1),{x:x4,y:y4,width,height,title,content,bg_color:nice_color_palettes2[stringHash3(lo3.type||title)%nice_color_palettes2.length]?.[4]??"#f00"})},isTruthy2=value=>!!value,findBoundsAndCenter2=elements=>{let debugObjects=elements.filter(elm=>elm.type.startsWith("pcb_")||elm.type.startsWith("schematic_")).concat(elements.filter(elm=>elm.type==="pcb_trace"||elm.type==="schematic_trace").flatMap(elm=>elm.route)).map(elm=>getDebugLayoutObject2(elm)).filter(isTruthy2);if(debugObjects.length===0)return{center:{x:0,y:0},width:0,height:0};let minX=debugObjects[0].x-debugObjects[0].width/2,maxX=debugObjects[0].x+debugObjects[0].width/2,minY=debugObjects[0].y-debugObjects[0].height/2,maxY=debugObjects[0].y+debugObjects[0].height/2;for(let obj of debugObjects.slice(1))minX=Math.min(minX,obj.x-obj.width/2),maxX=Math.max(maxX,obj.x+obj.width/2),minY=Math.min(minY,obj.y-obj.height/2),maxY=Math.max(maxY,obj.y+obj.height/2);let width=maxX-minX,height=maxY-minY;return{center:{x:minX+width/2,y:minY+height/2},width,height}},unitToMm3={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mmNumberFormatter2=new Intl.NumberFormat("en-US",{useGrouping:!1,notation:"standard",maximumFractionDigits:12}),mm5=n4=>{let unit=typeof n4=="number"?"mm":n4.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n4=="number"?n4:Number.parseFloat(n4.split(unit)[0]);if(unit in unitToMm3)return val*unitToMm3[unit];throw new Error(`Unsupported unit: ${unit}`)},mil2mm2=mil=>typeof mil=="number"?mm5(`${mil}mil`):mil.match(/^\d+$/)?mm5(`${mil}mil`):mm5(mil);function generateArcFromSweep(startX,startY,endX,endY,radius,largeArcFlag,sweepFlag){let start={x:startX,y:startY},end={x:endX,y:endY},midX=(startX+endX)/2,midY=(startY+endY)/2,dx3=endX-startX,dy3=endY-startY,distance23=Math.sqrt(dx3*dx3+dy3*dy3);if(distance23===0||radius<distance23/2)return[start,end];let h6=Math.sqrt(radius*radius-distance23*distance23/4),angle=Math.atan2(dy3,dx3),centerX=midX+h6*Math.sin(angle)*(sweepFlag?-1:1),centerY=midY-h6*Math.cos(angle)*(sweepFlag?-1:1),startAngle=Math.atan2(startY-centerY,startX-centerX),endAngle=Math.atan2(endY-centerY,endX-centerX);sweepFlag&&endAngle>startAngle?endAngle-=2*Math.PI:!sweepFlag&&endAngle<startAngle&&(endAngle+=2*Math.PI),(!largeArcFlag&&Math.abs(endAngle-startAngle)>Math.PI||largeArcFlag&&Math.abs(endAngle-startAngle)<Math.PI)&&(endAngle>startAngle?endAngle-=2*Math.PI:endAngle+=2*Math.PI);let numPoints=Math.max(2,Math.ceil(Math.abs(endAngle-startAngle)*radius)),path=[];for(let i3=0;i3<=numPoints;i3++){let t52=i3/numPoints,angle2=startAngle+t52*(endAngle-startAngle),x4=centerX+radius*Math.cos(angle2),y4=centerY+radius*Math.sin(angle2);path.push({x:x4,y:y4})}return path}var mil10ToMm=value=>value*10*.0254,normalizePinLabels2=inputPinLabels=>{let uniqueInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=uniqueInputPinLabels.map(()=>[]),desiredNumbers=uniqueInputPinLabels.map(()=>null);for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])if(/^\d+$/.test(label)){desiredNumbers[i3]=Number.parseInt(label);break}let highestPinNumber=0,acceptedDesiredNumbers=new Set;for(let i3=0;i3<desiredNumbers.length;i3++){let desiredNumber=desiredNumbers[i3];if(desiredNumber===null||desiredNumber<1)continue;if(!acceptedDesiredNumbers.has(desiredNumber)){acceptedDesiredNumbers.add(desiredNumber),result[i3].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltCount=0;for(let label of result[i3])label.startsWith(`pin${desiredNumber}_alt`)&&(existingAltCount+=1);result[i3].push(`pin${desiredNumber}_alt${existingAltCount+1}`)}for(let i3=0;i3<result.length;i3++)result[i3][0]?.includes("_alt")&&(highestPinNumber+=1,result[i3].unshift(`pin${highestPinNumber}`));for(let i3=0;i3<result.length;i3++)result[i3].length===0&&(highestPinNumber+=1,result[i3].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of uniqueInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i3].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i3].push(`${label}${incrementalLabelCounts[label]}`)));return result},normalizeSymbolName=name=>{let trimmedName=name.trim();return trimmedName==="+"?"_POS":trimmedName==="-"?"_NEG":trimmedName},DEFAULT_PCB_THICKNESS_MM=1.6,EASYEDA_STEP_MODEL_URL="https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y",EASYEDA_OBJ_MODEL_URL="https://modules.easyeda.com/3dmodel",TSCIRCUIT_MODEL_CDN_URL="https://modelcdn.tscircuit.com/easyeda_models",milx10=mil10=>typeof mil10=="number"||mil10.match(/^\d+$/)?mil2mm2(mil10)*10:mil2mm2(mil10),parseCadOffsetsFromSvgNode=svgNode=>{let attrs=svgNode?.svgData?.attrs??{},[cx3,cy3]=String(attrs.c_origin??"0,0").split(",").map(s3=>Number(s3.trim())),zStr=attrs.z??0,z_mm=typeof zStr=="string"&&/[a-z]/i.test(zStr)?mm5(zStr):mm5(`${Number(zStr)||0}mil`);return{position:{x:mil10ToMm(Number.isNaN(cx3)?0:cx3),y:mil10ToMm(Number.isNaN(cy3)?0:cy3),z:z_mm},rotation:(()=>{let[rx3,ry3,rz]=(attrs.c_rotation??"0,0,0").split(",").map(Number);return{x:rx3||0,y:ry3||0,z:rz||0}})()}},readModelHeightMm=raw=>{if(raw==null)return 3.5;let n4=Number(raw);if(!Number.isFinite(n4))return 3.5;let mmFromMil10=mil10ToMm(n4),mmFromMil=mm5(`${n4}mil`),upper=12,lower=.1,chosen=Math.max(mmFromMil10,mmFromMil);return(chosen>upper||chosen<lower)&&(chosen=3.5),chosen},handleSilkscreenPath=(track,index)=>pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:track.points.map(point23=>({x:milx10(point23.x),y:milx10(point23.y)})),stroke_width:mil10ToMm(track.width)}),isCourtyardLayer=layer=>layer===13||layer===14||layer===15,handleSilkscreenArc=(arc2,index)=>{let arcPath=generateArcFromSweep(arc2.start.x,arc2.start.y,arc2.end.x,arc2.end.y,arc2.radiusX,arc2.largeArc,arc2.sweepDirection==="CW");return pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_arc_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:arcPath.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)})),stroke_width:mil10ToMm(arc2.width)})},handleHole=(hole,index)=>pcb_hole2.parse({type:"pcb_hole",x:milx10(hole.center.x),y:milx10(hole.center.y),hole_diameter:milx10(hole.radius)*2,hole_shape:"circle",pcb_hole_id:`pcb_hole_${index+1}`}),handleHoleCutout=(hole,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_from_hole_${index+1}`,shape:"circle",center:{x:milx10(hole.center.x),y:milx10(hole.center.y)},radius:milx10(hole.radius)}),handleVia=(via,index)=>pcb_via2.parse({type:"pcb_via",pcb_via_id:`pcb_via_${index+1}`,x:milx10(via.center.x),y:milx10(via.center.y),outer_diameter:milx10(via.outerDiameter),hole_diameter:milx10(via.holeDiameter),layers:["top","bottom"]}),handleCutout=(solidRegion,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${index+1}`,shape:"polygon",points:solidRegion.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}),getCadPositionZMmFromMetadata=easyEdaJson=>{let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(shape=>shape.type==="SVGNODE"&&shape.svgData.attrs?.uuid);if(!svgNode||svgNode.type!=="SVGNODE")return;let svgNodeZ=Number(svgNode.svgData.attrs?.z??0);if(!Number.isFinite(svgNodeZ))return;let bounds=easyEdaJson._objMetadata?.bounds;return bounds?(Math.abs(bounds.min.z)<1e-6?0:bounds.min.z)-mil10ToMm(svgNodeZ):void 0},convertEasyEdaJsonToCircuitJson=(easyEdaJson,{useModelCdn,shouldRecenter=!0,cadPositionXMm,cadPositionYMm,cadPositionZMm,showDesignator=!1}={})=>{let resolvedCadPositionZMm=cadPositionZMm??getCadPositionZMmFromMetadata(easyEdaJson),circuitElements=[],source_component=any_source_component2.parse({type:"source_component",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip"}),pcb_component22=pcb_component2.parse({type:"pcb_component",pcb_component_id:"pcb_component_1",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip",width:0,height:0,rotation:0,center:{x:0,y:0},layer:"top"});circuitElements.push(source_component,pcb_component22);let pads=easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="PAD"),pins=easyEdaJson.dataStr.shape.filter(shape=>shape.type==="PIN"),pinLabelSets=pads.map(pad2=>{let labels=[];pad2.number&&labels.push(pad2.number.toString());let pin=pins.find(p4=>p4.pinNumber===pad2.number);return pin&&labels.push(normalizeSymbolName(pin.label)),labels}),normalizedPinLabels=normalizePinLabels2(pinLabelSets);pads.forEach((pad2,index)=>{let portHints2=normalizedPinLabels[index],pinNumber=Number.parseInt(portHints2.find(hint=>hint.match(/pin\d+/)).replace("pin",""));if(circuitElements.push({type:"source_port",source_port_id:`source_port_${index+1}`,source_component_id:"source_component_1",name:`pin${pinNumber}`,pin_number:pinNumber,port_hints:portHints2.filter(hint=>hint!==`pin${pinNumber}`)}),pad2.holeRadius!==void 0&&mil2mm2(pad2.holeRadius)!==0){let commonPlatedHoleProps={type:"pcb_plated_hole",pcb_plated_hole_id:pad2.shape==="RECT"&&pad2.rotation!==void 0?`pcb_plated_hole_${index+1}_rot${pad2.rotation}`:`pcb_plated_hole_${index+1}`,x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y),layers:["top"],port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`},additionalPlatedHoleProps;if(pad2.shape==="OVAL"){let largestOuterDimensionName=mil2mm2(pad2.width)>mil2mm2(pad2.height)?"width":"height",smallestOuterDimension=Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height)),largestOuterDimension=Math.max(mil2mm2(pad2.width),mil2mm2(pad2.height)),distanceFromOuterPlatingToHole=smallestOuterDimension/2-mil2mm2(pad2.holeRadius),largestInnerDimension=largestOuterDimension-distanceFromOuterPlatingToHole*2,smallestInnerDimension=mil2mm2(pad2.holeRadius)*2;additionalPlatedHoleProps={shape:"pill_hole_with_rect_pad",hole_shape:"pill",pad_shape:"rect",hole_width:largestOuterDimensionName==="width"?largestInnerDimension:smallestInnerDimension,hole_height:largestOuterDimensionName==="height"?largestInnerDimension:smallestInnerDimension,rect_pad_width:mil2mm2(pad2.width),rect_pad_height:mil2mm2(pad2.height),hole_offset_x:0,hole_offset_y:0}}else if(pad2.shape==="RECT"){let padWidth=mil2mm2(pad2.width),padHeight=mil2mm2(pad2.height),holeDiameter=mil2mm2(pad2.holeRadius)*2;if(Math.max(padWidth,padHeight)/Math.min(padWidth,padHeight)>1.5){let baseWidth=holeDiameter,pillHeight=baseWidth*2.6,holeWidth=padWidth>padHeight?pillHeight:baseWidth,holeHeight=padHeight>padWidth?pillHeight:baseWidth;additionalPlatedHoleProps={shape:"rotated_pill_hole_with_rect_pad",hole_shape:"rotated_pill",pad_shape:"rect",hole_width:holeWidth,hole_height:holeHeight,hole_ccw_rotation:pad2.rotation||0,rect_ccw_rotation:pad2.rotation||0,rect_pad_width:padWidth,rect_pad_height:padHeight}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:holeDiameter,outer_diameter:Math.max(padWidth,padHeight),radius:holeDiameter/2}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:mil2mm2(pad2.holeRadius)*2,outer_diameter:mil2mm2(pad2.width),radius:mil2mm2(pad2.holeRadius)};circuitElements.push(pcb_plated_hole2.parse({...commonPlatedHoleProps,...additionalPlatedHoleProps}))}else{let soupShape;if(pad2.shape==="RECT"||pad2.shape==="ELLIPSE"||pad2.shape==="OVAL"?soupShape="rect":pad2.shape==="POLYGON"&&(soupShape="polygon"),!soupShape)throw new Error(`unknown pad.shape: "${pad2.shape}"`);let rectSize={width:mil2mm2(pad2.width),height:mil2mm2(pad2.height)};(pad2.rotation===90||pad2.rotation===270)&&(rectSize.width=mil2mm2(pad2.height),rectSize.height=mil2mm2(pad2.width));let parsedPcbSmtpad=pcb_smtpad2.parse({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${index+1}`,shape:soupShape,...soupShape!=="polygon"&&{x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y)},...soupShape==="rect"?rectSize:soupShape==="polygon"&&pad2.points?{points:pad2.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}:{radius:Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height))/2},layer:"top",port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`});circuitElements.push(parsedPcbSmtpad)}}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="HOLE").forEach((h6,index)=>{circuitElements.push(handleHole(h6,index)),circuitElements.push(handleHoleCutout(h6,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="VIA").forEach((v4,index)=>{circuitElements.push(handleVia(v4,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="SOLIDREGION"&&shape.fillStyle==="cutout").forEach((sr3,index)=>{circuitElements.push(handleCutout(sr3,index))});let hasFoundDesignator=!1;if(easyEdaJson.packageDetail.dataStr.shape.forEach((shape,index)=>{if(shape.type==="TRACK")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenPath(shape,index));else if(shape.type==="ARC")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenArc(shape,index));else if(shape.type==="TEXT"){if(isCourtyardLayer(shape.layer))return;let text=shape.text,designatorPrefix=easyEdaJson.dataStr.head.c_para.pre||"U",normalizedPrefix=designatorPrefix.replace(/\?/g,""),trimmedText=text.trim();if(trimmedText===designatorPrefix||trimmedText===`${normalizedPrefix}?`||trimmedText===normalizedPrefix){if(!showDesignator)return;text="{NAME}",hasFoundDesignator=!0}circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pcb_silkscreen_text_${index+1}`,pcb_component_id:"pcb_component_1",text,anchor_position:{x:mil2mm2(shape.x),y:mil2mm2(shape.y)},anchor_alignment:{L:"bottom_left",C:"center",R:"bottom_right"}[shape.textAnchor??"L"],font_size:shape.size_mm||1,layer:"top"}))}}),!hasFoundDesignator&&showDesignator){let bbox=easyEdaJson.packageDetail.dataStr.BBox;circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"pcb_silkscreen_text_designator_fallback",pcb_component_id:"pcb_component_1",text:"{NAME}",anchor_position:{x:milx10(bbox.x+bbox.width/2),y:milx10(bbox.y)-1},anchor_alignment:"center",font_size:1,layer:"top"}))}let pcbElements=circuitElements.filter(e5=>e5.type==="pcb_smtpad"||e5.type==="pcb_plated_hole"||e5.type==="pcb_hole"||e5.type==="pcb_via"||e5.type==="pcb_courtyard_outline"||e5.type==="pcb_silkscreen_path"||e5.type==="pcb_silkscreen_text");if(pcbElements.length>0){let bounds=findBoundsAndCenter2(pcbElements);pcb_component22.width=bounds.width,pcb_component22.height=bounds.height}let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(a3=>!!(a3.type==="SVGNODE"&&a3.svgData.attrs?.uuid)),modelUuid=svgNode?.svgData?.attrs?.uuid,objFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.obj?uuid=${modelUuid}`:`${EASYEDA_OBJ_MODEL_URL}/${modelUuid}`:void 0,stepFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.step?uuid=${modelUuid}`:`${EASYEDA_STEP_MODEL_URL}/${modelUuid}`:void 0;if(objFileUrl!==void 0||stepFileUrl!==void 0){let{position:position22,rotation:rotation22}=parseCadOffsetsFromSvgNode(svgNode);circuitElements.push(cad_component2.parse({type:"cad_component",cad_component_id:"cad_component_1",source_component_id:"source_component_1",pcb_component_id:"pcb_component_1",anchor_alignment:"center_of_component_on_board_surface",model_origin_alignment:"center_of_component_on_board_surface",model_origin_position:{x:cadPositionXMm??0,y:cadPositionYMm??0,z:resolvedCadPositionZMm??position22.z},position:{x:0,y:0,z:0},rotation:rotation22,model_obj_url:objFileUrl,model_step_url:stepFileUrl}))}if(!circuitElements.some(e5=>e5.type==="pcb_courtyard_outline")){let bbox=easyEdaJson.packageDetail.dataStr.BBox;if(bbox){let x12=milx10(bbox.x)-.25,y12=milx10(bbox.y)-.25,x22=milx10(bbox.x+bbox.width)+.25,y22=milx10(bbox.y+bbox.height)+.25;circuitElements.push(pcb_courtyard_outline2.parse({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${easyEdaJson.lcsc.number}_1`,pcb_component_id:"pcb_component_1",layer:"top",outline:[{x:x12,y:y12},{x:x22,y:y12},{x:x22,y:y22},{x:x12,y:y22},{x:x12,y:y12}],stroke_width:.05}))}}if(shouldRecenter){let elementsForBounds=circuitElements.filter(e5=>e5.type!=="pcb_component"&&e5.type!=="cad_component"),bounds=findBoundsAndCenter2(elementsForBounds);if(Number.isFinite(bounds.center.x)&&Number.isFinite(bounds.center.y)){let matrix2=compose4(translate4(-bounds.center.x,bounds.center.y),scale4(1,-1)),elementsForTransform=circuitElements.filter(e5=>!(e5.type==="pcb_smtpad"&&e5.shape==="polygon")&&e5.type!=="cad_component");transformPCBElements2(elementsForTransform,matrix2);for(let e5 of circuitElements)if(e5.type==="pcb_cutout"){if(e5.shape==="polygon")e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4));else if(e5.shape==="circle"||e5.shape==="rect")e5.center=applyToPoint4(matrix2,e5.center);else if("route"in e5){let cutoutPath=e5;cutoutPath.route=cutoutPath.route.map(p4=>applyToPoint4(matrix2,p4))}}else e5.type==="pcb_smtpad"&&e5.shape==="polygon"&&(e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4)));let cad=circuitElements.find(e5=>e5.type==="cad_component");if(cad){cad.rotation||(cad.rotation={x:0,y:0,z:0}),cad.model_origin_position||(cad.model_origin_position={x:0,y:0,z:0});let side=pcb_component22.layer??"top",t52=DEFAULT_PCB_THICKNESS_MM/2,attrs=svgNode?.svgData?.attrs??{},modelHeight=readModelHeightMm(attrs.c_height);cad.size||(cad.size={x:pcb_component22.width,y:pcb_component22.height,z:modelHeight});let ROTATE_X_FOR_YUP=90,originalZRotation=(cad.rotation.z??0)%360;Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1||Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-90)<1?cad.rotation.x=((cad.rotation.x??0)+0+360)%360:Math.abs(originalZRotation-270)<1?(cad.rotation.x=((cad.rotation.x??0)+0+360)%360,cad.rotation.y=((cad.rotation.y??0)+0+360)%360):(console.warn(`[3D] Unusual rotation angle: ${originalZRotation}\xB0 for component ${easyEdaJson.lcsc.number}`),cad.rotation.x=((cad.rotation.x??0)+ROTATE_X_FOR_YUP+360)%360),side!=="top"&&(cad.rotation.x=((cad.rotation.x??0)+180)%360);let USE_Z_OFFSET_FOR_180=Math.abs(originalZRotation-180)<1,zOffRaw=cad.model_origin_position.z??cad.position.z??0,zOff=USE_Z_OFFSET_FOR_180?-zOffRaw:0,rx3=(cad.rotation.x%360+360)%360,thicknessAlongWorldZ,is180RotatedYUp=(Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1)&&Math.abs(rx3)<1;if(is180RotatedYUp||rx3%180===90?thicknessAlongWorldZ=cad.size.y:thicknessAlongWorldZ=cad.size.z,Number.isFinite(resolvedCadPositionZMm))cad.model_origin_position.z=side==="top"?resolvedCadPositionZMm:-resolvedCadPositionZMm;else{let centerZ;is180RotatedYUp?centerZ=side==="top"?t52-thicknessAlongWorldZ/2:-t52+thicknessAlongWorldZ/2:centerZ=side==="top"?t52+zOff+thicknessAlongWorldZ/2:-t52-zOff-thicknessAlongWorldZ/2,cad.model_origin_position.z=centerZ}}}pcb_component22.center={x:0,y:0}}return circuitElements},safeNumber=(defaultValue=0)=>external_exports2.union([external_exports2.number(),external_exports2.string()]).transform(val=>{let num=Number(val);return isNaN(num)?defaultValue:num}).default(defaultValue),tenthmil=external_exports2.union([external_exports2.number(),external_exports2.string()]).optional().transform(n4=>typeof n4=="string"&&n4.endsWith("mil")?n4:`${Number.parseFloat(n4)*10}mil`).pipe(external_exports2.string()),PointSchema=external_exports2.any().transform(p4=>{if(Array.isArray(p4)){let[x4,y4]=p4;return{x:x4,y:y4}}if(typeof p4=="object")return p4;throw new Error(`Invalid point: ${p4}`)}).pipe(external_exports2.object({x:external_exports2.number(),y:external_exports2.number()})),BaseShapeSchema=external_exports2.object({type:external_exports2.string(),id:external_exports2.string().optional(),layer:external_exports2.coerce.number().optional()}),TrackSchema=BaseShapeSchema.extend({type:external_exports2.literal("TRACK"),width:external_exports2.coerce.number(),points:external_exports2.array(PointSchema)}),PadSchema=BaseShapeSchema.extend({type:external_exports2.literal("PAD"),shape:external_exports2.enum(["RECT","ELLIPSE","OVAL","POLYGON"]),center:external_exports2.object({x:tenthmil,y:tenthmil}),width:tenthmil,height:tenthmil,layermask:external_exports2.number(),net:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),number:external_exports2.union([external_exports2.string(),external_exports2.number()]),holeRadius:tenthmil,points:external_exports2.array(PointSchema).optional(),rotation:safeNumber(0),plated:external_exports2.boolean()}),ArcSchema=BaseShapeSchema.extend({type:external_exports2.literal("ARC"),width:external_exports2.number(),start:PointSchema,end:PointSchema,radiusX:external_exports2.number(),radiusY:external_exports2.number(),largeArc:external_exports2.boolean(),sweepDirection:external_exports2.enum(["CW","CCW"])}),CircleSchema=BaseShapeSchema.extend({type:external_exports2.literal("CIRCLE"),center:PointSchema,radius:external_exports2.number(),width:external_exports2.number()}),SolidRegionSchema=BaseShapeSchema.extend({type:external_exports2.literal("SOLIDREGION"),layermask:external_exports2.number(),points:external_exports2.array(PointSchema),fillStyle:external_exports2.string()}),SVGNodeSchema=BaseShapeSchema.extend({type:external_exports2.literal("SVGNODE"),svgData:external_exports2.object({gId:external_exports2.string(),nodeName:external_exports2.string(),nodeType:external_exports2.number(),layerid:external_exports2.string(),attrs:external_exports2.record(external_exports2.string(),external_exports2.string()),childNodes:external_exports2.array(external_exports2.unknown())})}),HoleSchema=BaseShapeSchema.extend({type:external_exports2.literal("HOLE"),center:PointSchema,radius:external_exports2.number()}),ViaSchema=BaseShapeSchema.extend({type:external_exports2.literal("VIA"),center:PointSchema,outerDiameter:external_exports2.number(),holeDiameter:external_exports2.number()}),RectSchema=BaseShapeSchema.extend({type:external_exports2.literal("RECT"),x:tenthmil,y:tenthmil,width:tenthmil,height:tenthmil,lineWidth:external_exports2.number(),fillStyle:external_exports2.string(),rotation:external_exports2.number().optional()}),TextSchema=BaseShapeSchema.extend({type:external_exports2.literal("TEXT"),text:external_exports2.string(),x:tenthmil,y:tenthmil,size_mm:external_exports2.number(),rotation:external_exports2.number().optional(),layer:external_exports2.number().optional(),textAnchor:external_exports2.enum(["L","C","R",""]).optional().transform(val=>val===""?void 0:val),font:external_exports2.string().optional()}),PackageDetailShapeSchema=external_exports2.discriminatedUnion("type",[TrackSchema,PadSchema,ArcSchema,CircleSchema,SolidRegionSchema,SVGNodeSchema,HoleSchema,ViaSchema,RectSchema,TextSchema]),pairs3=arr=>{let pairs22=[];for(let i3=0;i3<arr.length;i3+=2)pairs22.push([arr[i3],arr[i3+1]]);return pairs22},parsePoints=pointsStr=>pairs3(pointsStr.trim().split(" ").map(n4=>Number(n4))),ShapeItemSchema=external_exports2.object({type:external_exports2.string(),data:external_exports2.string()}).transform(shape=>{switch(shape.type){case"TRACK":{let[width,layer,_4,pointsStr,id2,_n3]=shape.data.split("~"),points=parsePoints(pointsStr);return TrackSchema.parse({type:"TRACK",width,layer,points,id:id2})}case"PAD":{let[padShape,...params]=shape.data.split("~"),[centerX,centerY,width,height,layermask,net,number,holeRadius,...rest]=params.map(p4=>Number.isNaN(Number(p4))?p4:Number(p4)),center2={x:centerX,y:centerY},points;(padShape==="RECT"||padShape==="POLYGON")&&(points=parsePoints(rest[0]));let r5=Number(rest[1]),rotation22=Number.isNaN(r5)?void 0:r5,padInputParams={type:"PAD",shape:padShape,center:center2,width,height,layermask,net,number,holeRadius,points,rotation:rotation22,plated:rest.includes("Y")};return PadSchema.parse(padInputParams)}case"ARC":{let[width,layer,,arcData]=shape.data.split("~"),match2=arcData.match(/M\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*A\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)/);if(!match2)throw new Error(`Invalid arc data: ${arcData}`);let[,startX,startY,radiusX,radiusY,xAxisRotation,largeArcFlag,sweepFlag,endX,endY]=match2,start=[Number(startX),Number(startY)],end=[Number(endX),Number(endY)];return ArcSchema.parse({type:"ARC",width:Number(width),layer:Number(layer),start,end,radiusX:Number(radiusX),radiusY:Number(radiusY),largeArc:largeArcFlag==="1",sweepDirection:sweepFlag==="1"?"CW":"CCW"})}case"CIRCLE":{let[centerX,centerY,radius,width,layer,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return CircleSchema.parse({type:"CIRCLE",center:center2,radius:Number(radius),width:Number(width),layer:Number(layer),id:id2})}case"HOLE":{let[centerX,centerY,radius,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return HoleSchema.parse({type:"HOLE",center:center2,radius:Number(radius),id:id2})}case"VIA":{let[x4,y4,outerDiameter,,holeDiameter,id2]=shape.data.split("~"),center2=[Number(x4),Number(y4)];return ViaSchema.parse({type:"VIA",center:center2,outerDiameter:Number(outerDiameter),holeDiameter:Number(holeDiameter),id:id2})}case"SOLIDREGION":{let[layermask,,pathData,fillStyle,id2]=shape.data.split("~"),points=pathData.match(/[ML] ?(-?[\d.]+)[ ,](-?[\d.]+)/g)?.map(point23=>{let[,x4,y4]=point23.match(/[ML]? ?(-?[\d.]+)[ ,](-?[\d.]+)/)||[];return[Number(x4),Number(y4)]})||[];return SolidRegionSchema.parse({type:"SOLIDREGION",layermask:Number(layermask),points,fillStyle,id:id2})}case"SVGNODE":{let svgData=JSON.parse(shape.data);return SVGNodeSchema.parse({type:"SVGNODE",svgData})}case"RECT":{let[x4,y4,width,height,lineWidth,id2,rotation22,layer,fillStyle]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return RectSchema.parse({type:"RECT",x:x4,y:y4,width,height,lineWidth:Number(lineWidth),id:id2,rotation:Number.isNaN(r5)?void 0:r5,layer:layer?Number(layer):void 0,fillStyle:fillStyle||void 0})}case"TEXT":{let[textAnchor,x4,y4,size22,layer,id2,rotation22,,font,text]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return TextSchema.parse({type:"TEXT",text,x:x4,y:y4,size_mm:Number(size22)*2.54,layer:layer?Number(layer):void 0,id:id2,rotation:Number.isNaN(r5)?void 0:r5,textAnchor,font:font||void 0})}default:throw new Error(`Unknown shape type: ${shape.type}`)}}).pipe(PackageDetailShapeSchema),ShapesArraySchema=external_exports2.array(ShapeItemSchema),PointSchema2=external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),RectangleShapeOutputSchema=external_exports2.object({type:external_exports2.literal("RECTANGLE"),position:PointSchema2,width:external_exports2.number(),height:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseRectangle=str=>{let[,x4,y4,,,width,height,color,lineWidth,,,id2]=str.split("~");return{type:"RECTANGLE",position:{x:Number(x4),y:Number(y4)},width:Number(width),height:Number(height),color,lineWidth:Number(lineWidth),id:id2}},RectangleShapeSchema=external_exports2.string().startsWith("R~").transform(parseRectangle).pipe(RectangleShapeOutputSchema),EllipseShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ELLIPSE"),center:PointSchema2,radiusX:external_exports2.number(),radiusY:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseEllipse=str=>{let[,x4,y4,radiusX,radiusY,color,lineWidth,,,id2]=str.split("~");return{type:"ELLIPSE",center:{x:Number(x4),y:Number(y4)},radiusX:Number(radiusX),radiusY:Number(radiusY),color,lineWidth:Number(lineWidth),id:id2}},EllipseShapeSchema=external_exports2.string().startsWith("E~").transform(parseEllipse).pipe(EllipseShapeOutputSchema),ArcShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ARC"),start:PointSchema2,end:PointSchema2,radius:external_exports2.number(),sweepFlag:external_exports2.boolean(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseArc=str=>{let[,pathData,color,lineWidth,,,id2]=str.split("~"),parts=pathData.split(" "),x12=Number(parts[1])||0,y12=Number(parts[2])||0,radius=Number(parts[4])||0,sweepFlag=parts[7]==="1",x22=Number(parts[8])||0,y22=Number(parts[9])||0,parsedLineWidth=Number(lineWidth),finalLineWidth=Number.isNaN(parsedLineWidth)?1:parsedLineWidth;return{type:"ARC",start:{x:x12,y:y12},end:{x:x22,y:y22},radius,sweepFlag,color:color||"#880000",lineWidth:finalLineWidth,id:id2||"gge1"}},ArcShapeSchema=external_exports2.string().startsWith("A~").transform(parseArc).pipe(ArcShapeOutputSchema),PinShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PIN"),visibility:external_exports2.enum(["show","hide","none"]),pinNumber:external_exports2.union([external_exports2.string(),external_exports2.number()]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),id:external_exports2.string(),label:external_exports2.string(),labelColor:external_exports2.string(),path:external_exports2.string(),arrow:external_exports2.string()}),parsePin=pinString=>{let parts=pinString.split("~"),[,visibility,,pinNumber,x4,y4,rotation22,id2]=parts,nameMatch=pinString.match(/~([\w+#-]+)~(start|end)~/),label=nameMatch?nameMatch[1]:"";label.endsWith("+")&&(label=label.slice(0,-1)+"_POS"),label.endsWith("-")&&(label=label.slice(0,-1)+"_NEG"),label.endsWith("#")&&(label=label.slice(0,-1)),/^\+\d+(?:\.\d+)?V$/i.test(label)&&(label=`V${label.slice(1,-1)}`);let colorMatch=pinString.match(/#[0-9A-F]{6}/),labelColor=colorMatch?colorMatch[0]:"",pathMatch=pinString.match(/\^\^([^~]+)/),path=pathMatch?pathMatch[1]:"",arrowMatch=pinString.match(/\^\^0~(.+)$/),arrow=arrowMatch?arrowMatch[1]:"",r5=Number.parseFloat(rotation22);return{type:"PIN",visibility,id:id2,pinNumber:Number.isNaN(Number(pinNumber))?pinNumber:Number(pinNumber),x:Number.parseFloat(x4),y:Number.parseFloat(y4),rotation:Number.isNaN(r5)?0:r5,label,labelColor,path,arrow}},PinShapeSchema=external_exports2.string().startsWith("P~").transform(parsePin).pipe(PinShapeOutputSchema),PolylineShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYLINE"),points:external_exports2.array(PointSchema2),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parsePoints2=pointsStr=>pointsStr.split(" ").reduce((acc,value,index)=>(index%2===0?acc.push({x:Number(value),y:0}):acc[acc.length-1].y=Number(value),acc),[]),parsePolyline=str=>{let[,...rest]=str.split("~"),[pointsStr,color,lineWidth,,,id2]=rest;return{type:"POLYLINE",points:parsePoints2(pointsStr),color,lineWidth:Number(lineWidth),id:id2}},PolylineShapeSchema=external_exports2.string().startsWith("PL~").transform(parsePolyline).pipe(PolylineShapeOutputSchema),PolygonShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYGON"),points:external_exports2.array(PointSchema2),fillColor:external_exports2.string(),lineWidth:external_exports2.number(),lineColor:external_exports2.string(),id:external_exports2.string()}),parsePolygon2=str=>{let[,...rest]=str.split("~"),[pointsStr,fillColor,lineWidth,lineColor,,id2]=rest;return{type:"POLYGON",points:parsePoints2(pointsStr),fillColor,lineWidth:Number(lineWidth),lineColor,id:id2}},PolygonShapeSchema=external_exports2.string().startsWith("PG~").transform(parsePolygon2).pipe(PolygonShapeOutputSchema),PathShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PATH"),pathData:external_exports2.string(),fillColor:external_exports2.string(),strokeWidth:external_exports2.number(),strokeColor:external_exports2.string(),id:external_exports2.string()}),parsePath=str=>{let[,pathData,fillColor,strokeWidth,strokeColor,,id2]=str.split("~");return{type:"PATH",pathData,fillColor,strokeWidth:mil10ToMm(Number(strokeWidth)),strokeColor,id:id2}},PathShapeSchema=external_exports2.string().startsWith("PT~").transform(parsePath).pipe(PathShapeOutputSchema),TextShapeOutputSchema=external_exports2.object({type:external_exports2.literal("TEXT"),alignment:external_exports2.enum(["L","C","R"]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),fontColor:external_exports2.string(),backgroundColor:external_exports2.string().optional(),fontSize:external_exports2.string(),fontWeight:external_exports2.string().optional().default("normal"),fontStyle:external_exports2.enum(["normal","italic"]).optional().default("normal"),fontDecoration:external_exports2.string().optional().default(""),content:external_exports2.string(),textType:external_exports2.string(),visibility:external_exports2.enum(["0","1"]),mirror:external_exports2.string(),id:external_exports2.string()}),parseText=str=>{let[,alignment,x4,y4,rotation22,fontColor,backgroundColor,fontSize,fontWeight,fontStyle,fontDecoration,content,textType,visibility,mirror,id2]=str.split("~");return{type:"TEXT",alignment,x:Number(x4),y:Number(y4),rotation:Number(rotation22),fontColor,backgroundColor:backgroundColor||void 0,fontSize,fontWeight:fontWeight||"normal",fontStyle:fontStyle||"normal",fontDecoration:fontDecoration||"",content,textType,visibility,mirror,id:id2}},TextShapeSchema=external_exports2.string().startsWith("T~").transform(parseText).pipe(TextShapeOutputSchema),SingleLetterShapeSchema=external_exports2.string().transform(x4=>{if(x4.startsWith("R~"))return RectangleShapeSchema.parse(x4);if(x4.startsWith("E~"))return EllipseShapeSchema.parse(x4);if(x4.startsWith("P~"))return PinShapeSchema.parse(x4);if(x4.startsWith("PL~"))return PolylineShapeSchema.parse(x4);if(x4.startsWith("PG~"))return PolygonShapeSchema.parse(x4);if(x4.startsWith("PT~"))return PathShapeSchema.parse(x4);if(x4.startsWith("T~"))return TextShapeSchema.parse(x4);if(x4.startsWith("A~"))return ArcShapeSchema.parse(x4);throw new Error(`Invalid shape type: ${x4}`)}).pipe(external_exports2.union([RectangleShapeOutputSchema,EllipseShapeOutputSchema,PinShapeOutputSchema,PolylineShapeOutputSchema,PolygonShapeOutputSchema,PathShapeOutputSchema,TextShapeOutputSchema,ArcShapeOutputSchema])),maybeNumber=external_exports2.any().transform(k4=>k4==="nan"||Number.isNaN(k4)?null:k4).pipe(external_exports2.number().nullable().optional()),SzlcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional(),image:external_exports2.string().optional().optional()}),LcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional()}),OwnerSchema=external_exports2.object({uuid:external_exports2.string(),username:external_exports2.string(),nickname:external_exports2.string(),avatar:external_exports2.string()}),HeadSchema=external_exports2.object({docType:external_exports2.preprocess(val=>val==null?val:String(val),external_exports2.string()),editorVersion:external_exports2.string(),c_para:external_exports2.record(external_exports2.string(),external_exports2.string().nullable()),x:external_exports2.number(),y:external_exports2.number(),puuid:external_exports2.string().optional(),uuid:external_exports2.string(),utime:external_exports2.preprocess(val=>val===""?0:typeof val=="string"?Number(val):val,external_exports2.number()),importFlag:external_exports2.number().optional(),c_spiceCmd:external_exports2.any().optional(),hasIdFlag:external_exports2.boolean()}),BBoxSchema=external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),width:external_exports2.number(),height:external_exports2.number()}),LayerItemSchema=external_exports2.object({name:external_exports2.string(),color:external_exports2.string(),visible:external_exports2.boolean(),active:external_exports2.boolean(),config:external_exports2.boolean(),transparency:external_exports2.boolean()}),ObjectItemSchema=external_exports2.object({name:external_exports2.string(),visible:external_exports2.boolean(),locked:external_exports2.boolean()}),DataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(SingleLetterShapeSchema),BBox:BBoxSchema,colors:external_exports2.union([external_exports2.array(external_exports2.string()),external_exports2.record(external_exports2.string())])}),PackageDetailDataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(external_exports2.string()).transform(shapes=>shapes.map(shape=>{let[type,...data]=shape.split("~");return ShapeItemSchema.parse({type,data:data.join("~")})})).pipe(external_exports2.array(PackageDetailShapeSchema)),layers:external_exports2.array(external_exports2.string()).transform(layers=>layers.map(layer=>{let[name,color,visible,active,config,transparency]=layer.split("~");return LayerItemSchema.parse({name,color,visible:visible==="true",active:active==="true",config:config==="true",transparency:transparency==="true"})})),objects:external_exports2.array(external_exports2.string()).transform(objects=>objects.map(obj=>{let[name,visible,locked]=obj.split("~");return ObjectItemSchema.parse({name,visible:visible==="true",locked:locked==="true"})})),BBox:BBoxSchema,netColors:external_exports2.array(external_exports2.unknown()).optional()}),PackageDetailSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),docType:external_exports2.number(),updateTime:external_exports2.number(),owner:OwnerSchema,datastrid:external_exports2.string(),writable:external_exports2.boolean(),dataStr:PackageDetailDataStrSchema}),ModelBoundsSchema=external_exports2.object({min:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()}),max:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()})}),EasyEdaJsonSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),description:external_exports2.string(),docType:external_exports2.number(),type:external_exports2.number(),szlcsc:SzlcscSchema,lcsc:LcscSchema,owner:OwnerSchema,tags:external_exports2.array(external_exports2.string()),updateTime:external_exports2.number(),updated_at:external_exports2.string(),dataStr:DataStrSchema,verify:external_exports2.boolean(),SMT:external_exports2.boolean().optional(),datastrid:external_exports2.string(),jlcOnSale:external_exports2.number().optional(),writable:external_exports2.boolean(),isFavorite:external_exports2.boolean(),packageDetail:PackageDetailSchema,_objMetadata:external_exports2.object({bounds:ModelBoundsSchema}).optional()}),getModelObjCdnUrl=({easyedaModelUuid,easyedaPartNumber})=>`https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.obj?uuid=${easyedaModelUuid}`,getModelCdnUrl=getModelObjCdnUrl,getModelUuidFromRawPackageDetail=result=>{let shapes=result.packageDetail?.dataStr?.shape;if(!Array.isArray(shapes))return null;for(let shape of shapes){if(typeof shape!="string"||!shape.startsWith("SVGNODE~"))continue;let svgNodeJson=shape.slice(8);try{let modelUuid=JSON.parse(svgNodeJson)?.attrs?.uuid;if(typeof modelUuid=="string"&&modelUuid.length>0)return modelUuid}catch{}}return null},parseObjBounds2=objText=>{let minX=Number.POSITIVE_INFINITY,minY=Number.POSITIVE_INFINITY,minZ=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY,maxZ=Number.NEGATIVE_INFINITY,vertexCount=0;for(let line2 of objText.split(/\r?\n/)){let trimmed=line2.trim();if(!trimmed.startsWith("v "))continue;let[,xStr,yStr,zStr]=trimmed.split(/\s+/,4),x4=Number(xStr),y4=Number(yStr),z4=Number(zStr);!Number.isFinite(x4)||!Number.isFinite(y4)||!Number.isFinite(z4)||(vertexCount+=1,minX=Math.min(minX,x4),minY=Math.min(minY,y4),minZ=Math.min(minZ,z4),maxX=Math.max(maxX,x4),maxY=Math.max(maxY,y4),maxZ=Math.max(maxZ,z4))}return vertexCount===0?null:{min:{x:minX,y:minY,z:minZ},max:{x:maxX,y:maxY,z:maxZ}}};async function fetchEasyEDAComponent(jlcpcbPartNumber,{fetch:fetch22=globalThis.fetch,includeModelMetadata=!0}={}){let searchUrl="https://easyeda.com/api/components/search",componentUrl=uuid=>`https://easyeda.com/api/components/${uuid}?version=6.4.7&uuid=${uuid}&datastrid=`,searchHeaders={authority:"easyeda.com",pragma:"no-cache","cache-control":"no-cache",accept:"application/json, text/javascript, */*; q=0.01","x-requested-with":"XMLHttpRequest","user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","content-type":"application/x-www-form-urlencoded; charset=UTF-8",origin:"https://easyeda.com","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty",referer:"https://easyeda.com/editor","accept-language":"cs,en;q=0.9,sk;q=0.8,en-GB;q=0.7",cookie:"<PUT your cookies here>"},searchData=`type=3&doctype%5B%5D=2&uid=0819f05c4eef4c71ace90d822a990e87&returnListStyle=classifyarr&wd=${jlcpcbPartNumber}&version=6.4.7`,searchResponse=await fetch22(searchUrl,{method:"POST",headers:searchHeaders,body:searchData});if(!searchResponse.ok)throw new Error("Failed to search for the component");let searchResult=await searchResponse.json();if(!searchResult.success||!searchResult.result.lists.lcsc.length)throw new Error("Component not found");let componentUUID=(searchResult.result.lists.lcsc.find(component=>component.dataStr.head.c_para["Supplier Part"]===jlcpcbPartNumber)??searchResult.result.lists.lcsc[0]).uuid,componentResponse=await fetch22(componentUrl(componentUUID),{method:"GET",headers:{...searchHeaders,referer:`https://easyeda.com/editor?uuid=${componentUUID}`}});if(!componentResponse.ok)throw new Error("Failed to fetch the component details");let result=(await componentResponse.json()).result;if(includeModelMetadata){let modelUuid=getModelUuidFromRawPackageDetail(result),partNumber=result.lcsc?.number;if(modelUuid&&partNumber)try{let objUrl=getModelCdnUrl({easyedaModelUuid:modelUuid,easyedaPartNumber:partNumber}),objResponse=await fetch22(objUrl);if(objResponse.ok){let objText=await objResponse.text(),bounds=parseObjBounds2(objText);bounds&&(result._objMetadata={bounds})}}catch(error2){console.error(`Error fetching model metadata for ${jlcpcbPartNumber}:`,error2)}}return result}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]},getJlcPackageFromFootprinterString=footprinterString=>footprinterString.includes("cap")?footprinterString.replace(/cap/g,""):footprinterString,getJlcpcbPackageName=footprint=>{if(footprint){if(footprint.startsWith("kicad:")){let footprinterString=getFootprinterStringFromKicad(footprint);return footprinterString?getJlcPackageFromFootprinterString(footprinterString):footprint}return getJlcPackageFromFootprinterString(footprint)}},EASYEDA_API_ORIGIN="https://easyeda.com",METHODS_WITHOUT_BODY=new Set(["GET","HEAD"]),getRequestUrl=requestInput=>typeof requestInput=="string"?requestInput:requestInput instanceof URL?requestInput.toString():requestInput.url,createMergedTargetRequest=(requestInput,requestInit)=>requestInput instanceof URL?new Request(requestInput.toString(),requestInit):typeof requestInput=="string"?new Request(requestInput,requestInit):new Request(requestInput,requestInit),isEasyEdaApiRequestUrl=requestUrl=>requestUrl.startsWith(`${EASYEDA_API_ORIGIN}/api/`),getFetchWithEasyEdaProxy=({platformFetch:upstreamFetch,easyEdaProxyConfig})=>async(requestInput,requestInit)=>{let targetRequestUrl=getRequestUrl(requestInput);if(!isEasyEdaApiRequestUrl(targetRequestUrl))return upstreamFetch(requestInput,requestInit);let mergedTargetRequest=createMergedTargetRequest(requestInput,requestInit),targetRequestHeaders=new Headers(mergedTargetRequest.headers),proxyRequestHeaders=new Headers(targetRequestHeaders);proxyRequestHeaders.delete("origin"),proxyRequestHeaders.delete("authority"),proxyRequestHeaders.delete("host"),proxyRequestHeaders.delete("referer"),proxyRequestHeaders.delete("user-agent"),proxyRequestHeaders.delete("cookie"),proxyRequestHeaders.set("X-Target-Url",targetRequestUrl),proxyRequestHeaders.set("X-Sender-Origin",targetRequestHeaders.get("origin")??""),proxyRequestHeaders.set("X-Sender-Host",targetRequestHeaders.get("host")??EASYEDA_API_ORIGIN),proxyRequestHeaders.set("X-Sender-Referer",targetRequestHeaders.get("referer")??""),proxyRequestHeaders.set("X-Sender-User-Agent",targetRequestHeaders.get("user-agent")??""),proxyRequestHeaders.set("X-Sender-Cookie",targetRequestHeaders.get("cookie")??""),proxyRequestHeaders.set("authority",targetRequestHeaders.get("authority")??targetRequestHeaders.get("host")??""),proxyRequestHeaders.set("content-type",targetRequestHeaders.get("content-type")??"");for(let[name,value]of Object.entries(easyEdaProxyConfig.headers??{}))proxyRequestHeaders.set(name,value);let proxyRequestBody=METHODS_WITHOUT_BODY.has(mergedTargetRequest.method)?void 0:await mergedTargetRequest.clone().arrayBuffer();return upstreamFetch(easyEdaProxyConfig.proxyEndpointUrl,{method:mergedTargetRequest.method,headers:proxyRequestHeaders,body:proxyRequestBody,signal:requestInit?.signal})},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((a3,b3)=>Number(b3.is_basic??!1)-Number(a3.is_basic??!1)):[],JlcPcbPartsEngine=class{constructor({platformFetch:defaultPlatformFetch,easyEdaProxyConfig}={}){__publicField(this,"defaultPlatformFetch");__publicField(this,"easyEdaProxyConfig");this.defaultPlatformFetch=defaultPlatformFetch,this.easyEdaProxyConfig=easyEdaProxyConfig,this.fetchPartCircuitJson=this.fetchPartCircuitJson.bind(this)}getEasyEdaPlatformFetch(platformFetchOverride){let resolvedPlatformFetch=platformFetchOverride??this.defaultPlatformFetch??globalThis.fetch;return this.easyEdaProxyConfig?getFetchWithEasyEdaProxy({platformFetch:resolvedPlatformFetch,easyEdaProxyConfig:this.easyEdaProxyConfig}):resolvedPlatformFetch}async findPart({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(r5=>`C${r5.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(c4=>`C${c4.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(h6=>`C${h6.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(d4=>`C${d4.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(c4=>`C${c4.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(t52=>`C${t52.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(i3=>`C${i3.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(c4=>`C${c4.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(m4=>`C${m4.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(r5=>`C${r5.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(s3=>`C${s3.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(l4=>`C${l4.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(l4=>`C${l4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_connector"&&sourceComponent.standard==="usb_c"){let{usb_c_connectors}=await getJlcPartsCached("usb_c_connectors",{});return{jlcpcb:withBasicPartPreference(usb_c_connectors).map(c4=>`C${c4.lcsc}`).slice(0,3)}}return{}}async fetchPartCircuitJson({supplierPartNumber,manufacturerPartNumber,platformFetch:platformFetchOverride}){let easyEdaPlatformFetch=this.getEasyEdaPlatformFetch(platformFetchOverride),resolvedSupplierPartNumber=supplierPartNumber;if(!resolvedSupplierPartNumber&&manufacturerPartNumber){let{components}=await getJlcPartsCached("components",{search:manufacturerPartNumber});resolvedSupplierPartNumber=components?.[0]?`C${components[0].lcsc}`:void 0}if(!resolvedSupplierPartNumber)return;let rawEasyEdaJson=await fetchEasyEDAComponent(resolvedSupplierPartNumber,{fetch:easyEdaPlatformFetch}),parsed=EasyEdaJsonSchema.parse(rawEasyEdaJson);return convertEasyEdaJsonToCircuitJson(parsed)}},jlcPartsEngine=new JlcPcbPartsEngine;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()]),point34=external_exports.tuple([external_exports.number(),external_exports.number(),external_exports.number()]),point6=external_exports.union([point22,point34]),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:point6,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:point6,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).pipe(drill_def),size:external_exports.union([external_exports.array(external_exports.number()).length(2).transform(([w4,h6])=>({width:w4,height:h6})),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:point6,size:point22,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).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:point6,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_rect_def=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(),fill:external_exports.string().optional(),layer:external_exports.string(),uuid: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_rects:external_exports.array(fp_rect_def).optional(),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(n4=>Number.parseFloat(n4.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(n4=>Number.parseFloat(n4.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(n4=>Number.parseFloat(n4.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(n4=>n4?.valueOf?.()??n4).filter(v4=>typeof v4=="number"||typeof v4=="string"&&/^[-+]?\d*\.?\d+(e[-+]?\d+)?$/i.test(v4)).map(v4=>typeof v4=="number"?v4:Number.parseFloat(v4)):attrKey==="tags"?val.map(n4=>n4.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(s3=>s3.valueOf()):val},getAttr=(s3,key)=>{for(let elm of s3)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 at3=getAttr(row,"at"),size3=getAttr(row,"size"),drill=getAttr(row,"drill"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let padType=row[2].valueOf(),isCu=layers.some(l4=>l4.endsWith(".Cu")||l4==="*.Cu"||l4.includes(".Cu"));if(padType==="thru_hole")continue;if(!isCu&&padType!=="np_thru_hole"){debug11(`Skipping pad without copper 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:at3,drill,size:size3,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(),at3=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:at3,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_rects=[],fp_rect_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_rect");for(let fp_rect_row of fp_rect_rows){let start=getAttr(fp_rect_row,"start"),end=getAttr(fp_rect_row,"end"),stroke=getAttr(fp_rect_row,"stroke"),layer=getAttr(fp_rect_row,"layer"),fill=getAttr(fp_rect_row,"fill"),uuid=getAttr(fp_rect_row,"uuid");!start||!end||!layer||fp_rects.push({start,end,stroke,fill,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?.(),at3=getAttr(row,"at"),drill=getAttr(row,"drill"),size3=getAttr(row,"size");Array.isArray(size3)&&(size3[0]==="size"&&(size3=size3.slice(1)),size3={width:Number(size3[0]),height:Number(size3[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:at3,drill,size:size3,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_rects,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 getArcLength2=(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 i3=0;i3<=numPoints;i3++){let angle=angleStart+i3/numPoints*angleDelta,x4=center2.x+radius*Math.cos(angle),y4=center2.y+radius*Math.sin(angle);path.push({x:x4,y:y4})}return path}var makePoint=p4=>Array.isArray(p4)?{x:p4[0],y:p4[1]}:p4,pointsEqual2=(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 i3=0;i3<segments.length;i3++){if(used.has(i3))continue;let polygon2=[segments[i3]];used.add(i3);let currentEnd=segments[i3].end,foundNext=!0;for(;foundNext;){if(foundNext=!1,polygon2.length>1&&pointsEqual2(currentEnd,polygon2[0].start)){polygons.push(polygon2);break}for(let j4=0;j4<segments.length;j4++)if(!used.has(j4)){if(pointsEqual2(currentEnd,segments[j4].start)){polygon2.push(segments[j4]),used.add(j4),currentEnd=segments[j4].end,foundNext=!0;break}else if(pointsEqual2(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 arcLength2=getArcLength2(segment2.start,segment2.mid,segment2.end),numPoints=Math.max(3,Math.ceil(arcLength2)),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(t52=>t52.layer?.toLowerCase()==="f.silks"&&(t52.text?.includes("${REFERENCE}")||t52.fp_text_type?.toLowerCase()==="reference"||t52.text?.match(/^R\d+|C\d+|U\d+/))),fallbackText=refText||fp_texts.find(t52=>t52.layer?.toLowerCase()==="f.fab"&&(t52.text?.includes("${REFERENCE}")||t52.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=(x4,y4,deg)=>{let r5=degToRad(deg),cos6=Math.cos(r5),sin6=Math.sin(r5);return{x:x4*cos6-y4*sin6,y:x4*sin6+y4*cos6}},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((a3,b3)=>a3-b3),[minY,maxY]=uniqueYs.sort((a3,b3)=>a3-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=at3=>at3&&Array.isArray(at3)&&at3.length>=3&&typeof at3[2]=="number"?at3[2]:0,isNinetyLike=deg=>{let n4=(deg%360+360)%360;return n4===90||n4===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"f.crtyd":case"edge.cuts":return"top";case"b.cu":case"b.fab":case"b.silks":case"b.crtyd":return"bottom"}},convertKicadJsonToTsCircuitSoup=async kicadJson=>{let{fp_lines,fp_rects,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 x4=pad2.at[0],y4=-pad2.at[1],w4=pad2.size[0],h6=pad2.size[1];minX=Math.min(minX,x4-w4/2),maxX=Math.max(maxX,x4+w4/2),minY=Math.min(minY,y4-h6/2),maxY=Math.max(maxY,y4+h6/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 x4=0,y4=0,layers=["top","bottom"],pad2=pads.find(p4=>normalizePortName(p4.name)===portName);if(pad2)x4=pad2.at[0],y4=-pad2.at[1],layers=pad2.layers?pad2.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"];else if(holes){let hole=holes.find(h6=>normalizePortName(h6.name)===portName);hole&&(x4=hole.at[0],y4=-hole.at[1],layers=hole.layers?hole.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"])}circuitJson.push({type:"pcb_port",pcb_port_id,source_port_id,pcb_component_id,x:x4,y:y4,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 rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?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 rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?pad2.size[0]:pad2.size[1],offX=pad2.drill?.offset?.[0]??0,offY=pad2.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation5),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"&&pad2.pad_shape==="circle"&&circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:pad2.at[0],y:-pad2.at[1],hole_shape:"circle",hole_diameter:pad2.drill?.width??pad2.size[0],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(l4=>l4.endsWith(".Cu")||l4==="*.Cu"),rotation5=getRotationDeg(hole.at),offX=hole.drill?.offset?.[0]??0,offY=hole.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation5),x4=hole.at[0]+rotOff.x,y4=-(hole.at[1]+rotOff.y),holeDiameter=hole.drill?.width??0,outerDiameter=hole.size?.width??holeDiameter,rr3=hole.roundrect_rratio??0,rectBorderRadius=rr3>0?Math.min(isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter)/2*rr3: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(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,rect_pad_height:isNinetyLike(rotation5)?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:x4,y:y4,outer_width:isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,outer_height:isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,hole_width:isNinetyLike(rotation5)?hole.drill?.height??holeDiameter:hole.drill?.width??holeDiameter,hole_height:isNinetyLike(rotation5)?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,rotation5),width=isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,height=isNinetyLike(rotation5)?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:x4,y:y4,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:x4,y:y4,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:x4,y:y4,hole_shape:"circle",hole_diameter:holeDiameter,pcb_component_id})}let edgeCutSegments=[],frontCourtyardSegments=[],backCourtyardSegments=[];for(let fp_line2 of fp_lines){let lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="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}):lowerLayer==="f.crtyd"?frontCourtyardSegments.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}):lowerLayer==="b.crtyd"&&backCourtyardSegments.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){let lowerLayer=fp_arc.layer.toLowerCase();lowerLayer==="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}):lowerLayer==="f.crtyd"?frontCourtyardSegments.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}):lowerLayer==="b.crtyd"&&backCourtyardSegments.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 courtyardOutlineId=0;for(let[segments,layer]of[[frontCourtyardSegments,"top"],[backCourtyardSegments,"bottom"]]){let closedCourtyardPolygons=findClosedPolygons(segments);for(let polygon2 of closedCourtyardPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${courtyardOutlineId++}`,layer,pcb_component_id,outline:points.map(p4=>({x:p4.x,y:-p4.y}))})}}if(fp_rects)for(let fp_rect of fp_rects){let lowerLayer=fp_rect.layer.toLowerCase();if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){let x12=fp_rect.start[0],y12=fp_rect.start[1],x22=fp_rect.end[0],y22=fp_rect.end[1];circuitJson.push({type:"pcb_courtyard_rect",pcb_courtyard_rect_id:`pcb_courtyard_rect_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_rect.layer),center:{x:(x12+x22)/2,y:-((y12+y22)/2)},width:Math.abs(x22-x12),height:Math.abs(y22-y12)})}else debug23("Unhandled layer for fp_rect",fp_rect.layer)}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.crtyd"||lowerLayer==="b.crtyd"?debug23("Skipping CrtYd fp_line (converted to pcb_courtyard_outline)",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),arcLength2=getArcLength2(start,mid,end),adjustedNumPoints=Math.max(2,Math.ceil(arcLength2/.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:[]}):fp_poly.layer.toLowerCase().endsWith(".crtyd")?polygonPoints.length>=3&&circuitJson.push({type:"pcb_courtyard_polygon",pcb_courtyard_polygon_id:`pcb_courtyard_polygon_${courtyardOutlineId++}`,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id,points:polygonPoints}):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}if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){debug23("Skipping CrtYd fp_arc (converted to pcb_courtyard_outline)",fp_arc.layer);continue}let start=makePoint(fp_arc.start),mid=makePoint(fp_arc.mid),end=makePoint(fp_arc.end),arcLength2=getArcLength2(start,mid,end),arcPoints=generateArcPath(start,mid,end,Math.ceil(arcLength2));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 i3=0;i3<=numPoints;i3++){let angle=i3/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}):(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd")&&circuitJson.push({type:"pcb_courtyard_circle",pcb_courtyard_circle_id:`pcb_courtyard_circle_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_circle.layer),center:{x:center2.x,y:-center2.y},radius})}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 at3=propFab.attributes.at;if(!at3)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:at3[0],y:-at3[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={},options={})=>{let partsEngine2=overrides.partsEngine??jlcPartsEngine;return!overrides.partsEngine&&options.easyEdaProxyConfig&&(partsEngine2=new JlcPcbPartsEngine({platformFetch:overrides.platformFetch,easyEdaProxyConfig:options.easyEdaProxyConfig})),{localCacheEngine:overrides.localCacheEngine,partsEngine:partsEngine2,spiceEngineMap:{ngspice:{simulate:async spice=>{if(!ngspiceEngineCache){let createNgspiceSpiceEngine=await dynamicallyLoadDependencyWithCdnBackup("@tscircuit/ngspice-spice-engine").catch(error2=>{throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.",{cause:error2})});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(d4,b3){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d5,b4){d5.__proto__=b4}||function(d5,b4){for(var p4 in b4)Object.prototype.hasOwnProperty.call(b4,p4)&&(d5[p4]=b4[p4])},extendStatics(d4,b3)};function __extends(d4,b3){if(typeof b3!="function"&&b3!==null)throw new TypeError("Class extends value "+String(b3)+" is not a constructor or null");extendStatics(d4,b3);function __2(){this.constructor=d4}d4.prototype=b3===null?Object.create(b3):(__2.prototype=b3.prototype,new __2)}var __assign=function(){return __assign=Object.assign||function(t52){for(var s3,i3=1,n4=arguments.length;i3<n4;i3++){s3=arguments[i3];for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&(t52[p4]=s3[p4])}return t52},__assign.apply(this,arguments)};function __rest(s3,e5){var t52={};for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&e5.indexOf(p4)<0&&(t52[p4]=s3[p4]);if(s3!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i3=0,p4=Object.getOwnPropertySymbols(s3);i3<p4.length;i3++)e5.indexOf(p4[i3])<0&&Object.prototype.propertyIsEnumerable.call(s3,p4[i3])&&(t52[p4[i3]]=s3[p4[i3]]);return t52}function __decorate(decorators,target,key,desc){var c4=arguments.length,r5=c4<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d4;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r5=Reflect.decorate(decorators,target,key,desc);else for(var i3=decorators.length-1;i3>=0;i3--)(d4=decorators[i3])&&(r5=(c4<3?d4(r5):c4>3?d4(target,key,r5):d4(target,key))||r5);return c4>3&&r5&&Object.defineProperty(target,key,r5),r5}function __param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function __esDecorate(ctor,descriptorIn,decorators,contextIn,initializers,extraInitializers){function accept(f3){if(f3!==void 0&&typeof f3!="function")throw new TypeError("Function expected");return f3}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):{}),_4,done=!1,i3=decorators.length-1;i3>=0;i3--){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(f3){if(done)throw new TypeError("Cannot add initializers after decoration has completed");extraInitializers.push(accept(f3||null))};var result=(0,decorators[i3])(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");(_4=accept(result.get))&&(descriptor.get=_4),(_4=accept(result.set))&&(descriptor.set=_4),(_4=accept(result.init))&&initializers.unshift(_4)}else(_4=accept(result))&&(kind==="field"?initializers.unshift(_4):descriptor[key]=_4)}target&&Object.defineProperty(target,contextIn.name,descriptor),done=!0}function __runInitializers(thisArg,initializers,value){for(var useValue=arguments.length>2,i3=0;i3<initializers.length;i3++)value=useValue?initializers[i3].call(thisArg,value):initializers[i3].call(thisArg);return useValue?value:void 0}function __propKey(x4){return typeof x4=="symbol"?x4:"".concat(x4)}function __setFunctionName(f3,name,prefix){return typeof name=="symbol"&&(name=name.description?"[".concat(name.description,"]"):""),Object.defineProperty(f3,"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,P4,generator){function adopt(value){return value instanceof P4?value:new P4(function(resolve){resolve(value)})}return new(P4||(P4=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e5){reject(e5)}}function rejected(value){try{step(generator.throw(value))}catch(e5){reject(e5)}}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 _4={label:0,sent:function(){if(t52[0]&1)throw t52[1];return t52[1]},trys:[],ops:[]},f3,y4,t52,g6=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return g6.next=verb(0),g6.throw=verb(1),g6.return=verb(2),typeof Symbol=="function"&&(g6[Symbol.iterator]=function(){return this}),g6;function verb(n4){return function(v4){return step([n4,v4])}}function step(op3){if(f3)throw new TypeError("Generator is already executing.");for(;g6&&(g6=0,op3[0]&&(_4=0)),_4;)try{if(f3=1,y4&&(t52=op3[0]&2?y4.return:op3[0]?y4.throw||((t52=y4.return)&&t52.call(y4),0):y4.next)&&!(t52=t52.call(y4,op3[1])).done)return t52;switch(y4=0,t52&&(op3=[op3[0]&2,t52.value]),op3[0]){case 0:case 1:t52=op3;break;case 4:return _4.label++,{value:op3[1],done:!1};case 5:_4.label++,y4=op3[1],op3=[0];continue;case 7:op3=_4.ops.pop(),_4.trys.pop();continue;default:if(t52=_4.trys,!(t52=t52.length>0&&t52[t52.length-1])&&(op3[0]===6||op3[0]===2)){_4=0;continue}if(op3[0]===3&&(!t52||op3[1]>t52[0]&&op3[1]<t52[3])){_4.label=op3[1];break}if(op3[0]===6&&_4.label<t52[1]){_4.label=t52[1],t52=op3;break}if(t52&&_4.label<t52[2]){_4.label=t52[2],_4.ops.push(op3);break}t52[2]&&_4.ops.pop(),_4.trys.pop();continue}op3=body.call(thisArg,_4)}catch(e5){op3=[6,e5],y4=0}finally{f3=t52=0}if(op3[0]&5)throw op3[1];return{value:op3[0]?op3[1]:void 0,done:!0}}}var __createBinding=Object.create?(function(o4,m4,k4,k22){k22===void 0&&(k22=k4);var desc=Object.getOwnPropertyDescriptor(m4,k4);(!desc||("get"in desc?!m4.__esModule:desc.writable||desc.configurable))&&(desc={enumerable:!0,get:function(){return m4[k4]}}),Object.defineProperty(o4,k22,desc)}):(function(o4,m4,k4,k22){k22===void 0&&(k22=k4),o4[k22]=m4[k4]});function __exportStar(m4,o4){for(var p4 in m4)p4!=="default"&&!Object.prototype.hasOwnProperty.call(o4,p4)&&__createBinding(o4,m4,p4)}function __values(o4){var s3=typeof Symbol=="function"&&Symbol.iterator,m4=s3&&o4[s3],i3=0;if(m4)return m4.call(o4);if(o4&&typeof o4.length=="number")return{next:function(){return o4&&i3>=o4.length&&(o4=void 0),{value:o4&&o4[i3++],done:!o4}}};throw new TypeError(s3?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(o4,n4){var m4=typeof Symbol=="function"&&o4[Symbol.iterator];if(!m4)return o4;var i3=m4.call(o4),r5,ar3=[],e5;try{for(;(n4===void 0||n4-- >0)&&!(r5=i3.next()).done;)ar3.push(r5.value)}catch(error2){e5={error:error2}}finally{try{r5&&!r5.done&&(m4=i3.return)&&m4.call(i3)}finally{if(e5)throw e5.error}}return ar3}function __spread(){for(var ar3=[],i3=0;i3<arguments.length;i3++)ar3=ar3.concat(__read(arguments[i3]));return ar3}function __spreadArrays(){for(var s3=0,i3=0,il3=arguments.length;i3<il3;i3++)s3+=arguments[i3].length;for(var r5=Array(s3),k4=0,i3=0;i3<il3;i3++)for(var a3=arguments[i3],j4=0,jl3=a3.length;j4<jl3;j4++,k4++)r5[k4]=a3[j4];return r5}function __spreadArray(to3,from,pack2){if(pack2||arguments.length===2)for(var i3=0,l4=from.length,ar3;i3<l4;i3++)(ar3||!(i3 in from))&&(ar3||(ar3=Array.prototype.slice.call(from,0,i3)),ar3[i3]=from[i3]);return to3.concat(ar3||Array.prototype.slice.call(from))}function __await(v4){return this instanceof __await?(this.v=v4,this):new __await(v4)}function __asyncGenerator(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g6=generator.apply(thisArg,_arguments||[]),i3,q4=[];return i3=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i3[Symbol.asyncIterator]=function(){return this},i3;function awaitReturn(f3){return function(v4){return Promise.resolve(v4).then(f3,reject)}}function verb(n4,f3){g6[n4]&&(i3[n4]=function(v4){return new Promise(function(a3,b3){q4.push([n4,v4,a3,b3])>1||resume(n4,v4)})},f3&&(i3[n4]=f3(i3[n4])))}function resume(n4,v4){try{step(g6[n4](v4))}catch(e5){settle(q4[0][3],e5)}}function step(r5){r5.value instanceof __await?Promise.resolve(r5.value.v).then(fulfill,reject):settle(q4[0][2],r5)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f3,v4){f3(v4),q4.shift(),q4.length&&resume(q4[0][0],q4[0][1])}}function __asyncDelegator(o4){var i3,p4;return i3={},verb("next"),verb("throw",function(e5){throw e5}),verb("return"),i3[Symbol.iterator]=function(){return this},i3;function verb(n4,f3){i3[n4]=o4[n4]?function(v4){return(p4=!p4)?{value:__await(o4[n4](v4)),done:!1}:f3?f3(v4):v4}:f3}}function __asyncValues(o4){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m4=o4[Symbol.asyncIterator],i3;return m4?m4.call(o4):(o4=typeof __values=="function"?__values(o4):o4[Symbol.iterator](),i3={},verb("next"),verb("throw"),verb("return"),i3[Symbol.asyncIterator]=function(){return this},i3);function verb(n4){i3[n4]=o4[n4]&&function(v4){return new Promise(function(resolve,reject){v4=o4[n4](v4),settle(resolve,reject,v4.done,v4.value)})}}function settle(resolve,reject,d4,v4){Promise.resolve(v4).then(function(v5){resolve({value:v5,done:d4})},reject)}}function __makeTemplateObject(cooked,raw){return Object.defineProperty?Object.defineProperty(cooked,"raw",{value:raw}):cooked.raw=raw,cooked}var __setModuleDefault=Object.create?(function(o4,v4){Object.defineProperty(o4,"default",{enumerable:!0,value:v4})}):function(o4,v4){o4.default=v4},ownKeys=function(o4){return ownKeys=Object.getOwnPropertyNames||function(o6){var ar3=[];for(var k4 in o6)Object.prototype.hasOwnProperty.call(o6,k4)&&(ar3[ar3.length]=k4);return ar3},ownKeys(o4)};function __importStar(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k4=ownKeys(mod),i3=0;i3<k4.length;i3++)k4[i3]!=="default"&&__createBinding(result,mod,k4[i3]);return __setModuleDefault(result,mod),result}function __importDefault(mod){return mod&&mod.__esModule?mod:{default:mod}}function __classPrivateFieldGet(receiver,state2,kind,f3){if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a getter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f3:kind==="a"?f3.call(receiver):f3?f3.value:state2.get(receiver)}function __classPrivateFieldSet(receiver,state2,value,kind,f3){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a setter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f3.call(receiver,value):f3?f3.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(e5){return Promise.reject(e5)}}),env.stack.push({value,dispose,async})}else async&&env.stack.push({async:!0});return value}var _SuppressedError=typeof SuppressedError=="function"?SuppressedError:function(error2,suppressed,message){var e5=new Error(message);return e5.name="SuppressedError",e5.error=error2,e5.suppressed=suppressed,e5};function __disposeResources(env){function fail(e5){env.error=env.hasError?new _SuppressedError(e5,env.error,"An error was suppressed during disposal."):e5,env.hasError=!0}var r5,s3=0;function next2(){for(;r5=env.stack.pop();)try{if(!r5.async&&s3===1)return s3=0,env.stack.push(r5),Promise.resolve().then(next2);if(r5.dispose){var result=r5.dispose.call(r5.value);if(r5.async)return s3|=2,Promise.resolve(result).then(next2,function(e5){return fail(e5),next2()})}else s3|=1}catch(e5){fail(e5)}if(s3===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(m4,tsx,d4,ext,cm3){return tsx?preserveJsx?".jsx":".js":d4&&(!ext||!cm3)?m4:d4+ext+"."+cm3.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({},{easyEdaProxyConfig:webWorkerConfiguration.easyEdaProxyConfig}),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(`
|
|
673
|
+
at `+loc}return str};peg$SyntaxError3.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch3){return ch3.charCodeAt(0).toString(16).toUpperCase()}function literalEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function classEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i3,j4;if(descriptions.sort(),descriptions.length>0){for(i3=1,j4=1;i3<descriptions.length;i3++)descriptions[i3-1]!==descriptions[i3]&&(descriptions[j4]=descriptions[i3],j4++);descriptions.length=j4}switch(descriptions.length){case 1:return descriptions[0];case 2:return descriptions[0]+" or "+descriptions[1];default:return descriptions.slice(0,-1).join(", ")+", or "+descriptions[descriptions.length-1]}}function describeFound(found2){return found2?'"'+literalEscape(found2)+'"':"end of input"}return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found."};function decomposeTSR3(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose4(matrix2,scale4(-1,-1)):matrix2=compose4(matrix2,scale4(1,-1)):flipY2&&(matrix2=compose4(matrix2,scale4(-1,1)));let a3=matrix2.a,b3=matrix2.b,c4=matrix2.c,d4=matrix2.d,scaleX,scaleY,rotation22;if(a3!==0||c4!==0){let hypotAc=Math.hypot(a3,c4);scaleX=hypotAc,scaleY=(a3*d4-b3*c4)/hypotAc;let acos=Math.acos(a3/hypotAc);rotation22=c4>0?-acos:acos}else if(b3!==0||d4!==0){let hypotBd=Math.hypot(b3,d4);scaleX=(a3*d4-b3*c4)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b3/hypotBd);rotation22=Math.PI/2+(d4>0?-acos:acos)}else scaleX=0,scaleY=0,rotation22=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation22}}}function connect2(map,a3,b3){if(!a3||!b3)return;let setA=map.get(a3);setA||(setA=new Set,map.set(a3,setA)),setA.add(b3);let setB=map.get(b3);setB||(setB=new Set,map.set(b3,setB)),setB.add(a3)}function buildSubtree2(soup,opts){if(!opts.subcircuit_id&&!opts.source_group_id)return[...soup];let effectiveOpts=opts;if(opts.subcircuit_id){let subcircuitIds=new Set([opts.subcircuit_id]),groupChildren=new Map,groupSubcircuit=new Map;for(let elm of soup)if(elm.type==="source_group"){let groupId=elm.source_group_id,subcircuitId=elm.subcircuit_id;subcircuitId&&groupSubcircuit.set(groupId,subcircuitId);let parentId=elm.parent_source_group_id;parentId&&(groupChildren.has(parentId)||groupChildren.set(parentId,[]),groupChildren.get(parentId).push(groupId))}let rootGroupId;for(let[groupId,subcircuitId]of groupSubcircuit)if(subcircuitId===opts.subcircuit_id){rootGroupId=groupId;break}if(rootGroupId){let collectChildSubcircuits=groupId=>{let children=groupChildren.get(groupId)||[];for(let childId of children){let childSubcircuit=groupSubcircuit.get(childId);childSubcircuit&&subcircuitIds.add(childSubcircuit),collectChildSubcircuits(childId)}};collectChildSubcircuits(rootGroupId),effectiveOpts={...opts,subcircuit_ids:Array.from(subcircuitIds)}}}let idMap=new Map;for(let elm of soup){let idKey=`${elm.type}_id`,idVal=elm[idKey];typeof idVal=="string"&&idMap.set(idVal,elm)}let adj=new Map;for(let elm of soup){let entries=Object.entries(elm);for(let[key,val]of entries)if(key!=="parent_source_group_id"){if(key.endsWith("_id")&&typeof val=="string"){let other=idMap.get(val);connect2(adj,elm,other)}else if(key.endsWith("_ids")&&Array.isArray(val)){for(let v4 of val)if(typeof v4=="string"){let other=idMap.get(v4);connect2(adj,elm,other)}}}}let queue=[],included=new Set;for(let elm of soup){let shouldInclude=!1;(effectiveOpts.subcircuit_id&&"subcircuit_id"in elm&&elm.subcircuit_id===effectiveOpts.subcircuit_id||effectiveOpts.subcircuit_ids&&"subcircuit_id"in elm&&elm.subcircuit_id&&effectiveOpts.subcircuit_ids.includes(elm.subcircuit_id)||effectiveOpts.source_group_id&&"source_group_id"in elm&&elm.source_group_id===effectiveOpts.source_group_id||effectiveOpts.source_group_id&&"member_source_group_ids"in elm&&Array.isArray(elm.member_source_group_ids)&&elm.member_source_group_ids.includes(effectiveOpts.source_group_id))&&(shouldInclude=!0),shouldInclude&&(queue.push(elm),included.add(elm))}for(;queue.length>0;){let elm=queue.shift(),neighbors=adj.get(elm);if(neighbors)for(let n4 of neighbors)included.has(n4)||(included.add(n4),queue.push(n4))}return soup.filter(e5=>included.has(e5))}var cju2=(circuitJsonInput,options={})=>{let circuitJson=circuitJsonInput,internalStore=circuitJson._internal_store;if(!internalStore){internalStore={counts:{},editCount:0},circuitJson._internal_store=internalStore;for(let elm of circuitJson){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))}}let su22=new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(circuitJson.editCount=internalStore.editCount,circuitJson);if(prop==="editCount")return internalStore.editCount;if(prop==="subtree")return opts=>cju2(buildSubtree2(circuitJson,opts),options);if(prop==="insert")return elm=>{var _a362;let component_type2=elm.type;if(!component_type2)throw new Error("insert requires an element with a type");(_a362=internalStore.counts)[component_type2]??(_a362[component_type2]=-1),internalStore.counts[component_type2]++;let index=internalStore.counts[component_type2],newElm={...elm,type:component_type2,[`${component_type2}_id`]:`${component_type2}_${index}`};return options.validateInserts&&(dist_exports6[component_type2]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm};if(prop==="insertAll")return elms=>elms.map(elm=>su22.insert(elm));let component_type=prop;return{get:id2=>circuitJson.find(e5=>e5.type===component_type&&e5[`${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=circuitJson.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner?circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return circuitJson.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return circuitJson.filter(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},insert:elm=>{var _a362;(_a362=internalStore.counts)[component_type]??(_a362[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_exports6[component_type]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm},delete:id2=>{let elm=circuitJson.find(e5=>e5[`${component_type}_id`]===id2);elm&&(circuitJson.splice(circuitJson.indexOf(elm),1),internalStore.editCount++)},update:(id2,newProps)=>{let elm=circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2);return elm?(Object.assign(elm,newProps),internalStore.editCount++,elm):null},select:selector=>{if(component_type==="source_component")return circuitJson.find(e5=>e5.type==="source_component"&&e5.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=circuitJson.find(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=circuitJson.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return circuitJson.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id);if(component_type==="schematic_port")return circuitJson.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)}}}}});return su22};cju2.unparsed=cju2;function createIdKey2(element){let type=element.type;return`${type}:${element[`${type}_id`]}`}var cjuIndexed2=(soup,options={})=>{let internalStore=soup._internal_store_indexed;if(!internalStore){internalStore={counts:{},editCount:0,indexes:{}};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))}let indexConfig=options.indexConfig||{},indexes=internalStore.indexes;if(indexConfig.byId&&(indexes.byId=new Map),indexConfig.byType&&(indexes.byType=new Map),indexConfig.byRelation&&(indexes.byRelation=new Map),indexConfig.bySubcircuit&&(indexes.bySubcircuit=new Map),indexConfig.byCustomField&&indexConfig.byCustomField.length>0){indexes.byCustomField=new Map;for(let field of indexConfig.byCustomField)indexes.byCustomField.set(field,new Map)}for(let element of soup){if(indexConfig.byId){let idKey=createIdKey2(element);indexes.byId.set(idKey,element)}if(indexConfig.byType){let elementsOfType=indexes.byType.get(element.type)||[];elementsOfType.push(element),indexes.byType.set(element.type,elementsOfType)}if(indexConfig.byRelation){let elementEntries=Object.entries(element);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${element.type}_id`&&typeof value=="string"){let relationTypeMap=indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(element),relationTypeMap.set(value,relatedElements),indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&"subcircuit_id"in element){let subcircuitId=element.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(element),indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in element){let fieldValue=element[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(element),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}}soup._internal_store_indexed=internalStore}return new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(soup.editCount=internalStore.editCount,soup);if(prop==="editCount")return internalStore.editCount;let component_type=prop;return{get:id2=>{let indexConfig=options.indexConfig||{};return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${id2}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2)||null},getUsing:using=>{let indexConfig=options.indexConfig||{},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","");if(indexConfig.byRelation&&internalStore.indexes.byRelation){let relationMap=internalStore.indexes.byRelation.get(join_key);if(relationMap){let joiner2=(relationMap.get(using[join_key])||[]).find(e5=>e5.type===join_type);if(!joiner2)return null;let joinerId=joiner2[`${component_type}_id`];return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${joinerId}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===joinerId)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joinerId)||null}}let joiner=soup.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner&&soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`])||null},getWhere:where=>{let indexConfig=options.indexConfig||{},keys=Object.keys(where);if(keys.length===1&&indexConfig.byCustomField&&internalStore.indexes.byCustomField){let field=keys[0],fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let fieldValue=String(where[field]);return(fieldMap.get(fieldValue)||[]).find(e5=>e5.type===component_type)||null}}if("subcircuit_id"in where&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null}return indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>keys.every(key=>e5[key]===where[key]))||null:soup.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null},list:where=>{let indexConfig=options.indexConfig||{},keys=where?Object.keys(where):[];if(keys.length===0&&indexConfig.byType&&internalStore.indexes.byType)return internalStore.indexes.byType.get(component_type)||[];if(keys.length===1&&keys[0]==="subcircuit_id"&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5.type===component_type)}let elementsToFilter;return indexConfig.byType&&internalStore.indexes.byType?elementsToFilter=internalStore.indexes.byType.get(component_type)||[]:elementsToFilter=soup.filter(e5=>e5.type===component_type),keys.length>0?elementsToFilter.filter(e5=>keys.every(key=>e5[key]===where[key])):elementsToFilter},insert:elm=>{var _a362;(_a362=internalStore.counts)[component_type]??(_a362[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};options.validateInserts&&(dist_exports6[component_type]??any_soup_element2).parse(newElm),soup.push(newElm),internalStore.editCount++;let indexConfig=options.indexConfig||{};if(indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(newElm);internalStore.indexes.byId.set(idKey,newElm)}if(indexConfig.byType&&internalStore.indexes.byType){let elementsOfType=internalStore.indexes.byType.get(component_type)||[];elementsOfType.push(newElm),internalStore.indexes.byType.set(component_type,elementsOfType)}if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(newElm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${newElm.type}_id`&&typeof value=="string"){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(newElm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in newElm){let subcircuitId=newElm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(newElm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in newElm){let fieldValue=newElm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(newElm),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}return newElm},delete:id2=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5[`${component_type}_id`]===id2),!elm)return;let elmIndex=soup.indexOf(elm);if(elmIndex>=0&&(soup.splice(elmIndex,1),internalStore.editCount++),indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(elm);internalStore.indexes.byId.delete(idKey)}if(indexConfig.byType&&internalStore.indexes.byType){let filteredElements=(internalStore.indexes.byType.get(component_type)||[]).filter(e5=>e5[`${component_type}_id`]!==id2);internalStore.indexes.byType.set(component_type,filteredElements)}if(indexConfig.byRelation&&internalStore.indexes.byRelation)for(let[relationKey,relationMap]of internalStore.indexes.byRelation.entries())for(let[relationValue,elements]of relationMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?relationMap.delete(relationValue):relationMap.set(relationValue,updatedElements)}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm){let subcircuitId=elm.subcircuit_id;if(subcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(subcircuitId):internalStore.indexes.bySubcircuit.set(subcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField)for(let fieldMap of internalStore.indexes.byCustomField.values())for(let[fieldValue,elements]of fieldMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(fieldValue):fieldMap.set(fieldValue,updatedElements)}},update:(id2,newProps)=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2),!elm)return null;if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps&&newProps[key]!==value){let relationTypeMap=internalStore.indexes.byRelation.get(key);if(relationTypeMap){let updatedElements=(relationTypeMap.get(value)||[]).filter(e5=>e5!==elm);updatedElements.length===0?relationTypeMap.delete(value):relationTypeMap.set(value,updatedElements)}}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let oldSubcircuitId=elm.subcircuit_id,newSubcircuitId=newProps.subcircuit_id;if(oldSubcircuitId!==newSubcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(oldSubcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(oldSubcircuitId):internalStore.indexes.bySubcircuit.set(oldSubcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps&&elm[field]!==newProps[field]){let fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let oldValue=String(elm[field]),updatedElements=(fieldMap.get(oldValue)||[]).filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(oldValue):fieldMap.set(oldValue,updatedElements)}}}if(Object.assign(elm,newProps),internalStore.editCount++,indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.includes(elm)||(relatedElements.push(elm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap))}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let subcircuitId=elm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.includes(elm)||(subcircuitElements.push(elm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements))}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps){let fieldValue=elm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.includes(elm)||(elementsWithFieldValue.push(elm),fieldMap.set(fieldValueStr,elementsWithFieldValue))}}}return elm},select:selector=>{if(component_type==="source_component")return soup.find(e5=>e5.type==="source_component"&&e5.name===selector.replace(/\./g,""))||null;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(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=soup.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return soup.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id)||null;if(component_type==="schematic_port")return soup.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)||null}return null}}}})};cjuIndexed2.unparsed=cjuIndexed2;var transformPCBElement2=(elm,matrix2)=>{let tsr=decomposeTSR3(matrix2),flipPadWidthHeight=Math.round(tsr.rotation.angle/(Math.PI/2))%2===1;if(elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="pcb_via"||elm.type==="pcb_smtpad"||elm.type==="pcb_port"){let{x:x4,y:y4}=applyToPoint4(matrix2,{x:Number(elm.x),y:Number(elm.y)});elm.x=x4,elm.y=y4,elm.type==="pcb_smtpad"&&elm.shape==="polygon"&&Array.isArray(elm.points)&&(elm.points=elm.points.map(point23=>{let tp3=applyToPoint4(matrix2,{x:point23.x,y:point23.y});return{x:tp3.x,y:tp3.y}}))}else if(elm.type==="pcb_keepout"||elm.type==="pcb_board")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_silkscreen_text"||elm.type==="pcb_fabrication_note_text"||elm.type==="pcb_note_text")elm.anchor_position=applyToPoint4(matrix2,elm.anchor_position);else if(elm.type==="pcb_silkscreen_circle"||elm.type==="pcb_silkscreen_rect"||elm.type==="pcb_note_rect"||elm.type==="pcb_courtyard_rect"||elm.type==="pcb_courtyard_circle")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_component")elm.center=applyToPoint4(matrix2,elm.center),elm.rotation=elm.rotation+tsr.rotation.angle/Math.PI*180,elm.rotation=elm.rotation%360,flipPadWidthHeight&&([elm.width,elm.height]=[elm.height,elm.width]);else if(elm.type==="pcb_courtyard_outline")elm.outline=elm.outline.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_courtyard_polygon")elm.points=elm.points.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_silkscreen_path"||elm.type==="pcb_trace"||elm.type==="pcb_fabrication_note_path"||elm.type==="pcb_note_path")elm.route=elm.route.map(rp3=>{let tp3=applyToPoint4(matrix2,rp3);return rp3.x=tp3.x,rp3.y=tp3.y,rp3});else if(elm.type==="pcb_silkscreen_line"||elm.type==="pcb_note_line"){let p12={x:elm.x1,y:elm.y1},p22={x:elm.x2,y:elm.y2},p1t=applyToPoint4(matrix2,p12),p2t=applyToPoint4(matrix2,p22);elm.x1=p1t.x,elm.y1=p1t.y,elm.x2=p2t.x,elm.y2=p2t.y}else if(elm.type==="cad_component"){let newPos=applyToPoint4(matrix2,{x:elm.position.x,y:elm.position.y});elm.position.x=newPos.x,elm.position.y=newPos.y}return elm},transformPCBElements2=(elms,matrix2)=>{let tsr=decomposeTSR3(matrix2),quarterTurns=Math.round(tsr.rotation.angle/(Math.PI/2)),flipPadWidthHeight=Math.abs(quarterTurns)%2===1,transformedElms=elms.map(elm=>transformPCBElement2(elm,matrix2));return flipPadWidthHeight&&(transformedElms=transformedElms.map(elm=>(elm.type==="pcb_smtpad"&&elm.shape==="rect"&&([elm.width,elm.height]=[elm.height,elm.width]),elm))),transformedElms};function stringHash3(str){let hash=0;if(str.length==0)return hash;for(var i3=0;i3<str.length;i3++){var char=str.charCodeAt(i3);hash=(hash<<5)-hash+char,hash=hash&hash}return Math.abs(hash)}var nice_color_palettes2=[["#69d2e7","#a7dbd8","#e0e4cc","#f38630","#fa6900"],["#fe4365","#fc9d9a","#f9cdad","#c8c8a9","#83af9b"],["#ecd078","#d95b43","#c02942","#542437","#53777a"],["#556270","#4ecdc4","#c7f464","#ff6b6b","#c44d58"],["#774f38","#e08e79","#f1d4af","#ece5ce","#c5e0dc"],["#e8ddcb","#cdb380","#036564","#033649","#031634"],["#490a3d","#bd1550","#e97f02","#f8ca00","#8a9b0f"],["#594f4f","#547980","#45ada8","#9de0ad","#e5fcc2"],["#00a0b0","#6a4a3c","#cc333f","#eb6841","#edc951"],["#e94e77","#d68189","#c6a49a","#c6e5d9","#f4ead5"],["#3fb8af","#7fc7af","#dad8a7","#ff9e9d","#ff3d7f"],["#d9ceb2","#948c75","#d5ded9","#7a6a53","#99b2b7"],["#ffffff","#cbe86b","#f2e9e1","#1c140d","#cbe86b"],["#efffcd","#dce9be","#555152","#2e2633","#99173c"],["#343838","#005f6b","#008c9e","#00b4cc","#00dffc"],["#413e4a","#73626e","#b38184","#f0b49e","#f7e4be"],["#ff4e50","#fc913a","#f9d423","#ede574","#e1f5c4"],["#99b898","#fecea8","#ff847c","#e84a5f","#2a363b"],["#655643","#80bca3","#f6f7bd","#e6ac27","#bf4d28"],["#00a8c6","#40c0cb","#f9f2e7","#aee239","#8fbe00"],["#351330","#424254","#64908a","#e8caa4","#cc2a41"],["#554236","#f77825","#d3ce3d","#f1efa5","#60b99a"],["#5d4157","#838689","#a8caba","#cad7b2","#ebe3aa"],["#8c2318","#5e8c6a","#88a65e","#bfb35a","#f2c45a"],["#fad089","#ff9c5b","#f5634a","#ed303c","#3b8183"],["#ff4242","#f4fad2","#d4ee5e","#e1edb9","#f0f2eb"],["#f8b195","#f67280","#c06c84","#6c5b7b","#355c7d"],["#d1e751","#ffffff","#000000","#4dbce9","#26ade4"],["#1b676b","#519548","#88c425","#bef202","#eafde6"],["#5e412f","#fcebb6","#78c0a8","#f07818","#f0a830"],["#bcbdac","#cfbe27","#f27435","#f02475","#3b2d38"],["#452632","#91204d","#e4844a","#e8bf56","#e2f7ce"],["#eee6ab","#c5bc8e","#696758","#45484b","#36393b"],["#f0d8a8","#3d1c00","#86b8b1","#f2d694","#fa2a00"],["#2a044a","#0b2e59","#0d6759","#7ab317","#a0c55f"],["#f04155","#ff823a","#f2f26f","#fff7bd","#95cfb7"],["#b9d7d9","#668284","#2a2829","#493736","#7b3b3b"],["#bbbb88","#ccc68d","#eedd99","#eec290","#eeaa88"],["#b3cc57","#ecf081","#ffbe40","#ef746f","#ab3e5b"],["#a3a948","#edb92e","#f85931","#ce1836","#009989"],["#300030","#480048","#601848","#c04848","#f07241"],["#67917a","#170409","#b8af03","#ccbf82","#e33258"],["#aab3ab","#c4cbb7","#ebefc9","#eee0b7","#e8caaf"],["#e8d5b7","#0e2430","#fc3a51","#f5b349","#e8d5b9"],["#ab526b","#bca297","#c5ceae","#f0e2a4","#f4ebc3"],["#607848","#789048","#c0d860","#f0f0d8","#604848"],["#b6d8c0","#c8d9bf","#dadabd","#ecdbbc","#fedcba"],["#a8e6ce","#dcedc2","#ffd3b5","#ffaaa6","#ff8c94"],["#3e4147","#fffedf","#dfba69","#5a2e2e","#2a2c31"],["#fc354c","#29221f","#13747d","#0abfbc","#fcf7c5"],["#cc0c39","#e6781e","#c8cf02","#f8fcc1","#1693a7"],["#1c2130","#028f76","#b3e099","#ffeaad","#d14334"],["#a7c5bd","#e5ddcb","#eb7b59","#cf4647","#524656"],["#dad6ca","#1bb0ce","#4f8699","#6a5e72","#563444"],["#5c323e","#a82743","#e15e32","#c0d23e","#e5f04c"],["#edebe6","#d6e1c7","#94c7b6","#403b33","#d3643b"],["#fdf1cc","#c6d6b8","#987f69","#e3ad40","#fcd036"],["#230f2b","#f21d41","#ebebbc","#bce3c5","#82b3ae"],["#b9d3b0","#81bda4","#b28774","#f88f79","#f6aa93"],["#3a111c","#574951","#83988e","#bcdea5","#e6f9bc"],["#5e3929","#cd8c52","#b7d1a3","#dee8be","#fcf7d3"],["#1c0113","#6b0103","#a30006","#c21a01","#f03c02"],["#000000","#9f111b","#b11623","#292c37","#cccccc"],["#382f32","#ffeaf2","#fcd9e5","#fbc5d8","#f1396d"],["#e3dfba","#c8d6bf","#93ccc6","#6cbdb5","#1a1f1e"],["#f6f6f6","#e8e8e8","#333333","#990100","#b90504"],["#1b325f","#9cc4e4","#e9f2f9","#3a89c9","#f26c4f"],["#a1dbb2","#fee5ad","#faca66","#f7a541","#f45d4c"],["#c1b398","#605951","#fbeec2","#61a6ab","#accec0"],["#5e9fa3","#dcd1b4","#fab87f","#f87e7b","#b05574"],["#951f2b","#f5f4d7","#e0dfb1","#a5a36c","#535233"],["#8dccad","#988864","#fea6a2","#f9d6ac","#ffe9af"],["#2d2d29","#215a6d","#3ca2a2","#92c7a3","#dfece6"],["#413d3d","#040004","#c8ff00","#fa023c","#4b000f"],["#eff3cd","#b2d5ba","#61ada0","#248f8d","#605063"],["#ffefd3","#fffee4","#d0ecea","#9fd6d2","#8b7a5e"],["#cfffdd","#b4dec1","#5c5863","#a85163","#ff1f4c"],["#9dc9ac","#fffec7","#f56218","#ff9d2e","#919167"],["#4e395d","#827085","#8ebe94","#ccfc8e","#dc5b3e"],["#a8a7a7","#cc527a","#e8175d","#474747","#363636"],["#f8edd1","#d88a8a","#474843","#9d9d93","#c5cfc6"],["#046d8b","#309292","#2fb8ac","#93a42a","#ecbe13"],["#f38a8a","#55443d","#a0cab5","#cde9ca","#f1edd0"],["#a70267","#f10c49","#fb6b41","#f6d86b","#339194"],["#ff003c","#ff8a00","#fabe28","#88c100","#00c176"],["#ffedbf","#f7803c","#f54828","#2e0d23","#f8e4c1"],["#4e4d4a","#353432","#94ba65","#2790b0","#2b4e72"],["#0ca5b0","#4e3f30","#fefeeb","#f8f4e4","#a5b3aa"],["#4d3b3b","#de6262","#ffb88c","#ffd0b3","#f5e0d3"],["#fffbb7","#a6f6af","#66b6ab","#5b7c8d","#4f2958"],["#edf6ee","#d1c089","#b3204d","#412e28","#151101"],["#9d7e79","#ccac95","#9a947c","#748b83","#5b756c"],["#fcfef5","#e9ffe1","#cdcfb7","#d6e6c3","#fafbe3"],["#9cddc8","#bfd8ad","#ddd9ab","#f7af63","#633d2e"],["#30261c","#403831","#36544f","#1f5f61","#0b8185"],["#aaff00","#ffaa00","#ff00aa","#aa00ff","#00aaff"],["#d1313d","#e5625c","#f9bf76","#8eb2c5","#615375"],["#ffe181","#eee9e5","#fad3b2","#ffba7f","#ff9c97"],["#73c8a9","#dee1b6","#e1b866","#bd5532","#373b44"],["#805841","#dcf7f3","#fffcdd","#ffd8d8","#f5a2a2"]],getDebugLayoutObject2=lo3=>{let{x:x4,y:y4,width,height}={...lo3,...lo3.size,...lo3.center,...lo3.position};if(lo3.x1!==void 0&&lo3.x2!==void 0&&lo3.y1!==void 0&&lo3.y2!==void 0&&(x4=(lo3.x1+lo3.x2)/2,y4=(lo3.y1+lo3.y2)/2,width=Math.abs(lo3.x1-lo3.x2),height=Math.abs(lo3.y1-lo3.y2)),lo3.points&&Array.isArray(lo3.points)&&lo3.points.length>0){let xCoords=lo3.points.map(point23=>point23.x),yCoords=lo3.points.map(point23=>point23.y),minX=Math.min(...xCoords),maxX=Math.max(...xCoords),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);x4=(minX+maxX)/2,y4=(minY+maxY)/2,width=maxX-minX,height=maxY-minY}let title=lo3.text||lo3.name||lo3.source?.text||lo3.source?.name||"?",content=lo3;return x4===void 0||y4===void 0?null:(width===void 0&&"outer_diameter"in lo3&&(width=lo3.outer_diameter,height=lo3.outer_diameter),(width===void 0||height===void 0)&&(width=.1,height=.1),{x:x4,y:y4,width,height,title,content,bg_color:nice_color_palettes2[stringHash3(lo3.type||title)%nice_color_palettes2.length]?.[4]??"#f00"})},isTruthy2=value=>!!value,findBoundsAndCenter2=elements=>{let debugObjects=elements.filter(elm=>elm.type.startsWith("pcb_")||elm.type.startsWith("schematic_")).concat(elements.filter(elm=>elm.type==="pcb_trace"||elm.type==="schematic_trace").flatMap(elm=>elm.route)).map(elm=>getDebugLayoutObject2(elm)).filter(isTruthy2);if(debugObjects.length===0)return{center:{x:0,y:0},width:0,height:0};let minX=debugObjects[0].x-debugObjects[0].width/2,maxX=debugObjects[0].x+debugObjects[0].width/2,minY=debugObjects[0].y-debugObjects[0].height/2,maxY=debugObjects[0].y+debugObjects[0].height/2;for(let obj of debugObjects.slice(1))minX=Math.min(minX,obj.x-obj.width/2),maxX=Math.max(maxX,obj.x+obj.width/2),minY=Math.min(minY,obj.y-obj.height/2),maxY=Math.max(maxY,obj.y+obj.height/2);let width=maxX-minX,height=maxY-minY;return{center:{x:minX+width/2,y:minY+height/2},width,height}},unitToMm3={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mmNumberFormatter2=new Intl.NumberFormat("en-US",{useGrouping:!1,notation:"standard",maximumFractionDigits:12}),mm5=n4=>{let unit=typeof n4=="number"?"mm":n4.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n4=="number"?n4:Number.parseFloat(n4.split(unit)[0]);if(unit in unitToMm3)return val*unitToMm3[unit];throw new Error(`Unsupported unit: ${unit}`)},mil2mm2=mil=>typeof mil=="number"?mm5(`${mil}mil`):mil.match(/^\d+$/)?mm5(`${mil}mil`):mm5(mil);function generateArcFromSweep(startX,startY,endX,endY,radius,largeArcFlag,sweepFlag){let start={x:startX,y:startY},end={x:endX,y:endY},midX=(startX+endX)/2,midY=(startY+endY)/2,dx3=endX-startX,dy3=endY-startY,distance33=Math.sqrt(dx3*dx3+dy3*dy3);if(distance33===0||radius<distance33/2)return[start,end];let h6=Math.sqrt(radius*radius-distance33*distance33/4),angle=Math.atan2(dy3,dx3),centerX=midX+h6*Math.sin(angle)*(sweepFlag?-1:1),centerY=midY-h6*Math.cos(angle)*(sweepFlag?-1:1),startAngle=Math.atan2(startY-centerY,startX-centerX),endAngle=Math.atan2(endY-centerY,endX-centerX);sweepFlag&&endAngle>startAngle?endAngle-=2*Math.PI:!sweepFlag&&endAngle<startAngle&&(endAngle+=2*Math.PI),(!largeArcFlag&&Math.abs(endAngle-startAngle)>Math.PI||largeArcFlag&&Math.abs(endAngle-startAngle)<Math.PI)&&(endAngle>startAngle?endAngle-=2*Math.PI:endAngle+=2*Math.PI);let numPoints=Math.max(2,Math.ceil(Math.abs(endAngle-startAngle)*radius)),path=[];for(let i3=0;i3<=numPoints;i3++){let t52=i3/numPoints,angle2=startAngle+t52*(endAngle-startAngle),x4=centerX+radius*Math.cos(angle2),y4=centerY+radius*Math.sin(angle2);path.push({x:x4,y:y4})}return path}var mil10ToMm=value=>value*10*.0254,getBoundsCenter2=bounds=>({x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}),getBoundsFromPoints2=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 i3=1;i3<points.length;i3++){let point23=points[i3];point23.x<minX&&(minX=point23.x),point23.y<minY&&(minY=point23.y),point23.x>maxX&&(maxX=point23.x),point23.y>maxY&&(maxY=point23.y)}return{minX,minY,maxX,maxY}},getCadSvgNode=easyEdaJson=>{let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(shape=>shape.type==="SVGNODE"&&shape.svgData.attrs?.uuid);return svgNode?.type==="SVGNODE"?svgNode:null},isSvgChildNodeWithAttrs=childNode=>typeof childNode=="object"&&childNode!==null,getXyBoundsFromModelBounds=bounds=>({minX:bounds.min.x,minY:bounds.min.y,maxX:bounds.max.x,maxY:bounds.max.y}),rotateScenePoint=(point23,rotationDeg)=>{switch(rotationDeg){case 0:return point23;case 90:return{x:point23.y,y:-point23.x};case 180:return{x:-point23.x,y:-point23.y};case 270:return{x:-point23.y,y:point23.x}}},getEasyEdaModelOriginOnBoardMm=({svgNode,footprintCenterMm})=>{let points=[];for(let childNode of svgNode.svgData.childNodes??[]){if(!isSvgChildNodeWithAttrs(childNode))continue;let rawPoints=childNode.attrs?.points;if(!rawPoints)continue;let values=String(rawPoints).trim().split(/\s+/).map(Number);for(let i3=0;i3+1<values.length;i3+=2){let x4=values[i3],y4=values[i3+1];Number.isFinite(x4)&&Number.isFinite(y4)&&points.push({x:mil10ToMm(x4),y:mil10ToMm(y4)})}}let modelOriginMm=null;if(points.length>0){let bounds=getBoundsFromPoints2(points);modelOriginMm=bounds?getBoundsCenter2(bounds):null}else{let[originX,originY]=String(svgNode.svgData.attrs?.c_origin??"0,0").split(",").map(value=>Number(value.trim()));Number.isFinite(originX)&&Number.isFinite(originY)&&(modelOriginMm={x:mil10ToMm(originX),y:mil10ToMm(originY)})}return modelOriginMm?{x:modelOriginMm.x-footprintCenterMm.x,y:footprintCenterMm.y-modelOriginMm.y}:null},snapZero=value=>Math.abs(value)<1e-6?0:value,normalizePoint=point23=>({x:snapZero(point23.x),y:snapZero(point23.y)}),getCadModelOffsetMmFromBounds=(easyEdaJson,bounds,{footprintBoundsCenterMm}={})=>{let svgNode=getCadSvgNode(easyEdaJson);if(!svgNode||!bounds)return null;let[,,rotationZRaw]=String(svgNode.svgData.attrs?.c_rotation??"0,0,0").split(",").map(value=>Number(value.trim())),rotationDeg=(rotationZRaw%360+360)%360;if(![0,90,180,270].includes(rotationDeg))return null;let modelCenter=getBoundsCenter2(getXyBoundsFromModelBounds(bounds)),footprintCenter=easyEdaJson.packageDetail.dataStr.head,footprintCenterMm=footprintBoundsCenterMm??{x:mil10ToMm(footprintCenter.x),y:mil10ToMm(footprintCenter.y)},targetOriginOnBoardMm=getEasyEdaModelOriginOnBoardMm({svgNode,footprintCenterMm});if(!targetOriginOnBoardMm)return null;let targetOriginInModelFrame=rotateScenePoint(targetOriginOnBoardMm,rotationDeg);return normalizePoint({x:modelCenter.x-targetOriginInModelFrame.x,y:modelCenter.y-targetOriginInModelFrame.y})},normalizePinLabels2=inputPinLabels=>{let uniqueInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=uniqueInputPinLabels.map(()=>[]),desiredNumbers=uniqueInputPinLabels.map(()=>null);for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])if(/^\d+$/.test(label)){desiredNumbers[i3]=Number.parseInt(label);break}let highestPinNumber=0,acceptedDesiredNumbers=new Set;for(let i3=0;i3<desiredNumbers.length;i3++){let desiredNumber=desiredNumbers[i3];if(desiredNumber===null||desiredNumber<1)continue;if(!acceptedDesiredNumbers.has(desiredNumber)){acceptedDesiredNumbers.add(desiredNumber),result[i3].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltCount=0;for(let label of result[i3])label.startsWith(`pin${desiredNumber}_alt`)&&(existingAltCount+=1);result[i3].push(`pin${desiredNumber}_alt${existingAltCount+1}`)}for(let i3=0;i3<result.length;i3++)result[i3][0]?.includes("_alt")&&(highestPinNumber+=1,result[i3].unshift(`pin${highestPinNumber}`));for(let i3=0;i3<result.length;i3++)result[i3].length===0&&(highestPinNumber+=1,result[i3].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of uniqueInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i3].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i3].push(`${label}${incrementalLabelCounts[label]}`)));return result},normalizeSymbolName=name=>{let trimmedName=name.trim();return trimmedName==="+"?"_POS":trimmedName==="-"?"_NEG":trimmedName},DEFAULT_PCB_THICKNESS_MM=1.6,EASYEDA_STEP_MODEL_URL="https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y",EASYEDA_OBJ_MODEL_URL="https://modules.easyeda.com/3dmodel",TSCIRCUIT_MODEL_CDN_URL="https://modelcdn.tscircuit.com/easyeda_models",milx10=mil10=>typeof mil10=="number"||mil10.match(/^\d+$/)?mil2mm2(mil10)*10:mil2mm2(mil10),parseCadOffsetsFromSvgNode=svgNode=>{let attrs=svgNode?.svgData?.attrs??{},[cx3,cy3]=String(attrs.c_origin??"0,0").split(",").map(s3=>Number(s3.trim())),zStr=attrs.z??0,z_mm=typeof zStr=="string"&&/[a-z]/i.test(zStr)?mm5(zStr):mm5(`${Number(zStr)||0}mil`);return{position:{x:mil10ToMm(Number.isNaN(cx3)?0:cx3),y:mil10ToMm(Number.isNaN(cy3)?0:cy3),z:z_mm},rotation:(()=>{let[rx3,ry3,rz]=(attrs.c_rotation??"0,0,0").split(",").map(Number);return{x:rx3||0,y:ry3||0,z:rz||0}})()}},readModelHeightMm=raw=>{if(raw==null)return 3.5;let n4=Number(raw);if(!Number.isFinite(n4))return 3.5;let mmFromMil10=mil10ToMm(n4),mmFromMil=mm5(`${n4}mil`),upper=12,lower=.1,chosen=Math.max(mmFromMil10,mmFromMil);return(chosen>upper||chosen<lower)&&(chosen=3.5),chosen},handleSilkscreenPath=(track,index)=>pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:track.points.map(point23=>({x:milx10(point23.x),y:milx10(point23.y)})),stroke_width:mil10ToMm(track.width)}),isCourtyardLayer=layer=>layer===13||layer===14||layer===15,handleSilkscreenArc=(arc2,index)=>{let arcPath=generateArcFromSweep(arc2.start.x,arc2.start.y,arc2.end.x,arc2.end.y,arc2.radiusX,arc2.largeArc,arc2.sweepDirection==="CW");return pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_arc_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:arcPath.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)})),stroke_width:mil10ToMm(arc2.width)})},handleHole=(hole,index)=>pcb_hole2.parse({type:"pcb_hole",x:milx10(hole.center.x),y:milx10(hole.center.y),hole_diameter:milx10(hole.radius)*2,hole_shape:"circle",pcb_hole_id:`pcb_hole_${index+1}`}),handleHoleCutout=(hole,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_from_hole_${index+1}`,shape:"circle",center:{x:milx10(hole.center.x),y:milx10(hole.center.y)},radius:milx10(hole.radius)}),handleVia=(via,index)=>pcb_via2.parse({type:"pcb_via",pcb_via_id:`pcb_via_${index+1}`,x:milx10(via.center.x),y:milx10(via.center.y),outer_diameter:milx10(via.outerDiameter),hole_diameter:milx10(via.holeDiameter),layers:["top","bottom"]}),handleCutout=(solidRegion,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${index+1}`,shape:"polygon",points:solidRegion.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}),LEAD_SHAPE_LAYER=100,isPcbSolidRegionCutout=shape=>shape.fillStyle==="cutout"&&shape.layermask!==LEAD_SHAPE_LAYER,getCadPositionZMmFromMetadata=easyEdaJson=>{let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(shape=>shape.type==="SVGNODE"&&shape.svgData.attrs?.uuid);if(!svgNode||svgNode.type!=="SVGNODE")return;let svgNodeZ=Number(svgNode.svgData.attrs?.z??0);if(!Number.isFinite(svgNodeZ))return;let bounds=easyEdaJson._objMetadata?.bounds;return bounds?(Math.abs(bounds.min.z)<1e-6?0:bounds.min.z)-mil10ToMm(svgNodeZ):void 0},convertEasyEdaJsonToCircuitJson=(easyEdaJson,{useModelCdn,shouldRecenter=!0,cadPositionXMm,cadPositionYMm,cadPositionZMm,cadModelBounds,showDesignator=!1}={})=>{let resolvedCadPositionZMm=cadPositionZMm??getCadPositionZMmFromMetadata(easyEdaJson),circuitElements=[],source_component=any_source_component2.parse({type:"source_component",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip"}),pcb_component22=pcb_component2.parse({type:"pcb_component",pcb_component_id:"pcb_component_1",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip",width:0,height:0,rotation:0,center:{x:0,y:0},layer:"top"});circuitElements.push(source_component,pcb_component22);let pads=easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="PAD"),pins=easyEdaJson.dataStr.shape.filter(shape=>shape.type==="PIN"),pinLabelSets=pads.map(pad2=>{let labels=[];pad2.number&&labels.push(pad2.number.toString());let pin=pins.find(p4=>p4.pinNumber===pad2.number);return pin&&labels.push(normalizeSymbolName(pin.label)),labels}),normalizedPinLabels=normalizePinLabels2(pinLabelSets);pads.forEach((pad2,index)=>{let portHints2=normalizedPinLabels[index],pinNumber=Number.parseInt(portHints2.find(hint=>hint.match(/pin\d+/)).replace("pin",""));if(circuitElements.push({type:"source_port",source_port_id:`source_port_${index+1}`,source_component_id:"source_component_1",name:`pin${pinNumber}`,pin_number:pinNumber,port_hints:portHints2.filter(hint=>hint!==`pin${pinNumber}`)}),pad2.holeRadius!==void 0&&mil2mm2(pad2.holeRadius)!==0){let commonPlatedHoleProps={type:"pcb_plated_hole",pcb_plated_hole_id:pad2.shape==="RECT"&&pad2.rotation!==void 0?`pcb_plated_hole_${index+1}_rot${pad2.rotation}`:`pcb_plated_hole_${index+1}`,x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y),layers:["top"],port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`},additionalPlatedHoleProps;if(pad2.shape==="OVAL"){let largestOuterDimensionName=mil2mm2(pad2.width)>mil2mm2(pad2.height)?"width":"height",smallestOuterDimension=Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height)),largestOuterDimension=Math.max(mil2mm2(pad2.width),mil2mm2(pad2.height)),distanceFromOuterPlatingToHole=smallestOuterDimension/2-mil2mm2(pad2.holeRadius),largestInnerDimension=largestOuterDimension-distanceFromOuterPlatingToHole*2,smallestInnerDimension=mil2mm2(pad2.holeRadius)*2;additionalPlatedHoleProps={shape:"pill",hole_width:largestOuterDimensionName==="width"?largestInnerDimension:smallestInnerDimension,hole_height:largestOuterDimensionName==="height"?largestInnerDimension:smallestInnerDimension,outer_width:mil2mm2(pad2.width),outer_height:mil2mm2(pad2.height),ccw_rotation:pad2.rotation||0}}else if(pad2.shape==="RECT"){let padWidth=mil2mm2(pad2.width),padHeight=mil2mm2(pad2.height),holeDiameter=mil2mm2(pad2.holeRadius)*2;if(Math.max(padWidth,padHeight)/Math.min(padWidth,padHeight)>1.5){let baseWidth=holeDiameter,pillHeight=baseWidth*2.6,holeWidth=padWidth>padHeight?pillHeight:baseWidth,holeHeight=padHeight>padWidth?pillHeight:baseWidth;additionalPlatedHoleProps={shape:"rotated_pill_hole_with_rect_pad",hole_shape:"rotated_pill",pad_shape:"rect",hole_width:holeWidth,hole_height:holeHeight,hole_ccw_rotation:pad2.rotation||0,rect_ccw_rotation:pad2.rotation||0,rect_pad_width:padWidth,rect_pad_height:padHeight}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:holeDiameter,outer_diameter:Math.max(padWidth,padHeight),radius:holeDiameter/2}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:mil2mm2(pad2.holeRadius)*2,outer_diameter:mil2mm2(pad2.width),radius:mil2mm2(pad2.holeRadius)};circuitElements.push(pcb_plated_hole2.parse({...commonPlatedHoleProps,...additionalPlatedHoleProps}))}else{let soupShape;if(pad2.shape==="RECT"||pad2.shape==="ELLIPSE"?soupShape="rect":pad2.shape==="OVAL"?soupShape="pill":pad2.shape==="POLYGON"&&(soupShape="polygon"),!soupShape)throw new Error(`unknown pad.shape: "${pad2.shape}"`);let rectSize={width:mil2mm2(pad2.width),height:mil2mm2(pad2.height)};(pad2.rotation===90||pad2.rotation===270)&&(rectSize.width=mil2mm2(pad2.height),rectSize.height=mil2mm2(pad2.width));let parsedPcbSmtpad=pcb_smtpad2.parse({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${index+1}`,shape:soupShape,...soupShape!=="polygon"&&{x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y)},...soupShape==="rect"?rectSize:soupShape==="pill"?{...rectSize,radius:Math.min(rectSize.width,rectSize.height)/2}:soupShape==="polygon"&&pad2.points?{points:pad2.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}:{radius:Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height))/2},layer:"top",port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`});circuitElements.push(parsedPcbSmtpad)}}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="HOLE").forEach((h6,index)=>{circuitElements.push(handleHole(h6,index)),circuitElements.push(handleHoleCutout(h6,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="VIA").forEach((v4,index)=>{circuitElements.push(handleVia(v4,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="SOLIDREGION"&&isPcbSolidRegionCutout(shape)).forEach((sr3,index)=>{circuitElements.push(handleCutout(sr3,index))});let hasFoundDesignator=!1;if(easyEdaJson.packageDetail.dataStr.shape.forEach((shape,index)=>{if(shape.type==="TRACK")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenPath(shape,index));else if(shape.type==="ARC")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenArc(shape,index));else if(shape.type==="TEXT"){if(isCourtyardLayer(shape.layer))return;let text=shape.text,designatorPrefix=easyEdaJson.dataStr.head.c_para.pre||"U",normalizedPrefix=designatorPrefix.replace(/\?/g,""),trimmedText=text.trim();if(trimmedText===designatorPrefix||trimmedText===`${normalizedPrefix}?`||trimmedText===normalizedPrefix){if(!showDesignator)return;text="{NAME}",hasFoundDesignator=!0}circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pcb_silkscreen_text_${index+1}`,pcb_component_id:"pcb_component_1",text,anchor_position:{x:mil2mm2(shape.x),y:mil2mm2(shape.y)},anchor_alignment:{L:"bottom_left",C:"center",R:"bottom_right"}[shape.textAnchor??"L"],font_size:shape.size_mm||1,layer:"top"}))}}),!hasFoundDesignator&&showDesignator){let bbox=easyEdaJson.packageDetail.dataStr.BBox;circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"pcb_silkscreen_text_designator_fallback",pcb_component_id:"pcb_component_1",text:"{NAME}",anchor_position:{x:milx10(bbox.x+bbox.width/2),y:milx10(bbox.y)-1},anchor_alignment:"center",font_size:1,layer:"top"}))}let pcbElements=circuitElements.filter(e5=>e5.type==="pcb_smtpad"||e5.type==="pcb_plated_hole"||e5.type==="pcb_hole"||e5.type==="pcb_via"||e5.type==="pcb_courtyard_outline"||e5.type==="pcb_silkscreen_path"||e5.type==="pcb_silkscreen_text");if(pcbElements.length>0){let bounds=findBoundsAndCenter2(pcbElements);pcb_component22.width=bounds.width,pcb_component22.height=bounds.height}let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(a3=>!!(a3.type==="SVGNODE"&&a3.svgData.attrs?.uuid)),modelUuid=svgNode?.svgData?.attrs?.uuid,objFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.obj?uuid=${modelUuid}`:`${EASYEDA_OBJ_MODEL_URL}/${modelUuid}`:void 0,stepFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.step?uuid=${modelUuid}`:`${EASYEDA_STEP_MODEL_URL}/${modelUuid}`:void 0;if(objFileUrl!==void 0||stepFileUrl!==void 0){let{position:position22,rotation:rotation22}=parseCadOffsetsFromSvgNode(svgNode);circuitElements.push(cad_component2.parse({type:"cad_component",cad_component_id:"cad_component_1",source_component_id:"source_component_1",pcb_component_id:"pcb_component_1",anchor_alignment:"center_of_component_on_board_surface",model_origin_alignment:"center_of_component_on_board_surface",model_origin_position:{x:cadPositionXMm??0,y:cadPositionYMm??0,z:resolvedCadPositionZMm??position22.z},position:{x:0,y:0,z:0},rotation:rotation22,model_obj_url:objFileUrl,model_step_url:stepFileUrl}))}if(!circuitElements.some(e5=>e5.type==="pcb_courtyard_outline")){let bbox=easyEdaJson.packageDetail.dataStr.BBox;if(bbox){let x12=milx10(bbox.x)-.25,y12=milx10(bbox.y)-.25,x22=milx10(bbox.x+bbox.width)+.25,y22=milx10(bbox.y+bbox.height)+.25;circuitElements.push(pcb_courtyard_outline2.parse({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${easyEdaJson.lcsc.number}_1`,pcb_component_id:"pcb_component_1",layer:"top",outline:[{x:x12,y:y12},{x:x22,y:y12},{x:x22,y:y22},{x:x12,y:y22},{x:x12,y:y12}],stroke_width:.05}))}}if(shouldRecenter){let elementsForBounds=circuitElements.filter(e5=>e5.type!=="pcb_component"&&e5.type!=="cad_component"),bounds=findBoundsAndCenter2(elementsForBounds);if(Number.isFinite(bounds.center.x)&&Number.isFinite(bounds.center.y)){let matrix2=compose4(translate4(-bounds.center.x,bounds.center.y),scale4(1,-1)),elementsForTransform=circuitElements.filter(e5=>!(e5.type==="pcb_smtpad"&&e5.shape==="polygon")&&e5.type!=="cad_component");transformPCBElements2(elementsForTransform,matrix2);for(let e5 of circuitElements)if(e5.type==="pcb_cutout"){if(e5.shape==="polygon")e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4));else if(e5.shape==="circle"||e5.shape==="rect")e5.center=applyToPoint4(matrix2,e5.center);else if("route"in e5){let cutoutPath=e5;cutoutPath.route=cutoutPath.route.map(p4=>applyToPoint4(matrix2,p4))}}else e5.type==="pcb_smtpad"&&e5.shape==="polygon"&&(e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4)));let cad=circuitElements.find(e5=>e5.type==="cad_component");if(cad){cad.rotation||(cad.rotation={x:0,y:0,z:0}),cad.model_origin_position||(cad.model_origin_position={x:0,y:0,z:0});let resolvedCadModelBounds=cadModelBounds??easyEdaJson._objMetadata?.bounds,recenteredCadOffset=resolvedCadModelBounds&&getCadModelOffsetMmFromBounds(easyEdaJson,resolvedCadModelBounds,{footprintBoundsCenterMm:bounds.center});recenteredCadOffset&&(cad.model_origin_position.x=recenteredCadOffset.x,cad.model_origin_position.y=recenteredCadOffset.y);let side=pcb_component22.layer??"top",t52=DEFAULT_PCB_THICKNESS_MM/2,attrs=svgNode?.svgData?.attrs??{},modelHeight=readModelHeightMm(attrs.c_height);cad.size||(cad.size={x:pcb_component22.width,y:pcb_component22.height,z:modelHeight});let ROTATE_X_FOR_YUP=90,originalZRotation=(cad.rotation.z??0)%360;Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1||Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-90)<1?cad.rotation.x=((cad.rotation.x??0)+0+360)%360:Math.abs(originalZRotation-270)<1?(cad.rotation.x=((cad.rotation.x??0)+0+360)%360,cad.rotation.y=((cad.rotation.y??0)+0+360)%360):(console.warn(`[3D] Unusual rotation angle: ${originalZRotation}\xB0 for component ${easyEdaJson.lcsc.number}`),cad.rotation.x=((cad.rotation.x??0)+ROTATE_X_FOR_YUP+360)%360),side!=="top"&&(cad.rotation.x=((cad.rotation.x??0)+180)%360);let USE_Z_OFFSET_FOR_180=Math.abs(originalZRotation-180)<1,zOffRaw=cad.model_origin_position.z??cad.position.z??0,zOff=USE_Z_OFFSET_FOR_180?-zOffRaw:0,rx3=(cad.rotation.x%360+360)%360,thicknessAlongWorldZ,is180RotatedYUp=(Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1)&&Math.abs(rx3)<1;if(is180RotatedYUp||rx3%180===90?thicknessAlongWorldZ=cad.size.y:thicknessAlongWorldZ=cad.size.z,Number.isFinite(resolvedCadPositionZMm))cad.model_origin_position.z=side==="top"?resolvedCadPositionZMm:-resolvedCadPositionZMm;else{let centerZ;is180RotatedYUp?centerZ=side==="top"?t52-thicknessAlongWorldZ/2:-t52+thicknessAlongWorldZ/2:centerZ=side==="top"?t52+zOff+thicknessAlongWorldZ/2:-t52-zOff-thicknessAlongWorldZ/2,cad.model_origin_position.z=centerZ}}}pcb_component22.center={x:0,y:0}}return circuitElements},safeNumber=(defaultValue=0)=>external_exports2.union([external_exports2.number(),external_exports2.string()]).transform(val=>{let num=Number(val);return isNaN(num)?defaultValue:num}).default(defaultValue),tenthmil=external_exports2.union([external_exports2.number(),external_exports2.string()]).optional().transform(n4=>typeof n4=="string"&&n4.endsWith("mil")?n4:`${Number.parseFloat(n4)*10}mil`).pipe(external_exports2.string()),PointSchema=external_exports2.any().transform(p4=>{if(Array.isArray(p4)){let[x4,y4]=p4;return{x:x4,y:y4}}if(typeof p4=="object")return p4;throw new Error(`Invalid point: ${p4}`)}).pipe(external_exports2.object({x:external_exports2.number(),y:external_exports2.number()})),BaseShapeSchema=external_exports2.object({type:external_exports2.string(),id:external_exports2.string().optional(),layer:external_exports2.coerce.number().optional()}),TrackSchema=BaseShapeSchema.extend({type:external_exports2.literal("TRACK"),width:external_exports2.coerce.number(),points:external_exports2.array(PointSchema)}),PadSchema=BaseShapeSchema.extend({type:external_exports2.literal("PAD"),shape:external_exports2.enum(["RECT","ELLIPSE","OVAL","POLYGON"]),center:external_exports2.object({x:tenthmil,y:tenthmil}),width:tenthmil,height:tenthmil,layermask:external_exports2.number(),net:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),number:external_exports2.union([external_exports2.string(),external_exports2.number()]),holeRadius:tenthmil,points:external_exports2.array(PointSchema).optional(),rotation:safeNumber(0),plated:external_exports2.boolean()}),ArcSchema=BaseShapeSchema.extend({type:external_exports2.literal("ARC"),width:external_exports2.number(),start:PointSchema,end:PointSchema,radiusX:external_exports2.number(),radiusY:external_exports2.number(),largeArc:external_exports2.boolean(),sweepDirection:external_exports2.enum(["CW","CCW"])}),CircleSchema=BaseShapeSchema.extend({type:external_exports2.literal("CIRCLE"),center:PointSchema,radius:external_exports2.number(),width:external_exports2.number()}),SolidRegionSchema=BaseShapeSchema.extend({type:external_exports2.literal("SOLIDREGION"),layermask:external_exports2.number(),points:external_exports2.array(PointSchema),fillStyle:external_exports2.string()}),SVGNodeSchema=BaseShapeSchema.extend({type:external_exports2.literal("SVGNODE"),svgData:external_exports2.object({gId:external_exports2.string(),nodeName:external_exports2.string(),nodeType:external_exports2.number(),layerid:external_exports2.string(),attrs:external_exports2.record(external_exports2.string(),external_exports2.string()),childNodes:external_exports2.array(external_exports2.unknown())})}),HoleSchema=BaseShapeSchema.extend({type:external_exports2.literal("HOLE"),center:PointSchema,radius:external_exports2.number()}),ViaSchema=BaseShapeSchema.extend({type:external_exports2.literal("VIA"),center:PointSchema,outerDiameter:external_exports2.number(),holeDiameter:external_exports2.number()}),RectSchema=BaseShapeSchema.extend({type:external_exports2.literal("RECT"),x:tenthmil,y:tenthmil,width:tenthmil,height:tenthmil,lineWidth:external_exports2.number(),fillStyle:external_exports2.string(),rotation:external_exports2.number().optional()}),TextSchema=BaseShapeSchema.extend({type:external_exports2.literal("TEXT"),text:external_exports2.string(),x:tenthmil,y:tenthmil,size_mm:external_exports2.number(),rotation:external_exports2.number().optional(),layer:external_exports2.number().optional(),textAnchor:external_exports2.enum(["L","C","R",""]).optional().transform(val=>val===""?void 0:val),font:external_exports2.string().optional()}),PackageDetailShapeSchema=external_exports2.discriminatedUnion("type",[TrackSchema,PadSchema,ArcSchema,CircleSchema,SolidRegionSchema,SVGNodeSchema,HoleSchema,ViaSchema,RectSchema,TextSchema]),pairs3=arr=>{let pairs22=[];for(let i3=0;i3<arr.length;i3+=2)pairs22.push([arr[i3],arr[i3+1]]);return pairs22},parsePoints=pointsStr=>pairs3(pointsStr.trim().split(" ").map(n4=>Number(n4))),ShapeItemSchema=external_exports2.object({type:external_exports2.string(),data:external_exports2.string()}).transform(shape=>{switch(shape.type){case"TRACK":{let[width,layer,_4,pointsStr,id2,_n3]=shape.data.split("~"),points=parsePoints(pointsStr);return TrackSchema.parse({type:"TRACK",width,layer,points,id:id2})}case"PAD":{let[padShape,...params]=shape.data.split("~"),[centerX,centerY,width,height,layermask,net,number,holeRadius,...rest]=params.map(p4=>Number.isNaN(Number(p4))?p4:Number(p4)),center2={x:centerX,y:centerY},points;(padShape==="RECT"||padShape==="POLYGON")&&(points=parsePoints(rest[0]));let r5=Number(rest[1]),rotation22=Number.isNaN(r5)?void 0:r5,padInputParams={type:"PAD",shape:padShape,center:center2,width,height,layermask,net,number,holeRadius,points,rotation:rotation22,plated:rest.includes("Y")};return PadSchema.parse(padInputParams)}case"ARC":{let[width,layer,,arcData]=shape.data.split("~"),match2=arcData.match(/M\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*A\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)/);if(!match2)throw new Error(`Invalid arc data: ${arcData}`);let[,startX,startY,radiusX,radiusY,xAxisRotation,largeArcFlag,sweepFlag,endX,endY]=match2,start=[Number(startX),Number(startY)],end=[Number(endX),Number(endY)];return ArcSchema.parse({type:"ARC",width:Number(width),layer:Number(layer),start,end,radiusX:Number(radiusX),radiusY:Number(radiusY),largeArc:largeArcFlag==="1",sweepDirection:sweepFlag==="1"?"CW":"CCW"})}case"CIRCLE":{let[centerX,centerY,radius,width,layer,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return CircleSchema.parse({type:"CIRCLE",center:center2,radius:Number(radius),width:Number(width),layer:Number(layer),id:id2})}case"HOLE":{let[centerX,centerY,radius,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return HoleSchema.parse({type:"HOLE",center:center2,radius:Number(radius),id:id2})}case"VIA":{let[x4,y4,outerDiameter,,holeDiameter,id2]=shape.data.split("~"),center2=[Number(x4),Number(y4)];return ViaSchema.parse({type:"VIA",center:center2,outerDiameter:Number(outerDiameter),holeDiameter:Number(holeDiameter),id:id2})}case"SOLIDREGION":{let[layermask,,pathData,fillStyle,id2]=shape.data.split("~"),points=pathData.match(/[ML] ?(-?[\d.]+)[ ,](-?[\d.]+)/g)?.map(point23=>{let[,x4,y4]=point23.match(/[ML]? ?(-?[\d.]+)[ ,](-?[\d.]+)/)||[];return[Number(x4),Number(y4)]})||[];return SolidRegionSchema.parse({type:"SOLIDREGION",layermask:Number(layermask),points,fillStyle,id:id2})}case"SVGNODE":{let svgData=JSON.parse(shape.data);return SVGNodeSchema.parse({type:"SVGNODE",svgData})}case"RECT":{let[x4,y4,width,height,lineWidth,id2,rotation22,layer,fillStyle]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return RectSchema.parse({type:"RECT",x:x4,y:y4,width,height,lineWidth:Number(lineWidth),id:id2,rotation:Number.isNaN(r5)?void 0:r5,layer:layer?Number(layer):void 0,fillStyle:fillStyle||void 0})}case"TEXT":{let[textAnchor,x4,y4,size22,layer,id2,rotation22,,font,text]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return TextSchema.parse({type:"TEXT",text,x:x4,y:y4,size_mm:Number(size22)*2.54,layer:layer?Number(layer):void 0,id:id2,rotation:Number.isNaN(r5)?void 0:r5,textAnchor,font:font||void 0})}default:throw new Error(`Unknown shape type: ${shape.type}`)}}).pipe(PackageDetailShapeSchema),ShapesArraySchema=external_exports2.array(ShapeItemSchema),PointSchema2=external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),RectangleShapeOutputSchema=external_exports2.object({type:external_exports2.literal("RECTANGLE"),position:PointSchema2,width:external_exports2.number(),height:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseRectangle=str=>{let[,x4,y4,,,width,height,color,lineWidth,,,id2]=str.split("~");return{type:"RECTANGLE",position:{x:Number(x4),y:Number(y4)},width:Number(width),height:Number(height),color,lineWidth:Number(lineWidth),id:id2}},RectangleShapeSchema=external_exports2.string().startsWith("R~").transform(parseRectangle).pipe(RectangleShapeOutputSchema),EllipseShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ELLIPSE"),center:PointSchema2,radiusX:external_exports2.number(),radiusY:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseEllipse=str=>{let[,x4,y4,radiusX,radiusY,color,lineWidth,,,id2]=str.split("~");return{type:"ELLIPSE",center:{x:Number(x4),y:Number(y4)},radiusX:Number(radiusX),radiusY:Number(radiusY),color,lineWidth:Number(lineWidth),id:id2}},EllipseShapeSchema=external_exports2.string().startsWith("E~").transform(parseEllipse).pipe(EllipseShapeOutputSchema),ArcShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ARC"),start:PointSchema2,end:PointSchema2,radius:external_exports2.number(),sweepFlag:external_exports2.boolean(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseArc=str=>{let[,pathData,color,lineWidth,,,id2]=str.split("~"),parts=pathData.split(" "),x12=Number(parts[1])||0,y12=Number(parts[2])||0,radius=Number(parts[4])||0,sweepFlag=parts[7]==="1",x22=Number(parts[8])||0,y22=Number(parts[9])||0,parsedLineWidth=Number(lineWidth),finalLineWidth=Number.isNaN(parsedLineWidth)?1:parsedLineWidth;return{type:"ARC",start:{x:x12,y:y12},end:{x:x22,y:y22},radius,sweepFlag,color:color||"#880000",lineWidth:finalLineWidth,id:id2||"gge1"}},ArcShapeSchema=external_exports2.string().startsWith("A~").transform(parseArc).pipe(ArcShapeOutputSchema),PinShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PIN"),visibility:external_exports2.enum(["show","hide","none"]),pinNumber:external_exports2.union([external_exports2.string(),external_exports2.number()]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),id:external_exports2.string(),label:external_exports2.string(),labelColor:external_exports2.string(),path:external_exports2.string(),arrow:external_exports2.string()}),parsePin=pinString=>{let parts=pinString.split("~"),[,visibility,,pinNumber,x4,y4,rotation22,id2]=parts,nameMatch=pinString.match(/~([\w+#-]+)~(start|end)~/),label=nameMatch?nameMatch[1]:"";label.endsWith("+")&&(label=label.slice(0,-1)+"_POS"),label.endsWith("-")&&(label=label.slice(0,-1)+"_NEG"),label.endsWith("#")&&(label=label.slice(0,-1)),/^\+\d+(?:\.\d+)?V$/i.test(label)&&(label=`V${label.slice(1,-1)}`);let colorMatch=pinString.match(/#[0-9A-F]{6}/),labelColor=colorMatch?colorMatch[0]:"",pathMatch=pinString.match(/\^\^([^~]+)/),path=pathMatch?pathMatch[1]:"",arrowMatch=pinString.match(/\^\^0~(.+)$/),arrow=arrowMatch?arrowMatch[1]:"",r5=Number.parseFloat(rotation22);return{type:"PIN",visibility,id:id2,pinNumber:Number.isNaN(Number(pinNumber))?pinNumber:Number(pinNumber),x:Number.parseFloat(x4),y:Number.parseFloat(y4),rotation:Number.isNaN(r5)?0:r5,label,labelColor,path,arrow}},PinShapeSchema=external_exports2.string().startsWith("P~").transform(parsePin).pipe(PinShapeOutputSchema),PolylineShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYLINE"),points:external_exports2.array(PointSchema2),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parsePoints2=pointsStr=>pointsStr.split(" ").reduce((acc,value,index)=>(index%2===0?acc.push({x:Number(value),y:0}):acc[acc.length-1].y=Number(value),acc),[]),parsePolyline=str=>{let[,...rest]=str.split("~"),[pointsStr,color,lineWidth,,,id2]=rest;return{type:"POLYLINE",points:parsePoints2(pointsStr),color,lineWidth:Number(lineWidth),id:id2}},PolylineShapeSchema=external_exports2.string().startsWith("PL~").transform(parsePolyline).pipe(PolylineShapeOutputSchema),PolygonShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYGON"),points:external_exports2.array(PointSchema2),fillColor:external_exports2.string(),lineWidth:external_exports2.number(),lineColor:external_exports2.string(),id:external_exports2.string()}),parsePolygon2=str=>{let[,...rest]=str.split("~"),[pointsStr,fillColor,lineWidth,lineColor,,id2]=rest;return{type:"POLYGON",points:parsePoints2(pointsStr),fillColor,lineWidth:Number(lineWidth),lineColor,id:id2}},PolygonShapeSchema=external_exports2.string().startsWith("PG~").transform(parsePolygon2).pipe(PolygonShapeOutputSchema),PathShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PATH"),pathData:external_exports2.string(),fillColor:external_exports2.string(),strokeWidth:external_exports2.number(),strokeColor:external_exports2.string(),id:external_exports2.string()}),parsePath=str=>{let[,pathData,fillColor,strokeWidth,strokeColor,,id2]=str.split("~");return{type:"PATH",pathData,fillColor,strokeWidth:mil10ToMm(Number(strokeWidth)),strokeColor,id:id2}},PathShapeSchema=external_exports2.string().startsWith("PT~").transform(parsePath).pipe(PathShapeOutputSchema),optionalEasyEdaTextField=fieldSchema=>external_exports2.preprocess(textField=>{if(!(textField==null||textField===""||textField==="undefined"))return textField},fieldSchema),TextShapeOutputSchema=external_exports2.object({type:external_exports2.literal("TEXT"),alignment:external_exports2.enum(["L","C","R"]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),fontColor:external_exports2.string(),backgroundColor:optionalEasyEdaTextField(external_exports2.string().optional()),fontSize:external_exports2.string(),fontWeight:optionalEasyEdaTextField(external_exports2.string().optional().default("normal")),fontStyle:optionalEasyEdaTextField(external_exports2.enum(["normal","italic"]).optional().default("normal")),fontDecoration:optionalEasyEdaTextField(external_exports2.string().optional().default("")),content:external_exports2.string(),textType:external_exports2.string(),visibility:external_exports2.enum(["0","1"]),mirror:external_exports2.string(),id:external_exports2.string()}),parseText=str=>{let[,alignment,x4,y4,rotation22,fontColor,backgroundColor,fontSize,fontWeight,fontStyle,fontDecoration,content,textType,visibility,mirror,id2]=str.split("~");return{type:"TEXT",alignment,x:Number(x4),y:Number(y4),rotation:Number(rotation22),fontColor,backgroundColor,fontSize,fontWeight,fontStyle,fontDecoration,content,textType,visibility,mirror,id:id2}},TextShapeSchema=external_exports2.string().startsWith("T~").transform(parseText).pipe(TextShapeOutputSchema),SingleLetterShapeSchema=external_exports2.string().transform(x4=>{if(x4.startsWith("R~"))return RectangleShapeSchema.parse(x4);if(x4.startsWith("E~"))return EllipseShapeSchema.parse(x4);if(x4.startsWith("P~"))return PinShapeSchema.parse(x4);if(x4.startsWith("PL~"))return PolylineShapeSchema.parse(x4);if(x4.startsWith("PG~"))return PolygonShapeSchema.parse(x4);if(x4.startsWith("PT~"))return PathShapeSchema.parse(x4);if(x4.startsWith("T~"))return TextShapeSchema.parse(x4);if(x4.startsWith("A~"))return ArcShapeSchema.parse(x4);throw new Error(`Invalid shape type: ${x4}`)}).pipe(external_exports2.union([RectangleShapeOutputSchema,EllipseShapeOutputSchema,PinShapeOutputSchema,PolylineShapeOutputSchema,PolygonShapeOutputSchema,PathShapeOutputSchema,TextShapeOutputSchema,ArcShapeOutputSchema])),maybeNumber=external_exports2.any().transform(k4=>k4==="nan"||Number.isNaN(k4)?null:k4).pipe(external_exports2.number().nullable().optional()),SzlcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional(),image:external_exports2.string().optional().optional()}),LcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional()}),OwnerSchema=external_exports2.object({uuid:external_exports2.string(),username:external_exports2.string(),nickname:external_exports2.string(),avatar:external_exports2.string()}),HeadSchema=external_exports2.object({docType:external_exports2.preprocess(val=>val==null?val:String(val),external_exports2.string()),editorVersion:external_exports2.string(),c_para:external_exports2.record(external_exports2.string(),external_exports2.string().nullable()),x:external_exports2.number(),y:external_exports2.number(),puuid:external_exports2.string().optional(),uuid:external_exports2.string(),utime:external_exports2.preprocess(val=>val===""?0:typeof val=="string"?Number(val):val,external_exports2.number()),importFlag:external_exports2.number().optional(),c_spiceCmd:external_exports2.any().optional(),hasIdFlag:external_exports2.boolean()}),BBoxSchema=external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),width:external_exports2.number(),height:external_exports2.number()}),LayerItemSchema=external_exports2.object({name:external_exports2.string(),color:external_exports2.string(),visible:external_exports2.boolean(),active:external_exports2.boolean(),config:external_exports2.boolean(),transparency:external_exports2.boolean()}),ObjectItemSchema=external_exports2.object({name:external_exports2.string(),visible:external_exports2.boolean(),locked:external_exports2.boolean()}),DataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(SingleLetterShapeSchema),BBox:BBoxSchema,colors:external_exports2.union([external_exports2.array(external_exports2.string()),external_exports2.record(external_exports2.string())])}),PackageDetailDataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(external_exports2.string()).transform(shapes=>shapes.map(shape=>{let[type,...data]=shape.split("~");return ShapeItemSchema.parse({type,data:data.join("~")})})).pipe(external_exports2.array(PackageDetailShapeSchema)),layers:external_exports2.array(external_exports2.string()).transform(layers=>layers.map(layer=>{let[name,color,visible,active,config,transparency]=layer.split("~");return LayerItemSchema.parse({name,color,visible:visible==="true",active:active==="true",config:config==="true",transparency:transparency==="true"})})),objects:external_exports2.array(external_exports2.string()).transform(objects=>objects.map(obj=>{let[name,visible,locked]=obj.split("~");return ObjectItemSchema.parse({name,visible:visible==="true",locked:locked==="true"})})),BBox:BBoxSchema,netColors:external_exports2.array(external_exports2.unknown()).optional()}),PackageDetailSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),docType:external_exports2.number(),updateTime:external_exports2.number(),owner:OwnerSchema,datastrid:external_exports2.string(),writable:external_exports2.boolean(),dataStr:PackageDetailDataStrSchema}),ModelBoundsSchema=external_exports2.object({min:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()}),max:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()})}),EasyEdaJsonSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),description:external_exports2.string(),docType:external_exports2.number(),type:external_exports2.number(),szlcsc:SzlcscSchema,lcsc:LcscSchema,owner:OwnerSchema,tags:external_exports2.array(external_exports2.string()),category:external_exports2.string().optional(),updateTime:external_exports2.number(),updated_at:external_exports2.string(),dataStr:DataStrSchema,verify:external_exports2.boolean(),SMT:external_exports2.boolean().optional(),datastrid:external_exports2.string(),jlcOnSale:external_exports2.number().optional(),writable:external_exports2.boolean(),isFavorite:external_exports2.boolean(),packageDetail:PackageDetailSchema,_objMetadata:external_exports2.object({bounds:ModelBoundsSchema}).optional()}),getModelObjCdnUrl=({easyedaModelUuid,easyedaPartNumber})=>`https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.obj?uuid=${easyedaModelUuid}`,getModelCdnUrl=getModelObjCdnUrl,getModelUuidFromRawPackageDetail=result=>{let shapes=result.packageDetail?.dataStr?.shape;if(!Array.isArray(shapes))return null;for(let shape of shapes){if(typeof shape!="string"||!shape.startsWith("SVGNODE~"))continue;let svgNodeJson=shape.slice(8);try{let modelUuid=JSON.parse(svgNodeJson)?.attrs?.uuid;if(typeof modelUuid=="string"&&modelUuid.length>0)return modelUuid}catch{}}return null},parseObjBounds2=objText=>{let minX=Number.POSITIVE_INFINITY,minY=Number.POSITIVE_INFINITY,minZ=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY,maxZ=Number.NEGATIVE_INFINITY,vertexCount=0;for(let line2 of objText.split(/\r?\n/)){let trimmed=line2.trim();if(!trimmed.startsWith("v "))continue;let[,xStr,yStr,zStr]=trimmed.split(/\s+/,4),x4=Number(xStr),y4=Number(yStr),z4=Number(zStr);!Number.isFinite(x4)||!Number.isFinite(y4)||!Number.isFinite(z4)||(vertexCount+=1,minX=Math.min(minX,x4),minY=Math.min(minY,y4),minZ=Math.min(minZ,z4),maxX=Math.max(maxX,x4),maxY=Math.max(maxY,y4),maxZ=Math.max(maxZ,z4))}return vertexCount===0?null:{min:{x:minX,y:minY,z:minZ},max:{x:maxX,y:maxY,z:maxZ}}};async function fetchEasyEDAComponent(jlcpcbPartNumber,{fetch:fetch22=globalThis.fetch,includeModelMetadata=!0}={}){let searchUrl="https://easyeda.com/api/components/search",componentUrl=uuid=>`https://easyeda.com/api/components/${uuid}?version=6.4.7&uuid=${uuid}&datastrid=`,searchHeaders={authority:"easyeda.com",pragma:"no-cache","cache-control":"no-cache",accept:"application/json, text/javascript, */*; q=0.01","x-requested-with":"XMLHttpRequest","user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","content-type":"application/x-www-form-urlencoded; charset=UTF-8",origin:"https://easyeda.com","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty",referer:"https://easyeda.com/editor","accept-language":"cs,en;q=0.9,sk;q=0.8,en-GB;q=0.7",cookie:"<PUT your cookies here>"},searchData=`type=3&doctype%5B%5D=2&uid=0819f05c4eef4c71ace90d822a990e87&returnListStyle=classifyarr&wd=${jlcpcbPartNumber}&version=6.4.7`,searchResponse=await fetch22(searchUrl,{method:"POST",headers:searchHeaders,body:searchData});if(!searchResponse.ok)throw new Error("Failed to search for the component");let searchResult=await searchResponse.json();if(!searchResult.success||!searchResult.result.lists.lcsc.length)throw new Error("Component not found");let componentUUID=(searchResult.result.lists.lcsc.find(component=>component.dataStr.head.c_para["Supplier Part"]===jlcpcbPartNumber)??searchResult.result.lists.lcsc[0]).uuid,componentResponse=await fetch22(componentUrl(componentUUID),{method:"GET",headers:{...searchHeaders,referer:`https://easyeda.com/editor?uuid=${componentUUID}`}});if(!componentResponse.ok)throw new Error("Failed to fetch the component details");let result=(await componentResponse.json()).result;if(includeModelMetadata){let modelUuid=getModelUuidFromRawPackageDetail(result),partNumber=result.lcsc?.number;if(modelUuid&&partNumber)try{let objUrl=getModelCdnUrl({easyedaModelUuid:modelUuid,easyedaPartNumber:partNumber}),objResponse=await fetch22(objUrl);if(objResponse.ok){let objText=await objResponse.text(),bounds=parseObjBounds2(objText);bounds&&(result._objMetadata={bounds})}}catch(error2){console.error(`Error fetching model metadata for ${jlcpcbPartNumber}:`,error2)}}return result}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]},getJlcPackageFromFootprinterString=footprinterString=>footprinterString.includes("cap")?footprinterString.replace(/cap/g,""):footprinterString,getJlcpcbPackageName=footprint=>{if(footprint){if(footprint.startsWith("kicad:")){let footprinterString=getFootprinterStringFromKicad(footprint);return footprinterString?getJlcPackageFromFootprinterString(footprinterString):footprint}return getJlcPackageFromFootprinterString(footprint)}},EASYEDA_API_ORIGIN="https://easyeda.com",METHODS_WITHOUT_BODY=new Set(["GET","HEAD"]),getRequestUrl=requestInput=>typeof requestInput=="string"?requestInput:requestInput instanceof URL?requestInput.toString():requestInput.url,createMergedTargetRequest=(requestInput,requestInit)=>requestInput instanceof URL?new Request(requestInput.toString(),requestInit):typeof requestInput=="string"?new Request(requestInput,requestInit):new Request(requestInput,requestInit),isEasyEdaApiRequestUrl=requestUrl=>requestUrl.startsWith(`${EASYEDA_API_ORIGIN}/api/`),getFetchWithEasyEdaProxy=({platformFetch:upstreamFetch,easyEdaProxyConfig})=>async(requestInput,requestInit)=>{let targetRequestUrl=getRequestUrl(requestInput);if(!isEasyEdaApiRequestUrl(targetRequestUrl))return upstreamFetch(requestInput,requestInit);let mergedTargetRequest=createMergedTargetRequest(requestInput,requestInit),targetRequestHeaders=new Headers(mergedTargetRequest.headers),proxyRequestHeaders=new Headers(targetRequestHeaders);proxyRequestHeaders.delete("origin"),proxyRequestHeaders.delete("authority"),proxyRequestHeaders.delete("host"),proxyRequestHeaders.delete("referer"),proxyRequestHeaders.delete("user-agent"),proxyRequestHeaders.delete("cookie"),proxyRequestHeaders.set("X-Target-Url",targetRequestUrl),proxyRequestHeaders.set("X-Sender-Origin",targetRequestHeaders.get("origin")??""),proxyRequestHeaders.set("X-Sender-Host",targetRequestHeaders.get("host")??EASYEDA_API_ORIGIN),proxyRequestHeaders.set("X-Sender-Referer",targetRequestHeaders.get("referer")??""),proxyRequestHeaders.set("X-Sender-User-Agent",targetRequestHeaders.get("user-agent")??""),proxyRequestHeaders.set("X-Sender-Cookie",targetRequestHeaders.get("cookie")??""),proxyRequestHeaders.set("authority",targetRequestHeaders.get("authority")??targetRequestHeaders.get("host")??""),proxyRequestHeaders.set("content-type",targetRequestHeaders.get("content-type")??"");for(let[name,value]of Object.entries(easyEdaProxyConfig.headers??{}))proxyRequestHeaders.set(name,value);let proxyRequestBody=METHODS_WITHOUT_BODY.has(mergedTargetRequest.method)?void 0:await mergedTargetRequest.clone().arrayBuffer();return upstreamFetch(easyEdaProxyConfig.proxyEndpointUrl,{method:mergedTargetRequest.method,headers:proxyRequestHeaders,body:proxyRequestBody,signal:requestInit?.signal})},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((a3,b3)=>Number(b3.is_basic??!1)-Number(a3.is_basic??!1)):[],JlcPcbPartsEngine=class{constructor({platformFetch:defaultPlatformFetch,easyEdaProxyConfig}={}){__publicField(this,"defaultPlatformFetch");__publicField(this,"easyEdaProxyConfig");this.defaultPlatformFetch=defaultPlatformFetch,this.easyEdaProxyConfig=easyEdaProxyConfig,this.fetchPartCircuitJson=this.fetchPartCircuitJson.bind(this)}getEasyEdaPlatformFetch(platformFetchOverride){let resolvedPlatformFetch=platformFetchOverride??this.defaultPlatformFetch??globalThis.fetch;return this.easyEdaProxyConfig?getFetchWithEasyEdaProxy({platformFetch:resolvedPlatformFetch,easyEdaProxyConfig:this.easyEdaProxyConfig}):resolvedPlatformFetch}async findPart({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(r5=>`C${r5.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(c4=>`C${c4.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(h6=>`C${h6.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(d4=>`C${d4.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(c4=>`C${c4.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(t52=>`C${t52.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(i3=>`C${i3.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(c4=>`C${c4.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(m4=>`C${m4.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(r5=>`C${r5.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(s3=>`C${s3.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(l4=>`C${l4.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(l4=>`C${l4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_connector"&&sourceComponent.standard==="usb_c"){let{usb_c_connectors}=await getJlcPartsCached("usb_c_connectors",{});return{jlcpcb:withBasicPartPreference(usb_c_connectors).map(c4=>`C${c4.lcsc}`).slice(0,3)}}return{}}async fetchPartCircuitJson({supplierPartNumber,manufacturerPartNumber,platformFetch:platformFetchOverride}){let easyEdaPlatformFetch=this.getEasyEdaPlatformFetch(platformFetchOverride),resolvedSupplierPartNumber=supplierPartNumber;if(!resolvedSupplierPartNumber&&manufacturerPartNumber){let{components}=await getJlcPartsCached("components",{search:manufacturerPartNumber});resolvedSupplierPartNumber=components?.[0]?`C${components[0].lcsc}`:void 0}if(!resolvedSupplierPartNumber)return;let rawEasyEdaJson=await fetchEasyEDAComponent(resolvedSupplierPartNumber,{fetch:easyEdaPlatformFetch}),parsed=EasyEdaJsonSchema.parse(rawEasyEdaJson);return convertEasyEdaJsonToCircuitJson(parsed)}},jlcPartsEngine=new JlcPcbPartsEngine;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()]),point34=external_exports.tuple([external_exports.number(),external_exports.number(),external_exports.number()]),point6=external_exports.union([point22,point34]),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:point6,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:point6,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).pipe(drill_def),size:external_exports.union([external_exports.array(external_exports.number()).length(2).transform(([w4,h6])=>({width:w4,height:h6})),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:point6,size:point22,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).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:point6,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_rect_def=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(),fill:external_exports.string().optional(),layer:external_exports.string(),uuid: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_rects:external_exports.array(fp_rect_def).optional(),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(n4=>Number.parseFloat(n4.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(n4=>Number.parseFloat(n4.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(n4=>Number.parseFloat(n4.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(n4=>n4?.valueOf?.()??n4).filter(v4=>typeof v4=="number"||typeof v4=="string"&&/^[-+]?\d*\.?\d+(e[-+]?\d+)?$/i.test(v4)).map(v4=>typeof v4=="number"?v4:Number.parseFloat(v4)):attrKey==="tags"?val.map(n4=>n4.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(s3=>s3.valueOf()):val},getAttr=(s3,key)=>{for(let elm of s3)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 at3=getAttr(row,"at"),size3=getAttr(row,"size"),drill=getAttr(row,"drill"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let padType=row[2].valueOf(),isCu=layers.some(l4=>l4.endsWith(".Cu")||l4==="*.Cu"||l4.includes(".Cu"));if(padType==="thru_hole")continue;if(!isCu&&padType!=="np_thru_hole"){debug11(`Skipping pad without copper 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:at3,drill,size:size3,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(),at3=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:at3,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_rects=[],fp_rect_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_rect");for(let fp_rect_row of fp_rect_rows){let start=getAttr(fp_rect_row,"start"),end=getAttr(fp_rect_row,"end"),stroke=getAttr(fp_rect_row,"stroke"),layer=getAttr(fp_rect_row,"layer"),fill=getAttr(fp_rect_row,"fill"),uuid=getAttr(fp_rect_row,"uuid");!start||!end||!layer||fp_rects.push({start,end,stroke,fill,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?.(),at3=getAttr(row,"at"),drill=getAttr(row,"drill"),size3=getAttr(row,"size");Array.isArray(size3)&&(size3[0]==="size"&&(size3=size3.slice(1)),size3={width:Number(size3[0]),height:Number(size3[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:at3,drill,size:size3,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_rects,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 getArcLength2=(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 i3=0;i3<=numPoints;i3++){let angle=angleStart+i3/numPoints*angleDelta,x4=center2.x+radius*Math.cos(angle),y4=center2.y+radius*Math.sin(angle);path.push({x:x4,y:y4})}return path}var makePoint=p4=>Array.isArray(p4)?{x:p4[0],y:p4[1]}:p4,pointsEqual2=(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 i3=0;i3<segments.length;i3++){if(used.has(i3))continue;let polygon2=[segments[i3]];used.add(i3);let currentEnd=segments[i3].end,foundNext=!0;for(;foundNext;){if(foundNext=!1,polygon2.length>1&&pointsEqual2(currentEnd,polygon2[0].start)){polygons.push(polygon2);break}for(let j4=0;j4<segments.length;j4++)if(!used.has(j4)){if(pointsEqual2(currentEnd,segments[j4].start)){polygon2.push(segments[j4]),used.add(j4),currentEnd=segments[j4].end,foundNext=!0;break}else if(pointsEqual2(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 arcLength2=getArcLength2(segment2.start,segment2.mid,segment2.end),numPoints=Math.max(3,Math.ceil(arcLength2)),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(t52=>t52.layer?.toLowerCase()==="f.silks"&&(t52.text?.includes("${REFERENCE}")||t52.fp_text_type?.toLowerCase()==="reference"||t52.text?.match(/^R\d+|C\d+|U\d+/))),fallbackText=refText||fp_texts.find(t52=>t52.layer?.toLowerCase()==="f.fab"&&(t52.text?.includes("${REFERENCE}")||t52.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=(x4,y4,deg)=>{let r5=degToRad(deg),cos6=Math.cos(r5),sin6=Math.sin(r5);return{x:x4*cos6-y4*sin6,y:x4*sin6+y4*cos6}},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((a3,b3)=>a3-b3),[minY,maxY]=uniqueYs.sort((a3,b3)=>a3-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=at3=>at3&&Array.isArray(at3)&&at3.length>=3&&typeof at3[2]=="number"?at3[2]:0,isNinetyLike=deg=>{let n4=(deg%360+360)%360;return n4===90||n4===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"f.crtyd":case"edge.cuts":return"top";case"b.cu":case"b.fab":case"b.silks":case"b.crtyd":return"bottom"}},convertKicadJsonToTsCircuitSoup=async kicadJson=>{let{fp_lines,fp_rects,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 x4=pad2.at[0],y4=-pad2.at[1],w4=pad2.size[0],h6=pad2.size[1];minX=Math.min(minX,x4-w4/2),maxX=Math.max(maxX,x4+w4/2),minY=Math.min(minY,y4-h6/2),maxY=Math.max(maxY,y4+h6/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 x4=0,y4=0,layers=["top","bottom"],pad2=pads.find(p4=>normalizePortName(p4.name)===portName);if(pad2)x4=pad2.at[0],y4=-pad2.at[1],layers=pad2.layers?pad2.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"];else if(holes){let hole=holes.find(h6=>normalizePortName(h6.name)===portName);hole&&(x4=hole.at[0],y4=-hole.at[1],layers=hole.layers?hole.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"])}circuitJson.push({type:"pcb_port",pcb_port_id,source_port_id,pcb_component_id,x:x4,y:y4,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 rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?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 rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?pad2.size[0]:pad2.size[1],offX=pad2.drill?.offset?.[0]??0,offY=pad2.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation5),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"&&pad2.pad_shape==="circle"&&circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:pad2.at[0],y:-pad2.at[1],hole_shape:"circle",hole_diameter:pad2.drill?.width??pad2.size[0],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(l4=>l4.endsWith(".Cu")||l4==="*.Cu"),rotation5=getRotationDeg(hole.at),offX=hole.drill?.offset?.[0]??0,offY=hole.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation5),x4=hole.at[0]+rotOff.x,y4=-(hole.at[1]+rotOff.y),holeDiameter=hole.drill?.width??0,outerDiameter=hole.size?.width??holeDiameter,rr3=hole.roundrect_rratio??0,rectBorderRadius=rr3>0?Math.min(isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter)/2*rr3: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(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,rect_pad_height:isNinetyLike(rotation5)?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:x4,y:y4,outer_width:isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,outer_height:isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,hole_width:isNinetyLike(rotation5)?hole.drill?.height??holeDiameter:hole.drill?.width??holeDiameter,hole_height:isNinetyLike(rotation5)?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,rotation5),width=isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,height=isNinetyLike(rotation5)?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:x4,y:y4,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:x4,y:y4,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:x4,y:y4,hole_shape:"circle",hole_diameter:holeDiameter,pcb_component_id})}let edgeCutSegments=[],frontCourtyardSegments=[],backCourtyardSegments=[];for(let fp_line2 of fp_lines){let lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="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}):lowerLayer==="f.crtyd"?frontCourtyardSegments.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}):lowerLayer==="b.crtyd"&&backCourtyardSegments.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){let lowerLayer=fp_arc.layer.toLowerCase();lowerLayer==="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}):lowerLayer==="f.crtyd"?frontCourtyardSegments.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}):lowerLayer==="b.crtyd"&&backCourtyardSegments.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 courtyardOutlineId=0;for(let[segments,layer]of[[frontCourtyardSegments,"top"],[backCourtyardSegments,"bottom"]]){let closedCourtyardPolygons=findClosedPolygons(segments);for(let polygon2 of closedCourtyardPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${courtyardOutlineId++}`,layer,pcb_component_id,outline:points.map(p4=>({x:p4.x,y:-p4.y}))})}}if(fp_rects)for(let fp_rect of fp_rects){let lowerLayer=fp_rect.layer.toLowerCase();if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){let x12=fp_rect.start[0],y12=fp_rect.start[1],x22=fp_rect.end[0],y22=fp_rect.end[1];circuitJson.push({type:"pcb_courtyard_rect",pcb_courtyard_rect_id:`pcb_courtyard_rect_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_rect.layer),center:{x:(x12+x22)/2,y:-((y12+y22)/2)},width:Math.abs(x22-x12),height:Math.abs(y22-y12)})}else debug23("Unhandled layer for fp_rect",fp_rect.layer)}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.crtyd"||lowerLayer==="b.crtyd"?debug23("Skipping CrtYd fp_line (converted to pcb_courtyard_outline)",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),arcLength2=getArcLength2(start,mid,end),adjustedNumPoints=Math.max(2,Math.ceil(arcLength2/.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:[]}):fp_poly.layer.toLowerCase().endsWith(".crtyd")?polygonPoints.length>=3&&circuitJson.push({type:"pcb_courtyard_polygon",pcb_courtyard_polygon_id:`pcb_courtyard_polygon_${courtyardOutlineId++}`,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id,points:polygonPoints}):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}if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){debug23("Skipping CrtYd fp_arc (converted to pcb_courtyard_outline)",fp_arc.layer);continue}let start=makePoint(fp_arc.start),mid=makePoint(fp_arc.mid),end=makePoint(fp_arc.end),arcLength2=getArcLength2(start,mid,end),arcPoints=generateArcPath(start,mid,end,Math.ceil(arcLength2));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 i3=0;i3<=numPoints;i3++){let angle=i3/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}):(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd")&&circuitJson.push({type:"pcb_courtyard_circle",pcb_courtyard_circle_id:`pcb_courtyard_circle_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_circle.layer),center:{x:center2.x,y:-center2.y},radius})}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 at3=propFab.attributes.at;if(!at3)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:at3[0],y:-at3[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={},options={})=>{let partsEngine2=overrides.partsEngine??jlcPartsEngine;return!overrides.partsEngine&&options.easyEdaProxyConfig&&(partsEngine2=new JlcPcbPartsEngine({platformFetch:overrides.platformFetch,easyEdaProxyConfig:options.easyEdaProxyConfig})),{localCacheEngine:overrides.localCacheEngine,partsEngine:partsEngine2,spiceEngineMap:{ngspice:{simulate:async spice=>{if(!ngspiceEngineCache){let createNgspiceSpiceEngine=await dynamicallyLoadDependencyWithCdnBackup("@tscircuit/ngspice-spice-engine").catch(error2=>{throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.",{cause:error2})});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(d4,b3){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d5,b4){d5.__proto__=b4}||function(d5,b4){for(var p4 in b4)Object.prototype.hasOwnProperty.call(b4,p4)&&(d5[p4]=b4[p4])},extendStatics(d4,b3)};function __extends(d4,b3){if(typeof b3!="function"&&b3!==null)throw new TypeError("Class extends value "+String(b3)+" is not a constructor or null");extendStatics(d4,b3);function __2(){this.constructor=d4}d4.prototype=b3===null?Object.create(b3):(__2.prototype=b3.prototype,new __2)}var __assign=function(){return __assign=Object.assign||function(t52){for(var s3,i3=1,n4=arguments.length;i3<n4;i3++){s3=arguments[i3];for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&(t52[p4]=s3[p4])}return t52},__assign.apply(this,arguments)};function __rest(s3,e5){var t52={};for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&e5.indexOf(p4)<0&&(t52[p4]=s3[p4]);if(s3!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i3=0,p4=Object.getOwnPropertySymbols(s3);i3<p4.length;i3++)e5.indexOf(p4[i3])<0&&Object.prototype.propertyIsEnumerable.call(s3,p4[i3])&&(t52[p4[i3]]=s3[p4[i3]]);return t52}function __decorate(decorators,target,key,desc){var c4=arguments.length,r5=c4<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d4;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r5=Reflect.decorate(decorators,target,key,desc);else for(var i3=decorators.length-1;i3>=0;i3--)(d4=decorators[i3])&&(r5=(c4<3?d4(r5):c4>3?d4(target,key,r5):d4(target,key))||r5);return c4>3&&r5&&Object.defineProperty(target,key,r5),r5}function __param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function __esDecorate(ctor,descriptorIn,decorators,contextIn,initializers,extraInitializers){function accept(f3){if(f3!==void 0&&typeof f3!="function")throw new TypeError("Function expected");return f3}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):{}),_4,done=!1,i3=decorators.length-1;i3>=0;i3--){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(f3){if(done)throw new TypeError("Cannot add initializers after decoration has completed");extraInitializers.push(accept(f3||null))};var result=(0,decorators[i3])(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");(_4=accept(result.get))&&(descriptor.get=_4),(_4=accept(result.set))&&(descriptor.set=_4),(_4=accept(result.init))&&initializers.unshift(_4)}else(_4=accept(result))&&(kind==="field"?initializers.unshift(_4):descriptor[key]=_4)}target&&Object.defineProperty(target,contextIn.name,descriptor),done=!0}function __runInitializers(thisArg,initializers,value){for(var useValue=arguments.length>2,i3=0;i3<initializers.length;i3++)value=useValue?initializers[i3].call(thisArg,value):initializers[i3].call(thisArg);return useValue?value:void 0}function __propKey(x4){return typeof x4=="symbol"?x4:"".concat(x4)}function __setFunctionName(f3,name,prefix){return typeof name=="symbol"&&(name=name.description?"[".concat(name.description,"]"):""),Object.defineProperty(f3,"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,P4,generator){function adopt(value){return value instanceof P4?value:new P4(function(resolve){resolve(value)})}return new(P4||(P4=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e5){reject(e5)}}function rejected(value){try{step(generator.throw(value))}catch(e5){reject(e5)}}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 _4={label:0,sent:function(){if(t52[0]&1)throw t52[1];return t52[1]},trys:[],ops:[]},f3,y4,t52,g6=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return g6.next=verb(0),g6.throw=verb(1),g6.return=verb(2),typeof Symbol=="function"&&(g6[Symbol.iterator]=function(){return this}),g6;function verb(n4){return function(v4){return step([n4,v4])}}function step(op3){if(f3)throw new TypeError("Generator is already executing.");for(;g6&&(g6=0,op3[0]&&(_4=0)),_4;)try{if(f3=1,y4&&(t52=op3[0]&2?y4.return:op3[0]?y4.throw||((t52=y4.return)&&t52.call(y4),0):y4.next)&&!(t52=t52.call(y4,op3[1])).done)return t52;switch(y4=0,t52&&(op3=[op3[0]&2,t52.value]),op3[0]){case 0:case 1:t52=op3;break;case 4:return _4.label++,{value:op3[1],done:!1};case 5:_4.label++,y4=op3[1],op3=[0];continue;case 7:op3=_4.ops.pop(),_4.trys.pop();continue;default:if(t52=_4.trys,!(t52=t52.length>0&&t52[t52.length-1])&&(op3[0]===6||op3[0]===2)){_4=0;continue}if(op3[0]===3&&(!t52||op3[1]>t52[0]&&op3[1]<t52[3])){_4.label=op3[1];break}if(op3[0]===6&&_4.label<t52[1]){_4.label=t52[1],t52=op3;break}if(t52&&_4.label<t52[2]){_4.label=t52[2],_4.ops.push(op3);break}t52[2]&&_4.ops.pop(),_4.trys.pop();continue}op3=body.call(thisArg,_4)}catch(e5){op3=[6,e5],y4=0}finally{f3=t52=0}if(op3[0]&5)throw op3[1];return{value:op3[0]?op3[1]:void 0,done:!0}}}var __createBinding=Object.create?(function(o4,m4,k4,k22){k22===void 0&&(k22=k4);var desc=Object.getOwnPropertyDescriptor(m4,k4);(!desc||("get"in desc?!m4.__esModule:desc.writable||desc.configurable))&&(desc={enumerable:!0,get:function(){return m4[k4]}}),Object.defineProperty(o4,k22,desc)}):(function(o4,m4,k4,k22){k22===void 0&&(k22=k4),o4[k22]=m4[k4]});function __exportStar(m4,o4){for(var p4 in m4)p4!=="default"&&!Object.prototype.hasOwnProperty.call(o4,p4)&&__createBinding(o4,m4,p4)}function __values(o4){var s3=typeof Symbol=="function"&&Symbol.iterator,m4=s3&&o4[s3],i3=0;if(m4)return m4.call(o4);if(o4&&typeof o4.length=="number")return{next:function(){return o4&&i3>=o4.length&&(o4=void 0),{value:o4&&o4[i3++],done:!o4}}};throw new TypeError(s3?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(o4,n4){var m4=typeof Symbol=="function"&&o4[Symbol.iterator];if(!m4)return o4;var i3=m4.call(o4),r5,ar3=[],e5;try{for(;(n4===void 0||n4-- >0)&&!(r5=i3.next()).done;)ar3.push(r5.value)}catch(error2){e5={error:error2}}finally{try{r5&&!r5.done&&(m4=i3.return)&&m4.call(i3)}finally{if(e5)throw e5.error}}return ar3}function __spread(){for(var ar3=[],i3=0;i3<arguments.length;i3++)ar3=ar3.concat(__read(arguments[i3]));return ar3}function __spreadArrays(){for(var s3=0,i3=0,il3=arguments.length;i3<il3;i3++)s3+=arguments[i3].length;for(var r5=Array(s3),k4=0,i3=0;i3<il3;i3++)for(var a3=arguments[i3],j4=0,jl3=a3.length;j4<jl3;j4++,k4++)r5[k4]=a3[j4];return r5}function __spreadArray(to3,from,pack2){if(pack2||arguments.length===2)for(var i3=0,l4=from.length,ar3;i3<l4;i3++)(ar3||!(i3 in from))&&(ar3||(ar3=Array.prototype.slice.call(from,0,i3)),ar3[i3]=from[i3]);return to3.concat(ar3||Array.prototype.slice.call(from))}function __await(v4){return this instanceof __await?(this.v=v4,this):new __await(v4)}function __asyncGenerator(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g6=generator.apply(thisArg,_arguments||[]),i3,q4=[];return i3=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i3[Symbol.asyncIterator]=function(){return this},i3;function awaitReturn(f3){return function(v4){return Promise.resolve(v4).then(f3,reject)}}function verb(n4,f3){g6[n4]&&(i3[n4]=function(v4){return new Promise(function(a3,b3){q4.push([n4,v4,a3,b3])>1||resume(n4,v4)})},f3&&(i3[n4]=f3(i3[n4])))}function resume(n4,v4){try{step(g6[n4](v4))}catch(e5){settle(q4[0][3],e5)}}function step(r5){r5.value instanceof __await?Promise.resolve(r5.value.v).then(fulfill,reject):settle(q4[0][2],r5)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f3,v4){f3(v4),q4.shift(),q4.length&&resume(q4[0][0],q4[0][1])}}function __asyncDelegator(o4){var i3,p4;return i3={},verb("next"),verb("throw",function(e5){throw e5}),verb("return"),i3[Symbol.iterator]=function(){return this},i3;function verb(n4,f3){i3[n4]=o4[n4]?function(v4){return(p4=!p4)?{value:__await(o4[n4](v4)),done:!1}:f3?f3(v4):v4}:f3}}function __asyncValues(o4){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m4=o4[Symbol.asyncIterator],i3;return m4?m4.call(o4):(o4=typeof __values=="function"?__values(o4):o4[Symbol.iterator](),i3={},verb("next"),verb("throw"),verb("return"),i3[Symbol.asyncIterator]=function(){return this},i3);function verb(n4){i3[n4]=o4[n4]&&function(v4){return new Promise(function(resolve,reject){v4=o4[n4](v4),settle(resolve,reject,v4.done,v4.value)})}}function settle(resolve,reject,d4,v4){Promise.resolve(v4).then(function(v5){resolve({value:v5,done:d4})},reject)}}function __makeTemplateObject(cooked,raw){return Object.defineProperty?Object.defineProperty(cooked,"raw",{value:raw}):cooked.raw=raw,cooked}var __setModuleDefault=Object.create?(function(o4,v4){Object.defineProperty(o4,"default",{enumerable:!0,value:v4})}):function(o4,v4){o4.default=v4},ownKeys=function(o4){return ownKeys=Object.getOwnPropertyNames||function(o6){var ar3=[];for(var k4 in o6)Object.prototype.hasOwnProperty.call(o6,k4)&&(ar3[ar3.length]=k4);return ar3},ownKeys(o4)};function __importStar(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k4=ownKeys(mod),i3=0;i3<k4.length;i3++)k4[i3]!=="default"&&__createBinding(result,mod,k4[i3]);return __setModuleDefault(result,mod),result}function __importDefault(mod){return mod&&mod.__esModule?mod:{default:mod}}function __classPrivateFieldGet(receiver,state2,kind,f3){if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a getter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f3:kind==="a"?f3.call(receiver):f3?f3.value:state2.get(receiver)}function __classPrivateFieldSet(receiver,state2,value,kind,f3){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a setter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f3.call(receiver,value):f3?f3.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(e5){return Promise.reject(e5)}}),env.stack.push({value,dispose,async})}else async&&env.stack.push({async:!0});return value}var _SuppressedError=typeof SuppressedError=="function"?SuppressedError:function(error2,suppressed,message){var e5=new Error(message);return e5.name="SuppressedError",e5.error=error2,e5.suppressed=suppressed,e5};function __disposeResources(env){function fail(e5){env.error=env.hasError?new _SuppressedError(e5,env.error,"An error was suppressed during disposal."):e5,env.hasError=!0}var r5,s3=0;function next2(){for(;r5=env.stack.pop();)try{if(!r5.async&&s3===1)return s3=0,env.stack.push(r5),Promise.resolve().then(next2);if(r5.dispose){var result=r5.dispose.call(r5.value);if(r5.async)return s3|=2,Promise.resolve(result).then(next2,function(e5){return fail(e5),next2()})}else s3|=1}catch(e5){fail(e5)}if(s3===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(m4,tsx,d4,ext,cm3){return tsx?preserveJsx?".jsx":".js":d4&&(!ext||!cm3)?m4:d4+ext+"."+cm3.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({},{easyEdaProxyConfig:webWorkerConfiguration.easyEdaProxyConfig}),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(`
|
|
674
674
|
`)},preSuppliedImports:{"@tscircuit/core":dist_exports4,tscircuit:dist_exports4,"@tscircuit/math-utils":dist_exports2,"@tscircuit/mm":dist_exports5,react:React,"react/jsx-runtime":ReactJsxRuntime,debug:import_debug22.default,tslib:tslib_es6_exports,"@tscircuit/props":{}},circuit,tsConfig:null,importStack:[],currentlyImporting:new Set,...webWorkerConfiguration}}function normalizeFilePath(filePath){let normFilePath=filePath;return normFilePath=normFilePath.replace(/\\/g,"/"),normFilePath=normFilePath.trim(),normFilePath.startsWith("./")&&(normFilePath=normFilePath.slice(2)),normFilePath.startsWith("/")&&(normFilePath=normFilePath.slice(1)),normFilePath}function normalizeFsMap(fsMap){let normalizedFsMap={};for(let[fsPath,fileContent]of Object.entries(fsMap))normalizedFsMap[normalizeFilePath(fsPath)]=fileContent;return normalizedFsMap}function dirname(path){if(!path)return".";let cleanPath=path.replace(/\\/g,"/").replace(/\/+$/,"");return cleanPath.indexOf("/")===-1?".":cleanPath.substring(0,cleanPath.lastIndexOf("/"))||"/"}function resolveRelativePath(importPath,cwd){if(importPath.startsWith("../")){let parentDir=dirname(cwd);return resolveRelativePath(importPath.slice(3),parentDir)}return importPath.startsWith("./")?resolveRelativePath(importPath.slice(2),cwd):importPath.startsWith("/")?importPath.slice(1):`${cwd}/${importPath}`}function getTsConfig(fsMapOrAllFilePaths){if(Array.isArray(fsMapOrAllFilePaths))return null;let tsconfigContent=fsMapOrAllFilePaths["tsconfig.json"];if(!tsconfigContent)return null;try{let sanitizedContent=tsconfigContent.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g,"");return JSON.parse(sanitizedContent)}catch(e5){throw new Error(`Failed to parse tsconfig.json: ${e5.message}`)}}function resolveWithTsconfigPaths(opts){let{importPath,normalizedFilePathMap,extensions,tsConfig,tsconfigDir}=opts,paths=tsConfig?.compilerOptions?.paths;if(!paths)return null;let baseUrl=tsConfig?.compilerOptions?.baseUrl||".",tryResolveCandidate=candidate=>{let normalizedCandidate=normalizeFilePath(candidate);if(normalizedFilePathMap.has(normalizedCandidate))return normalizedFilePathMap.get(normalizedCandidate);for(let ext of extensions){let withExt=`${normalizedCandidate}.${ext}`;if(normalizedFilePathMap.has(withExt))return normalizedFilePathMap.get(withExt)}return null};for(let[alias,targets]of Object.entries(paths))if(alias.includes("*")){let[prefix,suffix]=alias.split("*");if(!importPath.startsWith(prefix)||!importPath.endsWith(suffix||""))continue;let starMatch=importPath.slice(prefix.length,importPath.length-(suffix?suffix.length:0));for(let target of targets){let replaced=target.replace("*",starMatch),candidate=baseUrl&&!replaced.startsWith("./")&&!replaced.startsWith("/")?`${baseUrl}/${replaced}`:replaced,resolved=tryResolveCandidate(candidate);if(resolved)return resolved}}else{if(importPath!==alias)continue;for(let target of targets){let candidate=baseUrl&&!target.startsWith("./")&&!target.startsWith("/")?`${baseUrl}/${target}`:target,resolved=tryResolveCandidate(candidate);if(resolved)return resolved}}let resolvedPathFromBaseUrl=resolveWithBaseUrl({importPath,normalizedFilePathMap,extensions,tsConfig,tsconfigDir});return resolvedPathFromBaseUrl||null}function resolveWithBaseUrl(opts){let{importPath,normalizedFilePathMap,extensions,tsConfig,tsconfigDir}=opts,baseUrl=tsConfig?.compilerOptions?.baseUrl;if(!baseUrl)return null;let filePathToResolve=`${tsconfigDir||"."}/${baseUrl}/${importPath}`;filePathToResolve=filePathToResolve.replace(/\/+/g,"/"),filePathToResolve=filePathToResolve.replace(/\/\.\//g,"/");let normalizedFilePath=normalizeFilePath(filePathToResolve);if(normalizedFilePathMap.has(normalizedFilePath))return normalizedFilePathMap.get(normalizedFilePath);for(let ext of extensions){let withExt=`${normalizedFilePath}.${ext}`;if(normalizedFilePathMap.has(withExt))return normalizedFilePathMap.get(withExt)}return null}function matchesTsconfigPathPattern(importPath,tsConfig){let paths=tsConfig?.compilerOptions?.paths;if(!paths)return!1;for(let[alias]of Object.entries(paths))if(alias.includes("*")){let[prefix,suffix]=alias.split("*");if(importPath.startsWith(prefix)&&importPath.endsWith(suffix||""))return!0}else if(importPath===alias)return!0;return!1}var FILE_EXTENSIONS=["tsx","ts","json","js","jsx","obj","gltf","glb","stl","step","stp"],resolveFilePath=(unknownFilePath,fsMapOrAllFilePaths,cwd,opts={})=>{let tsConfig=opts.tsConfig??null,isRelativeImport=unknownFilePath.startsWith("./")||unknownFilePath.startsWith("../"),hasBaseUrl=!!tsConfig?.compilerOptions?.baseUrl,resolvedPath=cwd&&(isRelativeImport||!hasBaseUrl)?resolveRelativePath(unknownFilePath,cwd):unknownFilePath,filePaths=new Set(Array.isArray(fsMapOrAllFilePaths)?fsMapOrAllFilePaths:Object.keys(fsMapOrAllFilePaths));if(filePaths.has(resolvedPath))return resolvedPath;let normalizedFilePathMap=new Map;for(let filePath of filePaths)normalizedFilePathMap.set(normalizeFilePath(filePath),filePath);let normalizedResolvedPath=normalizeFilePath(resolvedPath);if(isRelativeImport||!hasBaseUrl){if(normalizedFilePathMap.has(normalizedResolvedPath))return normalizedFilePathMap.get(normalizedResolvedPath);for(let ext of FILE_EXTENSIONS){let possibleFilePath=`${normalizedResolvedPath}.${ext}`;if(normalizedFilePathMap.has(possibleFilePath))return normalizedFilePathMap.get(possibleFilePath)}}if(!isRelativeImport){let resolvedPathFromPaths=resolveWithTsconfigPaths({importPath:unknownFilePath,normalizedFilePathMap,extensions:FILE_EXTENSIONS,tsConfig,tsconfigDir:opts.tsconfigDir});if(resolvedPathFromPaths)return resolvedPathFromPaths;let resolvedPathFromBaseUrl=resolveWithBaseUrl({importPath:unknownFilePath,normalizedFilePathMap,extensions:FILE_EXTENSIONS,tsConfig,tsconfigDir:opts.tsconfigDir});if(resolvedPathFromBaseUrl)return resolvedPathFromBaseUrl}if(!isRelativeImport&&!hasBaseUrl){let normalizedUnknownFilePath=normalizeFilePath(unknownFilePath);if(normalizedFilePathMap.has(normalizedUnknownFilePath))return normalizedFilePathMap.get(normalizedUnknownFilePath);for(let ext of FILE_EXTENSIONS){let possibleFilePath=`${normalizedUnknownFilePath}.${ext}`;if(normalizedFilePathMap.has(possibleFilePath))return normalizedFilePathMap.get(possibleFilePath)}}return null},resolveFilePathOrThrow=(unknownFilePath,fsMapOrAllFilePaths,cwd,opts={})=>{let resolvedFilePath=resolveFilePath(unknownFilePath,fsMapOrAllFilePaths,cwd,opts);if(!resolvedFilePath)throw new Error(`File not found "${unknownFilePath}", available paths:
|
|
675
675
|
|
|
676
676
|
${Object.keys(fsMapOrAllFilePaths).join(", ")}`);return resolvedFilePath};var stripComments=code=>{let out="",i3=0,inSingle=!1,inDouble=!1,inTemplate=!1;for(;i3<code.length;){let ch3=code[i3],next2=code[i3+1];if(!inDouble&&!inTemplate&&ch3==="'"&&code[i3-1]!=="\\"){inSingle=!inSingle,out+=ch3,i3++;continue}if(!inSingle&&!inTemplate&&ch3==='"'&&code[i3-1]!=="\\"){inDouble=!inDouble,out+=ch3,i3++;continue}if(!inSingle&&!inDouble&&ch3==="`"&&code[i3-1]!=="\\"){inTemplate=!inTemplate,out+=ch3,i3++;continue}if(!inSingle&&!inDouble&&!inTemplate){if(ch3==="/"&&next2==="/"){for(out+=" ",i3+=2;i3<code.length&&code[i3]!==`
|