Create GSchemViewer Repo
Create GSchemViewer Repo

--- /dev/null
+++ b/src/data/sym/capacitor-1.sym
@@ -1,1 +1,38 @@
+v 20050820 1
+P 0 200 200 200 1 0 0
+{
+T 150 250 5 8 0 1 0 6 1
+pinnumber=1
+T 150 150 5 8 0 1 0 8 1
+pinseq=1
+T 200 200 9 8 0 1 0 0 1
+pinlabel=1
+T 200 200 5 8 0 1 0 2 1
+pintype=pas
+}
+P 900 200 700 200 1 0 0
+{
+T 750 250 5 8 0 1 0 0 1
+pinnumber=2
+T 750 150 5 8 0 1 0 2 1
+pinseq=2
+T 700 200 9 8 0 1 0 6 1
+pinlabel=2
+T 700 200 5 8 0 1 0 8 1
+pintype=pas
+}
+L 400 400 400 0 3 0 0 0 -1 -1
+L 500 400 500 0 3 0 0 0 -1 -1
+L 700 200 500 200 3 0 0 0 -1 -1
+L 400 200 200 200 3 0 0 0 -1 -1
+T 200 700 5 10 0 0 0 0 1
+device=CAPACITOR
+T 200 500 8 10 1 1 0 0 1
+refdes=C?
+T 200 1300 5 10 0 0 0 0 1
+description=capacitor
+T 200 1100 5 10 0 0 0 0 1
+numslots=0
+T 200 900 5 10 0 0 0 0 1
+symversion=0.1
 

--- /dev/null
+++ b/src/data/sym/capacitor-2.sym
@@ -1,1 +1,40 @@
+v 20050820 1
+P 0 200 200 200 1 0 0
+{
+T 150 250 5 8 1 1 0 6 1
+pinnumber=1
+T 200 150 5 8 0 1 0 8 1
+pinseq=1
+T 250 200 9 8 0 1 0 0 1
+pinlabel=+
+T 250 200 5 8 0 1 0 2 1
+pintype=pas
+}
+P 900 200 700 200 1 0 0
+{
+T 750 250 5 8 1 1 0 0 1
+pinnumber=2
+T 700 150 5 8 0 1 0 2 1
+pinseq=2
+T 650 200 9 8 0 1 0 6 1
+pinlabel=-
+T 650 200 5 8 0 1 0 8 1
+pintype=pas
+}
+L 400 400 400 0 3 0 0 0 -1 -1
+L 700 200 500 200 3 0 0 0 -1 -1
+L 400 200 200 200 3 0 0 0 -1 -1
+T 200 700 5 10 0 0 0 0 1
+device=POLARIZED_CAPACITOR
+A 1200 200 700 165 30 3 0 0 0 -1 -1
+L 289 400 289 300 3 0 0 0 -1 -1
+L 340 349 240 349 3 0 0 0 -1 -1
+T 200 500 8 10 1 1 0 0 1
+refdes=C?
+T 200 1300 5 10 0 0 0 0 1
+description=polarized capacitor
+T 200 1100 5 10 0 0 0 0 1
+numslots=0
+T 200 900 5 10 0 0 0 0 1
+symversion=0.1
 

--- /dev/null
+++ b/src/data/sym/connector1-2.sym
@@ -1,1 +1,27 @@
+v 20041228 1
+T 700 900 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 850 5 10 0 0 0 0 1
+device=CONNECTOR_1
+T 300 1050 5 10 0 0 0 0 1
+footprint=SIP1N
+T 300 1250 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 1450 5 10 0 0 0 0 1
+description=generic connector
+T 300 1650 5 10 0 0 0 0 1
+numslots=0
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=1
+T 200 350 5 8 0 1 0 8 1
+pinseq=1
+T 350 400 9 8 1 1 0 0 1
+pinlabel=1
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/connector10-2.sym
@@ -1,1 +1,135 @@
+v 20041228 1
+T 700 4500 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 4450 5 10 0 0 0 0 1
+device=CONNECTOR_10
+T 300 4650 5 10 0 0 0 0 1
+footprint=SIP10N
+T 300 4850 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 5050 5 10 0 0 0 0 1
+description=generic connector
+T 300 5250 5 10 0 0 0 0 1
+numslots=0
+P 0 4000 200 4000 1 0 0
+{
+T 200 4050 5 8 0 1 0 6 1
+pinnumber=1
+T 200 3950 5 8 0 1 0 8 1
+pinseq=1
+T 350 4000 9 8 1 1 0 0 1
+pinlabel=1
+T 350 4000 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 4000 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 3600 200 3600 1 0 0
+{
+T 200 3650 5 8 0 1 0 6 1
+pinnumber=2
+T 200 3550 5 8 0 1 0 8 1
+pinseq=2
+T 350 3600 9 8 1 1 0 0 1
+pinlabel=2
+T 350 3600 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 3600 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 3200 200 3200 1 0 0
+{
+T 200 3250 5 8 0 1 0 6 1
+pinnumber=3
+T 200 3150 5 8 0 1 0 8 1
+pinseq=3
+T 350 3200 9 8 1 1 0 0 1
+pinlabel=3
+T 350 3200 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 3200 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2800 200 2800 1 0 0
+{
+T 200 2850 5 8 0 1 0 6 1
+pinnumber=4
+T 200 2750 5 8 0 1 0 8 1
+pinseq=4
+T 350 2800 9 8 1 1 0 0 1
+pinlabel=4
+T 350 2800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2400 200 2400 1 0 0
+{
+T 200 2450 5 8 0 1 0 6 1
+pinnumber=5
+T 200 2350 5 8 0 1 0 8 1
+pinseq=5
+T 350 2400 9 8 1 1 0 0 1
+pinlabel=5
+T 350 2400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2000 200 2000 1 0 0
+{
+T 200 2050 5 8 0 1 0 6 1
+pinnumber=6
+T 200 1950 5 8 0 1 0 8 1
+pinseq=6
+T 350 2000 9 8 1 1 0 0 1
+pinlabel=6
+T 350 2000 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2000 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1600 200 1600 1 0 0
+{
+T 200 1650 5 8 0 1 0 6 1
+pinnumber=7
+T 200 1550 5 8 0 1 0 8 1
+pinseq=7
+T 350 1600 9 8 1 1 0 0 1
+pinlabel=7
+T 350 1600 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1600 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1200 200 1200 1 0 0
+{
+T 200 1250 5 8 0 1 0 6 1
+pinnumber=8
+T 200 1150 5 8 0 1 0 8 1
+pinseq=8
+T 350 1200 9 8 1 1 0 0 1
+pinlabel=8
+T 350 1200 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1200 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 800 200 800 1 0 0
+{
+T 200 850 5 8 0 1 0 6 1
+pinnumber=9
+T 200 750 5 8 0 1 0 8 1
+pinseq=9
+T 350 800 9 8 1 1 0 0 1
+pinlabel=9
+T 350 800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=10
+T 200 350 5 8 0 1 0 8 1
+pinseq=10
+T 350 400 9 8 1 1 0 0 1
+pinlabel=10
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 4400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/connector2-2.sym
@@ -1,1 +1,39 @@
+v 20041228 1
+T 700 1300 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 1250 5 10 0 0 0 0 1
+device=CONNECTOR_2
+T 300 1450 5 10 0 0 0 0 1
+footprint=SIP2N
+T 300 1650 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 1850 5 10 0 0 0 0 1
+description=generic connector
+T 300 2050 5 10 0 0 0 0 1
+numslots=0
+P 0 800 200 800 1 0 0
+{
+T 200 850 5 8 0 1 0 6 1
+pinnumber=1
+T 200 750 5 8 0 1 0 8 1
+pinseq=1
+T 350 800 9 8 1 1 0 0 1
+pinlabel=1
+T 350 800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=2
+T 200 350 5 8 0 1 0 8 1
+pinseq=2
+T 350 400 9 8 1 1 0 0 1
+pinlabel=2
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 1200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/connector3-2.sym
@@ -1,1 +1,51 @@
+v 20041228 1
+T 700 1700 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 1650 5 10 0 0 0 0 1
+device=CONNECTOR_3
+T 300 1850 5 10 0 0 0 0 1
+footprint=SIP3N
+T 300 2050 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 2250 5 10 0 0 0 0 1
+description=generic connector
+T 300 2450 5 10 0 0 0 0 1
+numslots=0
+P 0 1200 200 1200 1 0 0
+{
+T 200 1250 5 8 0 1 0 6 1
+pinnumber=1
+T 200 1150 5 8 0 1 0 8 1
+pinseq=1
+T 350 1200 9 8 1 1 0 0 1
+pinlabel=1
+T 350 1200 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1200 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 800 200 800 1 0 0
+{
+T 200 850 5 8 0 1 0 6 1
+pinnumber=2
+T 200 750 5 8 0 1 0 8 1
+pinseq=2
+T 350 800 9 8 1 1 0 0 1
+pinlabel=2
+T 350 800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=3
+T 200 350 5 8 0 1 0 8 1
+pinseq=3
+T 350 400 9 8 1 1 0 0 1
+pinlabel=3
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 1600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/connector4-2.sym
@@ -1,1 +1,63 @@
+v 20041228 1
+T 700 2100 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 2050 5 10 0 0 0 0 1
+device=CONNECTOR_4
+T 300 2250 5 10 0 0 0 0 1
+footprint=SIP4N
+T 300 2450 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 2650 5 10 0 0 0 0 1
+description=generic connector
+T 300 2850 5 10 0 0 0 0 1
+numslots=0
+P 0 1600 200 1600 1 0 0
+{
+T 200 1650 5 8 0 1 0 6 1
+pinnumber=1
+T 200 1550 5 8 0 1 0 8 1
+pinseq=1
+T 350 1600 9 8 1 1 0 0 1
+pinlabel=1
+T 350 1600 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1600 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1200 200 1200 1 0 0
+{
+T 200 1250 5 8 0 1 0 6 1
+pinnumber=2
+T 200 1150 5 8 0 1 0 8 1
+pinseq=2
+T 350 1200 9 8 1 1 0 0 1
+pinlabel=2
+T 350 1200 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1200 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 800 200 800 1 0 0
+{
+T 200 850 5 8 0 1 0 6 1
+pinnumber=3
+T 200 750 5 8 0 1 0 8 1
+pinseq=3
+T 350 800 9 8 1 1 0 0 1
+pinlabel=3
+T 350 800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=4
+T 200 350 5 8 0 1 0 8 1
+pinseq=4
+T 350 400 9 8 1 1 0 0 1
+pinlabel=4
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 2000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/connector5-2.sym
@@ -1,1 +1,75 @@
+v 20041228 1
+T 700 2500 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 2450 5 10 0 0 0 0 1
+device=CONNECTOR_5
+T 300 2650 5 10 0 0 0 0 1
+footprint=SIP5N
+T 300 2850 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 3050 5 10 0 0 0 0 1
+description=generic connector
+T 300 3250 5 10 0 0 0 0 1
+numslots=0
+P 0 2000 200 2000 1 0 0
+{
+T 200 2050 5 8 0 1 0 6 1
+pinnumber=1
+T 200 1950 5 8 0 1 0 8 1
+pinseq=1
+T 350 2000 9 8 1 1 0 0 1
+pinlabel=1
+T 350 2000 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2000 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1600 200 1600 1 0 0
+{
+T 200 1650 5 8 0 1 0 6 1
+pinnumber=2
+T 200 1550 5 8 0 1 0 8 1
+pinseq=2
+T 350 1600 9 8 1 1 0 0 1
+pinlabel=2
+T 350 1600 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1600 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1200 200 1200 1 0 0
+{
+T 200 1250 5 8 0 1 0 6 1
+pinnumber=3
+T 200 1150 5 8 0 1 0 8 1
+pinseq=3
+T 350 1200 9 8 1 1 0 0 1
+pinlabel=3
+T 350 1200 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1200 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 800 200 800 1 0 0
+{
+T 200 850 5 8 0 1 0 6 1
+pinnumber=4
+T 200 750 5 8 0 1 0 8 1
+pinseq=4
+T 350 800 9 8 1 1 0 0 1
+pinlabel=4
+T 350 800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=5
+T 200 350 5 8 0 1 0 8 1
+pinseq=5
+T 350 400 9 8 1 1 0 0 1
+pinlabel=5
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 2400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/connector6-2.sym
@@ -1,1 +1,87 @@
+v 20041228 1
+T 700 2900 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 2850 5 10 0 0 0 0 1
+device=CONNECTOR_6
+T 300 3050 5 10 0 0 0 0 1
+footprint=SIP6N
+T 300 3250 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 3450 5 10 0 0 0 0 1
+description=generic connector
+T 300 3650 5 10 0 0 0 0 1
+numslots=0
+P 0 2400 200 2400 1 0 0
+{
+T 200 2450 5 8 0 1 0 6 1
+pinnumber=1
+T 200 2350 5 8 0 1 0 8 1
+pinseq=1
+T 350 2400 9 8 1 1 0 0 1
+pinlabel=1
+T 350 2400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2000 200 2000 1 0 0
+{
+T 200 2050 5 8 0 1 0 6 1
+pinnumber=2
+T 200 1950 5 8 0 1 0 8 1
+pinseq=2
+T 350 2000 9 8 1 1 0 0 1
+pinlabel=2
+T 350 2000 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2000 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1600 200 1600 1 0 0
+{
+T 200 1650 5 8 0 1 0 6 1
+pinnumber=3
+T 200 1550 5 8 0 1 0 8 1
+pinseq=3
+T 350 1600 9 8 1 1 0 0 1
+pinlabel=3
+T 350 1600 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1600 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1200 200 1200 1 0 0
+{
+T 200 1250 5 8 0 1 0 6 1
+pinnumber=4
+T 200 1150 5 8 0 1 0 8 1
+pinseq=4
+T 350 1200 9 8 1 1 0 0 1
+pinlabel=4
+T 350 1200 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1200 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 800 200 800 1 0 0
+{
+T 200 850 5 8 0 1 0 6 1
+pinnumber=5
+T 200 750 5 8 0 1 0 8 1
+pinseq=5
+T 350 800 9 8 1 1 0 0 1
+pinlabel=5
+T 350 800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=6
+T 200 350 5 8 0 1 0 8 1
+pinseq=6
+T 350 400 9 8 1 1 0 0 1
+pinlabel=6
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 2800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/connector7-2.sym
@@ -1,1 +1,99 @@
+v 20041228 1
+T 700 3300 8 10 1 1 0 6 1
+refdes=CONN?
+T 300 3250 5 10 0 0 0 0 1
+device=CONNECTOR_7
+T 300 3450 5 10 0 0 0 0 1
+footprint=SIP7N
+T 300 3650 5 10 0 0 0 0 1
+author=Leon Kos
+T 300 3850 5 10 0 0 0 0 1
+description=generic connector
+T 300 4050 5 10 0 0 0 0 1
+numslots=0
+P 0 2800 200 2800 1 0 0
+{
+T 200 2850 5 8 0 1 0 6 1
+pinnumber=1
+T 200 2750 5 8 0 1 0 8 1
+pinseq=1
+T 350 2800 9 8 1 1 0 0 1
+pinlabel=1
+T 350 2800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2400 200 2400 1 0 0
+{
+T 200 2450 5 8 0 1 0 6 1
+pinnumber=2
+T 200 2350 5 8 0 1 0 8 1
+pinseq=2
+T 350 2400 9 8 1 1 0 0 1
+pinlabel=2
+T 350 2400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 2000 200 2000 1 0 0
+{
+T 200 2050 5 8 0 1 0 6 1
+pinnumber=3
+T 200 1950 5 8 0 1 0 8 1
+pinseq=3
+T 350 2000 9 8 1 1 0 0 1
+pinlabel=3
+T 350 2000 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 2000 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1600 200 1600 1 0 0
+{
+T 200 1650 5 8 0 1 0 6 1
+pinnumber=4
+T 200 1550 5 8 0 1 0 8 1
+pinseq=4
+T 350 1600 9 8 1 1 0 0 1
+pinlabel=4
+T 350 1600 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1600 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 1200 200 1200 1 0 0
+{
+T 200 1250 5 8 0 1 0 6 1
+pinnumber=5
+T 200 1150 5 8 0 1 0 8 1
+pinseq=5
+T 350 1200 9 8 1 1 0 0 1
+pinlabel=5
+T 350 1200 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 1200 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 800 200 800 1 0 0
+{
+T 200 850 5 8 0 1 0 6 1
+pinnumber=6
+T 200 750 5 8 0 1 0 8 1
+pinseq=6
+T 350 800 9 8 1 1 0 0 1
+pinlabel=6
+T 350 800 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 800 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 400 200 400 1 0 0
+{
+T 200 450 5 8 0 1 0 6 1
+pinnumber=7
+T 200 350 5 8 0 1 0 8 1
+pinseq=7
+T 350 400 9 8 1 1 0 0 1
+pinlabel=7
+T 350 400 5 8 0 1 0 2 1
+pintype=pas
+}
+V 250 400 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 300 0 400 3200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
 

--- /dev/null
+++ b/src/data/sym/diode-1.sym
@@ -1,1 +1,34 @@
+v 20031231 1
+L 300 400 300 0 3 0 0 0 -1 -1
+L 300 400 600 200 3 0 0 0 -1 -1
+T 400 600 5 10 0 0 0 0 1
+device=DIODE
+L 600 200 300 0 3 0 0 0 -1 -1
+L 600 400 600 0 3 0 0 0 -1 -1
+P 0 200 200 200 1 0 0
+{
+T 100 250 5 8 0 1 0 0 1
+pinnumber=1
+T 100 250 5 8 0 0 0 0 1
+pinseq=1
+T 100 250 5 8 0 1 0 0 1 
+pinlabel=1
+T 100 250 5 8 0 1 0 0 1 
+pintype=pas
+}
+P 900 200 700 200 1 0 0
+{
+T 700 250 5 8 0 1 0 0 1
+pinnumber=2
+T 700 250 5 8 0 0 0 0 1
+pinseq=2
+T 700 250 5 8 0 1 0 0 1 
+pinlabel=2
+T 700 250 5 8 0 1 0 0 1 
+pintype=pas
+}
+L 700 200 600 200 3 0 0 0 -1 -1
+L 300 200 200 200 3 0 0 0 -1 -1
+T 300 500 8 10 1 1 0 0 1
+refdes=D?
 

--- /dev/null
+++ b/src/data/sym/gnd-1.sym
@@ -1,1 +1,18 @@
+v 20031231 1
+P 100 100 100 300 1 0 1
+{
+T 158 161 5 4 0 1 0 0 1
+pinnumber=1
+T 158 161 5 4 0 0 0 0 1
+pinseq=1
+T 158 161 5 4 0 1 0 0 1 
+pinlabel=1
+T 158 161 5 4 0 1 0 0 1 
+pintype=pwr
+}
+L 0 100 200 100 3 0 0 0 -1 -1
+L 55 50 145 50 3 0 0 0 -1 -1
+L 80 10 120 10 3 0 0 0 -1 -1
+T 300 50 8 10 0 0 0 0 1
+net=GND:1
 

--- /dev/null
+++ b/src/data/sym/inductor-1.sym
@@ -1,1 +1,43 @@
+v 20050820 1
+P 900 100 750 100 1 0 0
+{
+T 800 150 5 8 0 1 0 0 1
+pinnumber=2
+T 800 50 5 8 0 1 0 2 1
+pinseq=2
+T 700 100 9 8 0 1 0 6 1
+pinlabel=2
+T 700 100 5 8 0 1 0 8 1
+pintype=pas
+}
+P 0 100 150 100 1 0 0
+{
+T 100 150 5 8 0 1 0 6 1
+pinnumber=1
+T 100 50 5 8 0 1 0 8 1
+pinseq=1
+T 200 100 9 8 0 1 0 0 1
+pinlabel=1
+T 200 100 5 8 0 1 0 2 1
+pintype=pas
+}
+A 237 100 75 0 180 3 0 0 0 -1 -1
+A 379 100 75 0 180 3 0 0 0 -1 -1
+A 521 100 75 0 180 3 0 0 0 -1 -1
+A 663 100 75 0 180 3 0 0 0 -1 -1
+T 200 500 5 10 0 0 0 0 1
+device=INDUCTOR
+L 738 100 750 100 3 0 0 0 -1 -1
+L 150 100 162 100 3 0 0 0 -1 -1
+A 308 100 4 180 180 3 0 0 0 -1 -1
+A 450 100 4 180 180 3 0 0 0 -1 -1
+A 592 100 4 180 180 3 0 0 0 -1 -1
+T 200 300 8 10 1 1 0 0 1
+refdes=L?
+T 200 1100 5 10 0 0 0 0 1
+description=inductor
+T 200 900 5 10 0 0 0 0 1
+numslots=0
+T 200 700 5 10 0 0 0 0 1
+symversion=0.1
 

--- /dev/null
+++ b/src/data/sym/jumper-1.sym
@@ -1,1 +1,31 @@
+v 20031231 1
+P 100 1000 100 800 1 0 0
+{
+T 150 850 5 8 1 1 0 0 1
+pinnumber=2
+T 150 850 5 8 0 0 0 0 1
+pinseq=2
+T 150 850 5 8 0 1 0 0 1 
+pinlabel=2
+T 150 850 5 8 0 1 0 0 1 
+pintype=pas
+}
+P 100 0 100 200 1 0 0
+{
+T 150 50 5 8 1 1 0 0 1
+pinnumber=1
+T 150 50 5 8 0 0 0 0 1
+pinseq=1
+T 150 50 5 8 0 1 0 0 1 
+pinlabel=1
+T 150 50 5 8 0 1 0 0 1 
+pintype=pas
+}
+V 100 700 50 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+V 100 300 50 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+B 0 200 200 600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+T 300 500 5 8 0 0 0 0 1
+device=JUMPER
+T 300 500 8 10 1 1 0 0 1
+refdes=J?
 

--- /dev/null
+++ b/src/data/sym/led-2.sym
@@ -1,1 +1,40 @@
+v 20031231 1
+T 800 300 8 10 1 1 0 0 1
+refdes=D?
+T 100 600 8 10 0 0 0 0 1
+device=LED
+P 0 100 200 100 1 0 0
+{
+T 100 150 5 8 0 1 0 0 1
+pinnumber=1
+T 100 150 5 8 0 0 0 0 1
+pinseq=1
+T 100 150 5 8 0 1 0 0 1 
+pinlabel=1
+T 100 150 5 8 0 1 0 0 1 
+pintype=pas
+}
+P 900 100 700 100 1 0 0
+{
+T 700 150 5 8 0 1 0 0 1
+pinnumber=2
+T 700 150 5 8 0 0 0 0 1
+pinseq=2
+T 700 150 5 8 0 1 0 0 1 
+pinlabel=2
+T 700 150 5 8 0 1 0 0 1 
+pintype=pas
+}
+L 400 200 500 100 3 0 0 0 -1 -1
+L 500 100 400 0 3 0 0 0 -1 -1
+L 400 200 400 0 3 0 0 0 -1 -1
+L 500 200 500 0 3 0 0 0 -1 -1
+L 500 100 700 100 3 0 0 0 -1 -1
+L 400 100 200 100 3 0 0 0 -1 -1
+L 430 240 530 340 3 0 0 0 -1 -1
+L 530 340 480 310 3 0 0 0 -1 -1
+L 530 340 500 290 3 0 0 0 -1 -1
+L 500 240 600 340 3 0 0 0 -1 -1
+L 600 340 550 310 3 0 0 0 -1 -1
+L 600 340 570 290 3 0 0 0 -1 -1
 

--- /dev/null
+++ b/src/data/sym/lm386-1.sym
@@ -1,1 +1,70 @@
+v 20031231 1
+T 625 950 8 8 0 0 0 0 1
+device=LM741
+T 225 350 9 8 1 0 0 0 1
+LM386
+T 200 900 8 10 1 1 0 0 1
+refdes=U?
+P 200 200 0 200 1 0 1
+{
+T 50 225 5 8 1 1 0 0 1
+pinnumber=2
+T 50 225 5 8 0 0 0 0 1
+pinseq=2
+}
+P 200 600 0 600 1 0 1
+{
+T 50 625 5 8 1 1 0 0 1
+pinnumber=3
+T 50 625 5 8 0 0 0 0 1
+pinseq=3
+}
+P 500 200 500 0 1 0 1
+{
+T 525 50 5 8 1 1 0 0 1
+pinnumber=4
+T 525 50 5 8 0 0 0 0 1
+pinseq=4
+}
+P 800 400 1000 400 1 0 1
+{
+T 875 425 5 8 1 1 0 0 1
+pinnumber=5
+T 875 425 5 8 0 0 0 0 1
+pinseq=5
+}
+P 500 600 500 800 1 0 1
+{
+T 550 675 5 8 1 1 0 0 1
+pinnumber=7
+T 550 675 5 8 0 0 0 0 1
+pinseq=7
+}
+L 200 800 200 0 3 0 0 0 -1 -1
+L 800 400 200 800 3 0 0 0 -1 -1
+L 300 650 300 550 3 0 0 0 -1 -1
+L 250 600 350 600 3 0 0 0 -1 -1
+L 250 200 350 200 3 0 0 0 -1 -1
+L 800 400 200 0 3 0 0 0 -1 -1
+P 700 323 700 100 1 0 1
+{
+T 725 150 5 8 1 1 0 0 1
+pinnumber=1
+T 725 150 5 8 0 0 0 0 1
+pinseq=1
+}
+P 700 471 700 700 1 0 1
+{
+T 750 575 5 8 1 1 0 0 1
+pinnumber=8
+T 750 575 5 8 0 0 0 0 1
+pinseq=8
+}
+P 400 666 400 900 1 0 1
+{
+T 311 764 5 8 1 1 0 0 1
+pinnumber=6
+T 311 764 5 8 0 0 0 0 1
+pinseq=6
+}
 

--- /dev/null
+++ b/src/data/sym/lm741-1.sym
@@ -1,1 +1,49 @@
+v 20031231 1
+T 625 950 8 8 0 0 0 0 1
+device=LM741
+T 225 350 9 8 1 0 0 0 1
+LM741
+T 200 900 8 10 1 1 0 0 1
+refdes=U?
+P 200 200 0 200 1 0 1
+{
+T 50 225 5 8 1 1 0 0 1
+pinnumber=2
+T 50 225 5 8 0 0 0 0 1
+pinseq=2
+}
+P 200 600 0 600 1 0 1
+{
+T 50 625 5 8 1 1 0 0 1
+pinnumber=3
+T 50 625 5 8 0 0 0 0 1
+pinseq=3
+}
+P 500 200 500 0 1 0 1
+{
+T 525 50 5 8 1 1 0 0 1
+pinnumber=4
+T 525 50 5 8 0 0 0 0 1
+pinseq=4
+}
+P 800 400 1000 400 1 0 1
+{
+T 875 425 5 8 1 1 0 0 1
+pinnumber=6
+T 875 425 5 8 0 0 0 0 1
+pinseq=6
+}
+P 500 600 500 800 1 0 1
+{
+T 550 675 5 8 1 1 0 0 1
+pinnumber=7
+T 550 675 5 8 0 0 0 0 1
+pinseq=7
+}
+L 200 800 200 0 3 0 0 0 -1 -1
+L 800 400 200 800 3 0 0 0 -1 -1
+L 300 650 300 550 3 0 0 0 -1 -1
+L 250 600 350 600 3 0 0 0 -1 -1
+L 250 200 350 200 3 0 0 0 -1 -1
+L 800 400 200 0 3 0 0 0 -1 -1
 

--- /dev/null
+++ b/src/data/sym/resistor-1.sym
@@ -1,1 +1,39 @@
+v 20031231 1
+L 600 200 500 0 3 0 0 0 -1 -1
+L 500 0 400 200 3 0 0 0 -1 -1
+L 400 200 300 0 3 0 0 0 -1 -1
+L 300 0 200 200 3 0 0 0 -1 -1
+T 300 400 5 10 0 0 0 0 1
+device=RESISTOR
+L 600 200 700 0 3 0 0 0 -1 -1
+L 700 0 750 100 3 0 0 0 -1 -1
+P 900 100 750 100 1 0 0
+{
+T 800 150 5 8 0 1 0 0 1
+pinnumber=2
+T 800 150 5 8 0 0 0 0 1
+pinseq=2
+T 800 150 5 8 0 1 0 0 1 
+pinlabel=2
+T 800 150 5 8 0 1 0 0 1 
+pintype=pas
+}
+P 0 100 152 100 1 0 0
+{
+T 100 150 5 8 0 1 0 0 1
+pinnumber=1
+T 100 150 5 8 0 0 0 0 1
+pinseq=1
+T 100 150 5 8 0 1 0 0 1 
+pinlabel=1
+T 100 150 5 8 0 1 0 0 1 
+pintype=pas
+}
+L 201 200 150 100 3 0 0 0 -1 -1
+T 200 300 8 10 1 1 0 0 1
+refdes=R?
+T 0 0 8 10 0 1 0 0 1
+pins=2
+T 0 0 8 10 0 1 0 0 1
+class=DISCRETE
 

--- /dev/null
+++ b/src/data/sym/resistor-variable-1.sym
@@ -1,1 +1,49 @@
+v 20031231 1
+P 500 450 500 600 1 0 1
+{
+T 400 500 5 8 0 1 0 0 1
+pinnumber=3
+T 400 500 5 8 0 0 0 0 1
+pinseq=3
+T 400 500 5 8 0 1 0 0 1 
+pinlabel=3
+T 400 500 5 8 0 1 0 0 1 
+pintype=pas
+}
+L 500 200 448 301 3 0 0 0 -1 -1
+L 501 201 553 302 3 0 0 0 -1 -1
+L 600 200 500 0 3 0 0 0 -1 -1
+L 500 0 400 200 3 0 0 0 -1 -1
+L 400 200 300 0 3 0 0 0 -1 -1
+L 300 0 200 200 3 0 0 0 -1 -1
+T 800 900 5 10 0 0 0 0 1
+device=VARIABLE_RESISTOR
+L 600 200 700 0 3 0 0 0 -1 -1
+L 700 0 750 100 3 0 0 0 -1 -1
+P 900 100 750 100 1 0 0
+{
+T 800 150 5 8 0 1 0 0 1
+pinnumber=2
+T 800 150 5 8 0 0 0 0 1
+pinseq=2
+T 800 150 5 8 0 1 0 0 1 
+pinlabel=2
+T 800 150 5 8 0 1 0 0 1 
+pintype=pas
+}
+P 0 100 152 100 1 0 0
+{
+T 100 150 5 8 0 1 0 0 1
+pinnumber=1
+T 100 150 5 8 0 0 0 0 1
+pinseq=1
+T 100 150 5 8 0 1 0 0 1 
+pinlabel=1
+T 100 150 5 8 0 1 0 0 1 
+pintype=pas
+}
+L 201 200 150 100 3 0 0 0 -1 -1
+L 500 200 500 450 3 0 0 0 -1 -1
+T 600 400 8 10 1 1 0 0 1
+refdes=R?
 

--- /dev/null
+++ b/src/data/sym/triac-1.sym
@@ -1,1 +1,48 @@
+v 20031231 1
+L 300 550 300 50 3 0 0 0 -1 -1
+L 300 400 600 250 3 0 0 0 -1 -1
+T 300 900 8 10 0 0 0 0 1
+device=TRIAC
+L 600 200 300 50 3 0 0 0 -1 -1
+L 600 550 600 50 3 0 0 0 -1 -1
+P 0 300 200 300 1 0 0
+{
+T 100 350 5 8 0 1 0 0 1
+pinnumber=1
+T 100 350 5 8 0 0 0 0 1
+pinseq=1
+T 100 350 5 8 0 1 0 0 1 
+pinlabel=1
+T 100 350 5 8 0 1 0 0 1 
+pintype=pas
+}
+P 900 300 700 300 1 0 0
+{
+T 700 350 5 8 0 1 0 0 1
+pinnumber=2
+T 700 350 5 8 0 0 0 0 1
+pinseq=2
+T 700 350 5 8 0 1 0 0 1 
+pinlabel=2
+T 700 350 5 8 0 1 0 0 1 
+pintype=pas
+}
+L 700 300 600 300 3 0 0 0 -1 -1
+L 300 300 200 300 3 0 0 0 -1 -1
+T 300 600 8 10 1 1 0 0 1
+refdes=D?
+L 600 200 300 350 3 0 0 0 -1 -1
+L 300 400 600 550 3 0 0 0 -1 -1
+L 600 300 700 500 3 0 0 0 -1 -1
+P 700 700 700 500 1 0 0
+{
+T 700 700 5 10 0 1 0 0 1
+pinnumber=3
+T 700 700 5 10 0 1 0 0 1
+pinseq=3
+T 700 700 5 10 0 1 0 0 1 
+pinlabel=3
+T 700 700 5 10 0 1 0 0 1 
+pintype=pas
+}
 

file:b/src/index.html (new)
--- /dev/null
+++ b/src/index.html
@@ -1,1 +1,16 @@
-
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>GSchemViewer</title>
+		<script data-main="js/main.js" src="js/require.js"></script>
+	</head>
+	<body>
+		<center>
+			Schem URL:
+			<input id="schurl" type="text" name="url" value="/Project_Files/MRF24Outlet.sch"/>
+			<button id="load">Load</button>
+			<br>
+			<canvas id="schcan" width="800" height="600" tabindex="1"></canvas>
+		</center>
+	</body>
+</html>

--- /dev/null
+++ b/src/js/circuit/GSchemViewer.js
@@ -1,1 +1,1061 @@
-
+/**
+ * GSchemViewer.js
+ * Michael Marques / DrYerzinia / KD0WGV
+ * 09-05-2013
+ * r8
+ *
+ * This is a simple script for parsing and displaying .sch
+ * files from gEDA in an HTML5 environment.
+ */
+
+define(function(){
+	
+	function GSV(canvas, attach) {
+
+		this.construct(canvas, attach);
+
+	}
+
+	GSV.prototype.construct = function(canvas, attach){
+
+		this.canvas = canvas;
+		this.current_angle = 0;
+		this.current_mirror = false;
+
+		this.embedded = {};
+		this.external = {};
+
+		this.txt = [];
+		this.pins = [];
+		this.nets = [];
+		this.components = [];
+
+		this.junctions = {};
+		this.no_connection = {};
+
+		this.external.total = 0;
+		this.external.loaded = 0;
+		this.external.ready;
+
+		if(attach){
+
+			this.ctx = canvas.getContext('2d');
+
+			this.buffer_layer = document.createElement('canvas');
+			this.buffer_layer.width = this.canvas.width;
+			this.buffer_layer.height = this.canvas.height;
+
+			this.buffer_ctx = this.buffer_layer.getContext('2d');
+
+			this.last_time = 0;
+			this.end_time = 0;
+
+			this.init_handlers();
+		}
+
+	};
+
+	GSV.prototype.resize = function(){
+
+		this.buffer_layer.width = this.canvas.width;
+		this.buffer_layer.height = this.canvas.height;
+
+	};
+
+	GSV.prototype.init_handlers = function(){
+
+		this.clicking = false;
+		
+		this.mouse_x = this.canvas.width/2;
+		this.mouse_y = this.canvas.height/2;
+
+		if(window.addEventListener){
+			document.addEventListener("mouseup", function(t){return function(e){if(e.which == 1) t.clicking = false;};}(this), false);
+		} else document.attachEvent("mouseup", function(t){return function(e){if(e.which == 1) t.clicking = false;};}(this));
+		this.canvas.onmousedown = function(t){return function(e){if(e.which == 1) t.clicking = true;};}(this);
+		this.canvas.onkeydown = function(t){return function(e){t.update_key(e);};}(this);
+
+		this.canvas.onmousemove = function(t){return function(e){	
+			if(t.clicking)
+				t.update_mouse_drag(t.mouse_x-e.pageX, t.mouse_y-e.pageY);		
+			t.mouse_x = e.pageX;
+			t.mouse_y = e.pageY;
+		};}(this);
+		
+		if(window.addEventListener){
+			this.canvas.addEventListener("mousewheel", function(t){return function(e){t.wheel(e);};}(this), false);
+		        this.canvas.addEventListener('DOMMouseScroll', function(t){return function(e){t.wheel(e);};}(this), false);
+		} else this.canvas.attachEvent("onmousewheel", function(t){return function(e){t.wheel(e);};}(this));
+
+	};
+
+	GSV.what_color = ['#000000', '#FFFFFF', '#FF0000', '#00FF00', '#0000FF', '#FFFF00',
+		'#00FF00', '#00FF00', '#FFFF00', '#00FF00', '#00FF00', '#00FF00', '#00FF00',
+		'#00FF00', '#00FF00', '#00FF00', '#00FF00', '#00FF00', '#00FF00', '#00FF00',
+		'#00FF00', '#FFFF00', '#00FF00', '#00FF00'];
+
+	GSV.setSymbolLocation = function(location){
+		GSV.symbolLocation = location;
+	};
+
+	// Parameter of path to search for symbols
+	GSV.symbolLocation = '';
+
+	GSV.draw_line = function(ctx, x1, y1, x2, y2, color){
+
+		ctx.beginPath();
+		ctx.moveTo(x1, y1);
+		ctx.lineTo(x2, y2);
+		ctx.strokeStyle = color;
+		ctx.closePath();
+		ctx.stroke();
+
+	};
+
+	// Net object prototype
+	GSV.prototype.Net = function(x1, x2, y1, y2, color){
+
+		this.x1 = x1;
+		this.x2 = x2;
+		this.y1 = y1;
+		this.y2 = y2;
+		this.color = color;
+
+	};
+
+	GSV.prototype.Net.prototype.render = function(ctx){
+
+		GSV.draw_line(ctx, this.x1, this.y1, this.x2, this.y2, GSV.what_color[this.color]);
+
+	};
+
+	// Component Object Prototype
+		GSV.prototype.Component = function(gsv, x, y, selectable, angle, mirror, basename){
+
+		this.gsv = gsv;
+		this.x = x;
+		this.y = y;
+		this.selectable = selectable;
+		this.angle = angle;
+		this.mirror = mirror;
+		this.basename = basename;
+
+		this.parts = [];
+		this.txt = [];
+
+	};
+
+	GSV.prototype.Component.prototype.render = function(ctx){
+
+		var p, base, c, comp, t;
+
+		for(p = 0; p < this.parts.length; p++) this.parts[p].render(ctx);
+
+		if(this.basename.replace(/\.|-/g,'_') in this.gsv.external){	// TODO: Think of better way for external to be accesible
+
+			base = this.gsv.external[this.basename.replace(/\.|-/g,'_')];	
+
+			for(t = 0; t < this.txt.length; t++) this.txt[t].render(ctx);
+
+			// Render external components shifted to their appropriate
+			// positions
+			for(c = 0; c < base.components.length; c++){
+				comp = base.components[c];
+				ctx.save();
+				ctx.translate(this.x, this.y);
+				if(this.mirror == 1){
+					ctx.scale(-1, 1);
+					this.gsv.current_mirror = !this.gsv.current_mirror;
+				}
+				ctx.rotate(this.angle*Math.PI/180);
+				this.gsv.current_angle += this.angle;
+				comp.render(ctx);
+				this.gsv.current_angle -= this.angle;
+				if(this.mirror == 1) this.gsv.current_mirror = !this.gsv.current_mirror;
+				ctx.restore();
+			}
+					
+		} else {
+			for(t = 0; t < this.txt.length; t++) this.txt[t].render(ctx);
+			if(this.basename.length < 8 || (this.basename.substr(0,8) != 'EMBEDDED'))
+				console.log('Could not find external symbol: ' + this.basename.replace(/\.|-/g,'_'));
+		}
+
+	};
+
+	// Pin Object Prototype
+	GSV.prototype.Pin = function(x1, y1, x2, y2, color, pintype, whichend){
+
+		this.x1 = x1;
+		this.y1 = y1;
+		this.x2 = x2;
+		this.y2 = y2;
+		this.color = color;
+		this.pintype = pintype;
+		this.whichend = whichend;
+		this.txt = [];
+
+	};
+
+	GSV.prototype.Pin.prototype.render = function(ctx){
+
+		GSV.draw_line(ctx, this.x1, this.y1, this.x2, this.y2, GSV.what_color[this.color]);
+		
+		for(var t = 0; t < this.txt.length; t++) this.txt[t].render(ctx);
+
+	};
+
+	// Text Object Prototype
+	GSV.prototype.Text = function(gsv, x, y, color, size, visibility, show_name, angle, alignment, num_lines){
+
+		this.gsv = gsv;
+		this.x = x;
+		this.y = y;
+		this.color = color;
+		this.size = size;
+		this.visibility = visibility;
+		this.show_name = show_name;
+		this.angle = angle;
+		this.alignment = alignment;
+		this.num_lines = num_lines;
+		this.strings = [];
+
+	};
+
+	GSV.prototype.Text.prototype.render = function(ctx){
+
+		if(this.visibility == 0) return;
+
+		var s, str, adjust_y;
+
+		for(s = 0; s < this.strings.length; s++){
+
+			str = this.strings[s];
+			
+			if(str){
+		
+				if(this.show_name == 1) str = str.split('=')[1];
+				else if(this.show_name == 2) str = str.split('=')[0];
+			
+				align = 'start';
+			
+				switch(this.alignment){
+					case 0:
+					case 2:
+						align = 'start';
+						break;
+					case 6:
+					case 8:
+						align = 'end';
+						break;
+				}
+			
+				adjust_y = 0;
+			
+				if(this.angle == 180){
+					if(align == 'start') align = 'end';
+					else if(align == 'end') align = 'start';
+			
+					if(this.alignment == 0 || this.alignment == 6) adjust_y = 130;
+				} else {
+					if(this.alignment == 2 || this.alignment == 8) adjust_y = 250;
+				}
+				if(this.gsv.fs != this.size){
+					ctx.font = Math.floor(this.size*14.0)+'pt Arial, Helvetica, sans-serif';
+					this.gsv.fs = this.size;
+				}
+				ctx.save();
+				ctx.translate(this.x, this.y-adjust_y-s*250);
+				// Correct for origin change
+				if(this.gsv.current_mirror && this.gsv.current_angle == 0){
+					ctx.scale(-1, -1);
+					if(align == 'start') align = 'end';
+					else align = 'start';
+				} else ctx.scale(1,-1);
+				if(this.angle != 0 && this.angle != 180) ctx.rotate(Math.PI*this.angle/-180);
+				else if(this.gsv.current_angle == 180){
+					if(align == 'start') align = 'end';
+					else align = 'start';
+					ctx.rotate(Math.PI*-1*this.gsv.current_angle/-180);
+				}
+				ctx.textAlign = align;
+				ctx.fillStyle = GSV.what_color[this.color];
+				ctx.fillText(str, 0, 0);
+				ctx.restore();
+			}
+
+		}
+
+	};
+
+	// Box Object Prototype
+	GSV.prototype.Box = function(x, y, width, height, color, line_width, capstyle, dashstyle, dashlength, dashspace, filltype, fillwidth, angle1, pitch1, angle2, pitch2){
+
+		this.x = x;
+		this.y = y;
+		this.width = width;
+		this.height = height;
+		this.color = color;
+		this.line_width = line_width;
+		this.capstyle = capstyle;
+		this.dashstyle = dashstyle;
+		this.dashlength = dashlength;
+		this.dashspace = dashspace;
+		this.filltype = filltype;
+		this.fillwidth = fillwidth;
+		this.angle1 = angle1;
+		this.pitch1 = pitch1;
+		this.angle2 = angle2;
+		this.pitch2 = pitch2;
+
+	};
+
+	GSV.prototype.Box.prototype.render = function(ctx){
+
+		ctx.beginPath();
+		ctx.rect(this.x, this.y, this.width, this.height);
+		ctx.strokeStyle = GSV.what_color[this.color];
+		ctx.closePath();
+		ctx.stroke();
+
+	};
+
+	// Circle Object Prototype
+	GSV.prototype.Circle = function(x, y, radius, color, width, capstyle, dashstyle, dashlength, dashspace, filltype, fillwidth, angle1, pitch1, angle2, pitch2){
+
+		this.x = x;
+		this.y = y;
+		this.radius = radius;
+		this.color = color;
+		this.width = width;
+		this.capstyle = capstyle;
+		this.dashstyle = dashstyle;
+		this.dashlength = dashlength;
+		this.dashspace = dashspace;
+		this.filltype = filltype;
+		this.fillwidth = fillwidth;
+		this.angle1 = angle1;
+		this.pitch1 = pitch1;
+		this.angle2 = angle2;
+		this.pitch2 = pitch2;
+
+	};
+
+	GSV.prototype.Circle.prototype.render = function(ctx){
+
+		ctx.beginPath();
+		ctx.arc(this.x, this.y, this.radius, 0, 2*Math.PI);
+		ctx.strokeStyle = GSV.what_color[this.color];
+		ctx.closePath();
+		ctx.stroke();
+
+	};
+
+	GSV.prototype.Arc = function(gsv, x, y, radius, startangle, sweepangle, color, width, capstyle, dashstyle, dashlength, dashspace){
+
+		this.gsv = gsv;
+		this.x = x;
+		this.y = y;
+		this.radius = radius;
+		this.startangle = startangle;
+		this.sweepangle = sweepangle;
+		this.color = color;
+
+	};
+
+	GSV.prototype.Arc.prototype.render = function(ctx){
+
+		ctx.beginPath();
+		ctx.arc(this.x, this.y, this.radius, (Math.PI*this.startangle/180.0), (Math.PI*(this.startangle+this.sweepangle)/180.0), false); 
+		ctx.strokeStyle = GSV.what_color[this.color];
+		ctx.stroke();
+		ctx.closePath();
+
+	};
+
+	// Line Object Prototype
+	GSV.prototype.Line = function(x1, y1, x2, y2, color, width, capstyle, dashstyle, dashlength, dashspace){
+
+		this.x1 = x1;
+		this.y1 = y1;
+		this.x2 = x2;
+		this.y2 = y2;
+		this.color = color;
+		this.width = width;
+		this.capstyle = capstyle;
+		this.dashstyle = dashstyle;
+		this.dashlength = dashlength;
+		this.dashspace = dashspace;
+
+	};
+
+	GSV.prototype.Line.prototype.render = function(ctx){
+
+		GSV.draw_line(ctx, this.x1, this.y1, this.x2, this.y2, GSV.what_color[this.color]);
+
+	};
+
+	// Path Object Prototype
+	GSV.prototype.Path = function(color, width, capstyle, dashstyle, dashlength, dashspace, filltype, fillwidth, angle1, pitch1, angle2, pitch2, numlines){
+
+		this.color = color;
+		this.width = width;
+		this.capstyle = capstyle;
+		this.dashstyle = dashstyle;
+		this.dashlength = dashlength;
+		this.dashspace = dashspace;
+		this.filltype = filltype;
+		this.fillwidth = fillwidth;
+		this.angle1 = angle1;
+		this.pitch1 = pitch1;
+		this.angle2 = angle2;
+		this.pitch2 = pitch2;
+		this.numlines = numlines;
+		this.segments = [];
+
+	};
+
+	GSV.prototype.Path.prototype.render = function(ctx){
+
+		var s, seg;
+
+		for(s = 0; s < this.segments.length; s++){
+			seg = this.segments[s];
+
+			if(seg.type == 'M'){
+				ctx.beginPath();
+				ctx.moveTo(seg.x, seg.y);
+			} else if(seg.type == 'L'){
+				ctx.lineTo(seg.x, seg.y);
+			} else if(seg.type == 'z'){
+				ctx.closePath();
+				ctx.fillStyle = GSV.what_color[this.color];
+				ctx.fill();
+			}
+		}
+	};
+
+
+	// Functions for finding junction and pin intersections
+	GSV.is_on = function(a, b, c){
+
+		var withinv;
+
+		if(a.x != b.x) withinv = GSV.within(a.x, c.x, b.x);
+		else withinv = GSV.within(a.y, c.y, b.y);
+
+		return (GSV.collinear(a, b, c) && withinv);
+
+	};
+
+	// Inclusive of a and b
+	GSV.is_on_i = function(a, b, c){
+
+		var withinv;
+
+		if(a.x != b.x) withinv = GSV.within_i(a.x, c.x, b.x);
+		else withinv = GSV.within_i(a.y, c.y, b.y);
+
+		return (GSV.collinear(a, b, c) && withinv);
+
+	};
+
+	GSV.collinear = function(a, b, c){
+		return (((b.x - a.x) * (c.y - a.y)) == ((c.x - a.x) * (b.y - a.y)));
+	};
+
+	GSV.within = function(p, q, r){
+		return (((p < q)&&(q < r)) || ((r < q)&&(q < p)));
+	};
+
+	GSV.within_i = function(p, q, r){
+		return (((p <= q)&&(q <= r)) || ((r <= q)&&(q <= p)));
+	};
+
+	// Find bound of schematic for centering
+	GSV.prototype.schem_bounds = function(schem, x1, y1, x2, y2){
+		if('xmax' in schem){
+			if(schem.xmax < x1) schem.xmax = x1;
+		} else schem.xmax = x1;
+		if(schem.xmax < x2) schem.xmax = x2;
+		if('xmin' in schem){
+			if(schem.xmin > x1) schem.xmin = x1;
+		} else schem.xmin = x1;
+		if(schem.xmin > x2) schem.xmin = x2;
+		if('ymax' in schem){
+			if(schem.ymax < y1) schem.ymax = y1;
+		} else schem.ymax = y1;
+		if(schem.ymax < y2) schem.ymax = y2;
+		if('ymin' in schem){
+			if(schem.ymin > y1) schem.ymin = y1;
+		} else schem.ymin = y1;
+		if(schem.ymin > y2) schem.ymin = y2;
+	};
+
+	GSV.prototype.parse_data = function(gsv, sch_data, ready){
+
+		var	sch_lines = sch_data.split('\n'),
+			current_obj = null,
+			current_sub_obj = null,
+			current_path = null,
+			squar_paren	= false,
+			curly_paren	= false,
+			path_count	= 0,
+			attribute	= 0,
+			current_txt = null,
+			l, n, line, net,
+			n_dat, n2_dat,
+			num_lines, new_obj,
+			x, y, width, height,
+			x1, x2, y1, y2,
+			basename,
+			matches1, matches2,
+			p1, pin1, nc_flag, pin_out,
+			xd, yd,
+			new_sym_req;
+
+		for(l = 0; l < sch_lines.length; l++){
+
+			line = sch_lines[l];
+			n_dat = line.split(' ');
+
+			type = line[0];
+
+			if(attribute != 0){
+
+				current_txt.strings.push(line);
+				attribute--;
+
+			} else if(type == '{'){
+
+				curly_paren = true;
+
+			} else if(type == '}'){
+
+				curly_paren = false;
+
+			} else if(type == '['){
+
+				current_obj.parts = [];		
+				squar_paren = true;
+
+			} else if(type == ']'){
+
+				squar_paren = false;
+
+			} else if(type == 'H'){
+
+				numlines = parseInt(n_dat[13]);
+				path_count = numlines;
+
+				new_obj = new this.Path(parseInt(n_dat[1]), parseInt(n_dat[2]), parseInt(n_dat[3]),
+					parseInt(n_dat[4]), parseInt(n_dat[5]), parseInt(n_dat[6]), parseInt(n_dat[7]), 
+					parseInt(n_dat[8]), parseInt(n_dat[9]), parseInt(n_dat[10]), parseInt(n_dat[11]),
+					parseInt(n_dat[12]), numlines);
+
+				if(squar_paren)	current_obj.parts.push(new_obj);
+				else this.parts.push(new_obj);
+
+				current_path = new_obj;
+
+			} else if(type == 'z'){
+
+				new_obj = {
+					'type':'z',
+				};
+
+				current_path.segments.push(new_obj);
+
+				path_count--;
+
+			} else if(type == 'M'){
+
+				n2_dat = n_dat[1].split(',');
+
+				new_obj = {
+					'type':'M',
+					'x':parseInt(n2_dat[0]),
+					'y':parseInt(n2_dat[1])
+				};
+
+				current_path.segments.push(new_obj);
+
+				path_count--;
+
+			} else if(type == 'L' && path_count > 0){
+
+				n2_dat = n_dat[1].split(',');
+
+				new_obj = {
+					'type':'L',
+					'x':parseInt(n2_dat[0]),
+					'y':parseInt(n2_dat[1])
+				}
+
+				current_path.segments.push(new_obj);
+
+				path_count--;
+
+			} else if(type == 'L'){
+
+				new_obj = new this.Line(parseInt(n_dat[1]), parseInt(n_dat[2]), parseInt(n_dat[3]),
+					parseInt(n_dat[4]), parseInt(n_dat[5]), parseInt(n_dat[6]), parseInt(n_dat[7]),
+					parseInt(n_dat[8]), parseInt(n_dat[9]), parseInt(n_dat[10]));
+
+				if(squar_paren)	current_obj.parts.push(new_obj);
+				else this.components.push(new_obj);
+
+			} else if(type == 'A'){
+
+				new_obj = new this.Arc(gsv, parseInt(n_dat[1]), parseInt(n_dat[2]), parseInt(n_dat[3]),
+					parseInt(n_dat[4]), parseInt(n_dat[5]), parseInt(n_dat[6]), parseInt(n_dat[7]),
+					parseInt(n_dat[8]), parseInt(n_dat[9]), parseInt(n_dat[10]), parseInt(n_dat[11]));
+
+				if(squar_paren)	current_obj.parts.push(new_obj);
+				else this.components.push(new_obj);
+
+			} else if(type == 'V'){
+
+				new_obj = new this.Circle(parseInt(n_dat[1]), parseInt(n_dat[2]), parseInt(n_dat[3]),
+					parseInt(n_dat[4]), parseInt(n_dat[5]), parseInt(n_dat[6]), parseInt(n_dat[7]),
+					parseInt(n_dat[8]), parseInt(n_dat[9]), parseInt(n_dat[10]), parseInt(n_dat[11]),
+					parseInt(n_dat[12]), parseInt(n_dat[13]), parseInt(n_dat[14]), parseInt(n_dat[15]));
+
+				if(squar_paren)	current_obj.parts.push(new_obj);
+				else this.components.push(new_obj);
+
+			} else if(type == 'B'){
+
+				x	= parseInt(n_dat[1]);
+				y	= parseInt(n_dat[2]);
+				width	= parseInt(n_dat[3]);
+				height	= parseInt(n_dat[4]);
+
+				this.schem_bounds(this, x, y, x+width, y+height);
+
+				new_obj = new this.Box(x, y, width, height, parseInt(n_dat[5]), parseInt(n_dat[6]),
+					parseInt(n_dat[7]), parseInt(n_dat[8]), parseInt(n_dat[9]), parseInt(n_dat[10]),
+					parseInt(n_dat[11]), parseInt(n_dat[12]), parseInt(n_dat[13]), parseInt(n_dat[14]),
+					parseInt(n_dat[15]), parseInt(n_dat[16]));
+
+				if(squar_paren)	current_obj.parts.push(new_obj);
+				else this.components.push(new_obj);
+
+			} else if(type == 'T'){
+
+				num_lines = parseInt(n_dat[9]);
+
+				new_obj = new this.Text(gsv, parseInt(n_dat[1]), parseInt(n_dat[2]), parseInt(n_dat[3]),
+					parseInt(n_dat[4]), parseInt(n_dat[5]), parseInt(n_dat[6]),
+					parseInt(n_dat[7]), parseInt(n_dat[8]), num_lines);
+
+				attribute = num_lines;
+				current_txt = new_obj;
+
+				if(squar_paren && curly_paren) current_sub_obj.txt.push(new_obj);
+				else if(squar_paren || curly_paren) current_obj.txt.push(new_obj);
+				else this.txt.push(new_obj);
+
+			} else if(type == 'P'){
+
+				new_obj = new this.Pin(parseInt(n_dat[1]), parseInt(n_dat[2]), parseInt(n_dat[3]),
+					parseInt(n_dat[4]), parseInt(n_dat[5]), parseInt(n_dat[6]), parseInt(n_dat[7]));
+
+				this.pins.push(new_obj);
+				
+				if(squar_paren){
+					current_obj.parts.push(new_obj);
+					current_sub_obj = new_obj;
+				} else {
+					this.components.push(new_obj);
+					current_obj = new_obj;
+				}
+
+			} else if(type == 'C'){
+
+				basename = n_dat[6];
+
+				new_obj = new this.Component(gsv, parseInt(n_dat[1]), parseInt(n_dat[2]), parseInt(n_dat[3]),
+					parseInt(n_dat[4]), parseInt(n_dat[5]), basename);
+
+				this.components.push(new_obj);
+				current_obj = new_obj;
+
+				if(basename.length > 8 && basename.substr(0,8) == 'EMBEDDED') {
+					this.embedded[basename.substr(8, basename.length).replace(/\.|-/g,'_')] = new_obj;
+
+				} else {	// Load external symbols
+
+					if(!(basename.replace(/\.|-/g,'_') in this.external)){
+					
+						this.external[basename.replace(/\.|-/g,'_')] = true;
+						this.external.total++;
+
+						new_sym_req = new XMLHttpRequest();
+						new_sym_req.open('GET', GSV.symbolLocation+basename);
+						new_sym_req.responseType = 'text';
+
+						new_sym_req.onload = function(basename, gsv_in){ return function(){
+						
+							var gsv = new GSV(gsv_in.canvas, false);
+
+							gsv.parse_data(gsv_in, this.response, function(){
+
+								delete gsv.embedded;
+								delete gsv.external;
+													
+								delete gsv.pins;
+								delete gsv.nets;
+
+								delete gsv.junctions;
+								delete gsv.no_connection;
+							
+								delete gsv.offsetx;
+								delete gsv.offsety;
+							
+								gsv_in.external[basename.replace(/\.|-/g,'_')] = gsv;
+							
+								gsv_in.external.loaded++;
+							
+								if(gsv_in.external.total == gsv_in.external.loaded && 'ready' in gsv_in.external){
+							
+									gsv_in.external.loaded--;
+									gsv_in.external.ready();
+							
+								}
+							});
+						
+						};}(basename, this);
+
+						new_sym_req.send();
+
+					}			
+				}
+			} else if(type == 'N'){
+
+				x1		= parseInt(n_dat[1]);
+				y1		= parseInt(n_dat[2]);
+				x2		= parseInt(n_dat[3]);
+				y2		= parseInt(n_dat[4]);
+
+				this.schem_bounds(this, x1, y1, x2, y2);
+
+				new_obj = new this.Net(x1, x2, y1, y2,  parseInt(n_dat[5]));
+
+				matches1 = 0;
+				matches2 = 0;
+
+				// Find Net junctions and add yellow dots
+				for(n = 0; n < this.nets.length; n++){
+
+					net = this.nets[n];
+
+					// Check for matching points and increment if we have 2 matches we need a yellow dot
+					if((new_obj.x1 == net.x1 && new_obj.y1 == net.y1)||(new_obj.x1 == net.x2 && new_obj.y1 == net.y2)) matches1++;
+					if((new_obj.x2 == net.x2 && new_obj.y2 == net.y2)||(new_obj.x2 == net.x1 && new_obj.y2 == net.y1)) matches2++;
+
+					// Check for a point intersecting a line, if we find one we need a yellow dot
+					if(GSV.is_on({'x':net.x1, 'y':net.y1}, {'x':net.x2, 'y':net.y2}, {'x':new_obj.x1, 'y':new_obj.y1}))
+						this.junctions[new_obj.x1 + '-' + new_obj.y1] = {
+							'x':new_obj.x1,
+							'y':new_obj.y1
+						};
+					if(GSV.is_on({'x':net.x1, 'y':net.y1}, {'x':net.x2, 'y':net.y2}, {'x':new_obj.x2, 'y':new_obj.y2}))
+						this.junctions[new_obj.x2 + '-' + new_obj.y2] = {
+							'x':new_obj.x2,
+							'y':new_obj.y2
+						};
+
+
+					if(GSV.is_on({'x':new_obj.x1, 'y':new_obj.y1}, {'x':new_obj.x2, 'y':new_obj.y2}, {'x':net.x1, 'y':net.y1}))
+						this.junctions[net.x1 + '-' + net.y1] = {
+							'x':net.x1,
+							'y':net.y1
+						};
+					if(GSV.is_on({'x':new_obj.x1, 'y':new_obj.y1}, {'x':new_obj.x2, 'y':new_obj.y2}, {'x':net.x2,'y': net.y2}))
+						this.junctions[net.x2 + '-' + net.y2] = {
+							'x':net.x2,
+							'y':net.y2
+						};
+		
+				}
+				
+				if(matches1 > 1){
+					this.junctions[new_obj.x1 + '-' + new_obj.y1] = {
+						'x':new_obj.x1,
+						'y':new_obj.y1
+					};
+				}
+
+				if(matches2 > 1){
+					this.junctions[new_obj.x2 + '-' + new_obj.y2] = {
+						'x':new_obj.x2,
+						'y':new_obj.y2
+					};
+				}
+
+				this.nets.push(new_obj);
+				current_obj = new_obj;
+
+			}
+		}
+
+		// Find unconnected pins and add markers
+		for(p1 = 0; p1 < this.pins.length; p1++){
+
+			pin1 = this.pins[p1];
+			nc_flag = true;
+			
+			if(pin1.whichend == 0) pin_out = {'x':pin1.x1, 'y':pin1.y1};
+			else pin_out = {'x':pin1.x2, 'y':pin1.y2};
+			
+			for(n = 0; n < this.nets.length; n++){
+
+				net = this.nets[n];
+
+				// Check for a point intersecting a line, if we dont find one we need a red square
+				if(GSV.is_on_i({'x':net.x1, 'y':net.y1}, {'x':net.x2, 'y':net.y2}, {'x':pin_out.x, 'y':pin_out.y})){
+					nc_flag = false;
+					break;
+				}
+
+			}
+			
+			if(nc_flag) this.no_connection[pin_out.x + '-' + pin_out.y] = {'x':pin_out.x,'y':pin_out.y};
+
+		}
+
+		// Reference ready callback in external
+		this.external.ready = ready;
+
+		xd = this.xmax-this.xmin;
+		yd = this.ymax-this.ymin;
+
+		// Add some extra space on sides of schematic
+		this.xmin -= xd/20;
+		this.xmax += xd/20;
+		this.ymin -= yd/20;
+		this.ymax += yd/20;
+
+		xd = this.xmax-this.xmin;
+		yd = this.ymax-this.ymin;
+
+		// Center the schematic
+		if(this.canvas.width/xd > this.canvas.height/yd){
+
+			this.xmin -= ((this.canvas.width-(this.canvas.height/yd*xd))/2)*(yd/this.canvas.height);
+			this.xmax += ((this.canvas.width-(this.canvas.height/yd*xd))/2)*(yd/this.canvas.height);
+
+		} else {
+
+			this.ymin -= ((this.canvas.height-(this.canvas.width/xd*yd))/2)*(xd/this.canvas.width);
+			this.ymax += ((this.canvas.height-(this.canvas.width/xd*yd))/2)*(xd/this.canvas.width);
+
+		}
+
+		this.offsetx = this.xmin;
+		this.offsety = this.ymin;
+
+		this.scale = 1.0;
+
+		// Check to see if we can fire ready callback to
+		// indicate schematic has loaded fully
+		if(this.external.total == this.external.loaded){
+			delete this.external.ready;
+			ready();
+		}
+
+	};
+
+	GSV.prototype.wheel = function(e) {
+
+		var	ev = window.event || e,
+			d,
+			elem = this.canvas,
+			doc = elem && elem.ownerDocument,
+			docElem = doc.documentElement,
+			box = elem.getBoundingClientRect(),
+			off = {
+				top: box.top  + (window.pageYOffset || docElem.scrollTop)  - (docElem.clientTop  || 0),
+				left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
+			};
+
+		if(ev.stopPropagation) ev.stopPropagation();
+		if(ev.preventDefault) ev.preventDefault();
+		ev.returnValue = false;
+
+		d = Math.max(-1, Math.min(1, (ev.wheelDelta || -ev.detail)));
+
+		this.update_mouse_scroll(this.mouse_x-off.left, this.mouse_y-off.top, d);
+
+	};
+
+	// Key event handler
+	GSV.prototype.update_key = function(e){
+
+		var	xd = (this.xmax-this.xmin)/this.scale,
+			yd = (this.ymax-this.ymin)/this.scale,
+			which = e.which, prevent = true;
+
+		switch(which){
+			case 38: // Down
+				this.offsety -= yd/10;
+				break;
+			case 37: // Left
+				this.offsetx += xd/10;
+				break;
+			case 39: // Right
+				this.offsetx -= xd/10;
+				break;
+			case 40: // Up
+				this.offsety += yd/10;
+				break;
+			case 90: // Z : Zoom in
+				this.offsety += (yd-(yd/1.1))/2;
+				this.offsetx += (xd-(xd/1.1))/2;
+				this.scale *= 1.1;
+				break;
+			case 88: // X : Zoom out
+				this.offsety += (yd-(yd*1.1))/2;
+				this.offsetx += (xd-(xd*1.1))/2;
+				this.scale *= 0.9;
+				break;
+			default:
+				prevent = false;
+				break;
+		}
+
+		if(prevent){
+			if(e.stopPropagation) e.stopPropagation();
+			if(e.preventDefault) e.preventDefault();
+			e.returnValue = false;
+		}
+
+		this.render();
+
+	};
+
+	// Drag event handler
+	GSV.prototype.update_mouse_drag = function(x, y){
+
+		this.offsety -= y/(Math.min(this.canvas.width/(this.xmax-this.xmin), this.canvas.height/(this.ymax-this.ymin))*this.scale);
+		this.offsetx += x/(Math.min(this.canvas.width/(this.xmax-this.xmin), this.canvas.height/(this.ymax-this.ymin))*this.scale);
+
+		this.render();
+
+	};
+
+	// Scroll event handler
+	GSV.prototype.update_mouse_scroll = function(x, y, s){
+
+		if(s > 0){ // Zoom in
+			this.offsety += (((this.canvas.height-(this.canvas.height/1.1))/2)*((this.canvas.height-y)/this.canvas.height*2))/(Math.min(this.canvas.width/(this.xmax-this.xmin), this.canvas.height/(this.ymax-this.ymin))*this.scale);
+			this.offsetx += (((this.canvas.width-(this.canvas.width/1.1))/2)*(2-((this.canvas.width-x)/this.canvas.width*2)))/(Math.min(this.canvas.width/(this.xmax-this.xmin), this.canvas.height/(this.ymax-this.ymin))*this.scale);
+			this.scale *= 1.1;
+		} else { // Zoom out
+			this.offsety += (((this.canvas.height-(this.canvas.height*1.1))/2)*((this.canvas.height-y)/this.canvas.height*2))/(Math.min(this.canvas.width/(this.xmax-this.xmin), this.canvas.height/(this.ymax-this.ymin))*this.scale);
+			this.offsetx += (((this.canvas.width-(this.canvas.width*1.1))/2)*(2-((this.canvas.width-x)/this.canvas.width*2)))/(Math.min(this.canvas.width/(this.xmax-this.xmin), this.canvas.height/(this.ymax-this.ymin))*this.scale);
+			this.scale /= 1.1;
+		}
+
+		this.render();
+
+	};
+
+	// Render the schematic
+	GSV.prototype.render = function(force, timeout){
+
+		var	cur_time = (new Date()).getTime(),
+		// Calculate canvas width and height
+			xd, yd,
+		// Calculate how much we need to scale based on size of the
+		// schematic vs canvas size and how zoomed in we are
+			scalef,
+		// Iterator
+			i,
+		// Iterator helper
+			it,
+		// timer
+			t = this;
+
+		// Limit refresh rate to 30 FPS, wait 10 millis for screen refresh
+		if((Math.abs(cur_time-this.last_time) > 33 && Math.abs(cur_time-this.end_time) > 11) || force){
+			this.last_time = cur_time;
+		} else { // incase last render call from event was ignored
+			if(!timeout) setTimeout(function(){t.render(false, true);}, 50);
+			return;		
+		}
+
+		xd = this.xmax-this.xmin;
+		yd = this.ymax-this.ymin;
+		scalef = Math.min(this.canvas.width/xd, this.canvas.height/yd)*this.scale;
+
+		this.fs = 1;
+
+		// Fill canvas with background color
+		this.buffer_ctx.fillStyle = GSV.what_color[0];
+		this.buffer_ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
+
+		// Set the linewidth so it draws normal size after scaling
+		this.buffer_ctx.lineWidth = 1.0/scalef;
+
+		// Save normal state
+		this.buffer_ctx.save();
+		
+		// Tranform courdinates so we draw from bottom left
+		this.buffer_ctx.transform(1, 0, 0, -1, 0, this.canvas.height);
+		
+		// scale the canvas so we can draw with file coordinates
+		// and still fit in canvas
+		this.buffer_ctx.scale(scalef, scalef);
+		this.buffer_ctx.translate(-this.offsetx, -this.offsety);
+
+		// Draw all Nets, Components, and Text
+		for(i = 0; i < this.nets.length; i++) this.nets[i].render(this.buffer_ctx);
+		for(i = 0; i < this.components.length; i++) this.components[i].render(this.buffer_ctx);
+
+		// Text in main doc renders low TODO: figure out why?
+		this.buffer_ctx.save();
+		this.buffer_ctx.translate(0, 250);
+		for(i = 0; i < this.txt.length; i++) this.txt[i].render(this.buffer_ctx);
+		this.buffer_ctx.restore();
+
+		// Draw dots where 3 or more net lines meet
+		for(i in this.junctions){
+
+			it = this.junctions[i];
+		
+			this.buffer_ctx.beginPath();
+			this.buffer_ctx.arc(it.x, it.y, 30, 0, 2*Math.PI);
+			this.buffer_ctx.fillStyle = GSV.what_color[21];
+			this.buffer_ctx.fill();
+			this.buffer_ctx.closePath();	
+
+		}
+
+		// Draw red squares to indicate where there is a
+		// unconnected pin
+		for(i in this.no_connection){
+
+			it = this.no_connection[i];
+
+			this.buffer_ctx.beginPath();
+			this.buffer_ctx.rect(it.x-30, it.y-30, 60, 60);
+			this.buffer_ctx.fillStyle = GSV.what_color[2];
+			this.buffer_ctx.fill();
+			this.buffer_ctx.closePath();
+
+		}
+
+		// Go back to normal size canvas
+		this.buffer_ctx.restore();
+
+		this.ctx.drawImage(this.buffer_layer, 0, 0);
+
+		this.end_time = (new Date()).getTime();
+
+	};
+
+	return GSV;
+
+});

file:b/src/js/main.js (new)
--- /dev/null
+++ b/src/js/main.js
@@ -1,1 +1,47 @@
+requirejs.config({
 
+	baseUrl: 'js',
+
+});
+
+require(['circuit/GSchemViewer'], function(GSV){
+
+	GSV.setSymbolLocation('/data/sym/');
+
+	window.GSchemViewer = {};
+
+	var canvas = document.getElementById('schcan');
+
+	canvas.width = window.innerWidth-20;
+	canvas.height = window.innerHeight-50;
+
+	window.onresize = function(e){
+
+		canvas.width = window.innerWidth-20;
+		canvas.height = window.innerHeight-50;
+
+		window.GSchemViewer.schem.resize();
+		window.GSchemViewer.schem.render(true);
+
+	};
+
+	document.getElementById('load').onclick = function(){
+
+		new_sym_req = new XMLHttpRequest();
+		new_sym_req.open('GET', document.getElementById('schurl').value);
+		new_sym_req.responseType = 'text';
+
+		new_sym_req.onload = function(){
+			
+			window.GSchemViewer.schem = new GSV(document.getElementById('schcan'), true);
+			window.GSchemViewer.schem.parse_data(window.GSchemViewer.schem, new_sym_req.response, function(){
+				window.GSchemViewer.schem.render();
+			});
+
+		};
+
+		new_sym_req.send();
+
+	};
+
+});

file:b/src/js/require.js (new)
--- /dev/null
+++ b/src/js/require.js
@@ -1,1 +1,37 @@
+/*
+ RequireJS 2.1.10 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+var requirejs,require,define;
+(function(ca){function G(b){return"[object Function]"===N.call(b)}function H(b){return"[object Array]"===N.call(b)}function v(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function U(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function s(b,c){return ga.call(b,c)}function j(b,c){return s(b,c)&&b[c]}function B(b,c){for(var d in b)if(s(b,d)&&c(b[d],d))break}function V(b,c,d,g){c&&B(c,function(c,h){if(d||!s(b,h))g&&"object"===typeof c&&c&&!H(c)&&!G(c)&&!(c instanceof
+RegExp)?(b[h]||(b[h]={}),V(b[h],c,d,g)):b[h]=c});return b}function t(b,c){return function(){return c.apply(b,arguments)}}function da(b){throw b;}function ea(b){if(!b)return b;var c=ca;v(b.split("."),function(b){c=c[b]});return c}function C(b,c,d,g){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=g;d&&(c.originalError=d);return c}function ha(b){function c(a,e,b){var f,n,c,d,g,h,i,I=e&&e.split("/");n=I;var m=l.map,k=m&&m["*"];if(a&&"."===a.charAt(0))if(e){n=
+I.slice(0,I.length-1);a=a.split("/");e=a.length-1;l.nodeIdCompat&&R.test(a[e])&&(a[e]=a[e].replace(R,""));n=a=n.concat(a);d=n.length;for(e=0;e<d;e++)if(c=n[e],"."===c)n.splice(e,1),e-=1;else if(".."===c)if(1===e&&(".."===n[2]||".."===n[0]))break;else 0<e&&(n.splice(e-1,2),e-=2);a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if(b&&m&&(I||k)){n=a.split("/");e=n.length;a:for(;0<e;e-=1){d=n.slice(0,e).join("/");if(I)for(c=I.length;0<c;c-=1)if(b=j(m,I.slice(0,c).join("/")))if(b=j(b,d)){f=b;
+g=e;break a}!h&&(k&&j(k,d))&&(h=j(k,d),i=e)}!f&&h&&(f=h,g=i);f&&(n.splice(0,g,f),a=n.join("/"))}return(f=j(l.pkgs,a))?f:a}function d(a){z&&v(document.getElementsByTagName("script"),function(e){if(e.getAttribute("data-requiremodule")===a&&e.getAttribute("data-requirecontext")===i.contextName)return e.parentNode.removeChild(e),!0})}function g(a){var e=j(l.paths,a);if(e&&H(e)&&1<e.length)return e.shift(),i.require.undef(a),i.require([a]),!0}function u(a){var e,b=a?a.indexOf("!"):-1;-1<b&&(e=a.substring(0,
+b),a=a.substring(b+1,a.length));return[e,a]}function m(a,e,b,f){var n,d,g=null,h=e?e.name:null,l=a,m=!0,k="";a||(m=!1,a="_@r"+(N+=1));a=u(a);g=a[0];a=a[1];g&&(g=c(g,h,f),d=j(p,g));a&&(g?k=d&&d.normalize?d.normalize(a,function(a){return c(a,h,f)}):c(a,h,f):(k=c(a,h,f),a=u(k),g=a[0],k=a[1],b=!0,n=i.nameToUrl(k)));b=g&&!d&&!b?"_unnormalized"+(Q+=1):"";return{prefix:g,name:k,parentMap:e,unnormalized:!!b,url:n,originalName:l,isDefine:m,id:(g?g+"!"+k:k)+b}}function q(a){var e=a.id,b=j(k,e);b||(b=k[e]=new i.Module(a));
+return b}function r(a,e,b){var f=a.id,n=j(k,f);if(s(p,f)&&(!n||n.defineEmitComplete))"defined"===e&&b(p[f]);else if(n=q(a),n.error&&"error"===e)b(n.error);else n.on(e,b)}function w(a,e){var b=a.requireModules,f=!1;if(e)e(a);else if(v(b,function(e){if(e=j(k,e))e.error=a,e.events.error&&(f=!0,e.emit("error",a))}),!f)h.onError(a)}function x(){S.length&&(ia.apply(A,[A.length,0].concat(S)),S=[])}function y(a){delete k[a];delete W[a]}function F(a,e,b){var f=a.map.id;a.error?a.emit("error",a.error):(e[f]=
+!0,v(a.depMaps,function(f,c){var d=f.id,g=j(k,d);g&&(!a.depMatched[c]&&!b[d])&&(j(e,d)?(a.defineDep(c,p[d]),a.check()):F(g,e,b))}),b[f]=!0)}function D(){var a,e,b=(a=1E3*l.waitSeconds)&&i.startTime+a<(new Date).getTime(),f=[],c=[],h=!1,k=!0;if(!X){X=!0;B(W,function(a){var i=a.map,m=i.id;if(a.enabled&&(i.isDefine||c.push(a),!a.error))if(!a.inited&&b)g(m)?h=e=!0:(f.push(m),d(m));else if(!a.inited&&(a.fetched&&i.isDefine)&&(h=!0,!i.prefix))return k=!1});if(b&&f.length)return a=C("timeout","Load timeout for modules: "+
+f,null,f),a.contextName=i.contextName,w(a);k&&v(c,function(a){F(a,{},{})});if((!b||e)&&h)if((z||fa)&&!Y)Y=setTimeout(function(){Y=0;D()},50);X=!1}}function E(a){s(p,a[0])||q(m(a[0],null,!0)).init(a[1],a[2])}function L(a){var a=a.currentTarget||a.srcElement,e=i.onScriptLoad;a.detachEvent&&!Z?a.detachEvent("onreadystatechange",e):a.removeEventListener("load",e,!1);e=i.onScriptError;(!a.detachEvent||Z)&&a.removeEventListener("error",e,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function M(){var a;
+for(x();A.length;){a=A.shift();if(null===a[0])return w(C("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));E(a)}}var X,$,i,K,Y,l={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},k={},W={},aa={},A=[],p={},T={},ba={},N=1,Q=1;K={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=p[a.map.id]={}},module:function(a){return a.module?a.module:
+a.module={id:a.map.id,uri:a.map.url,config:function(){return j(l.config,a.map.id)||{}},exports:K.exports(a)}}};$=function(a){this.events=j(aa,a.id)||{};this.map=a;this.shim=j(l.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};$.prototype={init:function(a,e,b,f){f=f||{};if(!this.inited){this.factory=e;if(b)this.on("error",b);else this.events.error&&(b=t(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=b;this.inited=
+!0;this.ignore=f.ignore;f.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,e){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=e)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],t(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=
+this.map.url;T[a]||(T[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,e,b=this.map.id;e=this.depExports;var f=this.exports,c=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(G(c)){if(this.events.error&&this.map.isDefine||h.onError!==da)try{f=i.execCb(b,c,e,f)}catch(d){a=d}else f=i.execCb(b,c,e,f);this.map.isDefine&&void 0===f&&((e=this.module)?f=e.exports:this.usingExports&&
+(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=c;this.exports=f;if(this.map.isDefine&&!this.ignore&&(p[b]=f,h.onResourceLoad))h.onResourceLoad(i,this.map,this.depMaps);y(b);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=
+this.map,b=a.id,d=m(a.prefix);this.depMaps.push(d);r(d,"defined",t(this,function(f){var d,g;g=j(ba,this.map.id);var J=this.map.name,u=this.map.parentMap?this.map.parentMap.name:null,p=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(J=f.normalize(J,function(a){return c(a,u,!0)})||""),f=m(a.prefix+"!"+J,this.map.parentMap),r(f,"defined",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),g=j(k,f.id)){this.depMaps.push(f);
+if(this.events.error)g.on("error",t(this,function(a){this.emit("error",a)}));g.enable()}}else g?(this.map.url=i.nameToUrl(g),this.load()):(d=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),d.error=t(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(k,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),d.fromText=t(this,function(f,c){var g=a.name,J=m(g),k=O;c&&(f=c);k&&(O=!1);q(J);s(l.config,b)&&(l.config[g]=l.config[b]);try{h.exec(f)}catch(j){return w(C("fromtexteval",
+"fromText eval for "+b+" failed: "+j,j,[b]))}k&&(O=!0);this.depMaps.push(J);i.completeLoad(g);p([g],d)}),f.load(a.name,p,d,l))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){W[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,t(this,function(a,b){var c,f;if("string"===typeof a){a=m(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=j(K,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;r(a,"defined",t(this,function(a){this.defineDep(b,
+a);this.check()}));this.errback&&r(a,"error",t(this,this.errback))}c=a.id;f=k[c];!s(K,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,t(this,function(a){var b=j(k,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:l,contextName:b,registry:k,defined:p,urlFetched:T,defQueue:A,Module:$,makeModuleMap:m,
+nextTick:h.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=l.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(l[b]||(l[b]={}),V(l[b],a,!0,!0)):l[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(ba[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);b[c]=a}),l.shim=b);a.packages&&v(a.packages,function(a){var b,
+a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(l.paths[b]=a.location);l.pkgs[b]=a.name+"/"+(a.main||"main").replace(ja,"").replace(R,"")});B(k,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=m(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ca,arguments));return b||a.exports&&ea(a.exports)}},makeRequire:function(a,e){function g(f,c,d){var j,l;e.enableBuildCallback&&(c&&G(c))&&(c.__requireJsBuild=
+!0);if("string"===typeof f){if(G(c))return w(C("requireargs","Invalid require call"),d);if(a&&s(K,f))return K[f](k[a.id]);if(h.get)return h.get(i,f,a,g);j=m(f,a,!1,!0);j=j.id;return!s(p,j)?w(C("notloaded",'Module name "'+j+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):p[j]}M();i.nextTick(function(){M();l=q(m(null,a));l.skipMap=e.skipMap;l.init(f,c,d,{enabled:!0});D()});return g}e=e||{};V(g,{isBrowser:z,toUrl:function(b){var e,d=b.lastIndexOf("."),g=b.split("/")[0];if(-1!==
+d&&(!("."===g||".."===g)||1<d))e=b.substring(d,b.length),b=b.substring(0,d);return i.nameToUrl(c(b,a&&a.id,!0),e,!0)},defined:function(b){return s(p,m(b,a,!1,!0).id)},specified:function(b){b=m(b,a,!1,!0).id;return s(p,b)||s(k,b)}});a||(g.undef=function(b){x();var c=m(b,a,!0),e=j(k,b);d(b);delete p[b];delete T[c.url];delete aa[b];U(A,function(a,c){a[0]===b&&A.splice(c,1)});e&&(e.events.defined&&(aa[b]=e.events),y(b))});return g},enable:function(a){j(k,a.id)&&q(a).enable()},completeLoad:function(a){var b,
+c,f=j(l.shim,a)||{},d=f.exports;for(x();A.length;){c=A.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);E(c)}c=j(k,a);if(!b&&!s(p,a)&&c&&!c.inited){if(l.enforceDefine&&(!d||!ea(d)))return g(a)?void 0:w(C("nodefine","No define call for "+a,null,[a]));E([a,f.deps||[],f.exportsFn])}D()},nameToUrl:function(a,b,c){var f,d,g;(f=j(l.pkgs,a))&&(a=f);if(f=j(ba,a))return i.nameToUrl(f,b,c);if(h.jsExtRegExp.test(a))f=a+(b||"");else{f=l.paths;a=a.split("/");for(d=a.length;0<d;d-=1)if(g=a.slice(0,
+d).join("/"),g=j(f,g)){H(g)&&(g=g[0]);a.splice(0,d,g);break}f=a.join("/");f+=b||(/^data\:|\?/.test(f)||c?"":".js");f=("/"===f.charAt(0)||f.match(/^[\w\+\.\-]+:/)?"":l.baseUrl)+f}return l.urlArgs?f+((-1===f.indexOf("?")?"?":"&")+l.urlArgs):f},load:function(a,b){h.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ka.test((a.currentTarget||a.srcElement).readyState))P=null,a=L(a),i.completeLoad(a.id)},onScriptError:function(a){var b=L(a);if(!g(b.id))return w(C("scripterror",
+"Script error for: "+b.id,a,[b.id]))}};i.require=i.makeRequire();return i}var h,x,y,D,L,E,P,M,q,Q,la=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ma=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,R=/\.js$/,ja=/^\.\//;x=Object.prototype;var N=x.toString,ga=x.hasOwnProperty,ia=Array.prototype.splice,z=!!("undefined"!==typeof window&&"undefined"!==typeof navigator&&window.document),fa=!z&&"undefined"!==typeof importScripts,ka=z&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,
+Z="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),F={},r={},S=[],O=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(G(requirejs))return;r=requirejs;requirejs=void 0}"undefined"!==typeof require&&!G(require)&&(r=require,require=void 0);h=requirejs=function(b,c,d,g){var u,m="_";!H(b)&&"string"!==typeof b&&(u=b,H(c)?(b=c,c=d,d=g):b=[]);u&&u.context&&(m=u.context);(g=j(F,m))||(g=F[m]=h.s.newContext(m));u&&g.configure(u);return g.require(b,c,d)};h.config=function(b){return h(b)};
+h.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=h);h.version="2.1.10";h.jsExtRegExp=/^\/|:|\?|\.js$/;h.isBrowser=z;x=h.s={contexts:F,newContext:ha};h({});v(["toUrl","undef","defined","specified"],function(b){h[b]=function(){var c=F._;return c.require[b].apply(c,arguments)}});if(z&&(y=x.head=document.getElementsByTagName("head")[0],D=document.getElementsByTagName("base")[0]))y=x.head=D.parentNode;h.onError=da;h.createNode=function(b){var c=
+b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};h.load=function(b,c,d){var g=b&&b.config||{};if(z)return g=h.createNode(g,c,d),g.setAttribute("data-requirecontext",b.contextName),g.setAttribute("data-requiremodule",c),g.attachEvent&&!(g.attachEvent.toString&&0>g.attachEvent.toString().indexOf("[native code"))&&!Z?(O=!0,g.attachEvent("onreadystatechange",b.onScriptLoad)):
+(g.addEventListener("load",b.onScriptLoad,!1),g.addEventListener("error",b.onScriptError,!1)),g.src=d,M=g,D?y.insertBefore(g,D):y.appendChild(g),M=null,g;if(fa)try{importScripts(d),b.completeLoad(c)}catch(j){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,j,[c]))}};z&&!r.skipDataMain&&U(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(L=b.getAttribute("data-main"))return q=L,r.baseUrl||(E=q.split("/"),q=E.pop(),Q=E.length?E.join("/")+"/":"./",r.baseUrl=
+Q),q=q.replace(R,""),h.jsExtRegExp.test(q)&&(q=L),r.deps=r.deps?r.deps.concat(q):[q],!0});define=function(b,c,d){var g,h;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(la,"").replace(ma,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(O){if(!(g=M))P&&"interactive"===P.readyState||U(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),g=P;g&&(b||
+(b=g.getAttribute("data-requiremodule")),h=F[g.getAttribute("data-requirecontext")])}(h?h.defQueue:S).push([b,c,d])};define.amd={jQuery:!0};h.exec=function(b){return eval(b)};h(r)}})(this);