diff --git a/bin/gnuplot/bessel_i0.plt b/bin/gnuplot/bessel_i0.plt deleted file mode 100644 index a1648de..0000000 --- a/bin/gnuplot/bessel_i0.plt +++ /dev/null @@ -1,15 +0,0 @@ - -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/bessel_i0.png' - -set grid -set xlabel "x" - -set lmargin at screen 0.10 -set key left top -set terminal plotterm size 560,380 enhanced font 'Verdana,8' - -set ylabel "I_0(x)" -set yrange [0:5] -plot 'dat/dat0.txt' with lines - diff --git a/bin/gnuplot/bilinear_test.plt b/bin/gnuplot/bilinear_test.plt deleted file mode 100644 index b235a57..0000000 --- a/bin/gnuplot/bilinear_test.plt +++ /dev/null @@ -1,17 +0,0 @@ - -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/bilinear.png' - -unset key -set grid -set xlabel "normalized frequency" - -set terminal plotterm size 520, 380 enhanced font 'Verdana,8' - - -set ylabel "Magnitude, dB" -set yrange [-80:5] -plot 'dat/bilinear.txt' with lines - - - diff --git a/bin/gnuplot/butter_ap_test.plt b/bin/gnuplot/butter_ap_test.plt deleted file mode 100644 index 3ca47ce..0000000 --- a/bin/gnuplot/butter_ap_test.plt +++ /dev/null @@ -1,27 +0,0 @@ - -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/butter_ap_test.png' - - -set logscale x -unset key -set grid -set xlabel "frequency, rad/s" - -set terminal plotterm size 920, 260 enhanced font 'Verdana,8' - -set multiplot layout 1,3 rowsfirst -set ylabel "Magnitude, dB" -set yrange [-100:5] -plot 'dat/butter_ap_test_mag.txt' with lines - -set ylabel "Phase response, rad" -unset yrange -plot 'dat/butter_ap_test_phi.txt' with lines - -set ylabel "Groupdelay, sec" -unset yrange -plot 'dat/butter_ap_test_tau.txt' with lines - -unset multiplot - diff --git a/bin/gnuplot/cheby1_ap_test.plt b/bin/gnuplot/cheby1_ap_test.plt deleted file mode 100644 index 38de252..0000000 --- a/bin/gnuplot/cheby1_ap_test.plt +++ /dev/null @@ -1,26 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/cheby1_ap_test.png' - -set logscale x -unset key -set grid -set xlabel "frequency, rad/s" - -set terminal plotterm size 920, 260 enhanced font 'Verdana,8' - -set multiplot layout 1,3 rowsfirst -set ylabel "Magnitude, dB" -set yrange [-100:5] -plot 'dat/cheby1_ap_test_mag.txt' with lines - -set ylabel "Phase response, rad" -unset yrange -plot 'dat/cheby1_ap_test_phi.txt' with lines - -set ylabel "Groupdelay, sec" -unset yrange -plot 'dat/cheby1_ap_test_tau.txt' with lines - -unset multiplot - - diff --git a/bin/gnuplot/cheby_poly1.plt b/bin/gnuplot/cheby_poly1.plt deleted file mode 100644 index 14b84c0..0000000 --- a/bin/gnuplot/cheby_poly1.plt +++ /dev/null @@ -1,19 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/cheby_poly1.png' - -set terminal plotterm size 560,380 enhanced font 'Verdana,8' -set grid -set xlabel "x" - -set lmargin at screen 0.10 -set key left top - - -set ylabel "C_N(x)" -set yrange [-1.5:1.5] -plot 'dat/cheby_poly1_ord1.txt' with lines, \ - 'dat/cheby_poly1_ord2.txt' with lines, \ - 'dat/cheby_poly1_ord3.txt' with lines, \ - 'dat/cheby_poly1_ord4.txt' with lines - - diff --git a/bin/gnuplot/cheby_poly2.plt b/bin/gnuplot/cheby_poly2.plt deleted file mode 100644 index 3b5a060..0000000 --- a/bin/gnuplot/cheby_poly2.plt +++ /dev/null @@ -1,18 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/cheby_poly2.png' - -set grid -set xlabel "x" - -set lmargin at screen 0.10 -set key left top -set terminal plotterm size 560,380 enhanced font 'Verdana,8' - -set ylabel "C_N(x)" -set yrange [-3.5:3.5] -plot 'dat/cheby_poly2_ord1.txt' with lines, \ - 'dat/cheby_poly2_ord2.txt' with lines, \ - 'dat/cheby_poly2_ord3.txt' with lines, \ - 'dat/cheby_poly2_ord4.txt' with lines - - diff --git a/bin/gnuplot/filter_iir.plt b/bin/gnuplot/filter_iir.plt deleted file mode 100644 index ff05c76..0000000 --- a/bin/gnuplot/filter_iir.plt +++ /dev/null @@ -1,22 +0,0 @@ - - -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/filter_iir_test.png' - -unset key -set grid -set xlabel "n" - -set terminal plotterm size 820, 340 enhanced font 'Verdana,8' - -set ylabel "s(n)" -set yrange [-3:3] - -set multiplot layout 2,1 rowsfirst - -plot 'dat/s.txt' with lines - -set ylabel "s_f(n)" -plot 'dat/sf.txt' with lines - -unset multiplot diff --git a/bin/gnuplot/gnuplot_script.plt b/bin/gnuplot/gnuplot_script.plt deleted file mode 100644 index c8a797e..0000000 --- a/bin/gnuplot/gnuplot_script.plt +++ /dev/null @@ -1,15 +0,0 @@ - -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/gnuplot_script.png' - -set grid - -set xlabel "x" - -set terminal plotterm size 560,280 enhanced font 'Verdana,8' - -set ylabel "sin(x), cos(x)" - -plot 'dat/sine.txt' with lines title "sin(x)", \ - 'dat/cosine.txt' with lines title "cos(x)" - diff --git a/bin/gnuplot/iir_bstop.plt b/bin/gnuplot/iir_bstop.plt deleted file mode 100644 index 8ad7d2a..0000000 --- a/bin/gnuplot/iir_bstop.plt +++ /dev/null @@ -1,24 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/iir_bstop.png' - -unset key -set grid -set xlabel " normalized frequency" - -set terminal plotterm size 920, 260 enhanced font 'Verdana,8' - - -set multiplot layout 1,3 rowsfirst -set ylabel "Magnitude, dB" -set yrange [-100:5] -plot 'dat/iir_bstop_mag.txt' with lines - -set ylabel "Phase response, rad" -unset yrange -plot 'dat/iir_bstop_phi.txt' with lines - -set ylabel "Groupdelay, samples" -unset yrange -plot 'dat/iir_bstop_tau.txt' with lines - -unset multiplot \ No newline at end of file diff --git a/bin/gnuplot/iir_lpf.plt b/bin/gnuplot/iir_lpf.plt deleted file mode 100644 index bfafd24..0000000 --- a/bin/gnuplot/iir_lpf.plt +++ /dev/null @@ -1,23 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/iir_lpf.png' - -unset key -set grid -set xlabel " normalized frequency" - -set terminal plotterm size 920, 260 enhanced font 'Verdana,8' - -set multiplot layout 1,3 rowsfirst -set ylabel "Magnitude, dB" -set yrange [-100:5] -plot 'dat/iir_lpf_mag.txt' with lines - -set ylabel "Phase response, rad" -unset yrange -plot 'dat/iir_lpf_phi.txt' with lines - -set ylabel "Groupdelay, samples" -unset yrange -plot 'dat/iir_lpf_tau.txt' with lines - -unset multiplot \ No newline at end of file diff --git a/bin/gnuplot/iir_test.plt b/bin/gnuplot/iir_test.plt deleted file mode 100644 index 0fa36dc..0000000 --- a/bin/gnuplot/iir_test.plt +++ /dev/null @@ -1,45 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/iir_test.png' - - -unset key -set grid -set xlabel " normalized frequency" - -set terminal plotterm size 920, 840 enhanced font 'Verdana,8' - -set ylabel "Magnitude, dB" -set yrange [-100:5] - -set xtics 0,1 -set xtics add ("0.3" 0.3) -set xtics add ("0.7" 0.7) -set xtics add ("1" 1) - -set multiplot layout 4,4 rowsfirst - - -plot 'dat/iir_butter_lpf.txt' with lines -plot 'dat/iir_butter_hpf.txt' with lines -plot 'dat/iir_butter_bpf.txt' with lines -plot 'dat/iir_butter_bsf.txt' with lines - - -plot 'dat/iir_cheby1_lpf.txt' with lines -plot 'dat/iir_cheby1_hpf.txt' with lines -plot 'dat/iir_cheby1_bpf.txt' with lines -plot 'dat/iir_cheby1_bsf.txt' with lines - - -plot 'dat/iir_cheby2_lpf.txt' with lines -plot 'dat/iir_cheby2_hpf.txt' with lines -plot 'dat/iir_cheby2_bpf.txt' with lines -plot 'dat/iir_cheby2_bsf.txt' with lines - - -plot 'dat/iir_ellip_lpf.txt' with lines -plot 'dat/iir_ellip_hpf.txt' with lines -plot 'dat/iir_ellip_bpf.txt' with lines -plot 'dat/iir_ellip_bsf.txt' with lines - -unset multiplot diff --git a/bin/gnuplot/sinc_test.plt b/bin/gnuplot/sinc_test.plt deleted file mode 100644 index 1841cd9..0000000 --- a/bin/gnuplot/sinc_test.plt +++ /dev/null @@ -1,17 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/sinc_test.png' - - -set grid -set xlabel "x" - -set lmargin at screen 0.10 - -set terminal plotterm size 560,280 enhanced font 'Verdana,8' - -set ylabel "sinc(x,a)" -set yrange [-0.25:1.1] -plot 'dat/sinc_test_1.0.txt' with lines title "a = 1.0", \ -'dat/sinc_test_pi.txt' with lines title "a = pi", \ -'dat/sinc_test_2pi.txt' with lines title "a = 2pi" - diff --git a/bin/gnuplot/sine_int.plt b/bin/gnuplot/sine_int.plt deleted file mode 100644 index bd8bbab..0000000 --- a/bin/gnuplot/sine_int.plt +++ /dev/null @@ -1,16 +0,0 @@ -if(!exists("plotterm")) plotterm = 'wxt' -if(plotterm eq "pngcairo") set output 'img/sine_int.png' - - -set grid -set xlabel "x" - -set lmargin at screen 0.10 -set key left top -set terminal plotterm size 560,280 enhanced font 'Verdana,8' - -set ylabel "Si(x), sinc(x)" -set yrange [-2:2] -plot 'dat/dat0.txt' with lines title "Si(x)", \ -'dat/dat1.txt' with lines title "sinc(x)" - diff --git a/bin/img/bessel_i0.png b/bin/img/bessel_i0.png index 9d670c5..ffcf441 100644 Binary files a/bin/img/bessel_i0.png and b/bin/img/bessel_i0.png differ diff --git a/bin/img/bilinear.png b/bin/img/bilinear.png index d50d505..80e09c8 100644 Binary files a/bin/img/bilinear.png and b/bin/img/bilinear.png differ diff --git a/bin/img/cheby_poly1.png b/bin/img/cheby_poly1.png index 5779802..9527472 100644 Binary files a/bin/img/cheby_poly1.png and b/bin/img/cheby_poly1.png differ diff --git a/bin/img/cheby_poly2.png b/bin/img/cheby_poly2.png index b01387a..1fa3c73 100644 Binary files a/bin/img/cheby_poly2.png and b/bin/img/cheby_poly2.png differ diff --git a/bin/img/filter_iir_test.png b/bin/img/filter_iir_test.png index f415421..ef483c0 100644 Binary files a/bin/img/filter_iir_test.png and b/bin/img/filter_iir_test.png differ diff --git a/bin/img/gnuplot_script.png b/bin/img/gnuplot_script.png deleted file mode 100644 index af70e06..0000000 Binary files a/bin/img/gnuplot_script.png and /dev/null differ diff --git a/bin/img/iir_bstop.png b/bin/img/iir_bstop.png index 040608e..b2b5e2f 100644 Binary files a/bin/img/iir_bstop.png and b/bin/img/iir_bstop.png differ diff --git a/bin/img/iir_lpf.png b/bin/img/iir_lpf.png index 6324884..2b8cc69 100644 Binary files a/bin/img/iir_lpf.png and b/bin/img/iir_lpf.png differ diff --git a/bin/img/iir_test.png b/bin/img/iir_test.png index f14a694..7f2bee9 100644 Binary files a/bin/img/iir_test.png and b/bin/img/iir_test.png differ diff --git a/bin/img/sinc_test.png b/bin/img/sinc_test.png index dde398e..5e3c102 100644 Binary files a/bin/img/sinc_test.png and b/bin/img/sinc_test.png differ diff --git a/dspl/doc/html/_form0_tmp.ps b/dspl/doc/html/_form0_tmp.ps new file mode 100644 index 0000000..1dc4823 --- /dev/null +++ b/dspl/doc/html/_form0_tmp.ps @@ -0,0 +1,1207 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.999 Copyright 2019 Radical Eye Software +%%Title: _formulas.dvi +%%CreationDate: Thu Jan 02 15:08:28 2020 +%%Pages: 1 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentFonts: CMMI10 CMR10 CMEX10 CMSY10 +%%DocumentPaperSizes: Letter +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -q -D 600 -n 1 -p 1 -o _form0_tmp.ps +%+ _formulas.dvi +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2020.01.02:1808 +%%BeginProcSet: tex.pro 0 0 +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S +/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy +setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 +def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 +rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 +N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop +false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A +length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} +forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ +BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat +{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch +round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 +rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B +/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} +B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p +-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ +0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.0: CMSY10 003.002 +%%Title: CMSY10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSY10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup +/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMSY10 def +/FontBBox {-29 -960 1116 775 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 0 /minus put +dup 106 /bar put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 +7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 +DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 +511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 +1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD +028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 +1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 +3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 +91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 +E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A +11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 +C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 +D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 +B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 +93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F +10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D +7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF +B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B +491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB +F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 +019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 +915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 +356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 +5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D +9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 +3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 +FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 +720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 +D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 +BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 +7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 +DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 +AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 +A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E +0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 +AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 +CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 +0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD +5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B +5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F +E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB +54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 +E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F +A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 +4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 +4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 +038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 +B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 +5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC +B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 +A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD +2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D +CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 +455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE +FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 +16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C +16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F +483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 +67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 +3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 +1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 +93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA +051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B +8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 +8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 +6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 +06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 +84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 +D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 +DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB +0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD +8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC +C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 +754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 +1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 +CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 +1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F +153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 +905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 +617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 +8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A +98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 +53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B +888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D +052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A +CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 +A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F +07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 +B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 +10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 +CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D +3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 +D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F +849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 +648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE +84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA +2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD +2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 +9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 +B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B +D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 +135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE +EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 +C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 +7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 +4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 +9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 +050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 +3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 +C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 +843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 +CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B +B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 +3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 +19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 +FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 +17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 +8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B +CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 +F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 +1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E +4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 +2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 +9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 +E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB +8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB +BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 +04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 +C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 +ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C +4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 +84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 +C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 +09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 +D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 +56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF +035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB +FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 +CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 +B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A +F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD +CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B +0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C +B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 +33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 +4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D +F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E +2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A +CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 +88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 +17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 +55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A +A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 +2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 +406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 +AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B +60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 +C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 +5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 +822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E +94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 +D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA +343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE +894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 +DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 +DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F +8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 +A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA +DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 +E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 +DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC +4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 +5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 +02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 +88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A +60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E +71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52 +9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016 +A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44 +AF3863EE8A24A003F07FBF0DFBC12CF2625CE95B5F1C575C28144E1D3C8CF5D7 +6D071DB7562414E228147876D452804B3142DCDCAB22773DE75726823F1BB198 +1C1CA8D89B59FF008B054F0322A543DBCCABA518AB9945020DF8C049A6E112C5 +3F67BB74E95B7EB282BEF714787A3D4B67AA443353E37941A25CE90060BD2BE9 +1446D676E9308CB45BE72B0D7717B2E06DA36316A5C73018BE208E317F6122BE +A121C039A4AEA157298E54FB22F1FE2FF8B6BFAA4C8DA87DF1D2C1BEE0A6185D +74B7E12EE5362FA1F70E36F5A52FAF5E28918A4DEC9ABCEB374A2167601194C2 +B5B44BEEB01E3203AFA820562014191D1AD18FC512D4782E4532884C9B1E5570 +AE43DFED +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMEX10 +%!PS-AdobeFont-1.0: CMEX10 003.002 +%%Title: CMEX10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMEX10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMEX10 known{/CMEX10 findfont dup/UniqueID known{dup +/UniqueID get 5092766 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMEX10 def +/FontBBox {-24 -2960 1454 772 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMEX10.) readonly def +/FullName (CMEX10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 18 /parenleftbigg put +dup 19 /parenrightbigg put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23E7BC2A6E71BCF95FF3DA948 +1A27320759222BD7BC7C1A533E90058824F06942F0234C68671083E0E4708398 +D246C94F9C16DAB6563651BA33D86273FD2DB3C50C106F3CA95B1C79778D0BEB +B99D9CFB38E41BDCB4261A86A23E2CDEE4837D9B6F0E85ACEAA984C344A63709 +EA35B61F08821338D363D172BD185A3658F43052AE1E61D879C99DED7F6D726E +FAFEBD881BDDEA91FB09DB75675FC74AA2BEA8771027C7A51BF849F8E765B870 +8F7CC0871F301ADEF9B71EC3C607B2F51325AA5B3DD74A2C5426E7B329FAE84E +94A159C8C9C35E27A0FC93FB98A4D616750DAD50068A5F0EB96B8228946E5CC6 +B69E93D262C92E3BC7161313156E380A2ABE27BE400A23DF95E65A4F76B3FFE4 +CF3CD141B006C487EBC73A5A101466D4388FB2CF1D9439D0714720BB58537B7D +B3EE1F04AE117222CA5F0E5942F7A875D55D91D63958B1A02405D9DE08109B8C +7104F2D109EF7074852DFD74CBE02E0F3704F2BACA14E05EB1D0D9021EFAC23F +76C2389F8EA237D2E2AB6AFA83A725E16AECCAF025E05F1B1B5699D761F62A46 +EC6F31B0FE4769BD0D66821592ADBAEFA9EB454CF1402FE870F5F96D09980C1B +8B6D2FE88BE56032C1959E6C3DC319B6A7353F3AC629CE5BCB947B4B235426E9 +4769302817AEC1ADF50E50265AB488017634AF824D44D3C8423FC7CAD97F6D6E +6B34313637687FBDE3BDF6FC951CB41277D8EF49D14767B59656D214C9724DC4 +0523EF896F4E48434FCC5D8423F07194C54D48C62AC29001B10C9C8B514B24C5 +CEB60FF68D36749711E108DBB52738760FCF6571D5B04E58F24CC0247834B412 +D0F6F8D7F1573F23E3E399D5A3A3A37FCFFEAFA044A5694D2458EFF2BC1F7650 +8FB0A27C505A20C16776EDF94BEF9DF702F3C64DBC1939BEC0399B6AB283F832 +DD8FB358F701CC075C596FA7B0ED7A9304DC73274C8169337D55124CB748CE26 +A635B2704D8F65E23CC0FDA3C57ED451F8FDE7B6FBFCE2746F5AEA11B065A6DC +C3D200D962A034DD6757991BA62D8DC0408F49083D48799B6097B61343365A5B +30FB02E9CDFB5104FB751BE8A268EE55C1208DD8B29D5635014EDE9D0D94BB64 +ED5643B3049027925BF2FD7EFCB631E01269B731AE12AA6226B2656F035C7E92 +959C4A21BE40D7C138C8FF28C9FD4B768CF25F08859AE84FEE6EA18C033B3659 +D9EE250BA5FF2568E8BF7684A93BED7852251D1ADE5DB815AF3AAC36D1A500C9 +41D1BF3A1926828CD1F9E501ABE441A07B1B96612CF0728AD5FECF7480421F46 +0B18E06D2FF1A5B1183459C59517976474698BCE18A728515CD489A83C001AFA +47BDA929F60D0FABCD8786AE16EE18615C37D18703571936A365D334BACA9BA3 +08E2523132887B5EE95ABCE8581C78C3E858DBF35ADD56A1F6C2489AFA73D1B2 +379C5064DAFD30FDA84581FDE268B470636EE35F21648955513714F6EAA08AF0 +249C937721DB0E93D95C4DDDFB0948051953F39C6D2D811D3FFDC25F786E072B +2A8A1F4830F9CFC34666A1D3F13268980E9A26682CAB64817318A1E266F3D2D2 +DE4EBB3EDAF0E7B526C838CBD7F37E74A35B1C3EB96DA4099DE689A53970D4CB +9AB355E93EB294B07DD09356C338BB4A61C147BEDC152E58DC92FA69846E4829 +551A5330006793CD88523F7B3AF7B4475C531C67A4B66A603597EE72C4ADA491 +BF13706F341125CABF37FADA554FDA0BA5534C7AC35F1829E250C885D9A9983C +5D1FE8CE24458A8B13E5C7EA22BF1608AFA96B83C700889A2A6C9C4052DCB892 +6CAEEAA9E7D7F3E215019719B36A5DAFCCF2396FA0C04AD99A7C23772A7BAA64 +D1FABE8E476EAE9FC1A3E08CD6D1DDC6E087934E676BDFD1528652B6B9A50A35 +2029466364300AF4CA3C5883F6293A7104617D0858B3E43D43752F814654A938 +A44C33410BA0E5EA7BF55D4F1D57E27921DB05C059DE29BAC1BFC9B607D2C5CB +1DDC47793984FBB18BD99E1DF7776B563A55E15DF024D6D8E6ADF62F16F602A6 +7DDE1C68637672AA9C7A1250161502ADDDC1B4F6011A9BD5605B73AEDC37CE4E +4467C838B7692C4D541EF87DB41123F9DCCFFA971553A5D9B0E7EC539A28750C +8554383585CD8B93DF731A301D85BA9ADC95B4A3A237794C30230A82300B6756 +AE5A46A090958109C5565EF60B0B16D6C0A16A56644B05D3371DABBB67ED9BB8 +9BD3983575D371419C7568B2556649402AFB9843106729E4EA87B3F9038218A1 +F820B098A1271E330708432567297CCDA332B555A40C62BAEB16330175D28AA6 +13AE6939CEFA2334E3E890B66A73277F0B63B1FA59F856ABECC5FC0A50571F5B +0747FA554F5FC72A51E215304B2E44701A13E41D91397B204C66AAB3D101004C +7FEF2D87DA558EA057BD492CD6EF93601CB63F78426B502CDC5C8E9EF4FF3692 +376601B1FAADD801602668370B5ACEFFDBACA8F8B3F4E850D07A20F6F47440FC +FD39504F0FDFCA35AF2ED0DA8BAB63AD42EA8CDA912CE17F5E62192DDD912333 +3E9FA0884117F07221642490044A72E359D5F25D9591A8FAD568A3DEE435C354 +11995C0EFCFEA21735DF44A30F79F747510E28767A4266461D1394F81344F6DB +1FA8D0B0D9E5F52FBB663C8F1E91192E5608FFEAA178B93F8298F70510A65BEE +12ECB5D675311B5B3B19205476512D92B1D16262720484049370A76F78D9BDC3 +02EB96AC1E5B3CB078D2F219988FD0F36B043ABBF347B22D36CF541A8F80F791 +8E4F92D900B7E7B64DFD500882EFBBF23565FA470103B2E0D2D14E3E4D7827D1 +BAA0F84713A8CDE5904FFF2794850871DEADDDC53B77A502F5CA98B0744BB656 +2FC40ED2AEBCC5CACE2301E983E6C18CF16AFB9FD8CA49DE51B22F4259D43076 +DDC1BD4974CDF2E733EAB6334B1D5614288CC81FDCC722CEE193635D1088FB29 +F80AD5CB96394AE89D920DF8E1F271585AF019190F17DB51FEC9064B54C3A53E +3FD33C3B553FC79F743BEC9674743BF0A821051261DE4527A2BEF4A04E293E97 +02B181EC5F5EED3E26060F2C9EF6852B7433CA1BC1690C30424B03C522A087EE +92016EBDAC4B787133B4A22BFEF0B6CA564C6EB910E1DBF983CB4CFC3A1F8A26 +45329CED7F5A8704ACE9D4233583365A5A97342A053EF403F0567E9D0A62EBCD +84B5D7145BBB11D31046BC2CF5B450CC68B85DA0E78EF8902F8D37DAAA9D4242 +455288C0D73748F9BFEB1B1769D6FB84B94993D5F7C2B9CBDF75AEF2C930F277 +210B3CCB8A0299F50AFE2548A4B8DF5ABB52F098ECDD56FCB8D3A406EFD95088 +92D7EC39FDC7EB1824ECA24D0CBC6EC6F4C6A7F9590D593B269D2CC0BFBD961C +AA8BB4296B4E4411B54367A341A5EDA97288DAC370A015FDE6D7FB0A4CECEFBD +1A67DF3A3703E922BEF2C414FDDA42482EB35D5DBB206B44C76C412A435A0842 +6845EAD204BDF87065CE2C99B05D2D4080D5D11CFC3316967472C7DA44CC1F9D +51B83B4BE9B882D6E9ECB482F9855D024ABFBA502CCD624E0F88164A6F13CED4 +85F20DC01BB15C7D78B1C79FD9FF71F4B043F59DB5C297768115542BC7C8A99E +ACE39A268D32122541FB441FF1364FCBA2B7627F12C49ED038BC044B6D9D533B +A72D35317A5AB8D91A9AC56CA90D1DAE9F967605C63BC9F406FB3D5BAEB4B38F +4934EE3D2F5FE434B45CF5C2D0E5E417EC279DCEC4F16504EE40E837B11620B7 +7526AFF23381ED3E9A92DA4DBF4EA2BE4FE444B9A74AB60EFC818E20DD8B852B +DF8CB659C0A3956D0DA61F49A9DD467726E57E9B32EFF540D551A67213D40273 +AEAA6E319D92B4B406377D36DAB85662C755D76ADF5795C52D54ECCF0DE81E30 +B84F951233A0A400CB063911837F0AACF44AD2441A7CE08818D64705E1ACF7E0 +F59AEFC5DD812981C5508385274817056B2CDCCA4C9F3103C92838917EBFEC94 +21D5737AC634B23B6F7F63B166D60C6BAA8F33AF44379C5A7337E737190EB3EE +14272B905D08C01EA118964D3444A03676FF3B62E7626168FA1DC6220699780A +0BD5776DDFA26BF0BB335B3C978CDD5CF1A419D4B5C562B3974FECFCF0118199 +E547EB287CD92E32E881F344420FA3CD97333BFEF5D7E1BA31FD20622E5B4F95 +692DD0ACAF01D413B21C8608FA87B470191C3CC5AD333263C955B4ADF4370FCE +D6667FC93495003F4B6AEE4F83603D55F19EFBF56F955FC9CC01E494804952CD +D426FE706C13D41F87C5C668D8B6BE50AE0370E07F52AC0534ECAB1C19851099 +FC0BB1EC2A649795A62299F73CA606EDFB1D28183DC63ADF67294553115E8C57 +7CB603CC491A6065802B925E6DFBF42917EE6E44C714228AE452851D61BF70AC +844B5D800EF029357FD659B8A648445CED0ECAE1474E443124F4B3644F54C556 +A330D92EABEC7F607C6B13FACF69CA928F835056BD1A8ADA20EFE6BD5CF4A1A0 +8B9E415E4A5FC6F209EF05ABF2E0C55F6E3060D1C72967E1E68791499F303C8B +3960C5A1F2DF6306710DFA98C8D0815A06B5590374554DCCDBDC4C295B3BA6B8 +8BE3200CD4421A521C06BE39D4CA495BC63F3F982CAE3C82AD38DCB537E617D3 +34BD96EFDA7C6A0F6D97A6BC9F084645390E194E7A11399FCE4EEB9A965909BA +6EC69D34DBA081BB3F18BD1ADB1AE1B7FBF96E4C546498667690857EB6931841 +46C427A5B7C7D99FF889582C4AD11A7D267B301C5A5AAD9DA99D5BFD438238DA +62DEB899FF0F7B7997F781315B2CC328BE3572A3903A33EC901AC6BCC7F152A9 +8A6865C6CB17189A4EEB699006A5F9D4482D53A76E88438E444F9302C79F0DC4 +B3033D29D303B38F5959F020337EE6619DC8A8C3912101B02CF8AD113BF4BC29 +8C6B9D25AF6B6A787F222C05964475B49B6751E3A3A6EBBEA03677D5B136B9DC +6D9AC20193BFB0759E89831C9E2AF68BD45ECC81175DFE80DC0879069ADFA8E5 +24CF3C84121CD9739A28BACB9891945FA4E72EC07136682E18FCA81938FA6A3B +8CEFBAED60121530E33C1C0E698B5923D6AFC4E907A99B1367C3D435CAEDEF5F +878237453B8DB2FE53073CF3319FD096343F42D68F097759D051AEE17E4FCFC9 +86E17099799DE82A38F22D870BF7AB90890E3B5264976700BAE594C8563A218C +C985D9A5A7D7BD959F7E4E66286833C86E89203ECECD6FC4C6FE1F04010218FA +A5714881C4C846E85F13BD68AC250CD0E488DBF60BB10B2CD7AE2E30F9C21DFA +0E84F76B4E996AA1C5C056E64BAC85622C160B56DEFD4DEF86887C1201F7C20C +076D4A27BA69572BE9C89FF3A9D3BAA5CAE0A6F2187AD01ED497798A305E3BD8 +422DBFBF45E3F4AD35240B07285128B59FA9E83D9F6A2E620CAF6DB05129D930 +44CB241CFF84E776315114C3AB61FBC0A8368D9154CC5066E2B162E89DA51165 +F9CC075F2524F9A8624D2B56ABE64AF93B9F0407CC770C1F2C76CCDC06345D03 +7B173C2FAA201D8E1F6C0315987A7A13902F4AA5ADF081C2B0A01C77E4F7A3E7 +6A4AAEDDC577E855D69D38AF6A1D271B02AB496D94D81996FB078FBED17F833D +C6C0BCE141BCDE277D530951DD6574B9CB3CF0370D74211E9AC00C7CD3A67842 +0B4B72ED517E4906409DEA7993D0B8E92D418139960EBC86BE63A1B1D417C451 +8BA13C230DAE1EC4E466F23351D410D9FC4A7BBD477D5FA07659B71CE9921B1B +6755C67AB3D4988064004CF75948879D16174E8097C91F7544352474C2D9A1F8 +A1813BC6F4BA13E952678F5707F19B4799ADB3BD186DF650821DF58CF3C78D67 +84E4E1DF8DACEC50D15647C3DBBC3C4355E602D3A03171FE1CB36FEB940211EE +0A5300841DD7B7CF91C02B3FC5D89C691156BFF8A38C6C72789DF260B868AAA1 +895046E405661D97FA9A0048AF114A89E3ADAEBCE541753E4FFCD902391B5372 +6A97E32F0257FA9FA1DC15BD3140EC7F0CA5A68AABCEDBE73C38B35FDF195F96 +0F9DB0F592C188D72D73512F4DD92D2371D1A59254BC477CA084E68184AEAB6C +266BB21DC3AAF874DE999AD2A17C79621AE322612EE4B6D5BDAC511418EDE90A +AE75066AF19662C4AD855E4200A5D67BEE4ADA9A399192C74D35E59B15FB61E7 +BB167282D32D538029ED22CC5C9860C1F6B7BA7F33D5CF108D4BEEFAE7B37E67 +39391F9934DE17956303532ABB011540645DB8420749C9B9A019C3CE86ACD566 +1EE8D8D5E0D8D0DEAB33B5413EF10D4EE650F82417002E436E0B3B628A657F84 +074098C2E9F897D9AB692E0FB9F268E6728F94A79CF4D6B0A07C8DFDC1D67FD5 +EDD5863EA8949D180B1596D0009D662FC429449D76BF13D83F0D0CF165982443 +E9CC288CF7C5F2E17EB7F3736D1FB814196CCEAB8C833720E3733BF594E1B536 +BC0063080BC751F9DA1741522B2967D07DDDA169E7D3417B4A39EFAC15EA5E8E +DE3473CC9DF991FAD2A971F44B09635085DB02D692F149F144F3DCDB69B72C53 +A2AF34C65DF0D5F35E82102E67B733750646EC03A4FF47138F7998607BD93AB2 +B63A0B82E8E225FFAD5DC468077FBE8C8C8E5B4BB10A8FE836B07367D742BD6B +D36DF5304B9DF363120504C279453452EB177FBCDAA6F6FB78A24848F4A1D94D +1E49F6C46CB36796F3F4C9739346381F28AF085C5EBDB2A02DC0570C7A21E097 +77522D4947B51182431BCBF3E55CCDDE93A916AA40CEB577277FA512380816DF +9111C56F36341381D62368E70462577D0C135BB3CB4462B269AA8E0F03245BFA +D01DB8E23F2DFD5DAA88FCAFDD51D48E562EC649DB1FFDA0FD8CC8C48E6A9207 +260ABE35733D75630053CC74A07E5AF6FE87BD5FEA69CB6AA20122276AD92853 +6B225BC9E3350D1B1362E04C7795D473F1266852B02C83D02D938C55D8F0C671 +7A9205F8CD058304DFA034D99A6BC16C582F02484A089602D42DF30D7A5716C1 +D42A4CE56C19E40C01DC7DED931FA13679CFD2700B3826A1E6539AAC12293DA8 +664DE251C5D1761BB45FE364CE3F7F7E9B67F86EB31D9626CCACE4DCE03EF3C1 +0D2FD1B12B5774510D46C5C5CBF0A34847418B9A1DF0C67789422D0EC2D49576 +9DDE72D63A4A98613461A6F730A05336C691583F96C3CAD2AF7C4BFD3AEB3814 +D909858B6598FE19397006C8C4D549AA1635968F47144E7861A2BCE8AB4CA7F0 +4D253949AA0127559FAE3161C810A8CE22A3079602E747C9398F9C8B2A868F23 +D77D7AD6B980FEB038E0557E58E1D7AE471036CBB96B83595D9C96A4895971CD +C2A810651A045F876A1F5AE470BEF39F856808B1F8D736030A722E1576BDB3B4 +4DF06F73D38D313C8A0D3504EFBC774750C9F6E687ABCB1927FA1BB3882AABC1 +2306A030CEBB259AECAA646C6497712F6C1E9DB7E1365A60EEC5AEDD5147A77B +1E3A10D73C477876D54FEE853D953EE75F7EDFB287550B93CFA8250D1FE2FE7D +D34441F1224F3DB1D355188819EBB98A94DB193B9CA23803869DD10776647BF5 +5BB42031AC44A7339DC036AD0292AB9B732E6FB79BEE852A103C3788BB0F4B72 +EF37BB62356F9B2DF7F5899A26F1FE0A3D6469C1034B8AB14F52555EBF6DC592 +3F24D6DB395A3A182ED4B8ECEE8254661C19CC942F236CA40BAABE818EC312D8 +7F5762C210FCE8A3CB9A23A24D0A751A09F4FCFB72DD0FB3AAE0575CF97D126E +1669203BE1C8F8FF626F49E8AFA7B29EF26618C6D8336D4471314D5D009BEC8C +D914E74D0BE7D7C3A2511C0DDEB6FE04360D54FB3283AD67D9DCDE211FAFD19C +449E201F2913232DDAFB2043F674EA73C9F043EB73CC9A96289B3CF819DB3E56 +5FE403D8C387C99979ED9F8EB2F4EA9934F170D87D1F0D90CE8F3EAE863FB027 +FB5969E37145C8D881AAA4E0464F52F3EDDF47DE80E64E5F88C9498795601ED3 +A72231E130CB6E12E656AC7FD7AF2F2D88EDF9FAD3416464A96E39E0D658E84A +26768B0CE92C228D6C8C79C397C45A6E02F119170A60567D8A2B4A194BB16F26 +6C4D2DC0D7892B367F6DAD1FDCD7A34B8F96DE8B73C08E980617608A10CFA526 +2826A1CCFC62F730F5EF457571EA48803236DC578D68C9FC2148A78033C8606D +8DFCA32A17AFDA0E7929CD6FD50EF80D543F9F2CFE69BFDB07E08B235297B32C +6FEBE64AAE1C9C19F4076A91CA0D9CEF9C03F89E0269632619318DE67D028E64 +5ED99CA2F4A2713C7E5B688DEDD6E8C2BD26AAD1550EE45D1E9869E8CA43A9BD +CA70496A23142B1844B03548847FDC62E016F957BDC370618058D93C34443DA3 +81CBB487687CA5D735A2B584616E18A87712118E1307CDEBD393B6ED860BA1FB +FBDB0CC9690390A9BB97ED6FB106E53E5753DE0B7A0C7FC2B9EAEF95A3B1733B +C96615E978BC04BBED07922D6BB9D038F1F40945D3DF42921EC328513B8076DB +A0D8E8424A5D126BA38B2D37952BDC2630D81FE195F5D2AE2449BD18E304A0C0 +C8B33A98C8F31C01C93CD1D47DCCA831AC8AAAB199CD41AB8E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.0: CMR10 003.002 +%%Title: CMR10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMR10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup +/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMR10 def +/FontBBox {-40 -250 1009 750 }readonly def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 40 /parenleft put +dup 41 /parenright put +dup 48 /zero put +dup 61 /equal put +dup 97 /a put +dup 109 /m put +dup 120 /x put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA +0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 +51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 +7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 +E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 +0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 +C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 +569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 +24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A +2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 +8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E +3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 +D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 +D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B +03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 +767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A +8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B +DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E +94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 +22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 +72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C +8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 +344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A +64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B +07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC +1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 +78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 +CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 +7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 +BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 +4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A +5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D +EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE +EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 +4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE +0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 +C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 +314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E +DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 +EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 +DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E +DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 +7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 +1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 +69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE +EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 +7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 +CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D +38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 +22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C +0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 +BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D +4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F +3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD +B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE +15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 +849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 +FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 +4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 +1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 +84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF +7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 +CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA +4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B +3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 +F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D +F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 +DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 +D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 +56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 +8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 +59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED +49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 +87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B +8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 +C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 +D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 +D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 +F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 +0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B +5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 +229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC +17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 +01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 +F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 +3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 +689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 +4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F +A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 +DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D +364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F +7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F +26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 +43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD +8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 +C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 +94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 +C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 +B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 +4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 +7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 +204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE +B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 +7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 +279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB +E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 +CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A +65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 +BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 +6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 +B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 +63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 +4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A +A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 +67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C +DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A +5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 +C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C +9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D +B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 +963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 +D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB +B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B +72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE +B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 +8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB +3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 +668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 +ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 +69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 +C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 +3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 +407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 +11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF +2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 +4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 +2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF +9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 +CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 +DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 +0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 +5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 +9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A +EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 +09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A +2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 +AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 +324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 +486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A +EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 +52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 +9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 +4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D +B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 +BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 +6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 +B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 +16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED +E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 +546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED +6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 +559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B +C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A +ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 +04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B +7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A +8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B +A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 +94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB +C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC +41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 +7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 +18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 +9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD +E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947 +5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F +4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F +E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF +9F9EC2518C77806A19730C97F54BEAD10B4729E5749A10EDBE644886443D1249 +2C8517DF8D8AE98E2882439FA81903941B363A7D885F93C6DF9E1FD89F2F8CEE +B870C409ED13E78B4C914813B0A01DF8F876EDCC4F384055FD37C575726AD69F +F23D50EC5BEE2FB95A44F2B2E2DD94C933D90BED2C97B53738B4B2ED56EBE617 +BEF17B9DF4F314A37F10FDE34C570D7BE76A496A58242F51E7321380CB042424 +855F4B53071DF5A0DA5A31B8AAF9FB4F4C491625FF8FD008BD4402918043BEDF +77B840B2BE0DAAB4EF904FFEF935954AFB9BD2041241B1BC8519EB642C89E288 +479664226DBB6F1171F9EEBC7E1273D0CABCF6B1BF7F26AF21C21D9B1B916F4F +603DDB68D3614B86566FC91D67AC3F4A4A96E256FA1A3BD35F4465AE4EC64D82 +34BEB4BBDDCEEBD9A89D932E55F14CA2776F927C4FD3E0920790A57DAEA08C5B +169A3E2309DA6BA8684A5D1DEE81415796E13DCF906FCDADB092047831B16841 +B250CD148557D72DD7E683BF122B38E2C4F614E59B395D1D9823D7D5F126D932 +14B50A37FCA7120F8F3A8E42134F1B6B0C248D56F247AA68FB941839F600F61C +14247EFF780BBA3E5198D37CED44DEEC3455048FC451BCDB48DC414AE5293A60 +5A59877D6DFD21EAD729CDB7B378CEDD34262B37A194EDD0BDB24AA42649375B +491DC08F6B03DFEB517B2FC125DA9373AFAA94F4E4BC09510A73E079F4ABDD8F +93529E898B13ABCDE7322323B3A2A02A0BF388E89B4F529A66FA22D38E3EE342 +54475A1989BFB7A119CF95750D5A18BB4FA9CDA30DB6F1AEF8AE8448BBC999C9 +FD0D74DE9A17A3153617F07CACE92977B68FB5A1CFB29FD42494D5D2B9C1ED81 +2F3CCEEC1BC079E837DDBB57C7E351F9925FB96349F8D9786D8E6FF03E9C4C1E +67DB235577B68003BA14073E2702296B284F803259283005D97035874D2B9AFD +4D3F29B4B1E6EDE30DDB9C68348CC174A091791FA74520C8614D4FB1125CBD6F +B9367559D715ED057FDF6DAAC180C7FA5CCEFD0C5878A91B20D4919792C03CA9 +3AFC986C34C08358A3E85F241E3F8F815FCE7C8E07C2A4258E17D65823264049 +3803D47C96A2745580EDC957AC4291730A840A2BADA50A28342A2B7093A3F731 +4F4F656E974389E133C53F89D5DD6407BB98B211697941A927BC72A0956FA78E +2DC624B2C253F76778698BD1510D509244AB0465D4261E3AC31D77C4F755096B +50C9CD8103CFF51490796CF35B02E38BFB36CBF2E6D0D7304344C4523C369946 +C3BAD318835D4707E90A0340BB7B6ABEBE9EF7E7FF54D1784AB514FAC0FDC8DE +B8DE95405811AB2F25F2391855929C2C452295D698C749DF868A962183036CEE +800D650FE2CD2E74C038665ECA680B173A27305874D4AEC967043DBCF9275F02 +7D92A0AC4C098A5DA5939BFA435FE56060110EA1E9FF2BCC9C5E93964FD43199 +8133454CF0A83B9946D6D2235AE3F345BEFA7D935A4FD76D7A9CF080E34D1983 +6FAB58E2C907D4EC63F6431805A40EF837884510B1A8C7CF8F290F034784C81D +9FA6ED8ACCFF15B6ADA1CD0460591326B7A7A5FE7216BCE081EF42F0846374B5 +0FF9F6FB8025D2DBEE17991FF93E7C09B55135397A77ECB051306B93C58A2598 +60E294DF402A6F07B1FD679025022AFFEC2938452C72400B45A1A49F1DA9113A +BA4C4528E9DAB7F86323AE99A1932A49161F10A37FF2A4D56FAF883DB84F209D +76982A6131DE0B316E898A4C039154A90CA72991180F9EEA6E0105B8A4443A37 +3C8DE253233006178B9A6BC69ECF2556E28A2DEFB6371422CDD07263005CD570 +9DC4C9DD7FC9563CE02E9DC08B593F7487CB390BE164AABEBDC37B3AFBB14163 +4F0D84EB6821FC9B0C4B5071A6CE358A3A3368746A027350A9FBF947BB7C46F5 +35097DDAE8237E4A34D9C413290538C5E297121D5532154FD33D8E79B4C628C9 +2AF3A011B67DDB6DCD3F3E9B7CD8D07BA01C580A70F81AEF70E88571AC7D8F41 +B720E8DD38E27D05E801B0A19AE1B5998A9FF51C5E059D40E2810C6AB44DFD60 +B2BD572D01AF735E4B8B627E25E329840D68F0ADF43FAE666EA92F348B21DD0A +6DED8311D4355BF65DEF10B20843F0B1AA4BE07EF0F091B2B4794752D7EE5D9B +94524DF768ADA1320E8438E9AF5FF1C1BC9FC1754260FFC0AD445193BC612DE7 +D40AF8E103F301AD9F78334079561E00985D173C94F49775E8D46B5633AFE1BC +19A5F2E6EE23CF951B1A3BDAD73A5E9751CA9B91C1301577807C480DA632249E +615A95D3D147D7B7F1A1A497BFC582EF3A79C9F067B1C1D5C9E915592F7FABF3 +5E2250FA2FA236F9EB4948B3E81EA3AF8F31B1B1D9F507658436359C2461BEA5 +7F9CC512BDC51EF2549FF57661DF6F504F14DD921D63C229C8B7CE8F110BC8D1 +7C7BA9A9B55CFB48945479C09580F378E3BF2E505EDA5B7C80281E3B8177E304 +58C0E8F57E41C25DA1DD93FD7C17D135A9B8DFA02B8B05136C106FE77841F6FD +BA6E4F0859AFD74E72167A3D3BD86F381ED2CDCDFE5EFA7E35DDAE6A622AEBA8 +3E477B00A3527ABB89509D58442248ACD2A7972364C8360C4E43E219814D0C57 +8D5760BF6A389251D6969B8AF3AD360A8CCAC8F43A31276A3946D95444CFF436 +EF0E377B784592EFA61B9F3B463DEE44CBA80C234D6D7E0D6A70DA993DF4F2C6 +64871EB1A07B3A6946D45571FC760DFF64BE8FA97AFF07FA05D23A01A37B1338 +2227A754C1EBBB82AB146D2907F0A3DC00C10F078073E90FBC968AF4ED7AF2A9 +13FB2CE66241C5102CAEC3992BEEF1910F6D09BE359831087184E41CE590F9C8 +EDED379908519B5816E18C1E414BCD11258772EDC99ABEFFC56230A511312DB5 +73060A7E73001ABA76E395D789B1943E5D25DAA9FF60D639DE068E6459B14ADF +A9FA485656EF5523D6EE9BC66EF49BA3F2E9C583DA5729C5771B5A4DF8004160 +3CE71AD9F2AC7E8DB53B169D9EA548E76F9122B0BA20F1FBD0943FDD2CBD979F +14D3344472625960C538CE068797C86998828C37D755FA9299C1B5DBB6422A92 +17C715AF477C88DD5DEDD4E96CB8869BA39054EEC13052D4D409B90A8BB53400 +B855E104E8DDBB26932C9159376F20EAA78E99D49FDE706ACC525BAD14D0A91E +F1215724451E9A422F1407AE56227DCBAD21C44AB520A51E85CE0DB746FA2236 +5FDC390D2EEB77CF388B921998F0F6B490E7057C9F0B0753B7C231DAF49C5BC1 +37C6CAA8417E0E398BFF084DA4AAEC387976DE2DF2CE4C7FA7E32726C14C8983 +BAFE85D7EB25E9A9F78570C5EB7F3B2E840F4AB78276482BA7F6227FFC663764 +7F60689511D7E629C51BD20A864D0F392CD344DAAC816906AC2D52343804C9D8 +95002D0311A4229999957AC43DCF40988D91AAF61AD15FBA222468D1868DA581 +6F1674086A56C5E856476A91B9EA84832D84FCD658134AADF9FF25BD3B43C277 +7B2D6ABCF97AFD32127FC0F5244EB710970143DD0BE93022A0609D842A73E18E +5A83FCFF16E0712EB08935FFD9F6B52DF2CA685D9FCF6EB3EA381D04D9341A1F +CF593FF3F7E8FF5A54DE14B3A02ED2F25153E83799D502A489EBEFD02E1CCA03 +E2B3310F44C65DD254E4EFB95CD33E1B9FEF68E7F5A86DF4AE6AC39AD24C96EC +2C0741DFCD1AEBDBD0D5070B28D49676C5983DC361FE4156DBF2384869D93D08 +498CF6639C73F2F1720F53A06BDDBE2B9C27FE7D50D23AB9A00613E15C370563 +EA2D09AF9882DBF6391C3A92C8BB6D6504ACB0860784F8284A1A189AB9292266 +CF2C53391EF65D3BD005C53C7CD24708D3D61182ED4AF3F3FAD67958BD161BE9 +F70A31ED83B1E6600DE15EE93B0F7AF78DC31A491E8A4C9FD3DBA03EF6E49ADD +4CCF1A72B21AF0F6CCF7EBA5BC29F74ADEB4CAC33B9C77E4764BEF237401B8EC +C1671A348ADD5A3F65FC5CDBCFC27C7F1C23FEBB45521BE27CFEE873DFDEF4C1 +C5D8BE781DE4E87221453AE6C437030B9157A9B18E239FD030142620954C1099 +9D3261FD8B766F2033FEA397680C17C0435F205512178DFA81CADFF995B8B18C +A1DE7CA3343FCB1C9E299D09FBE4431DB76BCEC00FF3EB7CD1B6BED7C22FCA9F +DEB59FAEB3A14C15E77145FAB770829F886315D0870C5F7F5927D81530064348 +28B82C7F9D914239596481551236BACDC1A3838673592DD18309EC8FC9DCC319 +B728519701FC6EF0BC917DC6883DEAB581BD17B995D1CDF6CF05FC159228B4AD +63F83D478841D28537F373AB7D0E00C7E66A52A1ED637C4FBF39F682A9A56FE0 +D7D1DE348AE2B3188D602843C4E82D794E93A46649CF81A01FC16AFA101B692F +2C4B5679CC6D74215B4C3F57DC9EEB4396B5870CB07E678439E22B8DD3505C79 +7B7768ADB537AC42D661346E7B25C5BA6CF2BE6E899543E3D7599F938DFF8895 +278E35CEBE8A3A1C921F04400047B56254F30984974A2B4609AFAED905A5D21B +80ADD222D04BABA01998413D8882A108577B97B3D4F36FC5FB2BD1189FFC37FE +7AFBF6D4B79DF8CEFDC0FA2A5E924B66F175178E19AA5BEE8CD063BFD77BBA79 +B59CD2CA437160DE83413FD99B9520F582F710A70369D519922EE5F072F7D8C0 +2CFB0B27BE1A7EEA9054AFCCA5B9D5A6435465675AE8EEDDB9509E0C5076087F +B36549592E42E43DF387C48F06D2A1DAFF6F91E7BA758481CEEFD457FB4FDC3E +14AF15CCC36C6DE161A2FAFBD6C49DEB5F450795412901D78E92B086AD42C812 +4CA6E46858399E30F23EE0F863F8B16D07AFB48A704444A9E25994A94098C735 +D6ED524DE18F2CC291217B98F4299111D4ECC7C945FAAE732C13C80990C2DE7D +8A2549706A8820BB8C2F086C0C5531B435FE389B9235A3BA5B86F64611CD1182 +432327887EFE8BA9CBB3553C8ACA17FB99E39369E878E284C6417DD331DDB4C5 +2AAE7ACD3C2263E6ED4C877AD159391014B8AE7DAF61E8A666DEE2D1115DC28B +EAD15C75228B9D1931FAA2CD6B8F04F43C84C16C1A8856B86439980A2A38FA15 +F18D6BEC3517BDD4C26CA47680E82226B74358DD7EEF9515081C3009D1AA6F80 +E92ED818CBBE5C4B7F19B9BA5CF593C5C21701A86937B153F014B61860FDB933 +89883CB7A154D3007CAD46 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.0: CMMI10 003.002 +%%Title: CMMI10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup +/UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CMMI10 def +/FontBBox {-32 -250 1048 750 }readonly def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 59 /comma put +dup 62 /greater put +dup 101 /e put +dup 107 /k put +dup 120 /x put +dup 121 /y put +readonly def +currentdict end +currentfile eexec +D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 +45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 +7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 +72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E +BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 +974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 +11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2 +1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C +7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B +0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085 +EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37 +404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133 +78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF +A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE +88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4 +C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC +BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88 +98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760 +E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44 +143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3 +981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490 +88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285 +4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683 +FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F +347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F +FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB +C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04 +B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733 +F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA +29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66 +36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12 +048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0 +80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C +9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B +75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E +4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC +74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B +D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355 +E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097 +EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D +543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883 +710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6 +EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F +7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93 +03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2 +01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89 +500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F +F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208 +AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE +1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915 +85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C +4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1 +6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F +55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18 +085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02 +BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951 +2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D +CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E +BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E +D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1 +991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125 +6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754 +E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80 +E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1 +B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3 +4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65 +1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB +B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7 +8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA +FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6 +AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E +BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051 +E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD +38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3 +7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751 +2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27 +DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D +22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6 +8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB +44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90 +D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A +42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF +C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E +0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE +66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6 +E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1 +6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E +1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10 +B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B +897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E +EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40 +A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3 +F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA +A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126 +2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6 +51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3 +598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F +87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE +178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6 +4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78 +7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6 +AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6 +3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379 +337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547 +C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5 +DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA +7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD +6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC +98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355 +821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4 +C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886 +7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6 +B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16 +A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325 +23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF +C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3 +969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10 +3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B +9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725 +1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239 +B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966 +95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7 +FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE +44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986 +FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4 +E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA +633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D +6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F +FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD +375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2 +6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7 +EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C +E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D +F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156 +DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891 +D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538 +D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4 +9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B +9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6 +B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0 +D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF +8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93 +FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26 +B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F +00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50 +909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49 +5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF +7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA +BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0 +C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1 +BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37 +BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D +4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075 +94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1 +F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9 +E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA +92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0 +63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A +CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271 +B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9 +5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E +86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0 +AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180 +3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC +35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD +155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580 +AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255 +E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F +226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496 +9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B +8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B +919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE +A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7 +9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0 +523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7 +88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D +2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF +AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66 +B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D913FCF244BF664E52 +6105E2DDFC0AF5591370BB319E653A6A2AA7FCD80CABD3F952FA948239E2D270 +07F90D70B53C103507F1E6B965151331708AF0D8066824D5B5419C72E2C191B5 +428326E0F9D7EBA060B93BE42FDD7F81CDE2C6C297744793B513C87B10CEF0A7 +644BEC70EB095D01C723C9A088C4C22C5A4B21A9D4591C37634589EBA34B363C +41F2E99812DF9516F017159ECB88C1BDEE5F4E4AAE98AF60C2AEF6DDA2ABC023 +54BFA7A2F12B29F6B01DC240C6B98323560CC09829A0AE4FDB88BC5382769F5B +F2A658B147ABD87ED5C0FB4F939970228BC847105994FB007D44781D57E1C470 +242127C1C21349EF39E57AC2F7BB641D4C6271E6315BC27700FFD238222542E4 +3962CD0B203C42750EF52F238DB3EA062734CE21143A01F21889C0D3A879CA94 +3B6D14323932D0BAA72C601BB48D7F67D3632D0ABA2A1151E45BF03B9862CC6F +3AE3ACC2C293110504E70A8F390F1E2FD3BDF5E0312A9C20268CB85295297A59 +99E3BBFFC2E0F44222C0D52AC0CFB9F7BFF3EC0A18AE0B05933FBEA3A53A37E1 +9C617BB086F479BDD6120035F01F710F91F1299E5F92A17B5286A07311455D8C +7FB028E29FEF14BD16579D029C4194EA9BD519D41BF8A867C53BE45C3F38CA35 +17274D3B2052E76949ABF3F44924D52AB71BF66D5607761D3B664232EFDD8AFC +89D5EF651C9821CF0C74032754D7AB93A8E141809C28DD43466E7620317F16DB +D91BA6A86C98EA700735AE5CE4E92325198E4DEB7D566B9766ADDE61C226CCFE +1ACDE0757F04F78CA31C554BAC1D06D2C54656628197B421377D53B818990262 +1E56A7FA6EFDB5FA3EDF3F09CB603828FF3B7364CFFBF3F64CADA07E3F13077F +F61E470C99DA2710A0FAABDC043A485CAAC08497B49E8408A408CE6D003CB668 +3260F26C65DD1AB2F9508BD821DBAD00CF674CA9A9F211A6F29BA93FB9261396 +7677E0989D512025976DAEE1F00970EE613557E2919546CF66C0A0970DF81C89 +D32DA12A9AAD43221367FB4828C7CEDDA8086B160AC86AC71838F65626F072E3 +AD69C8AE3B4FB9AC18BBCA81D800CAB7E0F4BC3912B030185D04F4B88D7EADD4 +5E8E7BBBD8CB3B5297E4AA518E2B7748DC1A76EAA97F5C2255A7185D8871767D +778012F79D88AE87157F8F5FA6864270B264062E3479270B021A6D7C7AB75D50 +09765B1855093BBE5F50C996DD6FD18ABFE4AAD930B4851B048AE08611A97662 +9144CB04FBB495FDF725FEA6D62F8DA2EC28ABD4847069EA254B38C0501DA25A +A2B87214CE3294099E38941FC595CA51B86A3A2296279E0E781DEB156EDD257D +A76908557876B336953214F2BA1920420A09918DE9B06764DD8150692A1E1BC3 +088F322572F4B6C26D9E267BFAB5411EC90EAB6771556005FDE803E937C58550 +AE6FEA59DDF4DB2417219C8817CC4CD40BDAFA2C2231C0FF59ECAD1D8837936F +D2EA06D9804D43773A28FC575A440A7F96D123BF2ABF7DFCD663A382CEAAF4FD +D6CF945E6592EF78615231E603CA7ACC3B43EB0F7B256EFF0C7397550C0D42DC +8315D32678B559D202666B57275A81088343FFFB559BA6459BCC18AE7A839E31 +7489E76D80ED8E8CD47927986CD34C9142830E63C0149895AA3F63ACF714F4CB +92DD59608B5DC1B486DCEF0D78D2FC6B55174E2BC7815960E0C1EF0B90BD651B +416EE9157D2E1D360F36898C7EE3A5CBA341B8323B2519 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if +%%EndFont +TeXDict begin 40258437 52099151 1000 600 600 (_formulas.dvi) +@start /Fa 149[23 105[65{}2 83.022 /CMSY10 rf /Fb 236[61 +61 18[{}2 83.022 /CMEX10 rf /Fc 135[44 10[69 11[42 35[65 +12[42 6[32 32 40[{}7 83.022 /CMR10 rf /Fd 134[41 47 12[43 +5[39 38[65 2[23 59[{}6 83.022 /CMMI10 rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: Letter +/setpagedevice where +{ pop << /PageSize [612 792] >> setpagedevice } +{ /letter where { pop letter } if } +ifelse +%%EndPaperSize + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 1189 735 a Fd(e)23 b Fc(=)g(max)1507 +618 y Fb(\022)1578 679 y Fa(j)p Fd(x)p Fc(\()p Fd(k)s +Fc(\))c Fa(\000)f Fd(y)s Fc(\()p Fd(k)s Fc(\))p Fa(j)p +1578 716 460 4 v 1706 792 a(j)p Fd(x)p Fc(\()p Fd(k)s +Fc(\))p Fa(j)2047 618 y Fb(\023)2122 735 y Fd(;)180 b +Fa(j)p Fd(x)p Fc(\()p Fd(k)s Fc(\))p Fa(j)24 b Fd(>)f +Fc(0)p Fd(;)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/dspl/doc/html/_formulas.aux b/dspl/doc/html/_formulas.aux new file mode 100644 index 0000000..f23e546 --- /dev/null +++ b/dspl/doc/html/_formulas.aux @@ -0,0 +1 @@ +\relax diff --git a/dspl/doc/html/_formulas.dvi b/dspl/doc/html/_formulas.dvi new file mode 100644 index 0000000..5836aac Binary files /dev/null and b/dspl/doc/html/_formulas.dvi differ diff --git a/dspl/doc/html/_formulas.log b/dspl/doc/html/_formulas.log new file mode 100644 index 0000000..7ab41b6 --- /dev/null +++ b/dspl/doc/html/_formulas.log @@ -0,0 +1,106 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/W32TeX) (preloaded format=latex 2019.12.29) 2 JAN 2020 18:08 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**_formulas.tex +(./_formulas.tex +LaTeX2e <2019-10-01> patch level 3 +(c:/texlive/2019/texmf-dist/tex/latex/base/article.cls +Document Class: article 2019/10/25 v1.4k Standard LaTeX document class +(c:/texlive/2019/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2019/10/25 v1.4k Standard LaTeX file (size option) +) +\c@part=\count80 +\c@section=\count81 +\c@subsection=\count82 +\c@subsubsection=\count83 +\c@paragraph=\count84 +\c@subparagraph=\count85 +\c@figure=\count86 +\c@table=\count87 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(c:/texlive/2019/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC) +) +(c:/texlive/2019/texmf-dist/tex/latex/graphics/epsfig.sty +Package: epsfig 2017/06/25 v1.7b (e)psfig emulation (SPQR) + +(c:/texlive/2019/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2017/06/01 v1.1a Enhanced LaTeX Graphics (DPC,SPQR) + +(c:/texlive/2019/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +) +(c:/texlive/2019/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/01 v1.3d Standard LaTeX Graphics (DPC,SPQR) + +(c:/texlive/2019/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(c:/texlive/2019/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: dvips.def on input line 105. + +(c:/texlive/2019/texmf-dist/tex/latex/graphics-def/dvips.def +File: dvips.def 2017/06/20 v3.1d Graphics/color driver for dvips +)) +\Gin@req@height=\dimen103 +\Gin@req@width=\dimen104 +) +\epsfxsize=\dimen105 +\epsfysize=\dimen106 +) +(c:/texlive/2019/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks15 +\inpenc@posthook=\toks16 +) +(c:/texlive/2019/texmf-dist/tex/latex/newunicodechar/newunicodechar.sty +Package: newunicodechar 2018/04/08 v1.2 Defining Unicode characters +) +(./_formulas.aux) +\openout1 = `_formulas.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 11. +LaTeX Font Info: ... okay on input line 11. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 12. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 12. + [1 + +] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] +[14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] +[29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] +[44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] +[59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] +[74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] +[89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] +[103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] +[115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] [126] +(./_formulas.aux) ) +Here is how much of TeX's memory you used: + 696 strings out of 492164 + 8713 string characters out of 6129101 + 70744 words of memory out of 5000000 + 5117 multiletter control sequences out of 15000+600000 + 3640 words of font info for 14 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 38i,6n,27p,290b,92s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on _formulas.dvi (126 pages, 17432 bytes). diff --git a/dspl/doc/html/_formulas.tex b/dspl/doc/html/_formulas.tex new file mode 100644 index 0000000..29744b9 --- /dev/null +++ b/dspl/doc/html/_formulas.tex @@ -0,0 +1,390 @@ +\documentclass{article} +\usepackage{ifthen} +\usepackage{epsfig} +\usepackage[utf8]{inputenc} +\usepackage{newunicodechar} + \newunicodechar{⁻}{${}^{-}$}% Superscript minus + \newunicodechar{²}{${}^{2}$}% Superscript two + \newunicodechar{³}{${}^{3}$}% Superscript three + +\pagestyle{empty} +\begin{document} +\[ e = \max \left( \frac{|x(k) - y(k)| }{ |x(k)|} \right), \quad \quad |x(k)| > 0, \] +\pagebreak + +\[ e = \max(|x(k) - y(k)| ), ~\qquad \quad~|x(k)| = 0, \] +\pagebreak + +$ e$ +\pagebreak + +$ C_ord(x)$ +\pagebreak + +\[ C_ord(x) = 2 x C_{ord-1}(x) - C_{ord-2}(x), \] +\pagebreak + +$ C_0(x) = 1 $ +\pagebreak + +$ C_1(x) = x$ +\pagebreak + +$ U_{ord}(x)$ +\pagebreak + +\[ U_{ord}(x) = 2 x U_{ord-1}(x) - U_{ord-2}(x), \] +\pagebreak + +$ U_0(x) = 1 $ +\pagebreak + +$ U_1(x) = 2x$ +\pagebreak + +$ x = a + j b $ +\pagebreak + +\[ |x|^2 = x x^* = a^2 + b^2. \] +\pagebreak + +\[ \textrm{Arccos}(x) = \frac{\pi}{2} - \textrm{Arcsin}(x) = \frac{\pi}{2} -j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \] +\pagebreak + +\[ \textrm{Arcsin}(x) = j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \] +\pagebreak + +\[ \textrm{cos}(x) = \frac{\exp(jx) + \exp(-jx)}{2} \] +\pagebreak + +\[ \textrm{Ln}(x) = j \varphi + \ln(|x|), \] +\pagebreak + +$\varphi$ +\pagebreak + +\[ \textrm{sin}(x) = \frac{\exp(jx) - \exp(-jx)}{2j} \] +\pagebreak + +\[ y(k) = \sqrt{x(k)}, \qquad k = 0 \ldots n-1. \] +\pagebreak + +$ c = a * b$ +\pagebreak + +$a$ +\pagebreak + +$b$ +\pagebreak + +$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$ +\pagebreak + +$n_i = 2,3,5,7$ +\pagebreak + +$m $ +\pagebreak + +\[ H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}} {1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-m}}, \] +\pagebreak + +$a_0$ +\pagebreak + +$N=M=$ +\pagebreak + +$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)$ +\pagebreak + +$n(t)$ +\pagebreak + +$ n $ +\pagebreak + +$ x(m) $ +\pagebreak + +$ m = 0 \ldots n-1 $ +\pagebreak + +\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \] +\pagebreak + +$ k = 0 \ldots n-1 $ +\pagebreak + +$x(m)$ +\pagebreak + +$n$ +\pagebreak + +$Y(k)$ +\pagebreak + +$ n^2 $ +\pagebreak + +\[ y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \] +\pagebreak + +$y(k)$ +\pagebreak + +$ u = \textrm{cd}^{-1}(w, k)$ +\pagebreak + +$ w $ +\pagebreak + +$ k $ +\pagebreak + +$ u = \textrm{sn}^{-1}(w, k)$ +\pagebreak + +$ y = \textrm{cd}(u K(k), k)$ +\pagebreak + +$ u $ +\pagebreak + +$ k_i $ +\pagebreak + +$ K(k) $ +\pagebreak + +\[ K(k) = \frac{\pi}{2} \prod_{i = 1}^{\infty}(1+k_i), \] +\pagebreak + +$ k_0 = k$ +\pagebreak + +\[ k_i = \left( \frac{k_{i-1}} { 1+\sqrt{1-k_{i-1}^2} } \right)^2 \] +\pagebreak + +$ k<1 $ +\pagebreak + +$ y = \textrm{sn}(u K(k), k)$ +\pagebreak + +\[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \] +\pagebreak + +$ n = 725760 $ +\pagebreak + +$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 $ +\pagebreak + +$ n = 172804 = 43201 \cdot 4 $ +\pagebreak + +$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 $ +\pagebreak + +$\sqrt{2^{31}} = 46340.95$ +\pagebreak + +$x_0$ +\pagebreak + +$x_1$ +\pagebreak + +$x(k) = x_0 + k \cdot dx$ +\pagebreak + +$dx = \frac{x_1 - x_0}{n-1}$ +\pagebreak + +$k = 0 \ldots n-1.$ +\pagebreak + +$dx = \frac{x_1 - x_0}{n}$ +\pagebreak + +$10^{x_0}$ +\pagebreak + +$10^{x_1}$ +\pagebreak + +$x(k) = 10^{x_0} \cdot dx^k$ +\pagebreak + +$dx = \sqrt[n-1]{10^{x_1 - x_0}}$ +\pagebreak + +$dx = \sqrt[n]{10^{x_1 - x_0}}$ +\pagebreak + +$ H(j \omega) $ +\pagebreak + +$ H(j \omega)$ +\pagebreak + +$ H(s) $ +\pagebreak + +\[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \] +\pagebreak + +$ N $ +\pagebreak + +$ s = j \omega $ +\pagebreak + +$ \omega $ +\pagebreak + +$H(s)$ +\pagebreak + +$H(z)$ +\pagebreak + +$ H \left(\mathrm{e}^{j\omega} \right) $ +\pagebreak + +$ 2\pi $ +\pagebreak + +$ \pi $ +\pagebreak + +$ -\pi $ +\pagebreak + +$ H \left(e^{j \omega} \right)$ +\pagebreak + +\[ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} {\sum_{m = 0}^{N} a_m z^{-m}}, \] +\pagebreak + +$N$ +\pagebreak + +$z = e^{j \omega} $ +\pagebreak + +$\omega$ +\pagebreak + +$ 2 \pi-$ +\pagebreak + +$2 \pi$ +\pagebreak + +$-\pi$ +\pagebreak + +$ \pi$ +\pagebreak + +$ H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)$ +\pagebreak + +$\pi$ +\pagebreak + +$ -R_p $ +\pagebreak + +$ H(s)$ +\pagebreak + +$-R_p$ +\pagebreak + +$ R_p $ +\pagebreak + +$-R_s$ +\pagebreak + +$H(j\cdot 1) = -R_s$ +\pagebreak + +\[ H(s) = \frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} = \frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)} \] +\pagebreak + +$ F(s) $ +\pagebreak + +$F(s)$ +\pagebreak + +$Y(s) = (H \circ F)(s) = H(F(s))$ +\pagebreak + +\[ H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m}{\sum\limits_{k = 0}^{n} a_k s^k}, \quad F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m}{\sum\limits_{k = 0}^{p} c_k s^k}, \quad Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}{\sum\limits_{k = 0}^{n p} \alpha_k s^k} \] +\pagebreak + +$Y(s) = (H \circ F)(s)$ +\pagebreak + +\[ s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}. \] +\pagebreak + +$\Omega$ +\pagebreak + +\[ \Omega = \tan(\omega / 2). \] +\pagebreak + +\[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \] +\pagebreak + +$\omega_n$ +\pagebreak + +$S(\omega_n)$ +\pagebreak + +$ I_0(x)$ +\pagebreak + +$ x $ +\pagebreak + +$[0 \ 3]$ +\pagebreak + +$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$ +\pagebreak + +\[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\] +\pagebreak + +$[-6\pi \ 6\pi]$ +\pagebreak + +$a_{ij}$ +\pagebreak + +$P_N(x)$ +\pagebreak + +$N-$ +\pagebreak + +\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \] +\pagebreak + +\[ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots ))) \] +\pagebreak + +$10^{56}$ +\pagebreak + +\end{document} diff --git a/dspl/doc/html/formula.repository b/dspl/doc/html/formula.repository deleted file mode 100644 index 05e191d..0000000 --- a/dspl/doc/html/formula.repository +++ /dev/null @@ -1,126 +0,0 @@ -\form#0:\[ e = \max \left( \frac{|x(k) - y(k)| }{ |x(k)|} \right), \quad \quad |x(k)| > 0, \] -\form#1:\[ e = \max(|x(k) - y(k)| ), ~\qquad \quad~|x(k)| = 0, \] -\form#2:$ e$ -\form#3:$ C_ord(x)$ -\form#4:\[ C_ord(x) = 2 x C_{ord-1}(x) - C_{ord-2}(x), \] -\form#5:$ C_0(x) = 1 $ -\form#6:$ C_1(x) = x$ -\form#7:$ U_{ord}(x)$ -\form#8:\[ U_{ord}(x) = 2 x U_{ord-1}(x) - U_{ord-2}(x), \] -\form#9:$ U_0(x) = 1 $ -\form#10:$ U_1(x) = 2x$ -\form#11:$ x = a + j b $ -\form#12:\[ |x|^2 = x x^* = a^2 + b^2. \] -\form#13:\[ \textrm{Arccos}(x) = \frac{\pi}{2} - \textrm{Arcsin}(x) = \frac{\pi}{2} -j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \] -\form#14:\[ \textrm{Arcsin}(x) = j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \] -\form#15:\[ \textrm{cos}(x) = \frac{\exp(jx) + \exp(-jx)}{2} \] -\form#16:\[ \textrm{Ln}(x) = j \varphi + \ln(|x|), \] -\form#17:$\varphi$ -\form#18:\[ \textrm{sin}(x) = \frac{\exp(jx) - \exp(-jx)}{2j} \] -\form#19:\[ y(k) = \sqrt{x(k)}, \qquad k = 0 \ldots n-1. \] -\form#20:$ c = a * b$ -\form#21:$a$ -\form#22:$b$ -\form#23:$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$ -\form#24:$n_i = 2,3,5,7$ -\form#25:$m $ -\form#26:\[ H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}} {1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-m}}, \] -\form#27:$a_0$ -\form#28:$N=M=$ -\form#29:$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)$ -\form#30:$n(t)$ -\form#31:$ n $ -\form#32:$ x(m) $ -\form#33:$ m = 0 \ldots n-1 $ -\form#34:\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \] -\form#35:$ k = 0 \ldots n-1 $ -\form#36:$x(m)$ -\form#37:$n$ -\form#38:$Y(k)$ -\form#39:$ n^2 $ -\form#40:\[ y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \] -\form#41:$y(k)$ -\form#42:$ u = \textrm{cd}^{-1}(w, k)$ -\form#43:$ w $ -\form#44:$ k $ -\form#45:$ u = \textrm{sn}^{-1}(w, k)$ -\form#46:$ y = \textrm{cd}(u K(k), k)$ -\form#47:$ u $ -\form#48:$ k_i $ -\form#49:$ K(k) $ -\form#50:\[ K(k) = \frac{\pi}{2} \prod_{i = 1}^{\infty}(1+k_i), \] -\form#51:$ k_0 = k$ -\form#52:\[ k_i = \left( \frac{k_{i-1}} { 1+\sqrt{1-k_{i-1}^2} } \right)^2 \] -\form#53:$ k<1 $ -\form#54:$ y = \textrm{sn}(u K(k), k)$ -\form#55:\[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \] -\form#56:$ n = 725760 $ -\form#57:$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 $ -\form#58:$ n = 172804 = 43201 \cdot 4 $ -\form#59:$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 $ -\form#60:$\sqrt{2^{31}} = 46340.95$ -\form#61:$x_0$ -\form#62:$x_1$ -\form#63:$x(k) = x_0 + k \cdot dx$ -\form#64:$dx = \frac{x_1 - x_0}{n-1}$ -\form#65:$k = 0 \ldots n-1.$ -\form#66:$dx = \frac{x_1 - x_0}{n}$ -\form#67:$10^{x_0}$ -\form#68:$10^{x_1}$ -\form#69:$x(k) = 10^{x_0} \cdot dx^k$ -\form#70:$dx = \sqrt[n-1]{10^{x_1 - x_0}}$ -\form#71:$dx = \sqrt[n]{10^{x_1 - x_0}}$ -\form#72:$ H(j \omega) $ -\form#73:$ H(j \omega)$ -\form#74:$ H(s) $ -\form#75:\[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \] -\form#76:$ N $ -\form#77:$ s = j \omega $ -\form#78:$ \omega $ -\form#79:$H(s)$ -\form#80:$H(z)$ -\form#81:$ H \left(\mathrm{e}^{j\omega} \right) $ -\form#82:$ 2\pi $ -\form#83:$ \pi $ -\form#84:$ -\pi $ -\form#85:$ H \left(e^{j \omega} \right)$ -\form#86:\[ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} {\sum_{m = 0}^{N} a_m z^{-m}}, \] -\form#87:$N$ -\form#88:$z = e^{j \omega} $ -\form#89:$\omega$ -\form#90:$ 2 \pi-$ -\form#91:$2 \pi$ -\form#92:$-\pi$ -\form#93:$ \pi$ -\form#94:$ H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)$ -\form#95:$\pi$ -\form#96:$ -R_p $ -\form#97:$ H(s)$ -\form#98:$-R_p$ -\form#99:$ R_p $ -\form#100:$-R_s$ -\form#101:$H(j\cdot 1) = -R_s$ -\form#102:\[ H(s) = \frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} = \frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)} \] -\form#103:$ F(s) $ -\form#104:$F(s)$ -\form#105:$Y(s) = (H \circ F)(s) = H(F(s))$ -\form#106:\[ H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m}{\sum\limits_{k = 0}^{n} a_k s^k}, \quad F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m}{\sum\limits_{k = 0}^{p} c_k s^k}, \quad Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}{\sum\limits_{k = 0}^{n p} \alpha_k s^k} \] -\form#107:$Y(s) = (H \circ F)(s)$ -\form#108:\[ s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}. \] -\form#109:$\Omega$ -\form#110:\[ \Omega = \tan(\omega / 2). \] -\form#111:\[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \] -\form#112:$\omega_n$ -\form#113:$S(\omega_n)$ -\form#114:$ I_0(x)$ -\form#115:$ x $ -\form#116:$[0 \ 3]$ -\form#117:$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$ -\form#118:\[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\] -\form#119:$[-6\pi \ 6\pi]$ -\form#120:$a_{ij}$ -\form#121:$P_N(x)$ -\form#122:$N-$ -\form#123:\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \] -\form#124:\[ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots ))) \] -\form#125:$10^{56}$ diff --git a/dspl/dox/doxyfile_ru b/dspl/dox/doxyfile_ru index 22f236b..d8f3b13 100644 --- a/dspl/dox/doxyfile_ru +++ b/dspl/dox/doxyfile_ru @@ -1,4 +1,4 @@ -# Doxyfile 1.8.15 +# Doxyfile 1.8.17 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -197,6 +197,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -299,7 +309,7 @@ OPTIMIZE_OUTPUT_SLICE = NO # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser @@ -329,7 +339,7 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 @@ -465,6 +475,12 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -519,8 +535,8 @@ HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. +# declarations. If set to NO, these declarations will be included in the +# documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO @@ -543,7 +559,7 @@ INTERNAL_DOCS = NO # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. +# (including Cygwin) ands Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = NO @@ -816,9 +832,8 @@ WARN_LOGFILE = INPUT = ru \ ../src \ ../../include \ - ../../examples/src \ - ../../bin/gnuplot \ - ../../bin/img + ../../bin/img \ + ../../examples/src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -840,8 +855,10 @@ INPUT_ENCODING = UTF-8 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen +# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -935,7 +952,6 @@ EXCLUDE_SYMBOLS = # command). EXAMPLE_PATH = ../../examples/src \ - ../../bin/gnuplot \ ../../bin/img # If the value of the EXAMPLE_PATH tag contains directories, you can use the @@ -1287,9 +1303,9 @@ HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that -# are dynamically created via Javascript. If disabled, the navigation index will +# are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have Javascript, +# page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1440,7 +1456,7 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1448,7 +1464,7 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- +# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1457,7 +1473,7 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1465,7 +1481,7 @@ QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1473,7 +1489,7 @@ QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = @@ -1577,8 +1593,14 @@ FORMULA_FONTSIZE = 14 FORMULA_TRANSPARENT = YES +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side Javascript for the rendering +# https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path @@ -1586,7 +1608,7 @@ FORMULA_TRANSPARENT = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -USE_MATHJAX = NO +USE_MATHJAX = YES # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: @@ -1648,7 +1670,7 @@ MATHJAX_CODEFILE = SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There +# implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH # setting. When disabled, doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing @@ -1752,10 +1774,11 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex # The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to -# generate index for LaTeX. +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. # Note: This tag is used in the generated output file (.tex). # See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. -# The default value is: \makeindex. +# The default value is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_MAKEINDEX_CMD = \makeindex @@ -2249,12 +2272,6 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- @@ -2268,15 +2285,6 @@ PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = NO -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. diff --git a/dspl/dox/ru/error_list.dox b/dspl/dox/ru/error_list.dox index 722ccd6..f6ef8f1 100644 --- a/dspl/dox/ru/error_list.dox +++ b/dspl/dox/ru/error_list.dox @@ -10,7 +10,8 @@ \ingroup ERROR_CODE_GROUP \def ERROR_ELLIP_K \brief Модуль эллиптического интеграла Якоби должен быть от 0 до 1. -Данная ошибка возникает при расчете эллиптических функций Якоби при неверном задании параметра эллиптического модуля. +Данная ошибка возникает при расчете эллиптических функций Якоби +при неверном задании параметра эллиптического модуля. Функция завершает работу и возвращает данный код ошибки. */ @@ -25,7 +26,8 @@ /*! \ingroup ERROR_CODE_GROUP \def ERROR_FILTER_ORD -\brief Порядок фильтра задан неверно. Порядок фильтра должен быть задан положительным целым значением. +\brief Порядок фильтра задан неверно. +Порядок фильтра должен быть задан положительным целым значением. */ @@ -78,7 +80,8 @@ /*! \ingroup ERROR_CODE_GROUP \def ERROR_FOPEN -\brief Ошибка открытия файла. Файл с заданным именем не может быть открыт для записи и чтения. +\brief Ошибка открытия файла. +Файл с заданным именем не может быть открыт для записи и чтения. */ @@ -87,7 +90,36 @@ /*! \ingroup ERROR_CODE_GROUP \def ERROR_FS -\brief Частота дискретизации задана неверно. Частота дискретизации должна быть положительным числом. +\brief Частота дискретизации задана неверно. +Частота дискретизации должна быть положительным числом. +*/ + + +/*! +\ingroup ERROR_CODE_GROUP +\def ERROR_FFT_SIZE +\brief Неверно задан размер БПФ. +*/ + + + + +/*! +\ingroup ERROR_CODE_GROUP +\def ERROR_GNUPLOT_CREATE +\brief Невозможно подключиться к пакету GNUPLOT. +Пожалуйста проверьте, что пакет доступен. +*/ + + +/*! +\ingroup ERROR_CODE_GROUP +\def ERROR_GNUPLOT_TERM +\brief Неизвестный параметра вызова программы, задающий терминал GNUPLOT.\n +Данный параметр может принимать одно из следюущих значений:\n +`--noplot` построение графика не производиться;\n +`--plotwin` построение графиков производиться в отельном окне (окнах);\n +`--plotpng` построение графиков производиться в png - файл.\n */ @@ -109,7 +141,8 @@ \def ERROR_SIZE \brief Ошибка при передаче размера массива. Данная ошибка возникает когда помимо указателя -на массив входных или выходных данных передается неверный размер массива (меньше или равный нулю). +на массив входных или выходных данных передается неверный +размер массива (меньше или равный нулю). При возникновении данной ошибки, функция завершает работу и возвращает данный код ошибки. */ diff --git a/dspl/dox/ru/gnuplot.dox b/dspl/dox/ru/gnuplot.dox new file mode 100644 index 0000000..2cc1c38 --- /dev/null +++ b/dspl/dox/ru/gnuplot.dox @@ -0,0 +1,79 @@ + +/*! **************************************************************************** +\ingroup PLOT_GROUP +\fn int gnuplot_create(int argc, char* argv[], int w, int h, char* fn_png, + void** hplot) +\brief Создать график GNUPLOT. + +Данная функция открывает пакет GNUPLOT в зависимости от передаваемых в программу +параметров `argv`. После вызова данной функции по адресу `hplot` будет записан +handle графика и появляется возможность посылать GNUPLOT команды для отображения +графиков. + +\note С точки зрения системы, `hplot` является указателем на открытый файл, + в который можно записывать команды для исполнения пакетом GNUPLOT. + + + +\param[in] argc Количество аргументов вызова программы. \n + (количество переменных `argv`). \n + Данное значение не должно быть меньше единицы, + потому что `argv[0]` хранит имя исполняемого + файла программы.\n \n + +\param[in] argv Указатель на массив строк параметров исполняемого файла. \n + Размер массива `argc` строк. \n + `argv[0]` хранит имя исполняемого файла программы. \n + `argv[1]` задает формат отображения графика: \n + `--plotwin` отображать график в отдельном окне + (данный параметр используется по умолчанию);\n + `--plotpng` сохранить график в png-файл, заданный именем + `fn_png`; \n + `--noplot` график не создавать, игнорировать все команды + GNUPLOT.\n \n + +\param[in] w Ширина окна графика или png-файла в пикселях. \n \n + +\param[in] h Высота окна графика или png-файла в пикселях. \n \n + +\param[in] fn_png Имя png-файла, в который будет сохранен график. \n + Путь сохранения графика совпадает с путем исполняемого файла + программы. \n + +\param[in, out] hplot Указатель на адрес хэндла пакета GNUPLOT. \n + По данному адресу будет записан указатель + на текщий график. \n \n + +\return +`RES_OK` если функция выполнена успешно. \n + В противном случае \ref ERROR_CODE_GROUP "код ошибки".\n + При возникновении ошибки по адресу `hplot` будет записан `NULL`.\n + \note Если в `argv[1]` задан параметр `--noplot`, то функция вернет `RES_OK`, + но по адресу `hplot` также будет записан `NULL`. + +\n + +После построения графиков необходимо закрыть хэндл GNUPLOT функцией +\ref `gnuplot_close`. + +Пример построения графиков синуса и косинуса привден в следующем листинге: + +\include gnuplot_script_test.c + +Данная программа рассчитвает значения функций синуса и косинуса, +а также сохрянет текстовые файлы `dat/cosine.txt` и `dat/sine.txt`.\n + +Сохраненные данные отображаются на трех графиках (с данными синуса, косинуса +и обоими данными): + +\image html gnuplot_script_sin.png + +\image html gnuplot_script_cos.png + +\image html gnuplot_script_sincos.png + + +\author Бахурин Сергей, www.dsplib.org +**************************************************************************** */ + + diff --git a/dspl/dox/ru/groups_define.dox b/dspl/dox/ru/groups_define.dox index 2e42dac..7831cad 100644 --- a/dspl/dox/ru/groups_define.dox +++ b/dspl/dox/ru/groups_define.dox @@ -52,6 +52,10 @@ \defgroup IN_OUT_GROUP Функции ввода - вывода данных Функции ввода и вывода данных. Запись и считывание данных в бинарные и текстовые файлы + +\defgroup PLOT_GROUP Функции построения графиков. + + \defgroup ERROR_CODE_GROUP Коды ошибок при вызове функций В данной группе приведены возможные коды ошибок, возвращаемые функциями библиотеки в процессе работы. diff --git a/dspl/dox/ru/mainpage.dox b/dspl/dox/ru/mainpage.dox index a7228e2..bb0ac4a 100644 --- a/dspl/dox/ru/mainpage.dox +++ b/dspl/dox/ru/mainpage.dox @@ -3,7 +3,7 @@ \mainpage DSPL-2.0 - библиотека алгоритмов цифровой обработки сигналов. DSPL-2.0 - свободная библиотека алгоритмов цифровой обработки сигналов, -с открытым исходным кодом, написанная на языке Си.
+с открытым исходным кодом, написанная на языке Си.\n Распространяется под лицензией LGPL v3. @@ -12,12 +12,12 @@ DSPL-2.0 - свободная библиотека алгоритмов цифр Исходные коды библиотеки доступны на -GitHub.
+GitHub.\n Вы также можете внести свой вклад в развитие данной библиотеки. Присоединяйтесь! Для начала работы с библиотекой необходимо ознакомиться с разделом: -\ref getting_started_toolchain
+\ref getting_started_toolchain \n

@@ -26,33 +26,35 @@ DSPL-2.0 - свободная библиотека алгоритмов цифр -\ref TYPES_GROUP
+\ref TYPES_GROUP \n \n -Математические функции представлены следующими разделами:
-\ref SPEC_MATH_COMMON_GROUP
-\ref SPEC_MATH_TRIG_GROUP
-\ref SPEC_MATH_TRANSCEND
-\ref SPEC_MATH_ELLIP_GROUP
-\ref SPEC_MATH_RAND_GEN_GROUP
-\ref SPEC_MATH_STAT_GROUP
-\ref SPEC_MATH_LINALG_GROUP

+Математические функции представлены следующими разделами: \n +\ref SPEC_MATH_COMMON_GROUP \n +\ref SPEC_MATH_TRIG_GROUP \n +\ref SPEC_MATH_TRANSCEND \n +\ref SPEC_MATH_ELLIP_GROUP \n +\ref SPEC_MATH_RAND_GEN_GROUP \n +\ref SPEC_MATH_STAT_GROUP \n +\ref SPEC_MATH_LINALG_GROUP \n \n -Алгоритмы спектрального анализа:
-\ref DFT_GROUP
-\ref WIN_GROUP
-\ref HILBERT_GROUP
+Алгоритмы спектрального анализа:\n +\ref DFT_GROUP \n +\ref WIN_GROUP \n +\ref HILBERT_GROUP \n \n -Расчет и анализ аналоговых и цифровых фильтров:
-\ref FILTER_CONV_GROUP
-\ref IIR_FILTER_DESIGN_GROUP
-\ref FIR_FILTER_DESIGN_GROUP
-\ref FILTER_ANALYSIS_GROUP
+Расчет и анализ аналоговых и цифровых фильтров:\n +\ref FILTER_CONV_GROUP \n +\ref IIR_FILTER_DESIGN_GROUP \n +\ref FIR_FILTER_DESIGN_GROUP \n +\ref FILTER_ANALYSIS_GROUP \n \n -Прочие алгоритмы:
-\ref RESAMPLING_GROUP
-\ref IN_OUT_GROUP
+Прочие алгоритмы:\n +\ref RESAMPLING_GROUP \n +\ref IN_OUT_GROUP \n \n -
-\ref ERROR_CODE_GROUP
+\ref PLOT_GROUP \n + +\n +\ref ERROR_CODE_GROUP \n */ diff --git a/dspl/src/gnuplot.c b/dspl/src/gnuplot.c new file mode 100644 index 0000000..89d5e47 --- /dev/null +++ b/dspl/src/gnuplot.c @@ -0,0 +1,132 @@ +/* +* Copyright (c) 2015-2019 Sergey Bakhurin +* Digital Signal Processing Library [http://dsplib.org] +* +* This file is part of DSPL. +* +* is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DSPL is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Foobar. If not, see . +*/ +#include +#include +#include "dspl.h" + +#define GNUPLOT_NO 1 +#define GNUPLOT_WIN 2 +#define GNUPLOT_PNG 3 + + + +/******************************************************************************* +Create Gnuplot header +*******************************************************************************/ +int DSPL_API gnuplot_create(int argc, char* argv[], + int w, int h, char* fn_png, + void** hplot) +{ + FILE* hp; + char str[1024] = {0}; + int state = 0; + int err; + if(argc>1 && !argv) + return ERROR_ARG_PARAM; + + if(argc < 2) + state = GNUPLOT_WIN; + else + { + if(!strcmp(argv[1], "--noplot")) + state = GNUPLOT_NO; + if(!strcmp(argv[1], "--plotwin")) + state = GNUPLOT_WIN; + if(!strcmp(argv[1], "--plotpng")) + state = GNUPLOT_PNG; + } + + switch(state) + { + case GNUPLOT_NO: + hp = NULL; + + err = RES_OK; + break; + + case GNUPLOT_WIN: + hp = popen("gnuplot -p", "w"); + if(!hp) + return ERROR_GNUPLOT_CREATE; + memset(str, 0, 1024*sizeof(char)); + sprintf(str, "set terminal wxt size %d,%d", w,h); + gnuplot_cmd(hp, str); + + err = RES_OK; + break; + + case GNUPLOT_PNG: + if(!fn_png) + return ERROR_GNUPLOT_FNPNG; + hp = popen("gnuplot -p", "w"); + if(!hp) + return ERROR_GNUPLOT_CREATE; + memset(str, 0, 1024*sizeof(char)); + sprintf(str, + "set terminal pngcairo size %d,%d enhanced font 'Verdana,8'", w,h); + gnuplot_cmd(hp, str); + + memset(str, 0, 1024*sizeof(char)); + sprintf(str, "set output '%s'", fn_png); + gnuplot_cmd(hp, str); + err = RES_OK; + break; + + default: + err = ERROR_GNUPLOT_TERM; + hp = NULL; + } + *hplot = hp; + return err; +} + + + + + +/******************************************************************************* +Write Guplot Command +*******************************************************************************/ +void DSPL_API gnuplot_cmd(void* h, char* cmd) +{ + if(h) + { + FILE *pf = (FILE*)h; + fprintf(pf, cmd); + fflush(pf); + fprintf(pf, "\n"); + fflush(pf); + } +} + + + + + + +/******************************************************************************* +Close Gnuplot +*******************************************************************************/ +void DSPL_API gnuplot_close(void* h) +{ + if(h) + fclose((FILE*)h); +} + diff --git a/dspl/src/inout.c b/dspl/src/inout.c index 42977e0..308c50c 100644 --- a/dspl/src/inout.c +++ b/dspl/src/inout.c @@ -237,7 +237,7 @@ int DSPL_API writetxt(double* x, double* y, int n, char* fn) { int k; FILE* pFile = NULL; - + int res; if(!x) return ERROR_PTR; if(n < 1) @@ -252,10 +252,12 @@ int DSPL_API writetxt(double* x, double* y, int n, char* fn) if(y) for(k = 0; k < n; k++) fprintf(pFile, "%+.12E\t%+.12E\n", x[k], y[k]); + else - for(k = 0; k < n; k++) + for(k = 0; k < n; k++) fprintf(pFile, "%+.12E\n", x[k]); - + + fclose(pFile); return RES_OK; } diff --git a/examples/src/bessel_i0.c b/examples/src/bessel_i0.c index 9dd7f99..899fddc 100644 --- a/examples/src/bessel_i0.c +++ b/examples/src/bessel_i0.c @@ -5,24 +5,45 @@ #define N 50 + + +/****************************************************************************** + * Main function + ******************************************************************************/ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function - + + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ double x[N], y[N]; + /* Load DSPL function */ + hdspl = dspl_load(); + + /* x in [0, 3] */ linspace(0.0, 3.0, N, DSPL_SYMMETRIC, x); - bessel_i0(x, N, y); - + /* Bessel I0(x) function */ + bessel_i0(x, N, y); + + /* Write calculated values to the dat/dat0.txt file */ writetxt(x, y, N, "dat/dat0.txt"); - /* run GNUPLOT script */ - - gnuplot_script(argc, argv, "gnuplot/bessel_i0.plt"); - dspl_free(handle); // free dspl handle + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 560, 380, "img/bessel_i0.png", &hplot); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'x'"); + gnuplot_cmd(hplot, "set key left top"); + gnuplot_cmd(hplot, "set ylabel 'I_0(x)'"); + gnuplot_cmd(hplot, "set yrange [0:5]"); + gnuplot_cmd(hplot, "plot 'dat/dat0.txt' with lines"); + gnuplot_close(hplot); + + + /* free dspl handle */ + dspl_free(hdspl); return 0; -} \ No newline at end of file +} + diff --git a/examples/src/bilinear_test.c b/examples/src/bilinear_test.c index a6b681a..a02366c 100644 --- a/examples/src/bilinear_test.c +++ b/examples/src/bilinear_test.c @@ -8,8 +8,9 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); // Load DSPL function double w[N], h[N]; complex_t hz[N]; @@ -49,10 +50,17 @@ int main(int argc, char* argv[]) writetxt(w,h,N,"dat/bilinear.txt"); - /* run GNUPLOT script */ - err = gnuplot_script(argc, argv, "gnuplot/bilinear_test.plt"); + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 560, 380, "img/bilinear.png", &hplot); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "unset key"); + gnuplot_cmd(hplot, "set xlabel 'normalized frequency'"); + gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'"); + gnuplot_cmd(hplot, "set yrange [-80:5]"); + gnuplot_cmd(hplot, "plot 'dat/bilinear.txt' with lines"); + gnuplot_close(hplot); - dspl_free(handle); // free dspl handle + dspl_free(hdspl); // free dspl handle return err; } diff --git a/examples/src/butter_ap_test.c b/examples/src/butter_ap_test.c index 7ce6f42..3ed94aa 100644 --- a/examples/src/butter_ap_test.c +++ b/examples/src/butter_ap_test.c @@ -9,8 +9,11 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + + /* Load DSPL functions */ + hdspl = dspl_load(); double a[ORD+1], b[ORD+1]; double Rp = 1.0; @@ -35,10 +38,28 @@ int main(int argc, char* argv[]) writetxt(w, phi, N, "dat/butter_ap_test_phi.txt"); writetxt(w, tau, N, "dat/butter_ap_test_tau.txt"); - /* run GNUPLOT script */ - res = gnuplot_script(argc, argv, "gnuplot/butter_ap_test.plt"); - dspl_free(handle); // free dspl handle + + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 920, 260, "img/butter_ap_test.png", &hplot); + gnuplot_cmd(hplot, "set logscale x"); + gnuplot_cmd(hplot, "unset key"); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'frequency, rad/s'"); + gnuplot_cmd(hplot, "set multiplot layout 1,3 rowsfirst"); + gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'"); + gnuplot_cmd(hplot, "set yrange [-100:5]"); + gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_mag.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Phase response, rad'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_phi.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Groupdelay, sec'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_tau.txt' with lines"); + gnuplot_cmd(hplot, "unset multiplot"); + gnuplot_close(hplot); + + dspl_free(hdspl); // free dspl handle return res; } diff --git a/examples/src/cheby1_ap_test.c b/examples/src/cheby1_ap_test.c index a02ee4c..cdfa7d3 100644 --- a/examples/src/cheby1_ap_test.c +++ b/examples/src/cheby1_ap_test.c @@ -3,17 +3,18 @@ #include #include "dspl.h" -// Порядок фильтра +/* Порядок фильтра */ #define ORD 4 -// размер векторов частотной характериситки фильтра +/* размер векторов частотной характериситки фильтра */ #define N 1000 int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); /* Load DSPL function */ double a[ORD+1], b[ORD+1]; // коэффицинеты H(s) double Rp = 3.0; // неравномерность в полосе пропускания 3дБ @@ -43,11 +44,27 @@ int main(int argc, char* argv[]) writetxt(w, phi, N, "dat/cheby1_ap_test_phi.txt"); writetxt(w, tau, N, "dat/cheby1_ap_test_tau.txt"); - - /* run GNUPLOT script */ - res = gnuplot_script(argc, argv, "gnuplot/cheby1_ap_test.plt"); + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 920, 260, "img/cheby1_ap_test.png", &hplot); + gnuplot_cmd(hplot, "set logscale x"); + gnuplot_cmd(hplot, "unset key"); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'frequency, rad/s'"); + gnuplot_cmd(hplot, "set multiplot layout 1,3 rowsfirst"); + gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'"); + gnuplot_cmd(hplot, "set yrange [-100:5]"); + gnuplot_cmd(hplot, "plot 'dat/cheby1_ap_test_mag.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Phase response, rad'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/cheby1_ap_test_phi.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Groupdelay, sec'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/cheby1_ap_test_tau.txt' with lines"); + gnuplot_cmd(hplot, "unset multiplot"); + gnuplot_close(hplot); - dspl_free(handle); // free dspl handle + + dspl_free(hdspl); // free dspl handle return res; } diff --git a/examples/src/cheby2_ap_zp_test.c b/examples/src/cheby2_ap_zp_test.c index c7ff4f4..2fc9469 100644 --- a/examples/src/cheby2_ap_zp_test.c +++ b/examples/src/cheby2_ap_zp_test.c @@ -6,8 +6,8 @@ int main() { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* handle; /* DSPL handle */ + handle = dspl_load(); /* Load DSPL functions */ complex_t z[ORD], p[ORD]; int nz, np, k; @@ -25,7 +25,7 @@ int main() for(k = 0; k < np; k++) printf("p[%2d] = %9.3f %9.3f j\n", k, RE(p[k]), IM(p[k])); - dspl_free(handle); // free dspl handle + dspl_free(handle); /* free dspl handle */ return 0; } diff --git a/examples/src/cheby_poly1_test.c b/examples/src/cheby_poly1_test.c index fd2426c..3480f9e 100644 --- a/examples/src/cheby_poly1_test.c +++ b/examples/src/cheby_poly1_test.c @@ -7,8 +7,9 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); // Load DSPL function double x[N], y[N]; int ord; @@ -21,12 +22,21 @@ int main(int argc, char* argv[]) sprintf(fn, "dat/cheby_poly1_ord%d.txt", ord); writetxt(x,y,N,fn); } + + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 560, 380, "img/cheby_poly1.png", &hplot); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set key left top"); + gnuplot_cmd(hplot, "set xlabel 'x'"); + gnuplot_cmd(hplot, "set ylabel 'C_N(x)'"); + gnuplot_cmd(hplot, "set yrange [-1.5:1.5]"); + gnuplot_cmd(hplot, "plot 'dat/cheby_poly1_ord1.txt' with lines, \\"); + gnuplot_cmd(hplot, " 'dat/cheby_poly1_ord2.txt' with lines, \\"); + gnuplot_cmd(hplot, " 'dat/cheby_poly1_ord3.txt' with lines, \\"); + gnuplot_cmd(hplot, " 'dat/cheby_poly1_ord4.txt' with lines"); + gnuplot_close(hplot); - - /* run GNUPLOT script */ - gnuplot_script(argc, argv, "gnuplot/cheby_poly1.plt"); - - dspl_free(handle); // free dspl handle + dspl_free(hdspl); // free dspl handle return 0; } \ No newline at end of file diff --git a/examples/src/cheby_poly2_test.c b/examples/src/cheby_poly2_test.c index b23431c..3aa6783 100644 --- a/examples/src/cheby_poly2_test.c +++ b/examples/src/cheby_poly2_test.c @@ -7,8 +7,9 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); // Load DSPL function double x[N], y[N]; int ord; @@ -22,10 +23,20 @@ int main(int argc, char* argv[]) writetxt(x,y,N,fn); } - /* run GNUPLOT script */ - gnuplot_script(argc, argv, "gnuplot/cheby_poly2.plt"); + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 560, 380, "img/cheby_poly2.png", &hplot); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set key left top"); + gnuplot_cmd(hplot, "set xlabel 'x'"); + gnuplot_cmd(hplot, "set ylabel 'U_N (x)'"); + gnuplot_cmd(hplot, "set yrange [-3.5:3.5]"); + gnuplot_cmd(hplot, "plot 'dat/cheby_poly2_ord1.txt' with lines, \\"); + gnuplot_cmd(hplot, " 'dat/cheby_poly2_ord2.txt' with lines, \\"); + gnuplot_cmd(hplot, " 'dat/cheby_poly2_ord3.txt' with lines, \\"); + gnuplot_cmd(hplot, " 'dat/cheby_poly2_ord4.txt' with lines"); + gnuplot_close(hplot); - dspl_free(handle); // free dspl handle + dspl_free(hdspl); // free dspl handle return 0; } \ No newline at end of file diff --git a/examples/src/filter_iir_test.c b/examples/src/filter_iir_test.c index 5b14e86..0967a84 100644 --- a/examples/src/filter_iir_test.c +++ b/examples/src/filter_iir_test.c @@ -11,7 +11,8 @@ int main(int argc, char* argv[]) { - void* handle; /* DSPL handle */ + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ double b[ORD+1], a[ORD+1]; double t[N], s[N], n[N], sf[N]; @@ -20,7 +21,7 @@ int main(int argc, char* argv[]) int err; /* Load DSPL function */ - handle = dspl_load(); + hdspl = dspl_load(); /* random generator init */ random_init(&rnd, RAND_TYPE_MT19937, NULL); @@ -44,12 +45,23 @@ int main(int argc, char* argv[]) /* save input signal and filter output to the txt-files */ writetxt(t,s, N, "dat/s.txt"); writetxt(t,sf,N, "dat/sf.txt"); - - /* run GNUPLOT script */ - err = gnuplot_script(argc, argv, "gnuplot/filter_iir.plt"); + + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 820, 340, "img/filter_iir_test.png", &hplot); + gnuplot_cmd(hplot, "unset key"); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'n'"); + gnuplot_cmd(hplot, "set ylabel 's(n)'"); + gnuplot_cmd(hplot, "set yrange [-3:3]"); + gnuplot_cmd(hplot, "set multiplot layout 2,1 rowsfirst"); + gnuplot_cmd(hplot, "plot 'dat/s.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 's_f(n)'"); + gnuplot_cmd(hplot, "plot 'dat/sf.txt' with lines"); + gnuplot_cmd(hplot, "unset multiplot"); + gnuplot_close(hplot); /* free DSPL handle */ - dspl_free(handle); + dspl_free(hdspl); return err; diff --git a/examples/src/gnuplot_script_test.c b/examples/src/gnuplot_script_test.c index bcdac13..00c765d 100644 --- a/examples/src/gnuplot_script_test.c +++ b/examples/src/gnuplot_script_test.c @@ -7,16 +7,17 @@ int main(int argc, char* argv[]) { - void* handle; /* DSPL handle */ - handle = dspl_load(); /* Load DSPL function */ + void* hdspl; /* DSPL handle */ + void* hplot[3]; /* GNUPLOT handles */ + + hdspl = dspl_load(); /* Load DSPL function */ double x[N]; double s[N]; /* s(x) = sin(x) */ double c[N]; /* c(x) = cos(x) */ int n; int err; - - + /* x vector from -4*pi to 4*pi */ linspace(-4.0 * M_PI, 4 * M_PI, N , DSPL_SYMMETRIC, x); for(n = 0; n < N; n++) @@ -29,13 +30,37 @@ int main(int argc, char* argv[]) writetxt(x, s, N, "dat/sine.txt"); writetxt(x, c, N, "dat/cosine.txt"); - /* GNUPLOT script gnuplot/gnuplot_script.plt */ - err = gnuplot_script(argc, argv, "gnuplot/gnuplot_script.plt"); - - /* Print output */ + + /* plotting by GNUPLOT */ + /* Create window 0 */ + err = gnuplot_create(argc, argv, 560, 280, "img/gnuplot_script_sin.png", hplot); printf("GNUPLOT err = %d\n", err); + gnuplot_cmd(hplot[0], "set grid"); + gnuplot_cmd(hplot[0], "set xlabel 'x'"); + gnuplot_cmd(hplot[0], "set ylabel 'sin(x)'"); + gnuplot_cmd(hplot[0], "plot 'dat/sine.txt' with lines title 'sin(x)'"); + gnuplot_close(hplot[0]); - dspl_free(handle); /* free dspl handle */ + /* Create window 1 */ + err = gnuplot_create(argc, argv, 560, 280, "img/gnuplot_script_cos.png", hplot+1); + printf("GNUPLOT err = %d\n", err); + gnuplot_cmd(hplot[1], "set grid"); + gnuplot_cmd(hplot[1], "set xlabel 'x'"); + gnuplot_cmd(hplot[1], "set ylabel 'cos(x)'"); + gnuplot_cmd(hplot[1], "plot 'dat/cosine.txt' with lines title 'cos(x)'"); + gnuplot_close(hplot[1]); + + /* Create window 2 */ + err = gnuplot_create(argc, argv, 560, 280, "img/gnuplot_script_sincos.png", hplot+2); + printf("GNUPLOT err = %d\n", err); + gnuplot_cmd(hplot[2], "set grid"); + gnuplot_cmd(hplot[2], "set xlabel 'x'"); + gnuplot_cmd(hplot[2], "set ylabel 'sin(x), cos(x)'"); + gnuplot_cmd(hplot[2], "plot 'dat/sine.txt' with lines title 'sin(x)', \\"); + gnuplot_cmd(hplot[2], " 'dat/cosine.txt' with lines title 'cos(x)"); + gnuplot_close(hplot[2]); + + dspl_free(hdspl); /* free dspl handle */ return 0; } diff --git a/examples/src/iir_bstop.c b/examples/src/iir_bstop.c index ee0554f..ff15766 100644 --- a/examples/src/iir_bstop.c +++ b/examples/src/iir_bstop.c @@ -12,8 +12,9 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); // Load DSPL function double a[ORD+1], b[ORD+1]; // H(s) coefficients double rs = 60.0; // Bandstop suppression equals 60 dB @@ -52,9 +53,26 @@ int main(int argc, char* argv[]) writetxt(w, phi, N, "dat/iir_bstop_phi.txt"); writetxt(w, tau, N, "dat/iir_bstop_tau.txt"); - gnuplot_script(argc, argv, "gnuplot/iir_bstop.plt"); + + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 920, 260, "img/iir_bstop.png", &hplot); + gnuplot_cmd(hplot, "unset key"); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'normalized frequency'"); + gnuplot_cmd(hplot, "set multiplot layout 1,3 rowsfirst"); + gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'"); + gnuplot_cmd(hplot, "set yrange [-100:5]"); + gnuplot_cmd(hplot, "plot 'dat/iir_bstop_mag.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Phase response, rad'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/iir_bstop_phi.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Groupdelay, samples'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/iir_bstop_tau.txt' with lines"); + gnuplot_cmd(hplot, "unset multiplot"); + gnuplot_close(hplot); - dspl_free(handle); // free dspl handle + dspl_free(hdspl); // free dspl handle // run GNUPLOT script return 0; diff --git a/examples/src/iir_lpf.c b/examples/src/iir_lpf.c index b67168d..bf59f8f 100644 --- a/examples/src/iir_lpf.c +++ b/examples/src/iir_lpf.c @@ -12,9 +12,10 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function - + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); // Load DSPL function + double a[ORD+1], b[ORD+1]; // коэффициенты H(s) double rs = 60.0; // неравномерность в полосе пропускания 3дБ double rp = 1.0; @@ -46,12 +47,27 @@ int main(int argc, char* argv[]) writetxt(w, phi, N, "dat/iir_lpf_phi.txt"); writetxt(w, tau, N, "dat/iir_lpf_tau.txt"); - gnuplot_script(argc, argv, "gnuplot/iir_lpf.plt"); + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 920, 260, "img/iir_lpf.png", &hplot); + gnuplot_cmd(hplot, "unset key"); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'normalized frequency'"); + gnuplot_cmd(hplot, "set multiplot layout 1,3 rowsfirst"); + gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'"); + gnuplot_cmd(hplot, "set yrange [-100:5]"); + gnuplot_cmd(hplot, "plot 'dat/iir_lpf_mag.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Phase response, rad'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/iir_lpf_phi.txt' with lines"); + gnuplot_cmd(hplot, "set ylabel 'Groupdelay, samples'"); + gnuplot_cmd(hplot, "unset yrange"); + gnuplot_cmd(hplot, "plot 'dat/iir_lpf_tau.txt' with lines"); + gnuplot_cmd(hplot, "unset multiplot"); + gnuplot_close(hplot); - dspl_free(handle); // free dspl handle - - // выполнить скрипт GNUPLOT для построения графиков - // по рассчитанным данным + dspl_free(hdspl); // free dspl handle + + return 0; } diff --git a/examples/src/iir_test.c b/examples/src/iir_test.c index 7810653..eb2f3f6 100644 --- a/examples/src/iir_test.c +++ b/examples/src/iir_test.c @@ -68,8 +68,9 @@ void freq_resp_write2txt(double* b, double* a, int ord, int n, char* fn) ******************************************************************************/ int main(int argc, char* argv[]) { - void* handle; /* DSPL handle */ - handle = dspl_load(); /* Load DSPL function */ + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); /* Load DSPL functions */ /* Transfer function H(z) coeff. vectors */ double a[MAX_ORD+1], b[MAX_ORD+1]; @@ -147,11 +148,40 @@ int main(int argc, char* argv[]) freq_resp_write2txt(b, a, BSF_ORD, N, "dat/iir_ellip_bsf.txt"); /*--------------------------------------------------------------------------*/ - - gnuplot_script(argc, argv, "gnuplot/iir_test.plt"); + + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 920, 840, "img/iir_test.png", &hplot); + gnuplot_cmd(hplot, "unset key"); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'normalized frequency'"); + gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'"); + gnuplot_cmd(hplot, "set yrange [-100:5]"); + gnuplot_cmd(hplot, "set xtics 0,1"); + gnuplot_cmd(hplot, "set xtics add ('0.3' 0.3)"); + gnuplot_cmd(hplot, "set xtics add ('0.7' 0.7)"); + gnuplot_cmd(hplot, "set xtics add ('1' 1)"); + gnuplot_cmd(hplot, "set multiplot layout 4,4 rowsfirst"); + gnuplot_cmd(hplot, "plot 'dat/iir_butter_lpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_butter_hpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_butter_bpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_butter_bsf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby1_lpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby1_hpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby1_bpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby1_bsf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby2_lpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby2_hpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby2_bpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_cheby2_bsf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_ellip_lpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_ellip_hpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_ellip_bpf.txt' with lines"); + gnuplot_cmd(hplot, "plot 'dat/iir_ellip_bsf.txt' with lines"); + gnuplot_cmd(hplot, "unset multiplot"); + gnuplot_close(hplot); /* free dspl handle */ - dspl_free(handle); + dspl_free(hdspl); return 0; } diff --git a/examples/src/sinc_test.c b/examples/src/sinc_test.c index f76eb51..be1ae6a 100644 --- a/examples/src/sinc_test.c +++ b/examples/src/sinc_test.c @@ -8,8 +8,9 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); /* Load DSPL function */ double x[N], y[N]; @@ -23,9 +24,19 @@ int main(int argc, char* argv[]) sinc(x, N, 2.0*M_PI, y); writetxt(x, y, N, "dat/sinc_test_2pi.txt"); - gnuplot_script(argc, argv, "gnuplot/sinc_test.plt"); + + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 560, 280, "img/sinc_test.png", &hplot); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'x'"); + gnuplot_cmd(hplot, "set ylabel 'sinc(x,a)'"); + gnuplot_cmd(hplot, "set yrange [-0.25:1.1]"); + gnuplot_cmd(hplot, "plot 'dat/sinc_test_1.0.txt' with lines title 'a = 1.0'"); + gnuplot_cmd(hplot, "replot 'dat/sinc_test_pi.txt' with lines title 'a = pi'"); + gnuplot_cmd(hplot, "replot 'dat/sinc_test_2pi.txt' with lines title 'a = 2pi'"); + gnuplot_close(hplot); - dspl_free(handle); // free dspl handle + dspl_free(hdspl); // free dspl handle return 0; } diff --git a/examples/src/sine_int_test.c b/examples/src/sine_int_test.c index d944197..7ad724d 100644 --- a/examples/src/sine_int_test.c +++ b/examples/src/sine_int_test.c @@ -7,8 +7,9 @@ int main(int argc, char* argv[]) { - void* handle; // DSPL handle - handle = dspl_load(); // Load DSPL function + void* hdspl; /* DSPL handle */ + void* hplot; /* GNUPLOT handle */ + hdspl = dspl_load(); /* Load DSPL function */ double x[N], y[N]; @@ -20,9 +21,19 @@ int main(int argc, char* argv[]) sinc(x, N, 1.0, y); writetxt(x, y, N, "dat/dat1.txt"); - gnuplot_script(argc, argv, "gnuplot/sine_int.plt"); + /* plotting by GNUPLOT */ + gnuplot_create(argc, argv, 560, 280, "img/sine_int.png", &hplot); + gnuplot_cmd(hplot, "set grid"); + gnuplot_cmd(hplot, "set xlabel 'x'"); + gnuplot_cmd(hplot, "set lmargin at screen 0.10"); + gnuplot_cmd(hplot, "set key left top"); + gnuplot_cmd(hplot, "set ylabel 'Si(x), sinc(x)'"); + gnuplot_cmd(hplot, "set yrange [-2:2]"); + gnuplot_cmd(hplot, "plot 'dat/dat0.txt' with lines title 'Si(x)', \\"); + gnuplot_cmd(hplot, " 'dat/dat1.txt' with lines title 'sinc(x)'"); + gnuplot_close(hplot); - dspl_free(handle); // free dspl handle + dspl_free(hdspl); // free dspl handle return 0; } \ No newline at end of file diff --git a/examples/src/test.c b/examples/src/test.c deleted file mode 100644 index 052e93f..0000000 --- a/examples/src/test.c +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include "dspl.h" - -#define ORD 6 -#define N 2000 - - -int main(int argc, char* argv[]) -{ - void* handle; /* DSPL handle */ - - double b[ORD+1], a[ORD+1]; - double t[N], s[N], n[N], sf[N]; - random_t rnd; - int k; - int err; - - /* Load DSPL function */ - handle = dspl_load(); - - /* random generator init */ - random_init(&rnd, RAND_TYPE_MT19937, NULL); - - /* fill time vector */ - linspace(0, N, N, DSPL_PERIODIC, t); - - /* generate noise */ - randn(n, N, 0, 1.0, &rnd); - - /* input signal s = sin(2*pi*t) + n(t) */ - for(k = 0; k < N; k++) - s[k] = sin(M_2PI*0.02*t[k]) + n[k]; - - /* IIR filter coefficients calculation */ - iir(1.0, 70.0, ORD, 0.06, 0.0, DSPL_FILTER_ELLIP | DSPL_FILTER_LPF, b, a); - - /* input signal filtration */ - filter_iir(b, a, ORD, s, N, sf); - - /* save input signal and filter output to the txt-files */ - writetxt(t,s, N, "dat/s.txt"); - writetxt(t,sf,N, "dat/sf.txt"); - - /* run GNUPLOT script */ - err = gnuplot_script(argc, argv, "gnuplot/filter_iir.plt"); - - /* free DSPL handle */ - dspl_free(handle); - - - return err; -} diff --git a/ide/codeblocks/examples.depend b/ide/codeblocks/examples.depend index 5b09823..c4ac310 100644 --- a/ide/codeblocks/examples.depend +++ b/ide/codeblocks/examples.depend @@ -1,16 +1 @@ # depslib dependency file v1.0 -1572801111 source:f:\dsplib.org\libdspl-2.0\examples\src\test.c - - - - "dspl.h" - -1572200729 f:\dsplib.org\libdspl-2.0\include\dspl.h - - -1572196728 source:f:\dsplib.org\libdspl-2.0\include\dspl.c - - - - "dspl.h" - diff --git a/include/dspl.c b/include/dspl.c index cbdccd2..7a00bf4 100644 --- a/include/dspl.c +++ b/include/dspl.c @@ -106,6 +106,9 @@ p_freqs_cmplx freqs_cmplx ; p_freqs2time freqs2time ; p_freqz freqz ; +p_gnuplot_close gnuplot_close ; +p_gnuplot_cmd gnuplot_cmd ; +p_gnuplot_create gnuplot_create ; p_gnuplot_script gnuplot_script ; p_goertzel goertzel ; p_goertzel_cmplx goertzel_cmplx ; @@ -298,6 +301,9 @@ void* dspl_load() LOAD_FUNC(freqs_cmplx); LOAD_FUNC(freqs2time); + LOAD_FUNC(gnuplot_close); + LOAD_FUNC(gnuplot_cmd); + LOAD_FUNC(gnuplot_create); LOAD_FUNC(gnuplot_script); LOAD_FUNC(goertzel); LOAD_FUNC(goertzel_cmplx); diff --git a/include/dspl.h b/include/dspl.h index 6f99283..d25f588 100644 --- a/include/dspl.h +++ b/include/dspl.h @@ -95,6 +95,7 @@ typedef struct /* Error codes */ /* A 0x01xxxxxx*/ +#define ERROR_ARG_PARAM 0x01180716 /* B 0x02xxxxxx*/ /* C 0x03xxxxxx*/ /* D 0x04xxxxxx*/ @@ -120,6 +121,8 @@ typedef struct #define ERROR_FREAD_SIZE 0x06180501 #define ERROR_FWRITE_SIZE 0x06231820 /* G 0x07xxxxxx*/ +#define ERROR_GNUPLOT_CREATE 0x07161203 +#define ERROR_GNUPLOT_FNPNG 0x07161206 #define ERROR_GNUPLOT_TERM 0x07161220 /* H 0x08xxxxxx*/ /* I 0x09xxxxxx*/ @@ -221,6 +224,9 @@ typedef struct #define DSPL_VERIF_FAILED 1 #define DSPL_VERIF_SUCCESS 0 +#define PLOT_HOLD 0x00000001 + + #ifdef __cplusplus extern "C" { #endif @@ -626,6 +632,18 @@ DECLARE_FUNC(int, freqz, double* COMMA int COMMA complex_t*); /*----------------------------------------------------------------------------*/ +DECLARE_FUNC(void, gnuplot_close, void* h); +/*----------------------------------------------------------------------------*/ +DECLARE_FUNC(void, gnuplot_cmd, void* h + COMMA char* cmd); +/*----------------------------------------------------------------------------*/ +DECLARE_FUNC(int, gnuplot_create, int argc + COMMA char* argv[] + COMMA int w + COMMA int h + COMMA char* fn_png + COMMA void** hplot); +/*----------------------------------------------------------------------------*/ DECLARE_FUNC(int, gnuplot_script, int argc COMMA char* argv[] COMMA char* fn);