diff --git a/xilinx/TODO.txt b/xilinx/TODO.txt
new file mode 100644
index 0000000..70a3b65
--- /dev/null
+++ b/xilinx/TODO.txt
@@ -0,0 +1,10 @@
+
+pdp-8
+ register file
+
+caddr
+ ddr controller
+ video bitmap
+ disk interface
+
+xc2s200-5fg256
diff --git a/xilinx/ps2/_ngo/netlist.lst b/xilinx/ps2/_ngo/netlist.lst
new file mode 100644
index 0000000..3bb07d8
--- /dev/null
+++ b/xilinx/ps2/_ngo/netlist.lst
@@ -0,0 +1,2 @@
+/mwave/work/nt/xess/xilinx/ps2/fpga.ngc 1166710707
+OK
diff --git a/xilinx/ps2/_xmsgs/bitgen.xmsgs b/xilinx/ps2/_xmsgs/bitgen.xmsgs
new file mode 100644
index 0000000..0d35cb9
--- /dev/null
+++ b/xilinx/ps2/_xmsgs/bitgen.xmsgs
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/xilinx/ps2/_xmsgs/map.xmsgs b/xilinx/ps2/_xmsgs/map.xmsgs
new file mode 100644
index 0000000..900be21
--- /dev/null
+++ b/xilinx/ps2/_xmsgs/map.xmsgs
@@ -0,0 +1,30 @@
+
+
+
+Logical network clkb has no load.
+
+
+The above warning message base_net_load_rule is repeated 11 more times for the following (max. 5 shown):
+vga_hsync_n,
+vga_red0,
+vga_red1,
+vga_red2,
+vga_green0
+To see the details of these warning messages, please use the -detail switch.
+
+
+No environment variables are currently set.
+
+
+All of the single ended outputs in this design are using slew rate limited output drivers. The delay on speed critical single ended outputs can be dramatically reduced by designating them as fast outputs in the schematic.
+
+
+Clock buffer is designated to drive clock loads. BUFG symbol "gray_cnt_FFd1_BUFG" (output signal=gray_cnt_FFd1) has a mix of clock and non-clock loads. The non-clock loads are:
+Pin D of gray_cnt_FFd2
+
+
+
diff --git a/xilinx/ps2/_xmsgs/ngdbuild.xmsgs b/xilinx/ps2/_xmsgs/ngdbuild.xmsgs
new file mode 100644
index 0000000..0d35cb9
--- /dev/null
+++ b/xilinx/ps2/_xmsgs/ngdbuild.xmsgs
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/xilinx/ps2/_xmsgs/par.xmsgs b/xilinx/ps2/_xmsgs/par.xmsgs
new file mode 100644
index 0000000..ef7b527
--- /dev/null
+++ b/xilinx/ps2/_xmsgs/par.xmsgs
@@ -0,0 +1,13 @@
+
+
+
+No user timing constraints were detected or you have set the option to ignore timing constraints ("par -x"). Place and Route will run in "Performance Evaluation Mode" to automatically improve the performance of all internal clocks in this design. The PAR timing summary will list the performance achieved for each clock. Note: For the fastest runtime, set the effort level to "std". For best performance, set the effort level to "high". For a balance between the fastest runtime and best performance, set the effort level to "med".
+
+
+N/A entries in the Constraints list may indicate that the constraint does not cover any paths or that it has no requested value.
+
+
diff --git a/xilinx/ps2/_xmsgs/trce.xmsgs b/xilinx/ps2/_xmsgs/trce.xmsgs
new file mode 100644
index 0000000..b1a4b30
--- /dev/null
+++ b/xilinx/ps2/_xmsgs/trce.xmsgs
@@ -0,0 +1,12 @@
+
+
+
+No timing constraints found, doing default enumeration.
+
+To get complete path coverage, use the unconstrained paths option. All paths that are not constrained will be reported in the unconstrained paths section(s) of the report.
+
+
diff --git a/xilinx/ps2/_xmsgs/xst.xmsgs b/xilinx/ps2/_xmsgs/xst.xmsgs
new file mode 100644
index 0000000..81a512f
--- /dev/null
+++ b/xilinx/ps2/_xmsgs/xst.xmsgs
@@ -0,0 +1,71 @@
+
+
+
+Output <vga_hsync_n> is never assigned.
+
+
+Output <vga_red0> is never assigned.
+
+
+Output <vga_red1> is never assigned.
+
+
+Output <vga_red2> is never assigned.
+
+
+Output <vga_green0> is never assigned.
+
+
+Output <vga_green1> is never assigned.
+
+
+Output <vga_green2> is never assigned.
+
+
+Input <clkb> is never used.
+
+
+Output <vga_blue0> is never assigned.
+
+
+Output <vga_blue1> is never assigned.
+
+
+Output <vga_blue2> is never assigned.
+
+
+Output <vga_vsync_n> is never assigned.
+
+
+Signal <vsync> is never used or assigned.
+
+
+Signal <kb_scancode<7>> is assigned but never used.
+
+
+Signal <kb_bsy> is assigned but never used.
+
+
+Signal <hsync> is never used or assigned.
+
+
+Signal <pixel> is never used or assigned.
+
+
+Signal <data> is never used or assigned.
+
+
+HDL ADVISOR - A 2-bit shift register was found for signal <ps2/ps2_clk_r_1> and currently occupies 2 logic cells (1 slices). Removing the set/reset logic would take advantage of SRL16 (and derived) primitives and reduce this to 1 logic cells (1 slices). Evaluate if the set/reset can be removed for this simple shift register. The majority of simple pipeline structures do not need to be set/reset operationally.
+
+
+HDL ADVISOR - A 3-bit shift register was found for signal <ps2/sc_r_7> and currently occupies 3 logic cells (1 slices). Removing the set/reset logic would take advantage of SRL16 (and derived) primitives and reduce this to 1 logic cells (1 slices). Evaluate if the set/reset can be removed for this simple shift register. The majority of simple pipeline structures do not need to be set/reset operationally.
+
+
+HDL ADVISOR - Some clock signals were not automatically buffered by XST with BUFG/BUFR resources. Please use the buffer_type constraint in order to insert these buffers to the clock signals to help prevent skew problems.
+
+
+
diff --git a/xilinx/ps2/fpga.bgn b/xilinx/ps2/fpga.bgn
new file mode 100644
index 0000000..9a12b3b
--- /dev/null
+++ b/xilinx/ps2/fpga.bgn
@@ -0,0 +1,101 @@
+Release 8.2i - Bitgen I.31
+Copyright (c) 1995-2006 Xilinx, Inc. All rights reserved.
+Loading device for application Rf_Device from file 'v200.nph' in environment
+/opt/Xilinx.
+ "fpga" is an NCD, version 3.1, device xc2s200, package fg256, speed -5
+Opened constraints file fpga.pcf.
+
+Thu Dec 21 09:19:03 2006
+
+bitgen -intstyle ise -w -g DebugBitstream:No -g Binary:no -g Gclkdel0:11111 -g Gclkdel1:11111 -g Gclkdel2:11111 -g Gclkdel3:11111 -g ConfigRate:4 -g CclkPin:PullUp -g M0Pin:PullUp -g M1Pin:PullUp -g M2Pin:PullUp -g ProgPin:PullUp -g DonePin:PullUp -g TckPin:PullUp -g TdiPin:PullUp -g TdoPin:PullUp -g TmsPin:PullUp -g UnusedPin:PullDown -g UserID:0xFFFFFFFF -g StartUpClk:CClk -g DONE_cycle:4 -g GTS_cycle:5 -g GSR_cycle:6 -g GWE_cycle:6 -g LCK_cycle:NoWait -g Security:None -g DonePipe:No -g DriveDone:No fpga.ncd
+
+Summary of Bitgen Options:
++----------------------+----------------------+
+| Option Name | Current Setting |
++----------------------+----------------------+
+| Compress | (Not Specified)* |
++----------------------+----------------------+
+| Readback | (Not Specified)* |
++----------------------+----------------------+
+| DebugBitstream | No** |
++----------------------+----------------------+
+| ConfigRate | 4** |
++----------------------+----------------------+
+| StartupClk | Cclk** |
++----------------------+----------------------+
+| CclkPin | Pullup** |
++----------------------+----------------------+
+| DonePin | Pullup** |
++----------------------+----------------------+
+| M0Pin | Pullup** |
++----------------------+----------------------+
+| M1Pin | Pullup** |
++----------------------+----------------------+
+| M2Pin | Pullup** |
++----------------------+----------------------+
+| ProgPin | Pullup** |
++----------------------+----------------------+
+| TckPin | Pullup** |
++----------------------+----------------------+
+| TdiPin | Pullup** |
++----------------------+----------------------+
+| TdoPin | Pullup |
++----------------------+----------------------+
+| TmsPin | Pullup** |
++----------------------+----------------------+
+| UnusedPin | Pulldown** |
++----------------------+----------------------+
+| GSR_cycle | 6** |
++----------------------+----------------------+
+| GWE_cycle | 6** |
++----------------------+----------------------+
+| GTS_cycle | 5** |
++----------------------+----------------------+
+| LCK_cycle | NoWait** |
++----------------------+----------------------+
+| DONE_cycle | 4** |
++----------------------+----------------------+
+| Persist | No* |
++----------------------+----------------------+
+| DriveDone | No** |
++----------------------+----------------------+
+| DonePipe | No** |
++----------------------+----------------------+
+| Security | None** |
++----------------------+----------------------+
+| UserID | 0xFFFFFFFF** |
++----------------------+----------------------+
+| Gclkdel0 | 11111** |
++----------------------+----------------------+
+| Gclkdel1 | 11111** |
++----------------------+----------------------+
+| Gclkdel2 | 11111** |
++----------------------+----------------------+
+| Gclkdel3 | 11111** |
++----------------------+----------------------+
+| ActiveReconfig | No* |
++----------------------+----------------------+
+| ActivateGclk | No* |
++----------------------+----------------------+
+| PartialMask0 | (Not Specified)* |
++----------------------+----------------------+
+| PartialMask1 | (Not Specified)* |
++----------------------+----------------------+
+| PartialGclk | (Not Specified)* |
++----------------------+----------------------+
+| PartialLeft | (Not Specified)* |
++----------------------+----------------------+
+| PartialRight | (Not Specified)* |
++----------------------+----------------------+
+| IEEE1532 | No* |
++----------------------+----------------------+
+| Binary | No** |
++----------------------+----------------------+
+ * Default setting.
+ ** The specified setting matches the default setting.
+
+Running DRC.
+DRC detected 0 errors and 0 warnings.
+Creating bit map...
+Saving bit stream in "fpga.bit".
+Bitstream generation is complete.
diff --git a/xilinx/ps2/fpga.bit b/xilinx/ps2/fpga.bit
new file mode 100644
index 0000000..0a3bfb0
Binary files /dev/null and b/xilinx/ps2/fpga.bit differ
diff --git a/xilinx/ps2/fpga.bld b/xilinx/ps2/fpga.bld
new file mode 100644
index 0000000..3ce5674
--- /dev/null
+++ b/xilinx/ps2/fpga.bld
@@ -0,0 +1,31 @@
+Release 8.2i ngdbuild I.31
+Copyright (c) 1995-2006 Xilinx, Inc. All rights reserved.
+
+Command Line: ngdbuild -ise /mwave/work/nt/xess/xilinx/ps2/ps2.ise -intstyle ise
+-dd _ngo -nt timestamp -uc /mwave/work/nt/xess/v/fpga2.ucf -p xc2s200-fg256-5
+fpga.ngc fpga.ngd
+
+Reading NGO file '/mwave/work/nt/xess/xilinx/ps2/fpga.ngc' ...
+
+Applying constraints in "/mwave/work/nt/xess/v/fpga2.ucf" to the design...
+
+Checking timing specifications ...
+Checking Partitions ...
+Checking expanded design ...
+
+Partition Implementation Status
+-------------------------------
+
+ No Partitions were found in this design.
+
+-------------------------------
+
+NGDBUILD Design Results Summary:
+ Number of errors: 0
+ Number of warnings: 0
+
+Total memory usage is 239836 kilobytes
+
+Writing NGD file "fpga.ngd" ...
+
+Writing NGDBUILD log file "fpga.bld"...
diff --git a/xilinx/ps2/fpga.cmd_log b/xilinx/ps2/fpga.cmd_log
new file mode 100644
index 0000000..af12ce4
--- /dev/null
+++ b/xilinx/ps2/fpga.cmd_log
@@ -0,0 +1,114 @@
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -i -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -uc "/mwave/work/nt/xess/v/fpga2.ucf" -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf -ucf /mwave/work/nt/xess/v/fpga2.ucf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -uc "/mwave/work/nt/xess/v/fpga2.ucf" -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf -ucf /mwave/work/nt/xess/v/fpga2.ucf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -uc "/mwave/work/nt/xess/v/fpga2.ucf" -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf -ucf /mwave/work/nt/xess/v/fpga2.ucf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -uc "/mwave/work/nt/xess/v/fpga2.ucf" -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf -ucf /mwave/work/nt/xess/v/fpga2.ucf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -uc "/mwave/work/nt/xess/v/fpga2.ucf" -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf -ucf /mwave/work/nt/xess/v/fpga2.ucf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -uc "/mwave/work/nt/xess/v/fpga2.ucf" -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf -ucf /mwave/work/nt/xess/v/fpga2.ucf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
+xst -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -ifn fpga.xst -ofn fpga.syr
+ngdbuild -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -dd _ngo -nt timestamp -uc "/mwave/work/nt/xess/v/fpga2.ucf" -p xc2s200-fg256-5 "fpga.ngc" fpga.ngd
+map -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -p xc2s200-fg256-5 -cm area -pr b -k 4 -c 100 -tx off -o fpga_map.ncd fpga.ngd fpga.pcf
+par -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -w -intstyle ise -ol std -t 1 fpga_map.ncd fpga.ncd fpga.pcf
+trce -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -e 3 -l 3 -s 5 -xml fpga fpga.ncd -o fpga.twr fpga.pcf -ucf /mwave/work/nt/xess/v/fpga2.ucf
+bitgen -ise "/mwave/work/nt/xess/xilinx/ps2/ps2.ise" -intstyle ise -f fpga.ut fpga.ncd
diff --git a/xilinx/ps2/fpga.drc b/xilinx/ps2/fpga.drc
new file mode 100644
index 0000000..ec074a2
--- /dev/null
+++ b/xilinx/ps2/fpga.drc
@@ -0,0 +1 @@
+DRC detected 0 errors and 0 warnings.
diff --git a/xilinx/ps2/fpga.lso b/xilinx/ps2/fpga.lso
new file mode 100644
index 0000000..b8f99f5
--- /dev/null
+++ b/xilinx/ps2/fpga.lso
@@ -0,0 +1 @@
+work
diff --git a/xilinx/ps2/fpga.ncd b/xilinx/ps2/fpga.ncd
new file mode 100644
index 0000000..55b220c
--- /dev/null
+++ b/xilinx/ps2/fpga.ncd
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.4
+###5592:XlxV32DM 3fff 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###3532:XlxV32DM 3fff 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###4656:XlxV32DM 3fff 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###4408:XlxV32DM 3fff 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###3300:XlxV32DM 2d6b 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
\ No newline at end of file
diff --git a/xilinx/ps2/fpga.ngc b/xilinx/ps2/fpga.ngc
new file mode 100644
index 0000000..9800e8d
--- /dev/null
+++ b/xilinx/ps2/fpga.ngc
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.4e
+$06e1=789;?7=>?2593476339:3<95?1177?545:81:>6??4:334=7<:81?86:;4708032<>HKJ=66=;927?=678=1IYKI:;CWECU7O);880E=<4I008M740EO[I9:KMMQUSI]O87D@Y2:NJ6>JH?2FDKDMNL59OQQ733E__>95CUU15?ISS;VF?7A[[479OQQ2XL?1GYY:PL49NQ]E^=2G^TK;;;O3731=I9=2?7C?;959M50633G;>=95A1407?K72;;1E>?5A369MAQQHZB;0C95@BTD2?U2U13ZE^^NK;;U[SAf=R[LXTZD]FBMG0?SED12\BIZQ[YQG2`>^ND@DS!UJM 1,2$VRRJ):%=-O\CHK6?]IUKP<0T^ZCIC58\VRXOGN<7U][_WA@2>^cjVCo==5Wdl]Neoiu^lxxeb`>0:ZgiZKnffx]i}foo18\vr?3Vddx=>?1g9\jjr789;:SD@Y_168gimfi2igglQMUGES0>ekck>0j}in7:dscdYc9j1m|joPd0]LFP@03ozlmRj=c:dscdYc:VEIYK94fqeb[a5d3ozlmRj<_N@VB2=axnkTh9m4fqeb[a2XGK_M;6hg`]g1f=axnkTh8Q@BTD4?cv`iVn=o6hg`]g2ZIE]O=0j}in_e5`?cv`iVne:eqe|Ydf}UMJi?>139dvdXkg~TJKj>_CWECa=`zhsToczPFGf155=`zhsToczPFGf1)Lh6?2mymtQlnu]EBa4*Ag;TECXP00c8tv4(EhnoSRokdrwa4567Wjs7<3?m;qq1+HgclVUjhi}zb1234Ze~48:5=o5s3-NeabXWhnoxl?012\g|:697;i7}}=/Lcg`ZYflmy~n=>?0^az84499h1{?!Baef\[dbc{|h;<=>Pcx>2:4g0>a:rp6*KflmUTmij|uc2345Ydq5>5=l5s3-NeabXWhnoxl?012\g|:268k0|~< M`fg[Zgclzi<=>?_b{?2;7f3yy9#@okd^]b`aurj9:;vt:&GjhiQPaefpqg6789Uhu1611`9sw7)JimnTSljkst`3456Xkp622??4pr0,IdbcWVkoh~{m0123[iss494TECXP00a8tv4(EhnoSRokdrwa4567Wqey0<>11b9sw7)JimnTSljkst`3456Xpfx7=<0>c:rp6*KflmUTmij|uc2345Yg{6:>3?l;qq1+HgclVUjhi}zb1234Z~hz5;82?01]{kw:568h0|~< M`fg[Zgclzi<=>?_ymq8686j2zx>"Cnde]\eabt}k:;<=Qwos>7:4dvt:&GjhiQPaefpqg6789Usc29>0`8tv4(EhnoSRokdrwa4567Wqey0:0>b:rp6*KflmUTmij|uc2345Yg{632?00]`}9799j1{?!Baef\[dbc{|h;<=?Pcx>2:4713yy9#C=9;qq1+K26;2zx>"Qndeqvf56785;;2<=4pr0,[dbc{|h;<=>310<27>vt:&Ujhi}zb12349756890|~< _`fgwpd789:7=>0>2:rp6*Yflmy~n=>?0=3=57=w{;%Tmij|uc2345:56880|~< _`fgwpd789:7?3?=;qq1+Zgclzi<=>?<5<26>vt:&Ujhi}zb12349399;1{?!Paefpqg67896=2<<4pr0,[dbc{|h;<=>37?31?uu5'Vkoh~{m01238=86:2zx>"Qndeqvf5678535j6~|2.]`iuYby9:;<<>4pr0,[fkwWl{;<=>>f:rp6*YdeyUn}=>?1038tv4(Wjg{Sh?01326474pr0,[fkwWl{;<=?:6028tv4(Wjg{Sh?013;50=w{;%To`~Pep2344Yjiy99=85s3-\ghvXmx:;<:=85s3-\ghvXmx:;<vt:&hbxn`{_s>3:c=w{;%ieymat^p?5;`"lftblw[wY7m2zx>"lftblw[wY6m2zx>"lftblw[wY5m2zx>"lftblw[wY4n2zx>"lftblw[}:768:0|~< bhv`jqY494:=?5s3-amqei|Vr7<3?PF008tv4(j`~hbyQw<1<2[B`"lftblw[}:668;97}}=/ckwgkrXp5;5=vt:&anukc_y]neu719;1{?!dexpfhZ~Xehz9<<<4pr0,o`umeUsS`o2031?uu5'bor~hbPx^obt70682zx>"~|2^aooZccol;97}}=/qq1[fjlWlnli>1:rp6*vt:ViggRkkgd021>vt:&zx>Rmck^dbhiYblno:<6~|2.rp6ZekcVx7<3??;qq1+uu5Wjf`S2>>028tv4(xz8ToaePr=0=55=w{;%{?Qllj]q868682zx>"~|2^aooZt;<7l0|~< pr0\gimXzV:m7}}=/qq1[fjlW{U:j6~|2.rp6ZekcVxT>k5s3-sw7YddbUyS>h4pr0,tv4XkeaT~R:6;qq1+wb~W{30|~< re{\|d=w{;%yhtQw1e9sw7)u{}UeSd`y159sw7)u{}UeSd`y1^KMRZ6e3yy9#~mPr=2=f>vt:&yhS2>>c9sw7)tkVx7>3l4pr0,wfYu4:4i7}}=/ra\v929j2zx>"}l_s>6:g=w{;%xoR|36?`8tv4({jUy0:0m;qq1+veXz525n6~|2.q`[w:>6h1{?!|c^p\4d=w{;%xoR|P1`9sw7)tkVxT>l5s3-pgZtX;h1{?!|c^p\0d=w{;%xoR|P5`9sw7)tkVxT:l5s3-pgZtX?h1{?!|c^p\g9sw7)sadoyS2>0?d8tv4(|`gn~R|310vt:&~bah|Pr=30:`=w{;%e`k}_s>2:`=w{;%e`k}_s>1:`=w{;%e`k}_s>0:`=w{;%e`k}_s>7:`=w{;%e`k}_s>6:`=w{;%e`k}_s>5:`=w{;%e`k}_s>4:`=w{;%e`k}_s>;:`=w{;%e`k}_s>::a=w{;%e`k}_s]3`>vt:&~bah|Pr^3f?uu5'}cfiQ}_0225>vt:&~bah|Pr^33[wrb3yy9#ygbes]q[47692zx>"zfmdp\vZ76W{~n7}}=/uknawYuW88:=6~|2.vji`tXzV;9Szj;qq1+qojm{UyS<=>1:rp6*rnelxT~R?<_sv24>vt:&~bah|Pr^3\vqb"zfmdp\vZ5682zx>"zfmdp\vZ5Xz}n0|~< thofvZtX<8:0|~< thofvZtX4pr0,plkbzVxT:R|{d:rp6*rnelxT~R9>0:rp6*rnelxT~R9Pruf8tv4(|`gn~R|P8028tv4(|`gn~R|P8^pw`>vt:&~bah|Pr^;24>vt:&~bah|Pr^;\vqc2?3e?uu5'}cfiQw<01=55=w{;%e`k}_y>27;7b3yy9#ygbes]{848a3yy9#ygbes]{8486m2zx>"zfmdp\|949n2zx>"zfmdp\|9499l1{?!{ilgq[}:46o1{?!{ilgq[}:468o0|~< thofvZ~;<7l0|~< thofvZ~;<7;n7}}=/uknawY4<4m7}}=/uknawY4<4:i6~|2.vji`tXp5<5j6~|2.vji`tXp5<5=h5s3-wmhcuWq6<2k5s3-wmhcuWq6<27:rp6Zekcj1{?Qllj]JFP@?3yy9Sio{ae9sw7Yci}kTEO[I3:pg}2=umzoScm4rdqfpZhXAK_M56xha^`oq`6>3mjSobze0;8rbgXjen>l5yg`]dv`ci8h1}klQhrdgm5d=qohUl~hka2c9ucdYo{pdhSc64vfc\v`b702|lmR|jd0:8rbgXzln9n6xha^tp}keXfo1so?}=01/6)ca5=?wKL}=ne:BC|0b=N381=v]>8;74>73=9:8:o?;523c36~h2=3;0b8854:&60?2a3tY:;7;8:3795646k;?1>?o?3:f6`?6=93;p_<6556811?74:8i997<=a108rQ2f290:6<460zQ2302;?1=><>c37967g7:2.?i742b3k?o6=4>8;::><6|,=h19i5G4b9j517=831b=>m50;9j56c=831b9l4?::k6g?6=3f;?57>5;n4`>5<j6=44o06a>5<h6=44o065>5<<6=44o06;>5<86=44o067>5<>6=44o06g>5<>i1:3:17b8;:188k30=831d:54?::m5e?6=3k;?<7>54;294~"3j3;n7E:l;I72?l7>2900e<850;9j56<722e?47>5;|`66?6=93:11b<@=i0D8?4o5794?=zj>;1<7:50;2x 1d=9l1C8n5G509j5<<722c::7>5;h30>5<5;h30>5<5;h30>5<5;h30>5<6=4;:183!2e28o0D9m4H438m4?=831b=;4?::k27?6=3f>36=44}c332?6=<3:14?::m76=3th:==4?:583>5}#o613:17d?9:188m45=831d854?::a544=83>1<7>t$5`95`=O>o6>3:17d?<:188k1>=831vn;:187>5<7s->i6>o6;3:17b:7:188yg76>3:187>50z&7f?7b3A>h7E;>;h3:>5<>i303:17pl>1983>1<729q/8o4>e:J7g>N292c:57>5;h35>5<>{e98k1<7:50;2x 1d=9l1C8n5G509j5<<722c::7>5;h30>5<5<3290;w):m:0g8L1e<@<;0e<750;9j53<722c:?7>5;n6;>5<54;294~"3j3;n7E:l;I72?l7>2900e<850;9j56<722e?47>5;|`242<72=0;6=u+4c82a>N3k2B>=6g>9;29?l712900e<=50;9l0=<722wi==750;694?6|,=h1=h5G4b9K14=n900;66g>6;29?l742900c9650;9~f46e290?6=4?{%6a>4c<@=i0D8?4i0;94?=n9?0;66g>3;29?j2?2900qo??d;290?6=8r.?n7?j;I6`?M363`;26=44i0494?=n9:0;66a;8;29?xdd83:187>50z&7f?7b3A>h7E;>;h3:>5<>i303:17pll5;290?6=8r.?n7?j;I6`?M363`;26=44i0494?=n9:0;66a;8;29?xde83:187>50z&7f?7b3A>h7E;>;h3:>5<>i303:17plm1;290?6=8r.?n7?j;I6`?M363`;26=44i0494?=n9:0;66a;8;29?xde:3:187>50z&7f?7b3A>h7E;>;h3:>5<>i303:17plm3;290?6=8r.?n7?j;I6`?M363`;26=44i0494?=n9:0;66a;8;29?xd0<3:187>50z&7f?503A>h7E;>;h36>5<>i3;3:17pl88;290?6=8r.?n7=8;I6`?M363`;>6=44i0`94?=n<00;66a;3;29?xd?>3:1?7>50z&7f?373A>h7E;>;h36>5<>{e?00;694?:1y'0g<4?2B?o6F:1:k21?6=3`;i6=44i5;94?=h<:0;66sm8683>6<729q/8o4:0:J7g>N292c:97>5;h0g>5<26=44o5194?=zj121<7=50;2x 1d==91C8n5G509j50<722c9h7>5;n60>5<86=44}c::>5<4290;w):m:428L1e<@<;0e<;50;9j6a<722e??7>5;|`4g?6=<3:153;294~"3j3?;7E:l;I72?l722900e?j50;9l06<722wi;i4?:583>5}#o6=3:17d?m:188m1?=831d8>4?::aN3k2B>=6g>5;29?l4c2900c9=50;9~f2c=83>1<7>t$5`972=O>o6j3:17d:6:188k15=831vn5m50;194?6|,=h19=5G4b9K14=n9<0;66g=d;29?j242900qo9i:187>5<7s->i6>94H5a8L07>o313:17b:<:188yg>c29086=4?{%6a>06<@=i0D8?4i0794?=n:m0;66a;3;29?xd?83:187>50z&7f?503A>h7E;>;h36>5<>i3;3:17pl7e;297?6=8r.?n7;?;I6`?M363`;>6=44i3f94?=h<:0;66sm7483>1<729q/8o4<7:J7g>N292c:97>5;h3a>5<>{e0;0;6>4?:1y'0g<282B?o6F:1:k21?6=3`8o6=44o5194?=zj><1<7:50;2x 1d=;>1C8n5G509j50<722c:n7>5;h6:>5<86=44}c54>5<3290;w):m:258L1e<@<;0e<;50;9j5g<722c?57>5;n60>5<i4?::m77?6=3th397>53;294~"3j3?;7E:l;I72?l722900e?j50;9l06<722wi5=4?:283>5}#5;|`g5?6==3:15;h0;>5<>{e9;h1<7=50;2x 1d=;81C8n5+2c8b?M363`8=6=44i3594?=h<:0;66smc683>0<729q/8o4<4:J7g>"5j3:0D8?4i3494?=n:>0;66g=8;29?l4>2900c9=50;9~ff>=83?1<7>t$5`971=Oo4>0:J65>o5>3:17d<8:188m7>=831b>44?::m77?6=3thhm7>54;294~"3j3997E:l;%0a>2=O=81b>;4?::k13?6=3`836=44o5194?=zj88o6=4<:183!2e2:;0D9m4$3`9e>N292c9:7>5;h04>5<5<4290;w):m:238L1e<,;h1m6F:1:k12?6=3`8<6=44o5194?=zj89:6=4<:183!2e2:;0D9m4$3`9e>N292c9:7>5;h04>5<5<4290;w):m:238L1e<,;h1m6F:1:k12?6=3`8<6=44o5194?=zj89>6=4<:183!2e2:;0D9m4$3`9e>N292c9:7>5;h04>5<5<4290;w):m:238L1e<,;h1m6F:1:k12?6=3`8<6=44o5194?=zj8926=4<:183!2e2:;0D9m4$3`9e>N292c9:7>5;h04>5<5<4290;w):m:238L1e<,;h1m6F:1:k12?6=3`8<6=44o5194?=zj8886=4<:183!2e2:;0D9m4$3`9e>N292c9:7>5;h04>5<5<4290;w):m:238L1e<,;h1m6F:1:k12?6=3`8<6=44o5194?=zj88<6=4<:183!2e2:;0D9m4$3`9e>N292c9:7>5;h04>5<5<4290;w):m:238L1e<,;h1m6F:1:k12?6=3`8<6=44o5194?=zjki1<7;50;2x 1d=;=1C8n5+2c82e>N292c9:7>5;h04>5<>i3;3:17plm9;291?6=8r.?n7=;;I6`?!4e28k0D8?4i3494?=n:>0;66g=8;29?l4>2900c9=50;9~fd1=83?1<7>t$5`971=Oo4=;I72?l412900e?950;9j6=<722c957>5;n60>5<N292c9:7>5;h04>5<;h05>5<>o513:17b:<:188ygg1290>6=4?{%6a>62<@=i0(?l5119K14=n:?0;66g=7;29?l4?2900e?750;9l06<722wi9o4?:383>5}#6F;c:J65>o5<3:17b:<:188yg73:3:1>7>50z&7f?4f3A>h7E;>;h07>5<5<5290;w):m:3c8L1e<@<;0e?:50;9l06<722wi=>h50;094?6|,=h1>l5G4b9K14=n:=0;66a;3;29?xd1l3:1>7>50z&7f?233A>h7E;>;h07>5<94?::m77?6=3th==7>52;294~"3j3>?7E:l;I72?l432900c9=50;9~f35=8381<7>t$5`901=O>i3;3:17pl95;296?6=8r.?n7:;;I6`?M363`8?6=44o5194?=zj?=1<7<50;2x 1d=<=1C8n5G509j61<722e??7>5;|`5=?6=:3:150z&7f?7a3A>h7E;>;h3:>5<1<75f1783>>o6;3:17b:7:188ygcb290>6=4?{%6a>4`<@=i0D8?4i0;94?=n9=0;66g>6;29?l742900c9650;9~f``=83?1<7>t$5`95c=O>o6<3:17d?9:188m45=831d854?::ab5<72<0;6=u+4c82b>N3k2B>=6g>9;29?l732900e<850;9j56<722e?47>5;|`e5?6==3:136=44}cd1>5<2290;w):m:0d8L1e<@<;0e<750;9j51<722c::7>5;h30>5<0<729q/8o4>f:J7g>N292c:57>5;h37>5<>i303:17pli5;291?6=8r.?n7?i;I6`?M363`;26=44i0694?=n9?0;66g>3;29?j2?2900qoh9:186>5<7s->i6>o6>3:17d?<:188k1>=831vn<>i:181>5<7s->i6>>4H5a8 7d=12B>=6g=6;29?j242900qo?>1;296?6=8r.?n7=?;I6`?!4e201C9<5f2783>>i3;3:17pl>1283>7<729q/8o4<0:J7g>"5j330D8?4i3494?=h<:0;66sm10794?4=83:p(9l5319K0f=#:k027E;>;h05>5<5<5290;w):m:228L1e<,;h156F:1:k12?6=3f>86=44}c32=?6=:3:15;|`25g<72;0;6=u+4c804>N3k2.9n774H438m70=831d8>4?::a54b=8381<7>t$5`975=Oo46;I72?l412900c9=50;9~f47a29096=4?{%6a>66<@=i0(?l59:J65>o5>3:17b:<:188yg7703:1>7>50z&7f?573A>h7)>{e99i1<7<50;2x 1d=;91C8n5+2c8:?M363`8=6=44o5194?=zj8:n6=4=:183!2e2::0D9m4$3`9=>N292c9:7>5;n60>5<0D9m4$3`95a=O=81b>;4?::k13?6=3`836=44i3;94?=h<:0;66sme183>0<729q/8o4<4:J7g>"5j3;;7E;>;h05>5<>o513:17b:<:188ygee290>6=4?{%6a>62<@=i0(?l51b9K14=n:?0;66g=7;29?l4?2900e?750;9l06<722win84?:583>5}#o5>3:17d<8:188m1?=831d8>4?::af3<72=0;6=u+4c806>N3k2.9n7m4H438m70=831b>:4?::k16=3f>86=44}c`4>5<2290;w):m:268L1e<,;h1n6F:1:k12?6=3`8<6=44i3:94?=n:00;66a;3;29?xd6:80;6>4?:1y'0g<492B?o6*=b;48L07>i3;3:17plmd;290?6=8r.?n7=7;I6`?M363`8=6=44i3594?=n<00;66a;3;29?xdem3:197>50z&7f?533A>h7)5}#5;h0:>5<94?::m77?6=3th3=7>52;294~"3j38h7E:l;I72?l432900c9=50;9~f`4=8381<7>t$5`96f=O>i3;3:17pl:9;296?6=8r.?n791<7<50;2x 1d=:j1C8n5G509j61<722e??7>5;|`g6?6=>3:15;h0;>5<>i3;3:17pln1;292?6=8r.?n7=:;I6`?!4e2:1C9<5f2783>>o5?3:17d<7:188m7?=831d>h4?::m77?6=3thh57>54;294~"3j3987E:l;%0a>c=O=81b>;4?::k13?6=3`836=44o3g94?=zjh?1<7;50;2x 1d=;?1C8n5+2c82?M363`8=6=44i3594?=n:10;66g=9;29?j4b2900qoln:185>5<7s->i6>;4H5a8 7d=<2B>=6g=6;29?l402900e?650;9j6<<722e9i7>5;n60>5<;4?::k13?6=3`836=44i3;94?=h:l0;66s|15094?4|58>969=4=d0961=z{89o6=4={4?<589o69=4}r30b?6=:r7:?k4;3:?e2?7>3tyn57>54z?`4?346}:?80:?639e;30?83e2=90q~?;0;297~;6<90?463:f;07?83>2;>0q~k7:1878e?2;=01;?5259>b4<6127m>7:7;|qf3?6=72<5o:1=452f087<>{tm?0;69u2c681=>;1=38?70ki:0;89c6=<11vh;50;6x9f1=:116::4=4:?fa?7>34om6964}rg7>5<3s4i<6?94=7;961=:mm0:563je;6;?xub;3:1?v3l7;05?80e2;>01hj5499~w0>=838p1<:?:0;890?=<:1vik50;1x942728901ik5499>gd<5?2wx8=4?:dy>17<5:27<87?:;<5;>4d<5>31=o527`82f>;0j3;i709l:0`892b=9k16;h4>b:?4b?7e342;6v3:3;66?81328h0q~8j:1812~;c13;870jn:0189ad=9:16hn4>3:?g`?7434nn6<=4=026>45<58:=6<=4=033>45<58;96<=4=037>45<58;=6<=4=03;>45<58;j6<=4=03`>45<58;n6<=4=024>45<58:26<=4=02a>45<58:o6<=4=b2956=:k<0:?63m0;30?8d628901o<5129>f6<6;27nh7?<;45<5ll1=>52f1827>;a93;870h=:0189c5=9:16j94>3:?e1?7434l=6<=4=62906=:?:0986s|7083>7}:?80?4639e;3:?xu0:3:1>v381;3:?8142=90q~m?:1848e72=201no5279>g6<5>27i:7<7;<`4>7?<5ko1>:52b`81<>{tlo0;6?u2dd82=>;b83>87p}l1;296~;d83;270m<:518yvg72909w0o>:5189f?=:?1vl<50;5x9d0=<:16o>4=7:?f4?4134ii6?94=c790<=:jl09563ma;0:?xuc;3:1=;ek38270l6:3;89`b=9=16ih4>4:?fb?7334l;6<:4=g3951=:n;0:863i3;37?8`328>01k;5159>b3<6<27i:7<8;<`4>71<5kn18452b`812>{tk<0;6>u2c487<>;di38370k?:3;8yve12909w0m::0;89fd=<:1vi>50;gx944c2;<01<2;<01<=m:34894442;<01<<::34894402;<01<<6:34894462;<01i<5429~w`e=838p1k;5189>b3<302wxio4?:3y>b1<6127m97:7;|qfe?6=;r7h47<6;4?<5o>1855rs8494?4|51?18>5213;962=z{0?1<7:5rs8694?4|51918>52137962=z{091<7:5rs8d94?4|51o18>5212`962=z{0o1<7:5rs8f94?4|51i18>52125962=z{0i1<7:5rs8`94?4|51k18>52121962=z{0k1<7:5rs8;94?4|51218>5213d962=z{021<7:5rs8594?4|51<18>5213`962=z{8836=4={<33`?7>34;957:<;|q263<72;q6==l5189>571=<:1v<<;:18187713;270?=5;60?xu6:;0;6?u211595<=:9;918>5rs01b>5<5s4;:i7?6;<30f?243ty:?54?:3y>54e=9016=>75429~w4512909w0?>a;3:?874?3>87p}>3583>7}:9821=452127906=z{8996=4={<322?7>34;8?7:<;|q275<72;q6=<:5189>567=<:1v<5rs00b>5<5s4;;:7?6;<31f?243ty:>=4?:3y>553=9016=??5429~wd`=83?p1o=5499>f`<5>27ij7<9;7><5j81>55rs`g94?3|5k818552bb812>;en38270o>:3;89f4=:01vlj50;4x9g7=<1165=4=6:?a=?4134hm6?94=`3963=:k;09:6s|ab83>=}:j90?46360;04?8d>2;201o85279>f2<5>27ij7<7;71<5j81>:5rse:94?5|5mn18552d081<>;c:3837p}k7;290~;ck3>370jk:0;89a7=:?16h?4=9:p`3<72=q6ho4;8:?gg?7>34n:6?74=e0963=z{m?1<7ot=ec90==:lk0:563k1;04?8e42;201h>5269>gg<5027i;7<7;<`f>7><5m81>:52b`813>{tl=0;6?u2d887<>;ci3;27p}ib;297~;68m0?463n3;04?877m38=7p}ia;297~;68k0?463n3;05?877k38=7p}i9;297~;6800?463n4;0;?877i38=7p}i8;297~;68>0?463n4;0:?877038=7p}>0583>6}:98o18552a5813>;69o09:6s|11194?5|58;h6964=`6963=:98n1>;5rs021>5<4s4;:m7:7;70<58;i6?84}r335?6=;r7:=54;8:?b3?4?34;:57<9;|q245<72:q6=<85499>e2<5127:=:4=6:pbc<72:q6=<:5499>e2<5?27:=84=6:pb`<72:q6=<<5499>545=:?16m84=7:pba<72:q6=<>5499>547=:?16m84=6:pbf<72:q6==85499>55`=:?16m84=9:pb2<72=q6==;5499>577=:>164<4=4:?b1?4?3tyih7>52z?a7?7>34ho69=4}r`a>5<5s4h96<74=ca906=z{k21<77}:j90:563m5;60?xub93:1>5u2152953=:?80::639e;35?8b>2==01io5469>`g<3?27oo7:8;11<5mo1=;52117953=:99<1=;52102953=:9881=;52106953=:98<1=;5210:953=:98k1=;5210a953=:98o1=;52115953=:9931=;5211`953=:99n1=;52c1822>;d=3;=70l?:0489g7=9?16n?4>6:?a7?7134oo6<84=dg953=:mo0::63i0;35?8`628<01k<5179>b6<6>27m87?9;40<5o<1=;52e3877>{t1;0;6?u27587=>;?93>87p}84;297~;0<3>87097:0789=0=9<1v:650;1x92>=<:16;44>5:?;3?723ty<57>53z?4=?2434=j6<;4=9:950=z{>k1<7=t=6c906=:?k0:96379;36?xu0j3:1?v38b;60?81d28?015o5149~w2e=839p1:m5429>3a<6=273n7?:;|q4`?6=;r743<51i1=85rs6g94?5|5>o18>527g821>;?l3;>7p}8f;297~;0n3>8706?:0789=c=9<1v5>50;1x9=6=<:16;84>5:?;6?723ty<97>53z?41?2434==6<;4=91950=z{><1<7=t=64906=:?>0:96374;36?xu0?3:1>v387;60?8>228?0q~6i:1818?72=901om5299~w<7=838p1o75269>fd<3;2wxo94?:3y>g6<5127h>77115<5j31>55rsbg94?4|5jh1>452c881a>{tko0;6?u2c`877>;dj38=7p}n8;296~;f?3>870o9:348yvg>2909w0o<:5189d0=:>1vlo50;0x9d2=<:16m;4=8:peg<72;q6m;4=9:?b1?4b3ty>m7>52z\6e>;2j38?7p}>4083>7}Y9=;01<:=:368yv74k3:1>vP>3b9>56b=:=1v<=j:181[74m27:?k4=4:p2f<72;qU:n526e877>{t=l0;6?uQ5d9>1c<3;2wx:=4?:3y]25=:>80??6s|6383>7}Y>;16:>4;3:p21<72;qU:95264877>{t>?0;6?uQ679>22<3;2wx:54?:3y]2==:>00??6s|6`83>7}Y>h16:o4;3:p55`=839p1:65489><3<5l27:<2<5l27:=<4;3:p545=839p1:o5489><=<5l27:=>4;3:p543=839p1:l5489><<<5l27:=84;3:p541=839p1:m5489>5489><`<5l27:=k4;3:p55>=839p1:;5489><7<5l27:<54;3:p55g=839p1:85489><6<5l27:<1<5l27:55c=<:1v>750;0x9g3=:?16n;4;3:p7d<72;q6n84=7:?a3?243ty8n7>52z?a`?4134hn69=4}r1`>5<5s4ho6?94=cd906=z{?l1<77}:9;h1>;52d381a>{t;l0;6?u2e181<>;f938n7p}a290:wE:l;|l1=5<728qC8n5rn3;2>5<6sA>h7p`=9383>4}O6=4>{I6`?xh51?0;65<6sA>h7p`=9`83>4}O{I6`?xh51l0;65<6sA>h7p`=a383>4}O6=4>{I6`?xh5i?0;65<6sA>h7p`=a`83>4}O{I6`?xh5il0;65<6sA>h7p`=b383>4}O6=4>{I6`?xh5j?0;65<6sA>h7p`=b`83>4}O{I6`?xh5jl0;65<6sA>h7p`=c383>4}O6=4>{I6`?xh5k?0;65<6sA>h7p`=c`83>4}O{I6`?xh5kl0;65<6sA>h7p`=d383>4}O6=4>{I6`?xh5l?0;65<6sA>h7p`=d`83>4}O{I6`?xh5ll0;65<6sA>h7p`=e383>4}O6=4>{I6`?xh5m?0;65<6sA>h7p`=e`83>4}O{I6`?xh5ml0;65<6sA>h7p`=f383>4}O6=4>{I6`?xh5n?0;65<6sA>h7p`=f`83>4}O{I6`?xh5nl0;65<6sA>h7p`<0383>4}O><:182M2d3td8<94?:0yK0f=zf::>6=4>{I6`?xh48?0;65<6sA>h7p`<0`83>4}O>m:182M2d3td8{I6`?xh48l0;65<6sA>h7p`<1383>4}O?<:182M2d3td8=94?:0yK0f=zf:;>6=4>{I6`?xh49?0;65<6sA>h7p`<1`83>4}O?m:182M2d3td8=n4?:0yK0f=zf:;o6=4>{I6`?x{zuIJHw>oj:2d4r@ARxyEF
\ No newline at end of file
diff --git a/xilinx/ps2/fpga.ngd b/xilinx/ps2/fpga.ngd
new file mode 100644
index 0000000..387fc50
--- /dev/null
+++ b/xilinx/ps2/fpga.ngd
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.4e
+$0:f41<,[o}e~g`n;"2*47?&;<%>-*>;1684566<2:;6709>0<<>:4:21677<9;1:<95>01:`?7u589ll>88"50970>23808;:46@CB5>>531:?75>?009B7>GCZ:1IYK:4BTDD1>DRNNZ:<6LZIMF\PDT@M]KYOE?4C39@A7=DA<1HGO[I3:AOO6=DD[30OBCBIUVF@2=DZLK_II?4D59GE=>53MCn7I\L_RW@G@UTN\F?7HONA59FADC?3LR[MCJJD29E@F2O37K\@M^W@B4=@;2MEH<5F4:K-7442FDMIKK3:NLG==KGJKGNXH8;MMDMFGK<2F^X<:4LTV10>JR\:<0@XZ<_M68HPR3>2F^X9QK6:NVP1YK;2G^T85BUYAZ1>KRPO?h7@oeosTfvvohfj1Feca}Vdppmjh33G;?;95A15:7?K731=1E=8>;;O3651=I9<8?7C?:339M67=I;>1EIYY@RJ38K1=HJ\L87B@J3:MVP4=W;2ZJH95_ASV0?UTB92[:<6\JRDQLHSCXXHXJA^=4RNO0?WUS92Y87^KC3:QFP3=SALEMJ95[YQG5?PHR[LNh7X]JR^TJWLDKM:1]ON74VHGT[Q_WM8n0TDBFNY/[@G&7&8*XXXL/0/3#EVENA:1SC_;4XNP@]3=_[]FBN:5WSU]DJA1^c`VZye`Gavb9[`mYWz`g_u}ki;Yfk[Utne_oydaa119[`hYJiceyZh||inl24>^ceVGbbb|Yesqjkk5b6<;1n=>5j1708a65`wohUoecQk0^MAQC5?_b{?4;7e3yy9#@okd^]b`aurj9:;1?3a?uu5'DkohRQndeqvf5678Vir0<<11`9sw7)JimnTSljkst`3456Xkp6:2?0^az8686i2zx>"Cnde]\eabt}k:;<=Qly=6=5d=w{;%FmijP_`fgwpd789:Tot2:>0c8tv4(EhnoSRokdrwa4567Wjs7:3?n;qq1+HgclVUjhi}zb1234Ze~4>4:m6~|2.Ob`aYXimnxyo>?01]`}9>99h1{?!Baef\[dbc{|h;<=>Pcx>::77?_ymq84699j1{?!Baef\[dbc{|h;<=>Pxnp?5486k2zx>"Cnde]\eabt}k:;<=Qwos>26;7d3yy9#@okd^]b`aurj9:;vt:&GjhiQPaefpqg6789Usc2=>0`8tv4(EhnoSRokdrwa4567Wqey0>0>b:rp6*KflmUTmij|uc2345Yg{6?2?01]{kw:168h0|~< M`fg[Zgclzi<=>?_ymq8286j2zx>"Cnde]\eabt}k:;<=Qwos>;:4dvt:&GjhiQPaefpqg6788Uhu1?11b9sw7)JimnTSljkst`3457Xkp6:29;qq1+K513yy9#C:>3:rp6*Yflmy~n=>?0=33:45018tv4(Whnoxl?012?5686:2zx>"Qndeqvf56785;5=?5s3-\eabt}k:;<=2=>008tv4(Whnoxl?012?7;753yy9#Rokdrwa45674=4:>6~|2.]b`aurj9:;<1;1139sw7)Ximnxyo>?01>5:442:rp6*Yflmy~n=>?0=;=b>vt:&Uha}Qjq123446"Qlmq]fu567988:=6~|2.]`iuYby9:;=>>>1:rp6*YdeyUn}=>?1502g>vt:&Uha}Qjq123514(D\^?SAQMUG30?uu5'Vif|Rk~012207)H981{?!Pclr\at6788?===5s3-\ghvXmx:;<<6>5:rp6*YdeyUn}=>?1^obt646=2zx>"Qlmq]fu5679Vgj|>;>5:rp6*YdeyUn}=>?1^obt176=2zx>"Qlmq]fu5679Vgj|99i;qq1+goskg~T~1>1f:rp6*dn|jdS2>>g9sw7)ea}iexR|32?d8tv4(j`~hbyQ}<2"lftblw[}:768UM=?5s3-amqei|Vr7<3?PGg9sw7)ea}iexRv31?33?uu5'kcoczPx=3=5440>1:rp6*dn|jdSu2<>^D25>vt:&hbxn`{_y>0:ZAe3yy9#h|}os]qf>vt:&oy~b|Pxe9sw7)bz{eySu?<199sw7)bz{eySu?:<6~|2.gqvjtXpVgj|:m4pr0,o`umeUyo6~|2.if}wckWqo0|~< kd{qaiY9;o0|~< kd{qaiY::o0|~< kd{qaiY:<;27}}=/jgzv`jXp;?$@XZ<_M]AQC773yy9#fkvrdn\|73(Gl1{?!dexpfhZ~2:l1{?!dexpfhZ~2<880|~< kd{qaiYWdk{=;?=;qq1+nc~zlfTtRcnp3226>vt:&anukc_y]neu469;1{?!dexpfhZ~Xehz9:<>4pr0,tv4XkeaTiiij139sw7)w{;Uh`fQjdfg2547"BZT5]G[GSA9<1{?!s3]`hnYaiefTiiij119sw7)w{;Uh`fQ}<1<24>vt:&zx>Rmck^p?5;773yy9#}}=_bnh[w:568:0|~< pr0\gimXz595==5s3-sw7YddbUy090i;qq1+uu5Wjf`SQ?f:rp6*vt:ViggR|P1g9sw7)w{;Uh`fQ}_3d8tv4(xz8ToaePr^1e?uu5'yy9Snbd_s]7=>vt:&xouR|6;qq1+wb~Wqk0|~< re{\|4bvt:&yhS27>c9sw7)tkVx753o4pr0,wfYuW9k0|~< sb]q[4go4pr0,wfYuW=k0|~< sb]q[0g"zfmdp\v9756o1{?!{ilgq[w:6;7o0|~< thofvZt;97o0|~< thofvZt;:7o0|~< thofvZt;;7o0|~< thofvZt;<7o0|~< thofvZt;=7o0|~< thofvZt;>7o0|~< thofvZt;?7o0|~< thofvZt;07o0|~< thofvZt;17n0|~< thofvZtX8m1{?!{ilgq[wY6m2zx>"zfmdp\vZ77981{?!{ilgq[wY68Vxi6~|2.vji`tXzV;:=<5s3-wmhcuW{U:=R|{e:rp6*rnelxT~R?=109sw7)sadoySQ>2^pwa>vt:&~bah|Pr^3054=w{;%e`k}_s]27Zts991{?!{ilgq[wY6W{~o7}}=/uknawYuW;;;7}}=/uknawYuW;Uyxi5s3-wmhcuW{U8==5s3-wmhcuW{U8Szk;qq1+qojm{UyS9??;qq1+qojm{UyS9Q}te9sw7)sadoySQ:119sw7)sadoySQ:_svg?uu5'}cfiQ}_733?uu5'}cfiQ}_7]qpa=w{;%e`k}_s]455=w{;%e`k}_s]4[wrc3yy9#ygbes]q[=773yy9#ygbes]q[=Yu|m1{?!{ilgq[wY>991{?!{ilgq[wY>W{~n7}}=/uknawY494m7}}=/uknawY494:j6~|2.vji`tXp5;;2<>4pr0,plkbzVr7==0>f:rp6*rnelxTt1?>>028tv4(|`gn~Rv310<2b>vt:&~bah|Px=31:46"zfmdp\|97468:0|~< thofvZ~;9:4:i6~|2.vji`tXp5;5j6~|2.vji`tXp5;5=h5s3-wmhcuWq692k5s3-wmhcuWq692e:rp6*rnelxTt1;1f:rp6*rnelxTt1;11d9sw7)sadoySu29>g9sw7)sadoySu29>0g8tv4(|`gn~Rv37?d8tv4(|`gn~Rv37?3f?uu5'}cfiQw<9vt:&~bah|Px=;=b>vt:&~bah|Px=;=52=w{;Uh`fm4pr0\gimXAK_M46~|2^fbpdbp`iVbxucmPn99ucdYumm:37{in_sgg5==qohUyii>=6NOx9`9B?2=9rY9<79j:2395646k;?1>?o?2zl4g?7n186*87;52?xU6n3=n6>?51202g73=:;k;?6];2;c4>5<6;;;h>84=2`24?V7a2h=1<7?<20a11?45i9i0h5l50;395~U583=n6>?51202g73=:;k;>6*>8;3;5>N5<2|_>:4?:082>d6|[;:1;h4<1;3064e5=389m=<4$62900=Q?k09wx;?:09v14<73t.=>7l4b9`94?7?20h15ku+6b8;f>N1m2c:;k4?::k23<<722c:;o4?::k;6?6=3`2?6=44o0:;>5<>i?m3:17b7?:188k<4=831d594?::m:2?6=3f336=44b05f>5<1290;w)8l:3:8L3c<@>>0(:o52c9'7f<63A<>7):>:0:g?l46290/;l4<8:9j5`<72-=j6;94;h3:>5<#?h0:h65`6583>!1f24?:%5b>3g<3th<97>51;294~"1k38m7E8j;I57?!1f2>l0(9?519f8k7c=83.N1m2B<86*8a;7f?!26282o7b8?:18'3d<2n21vnl>50;494?6|,?i1>55G6d9K31=#?h09n6*e;29 2g=>>10e<750;&4e?7c32e=87>5$6c91c=o1;3:1(:o56`98yg?c290=6=4?{%4`>7><@?o0D::4$6c96g=#;j0:7E8:;%62>4>c3`8:6=4+7`80<>=n9l0;6)9n:758?l7>290/;l4>d:9l21<72-=j68h4;h3b>5<#?h0:m65f6283>!1f2?k07pl>1783>3<729q/:n4=a:J5a>N0<2.==#<80:4i5f2083>!1f2:207d8<:18'3d<1i21b=44?:%5b>4b<3f6=4+7`86b>=n9h0;6)9n:0c8L3b<3`<<6=4+7`853>N1l21vn8:185>5<7s-