text:
81" width="0.6096" layer="94"/>
<wire x1="88.9" y1="3.81" x2="-2.54" y2="3.81" width="0.6096" layer="94"/>
<pin name="1" x="0" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="2" x="2.54" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="3" x="5.08" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="4" x="7.62" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="5" x="10.16" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="6" x="12.7" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="7" x="15.24" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="8" x="17.78" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="9" x="20.32" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="10" x="22.86" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="11" x="25.4" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="12" x="27.94" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="13" x="30.48" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="14" x="33.02" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="15" x="35.56" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="16" x="38.1" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="17" x="40.64" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="18" x="43.18" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="19" x="45.72" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="20" x="48.26" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="21" x="50.8" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="22" x="53.34" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="23" x="55.88" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="24" x="58.42" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="25" x="60.96" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="26" x="63.5" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="27" x="66.04" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="28" x="68.58" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="29" x="71.12" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="30" x="73.66" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="31" x="76.2" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="32" x="78.74" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="33" x="81.28" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="34" x="83.82" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="35" x="86.36" y="-7.62" visible="pad" length="middle" rot="R90"/>
<pin name="36" x="86.36" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="37" x="83.82" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="38" x="81.28" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="39" x="78.74" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="40" x="76.2" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="41" x="73.66" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="42" x="71.12" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="43" x="68.58" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="44" x="66.04" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="45" x="63.5" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="46" x="60.96" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="47" x="58.42" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="48" x="55.88" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="49" x="53.34" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="50" x="50.8" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="51" x="48.26" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="52" x="45.72" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="53" x="43.18" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="54" x="40.64" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="55" x="38.1" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="56" x="35.56" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="57" x="33.02" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="58" x="30.48" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="59" x="27.94" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="60" x="25.4" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="61" x="22.86" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="62" x="20.32" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="63" x="17.78" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="64" x="15.24" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="65" x="12.7" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="66" x="10.16" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="67" x="7.62" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="68" x="5.08" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="69" x="2.54" y="7.62" visible="pad" length="middle" rot="R270"/>
<pin name="70" x="0" y="7.62" visible="pad" length="middle" rot="R270"/>
</symbol>
<symbol name="TETRODE">
<pin name="1" x="0" y="2.54" visible="pin" length="short"/>
<pin name="0" x="0" y="5.08" visible="pin" length="short"/>
<pin name="2" x="0" y="0" visible="pin" length="short"/>
<pin name="3" x="0" y="-2.54" visible="pin" length="short"/>
<wire x1="2.54" y1="6.35" x2="2.54" y2="-3.81" width="0.254" layer="94"/>
<wire x1="2.54" y1="-3.81" x2="7.62" y2="-3.81" width="0.254" layer="94"/>
<wire x1="7.62" y1="-3.81" x2="7.62" y2="6.35" width="0.254" layer="94"/>
<wire x1="7.62" y1="6.35" x2="2.54" y2="6.35" width="0.254" layer="94"/>
<text x="8.255" y="5.715" size="0.8128" layer="95" font="vector" ratio="18" align="center-left">>NAME</text>
<text x="8.255" y="4.445" size="0.8128" layer="96" font="vector" ratio="18" align="center-left">>VALUE</text>
</symbol>
</symbols>
<devicesets>
<deviceset name="GOLDPIN" uservalue="yes">
<gates>
<gate name="G$1" symbol="GOLDPIN" x="0" y="0"/>
</gates>
<devices>
<device name="_0.5ID_0.7OD" package="GOLDPIN_0.5ID_0.7OD">
<connects>
<connect gate="G$1" pin="0" pad="P$1"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="GND" prefix="SUPPLY">
<description>SUPPLY SYMBOL</description>
<gates>
<gate name="PE" symbol="PE" x="0" y="0"/>
</gates>
<devices>
<device name="">
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="FRAME" prefix="FRAME" uservalue="yes">
<description>FRAME A Size , 8 1/2 x 11 INCH, Landscape
</description>
<gates>
<gate name="G$1" symbol="FRAME_A_L-1" x="2.54" y="0"/>
</gates>
<devices>
<device name="">
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="DOCFIELD-GEN">
<gates>
<gate name="G$1" symbol="DOCFIELD-GEN" x="0" y="0"/>
</gates>
<devices>
<device name="">
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="PINHD-2X35" uservalue="yes">
<gates>
<gate name="G$1" symbol="PINHD2X35" x="-40.64" y="0"/>
</gates>
<devices>
<device name="_JMD70" package="JMD70">
<connects>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="10" pad="10"/>
<connect gate="G$1" pin="11" pad="11"/>
<connect gate="G$1" pin="12" pad="12"/>
<connect gate="G$1" pin="13" pad="13"/>
<connect gate="G$1" pin="14" pad="14"/>
<connect gate="G$1" pin="15" pad="15"/>
<connect gate="G$1" pin="16" pad="16"/>
<connect gate="G$1" pin="17" pad="17"/>
<connect gate="G$1" pin="18" pad="18"/>
<connect gate="G$1" pin="19" pad="19"/>
<connect gate="G$1" pin="2" pad="2"/>
<connect gate="G$1" pin="20" pad="20"/>
<connect gate="G$1" pin="21" pad="21"/>
<connect gate="G$1" pin="22" pad="22"/>
<connect gate="G$1" pin="23" pad="23"/>
<connect gate="G$1" pin="24" pad="24"/>
<connect gate="G$1" pin="25" pad="25"/>
<connect gate="G$1" pin="26" pad="26"/>
<connect gate="G$1" pin="27" pad="27"/>
<connect gate="G$1" pin="28" pad="28"/>
<connect gate="G$1" pin="29" pad="29"/>
<connect gate="G$1" pin="3" pad="3"/>
<connect gate="G$1" pin="30" pad="30"/>
<connect gate="G$1" pin="31" pad="31"/>
<connect gate="G$1" pin="32" pad="32"/>
<connect gate="G$1" pin="33" pad="33"/>
<connect gate="G$1" pin="34" pad="34"/>
<connect gate="G$1" pin="35" pad="35"/>
<connect gate="G$1" pin="36" pad="36"/>
<connect gate="G$1" pin="37" pad="37"/>
<connect gate="G$1" pin="38" pad="38"/>
<connect gate="G$1" pin="39" pad="39"/>
<connect gate="G$1" pin="4" pad="4"/>
<connect gate="G$1" pin="40" pad="40"/>
<connect gate="G$1" pin="41" pad="41"/>
<connect gate="G$1" pin="42" pad="42"/>
<connect gate="G$1" pin="43" pad="43"/>
<connect gate="G$1" pin="44" pad="44"/>
<connect gate="G$1" pin="45" pad="45"/>
<connect gate="G$1" pin="46" pad="46"/>
<connect gate="G$1" pin="47" pad="47"/>
<connect gate="G$1" pin="48" pad="48"/>
<connect gate="G$1" pin="49" pad="49"/>
<connect gate="G$1" pin="5" pad="5"/>
<connect gate="G$1" pin="50" pad="50"/>
<connect gate="G$1" pin="51" pad="51"/>
<connect gate="G$1" pin="52" pad="52"/>
<connect gate="G$1" pin="53" pad="53"/>
<connect gate="G$1" pin="54" pad="54"/>
<connect gate="G$1" pin="55" pad="55"/>
<connect gate="G$1" pin="56" pad="56"/>
<connect gate="G$1" pin="57" pad="57"/>
<connect gate="G$1" pin="58" pad="58"/>
<connect gate="G$1" pin="59" pad="59"/>
<connect gate="G$1" pin="6" pad="6"/>
<connect gate="G$1" pin="60" pad="60"/>
<connect gate="G$1" pin="61" pad="61"/>
<connect gate="G$1" pin="62" pad="62"/>
<connect gate="G$1" pin="63" pad="63"/>
<connect gate="G$1" pin="64" pad="64"/>
<connect gate="G$1" pin="65" pad="65"/>
<connect gate="G$1" pin="66" pad="66"/>
<connect gate="G$1" pin="67" pad="67"/>
<connect gate="G$1" pin="68" pad="68"/>
<connect gate="G$1" pin="69" pad="69"/>
<connect gate="G$1" pin="7" pad="7"/>
<connect gate="G$1" pin="70" pad="70"/>
<connect gate="G$1" pin="8" pad="8"/>
<connect gate="G$1" pin="9" pad="9"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
<device name="_DF40HEAD" package="DF40-70HEAD">
<connects>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="10" pad="10"/>
<connect gate="G$1" pin="11" pad="11"/>
<connect gate="G$1" pin="12" pad="12"/>
<connect gate="G$1" pin="13" pad="13"/>
<connect gate="G$1" pin="14" pad="14"/>
<connect gate="G$1" pin="15" pad="15"/>
<connect gate="G$1" pin="16" pad="16"/>
<connect gate="G$1" pin="17" pad="17"/>
<connect gate="G$1" pin="18" pad="18"/>
<connect gate="G$1" pin="19" pad="19"/>
<connect gate="G$1" pin="2" pad="2"/>
<connect gate="G$1" pin="20" pad="20"/>
<connect gate="G$1" pin="21" pad="21"/>
<connect gate="G$1" pin="22" pad="22"/>
<connect gate="G$1" pin="23" pad="23"/>
<connect gate="G$1" pin="24" pad="24"/>
<connect gate="G$1" pin="25" pad="25"/>
<connect gate="G$1" pin="26" pad="26"/>
<connect gate="G$1" pin="27" pad="27"/>
<connect gate="G$1" pin="28" pad="28"/>
<connect gate="G$1" pin="29" pad="29"/>
<connect gate="G$1" pin="3" pad="3"/>
<connect gate="G$1" pin="30" pad="30"/>
<connect gate="G$1" pin="31" pad="31"/>
<connect gate="G$1" pin="32" pad="32"/>
<connect gate="G$1" pin="33" pad="33"/>
<connect gate="G$1" pin="34" pad="34"/>
<connect gate="G$1" pin="35" pad="35"/>
<connect gate="G$1" pin="36" pad="36"/>
<connect gate="G$1" pin="37" pad="37"/>
<connect gate="G$1" pin="38" pad="38"/>
<connect gate="G$1" pin="39" pad="39"/>
<connect gate="G$1" pin="4" pad="4"/>
<connect gate="G$1" pin="40" pad="40"/>
<connect gate="G$1" pin="41" pad="41"/>
<connect gate="G$1" pin="42" pad="42"/>
<connect gate="G$1" pin="43" pad="43"/>
<connect gate="G$1" pin="44" pad="44"/>
<connect gate="G$1" pin="45" pad="45"/>
<connect gate="G$1" pin="46" pad="46"/>
<connect gate="G$1" pin="47" pad="47"/>
<connect gate="G$1" pin="48" pad="48"/>
<connect gate="G$1" pin="49" pad="49"/>
<connect gate="G$1" pin="5" pad="5"/>
<connect gate="G$1" pin="50" pad="50"/>
<connect gate="G$1" pin="51" pad="51"/>
<connect gate="G$1" pin="52" pad="52"/>
<connect gate="G$1" pin="53" pad="53"/>
<connect gate="G$1" pin="54" pad="54"/>
<connect gate="G$1" pin="55" pad="55"/>
<connect gate="G$1" pin="56" pad="56"/>
<connect gate="G$1" pin="57" pad="57"/>
<connect gate="G$1" pin="58" pad="58"/>
<connect gate="G$1" pin="59" pad="59"/>
<connect gate="G$1" pin="6" pad="6"/>
<connect gate="G$1" pin="60" pad="60"/>
<connect gate="G$1" pin="61" pad="61"/>
<connect gate="G$1" pin="62" pad="62"/>
<connect gate="G$1" pin="63" pad="63"/>
<connect gate="G$1" pin="64" pad="64"/>
<connect gate="G$1" pin="65" pad="65"/>
<connect gate="G$1" pin="66" pad="66"/>
<connect gate="G$1" pin="67" pad="67"/>
<connect gate="G$1" pin="68" pad="68"/>
<connect gate="G$1" pin="69" pad="69"/>
<connect gate="G$1" pin="7" pad="7"/>
<connect gate="G$1" pin="70" pad="70"/>
<connect gate="G$1" pin="8" pad="8"/>
<connect gate="G$1" pin="9" pad="9"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
<device name="_DF40REC" package="DF40-70REC">
<connects>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="10" pad="10"/>
<connect gate="G$1" pin="11" pad="11"/>
<connect gate="G$1" pin="12" pad="12"/>
<connect gate="G$1" pin="13" pad="13"/>
<connect gate="G$1" pin="14" pad="14"/>
<connect gate="G$1" pin="15" pad="15"/>
<connect gate="G$1" pin="16" pad="16"/>
<connect gate="G$1" pin="17" pad="17"/>
<connect gate="G$1" pin="18" pad="18"/>
<connect gate="G$1" pin="19" pad="19"/>
<connect gate="G$1" pin="2" pad="2"/>
<connect gate="G$1" pin="20" pad="20"/>
<connect gate="G$1" pin="21" pad="21"/>
<connect gate="G$1" pin="22" pad="22"/>
<connect gate="G$1" pin="23" pad="23"/>
<connect gate="G$1" pin="24" pad="24"/>
<connect gate="G$1" pin="25" pad="25"/>
<connect gate="G$1" pin="26" pad="26"/>
<connect gate="G$1" pin="27" pad="27"/>
<connect gate="G$1" pin="28" pad="28"/>
<connect gate="G$1" pin="29" pad="29"/>
<connect gate="G$1" pin="3" pad="3"/>
<connect gate="G$1" pin="30" pad="30"/>
<connect gate="G$1" pin="31" pad="31"/>
<connect gate="G$1" pin="32" pad="32"/>
<connect gate="G$1" pin="33" pad="33"/>
<connect gate="G$1" pin="34" pad="34"/>
<connect gate="G$1" pin="35" pad="35"/>
<connect gate="G$1" pin="36" pad="36"/>
<connect gate="G$1" pin="37" pad="37"/>
<connect gate="G$1" pin="38" pad="38"/>
<connect gate="G$1" pin="39" pad="39"/>
<connect gate="G$1" pin="4" pad="4"/>
<connect gate="G$1" pin="40" pad="40"/>
<connect gate="G$1" pin="41" pad="41"/>
<connect gate="G$1" pin="42" pad="42"/>
<connect gate="G$1" pin="43" pad="43"/>
<connect gate="G$1" pin="44" pad="44"/>
<connect gate="G$1" pin="45" pad="45"/>
<connect gate="G$1" pin="46" pad="46"/>
<connect gate="G$1" pin="47" pad="47"/>
<connect gate="G$1" pin="48" pad="48"/>
<connect gate="G$1" pin="49" pad="49"/>
<connect gate="G$1" pin="5" pad="5"/>
<connect gate="G$1" pin="50" pad="50"/>
<connect gate="G$1" pin="51" pad="51"/>
<connect gate="G$1" pin="52" pad="52"/>
<connect gate="G$1" pin="53" pad="53"/>
<connect gate="G$1" pin="54" pad="54"/>
<connect gate="G$1" pin="55" pad="55"/>
<connect gate="G$1" pin="56" pad="56"/>
<connect gate="G$1" pin="57" pad="57"/>
<connect gate="G$1" pin="58" pad="58"/>
<connect gate="G$1" pin="59" pad="59"/>
<connect gate="G$1" pin="6" pad="6"/>
<connect gate="G$1" pin="60" pad="60"/>
<connect gate="G$1" pin="61" pad="61"/>
<connect gate="G$1" pin="62" pad="62"/>
<connect gate="G$1" pin="63" pad="63"/>
<connect gate="G$1" pin="64" pad="64"/>
<connect gate="G$1" pin="65" pad="65"/>
<connect gate="G$1" pin="66" pad="66"/>
<connect gate="G$1" pin="67" pad="67"/>
<connect gate="G$1" pin="68" pad="68"/>
<connect gate="G$1" pin="69" pad="69"/>
<connect gate="G$1" pin="7" pad="7"/>
<connect gate="G$1" pin="70" pad="70"/>
<connect gate="G$1" pin="8" pad="8"/>
<connect gate="G$1" pin="9" pad="9"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
<device name="_DF40HEAD-EIB" package="DF40-70HEAD-EIB">
<connects>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="10" pad="10 P10"/>
<connect gate="G$1" pin="11" pad="11 P11"/>
<connect gate="G$1" pin="12" pad="12 P12"/>
<connect gate="G$1" pin="13" pad="13 P13"/>
<connect gate="G$1" pin="14" pad="14 P14"/>
<connect gate="G$1" pin="15" pad="15 P15"/>
<connect gate="G$1" pin="16" pad="16 P16"/>
<connect gate="G$1" pin="17" pad="17 P17"/>
<connect gate="G$1" pin="18" pad="18 P18"/>
<connect gate="G$1" pin="19" pad="19 P19"/>
<connect gate="G$1" pin="2" pad="2 P2"/>
<connect gate="G$1" pin="20" pad="20 P20"/>
<connect gate="G$1" pin="21" pad="21 P21"/>
<connect gate="G$1" pin="22" pad="22 P22"/>
<connect gate="G$1" pin="23" pad="23 P23"/>
<connect gate="G$1" pin="24" pad="24 P24"/>
<connect gate="G$1" pin="25" pad="25 P25"/>
<connect gate="G$1" pin="26" pad="26 P26"/>
<connect gate="G$1" pin="27" pad="27 P27"/>
<connect gate="G$1" pin="28" pad="28 P28"/>
<connect gate="G$1" pin="29" pad="29 P29"/>
<connect gate="G$1" pin="3" pad="3 P3"/>
<connect gate="G$1" pin="30" pad="30 P30"/>
<connect gate="G$1" pin="31" pad="31 P31"/>
<connect gate="G$1" pin="32" pad="32"/>
<connect gate="G$1" pin="33" pad="33"/>
<connect gate="G$1" pin="34" pad="34"/>
<connect gate="G$1" pin="35" pad="35"/>
<connect gate="G$1" pin="36" pad="36"/>
<connect gate="G$1" pin="37" pad="37 P37"/>
<connect gate="G$1" pin="38" pad="38 P38"/>
<connect gate="G$1" pin="39" pad="39 P39"/>
<connect gate="G$1" pin="4" pad="4 P4"/>
<connect gate="G$1" pin="40" pad="40 P40"/>
<connect gate="G$1" pin="41" pad="41 P41"/>
<connect gate="G$1" pin="42" pad="42 P42"/>
<connect gate="G$1" pin="43" pad="43 P43"/>
<connect gate="G$1" pin="44" pad="44 P44"/>
<connect gate="G$1" pin="45" pad="45 P45"/>
<connect gate="G$1" pin="46" pad="46 P46"/>
<connect gate="G$1" pin="47" pad="47 P47"/>
<connect gate="G$1" pin="48" pad="48 P48"/>
<connect gate="G$1" pin="49" pad="49 P49"/>
<connect gate="G$1" pin="5" pad="5 P5"/>
<connect gate="G$1" pin="50" pad="50 P50"/>
<connect gate="G$1" pin="51" pad="51 P51"/>
<connect gate="G$1" pin="52" pad="52 P52"/>
<connect gate="G$1" pin="53" pad="53 P53"/>
<connect gate="G$1" pin="54" pad="54 P54"/>
<connect gate="G$1" pin="55" pad="55 P55"/>
<connect gate="G$1" pin="56" pad="56 P56"/>
<connect gate="G$1" pin="57" pad="57 P57"/>
<connect gate="G$1" pin="58" pad="58 P58"/>
<connect gate="G$1" pin="59" pad="59 P59"/>
<connect gate="G$1" pin="6" pad="6 P6"/>
<connect gate="G$1" pin="60" pad="60 P60"/>
<connect gate="G$1" pin="61" pad="61 P61"/>
<connect gate="G$1" pin="62" pad="62 P62"/>
<connect gate="G$1" pin="63" pad="63 P63"/>
<connect gate="G$1" pin="64" pad="64 P64"/>
<connect gate="G$1" pin="65" pad="65"/>
<connect gate="G$1" pin="66" pad="66"/>
<connect gate="G$1" pin="67" pad="67"/>
<connect gate="G$1" pin="68" pad="68"/>
<connect gate="G$1" pin="69" pad="69"/>
<connect gate="G$1" pin="7" pad="7 P7"/>
<connect gate="G$1" pin="70" pad="70"/>
<connect gate="G$1" pin="8" pad="8 P8"/>
<connect gate="G$1" pin="9" pad="9 P9"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
<deviceset name="TETRODE" uservalue="yes">
<gates>
<gate name="G$1" symbol="TETRODE" x="-5.08" y="0"/>
</gates>
<devices>
<device name="_128_0.5ID_0.7OD" package="TETRODE_128_0.5ID_0.7OD">
<connects>
<connect gate="G$1" pin="0" pad="0"/>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="2" pad="2"/>
<connect gate="G$1" pin="3" pad="3"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
<device name="_256_0.3ID_0.5OD" package="TETRODE_256_0.3ID_0.5OD">
<connects>
<connect gate="G$1" pin="0" pad="0"/>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="2" pad="2"/>
<connect gate="G$1" pin="3" pad="3"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
<device name="_0.3ID_LINEAR" package="TETRODE_0.3ID_LINEAR">
<connects>
<connect gate="G$1" pin="0" pad="0"/>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="2" pad="2"/>
<connect gate="G$1" pin="3" pad="3"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
<device name="_0.3ID_LINEAR_MOUSE" package="TETRODE_0.3ID_LINEAR_MOUSE">
<connects>
<connect gate="G$1" pin="0" pad="0"/>
<connect gate="G$1" pin="1" pad="1"/>
<connect gate="G$1" pin="2" pad="2"/>
<connect gate="G$1" pin="3" pad="3"/>
</connects>
<technologies>
<technology name=""/>
</technologies>
</device>
</devices>
</deviceset>
</devicesets>
</library>
</libraries>
<attributes>
<attribute name="DESIGNER" value="JON NEWMAN"/>
<attribute name="DESIGN_NAME" value="EIB-64"/>
<attribute name="LICENSE" value="CERN OHL v1.2"/>
<attribute name="REVISION" value="1.0"/>
</attributes>
<variantdefs>
</variantdefs>
<classes>
<class number="0" name="default" width="0" drill="0">
</class>
</classes>
<parts>
<part name="ESTIM" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="SUPPLY1" library="jonnew" deviceset="GND" device=""/>
<part name="FRAME1" library="jonnew" deviceset="FRAME" device=""/>
<part name="U$2" library="jonnew" deviceset="DOCFIELD-GEN" device=""/>
<part name="GND0" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="GND1" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="SUPPLY9" library="jonnew" deviceset="GND" device=""/>
<part name="CAT0" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="CAT1" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="AN" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="REF" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="SHLD_A" library="jonnew" deviceset="GOLDPIN" device="_0.5ID_0.7OD" value="LRG_GP"/>
<part name="U$1" library="jonnew" deviceset="PINHD-2X35" device="_DF40REC"/>
<part name="TET0" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="0"/>
<part name="TET1" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="1"/>
<part name="TET2" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="2"/>
<part name="TET3" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="3"/>
<part name="TET4" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="4"/>
<part name="TET5" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="5"/>
<part name="TET6" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="6"/>
<part name="TET7" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="7"/>
<part name="TET8" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="8"/>
<part name="TET9" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="9"/>
<part name="TET10" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="10"/>
<part name="TET11" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="11"/>
<part name="TET12" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="12"/>
<part name="TET13" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="13"/>
<part name="TET14" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="14"/>
<part name="TET15" library="jonnew" deviceset="TETRODE" device="_0.3ID_LINEAR_MOUSE" value="15"/>
</parts>
<sheets>
<sheet>
<plain>
</plain>
<instances>
<instance part="ESTIM" gate="G$1" x="228.6" y="185.42" rot="R90"/>
<instance part="SUPPLY1" gate="PE" x="254" y="127"/>
<instance part="FRAME1" gate="G$1" x="-2.54" y="2.54"/>
<instance part="U$2" gate="G$1" x="271.78" y="2.54"/>
<instance part="GND0" gate="G$1" x="312.42" y="139.7" rot="MR90"/>
<instance part="GND1" gate="G$1" x="317.5" y="139.7" rot="MR90"/>
<instance part="SUPPLY9" gate="PE" x="312.42" y="132.08"/>
<instance part="CAT0" gate="G$1" x="144.78" y="185.42" rot="R90"/>
<instance part="CAT1" gate="G$1" x="142.24" y="185.42" rot="R90"/>
<instance part="AN" gate="G$1" x="142.24" y="124.46" rot="R270"/>
<instance part="REF" gate="G$1" x="226.06" y="124.46" rot="R270"/>
<instance part="SHLD_A" gate="G$1" x="228.6" y="124.46" rot="MR270"/>
<instance part="U$1" gate="G$1" x="228.6" y="154.94" rot="R180"/>
<instance part="TET0" gate="G$1" x="180.34" y="124.46" rot="MR270"/>
<instance part="TET1" gate="G$1" x="170.18" y="124.46" rot="MR270"/>
<instance part="TET2" gate="G$1" x="160.02" y="124.46" rot="MR270"/>
<instance part="TET3" gate="G$1" x="149.86" y="124.46" rot="MR270"/>
<instance part="TET4" gate="G$1" x="152.4" y="185.42" rot="R90"/>
<instance part="TET5" gate="G$1" x="162.56" y="185.42" rot="R90"/>
<instance part="TET6" gate="G$1" x="172.72" y="185.42" rot="R90"/>
<instance part="TET7" gate="G$1" x="182.88" y="185.42" rot="R90"/>
<instance part="TET8" gate="G$1" x="190.5" y="185.42" rot="MR90"/>
<instance part="TET9" gate="G$1" x="200.66" y="185.42" rot="MR90"/>
<instance part="TET10" gate="G$1" x="210.82" y="185.42" rot="MR90"/>
<instance part="TET11" gate="G$1" x="220.98" y="185.42" rot="MR90"/>
<instance part="TET12" gate="G$1" x="218.44" y="124.46" rot="R270"/>
<instance part="TET13" gate="G$1" x="208.28" y="124.46" rot="R270"/>
<instance part="TET14" gate="G$1" x="198.12" y="124.46" rot="R270"/>
<instance part="TET15" gate="G$1" x="187.96" y="124.46" rot="R270"/>
</instances>
<busses>
</busses>
<nets>
<net name="N$199" class="0">
<segment>
<wire x1="147.32" y1="185.42" x2="147.32" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="33"/>
<pinref part="TET4" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$200" class="0">
<segment>
<wire x1="149.86" y1="185.42" x2="149.86" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="32"/>
<pinref part="TET4" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$201" class="0">
<segment>
<wire x1="152.4" y1="185.42" x2="152.4" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="31"/>
<pinref part="TET4" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$202" class="0">
<segment>
<wire x1="154.94" y1="185.42" x2="154.94" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="30"/>
<pinref part="TET4" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$203" class="0">
<segment>
<wire x1="157.48" y1="185.42" x2="157.48" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="29"/>
<pinref part="TET5" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$204" class="0">
<segment>
<wire x1="160.02" y1="185.42" x2="160.02" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="28"/>
<pinref part="TET5" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$205" class="0">
<segment>
<wire x1="162.56" y1="185.42" x2="162.56" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="27"/>
<pinref part="TET5" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$206" class="0">
<segment>
<wire x1="165.1" y1="185.42" x2="165.1" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="26"/>
<pinref part="TET5" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$207" class="0">
<segment>
<wire x1="167.64" y1="185.42" x2="167.64" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="25"/>
<pinref part="TET6" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$208" class="0">
<segment>
<wire x1="170.18" y1="185.42" x2="170.18" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="24"/>
<pinref part="TET6" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$209" class="0">
<segment>
<wire x1="172.72" y1="185.42" x2="172.72" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="23"/>
<pinref part="TET6" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$210" class="0">
<segment>
<wire x1="175.26" y1="185.42" x2="175.26" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="22"/>
<pinref part="TET6" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$211" class="0">
<segment>
<wire x1="177.8" y1="185.42" x2="177.8" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="21"/>
<pinref part="TET7" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$212" class="0">
<segment>
<wire x1="180.34" y1="185.42" x2="180.34" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="20"/>
<pinref part="TET7" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$213" class="0">
<segment>
<wire x1="182.88" y1="185.42" x2="182.88" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="19"/>
<pinref part="TET7" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$214" class="0">
<segment>
<wire x1="185.42" y1="185.42" x2="185.42" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="18"/>
<pinref part="TET7" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$215" class="0">
<segment>
<wire x1="187.96" y1="185.42" x2="187.96" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="17"/>
<pinref part="TET8" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$216" class="0">
<segment>
<wire x1="190.5" y1="185.42" x2="190.5" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="16"/>
<pinref part="TET8" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$217" class="0">
<segment>
<wire x1="193.04" y1="185.42" x2="193.04" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="15"/>
<pinref part="TET8" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$218" class="0">
<segment>
<wire x1="195.58" y1="185.42" x2="195.58" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="14"/>
<pinref part="TET8" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$219" class="0">
<segment>
<wire x1="198.12" y1="185.42" x2="198.12" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="13"/>
<pinref part="TET9" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$220" class="0">
<segment>
<wire x1="200.66" y1="185.42" x2="200.66" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="12"/>
<pinref part="TET9" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$221" class="0">
<segment>
<wire x1="203.2" y1="185.42" x2="203.2" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="11"/>
<pinref part="TET9" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$222" class="0">
<segment>
<wire x1="205.74" y1="185.42" x2="205.74" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="10"/>
<pinref part="TET9" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$223" class="0">
<segment>
<wire x1="208.28" y1="185.42" x2="208.28" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="9"/>
<pinref part="TET10" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$224" class="0">
<segment>
<wire x1="210.82" y1="185.42" x2="210.82" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="8"/>
<pinref part="TET10" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$225" class="0">
<segment>
<wire x1="213.36" y1="185.42" x2="213.36" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="7"/>
<pinref part="TET10" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$226" class="0">
<segment>
<wire x1="215.9" y1="185.42" x2="215.9" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="6"/>
<pinref part="TET10" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$33" class="0">
<segment>
<wire x1="218.44" y1="185.42" x2="218.44" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="5"/>
<pinref part="TET11" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$34" class="0">
<segment>
<wire x1="220.98" y1="185.42" x2="220.98" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="4"/>
<pinref part="TET11" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$35" class="0">
<segment>
<wire x1="223.52" y1="185.42" x2="223.52" y2="162.56" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="3"/>
<pinref part="TET11" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$31" class="0">
<segment>
<wire x1="147.32" y1="124.46" x2="147.32" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="38"/>
<pinref part="TET3" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$30" class="0">
<segment>
<wire x1="149.86" y1="124.46" x2="149.86" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="39"/>
<pinref part="TET3" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$29" class="0">
<segment>
<wire x1="152.4" y1="124.46" x2="152.4" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="40"/>
<pinref part="TET3" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$28" class="0">
<segment>
<wire x1="154.94" y1="124.46" x2="154.94" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="41"/>
<pinref part="TET2" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$27" class="0">
<segment>
<wire x1="157.48" y1="124.46" x2="157.48" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="42"/>
<pinref part="TET2" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$26" class="0">
<segment>
<wire x1="160.02" y1="124.46" x2="160.02" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="43"/>
<pinref part="TET2" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$25" class="0">
<segment>
<wire x1="162.56" y1="124.46" x2="162.56" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="44"/>
<pinref part="TET2" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$24" class="0">
<segment>
<wire x1="165.1" y1="124.46" x2="165.1" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="45"/>
<pinref part="TET1" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$23" class="0">
<segment>
<wire x1="167.64" y1="124.46" x2="167.64" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="46"/>
<pinref part="TET1" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$22" class="0">
<segment>
<wire x1="170.18" y1="124.46" x2="170.18" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="47"/>
<pinref part="TET1" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$21" class="0">
<segment>
<wire x1="172.72" y1="124.46" x2="172.72" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="48"/>
<pinref part="TET1" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$20" class="0">
<segment>
<wire x1="175.26" y1="124.46" x2="175.26" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="49"/>
<pinref part="TET0" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$19" class="0">
<segment>
<wire x1="177.8" y1="124.46" x2="177.8" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="50"/>
<pinref part="TET0" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$18" class="0">
<segment>
<wire x1="180.34" y1="124.46" x2="180.34" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="51"/>
<pinref part="TET0" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$17" class="0">
<segment>
<wire x1="182.88" y1="124.46" x2="182.88" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="52"/>
<pinref part="TET0" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$16" class="0">
<segment>
<wire x1="185.42" y1="124.46" x2="185.42" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="53"/>
<pinref part="TET15" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$15" class="0">
<segment>
<wire x1="187.96" y1="124.46" x2="187.96" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="54"/>
<pinref part="TET15" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$14" class="0">
<segment>
<wire x1="190.5" y1="124.46" x2="190.5" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="55"/>
<pinref part="TET15" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$13" class="0">
<segment>
<wire x1="193.04" y1="124.46" x2="193.04" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="56"/>
<pinref part="TET15" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$12" class="0">
<segment>
<wire x1="195.58" y1="124.46" x2="195.58" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="57"/>
<pinref part="TET14" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$11" class="0">
<segment>
<wire x1="198.12" y1="124.46" x2="198.12" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="58"/>
<pinref part="TET14" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$10" class="0">
<segment>
<wire x1="200.66" y1="124.46" x2="200.66" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="59"/>
<pinref part="TET14" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$9" class="0">
<segment>
<wire x1="203.2" y1="124.46" x2="203.2" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="60"/>
<pinref part="TET14" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$8" class="0">
<segment>
<wire x1="205.74" y1="124.46" x2="205.74" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="61"/>
<pinref part="TET13" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$7" class="0">
<segment>
<wire x1="208.28" y1="124.46" x2="208.28" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="62"/>
<pinref part="TET13" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$6" class="0">
<segment>
<wire x1="210.82" y1="124.46" x2="210.82" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="63"/>
<pinref part="TET13" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$5" class="0">
<segment>
<wire x1="213.36" y1="124.46" x2="213.36" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="64"/>
<pinref part="TET13" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$4" class="0">
<segment>
<wire x1="215.9" y1="124.46" x2="215.9" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="65"/>
<pinref part="TET12" gate="G$1" pin="3"/>
</segment>
</net>
<net name="N$3" class="0">
<segment>
<wire x1="218.44" y1="124.46" x2="218.44" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="66"/>
<pinref part="TET12" gate="G$1" pin="2"/>
</segment>
</net>
<net name="N$2" class="0">
<segment>
<wire x1="220.98" y1="124.46" x2="220.98" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="67"/>
<pinref part="TET12" gate="G$1" pin="1"/>
</segment>
</net>
<net name="N$1" class="0">
<segment>
<wire x1="223.52" y1="124.46" x2="223.52" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="68"/>
<pinref part="TET12" gate="G$1" pin="0"/>
</segment>
</net>
<net name="N$36" class="0">
<segment>
<wire x1="226.06" y1="162.56" x2="226.06" y2="185.42" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="2"/>
<pinref part="TET11" gate="G$1" pin="0"/>
</segment>
</net>
<net name="REF" class="0">
<segment>
<pinref part="REF" gate="G$1" pin="0"/>
<wire x1="226.06" y1="147.32" x2="226.06" y2="124.46" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="69"/>
</segment>
</net>
<net name="N$32" class="0">
<segment>
<wire x1="144.78" y1="124.46" x2="144.78" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="37"/>
<pinref part="TET3" gate="G$1" pin="0"/>
</segment>
</net>
<net name="GND" class="0">
<segment>
<pinref part="SUPPLY1" gate="PE" pin="GND"/>
<wire x1="254" y1="139.7" x2="254" y2="129.54" width="0.1524" layer="91"/>
<wire x1="228.6" y1="147.32" x2="228.6" y2="139.7" width="0.1524" layer="91"/>
<wire x1="228.6" y1="139.7" x2="254" y2="139.7" width="0.1524" layer="91"/>
<pinref part="SHLD_A" gate="G$1" pin="0"/>
<wire x1="228.6" y1="124.46" x2="228.6" y2="139.7" width="0.1524" layer="91"/>
<junction x="228.6" y="139.7"/>
<pinref part="U$1" gate="G$1" pin="70"/>
</segment>
<segment>
<pinref part="GND0" gate="G$1" pin="0"/>
<pinref part="SUPPLY9" gate="PE" pin="GND"/>
<wire x1="312.42" y1="139.7" x2="312.42" y2="137.16" width="0.1524" layer="91"/>
<wire x1="312.42" y1="137.16" x2="312.42" y2="134.62" width="0.1524" layer="91"/>
<wire x1="312.42" y1="137.16" x2="317.5" y2="137.16" width="0.1524" layer="91"/>
<junction x="312.42" y="137.16"/>
<pinref part="GND1" gate="G$1" pin="0"/>
<wire x1="317.5" y1="137.16" x2="317.5" y2="139.7" width="0.1524" layer="91"/>
</segment>
</net>
<net name="CAT" class="0">
<segment>
<pinref part="CAT0" gate="G$1" pin="0"/>
<wire x1="144.78" y1="162.56" x2="144.78" y2="185.42" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="34"/>
</segment>
</net>
<net name="CAT1" class="0">
<segment>
<pinref part="CAT1" gate="G$1" pin="0"/>
<wire x1="142.24" y1="162.56" x2="142.24" y2="185.42" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="35"/>
</segment>
</net>
<net name="AN" class="0">
<segment>
<pinref part="AN" gate="G$1" pin="0"/>
<wire x1="142.24" y1="124.46" x2="142.24" y2="147.32" width="0.1524" layer="91"/>
<pinref part="U$1" gate="G$1" pin="36"/>
</segment>
</net>
<net name="ESTIM" class="0">
<segment>
<wire x1="228.6" y1="185.42" x2="228.6" y2="162.56" width="0.1524" layer="91"/>
<pinref part="ESTIM" gate="G$1" pin="0"/>
<pinref part="U$1" gate="G$1" pin="1"/>
</segment>
</net>
</nets>
</sheet>
</sheets>
</schematic>
</drawing>
</eagle>

license: MIT

license_type: permissive

branch_name: refs/heads/master


text:
package adt

import (
	"github.com/ipfs/go-cid"

	"github.com/filecoin-project/go-state-types/abi"
	"github.com/filecoin-project/go-state-types/cbor"
)

type Map interface {
	Root() (cid.Cid, error)

	Put(k abi.Keyer, v cbor.Marshaler) error
	Get(k abi.Keyer, v cbor.Unmarshaler) (bool, error)
	Delete(k abi.Keyer) error

	ForEach(v cbor.Unmarshaler, fn func(key string) error) error
}

type Array interface {
	Root() (cid.Cid, error)

	Set(idx uint64, v cbor.Marshaler) error
	Get(idx uint64, v cbor.Unmarshaler) (bool, error)
	Delete(idx uint64) error
	Length() uint64

	ForEach(v cbor.Unmarshaler, fn func(idx int64) error) error
}

repository: filecoin-project/lotus

repo_name: filecoin-project/lotus

gha_license_id: NOASSERTION

gha_language: Go

extension: go


text:
package googlepubsub

import (
	"github.com/micro/go-micro/broker"
	"golang.org/x/net/context"
	"google.golang.org/api/option"
)

type clientOptionKey struct{}

type projectIDKey struct{}

// ClientOption is a broker Option which allows google pubsub client options to be
// set for the client
func ClientOption(c ...option.ClientOption) broker.Option {
	return func(o *broker.Options) {
		if o.Context == nil {
			o.Context = context.Background()
		}
		o.Context = context.WithValue(o.Context, clientOptionKey{}, c)
	}
}

// ProjectID provides an option which sets the google project id
func ProjectID(id string) broker.Option {
	return func(o *broker.Options) {
		if o.Context == nil {
			o.Context = context.Background()
		}
		o.Context = context.WithValue(o.Context, projectIDKey{}, id)
	}
}


text:
file(REMOVE_RECURSE
  "CMakeFiles/BinaryTree1_2.dir/main.cpp.o"
  "BinaryTree1_2.pdb"
  "BinaryTree1_2"
)

# Per-language clean rules from dependency scanning.
foreach(lang CXX)
  include(CMakeFiles/BinaryTree1_2.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

repository: ililk/CUGSE

repo_name: ililk/CUGSE

extension: cmake


text:
# SPDX-License-Identifier: Apache-2.0

board_set_flasher_ifnset(esp32)
board_set_debugger_ifnset(openocd)

board_runner_args(openocd  --no-init --no-halt --no-targets --no-load)
board_runner_args(openocd  --gdb-init "set remote hardware-watchpoint-limit 2")

board_runner_args(openocd  --gdb-init "flushregs")
board_runner_args(openocd  --gdb-init "mon reset halt")
board_runner_args(openocd  --gdb-init "thb main")

set(ESP_IDF_PATH ${ZEPHYR_HAL_ESPRESSIF_MODULE_DIR})
assert(ESP_IDF_PATH "ESP_IDF_PATH is not set")

board_finalize_runner_args(esp32 "--esp-idf-path=${ESP_IDF_PATH}")

repository: intel/zephyr

repo_name: intel/zephyr

branch_name: refs/heads/main

gha_language: C


text:
---
---
@article{dirgnn_rossi_2023,
    title={Edge Directionality Improves Learning on Heterophilic Graphs},
    author={Emanuele Rossi and Bertrand Charpentier and Francesco Di Giovanni and Fabrizio Frasca and Stephan Günnemann and Michael M. Bronstein},
    year={2023},
    journal={arXiv},
    arXiv={2305.10498},
    abbr={arXiv},
    code={https://github.com/emalgorithm/directed-graph-neural-network},
    blog={https://towardsdatascience.com/direction-improves-graph-learning-170e797e94fe},
    selected={true},
    preview={dir-gnn.png},
}

@article{chamberlain2022lpsketching,
    title={Graph Neural Networks for Link Prediction with Subgraph Sketching},
    author={Ben Chamberlain and Sergey Shirobokov and Emanuele Rossi and Fabrizio Frasca and Thomas Markovich and Nils Hammerla and Michael M. Bronstein and Max Hansmire},
    year={2022},
    journal={International Conference on Learning Representations (ICLR)},
    arXiv={2209.15486},
    abbr={ICLR},
    code={https://github.com/melifluos/subgraph-sketching},
    selected={true},
    preview={lp.png},
    video={https://www.youtube.com/watch?v=TPqR1xG9wgY}
}

@article{mutti2022causalrl,
    title={Provably Efficient Causal Model-Based Reinforcement Learning for Systematic Generalization},
    author={Mirco Mutti and Riccardo De Santi and Emanuele Rossi and Juan Felipe Calderon and Michael M. Bronstein and Marcello Restelli},
    year={2022},
    journal={Proceedings of the AAAI Conference on Artificial Intelligence},
    arXiv={2202.06545},
    preview={causal_rl.png},
    abbr={AAAI},
}

@article{rossi2022networkgames,
    title={Learning to Infer Structures of Network Games},
    author={Emanuele Rossi and Federico Monti and Yan Leng and Michael M. Bronstein and Xiaowen Dong},
    year={2022},
    journal={Proceedings of the 39th International Conference on Machine Learning,
               {ICML}},
    arXiv={2206.08119},
    abbr={ICML},
    blog={https://towardsdatascience.com/learning-network-games-29970aee44bb},
    preview={network_games.webp},
}

@article{rossi2021fp,
    title={On the Unreasonable Effectiveness of Feature propagation in Learning on Graphs with Missing Node Features},
    author={Emanuele Rossi and Henry Kenlay and Maria I. Gorinova and Ben Chamberlain and Xiaowen Dong and Michael M. Bronstein},
    year={2022},
    journal={Learning on Graphs Conference},
    arXiv={2111.12128},
    abbr={LoG},
    code={https://github.com/twitter-research/feature-propagation},
    slides={feature_propagation.pdf},
    blog={https://towardsdatascience.com/learning-on-graphs-with-missing-features-dd34be61b06},
    preview={fp.png},
}

@article{chamberlain2021grand,
    title={GRAND: Graph Neural Diffusion},
    author={Ben Chamberlain and James Rowbottom and Maria I. Gorinova and Stefan D. Webb and Emanuele Rossi and Michael M. Bronstein},
    year={2021},
    journal={Proceedings of the 38th International Conference on Machine Learning,
               {ICML}},
    arXiv={2106.10934},
    abbr={ICML},
    code={https://github.com/twitter-research/graph-neural-pde},
    blog={https://blog.twitter.com/engineering/en_us/topics/insights/2021/graph-neural-networks-as-neural-diffusion-pdes},
    preview={grand.png},

}

@article{chamberlain2020word2vec,
    title={Tuning Word2vec for Large Scale Recommendation Systems},
    author={Ben Chamberlain and Emanuele Rossi and Dan Shiebler and Suvash Sedhain and Michael Bronstein},
    year={2020},
    abbr={RecSys},
    journal={RecSys - 14th ACM Conference on Recommender Systems},
    arXiv={2009.12192},
    preview={word2vec.png},
}

@article{rossi2020tgn,
    title={Temporal Graph Networks for Deep Learning on Dynamic Graphs},
    author={Emanuele Rossi and Ben Chamberlain and Fabrizio Frasca and Davide Eynard and Federico Monti and Michael Bronstein},
    year={2020},
    journal={ICML Workshop on Graph Representation Learning},
    arXiv={2006.10637},
    abbr={ICML},
    code={https://github.com/twitter-research/tgn},
    slides={tgn_aisc_2020.pdf},
    blog={https://towardsdatascience.com/temporal-graph-networks-ab8f327f2efe},
    selected={true},
    preview={tgn.png},
}

@article{rossi2020sign,
    title={SIGN: Scalable Inception Graph Neural Networks},
    author={Emanuele Rossi and Fabrizio Frasca and Ben Chamberlain and Davide Eynard and Michael Bronstein and Federico Monti},
    year={2020},
    journal={ICML Workshop on Graph Representation Learning},
    arXiv={2004.11198},
    abbr={ICML},
    code={https://pytorch-geometric.readthedocs.io/en/latest/_modules/torch_geometric/transforms/sign.html},
    blog={https://towardsdatascience.com/simple-scalable-graph-neural-networks-7eb04f366d07},
    selected={true},
    preview={sign.png},
}

@article{rossi2019ncrna,
    title={ncRNA Classification with Graph Convolutional Networks},
    author={Emanuele Rossi and Federico Monti and Michael Bronstein and Pietro Li{\`o}},
    journal={KDD Workshop on Deep Learning on Graphs},
    year={2019},
    arXiv={1905.06515},
    abbr={KDD},
    code={https://github.com/emalgorithm/ncRNA-family-prediction},
    preview={rna.png},
}

gha_license_id: MIT

gha_language: CSS

extension: bib


text:
package westcrm

import (
	"encoding/xml"

	"github.com/bububa/opentaobao/model"
)

// AlibabaWestcrmShopListGetAPIResponse 获取商圈商户信息列表 API返回值
// alibaba.westcrm.shop.list.get
//
// 获取商圈商户信息列表
type AlibabaWestcrmShopListGetAPIResponse struct {
	model.CommonResponse
	AlibabaWestcrmShopListGetAPIResponseModel
}

// AlibabaWestcrmShopListGetAPIResponseModel is 获取商圈商户信息列表 成功返回结果
type AlibabaWestcrmShopListGetAPIResponseModel struct {
	XMLName xml.Name `xml:"alibaba_westcrm_shop_list_get_response"`
	// 平台颁发的每次请求访问的唯一标识
	RequestId string `json:"request_id,omitempty" xml:"request_id,omitempty"`
	// 返回对象封装
	Result *DataResult `json:"result,omitempty" xml:"result,omitempty"`
}

repository: wp-jackliu/opentaobao

repo_name: wp-jackliu/opentaobao


text:
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=7becf906c8f8d03c237bad13bc3dac53"
inherit meson pkgconfig systemd

PACKAGECONFIG ??= ""
PACKAGECONFIG[libpeci] = "-Dlibpeci=enabled,-Dlibpeci=disabled"
PACKAGECONFIG[crashdump] = "-Dcrashdump=enabled,-Dcrashdump=disabled"

SRC_URI = "git://github.com/openbmc/host-error-monitor;branch=master;protocol=https"

DEPENDS = "boost sdbusplus libgpiod libpeci"

PV = "0.1+git${SRCPV}"
SRCREV = "2fb7f92ccb3043e688d7d43ae7bc805b2307fd8a"

S = "${WORKDIR}/git"

SYSTEMD_SERVICE:${PN} += "xyz.openbmc_project.HostErrorMonitor.service"

repository: openbmc/openbmc

repo_name: openbmc/openbmc

gha_language: Python

extension: bb


text:
include ipc-transport-qmss.inc

DEPENDS = "ti-ipc mpm-transport"

do_compile () {
#   Now build the transport
	oe_runmake clean
	oe_runmake lib
}

do_install () {
	oe_runmake install INSTALL_INC_BASE_DIR=${D}${includedir} \
		INSTALL_LIB_BASE_DIR=${D}${libdir}
}

repository: joelagnel/meta-ti

repo_name: joelagnel/meta-ti


text:
package main

import (
	"bytes"
	"encoding/hex"
	"errors"
	"fmt"
	"log"
	"math"
	"math/rand"
	"strconv"
	"strings"

	"github.com/peterstace/simplefeatures/geom"
	"github.com/peterstace/simplefeatures/geos"
)

func unaryChecks(h *Handle, g geom.Geometry, log *log.Logger) error {
	if valid, err := checkIsValid(h, g, log); err != nil {
		return err
	} else if !valid {
		return nil
	}

	log.Println("checking AsBinary")
	if err := checkAsBinary(h, g, log); err != nil {
		return err
	}
	log.Println("checking FromBinary")
	if err := checkFromBinary(h, g, log); err != nil {
		return err
	}
	log.Println("checking AsText")
	if err := checkAsText(h, g, log); err != nil {
		return err
	}
	log.Println("checking FromText")
	if err := checkFromText(h, g, log); err != nil {
		return err
	}
	log.Println("checking IsEmpty")
	if err := checkIsEmpty(h, g, log); err != nil {
		return err
	}
	log.Println("checking Dimension")
	if err := checkDimension(h, g, log); err != nil {
		return err
	}
	log.Println("checking Envelope")
	if err := checkEnvelope(h, g, log); err != nil {
		return err
	}
	log.Println("checking IsSimple")
	if err := checkIsSimple(h, g, log); err != nil {
		return err
	}
	log.Println("checking Boundary")
	if err := checkBoundary(h, g, log); err != nil {
		return err
	}
	log.Println("checking ConvexHull")
	if err := checkConvexHull(h, g, log); err != nil {
		return err
	}
	log.Println("checking IsRing")
	if err := checkIsRing(h, g, log); err != nil {
		return err
	}
	log.Println("checking Length")
	if err := checkLength(h, g, log); err != nil {
		return err
	}
	log.Println("checking Area")
	if err := checkArea(h, g, log); err != nil {
		return err
	}
	log.Println("checking Centroid")
	if err := checkCentroid(h, g, log); err != nil {
		return err
	}
	log.Println("checking PointOnSurface")
	if err := checkPointOnSurface(h, g, log); err != nil {
		return err
	}
	log.Println("checking Simplify")
	if err := checkSimplify(h, g, log); err != nil {
		return err
	}

	return nil

	// TODO: Reverse isn't checked yet. There is some significant behaviour
	// differences between libgeos and PostGIS.
}

var errMismatch = errors.New("mismatch")

func checkIsValid(h *Handle, g geom.Geometry, log *log.Logger) (bool, error) {
	wkb := g.AsBinary()
	var validAsPerSimpleFeatures bool
	if _, err := geom.UnmarshalWKB(wkb); err == nil {
		validAsPerSimpleFeatures = true
	}
	log.Printf("Valid as per simplefeatures: %v", validAsPerSimpleFeatures)

	validAsPerLibgeos, err := h.isValid(g)
	if err != nil {
		// The geometry is _so_ invalid that libgeos can't even tell if it's
		// invalid or not.
		validAsPerLibgeos = false
	}
	log.Printf("Valid as per libgeos: %v", validAsPerLibgeos)

	// libgeos allows empty rings in Polygons, however simplefeatures doesn't
	// (it follows the PostGIS behaviour of disallowing empty rings).
	ignoreMismatch := hasEmptyRing(g)

	if !ignoreMismatch && validAsPerLibgeos != validAsPerSimpleFeatures {
		return false, errMismatch
	}
	return validAsPerSimpleFeatures, nil
}

func checkAsText(h *Handle, g geom.Geometry, log *log.Logger) error {
	// Skip any geometries that have a non-empty Point within a MultiPoint.
	// Libgeos erroneously produces WKT with missing parenthesis around each
	// non-empty point.
	if containsNonEmptyPointInMultiPoint(g) {
		return nil
	}

	// Skip any geometries that are collections or contain collections that
	// only contain empty geometries. Libgeos will render WKT for these
	// collections as being EMPTY, however this isn't correct behaviour.
	if containsCollectionWithOnlyEmptyElements(g) {
		return nil
	}

	// Skip geometries that GEOS is known to produce incorrect WKT for due to numerical rounding issues.
	if map[string]bool{
		"POLYGON((0.9292893218813453 1.0707106781186548,1 1.1414213562373097,1.1414213562373097 1,0.07071067811865475 -0.07071067811865475,0 -0.1414213562373095,-0.1414213562373095 -0.000000000000000013877787807814457,0.9292893218813453 1.0707106781186548))": true,
	}[g.AsText()] {
		return nil
	}

	want, err := h.asText(g)
	if err != nil {
		return err
	}

	// Account for easy-to-adjust for acceptable spacing differences between
	// libgeos and simplefeatures.
	want = strings.ReplaceAll(want, " (", "(")
	want = strings.ReplaceAll(want, ", ", ",")

	got := g.AsText()

	if err := wktsEqual(got, want); err != nil {
		log.Printf("WKTs not equal: %v", err)
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

func wktsEqual(wktA, wktB string) error {
	toksA := tokenizeWKT(wktA)
	toksB := tokenizeWKT(wktB)
	if len(toksA) != len(toksB) {
		return fmt.Errorf(
			"token lengths differ: %d vs %d",
			len(toksA), len(toksB),
		)
	}
	for i, tokA := range toksA {
		tokB := toksB[i]
		fA, errA := strconv.ParseFloat(tokA, 64)
		fB, errB := strconv.ParseFloat(tokA, 64)
		var eq bool
		if errA == nil && errB == nil {
			// If this check gives false negatives (e.g. libgeos and
			// simplefeatures may use slightly different precision), then we
			// can always check a relative difference here instead of a strict
			// ==.
			eq = fA == fB
		} else {
			eq = tokA == tokB
		}
		if !eq {
			return fmt.Errorf(
				"tokens at position %d differ: %s vs %s",
				i, tokA, tokB,
			)
		}
	}
	return nil
}

func checkFromText(h *Handle, g geom.Geometry, log *log.Logger) error {
	// libgeos is unable to parse MultiPoints if the *first* Point is empty. It
	// gives the following error: ParseException: Unexpected token: WORD EMPTY.
	// Skip the check in that case.
	if g.IsMultiPoint() &&
		g.MustAsMultiPoint().NumPoints() > 0 &&
		g.MustAsMultiPoint().PointN(0).IsEmpty() {
		return nil
	}

	wkt := g.AsText()
	want, err := h.fromText(wkt)
	if err != nil {
		return err
	}

	got, err := geom.UnmarshalWKT(wkt)
	if err != nil {
		return err
	}

	if !geom.ExactEquals(got, want) {
		log.Printf("want: %v", want.AsText())
		log.Printf("got:  %v", got.AsText())
		return errMismatch
	}
	return nil
}

func checkAsBinary(h *Handle, g geom.Geometry, log *log.Logger) error {
	var wantDefined bool
	want, err := h.asBinary(g)
	if err == nil {
		wantDefined = true
	}
	hasPointEmpty := hasEmptyPoint(g)
	if !wantDefined && !hasPointEmpty {
		return errors.New("AsBinary wasn't defined by libgeos and the test is " +
			"NOT for a geometry containing a POINT EMPTY, which is unexpected",
		)
	}
	if !wantDefined {
		// Skip the test, since we don't have a WKB from libgeos to compare to.
		// This is only for the POINT EMPTY case. Simplefeatures _does_ produce
		// a WKB for POINT EMPTY although this is strictly an extension to the
		// spec.
		return nil
	}

	// GEOS uses a slightly different NaN representation (both are equally valid).
	want = bytes.ReplaceAll(want,
		[]byte{0x00, 0, 0, 0, 0, 0, 0xf8, 0x7f},
		[]byte{0x01, 0, 0, 0, 0, 0, 0xf8, 0x7f},
	)

	got := g.AsBinary()
	if !bytes.Equal(want, got) {
		log.Printf("want:\n%s", hex.Dump(want))
		log.Printf("got:\n%s", hex.Dump(got))
		return errMismatch
	}
	return nil
}

func checkFromBinary(h *Handle, g geom.Geometry, log *log.Logger) error {
	if containsMultiPolygonWithEmptyPolygon(g) {
		// libgeos omits the empty Polygon, but simplefeatures doesn't.
		return nil
	}

	wkb := g.AsBinary()

	// Skip any MultiPoints that contain empty Points. Libgeos seems has
	// trouble handling these.
	if g.IsMultiPoint() {
		mp := g.MustAsMultiPoint()
		n := mp.NumPoints()
		for i := 0; i < n; i++ {
			if mp.PointN(i).IsEmpty() {
				return nil
			}
		}
	}

	want, err := h.fromBinary(wkb)
	if err != nil {
		return err
	}

	got, err := geom.UnmarshalWKB(wkb)
	if err != nil {
		return err
	}

	if !geom.ExactEquals(want, got) {
		return errMismatch
	}
	return nil
}

func checkIsEmpty(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, err := h.isEmpty(g)
	if err != nil {
		return err
	}
	got := g.IsEmpty()

	if want != got {
		log.Printf("want: %v", want)
		log.Printf("got: %v", got)
		return errMismatch
	}
	return nil
}

func checkDimension(h *Handle, g geom.Geometry, log *log.Logger) error {
	var want int
	if !containsOnlyGeometryCollections(g) {
		// Libgeos gives -1 dimension for GeometryCollection trees that only
		// contain other GeometryCollections (all the way to the leaf nodes).
		// This is weird behaviour, and the dimension should actually be zero.
		// So we don't get 'want' from libgeos in that case (and allow want to
		// default to 0).
		var err error
		want, err = h.dimension(g)
		if err != nil {
			return err
		}
	}
	got := g.Dimension()

	if want != got {
		log.Printf("want: %v", want)
		log.Printf("got: %v", got)
		return errMismatch
	}
	return nil
}

func checkEnvelope(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, err := h.envelope(g)
	if err != nil {
		return err
	}
	got := g.Envelope()

	if want.Min() != got.Min() || want.Max() != got.Max() {
		log.Printf("want: %v", want.AsGeometry().AsText())
		log.Printf("got:  %v", got.AsGeometry().AsText())
		return errMismatch
	}
	return nil
}

func checkIsSimple(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, wantDefined, err := h.isSimple(g)
	if err != nil {
		if err == errLibgeosCrash {
			// Skip any tests that would cause libgeos to crash.
			return nil
		}
		return err
	}
	got, gotDefined := g.IsSimple()

	if wantDefined != gotDefined {
		log.Printf("want defined: %v", wantDefined)
		log.Printf("got defined: %v", gotDefined)
		return errMismatch
	}
	if !gotDefined {
		return nil
	}

	if want != got {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

func checkBoundary(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, wantDefined, err := h.boundary(g)
	if err != nil {
		return err
	}

	if !wantDefined && !g.IsGeometryCollection() {
		return errors.New("boundary not defined by libgeos, but " +
			"input is not a geometry collection (this is unexpected)")
	}
	if !wantDefined {
		return nil
	}

	got := g.Boundary()

	// There are some slight differences in the behaviour for empty inputs, so
	// we don't check these cases (so long as the output is also empty).
	if got.IsEmpty() && want.IsEmpty() {
		return nil
	}

	if !geom.ExactEquals(want, got, geom.IgnoreOrder) {
		log.Printf("want: %v", want.AsText())
		log.Printf("got:  %v", got.AsText())
		return errMismatch
	}
	return nil
}

func checkConvexHull(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, err := h.convexHull(g)
	if err != nil {
		return err
	}
	got := g.ConvexHull()

	// libgeos and PostGIS have slightly different behaviour when the result is
	// empty (different geometry types). Simplefeatures matches PostGIS
	// behaviour right now.
	if got.IsEmpty() && want.IsEmpty() {
		return nil
	}

	if !geom.ExactEquals(want, got, geom.IgnoreOrder) {
		log.Printf("want: %v", want.AsText())
		log.Printf("got:  %v", got.AsText())
		return errMismatch
	}
	return nil
}

func checkIsRing(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, err := h.isRing(g)
	if err != nil {
		return err
	}
	got := g.IsLineString() && g.MustAsLineString().IsRing()

	if want != got {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

func checkLength(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, err := h.length(g)
	if err != nil {
		return err
	}
	got := g.Length()

	// libgeos and PostGIS disagree on the definition of length for areal
	// geometries.  PostGIS always gives zero, while libgeos gives the length
	// of the boundary. Simplefeatures follows the PostGIS behaviour.
	if isArealGeometry(g) {
		return nil
	}

	if math.Abs(want-got) > 1e-6 {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

func isArealGeometry(g geom.Geometry) bool {
	switch {
	case g.IsPolygon() || g.IsMultiPolygon():
		return true
	case g.IsGeometryCollection():
		gc := g.MustAsGeometryCollection()
		for i := 0; i < gc.NumGeometries(); i++ {
			if isArealGeometry(gc.GeometryN(i)) {
				return true
			}
		}
	}
	return false
}

func checkArea(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, err := h.area(g)
	if err != nil {
		return err
	}
	got := g.Area()

	if math.Abs(want-got) > 1e-6 {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

func checkCentroid(h *Handle, g geom.Geometry, log *log.Logger) error {
	want, err := h.centroid(g)
	if err != nil {
		return err
	}
	got := g.Centroid().AsGeometry()

	if !geom.ExactEquals(want, got, geom.ToleranceXY(1e-9)) {
		log.Printf("want: %v", want.AsText())
		log.Printf("got:  %v", got.AsText())
		return errMismatch
	}
	return nil
}

func checkPointOnSurface(h *Handle, g geom.Geometry, log *log.Logger) error {
	// It's too difficult to perform a direct comparison against GEOS's
	// PointOnSurface, due to numeric stability related issue. This is because
	// there are floating point comparisons to find the "best" point. However,
	// sometimes there are many points that are equally best. Floating point
	// issues mean that it's hard to get the implementations to line up
	// precisely in all cases (and there is no objectively best way to do it).
	// Instead, we check invariants on the result.

	pt := g.PointOnSurface().AsGeometry()

	if pt.IsEmpty() != g.IsEmpty() {
		log.Printf("The geometry's empty status doesn't match the point's empty status")
		log.Printf("g empty:  %v", g.IsEmpty())
		log.Printf("pt empty: %v", pt.IsEmpty())
		return errMismatch
	}

	if !g.IsEmpty() && !g.IsGeometryCollection() {
		intersects, err := geos.Intersects(pt, g)
		if err != nil {
			return err
		}
		if !intersects {
			log.Printf("the pt doesn't intersect with the input")
			return errMismatch
		}
	}

	if g.Dimension() == 2 && !g.IsEmpty() && !g.IsGeometryCollection() {
		contains, err := geos.Contains(g, pt)
		if err != nil {
			return err
		}
		if !contains {
			log.Printf("the input doesn't contain the pt")
			return errMismatch
		}
	}

	return nil
}

func checkSimplify(h *Handle, g geom.Geometry, log *log.Logger) error {
	for _, threshold := range []float64{0.125, 0.25, 0.5, 1, 2, 4, 8, 16} {
		// If we get an error from GEOS, then we may or may not get an error from
		// simplefeatures.
		want, err := h.simplify(g, threshold)
		wantIsValid := err == nil

		// Even if GEOS couldn't simplify, we still want to attempt to simplify
		// with simplefeatures to ensure it doesn't crash (even if it may give an
		// error).
		got, err := geos.Simplify(g, threshold)
		gotIsValid := err == nil

		if wantIsValid && !gotIsValid {
			return fmt.Errorf("GEOS could simplify but simplefeatures could not: %w", err)
		}

		if gotIsValid && wantIsValid && !geom.ExactEquals(got, want) {
			log.Printf("Simplify results not equal for threshold=%v", threshold)
			log.Printf("want: %v", want.AsText())
			log.Printf("got:  %v", got.AsText())
			return errMismatch
		}
	}
	return nil
}

func binaryChecks(h *Handle, g1, g2 geom.Geometry, log *log.Logger) error {
	for _, g := range []geom.Geometry{g1, g2} {
		if valid, err := checkIsValid(h, g, log); err != nil {
			return err
		} else if !valid {
			return nil
		}
	}

	log.Println("checking Intersects")
	if err := checkIntersects(h, g1, g2, log); err != nil {
		return err
	}

	log.Println("checking ExactEquals")
	if err := checkExactEquals(h, g1, g2, log); err != nil {
		return err
	}

	log.Println("checking Distance")
	if err := checkDistance(h, g1, g2, log); err != nil {
		return err
	}

	log.Println("checking DCEL operations")
	if err := checkDCELOperations(h, g1, g2, log); err != nil {
		return err
	}

	return nil
}

func checkIntersects(h *Handle, g1, g2 geom.Geometry, log *log.Logger) error {
	skipList := map[string]bool{
		// postgres=# SELECT ST_Intersects(
		//   ST_GeomFromText('LINESTRING(1 0,0.5000000000000001 0.5,0 1)'),
		//   ST_GeomFromText('LINESTRING(0.5 0.5,1.5 1.5)')
		// );
		//  st_intersects
		// ---------------
		//  f # WRONG!!
		// (1 row)
		"LINESTRING(1 0,0.5000000000000001 0.5,0 1)": true,

		// Simplefeatures sometimes gives an incorrect result for this due to
		// numerical precision issues. Would be solved by
		// https://github.com/peterstace/simplefeatures/issues/274
		"LINESTRING(0.5 0,0.5000000000000001 0.5)":                              true,
		"MULTILINESTRING((0 0,2 2.000000000000001),(1 0,-1 2.000000000000001))": true,
	}
	if skipList[g1.AsText()] || skipList[g2.AsText()] {
		// Skipping test because GEOS gives the incorrect result for *some*
		// intersection operations involving this input.
		return nil
	}

	want, err := h.intersects(g1, g2)
	if err != nil {
		if err == errLibgeosCrash {
			return nil
		}
		return err
	}
	got := geom.Intersects(g1, g2)

	if want != got {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

func checkExactEquals(h *Handle, g1, g2 geom.Geometry, log *log.Logger) error {
	want, err := h.exactEquals(g1, g2)
	if err != nil {
		return err
	}
	got := geom.ExactEquals(g1, g2)

	if want != got {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

func checkDistance(h *Handle, g1, g2 geom.Geometry, log *log.Logger) error {
	want, err := h.distance(g1, g2)
	if err != nil {
		if err == errLibgeosCrash {
			// Skip any tests that would cause libgeos to crash.
			return nil
		}
		return err
	}
	got, ok := geom.Distance(g1, g2)
	if !ok {
		// GEOS gives 0 when distance is not defined.
		got = 0
	}

	if math.Abs(want-got) > 1e-12 {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}
	return nil
}

var skipIntersection = map[string]bool{
	"LINESTRING(0 1,0.3333333333 0.6666666667,1 0)": true,
	"LINESTRING(1 0,0.5000000000000001 0.5,0 1)":    true,
	"MULTILINESTRING((0 0,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 2),(0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 0))": true,
	"MULTILINESTRING((0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 0))":                                                                 true,
	"MULTILINESTRING((0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 0),(0 0,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 2))": true,
	"POLYGON((1 0,0.9807852804032305 -0.19509032201612808,0.923879532511287 -0.3826834323650894,0.8314696123025456 -0.5555702330196017,0.7071067811865481 -0.7071067811865469,0.5555702330196031 -0.8314696123025447,0.38268343236509084 -0.9238795325112863,0.19509032201612964 -0.9807852804032302,0.0000000000000016155445744325867 -1,-0.19509032201612647 -0.9807852804032308,-0.38268343236508784 -0.9238795325112875,-0.5555702330196005 -0.8314696123025463,-0.7071067811865459 -0.7071067811865491,-0.8314696123025438 -0.5555702330196043,-0.9238795325112857 -0.38268343236509234,-0.9807852804032299 -0.19509032201613122,-1 -0.0000000000000032310891488651735,-0.9807852804032311 0.19509032201612486,-0.9238795325112882 0.38268343236508634,-0.8314696123025475 0.555570233019599,-0.7071067811865505 0.7071067811865446,-0.5555702330196058 0.8314696123025428,-0.3826834323650936 0.9238795325112852,-0.19509032201613213 0.9807852804032297,-0.000000000000003736410698672604 1,0.1950903220161248 0.9807852804032311,0.38268343236508673 0.9238795325112881,0.5555702330195996 0.8314696123025469,0.7071067811865455 0.7071067811865496,0.8314696123025438 0.5555702330196044,0.9238795325112859 0.38268343236509206,0.98078528040323 0.19509032201613047,1 0))": true,
	"MULTILINESTRING((0 0,2 2.000000000000001),(1 0,-1 2.000000000000001))":                         true,
	"MULTILINESTRING((0 0,0.5 0.5,1 1,2 2.000000000000001),(1 0,0.5 0.5,0 1,-1 2.000000000000001))": true,
	"POLYGON((1.5 1,1.353553390593274 0.6464466094067265,1.0000000000000009 0.5,0.646446609406727 0.6464466094067254,0.5 0.9999999999999983,0.6464466094067247 1.3535533905932722,0.9999999999999977 1.5,1.3535533905932717 1.3535533905932757,1.5 1))": true,
	"POLYGON((1 0,-0.9 -0.2,-1 -0.0000000000000032310891488651735,-0.9 0.2,1 0))": true,
	"LINESTRING(0.5 0,0.5000000000000001 0.5)":                                    true,
	"LINESTRING(0.5 1,0.5000000000000001 0.5)":                                    true,
	"POLYGON((1 0,0.9807852804032304 -0.19509032201612825,0.9238795325112867 -0.3826834323650898,0.8314696123025452 -0.5555702330196022,0.7071067811865476 -0.7071067811865475,0.5555702330196023 -0.8314696123025452,0.38268343236508984 -0.9238795325112867,0.19509032201612833 -0.9807852804032304,0.00000000000000006123233995736766 -1,-0.1950903220161282 -0.9807852804032304,-0.3826834323650897 -0.9238795325112867,-0.555570233019602 -0.8314696123025455,-0.7071067811865475 -0.7071067811865476,-0.8314696123025453 -0.5555702330196022,-0.9238795325112867 -0.3826834323650899,-0.9807852804032304 -0.1950903220161286,-1 -0.00000000000000012246467991473532,-0.9807852804032304 0.19509032201612836,-0.9238795325112868 0.38268343236508967,-0.8314696123025455 0.555570233019602,-0.7071067811865477 0.7071067811865475,-0.5555702330196022 0.8314696123025452,-0.38268343236509034 0.9238795325112865,-0.19509032201612866 0.9807852804032303,-0.00000000000000018369701987210297 1,0.1950903220161283 0.9807852804032304,0.38268343236509 0.9238795325112866,0.5555702330196018 0.8314696123025455,0.7071067811865474 0.7071067811865477,0.8314696123025452 0.5555702330196022,0.9238795325112865 0.3826834323650904,0.9807852804032303 0.19509032201612872,1 0))": true,
	"POLYGON((1.5 1,1.3535533905932737 0.6464466094067263,1 0.5,0.6464466094067263 0.6464466094067263,0.5 0.9999999999999999,0.6464466094067262 1.3535533905932737,0.9999999999999999 1.5,1.3535533905932737 1.353553390593274,1.5 1))": true,

	// Cause simplefeatures DCEL operations to fail with "no rings" error. See
	// https://github.com/peterstace/simplefeatures/pull/497 for details.
	"POLYGON((-83.58253051 32.73168239,-83.59843118 32.74617142,-83.70048117 32.63984372,-83.58253051 32.73168239))": true,
	"POLYGON((-83.70047745 32.63984661,-83.68891846 32.5989632,-83.58253417 32.73167955,-83.70047745 32.63984661))":  true,
}

var skipDifference = map[string]bool{
	"LINESTRING(0 1,0.3333333333 0.6666666667,0.5 0.5,1 0)": true,
	"LINESTRING(0 1,0.3333333333 0.6666666667,1 0)":         true,
	"LINESTRING(1 0,0.5000000000000001 0.5,0 1)":            true,
	"MULTILINESTRING((0 0,0.5 0.5),(0.5 0.5,1 1),(0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,0.5 0.5),(0.5 0.5,1 0))": true,
	"MULTILINESTRING((0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 0))":                                               true,

	"MULTIPOLYGON(((1 0,0 1,0.5 1.5,1 1,1.5 1.5,2 1,1 0)),((1.5 1.5,1 2,0.5 1.5,0.333333333333333 1.66666666666667,0 2,1 3,2 2,1.5 1.5)),((3.5 1.5,4 1,3 0,2 1,2.5 1.5,3 1,3.5 1.5)),((3.5 1.5,3 2,2.5 1.5,2 2,3 3,4 2,3.5 1.5)))": true,
	"POLYGON((1 0,-0.9 -0.2,-1 -0.0000000000000032310891488651735,-0.9 0.2,1 0))": true,
	"POLYGON((1 0,0.9807852804032305 -0.19509032201612808,0.923879532511287 -0.3826834323650894,0.8314696123025456 -0.5555702330196017,0.7071067811865481 -0.7071067811865469,0.5555702330196031 -0.8314696123025447,0.38268343236509084 -0.9238795325112863,0.19509032201612964 -0.9807852804032302,0.0000000000000016155445744325867 -1,-0.19509032201612647 -0.9807852804032308,-0.38268343236508784 -0.9238795325112875,-0.5555702330196005 -0.8314696123025463,-0.7071067811865459 -0.7071067811865491,-0.8314696123025438 -0.5555702330196043,-0.9238795325112857 -0.38268343236509234,-0.9807852804032299 -0.19509032201613122,-1 -0.0000000000000032310891488651735,-0.9807852804032311 0.19509032201612486,-0.9238795325112882 0.38268343236508634,-0.8314696123025475 0.555570233019599,-0.7071067811865505 0.7071067811865446,-0.5555702330196058 0.8314696123025428,-0.3826834323650936 0.9238795325112852,-0.19509032201613213 0.9807852804032297,-0.000000000000003736410698672604 1,0.1950903220161248 0.9807852804032311,0.38268343236508673 0.9238795325112881,0.5555702330195996 0.8314696123025469,0.7071067811865455 0.7071067811865496,0.8314696123025438 0.5555702330196044,0.9238795325112859 0.38268343236509206,0.98078528040323 0.19509032201613047,1 0))": true,
	"MULTILINESTRING((0 0,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 2),(0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 0))": true,
	"MULTILINESTRING((0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 0),(0 0,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 2))": true,
	"MULTILINESTRING((0 0,2 2.000000000000001),(1 0,-1 2.000000000000001))":                                                                            true,
	"MULTILINESTRING((0 0,0.5 0.5,1 1,2 2.000000000000001),(1 0,0.5 0.5,0 1,-1 2.000000000000001))":                                                    true,
	"MULTILINESTRING((0 0,0.5 0.5),(0.5 0.5,1 1),(0 1,0.3333333333 0.6666666667,0.5 0.5),(0.5 0.5,1 0))":                                               true,
	"LINESTRING(0.5 0,0.5000000000000001 0.5)": true,
	"LINESTRING(0.5 1,0.5000000000000001 0.5)": true,

	// The following are not topological differences, but instead bugs in GEOS
	// v3.7.1. I believe that it may be fixed in GEOS v3.8.0 but I haven't
	// confirmed that.
	"POLYGON((0.9 0.1,0.9 1,0.901921471959677 1.019509032201613,0.9076120467488714 1.0382683432365092,0.9168530387697456 1.0555570233019602,0.9292893218813453 1.0707106781186548,0.9444429766980398 1.0831469612302547,0.961731656763491 1.0923879532511287,0.9804909677983872 1.0980785280403231,1 1.1,1.0195090322016127 1.0980785280403231,1.038268343236509 1.0923879532511287,1.0555570233019602 1.0831469612302547,1.0707106781186546 1.0707106781186548,1.0831469612302544 1.0555570233019602,1.0923879532511287 1.0382683432365092,1.0980785280403231 1.019509032201613,1.1 1,1.0717462120245884 0.06467514421272098,0.9353248557872769 -0.07174621202458649,0 -0.1,-0.019509032201612955 -0.09807852804032302,-0.03826834323650912 -0.09238795325112863,-0.055557023301960363 -0.08314696123025443,-0.07071067811865482 -0.07071067811865468,-0.08314696123025457 -0.055557023301960155,-0.0923879532511287 -0.03826834323650893,-0.09807852804032306 -0.01950903220161279,-0.1 0.000000000000000012246467991473533,-0.09807852804032305 0.01950903220161282,-0.0923879532511287 0.03826834323650895,-0.08314696123025456 0.055557023301960176,-0.07071067811865482 0.0707106781186547,-0.05555702330196031 0.08314696123025447,-0.0382683432365091 0.09238795325112864,-0.019509032201612972 0.09807852804032302,0 0.1,0.9 0.1))":                                                                                true,
	"POLYGON((0.9 0.1,0.9 1,0.901921471959677 1.019509032201613,0.9076120467488714 1.0382683432365092,0.9168530387697456 1.0555570233019602,0.9292893218813453 1.0707106781186548,0.9444429766980398 1.0831469612302547,0.961731656763491 1.0923879532511287,0.9804909677983872 1.0980785280403231,1 1.1,1.0195090322016127 1.0980785280403231,1.038268343236509 1.0923879532511287,1.0555570233019602 1.0831469612302547,1.0707106781186546 1.0707106781186548,1.0831469612302544 1.0555570233019602,1.0923879532511287 1.0382683432365092,1.0980785280403231 1.019509032201613,1.1 1,1.1 0,1 -0.1,0 -0.1,-0.019509032201612955 -0.09807852804032302,-0.03826834323650912 -0.09238795325112863,-0.055557023301960363 -0.08314696123025443,-0.07071067811865482 -0.07071067811865468,-0.08314696123025457 -0.055557023301960155,-0.0923879532511287 -0.03826834323650893,-0.09807852804032306 -0.01950903220161279,-0.1 0.000000000000000012246467991473533,-0.09807852804032305 0.01950903220161282,-0.0923879532511287 0.03826834323650895,-0.08314696123025456 0.055557023301960176,-0.07071067811865482 0.0707106781186547,-0.05555702330196031 0.08314696123025447,-0.0382683432365091 0.09238795325112864,-0.019509032201612972 0.09807852804032302,0 0.1,0.9 0.1))":                                                                                true,
	"POLYGON((0.9 0.1,0.9 1,0.901921471959677 1.019509032201613,0.9076120467488714 1.0382683432365092,0.9168530387697456 1.0555570233019602,0.9292893218813453 1.0707106781186548,0.9444429766980398 1.0831469612302547,0.961731656763491 1.0923879532511287,0.9804909677983872 1.0980785280403231,1 1.1,1.0195090322016127 1.0980785280403231,1.038268343236509 1.0923879532511287,1.0555570233019602 1.0831469612302547,1.0707106781186546 1.0707106781186548,1.0831469612302544 1.0555570233019602,1.0923879532511287 1.0382683432365092,1.0980785280403231 1.019509032201613,1.1 1,1.1 0,1.0980785280403231 -0.019509032201612826,1.0923879532511287 -0.03826834323650898,1.0831469612302544 -0.05555702330196022,1.0707106781186548 -0.07071067811865475,1.0555570233019602 -0.08314696123025453,1.038268343236509 -0.09238795325112868,1.019509032201613 -0.09807852804032305,1 -0.1,0 -0.1,-0.019509032201612955 -0.09807852804032302,-0.03826834323650912 -0.09238795325112863,-0.055557023301960363 -0.08314696123025443,-0.07071067811865482 -0.07071067811865468,-0.08314696123025457 -0.055557023301960155,-0.0923879532511287 -0.03826834323650893,-0.09807852804032306 -0.01950903220161279,-0.1 0.000000000000000012246467991473533,-0.09807852804032305 0.01950903220161282,-0.0923879532511287 0.03826834323650895,-0.08314696123025456 0.055557023301960176,-0.07071067811865482 0.0707106781186547,-0.05555702330196031 0.08314696123025447,-0.0382683432365091 0.09238795325112864,-0.019509032201612972 0.09807852804032302,0 0.1,0.9 0.1))": true,
	"POLYGON((1 0,0.9807852804032304 -0.19509032201612825,0.9238795325112867 -0.3826834323650898,0.8314696123025452 -0.5555702330196022,0.7071067811865476 -0.7071067811865475,0.5555702330196023 -0.8314696123025452,0.38268343236508984 -0.9238795325112867,0.19509032201612833 -0.9807852804032304,0.00000000000000006123233995736766 -1,-0.1950903220161282 -0.9807852804032304,-0.3826834323650897 -0.9238795325112867,-0.555570233019602 -0.8314696123025455,-0.7071067811865475 -0.7071067811865476,-0.8314696123025453 -0.5555702330196022,-0.9238795325112867 -0.3826834323650899,-0.9807852804032304 -0.1950903220161286,-1 -0.00000000000000012246467991473532,-0.9807852804032304 0.19509032201612836,-0.9238795325112868 0.38268343236508967,-0.8314696123025455 0.555570233019602,-0.7071067811865477 0.7071067811865475,-0.5555702330196022 0.8314696123025452,-0.38268343236509034 0.9238795325112865,-0.19509032201612866 0.9807852804032303,-0.00000000000000018369701987210297 1,0.1950903220161283 0.9807852804032304,0.38268343236509 0.9238795325112866,0.5555702330196018 0.8314696123025455,0.7071067811865474 0.7071067811865477,0.8314696123025452 0.5555702330196022,0.9238795325112865 0.3826834323650904,0.9807852804032303 0.19509032201612872,1 0))":                                                                                true,

	// Cause simplefeatures DCEL operations to fail with "no rings" error. See
	// https://github.com/peterstace/simplefeatures/pull/497 for details.
	"POLYGON((-83.58253051 32.73168239,-83.59843118 32.74617142,-83.70048117 32.63984372,-83.58253051 32.73168239))": true,
	"POLYGON((-83.70047745 32.63984661,-83.68891846 32.5989632,-83.58253417 32.73167955,-83.70047745 32.63984661))":  true,

	// Causes simplefeatures DCEL operations to fail with "polygon ring not simple" error.
	"POLYGON((-1 0,-0.9 0.2,-0.80952380952381 0.19047619047619,0 1,0 0.105263157894737,1 0,-0.9 -0.2,-1 0))":                                                                                true,
	"POLYGON((0 -0.1414213562373095,1.1414213562373097 1,0.9292893218813453 1.0707106781186548,0 -0.1414213562373095))":                                                                                true,
	"POLYGON((0.9292893218813453 1.0707106781186548,1.0707106781186548 0.9292893218813453,0.07071067811865475 -0.07071067811865475,-0.07071067811865475 0.07071067811865475,0.9292893218813453 1.0707106781186548))":                                           true,
	"POLYGON((0.9292893218813453 1.0707106781186548,1 1.1414213562373097,1.1414213562373097 1,0.07071067811865475 -0.07071067811865475,0 -0.1414213562373095,-0.1414213562373095 -0.000000000000000013877787807814457,0.9292893218813453 1.0707106781186548))": true,
	"POLYGON((0.9292893218813453 1.0707106781186548,1.1414213562373097 1,0.07071067811865475 -0.07071067811865475,0 -0.1414213562373095,0.9292893218813453 1.0707106781186548))":                                                                               true,
}

var skipSymDiff = map[string]bool{
	"LINESTRING(0 1,0.3333333333 0.6666666667,0.5 0.5,1 0)": true,
	"LINESTRING(0 1,0.3333333333 0.6666666667,1 0)":         true,
	"LINESTRING(1 0,0.5000000000000001 0.5,0 1)":            true,
	"MULTILINESTRING((0 0,0.5 0.5),(0.5 0.5,1 1),(0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,0.5 0.5),(0.5 0.5,1 0))": true,
	"MULTILINESTRING((0 1,0.3333333333 0.6666666667),(0.3333333333 0.6666666667,1 0))":                                               true,

	// Cause simplefeatures DCEL operations to fail with "no rings" error. See
	// https://github.com/peterstace/simplefeatures/pull/497 for details.
	"POLYGON((-83.58253051 32.73168239,-83.59843118 32.74617142,-83.70048117 32.63984372,-83.58253051 32.73168239))": true,
	"POLYGON((-83.70047745 32.63984661,-83.68891846 32.5989632,-83.58253417 32.73167955,-83.70047745 32.63984661))":  true,

	// Causes simplefeatures "multipolygon has nested child polygons" error.
	"POLYGON((1 0,0.9807852804032304 -0.19509032201612825,0.9238795325112867 -0.3826834323650898,0.8314696123025452 -0.5555702330196022,0.7071067811865476 -0.7071067811865475,0.5555702330196023 -0.8314696123025452,0.38268343236508984 -0.9238795325112867,0.19509032201612833 -0.9807852804032304,0.00000000000000006123233995736766 -1,-0.1950903220161282 -0.9807852804032304,-0.3826834323650897 -0.9238795325112867,-0.555570233019602 -0.8314696123025455,-0.7071067811865475 -0.7071067811865476,-0.8314696123025453 -0.5555702330196022,-0.9238795325112867 -0.3826834323650899,-0.9807852804032304 -0.1950903220161286,-1 -0.00000000000000012246467991473532,-0.9807852804032304 0.19509032201612836,-0.9238795325112868 0.38268343236508967,-0.8314696123025455 0.555570233019602,-0.7071067811865477 0.7071067811865475,-0.5555702330196022 0.8314696123025452,-0.38268343236509034 0.9238795325112865,-0.19509032201612866 0.9807852804032303,-0.00000000000000018369701987210297 1,0.1950903220161283 0.9807852804032304,0.38268343236509 0.9238795325112866,0.5555702330196018 0.8314696123025455,0.7071067811865474 0.7071067811865477,0.8314696123025452 0.5555702330196022,0.9238795325112865 0.3826834323650904,0.9807852804032303 0.19509032201612872,1 0))": true,

	// Causes simplefeatures DCEL operations to fail with "polygon ring not simple" error.
	"POLYGON((-1 0,-0.9 0.2,-0.80952380952381 0.19047619047619,0 1,0 0.105263157894737,1 0,-0.9 -0.2,-1 0))":            true,
	"POLYGON((0 -0.1414213562373095,1.1414213562373097 1,0.9292893218813453 1.0707106781186548,0 -0.1414213562373095))": true,
	"POLYGON((0.9 0.1,0.9 1,0.901921471959677 1.019509032201613,0.9076120467488714 1.0382683432365092,0.9168530387697456 1.0555570233019602,0.9292893218813453 1.0707106781186548,0.9444429766980398 1.0831469612302547,0.961731656763491 1.0923879532511287,0.9804909677983872 1.0980785280403231,1 1.1,1.0195090322016127 1.0980785280403231,1.038268343236509 1.0923879532511287,1.0555570233019602 1.0831469612302547,1.0707106781186546 1.0707106781186548,1.0831469612302544 1.0555570233019602,1.0923879532511287 1.0382683432365092,1.0980785280403231 1.019509032201613,1.1 1,1.0717462120245884 0.06467514421272098,0.9353248557872769 -0.07174621202458649,0 -0.1,-0.019509032201612955 -0.09807852804032302,-0.03826834323650912 -0.09238795325112863,-0.055557023301960363 -0.08314696123025443,-0.07071067811865482 -0.07071067811865468,-0.08314696123025457 -0.055557023301960155,-0.0923879532511287 -0.03826834323650893,-0.09807852804032306 -0.01950903220161279,-0.1 0.000000000000000012246467991473533,-0.09807852804032305 0.01950903220161282,-0.0923879532511287 0.03826834323650895,-0.08314696123025456 0.055557023301960176,-0.07071067811865482 0.0707106781186547,-0.05555702330196031 0.08314696123025447,-0.0382683432365091 0.09238795325112864,-0.019509032201612972 0.09807852804032302,0 0.1,0.9 0.1))": true,
	"POLYGON((0.9 0.1,0.9 1,0.901921471959677 1.019509032201613,0.9076120467488714 1.0382683432365092,0.9168530387697456 1.0555570233019602,0.9292893218813453 1.0707106781186548,0.9444429766980398 1.0831469612302547,0.961731656763491 1.0923879532511287,0.9804909677983872 1.0980785280403231,1 1.1,1.0195090322016127 1.0980785280403231,1.038268343236509 1.0923879532511287,1.0555570233019602 1.0831469612302547,1.0707106781186546 1.0707106781186548,1.0831469612302544 1.0555570233019602,1.0923879532511287 1.0382683432365092,1.0980785280403231 1.019509032201613,1.1 1,1.1 0,1 -0.1,0 -0.1,-0.019509032201612955 -0.09807852804032302,-0.03826834323650912 -0.09238795325112863,-0.055557023301960363 -0.08314696123025443,-0.07071067811865482 -0.07071067811865468,-0.08314696123025457 -0.055557023301960155,-0.0923879532511287 -0.03826834323650893,-0.09807852804032306 -0.01950903220161279,-0.1 0.000000000000000012246467991473533,-0.09807852804032305 0.01950903220161282,-0.0923879532511287 0.03826834323650895,-0.08314696123025456 0.055557023301960176,-0.07071067811865482 0.0707106781186547,-0.05555702330196031 0.08314696123025447,-0.0382683432365091 0.09238795325112864,-0.019509032201612972 0.09807852804032302,0 0.1,0.9 0.1))":                                                                   true,
	"POLYGON((0.9292893218813453 1.0707106781186548,1.0707106781186548 0.9292893218813453,0.07071067811865475 -0.07071067811865475,-0.07071067811865475 0.07071067811865475,0.9292893218813453 1.0707106781186548))": true,
	"POLYGON((0.9292893218813453 1.0707106781186548,0.9444429766980399 1.0831469612302547,0.9617316567634911 1.0923879532511287,0.9804909677983873 1.0980785280403231,1 1.1,1.019509032201613 1.0980785280403231,1.038268343236509 1.0923879532511287,1.0555570233019602 1.0831469612302544,1.0707106781186548 1.0707106781186548,1.0831469612302544 1.0555570233019602,1.0923879532511287 1.038268343236509,1.0980785280403231 1.019509032201613,1.1 1,1.0980785280403231 0.9804909677983873,1.0923879532511287 0.9617316567634911,1.0831469612302547 0.9444429766980399,1.0707106781186548 0.9292893218813453,0.07071067811865475 -0.07071067811865475,0.05555702330196012 -0.0831469612302546,0.03826834323650888 -0.09238795325112872,0.019509032201612746 -0.09807852804032308,-0.00000000000000006049014748177263 -0.1,-0.019509032201612864 -0.09807852804032305,-0.03826834323650899 -0.09238795325112868,-0.0555570233019602 -0.08314696123025456,-0.07071067811865475 -0.07071067811865477,-0.08314696123025449 -0.05555702330196029,-0.09238795325112865 -0.03826834323650903,-0.09807852804032302 -0.019509032201612948,-0.1 -0.00000000000000010106430996148606,-0.09807852804032308 0.019509032201612663,-0.09238795325112874 0.038268343236508844,-0.08314696123025465 0.055557023301960044,-0.07071067811865475 0.07071067811865475,0.9292893218813453 1.0707106781186548))": true,
}

var skipUnion = map[string]bool{
	// Cause simplefeatures DCEL operations to fail with "no rings" error. See
	// https://github.com/peterstace/simplefeatures/pull/497 for details.
	"POLYGON((-83.58253051 32.73168239,-83.59843118 32.74617142,-83.70048117 32.63984372,-83.58253051 32.73168239))": true,
	"POLYGON((-83.70047745 32.63984661,-83.68891846 32.5989632,-83.58253417 32.73167955,-83.70047745 32.63984661))":  true,
}

func checkDCELOperations(h *Handle, g1, g2 geom.Geometry, log *log.Logger) error {
	// TODO: simplefeatures doesn't support GeometryCollections yet
	if g1.IsGeometryCollection() || g2.IsGeometryCollection() {
		return nil
	}

	for _, op := range []struct {
		name     string
		sfFunc   func(g1, g2 geom.Geometry) (geom.Geometry, error)
		geosFunc func(g1, g2 geom.Geometry) (geom.Geometry, error)
		skip     map[string]bool
	}{
		{
			"Union",
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return geom.Union(g1, g2) },
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return h.union(g1, g2) },
			skipUnion,
		},
		{
			"Intersection",
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return geom.Intersection(g1, g2) },
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return h.intersection(g1, g2) },
			skipIntersection,
		},
		{
			"Difference",
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return geom.Difference(g1, g2) },
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return h.difference(g1, g2) },
			skipDifference,
		},
		{
			"SymmetricDifference",
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return geom.SymmetricDifference(g1, g2) },
			func(g1, g2 geom.Geometry) (geom.Geometry, error) { return h.symmetricDifference(g1, g2) },
			skipSymDiff,
		},
	} {
		log.Println("checking", op.name)
		err := checkDCELOp(op.sfFunc, op.geosFunc, g1, g2, op.skip, log)
		if err != nil {
			return err
		}
	}

	log.Println("checking Relate")
	if err := checkRelate(h, g1, g2, log); err != nil {
		return err
	}

	return nil
}

func checkDCELOp(
	op func(g1, g2 geom.Geometry) (geom.Geometry, error),
	refImpl func(g1, g2 geom.Geometry) (geom.Geometry, error),
	g1, g2 geom.Geometry,
	skip map[string]bool,
	log *log.Logger,
) error {
	// Empty points will cause the reference impl to crash.
	if hasEmptyPoint(g1) || hasEmptyPoint(g2) {
		return nil
	}

	// Some geometries give results that are not topologically equivalent to
	// those from GEOS. These have been checked manually, and decided that the
	// difference is acceptable (they typically have to do with different
	// handling of numerically degenerate cases). Note that we bail out of this
	// test _after_ we calculate got. That way we're at least checking that it
	// doesn't crash or give an error.
	if skip[g1.AsText()] || skip[g2.AsText()] {
		return nil
	}

	got, err := op(g1, g2)
	if err != nil {
		return err
	}

	want, err := refImpl(g1, g2)
	if err != nil {
		if err == errInvalidAccordingToGEOS {
			// Because GEOS has given us back an invalid geometry (even according
			// to its own validation routines) we can't trust it for this test
			// case.
			return nil
		}
		return err
	}

	if !mantissaTerminatesQuickly(got) || !mantissaTerminatesQuickly(want) {
		// We're not going to be able to compare got and want because of
		// numeric precision issues.
		log.Printf("mantissa doesn't terminate quickly, using area heuristic")
		if err := checkEqualityHeuristic(want, got, log); err != nil {
			return err
		}
		return nil
	}

	if want.IsGeometryCollection() || got.IsGeometryCollection() {
		// We can't use Equals from GEOS on GeometryCollections, so we can't
		// use proper Equals for this case.
		log.Printf("want or got is a geometry collection, using area heuristic")
		if err := checkEqualityHeuristic(want, got, log); err != nil {
			return err
		}
		return nil
	}

	eq, err := geos.Equals(want, got)
	if err != nil {
		return err
	}
	if !eq {
		log.Printf("want: %v", want.AsText())
		log.Printf("got:  %v", got.AsText())
		return errMismatch
	}
	return nil
}

// checkEqualityHeuristic checks some necessary but not sufficient properties
// of two geometries if they are to be equal.
//
// TODO: we could come up with some smarter heuristics. E.g. distance sampled
// by many random points.
func checkEqualityHeuristic(want, got geom.Geometry, log *log.Logger) error {
	wantArea := want.Area()
	gotArea := got.Area()
	if math.Abs(wantArea-gotArea) > 1e-3 {
		log.Printf("wantWKT: %v\n", want.AsText())
		log.Printf("gotWKT:  %v\n", got.AsText())
		log.Printf("wantArea: %v\n", wantArea)
		log.Printf("gotArea:  %v\n", gotArea)
		return errMismatch
	}
	return nil
}

func checkRelate(h *Handle, g1, g2 geom.Geometry, log *log.Logger) error {
	got, err := geom.Relate(g1, g2)
	if err != nil {
		return err
	}
	want, err := h.relate(g1, g2)
	if err != nil {
		if err == errLibgeosCrash {
			// Skip any tests that would cause libgeos to crash.
			return nil
		}
		return err
	}

	// Skip any linear and non-simple geometries. This is because GEOS has
	// inconsistent behaviour with the generated relate matrix, making it hard
	// to match the exact behaviour.
	if linearAndNonSimple(g1) || linearAndNonSimple(g2) {
		return nil
	}

	if !mantissaTerminatesQuickly(g1) || !mantissaTerminatesQuickly(g2) {
		// Numerical precision issues cause a large number of geometries to
		// differ compared to GEOS. There aren't really any heuristics that we
		// can fall back to, so we just have to skip these sorts of geometries.
		return nil
	}

	// There is a bug in GEOS that triggers when linear elements have no
	// boundary (e.g. due to the mod-2 rule).  The result of the bug is that
	// the EB (or BE) is reported as 0 rather than F.
	if linearAndEmptyBoundary(g1) || linearAndEmptyBoundary(g2) {
		return nil
	}

	if got != want {
		log.Printf("want: %v", want)
		log.Printf("got:  %v", got)
		return errMismatch
	}

	return nil
}

func checkRelateMatch(h *Handle, log *log.Logger) error {
	for i := 0; i < 1_000_000; i++ {
		mat := rand9("F012")
		pat := rand9("F012T*")
		want, err := h.relateMatch(mat, pat)
		if err != nil {
			log.Printf("could not calculate want: %v", err)
			return err
		}
		got, err := geom.RelateMatches(mat, pat)
		if err != nil {
			log.Printf("could not calculate got: %v", err)
			return err
		}
		if got != want {
			log.Printf("mat:  %v", mat)
			log.Printf("pat:  %v", pat)
			log.Printf("want: %v", want)
			log.Printf("got:  %v", got)
			return errMismatch
		}
	}
	return nil
}

func rand9(alphabet string) string {
	var buf [9]byte
	for i := range buf {
		buf[i] = alphabet[rand.Intn(len(alphabet))]
	}
	return string(buf[:])
}

repository: peterstace/simplefeatures

repo_name: peterstace/simplefeatures


text:
# Copyright (c) 2008, Ovidiu Sas - VoIP Embedded Inc., All Rights Reserved
# Released under the MIT license (see packages/COPYING)
DESCRIPTION = "The Asterisk open source software PBX"
HOMEPAGE = "http://www.asterisk.org"
SECTION = "voip"
LICENSE = "GPLv2"
PRIORITY = "optional"
SECTION = "console/telephony"
DEPENDS = "asterisk openssl curl"
PR = "r1"

DEFAULT_PREFERENCE = "-1"

SRC_URI="http://sources.nslu2-linux.org/sources/asterisk-addons-${PV}.tar.gz"

SRC_URI[md5sum] = "190622fb25b4d1402594dd2e1833808b"
SRC_URI[sha256sum] = "1af141e3d74b802e37bee75ef93f873b424363a287b6ca3d3f9e2e41dc2e88cf"

ARCH_efika="ppc"
ARCH_dht-walnut="ppc"
ARCH_magicbox="ppc"
ARCH_sequoia="ppc"

inherit autotools

EXTRA_OECONF =  "--with-ssl=${STAGING_EXECPREFIXDIR}\
		--with-termcap=${STAGING_EXECPREFIXDIR}\
		--with-curl=${STAGING_EXECPREFIXDIR}\
		--without-curses\
		--with-ncurses=${STAGING_EXECPREFIXDIR}\
		--without-mysqlclient\
		--with-h323\
		"

#export NOISY_BUILD=yes

export ASTCFLAGS = "-fsigned-char -I${STAGING_INCDIR} -DPATH_MAX=4096"
export ASTLDFLAGS="${LDFLAGS} -lpthread -ldl -lresolv "
export PROC="${ARCH}"

do_configure () {
	# Looks like rebuilding configure doesn't work, so we are skipping
	# that and are just using the shipped one
	gnu-configize
	libtoolize --force
	oe_runconf
}

do_compile() {
	(
	#make sure that menuselect gets build using host toolchain
	unset CC LD CXX CCLD CFLAGS CPPFLAGS LDFLAGS CXXFLAGS
	cd menuselect
	./configure
	oe_runmake
	cd ../
	) || exit 1
	oe_runmake
}

CONFFILES_${PN} += "${sysconfdir}/asterisk/mobile.conf"
CONFFILES_${PN} += "${sysconfdir}/asterisk/res_mysql.conf"
CONFFILES_${PN} += "${sysconfdir}/asterisk/ooh323.conf"
CONFFILES_${PN} += "${sysconfdir}/asterisk/cdr_mysql.conf"

repository: overo/overo-oe-natty

repo_name: overo/overo-oe-natty

branch_name: HEAD


text:
SUMMARY = "Pykka is a Python implementation of the actor model"
HOMEPAGE = "https://www.pykka.org/"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"

SRC_URI[md5sum] = "50e4f2877c0825788219bc442a86a293"
SRC_URI[sha256sum] = "e847ffeadee49b563426ab803e8eee67264d773e38ca14763fdcda56411e3c11"

PYPI_PACKAGE = "Pykka"
inherit pypi setuptools

repository: sashko/meta-bistro

repo_name: sashko/meta-bistro