+++ /dev/null
-SRC_DIR = interpretor
-PREPROCESSOR_DIR = $(SRC_DIR)/faust-0.9.47mr3
-OUTPUTSOUNDS_DIR = output_sounds
-EXEC = faustine
-
-all: $(EXEC)
-
-faustine:
- @cp $(SNDFILE_PATH)/sndfile_stub.o $(SRC_DIR)
- @cd $(SRC_DIR) && $(MAKE) opt OCAML_INCLUDE_PATH=$(OCAML_INCLUDE_PATH) SNDFILE_PATH=$(SNDFILE_PATH)
- @cd $(SRC_DIR) && $(MAKE) clean
-
-.PHONY: clean mrproper
-
-clean:
- @(cd $(SRC_DIR) && $(MAKE) clean)
- @(rm -f *~)
-
-mrproper: clean
- @(cd $(SRC_DIR) && $(MAKE) mrproper)
- @(cd $(PREPROCESSOR_DIR) && $(MAKE) clean)
-
-test:
- @rm -f $(OUTPUTSOUNDS_DIR)/output0.wav
- @cd $(SRC_DIR) && ./faustine -csv -wav ../dsp_files/sin.dsp
- @ls -l $(OUTPUTSOUNDS_DIR)/output0.wav
-
- @echo " You might want to check the output file with either:"
- @echo "audacity ../output_sounds/output0.wav"
- @echo "open ../output_sounds/output0.wav"
- @echo "octave -q --eval 'plot(wavread(\"output_sounds/output0.wav\")); pause'"
-
-# Library paths for OCaml and libsndfile-ocaml
-# OCAML_INCLUDE_PATH
-# SNDFILE_PATH
-
-OCAML_INCLUDE_PATH = /usr/local/lib/ocaml
-SNDFILE_PATH = ~/Boulot/2013-07-CRI/lib/libsndfile-ocaml
# Library paths for OCaml and libsndfile-ocaml
# OCAML_INCLUDE_PATH
# SNDFILE_PATH
-
<?xml version="1.0"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 202.300000 80.000000" width="101.150000mm" height="40.000000mm" version="1.1">
-<rect x="1.000000" y="1.000000" width="201.300000" height="79.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="0.000000" y="0.000000" width="201.300000" height="79.000000" rx="0" ry="0" style="stroke:none;fill:#ffffff;"/>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 318.400000 1072.000000" width="159.200000mm" height="536.000000mm" version="1.1">
+<rect x="1.000000" y="1.000000" width="317.400000" height="1071.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="0.000000" y="0.000000" width="317.400000" height="1071.000000" rx="0" ry="0" style="stroke:none;fill:#ffffff;"/>
<text x="10.000000" y="7.000000" font-family="Arial" font-size="7"></text>
-<rect x="33.000000" y="33.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="32.000000" y="32.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#f44800;"/>
-<text x="44.000000" y="46.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">8</text>
-<circle cx="34.000000" cy="34.000000" r="1"/>
-<rect x="73.000000" y="29.000000" width="38.700000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="72.000000" y="28.000000" width="38.700000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#4B71A1;"/>
-<text x="91.350000" y="42.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">vectorize</text>
-<circle cx="74.000000" cy="30.000000" r="1"/>
-<line x1="69.000000" y1="35.000000" x2="72.000000" y2="36.000000" transform="rotate(0.000000,72.000000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="69.000000" y1="37.000000" x2="72.000000" y2="36.000000" transform="rotate(0.000000,72.000000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="69.000000" y1="43.000000" x2="72.000000" y2="44.000000" transform="rotate(0.000000,72.000000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="69.000000" y1="45.000000" x2="72.000000" y2="44.000000" transform="rotate(0.000000,72.000000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
-<a xlink:href="eo-0x24557e0.svg">
-<rect x="119.700000" y="29.000000" width="25.800000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="118.700000" y="28.000000" width="25.800000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+<rect x="25.000000" y="529.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="24.000000" y="528.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#f44800;"/>
+<text x="36.000000" y="542.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">128</text>
+<circle cx="26.000000" cy="530.000000" r="1"/>
+<rect x="65.000000" y="525.000000" width="38.700000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="64.000000" y="524.000000" width="38.700000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#4B71A1;"/>
+<text x="83.350000" y="538.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">vectorize</text>
+<circle cx="66.000000" cy="526.000000" r="1"/>
+<line x1="61.000000" y1="531.000000" x2="64.000000" y2="532.000000" transform="rotate(0.000000,64.000000,532.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="61.000000" y1="533.000000" x2="64.000000" y2="532.000000" transform="rotate(0.000000,64.000000,532.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="61.000000" y1="539.000000" x2="64.000000" y2="540.000000" transform="rotate(0.000000,64.000000,540.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="61.000000" y1="541.000000" x2="64.000000" y2="540.000000" transform="rotate(0.000000,64.000000,540.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="fft-0x89a7cb0.svg">
+<rect x="111.700000" y="25.000000" width="38.700000" height="1024.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="110.700000" y="24.000000" width="38.700000" height="1024.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
</a>
-<a xlink:href="eo-0x24557e0.svg">
-<text x="131.600000" y="42.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">eo(8)</text>
+<a xlink:href="fft-0x89a7cb0.svg">
+<text x="130.050000" y="538.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">fft(128)</text>
</a>
-<circle cx="120.700000" cy="30.000000" r="1"/>
-<line x1="115.700000" y1="39.000000" x2="118.700000" y2="40.000000" transform="rotate(0.000000,118.700000,40.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="115.700000" y1="41.000000" x2="118.700000" y2="40.000000" transform="rotate(0.000000,118.700000,40.000000)" style="stroke: black; stroke-width:0.25;"/>
-<a xlink:href="output-0x24453d0.svg">
-<rect x="153.500000" y="29.000000" width="25.800000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="152.500000" y="28.000000" width="25.800000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+<circle cx="112.700000" cy="26.000000" r="1"/>
+<line x1="107.700000" y1="535.000000" x2="110.700000" y2="536.000000" transform="rotate(0.000000,110.700000,536.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="107.700000" y1="537.000000" x2="110.700000" y2="536.000000" transform="rotate(0.000000,110.700000,536.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="pcplx-0x2a65970.svg">
+<rect x="158.400000" y="25.000000" width="77.400000" height="1024.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="157.400000" y="24.000000" width="77.400000" height="1024.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
</a>
-<a xlink:href="output-0x24453d0.svg">
-<text x="165.400000" y="42.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">output</text>
+<a xlink:href="pcplx-0x2a65970.svg">
+<text x="196.100000" y="538.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">pcplx_moduls(128)</text>
</a>
-<circle cx="154.500000" cy="30.000000" r="1"/>
-<line x1="149.500000" y1="35.000000" x2="152.500000" y2="36.000000" transform="rotate(0.000000,152.500000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="149.500000" y1="37.000000" x2="152.500000" y2="36.000000" transform="rotate(0.000000,152.500000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="149.500000" y1="43.000000" x2="152.500000" y2="44.000000" transform="rotate(0.000000,152.500000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="149.500000" y1="45.000000" x2="152.500000" y2="44.000000" transform="rotate(0.000000,152.500000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="15.000000" y1="15.000000" x2="15.000000" y2="65.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
-<line x1="15.000000" y1="65.000000" x2="187.300000" y2="65.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
-<line x1="187.300000" y1="65.000000" x2="187.300000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
+<circle cx="159.400000" cy="26.000000" r="1"/>
+<line x1="154.400000" y1="27.000000" x2="157.400000" y2="28.000000" transform="rotate(0.000000,157.400000,28.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="29.000000" x2="157.400000" y2="28.000000" transform="rotate(0.000000,157.400000,28.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="35.000000" x2="157.400000" y2="36.000000" transform="rotate(0.000000,157.400000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="37.000000" x2="157.400000" y2="36.000000" transform="rotate(0.000000,157.400000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="43.000000" x2="157.400000" y2="44.000000" transform="rotate(0.000000,157.400000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="45.000000" x2="157.400000" y2="44.000000" transform="rotate(0.000000,157.400000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="51.000000" x2="157.400000" y2="52.000000" transform="rotate(0.000000,157.400000,52.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="53.000000" x2="157.400000" y2="52.000000" transform="rotate(0.000000,157.400000,52.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="59.000000" x2="157.400000" y2="60.000000" transform="rotate(0.000000,157.400000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="61.000000" x2="157.400000" y2="60.000000" transform="rotate(0.000000,157.400000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="67.000000" x2="157.400000" y2="68.000000" transform="rotate(0.000000,157.400000,68.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="69.000000" x2="157.400000" y2="68.000000" transform="rotate(0.000000,157.400000,68.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="75.000000" x2="157.400000" y2="76.000000" transform="rotate(0.000000,157.400000,76.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="77.000000" x2="157.400000" y2="76.000000" transform="rotate(0.000000,157.400000,76.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="83.000000" x2="157.400000" y2="84.000000" transform="rotate(0.000000,157.400000,84.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="85.000000" x2="157.400000" y2="84.000000" transform="rotate(0.000000,157.400000,84.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="91.000000" x2="157.400000" y2="92.000000" transform="rotate(0.000000,157.400000,92.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="93.000000" x2="157.400000" y2="92.000000" transform="rotate(0.000000,157.400000,92.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="99.000000" x2="157.400000" y2="100.000000" transform="rotate(0.000000,157.400000,100.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="101.000000" x2="157.400000" y2="100.000000" transform="rotate(0.000000,157.400000,100.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="107.000000" x2="157.400000" y2="108.000000" transform="rotate(0.000000,157.400000,108.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="109.000000" x2="157.400000" y2="108.000000" transform="rotate(0.000000,157.400000,108.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="115.000000" x2="157.400000" y2="116.000000" transform="rotate(0.000000,157.400000,116.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="117.000000" x2="157.400000" y2="116.000000" transform="rotate(0.000000,157.400000,116.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="123.000000" x2="157.400000" y2="124.000000" transform="rotate(0.000000,157.400000,124.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="125.000000" x2="157.400000" y2="124.000000" transform="rotate(0.000000,157.400000,124.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="131.000000" x2="157.400000" y2="132.000000" transform="rotate(0.000000,157.400000,132.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="133.000000" x2="157.400000" y2="132.000000" transform="rotate(0.000000,157.400000,132.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="139.000000" x2="157.400000" y2="140.000000" transform="rotate(0.000000,157.400000,140.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="141.000000" x2="157.400000" y2="140.000000" transform="rotate(0.000000,157.400000,140.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="147.000000" x2="157.400000" y2="148.000000" transform="rotate(0.000000,157.400000,148.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="149.000000" x2="157.400000" y2="148.000000" transform="rotate(0.000000,157.400000,148.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="155.000000" x2="157.400000" y2="156.000000" transform="rotate(0.000000,157.400000,156.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="157.000000" x2="157.400000" y2="156.000000" transform="rotate(0.000000,157.400000,156.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="163.000000" x2="157.400000" y2="164.000000" transform="rotate(0.000000,157.400000,164.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="165.000000" x2="157.400000" y2="164.000000" transform="rotate(0.000000,157.400000,164.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="171.000000" x2="157.400000" y2="172.000000" transform="rotate(0.000000,157.400000,172.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="173.000000" x2="157.400000" y2="172.000000" transform="rotate(0.000000,157.400000,172.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="179.000000" x2="157.400000" y2="180.000000" transform="rotate(0.000000,157.400000,180.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="181.000000" x2="157.400000" y2="180.000000" transform="rotate(0.000000,157.400000,180.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="187.000000" x2="157.400000" y2="188.000000" transform="rotate(0.000000,157.400000,188.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="189.000000" x2="157.400000" y2="188.000000" transform="rotate(0.000000,157.400000,188.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="195.000000" x2="157.400000" y2="196.000000" transform="rotate(0.000000,157.400000,196.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="197.000000" x2="157.400000" y2="196.000000" transform="rotate(0.000000,157.400000,196.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="203.000000" x2="157.400000" y2="204.000000" transform="rotate(0.000000,157.400000,204.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="205.000000" x2="157.400000" y2="204.000000" transform="rotate(0.000000,157.400000,204.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="211.000000" x2="157.400000" y2="212.000000" transform="rotate(0.000000,157.400000,212.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="213.000000" x2="157.400000" y2="212.000000" transform="rotate(0.000000,157.400000,212.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="219.000000" x2="157.400000" y2="220.000000" transform="rotate(0.000000,157.400000,220.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="221.000000" x2="157.400000" y2="220.000000" transform="rotate(0.000000,157.400000,220.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="227.000000" x2="157.400000" y2="228.000000" transform="rotate(0.000000,157.400000,228.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="229.000000" x2="157.400000" y2="228.000000" transform="rotate(0.000000,157.400000,228.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="235.000000" x2="157.400000" y2="236.000000" transform="rotate(0.000000,157.400000,236.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="237.000000" x2="157.400000" y2="236.000000" transform="rotate(0.000000,157.400000,236.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="243.000000" x2="157.400000" y2="244.000000" transform="rotate(0.000000,157.400000,244.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="245.000000" x2="157.400000" y2="244.000000" transform="rotate(0.000000,157.400000,244.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="251.000000" x2="157.400000" y2="252.000000" transform="rotate(0.000000,157.400000,252.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="253.000000" x2="157.400000" y2="252.000000" transform="rotate(0.000000,157.400000,252.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="259.000000" x2="157.400000" y2="260.000000" transform="rotate(0.000000,157.400000,260.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="261.000000" x2="157.400000" y2="260.000000" transform="rotate(0.000000,157.400000,260.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="267.000000" x2="157.400000" y2="268.000000" transform="rotate(0.000000,157.400000,268.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="269.000000" x2="157.400000" y2="268.000000" transform="rotate(0.000000,157.400000,268.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="275.000000" x2="157.400000" y2="276.000000" transform="rotate(0.000000,157.400000,276.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="277.000000" x2="157.400000" y2="276.000000" transform="rotate(0.000000,157.400000,276.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="283.000000" x2="157.400000" y2="284.000000" transform="rotate(0.000000,157.400000,284.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="285.000000" x2="157.400000" y2="284.000000" transform="rotate(0.000000,157.400000,284.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="291.000000" x2="157.400000" y2="292.000000" transform="rotate(0.000000,157.400000,292.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="293.000000" x2="157.400000" y2="292.000000" transform="rotate(0.000000,157.400000,292.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="299.000000" x2="157.400000" y2="300.000000" transform="rotate(0.000000,157.400000,300.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="301.000000" x2="157.400000" y2="300.000000" transform="rotate(0.000000,157.400000,300.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="307.000000" x2="157.400000" y2="308.000000" transform="rotate(0.000000,157.400000,308.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="309.000000" x2="157.400000" y2="308.000000" transform="rotate(0.000000,157.400000,308.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="315.000000" x2="157.400000" y2="316.000000" transform="rotate(0.000000,157.400000,316.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="317.000000" x2="157.400000" y2="316.000000" transform="rotate(0.000000,157.400000,316.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="323.000000" x2="157.400000" y2="324.000000" transform="rotate(0.000000,157.400000,324.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="325.000000" x2="157.400000" y2="324.000000" transform="rotate(0.000000,157.400000,324.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="331.000000" x2="157.400000" y2="332.000000" transform="rotate(0.000000,157.400000,332.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="333.000000" x2="157.400000" y2="332.000000" transform="rotate(0.000000,157.400000,332.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="339.000000" x2="157.400000" y2="340.000000" transform="rotate(0.000000,157.400000,340.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="341.000000" x2="157.400000" y2="340.000000" transform="rotate(0.000000,157.400000,340.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="347.000000" x2="157.400000" y2="348.000000" transform="rotate(0.000000,157.400000,348.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="349.000000" x2="157.400000" y2="348.000000" transform="rotate(0.000000,157.400000,348.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="355.000000" x2="157.400000" y2="356.000000" transform="rotate(0.000000,157.400000,356.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="357.000000" x2="157.400000" y2="356.000000" transform="rotate(0.000000,157.400000,356.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="363.000000" x2="157.400000" y2="364.000000" transform="rotate(0.000000,157.400000,364.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="365.000000" x2="157.400000" y2="364.000000" transform="rotate(0.000000,157.400000,364.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="371.000000" x2="157.400000" y2="372.000000" transform="rotate(0.000000,157.400000,372.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="373.000000" x2="157.400000" y2="372.000000" transform="rotate(0.000000,157.400000,372.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="379.000000" x2="157.400000" y2="380.000000" transform="rotate(0.000000,157.400000,380.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="381.000000" x2="157.400000" y2="380.000000" transform="rotate(0.000000,157.400000,380.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="387.000000" x2="157.400000" y2="388.000000" transform="rotate(0.000000,157.400000,388.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="389.000000" x2="157.400000" y2="388.000000" transform="rotate(0.000000,157.400000,388.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="395.000000" x2="157.400000" y2="396.000000" transform="rotate(0.000000,157.400000,396.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="397.000000" x2="157.400000" y2="396.000000" transform="rotate(0.000000,157.400000,396.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="403.000000" x2="157.400000" y2="404.000000" transform="rotate(0.000000,157.400000,404.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="405.000000" x2="157.400000" y2="404.000000" transform="rotate(0.000000,157.400000,404.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="411.000000" x2="157.400000" y2="412.000000" transform="rotate(0.000000,157.400000,412.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="413.000000" x2="157.400000" y2="412.000000" transform="rotate(0.000000,157.400000,412.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="419.000000" x2="157.400000" y2="420.000000" transform="rotate(0.000000,157.400000,420.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="421.000000" x2="157.400000" y2="420.000000" transform="rotate(0.000000,157.400000,420.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="427.000000" x2="157.400000" y2="428.000000" transform="rotate(0.000000,157.400000,428.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="429.000000" x2="157.400000" y2="428.000000" transform="rotate(0.000000,157.400000,428.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="435.000000" x2="157.400000" y2="436.000000" transform="rotate(0.000000,157.400000,436.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="437.000000" x2="157.400000" y2="436.000000" transform="rotate(0.000000,157.400000,436.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="443.000000" x2="157.400000" y2="444.000000" transform="rotate(0.000000,157.400000,444.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="445.000000" x2="157.400000" y2="444.000000" transform="rotate(0.000000,157.400000,444.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="451.000000" x2="157.400000" y2="452.000000" transform="rotate(0.000000,157.400000,452.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="453.000000" x2="157.400000" y2="452.000000" transform="rotate(0.000000,157.400000,452.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="459.000000" x2="157.400000" y2="460.000000" transform="rotate(0.000000,157.400000,460.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="461.000000" x2="157.400000" y2="460.000000" transform="rotate(0.000000,157.400000,460.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="467.000000" x2="157.400000" y2="468.000000" transform="rotate(0.000000,157.400000,468.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="469.000000" x2="157.400000" y2="468.000000" transform="rotate(0.000000,157.400000,468.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="475.000000" x2="157.400000" y2="476.000000" transform="rotate(0.000000,157.400000,476.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="477.000000" x2="157.400000" y2="476.000000" transform="rotate(0.000000,157.400000,476.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="483.000000" x2="157.400000" y2="484.000000" transform="rotate(0.000000,157.400000,484.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="485.000000" x2="157.400000" y2="484.000000" transform="rotate(0.000000,157.400000,484.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="491.000000" x2="157.400000" y2="492.000000" transform="rotate(0.000000,157.400000,492.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="493.000000" x2="157.400000" y2="492.000000" transform="rotate(0.000000,157.400000,492.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="499.000000" x2="157.400000" y2="500.000000" transform="rotate(0.000000,157.400000,500.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="501.000000" x2="157.400000" y2="500.000000" transform="rotate(0.000000,157.400000,500.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="507.000000" x2="157.400000" y2="508.000000" transform="rotate(0.000000,157.400000,508.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="509.000000" x2="157.400000" y2="508.000000" transform="rotate(0.000000,157.400000,508.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="515.000000" x2="157.400000" y2="516.000000" transform="rotate(0.000000,157.400000,516.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="517.000000" x2="157.400000" y2="516.000000" transform="rotate(0.000000,157.400000,516.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="523.000000" x2="157.400000" y2="524.000000" transform="rotate(0.000000,157.400000,524.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="525.000000" x2="157.400000" y2="524.000000" transform="rotate(0.000000,157.400000,524.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="531.000000" x2="157.400000" y2="532.000000" transform="rotate(0.000000,157.400000,532.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="533.000000" x2="157.400000" y2="532.000000" transform="rotate(0.000000,157.400000,532.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="539.000000" x2="157.400000" y2="540.000000" transform="rotate(0.000000,157.400000,540.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="541.000000" x2="157.400000" y2="540.000000" transform="rotate(0.000000,157.400000,540.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="547.000000" x2="157.400000" y2="548.000000" transform="rotate(0.000000,157.400000,548.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="549.000000" x2="157.400000" y2="548.000000" transform="rotate(0.000000,157.400000,548.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="555.000000" x2="157.400000" y2="556.000000" transform="rotate(0.000000,157.400000,556.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="557.000000" x2="157.400000" y2="556.000000" transform="rotate(0.000000,157.400000,556.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="563.000000" x2="157.400000" y2="564.000000" transform="rotate(0.000000,157.400000,564.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="565.000000" x2="157.400000" y2="564.000000" transform="rotate(0.000000,157.400000,564.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="571.000000" x2="157.400000" y2="572.000000" transform="rotate(0.000000,157.400000,572.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="573.000000" x2="157.400000" y2="572.000000" transform="rotate(0.000000,157.400000,572.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="579.000000" x2="157.400000" y2="580.000000" transform="rotate(0.000000,157.400000,580.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="581.000000" x2="157.400000" y2="580.000000" transform="rotate(0.000000,157.400000,580.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="587.000000" x2="157.400000" y2="588.000000" transform="rotate(0.000000,157.400000,588.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="589.000000" x2="157.400000" y2="588.000000" transform="rotate(0.000000,157.400000,588.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="595.000000" x2="157.400000" y2="596.000000" transform="rotate(0.000000,157.400000,596.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="597.000000" x2="157.400000" y2="596.000000" transform="rotate(0.000000,157.400000,596.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="603.000000" x2="157.400000" y2="604.000000" transform="rotate(0.000000,157.400000,604.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="605.000000" x2="157.400000" y2="604.000000" transform="rotate(0.000000,157.400000,604.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="611.000000" x2="157.400000" y2="612.000000" transform="rotate(0.000000,157.400000,612.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="613.000000" x2="157.400000" y2="612.000000" transform="rotate(0.000000,157.400000,612.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="619.000000" x2="157.400000" y2="620.000000" transform="rotate(0.000000,157.400000,620.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="621.000000" x2="157.400000" y2="620.000000" transform="rotate(0.000000,157.400000,620.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="627.000000" x2="157.400000" y2="628.000000" transform="rotate(0.000000,157.400000,628.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="629.000000" x2="157.400000" y2="628.000000" transform="rotate(0.000000,157.400000,628.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="635.000000" x2="157.400000" y2="636.000000" transform="rotate(0.000000,157.400000,636.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="637.000000" x2="157.400000" y2="636.000000" transform="rotate(0.000000,157.400000,636.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="643.000000" x2="157.400000" y2="644.000000" transform="rotate(0.000000,157.400000,644.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="645.000000" x2="157.400000" y2="644.000000" transform="rotate(0.000000,157.400000,644.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="651.000000" x2="157.400000" y2="652.000000" transform="rotate(0.000000,157.400000,652.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="653.000000" x2="157.400000" y2="652.000000" transform="rotate(0.000000,157.400000,652.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="659.000000" x2="157.400000" y2="660.000000" transform="rotate(0.000000,157.400000,660.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="661.000000" x2="157.400000" y2="660.000000" transform="rotate(0.000000,157.400000,660.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="667.000000" x2="157.400000" y2="668.000000" transform="rotate(0.000000,157.400000,668.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="669.000000" x2="157.400000" y2="668.000000" transform="rotate(0.000000,157.400000,668.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="675.000000" x2="157.400000" y2="676.000000" transform="rotate(0.000000,157.400000,676.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="677.000000" x2="157.400000" y2="676.000000" transform="rotate(0.000000,157.400000,676.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="683.000000" x2="157.400000" y2="684.000000" transform="rotate(0.000000,157.400000,684.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="685.000000" x2="157.400000" y2="684.000000" transform="rotate(0.000000,157.400000,684.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="691.000000" x2="157.400000" y2="692.000000" transform="rotate(0.000000,157.400000,692.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="693.000000" x2="157.400000" y2="692.000000" transform="rotate(0.000000,157.400000,692.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="699.000000" x2="157.400000" y2="700.000000" transform="rotate(0.000000,157.400000,700.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="701.000000" x2="157.400000" y2="700.000000" transform="rotate(0.000000,157.400000,700.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="707.000000" x2="157.400000" y2="708.000000" transform="rotate(0.000000,157.400000,708.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="709.000000" x2="157.400000" y2="708.000000" transform="rotate(0.000000,157.400000,708.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="715.000000" x2="157.400000" y2="716.000000" transform="rotate(0.000000,157.400000,716.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="717.000000" x2="157.400000" y2="716.000000" transform="rotate(0.000000,157.400000,716.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="723.000000" x2="157.400000" y2="724.000000" transform="rotate(0.000000,157.400000,724.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="725.000000" x2="157.400000" y2="724.000000" transform="rotate(0.000000,157.400000,724.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="731.000000" x2="157.400000" y2="732.000000" transform="rotate(0.000000,157.400000,732.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="733.000000" x2="157.400000" y2="732.000000" transform="rotate(0.000000,157.400000,732.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="739.000000" x2="157.400000" y2="740.000000" transform="rotate(0.000000,157.400000,740.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="741.000000" x2="157.400000" y2="740.000000" transform="rotate(0.000000,157.400000,740.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="747.000000" x2="157.400000" y2="748.000000" transform="rotate(0.000000,157.400000,748.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="749.000000" x2="157.400000" y2="748.000000" transform="rotate(0.000000,157.400000,748.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="755.000000" x2="157.400000" y2="756.000000" transform="rotate(0.000000,157.400000,756.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="757.000000" x2="157.400000" y2="756.000000" transform="rotate(0.000000,157.400000,756.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="763.000000" x2="157.400000" y2="764.000000" transform="rotate(0.000000,157.400000,764.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="765.000000" x2="157.400000" y2="764.000000" transform="rotate(0.000000,157.400000,764.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="771.000000" x2="157.400000" y2="772.000000" transform="rotate(0.000000,157.400000,772.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="773.000000" x2="157.400000" y2="772.000000" transform="rotate(0.000000,157.400000,772.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="779.000000" x2="157.400000" y2="780.000000" transform="rotate(0.000000,157.400000,780.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="781.000000" x2="157.400000" y2="780.000000" transform="rotate(0.000000,157.400000,780.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="787.000000" x2="157.400000" y2="788.000000" transform="rotate(0.000000,157.400000,788.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="789.000000" x2="157.400000" y2="788.000000" transform="rotate(0.000000,157.400000,788.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="795.000000" x2="157.400000" y2="796.000000" transform="rotate(0.000000,157.400000,796.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="797.000000" x2="157.400000" y2="796.000000" transform="rotate(0.000000,157.400000,796.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="803.000000" x2="157.400000" y2="804.000000" transform="rotate(0.000000,157.400000,804.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="805.000000" x2="157.400000" y2="804.000000" transform="rotate(0.000000,157.400000,804.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="811.000000" x2="157.400000" y2="812.000000" transform="rotate(0.000000,157.400000,812.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="813.000000" x2="157.400000" y2="812.000000" transform="rotate(0.000000,157.400000,812.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="819.000000" x2="157.400000" y2="820.000000" transform="rotate(0.000000,157.400000,820.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="821.000000" x2="157.400000" y2="820.000000" transform="rotate(0.000000,157.400000,820.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="827.000000" x2="157.400000" y2="828.000000" transform="rotate(0.000000,157.400000,828.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="829.000000" x2="157.400000" y2="828.000000" transform="rotate(0.000000,157.400000,828.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="835.000000" x2="157.400000" y2="836.000000" transform="rotate(0.000000,157.400000,836.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="837.000000" x2="157.400000" y2="836.000000" transform="rotate(0.000000,157.400000,836.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="843.000000" x2="157.400000" y2="844.000000" transform="rotate(0.000000,157.400000,844.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="845.000000" x2="157.400000" y2="844.000000" transform="rotate(0.000000,157.400000,844.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="851.000000" x2="157.400000" y2="852.000000" transform="rotate(0.000000,157.400000,852.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="853.000000" x2="157.400000" y2="852.000000" transform="rotate(0.000000,157.400000,852.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="859.000000" x2="157.400000" y2="860.000000" transform="rotate(0.000000,157.400000,860.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="861.000000" x2="157.400000" y2="860.000000" transform="rotate(0.000000,157.400000,860.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="867.000000" x2="157.400000" y2="868.000000" transform="rotate(0.000000,157.400000,868.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="869.000000" x2="157.400000" y2="868.000000" transform="rotate(0.000000,157.400000,868.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="875.000000" x2="157.400000" y2="876.000000" transform="rotate(0.000000,157.400000,876.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="877.000000" x2="157.400000" y2="876.000000" transform="rotate(0.000000,157.400000,876.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="883.000000" x2="157.400000" y2="884.000000" transform="rotate(0.000000,157.400000,884.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="885.000000" x2="157.400000" y2="884.000000" transform="rotate(0.000000,157.400000,884.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="891.000000" x2="157.400000" y2="892.000000" transform="rotate(0.000000,157.400000,892.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="893.000000" x2="157.400000" y2="892.000000" transform="rotate(0.000000,157.400000,892.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="899.000000" x2="157.400000" y2="900.000000" transform="rotate(0.000000,157.400000,900.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="901.000000" x2="157.400000" y2="900.000000" transform="rotate(0.000000,157.400000,900.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="907.000000" x2="157.400000" y2="908.000000" transform="rotate(0.000000,157.400000,908.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="909.000000" x2="157.400000" y2="908.000000" transform="rotate(0.000000,157.400000,908.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="915.000000" x2="157.400000" y2="916.000000" transform="rotate(0.000000,157.400000,916.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="917.000000" x2="157.400000" y2="916.000000" transform="rotate(0.000000,157.400000,916.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="923.000000" x2="157.400000" y2="924.000000" transform="rotate(0.000000,157.400000,924.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="925.000000" x2="157.400000" y2="924.000000" transform="rotate(0.000000,157.400000,924.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="931.000000" x2="157.400000" y2="932.000000" transform="rotate(0.000000,157.400000,932.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="933.000000" x2="157.400000" y2="932.000000" transform="rotate(0.000000,157.400000,932.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="939.000000" x2="157.400000" y2="940.000000" transform="rotate(0.000000,157.400000,940.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="941.000000" x2="157.400000" y2="940.000000" transform="rotate(0.000000,157.400000,940.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="947.000000" x2="157.400000" y2="948.000000" transform="rotate(0.000000,157.400000,948.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="949.000000" x2="157.400000" y2="948.000000" transform="rotate(0.000000,157.400000,948.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="955.000000" x2="157.400000" y2="956.000000" transform="rotate(0.000000,157.400000,956.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="957.000000" x2="157.400000" y2="956.000000" transform="rotate(0.000000,157.400000,956.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="963.000000" x2="157.400000" y2="964.000000" transform="rotate(0.000000,157.400000,964.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="965.000000" x2="157.400000" y2="964.000000" transform="rotate(0.000000,157.400000,964.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="971.000000" x2="157.400000" y2="972.000000" transform="rotate(0.000000,157.400000,972.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="973.000000" x2="157.400000" y2="972.000000" transform="rotate(0.000000,157.400000,972.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="979.000000" x2="157.400000" y2="980.000000" transform="rotate(0.000000,157.400000,980.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="981.000000" x2="157.400000" y2="980.000000" transform="rotate(0.000000,157.400000,980.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="987.000000" x2="157.400000" y2="988.000000" transform="rotate(0.000000,157.400000,988.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="989.000000" x2="157.400000" y2="988.000000" transform="rotate(0.000000,157.400000,988.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="995.000000" x2="157.400000" y2="996.000000" transform="rotate(0.000000,157.400000,996.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="997.000000" x2="157.400000" y2="996.000000" transform="rotate(0.000000,157.400000,996.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1003.000000" x2="157.400000" y2="1004.000000" transform="rotate(0.000000,157.400000,1004.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1005.000000" x2="157.400000" y2="1004.000000" transform="rotate(0.000000,157.400000,1004.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1011.000000" x2="157.400000" y2="1012.000000" transform="rotate(0.000000,157.400000,1012.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1013.000000" x2="157.400000" y2="1012.000000" transform="rotate(0.000000,157.400000,1012.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1019.000000" x2="157.400000" y2="1020.000000" transform="rotate(0.000000,157.400000,1020.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1021.000000" x2="157.400000" y2="1020.000000" transform="rotate(0.000000,157.400000,1020.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1027.000000" x2="157.400000" y2="1028.000000" transform="rotate(0.000000,157.400000,1028.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1029.000000" x2="157.400000" y2="1028.000000" transform="rotate(0.000000,157.400000,1028.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1035.000000" x2="157.400000" y2="1036.000000" transform="rotate(0.000000,157.400000,1036.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1037.000000" x2="157.400000" y2="1036.000000" transform="rotate(0.000000,157.400000,1036.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1043.000000" x2="157.400000" y2="1044.000000" transform="rotate(0.000000,157.400000,1044.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="154.400000" y1="1045.000000" x2="157.400000" y2="1044.000000" transform="rotate(0.000000,157.400000,1044.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="nconcat-0x2a49c10.svg">
+<rect x="243.800000" y="25.000000" width="51.600000" height="1024.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="242.800000" y="24.000000" width="51.600000" height="1024.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+</a>
+<a xlink:href="nconcat-0x2a49c10.svg">
+<text x="268.600000" y="538.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">nconcat(128)</text>
+</a>
+<circle cx="244.800000" cy="26.000000" r="1"/>
+<line x1="239.800000" y1="27.000000" x2="242.800000" y2="28.000000" transform="rotate(0.000000,242.800000,28.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="29.000000" x2="242.800000" y2="28.000000" transform="rotate(0.000000,242.800000,28.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="35.000000" x2="242.800000" y2="36.000000" transform="rotate(0.000000,242.800000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="37.000000" x2="242.800000" y2="36.000000" transform="rotate(0.000000,242.800000,36.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="43.000000" x2="242.800000" y2="44.000000" transform="rotate(0.000000,242.800000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="45.000000" x2="242.800000" y2="44.000000" transform="rotate(0.000000,242.800000,44.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="51.000000" x2="242.800000" y2="52.000000" transform="rotate(0.000000,242.800000,52.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="53.000000" x2="242.800000" y2="52.000000" transform="rotate(0.000000,242.800000,52.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="59.000000" x2="242.800000" y2="60.000000" transform="rotate(0.000000,242.800000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="61.000000" x2="242.800000" y2="60.000000" transform="rotate(0.000000,242.800000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="67.000000" x2="242.800000" y2="68.000000" transform="rotate(0.000000,242.800000,68.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="69.000000" x2="242.800000" y2="68.000000" transform="rotate(0.000000,242.800000,68.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="75.000000" x2="242.800000" y2="76.000000" transform="rotate(0.000000,242.800000,76.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="77.000000" x2="242.800000" y2="76.000000" transform="rotate(0.000000,242.800000,76.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="83.000000" x2="242.800000" y2="84.000000" transform="rotate(0.000000,242.800000,84.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="85.000000" x2="242.800000" y2="84.000000" transform="rotate(0.000000,242.800000,84.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="91.000000" x2="242.800000" y2="92.000000" transform="rotate(0.000000,242.800000,92.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="93.000000" x2="242.800000" y2="92.000000" transform="rotate(0.000000,242.800000,92.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="99.000000" x2="242.800000" y2="100.000000" transform="rotate(0.000000,242.800000,100.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="101.000000" x2="242.800000" y2="100.000000" transform="rotate(0.000000,242.800000,100.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="107.000000" x2="242.800000" y2="108.000000" transform="rotate(0.000000,242.800000,108.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="109.000000" x2="242.800000" y2="108.000000" transform="rotate(0.000000,242.800000,108.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="115.000000" x2="242.800000" y2="116.000000" transform="rotate(0.000000,242.800000,116.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="117.000000" x2="242.800000" y2="116.000000" transform="rotate(0.000000,242.800000,116.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="123.000000" x2="242.800000" y2="124.000000" transform="rotate(0.000000,242.800000,124.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="125.000000" x2="242.800000" y2="124.000000" transform="rotate(0.000000,242.800000,124.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="131.000000" x2="242.800000" y2="132.000000" transform="rotate(0.000000,242.800000,132.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="133.000000" x2="242.800000" y2="132.000000" transform="rotate(0.000000,242.800000,132.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="139.000000" x2="242.800000" y2="140.000000" transform="rotate(0.000000,242.800000,140.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="141.000000" x2="242.800000" y2="140.000000" transform="rotate(0.000000,242.800000,140.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="147.000000" x2="242.800000" y2="148.000000" transform="rotate(0.000000,242.800000,148.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="149.000000" x2="242.800000" y2="148.000000" transform="rotate(0.000000,242.800000,148.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="155.000000" x2="242.800000" y2="156.000000" transform="rotate(0.000000,242.800000,156.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="157.000000" x2="242.800000" y2="156.000000" transform="rotate(0.000000,242.800000,156.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="163.000000" x2="242.800000" y2="164.000000" transform="rotate(0.000000,242.800000,164.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="165.000000" x2="242.800000" y2="164.000000" transform="rotate(0.000000,242.800000,164.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="171.000000" x2="242.800000" y2="172.000000" transform="rotate(0.000000,242.800000,172.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="173.000000" x2="242.800000" y2="172.000000" transform="rotate(0.000000,242.800000,172.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="179.000000" x2="242.800000" y2="180.000000" transform="rotate(0.000000,242.800000,180.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="181.000000" x2="242.800000" y2="180.000000" transform="rotate(0.000000,242.800000,180.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="187.000000" x2="242.800000" y2="188.000000" transform="rotate(0.000000,242.800000,188.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="189.000000" x2="242.800000" y2="188.000000" transform="rotate(0.000000,242.800000,188.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="195.000000" x2="242.800000" y2="196.000000" transform="rotate(0.000000,242.800000,196.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="197.000000" x2="242.800000" y2="196.000000" transform="rotate(0.000000,242.800000,196.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="203.000000" x2="242.800000" y2="204.000000" transform="rotate(0.000000,242.800000,204.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="205.000000" x2="242.800000" y2="204.000000" transform="rotate(0.000000,242.800000,204.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="211.000000" x2="242.800000" y2="212.000000" transform="rotate(0.000000,242.800000,212.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="213.000000" x2="242.800000" y2="212.000000" transform="rotate(0.000000,242.800000,212.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="219.000000" x2="242.800000" y2="220.000000" transform="rotate(0.000000,242.800000,220.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="221.000000" x2="242.800000" y2="220.000000" transform="rotate(0.000000,242.800000,220.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="227.000000" x2="242.800000" y2="228.000000" transform="rotate(0.000000,242.800000,228.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="229.000000" x2="242.800000" y2="228.000000" transform="rotate(0.000000,242.800000,228.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="235.000000" x2="242.800000" y2="236.000000" transform="rotate(0.000000,242.800000,236.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="237.000000" x2="242.800000" y2="236.000000" transform="rotate(0.000000,242.800000,236.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="243.000000" x2="242.800000" y2="244.000000" transform="rotate(0.000000,242.800000,244.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="245.000000" x2="242.800000" y2="244.000000" transform="rotate(0.000000,242.800000,244.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="251.000000" x2="242.800000" y2="252.000000" transform="rotate(0.000000,242.800000,252.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="253.000000" x2="242.800000" y2="252.000000" transform="rotate(0.000000,242.800000,252.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="259.000000" x2="242.800000" y2="260.000000" transform="rotate(0.000000,242.800000,260.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="261.000000" x2="242.800000" y2="260.000000" transform="rotate(0.000000,242.800000,260.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="267.000000" x2="242.800000" y2="268.000000" transform="rotate(0.000000,242.800000,268.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="269.000000" x2="242.800000" y2="268.000000" transform="rotate(0.000000,242.800000,268.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="275.000000" x2="242.800000" y2="276.000000" transform="rotate(0.000000,242.800000,276.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="277.000000" x2="242.800000" y2="276.000000" transform="rotate(0.000000,242.800000,276.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="283.000000" x2="242.800000" y2="284.000000" transform="rotate(0.000000,242.800000,284.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="285.000000" x2="242.800000" y2="284.000000" transform="rotate(0.000000,242.800000,284.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="291.000000" x2="242.800000" y2="292.000000" transform="rotate(0.000000,242.800000,292.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="293.000000" x2="242.800000" y2="292.000000" transform="rotate(0.000000,242.800000,292.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="299.000000" x2="242.800000" y2="300.000000" transform="rotate(0.000000,242.800000,300.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="301.000000" x2="242.800000" y2="300.000000" transform="rotate(0.000000,242.800000,300.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="307.000000" x2="242.800000" y2="308.000000" transform="rotate(0.000000,242.800000,308.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="309.000000" x2="242.800000" y2="308.000000" transform="rotate(0.000000,242.800000,308.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="315.000000" x2="242.800000" y2="316.000000" transform="rotate(0.000000,242.800000,316.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="317.000000" x2="242.800000" y2="316.000000" transform="rotate(0.000000,242.800000,316.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="323.000000" x2="242.800000" y2="324.000000" transform="rotate(0.000000,242.800000,324.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="325.000000" x2="242.800000" y2="324.000000" transform="rotate(0.000000,242.800000,324.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="331.000000" x2="242.800000" y2="332.000000" transform="rotate(0.000000,242.800000,332.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="333.000000" x2="242.800000" y2="332.000000" transform="rotate(0.000000,242.800000,332.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="339.000000" x2="242.800000" y2="340.000000" transform="rotate(0.000000,242.800000,340.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="341.000000" x2="242.800000" y2="340.000000" transform="rotate(0.000000,242.800000,340.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="347.000000" x2="242.800000" y2="348.000000" transform="rotate(0.000000,242.800000,348.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="349.000000" x2="242.800000" y2="348.000000" transform="rotate(0.000000,242.800000,348.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="355.000000" x2="242.800000" y2="356.000000" transform="rotate(0.000000,242.800000,356.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="357.000000" x2="242.800000" y2="356.000000" transform="rotate(0.000000,242.800000,356.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="363.000000" x2="242.800000" y2="364.000000" transform="rotate(0.000000,242.800000,364.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="365.000000" x2="242.800000" y2="364.000000" transform="rotate(0.000000,242.800000,364.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="371.000000" x2="242.800000" y2="372.000000" transform="rotate(0.000000,242.800000,372.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="373.000000" x2="242.800000" y2="372.000000" transform="rotate(0.000000,242.800000,372.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="379.000000" x2="242.800000" y2="380.000000" transform="rotate(0.000000,242.800000,380.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="381.000000" x2="242.800000" y2="380.000000" transform="rotate(0.000000,242.800000,380.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="387.000000" x2="242.800000" y2="388.000000" transform="rotate(0.000000,242.800000,388.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="389.000000" x2="242.800000" y2="388.000000" transform="rotate(0.000000,242.800000,388.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="395.000000" x2="242.800000" y2="396.000000" transform="rotate(0.000000,242.800000,396.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="397.000000" x2="242.800000" y2="396.000000" transform="rotate(0.000000,242.800000,396.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="403.000000" x2="242.800000" y2="404.000000" transform="rotate(0.000000,242.800000,404.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="405.000000" x2="242.800000" y2="404.000000" transform="rotate(0.000000,242.800000,404.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="411.000000" x2="242.800000" y2="412.000000" transform="rotate(0.000000,242.800000,412.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="413.000000" x2="242.800000" y2="412.000000" transform="rotate(0.000000,242.800000,412.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="419.000000" x2="242.800000" y2="420.000000" transform="rotate(0.000000,242.800000,420.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="421.000000" x2="242.800000" y2="420.000000" transform="rotate(0.000000,242.800000,420.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="427.000000" x2="242.800000" y2="428.000000" transform="rotate(0.000000,242.800000,428.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="429.000000" x2="242.800000" y2="428.000000" transform="rotate(0.000000,242.800000,428.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="435.000000" x2="242.800000" y2="436.000000" transform="rotate(0.000000,242.800000,436.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="437.000000" x2="242.800000" y2="436.000000" transform="rotate(0.000000,242.800000,436.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="443.000000" x2="242.800000" y2="444.000000" transform="rotate(0.000000,242.800000,444.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="445.000000" x2="242.800000" y2="444.000000" transform="rotate(0.000000,242.800000,444.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="451.000000" x2="242.800000" y2="452.000000" transform="rotate(0.000000,242.800000,452.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="453.000000" x2="242.800000" y2="452.000000" transform="rotate(0.000000,242.800000,452.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="459.000000" x2="242.800000" y2="460.000000" transform="rotate(0.000000,242.800000,460.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="461.000000" x2="242.800000" y2="460.000000" transform="rotate(0.000000,242.800000,460.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="467.000000" x2="242.800000" y2="468.000000" transform="rotate(0.000000,242.800000,468.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="469.000000" x2="242.800000" y2="468.000000" transform="rotate(0.000000,242.800000,468.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="475.000000" x2="242.800000" y2="476.000000" transform="rotate(0.000000,242.800000,476.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="477.000000" x2="242.800000" y2="476.000000" transform="rotate(0.000000,242.800000,476.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="483.000000" x2="242.800000" y2="484.000000" transform="rotate(0.000000,242.800000,484.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="485.000000" x2="242.800000" y2="484.000000" transform="rotate(0.000000,242.800000,484.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="491.000000" x2="242.800000" y2="492.000000" transform="rotate(0.000000,242.800000,492.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="493.000000" x2="242.800000" y2="492.000000" transform="rotate(0.000000,242.800000,492.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="499.000000" x2="242.800000" y2="500.000000" transform="rotate(0.000000,242.800000,500.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="501.000000" x2="242.800000" y2="500.000000" transform="rotate(0.000000,242.800000,500.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="507.000000" x2="242.800000" y2="508.000000" transform="rotate(0.000000,242.800000,508.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="509.000000" x2="242.800000" y2="508.000000" transform="rotate(0.000000,242.800000,508.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="515.000000" x2="242.800000" y2="516.000000" transform="rotate(0.000000,242.800000,516.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="517.000000" x2="242.800000" y2="516.000000" transform="rotate(0.000000,242.800000,516.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="523.000000" x2="242.800000" y2="524.000000" transform="rotate(0.000000,242.800000,524.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="525.000000" x2="242.800000" y2="524.000000" transform="rotate(0.000000,242.800000,524.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="531.000000" x2="242.800000" y2="532.000000" transform="rotate(0.000000,242.800000,532.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="533.000000" x2="242.800000" y2="532.000000" transform="rotate(0.000000,242.800000,532.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="539.000000" x2="242.800000" y2="540.000000" transform="rotate(0.000000,242.800000,540.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="541.000000" x2="242.800000" y2="540.000000" transform="rotate(0.000000,242.800000,540.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="547.000000" x2="242.800000" y2="548.000000" transform="rotate(0.000000,242.800000,548.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="549.000000" x2="242.800000" y2="548.000000" transform="rotate(0.000000,242.800000,548.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="555.000000" x2="242.800000" y2="556.000000" transform="rotate(0.000000,242.800000,556.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="557.000000" x2="242.800000" y2="556.000000" transform="rotate(0.000000,242.800000,556.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="563.000000" x2="242.800000" y2="564.000000" transform="rotate(0.000000,242.800000,564.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="565.000000" x2="242.800000" y2="564.000000" transform="rotate(0.000000,242.800000,564.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="571.000000" x2="242.800000" y2="572.000000" transform="rotate(0.000000,242.800000,572.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="573.000000" x2="242.800000" y2="572.000000" transform="rotate(0.000000,242.800000,572.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="579.000000" x2="242.800000" y2="580.000000" transform="rotate(0.000000,242.800000,580.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="581.000000" x2="242.800000" y2="580.000000" transform="rotate(0.000000,242.800000,580.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="587.000000" x2="242.800000" y2="588.000000" transform="rotate(0.000000,242.800000,588.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="589.000000" x2="242.800000" y2="588.000000" transform="rotate(0.000000,242.800000,588.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="595.000000" x2="242.800000" y2="596.000000" transform="rotate(0.000000,242.800000,596.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="597.000000" x2="242.800000" y2="596.000000" transform="rotate(0.000000,242.800000,596.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="603.000000" x2="242.800000" y2="604.000000" transform="rotate(0.000000,242.800000,604.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="605.000000" x2="242.800000" y2="604.000000" transform="rotate(0.000000,242.800000,604.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="611.000000" x2="242.800000" y2="612.000000" transform="rotate(0.000000,242.800000,612.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="613.000000" x2="242.800000" y2="612.000000" transform="rotate(0.000000,242.800000,612.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="619.000000" x2="242.800000" y2="620.000000" transform="rotate(0.000000,242.800000,620.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="621.000000" x2="242.800000" y2="620.000000" transform="rotate(0.000000,242.800000,620.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="627.000000" x2="242.800000" y2="628.000000" transform="rotate(0.000000,242.800000,628.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="629.000000" x2="242.800000" y2="628.000000" transform="rotate(0.000000,242.800000,628.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="635.000000" x2="242.800000" y2="636.000000" transform="rotate(0.000000,242.800000,636.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="637.000000" x2="242.800000" y2="636.000000" transform="rotate(0.000000,242.800000,636.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="643.000000" x2="242.800000" y2="644.000000" transform="rotate(0.000000,242.800000,644.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="645.000000" x2="242.800000" y2="644.000000" transform="rotate(0.000000,242.800000,644.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="651.000000" x2="242.800000" y2="652.000000" transform="rotate(0.000000,242.800000,652.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="653.000000" x2="242.800000" y2="652.000000" transform="rotate(0.000000,242.800000,652.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="659.000000" x2="242.800000" y2="660.000000" transform="rotate(0.000000,242.800000,660.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="661.000000" x2="242.800000" y2="660.000000" transform="rotate(0.000000,242.800000,660.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="667.000000" x2="242.800000" y2="668.000000" transform="rotate(0.000000,242.800000,668.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="669.000000" x2="242.800000" y2="668.000000" transform="rotate(0.000000,242.800000,668.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="675.000000" x2="242.800000" y2="676.000000" transform="rotate(0.000000,242.800000,676.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="677.000000" x2="242.800000" y2="676.000000" transform="rotate(0.000000,242.800000,676.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="683.000000" x2="242.800000" y2="684.000000" transform="rotate(0.000000,242.800000,684.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="685.000000" x2="242.800000" y2="684.000000" transform="rotate(0.000000,242.800000,684.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="691.000000" x2="242.800000" y2="692.000000" transform="rotate(0.000000,242.800000,692.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="693.000000" x2="242.800000" y2="692.000000" transform="rotate(0.000000,242.800000,692.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="699.000000" x2="242.800000" y2="700.000000" transform="rotate(0.000000,242.800000,700.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="701.000000" x2="242.800000" y2="700.000000" transform="rotate(0.000000,242.800000,700.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="707.000000" x2="242.800000" y2="708.000000" transform="rotate(0.000000,242.800000,708.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="709.000000" x2="242.800000" y2="708.000000" transform="rotate(0.000000,242.800000,708.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="715.000000" x2="242.800000" y2="716.000000" transform="rotate(0.000000,242.800000,716.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="717.000000" x2="242.800000" y2="716.000000" transform="rotate(0.000000,242.800000,716.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="723.000000" x2="242.800000" y2="724.000000" transform="rotate(0.000000,242.800000,724.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="725.000000" x2="242.800000" y2="724.000000" transform="rotate(0.000000,242.800000,724.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="731.000000" x2="242.800000" y2="732.000000" transform="rotate(0.000000,242.800000,732.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="733.000000" x2="242.800000" y2="732.000000" transform="rotate(0.000000,242.800000,732.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="739.000000" x2="242.800000" y2="740.000000" transform="rotate(0.000000,242.800000,740.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="741.000000" x2="242.800000" y2="740.000000" transform="rotate(0.000000,242.800000,740.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="747.000000" x2="242.800000" y2="748.000000" transform="rotate(0.000000,242.800000,748.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="749.000000" x2="242.800000" y2="748.000000" transform="rotate(0.000000,242.800000,748.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="755.000000" x2="242.800000" y2="756.000000" transform="rotate(0.000000,242.800000,756.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="757.000000" x2="242.800000" y2="756.000000" transform="rotate(0.000000,242.800000,756.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="763.000000" x2="242.800000" y2="764.000000" transform="rotate(0.000000,242.800000,764.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="765.000000" x2="242.800000" y2="764.000000" transform="rotate(0.000000,242.800000,764.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="771.000000" x2="242.800000" y2="772.000000" transform="rotate(0.000000,242.800000,772.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="773.000000" x2="242.800000" y2="772.000000" transform="rotate(0.000000,242.800000,772.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="779.000000" x2="242.800000" y2="780.000000" transform="rotate(0.000000,242.800000,780.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="781.000000" x2="242.800000" y2="780.000000" transform="rotate(0.000000,242.800000,780.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="787.000000" x2="242.800000" y2="788.000000" transform="rotate(0.000000,242.800000,788.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="789.000000" x2="242.800000" y2="788.000000" transform="rotate(0.000000,242.800000,788.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="795.000000" x2="242.800000" y2="796.000000" transform="rotate(0.000000,242.800000,796.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="797.000000" x2="242.800000" y2="796.000000" transform="rotate(0.000000,242.800000,796.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="803.000000" x2="242.800000" y2="804.000000" transform="rotate(0.000000,242.800000,804.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="805.000000" x2="242.800000" y2="804.000000" transform="rotate(0.000000,242.800000,804.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="811.000000" x2="242.800000" y2="812.000000" transform="rotate(0.000000,242.800000,812.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="813.000000" x2="242.800000" y2="812.000000" transform="rotate(0.000000,242.800000,812.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="819.000000" x2="242.800000" y2="820.000000" transform="rotate(0.000000,242.800000,820.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="821.000000" x2="242.800000" y2="820.000000" transform="rotate(0.000000,242.800000,820.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="827.000000" x2="242.800000" y2="828.000000" transform="rotate(0.000000,242.800000,828.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="829.000000" x2="242.800000" y2="828.000000" transform="rotate(0.000000,242.800000,828.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="835.000000" x2="242.800000" y2="836.000000" transform="rotate(0.000000,242.800000,836.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="837.000000" x2="242.800000" y2="836.000000" transform="rotate(0.000000,242.800000,836.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="843.000000" x2="242.800000" y2="844.000000" transform="rotate(0.000000,242.800000,844.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="845.000000" x2="242.800000" y2="844.000000" transform="rotate(0.000000,242.800000,844.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="851.000000" x2="242.800000" y2="852.000000" transform="rotate(0.000000,242.800000,852.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="853.000000" x2="242.800000" y2="852.000000" transform="rotate(0.000000,242.800000,852.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="859.000000" x2="242.800000" y2="860.000000" transform="rotate(0.000000,242.800000,860.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="861.000000" x2="242.800000" y2="860.000000" transform="rotate(0.000000,242.800000,860.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="867.000000" x2="242.800000" y2="868.000000" transform="rotate(0.000000,242.800000,868.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="869.000000" x2="242.800000" y2="868.000000" transform="rotate(0.000000,242.800000,868.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="875.000000" x2="242.800000" y2="876.000000" transform="rotate(0.000000,242.800000,876.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="877.000000" x2="242.800000" y2="876.000000" transform="rotate(0.000000,242.800000,876.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="883.000000" x2="242.800000" y2="884.000000" transform="rotate(0.000000,242.800000,884.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="885.000000" x2="242.800000" y2="884.000000" transform="rotate(0.000000,242.800000,884.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="891.000000" x2="242.800000" y2="892.000000" transform="rotate(0.000000,242.800000,892.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="893.000000" x2="242.800000" y2="892.000000" transform="rotate(0.000000,242.800000,892.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="899.000000" x2="242.800000" y2="900.000000" transform="rotate(0.000000,242.800000,900.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="901.000000" x2="242.800000" y2="900.000000" transform="rotate(0.000000,242.800000,900.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="907.000000" x2="242.800000" y2="908.000000" transform="rotate(0.000000,242.800000,908.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="909.000000" x2="242.800000" y2="908.000000" transform="rotate(0.000000,242.800000,908.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="915.000000" x2="242.800000" y2="916.000000" transform="rotate(0.000000,242.800000,916.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="917.000000" x2="242.800000" y2="916.000000" transform="rotate(0.000000,242.800000,916.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="923.000000" x2="242.800000" y2="924.000000" transform="rotate(0.000000,242.800000,924.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="925.000000" x2="242.800000" y2="924.000000" transform="rotate(0.000000,242.800000,924.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="931.000000" x2="242.800000" y2="932.000000" transform="rotate(0.000000,242.800000,932.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="933.000000" x2="242.800000" y2="932.000000" transform="rotate(0.000000,242.800000,932.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="939.000000" x2="242.800000" y2="940.000000" transform="rotate(0.000000,242.800000,940.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="941.000000" x2="242.800000" y2="940.000000" transform="rotate(0.000000,242.800000,940.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="947.000000" x2="242.800000" y2="948.000000" transform="rotate(0.000000,242.800000,948.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="949.000000" x2="242.800000" y2="948.000000" transform="rotate(0.000000,242.800000,948.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="955.000000" x2="242.800000" y2="956.000000" transform="rotate(0.000000,242.800000,956.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="957.000000" x2="242.800000" y2="956.000000" transform="rotate(0.000000,242.800000,956.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="963.000000" x2="242.800000" y2="964.000000" transform="rotate(0.000000,242.800000,964.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="965.000000" x2="242.800000" y2="964.000000" transform="rotate(0.000000,242.800000,964.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="971.000000" x2="242.800000" y2="972.000000" transform="rotate(0.000000,242.800000,972.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="973.000000" x2="242.800000" y2="972.000000" transform="rotate(0.000000,242.800000,972.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="979.000000" x2="242.800000" y2="980.000000" transform="rotate(0.000000,242.800000,980.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="981.000000" x2="242.800000" y2="980.000000" transform="rotate(0.000000,242.800000,980.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="987.000000" x2="242.800000" y2="988.000000" transform="rotate(0.000000,242.800000,988.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="989.000000" x2="242.800000" y2="988.000000" transform="rotate(0.000000,242.800000,988.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="995.000000" x2="242.800000" y2="996.000000" transform="rotate(0.000000,242.800000,996.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="997.000000" x2="242.800000" y2="996.000000" transform="rotate(0.000000,242.800000,996.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1003.000000" x2="242.800000" y2="1004.000000" transform="rotate(0.000000,242.800000,1004.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1005.000000" x2="242.800000" y2="1004.000000" transform="rotate(0.000000,242.800000,1004.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1011.000000" x2="242.800000" y2="1012.000000" transform="rotate(0.000000,242.800000,1012.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1013.000000" x2="242.800000" y2="1012.000000" transform="rotate(0.000000,242.800000,1012.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1019.000000" x2="242.800000" y2="1020.000000" transform="rotate(0.000000,242.800000,1020.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1021.000000" x2="242.800000" y2="1020.000000" transform="rotate(0.000000,242.800000,1020.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1027.000000" x2="242.800000" y2="1028.000000" transform="rotate(0.000000,242.800000,1028.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1029.000000" x2="242.800000" y2="1028.000000" transform="rotate(0.000000,242.800000,1028.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1035.000000" x2="242.800000" y2="1036.000000" transform="rotate(0.000000,242.800000,1036.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1037.000000" x2="242.800000" y2="1036.000000" transform="rotate(0.000000,242.800000,1036.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1043.000000" x2="242.800000" y2="1044.000000" transform="rotate(0.000000,242.800000,1044.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="239.800000" y1="1045.000000" x2="242.800000" y2="1044.000000" transform="rotate(0.000000,242.800000,1044.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="15.000000" y1="15.000000" x2="15.000000" y2="1057.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
+<line x1="15.000000" y1="1057.000000" x2="303.400000" y2="1057.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
+<line x1="303.400000" y1="1057.000000" x2="303.400000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
<line x1="15.000000" y1="15.000000" x2="20.000000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
-<line x1="49.025000" y1="15.000000" x2="187.300000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
+<line x1="49.025000" y1="15.000000" x2="303.400000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
<text x="20.000000" y="17.000000" font-family="Arial" font-size="7">process</text>
-<line x1="189.300000" y1="39.000000" x2="192.300000" y2="40.000000" transform="rotate(0.000000,192.300000,40.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="189.300000" y1="41.000000" x2="192.300000" y2="40.000000" transform="rotate(0.000000,192.300000,40.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="10.000000" y1="40.000000" x2="20.000000" y2="40.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="20.000000" y1="24.000000" x2="28.000000" y2="24.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="20.000000" y1="40.000000" x2="20.000000" y2="24.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="20.000000" y1="40.000000" x2="20.000000" y2="40.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="28.000000" y1="24.000000" x2="44.000000" y2="24.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="44.000000" y1="24.000000" x2="60.000000" y2="24.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="56.000000" y1="44.000000" x2="60.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="60.000000" y1="24.000000" x2="68.000000" y2="24.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="60.000000" y1="44.000000" x2="68.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="68.000000" y1="24.000000" x2="68.000000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="68.000000" y1="36.000000" x2="68.000000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="68.000000" y1="36.000000" x2="72.000000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="68.000000" y1="44.000000" x2="72.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="110.700000" y1="40.000000" x2="114.700000" y2="40.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="114.700000" y1="40.000000" x2="114.700000" y2="40.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="114.700000" y1="40.000000" x2="118.700000" y2="40.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="144.500000" y1="36.000000" x2="148.500000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="144.500000" y1="44.000000" x2="148.500000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="148.500000" y1="36.000000" x2="148.500000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="148.500000" y1="36.000000" x2="152.500000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="148.500000" y1="44.000000" x2="148.500000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="148.500000" y1="44.000000" x2="152.500000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="178.300000" y1="40.000000" x2="182.300000" y2="40.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="182.300000" y1="40.000000" x2="192.300000" y2="40.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="305.400000" y1="535.000000" x2="308.400000" y2="536.000000" transform="rotate(0.000000,308.400000,536.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="305.400000" y1="537.000000" x2="308.400000" y2="536.000000" transform="rotate(0.000000,308.400000,536.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="10.000000" y1="520.000000" x2="20.000000" y2="520.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="20.000000" y1="520.000000" x2="36.000000" y2="520.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="36.000000" y1="520.000000" x2="52.000000" y2="520.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="48.000000" y1="540.000000" x2="52.000000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="52.000000" y1="520.000000" x2="60.000000" y2="520.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="52.000000" y1="540.000000" x2="60.000000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="60.000000" y1="520.000000" x2="60.000000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="60.000000" y1="532.000000" x2="60.000000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="60.000000" y1="532.000000" x2="64.000000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="60.000000" y1="540.000000" x2="64.000000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="102.700000" y1="536.000000" x2="106.700000" y2="536.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="106.700000" y1="536.000000" x2="106.700000" y2="536.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="106.700000" y1="536.000000" x2="110.700000" y2="536.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="28.000000" x2="153.400000" y2="28.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="36.000000" x2="153.400000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="44.000000" x2="153.400000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="52.000000" x2="153.400000" y2="52.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="60.000000" x2="153.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="68.000000" x2="153.400000" y2="68.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="76.000000" x2="153.400000" y2="76.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="84.000000" x2="153.400000" y2="84.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="92.000000" x2="153.400000" y2="92.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="100.000000" x2="153.400000" y2="100.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="108.000000" x2="153.400000" y2="108.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="116.000000" x2="153.400000" y2="116.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="124.000000" x2="153.400000" y2="124.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="132.000000" x2="153.400000" y2="132.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="140.000000" x2="153.400000" y2="140.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="148.000000" x2="153.400000" y2="148.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="156.000000" x2="153.400000" y2="156.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="164.000000" x2="153.400000" y2="164.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="172.000000" x2="153.400000" y2="172.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="180.000000" x2="153.400000" y2="180.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="188.000000" x2="153.400000" y2="188.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="196.000000" x2="153.400000" y2="196.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="204.000000" x2="153.400000" y2="204.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="212.000000" x2="153.400000" y2="212.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="220.000000" x2="153.400000" y2="220.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="228.000000" x2="153.400000" y2="228.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="236.000000" x2="153.400000" y2="236.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="244.000000" x2="153.400000" y2="244.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="252.000000" x2="153.400000" y2="252.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="260.000000" x2="153.400000" y2="260.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="268.000000" x2="153.400000" y2="268.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="276.000000" x2="153.400000" y2="276.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="284.000000" x2="153.400000" y2="284.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="292.000000" x2="153.400000" y2="292.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="300.000000" x2="153.400000" y2="300.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="308.000000" x2="153.400000" y2="308.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="316.000000" x2="153.400000" y2="316.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="324.000000" x2="153.400000" y2="324.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="332.000000" x2="153.400000" y2="332.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="340.000000" x2="153.400000" y2="340.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="348.000000" x2="153.400000" y2="348.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="356.000000" x2="153.400000" y2="356.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="364.000000" x2="153.400000" y2="364.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="372.000000" x2="153.400000" y2="372.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="380.000000" x2="153.400000" y2="380.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="388.000000" x2="153.400000" y2="388.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="396.000000" x2="153.400000" y2="396.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="404.000000" x2="153.400000" y2="404.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="412.000000" x2="153.400000" y2="412.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="420.000000" x2="153.400000" y2="420.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="428.000000" x2="153.400000" y2="428.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="436.000000" x2="153.400000" y2="436.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="444.000000" x2="153.400000" y2="444.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="452.000000" x2="153.400000" y2="452.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="460.000000" x2="153.400000" y2="460.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="468.000000" x2="153.400000" y2="468.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="476.000000" x2="153.400000" y2="476.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="484.000000" x2="153.400000" y2="484.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="492.000000" x2="153.400000" y2="492.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="500.000000" x2="153.400000" y2="500.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="508.000000" x2="153.400000" y2="508.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="516.000000" x2="153.400000" y2="516.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="524.000000" x2="153.400000" y2="524.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="532.000000" x2="153.400000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="540.000000" x2="153.400000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="548.000000" x2="153.400000" y2="548.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="556.000000" x2="153.400000" y2="556.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="564.000000" x2="153.400000" y2="564.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="572.000000" x2="153.400000" y2="572.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="580.000000" x2="153.400000" y2="580.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="588.000000" x2="153.400000" y2="588.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="596.000000" x2="153.400000" y2="596.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="604.000000" x2="153.400000" y2="604.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="612.000000" x2="153.400000" y2="612.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="620.000000" x2="153.400000" y2="620.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="628.000000" x2="153.400000" y2="628.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="636.000000" x2="153.400000" y2="636.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="644.000000" x2="153.400000" y2="644.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="652.000000" x2="153.400000" y2="652.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="660.000000" x2="153.400000" y2="660.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="668.000000" x2="153.400000" y2="668.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="676.000000" x2="153.400000" y2="676.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="684.000000" x2="153.400000" y2="684.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="692.000000" x2="153.400000" y2="692.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="700.000000" x2="153.400000" y2="700.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="708.000000" x2="153.400000" y2="708.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="716.000000" x2="153.400000" y2="716.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="724.000000" x2="153.400000" y2="724.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="732.000000" x2="153.400000" y2="732.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="740.000000" x2="153.400000" y2="740.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="748.000000" x2="153.400000" y2="748.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="756.000000" x2="153.400000" y2="756.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="764.000000" x2="153.400000" y2="764.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="772.000000" x2="153.400000" y2="772.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="780.000000" x2="153.400000" y2="780.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="788.000000" x2="153.400000" y2="788.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="796.000000" x2="153.400000" y2="796.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="804.000000" x2="153.400000" y2="804.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="812.000000" x2="153.400000" y2="812.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="820.000000" x2="153.400000" y2="820.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="828.000000" x2="153.400000" y2="828.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="836.000000" x2="153.400000" y2="836.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="844.000000" x2="153.400000" y2="844.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="852.000000" x2="153.400000" y2="852.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="860.000000" x2="153.400000" y2="860.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="868.000000" x2="153.400000" y2="868.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="876.000000" x2="153.400000" y2="876.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="884.000000" x2="153.400000" y2="884.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="892.000000" x2="153.400000" y2="892.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="900.000000" x2="153.400000" y2="900.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="908.000000" x2="153.400000" y2="908.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="916.000000" x2="153.400000" y2="916.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="924.000000" x2="153.400000" y2="924.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="932.000000" x2="153.400000" y2="932.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="940.000000" x2="153.400000" y2="940.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="948.000000" x2="153.400000" y2="948.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="956.000000" x2="153.400000" y2="956.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="964.000000" x2="153.400000" y2="964.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="972.000000" x2="153.400000" y2="972.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="980.000000" x2="153.400000" y2="980.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="988.000000" x2="153.400000" y2="988.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="996.000000" x2="153.400000" y2="996.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="1004.000000" x2="153.400000" y2="1004.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="1012.000000" x2="153.400000" y2="1012.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="1020.000000" x2="153.400000" y2="1020.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="1028.000000" x2="153.400000" y2="1028.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="1036.000000" x2="153.400000" y2="1036.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="149.400000" y1="1044.000000" x2="153.400000" y2="1044.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="28.000000" x2="153.400000" y2="28.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="28.000000" x2="157.400000" y2="28.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="36.000000" x2="153.400000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="36.000000" x2="157.400000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="44.000000" x2="153.400000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="44.000000" x2="157.400000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="52.000000" x2="153.400000" y2="52.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="52.000000" x2="157.400000" y2="52.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="60.000000" x2="153.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="60.000000" x2="157.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="68.000000" x2="153.400000" y2="68.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="68.000000" x2="157.400000" y2="68.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="76.000000" x2="153.400000" y2="76.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="76.000000" x2="157.400000" y2="76.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="84.000000" x2="153.400000" y2="84.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="84.000000" x2="157.400000" y2="84.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="92.000000" x2="153.400000" y2="92.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="92.000000" x2="157.400000" y2="92.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="100.000000" x2="153.400000" y2="100.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="100.000000" x2="157.400000" y2="100.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="108.000000" x2="153.400000" y2="108.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="108.000000" x2="157.400000" y2="108.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="116.000000" x2="153.400000" y2="116.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="116.000000" x2="157.400000" y2="116.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="124.000000" x2="153.400000" y2="124.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="124.000000" x2="157.400000" y2="124.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="132.000000" x2="153.400000" y2="132.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="132.000000" x2="157.400000" y2="132.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="140.000000" x2="153.400000" y2="140.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="140.000000" x2="157.400000" y2="140.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="148.000000" x2="153.400000" y2="148.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="148.000000" x2="157.400000" y2="148.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="156.000000" x2="153.400000" y2="156.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="156.000000" x2="157.400000" y2="156.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="164.000000" x2="153.400000" y2="164.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="164.000000" x2="157.400000" y2="164.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="172.000000" x2="153.400000" y2="172.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="172.000000" x2="157.400000" y2="172.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="180.000000" x2="153.400000" y2="180.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="180.000000" x2="157.400000" y2="180.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="188.000000" x2="153.400000" y2="188.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="188.000000" x2="157.400000" y2="188.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="196.000000" x2="153.400000" y2="196.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="196.000000" x2="157.400000" y2="196.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="204.000000" x2="153.400000" y2="204.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="204.000000" x2="157.400000" y2="204.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="212.000000" x2="153.400000" y2="212.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="212.000000" x2="157.400000" y2="212.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="220.000000" x2="153.400000" y2="220.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="220.000000" x2="157.400000" y2="220.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="228.000000" x2="153.400000" y2="228.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="228.000000" x2="157.400000" y2="228.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="236.000000" x2="153.400000" y2="236.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="236.000000" x2="157.400000" y2="236.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="244.000000" x2="153.400000" y2="244.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="244.000000" x2="157.400000" y2="244.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="252.000000" x2="153.400000" y2="252.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="252.000000" x2="157.400000" y2="252.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="260.000000" x2="153.400000" y2="260.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="260.000000" x2="157.400000" y2="260.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="268.000000" x2="153.400000" y2="268.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="268.000000" x2="157.400000" y2="268.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="276.000000" x2="153.400000" y2="276.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="276.000000" x2="157.400000" y2="276.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="284.000000" x2="153.400000" y2="284.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="284.000000" x2="157.400000" y2="284.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="292.000000" x2="153.400000" y2="292.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="292.000000" x2="157.400000" y2="292.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="300.000000" x2="153.400000" y2="300.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="300.000000" x2="157.400000" y2="300.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="308.000000" x2="153.400000" y2="308.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="308.000000" x2="157.400000" y2="308.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="316.000000" x2="153.400000" y2="316.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="316.000000" x2="157.400000" y2="316.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="324.000000" x2="153.400000" y2="324.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="324.000000" x2="157.400000" y2="324.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="332.000000" x2="153.400000" y2="332.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="332.000000" x2="157.400000" y2="332.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="340.000000" x2="153.400000" y2="340.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="340.000000" x2="157.400000" y2="340.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="348.000000" x2="153.400000" y2="348.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="348.000000" x2="157.400000" y2="348.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="356.000000" x2="153.400000" y2="356.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="356.000000" x2="157.400000" y2="356.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="364.000000" x2="153.400000" y2="364.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="364.000000" x2="157.400000" y2="364.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="372.000000" x2="153.400000" y2="372.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="372.000000" x2="157.400000" y2="372.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="380.000000" x2="153.400000" y2="380.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="380.000000" x2="157.400000" y2="380.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="388.000000" x2="153.400000" y2="388.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="388.000000" x2="157.400000" y2="388.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="396.000000" x2="153.400000" y2="396.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="396.000000" x2="157.400000" y2="396.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="404.000000" x2="153.400000" y2="404.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="404.000000" x2="157.400000" y2="404.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="412.000000" x2="153.400000" y2="412.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="412.000000" x2="157.400000" y2="412.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="420.000000" x2="153.400000" y2="420.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="420.000000" x2="157.400000" y2="420.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="428.000000" x2="153.400000" y2="428.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="428.000000" x2="157.400000" y2="428.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="436.000000" x2="153.400000" y2="436.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="436.000000" x2="157.400000" y2="436.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="444.000000" x2="153.400000" y2="444.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="444.000000" x2="157.400000" y2="444.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="452.000000" x2="153.400000" y2="452.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="452.000000" x2="157.400000" y2="452.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="460.000000" x2="153.400000" y2="460.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="460.000000" x2="157.400000" y2="460.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="468.000000" x2="153.400000" y2="468.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="468.000000" x2="157.400000" y2="468.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="476.000000" x2="153.400000" y2="476.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="476.000000" x2="157.400000" y2="476.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="484.000000" x2="153.400000" y2="484.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="484.000000" x2="157.400000" y2="484.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="492.000000" x2="153.400000" y2="492.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="492.000000" x2="157.400000" y2="492.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="500.000000" x2="153.400000" y2="500.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="500.000000" x2="157.400000" y2="500.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="508.000000" x2="153.400000" y2="508.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="508.000000" x2="157.400000" y2="508.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="516.000000" x2="153.400000" y2="516.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="516.000000" x2="157.400000" y2="516.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="524.000000" x2="153.400000" y2="524.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="524.000000" x2="157.400000" y2="524.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="532.000000" x2="153.400000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="532.000000" x2="157.400000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="540.000000" x2="153.400000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="540.000000" x2="157.400000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="548.000000" x2="153.400000" y2="548.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="548.000000" x2="157.400000" y2="548.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="556.000000" x2="153.400000" y2="556.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="556.000000" x2="157.400000" y2="556.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="564.000000" x2="153.400000" y2="564.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="564.000000" x2="157.400000" y2="564.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="572.000000" x2="153.400000" y2="572.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="572.000000" x2="157.400000" y2="572.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="580.000000" x2="153.400000" y2="580.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="580.000000" x2="157.400000" y2="580.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="588.000000" x2="153.400000" y2="588.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="588.000000" x2="157.400000" y2="588.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="596.000000" x2="153.400000" y2="596.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="596.000000" x2="157.400000" y2="596.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="604.000000" x2="153.400000" y2="604.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="604.000000" x2="157.400000" y2="604.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="612.000000" x2="153.400000" y2="612.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="612.000000" x2="157.400000" y2="612.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="620.000000" x2="153.400000" y2="620.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="620.000000" x2="157.400000" y2="620.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="628.000000" x2="153.400000" y2="628.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="628.000000" x2="157.400000" y2="628.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="636.000000" x2="153.400000" y2="636.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="636.000000" x2="157.400000" y2="636.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="644.000000" x2="153.400000" y2="644.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="644.000000" x2="157.400000" y2="644.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="652.000000" x2="153.400000" y2="652.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="652.000000" x2="157.400000" y2="652.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="660.000000" x2="153.400000" y2="660.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="660.000000" x2="157.400000" y2="660.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="668.000000" x2="153.400000" y2="668.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="668.000000" x2="157.400000" y2="668.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="676.000000" x2="153.400000" y2="676.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="676.000000" x2="157.400000" y2="676.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="684.000000" x2="153.400000" y2="684.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="684.000000" x2="157.400000" y2="684.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="692.000000" x2="153.400000" y2="692.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="692.000000" x2="157.400000" y2="692.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="700.000000" x2="153.400000" y2="700.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="700.000000" x2="157.400000" y2="700.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="708.000000" x2="153.400000" y2="708.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="708.000000" x2="157.400000" y2="708.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="716.000000" x2="153.400000" y2="716.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="716.000000" x2="157.400000" y2="716.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="724.000000" x2="153.400000" y2="724.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="724.000000" x2="157.400000" y2="724.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="732.000000" x2="153.400000" y2="732.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="732.000000" x2="157.400000" y2="732.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="740.000000" x2="153.400000" y2="740.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="740.000000" x2="157.400000" y2="740.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="748.000000" x2="153.400000" y2="748.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="748.000000" x2="157.400000" y2="748.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="756.000000" x2="153.400000" y2="756.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="756.000000" x2="157.400000" y2="756.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="764.000000" x2="153.400000" y2="764.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="764.000000" x2="157.400000" y2="764.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="772.000000" x2="153.400000" y2="772.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="772.000000" x2="157.400000" y2="772.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="780.000000" x2="153.400000" y2="780.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="780.000000" x2="157.400000" y2="780.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="788.000000" x2="153.400000" y2="788.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="788.000000" x2="157.400000" y2="788.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="796.000000" x2="153.400000" y2="796.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="796.000000" x2="157.400000" y2="796.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="804.000000" x2="153.400000" y2="804.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="804.000000" x2="157.400000" y2="804.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="812.000000" x2="153.400000" y2="812.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="812.000000" x2="157.400000" y2="812.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="820.000000" x2="153.400000" y2="820.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="820.000000" x2="157.400000" y2="820.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="828.000000" x2="153.400000" y2="828.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="828.000000" x2="157.400000" y2="828.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="836.000000" x2="153.400000" y2="836.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="836.000000" x2="157.400000" y2="836.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="844.000000" x2="153.400000" y2="844.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="844.000000" x2="157.400000" y2="844.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="852.000000" x2="153.400000" y2="852.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="852.000000" x2="157.400000" y2="852.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="860.000000" x2="153.400000" y2="860.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="860.000000" x2="157.400000" y2="860.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="868.000000" x2="153.400000" y2="868.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="868.000000" x2="157.400000" y2="868.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="876.000000" x2="153.400000" y2="876.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="876.000000" x2="157.400000" y2="876.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="884.000000" x2="153.400000" y2="884.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="884.000000" x2="157.400000" y2="884.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="892.000000" x2="153.400000" y2="892.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="892.000000" x2="157.400000" y2="892.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="900.000000" x2="153.400000" y2="900.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="900.000000" x2="157.400000" y2="900.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="908.000000" x2="153.400000" y2="908.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="908.000000" x2="157.400000" y2="908.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="916.000000" x2="153.400000" y2="916.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="916.000000" x2="157.400000" y2="916.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="924.000000" x2="153.400000" y2="924.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="924.000000" x2="157.400000" y2="924.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="932.000000" x2="153.400000" y2="932.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="932.000000" x2="157.400000" y2="932.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="940.000000" x2="153.400000" y2="940.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="940.000000" x2="157.400000" y2="940.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="948.000000" x2="153.400000" y2="948.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="948.000000" x2="157.400000" y2="948.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="956.000000" x2="153.400000" y2="956.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="956.000000" x2="157.400000" y2="956.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="964.000000" x2="153.400000" y2="964.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="964.000000" x2="157.400000" y2="964.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="972.000000" x2="153.400000" y2="972.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="972.000000" x2="157.400000" y2="972.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="980.000000" x2="153.400000" y2="980.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="980.000000" x2="157.400000" y2="980.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="988.000000" x2="153.400000" y2="988.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="988.000000" x2="157.400000" y2="988.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="996.000000" x2="153.400000" y2="996.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="996.000000" x2="157.400000" y2="996.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1004.000000" x2="153.400000" y2="1004.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1004.000000" x2="157.400000" y2="1004.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1012.000000" x2="153.400000" y2="1012.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1012.000000" x2="157.400000" y2="1012.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1020.000000" x2="153.400000" y2="1020.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1020.000000" x2="157.400000" y2="1020.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1028.000000" x2="153.400000" y2="1028.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1028.000000" x2="157.400000" y2="1028.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1036.000000" x2="153.400000" y2="1036.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1036.000000" x2="157.400000" y2="1036.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1044.000000" x2="153.400000" y2="1044.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="153.400000" y1="1044.000000" x2="157.400000" y2="1044.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="28.000000" x2="238.800000" y2="28.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="36.000000" x2="238.800000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="44.000000" x2="238.800000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="52.000000" x2="238.800000" y2="52.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="60.000000" x2="238.800000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="68.000000" x2="238.800000" y2="68.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="76.000000" x2="238.800000" y2="76.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="84.000000" x2="238.800000" y2="84.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="92.000000" x2="238.800000" y2="92.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="100.000000" x2="238.800000" y2="100.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="108.000000" x2="238.800000" y2="108.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="116.000000" x2="238.800000" y2="116.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="124.000000" x2="238.800000" y2="124.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="132.000000" x2="238.800000" y2="132.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="140.000000" x2="238.800000" y2="140.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="148.000000" x2="238.800000" y2="148.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="156.000000" x2="238.800000" y2="156.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="164.000000" x2="238.800000" y2="164.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="172.000000" x2="238.800000" y2="172.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="180.000000" x2="238.800000" y2="180.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="188.000000" x2="238.800000" y2="188.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="196.000000" x2="238.800000" y2="196.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="204.000000" x2="238.800000" y2="204.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="212.000000" x2="238.800000" y2="212.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="220.000000" x2="238.800000" y2="220.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="228.000000" x2="238.800000" y2="228.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="236.000000" x2="238.800000" y2="236.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="244.000000" x2="238.800000" y2="244.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="252.000000" x2="238.800000" y2="252.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="260.000000" x2="238.800000" y2="260.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="268.000000" x2="238.800000" y2="268.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="276.000000" x2="238.800000" y2="276.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="284.000000" x2="238.800000" y2="284.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="292.000000" x2="238.800000" y2="292.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="300.000000" x2="238.800000" y2="300.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="308.000000" x2="238.800000" y2="308.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="316.000000" x2="238.800000" y2="316.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="324.000000" x2="238.800000" y2="324.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="332.000000" x2="238.800000" y2="332.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="340.000000" x2="238.800000" y2="340.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="348.000000" x2="238.800000" y2="348.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="356.000000" x2="238.800000" y2="356.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="364.000000" x2="238.800000" y2="364.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="372.000000" x2="238.800000" y2="372.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="380.000000" x2="238.800000" y2="380.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="388.000000" x2="238.800000" y2="388.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="396.000000" x2="238.800000" y2="396.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="404.000000" x2="238.800000" y2="404.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="412.000000" x2="238.800000" y2="412.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="420.000000" x2="238.800000" y2="420.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="428.000000" x2="238.800000" y2="428.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="436.000000" x2="238.800000" y2="436.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="444.000000" x2="238.800000" y2="444.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="452.000000" x2="238.800000" y2="452.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="460.000000" x2="238.800000" y2="460.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="468.000000" x2="238.800000" y2="468.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="476.000000" x2="238.800000" y2="476.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="484.000000" x2="238.800000" y2="484.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="492.000000" x2="238.800000" y2="492.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="500.000000" x2="238.800000" y2="500.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="508.000000" x2="238.800000" y2="508.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="516.000000" x2="238.800000" y2="516.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="524.000000" x2="238.800000" y2="524.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="532.000000" x2="238.800000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="540.000000" x2="238.800000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="548.000000" x2="238.800000" y2="548.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="556.000000" x2="238.800000" y2="556.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="564.000000" x2="238.800000" y2="564.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="572.000000" x2="238.800000" y2="572.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="580.000000" x2="238.800000" y2="580.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="588.000000" x2="238.800000" y2="588.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="596.000000" x2="238.800000" y2="596.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="604.000000" x2="238.800000" y2="604.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="612.000000" x2="238.800000" y2="612.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="620.000000" x2="238.800000" y2="620.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="628.000000" x2="238.800000" y2="628.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="636.000000" x2="238.800000" y2="636.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="644.000000" x2="238.800000" y2="644.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="652.000000" x2="238.800000" y2="652.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="660.000000" x2="238.800000" y2="660.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="668.000000" x2="238.800000" y2="668.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="676.000000" x2="238.800000" y2="676.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="684.000000" x2="238.800000" y2="684.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="692.000000" x2="238.800000" y2="692.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="700.000000" x2="238.800000" y2="700.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="708.000000" x2="238.800000" y2="708.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="716.000000" x2="238.800000" y2="716.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="724.000000" x2="238.800000" y2="724.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="732.000000" x2="238.800000" y2="732.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="740.000000" x2="238.800000" y2="740.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="748.000000" x2="238.800000" y2="748.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="756.000000" x2="238.800000" y2="756.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="764.000000" x2="238.800000" y2="764.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="772.000000" x2="238.800000" y2="772.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="780.000000" x2="238.800000" y2="780.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="788.000000" x2="238.800000" y2="788.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="796.000000" x2="238.800000" y2="796.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="804.000000" x2="238.800000" y2="804.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="812.000000" x2="238.800000" y2="812.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="820.000000" x2="238.800000" y2="820.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="828.000000" x2="238.800000" y2="828.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="836.000000" x2="238.800000" y2="836.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="844.000000" x2="238.800000" y2="844.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="852.000000" x2="238.800000" y2="852.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="860.000000" x2="238.800000" y2="860.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="868.000000" x2="238.800000" y2="868.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="876.000000" x2="238.800000" y2="876.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="884.000000" x2="238.800000" y2="884.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="892.000000" x2="238.800000" y2="892.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="900.000000" x2="238.800000" y2="900.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="908.000000" x2="238.800000" y2="908.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="916.000000" x2="238.800000" y2="916.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="924.000000" x2="238.800000" y2="924.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="932.000000" x2="238.800000" y2="932.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="940.000000" x2="238.800000" y2="940.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="948.000000" x2="238.800000" y2="948.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="956.000000" x2="238.800000" y2="956.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="964.000000" x2="238.800000" y2="964.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="972.000000" x2="238.800000" y2="972.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="980.000000" x2="238.800000" y2="980.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="988.000000" x2="238.800000" y2="988.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="996.000000" x2="238.800000" y2="996.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="1004.000000" x2="238.800000" y2="1004.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="1012.000000" x2="238.800000" y2="1012.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="1020.000000" x2="238.800000" y2="1020.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="1028.000000" x2="238.800000" y2="1028.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="1036.000000" x2="238.800000" y2="1036.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="234.800000" y1="1044.000000" x2="238.800000" y2="1044.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="28.000000" x2="238.800000" y2="28.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="28.000000" x2="242.800000" y2="28.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="36.000000" x2="238.800000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="36.000000" x2="242.800000" y2="36.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="44.000000" x2="238.800000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="44.000000" x2="242.800000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="52.000000" x2="238.800000" y2="52.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="52.000000" x2="242.800000" y2="52.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="60.000000" x2="238.800000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="60.000000" x2="242.800000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="68.000000" x2="238.800000" y2="68.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="68.000000" x2="242.800000" y2="68.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="76.000000" x2="238.800000" y2="76.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="76.000000" x2="242.800000" y2="76.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="84.000000" x2="238.800000" y2="84.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="84.000000" x2="242.800000" y2="84.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="92.000000" x2="238.800000" y2="92.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="92.000000" x2="242.800000" y2="92.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="100.000000" x2="238.800000" y2="100.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="100.000000" x2="242.800000" y2="100.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="108.000000" x2="238.800000" y2="108.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="108.000000" x2="242.800000" y2="108.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="116.000000" x2="238.800000" y2="116.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="116.000000" x2="242.800000" y2="116.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="124.000000" x2="238.800000" y2="124.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="124.000000" x2="242.800000" y2="124.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="132.000000" x2="238.800000" y2="132.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="132.000000" x2="242.800000" y2="132.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="140.000000" x2="238.800000" y2="140.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="140.000000" x2="242.800000" y2="140.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="148.000000" x2="238.800000" y2="148.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="148.000000" x2="242.800000" y2="148.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="156.000000" x2="238.800000" y2="156.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="156.000000" x2="242.800000" y2="156.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="164.000000" x2="238.800000" y2="164.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="164.000000" x2="242.800000" y2="164.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="172.000000" x2="238.800000" y2="172.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="172.000000" x2="242.800000" y2="172.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="180.000000" x2="238.800000" y2="180.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="180.000000" x2="242.800000" y2="180.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="188.000000" x2="238.800000" y2="188.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="188.000000" x2="242.800000" y2="188.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="196.000000" x2="238.800000" y2="196.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="196.000000" x2="242.800000" y2="196.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="204.000000" x2="238.800000" y2="204.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="204.000000" x2="242.800000" y2="204.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="212.000000" x2="238.800000" y2="212.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="212.000000" x2="242.800000" y2="212.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="220.000000" x2="238.800000" y2="220.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="220.000000" x2="242.800000" y2="220.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="228.000000" x2="238.800000" y2="228.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="228.000000" x2="242.800000" y2="228.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="236.000000" x2="238.800000" y2="236.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="236.000000" x2="242.800000" y2="236.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="244.000000" x2="238.800000" y2="244.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="244.000000" x2="242.800000" y2="244.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="252.000000" x2="238.800000" y2="252.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="252.000000" x2="242.800000" y2="252.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="260.000000" x2="238.800000" y2="260.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="260.000000" x2="242.800000" y2="260.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="268.000000" x2="238.800000" y2="268.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="268.000000" x2="242.800000" y2="268.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="276.000000" x2="238.800000" y2="276.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="276.000000" x2="242.800000" y2="276.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="284.000000" x2="238.800000" y2="284.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="284.000000" x2="242.800000" y2="284.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="292.000000" x2="238.800000" y2="292.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="292.000000" x2="242.800000" y2="292.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="300.000000" x2="238.800000" y2="300.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="300.000000" x2="242.800000" y2="300.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="308.000000" x2="238.800000" y2="308.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="308.000000" x2="242.800000" y2="308.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="316.000000" x2="238.800000" y2="316.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="316.000000" x2="242.800000" y2="316.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="324.000000" x2="238.800000" y2="324.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="324.000000" x2="242.800000" y2="324.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="332.000000" x2="238.800000" y2="332.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="332.000000" x2="242.800000" y2="332.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="340.000000" x2="238.800000" y2="340.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="340.000000" x2="242.800000" y2="340.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="348.000000" x2="238.800000" y2="348.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="348.000000" x2="242.800000" y2="348.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="356.000000" x2="238.800000" y2="356.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="356.000000" x2="242.800000" y2="356.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="364.000000" x2="238.800000" y2="364.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="364.000000" x2="242.800000" y2="364.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="372.000000" x2="238.800000" y2="372.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="372.000000" x2="242.800000" y2="372.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="380.000000" x2="238.800000" y2="380.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="380.000000" x2="242.800000" y2="380.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="388.000000" x2="238.800000" y2="388.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="388.000000" x2="242.800000" y2="388.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="396.000000" x2="238.800000" y2="396.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="396.000000" x2="242.800000" y2="396.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="404.000000" x2="238.800000" y2="404.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="404.000000" x2="242.800000" y2="404.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="412.000000" x2="238.800000" y2="412.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="412.000000" x2="242.800000" y2="412.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="420.000000" x2="238.800000" y2="420.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="420.000000" x2="242.800000" y2="420.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="428.000000" x2="238.800000" y2="428.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="428.000000" x2="242.800000" y2="428.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="436.000000" x2="238.800000" y2="436.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="436.000000" x2="242.800000" y2="436.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="444.000000" x2="238.800000" y2="444.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="444.000000" x2="242.800000" y2="444.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="452.000000" x2="238.800000" y2="452.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="452.000000" x2="242.800000" y2="452.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="460.000000" x2="238.800000" y2="460.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="460.000000" x2="242.800000" y2="460.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="468.000000" x2="238.800000" y2="468.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="468.000000" x2="242.800000" y2="468.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="476.000000" x2="238.800000" y2="476.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="476.000000" x2="242.800000" y2="476.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="484.000000" x2="238.800000" y2="484.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="484.000000" x2="242.800000" y2="484.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="492.000000" x2="238.800000" y2="492.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="492.000000" x2="242.800000" y2="492.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="500.000000" x2="238.800000" y2="500.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="500.000000" x2="242.800000" y2="500.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="508.000000" x2="238.800000" y2="508.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="508.000000" x2="242.800000" y2="508.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="516.000000" x2="238.800000" y2="516.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="516.000000" x2="242.800000" y2="516.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="524.000000" x2="238.800000" y2="524.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="524.000000" x2="242.800000" y2="524.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="532.000000" x2="238.800000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="532.000000" x2="242.800000" y2="532.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="540.000000" x2="238.800000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="540.000000" x2="242.800000" y2="540.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="548.000000" x2="238.800000" y2="548.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="548.000000" x2="242.800000" y2="548.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="556.000000" x2="238.800000" y2="556.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="556.000000" x2="242.800000" y2="556.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="564.000000" x2="238.800000" y2="564.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="564.000000" x2="242.800000" y2="564.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="572.000000" x2="238.800000" y2="572.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="572.000000" x2="242.800000" y2="572.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="580.000000" x2="238.800000" y2="580.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="580.000000" x2="242.800000" y2="580.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="588.000000" x2="238.800000" y2="588.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="588.000000" x2="242.800000" y2="588.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="596.000000" x2="238.800000" y2="596.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="596.000000" x2="242.800000" y2="596.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="604.000000" x2="238.800000" y2="604.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="604.000000" x2="242.800000" y2="604.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="612.000000" x2="238.800000" y2="612.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="612.000000" x2="242.800000" y2="612.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="620.000000" x2="238.800000" y2="620.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="620.000000" x2="242.800000" y2="620.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="628.000000" x2="238.800000" y2="628.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="628.000000" x2="242.800000" y2="628.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="636.000000" x2="238.800000" y2="636.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="636.000000" x2="242.800000" y2="636.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="644.000000" x2="238.800000" y2="644.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="644.000000" x2="242.800000" y2="644.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="652.000000" x2="238.800000" y2="652.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="652.000000" x2="242.800000" y2="652.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="660.000000" x2="238.800000" y2="660.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="660.000000" x2="242.800000" y2="660.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="668.000000" x2="238.800000" y2="668.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="668.000000" x2="242.800000" y2="668.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="676.000000" x2="238.800000" y2="676.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="676.000000" x2="242.800000" y2="676.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="684.000000" x2="238.800000" y2="684.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="684.000000" x2="242.800000" y2="684.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="692.000000" x2="238.800000" y2="692.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="692.000000" x2="242.800000" y2="692.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="700.000000" x2="238.800000" y2="700.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="700.000000" x2="242.800000" y2="700.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="708.000000" x2="238.800000" y2="708.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="708.000000" x2="242.800000" y2="708.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="716.000000" x2="238.800000" y2="716.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="716.000000" x2="242.800000" y2="716.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="724.000000" x2="238.800000" y2="724.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="724.000000" x2="242.800000" y2="724.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="732.000000" x2="238.800000" y2="732.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="732.000000" x2="242.800000" y2="732.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="740.000000" x2="238.800000" y2="740.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="740.000000" x2="242.800000" y2="740.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="748.000000" x2="238.800000" y2="748.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="748.000000" x2="242.800000" y2="748.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="756.000000" x2="238.800000" y2="756.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="756.000000" x2="242.800000" y2="756.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="764.000000" x2="238.800000" y2="764.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="764.000000" x2="242.800000" y2="764.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="772.000000" x2="238.800000" y2="772.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="772.000000" x2="242.800000" y2="772.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="780.000000" x2="238.800000" y2="780.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="780.000000" x2="242.800000" y2="780.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="788.000000" x2="238.800000" y2="788.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="788.000000" x2="242.800000" y2="788.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="796.000000" x2="238.800000" y2="796.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="796.000000" x2="242.800000" y2="796.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="804.000000" x2="238.800000" y2="804.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="804.000000" x2="242.800000" y2="804.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="812.000000" x2="238.800000" y2="812.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="812.000000" x2="242.800000" y2="812.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="820.000000" x2="238.800000" y2="820.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="820.000000" x2="242.800000" y2="820.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="828.000000" x2="238.800000" y2="828.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="828.000000" x2="242.800000" y2="828.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="836.000000" x2="238.800000" y2="836.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="836.000000" x2="242.800000" y2="836.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="844.000000" x2="238.800000" y2="844.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="844.000000" x2="242.800000" y2="844.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="852.000000" x2="238.800000" y2="852.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="852.000000" x2="242.800000" y2="852.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="860.000000" x2="238.800000" y2="860.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="860.000000" x2="242.800000" y2="860.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="868.000000" x2="238.800000" y2="868.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="868.000000" x2="242.800000" y2="868.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="876.000000" x2="238.800000" y2="876.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="876.000000" x2="242.800000" y2="876.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="884.000000" x2="238.800000" y2="884.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="884.000000" x2="242.800000" y2="884.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="892.000000" x2="238.800000" y2="892.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="892.000000" x2="242.800000" y2="892.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="900.000000" x2="238.800000" y2="900.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="900.000000" x2="242.800000" y2="900.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="908.000000" x2="238.800000" y2="908.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="908.000000" x2="242.800000" y2="908.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="916.000000" x2="238.800000" y2="916.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="916.000000" x2="242.800000" y2="916.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="924.000000" x2="238.800000" y2="924.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="924.000000" x2="242.800000" y2="924.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="932.000000" x2="238.800000" y2="932.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="932.000000" x2="242.800000" y2="932.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="940.000000" x2="238.800000" y2="940.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="940.000000" x2="242.800000" y2="940.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="948.000000" x2="238.800000" y2="948.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="948.000000" x2="242.800000" y2="948.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="956.000000" x2="238.800000" y2="956.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="956.000000" x2="242.800000" y2="956.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="964.000000" x2="238.800000" y2="964.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="964.000000" x2="242.800000" y2="964.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="972.000000" x2="238.800000" y2="972.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="972.000000" x2="242.800000" y2="972.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="980.000000" x2="238.800000" y2="980.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="980.000000" x2="242.800000" y2="980.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="988.000000" x2="238.800000" y2="988.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="988.000000" x2="242.800000" y2="988.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="996.000000" x2="238.800000" y2="996.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="996.000000" x2="242.800000" y2="996.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1004.000000" x2="238.800000" y2="1004.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1004.000000" x2="242.800000" y2="1004.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1012.000000" x2="238.800000" y2="1012.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1012.000000" x2="242.800000" y2="1012.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1020.000000" x2="238.800000" y2="1020.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1020.000000" x2="242.800000" y2="1020.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1028.000000" x2="238.800000" y2="1028.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1028.000000" x2="242.800000" y2="1028.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1036.000000" x2="238.800000" y2="1036.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1036.000000" x2="242.800000" y2="1036.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1044.000000" x2="238.800000" y2="1044.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="238.800000" y1="1044.000000" x2="242.800000" y2="1044.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="294.400000" y1="536.000000" x2="298.400000" y2="536.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="298.400000" y1="536.000000" x2="308.400000" y2="536.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
</svg>
//fft_test(n,m) = _ : overlap(n,m) : fft(n) : stops(n/2), pcplx_moduls(n/2) : nconcat(n/2);
fft_test(n,m) = vectorize(n) : fft(n) : pcplx_moduls(n) : nconcat(n);
-//process = +, _ : + : fft_test(128);
-process = fft_test(128,128);
+process = +, _ : + : fft_test(128,128);
+//process = fft_test(128,128);
//process = (0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7) <: shuffle(8);
<?xml version="1.0"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 716.000000 120.000000" width="358.000000mm" height="60.000000mm" version="1.1">
-<rect x="1.000000" y="1.000000" width="715.000000" height="119.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="0.000000" y="0.000000" width="715.000000" height="119.000000" rx="0" ry="0" style="stroke:none;fill:#ffffff;"/>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 725.300000 120.000000" width="362.650000mm" height="60.000000mm" version="1.1">
+<rect x="1.000000" y="1.000000" width="724.300000" height="119.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="0.000000" y="0.000000" width="724.300000" height="119.000000" rx="0" ry="0" style="stroke:none;fill:#ffffff;"/>
<text x="10.000000" y="7.000000" font-family="Arial" font-size="7"></text>
<rect x="45.000000" y="53.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
<rect x="44.000000" y="52.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#f44800;"/>
<line x1="25.000000" y1="25.000000" x2="30.000000" y2="25.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
<line x1="81.600000" y1="25.000000" x2="127.000000" y2="25.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
<text x="30.000000" y="27.000000" font-family="Arial" font-size="7">normalize(256)</text>
-<a xlink:href="matricize-0x1fd7ea20.svg">
-<rect x="137.000000" y="49.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="136.000000" y="48.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+<rect x="145.000000" y="53.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="144.000000" y="52.000000" width="24.000000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#f44800;"/>
+<text x="156.000000" y="66.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">32</text>
+<circle cx="146.000000" cy="54.000000" r="1"/>
+<rect x="185.000000" y="49.000000" width="38.700000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="184.000000" y="48.000000" width="38.700000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#4B71A1;"/>
+<text x="203.350000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">vectorize</text>
+<circle cx="186.000000" cy="50.000000" r="1"/>
+<line x1="181.000000" y1="55.000000" x2="184.000000" y2="56.000000" transform="rotate(0.000000,184.000000,56.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="181.000000" y1="57.000000" x2="184.000000" y2="56.000000" transform="rotate(0.000000,184.000000,56.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="181.000000" y1="63.000000" x2="184.000000" y2="64.000000" transform="rotate(0.000000,184.000000,64.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="181.000000" y1="65.000000" x2="184.000000" y2="64.000000" transform="rotate(0.000000,184.000000,64.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="lines-0x1fc2cbc0.svg">
+<rect x="231.700000" y="49.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="230.700000" y="48.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
</a>
-<a xlink:href="matricize-0x1fd7ea20.svg">
-<text x="174.700000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">matricize(32)(32)</text>
+<a xlink:href="lines-0x1fc2cbc0.svg">
+<text x="269.400000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">lines_fft(32)(32)</text>
</a>
-<circle cx="138.000000" cy="50.000000" r="1"/>
-<line x1="133.000000" y1="59.000000" x2="136.000000" y2="60.000000" transform="rotate(0.000000,136.000000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="133.000000" y1="61.000000" x2="136.000000" y2="60.000000" transform="rotate(0.000000,136.000000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<a xlink:href="lines-0x1fd7cdd0.svg">
-<rect x="222.400000" y="49.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="221.400000" y="48.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+<circle cx="232.700000" cy="50.000000" r="1"/>
+<line x1="227.700000" y1="59.000000" x2="230.700000" y2="60.000000" transform="rotate(0.000000,230.700000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="227.700000" y1="61.000000" x2="230.700000" y2="60.000000" transform="rotate(0.000000,230.700000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="matrix-0x33743f0.svg">
+<rect x="317.100000" y="49.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="316.100000" y="48.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
</a>
-<a xlink:href="lines-0x1fd7cdd0.svg">
-<text x="260.100000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">lines_fft(32)(32)</text>
+<a xlink:href="matrix-0x33743f0.svg">
+<text x="367.700000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">matrix_transpose(32)(32)</text>
</a>
-<circle cx="223.400000" cy="50.000000" r="1"/>
-<line x1="218.400000" y1="59.000000" x2="221.400000" y2="60.000000" transform="rotate(0.000000,221.400000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="218.400000" y1="61.000000" x2="221.400000" y2="60.000000" transform="rotate(0.000000,221.400000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<a xlink:href="matrix-0x34c43b0.svg">
-<rect x="307.800000" y="49.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="306.800000" y="48.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+<circle cx="318.100000" cy="50.000000" r="1"/>
+<line x1="313.100000" y1="59.000000" x2="316.100000" y2="60.000000" transform="rotate(0.000000,316.100000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="313.100000" y1="61.000000" x2="316.100000" y2="60.000000" transform="rotate(0.000000,316.100000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="lines-0x1157d490.svg">
+<rect x="428.300000" y="49.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="427.300000" y="48.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
</a>
-<a xlink:href="matrix-0x34c43b0.svg">
-<text x="358.400000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">matrix_transpose(32)(32)</text>
+<a xlink:href="lines-0x1157d490.svg">
+<text x="466.000000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">lines_fftc(32)(32)</text>
</a>
-<circle cx="308.800000" cy="50.000000" r="1"/>
-<line x1="303.800000" y1="59.000000" x2="306.800000" y2="60.000000" transform="rotate(0.000000,306.800000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="303.800000" y1="61.000000" x2="306.800000" y2="60.000000" transform="rotate(0.000000,306.800000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<a xlink:href="lines-0x116cd2f0.svg">
-<rect x="419.000000" y="49.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="418.000000" y="48.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+<circle cx="429.300000" cy="50.000000" r="1"/>
+<line x1="424.300000" y1="59.000000" x2="427.300000" y2="60.000000" transform="rotate(0.000000,427.300000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="424.300000" y1="61.000000" x2="427.300000" y2="60.000000" transform="rotate(0.000000,427.300000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="matrix-0x33743f0.svg">
+<rect x="513.700000" y="49.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="512.700000" y="48.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
</a>
-<a xlink:href="lines-0x116cd2f0.svg">
-<text x="456.700000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">lines_fftc(32)(32)</text>
+<a xlink:href="matrix-0x33743f0.svg">
+<text x="564.300000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">matrix_transpose(32)(32)</text>
</a>
-<circle cx="420.000000" cy="50.000000" r="1"/>
-<line x1="415.000000" y1="59.000000" x2="418.000000" y2="60.000000" transform="rotate(0.000000,418.000000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="415.000000" y1="61.000000" x2="418.000000" y2="60.000000" transform="rotate(0.000000,418.000000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<a xlink:href="matrix-0x34c43b0.svg">
-<rect x="504.400000" y="49.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="503.400000" y="48.000000" width="103.200000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
+<circle cx="514.700000" cy="50.000000" r="1"/>
+<line x1="509.700000" y1="59.000000" x2="512.700000" y2="60.000000" transform="rotate(0.000000,512.700000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="509.700000" y1="61.000000" x2="512.700000" y2="60.000000" transform="rotate(0.000000,512.700000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<a xlink:href="norm-0x2df47c0.svg">
+<rect x="624.900000" y="49.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
+<rect x="623.900000" y="48.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
</a>
-<a xlink:href="matrix-0x34c43b0.svg">
-<text x="555.000000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">matrix_transpose(32)(32)</text>
+<a xlink:href="norm-0x2df47c0.svg">
+<text x="662.600000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">norm_out(32)(32)</text>
</a>
-<circle cx="505.400000" cy="50.000000" r="1"/>
-<line x1="500.400000" y1="59.000000" x2="503.400000" y2="60.000000" transform="rotate(0.000000,503.400000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="500.400000" y1="61.000000" x2="503.400000" y2="60.000000" transform="rotate(0.000000,503.400000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<a xlink:href="norm-0x2f448f0.svg">
-<rect x="615.600000" y="49.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#cccccc;"/>
-<rect x="614.600000" y="48.000000" width="77.400000" height="24.000000" rx="0" ry="0" style="stroke:none;fill:#003366;"/>
-</a>
-<a xlink:href="norm-0x2f448f0.svg">
-<text x="653.300000" y="62.000000" font-family="Arial" font-size="7" text-anchor="middle" fill="#FFFFFF">norm_out(32)(32)</text>
-</a>
-<circle cx="616.600000" cy="50.000000" r="1"/>
-<line x1="611.600000" y1="59.000000" x2="614.600000" y2="60.000000" transform="rotate(0.000000,614.600000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="611.600000" y1="61.000000" x2="614.600000" y2="60.000000" transform="rotate(0.000000,614.600000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<circle cx="625.900000" cy="50.000000" r="1"/>
+<line x1="620.900000" y1="59.000000" x2="623.900000" y2="60.000000" transform="rotate(0.000000,623.900000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="620.900000" y1="61.000000" x2="623.900000" y2="60.000000" transform="rotate(0.000000,623.900000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
<line x1="15.000000" y1="15.000000" x2="15.000000" y2="105.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
-<line x1="15.000000" y1="105.000000" x2="701.000000" y2="105.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
-<line x1="701.000000" y1="105.000000" x2="701.000000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
+<line x1="15.000000" y1="105.000000" x2="710.300000" y2="105.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
+<line x1="710.300000" y1="105.000000" x2="710.300000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
<line x1="15.000000" y1="15.000000" x2="20.000000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
-<line x1="49.025000" y1="15.000000" x2="701.000000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
+<line x1="49.025000" y1="15.000000" x2="710.300000" y2="15.000000" style="stroke: black; stroke-linecap:round; stroke-width:0.25; stroke-dasharray:3,3;"/>
<text x="20.000000" y="17.000000" font-family="Arial" font-size="7">process</text>
-<line x1="703.000000" y1="59.000000" x2="706.000000" y2="60.000000" transform="rotate(0.000000,706.000000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
-<line x1="703.000000" y1="61.000000" x2="706.000000" y2="60.000000" transform="rotate(0.000000,706.000000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="712.300000" y1="59.000000" x2="715.300000" y2="60.000000" transform="rotate(0.000000,715.300000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
+<line x1="712.300000" y1="61.000000" x2="715.300000" y2="60.000000" transform="rotate(0.000000,715.300000,60.000000)" style="stroke: black; stroke-width:0.25;"/>
<line x1="10.000000" y1="34.000000" x2="20.000000" y2="34.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
<line x1="20.000000" y1="34.000000" x2="30.000000" y2="34.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
<line x1="30.000000" y1="34.000000" x2="56.000000" y2="34.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
<line x1="90.000000" y1="64.000000" x2="94.000000" y2="64.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
<line x1="118.000000" y1="60.000000" x2="122.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
<line x1="122.000000" y1="60.000000" x2="132.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="132.000000" y1="44.000000" x2="140.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="132.000000" y1="60.000000" x2="132.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
<line x1="132.000000" y1="60.000000" x2="132.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="132.000000" y1="60.000000" x2="136.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="213.400000" y1="60.000000" x2="217.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="217.400000" y1="60.000000" x2="217.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="217.400000" y1="60.000000" x2="221.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="298.800000" y1="60.000000" x2="302.800000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="302.800000" y1="60.000000" x2="302.800000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="302.800000" y1="60.000000" x2="306.800000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="410.000000" y1="60.000000" x2="414.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="414.000000" y1="60.000000" x2="414.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="414.000000" y1="60.000000" x2="418.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="495.400000" y1="60.000000" x2="499.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="499.400000" y1="60.000000" x2="499.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="499.400000" y1="60.000000" x2="503.400000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="606.600000" y1="60.000000" x2="610.600000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="610.600000" y1="60.000000" x2="610.600000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="610.600000" y1="60.000000" x2="614.600000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="692.000000" y1="60.000000" x2="696.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
-<line x1="696.000000" y1="60.000000" x2="706.000000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="140.000000" y1="44.000000" x2="156.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="156.000000" y1="44.000000" x2="172.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="168.000000" y1="64.000000" x2="172.000000" y2="64.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="172.000000" y1="44.000000" x2="180.000000" y2="44.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="172.000000" y1="64.000000" x2="180.000000" y2="64.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="180.000000" y1="44.000000" x2="180.000000" y2="56.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="180.000000" y1="56.000000" x2="180.000000" y2="56.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="180.000000" y1="56.000000" x2="184.000000" y2="56.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="180.000000" y1="64.000000" x2="184.000000" y2="64.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="222.700000" y1="60.000000" x2="226.700000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="226.700000" y1="60.000000" x2="226.700000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="226.700000" y1="60.000000" x2="230.700000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="308.100000" y1="60.000000" x2="312.100000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="312.100000" y1="60.000000" x2="312.100000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="312.100000" y1="60.000000" x2="316.100000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="419.300000" y1="60.000000" x2="423.300000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="423.300000" y1="60.000000" x2="423.300000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="423.300000" y1="60.000000" x2="427.300000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="504.700000" y1="60.000000" x2="508.700000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="508.700000" y1="60.000000" x2="508.700000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="508.700000" y1="60.000000" x2="512.700000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="615.900000" y1="60.000000" x2="619.900000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="619.900000" y1="60.000000" x2="619.900000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="619.900000" y1="60.000000" x2="623.900000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="701.300000" y1="60.000000" x2="705.300000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
+<line x1="705.300000" y1="60.000000" x2="715.300000" y2="60.000000" style="stroke:black; stroke-linecap:round; stroke-width:0.25;"/>
</svg>
matrix_real2pcplx(n, m) = _ <: picks(n) : par(i, n, ( _ <: picks(m) : real2pcplx(m) : nconcat(m))) : nconcat(n);
-normalize(n) = _ , n : /;
+//normalize(n) = _ , n : /;
+normalize(n, m) = _, (m : vectorize(n)) : /;
unnormalize(n) = par(i, n, ( _ , GREY_MAX : *));
//fft2d(x, y) = matricize(x, y) : output(x, y);
fft2d(x, y) = normalize(GREY_MAX) : matricize(x, y) : lines_fft(x, y) : matrix_transpose(x, y) : lines_fftc(y, x) : matrix_transpose(y, x) : norm_out(x, y);
+new_fft2d(x, y) = normalize(y, GREY_MAX) : vectorize(x) : lines_fft(x, y) : matrix_transpose(x, y) : lines_fftc(y, x) : matrix_transpose(y, x) : norm_out(x, y);
+
//safer with x=y because tests and zero padding are still to implement
-process = fft2d(32,32);
+//process = fft2d(32,32);
+process = new_fft2d(32,32);
+
+
* Implementation contributed by Remy Muller
*****************************************************************/
-// bus(n) : n parallel cables
-bus(2) = _,_; // avoids a lot of "bus(1)" labels in block diagrams
-bus(n) = par(i, n, _);
// twiddle_mult(n) : n parallel cables
twiddle_mult(k, n) = _, W(k, n) : pcplx_mul;
-// selector(i,n) : select ith cable among n
-selector(i,n) = par(j, n, S(i, j)) with { S(i,i) = _; S(i,j) = !; };
-
-// interleave(m,n) : interleave m*n cables : x(0), x(m), x(2m), ..., x(1),x(1+m), x(1+2m)...
-//interleave(m,n) = bus(m*n) <: par(i, m, par(j, n, selector(i+j*m,m*n)));
-
-// interleave(row,col) : interleave row*col cables from column order to row order.
-// input : x(0), x(1), x(2) ..., x(row*col-1)
-// output: x(0+0*row), x(0+1*row), x(0+2*row), ..., x(1+0*row), x(1+1*row), x(1+2*row), ...
-interleave(row,col) = bus(row*col) <: par(r, row, par(c, col, selector(r+c*row,row*col)));
-
// butterfly(n) : addition then substraction of interleaved signals :
xbutterfly(n) = (bus(n/2), par(k, n/2, twiddle_mult(k, n))) <: interleave(n/2,2), interleave(n/2,2) : par(i, n/2, pcplx_add), par(i, n/2, pcplx_sub);
vol = 1;
freq = 1000;
-process = osc(freq) * vol;
\ No newline at end of file
+process = osc(freq) * vol;
+//process = freq / samplingfreq : @(1): ( + : decimal) ~ _ : * (tablesize) : int ;
#
# The Caml sources (including camlyacc and camllex source files)
-SOURCES = types.ml parser.mly lexer.mll value.ml signal.ml faustexp.ml interpreter.ml preprocess.ml main.ml preprocess_stubs.cpp
+SOURCES = types.ml parser.mly lexer.mll basic.ml symbol.ml aux.ml value.ml signal.ml beam.ml process.ml faustio.ml preprocess.ml main.ml preprocess_stubs.cpp
# The executable file to generate
#SNDFILE_PATH = /home/wang/Desktop/libsndfile-ocaml
export SNDFILE_PATH
-# Path to Faust.mr3
+# Path to Faust.mr2
FAUST_PATH = faust-0.9.47mr3
# Path to preprocessor library
# LIBS=$(WITHGRAPHICS) $(WITHUNIX) $(WITHSTR) $(WITHNUMS) $(WITHTHREADS)\
# $(WITHDBM)
-LIBS = $(WITHSNDFILE) $(WITHUNIX)
+LIBS = $(WITHSNDFILE) $(WITHUNIX) $(WITHSTR)
# Should be set to -INCLUDE if you use any of the libraries above
# or if any C code have to be linked with your program
WITHSNDFILE = sndfile.cma
+WITHSTR = str.cma
+
# c++ wrap options
GPP_CALL = -cc "g++"
preprocess_stubs.o: preprocess_stubs.cpp
$(CC) $(CC_OPTIONS) $<
+faustio.cmo: faustio.ml
+ $(CAMLC) $(INCLUDE) $(LIBS) -c $<
+
+faustio.cmx: faustio.ml
+ $(CAMLOPT) $(INCLUDE) $(LIBS:.cma=.cmxa) -c $<
+
.SUFFIXES: .ml .mli .cmo .cmi .cmx .mll .mly
.ml.cmo:
--- /dev/null
+(**
+ Module: Aux
+ Description: all auxiliary functions
+ @author WANG Haisheng
+ Created: 12/08/2013 Modified: 13/08/2013
+*)
+
+
+let array_map = fun f -> fun a ->
+ let n = Array.length a in
+ Array.init n (fun i -> f a.(i));;
+
+let array_map2 = fun f -> fun a -> fun b ->
+ let n1 = Array.length a in
+ let n2 = Array.length b in
+ if n1 = n2 then Array.init n1 (fun i -> f a.(i) b.(i))
+ else raise (Invalid_argument "Array.map2 size not matched.");;
+
+let array_map3 = fun f -> fun a -> fun b -> fun c ->
+ let n1 = Array.length a in
+ let n2 = Array.length b in
+ let n3 = Array.length c in
+ if n1 = n2 && n1 = n3 then Array.init n1 (fun i -> f a.(i) b.(i) c.(i))
+ else raise (Invalid_argument "Array.map3 size not matched.");;
+
+let decorate = fun s -> " Faustine -> " ^ s;;
--- /dev/null
+(**
+ Module: Basic
+ Description: basic data type in the vectorial faust interpreter.
+ @author WANG Haisheng
+ Created: 31/05/2013 Modified: 17/07/2013
+*)
+
+open Types;;
+
+exception Convert_Error of string;;
+exception Basic_operation of string;;
+
+
+(* MACRO *)
+
+let faust_max = 2147483647;;
+let faust_min = -2147483648;;
+let faust_bits = 32;;
+
+(* Functional operations *)
+
+let fun_unary oper f = fun x -> oper (f x);;
+let fun_binary oper f g = fun x -> oper (f x) (g x);;
+let fun_ternary oper f g h = fun x -> oper (f x) (g x) (h x);;
+
+(* basic operations *)
+
+let memorize : int -> (index -> basic) -> (index -> basic) =
+ fun size ->
+ fun vec ->
+ let memory = Array.create size Error in
+ let filled = Array.create size false in
+ let vec_mem : index -> basic =
+ fun i ->
+ if i >= 0 && i < size then (
+ if filled.(i) then
+ memory.(i)
+ else
+ let result = vec i in
+ let () = memory.(i) <- result in
+ let () = filled.(i) <- true in
+ result)
+ else raise (Invalid_argument "vector overflow.") in
+ vec_mem;;
+
+class vector : int -> (index -> basic) -> vector_type =
+ fun (size_init : int) ->
+ fun (vec_init : index -> basic) ->
+ object
+ val s = size_init
+ val vec = memorize size_init vec_init
+ method size = s
+ method nth = vec
+ end;;
+
+let rec basic_to_int : basic -> int =
+ fun v ->
+ match v with
+ |N i -> i
+ |R f -> int_of_float f
+ |Vec vec ->
+ raise (Convert_Error "basic_to_int : vector.")
+ |Zero -> 0
+ |Error -> raise (Convert_Error "basic_to_int : Error");;
+
+
+let basic_to_float : basic -> float =
+ fun v ->
+ match v with
+ |N i -> float_of_int i
+ |R f -> f
+ |Vec vec ->
+ raise (Convert_Error "basic_to_float : vector.")
+ |Zero -> 0.
+ |Error -> 0.;;
+
+
+let basic_to_float_array : basic -> float array =
+ fun v ->
+ match v with
+ |Vec vec ->
+ let basics : basic array =
+ Array.init vec#size vec#nth in
+ Array.map basic_to_float basics
+ |_ -> [| (basic_to_float v)|];;
+
+
+let rec basic_to_string : basic -> string =
+ fun (v : basic) ->
+ match v with
+ |N i1 -> string_of_int i1
+ |R f1 -> string_of_float f1
+ |Vec vec ->
+ let basics : basic array =
+ Array.init vec#size vec#nth in
+ let strings = Array.to_list
+ (Array.map basic_to_string basics) in
+ String.concat "," strings
+ |Zero -> "0"
+ |Error -> "0";;
+
+let basic_of_float : float -> basic = fun f -> R f;;
+
+let rec basic_of_float_array : float array -> basic =
+ fun (data : float array) ->
+ let n = Array.length data in
+ if n = 0 then
+ raise (Convert_Error "basic_of_float_array : empty.")
+ else if n = 1 then basic_of_float data.(0)
+ else
+ let vec = Array.get (Array.map basic_of_float data) in
+ Vec (new vector n vec);;
+
+(* VALUE OPERATIONS *)
+
+let rec basic_normalize : basic -> basic =
+ fun b ->
+ let n = 2. ** float_of_int (faust_bits) in
+ match b with
+ |N i ->
+ if i > faust_max then
+ N (i - int_of_float
+ (n *. floor (((float_of_int i) +. n/.2.)/.n)))
+ else if i < faust_min then
+ N (i + int_of_float
+ (n *. floor ((n/.2. -. (float_of_int i) -. 1.)/.n)))
+ else N i
+ |R f ->
+ if f > float_of_int (faust_max) then
+ R (f -. (n *. floor ((f +. n/.2.)/.n)))
+ else if f < float_of_int (faust_min) then
+ R (f +. (n *. floor ((n/.2. -. f -. 1.)/.n)))
+ else R f
+ |Vec vec ->
+ Vec (new vector vec#size
+ (fun_unary basic_normalize vec#nth))
+ |Zero -> Zero
+ |Error -> Error;;
+
+
+let rec basic_add : basic -> basic -> basic =
+ fun b1 -> fun b2 ->
+ match (b1, b2) with
+ | (Zero, _) -> b2
+ | (_, Zero) -> b1
+
+ | (Vec vec1, Vec vec2) ->
+ if vec1#size = vec2#size then
+ Vec (new vector vec1#size
+ (fun_binary basic_add vec1#nth vec2#nth))
+ else raise (Basic_operation "vector size not matched.")
+ | (Vec vec1, _) -> raise (Basic_operation "vec1 +~ sca2")
+
+ | (N i1, N i2) -> basic_normalize (N (i1 + i2))
+ | (N i1, R f2) -> basic_normalize (R ((float_of_int i1) +. f2))
+ | (N i1, Vec vec2) -> raise (Basic_operation "i1 +~ vec2")
+ | (N i1, Error) -> Error
+
+ | (R f1, N i2) -> basic_normalize (R (f1 +. (float_of_int i2)))
+ | (R f1, R f2) -> basic_normalize (R (f1 +. f2))
+ | (R f1, Vec vec2) -> raise (Basic_operation "f1 +~ vec2")
+ | (R f1, Error) -> Error
+
+ | (Error, Vec vec2) -> raise (Basic_operation "Error +~ vec2")
+ | (Error, _) -> Error;;
+
+
+let (+~) b1 b2 = basic_add b1 b2;;
+
+
+let rec basic_neg : basic -> basic =
+ fun b ->
+ match b with
+ |N i -> N (-i)
+ |R f -> R (-.f)
+ |Vec vec -> Vec (new vector vec#size (fun_unary basic_neg vec#nth))
+ |Zero -> Zero
+ |Error -> Error;;
+
+
+let basic_sub : basic -> basic -> basic =
+ fun b1 ->
+ fun b2 ->
+ basic_add b1 (basic_neg b2);;
+
+
+let (-~) b1 b2 = basic_sub b1 b2;;
+
+
+let rec basic_mul : basic -> basic -> basic =
+ fun b1 ->
+ fun b2 ->
+ match (b1, b2) with
+ | (Vec vec1, Vec vec2) ->
+ if vec1#size = vec2#size then
+ Vec (new vector vec1#size
+ (fun_binary basic_mul vec1#nth vec2#nth))
+ else raise (Basic_operation "vector size not matched.")
+ | (Vec vec1, Zero) ->
+ Vec (new vector vec1#size
+ (fun_unary (basic_mul Zero) vec1#nth))
+ | (Vec vec1, _) -> raise (Basic_operation "vec1 *~ sca2")
+
+ | (N i1, N i2) -> basic_normalize (N (i1 * i2))
+ | (N i1, R f2) -> basic_normalize (R ((float_of_int i1) *. f2))
+ | (N i1, Vec vec2) -> raise (Basic_operation "i1 *~ vec2")
+ | (N i1, Zero) -> N 0
+ | (N i1, Error) -> Error
+
+ | (R f1, N i2) -> basic_normalize (R (f1 *. (float_of_int i2)))
+ | (R f1, R f2) -> basic_normalize (R (f1 *. f2))
+ | (R f1, Vec vec2) -> raise (Basic_operation "f1 *~ vec2")
+ | (R f1, Zero) -> R 0.
+ | (R f1, Error) -> Error
+
+ | (Zero, N i2) -> N 0
+ | (Zero, R f2) -> R 0.
+ | (Zero, Vec vec2) ->
+ Vec (new vector vec2#size
+ (fun i -> basic_mul Zero (vec2#nth i)))
+ | (Zero, Zero) -> Zero
+ | (Zero, Error) -> Error
+
+ | (Error, Vec vec2) -> raise (Basic_operation "Error +~ vec2")
+ | (Error, _) -> Error;;
+
+
+let ( *~ ) b1 b2 = basic_mul b1 b2;;
+
+
+let rec basic_recip : basic -> basic =
+ fun v ->
+ match v with
+ |N i -> basic_recip (R (float_of_int i))
+ |R f -> if f = 0. then Error else R (1./.f)
+ |Vec vec -> Vec (new vector vec#size
+ (fun_unary basic_recip vec#nth))
+ |Zero -> Error
+ |Error -> R 0.;;
+
+
+let basic_div : basic -> basic -> basic =
+ fun b1 ->
+ fun b2 ->
+ basic_mul b1 (basic_recip b2);;
+
+
+let (/~) b1 b2 = basic_div b1 b2;;
+
+
+let rec basic_zero : basic -> basic =
+ fun v ->
+ match v with
+ |N i -> N 0
+ |R f -> R 0.
+ |Vec vec -> Vec (new vector vec#size
+ (fun_unary basic_zero vec#nth))
+ |Zero -> Zero
+ |Error -> R 0.;;
+
+
+let rec basic_floor : basic -> basic =
+ fun v ->
+ match v with
+ |N i -> R (float_of_int i)
+ |R f -> R (floor f)
+ |Vec vec -> Vec (new vector vec#size
+ (fun_unary basic_floor vec#nth))
+ |Zero -> R 0.
+ |Error -> Error;;
+
+
+let rec basic_int : basic -> basic =
+ fun v ->
+ match v with
+ |N i -> v
+ |R f -> N (int_of_float f)
+ |Vec vec -> Vec (new vector vec#size
+ (fun_unary basic_int vec#nth))
+ |Zero -> N 0
+ |Error -> Error;;
+
+
+let rec basic_unary : (float -> float) -> basic -> basic =
+ fun oper ->
+ fun b ->
+ match b with
+ |N i -> R (oper (float_of_int i))
+ |R f -> R (oper f)
+ |Vec vec -> Vec (new vector vec#size
+ (fun_unary (basic_unary oper) vec#nth))
+ |Zero -> R (oper 0.)
+ |Error -> Error;;
+
+
+let basic_sin : basic -> basic = basic_unary sin;;
+let basic_cos : basic -> basic = basic_unary cos;;
+let basic_atan : basic -> basic = basic_unary atan;;
+
+
+let rec basic_atan2 : basic -> basic -> basic =
+ fun v1 ->
+ fun v2 ->
+ match (v1, v2) with
+ | (N i1, N i2) -> basic_atan2
+ (R (float_of_int i1)) (R (float_of_int i2))
+ | (N i1, R f2) -> basic_atan2 (R (float_of_int i1)) v2
+ | (N i1, Zero) -> basic_atan2 (R (float_of_int i1)) (R 0.)
+ | (N i1, Vec vec2) -> raise (Basic_operation "atan2 sca vec.")
+ | (N i1, Error) -> Error
+
+ | (R f1, N i2) -> basic_atan2 v1 (R (float_of_int i2))
+ | (R f1, R f2) -> R (atan2 f1 f2)
+ | (R f1, Zero) -> basic_atan2 v1 (R 0.)
+ | (R f1, Vec vec2) -> raise (Basic_operation "atan2 sca vec.")
+ | (R f1, Error) -> Error
+
+ | (Vec vec1, Vec vec2) -> Vec (new vector vec1#size
+ (fun_binary basic_atan2 vec1#nth vec2#nth))
+ | (Vec vec1, Zero) -> Vec (new vector vec1#size
+ (fun i -> basic_atan2 (vec1#nth i) Zero))
+ | (Vec vec1, _) -> raise (Basic_operation "atan2 vec sca.")
+
+ | (Zero, N i2) -> basic_atan2 (R 0.) (R (float_of_int i2))
+ | (Zero, R f2) -> basic_atan2 (R 0.) v2
+ | (Zero, Vec vec2) -> Vec (new vector vec2#size
+ (fun_unary (basic_atan2 Zero) vec2#nth))
+ | (Zero, Zero) -> basic_atan2 (R 0.) (R 0.)
+ | (Zero, Error) -> Error
+
+ | (Error, Vec vec2) -> raise (Basic_operation "atan2 sca vec.")
+ | (Error, _) -> Error;;
+
+
+let rec basic_sqrt v = match v with
+ |N i ->
+ if i >= 0 then R (sqrt (float_of_int i))
+ else raise (Basic_operation "sqrt parameter < 0.")
+ |R f ->
+ if f >= 0. then R (sqrt f)
+ else raise (Basic_operation "sqrt parameter < 0.")
+ |Vec vec -> Vec (new vector vec#size (fun_unary basic_sqrt vec#nth))
+ |Zero -> R (sqrt 0.)
+ |Error -> Error;;
+
+
+let rec basic_mod : basic -> basic -> basic =
+ fun b1 ->
+ fun b2 ->
+ match (b1, b2) with
+ | (N i1, N i2) -> N (i1 mod i2)
+ | (N i1, R f2) -> basic_mod b1 (N (int_of_float f2))
+ | (N i1, Vec vec2) ->
+ raise (Basic_operation "Scalaire_Vector: int mod vec.")
+ | (_, Zero) ->
+ raise (Basic_operation "b1 mod b2: b2 cannot be zero.")
+ | (N i1, Error) -> Error
+
+ | (R f1, _) -> basic_mod (N (int_of_float f1)) b2
+
+ | (Vec vec1, Vec vec2) ->
+ if vec1#size = vec2#size then
+ Vec (new vector vec1#size (fun_binary basic_mod vec1#nth vec2#nth))
+ else raise (Basic_operation "vector size not matched.")
+ | (Vec vec1, _) ->
+ raise (Basic_operation "Vector_Scalaire: vec mod int.")
+
+ | (Zero, Vec vec2) ->
+ basic_mod (Vec (new vector vec2#size (fun i -> Zero))) b2
+ | (Zero, _) -> basic_mod (N 0) b2
+
+ | (Error, Vec vec2) ->
+ raise (Basic_operation "Scalaire_Vector: int mod vec.")
+ | (Error, _) -> Error;;
+
+
+let rec basic_larger_than_zero : basic -> basic =
+ fun v ->
+ match v with
+ |N i -> if i > 0 then N 1 else N 0
+ |R f -> if f > 0. then N 1 else N 0
+ |Vec vec ->
+ Vec (new vector vec#size
+ (fun_unary basic_larger_than_zero vec#nth ))
+ |Zero -> N 0
+ |Error -> Error;;
+
+
+let basic_larger : basic -> basic -> basic =
+ fun b1 ->
+ fun b2 ->
+ basic_larger_than_zero (b1 -~ b2);;
+
+
+let basic_smaller : basic -> basic -> basic =
+ fun b1 ->
+ fun b2 ->
+ basic_larger_than_zero (b2 -~ b1);;
+
+
--- /dev/null
+(**
+ Module: Beam
+ Description: beam definition and operations
+ @author WANG Haisheng
+ Created: 21/07/2013 Modified: 21/07/2013
+*)
+
+exception Beam_matching of string;;
+
+open Types;;
+open Basic;;
+open Value;;
+open Signal;;
+
+class beam : signal_type array -> beam_type =
+ fun (signals_init : signal_type array) ->
+ object (self)
+ val signals = signals_init
+
+ method get = signals
+ method width = Array.length signals
+
+ method sub : int -> int -> beam_type =
+ fun start ->
+ fun len ->
+ new beam (Array.sub self#get start len)
+
+ method cut : int -> beam_type * beam_type =
+ fun (cut_width : int)->
+ ((self#sub 0 cut_width),(self#sub cut_width (self#width - cut_width)))
+
+ method append : beam_type -> beam_type =
+ fun (b : beam_type) ->
+ new beam (Array.append self#get b#get)
+
+ method private add_memory : int -> unit =
+ fun (window : int) ->
+ let signal_add_memory : int -> signal_type -> unit =
+ fun (l : int) ->
+ fun (s : signal) ->
+ s#add_memory l in
+ let _ = Array.map (signal_add_memory window) self#get in ()
+
+ method matching : int -> beam_type =
+ fun size ->
+ if size = self#width then new beam self#get
+
+ else if (size > self#width) && (size mod self#width = 0) then
+ let () = self#add_memory 1 in
+ let split_signals =
+ Array.concat (Array.to_list
+ (Array.make (size/self#width) self#get)) in
+ new beam split_signals
+
+ else if (size < self#width) && (self#width mod size = 0) then
+ let rec merge_rec =
+ fun (sa : signal_type array) ->
+ fun (l : int) ->
+ fun (i : int) ->
+ if i + l < Array.length sa then
+ (sa.(i))#add (merge_rec sa l (i + l))
+ else sa.(i) in
+ let merge_signals = Array.init size (merge_rec self#get size) in
+ new beam merge_signals
+
+ else raise (Beam_matching "matching size error")
+
+ method at : time -> value_type array =
+ fun t ->
+ let signal_at = fun (t : time) -> fun (s : signal_type) -> s#at t in
+ Array.map (signal_at t) self#get
+
+ method output : int -> float array array array =
+ fun (length_max : int) ->
+ let transpose : 'a array array -> 'a array array =
+ fun matrix ->
+ let get_element = fun i -> fun array -> array.(i) in
+ let get_column = fun m -> fun i -> Array.map (get_element i) m in
+ Array.init self#width (get_column matrix) in
+ let value2float = fun (v : value_type) -> v#to_float_array in
+ let init = [|0.|] in
+ let container = Array.make length_max
+ (Array.make self#width init) in
+ let index = ref 0 in
+
+ try
+ while !index < length_max do
+ container.(!index) <- Array.map value2float (self#at !index);
+ incr index;
+ done;
+ transpose container
+
+ with x ->
+ match x with
+ | Invalid_argument s ->
+ transpose (Array.sub container 0 !index)
+ | _ -> raise x
+
+ method frequency : int array =
+ let each_rate : signal -> int =
+ fun (s : signal) ->
+ let rate = s#frequency in
+ if rate > 0 then rate
+ else if rate = 0 then 44100
+ else raise (Beam_matching "frequency error.") in
+ Array.map each_rate self#get
+
+ end
+++ /dev/null
-(**
- Module: Faustexp
- Description: dimension estimation and delay estimation of faust expressions.
- @author WANG Haisheng
- Created: 03/06/2013 Modified: 04/06/2013
-*)
-
-open Types;;
-open Value;;
-
-(* EXCEPTIONS *)
-
-(** Exception raised in beam matching of faust expressions.*)
-exception Beam_Matching_Error of string;;
-
-(** Exception raised in case that the branch under call hasn't yet been programed.*)
-exception NotYetDone;;
-
-
-(* PROCESS DELAY ESTIMATION *)
-
-(** val delay : faust_exp -> int, returns the number of delays estimated staticly.
-Attention: delays of "@" is estimated as 10 constant,
-delays of "vectorize" and "serialize" haven't been implemented,
-delays of "rdtable" hasn't been implemented.*)
-let rec delay exp_faust = match exp_faust with
- |Const v -> 0
- |Ident s ->
- (
- match s with
- |Add -> 0
- |Sup -> 0
- |Mul -> 0
- |Div -> 0
- |Pass -> 0
- |Stop -> 0
- |Mem -> 1
- |Delay -> 100000 (* danger! *)
- |Floor -> 0
- |Int -> 0
- |Sin -> 0
- |Cos -> 0
- |Atan -> 0
- |Atantwo -> 0
- |Sqrt -> 0
- |Rdtable -> 100000 (* danger! *)
- |Mod -> 0
- |Larger -> 0
- |Smaller -> 0
- |Vectorize -> 100 (* danger! *)
- |Concat -> 0
- |Nth -> 0
- |Serialize -> 0
- |Prefix -> 1
- |Selecttwo -> 0
- |Selectthree -> 0
- )
- |Par (e1, e2) -> max (delay e1) (delay e2)
- |Seq (e1, e2) -> (delay e1) + (delay e2)
- |Split (e1, e2) -> (delay e1) + (delay e2)
- |Merge (e1, e2) -> (delay e1) + (delay e2)
- |Rec (e1, e2) -> delay e1;;
-
-
-(* PARSER *)
-
-(** val exp_of_string : string -> faust_exp, faust expression parser. *)
-let exp_of_string s = (Parser.main Lexer.token (Lexing.from_string s));;
-
-
-
-(* PROCESS DIMENSION ESTIMATION *)
-(* process dimension := (size of input beam, size of output beam).*)
-
-
-(** val get_root : dimension -> int * int, returns the root of dimension tree. *)
-let get_root = fun d_tree -> match d_tree with
- | End d -> d
- | Tree (d, branches) -> d;;
-
-
-(** val subtree : dimention -> int -> dimension, returns a subtree of dimension tree.*)
-let subtree = fun d_tree -> fun i ->
- match d_tree with
- | End d -> raise (Beam_Matching_Error "Subtree left absent.")
- | Tree (d, branches) -> (
- match branches with
- (left, right) -> if i = 0 then left else right);;
-
-(** val subtree_left : dimension -> dimension, returns the left subtree of dimension tree.*)
-let subtree_left = fun d_tree -> subtree d_tree 0;;
-
-
-(** val subtree_right : dimension -> dimension, returns the right subtree of dimension tree.*)
-let subtree_right = fun d_tree -> subtree d_tree 1;;
-
-
-(** val d_par : int * int -> int * int -> int * int, process dimension for constructor "par(,)",
-which is the addition of two dimensions.*)
-let d_par a b = (((fst a) + (fst b)), ((snd a) + (snd b)));;
-
-
-(** val d_seq : int * int -> int * int -> int * int, process dimension for constructor "seq(:)",
-which is (size of input beam of first exp, size of output beam of second exp)
-along with beam matching.*)
-let d_seq a b = if (snd a) = (fst b) then (fst a, snd b) else raise (Beam_Matching_Error "seq");;
-
-
-(** val d_split : int * int -> int * int -> int * int, process dimension for constructor "split(<:)",
-which is (size of input beam of first exp, size of output beam of second exp)
-along with beam matching.*)
-let d_split a b =
- if ((fst b) mod (snd a)) = 0 then
- (fst a, snd b)
- else raise (Beam_Matching_Error "split");;
-
-
-(** val d_merge : int * int -> int * int -> int * int, process dimension for constructor "merge(:>)",
-which is (size of input beam of first exp, size of output beam of second exp)
-along with beam matching. *)
-let d_merge a b =
- if ((snd a) mod (fst b)) = 0 then
- (fst a, snd b)
- else raise (Beam_Matching_Error "merge");;
-
-
-(** val d_rec : int * int -> int * int -> int * int, process dimension for constructor "rec(~)",
-which is (size of input beam of first exp - size of output beam of second exp,
-size of output beam of first exp)
-along with beam matching.*)
-let d_rec a b =
- if (fst a) >= (snd b) && (snd a) >= (fst b) then
- ((fst a) - (snd b), snd a)
- else raise (Beam_Matching_Error "rec");;
-
-
-(** val dim : faust_exp -> int * int, returns dimension for faust expression,
-along with beam matching.*)
-let rec dim exp_faust =
-
-(** val dimension_constructor : ((int * int) -> (int * int) -> (int * int)) -> faust_exp
--> faust_exp -> dimension,
-returns the dimension tree of constructor(e1, e2).*)
- let dimension_constructor = fun constructor -> fun e1 -> fun e2 ->
- let subtree1 = dim e1 in
- let subtree2 = dim e2 in
- let root = constructor (get_root subtree1) (get_root subtree2) in
- Tree (root, (subtree1, subtree2)) in
-
- match exp_faust with
- |Const v -> End (0, 1)
- |Ident s ->
- (
- match s with
- |Add -> End (2, 1)
- |Sup -> End (2, 1)
- |Mul -> End (2, 1)
- |Div -> End (2, 1)
- |Pass -> End (1, 1)
- |Stop -> End (1, 0)
- |Mem -> End (1, 1)
- |Delay -> End (2, 1)
- |Floor -> End (1, 1)
- |Int -> End (1, 1)
- |Sin -> End (1, 1)
- |Cos -> End (1, 1)
- |Atan -> End (1, 1)
- |Atantwo -> End (2, 1)
- |Sqrt -> End (1, 1)
- |Rdtable -> End (3, 1)
- |Mod -> End (2, 1)
- |Vectorize -> End (2, 1)
- |Concat -> End (2, 1)
- |Nth -> End (2, 1)
- |Serialize -> End (1, 1)
- |Larger -> End (2, 1)
- |Smaller -> End (2, 1)
- |Prefix -> End (2, 1)
- |Selecttwo -> End (3, 1)
- |Selectthree -> End (4, 1)
- )
-
- |Par (e1, e2) -> dimension_constructor d_par e1 e2
- |Seq (e1, e2) -> dimension_constructor d_seq e1 e2
- |Split (e1, e2) -> dimension_constructor d_split e1 e2
- |Merge (e1, e2) -> dimension_constructor d_merge e1 e2
- |Rec (e1, e2) -> dimension_constructor d_rec e1 e2;;
-
-
-
-(* AUXILIARY 'CONVERT_TO_STRING' FUNCTIONS *)
-
-(** val print_exp : faust_exp -> unit, print to console the input faust expression.*)
-let print_exp exp =
- let rec string_of_exp exp = match exp with
- |Const v -> "Const" ^ " (" ^ (string_of_value v) ^ ")"
- |Ident s -> "Ident" ^ " \"" ^ "s" ^ "\""
- |Par (e1, e2) -> "Par" ^ " (" ^ (string_of_exp e1) ^ ", " ^ (string_of_exp e2) ^ ")"
- |Seq (e1, e2) -> "Seq" ^ " (" ^ (string_of_exp e1) ^ ", " ^ (string_of_exp e2) ^ ")"
- |Split (e1, e2) -> "Split" ^ " (" ^ (string_of_exp e1) ^ ", " ^ (string_of_exp e2) ^ ")"
- |Merge (e1, e2) -> "Merge" ^ " (" ^ (string_of_exp e1) ^ ", " ^ (string_of_exp e2) ^ ")"
- |Rec (e1, e2) -> "Rec" ^ " (" ^ (string_of_exp e1) ^ ", " ^ (string_of_exp e2) ^ ")"
- in
- print_string("Parer : Types.faust_exp = "^ (string_of_exp exp));;
--- /dev/null
+(**
+ Module: Faustio
+ Description: audio input/output, csv input/output
+ @author WANG Haisheng
+ Created: 12/08/2013 Modified: 13/08/2013
+*)
+
+open Types;;
+open Basic;;
+open Value;;
+open Signal;;
+open Beam;;
+open Aux;;
+
+let csv_read_buffer_length = 0xFFFF;;
+
+class virtual io =
+ object
+ val mutable _basename = ""
+ val mutable _dir = ""
+ method set : string -> string -> unit =
+ fun (dir : string) ->
+ fun (basename : string) ->
+ _basename <- basename; _dir <- dir
+
+ method virtual read : string array -> beam
+ method virtual write : int array -> float array array array -> string array
+
+ method private concat : float array array array -> float array array =
+ fun (origin : float array array array) ->
+ Array.map Array.concat (Array.map Array.to_list origin)
+
+ method private channels : float array array array -> int array =
+ fun data ->
+ let get_channel = fun s ->
+ let l = Array.length s in
+ Array.length s.(l - 1) in
+ Array.map get_channel data
+ end;;
+
+class waveio : io_type =
+ object (self)
+ inherit io
+ method read : string array -> beam =
+ fun (paths : string array) ->
+ let n = Array.length paths in
+ if n = 0 then
+ new beam [||]
+ else
+ let signals =
+ let files = Array.map Sndfile.openfile paths in
+ let frames = Array.map Int64.to_int
+ (Array.map Sndfile.frames files) in
+ let rates = Array.map Sndfile.samplerate files in
+ let create_container = fun l -> Array.create l 1. in
+ let containers = Array.map create_container frames in
+ let _ = array_map2 Sndfile.read files containers in
+ let _ = Array.map Sndfile.close files in
+ let stream2func =
+ fun stream -> fun t -> new value (R stream.(t)) in
+ array_map2 (new signal) rates (Array.map stream2func containers) in
+ new beam signals
+
+ method write : int array -> float array array array -> string array =
+ fun (rates : int array) ->
+ fun (output : float array array array) ->
+ let n = Array.length output in
+ let paths = Array.init n (fun i ->
+ _dir ^ _basename ^ (string_of_int (i + 1)) ^ ".wav") in
+
+ let files =
+ let channels = self#channels output in
+ let file_format = Sndfile.format
+ Sndfile.MAJOR_WAV Sndfile.MINOR_PCM_16 in
+ let openwr = fun path -> fun channel -> fun rate ->
+ Sndfile.openfile ~info:(Sndfile.RDWR, file_format, channel, rate) path in
+ array_map3 openwr paths channels rates in
+
+ let data = self#concat output in
+ let _ = array_map2 Sndfile.write files data in
+ let _ = Array.map Sndfile.close files in
+ paths
+ end;;
+
+
+
+class csvio : io_type =
+ object (self)
+ inherit io
+ method private csvread : in_channel -> signal =
+ fun (ic : in_channel) ->
+ let buffer = Buffer.create csv_read_buffer_length in
+ let () =
+ try
+ while true do
+ Buffer.add_string buffer (input_line ic);
+ Buffer.add_char buffer '\t';
+ done;
+ with End_of_file -> () in
+ let content = Buffer.contents buffer in
+ let lines = Str.split (Str.regexp "\t") content in
+ let elements = List.map (Str.split (Str.regexp ",")) lines in
+ let data =
+ let data_in_list = List.map (List.map float_of_string) elements in
+ Array.of_list (List.map Array.of_list data_in_list) in
+ let values =
+ let convertor = new value Zero in
+ Array.map (convertor#of_float_array) data in
+ new signal 0 (Array.get values)
+
+ method read : string array -> beam =
+ fun (paths : string array) ->
+ let files = Array.map open_in paths in
+ let signals = Array.map self#csvread files in
+ new beam signals
+
+ method write : int array -> float array array array -> string array =
+ fun (rates : int array) ->
+ fun (data : float array array array) ->
+ let paths =
+ let n = Array.length data in
+ let path_pattern = fun i ->
+ _dir ^ _basename ^ (string_of_int (i + 1)) ^ ".csv" in
+ Array.init n path_pattern in
+
+ let files = Array.map open_out paths in
+ let strings =
+ let value2string : float array -> string =
+ fun (v : float array) ->
+ let strings = Array.map string_of_float v in
+ String.concat "," (Array.to_list strings) in
+ let signal2string : float array array -> string =
+ fun (s : float array array) ->
+ let lines = Array.map value2string s in
+ String.concat "\n" (Array.to_list lines) in
+ Array.map signal2string data in
+ let _ = array_map2 output_string files strings in
+ let _ = Array.map close_out files in
+ paths
+ end;;
+
+
+class iomanager =
+ object (self)
+ val wave = new waveio
+ val csv = new csvio
+ val mutable _dir = ""
+ val mutable _format = ""
+ val mutable _basename = ""
+
+ method private grab_format : string -> string =
+ fun (path : string) ->
+ let fragments = Str.split (Str.regexp "\.") path in
+ let n = List.length fragments in
+ List.nth fragments (n - 1)
+
+ method read : string list -> beam_type =
+ fun (paths : string list) ->
+ let formats = List.map self#grab_format paths in
+ let read_one : string -> string -> beam_type =
+ fun (format : string) ->
+ fun (path : string) ->
+ if format = "wav" then wave#read [|path|]
+ else if format = "csv" then csv#read [|path|]
+ else raise (Invalid_argument "Unknown format.") in
+ let beams = List.map2 read_one formats paths in
+ let concat : beam_type -> beam_type -> beam_type =
+ fun b1 -> fun b2 -> b1#append b2 in
+ List.fold_left concat (new beam [||]) beams
+
+ method set : string -> string -> string -> unit =
+ fun (dir : string) ->
+ fun (format : string) ->
+ fun (basename : string) ->
+ _dir <- dir;
+ _format <- format;
+ _basename <- basename;
+ wave#set _dir _basename;
+ csv#set _dir _basename
+
+ method write : int array -> float array array array -> string array =
+ fun (rates : int array) ->
+ fun (data : float array array array) ->
+ if _format = "" then
+ raise (Invalid_argument "output format unset.")
+ else if _format = "wav" then
+ wave#write rates data
+ else if _format = "csv" then
+ csv#write rates data
+ else raise (Invalid_argument "unknown format.")
+
+ end;;
+++ /dev/null
-(**
- Module: Interpreter
- Description: input beam -> process -> output beam
- @author WANG Haisheng
- Created: 15/05/2013 Modified: 04/06/2013
-*)
-
-open Types;;
-open Value;;
-open Signal;;
-open Faustexp;;
-
-(* EXCEPTIONS *)
-
-(** Exception raised during interpretation of faust process.*)
-exception Evaluation_Error of string;;
-
-
-
-(* MACRO *)
-
-(** Macro constants of this file.*)
-type interpreter_macro =
- | Number_samples_int
- | Max_Eval_Time_int;;
-
-(** val interpreter_macro_to_value : returns the value associated with the macro.*)
-let interpreter_macro_to_value m = match m with
- | Number_samples_int -> 0xFF
- | Max_Eval_Time_int -> 0xFFFFFFFF;;
-
-
-(* OUTPUT WAVE COMPUTATION *)
-
-(** val func_of_func_array : (int -> value) array -> (int -> value array),
-applies the same int parameter to each element of function array,
-produces a value array.*)
-let fun_array_to_fun = fun fun_array ->
- let reverse = fun t -> fun f -> f t in
- let new_fun = fun t-> Array.map (reverse t) fun_array in
- new_fun;;
-
-
-(** val computing : (int -> value array) -> int -> int -> float array array array,
-applies time sequence "0,1,2,3,...,max" to signal beam,
-returns primitive output data.*)
-let computing = fun f -> fun width -> fun length ->
- let container_float_array_array_array =
- ref (Array.make length (Array.make width [||])) in
- let index = ref 0 in
-
- try
- while !index < length do
- (!container_float_array_array_array).(!index)
- <- (Array.map convert_back_R (f (!index)));
- incr index;
- done;
- let () = print_string ("Done.") in
- !container_float_array_array_array
-
- with x ->
- let error_message =
- match x with
- |Convert_Error s -> "Convert_Error: " ^ s
- |Value_operation s -> "Value_operation: " ^ s
- |Signal_operation s -> "Signal_operation: " ^ s
- |Beam_Matching_Error s -> "Beam_Matching_Error: " ^ s
- |Evaluation_Error s -> "Evaluation_Error: " ^ s
- |NotYetDone -> "NotYetDone"
- |_ -> "Done."
- in
- let () = print_string error_message in
- Array.sub (!container_float_array_array_array) 0 !index;;
-
-
-(** val matrix_transpose : 'a array array -> 'a array array,
-transposes the input matrix.*)
-let matrix_transpose = fun m_array_array -> fun width ->
- let get_element = fun i -> fun array -> Array.get array i in
- let get_line = fun array_array -> fun i ->
- Array.map (get_element i) array_array in
- let transpose array_array = Array.init width (get_line array_array) in
- transpose m_array_array;;
-
-
-(** val channels : 'a array array array -> int -> int array,
-returns an array of number of channels. *)
-let channels = fun f_array_array_array -> fun width ->
- let channel = fun faaa -> fun i ->
- let faa = faaa.(i) in
- let length = Array.length faa in
- let fa = faa.(length - 1) in
- Array.length fa
- in
- let channel_array = Array.init width (channel f_array_array_array) in
- channel_array;;
-
-
-(** val arrange : 'a array array array -> int -> 'a array list,
-arranges the output data in "array list" form. *)
-let arrange = fun float_array_array_array -> fun width ->
- let concat faaa = fun i ->
- let faa = faaa.(i) in
- Array.concat (Array.to_list faa)
- in
- let float_array_array = Array.init width (concat float_array_array_array) in
- let float_array_list = Array.to_list float_array_array in
- float_array_list;;
-
-
-(** val compute : (int -> value) list -> (int list) * (float array list).
-input: a list of signal functions
-output: channel number list, data list.*)
-let compute fun_list =
- let () = print_string(" Faustine -> Signals computing... ") in
- let tic = Sys.time () in
-
- (* arrange input information *)
- let length = interpreter_macro_to_value Number_samples_int in
- let width = List.length fun_list in
- let beam_fun = fun_array_to_fun (Array.of_list fun_list) in
-
- (* calculate output wave *)
- let tmp_float_array_array_array = computing beam_fun width length in
-
- (* arrange output data *)
- let output_float_array_array_array = matrix_transpose tmp_float_array_array_array width in
- let channel_array = channels output_float_array_array_array width in
- let channel_list = Array.to_list channel_array in
- let output_float_array_list = arrange output_float_array_array_array width in
- let toc = Sys.time () in
- let () = print_endline(" (duration: " ^ (string_of_float (toc -. tic)) ^ "s)") in
- (channel_list, output_float_array_list);;
-
-
-
-(* INTERPRETATION *)
-
-(** val sublist : 'a list -> int -> int -> 'a list,
-[sublist l start length], returns the sublist of list 'l',
-from index 'start', with length 'length'.*)
-let sublist l start length =
- try
- let arr = Array.of_list l in
- let sub_array = Array.sub arr start length in
- Array.to_list sub_array
-
- with (Invalid_argument "Array.sub") ->
- raise (Invalid_argument "List.sub");;
-
-
-(** val make_beam : (int list) * (float array list) -> (int * (int -> value)) list,
-input: (sample rate list, data list)
-output: beam = (sample rate, function) list *)
-let make_beam = fun input ->
- let rate_list = fst input in
- let float_array_list = snd input in
- let value_array_list =
- List.map (Array.map return_R) float_array_list in
- let fun_list = List.map Array.get value_array_list in
- let make_signal = fun rate -> fun f -> (rate, f) in
- let beam = List.map2 make_signal rate_list fun_list in
- beam;;
-
-
-(** val interpret_const : value -> beam -> beam, generates constant signal with frequency 0. *)
-let interpret_const = fun v -> fun input_beam ->
- let n = List.length input_beam in
- if n = 0 then [(0,(fun t -> v))]
- else raise (Evaluation_Error "Const");;
-
-
-(** val interpret_ident : string -> beam -> beam,
-generates signals according to identified symbols. *)
-let interpret_ident = fun s -> fun input_beam ->
- let n = List.length input_beam in
- match s with
- |Pass -> if n = 1 then input_beam else raise (Evaluation_Error "Ident _")
-
- |Stop -> if n = 1 then [] else raise (Evaluation_Error "Ident !")
-
- |Add -> if n = 2 then [signal_add (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident +")
-
- |Sup -> if n = 2 then [signal_sub (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident -")
-
- |Mul -> if n = 2 then [signal_mul (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident *")
-
- |Div -> if n = 2 then [signal_div (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident /")
-
- |Delay -> if n = 2 then [signal_delay (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident @")
-
- |Mem -> if n = 1 then [signal_mem (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident mem")
-
- |Vectorize -> if n = 2 then [signal_vectorize (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident vectorize")
-
- |Serialize -> if n = 1 then [signal_serialize (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident serialize")
-
- |Concat -> if n = 2 then [signal_append (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident #")
-
- |Nth -> if n = 2 then [signal_nth (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident []")
-
- |Floor -> if n = 1 then [signal_floor (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident floor")
-
- |Int -> if n = 1 then [signal_int (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident int")
-
- |Sin -> if n = 1 then [signal_sin (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident sin")
-
- |Cos -> if n = 1 then [signal_cos (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident cos")
-
- |Atan -> if n = 1 then [signal_atan (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident atan")
-
- |Atantwo -> if n = 2 then [signal_atantwo (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident atantwo")
-
- |Sqrt -> if n = 1 then [signal_sqrt (List.nth input_beam 0)]
- else raise (Evaluation_Error "Ident sqrt")
-
- |Rdtable -> if n = 3 then [signal_rdtable (List.nth input_beam 0)
- (List.nth input_beam 1) (List.nth input_beam 2)]
- else raise (Evaluation_Error "Ident rdtable")
-
- |Selecttwo -> if n = 3 then [signal_select2 (List.nth input_beam 0) (List.nth input_beam 1)
- (List.nth input_beam 2)]
- else raise (Evaluation_Error "Ident select2")
-
- |Selectthree -> if n = 4 then [signal_select3 (List.nth input_beam 0) (List.nth input_beam 1)
- (List.nth input_beam 2) (List.nth input_beam 3)]
- else raise (Evaluation_Error "Ident select3")
-
- |Prefix -> if n = 2 then [signal_prefix (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident prefix")
-
- |Mod -> if n = 2 then [signal_mod (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident %")
-
- |Larger -> if n = 2 then [signal_sup (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident >")
-
- |Smaller -> if n = 2 then [signal_inf (List.nth input_beam 0) (List.nth input_beam 1)]
- else raise (Evaluation_Error "Ident <");;
-
-
-
-(** val rec eval : faust_exp -> beam -> beam,
-main interpretation work is done here. *)
-let rec eval exp_faust dimension_tree input_beam =
-
-
-(** val interpret_par : faust_exp -> faust_exp -> beam -> beam,
-interprets par(e1, e2) with input beam, produces output beam.*)
-let interpret_par = fun e1 -> fun e2 -> fun dimension_tree -> fun input_beam ->
-
- (* dimension information *)
- let n = List.length input_beam in
- let subtree1 = subtree_left dimension_tree in
- let subtree2 = subtree_right dimension_tree in
- let d1 = get_root subtree1 in
- let d2 = get_root subtree2 in
-
- if n = (fst d1) + (fst d2) then
- (
- (* segmentation of input beam *)
- let input_beam1 = sublist input_beam 0 (fst d1) in
- let input_beam2 = sublist input_beam (fst d1) (fst d2) in
-
- (* evaluate two expressions respectively *)
- let output_beam1 = eval e1 subtree1 input_beam1 in
- let output_beam2 = eval e2 subtree2 input_beam2 in
-
- (* concat two output beams *)
- if List.length output_beam1 = snd d1 && List.length output_beam2 = snd d2
- then (output_beam1 @ output_beam2)
- else raise (Evaluation_Error "Par")
- )
- else raise (Evaluation_Error "Par") in
-
-
-(** val interpret_seq : faust_exp -> faust_exp -> beam -> beam,
-interprets seq(e1, e2) with input beam, produces output beam.*)
-let interpret_seq = fun e1 -> fun e2 -> fun dimension_tree -> fun input_beam ->
-
- (* dimension information *)
- let n = List.length input_beam in
- let subtree1 = subtree_left dimension_tree in
- let subtree2 = subtree_right dimension_tree in
- let d1 = get_root subtree1 in
- let d2 = get_root subtree2 in
-
-
- if n = fst d1 then
- (
- (* evaluate the first expression *)
- let output_beam1 = eval e1 subtree1 input_beam in
-
- (* evaluate the second expression *)
- if List.length output_beam1 = fst d2
- then eval e2 subtree2 output_beam1
- else raise (Evaluation_Error "Seq")
- )
- else raise (Evaluation_Error "Seq") in
-
-
-(** val interpret_split : faust_exp -> faust_exp -> beam -> beam,
-interprets split(e1, e2) with input beam, produces output beam.*)
-let interpret_split = fun e1 -> fun e2 -> fun dimension_tree -> fun input_beam ->
-
- (* dimension information *)
- let n = List.length input_beam in
- let subtree1 = subtree_left dimension_tree in
- let subtree2 = subtree_right dimension_tree in
- let d1 = get_root subtree1 in
- let d2 = get_root subtree2 in
-
-
- if n = fst d1 then
- (
- (* evaluate the first expression *)
- let output_beam1 = eval e1 subtree1 input_beam in
-
- (* beam matching *)
- let ref_output_beam1 = ref (beam_add_one_memory output_beam1) in
- let input_beam2 = List.concat
- (Array.to_list (Array.make ((fst d2)/(List.length output_beam1)) !ref_output_beam1))
- in
-
- (* evaluate the second expression *)
- if List.length input_beam2 = fst d2
- then eval e2 subtree2 input_beam2
- else raise (Evaluation_Error "Split")
- )
- else raise (Evaluation_Error "Split") in
-
-
-(** val interpret_merge : faust_exp -> faust_exp -> beam -> beam,
-interprets merge(e1, e2) with input beam, produces output beam.*)
-let interpret_merge = fun e1 -> fun e2 -> fun dimension_tree -> fun input_beam ->
-
- (* dimension information *)
- let n = List.length input_beam in
- let subtree1 = subtree_left dimension_tree in
- let subtree2 = subtree_right dimension_tree in
- let d1 = get_root subtree1 in
- let d2 = get_root subtree2 in
-
-
- if n = fst d1 then
- (
- (* evaluate the first expression *)
- let output_beam1 = eval e1 subtree1 input_beam in
-
- (* beam matching *)
- let input_beam2 =
- (
- let fois = (snd d1)/(fst d2) in
- let ref_beam = ref (sublist output_beam1 0 (fst d2)) in
- for i = 1 to fois - 1 do
- let temp_beam = sublist output_beam1 (i*(fst d2)) (fst d2) in
- ref_beam := List.map2 signal_add (!ref_beam) temp_beam;
- done;
- !ref_beam
- )
- in
-
- (* evaluate the second expression *)
- if List.length input_beam2 = fst d2
- then eval e2 subtree2 input_beam2
- else raise (Evaluation_Error "Merge")
- )
- else raise (Evaluation_Error "Merge") in
-
-
-(** val interpret_rec : faust_exp -> faust_exp -> beam -> beam,
-interprets rec(e1, e2) with input beam, produces output beam.*)
-let interpret_rec = fun e1 -> fun e2 -> fun dimension_tree -> fun input_beam ->
-
- (* dimension information *)
- let subtree1 = subtree_left dimension_tree in
- let subtree2 = subtree_right dimension_tree in
- let d1 = get_root subtree1 in
- let d2 = get_root subtree2 in
-
- (* estimate stockage size for delay *)
- let delay_int = 1 + delay e2 + delay e1 in
-
- (* prepare stockage *)
- let memory_hashtbl = Hashtbl.create delay_int in
- let rate_list = ref (Array.to_list (Array.make (snd d1) 0)) in
-
- (** val apply_to : 'a -> ('a -> 'b) -> 'b *)
- let apply_to = fun t -> fun f -> f t in
-
- (** val get_value_fun_list : (int -> (int list) * (value list)) -> (int -> value) list *)
- let get_value_fun_list = fun beam_fun ->
- let tmp = fun beam_fun -> fun i -> fun t ->
- List.nth (snd (beam_fun t)) i in
- List.map (tmp beam_fun) (Array.to_list (Array.init (snd d1) (fun n -> n))) in
-
- (** val make_signal : int -> (int -> value) -> signal, combines rate and function. *)
- let make_signal = fun rate -> fun f -> (rate, f) in
-
- (** val output_beam_fun : int -> (int list) * (value list), with
- input : time
- output: rate list * value list *)
- let rec output_beam_fun = fun t ->
-
- (* initial value in constrctor "rec '~'" *)
- if t < 0 then
- let init_rate_list = Array.to_list (Array.make (snd d1) 0) in
- let value_list = Array.to_list (Array.make (snd d1) Zero) in
- (init_rate_list, value_list)
-
- (* check stockage at time t *)
- else if Hashtbl.mem memory_hashtbl t then
- (!rate_list, Hashtbl.find memory_hashtbl t)
-
- (* blocks : "a ~ b", calculate rate list and value list at time t *)
- else
- (* mid_output_fun_list : (int -> value) list *)
- let mid_output_fun_list = get_value_fun_list output_beam_fun in
-
- (* b_input_fun_list : (int -> value) list *)
- let b_input_fun_list = List.map
- (fun s -> fun t -> s (t - 1))
- (sublist mid_output_fun_list 0 (fst d2)) in
-
- (* b_input_beam : signal list *)
- let b_input_beam = List.map2 make_signal
- (sublist !rate_list 0 (fst d2))
- b_input_fun_list in
-
- (* evaluation of block "b" *)
- let b_output_beam = (eval e2 subtree2 b_input_beam) in
-
- (* evaluation of block "a" *)
- let a_input_beam = b_output_beam @ input_beam in
- let mid_output_beam = eval e1 subtree1 a_input_beam in
-
- (* calculate rate list and value list at time t *)
- let mid_output_rate_list = List.map fst mid_output_beam in
- let mid_output_value_list = List.map (apply_to t) (List.map snd mid_output_beam) in
-
- (* update stockage *)
- let () = (rate_list := mid_output_rate_list) in
- let () = Hashtbl.add memory_hashtbl t mid_output_value_list in
- let () = Hashtbl.remove memory_hashtbl (t - delay_int) in
- (mid_output_rate_list, mid_output_value_list) in
-
- (* output_beam : signal list *)
- let output_beam = List.map2 make_signal !rate_list (get_value_fun_list output_beam_fun) in
- output_beam in
-
-
- (** Call for previous functions *)
- match exp_faust with
- |Const v -> interpret_const v input_beam
- |Ident s -> interpret_ident s input_beam
- |Par (e1, e2) -> interpret_par e1 e2 dimension_tree input_beam
- |Seq (e1, e2) -> interpret_seq e1 e2 dimension_tree input_beam
- |Split (e1, e2) -> interpret_split e1 e2 dimension_tree input_beam
- |Merge (e1, e2) -> interpret_merge e1 e2 dimension_tree input_beam
- |Rec (e1, e2) -> interpret_rec e1 e2 dimension_tree input_beam;;
-
-
-(** val extract_rate : (int * (int -> value)) list -> int list,
-gets the sample rate list from beam.*)
-let extract_rate = fun beam ->
- let rate_naive_list = List.map fst beam in
- let correct_rate r =
- if r = 0 then 44100
- else if r > 0 then r
- else raise (Evaluation_Error "Rec2")
- in
- let rate_list = List.map correct_rate rate_naive_list in
- rate_list;;
-
-
-(** val interpreter : faust_exp -> (int list) * (float array list) ->
-(int list) * (int list) * (float array list)
-input: faust expression, sample rate list * input data list
-output: channel list * sample rate list * output data list.*)
-let interpreter exp_faust input =
- let () = print_string(" Faustine -> Interpretation...") in
- let tic = Sys.time () in
-
- (* make input beam *)
- let input_beam = make_beam input in
-
- (* estimate process dimension *)
- let dimension_tree = dim exp_faust in
-
- (* interprete output beam *)
- let output_beam = eval exp_faust dimension_tree input_beam in
- let toc = Sys.time () in
- let () = print_endline(" Done. (duration: " ^ (string_of_float (toc -. tic)) ^ "s)") in
-
- (* get rate list from output beam *)
- let rate_list = extract_rate output_beam in
-
- (* get channel list and data list from output beam *)
- let (channel_list, float_array_list) = compute (List.map snd output_beam) in
- (channel_list, rate_list, float_array_list);;
-
-{open Parser}
+{
+open Parser
+open Types
+}
rule token = parse
- [' ' '\t' '\n' ] { token lexbuf }
-| ['a'-'z' 'A'-'Z']+ as x { IDENT x }
-| ['+' '*' '-' '/' '!' '_' '#'
- '@' '<' '>' '%'] as x { IDENT (String.make 1 x) }
-| "[]" { IDENT "[]" }
-| ['0'-'9']+ as a { CONST a }
-| '.' { POINT }
-| '(' { LPAR }
-| ')' { RPAR }
-| ',' { PAR }
-| ':' { SEQ }
-| "<:" { SPLIT }
-| ":>" { MERGE }
-| "~" { REC }
-| eof { EOF }
+ [' ' '\t' '\n' ] { token lexbuf }
+
+| "+" { IDENT Add}
+| "-" { IDENT Sub}
+| "*" { IDENT Mul}
+| "/" { IDENT Div}
+| "_" { IDENT Pass}
+| "!" { IDENT Stop}
+| "mem" { IDENT Mem}
+| "@" { IDENT Delay}
+| "floor" { IDENT Floor}
+| "int" { IDENT Int}
+| "sin" { IDENT Sin}
+| "cos" { IDENT Cos}
+| "atan" { IDENT Atan}
+| "atantwo" { IDENT Atan2}
+| "sqrt" { IDENT Sqrt}
+| "rdtable" { IDENT Rdtable}
+| "%" { IDENT Mod}
+| "vectorize" { IDENT Vectorize}
+| "#" { IDENT Vconcat}
+| "[]" { IDENT Vpick }
+| "serialize" { IDENT Serialize}
+| ">" { IDENT Larger}
+| "<" { IDENT Smaller}
+| "prefix" { IDENT Prefix}
+| "selecttwo" { IDENT Select2}
+| "selectthree" { IDENT Select3}
+
+
+| ['0'-'9']+ as a { CONST a }
+| '.' { POINT }
+
+
+| '(' { LPAR }
+| ')' { RPAR }
+| ',' { PAR }
+| ':' { SEQ }
+| "<:" { SPLIT }
+| ":>" { MERGE }
+| "~" { REC }
+| eof { EOF }
Module: Interpreter
Description: Input wave -> interpretation -> output wave
@author WANG Haisheng
- Created: 15/05/2013 Modified: 04/06/2013
+ Created: 15/05/2013 Modified: 14/08/2013
*)
-open Faustexp;;
-open Interpreter;;
+open Aux;;
+open Process;;
+open Faustio;;
-(* EXCEPTIONS *)
-
-(** Exception raised when no string expression of faust process is typed in console.*)
exception Missing_Expression;;
+let version = "Faustine: 0.0.1";;
-
-(* MACRO *)
-
-(** Macro constants of input/output route.*)
-type io_macro =
- | Input_Route_string
- | Output_Route_string
- | Dsp_Route_string;;
-
-(** val io_macro_to_string : io_macro -> string.*)
-let io_macro_to_string m = match m with
- | Input_Route_string -> ""
- | Output_Route_string -> "../output_sounds/"
- | Dsp_Route_string -> "";;
-
-
-(** val set_GC : unit -> unit *)
let set_GC () =
- let _ = Gc.set { (Gc.get()) with Gc.minor_heap_size = 0xFFFFFF } in
- let _ = Gc.set { (Gc.get()) with Gc.major_heap_increment = 0xFFFFFF } in
- let _ = Gc.set { (Gc.get()) with Gc.space_overhead = 100 } in
- let _ = Gc.set { (Gc.get()) with Gc.max_overhead = 0xFFFFF } in
- let _ = Gc.set { (Gc.get()) with Gc.stack_limit = 0xFFFFF } in
- let _ = Gc.set { (Gc.get()) with Gc.allocation_policy = 0 } in
+ let _ = Gc.set { (Gc.get())
+ with Gc.minor_heap_size = 0xFFFFFF } in
+ let _ = Gc.set { (Gc.get())
+ with Gc.major_heap_increment = 0xFFFFFF } in
+ let _ = Gc.set { (Gc.get())
+ with Gc.space_overhead = 100 } in
+ let _ = Gc.set { (Gc.get())
+ with Gc.max_overhead = 0xFFFFF } in
+ let _ = Gc.set { (Gc.get())
+ with Gc.stack_limit = 0xFFFFF } in
+ let _ = Gc.set { (Gc.get())
+ with Gc.allocation_policy = 0 } in
() ;;
-(* INPUT && OUTPUT*)
-
-(** val read_input_wave : string array -> int list * float array list
- [read_input_wave argv] gets information from command line,
- returns sample rate list and data (in form of float array) list.
-*)
-let read_input_wave = fun argv ->
- let n_input = (Array.length argv) - 4 in
- if n_input < 0 then
- raise Missing_Expression
- else if n_input = 0 then
- ([], [])
- else
- (* open wave file *)
- let file_string_array = Array.sub argv 4 n_input in
- let make_chemin s = io_macro_to_string Input_Route_string ^ s in
- let file_chemin_string_array = Array.map make_chemin file_string_array in
- let file_array = Array.map Sndfile.openfile file_chemin_string_array in
- let file_list = Array.to_list file_array in
-
- (* prepare data container *)
- let frames_array = Array.map Int64.to_int (Array.map Sndfile.frames file_array) in
- let create_data_array num = Array.create num 1. in
- let data_float_array_array = Array.map create_data_array frames_array in
- let data_float_array_list = Array.to_list data_float_array_array in
-
- (* read sample rates and data *)
- let rate_list = List.map Sndfile.samplerate file_list in
- let _ = List.map2 Sndfile.read file_list data_float_array_list in
- let _ = List.map Sndfile.close file_list in
- (rate_list, data_float_array_list);;
-
-
-(** val write_output_wave : int list -> int list -> float_array_list -> unit.
- [write_output_wave channel_numbers sample_rates data]
-*)
-let write_output_wave = fun channel_int_list -> fun rate_int_list -> fun data_float_array_list ->
- let () = print_string(" Faustine -> Writing wave files...") in
- let tic = Sys.time () in
-
- (* make output wave file names : output0, output1, ... *)
- let n_output = List.length data_float_array_list in
- let n_array = Array.init n_output (fun n -> n) in
- let make_file_name i = "output" ^ (string_of_int i) ^ ".wav" in
-
- (* make output wave file routes *)
- let make_chemin s = io_macro_to_string Output_Route_string ^ s in
- let file_name_string_array = Array.map make_file_name n_array in
- let file_chemin_string_array = Array.map make_chemin file_name_string_array in
- let file_chemin_string_list = Array.to_list file_chemin_string_array in
-
- (* open files for writing with respects to channel numbers and sample rates *)
- let file_format = Sndfile.format Sndfile.MAJOR_WAV Sndfile.MINOR_PCM_16 in
- let openwr = fun file_chemin_string -> fun channel -> fun rate ->
- Sndfile.openfile ~info:(Sndfile.RDWR, file_format, channel, rate) file_chemin_string in
- let openwr_fun_list = fun fl -> fun cl -> fun rl -> fun i ->
- openwr (List.nth fl i) (List.nth cl i) (List.nth rl i) in
- let output_file_list = List.map
- (openwr_fun_list file_chemin_string_list channel_int_list rate_int_list)
- (Array.to_list (Array.init n_output (fun n -> n))) in
-
- (* write data into files *)
- let _ = List.map2 Sndfile.write output_file_list data_float_array_list in
- let _ = List.map Sndfile.close output_file_list in
- let toc = Sys.time () in
- print_endline(" Done. (duration: " ^ (string_of_float (toc -. tic)) ^ "s)");;
-
-
-let csvread = fun (ic : in_channel) ->
- let string_list = ref [] in
- try
- while true do
- string_list := !string_list @ [(input_line ic)]
- done;
- [||]
- with End_of_file ->
- (*let () = print_endline(List.nth !string_list 0) in*)
- Array.of_list (List.map float_of_string !string_list);;
-
-let read_input_csv = fun argv ->
- let n_input = (Array.length argv) - 4 in
- if n_input < 0 then
- raise Missing_Expression
- else if n_input = 0 then
- ([], [])
- else
- (* open csv file *)
- let file_string_array = Array.sub argv 4 n_input in
- let make_chemin s = io_macro_to_string Input_Route_string ^ s in
- let file_chemin_string_array = Array.map make_chemin file_string_array in
- let file_array = Array.map open_in file_chemin_string_array in
- let file_list = Array.to_list file_array in
-
- (* read sample rates and data *)
- let rate_list = Array.to_list (Array.create n_input 0) in
- let data_float_array_list = List.map csvread file_list in
- let _ = List.map close_in file_list in
- (rate_list, data_float_array_list);;
-
-
-let write_output_csv = fun channel_int_list -> fun data_float_array_list ->
- let () = print_string(" Faustine -> Writing csv files...") in
- let tic = Sys.time () in
-
- (* make output txt file names : output0, output1, ... *)
- let n_output = List.length data_float_array_list in
- let n_array = Array.init n_output (fun n -> n) in
- let make_file_name i = "output" ^ (string_of_int i) ^ ".csv" in
-
- (* make output wave file routes *)
- let make_chemin s = io_macro_to_string Output_Route_string ^ s in
- let file_name_string_array = Array.map make_file_name n_array in
- let file_chemin_string_array = Array.map make_chemin file_name_string_array in
- let file_chemin_string_list = Array.to_list file_chemin_string_array in
-
- (* open output channels *)
- let file_list = List.map open_out file_chemin_string_list in
- let data_string_array_list = List.map (Array.map string_of_float) data_float_array_list in
- let array_to_string = fun data_string_array -> fun channel_int ->
- let data_length = Array.length data_string_array in
- let rec to_string_rec =
- fun data -> fun channel -> fun n -> fun i -> fun column ->
- if i < n then
- (
- let element = data.(i) in
- if column < (channel - 1) then
- element ^ "," ^ (to_string_rec data channel n (i + 1) (column + 1))
- else if column = (channel - 1) then
- element ^ "\n" ^ (to_string_rec data channel n (i + 1) 0)
- else raise (Invalid_argument "write_output_txt.")
- )
- else "" in
- to_string_rec data_string_array channel_int data_length 0 0 in
-
- let data_string_list = List.map2 array_to_string data_string_array_list channel_int_list in
- let _ = List.map2 output_string file_list data_string_list in
- let _ = List.map close_out file_list in
- let toc = Sys.time () in
- print_endline(" Done. (duration: " ^ (string_of_float (toc -. tic)) ^ "s)");;
-
-
-let read_input = fun option_in -> fun argv ->
- if option_in = "-wav" then
- read_input_wave argv
- else if option_in = "-csv" then
- read_input_csv argv
- else raise (Invalid_argument ("Unkown option: " ^ option_in));;
-
-
-(* MAIN *)
-
-(** val main : unit -> unit
-main function reads console input strings (Sys.argv) with
-input: string of faust process, input waves in default directory 'input_sounds/'
-output: output waves in default directory 'output_sounds/'.*)
+let path_dsp = ref "";;
+let size_input = ref 0;;
+let inputs = ref [];;
+let time_max = ref 0xFFFF;;
+let dir_output = ref "../output_sounds/";;
+let format_output = ref "wav";;
+let basename_output = ref "output";;
+
+let option_usage = "usage: " ^ Sys.argv.(0)
+ ^ " [-d dsp_src] [-i input] [-t time] [--odir dir] [--oformat wav/csv] [--obasename name]";;
+
+let option_unknown =
+ fun x -> raise (Arg.Bad ("Bad argument : " ^ x))
+
+let speclist = [
+ ("-d", Arg.String (fun s -> path_dsp := s), ": set dsp source file");
+ ("-i", Arg.String (fun s -> incr size_input; inputs := !inputs @ [s]), ": set input wave file");
+ ("-t", Arg.Int (fun i -> time_max := i), ": set max output length");
+ ("--odir", Arg.String (fun s -> dir_output := s), ": set output directory");
+ ("--oformat", Arg.String (fun s -> format_output := s), ": set output format");
+ ("--obasename", Arg.String (fun s -> basename_output := s), ": set output basename");
+ ];;
+
let main () =
- (* ignore system alarm clock *)
+ let () = Arg.parse speclist option_unknown option_usage in
let _ = Sys.signal Sys.sigalrm Sys.Signal_ignore in
-
- (* set garbage collector *)
let _ = set_GC () in
+ let io = new iomanager in
+ let () = io#set !dir_output !format_output !basename_output in
+
+
+ let () = print_string(" Faustine -> Reading input ...") in
+ let tic0 = Sys.time () in
+ let input = io#read !inputs in
+ let toc0 = Sys.time () in
+ let () = print_endline(" Done. (duration: " ^ (string_of_float (toc0 -. tic0)) ^ "s.)") in
+
+
+ let () = print_string(" Faustine -> Preprocessing...") in
+ let tic1 = Sys.time () in
+ let faust_core = Preprocess.preprocess !path_dsp in
+ let toc1 = Sys.time () in
+ let () = print_endline(" Done. (duration: " ^ (string_of_float (toc1 -. tic1)) ^ "s.)") in
+
- (* select output type *)
- let option_in = Sys.argv.(1) in
- let option_out = Sys.argv.(2) in
+ let () = print_string(" Faustine -> Constructing process...") in
+ let tic2 = Sys.time () in
+ let faust_exp = exp_of_string faust_core in
+ let proc = (new proc_factory)#make faust_exp in
+ let toc2 = Sys.time () in
+ let () = print_endline(" Done. (duration: " ^ (string_of_float (toc2 -. tic2)) ^ "s.)") in
- (* read input wave files *)
- let (input_rate_list, input_float_array_list) = read_input option_in Sys.argv in
+ let () = print_string(" Faustine -> Evaluating...") in
+ let tic3 = Sys.time () in
+ let output = proc#eval input in
+ let toc3 = Sys.time () in
+ let () = print_endline(" Done. (duration: " ^ (string_of_float (toc3 -. tic3)) ^ "s.)") in
- try
- (* preprocess *)
- let dsp_file_route_string = (io_macro_to_string Dsp_Route_string) ^ Sys.argv.(3) in
- let () = print_string(" Faustine -> Preprocessing...") in
- let tic = Sys.time () in
- let exp_string = Preprocess.preprocess(dsp_file_route_string) in
- let toc = Sys.time () in
- let () = print_endline(" Done. (duration: " ^
- (string_of_float (toc -. tic)) ^ "s)") in
- (* parsing *)
- let exp_faust = exp_of_string exp_string in
+ let () = print_string(" Faustine -> Calculating...") in
+ let tic4 = Sys.time () in
+ let data = output#output !time_max in
+ let rates = output#frequency in
+ let toc4 = Sys.time () in
+ let () = print_endline(" Done. (duration: " ^ (string_of_float (toc4 -. tic4)) ^ "s.)") in
- (* interpretation *)
- let (output_channel_list, output_rate_list, output_float_array_list) =
- interpreter exp_faust (input_rate_list, input_float_array_list) in
- (* make output wave files *)
- if option_out = "-wav" then
- write_output_wave output_channel_list output_rate_list output_float_array_list
- else if option_out = "-csv" then
- write_output_csv output_channel_list output_float_array_list
- else raise (Invalid_argument ("Unkown option: " ^ option_out))
+ let () = print_string(" Faustine -> Writing output...") in
+ let tic5 = Sys.time () in
+ let output_paths = io#write rates data in
+ let toc5 = Sys.time () in
+ let () = print_endline(" Done. (duration: " ^ (string_of_float (toc5 -. tic5)) ^ "s.)") in
- with NotYetDone ->
- print_endline("Operation not yet programed..");;
+ let _ = Array.map print_endline
+ (Array.map decorate output_paths) in
+ ();;
main();;
%}
%token <string> CONST
-%token <string> IDENT
+%token <Types.symbol> IDENT
%token LPAR RPAR SEQ SPLIT MERGE PAR REC EOF POINT
%right SPLIT MERGE
%right SEQ
faust_exp: CONST { Const(N (int_of_string $1)) }
| CONST POINT { Const(R (float_of_string $1)) }
| CONST POINT CONST { Const(R (float_of_string ($1 ^ "." ^ $3))) }
- | IDENT { Ident(symbol_of_string $1) }
+ | IDENT { Ident($1) }
| LPAR faust_exp RPAR { $2 }
| faust_exp PAR faust_exp { Par($1,$3) }
| faust_exp SPLIT faust_exp { Split($1,$3) }
--- /dev/null
+(**
+ Module: Process
+ Description: Faust process classes
+ @author WANG Haisheng
+ Created: 03/06/2013 Modified: 14/08/2013
+*)
+
+open Types;;
+open Aux;;
+open Basic;;
+open Symbol;;
+open Value;;
+open Signal;;
+open Beam;;
+
+exception NotYetDone;;
+exception Dimension_error of string;;
+exception Process_error of string;;
+
+
+(* PARSER *)
+
+let exp_of_string s = (Parser.main Lexer.token (Lexing.from_string s));;
+
+
+class dimension : int * int -> dimension_type =
+ fun (init : int * int) ->
+ object (self)
+ val _input = fst init
+ val _output = snd init
+
+ method input = _input
+ method output = _output
+
+ method par : dimension_type -> dimension_type =
+ fun dim ->
+ new dimension
+ ((self#input + dim#input), (self#output + dim#output))
+
+ method seq : dimension_type -> dimension_type =
+ fun dim ->
+ if self#output = dim#input then
+ new dimension (self#input, dim#output)
+ else raise (Dimension_error "seq dimension not matched.")
+
+ method split : dimension_type -> dimension_type =
+ fun dim ->
+ if dim#input mod self#output = 0 then
+ new dimension (self#input, dim#output)
+ else raise (Dimension_error "split dimension not matched.")
+
+ method merge : dimension_type -> dimension_type =
+ fun dim ->
+ if self#output mod dim#input = 0 then
+ new dimension (self#input, dim#output)
+ else raise (Dimension_error "merge dimension not matched.")
+
+ method _rec : dimension_type -> dimension_type =
+ fun dim ->
+ if self#output >= dim#input && self#input >= dim#output then
+ new dimension (self#input - dim#output, self#output)
+ else raise (Dimension_error "rec dimension not matched.")
+ end;;
+
+class virtual process =
+ fun (exp_init : faust_exp) ->
+ object
+ val _exp = exp_init
+ val virtual _dim : dimension_type
+ val virtual _delay : int
+ method exp = _exp
+ method dim = _dim
+ method delay = _delay
+ method virtual eval : beam_type -> beam_type
+ end
+
+class proc_const : faust_exp -> process_type =
+ fun (exp_init : faust_exp) ->
+ let _const =
+ match exp_init with
+ | Const b -> b
+ | _ -> raise (Process_error "const process constructor.") in
+
+ object (self)
+ inherit process exp_init
+ val _dim = new dimension (0,1)
+ val _delay = 0
+ method private const = _const
+ method eval : beam_type -> beam_type =
+ fun (input : beam_type) ->
+ if input#get = [||] then
+ new beam [| new signal 0 (fun t -> new value self#const)|]
+ else
+ raise (Process_error "proc_const accepts no input.")
+ end;;
+
+
+class proc_ident : faust_exp -> process_type =
+ fun (exp_init : faust_exp) ->
+ let _symbol =
+ match exp_init with
+ | Ident s -> s
+ | _ -> raise (Process_error "ident process constructor.") in
+
+ object (self)
+ inherit process exp_init
+ val _dim = new dimension (dimension_of_symbol _symbol)
+ val _delay = delay_of_symbol _symbol
+ method private symb = _symbol
+
+ method private beam_of_ident : int -> signal_type -> beam_type =
+ fun (n : int) ->
+ fun (s : signal_type) ->
+ if n = (self#dim)#input then
+ new beam [|s|]
+ else raise (Process_error ("Ident " ^ string_of_symbol self#symb))
+
+ method eval : beam_type -> beam_type =
+ fun (input : beam_type) ->
+ let n = Array.length input#get in
+ match self#symb with
+ | Pass -> self#beam_of_ident n input#get.(0)
+ | Stop -> if n = 1 then new beam [||]
+ else raise (Process_error "Ident !")
+ | Add -> self#beam_of_ident n
+ ((input#get.(0))#add input#get.(1))
+ | Sub -> self#beam_of_ident n
+ ((input#get.(0))#sub input#get.(1))
+ | Mul -> self#beam_of_ident n
+ ((input#get.(0))#mul input#get.(1))
+ | Div -> self#beam_of_ident n
+ ((input#get.(0))#div input#get.(1))
+ | Mem -> self#beam_of_ident n
+ ((input#get.(0))#mem)
+ | Delay -> self#beam_of_ident n
+ ((input#get.(0))#delay input#get.(1))
+ | Floor -> self#beam_of_ident n
+ ((input#get.(0))#floor)
+ | Int -> self#beam_of_ident n
+ ((input#get.(0))#int)
+ | Sin -> self#beam_of_ident n
+ ((input#get.(0))#sin)
+ | Cos -> self#beam_of_ident n
+ ((input#get.(0))#cos)
+ | Atan -> self#beam_of_ident n
+ ((input#get.(0))#atan)
+ | Atan2 -> self#beam_of_ident n
+ ((input#get.(0))#atan2 input#get.(1))
+ | Sqrt -> self#beam_of_ident n
+ ((input#get.(0))#sqrt)
+ | Rdtable -> self#beam_of_ident n
+ ((input#get.(1))#rdtable input#get.(0) input#get.(2))
+ | Mod -> self#beam_of_ident n
+ ((input#get.(0))#_mod input#get.(1))
+ | Vectorize -> self#beam_of_ident n
+ ((input#get.(0))#vectorize input#get.(1))
+ | Vconcat -> self#beam_of_ident n
+ ((input#get.(0))#vconcat input#get.(1))
+ | Vpick -> self#beam_of_ident n
+ ((input#get.(0))#vpick input#get.(1))
+ | Serialize -> self#beam_of_ident n
+ (input#get.(0))#serialize
+ | Larger -> self#beam_of_ident n
+ ((input#get.(0))#larger input#get.(1))
+ | Smaller -> self#beam_of_ident n
+ ((input#get.(0))#smaller input#get.(1))
+ | Prefix -> self#beam_of_ident n
+ ((input#get.(1))#prefix input#get.(0))
+ | Select2 -> self#beam_of_ident n
+ ((input#get.(0))#select2 input#get.(1) input#get.(2))
+ | Select3 -> self#beam_of_ident n
+ ((input#get.(0))#select3 input#get.(1)
+ input#get.(2) input#get.(3))
+ end;;
+
+class virtual process_binary =
+ fun (exp_init : faust_exp) ->
+ let (exp_left, exp_right) =
+ match exp_init with
+ | Par (e1, e2) -> (e1, e2)
+ | Seq (e1, e2) -> (e1, e2)
+ | Split (e1, e2) -> (e1, e2)
+ | Merge (e1, e2) -> (e1, e2)
+ | Rec (e1, e2) -> (e1, e2)
+ | _ -> raise (Process_error "binary process constructor.") in
+ let proc_left = (new proc_factory)#make exp_left in
+ let proc_right = (new proc_factory)#make exp_right in
+
+ object
+ inherit process exp_init
+ method private proc_left = proc_left
+ method private proc_right = proc_right
+
+ val _dim =
+ match exp_init with
+ | Par (e1, e2) -> (proc_left#dim)#par proc_right#dim
+ | Seq (e1, e2) -> (proc_left#dim)#seq proc_right#dim
+ | Split (e1, e2) -> (proc_left#dim)#split proc_right#dim
+ | Merge (e1, e2) -> (proc_left#dim)#merge proc_right#dim
+ | Rec (e1, e2) -> (proc_left#dim)#_rec proc_right#dim
+ | _ -> raise (Process_error "binary process constructor.")
+
+ val _delay =
+ match exp_init with
+ | Par (e1, e2) -> max proc_left#delay proc_right#delay
+ | Seq (e1, e2) -> proc_left#delay + proc_right#delay
+ | Split (e1, e2) -> proc_left#delay + proc_right#delay
+ | Merge (e1, e2) -> proc_left#delay + proc_right#delay
+ | Rec (e1, e2) -> 1 + proc_left#delay + proc_right#delay
+ | _ -> raise (Process_error "binary process constructor.")
+ end
+
+and proc_par : faust_exp -> process_type =
+ fun (exp_init : faust_exp) ->
+ object (self)
+ inherit process_binary exp_init
+ method eval : beam_type -> beam_type =
+ fun (input : beam_type) ->
+ let (sub_input1, sub_input2) = input#cut self#proc_left#dim#input in
+ let sub_output1 = self#proc_left#eval sub_input1 in
+ let sub_output2 = self#proc_right#eval sub_input2 in
+ sub_output1#append sub_output2
+ end
+
+and proc_split : faust_exp -> process_type =
+ fun (exp_init : faust_exp) ->
+ object (self)
+ inherit process_binary exp_init
+ method eval : beam_type -> beam_type =
+ fun (input : beam_type) ->
+ let mid_output = self#proc_left#eval input in
+ let mid_input = mid_output#matching self#proc_right#dim#input in
+ self#proc_right#eval mid_input
+ end
+
+and proc_merge : faust_exp -> process_type =
+ fun (exp_init : faust_exp) ->
+ object (self)
+ inherit process_binary exp_init
+ method eval : beam_type -> beam_type =
+ fun (input : beam_type) ->
+ let mid_output = self#proc_left#eval input in
+ let mid_input = mid_output#matching self#proc_right#dim#input in
+ self#proc_right#eval mid_input
+ end
+
+and proc_seq : faust_exp -> process_type =
+ fun (exp_init : faust_exp) ->
+ object (self)
+ inherit process_binary exp_init
+ method eval : beam_type -> beam_type =
+ fun (input : beam_type) ->
+ let mid_output = self#proc_left#eval input in
+ self#proc_right#eval mid_output
+ end
+
+and proc_rec : faust_exp -> process_type =
+ fun (exp_init : faust_exp) ->
+ object (self)
+ inherit process_binary exp_init
+ method eval : beam_type -> beam_type =
+ fun (input : beam_type) ->
+ let memory = Hashtbl.create self#delay in
+ let rates = ref (Array.make self#dim#output 0) in
+
+ let split : (time -> value_type array) -> (time -> value_type) array =
+ fun beam_at ->
+ let get_signal =
+ fun beam_func -> fun i -> fun t ->
+ (beam_func t).(i) in
+ Array.init self#dim#output (get_signal beam_at) in
+
+ let feedback : (time -> value_type array) -> beam =
+ fun beam_at ->
+ let signals_at = split beam_at in
+ let delay_by_one = fun s -> fun t -> s (t - 1) in
+ let delay_signal_funcs = Array.map delay_by_one
+ (Array.sub signals_at 0 self#proc_right#dim#input) in
+ new beam (array_map2 (new signal)
+ (Array.sub !rates 0 self#proc_right#dim#input)
+ delay_signal_funcs) in
+
+ let rec beam_at : time -> value_type array =
+ fun (t : time) ->
+ if t < 0 then
+ Array.make self#dim#output (new value Zero)
+ else if Hashtbl.mem memory t then
+ Hashtbl.find memory t
+ else
+ let beam_fb_in = feedback beam_at in
+ let beam_fb_out = self#proc_right#eval beam_fb_in in
+ let beam_in = beam_fb_out#append input in
+ let beam_out = self#proc_left#eval beam_in in
+ let values = beam_out#at t in
+ let () = (rates := beam_out#frequency) in
+ let () = Hashtbl.add memory t values in
+ let () = if t - self#delay >= 0 then
+ Hashtbl.remove memory (t - self#delay) else () in
+ values in
+ new beam (array_map2 (new signal) !rates (split beam_at))
+ end
+
+and proc_factory =
+ object
+ method make : faust_exp -> process_type =
+ fun (exp : faust_exp) ->
+ match exp with
+ | Const b -> new proc_const exp
+ | Ident s -> new proc_ident exp
+ | Par (e1, e2) -> new proc_par exp
+ | Seq (e1, e2) -> new proc_seq exp
+ | Split (e1, e2) -> new proc_split exp
+ | Merge (e1, e2) -> new proc_merge exp
+ | Rec (e1, e2) -> new proc_rec exp
+ end;;
(**
Module: Signal
- Description: type signal = rate * (int -> value), operations of signals.
+ Description: signal definition and operations.
@author WANG Haisheng
Created: 03/06/2013 Modified: 03/06/2013
*)
open Types;;
+open Basic;;
open Value;;
-(* EXCEPTIONS *)
-
-(** Exception raised in operations of signals.*)
exception Signal_operation of string;;
-
-
-(* MACRO *)
-
-(** Macro constants of the file.*)
-type signal_macro = Delay_Memory_Length_int;;
-
-
-(** val signal_macro_to_int : signal_macro -> int.*)
-let signal_macro_to_int m = match m with
- |Delay_Memory_Length_int -> 10000;;
-
-
-(* SIGNAL OPERATIONS *)
-
-(** val frequency : signal -> int, returns the frequency of a signal.*)
-let frequency s = fst s;;
-
-
-(** val signal_fun : signal -> (int -> value), returns the functional part of a signal.*)
-let signal_fun s = snd s;;
-
-
-(** val check_frequency : int -> int -> int, returns the correction of frequency.*)
-let check_frequency = fun f1 -> fun f2 ->
- if f1 = f2 || f2 = 0 then f1
- else if f1 = 0 then f2
- else raise (Signal_operation "frequency not matched.");;
-
-(** val signal_check_frequency : signal -> signal -> int,
-checks the frequencies of two input signals, and returns common frequency or raise an exception.*)
-let signal_check_frequency = fun s1 -> fun s2 ->
- let f1 = frequency s1 in
- let f2 = frequency s2 in
- check_frequency f1 f2;;
-
-
-(** val signal_check_frequency3 : signal -> signal -> signal -> int,
-checks the frequencies of three input signal, and returns common frequency or raise an exception.*)
-let signal_check_frequency3 = fun s1 -> fun s2 -> fun s3 ->
- let f1 = signal_check_frequency s1 s2 in
- let f2 = signal_check_frequency s1 s3 in
- check_frequency f1 f2;;
-
-
-(** val signal_check_frequency4 : signal -> signal -> signal -> signal -> int,
-checks the frequencies of three input signal, and returns common frequency or raise an exception.*)
-let signal_check_frequency4 = fun s1 -> fun s2 -> fun s3 -> fun s4 ->
- let f1 = signal_check_frequency s1 s2 in
- let f2 = signal_check_frequency s3 s4 in
- check_frequency f1 f2;;
-
-
-(** val signal_add_one_memory : signal -> signal,
-returns the signal with memory of one latest sample.*)
-let signal_add_one_memory = fun s ->
- let new_signal = factory_add_memory (signal_fun s) 1 in
- (frequency s, new_signal);;
-
-
-(** val beam_add_one_memory : signal list -> signal list,
-adds memory of one latest sample for each element in signal list.*)
-let beam_add_one_memory = fun beam ->
- List.map signal_add_one_memory beam;;
-
-
-(** val signal_add : signal -> signal -> signal, output(t) = input1(t) + input2(t),
- frequency consistent.*)
-let signal_add s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t -> ((signal_fun s1) t) +~ ((signal_fun s2) t) in
- (f, new_signal);;
-
-
-(** val signal_neg : signal -> signal, output(t) = -input(t), frequency consistent.*)
-let signal_neg s =
- let new_signal = fun t -> v_neg ((signal_fun s) t) in
- (frequency s, new_signal);;
-
-
-(** val signal_sub : signal -> signal -> signal, output(t) = input1(t) - input2(t),
- frequency consistent.*)
-let signal_sub s1 s2 = signal_add s1 (signal_neg s2);;
-
-
-(** val signal_mul : signal -> signal -> signal, output(t) = input1(t) * input2(t),
- frequency consistent.*)
-let signal_mul s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t -> ((signal_fun s1) t) *~ ((signal_fun s2) t) in
- (f, new_signal);;
-
-
-(** val signal_div : signal -> signal -> signal, output(t) = input1(t) / input2(t),
- frequency consistent.*)
-let signal_div s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t -> ((signal_fun s1) t) /~ ((signal_fun s2) t) in
- (f, new_signal);;
-
-
-(** val signal_delay : signal -> signal -> signal, output(t) = input1(t - input2(t)),
- Attention: delay dynamic, frequency of output signal equals to that of first input signal.*)
-let signal_delay s1 s2 =
- let s1_mem = factory_add_memory (signal_fun s1)
- (signal_macro_to_int Delay_Memory_Length_int) in
- let new_signal = fun t ->
- let delay = (signal_fun s2) t in
- match delay with
- |N i -> if i < 0 then raise (Signal_operation "Delay time < 0.")
- else if (t - i) >= 0 then s1_mem (t - i)
- else v_zero (s1_mem 0)
- |R f -> let i = int_of_float f in
- if i < 0 then raise (Signal_operation "Delay time < 0.")
- else if (t - i) >= 0 then s1_mem (t - i)
- else v_zero (s1_mem 0)
- |Vec (size, vec) -> raise (Signal_operation "Delay time can not be a vector.")
- |Zero -> s1_mem t
- |W -> raise (Signal_operation "Delay time error.")
- in
- (frequency s1, new_signal);;
-
-
-(** val signal_mem : signal -> signal, equivalent to signal_delay with constant delay 1.*)
-let signal_mem s = signal_delay s (1, (fun t -> N 1));;
-
-
-(** val signal_vectorize : signal -> signal -> signal, output(t)(i) = input1(input2(0) * t + i),
-Attention: vector size n static, frequency of output signal is (1/n * frequency of input1)*)
-let signal_vectorize s1 s2 =
- let size = (signal_fun s2) 0 in
- match size with
- |N size_int ->
- (
- let new_signal = fun t ->
- make_vector size_int (fun i -> (signal_fun s1) (size_int * t + i)) in
- let new_frequency = (frequency s1) / size_int in
- (new_frequency, new_signal)
- )
- |_ -> raise (Signal_operation "Vectorize: vector size should be int.");;
-
-
-(** val signal_serialize : signal -> signal, output(t) = input(floor(t/n))(t%n),
- with n = size of input(0).
- Attention: input size unknown in the cas of "rec".*)
-let signal_serialize s =
- let temp0 = (signal_fun s) 0 in
- match temp0 with
- |Vec (size0, vec0) ->
- let new_signal = fun t ->
- (
- let temp = (signal_fun s) (t/size0) in
- match temp with
- |Vec (size, vec) ->
- if size = size0 then
- vec (t mod size)
- else
- raise (Signal_operation "Serialize: vector length not consistent.")
- |_ -> raise (Signal_operation "Serialize: signal type not consistent.")
- )
- in
- let new_frequency = (frequency s) * size0 in
- (new_frequency, new_signal)
- |_ -> raise (Signal_operation "Serialize: input signal should be vector.");;
-
-
-(** val signal_append : signal -> signal -> signal, symbol "#",
- appends vectors of the two input signals at each time, frequency consistent.*)
-let signal_append s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t ->
- let temp1 = (signal_fun s1) t in
- let temp2 = (signal_fun s2) t in
- match (temp1, temp2) with
- |(Vec (size1, vec1), Vec (size2, vec2)) ->
- let new_vec = fun i -> if i < size1 then vec1 i else vec2 (i - size1) in
- make_vector (size1 + size2) new_vec
- |_ -> raise (Signal_operation "Append: input signals should be vectors.")
- in
- (f, new_signal);;
-
-
-(** val signal_nth : signal -> signal -> signal, symbol "[]", output(t) = input1(t)(input2(t)),
- frequency consistent. Attention: selection index dynamic.*)
-let signal_nth s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t ->
- let temp1 = (signal_fun s1) t in
- let temp2 = (signal_fun s2) t in
- match temp1 with
- |Vec (size1, vec1) ->
- (
- match temp2 with
- |N i -> vec1 i
- |R f ->
- raise (Signal_operation "Get: second input signal should be int.")
- |Vec (size2, vec2) ->
- raise (Signal_operation "Get: second input signal should be int.")
- |Zero -> vec1 0
- |W ->
- raise (Signal_operation "Get: second input signal should be int.")
- )
- |_ -> raise (Signal_operation "Get: first input signal should be vector.")
- in
- (f, new_signal);;
-
-
-(** val signal_floor : signal -> signal, output(t) = v_floor(input(t)), frequency consistent.*)
-let signal_floor s =
- let new_signal = fun t -> v_floor ((signal_fun s) t) in
- (frequency s, new_signal);;
-
-
-(** val signal_int : signal -> signal, output(t) = v_int(input(t)), frequency consistent.*)
-let signal_int s =
- let new_signal = fun t -> v_int ((signal_fun s) t) in
- (frequency s, new_signal);;
-
-
-(** val signal_sin : signal -> signal, output(t) = v_sin(input(t)), frequency consistent.*)
-let signal_sin s =
- let new_signal = fun t -> v_sin ((signal_fun s) t) in
- (frequency s, new_signal);;
-
-
-(** val signal_cos : signal -> signal, output(t) = v_cos(input(t)), frequency consistent.*)
-let signal_cos s =
- let new_signal = fun t -> v_cos ((signal_fun s) t) in
- (frequency s, new_signal);;
-
-
-(** val signal_atan : signal -> signal, output(t) = v_atan(input(t)), frequency consistent.*)
-let signal_atan s =
- let new_signal = fun t -> v_atan ((signal_fun s) t) in
- (frequency s, new_signal);;
-
-
-let signal_atantwo s1 s2 =
- let new_signal = fun t -> v_atantwo ((signal_fun s1) t) ((signal_fun s2) t) in
- (frequency s1, new_signal);;
-
-
-(** val signal_sqrt : signal -> signal, output(t) = v_sqrt(input(t)), frequency consistent.*)
-let signal_sqrt s =
- let new_signal = fun t -> v_sqrt ((signal_fun s) t) in
- (frequency s, new_signal);;
-
-
-(** val signal_rdtable : signal -> signal -> signal,
- output(t) = input1(input2(t)), frequency equals to that of input2.
- Attention: no memory implemented, very expensive when input1 comes from rec or delays.*)
-let signal_rdtable s0 s1 s2 =
- let memory_length_int = take_off_N ((signal_fun s0) 0) in
- let s1_mem = factory_add_memory (signal_fun s1) memory_length_int in
- let new_signal = fun t ->
- let index = (signal_fun s2) t in
- match index with
- |N i -> s1_mem i
- |R f -> raise (Signal_operation "Rdtable index cannot be float.")
- |Vec (size, vec) -> raise (Signal_operation "Rdtable index cannot be vector.")
- |Zero -> s1_mem 0
- |W -> raise (Signal_operation "Rdtable index cannot be Error.")
- in
- (frequency s2, new_signal);;
-
-
-(** val signal_mod : signal -> signal -> signal,
- output(t) = input1(t) % input2(t), frequency consistent.*)
-let signal_mod s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t -> v_mod ((signal_fun s1) t) ((signal_fun s2) t) in
- (f, new_signal);;
-
-
-(** val signal_sup : signal -> signal -> signal,
- output(t) = input1(t) > input2(t), frequency consistent.*)
-let signal_sup s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t -> v_sup ((signal_fun s1) t) ((signal_fun s2) t) in
- (f, new_signal);;
-
-
-(** val signal_inf : signal -> signal -> signal,
- output(t) = input1(t) < input2(t), frequency consistent.*)
-let signal_inf s1 s2 =
- let f = signal_check_frequency s1 s2 in
- let new_signal = fun t -> v_inf ((signal_fun s1) t) ((signal_fun s2) t) in
- (f, new_signal);;
-
-
-(** val signal_select2 : signal -> signal -> signal -> signal,
-[signal_select2 si s0 s1] selects s0 or s1 by index si, frequency consistent.*)
-let signal_select2 si s0 s1 =
- let f = signal_check_frequency3 si s0 s1 in
- let new_signal = fun t ->
- if (signal_fun si) t = N 0 then (signal_fun s0) t
- else if (signal_fun si) t = N 1 then (signal_fun s1) t
- else raise (Signal_operation "select2 index should be 0 or 1.")
- in
- (f, new_signal);;
-
-
-(** val signal_select3 : signal -> signal -> signal -> signal -> signal,
-[signal_select3 si s0 s1 s2] selects s0 or s1 or s2 by index si, frequency consistent.*)
-let signal_select3 si s0 s1 s2 =
- let f = signal_check_frequency4 si s0 s1 s2 in
- let new_signal = fun t ->
- if (signal_fun si) t = N 0 then (signal_fun s0) t
- else if (signal_fun si) t = N 1 then (signal_fun s1) t
- else if (signal_fun si) t = N 2 then (signal_fun s2) t
- else raise (Signal_operation "select3 index should be 0 or 1 or 2.")
- in
- (f, new_signal);;
-
-
-(** val signal_prefix : signal -> signal -> signal,
-[signal_prefix s0 s1] returns s0(0) if t = 0, s1(t-1) if t > 0, frequency same to s1.*)
-let signal_prefix = fun s0 -> fun s1 ->
- let new_signal = fun t ->
- if t = 0 then (signal_fun s0) 0
- else if t > 0 then (signal_fun s1) t
- else raise (Signal_operation "prefix time cannot be < 0.")
- in
- (frequency s1, new_signal);;
+let delay_memory_length = 10000;;
+
+class signal : int -> (time -> value_type) -> signal_type =
+ fun (freq_init : int) ->
+ fun (func_init : time -> value_type) ->
+ object (self)
+ val mutable signal_func = func_init
+ val mutable memory_length = 0
+ method frequency = freq_init
+ method at = signal_func
+
+ method private check_freq : signal_type list -> int =
+ fun (sl : signal_type list) ->
+ let check : int -> signal_type -> int =
+ fun (f : int) ->
+ fun (s : signal_type) ->
+ if f = s#frequency || s#frequency = 0 then f
+ else if f = 0 then s#frequency
+ else raise (Signal_operation "frequency not matched.") in
+ List.fold_left check self#frequency sl
+
+ method add_memory : int -> unit =
+ fun (length : int) ->
+ assert (length >= 0);
+ if memory_length >= length then ()
+ else
+ let memory = Hashtbl.create length in
+ let func : time -> value =
+ fun (t : time) ->
+ try Hashtbl.find memory t
+ with Not_found ->
+ let result = func_init t in
+ let () = Hashtbl.replace memory t result in
+ let () =
+ if (t - length) >= 0 then
+ Hashtbl.remove memory (t - length)
+ else () in
+ result in
+ memory_length <- length;
+ signal_func <- func
+
+ method private delay_by : int -> time -> value =
+ fun i -> fun t ->
+ if (t - i) >= 0 then
+ self#at (t - i)
+ else if t >= 0 && (t - i) < 0 then
+ (self#at 0)#zero
+ else raise (Signal_operation "Delay time < 0.")
+
+ method private prim1 :
+ (time -> value_type) -> signal_type =
+ fun (func : time -> value_type) ->
+ let freq = self#frequency in
+ new signal freq func
+
+ method private prim2 :
+ (time -> value_type -> value_type) -> signal_type -> signal_type =
+ fun (func_binary : time -> value_type -> value_type) ->
+ fun (s : signal_type) ->
+ let freq = self#check_freq [s] in
+ let func = fun t -> (func_binary t) (s#at t) in
+ new signal freq func
+
+ method neg = self#prim1 (fun t -> (self#at t)#neg)
+ method floor = self#prim1 (fun t -> (self#at t)#floor)
+ method sin = self#prim1 (fun t -> (self#at t)#sin)
+ method cos = self#prim1 (fun t -> (self#at t)#cos)
+ method atan = self#prim1 (fun t -> (self#at t)#atan)
+ method sqrt = self#prim1 (fun t -> (self#at t)#sqrt)
+ method int = self#prim1 (fun t -> (self#at t)#int)
+
+ method add = self#prim2 (fun t -> (self#at t)#add)
+ method sub = self#prim2 (fun t -> (self#at t)#sub)
+ method mul = self#prim2 (fun t -> (self#at t)#mul)
+ method div = self#prim2 (fun t -> (self#at t)#div)
+ method atan2 = self#prim2 (fun t -> (self#at t)#atan2)
+ method _mod = self#prim2 (fun t -> (self#at t)#_mod)
+ method larger = self#prim2 (fun t -> (self#at t)#larger)
+ method smaller = self#prim2 (fun t -> (self#at t)#smaller)
+
+ method delay : signal_type -> signal_type =
+ fun (s : signal_type) ->
+ let freq = self#check_freq [s] in
+ let () = self#add_memory delay_memory_length in
+ let func : time -> value_type =
+ fun (t : time) ->
+ let i = (s#at t)#to_int in
+ self#delay_by i t in
+ new signal freq func
+
+ method mem : signal_type =
+ let freq = self#frequency in
+ let () = self#add_memory 1 in
+ let func = fun (t : time) -> self#delay_by 1 t in
+ new signal freq func
+
+ method rdtable : signal_type -> signal_type -> signal_type =
+ fun (s_size : signal_type) ->
+ fun (s_index : signal_type) ->
+ let freq = self#check_freq [s_index] in
+ let () = self#add_memory ((s_size#at 0)#to_int) in
+ let func : time -> value_type = fun t ->
+ self#at ((s_index#at t)#to_int) in
+ new signal freq func
+
+ method select2 : signal_type -> signal_type -> signal_type =
+ fun s_first ->
+ fun s_second ->
+ let freq = self#check_freq [s_first; s_second] in
+ let func : time -> value_type =
+ fun t -> let i = (self#at t)#to_int in
+ if i = 0 then s_first#at t
+ else if i = 1 then s_second#at t
+ else raise (Signal_operation "select2 index 0|1.") in
+ new signal freq func
+
+ method select3 :
+ signal_type -> signal_type -> signal_type -> signal_type =
+ fun s_first -> fun s_second -> fun s_third ->
+ let freq = self#check_freq [s_first; s_second; s_third] in
+ let func : time -> value_type =
+ fun t -> let i = (self#at t)#to_int in
+ if i = 0 then s_first#at t
+ else if i = 1 then s_second#at t
+ else if i = 2 then s_third#at t
+ else raise (Signal_operation "select2 index 0|1.") in
+ new signal freq func
+
+ method prefix : signal_type -> signal_type =
+ fun (s_init : signal_type) ->
+ let () = self#add_memory 1 in
+ let func : time -> value_type =
+ fun t ->
+ if t = 0 then s_init#at 0
+ else if t > 0 then self#at (t - 1)
+ else raise (Signal_operation "prefix time < 0.") in
+ new signal self#frequency func
+
+
+ method vectorize : signal_type -> signal_type =
+ fun s_size ->
+ let size = (s_size#at 0)#to_int in
+ if size <= 0 then
+ raise (Signal_operation "Vectorize: size <= 0.")
+ else
+ let freq = self#frequency / size in
+ let func : time -> value_type =
+ fun t ->
+ let vec = fun i -> (self#at (size * t + i))#get in
+ new value (Vec (new vector size vec)) in
+ new signal freq func
+
+
+ method serialize : signal_type =
+ let size =
+ match (self#at 0)#get with
+ | Vec vec -> vec#size
+ | _ -> raise (Signal_operation "Serialize: scalar input.") in
+ let freq = self#frequency * size in
+ let func : time -> value_type =
+ fun t ->
+ match (self#at (t/size))#get with
+ | Vec vec -> new value (vec#nth (t mod size))
+ | _ -> raise (Signal_operation
+ "Serialize: signal type not consistent.") in
+ new signal freq func
+
+ method vconcat : signal_type -> signal_type =
+ fun s ->
+ let freq = self#check_freq [s] in
+ let func : time -> value_type =
+ fun t ->
+ match ((self#at t)#get, (s#at t)#get) with
+ | (Vec vec1, Vec vec2) ->
+ let size1 = vec1#size in
+ let size2 = vec2#size in
+ let size = size1 + size2 in
+ let vec = fun i ->
+ if i < size1 then vec1#nth i
+ else vec2#nth (i - size1) in
+ new value (Vec (new vector size vec))
+ | _ -> raise (Signal_operation "Vconcat: scalar.") in
+ new signal freq func
+
+ method vpick : signal_type -> signal_type =
+ fun s_index ->
+ let freq = self#check_freq [s_index] in
+ let func : time -> value_type =
+ fun t ->
+ let i = (s_index#at t)#to_int in
+ match (self#at t)#get with
+ | Vec vec -> new value (vec#nth i)
+ | _ -> raise (Signal_operation "Vpick: scalar.") in
+ new signal freq func
+
+ end;;
--- /dev/null
+(**
+ Module: Symbol
+ Description: Symbols' information in faust.
+ @author WANG Haisheng
+ Created: 05/08/2013 Modified: 05/08/2013
+*)
+
+open Types;;
+
+exception Symbol_error of string;;
+
+(* MACRO *)
+let delay_memory_length = 100000;;
+let rdtable_memory_length = 100000;;
+let vectorize_memory_length = 1000;;
+
+let dimension_of_symbol : symbol -> int * int =
+ fun (s : symbol) ->
+ match s with
+ |Add -> (2, 1)
+ |Sub -> (2, 1)
+ |Mul -> (2, 1)
+ |Div -> (2, 1)
+ |Pass -> (1, 1)
+ |Stop -> (1, 0)
+ |Mem -> (1, 1)
+ |Delay -> (2, 1)
+ |Floor -> (1, 1)
+ |Int -> (1, 1)
+ |Sin -> (1, 1)
+ |Cos -> (1, 1)
+ |Atan -> (1, 1)
+ |Atan2 -> (2, 1)
+ |Sqrt -> (1, 1)
+ |Rdtable -> (3, 1)
+ |Mod -> (2, 1)
+ |Vectorize -> (2, 1)
+ |Vconcat -> (2, 1)
+ |Vpick -> (2, 1)
+ |Serialize -> (1, 1)
+ |Larger -> (2, 1)
+ |Smaller -> (2, 1)
+ |Prefix -> (2, 1)
+ |Select2 -> (3, 1)
+ |Select3 -> (4, 1);;
+
+let delay_of_symbol : symbol -> int =
+ fun (s : symbol) ->
+ match s with
+ |Add -> 0
+ |Sub -> 0
+ |Mul -> 0
+ |Div -> 0
+ |Pass -> 0
+ |Stop -> 0
+ |Mem -> 1
+ |Delay -> delay_memory_length
+ |Floor -> 0
+ |Int -> 0
+ |Sin -> 0
+ |Cos -> 0
+ |Atan -> 0
+ |Atan2 -> 0
+ |Sqrt -> 0
+ |Rdtable -> rdtable_memory_length
+ |Mod -> 0
+ |Larger -> 0
+ |Smaller -> 0
+ |Vectorize -> vectorize_memory_length
+ |Vconcat -> 0
+ |Vpick -> 0
+ |Serialize -> 0
+ |Prefix -> 1
+ |Select2 -> 0
+ |Select3 -> 0;;
+
+let string_of_symbol : symbol -> string =
+ fun (s : symbol) ->
+ match s with
+ |Add -> "Add"
+ |Sub -> "Sub"
+ |Mul -> "Mul"
+ |Div -> "Div"
+ |Pass -> "Pass"
+ |Stop -> "Stop"
+ |Mem -> "Mem"
+ |Delay -> "Delay"
+ |Floor -> "Floor"
+ |Int -> "Int"
+ |Sin -> "Sin"
+ |Cos -> "Cos"
+ |Atan -> "Atan"
+ |Atan2 -> "Atan2"
+ |Sqrt -> "Sqrt"
+ |Rdtable -> "Rdtable"
+ |Mod -> "Mod"
+ |Larger -> "Larger"
+ |Smaller -> "Smaller"
+ |Vectorize -> "Vectorize"
+ |Vconcat -> "Vconcat"
+ |Vpick -> "Vpick"
+ |Serialize -> "Serialize"
+ |Prefix -> "Prefix"
+ |Select2 -> "Select2"
+ |Select3 -> "Select3";;
+
-type value = N of int
+
+type index = int;;
+
+type time = int;;
+
+type basic = N of int
| R of float
- | Vec of int * (int -> value)
+ | Vec of vector
| Zero
- | W
+ | Error
+and vector = < size : int; nth : (index -> basic) >;;
+
+class type vector_type =
+ object
+ method size : int
+ method nth : index -> basic
+ end;;
+
+class type value_type =
+ object
+ method get : basic
+ method to_int : int
+ method to_float : float
+ method to_float_array : float array
+ method of_float_array : float array -> value_type
+ method to_string : string
+ method normalize : unit
+ method add : value_type -> value_type
+ method neg : value_type
+ method sub : value_type -> value_type
+ method mul : value_type -> value_type
+ method recip : value_type
+ method div : value_type -> value_type
+ method zero : value_type
+ method floor : value_type
+ method int : value_type
+ method sin : value_type
+ method cos : value_type
+ method atan : value_type
+ method sqrt : value_type
+ method atan2 : value_type -> value_type
+ method _mod : value_type -> value_type
+ method larger : value_type -> value_type
+ method smaller : value_type -> value_type
+ end;;
+
-(** type symbol, defines valid identifiers in faust expressions.*)
type symbol = Add
- | Sup
+ | Sub
| Mul
| Div
| Pass
| Sin
| Cos
| Atan
- | Atantwo
+ | Atan2
| Sqrt
| Rdtable
| Mod
| Vectorize
- | Concat
- | Nth
+ | Vconcat
+ | Vpick
| Serialize
| Larger
| Smaller
| Prefix
- | Selecttwo
- | Selectthree
-
-exception Symbol_not_defined;;
-
-let symbol_of_string = fun s ->
- match s with
- |"+" -> Add
- |"-" -> Sup
- |"*" -> Mul
- |"/" -> Div
- |"_" -> Pass
- |"!" -> Stop
- |"mem" -> Mem
- |"@" -> Delay
- |"floor" -> Floor
- |"int" -> Int
- |"sin" -> Sin
- |"cos" -> Cos
- |"atan" -> Atan
- |"atantwo" -> Atantwo
- |"sqrt" -> Sqrt
- |"rdtable" -> Rdtable
- |"%" -> Mod
- |"vectorize" -> Vectorize
- |"#" -> Concat
- |"[]" -> Nth
- |"serialize" -> Serialize
- |">" -> Larger
- |"<" -> Smaller
- |"prefix" -> Prefix
- |"selecttwo" -> Selecttwo
- |"selectthree" -> Selectthree
- | _ -> raise Symbol_not_defined
-
-
-
-type signal = int * (int -> value)
+ | Select2
+ | Select3
type faust_exp =
- Const of value
+ Const of basic
| Ident of symbol
| Par of faust_exp * faust_exp
| Seq of faust_exp * faust_exp
| Merge of faust_exp * faust_exp
-type dimension = End of (int * int)
- | Tree of (int * int) * (dimension * dimension)
+class type signal_type =
+ object
+ method frequency : int
+ method at : time -> value_type
+ method add_memory : int -> unit
+ method add : signal_type -> signal_type
+ method neg : signal_type
+ method sub : signal_type -> signal_type
+ method mul : signal_type -> signal_type
+ method div : signal_type -> signal_type
+ method delay : signal_type -> signal_type
+ method mem : signal_type
+ method vectorize : signal_type -> signal_type
+ method serialize : signal_type
+ method vconcat : signal_type -> signal_type
+ method vpick : signal_type -> signal_type
+ method floor : signal_type
+ method int : signal_type
+ method sin : signal_type
+ method cos : signal_type
+ method atan : signal_type
+ method atan2 : signal_type -> signal_type
+ method sqrt : signal_type
+ method _mod : signal_type -> signal_type
+ method larger : signal_type -> signal_type
+ method smaller : signal_type -> signal_type
+ method rdtable : signal_type -> signal_type -> signal_type
+ method select2 : signal_type -> signal_type -> signal_type
+ method select3 : signal_type -> signal_type -> signal_type -> signal_type
+ method prefix : signal_type -> signal_type
+ end;;
+
+
+class type beam_type =
+ object
+ method get : signal_type array
+ method width : int
+ method sub : int -> int -> beam_type
+ method cut : int -> beam_type * beam_type
+ method append : beam_type -> beam_type
+ method matching : int -> beam_type
+ method at : time -> value_type array
+ method output : int -> float array array array
+ method frequency : int array
+ end;;
+
+
+class type dimension_type =
+ object
+ method input : int
+ method output : int
+ method par : dimension_type -> dimension_type
+ method seq : dimension_type -> dimension_type
+ method split : dimension_type -> dimension_type
+ method merge : dimension_type -> dimension_type
+ method _rec : dimension_type -> dimension_type
+ end;;
+
+
+class type process_type =
+ object
+ method exp : faust_exp
+ method dim : dimension_type
+ method delay : int
+ method eval : beam_type -> beam_type
+ end;;
+
+
+class type io_type =
+ object
+ method set : string -> string -> unit
+ method read : string array -> beam_type
+ method write : int array -> float array array array -> string array
+ end;;
Module: Value
Description: basic data type in the vectorial faust interpreter.
@author WANG Haisheng
- Created: 31/05/2013 Modified: 03/06/2013
+ Created: 31/05/2013 Modified: 17/07/2013
*)
open Types;;
-
-(* EXCEPTIONS *)
-
-(** Exception raised in convertions between float/int and type 'Value'.*)
-exception Convert_Error of string;;
-
-(** Exception raised in type 'Value' operations.*)
-exception Value_operation of string;;
-
-
-(* MACRO *)
-
-(** Macro constants of the file.*)
-type value_macro = Faust_Max_int
- | Faust_Min_int
- | Faust_Bits_int;;
-
-(** val value_macro_to_value : value_macro -> int.*)
-let value_macro_to_int m = match m with
- |Faust_Max_int -> 2147483647
- |Faust_Min_int -> -2147483648
- |Faust_Bits_int -> 32;;
-
-
-(* VALUE CONVERT FUNCTIONS *)
-
-(** val return_N : int -> value, convert from int to value N.*)
-let return_N i = N i;;
-
-(** val return_R : float -> value, convert from float to value R.*)
-let return_R f = R f;;
-
-(** val return_Vec : int * (int -> value) -> value, convert (size, vec) to value Vec.*)
-let return_Vec (size, vec) = Vec (size, vec);;
-
-(** val fail, return value W.*)
-let fail = W;;
-
-(** val take_off_N : value -> int, convert from value N to int.
-Attention: Zero and W are converted to 0.*)
-let rec take_off_N v =
- match v with
- |N i -> i
- |R f ->
- raise (Convert_Error "float take_off_N int")
- |Vec (size, vec) ->
- raise (Convert_Error "take_off_N can not convert vector.")
- |Zero -> 0
- |W -> 0;; (* Danger! *)
-
-(** val take_off_R : value -> float, convert from value R to float.
-Attention: Zero and W are converted to 0.0, int converted to float.*)
-let take_off_R v =
- match v with
- |N i -> float_of_int i
- |R f -> f
- |Vec (size, vec) ->
- raise (Convert_Error "take_off_R can not convert vector.")
- |Zero -> 0.
- |W -> 0.;;
-
-(** val convert_back_r : value -> float array,
-return a float array of size 1 if v is N|R|Zero|W, a float array of size n if v is Vec.*)
-let convert_back_R v =
- match v with
- |N i -> [| float_of_int i |]
- |R f -> [| f |]
- (** realise the function int -> value into float list.*)
- |Vec (size, vec) ->
- let result_value_array = Array.init size vec in
- let result_float_array = Array.map take_off_R result_value_array in
- result_float_array
- |Zero -> [| 0. |]
- |W -> [| 0. |];;
-
-
-
-(* AUXILIARY FUNCTIONS*)
-
-(** val string_of_value : value -> string, converts value to following
-strings "N i" | "R f" | "Vec" | "Zero" | "W".*)
-let rec string_of_value v = match v with
- |N i1 -> "N " ^ (string_of_int i1)
- |R f1 -> "R " ^ (string_of_float f1)
- |Vec (size, vec) -> "Vec"
- |Zero -> "Zero"
- |W -> "W";;
-
-(** val print_value_list: value list -> unit, prints to console the value list.*)
-let print_value_list value_list =
- let s = ref "[" in
- let n = List.length value_list in
- for i = 0 to n - 1 do
- let current = List.nth value_list i in
- s := if i + 1 < n then !s ^ string_of_value current ^ "; "
- else !s ^ string_of_value current ^ "]"
- done;
- print_endline !s;;
-
-
-(** val factory_add_memory : (int -> 'b) -> int -> (int -> 'b),
-[factory_add_memory f n] adds a memory of size n to fun f.*)
-let factory_add_memory = fun f -> fun n ->
- if n > 0 then
- (
- let memory = Hashtbl.create n in
- let new_fun = fun i ->
- try Hashtbl.find memory i
- with Not_found ->
- let result = f i in
- let () = Hashtbl.replace memory i result in
- let () = Hashtbl.remove memory (i - n) in
- result
- in
- new_fun
- )
- else raise (Value_operation "memory length cannot be < 0." );;
-
-
-(** val v_memory : value -> value, returns value Vec with memory.*)
-let v_memory v = match v with
- | Vec (size, vec) ->
- let memory_array = Array.create size W in
- let index_array = Array.create size false in
- let new_vec = fun i ->
- if i >= 0 && i < size then
- (
- if index_array.(i) then
- memory_array.(i)
- else
- let result = vec i in
- let () = memory_array.(i) <- result in
- let () = index_array.(i) <- true in
- result
- )
- else raise (Invalid_argument "vector overflow.")
- in
- return_Vec (size, new_vec)
- | _ -> v;;
-
-
-(** val v_list_memory : value list -> value list, returns value list with memory. *)
-let v_list_memory vl = List.map v_memory vl;;
-
-
-(** val make_vector : int -> (int -> value) -> value,
-[make_vector size vec], return a value Vec of (size, vec).*)
-let make_vector = fun size -> fun vec ->
- let new_vec = fun i ->
- if i >= 0 && i < size then vec i
- else raise (Value_operation "vector overflow")
- in
- v_memory (return_Vec (size, new_vec));;
-
-
-(* VALUE OPERATIONS *)
-
-(** val normalize: value -> value, normalize value to bounded [-2147483648,2147483647].*)
-let rec normalize v =
- let n = 2. ** float_of_int (value_macro_to_int Faust_Bits_int) in
- match v with
- |N i ->
- if i > value_macro_to_int Faust_Max_int then
- return_N (i - int_of_float (n *. floor (((float_of_int i) +. n/.2.)/.n)))
- else if i < value_macro_to_int Faust_Min_int then
- return_N (i + int_of_float (n *. floor ((n/.2. -. (float_of_int i) -. 1.)/.n)))
- else return_N i
- |R f ->
- if f > float_of_int (value_macro_to_int Faust_Max_int) then
- return_R (f -. (n *. floor ((f +. n/.2.)/.n)))
- else if f < float_of_int (value_macro_to_int Faust_Min_int) then
- return_R (f +. (n *. floor ((n/.2. -. f -. 1.)/.n)))
- else return_R f
- |Vec (size, vec) -> make_vector size (fun i -> normalize (vec i))
- |Zero -> Zero
- |W -> W;;
-
-
-(** val v_add : value -> value -> value, value addition, recursive for value.Vec.*)
-let rec v_add v1 v2 = match v1 with
- |Vec (size1, vec1) ->
- (
- match v2 with
- |Vec (size2, vec2) ->
- if size1 = size2 then
- make_vector size1 (fun i -> v_add (vec1 i) (vec2 i))
- else raise (Value_operation "vector size not matched.")
- |Zero -> v1
- |_ -> raise (Value_operation "Vector_Scalar vec1 +~ sca2")
- )
- |N i1 ->
- (
- match v2 with
- |N i2 -> normalize (return_N (i1 + i2))
- |R f2 -> normalize (return_R ((float_of_int i1) +. f2))
- |Vec (size2, vec2) -> raise (Value_operation "Vector_Scalar i1 +~ vec2")
- |Zero -> v1
- |W -> fail
- )
- |R f1 ->
- (
- match v2 with
- |N i2 -> normalize (return_R (f1 +. (float_of_int i2)))
- |R f2 -> normalize (return_R (f1 +. f2))
- |Vec (size2, vec2) -> raise (Value_operation "Vector_Scalar f1 +~ vec2")
- |Zero -> v1
- |W -> fail
- )
- |Zero -> v2
- |W ->
- (
- match v2 with
- |N i2 -> fail
- |R f2 -> fail
- |Vec (size2, vec2) -> raise (Value_operation "Vector_Scalar W +~ vec2")
- |Zero -> v1
- |W -> fail
- );;
-
-
-(** val (+~) : value -> value -> value, operator of v_add.*)
-let (+~) v1 v2 = v_add v1 v2;;
-
-
-(** val v_neg : value -> value, v_neg v = -v.*)
-let rec v_neg v = match v with
- |N i -> return_N (-i)
- |R f -> return_R (-.f)
- |Vec (size, vec) -> make_vector size (fun i -> v_neg (vec i))
- |Zero -> Zero
- |W -> fail;;
-
-
-(** val v_sub : value -> value -> value, returns (v1 - v2).*)
-let v_sub v1 v2 = v_add v1 (v_neg v2);;
-
-
-(** val (-~) : value -> value -> value, operator of v_sub.*)
-let (-~) v1 v2 = v_sub v1 v2;;
-
-
-(** val v_mul : value -> value -> value, returns (v1 * v2), recursive for value.Vec.*)
-let rec v_mul v1 v2 = match v1 with
- |Vec (size1, vec1) ->
- (
- match v2 with
- |Vec (size2, vec2) ->
- if size1 = size2 then
- make_vector size1 (fun i -> v_mul (vec1 i) (vec2 i))
- else raise (Value_operation "vector size not matched.")
- |Zero -> make_vector size1 (fun i -> v_mul (vec1 i) Zero)
- |_ -> raise (Value_operation "Vector_Scalar vec1 *~ sca2")
- )
- |N i1 ->
- (
- match v2 with
- |N i2 -> normalize (return_N (i1 * i2))
- |R f2 -> normalize (return_R ((float_of_int i1) *. f2))
- |Vec (size2, vec2) ->
- raise (Value_operation "Vector_Scalar i1 *~ vec2")
- |Zero -> return_N 0
- |W -> if i1 = 0 then N 0 else fail
- )
- |R f1 ->
- (
- match v2 with
- |N i2 -> normalize (return_R (f1 *. (float_of_int i2)))
- |R f2 -> normalize (return_R (f1 *. f2))
- |Vec (size2, vec2) ->
- raise (Value_operation "Vector_Scalar f1 *~ vec2")
- |Zero -> return_R 0.
- |W -> if f1 = 0. then R 0. else fail
- )
- |Zero ->
- (
- match v2 with
- |N i2 -> return_N 0
- |R f2 -> return_R 0.
- |Vec (size2, vec2) -> make_vector size2 (fun i -> v_mul Zero (vec2 i))
- |Zero -> Zero
- |W -> Zero (* Danger! *)
- )
- |W ->
- (
- match v2 with
- |N i2 -> if i2 = 0 then N 0 else fail
- |R f2 -> if f2 = 0. then R 0. else fail
- |Vec (size2, vec2) ->
- raise (Value_operation "Vector_Scalar W +~ vec2")
- |Zero -> Zero
- |W -> fail
- );;
-
-
-(** val ( *~ ) : value -> value -> value, operator of v_mul.*)
-let ( *~ ) v1 v2 = v_mul v1 v2;;
-
-
-(** val v_recip : value -> value, v_recip v = 1./.v.*)
-let rec v_recip v = match v with
- |N i -> v_recip (R (float_of_int i))
- |R f -> if f = 0. then fail else return_R (1./.f)
- |Vec (size, vec) -> make_vector size (fun i -> v_recip (vec i))
- |Zero -> fail
- |W -> return_R 0. ;; (* Danger! *)
-
-
-(** val v_div : value -> value -> value, value division, returns (v1/.v2).*)
-let v_div v1 v2 =
- match (v1, v2) with
- | (N i1, N i2) -> N (i1/i2)
- | _ -> v_mul v1 (v_recip v2);;
-
-
-(** val (/~) : value -> value -> value, operator of v_div.*)
-let (/~) v1 v2 = v_div v1 v2;;
-
-
-(** val v_zero : value -> value, Attention: N i -> N 0 | R f -> R 0. | Zero -> Zero | W -> R 0.,
-and recursive for value.Vec.*)
-let rec v_zero v = match v with
- |N i -> N 0
- |R f -> R 0.
- |Vec (size, vec) -> make_vector size (fun i -> v_zero (vec i))
- |Zero -> Zero (* Danger! *)
- |W -> R 0.;; (* Danger! *)
-
-
-(** val v_floor : value -> value, returns floor of float, converts int to float, Zero to 0.,
- error to error, recursive for value.Vec.*)
-let rec v_floor v = match v with
- |N i -> return_R (float_of_int i)
- |R f -> return_R (floor f)
- |Vec (size, vec) -> make_vector size (fun i -> v_floor (vec i))
- |Zero -> return_R 0.
- |W -> W;;
-
-
-(** val v_int : value -> value, converts value to value.N, error to error, recursive for value.Vec.*)
-let rec v_int v = match v with
- |N i -> v
- |R f -> return_N (int_of_float f)
- |Vec (size, vec) -> make_vector size (fun i -> v_int (vec i))
- |Zero -> return_N 0
- |W -> W;;
-
-
-(** val v_sin : value -> value, returns sin(v), recursive for value.Vec.*)
-let rec v_sin v = match v with
- |N i -> return_R (sin (float_of_int i))
- |R f -> return_R (sin f)
- |Vec (size, vec) -> make_vector size (fun i -> v_sin (vec i))
- |Zero -> return_R (sin 0.)
- |W -> W;;
-
-(** val v_cos : value -> value, returns cos(v), recursive for value.Vec.*)
-let rec v_cos v = match v with
- |N i -> return_R (cos (float_of_int i))
- |R f -> return_R (cos f)
- |Vec (size, vec) -> make_vector size (fun i -> v_cos (vec i))
- |Zero -> return_R (cos 0.)
- |W -> W;;
-
-(** val v_atan : value -> value, returns atan(v), recursive for value.Vec.*)
-let rec v_atan v = match v with
- |N i -> return_R (atan (float_of_int i))
- |R f -> return_R (atan f)
- |Vec (size, vec) -> make_vector size (fun i -> v_atan (vec i))
- |Zero -> return_R (atan 0.)
- |W -> W;;
-
-
-(** val v_atantwo : value -> value, returns atantwo(v), recursive for value.Vec.*)
-let rec v_atantwo v1 v2 = match (v1, v2) with
- | (N i1, N i2) -> v_atantwo (R (float_of_int i1)) (R (float_of_int i2))
- | (N i1, R f2) -> v_atantwo (R (float_of_int i1)) v2
- | (N i1, Zero) -> v_atantwo (R (float_of_int i1)) (R 0.)
- | (N i1, Vec (size2, vec2)) -> raise (Value_operation "atan2 sca vec.")
- | (N i1, W) -> W
-
- | (R f1, N i2) -> v_atantwo v1 (R (float_of_int i2))
- | (R f1, R f2) -> R (atan2 f1 f2)
- | (R f1, Zero) -> v_atantwo v1 (R 0.)
- | (R f1, Vec (size2, vec2)) -> raise (Value_operation "atan2 sca vec.")
- | (R f1, W) -> W
-
- | (Vec (size1, vec1), Vec (size2, vec2)) -> make_vector size1 (fun i -> v_atantwo (vec1 i) (vec2 i))
- | (Vec (size1, vec1), Zero) -> make_vector size1 (fun i -> v_atantwo (vec1 i) Zero)
- | (Vec (size1, vec1), _) -> raise (Value_operation "atan2 vec sca.")
-
- | (Zero, N i2) -> v_atantwo (R 0.) (R (float_of_int i2))
- | (Zero, R f2) -> v_atantwo (R 0.) v2
- | (Zero, Vec (size2, vec2)) -> make_vector size2 (fun i -> v_atantwo Zero (vec2 i))
- | (Zero, Zero) -> v_atantwo (R 0.) (R 0.)
- | (Zero, W) -> W
-
- | (W, Vec (size2, vec2)) -> raise (Value_operation "atan2 sca vec.")
- | (W, _) -> W;;
-
-
-(** val v_sqrt : value -> value, returns sqrt(v), recursive for value.Vec.*)
-let rec v_sqrt v = match v with
- |N i ->
- if i >= 0 then return_R (sqrt (float_of_int i))
- else raise (Value_operation "sqrt parameter < 0.")
- |R f ->
- if f >= 0. then return_R (sqrt f)
- else raise (Value_operation "sqrt parameter < 0.")
- |Vec (size, vec) -> make_vector size (fun i -> v_sqrt (vec i))
- |Zero -> return_R (sqrt 0.)
- |W -> W;;
-
-
-(** val v_mod : value -> value -> value, returns (v1 % v2), recursive for value.Vec.*)
-let rec v_mod v1 v2 = match v1 with
- |N i1 ->
- (
- match v2 with
- |N i2 -> return_N (i1 mod i2)
- |R f2 -> return_N (i1 mod (int_of_float f2))
- |Vec (size, vec) -> raise (Value_operation "Scalaire_Vector: int mod vec.")
- |Zero -> raise (Value_operation "v1 mod v2: v2 cannot be zero.")
- |W -> W
- )
- |R f1 -> let i = return_N (int_of_float f1) in v_mod i v2
- |Vec (size1, vec1) ->
- (
- match v2 with
- |Vec (size2, vec2) ->
- if size1 = size2 then
- make_vector size1 (fun i -> v_mod (vec1 i) (vec2 i))
- else raise (Value_operation "vector size not matched.")
- |Zero -> raise (Value_operation "v1 mod v2: v2 cannot be zero.")
- |_ -> raise (Value_operation "Vector_Scalaire: vec mod int.")
- )
- |Zero ->
- (
- match v2 with
- |Vec (size2, vec2) ->
- let v = make_vector size2 (fun i -> Zero) in
- v_mod v v2
- |_ -> v_mod (N 0) v2
- )
- |W ->
- (
- match v2 with
- |Vec (size2, vec2) -> raise (Value_operation "Scalaire_Vector: int mod vec.")
- |Zero -> raise (Value_operation "v1 mod v2: v2 cannot be zero.")
- |_ -> W
- );;
-
-
-(** val v_larger_than_zero : value -> value, primitive comparison between value and zero,
-returns value.N 1 if true, value.N 0 if false.*)
-let rec v_larger_than_zero v = match v with
- |N i -> if i > 0 then return_N 1 else return_N 0
- |R f -> if f > 0. then return_N 1 else return_N 0
- |Vec (size, vec) -> make_vector size (fun i -> v_larger_than_zero (vec i))
- |Zero -> return_N 0
- |W -> W;;
-
-
-(** val v_sup : value -> value -> value, comparison of two values, returns value.N 1 if (v1 > v2),
-value.N 0 else.*)
-let v_sup v1 v2 = v_larger_than_zero (v1 -~ v2);;
-
-
-(** val v_inf : value -> value -> value, comparison of two values, returns value.N 1 if (v1 < v2),
-value.N 0 else.*)
-let v_inf v1 v2 = v_larger_than_zero (v2 -~ v1);;
-
+open Basic;;
+
+let convert : (basic -> 'a) -> basic -> 'a =
+ fun oper -> fun b -> oper b;;
+
+class value : basic -> value_type =
+ fun (b_init : basic) ->
+ object (self)
+ val mutable b = b_init
+ method get = b
+ method normalize = b <- basic_normalize self#get
+
+ method to_float = convert basic_to_float self#get
+ method to_int = convert basic_to_int self#get
+ method to_float_array = convert basic_to_float_array self#get
+ method to_string = convert basic_to_string self#get
+ method of_float_array : float array -> value_type =
+ fun data -> new value (basic_of_float_array data)
+
+ method private prim1 : (basic -> basic) -> value =
+ fun oper ->
+ new value (oper self#get)
+
+ method neg = self#prim1 basic_neg
+ method recip = self#prim1 basic_recip
+ method zero = self#prim1 basic_zero
+ method floor = self#prim1 basic_floor
+ method int = self#prim1 basic_int
+ method sin = self#prim1 basic_sin
+ method cos = self#prim1 basic_cos
+ method atan = self#prim1 basic_atan
+ method sqrt = self#prim1 basic_sqrt
+
+ method private prim2 : (basic -> basic -> basic) -> value -> value =
+ fun oper ->
+ fun v ->
+ new value (oper self#get v#get)
+
+ method add = self#prim2 basic_add
+ method sub = self#prim2 basic_sub
+ method mul = self#prim2 basic_mul
+ method div = self#prim2 basic_div
+ method atan2 = self#prim2 basic_atan2
+ method _mod = self#prim2 basic_mod
+ method larger = self#prim2 basic_larger
+ method smaller = self#prim2 basic_smaller
+
+ end;;
+++ /dev/null
-11.7147434919,14.7244318637,21.8646614527,13.0995405061,4.81455509541,1.81200558906,0.985314140699,0.657336220842,0.480263717254,0.369198828126,0.293610919264,0.239431890082,0.199096695505,0.168215674241,0.14396373467,0.124547035321,0.108830638738,0.0958529856501,0.0849893365752,0.0758324610431,0.0680867661039,0.0612975764474,0.0556597101255,0.0505611872284,0.0462751307322,0.042379194851,0.038564116328,0.0358757660985,0.0327819409999,0.0303545995073,0.0283130511756,0.0260217011052,0.0244516499572,0.0227531029172,0.0210358278932,0.0196693939287,0.0183035214354,0.0171118352455,0.0160864158164,0.0150388854444,0.0140544948901,0.0131173447842,0.0122472575581,0.0119764568614,0.0102131753247,0.00947366553556,0.0103306471841,0.00909380608468,0.00845798636029,0.0068121972559,0.00595819695743,0.00663240250984,0.00724001738186,0.00644375114071,0.00498097616174,0.006585079271,0.00499721534749,0.00292955159168,0.00409498970219,0.00445818375496,0.0023379079251,0.00453618881051,0.00440644607224,0.003663670503,0.00161748100223,0.003663670503,0.00440644607225,0.00453618881051,0.0023379079251,0.00445818375496,0.00409498970219,0.00292955159168,0.00499721534749,0.006585079271,0.00498097616174,0.00644375114071,0.00724001738186,0.00663240250984,0.00595819695743,0.0068121972559,0.00845798636029,0.00909380608468,0.0103306471841,0.00947366553556,0.0102131753247,0.0119764568614,0.0122472575581,0.0131173447842,0.0140544948901,0.0150388854444,0.0160864158164,0.0171118352455,0.0183035214354,0.0196693939287,0.0210358278932,0.0227531029172,0.0244516499572,0.0260217011052,0.0283130511756,0.0303545995073,0.0327819409999,0.0358757660985,0.038564116328,0.042379194851,0.0462751307322,0.0505611872284,0.0556597101255,0.0612975764474,0.0680867661039,0.0758324610431,0.0849893365752,0.0958529856501,0.108830638738,0.124547035321,0.14396373467,0.168215674241,0.199096695505,0.239431890082,0.293610919264,0.369198828126,0.480263717254,0.657336220842,0.985314140699,1.81200558906,4.81455509541,13.0995405061,21.8646614527,14.7244318637